From f2d03e93c25bfa6661145e9ebf200a40d4076f17 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 May 2015 17:59:30 -0400 Subject: [PATCH 01/16] First 1/3 of port done. --- code/__HELPERS/unsorted.dm | 6 - code/_onclick/hud/hud.dm | 2 +- code/_onclick/other_mobs.dm | 33 -- code/datums/mind.dm | 33 -- code/game/dna/dna_modifier.dm | 2 +- .../gamemodes/changeling/powers/lesserform.dm | 54 +- code/game/gamemodes/cult/runes.dm | 36 -- code/game/gamemodes/events.dm | 171 ------- code/game/jobs/access.dm | 18 +- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/biogenerator.dm | 3 - code/game/machinery/cryopod.dm | 2 +- code/game/machinery/machinery.dm | 3 +- code/game/machinery/portable_turret.dm | 24 +- code/game/machinery/telecomms/logbrowser.dm | 2 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/items.dm | 36 -- code/game/objects/items/devices/PDA/PDA.dm | 3 - code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/stacks/medical.dm | 2 +- .../objects/items/weapons/dna_injector.dm | 2 +- .../objects/items/weapons/storage/internal.dm | 2 +- .../objects/items/weapons/storage/storage.dm | 2 +- code/game/objects/items/weapons/twohanded.dm | 11 +- code/game/objects/structures/kitchen_spike.dm | 114 ++--- code/game/supplyshuttle.dm | 22 +- code/game/turfs/simulated.dm | 4 +- code/game/verbs/suicide.dm | 26 - code/modules/admin/admin.dm | 2 +- code/modules/admin/admin_verbs.dm | 7 +- code/modules/admin/player_panel.dm | 4 +- code/modules/admin/topic.dm | 42 +- code/modules/admin/verbs/randomverbs.dm | 12 - code/modules/clothing/clothing.dm | 4 +- code/modules/events/radiation_storm.dm | 8 - code/modules/mob/language.dm | 24 + .../mob/living/carbon/human/examine.dm | 9 +- code/modules/mob/living/carbon/human/human.dm | 12 + .../mob/living/carbon/human/inventory.dm | 4 - code/modules/mob/living/carbon/human/life.dm | 3 + code/modules/mob/living/carbon/human/npcs.dm | 13 + .../mob/living/carbon/human/species/monkey.dm | 88 ++++ .../living/carbon/human/species/station.dm | 457 +++++++++++++++++ code/modules/mob/living/carbon/species.dm | 476 +----------------- 44 files changed, 744 insertions(+), 1040 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/npcs.dm create mode 100644 code/modules/mob/living/carbon/human/species/monkey.dm create mode 100644 code/modules/mob/living/carbon/human/species/station.dm diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 894b71d356b..4e3aa86868f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -558,16 +558,10 @@ 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) moblist.Add(M) -// for(var/mob/living/silicon/hivebot/M in world) -// mob_list.Add(M) -// for(var/mob/living/silicon/hive_mainframe/M in world) -// mob_list.Add(M) return moblist //E = MC^2 diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index dc93941ac6b..c0159f66390 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -176,7 +176,7 @@ datum/hud/New(mob/owner) if(ishuman(mymob)) human_hud(ui_style, ui_color, ui_alpha) // Pass the player the UI style chosen in preferences - else if(ismonkey(mymob)) + else if(issmall(mymob)) monkey_hud(ui_style) else if(isbrain(mymob)) brain_hud(ui_style) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 3edd0ba0bde..17121f92f32 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -50,39 +50,6 @@ /mob/living/RestrainedClickOn(var/atom/A) return -/* - Monkeys -*/ -/mob/living/carbon/monkey/UnarmedAttack(var/atom/A) - A.attack_paw(src) -/atom/proc/attack_paw(mob/user as mob) - return - -/* - 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(..()) - return - if(a_intent != "harm" || !ismob(A)) return - if(is_muzzled()) - 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 - else - for(var/mob/O in viewers(ML, null)) - O.show_message("\red [src] has attempted to bite [ML]!", 1) - /* Aliens Defaults to same as monkey in most places diff --git a/code/datums/mind.dm b/code/datums/mind.dm index e3459ca6d55..47fade12372 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1012,36 +1012,6 @@ datum/mind message_admins("[key_name_admin(usr)] has thrall'ed [current].") log_admin("[key_name(usr)] has thrall'ed [current].") - else if (href_list["monkey"]) - var/mob/living/L = current - if (L.notransform) - return - switch(href_list["monkey"]) - if("healthy") - if (usr.client.holder.rights & R_ADMIN) - var/mob/living/carbon/human/H = current - var/mob/living/carbon/monkey/M = current - if (istype(H)) - log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]") - message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]") - src = null - M = H.monkeyize() - src = M.mind - //world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!" - sleep(0) //because deleting of virus is done through spawn(0) - if("human") - var/mob/living/carbon/monkey/M = current - if (istype(M)) - log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") - message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") - var/obj/item/weapon/dnainjector/m2h/m2h = new - var/obj/item/weapon/implant/mobfinder = new(M) //hack because humanizing deletes mind --rastaf0 - src = null - m2h.inject(M) - src = mobfinder.loc:mind - del(mobfinder) - current.radiation -= 50 - else if (href_list["silicon"]) current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["silicon"]) @@ -1396,9 +1366,6 @@ datum/mind mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) mind.active = 1 //indicates that the mind is currently synced with a client -//MONKEY -/mob/living/carbon/monkey/mind_initialize() - ..() //slime /mob/living/carbon/slime/mind_initialize() diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 29b1cd1b3d9..2ba16ac0663 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -132,7 +132,7 @@ return if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other return - if (!ishuman(usr) && !ismonkey(usr)) //Make sure they're a mob that has dna + if (!ishuman(usr) && !issmall(usr)) //Make sure they're a mob that has dna usr << "\blue Try as you might, you can not climb up into the scanner." return if (src.occupant) diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 09751412a30..44aae09ae9f 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -16,52 +16,18 @@ return user << "Our genes cry out!" - var/mob/living/carbon/C = user + var/mob/living/carbon/human/H = user - //TODO replace with monkeyize proc + if(!istype(H) || !H.species.primitive_form) + src << "We cannot perform this ability in this form!" + return + + H.visible_message("[H] transforms!") + changeling.geneticdamage = 30 + H << "Our genes cry out!" var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in C) + for(var/obj/item/weapon/implant/W in H) implants += W - - C.notransform = 1 - C.canmove = 0 - C.icon = null - C.overlays.Cut() - C.invisibility = 101 - - var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(30) - 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.unEquip(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 = "harm" - for(var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O - - C.mind.transfer_to(O) - O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) - O.changeling_update_languages(changeling.absorbed_languages) - + H.monkeyize() feedback_add_details("changeling_powers","LF") - qdel(C) return 1 \ No newline at end of file diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 91739c16d22..d9a99767aa7 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -679,42 +679,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 (ticker.mode.name == "cult") - if(M.mind == ticker.mode: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." - ticker.mode: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)) - ticker.mode.grant_runeword(usr) - M.gib() -/* for(var/mob/living/carbon/alien/A) - for(var/mob/K in cultsinrange) - K.say("Barhah hra zar'garis!") - A.dust() /// A.gib() doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need. - if (ticker.mode.name == "cult") - if(prob(75)) - usr << "\red The Geometer of Blood accepts your exotic sacrifice." - ticker.mode:grant_runeword(usr) - else - usr << "\red The Geometer of Blood accepts your exotic sacrifice." - usr << "\red However, this alien is not enough to gain His favor." - else - usr << "\red The Geometer of Blood accepts your exotic sacrifice." - return - return fizzle() */ /////////////////////////////////////////SIXTEENTH RUNE diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 07794377d04..ed0383660a9 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -1,167 +1,3 @@ -//this file left in for legacy support -/* -/proc/start_events() - //changed to a while(1) loop since they are more efficient. - //Moved the spawn in here to allow it to be called with advance proc call if it crashes. - //and also to stop spawn copying variables from the game ticker - spawn(3000) - while(1) - if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station - spawn(1) - dust_swarm("weak") - if(!event) - //CARN: checks to see if random events are enabled. - if(config.allow_random_events) - if(prob(eventchance)) - event() - hadevent = 1 - else - Holiday_Random_Event() - else - event = 0 - sleep(1200) - -/proc/event() - event = 1 - - var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13,14, 15) //so ninjas don't cause "empty" events. - - if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round. - eventNumbersToPickFrom += 3 - switch(pick(eventNumbersToPickFrom)) - if(1) - command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg') - spawn(100) - meteor_wave() - spawn_meteors() - spawn(700) - meteor_wave() - spawn_meteors() - - if(2) - command_announcement.Announce("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/granomalies.ogg') - var/turf/T = pick(blobstart) - var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 ) - spawn(rand(50, 300)) - del(bh) - /* - if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO - command_announcement.Announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", new_sound = 'sound/AI/spanomalies.ogg') - var/list/turfs = new - var/turf/picked - for(var/turf/simulated/floor/T in world) - if((T.z in config.station_levels)) - turfs += T - for(var/turf/simulated/floor/T in turfs) - if(prob(20)) - spawn(50+rand(0,3000)) - picked = pick(turfs) - var/obj/effect/portal/P = new /obj/effect/portal( T ) - P.target = picked - P.creator = null - P.icon = 'icons/obj/objects.dmi' - P.failchance = 0 - P.icon_state = "anom" - P.name = "wormhole" - spawn(rand(300,600)) - del(P) - */ - if(3) - if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round. - space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like. - if(4) - mini_blob_event() - - if(5) - high_radiation_event() - if(6) - viral_outbreak() - if(7) - alien_infestation() - if(8) - prison_break() - if(9) - carp_migration() - if(10) - immovablerod() - if(11) - lightsout(1,2) - if(12) - appendicitis() - if(13) - IonStorm() - if(14) - spacevine_infestation() - if(15) - communications_blackout() -*/ - - - -/* -/proc/viral_outbreak(var/virus = null) -// command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - var/virus_type - if(!virus) - virus_type = pick(/datum/disease/dnaspread,/datum/disease/advance/flu,/datum/disease/advance/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat) - else - switch(virus) - if("fake gbs") - virus_type = /datum/disease/fake_gbs - if("gbs") - virus_type = /datum/disease/gbs - if("magnitis") - virus_type = /datum/disease/magnitis - if("rhumba beat") - virus_type = /datum/disease/rhumba_beat - if("brain rot") - virus_type = /datum/disease/brainrot - if("cold") - virus_type = /datum/disease/advance/cold - if("retrovirus") - virus_type = /datum/disease/dnaspread - if("flu") - virus_type = /datum/disease/advance/flu -// if("t-virus") -// virus_type = /datum/disease/t_virus - if("pierrot's throat") - virus_type = /datum/disease/pierrot_throat - for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) - - var/foundAlready = 0 // don't infect someone that already has the virus - var/turf/T = get_turf(H) - if(!T) - continue - if(!(T.z in config.station_levels)) - continue - for(var/datum/disease/D in H.viruses) - foundAlready = 1 - if(H.stat == 2 || foundAlready) - continue - - if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. - if((!H.dna) || (H.sdisabilities & BLIND)) //A blindness disease would be the worst. - continue - var/datum/disease/dnaspread/D = new - D.strain_data["name"] = H.real_name - D.strain_data["UI"] = H.dna.uni_identity - D.strain_data["SE"] = H.dna.struc_enzymes - D.carrier = 1 - D.holder = H - D.affected_mob = H - H.viruses += D - break - else - var/datum/disease/D = new virus_type - D.carrier = 1 - D.holder = H - D.affected_mob = H - H.viruses += D - break - spawn(rand(1500, 3000)) //Delayed announcements to keep the crew on their toes. - command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') -*/ - /proc/alien_infestation(var/spawncount = 1) // -- TLE //command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') var/list/vents = list() @@ -218,13 +54,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(!(T.z in config.station_levels)) - 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/jobs/access.dm b/code/game/jobs/access.dm index f6b34aef591..96fe8b41027 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -118,7 +118,7 @@ //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) || istype(M, /mob/living/carbon/alien/humanoid)) + else if(istype(M, /mob/living/carbon/alien/humanoid)) var/mob/living/carbon/george = M //they can only hold things :( if(src.check_access(george.get_active_hand())) @@ -211,14 +211,14 @@ if("Special Operations Officer") return get_all_centcom_access() + get_all_accesses() if("Nanotrasen Navy Representative") - return get_all_centcom_access() + get_all_accesses() + return get_all_centcom_access() + get_all_accesses() if("Nanotrasen Navy Officer") return get_all_centcom_access() + get_all_accesses() if("Nanotrasen Navy Captain") return get_all_centcom_access() + get_all_accesses() if("Supreme Commander") return get_all_centcom_access() + get_all_accesses() - + /proc/get_syndicate_access(job) switch(job) if("Syndicate Operative") @@ -226,12 +226,12 @@ if("Syndicate Operative Leader") return list(access_syndicate, access_syndicate_leader) if("Vox Raider") - return list(access_vox) + return list(access_vox) if("Vox Trader") - return list(access_vox) + return list(access_vox) if("Syndicate Commando") - return list(access_syndicate, access_syndicate_leader) - + return list(access_syndicate, access_syndicate_leader) + /proc/get_all_accesses() return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court, access_medical, access_genetics, access_morgue, access_rd, @@ -470,7 +470,7 @@ return "Bridge" if(access_cent_commander) return "Commander" - + /proc/get_syndicate_access_desc(A) switch(A) if(access_syndicate) @@ -534,7 +534,7 @@ return assignment return "Unknown" - + proc/GetIdCard(var/mob/living/carbon/human/H) if(H.wear_id) var/id = H.wear_id.GetID() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index fcc080124cd..c7d600bf62f 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -577,7 +577,7 @@ set name = "Enter Sleeper" set category = null set src in oview(1) - if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr))) + if(usr.stat != 0 || !(ishuman(usr) || issmall(usr))) return if(src.occupant) usr << "\blue The sleeper is already occupied!" diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index ad3939b294a..2a9b0c833e3 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -290,9 +290,6 @@ if("jacket") if (check_cost(500/efficiency)) return 0 else new/obj/item/clothing/suit/jacket/leather(src.loc) - //if("monkey") - // if (check_cost(500)) return 0 - // else new/mob/living/carbon/monkey(src.loc) processing = 0 menustat = "complete" update_icon() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 30db6a7d225..14a461474e1 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -174,7 +174,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/living/occupant = null // Person waiting to be despawned. diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 367e31f7ac6..a68fe87f068 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -331,8 +331,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) && ticker && ticker.mode.name == "monkey") ) + istype(usr, /mob/living/silicon))) usr << "\red You don't have the dexterity to do this!" return 1 /* diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 196850255eb..4458f560715 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -128,7 +128,7 @@ eprojectile = /obj/item/projectile/beam //If it has, going to kill mode eshot_sound = 'sound/weapons/Laser.ogg' egun = 1 - + if(/obj/item/weapon/gun/energy/gun/turret) eprojectile = /obj/item/projectile/beam //If it has, going to copypaste mode eshot_sound = 'sound/weapons/Laser.ogg' @@ -210,7 +210,7 @@ /obj/machinery/porta_turret/proc/HasController() var/area/A = get_area(src) return A && A.turret_controls.len > 0 - + /obj/machinery/porta_turret/CanUseTopic(var/mob/user) if(HasController()) user << "Turrets can only be controlled using the assigned turret controller." @@ -336,9 +336,9 @@ spawn() sleep(60) attacked = 0 - + ..() - + /obj/machinery/porta_turret/emag_act(user as mob) if(!emagged) //Emagging the turret makes it go bonkers and stun everyone. It also makes @@ -450,8 +450,8 @@ assess_and_assign(ME.occupant, targets, secondarytargets) for(var/obj/spacepod/SP in view(7,src)) - assess_and_assign(SP.occupant, targets, secondarytargets) - + assess_and_assign(SP.occupant, targets, secondarytargets) + for(var/obj/vehicle/train/T in view(7,src)) assess_and_assign(T.load, targets, secondarytargets) @@ -502,7 +502,7 @@ if(iscuffed(L)) // If the target is handcuffed, leave it alone return TURRET_NOT_TARGET - if(isanimal(L) || ismonkey(L)) // Animals are not so dangerous + if(isanimal(L) || issmall(L)) // Animals are not so dangerous return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET if(isalien(L)) // Xenos are dangerous return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET @@ -524,8 +524,8 @@ var/mob/living/M = pick(targets) targets -= M if(target(M)) - return 1 - + return 1 + /obj/machinery/porta_turret/proc/popUp() //pops the turret up if(disabled) return @@ -562,7 +562,7 @@ raised = 0 invisibility = INVISIBILITY_LEVEL_TWO update_icon() - + /obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp) if((check_access || attacked) && !allowed(perp)) //if the turret has been attacked or is angry, target all non-authorized personnel, see req_access @@ -616,8 +616,8 @@ // Lethal/emagged turrets use twice the power due to higher energy beams // Emagged turrets again use twice as much power due to higher firing rates - use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged)) - + use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged)) + //Shooting Code: A.current = T A.yo = U.y - T.y diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 36b74f897a6..9708dbf3304 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -82,7 +82,7 @@ race = "[H.species.name]" - else if(ismonkey(M)) + else if(issmall(M)) race = "Monkey" language = race diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 9ca78dd7f30..dbb891ca337 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 f73a366ea94..8b1f979d4a7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -494,34 +494,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) @@ -586,14 +558,6 @@ user << "\red You're going to need to remove that mask/helmet/glasses 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 that mask/helmet/glasses first." - return - if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes! user << "\red You cannot locate any eyes on this creature!" return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 281232f23a4..e31bfc79996 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1134,9 +1134,6 @@ var/global/list/obj/item/device/pda/PDAs = list() JFLOG("[user] used the fingerprint scanner on [C]") 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 91e264715b0..8e6216e0417 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -68,7 +68,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 61e24b5932c..e81b0e6e9b3 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -15,7 +15,7 @@ user << "\The [src] cannot be applied to [M]!" return 1 - if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon) || istype(user, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey")) + if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) user << "You don't have the dexterity to do this!" return 1 diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 19dc7b0850e..659cc938e2f 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -160,7 +160,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/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 44c8aaa5697..e94c806e998 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -26,7 +26,7 @@ //returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. It's strange, but no other way of //doing it without the ability to call another proc's parent, really. /obj/item/weapon/storage/internal/proc/handle_mousedrop(mob/user as mob, obj/over_object as obj) - if (ishuman(user) || ismonkey(user)) //so monkeys can take off their backpacks -- Urist + if (ishuman(user) || issmall(user)) //so monkeys can take off their backpacks -- Urist if (istype(user.loc,/obj/mecha)) // stops inventory actions in a mech return 0 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 07ded953aaf..cc064ca9489 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -25,7 +25,7 @@ var/use_sound = "rustle" //sound played when used. null for no sound. /obj/item/weapon/storage/MouseDrop(obj/over_object as obj) - if (ishuman(usr) || ismonkey(usr)) //so monkeys can take off their backpacks -- Urist + if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist var/mob/M = usr if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index edc0426c5b8..df5e78ebf5f 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -59,11 +59,16 @@ 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." + ..() + + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(H.species.is_small) + user << "It's too heavy for you to wield fully." + return + else return - ..() if(wielded) //Trying to unwield it unwield() user << "You are now carrying the [name] with one hand." diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index eb3f0a3c371..de2fef2875e 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -4,77 +4,57 @@ name = "a meat spike" icon = 'icons/obj/kitchen.dmi' icon_state = "spike" - desc = "A spike for collecting meat from animals" + desc = "A spike for collecting meat from animals." density = 1 anchored = 1 var/meat = 0 - var/occupied = 0 - var/meattype = 0 // 0 - Nothing, 1 - Monkey, 2 - Xeno + var/occupied + var/meat_type + var/victim_name = "corpse" -/obj/structure/kitchenspike - attack_paw(mob/user as mob) - return src.attack_hand(usr) - - attackby(obj/item/weapon/grab/G as obj, mob/user as mob, params) - 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!" - else if(istype(G.affecting, /mob/living/carbon/alien)) - if(src.occupied == 0) - src.icon_state = "spikebloodygreen" - src.occupied = 1 - src.meat = 5 - src.meattype = 2 - 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!" +/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob) + if(!istype(G, /obj/item/weapon/grab) || !G.affecting) + return + if(occupied) + user << "The spike already has something on it, finish collecting its meat first!" + else + if(spike(G.affecting)) + visible_message("[user] has forced [G.affecting] onto the spike, killing them instantly!") + del(G.affecting) + del(G) else - user << "\red They are too big for the spike, try something smaller!" - return + user << "They are too big for the spike, try something smaller!" -// MouseDrop_T(var/atom/movable/C, mob/user) -// if(istype(C, /obj/mob/carbon/monkey) -// else if(istype(C, /obj/mob/carbon/alien) && !istype(C, /mob/living/carbon/alien/larva/slime)) -// else if(istype(C, /obj/livestock/spesscarp +/obj/structure/kitchenspike/proc/spike(var/mob/living/victim) - attack_hand(mob/user as mob) - if(..()) - return - if(src.occupied) - if(src.meattype == 1) - if(src.meat > 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey( src.loc ) - usr << "You remove some meat from the monkey." - else if(src.meat == 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src.loc) - usr << "You remove the last piece of meat from the monkey!" - src.icon_state = "spike" - src.occupied = 0 - else if(src.meattype == 2) - if(src.meat > 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/xenomeat( src.loc ) - usr << "You remove some meat from the alien." - else if(src.meat == 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/xenomeat(src.loc) - usr << "You remove the last piece of meat from the alien!" - src.icon_state = "spike" - src.occupied = 0 \ No newline at end of file + if(!istype(victim)) + return + + if(istype(victim, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = victim + if(!H.species.is_small) + return 0 + meat_type = H.species.meat_type + icon_state = "spikebloody" + else if(istype(victim, /mob/living/carbon/alien)) + meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat + icon_state = "spikebloodygreen" + else + return 0 + + victim_name = victim.name + occupied = 1 + meat = 5 + return 1 + +/obj/structure/kitchenspike/attack_hand(mob/user as mob) + if(..() || !occupied) + return + meat-- + new meat_type(get_turf(src)) + if(src.meat > 1) + user << "You remove some meat from \the [victim_name]." + else if(src.meat == 1) + user << "You remove the last piece of meat from \the [victim_name]!" + icon_state = "spike" + occupied = 0 diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index a64e798c3ec..e610994fc5c 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -40,6 +40,11 @@ var/list/mechtoys = list( density = 0 anchored = 1 layer = 4 + var/list/mobs_can_pass = list( + /mob/living/carbon/slime, + /mob/living/simple_animal/mouse, + /mob/living/silicon/robot/drone + ) /obj/structure/plasticflaps/CanPass(atom/A, turf/T) if(istype(A) && A.checkpass(PASSGLASS)) @@ -52,10 +57,19 @@ var/list/mechtoys = list( if(istype(A, /obj/vehicle)) //no vehicles return 0 - 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. - return 0 + var/mob/living/M = A + if(istype(M)) + if(M.lying) + return ..() + for(var/mob_type in mobs_can_pass) + if(istype(A, mob_type)) + return ..() + if(istype(A, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.species.is_small) + return ..() + return 0 + return ..() /obj/structure/plasticflaps/ex_act(severity) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 329dbbefa1a..2a64766de41 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -167,9 +167,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 2adf60e2443..fa525e22e1f 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -101,32 +101,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 2d6be2a6dbb..81086f3b3ef 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -101,7 +101,7 @@ var/global/nologevent = 0 body += "
" //Monkey - if(ismonkey(M)) + if(issmall(M)) body += "Monkeyized | " else body += "Monkeyize | " diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 363f3d504da..e6b35ef45e2 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -436,9 +436,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/player_panel.dm b/code/modules/admin/player_panel.dm index ff98278ce90..738d21f0d34 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -234,7 +234,7 @@ M_job = M.job else if(isslime(M)) M_job = "slime" - else if(ismonkey(M)) + else if(issmall(M)) M_job = "Monkey" else if(isalien(M)) //aliens if(islarva(M)) @@ -355,7 +355,7 @@ dat += "New Player" else if(isobserver(M)) dat += "Ghost" - else if(ismonkey(M)) + else if(issmall(M)) dat += "Monkey" else if(isalien(M)) dat += "Alien" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 93a1e32cd79..9bd31860ac4 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -306,7 +306,7 @@ if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 ) if("human") M.change_mob_type( /mob/living/carbon/human/human , null, null, delmob, 1 ) if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 ) - if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob, 1 ) + if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 ) if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 ) if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob, 1 ) if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/Runtime , null, null, delmob, 1 ) @@ -1440,44 +1440,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(!(M.z in config.admin_levels)) - foo += text("Prison | ", src, M) - foo += text("Maze | ", src, M) - else - foo += text("On Z = 2 | ") - 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) @@ -2000,7 +1962,7 @@ where = "onfloor" if ( where == "inhand" ) //Can only give when human or monkey - if ( !( ishuman(usr) || ismonkey(usr) ) ) + if ( !( ishuman(usr) || issmall(usr) ) ) usr << "Can only spawn in hand when you're a human or a monkey." where = "onfloor" else if ( usr.get_active_hand() ) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1274c48e79f..5c89bfb3f8f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -415,18 +415,6 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1) return //all done. The ghost is auto-deleted - //check if they were a monkey - else 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 xeno or 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/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 2cf4ecee51e..d3d0fc747b8 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -413,13 +413,13 @@ BLIND // can't see anything A.attack_hand(user) return - if ((ishuman(usr) || ismonkey(usr)) && src.loc == user) //make it harder to accidentally undress yourself + if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself return ..() /obj/item/clothing/under/MouseDrop(obj/over_object as obj) - if (ishuman(usr) || ismonkey(usr)) + if (ishuman(usr) || issmall(usr)) //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. if (!(src.loc == usr)) return diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 5daabc84799..d22c1338c38 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -58,14 +58,6 @@ randmutg(H) // Applies good mutation domutcheck(H,null,1) - - for(var/mob/living/carbon/monkey/M in living_mob_list) - var/turf/T = get_turf(M) - if(!T) - continue - if(!(T.z in config.station_levels)) - continue - M.apply_effect((rand(5,25)),IRRADIATE,0) sleep(100) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 2ad7fc08929..feb06886004 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -570,4 +570,28 @@ else return ..() +/datum/language/human/monkey + name = "Chimpanzee" + desc = "Ook ook ook." + speech_verb = "chimpers" + ask_verb = "chimpers" + exclaim_verb = "screeches" + key = "6" + +/datum/language/skrell/monkey + name = "Neara" + desc = "Squik squik squik." + key = "8" + +/datum/language/unathi/monkey + name = "Stok" + desc = "Hiss hiss hiss." + key = "7" + +/datum/language/tajaran/monkey + name = "Farwa" + desc = "Meow meow meow." + key = "9" + + #undef SCRAMBLE_CACHE_LEN diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 66cdd111b7e..8e7f0f71622 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -256,10 +256,11 @@ if(getBrainLoss() >= 60) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" - if(!key && brain_op_stage != 4 && stat != DEAD) - msg += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n" - else if(!client && brain_op_stage != 4 && stat != DEAD) - msg += "[t_He] [t_has] suddenly fallen asleep.\n" + if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD) + if(!key) + msg += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n" + else if(!client) + msg += "[t_He] [t_has] suddenly fallen asleep.\n" var/list/wound_flavor_text = list() var/list/is_destroyed = list() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index de9680dccab..c60fce02d31 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -122,6 +122,18 @@ h_style = "Nucleation Crystals" ..(new_loc, "Nucleation") +/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") + /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) if ((!( yes ) || now_pushing)) return diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 01722c780ba..c5760170c68 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -345,10 +345,6 @@ 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/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0a3faac7886..ad7508c5b8d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -124,6 +124,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc handle_heartattack() + if(!client) + species.handle_npc(src) + if(stat == DEAD) handle_decay() diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm new file mode 100644 index 00000000000..290c81723ee --- /dev/null +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -0,0 +1,13 @@ +/obj/item/clothing/under/punpun + name = "fancy uniform" + desc = "It looks like it was tailored for a monkey." + icon_state = "punpun" + item_color = "punpun" + species_restricted = list("Monkey") + +/mob/living/carbon/human/monkey/punpun/New() + ..() + spawn(1) + name = "Pun Pun" + real_name = name + w_uniform = new /obj/item/clothing/under/punpun(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm new file mode 100644 index 00000000000..4f00eaea20a --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -0,0 +1,88 @@ +/datum/species/monkey + name = "Monkey" + name_plural = "Monkeys" + blurb = "Ook." + + icobase = 'icons/mob/human_races/monkeys/r_monkey.dmi' + deform = 'icons/mob/human_races/monkeys/r_monkey.dmi' + damage_overlays = 'icons/mob/human_races/masks/dam_monkey.dmi' + damage_mask = 'icons/mob/human_races/masks/dam_mask_monkey.dmi' + blood_mask = 'icons/mob/human_races/masks/blood_monkey.dmi' + language = null + default_language = "Chimpanzee" + greater_form = "Human" + is_small = 1 + has_fine_manipulation = 0 + show_ssd = 0 + eyes = "blank_eyes" + + gibbed_anim = "gibbed-m" + dusted_anim = "dust-m" + death_message = "lets out a faint chimper as it collapses and stops moving..." + tail = "chimptail" + + unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) + inherent_verbs = list(/mob/living/proc/ventcrawl) + hud_type = /datum/hud_data/monkey + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey + + rarity_value = 0.1 + total_health = 75 + brute_mod = 1.5 + burn_mod = 1.5 + + flags = IS_RESTRICTED + +/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H) + if(H.stat != CONSCIOUS) + return + if(prob(33) && H.canmove && isturf(H.loc) && !H.pulledby) //won't move if being pulled + step(H, pick(cardinal)) + if(prob(1)) + H.emote(pick("scratch","jump","roll","tail")) + +/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H) + H.real_name = "[lowertext(name)] ([rand(100,999)])" + H.name = H.real_name + ..() + +/datum/species/monkey/tajaran + name = "Farwa" + name_plural = "Farwa" + + icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi' + deform = 'icons/mob/human_races/monkeys/r_farwa.dmi' + + greater_form = "Tajaran" + default_language = "Farwa" + flesh_color = "#AFA59E" + base_color = "#333333" + tail = "farwatail" + +/datum/species/monkey/skrell + name = "Neara" + name_plural = "Neara" + + icobase = 'icons/mob/human_races/monkeys/r_neara.dmi' + deform = 'icons/mob/human_races/monkeys/r_neara.dmi' + + greater_form = "Skrell" + default_language = "Neara" + flesh_color = "#8CD7A3" + blood_color = "#1D2CBF" + reagent_tag = IS_SKRELL + tail = null + +/datum/species/monkey/unathi + name = "Stok" + name_plural = "Stok" + + icobase = 'icons/mob/human_races/monkeys/r_stok.dmi' + deform = 'icons/mob/human_races/monkeys/r_stok.dmi' + + tail = "stoktail" + greater_form = "Unathi" + default_language = "Stok" + flesh_color = "#34AF10" + base_color = "#066000" + reagent_tag = IS_UNATHI diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm new file mode 100644 index 00000000000..c7cdb5b6cd9 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -0,0 +1,457 @@ +/datum/species/human + name = "Human" + icobase = 'icons/mob/human_races/r_human.dmi' + deform = 'icons/mob/human_races/r_def_human.dmi' + primitive_form = "Monkey" + path = /mob/living/carbon/human/human + language = "Sol Common" + flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT + bodyflags = HAS_SKIN_TONE + dietflags = DIET_OMNI + unarmed_type = /datum/unarmed_attack/punch + 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.

\ + While the central Sol government maintains control of its far-flung people, powerful corporate \ + interests, rampant cyber and bio-augmentation and secretive factions make life on most human \ + worlds tumultous at best." + +/datum/species/unathi + name = "Unathi" + icobase = 'icons/mob/human_races/r_lizard.dmi' + deform = 'icons/mob/human_races/r_def_lizard.dmi' + path = /mob/living/carbon/human/unathi + default_language = "Galactic Common" + language = "Sinta'unathi" + tail = "sogtail" + unarmed_type = /datum/unarmed_attack/claws + primitive_form = "Stok" + darksight = 3 + + blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \ + Uuosa-Eso system, which roughly translates to 'burning mother'.

Coming from a harsh, radioactive \ + desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \ + else, frequently even their own lives. They prefer warmer temperatures than most species and \ + their native tongue is a heavy hissing laungage called Sinta'Unathi." + + flags = HAS_LIPS | HAS_UNDERWEAR + bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING + dietflags = DIET_CARN + + cold_level_1 = 280 //Default 260 - Lower is better + cold_level_2 = 220 //Default 200 + cold_level_3 = 140 //Default 120 + + heat_level_1 = 380 //Default 360 - Higher is better + heat_level_2 = 420 //Default 400 + heat_level_3 = 480 //Default 460 + heat_level_3_breathe = 1100 //Default 1000 + + flesh_color = "#34AF10" + + reagent_tag = IS_UNATHI + base_color = "#066000" + +/datum/species/unathi/handle_death(var/mob/living/carbon/human/H) + + H.stop_tail_wagging(1) + +/datum/species/tajaran + name = "Tajaran" + icobase = 'icons/mob/human_races/r_tajaran.dmi' + deform = 'icons/mob/human_races/r_def_tajaran.dmi' + path = /mob/living/carbon/human/tajaran + default_language = "Galactic Common" + language = "Siik'tajr" + tail = "tajtail" + unarmed_type = /datum/unarmed_attack/claws + darksight = 8 + + blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \ + S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \ + influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \ + of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \ + using unique inflections their mouths form." + + cold_level_1 = 240 + cold_level_2 = 180 + cold_level_3 = 100 + + heat_level_1 = 340 + heat_level_2 = 380 + heat_level_3 = 440 + heat_level_3_breathe = 900 + + primitive_form = "Farwa" + + flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT + bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING + dietflags = DIET_OMNI + + flesh_color = "#AFA59E" + base_color = "#333333" + +/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) + + H.stop_tail_wagging(1) + +/datum/species/vulpkanin + name = "Vulpkanin" + icobase = 'icons/mob/human_races/r_vulpkanin.dmi' + deform = 'icons/mob/human_races/r_vulpkanin.dmi' + path = /mob/living/carbon/human/vulpkanin + default_language = "Galactic Common" + language = "Canilunzt" + tail = "vulptail" + unarmed_type = /datum/unarmed_attack/claws + darksight = 8 + + blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \ + dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \ + culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \ + to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ + which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." + + flags = HAS_LIPS | HAS_UNDERWEAR + bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING + dietflags = DIET_OMNI + + flesh_color = "#966464" + base_color = "#BE8264" + +/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H) + + H.stop_tail_wagging(1) + +/datum/species/skrell + name = "Skrell" + icobase = 'icons/mob/human_races/r_skrell.dmi' + deform = 'icons/mob/human_races/r_def_skrell.dmi' + path = /mob/living/carbon/human/skrell + default_language = "Galactic Common" + language = "Skrellian" + primitive_form = "Neara" + unarmed_type = /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 \ + of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \ + herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ + the secrets of their empire to their allies." + + flags = HAS_LIPS | HAS_UNDERWEAR + bodyflags = HAS_SKIN_COLOR + dietflags = DIET_HERB + + flesh_color = "#8CD7A3" + blood_color = "#1D2CBF" + reagent_tag = IS_SKRELL + +/datum/species/vox + name = "Vox" + icobase = 'icons/mob/human_races/r_vox.dmi' + deform = 'icons/mob/human_races/r_def_vox.dmi' + path = /mob/living/carbon/human/vox + + default_language = "Galactic Common" + language = "Vox-pidgin" + speech_sounds = list('sound/voice/shriek1.ogg') + speech_chance = 20 + + unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. + + blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ + scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \ + alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \ + refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \ + smell.

Most humans will never meet a Vox raider, instead learning of this insular species through \ + dealing with their traders and merchants; those that do rarely enjoy the experience." + + warning_low_pressure = 50 + hazard_low_pressure = 0 + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = 0 + + eyes = "vox_eyes_s" + + breath_type = "nitrogen" + poison_type = "oxygen" + + flags = NO_SCAN | IS_WHITELISTED + dietflags = DIET_OMNI + + blood_color = "#2299FC" + flesh_color = "#808D11" + + reagent_tag = IS_VOX + + makeName(var/gender,var/mob/living/carbon/human/H=null) + var/sounds = rand(2,8) + var/i = 0 + var/newname = "" + + while(i<=sounds) + i++ + newname += pick(vox_name_syllables) + return capitalize(newname) +/* +/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) + + H.verbs += /mob/living/carbon/human/proc/leap + ..() */ + +/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) + + H.verbs += /mob/living/carbon/human/proc/gut + ..() + +/datum/species/vox/armalis + name = "Vox Armalis" + icobase = 'icons/mob/human_races/r_armalis.dmi' + deform = 'icons/mob/human_races/r_armalis.dmi' + path = /mob/living/carbon/human/voxarmalis + unarmed_type = /datum/unarmed_attack/claws/armalis + + warning_low_pressure = 50 + hazard_low_pressure = 0 + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = 0 + + heat_level_1 = 2000 + heat_level_2 = 3000 + heat_level_3 = 4000 + heat_level_3_breathe = 4000 + + brute_mod = 0.2 + burn_mod = 0.2 + + eyes = "blank_eyes" + breath_type = "nitrogen" + poison_type = "oxygen" + + flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED + dietflags = DIET_OMNI //should inherit this from vox, this is here just in case + + blood_color = "#2299FC" + flesh_color = "#808D11" + + reagent_tag = IS_VOX + + tail = "armalis_tail" + icon_template = 'icons/mob/human_races/r_armalis.dmi' + + has_organ = list( + "heart" = /obj/item/organ/heart, + "lungs" = /obj/item/organ/lungs, + "liver" = /obj/item/organ/liver, + "kidneys" = /obj/item/organ/kidneys, + "brain" = /obj/item/organ/brain, + "eyes" = /obj/item/organ/eyes, + "stack" = /obj/item/organ/stack/vox + ) + +/datum/species/kidan + name = "Kidan" + icobase = 'icons/mob/human_races/r_kidan.dmi' + deform = 'icons/mob/human_races/r_def_kidan.dmi' + path = /mob/living/carbon/human/kidan + default_language = "Galactic Common" + language = "Chittin" + unarmed_type = /datum/unarmed_attack/claws + + brute_mod = 0.8 + + flags = IS_WHITELISTED + bodyflags = FEET_CLAWS + dietflags = DIET_HERB + + blood_color = "#FB9800" + + +/datum/species/slime + name = "Slime People" + default_language = "Galactic Common" + language = "Bubblish" + icobase = 'icons/mob/human_races/r_slime.dmi' + deform = 'icons/mob/human_races/r_slime.dmi' + path = /mob/living/carbon/human/slime + unarmed_type = /datum/unarmed_attack/punch + + flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN + bodyflags = HAS_SKIN_COLOR + bloodflags = BLOOD_SLIME + dietflags = DIET_CARN + + //ventcrawler = 1 //ventcrawling commented out + + has_organ = list( + "brain" = /obj/item/organ/brain/slime + ) + +/datum/species/grey + name = "Grey" + icobase = 'icons/mob/human_races/r_grey.dmi' + deform = 'icons/mob/human_races/r_def_grey.dmi' + default_language = "Galactic Common" + //language = "Grey" // Perhaps if they ever get a hivemind + unarmed_type = /datum/unarmed_attack/punch + darksight = 5 // BOOSTED from 2 + eyes = "grey_eyes_s" + + brute_mod = 1.25 //greys are fragile + + default_genes = list(REMOTE_TALK) + + + flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT + dietflags = DIET_HERB + + blood_color = "#A200FF" + +/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove) + if(!remove) + C.dna.SetSEState(REMOTETALKBLOCK,1,1) + C.mutations |= REMOTE_TALK + genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) + else + C.dna.SetSEState(REMOTETALKBLOCK,0,1) + C.mutations -= REMOTE_TALK + genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) + C.update_mutations() + ..() + +/datum/species/diona + name = "Diona" + icobase = 'icons/mob/human_races/r_diona.dmi' + deform = 'icons/mob/human_races/r_def_plant.dmi' + path = /mob/living/carbon/human/diona + default_language = "Galactic Common" + language = "Rootspeak" + unarmed_type = /datum/unarmed_attack/diona + //primitive_form = "Nymph" + slowdown = 5 + + warning_low_pressure = 50 + hazard_low_pressure = -1 + + cold_level_1 = 50 + cold_level_2 = -1 + cold_level_3 = -1 + + heat_level_1 = 300 + heat_level_2 = 340 + heat_level_3 = 400 + heat_level_3_breathe = 700 + + blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ + species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \ + there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \ + Minoris primary being ringed with a cloud of singing space-station-sized entities.

The Dionaea coexist peacefully with \ + all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \ + even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \ + water and other radiation." + + flags = NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN + dietflags = 0 //Diona regenerate nutrition in light, no diet necessary + + body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not + + blood_color = "#004400" + flesh_color = "#907E4A" + + reagent_tag = IS_DIONA + + has_organ = list( + "nutrient channel" = /obj/item/organ/diona/nutrients, + "neural strata" = /obj/item/organ/diona/strata, + "response node" = /obj/item/organ/diona/node, + "gas bladder" = /obj/item/organ/diona/bladder, + "polyp segment" = /obj/item/organ/diona/polyp, + "anchoring ligament" = /obj/item/organ/diona/ligament + ) + + has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/diona/chest), + "groin" = list("path" = /obj/item/organ/external/diona/groin), + "head" = list("path" = /obj/item/organ/external/diona/head), + "l_arm" = list("path" = /obj/item/organ/external/diona/arm), + "r_arm" = list("path" = /obj/item/organ/external/diona/arm/right), + "l_leg" = list("path" = /obj/item/organ/external/diona/leg), + "r_leg" = list("path" = /obj/item/organ/external/diona/leg/right), + "l_hand" = list("path" = /obj/item/organ/external/diona/hand), + "r_hand" = list("path" = /obj/item/organ/external/diona/hand/right), + "l_foot" = list("path" = /obj/item/organ/external/diona/foot), + "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right) + ) + +/datum/species/diona/can_understand(var/mob/other) + var/mob/living/carbon/monkey/diona/D = other + if(istype(D)) + return 1 + return 0 + +/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) + H.gender = NEUTER + + return ..() + +/* //overpowered and dumb as hell; they get cloning back, though. +/datum/species/diona/handle_death(var/mob/living/carbon/human/H) + + var/mob/living/carbon/monkey/diona/S = new(get_turf(H)) + + if(H.mind) + H.mind.transfer_to(S) + else + S.key = H.key + + for(var/mob/living/carbon/monkey/diona/D in H.contents) + if(D.client) + D.loc = H.loc + else + del(D) + + H.visible_message("\red[H] splits apart with a wet slithering noise!") */ + +/datum/species/machine + name = "Machine" + icobase = 'icons/mob/human_races/r_machine.dmi' + deform = 'icons/mob/human_races/r_machine.dmi' + path = /mob/living/carbon/human/machine + default_language = "Galactic Common" + language = "Trinary" + unarmed_type = /datum/unarmed_attack/punch + + eyes = "blank_eyes" + brute_mod = 1.5 + burn_mod = 1.5 + + cold_level_1 = 50 + cold_level_2 = -1 + cold_level_3 = -1 + + heat_level_1 = 500 //gives them about 25 seconds in space before taking damage + heat_level_2 = 540 + heat_level_3 = 600 + heat_level_3_breathe = 600 + + synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. + + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_INTORGANS + dietflags = 0 //IPCs can't eat, so no diet + blood_color = "#1F181F" + flesh_color = "#AAAAAA" + +/datum/species/machine/handle_death(var/mob/living/carbon/human/H) + H.emote("deathgasp") + for(var/organ_name in H.organs_by_name) + if (organ_name == "head") // do the head last as that's when the user will be transfered to the posibrain + continue + var/obj/item/organ/external/O = H.organs_by_name[organ_name] + if(O && (O.body_part != UPPER_TORSO) && (O.body_part != LOWER_TORSO)) // We're making them fall apart, not gibbing them! + O.droplimb(1) + var/obj/item/organ/external/O = H.organs_by_name["head"] + if(O) O.droplimb(1) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index af066547923..3b2f9d0edf7 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -7,10 +7,17 @@ var/path // Species path var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set. var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set. + + // Damage overlay and masks. + var/damage_overlays = 'icons/mob/human_races/masks/dam_human.dmi' + var/damage_mask = 'icons/mob/human_races/masks/dam_mask_human.dmi' + var/blood_mask = 'icons/mob/human_races/masks/blood_human.dmi' + var/eyes = "eyes_s" // Icon for eyes. var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen. - 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/tail // Name of tail image in species effects icon file. var/unarmed //For empty hand harm-intent attack var/unarmed_type = /datum/unarmed_attack @@ -60,12 +67,15 @@ var/blood_color = "#A10808" //Red. var/flesh_color = "#FFC896" //Pink. var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs + var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human var/base_color //Used when setting species. //Used in icon caching. var/race_key = 0 var/icon/icon_template + var/is_small + var/show_ssd = 1 // Language/culture vars. var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. @@ -314,467 +324,9 @@ /datum/species/proc/can_understand(var/mob/other) return -/datum/species/human - name = "Human" - icobase = 'icons/mob/human_races/r_human.dmi' - deform = 'icons/mob/human_races/r_def_human.dmi' - primitive = /mob/living/carbon/monkey - path = /mob/living/carbon/human/human - language = "Sol Common" - flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT - bodyflags = HAS_SKIN_TONE - dietflags = DIET_OMNI - unarmed_type = /datum/unarmed_attack/punch - 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.

\ - While the central Sol government maintains control of its far-flung people, powerful corporate \ - interests, rampant cyber and bio-augmentation and secretive factions make life on most human \ - worlds tumultous at best." - -/datum/species/unathi - name = "Unathi" - icobase = 'icons/mob/human_races/r_lizard.dmi' - deform = 'icons/mob/human_races/r_def_lizard.dmi' - path = /mob/living/carbon/human/unathi - default_language = "Galactic Common" - language = "Sinta'unathi" - tail = "sogtail" - unarmed_type = /datum/unarmed_attack/claws - primitive = /mob/living/carbon/monkey/unathi - darksight = 3 - - blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \ - Uuosa-Eso system, which roughly translates to 'burning mother'.

Coming from a harsh, radioactive \ - desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \ - else, frequently even their own lives. They prefer warmer temperatures than most species and \ - their native tongue is a heavy hissing laungage called Sinta'Unathi." - - flags = HAS_LIPS | HAS_UNDERWEAR - bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING - dietflags = DIET_CARN - - cold_level_1 = 280 //Default 260 - Lower is better - cold_level_2 = 220 //Default 200 - cold_level_3 = 140 //Default 120 - - heat_level_1 = 380 //Default 360 - Higher is better - heat_level_2 = 420 //Default 400 - heat_level_3 = 480 //Default 460 - heat_level_3_breathe = 1100 //Default 1000 - - flesh_color = "#34AF10" - - reagent_tag = IS_UNATHI - base_color = "#066000" - -/datum/species/unathi/handle_death(var/mob/living/carbon/human/H) - - H.stop_tail_wagging(1) - -/datum/species/tajaran - name = "Tajaran" - icobase = 'icons/mob/human_races/r_tajaran.dmi' - deform = 'icons/mob/human_races/r_def_tajaran.dmi' - path = /mob/living/carbon/human/tajaran - default_language = "Galactic Common" - language = "Siik'tajr" - tail = "tajtail" - unarmed_type = /datum/unarmed_attack/claws - darksight = 8 - - blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \ - S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \ - influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \ - of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \ - using unique inflections their mouths form." - - cold_level_1 = 240 - cold_level_2 = 180 - cold_level_3 = 100 - - heat_level_1 = 340 - heat_level_2 = 380 - heat_level_3 = 440 - heat_level_3_breathe = 900 - - primitive = /mob/living/carbon/monkey/tajara - - flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT - bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING - dietflags = DIET_OMNI - - flesh_color = "#AFA59E" - base_color = "#333333" - -/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) - - H.stop_tail_wagging(1) - -/datum/species/vulpkanin - name = "Vulpkanin" - icobase = 'icons/mob/human_races/r_vulpkanin.dmi' - deform = 'icons/mob/human_races/r_vulpkanin.dmi' - path = /mob/living/carbon/human/vulpkanin - default_language = "Galactic Common" - language = "Canilunzt" - primitive = /mob/living/carbon/monkey/vulpkanin - tail = "vulptail" - unarmed_type = /datum/unarmed_attack/claws - darksight = 8 - - blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \ - dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \ - culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \ - to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ - which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." - - flags = HAS_LIPS | HAS_UNDERWEAR - bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING - dietflags = DIET_OMNI - - flesh_color = "#966464" - base_color = "#BE8264" - -/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H) - - H.stop_tail_wagging(1) - -/datum/species/skrell - name = "Skrell" - icobase = 'icons/mob/human_races/r_skrell.dmi' - deform = 'icons/mob/human_races/r_def_skrell.dmi' - path = /mob/living/carbon/human/skrell - default_language = "Galactic Common" - language = "Skrellian" - primitive = /mob/living/carbon/monkey/skrell - unarmed_type = /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 \ - of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \ - herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ - the secrets of their empire to their allies." - - flags = HAS_LIPS | HAS_UNDERWEAR - bodyflags = HAS_SKIN_COLOR - dietflags = DIET_HERB - - flesh_color = "#8CD7A3" - blood_color = "#1D2CBF" - reagent_tag = IS_SKRELL - -/datum/species/vox - name = "Vox" - icobase = 'icons/mob/human_races/r_vox.dmi' - deform = 'icons/mob/human_races/r_def_vox.dmi' - path = /mob/living/carbon/human/vox - - default_language = "Galactic Common" - language = "Vox-pidgin" - speech_sounds = list('sound/voice/shriek1.ogg') - speech_chance = 20 - - unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. - - blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ - scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \ - alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \ - refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \ - smell.

Most humans will never meet a Vox raider, instead learning of this insular species through \ - dealing with their traders and merchants; those that do rarely enjoy the experience." - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - eyes = "vox_eyes_s" - - breath_type = "nitrogen" - poison_type = "oxygen" - - flags = NO_SCAN | IS_WHITELISTED - dietflags = DIET_OMNI - - blood_color = "#2299FC" - flesh_color = "#808D11" - - reagent_tag = IS_VOX - - makeName(var/gender,var/mob/living/carbon/human/H=null) - var/sounds = rand(2,8) - var/i = 0 - var/newname = "" - - while(i<=sounds) - i++ - newname += pick(vox_name_syllables) - return capitalize(newname) -/* -/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) - - H.verbs += /mob/living/carbon/human/proc/leap - ..() */ - -/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) - - H.verbs += /mob/living/carbon/human/proc/gut - ..() - -/datum/species/vox/armalis - name = "Vox Armalis" - icobase = 'icons/mob/human_races/r_armalis.dmi' - deform = 'icons/mob/human_races/r_armalis.dmi' - path = /mob/living/carbon/human/voxarmalis - unarmed_type = /datum/unarmed_attack/claws/armalis - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - heat_level_1 = 2000 - heat_level_2 = 3000 - heat_level_3 = 4000 - heat_level_3_breathe = 4000 - - brute_mod = 0.2 - burn_mod = 0.2 - - eyes = "blank_eyes" - breath_type = "nitrogen" - poison_type = "oxygen" - - flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED - dietflags = DIET_OMNI //should inherit this from vox, this is here just in case - - blood_color = "#2299FC" - flesh_color = "#808D11" - - reagent_tag = IS_VOX - - tail = "armalis_tail" - icon_template = 'icons/mob/human_races/r_armalis.dmi' - - has_organ = list( - "heart" = /obj/item/organ/heart, - "lungs" = /obj/item/organ/lungs, - "liver" = /obj/item/organ/liver, - "kidneys" = /obj/item/organ/kidneys, - "brain" = /obj/item/organ/brain, - "eyes" = /obj/item/organ/eyes, - "stack" = /obj/item/organ/stack/vox - ) - -/datum/species/kidan - name = "Kidan" - icobase = 'icons/mob/human_races/r_kidan.dmi' - deform = 'icons/mob/human_races/r_def_kidan.dmi' - path = /mob/living/carbon/human/kidan - default_language = "Galactic Common" - language = "Chittin" - unarmed_type = /datum/unarmed_attack/claws - - brute_mod = 0.8 - - flags = IS_WHITELISTED - bodyflags = FEET_CLAWS - dietflags = DIET_HERB - - blood_color = "#FB9800" - - -/datum/species/slime - name = "Slime People" - default_language = "Galactic Common" - language = "Bubblish" - icobase = 'icons/mob/human_races/r_slime.dmi' - deform = 'icons/mob/human_races/r_slime.dmi' - path = /mob/living/carbon/human/slime - primitive = /mob/living/carbon/slime - unarmed_type = /datum/unarmed_attack/punch - - flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN - bodyflags = HAS_SKIN_COLOR - bloodflags = BLOOD_SLIME - dietflags = DIET_CARN - - //ventcrawler = 1 //ventcrawling commented out - - has_organ = list( - "brain" = /obj/item/organ/brain/slime - ) - -/datum/species/grey - name = "Grey" - icobase = 'icons/mob/human_races/r_grey.dmi' - deform = 'icons/mob/human_races/r_def_grey.dmi' - default_language = "Galactic Common" - //language = "Grey" // Perhaps if they ever get a hivemind - unarmed_type = /datum/unarmed_attack/punch - darksight = 5 // BOOSTED from 2 - eyes = "grey_eyes_s" - - brute_mod = 1.25 //greys are fragile - - default_genes = list(REMOTE_TALK) - - primitive = /mob/living/carbon/monkey // TODO - - flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT - dietflags = DIET_HERB - - blood_color = "#A200FF" - -/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove) - if(!remove) - C.dna.SetSEState(REMOTETALKBLOCK,1,1) - C.mutations |= REMOTE_TALK - genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) - else - C.dna.SetSEState(REMOTETALKBLOCK,0,1) - C.mutations -= REMOTE_TALK - genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) - C.update_mutations() - ..() - -/datum/species/diona - name = "Diona" - icobase = 'icons/mob/human_races/r_diona.dmi' - deform = 'icons/mob/human_races/r_def_plant.dmi' - path = /mob/living/carbon/human/diona - default_language = "Galactic Common" - language = "Rootspeak" - unarmed_type = /datum/unarmed_attack/diona - primitive = /mob/living/carbon/monkey/diona - slowdown = 5 - - warning_low_pressure = 50 - hazard_low_pressure = -1 - - cold_level_1 = 50 - cold_level_2 = -1 - cold_level_3 = -1 - - heat_level_1 = 300 - heat_level_2 = 340 - heat_level_3 = 400 - heat_level_3_breathe = 700 - - blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ - species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \ - there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \ - Minoris primary being ringed with a cloud of singing space-station-sized entities.

The Dionaea coexist peacefully with \ - all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \ - even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \ - water and other radiation." - - flags = NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN - dietflags = 0 //Diona regenerate nutrition in light, no diet necessary - - body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - - blood_color = "#004400" - flesh_color = "#907E4A" - - reagent_tag = IS_DIONA - - has_organ = list( - "nutrient channel" = /obj/item/organ/diona/nutrients, - "neural strata" = /obj/item/organ/diona/strata, - "response node" = /obj/item/organ/diona/node, - "gas bladder" = /obj/item/organ/diona/bladder, - "polyp segment" = /obj/item/organ/diona/polyp, - "anchoring ligament" = /obj/item/organ/diona/ligament - ) - - has_limbs = list( - "chest" = list("path" = /obj/item/organ/external/diona/chest), - "groin" = list("path" = /obj/item/organ/external/diona/groin), - "head" = list("path" = /obj/item/organ/external/diona/head), - "l_arm" = list("path" = /obj/item/organ/external/diona/arm), - "r_arm" = list("path" = /obj/item/organ/external/diona/arm/right), - "l_leg" = list("path" = /obj/item/organ/external/diona/leg), - "r_leg" = list("path" = /obj/item/organ/external/diona/leg/right), - "l_hand" = list("path" = /obj/item/organ/external/diona/hand), - "r_hand" = list("path" = /obj/item/organ/external/diona/hand/right), - "l_foot" = list("path" = /obj/item/organ/external/diona/foot), - "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right) - ) - -/datum/species/diona/can_understand(var/mob/other) - var/mob/living/carbon/monkey/diona/D = other - if(istype(D)) - return 1 - return 0 - -/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) - H.gender = NEUTER - - return ..() - -/* //overpowered and dumb as hell; they get cloning back, though. -/datum/species/diona/handle_death(var/mob/living/carbon/human/H) - - var/mob/living/carbon/monkey/diona/S = new(get_turf(H)) - - if(H.mind) - H.mind.transfer_to(S) - else - S.key = H.key - - for(var/mob/living/carbon/monkey/diona/D in H.contents) - if(D.client) - D.loc = H.loc - else - del(D) - - H.visible_message("\red[H] splits apart with a wet slithering noise!") */ - -/datum/species/machine - name = "Machine" - icobase = 'icons/mob/human_races/r_machine.dmi' - deform = 'icons/mob/human_races/r_machine.dmi' - path = /mob/living/carbon/human/machine - default_language = "Galactic Common" - language = "Trinary" - unarmed_type = /datum/unarmed_attack/punch - - eyes = "blank_eyes" - brute_mod = 1.5 - burn_mod = 1.5 - - cold_level_1 = 50 - cold_level_2 = -1 - cold_level_3 = -1 - - heat_level_1 = 500 //gives them about 25 seconds in space before taking damage - heat_level_2 = 540 - heat_level_3 = 600 - heat_level_3_breathe = 600 - - synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_INTORGANS - dietflags = 0 //IPCs can't eat, so no diet - blood_color = "#1F181F" - flesh_color = "#AAAAAA" - -/datum/species/machine/handle_death(var/mob/living/carbon/human/H) - H.emote("deathgasp") - for(var/organ_name in H.organs_by_name) - if (organ_name == "head") // do the head last as that's when the user will be transfered to the posibrain - continue - var/obj/item/organ/external/O = H.organs_by_name[organ_name] - if(O && (O.body_part != UPPER_TORSO) && (O.body_part != LOWER_TORSO)) // We're making them fall apart, not gibbing them! - O.droplimb(1) - var/obj/item/organ/external/O = H.organs_by_name["head"] - if(O) O.droplimb(1) - +// Called in life() when the mob has no client. +/datum/species/proc/handle_npc(var/mob/living/carbon/human/H) + return //Species unarmed attacks From 1935a82afe54be447564fa48396a09f3454c4036 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 May 2015 19:48:13 -0400 Subject: [PATCH 02/16] 2/3 of port done --- code/ATMOSPHERICS/components/tvalve.dm | 11 +- code/ATMOSPHERICS/components/valve.dm | 3 - code/_onclick/other_mobs.dm | 2 +- code/controllers/hooks-defs.dm | 2 +- code/datums/mind.dm | 9 +- code/datums/spell.dm | 2 +- code/datums/spells/horsemask.dm | 2 +- code/datums/spells/inflict_handler.dm | 2 +- code/datums/supplypacks.dm | 2 + code/game/atoms_movable.dm | 4 - code/game/dna/dna_modifier.dm | 2 - code/game/dna/genes/goon_disabilities.dm | 2 +- code/game/dna/genes/goon_powers.dm | 4 +- code/game/dna/genes/monkey.dm | 242 +++---- .../gamemodes/changeling/changeling_power.dm | 4 +- .../gamemodes/changeling/evolution_menu.dm | 8 +- .../gamemodes/changeling/powers/tiny_prick.dm | 4 +- code/game/gamemodes/mutiny/mutiny_hooks.dm | 2 +- code/game/gamemodes/nations/flagprocs.dm | 2 - code/game/machinery/Freezer.dm | 3 - .../atmoalter/area_atmos_computer.dm | 2 - code/game/machinery/camera/camera.dm | 11 - .../machinery/computer/HolodeckControl.dm | 2 - code/game/machinery/computer/aifixer.dm | 3 - code/game/machinery/computer/camera.dm | 2 - code/game/machinery/computer/prisoner.dm | 2 - code/game/machinery/doors/airlock.dm | 2 - code/game/machinery/doors/door.dm | 7 +- code/game/machinery/doors/windowdoor.dm | 2 - code/game/machinery/guestpass.dm | 2 - code/game/machinery/kitchen/monkeyrecycler.dm | 4 +- code/game/machinery/kitchen/processor.dm | 4 +- code/game/machinery/navbeacon.dm | 2 - code/game/machinery/teleporter.dm | 9 +- code/game/objects/items.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 - code/game/objects/items/stacks/medical.dm | 2 +- code/game/objects/items/weapons/grenades.dm | 2 +- .../objects/items/weapons/storage/bags.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 3 +- .../objects/items/weapons/storage/firstaid.dm | 2 +- .../crates_lockers/closets/statue.dm | 4 +- code/game/supplyshuttle.dm | 4 - .../awaymissions/mission_code/wildwest.dm | 2 +- code/modules/hydroponics/seed.dm | 2 +- code/modules/hydroponics/seed_datums.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 4 +- code/modules/jungle/jungle_animals.dm | 2 +- code/modules/media/jukebox.dm | 2 - .../mob/living/carbon/alien/diona/diona.dm | 34 + .../carbon/alien/diona/diona_attacks.dm | 7 + .../living/carbon/alien/diona/diona_powers.dm | 69 ++ .../diona.dm => alien/diona/dionaold.dm} | 0 .../mob/living/carbon/alien/diona/life.dm | 22 + .../living/carbon/alien/diona/progression.dm | 19 + .../carbon/alien/diona/say_understands.dm | 6 + .../living/carbon/alien/diona/update_icons.dm | 8 + .../living/carbon/alien/humanoid/humanoid.dm | 28 - .../mob/living/carbon/alien/larva/larva.dm | 28 - .../living/carbon/alien/special/facehugger.dm | 2 +- .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/npcs.dm | 2 +- code/modules/mob/living/carbon/human/say.dm | 2 +- .../mob/living/carbon/human/species/apollo.dm | 2 +- .../mob/living/carbon/human/species/monkey.dm | 18 +- .../living/carbon/human/species/station.dm | 6 +- .../mob/living/carbon/human/update_icons.dm | 40 +- .../modules/mob/living/carbon/metroid/life.dm | 2 +- .../mob/living/carbon/metroid/metroid.dm | 31 - .../modules/mob/living/carbon/monkey/death.dm | 56 -- .../modules/mob/living/carbon/monkey/emote.dm | 157 ---- .../mob/living/carbon/monkey/examine.dm | 63 -- code/modules/mob/living/carbon/monkey/hud.dm | 249 ------- .../mob/living/carbon/monkey/inventory.dm | 243 ------- code/modules/mob/living/carbon/monkey/life.dm | 675 ------------------ .../modules/mob/living/carbon/monkey/login.dm | 4 - .../mob/living/carbon/monkey/monkey.dm | 553 -------------- code/modules/mob/living/carbon/monkey/npc.dm | 89 --- code/modules/mob/living/carbon/monkey/say.dm | 28 - .../mob/living/carbon/monkey/update_icons.dm | 134 ---- code/modules/mob/living/living.dm | 7 - .../modules/mob/living/silicon/robot/robot.dm | 5 - .../living/simple_animal/friendly/corgi.dm | 4 +- .../mob/living/simple_animal/friendly/crab.dm | 4 +- .../mob/living/simple_animal/parrot.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 23 - code/modules/mob/mob_cleanup.dm | 8 - code/modules/mob/mob_grab.dm | 2 +- code/modules/mob/mob_helpers.dm | 12 +- code/modules/mob/transform_procs.dm | 2 +- code/modules/organs/blood.dm | 6 - code/modules/power/apc.dm | 3 +- code/modules/power/port_gen.dm | 9 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/projectile/change.dm | 5 +- code/modules/projectiles/projectile/magic.dm | 5 +- code/modules/reagents/Chemistry-Reagents.dm | 7 - code/modules/reagents/newchem/toxins.dm | 4 +- .../reagent_containers/food/snacks.dm | 23 +- .../reagents/reagent_containers/syringes.dm | 4 - code/modules/recycling/disposal.dm | 9 - .../artifact/artifact_autocloner.dm | 3 +- code/modules/virus2/effect.dm | 2 +- code/modules/virus2/helpers.dm | 5 - icons/mob/human_races/masks/blood_human.dmi | Bin 0 -> 8321 bytes icons/mob/human_races/masks/blood_monkey.dmi | Bin 0 -> 1773 bytes icons/mob/human_races/masks/dam_human.dmi | Bin 0 -> 6471 bytes .../mob/human_races/masks/dam_mask_human.dmi | Bin 0 -> 431 bytes .../mob/human_races/masks/dam_mask_monkey.dmi | Bin 0 -> 688 bytes icons/mob/human_races/masks/dam_monkey.dmi | Bin 0 -> 4439 bytes icons/mob/human_races/monkeys/r_farwa.dmi | Bin 0 -> 1231 bytes icons/mob/human_races/monkeys/r_monkey.dmi | Bin 0 -> 952 bytes icons/mob/human_races/monkeys/r_neara.dmi | Bin 0 -> 1035 bytes icons/mob/human_races/monkeys/r_stok.dmi | Bin 0 -> 1125 bytes paradise.dme | 20 +- 115 files changed, 377 insertions(+), 2781 deletions(-) create mode 100644 code/modules/mob/living/carbon/alien/diona/diona.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/diona_attacks.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/diona_powers.dm rename code/modules/mob/living/carbon/{monkey/diona.dm => alien/diona/dionaold.dm} (100%) create mode 100644 code/modules/mob/living/carbon/alien/diona/life.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/progression.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/say_understands.dm create mode 100644 code/modules/mob/living/carbon/alien/diona/update_icons.dm delete mode 100644 code/modules/mob/living/carbon/monkey/death.dm delete mode 100644 code/modules/mob/living/carbon/monkey/emote.dm delete mode 100644 code/modules/mob/living/carbon/monkey/examine.dm delete mode 100644 code/modules/mob/living/carbon/monkey/hud.dm delete mode 100644 code/modules/mob/living/carbon/monkey/inventory.dm delete mode 100644 code/modules/mob/living/carbon/monkey/life.dm delete mode 100644 code/modules/mob/living/carbon/monkey/login.dm delete mode 100644 code/modules/mob/living/carbon/monkey/monkey.dm delete mode 100644 code/modules/mob/living/carbon/monkey/npc.dm delete mode 100644 code/modules/mob/living/carbon/monkey/say.dm delete mode 100644 code/modules/mob/living/carbon/monkey/update_icons.dm create mode 100644 icons/mob/human_races/masks/blood_human.dmi create mode 100644 icons/mob/human_races/masks/blood_monkey.dmi create mode 100644 icons/mob/human_races/masks/dam_human.dmi create mode 100644 icons/mob/human_races/masks/dam_mask_human.dmi create mode 100644 icons/mob/human_races/masks/dam_mask_monkey.dmi create mode 100644 icons/mob/human_races/masks/dam_monkey.dmi create mode 100644 icons/mob/human_races/monkeys/r_farwa.dmi create mode 100644 icons/mob/human_races/monkeys/r_monkey.dmi create mode 100644 icons/mob/human_races/monkeys/r_neara.dmi create mode 100644 icons/mob/human_races/monkeys/r_stok.dmi diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index da4a9cbb7bd..c97367f0529 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -37,12 +37,12 @@ if(!istype(T)) return add_underlay(T, node1, turn(dir, -180)) - + if(istype(src, /obj/machinery/atmospherics/tvalve/mirrored)) add_underlay(T, node2, turn(dir, 90)) else add_underlay(T, node2, turn(dir, -90)) - + add_underlay(T, node3, dir) /obj/machinery/atmospherics/tvalve/hide(var/i) @@ -172,9 +172,6 @@ /obj/machinery/atmospherics/tvalve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/tvalve/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/atmospherics/tvalve/attack_hand(mob/user as mob) src.add_fingerprint(usr) update_icon(1) @@ -224,7 +221,7 @@ src.connected_to = c node3 = target break - + update_icon() update_underlays() @@ -419,7 +416,7 @@ if(target.initialize_directions & get_dir(target,src)) node3 = target break - + update_icon() update_underlays() diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 1ec8bc13dce..481b3ecd062 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -132,9 +132,6 @@ /obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/valve/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) src.add_fingerprint(usr) update_icon(1) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 17121f92f32..921fb8e818e 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -57,7 +57,7 @@ /mob/living/carbon/alien/UnarmedAttack(var/atom/A) A.attack_alien(src) /atom/proc/attack_alien(mob/user as mob) - attack_paw(user) + attack_hand(user) return /mob/living/carbon/alien/RestrainedClickOn(var/atom/A) return diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 973da27ee48..fafb898de6a 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -54,7 +54,7 @@ /** * Podman hook. * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/monkey/diona + * Parameters: var/mob/living/carbon/alien/diona */ /hook/harvest_podman diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 47fade12372..5d5b7588355 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -137,7 +137,7 @@ datum/mind ) var/text = "" var/mob/living/carbon/human/H = current - if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) + if (istype(current, /mob/living/carbon/human)) /** Impanted**/ if(H.is_loyalty_implanted(H)) text = "Loyalty Implant:Remove|Implanted
" @@ -343,13 +343,6 @@ datum/mind text = "[text]: " if (istype(current, /mob/living/carbon/human)) text += "healthy|infected|HUMAN|other" - else if (istype(current, /mob/living/carbon/monkey)) - var/found = 0 - - if(found) - text += "healthy|INFECTED|human|other" - else - text += "HEALTHY|infected|human|other" else text += "healthy|infected|human|OTHER" diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 2c27947ddbf..c9a91dc563d 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -84,7 +84,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin user << "Not when you're incapacitated." return 0 - if(ishuman(user) || ismonkey(user)) + if(ishuman(user) || issmall(user)) if(user.is_muzzled()) user << "Mmmf mrrfff!" return 0 diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index d8f7fec621e..035a3ab7416 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -12,7 +12,7 @@ range = 7 cooldown_min = 30 //30 deciseconds reduction per rank selection_type = "range" - var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/list/compatible_mobs = list(/mob/living/carbon/human) action_icon_state = "spell_horse" diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index 2035ed315e1..742326464db 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -26,7 +26,7 @@ if("gib") target.gib() if("gib_brain") - if(ishuman(target) || ismonkey(target)) + if(ishuman(target) || issmall(target)) var/mob/living/carbon/C = target if(C.brain_op_stage != 4) // Their brain is already taken out var/obj/item/organ/brain/B = new(C.loc) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index d00c7deeac6..d7dfd29644d 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -799,11 +799,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 30 containername = "farwa crate" +/* /datum/supply_packs/organic/wolpin name = "Wolpin crate" contains = list (/obj/item/weapon/storage/box/wolpincubes) cost = 30 containername = "wolpin crate" +*/ /datum/supply_packs/organic/skrell name = "Neaera crate" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0cc4606419b..ab594b30ba1 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -251,10 +251,6 @@ return src.master.attackby(a, b, c) return -/atom/movable/overlay/attack_paw(a, b, c) - if (src.master) - return src.master.attack_paw(a, b, c) - return /atom/movable/overlay/attack_hand(a, b, c) if (src.master) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 2ba16ac0663..38804b13067 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -417,8 +417,6 @@ return return */ -/obj/machinery/computer/scan_consolenew/attack_paw(user as mob) - attack_hand(user) /obj/machinery/computer/scan_consolenew/attack_ai(user as mob) src.add_hiddenprint(user) diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 9d22fff859b..449d15fc1bc 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -315,7 +315,7 @@ invocation_type = "none" range = 7 selection_type = "range" - var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/list/compatible_mobs = list(/mob/living/carbon/human) include_user = 0 action_icon_state = "genetic_incendiary" diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 6007d233512..4abbb4eee54 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -142,7 +142,7 @@ selection_type = "range" include_user = 1 // centcomm_cancast = 0 - var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/list/compatible_mobs = list(/mob/living/carbon/human) action_icon_state = "genetic_cryo" @@ -240,7 +240,7 @@ action_icon_state = "genetic_eat" - var/list/types_allowed=list(/obj/item,/mob/living/simple_animal, /mob/living/carbon/monkey, /mob/living/carbon/human) + var/list/types_allowed=list(/obj/item,/mob/living/simple_animal, /mob/living/carbon/human) /obj/effect/proc_holder/spell/wizard/targeted/eat/choose_targets(mob/user = usr) var/list/targets = new /list() diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index c10178b285a..4c711464777 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -5,166 +5,92 @@ block=MONKEYBLOCK /datum/dna/gene/monkey/can_activate(var/mob/M,var/flags) - return istype(M, /mob/living/carbon/human) || istype(M,/mob/living/carbon/monkey) + return istype(M, /mob/living/carbon/human) -/datum/dna/gene/monkey/activate(var/mob/living/M, var/connected, var/flags) - if(!istype(M,/mob/living/carbon/human)) +/datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags) + if(!istype(H,/mob/living/carbon/human)) // testing("Cannot monkey-ify [M], type is [M.type].") return - var/mob/living/carbon/human/H = M - H.notransform = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null - - if(!connected) - for(var/obj/item/W in (H.contents-implants)) - if (W==H.w_uniform) // will be teared - continue - H.unEquip(W) - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - qdel(animation) - - - var/mob/living/carbon/monkey/O = null - if(H.species.primitive) - O = new H.species.primitive(src) - else - H.gib() //Trying to change the species of a creature with no primitive var set is messy. + if(H.monkeyizing) return - - if(M) - if (M.dna) - O.dna = M.dna.Clone() - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - - - for(var/obj/T in (M.contents-implants)) - qdel(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the cute little monkey - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) - O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss() + 20) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - O.a_intent = "hurt" - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - qdel(M) - return - -/datum/dna/gene/monkey/deactivate(var/mob/living/M, var/connected, var/flags) - if(!istype(M,/mob/living/carbon/monkey)) - testing("Cannot humanize [M], type is [M.type].") - return - var/mob/living/carbon/monkey/Mo = M - Mo.notransform = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) - Mo.unEquip(W) - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(48) - del(animation) - - var/mob/living/carbon/human/O - if(Mo.greaterform) - var/greatform = lowertext(Mo.greaterform) - var/typepath = "/mob/living/carbon/human/" - typepath += greatform - O = new typepath(src, greatform) - else - O = new(src) - - if (M.dna.GetUIState(DNA_UI_GENDER)) - O.gender = FEMALE - else - O.gender = MALE - - if (M) - if (M.dna) - O.dna = M.dna.Clone() - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - //for(var/obj/T in M) - // del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the human - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - - var/i - while (!i) - var/randomname - if (O.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) + for(var/obj/item/W in H) + if (W==H.w_uniform) // will be torn continue - else - O.real_name = randomname - O.dna.real_name = randomname - i++ - O.UpdateAppearance() - O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss()) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return \ No newline at end of file + H.drop_from_inventory(W) + H.regenerate_icons() + H.monkeyizing = 1 + H.canmove = 0 + H.stunned = 1 + H.icon = null + H.invisibility = 101 + for(var/t in H.organs) + del(t) + var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = H + flick("h2monkey", animation) + sleep(48) + //animation = null + + H.monkeyizing = 0 + H.stunned = 0 + H.update_canmove() + H.invisibility = initial(H.invisibility) + + if(!H.species.primitive_form) //If the creature in question has no primitive set, this is going to be messy. + H.gib() + return + + for(var/obj/item/W in H) + H.drop_from_inventory(W) + H.set_species(H.species.primitive_form) + + H << "You are now [H.species.name]. " + qdel(animation) + + return H + +/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags) + if(!istype(H,/mob/living/carbon/human)) +// testing("Cannot monkey-ify [M], type is [M.type].") + return + if(H.monkeyizing) + return + for(var/obj/item/W in H) + if (W==H.w_uniform) // will be torn + continue + H.drop_from_inventory(W) + H.regenerate_icons() + H.monkeyizing = 1 + H.canmove = 0 + H.stunned = 1 + H.icon = null + H.invisibility = 101 + for(var/t in H.organs) + del(t) + var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc ) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = H + flick("monkey2h", animation) + sleep(48) + //animation = null + + H.monkeyizing = 0 + H.stunned = 0 + H.update_canmove() + H.invisibility = initial(H.invisibility) + + if(!H.species.greater_form) //If the creature in question has no primitive set, this is going to be messy. + H.gib() + return + + for(var/obj/item/W in H) + H.drop_from_inventory(W) + H.set_species(H.species.greater_form) + + H << "You are now [H.species.name]. " + qdel(animation) + + return H \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 36df179ae32..25875f77f04 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -47,7 +47,7 @@ //Fairly important to remember to return 1 on success >.< /obj/effect/proc_holder/changeling/proc/can_sting(var/mob/user, var/mob/target) - if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards + if(!ishuman(user) && !issmall(user)) //typecast everything from mob to carbon from this point onwards return 0 if(req_human && !ishuman(user)) user << "We cannot do that in this form!" @@ -72,7 +72,7 @@ //used in /mob/Stat() /obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user) - if(!ishuman(user) && !ismonkey(user)) + if(!ishuman(user) && !issmall(user)) return 0 if(req_human && !ishuman(user)) return 0 diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 32ab8473d66..fefc9965a24 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -352,7 +352,7 @@ var/list/sting_paths /mob/proc/make_changeling() if(!mind) return - if(!ishuman(src) && !ismonkey(src)) + if(!ishuman(src) && !issmall(src)) return if(!mind.changeling) mind.changeling = new /datum/changeling(gender) @@ -360,7 +360,7 @@ var/list/sting_paths sting_paths = init_subtypes(/obj/effect/proc_holder/changeling) if(mind.changeling.purchasedpowers) remove_changeling_powers(1) - + add_language("Changeling") for(var/language in languages) @@ -377,7 +377,7 @@ var/list/sting_paths var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste mind.changeling.absorbed_dna |= C.dna return 1 - + //Used to dump the languages from the changeling datum into the actual mob. /mob/proc/changeling_update_languages(var/updated_languages) @@ -400,7 +400,7 @@ var/list/sting_paths mimicing = "" /mob/proc/remove_changeling_powers(var/keep_free_powers=0) - if(ishuman(src) || ismonkey(src)) + if(ishuman(src) || issmall(src)) if(mind && mind.changeling) digitalcamo = 0 mind.changeling.changeling_speak = 0 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 6158b8672bd..04446895a4d 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -82,7 +82,7 @@ /obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target) if(!..()) return - if((HUSK in target.mutations) || (!ishuman(target) && !ismonkey(target))) + if((HUSK in target.mutations) || (!ishuman(target) && !issmall(target))) user << "Our sting appears ineffective against its DNA." return 0 if(ishuman(target)) @@ -95,7 +95,7 @@ /obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) add_logs(target, user, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]") var/datum/dna/NewDNA = selected_dna - if(ismonkey(target)) + if(issmall(target)) user << "We stealthily sting [target.name]." target.dna = NewDNA.Clone() target.real_name = NewDNA.real_name diff --git a/code/game/gamemodes/mutiny/mutiny_hooks.dm b/code/game/gamemodes/mutiny/mutiny_hooks.dm index 1ff1234cf2d..5fdc1ec01b5 100644 --- a/code/game/gamemodes/mutiny/mutiny_hooks.dm +++ b/code/game/gamemodes/mutiny/mutiny_hooks.dm @@ -12,7 +12,7 @@ mode.update_icon(H.mind) return 1 -/hook/harvest_podman/proc/update_icon(mob/living/carbon/monkey/diona/D) +/hook/harvest_podman/proc/update_icon(mob/living/carbon/alien/diona/D) var/datum/game_mode/mutiny/mode = get_mutiny_mode() if (!mode) return 1 diff --git a/code/game/gamemodes/nations/flagprocs.dm b/code/game/gamemodes/nations/flagprocs.dm index b7dc23a2913..aa516de1f3d 100644 --- a/code/game/gamemodes/nations/flagprocs.dm +++ b/code/game/gamemodes/nations/flagprocs.dm @@ -23,8 +23,6 @@ /obj/item/flag/nation/attackby(var/obj/item/weapon/W, var/mob/user, params) return -/obj/item/flag/nation/attack_paw() - return /obj/item/flag/nation/ex_act() return diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index 9c1bd3fdafc..fa44371b82e 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -82,9 +82,6 @@ /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_ai(mob/user as mob) src.attack_hand(user) -/obj/machinery/atmospherics/unary/cold_sink/freezer/attack_paw(mob/user as mob) - src.attack_hand(user) - /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_hand(mob/user as mob) if(panel_open) user << "Close the maintenance panel first." diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index ddd5973c0d7..fbebcbeca44 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -24,8 +24,6 @@ src.add_hiddenprint(user) return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(var/mob/user as mob) if(..(user)) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7c24df85ba8..7051d805c82 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -113,17 +113,6 @@ return user.electrocute_act(10, src) -/obj/machinery/camera/attack_paw(mob/living/carbon/alien/humanoid/user as mob) - if(!istype(user)) - return - user.do_attack_animation(src) - status = 0 - visible_message("\The [user] slashes at [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - icon_state = "[initial(icon_state)]1" - add_hiddenprint(user) - deactivate(user,0) - /obj/machinery/camera/attackby(W as obj, mob/living/user as mob, params) var/msg = "You attach [W] into the assembly inner circuits." var/msg2 = "The camera already has that upgrade!" diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 0143d6e4eeb..d7293163318 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -15,8 +15,6 @@ attack_ai(var/mob/user as mob) return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(var/mob/user as mob) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 417e781e640..f171a8262b1 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -26,9 +26,6 @@ /obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/aifixer/attack_paw(var/mob/user as mob) - return attack_hand(user) - /obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob) if(..()) return diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 33ac065926d..35745965926 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -46,8 +46,6 @@ var/camera_cache_id = 1 attack_ai(var/mob/user as mob) return attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(user) check_eye(var/mob/user as mob) if ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded || !( current ) || !( current.status )) && (!istype(user, /mob/living/silicon))) diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 1e667aae3b3..5bef2a94555 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -21,8 +21,6 @@ return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return attack_hand(var/mob/user as mob) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 617214ea5c5..a0021730a11 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -606,8 +606,6 @@ About the new airlock wires panel: s.set_up(5, 1, src) s.start() return ..() -/obj/machinery/door/airlock/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/machinery/door/airlock/attack_hand(mob/user as mob) if(!istype(user, /mob/living/silicon)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 7fbc689bbbb..640775a48d0 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -132,11 +132,6 @@ /obj/machinery/door/attack_ai(mob/user as mob) return src.attack_hand(user) - -/obj/machinery/door/attack_paw(mob/user as mob) - return src.attack_hand(user) - - /obj/machinery/door/attack_hand(mob/user as mob) return src.attackby(user, user) @@ -289,7 +284,7 @@ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.emote("scream") L.Weaken(5) - else if(ismonkey(L)) //For monkeys + else if(issmall(L)) //For monkeys L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.Weaken(5) else //for simple_animals & borgs diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 7a3a945721d..1430e8f00dc 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -227,8 +227,6 @@ return attack_generic(user, 25) -/obj/machinery/door/window/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/machinery/door/window/attack_hand(mob/user as mob) return src.attackby(user, user) diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 83cf1682bd8..65510c1d5aa 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -67,8 +67,6 @@ /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/guestpass/attack_paw(var/mob/user as mob) - return attack_hand(user) /obj/machinery/computer/guestpass/attack_hand(var/mob/user as mob) if(..()) diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 9342e6530b3..699f52ca5c0 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -18,8 +18,8 @@ if (istype(O, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O var/grabbed = G.affecting - if(istype(grabbed, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/target = grabbed + if(istype(grabbed, /mob/living/carbon/human/monkey)) + var/mob/living/carbon/human/monkey/target = grabbed if(target.stat == 0) user << "\red The monkey is struggling far too much to put it in the recycler." else diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index 9cc323b8b25..dd38d825810 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -79,11 +79,11 @@ ..() /datum/food_processor_process/mob/monkey - input = /mob/living/carbon/monkey + input = /mob/living/carbon/human/monkey output = null /datum/food_processor_process/mob/monkey/process(loc, what) - var/mob/living/carbon/monkey/O = what + var/mob/living/carbon/human/monkey/O = what if (O.client) //grief-proof O.loc = loc O.visible_message("Suddenly [O] jumps out from the processor!", \ diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index a8f39a4597e..82328073b4b 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -128,8 +128,6 @@ /obj/machinery/navbeacon/attack_ai(var/mob/user) interact(user, 1) -/obj/machinery/navbeacon/attack_paw() - return /obj/machinery/navbeacon/attack_hand(var/mob/user) interact(user, 0) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 9d30d7207af..6937938b135 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -46,7 +46,7 @@ else ..() return - + /obj/machinery/computer/teleporter/emag_act(user as mob) if(!emagged) emagged = 1 @@ -54,10 +54,6 @@ else ui_interact(user) -/obj/machinery/computer/teleporter/attack_paw(mob/user) - usr << "You are too primitive to use this computer." - return - /obj/machinery/computer/teleporter/attack_ai(mob/user) src.attack_hand(user) @@ -443,9 +439,6 @@ user << "You reconnect the station to nearby machinery." return -/obj/machinery/teleport/station/attack_paw() - src.attack_hand() - /obj/machinery/teleport/station/attack_ai() src.attack_hand() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8b1f979d4a7..91eb8b450bf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -202,7 +202,7 @@ A.unEquip(src) user << "Your claws aren't capable of such fine manipulation." return - attack_paw(A) + attack_hand(A) /obj/item/attack_ai(mob/user as mob) if (istype(src.loc, /obj/item/weapon/robot_module)) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 7c11ef5b5d6..dd163e05bed 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -67,8 +67,6 @@ attached = null ..() - attack_paw() - return attack_ai() return diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index e81b0e6e9b3..3ac400eefeb 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -15,7 +15,7 @@ user << "\The [src] cannot be applied to [M]!" return 1 - if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) + if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon))) user << "You don't have the dexterity to do this!" return 1 diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm index 3d6c101a109..5a1c01584a5 100644 --- a/code/game/objects/items/weapons/grenades.dm +++ b/code/game/objects/items/weapons/grenades.dm @@ -385,7 +385,7 @@ /obj/item/weapon/grenade/clusterbuster/monkey name = "Barrel of Monkeys" desc = "Not really that much fun." - payload = /mob/living/carbon/monkey + payload = /mob/living/carbon/human/monkey /obj/item/weapon/grenade/clusterbuster/fluffy name = "Fluffy Love Bomb" desc = "Exactly as snuggly as it sounds." diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 349aaa62553..5a87bc98ca0 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -378,7 +378,7 @@ else playsound(M, 'sound/items/trayhit2.ogg', 50, 1) - if(ishuman(M) || ismonkey(M)) + if(ishuman(M) || issmall(M)) if(prob(10)) M.Weaken(2) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index f4bbc9844bf..313550779ce 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -411,7 +411,7 @@ for(var/i = 1; i <= 5; i++) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src) - +/* /obj/item/weapon/storage/box/wolpincubes name = "wolpin cube box" desc = "Drymate brand wolpin cubes. Just add water!" @@ -423,6 +423,7 @@ ..() for(var/i = 1; i <= 5; i++) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube(src) +*/ /obj/item/weapon/storage/box/permits name = "box of construction permits" diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 30966b998d1..8a68307065f 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -168,7 +168,7 @@ /obj/item/weapon/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri - if (ishuman(usr) || ismonkey(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ + if (ishuman(usr) || issmall(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ var/mob/M = usr if (!( istype(over_object, /obj/screen) )) return ..() diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 82b305ec200..03911c66984 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -14,7 +14,7 @@ /obj/structure/closet/statue/New(loc, var/mob/living/L) - if(ishuman(L) || ismonkey(L) || iscorgi(L)) + if(ishuman(L) || issmall(L) || iscorgi(L)) if(L.buckled) L.buckled = 0 L.anchored = 0 @@ -32,7 +32,7 @@ name = "statue of [L.name]" if(L.gender == "female") icon_state = "human_female" - else if(ismonkey(L)) + else if(issmall(L)) name = "statue of a monkey" icon_state = "monkey" else if(iscorgi(L)) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index e610994fc5c..dd371817dca 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -328,14 +328,10 @@ var/list/mechtoys = list( /obj/machinery/computer/ordercomp/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/ordercomp/attack_paw(var/mob/user as mob) - return attack_hand(user) /obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/supplycomp/attack_paw(var/mob/user as mob) - return attack_hand(user) /obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob) if(..()) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 2f1edeacaa5..3e2910fa556 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -170,7 +170,7 @@ if(triggered) return - if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) + if(istype(M, /mob/living/carbon/human)) for(var/mob/O in viewers(world.view, src.loc)) O << "[M] triggered the \icon[src] [src]" triggered = 1 diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 9d023c52c48..1919da66b69 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -728,7 +728,7 @@ else product = new /obj/item/weapon/reagent_containers/food/snacks/grown(get_turf(user),name) if(get_trait(TRAIT_PRODUCT_COLOUR)) - if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/monkey/diona)) + if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/alien/diona)) product.color = get_trait(TRAIT_PRODUCT_COLOUR) if(istype(product,/obj/item/weapon/reagent_containers/food)) var/obj/item/weapon/reagent_containers/food/food = product diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index e1eb5c8681b..e70b16a4a69 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -1055,7 +1055,7 @@ seed_noun = "nodes" display_name = "replicant pods" can_self_harvest = 1 - has_mob_product = /mob/living/carbon/monkey/diona + has_mob_product = /mob/living/carbon/alien/diona /datum/seed/diona/New() ..() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 9e727f62bcb..374cd73ac8c 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -138,8 +138,8 @@ return ..() /obj/machinery/portable_atmospherics/hydroponics/proc/attack_generic(var/mob/user) - if(istype(user,/mob/living/carbon/monkey/diona)) - var/mob/living/carbon/monkey/diona/nymph = user + if(istype(user,/mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/nymph = user if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained()) return diff --git a/code/modules/jungle/jungle_animals.dm b/code/modules/jungle/jungle_animals.dm index 32db403da09..cb138b8baac 100644 --- a/code/modules/jungle/jungle_animals.dm +++ b/code/modules/jungle/jungle_animals.dm @@ -36,7 +36,7 @@ /obj/effect/landmark/animal_spawner/monkey name = "monkey spawner" - spawn_type = /mob/living/carbon/monkey + spawn_type = /mob/living/carbon/human/monkey /obj/effect/landmark/animal_spawner/snake name = "snake spawner" diff --git a/code/modules/media/jukebox.dm b/code/modules/media/jukebox.dm index e0fbf78ca6d..6e5554a52dd 100644 --- a/code/modules/media/jukebox.dm +++ b/code/modules/media/jukebox.dm @@ -87,8 +87,6 @@ var/global/loopModeNames=list( /obj/machinery/media/jukebox/attack_ai(var/mob/user) attack_hand(user) -/obj/machinery/media/jukebox/attack_paw() - return /obj/machinery/media/jukebox/power_change() ..() diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm new file mode 100644 index 00000000000..981e2507494 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -0,0 +1,34 @@ +/mob/living/carbon/alien/diona + name = "diona nymph" + voice_name = "diona nymph" + adult_form = /mob/living/carbon/human + speak_emote = list("chirrups") + icon_state = "nymph" + language = "Rootspeak" + + universal_understand = 1 + universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. + holder_type = /obj/item/weapon/holder/diona + +/mob/living/carbon/alien/diona/New() + + ..() + species = all_species["Diona"] + verbs += /mob/living/carbon/alien/diona/proc/merge + +/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM) + //TODO: Collapse these checks into one proc (see pai and drone) + if(istype(AM,/obj/item)) + var/obj/item/O = AM + if(O.w_class > 2) + src << "You are too small to pull that." + return + else + ..() + else + src << "You are too small to pull that." + return + +/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. + W.loc = get_turf(src) + return 1 diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm new file mode 100644 index 00000000000..5490d33fcbc --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -0,0 +1,7 @@ +/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M as mob) + if(istype(M) && M.a_intent == "help") + if(M.species && M.species.name == "Diona" && do_merge(M)) + return + get_scooped(M) + return + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm new file mode 100644 index 00000000000..54678e1ea01 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -0,0 +1,69 @@ +//Verbs after this point. +/mob/living/carbon/alien/diona/proc/merge() + + set category = "Abilities" + set name = "Merge with gestalt" + set desc = "Merge with another diona." + + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + + if(istype(src.loc,/mob/living/carbon)) + src.verbs -= /mob/living/carbon/alien/diona/proc/merge + return + + var/list/choices = list() + for(var/mob/living/carbon/C in view(1,src)) + + if(!(src.Adjacent(C)) || !(C.client)) continue + + if(istype(C,/mob/living/carbon/human)) + var/mob/living/carbon/human/D = C + if(D.species && D.species.name == "Diona") + choices += C + + var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices + + if(!M) + src << "There is nothing nearby to merge with." + else if(!do_merge(M)) + src << "You fail to merge with \the [M]..." + +/mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H) + if(!istype(H) || !src || !(src.Adjacent(H))) + return 0 + H << "You feel your being twine with that of \the [src] as it merges with your biomass." + H.status_flags |= PASSEMOTES + src << "You feel your being twine with that of \the [H] as you merge with its biomass." + loc = H + verbs += /mob/living/carbon/alien/diona/proc/split + verbs -= /mob/living/carbon/alien/diona/proc/merge + return 1 + +/mob/living/carbon/alien/diona/proc/split() + + set category = "Abilities" + set name = "Split from gestalt" + set desc = "Split away from your gestalt as a lone nymph." + + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + + if(!(istype(src.loc,/mob/living/carbon))) + src.verbs -= /mob/living/carbon/alien/diona/proc/split + return + + src.loc << "You feel a pang of loss as [src] splits away from your biomass." + src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground." + + var/mob/living/M = src.loc + + src.loc = get_turf(src) + src.verbs -= /mob/living/carbon/alien/diona/proc/split + src.verbs += /mob/living/carbon/alien/diona/proc/merge + + if(istype(M)) + for(var/atom/A in M.contents) + if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) + return + M.status_flags &= ~PASSEMOTES \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/alien/diona/dionaold.dm similarity index 100% rename from code/modules/mob/living/carbon/monkey/diona.dm rename to code/modules/mob/living/carbon/alien/diona/dionaold.dm diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm new file mode 100644 index 00000000000..ec0dd5d7e17 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/life.dm @@ -0,0 +1,22 @@ +//Dionaea regenerate health and nutrition in light. +/mob/living/carbon/alien/diona/handle_environment(datum/gas_mixture/environment) + + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + if(isturf(loc)) //else, there's considered to be no light + var/turf/T = loc + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + if(L) + light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights + else + light_amount = 5 + + + nutrition += light_amount + + if(nutrition > 500) + nutrition = 500 + if(light_amount > 2) //if there's enough light, heal + adjustBruteLoss(-1) + adjustFireLoss(-1) + adjustToxLoss(-1) + adjustOxyLoss(-1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm new file mode 100644 index 00000000000..588acea5ad8 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -0,0 +1,19 @@ +/mob/living/carbon/alien/diona/confirm_evolution() + + if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist) + src << alert("You are currently not whitelisted to play as a full diona.") + return null + + if(amount_grown < max_grown) + src << "You are not yet ready for your growth..." + return null + + src.split() + + if(istype(loc,/obj/item/weapon/holder/diona)) + var/obj/item/weapon/holder/diona/L = loc + src.loc = L.loc + qdel(L) + + src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") + return "Diona" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/say_understands.dm b/code/modules/mob/living/carbon/alien/diona/say_understands.dm new file mode 100644 index 00000000000..3f68a44cffb --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/say_understands.dm @@ -0,0 +1,6 @@ +/mob/living/carbon/alien/diona/say_understands(var/mob/other,var/datum/language/speaking = null) + + if (istype(other, /mob/living/carbon/human) && !speaking) + if(languages.len >= 2) // They have sucked down some blood. + return 1 + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/update_icons.dm b/code/modules/mob/living/carbon/alien/diona/update_icons.dm new file mode 100644 index 00000000000..b39972cdad3 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/diona/update_icons.dm @@ -0,0 +1,8 @@ +/mob/living/carbon/alien/diona/update_icons() + + if(stat == DEAD) + icon_state = "[initial(icon_state)]_dead" + else if(lying || resting || stunned) + icon_state = "[initial(icon_state)]_sleep" + else + icon_state = "[initial(icon_state)]" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index c054f766dac..6c01076a72f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -136,34 +136,6 @@ updatehealth() return -/mob/living/carbon/alien/humanoid/attack_paw(mob/living/carbon/monkey/M as mob) - if(!ismonkey(M)) return//Fix for aliens receiving double messages when attacking other aliens. - - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - ..() - - switch(M.a_intent) - - if ("help") - help_shake_act(M) - else - M.do_attack_animation(src) - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - return - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - if (health > -100) - adjustBruteLoss(rand(1, 3)) - updatehealth() - return - /mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 30ca1668054..a7207f22f9d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -155,34 +155,6 @@ updatehealth() -/mob/living/carbon/alien/larva/attack_paw(mob/living/carbon/monkey/M as mob) - if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens. - - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - ..() - - switch(M.a_intent) - - if ("help") - help_shake_act(M) - else - M.do_attack_animation(src) - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - return - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - if (health > -100) - adjustBruteLoss(rand(1, 3)) - updatehealth() - return - /mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 37381273369..9fd07805651 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -240,7 +240,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(M.stat == DEAD) return 0 - if(iscorgi(M) || ismonkey(M)) + if(iscorgi(M) || issmall(M)) return 1 var/mob/living/carbon/C = M diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8e7f0f71622..06186ea604a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -256,7 +256,7 @@ if(getBrainLoss() >= 60) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" - if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD) + if(species.show_ssd && (!species.has_organ["brain"] || brain_op_stage != 4) && stat != DEAD) if(!key) msg += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n" else if(!client) diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index 290c81723ee..a51a9cbd990 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -2,7 +2,7 @@ name = "fancy uniform" desc = "It looks like it was tailored for a monkey." icon_state = "punpun" - item_color = "punpun" + _color = "punpun" species_restricted = list("Monkey") /mob/living/carbon/human/monkey/punpun/New() diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 53d6689d36e..65d35e5c080 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -190,7 +190,7 @@ //These only pertain to common. Languages are handled by mob/say_understands() if (!speaking) - if (istype(other, /mob/living/carbon/monkey/diona)) + if (istype(other, /mob/living/carbon/alien/diona)) if(other.languages.len >= 2) //They've sucked down some blood and can speak common now. return 1 if (istype(other, /mob/living/silicon)) diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index bddfa770a14..409944cd048 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -5,7 +5,7 @@ language = "Wryn Hivemind" tail = "wryntail" unarmed_type = /datum/unarmed_attack/punch/weak - primitive = /mob/living/carbon/monkey/wryn + //primitive = /mob/living/carbon/monkey/wryn darksight = 3 slowdown = 1 warning_low_pressure = -300 diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 4f00eaea20a..97c57a1af47 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -1,6 +1,5 @@ /datum/species/monkey name = "Monkey" - name_plural = "Monkeys" blurb = "Ook." icobase = 'icons/mob/human_races/monkeys/r_monkey.dmi' @@ -12,22 +11,18 @@ default_language = "Chimpanzee" greater_form = "Human" is_small = 1 - has_fine_manipulation = 0 + //has_fine_manipulation = 0 show_ssd = 0 eyes = "blank_eyes" - gibbed_anim = "gibbed-m" - dusted_anim = "dust-m" - death_message = "lets out a faint chimper as it collapses and stops moving..." tail = "chimptail" - unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) - inherent_verbs = list(/mob/living/proc/ventcrawl) - hud_type = /datum/hud_data/monkey + //unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) + //inherent_verbs = list(/mob/living/proc/ventcrawl) + //hud_type = /datum/hud_data/monkey meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey - rarity_value = 0.1 - total_health = 75 + //total_health = 75 brute_mod = 1.5 burn_mod = 1.5 @@ -48,7 +43,6 @@ /datum/species/monkey/tajaran name = "Farwa" - name_plural = "Farwa" icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi' deform = 'icons/mob/human_races/monkeys/r_farwa.dmi' @@ -61,7 +55,6 @@ /datum/species/monkey/skrell name = "Neara" - name_plural = "Neara" icobase = 'icons/mob/human_races/monkeys/r_neara.dmi' deform = 'icons/mob/human_races/monkeys/r_neara.dmi' @@ -75,7 +68,6 @@ /datum/species/monkey/unathi name = "Stok" - name_plural = "Stok" icobase = 'icons/mob/human_races/monkeys/r_stok.dmi' deform = 'icons/mob/human_races/monkeys/r_stok.dmi' diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index c7cdb5b6cd9..2f50a1b21da 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -388,7 +388,7 @@ ) /datum/species/diona/can_understand(var/mob/other) - var/mob/living/carbon/monkey/diona/D = other + var/mob/living/carbon/alien/diona/D = other if(istype(D)) return 1 return 0 @@ -401,14 +401,14 @@ /* //overpowered and dumb as hell; they get cloning back, though. /datum/species/diona/handle_death(var/mob/living/carbon/human/H) - var/mob/living/carbon/monkey/diona/S = new(get_turf(H)) + var/mob/living/carbon/alien/diona/S = new(get_turf(H)) if(H.mind) H.mind.transfer_to(S) else S.key = H.key - for(var/mob/living/carbon/monkey/diona/D in H.contents) + for(var/mob/living/carbon/alien/diona/D in H.contents) if(D.client) D.loc = H.loc else diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cdc370a4d53..7361b4b5a75 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -185,14 +185,6 @@ Please contact me on #coderbus IRC. ~Carn x var/global/list/damage_icon_parts = list() -proc/get_damage_icon_part(damage_state, body_part) - if(damage_icon_parts["[damage_state]/[body_part]"] == null) - var/icon/DI = new /icon('icons/mob/dam_human.dmi', damage_state) // the damage icon for whole human - DI.Blend(new /icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY) // mask with this organ's pixels - damage_icon_parts["[damage_state]/[body_part]"] = DI - return DI - else - return damage_icon_parts["[damage_state]/[body_part]"] //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists @@ -213,7 +205,7 @@ proc/get_damage_icon_part(damage_state, body_part) previous_damage_appearance = damage_appearance - var/icon/standing = new /icon('icons/mob/dam_human.dmi', "00") + var/icon/standing = new /icon(species.damage_overlays, "00") var/image/standing_image = new /image("icon" = standing) @@ -224,9 +216,15 @@ proc/get_damage_icon_part(damage_state, body_part) if(!(O.status & ORGAN_DESTROYED)) O.update_icon() if(O.damage_state == "00") continue - - var/icon/DI = get_damage_icon_part(O.damage_state, O.icon_name) - + var/icon/DI + var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]" + if(damage_icon_parts[cache_index] == null) + DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human + DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI.Blend(species.blood_color, ICON_MULTIPLY) + damage_icon_parts[cache_index] = DI + else + DI = damage_icon_parts[cache_index] standing_image.overlays += DI overlays_standing[DAMAGE_LAYER] = standing_image @@ -525,7 +523,7 @@ proc/get_damage_icon_part(damage_state, body_part) standing.icon = w_uniform.sprite_sheets[species.name] if(w_uniform.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "uniformblood") bloodsies.color = w_uniform.blood_color standing.overlays += bloodsies @@ -580,14 +578,14 @@ proc/get_damage_icon_part(damage_state, body_part) standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]") if(gloves.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands") bloodsies.color = gloves.blood_color standing.overlays += bloodsies gloves.screen_loc = ui_gloves overlays_standing[GLOVES_LAYER] = standing else if(blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands") bloodsies.color = hand_blood_color overlays_standing[GLOVES_LAYER] = bloodsies else @@ -652,13 +650,13 @@ proc/get_damage_icon_part(damage_state, body_part) if(shoes.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood") bloodsies.color = shoes.blood_color standing.overlays += bloodsies overlays_standing[SHOES_LAYER] = standing else if(feet_blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood") bloodsies.color = feet_blood_color overlays_standing[SHOES_LAYER] = bloodsies else @@ -695,7 +693,7 @@ proc/get_damage_icon_part(damage_state, body_part) standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]") if(head.blood_DNA) - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "helmetblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood") bloodsies.color = head.blood_color standing.overlays += bloodsies overlays_standing[HEAD_LAYER] = standing @@ -751,7 +749,7 @@ proc/get_damage_icon_part(damage_state, body_part) if(wear_suit.blood_DNA) var/obj/item/clothing/suit/S = wear_suit - var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[S.blood_overlay_type]blood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood") bloodsies.color = wear_suit.blood_color standing.overlays += bloodsies @@ -791,7 +789,9 @@ proc/get_damage_icon_part(damage_state, body_part) standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]") if( !istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA ) - standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood") + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood") + bloodsies.color = wear_mask.blood_color + standing.overlays += bloodsies overlays_standing[FACEMASK_LAYER] = standing else overlays_standing[FACEMASK_LAYER] = null diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index a839b8a85b2..d2cfeeb9037 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -379,7 +379,7 @@ Target = C break - if(islarva(C) || ismonkey(C)) + if(islarva(C) || issmall(C)) Target = C break diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index c2c7f678a72..cc412c799f3 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -291,37 +291,6 @@ adjustBruteLoss(damage) updatehealth() -/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob) - if(!(istype(M, /mob/living/carbon/monkey))) - return // Fix for aliens receiving double messages when attacking other aliens. - - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - ..() - - switch(M.a_intent) - - if ("help") - help_shake_act(M) - else - if (istype(wear_mask, /obj/item/clothing/mask/muzzle)) - return - if (health > 0) - M.do_attack_animation(src) - attacked += 10 - //playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] has attacked [src]!", \ - "[M.name] has attacked [src]!") - adjustBruteLoss(rand(1, 3)) - updatehealth() - return - /mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob) switch(L.a_intent) diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm deleted file mode 100644 index 0c3ef632cca..00000000000 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ /dev/null @@ -1,56 +0,0 @@ -/mob/living/carbon/monkey/gib() - death(1) - var/atom/movable/overlay/animation = null - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("gibbed-m", animation) - gibs(loc, viruses, dna) - - spawn(15) - if(animation) del(animation) - if(src) del(src) - -/mob/living/carbon/monkey/dust() - death(1) - var/atom/movable/overlay/animation = null - notransform = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("dust-m", animation) - new /obj/effect/decal/cleanable/ash(loc) - - spawn(15) - if(animation) del(animation) - if(src) del(src) - - -/mob/living/carbon/monkey/death(gibbed) - if(stat == DEAD) return - if(healths) healths.icon_state = "health5" - stat = DEAD - - if(!gibbed) - for(var/mob/O in viewers(src, null)) - O.show_message("The [name] lets out a faint chimper as it collapses and stops moving...", 1) //ded -- Urist - - update_canmove() - if(blind) blind.layer = 0 - - ticker.mode.check_win() - - return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm deleted file mode 100644 index c7973bc4eb8..00000000000 --- a/code/modules/mob/living/carbon/monkey/emote.dm +++ /dev/null @@ -1,157 +0,0 @@ -/mob/living/carbon/monkey/emote(var/act,var/m_type=1,var/message = null) - - var/param = null - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - var/muzzled = is_muzzled() - - //Emote Cooldown System (it's so simple!) - // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] - var/on_CD = 0 - switch(act) - //Cooldown-inducing emotes - if("chirp") - if(istype(src,/mob/living/carbon/monkey/diona)) //Only Diona Nymphs can chirp - on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - else //Everyone else fails, skip the emote attempt - return - //Everything else, including typos of the above emotes - else - on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown - - if(on_CD == 1) // Check if we need to suppress the emote attempt. - return // Suppress emote, you're still cooling off. - //--FalseIncarnate - - switch(act) - if ("me") - if(silent) - return - if (src.client) - if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - if (stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - - - if ("custom") - return custom_emote(m_type, message) - - if ("chirp") - message = "The [src.name] chirps!" - playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0) - m_type = 2 - if("sign") - if (!src.restrained()) - message = text("The monkey signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) - m_type = 1 - if("scratch") - if (!src.restrained()) - message = "The [src.name] scratches." - m_type = 1 - if("whimper") - if (!muzzled) - message = "The [src.name] whimpers." - m_type = 2 - if("roar") - if (!muzzled) - message = "The [src.name] roars." - m_type = 2 - if("tail") - message = "The [src.name] waves his tail." - m_type = 1 - if("gasp") - message = "The [src.name] gasps." - m_type = 2 - if("shiver") - message = "The [src.name] shivers." - m_type = 2 - if("drool") - message = "The [src.name] drools." - m_type = 1 - if("paw") - if (!src.restrained()) - message = "The [src.name] flails his paw." - m_type = 1 - if("scretch") - if (!muzzled) - message = "The [src.name] scretches." - m_type = 2 - if("choke") - message = "The [src.name] chokes." - m_type = 2 - if("moan") - message = "The [src.name] moans!" - m_type = 2 - if("nod") - message = "The [src.name] nods his head." - m_type = 1 - if("sit") - message = "The [src.name] sits down." - m_type = 1 - if("sway") - message = "The [src.name] sways around dizzily." - m_type = 1 - if("sulk") - message = "The [src.name] sulks down sadly." - m_type = 1 - if("twitch") - message = "The [src.name] twitches violently." - m_type = 1 - if("dance") - if (!src.restrained()) - message = "The [src.name] dances around happily." - m_type = 1 - if("roll") - if (!src.restrained()) - message = "The [src.name] rolls." - m_type = 1 - if("shake") - message = "The [src.name] shakes his head." - m_type = 1 - if("gnarl") - if (!muzzled) - message = "The [src.name] gnarls and shows his teeth.." - m_type = 2 - if("jump") - message = "The [src.name] jumps!" - m_type = 1 - if("collapse") - Paralyse(2) - message = text("[] collapses!", src) - m_type = 2 - if("deathgasp") - message = "The [src.name] lets out a faint chimper as it collapses and stops moving..." - m_type = 1 - if("help") - var/text = "choke, " - if(istype(src,/mob/living/carbon/monkey/diona)) - text += "chirp, " - text += "collapse, dance, deathgasp, drool, gasp, shiver, gnarl, jump, paw, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper" - src << text - else - src << text("Invalid Emote: []", act) - if ((message && src.stat == 0)) - if(src.client) - log_emote("[name]/[key] : [message]") - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - //Foreach goto(703) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) - //Foreach goto(746) - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/monkey/examine.dm deleted file mode 100644 index 9c9d0ef5082..00000000000 --- a/code/modules/mob/living/carbon/monkey/examine.dm +++ /dev/null @@ -1,63 +0,0 @@ -/mob/living/carbon/monkey/examine() - set src in oview() - - if(!usr || !src) return - if( (usr.sdisabilities & BLIND || usr.blinded || usr.stat) && !istype(usr,/mob/dead/observer) ) - usr << "Something is there but you can't see it." - return - - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" - - if (src.handcuffed) - msg += "It is \icon[src.handcuffed] handcuffed!\n" - if (src.wear_mask) - msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its head.\n" - if (src.l_hand) - msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n" - if (src.r_hand) - msg += "It has \icon[src.r_hand] \a [src.r_hand] in its right hand.\n" - if (src.back) - msg += "It has \icon[src.back] \a [src.back] on its back.\n" - if (src.stat == DEAD) - msg += "It is limp and unresponsive, with no signs of life.\n" - else - msg += "" - if (src.getBruteLoss()) - if (src.getBruteLoss() < 30) - msg += "It has minor bruising.\n" - else - msg += "It has severe bruising!\n" - if (src.getFireLoss()) - if (src.getFireLoss() < 30) - msg += "It has minor burns.\n" - else - msg += "It has severe burns!\n" - if (src.fire_stacks > 0) - msg += "It's covered in something flammable.\n" - if (src.fire_stacks < 0) - msg += "It's soaked in water.\n" - if (src.stat == UNCONSCIOUS) - msg += "It isn't responding to anything around it; it seems to be asleep.\n" - msg += "" - - msg += "" - switch(wetlevel) - if(1) - msg += "It looks a bit damp.\n" - if(2) - msg += "It looks a little bit wet.\n" - if(3) - msg += "It looks wet.\n" - if(4) - msg += "It looks very wet.\n" - if(5) - msg += "It looks absolutely soaked.\n" - msg += "" - - if (src.digitalcamo) - msg += "It is repulsively uncanny!\n" - - msg += "*---------*" - - usr << msg - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/hud.dm b/code/modules/mob/living/carbon/monkey/hud.dm deleted file mode 100644 index 35f86d2e6b7..00000000000 --- a/code/modules/mob/living/carbon/monkey/hud.dm +++ /dev/null @@ -1,249 +0,0 @@ -/datum/hud/proc/monkey_hud(var/ui_style='icons/mob/screen1_old.dmi') - - src.adding = list() - src.other = list() - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.dir = SOUTHWEST - using.icon = ui_style - using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent) - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//intent small hud objects - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = "help" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = "disarm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = "grab" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = "harm" - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - hurt_intent = using - -//end intent small hud objects - - using = new /obj/screen() - using.name = "mov_intent" - using.dir = SOUTHWEST - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.dir = WEST - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.layer = 19 - src.r_hand_hud_object = inv_box - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.dir = EAST - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.layer = 19 - src.l_hand_hud_object = inv_box - src.adding += inv_box - - using = new /obj/screen() - using.name = "hand" - using.dir = SOUTH - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - src.adding += using - - using = new /obj/screen() - using.name = "hand" - using.dir = SOUTH - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.dir = NORTH - inv_box.icon = ui_style - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_monkey_mask - inv_box.slot_id = slot_wear_mask - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.dir = NORTHEAST - inv_box.icon = ui_style - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_back - inv_box.slot_id = slot_back - inv_box.layer = 19 - src.adding += inv_box - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw" - mymob.throw_icon.screen_loc = ui_drop_throw - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen() - mymob.internals.icon = ui_style - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = ui_style - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.layer = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = ui_style - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.dir = 2 - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.target) - mymob.item_use_icon = new /obj/screen/gun/item(null) - if (mymob.client.target_can_click) - mymob.item_use_icon.dir = 1 - src.adding += mymob.item_use_icon - mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.dir = 1 - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.dir = 1 - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += src.adding + src.other - - return - diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm deleted file mode 100644 index 8ccadd0349c..00000000000 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ /dev/null @@ -1,243 +0,0 @@ -/obj/effect/equip_e/monkey/process() - if (item) - item.add_fingerprint(source) - if (!( item )) - switch(place) - if("head") - if (!( target.wear_mask )) - del(src) - return - if("l_hand") - if (!( target.l_hand )) - del(src) - return - if("r_hand") - if (!( target.r_hand )) - del(src) - return - if("back") - if (!( target.back )) - del(src) - return - if("handcuff") - if (!( target.handcuffed )) - del(src) - return - if("internal") - if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && istype(target.back, /obj/item/weapon/tank) && !( target.internal )) ) && !( target.internal ))) - del(src) - return - - if (item) - if(isrobot(source) && place != "handcuff") - var/list/L = list( "syringe", "pill", "drink", "dnainjector", "fuel") - if(!(L.Find(place))) - del(src) - return - for(var/mob/O in viewers(target, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] is trying to put a [] on []", source, item, target), 1) - else - var/message = null - switch(place) - if("mask") - if(istype(target.wear_mask, /obj/item/clothing)&&(target.wear_mask:flags & NODROP)) - message = text("\red [] fails to take off \a [] from []'s body!", source, target.wear_mask, target) - else - message = text("\red [] is trying to take off \a [] from []'s head!", source, target.wear_mask, target) - if("l_hand") - message = text("\red [] is trying to take off a [] from []'s left hand!", source, target.l_hand, target) - if("r_hand") - message = text("\red [] is trying to take off a [] from []'s right hand!", source, target.r_hand, target) - if("back") - message = text("\red [] is trying to take off a [] from []'s back!", source, target.back, target) - if("handcuff") - message = text("\red [] is trying to unhandcuff []!", source, target) - if("internal") - if (target.internal) - message = text("\red [] is trying to remove []'s internals", source, target) - else - message = text("\red [] is trying to set on []'s internals.", source, target) - else - for(var/mob/M in viewers(target, null)) - M.show_message(message, 1) - spawn( 30 ) - done() - return - return - -/obj/effect/equip_e/monkey/done() - if(!source || !target) return - if(source.loc != s_loc) return - if(target.loc != t_loc) return - if(LinkBlocked(s_loc,t_loc)) return - if(item && source.get_active_hand() != item) return - if ((source.restrained() || source.stat)) return - switch(place) - if("mask") - if (target.wear_mask) - if(istype(target.wear_mask, /obj/item/clothing)&& (target.wear_mask:flags & NODROP)) - return - var/obj/item/W = target.wear_mask - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.dropped(target) - W.layer = initial(W.layer) - W.add_fingerprint(source) - else - if (istype(item, /obj/item/clothing/mask)) - source.drop_item() - loc = target - item.layer = 20 - target.wear_mask = item - item.loc = target - if("l_hand") - if (target.l_hand) - var/obj/item/W = target.l_hand - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.layer = initial(W.layer) - W.dropped(target) - W.add_fingerprint(source) - else - if (istype(item, /obj/item)) - source.drop_item() - loc = target - item.layer = 20 - target.l_hand = item - item.loc = target - item.dropped(source) - item.equipped(target,target.l_hand) - if("r_hand") - if (target.r_hand) - var/obj/item/W = target.r_hand - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.layer = initial(W.layer) - W.dropped(target) - W.add_fingerprint(source) - else - if (istype(item, /obj/item)) - source.drop_item() - loc = target - item.layer = 20 - target.r_hand = item - item.loc = target - item.dropped(source) - item.equipped(target,target.r_hand) - if("back") - if (target.back) - var/obj/item/W = target.back - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.dropped(target) - W.layer = initial(W.layer) - W.add_fingerprint(source) - else - if ((istype(item, /obj/item) && item.slot_flags & SLOT_BACK )) - source.drop_item() - loc = target - item.layer = 20 - target.back = item - item.loc = target - if("handcuff") - if (target.handcuffed) - var/obj/item/W = target.handcuffed - target.unEquip(W) - if (target.client) - target.client.screen -= W - if (W) - W.loc = target.loc - W.dropped(target) - W.layer = initial(W.layer) - W.add_fingerprint(source) - else - if (istype(item, /obj/item/weapon/restraints/handcuffs)) - source.drop_item() - target.handcuffed = item - item.loc = target - if("internal") - if (target.internal) - target.internal.add_fingerprint(source) - target.internal = null - else - if (target.internal) - target.internal = null - if (!( istype(target.wear_mask, /obj/item/clothing/mask) )) - return - else - if (istype(target.back, /obj/item/weapon/tank)) - target.internal = target.back - target.internal.add_fingerprint(source) - for(var/mob/M in viewers(target, 1)) - if ((M.client && !( M.blinded ))) - M.show_message(text("[] is now running on internals.", target), 1) - else - source.regenerate_icons() - target.regenerate_icons() - del(src) - return - - - -//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() -//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc. -/mob/living/carbon/monkey/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1) - if(!slot) return - if(!istype(W)) return - - if(W == get_active_hand()) - unEquip(W) - - switch(slot) - if(slot_back) - src.back = W - W.equipped(src, slot) - update_inv_back(redraw_mob) - if(slot_wear_mask) - src.wear_mask = W - W.equipped(src, slot) - update_inv_wear_mask(redraw_mob) - if(slot_handcuffed) - src.handcuffed = W - update_inv_handcuffed(redraw_mob) - if(slot_legcuffed) - src.legcuffed = W - W.equipped(src, slot) - update_inv_legcuffed(redraw_mob) - if(slot_l_hand) - src.l_hand = W - W.equipped(src, slot) - update_inv_l_hand(redraw_mob) - if(slot_r_hand) - src.r_hand = W - W.equipped(src, slot) - update_inv_r_hand(redraw_mob) - if(slot_in_backpack) - W.loc = src.back - else - usr << "\red You are trying to eqip this item to an unsupported inventory slot. How the heck did you manage that? Stop it..." - return - - W.layer = 20 - - return - -/mob/living/carbon/monkey/put_in_hands(obj/item/W) - if(!W) return 0 - if(put_in_active_hand(W)) return 1 - else if(put_in_inactive_hand(W)) return 1 - else - ..() diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm deleted file mode 100644 index ec2c33983af..00000000000 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ /dev/null @@ -1,675 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/mob/living/carbon/monkey - var/oxygen_alert = 0 - var/toxins_alert = 0 - var/fire_alert = 0 - var/pressure_alert = 0 - - var/temperature_alert = 0 - - -/mob/living/carbon/monkey/Life() - set invisibility = 0 - //set background = 1 - if (notransform) return - if (update_muts) - update_muts=0 - domutcheck(src,null,MUTCHK_FORCED) - ..() - - var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE - if(loc) - environment = loc.return_air() - - if (stat != DEAD) - if(!istype(src,/mob/living/carbon/monkey/diona)) //still breathing - //First, resolve location and get a breath - if(mob_master.current_cycle%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - breathe() - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - - //Updates the number of stored chemicals for powers - handle_changeling() - - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - //Disabilities - handle_disabilities() - - //Virus updates, duh - handle_virus_updates() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null - - //Handle temperature/pressure differences between body and environment - if(environment) // More error checking -- TLE - handle_environment(environment) - - //Check if we're on fire - handle_fire() - - //Decrease wetness over time - handle_wetness() - - //Status updates, death etc. - handle_regular_status_updates() - - handle_actions() - - update_canmove() - - if(client) - handle_regular_hud_updates() - - // Grabbing - for(var/obj/item/weapon/grab/G in src) - G.process() - - if(!client && stat == CONSCIOUS) - if(prob(33) && canmove && isturf(loc) && !pulledby) //won't move if being pulled - step(src, pick(cardinal)) - if(prob(1)) - emote(pick("scratch","jump","roll","tail")) - updatehealth() - - -/mob/living/carbon/monkey/calculate_affecting_pressure(var/pressure) - ..() - return pressure - -/mob/living/carbon/monkey - - proc/handle_disabilities() - - if (disabilities & EPILEPSY) - if ((prob(1) && paralysis < 10)) - src << "\red You have a seizure!" - Paralyse(10) - if (disabilities & COUGHING) - if ((prob(5) && paralysis <= 1)) - drop_item() - spawn( 0 ) - emote("cough") - return - if (disabilities & TOURETTES) - if ((prob(10) && paralysis <= 1)) - Stun(10) - spawn( 0 ) - emote("twitch") - return - if (disabilities & NERVOUS) - if (prob(10)) - stuttering = max(10, stuttering) - - proc/handle_mutations_and_radiation() - - if(getFireLoss()) - if((RESIST_HEAT in mutations) || prob(50)) - switch(getFireLoss()) - if(1 to 50) - adjustFireLoss(-1) - if(51 to 100) - adjustFireLoss(-5) - - if ((HULK in mutations) && health <= 25) - mutations.Remove(HULK) - dna.SetSEState(HULKBLOCK,0) - update_mutations() //update our mutation overlays - status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved. - src << "You suddenly feel very weak." - Weaken(3) - emote("collapse") - - if (radiation) - - if(istype(src,/mob/living/carbon/monkey/diona)) //Filthy check. Dionaea don't take rad damage. - var/rads = radiation/25 - radiation -= rads - nutrition += rads - heal_overall_damage(rads,rads) - adjustOxyLoss(-(rads)) - adjustToxLoss(-(rads)) - return - - if (radiation > 100) - radiation = 100 - Weaken(10) - if(!lying) - src << "\red You feel weak." - emote("collapse") - - switch(radiation) - if(1 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - - if(50 to 74) - radiation -= 2 - adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - Weaken(3) - if(!lying) - src << "\red You feel weak." - emote("collapse") - - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - if(prob(1)) - src << "\red You mutate!" - randmutb(src) - domutcheck(src,null) - emote("gasp") - - // Separate proc so we can jump out of it when we've succeeded in spreading disease. - proc/findAirborneVirii() - for(var/obj/effect/decal/cleanable/blood/B in get_turf(src)) - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - for(var/obj/effect/decal/cleanable/mucus/M in get_turf(src)) - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - for(var/obj/effect/decal/cleanable/poop/P in get_turf(src)) - if(P.virus2.len) - for (var/ID in P.virus2) - var/datum/disease2/disease/V = P.virus2[ID] - if (infect_virus2(src,V)) - return 1 - - return 0 - - proc/handle_virus_updates() - if(status_flags & GODMODE) return 0 //godmode - if(bodytemperature > 406) - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - V.cure(src) - - src.findAirborneVirii() - - for (var/ID in virus2) - var/datum/disease2/disease/V = virus2[ID] - if(isnull(V)) // Trying to figure out a runtime error that keeps repeating - CRASH("virus2 nulled before calling activate()") - else - V.activate(src) - // activate may have deleted the virus - if(!V) continue - - // check if we're immune - if(V.antigen & src.antibodies) - V.dead = 1 - return - - proc/breathe() - if(reagents) - - if(reagents.has_reagent("lexorin")) return - - if(!loc) return //probably ought to make a proper fix for this, but :effort: --NeoFite - - var/datum/gas_mixture/environment = loc.return_air() - var/datum/gas_mixture/breath - if(health < 0) - losebreath++ - if(losebreath>0) //Suffocating so do not take a breath - losebreath-- - if (prob(75)) //High chance of gasping for air - spawn emote("gasp") - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - else - //First, check for air from internal atmosphere (using an air tank and mask generally) - breath = get_breath_from_internal(BREATH_VOLUME) - - //No breath from internal atmosphere so get breath from location - if(!breath) - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME) - else if(istype(loc, /turf/)) - var/breath_moles = environment.total_moles()*BREATH_PERCENTAGE - breath = loc.remove_air(breath_moles) - - - - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - handle_breath(breath) - - if(breath) - loc.assume_air(breath) - - proc/handle_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - adjustOxyLoss(7) - - oxygen_alert = max(oxygen_alert, 1) - - return 0 - - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_max = 0.5 - var/safe_toxins_mask = 5 - var/SA_para_min = 0.5 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - // Same, but for the toxins - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) - var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure - - if(O2_pp < safe_oxygen_min) // Too little oxygen - if(prob(20)) - spawn(0) emote("gasp") - if (O2_pp == 0) - O2_pp = 0.01 - var/ratio = safe_oxygen_min/O2_pp - adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!) - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1) - /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) - spawn(0) emote("cough") - var/ratio = O2_pp/safe_oxygen_max - oxyloss += 5*ratio - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1)*/ - else // We're in safe limits - adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - oxygen_alert = 0 - - breath.oxygen -= oxygen_used - breath.carbon_dioxide += oxygen_used - - if(CO2_pp > safe_co2_max) - if(!co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - co2overloadtime = world.time - else if(world.time - co2overloadtime > 120) - Paralyse(3) - adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business - if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - adjustOxyLoss(8) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) emote("cough") - - else - co2overloadtime = 0 - - if(Toxins_pp > safe_toxins_max) // Too much toxins - var/ratio = (breath.toxins/safe_toxins_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(wear_mask) - if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) - if(breath.toxins > safe_toxins_mask) - ratio = (breath.toxins/safe_toxins_mask) * 10 - else - ratio = 0 - if(ratio) - if(reagents) - reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - toxins_alert = max(toxins_alert, 1) - else - toxins_alert = 0 - - if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. - for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit - Paralyse(3) // 3 gives them one second to wake up and run away a bit! - if(SA_pp > SA_sleep_min) // Enough to make us sleep as well - sleeping = max(sleeping+2, 10) - else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning - if(prob(20)) - spawn(0) emote(pick("giggle", "laugh")) - - - if(breath.temperature > (T0C+66)) // Hot air hurts :( - if(prob(20)) - src << "\red You feel a searing heat in your lungs!" - fire_alert = max(fire_alert, 2) - else - fire_alert = 0 - - - //Temporary fixes to the alerts. - - return 1 - - proc/handle_environment(datum/gas_mixture/environment) - if(!environment) - return - - //Moved these vars here for use in the fuck-it-skip-processing check. - var/pressure = environment.return_pressure() - var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob. - - if(adjusted_pressure < WARNING_HIGH_PRESSURE && adjusted_pressure > WARNING_LOW_PRESSURE && abs(environment.temperature - 293.15) < 20 && abs(bodytemperature - 310.14) < 0.5 && environment.toxins < MOLES_PLASMA_VISIBLE) - - //Hopefully should fix the walk-inside-still-pressure-warning issue. - if(pressure_alert) - pressure_alert = 0 - - return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp - - var/environment_heat_capacity = environment.heat_capacity() - if(istype(get_turf(src), /turf/space)) - var/turf/heat_turf = get_turf(src) - environment_heat_capacity = heat_turf.heat_capacity - - if(!on_fire) - if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) - var/transfer_coefficient = 1 - - handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) - - if(stat==2) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) - - //Account for massive pressure differences - switch(adjusted_pressure) - if(HAZARD_HIGH_PRESSURE to INFINITY) - adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) - pressure_alert = 2 - if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - pressure_alert = 1 - if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) - pressure_alert = 0 - if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - pressure_alert = -1 - else - if( !(RESIST_COLD in mutations) ) - adjustBruteLoss( LOW_PRESSURE_DAMAGE ) - pressure_alert = -2 - else - pressure_alert = -1 - - return - - proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(status_flags & GODMODE) return - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - - if(exposed_temperature > bodytemperature) - adjustFireLoss(20.0*discomfort) - - else - adjustFireLoss(5.0*discomfort) - - proc/handle_chemicals_in_body() - - if(istype(src,/mob/living/carbon/monkey/diona)) //Filthy check. Dionaea nymphs need light or they get sad. - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(loc)) //else, there's considered to be no light - var/turf/T = loc - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - if(L) - light_amount = (L.get_clamped_lum()*10) - 5 //hardcapped so it's not abused by having a ton of flashlights - else - light_amount = 5 - - nutrition += light_amount - traumatic_shock -= light_amount - - if(nutrition > 500) - nutrition = 500 - if(light_amount > 2) //if there's enough light, heal - adjustBruteLoss(-1) - adjustToxLoss(-1) - adjustOxyLoss(-1) - - if(reagents && reagents.reagent_list.len) - reagents.metabolize(src,alien) - - if (drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) - - if(confused) - confused = max(0, confused - 1) - - if(resting) - dizziness = max(0, dizziness - 5) - else - dizziness = max(0, dizziness - 1) - - return //TODO: DEFERRED - - proc/handle_regular_status_updates() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - blinded = 1 - silent = 0 - else //ALIVE. LIGHTS ARE ON - updatehealth() - if(health < config.health_threshold_dead || brain_op_stage == 4.0) - death() - blinded = 1 - stat = DEAD - silent = 0 - return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("epinephrine")) - adjustOxyLoss(1) - Paralyse(3) - if(halloss > 100) - src << "You're in too much pain to keep going..." - for(var/mob/O in oviewers(src, null)) - O.show_message("[src] slumps to the ground, too weak to continue fighting.", 1) - Paralyse(10) - setHalLoss(99) - - if(paralysis) - AdjustParalysis(-1) - blinded = 1 - stat = UNCONSCIOUS - if(halloss > 0) - adjustHalLoss(-3) - else if(sleeping) - handle_dreams() - adjustHalLoss(-3) - sleeping = max(sleeping-1, 0) - blinded = 1 - stat = UNCONSCIOUS - if( prob(10) && health && !hal_crit ) - spawn(0) - emote("snore") - else if(resting) - if(halloss > 0) - adjustHalLoss(-3) - //CONSCIOUS - else - stat = CONSCIOUS - if(halloss > 0) - adjustHalLoss(-1) - - //Eyes - if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own - blinded = 1 - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - blinded = 1 - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) - - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) - - //Other - handle_statuses() - - CheckStamina() - - return 1 - - - proc/handle_regular_hud_updates() - - if (stat == 2 || (XRAY in mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight &= ~SEE_TURFS - sight &= ~SEE_MOBS - sight &= ~SEE_OBJS - see_in_dark = 2 - see_invisible = SEE_INVISIBLE_LIVING - - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" - - - if(pressure) - pressure.icon_state = "pressure[pressure_alert]" - - if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]" - - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 2 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - if(bodytemp) - switch(bodytemperature) //310.055 optimal body temp - if(345 to INFINITY) - bodytemp.icon_state = "temp4" - if(335 to 345) - bodytemp.icon_state = "temp3" - if(327 to 335) - bodytemp.icon_state = "temp2" - if(316 to 327) - bodytemp.icon_state = "temp1" - if(300 to 316) - bodytemp.icon_state = "temp0" - if(295 to 300) - bodytemp.icon_state = "temp-1" - if(280 to 295) - bodytemp.icon_state = "temp-2" - if(260 to 280) - bodytemp.icon_state = "temp-3" - else - bodytemp.icon_state = "temp-4" - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if(blind && stat != DEAD) - if(blinded) - blind.layer = 18 - else - blind.layer = 0 - - if(disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if(eye_blurry) - client.screen += global_hud.blurry - - if(druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(client && !client.adminobs) - reset_view(null) - - return 1 - - proc/handle_random_events() - if (prob(1) && prob(2)) - spawn(0) - emote("scratch") - return - - - proc/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() - - ///FIRE CODE - handle_fire() - if(..()) - return - adjustFireLoss(6) - return - //END FIRE CODE - - proc/handle_wetness() - if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so - wetlevel = max(wetlevel - 1,0) - return diff --git a/code/modules/mob/living/carbon/monkey/login.dm b/code/modules/mob/living/carbon/monkey/login.dm deleted file mode 100644 index 3b7e5dcb971..00000000000 --- a/code/modules/mob/living/carbon/monkey/login.dm +++ /dev/null @@ -1,4 +0,0 @@ -/mob/living/carbon/monkey/Login() - ..() - update_hud() - return diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm deleted file mode 100644 index 34a1bc589e1..00000000000 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ /dev/null @@ -1,553 +0,0 @@ -/mob/living/carbon/monkey - name = "monkey" - voice_name = "monkey" - speak_emote = list("chimpers") - icon_state = "monkey1" - icon = 'icons/mob/monkey.dmi' - gender = NEUTER - pass_flags = PASSTABLE - update_icon = 0 ///no need to call regenerate_icon - - var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie - var/greaterform = "Human" // Used when humanizing a monkey. - icon_state = "monkey1" - //var/uni_append = "12C4E2" // Small appearance modifier for different species. - var/list/uni_append = list(0x12C,0x4E2) // Same as above for DNA2. - var/update_muts = 1 // Monkey gene must be set at start. - var/alien = 0 //Used for reagent metabolism. - ventcrawler = 2 - -/mob/living/carbon/monkey/tajara - name = "farwa" - voice_name = "farwa" - speak_emote = list("mews") - icon_state = "tajkey1" - uni_append = list(0x0A0,0xE00) // 0A0E00 - -/mob/living/carbon/monkey/vulpkanin - name = "wolpin" - voice_name = "wolpin" - speak_emote = list("yaps") - icon_state = "wolfling" - uni_append = list(0x066,0x4FE) - -/mob/living/carbon/monkey/skrell - name = "neaera" - voice_name = "neaera" - speak_emote = list("squicks") - icon_state = "skrellkey1" - uni_append = list(0x01C,0xC92) // 01CC92 - -/mob/living/carbon/monkey/unathi - name = "stok" - voice_name = "stok" - speak_emote = list("hisses") - icon_state = "stokkey1" - uni_append = list(0x044,0xC5D) // 044C5D - -/mob/living/carbon/monkey/wryn - name = "lajavi" - voice_name = "lajavi" - speak_emote = list("hisses") - icon_state = "wrynkey1" - uni_append = list(0x022,0xF5D) // 022F5D - -/mob/living/carbon/monkey/New() - var/datum/reagents/R = new/datum/reagents(330) - reagents = R - R.my_atom = src - - if(name == initial(name)) //To stop Pun-Pun becoming generic. - name = "[name] ([rand(1, 1000)])" - real_name = name - - if (!(dna)) - if(gender == NEUTER) - gender = pick(MALE, FEMALE) - dna = new /datum/dna( null ) - dna.real_name = real_name - dna.ResetSE() - dna.ResetUI() - //dna.uni_identity = "00600200A00E0110148FC01300B009" - //dna.SetUI(list(0x006,0x002,0x00A,0x00E,0x011,0x014,0x8FC,0x013,0x00B,0x009)) - //dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" - //dna.SetSE(list(0x433,0x591,0x567,0x561,0x31E,0x137,0x633,0x34D,0x1C3,0x690,0x120,0x321,0x64D,0x4FE,0x4CD,0x615,0x44B,0x6C0,0x3F2,0x51B,0x6C6,0x0A4,0x282,0x1D2,0x6BA,0x3B0,0xFD6)) - dna.unique_enzymes = md5(name) - - // We're a monkey - dna.SetSEState(MONKEYBLOCK, 1) - dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) - // Fix gender - dna.SetUIState(DNA_UI_GENDER, gender != MALE, 1) - - // Set the blocks to uni_append, if needed. - if(uni_append.len>0) - for(var/b=1;b<=uni_append.len;b++) - dna.SetUIValue(DNA_UI_LENGTH-(uni_append.len-b),uni_append[b], 1) - dna.UpdateUI() - - update_muts=1 - - ..() - update_icons() - return - -/mob/living/carbon/monkey/unathi/New() - - ..() - greaterform = "Unathi" - dna.species = "Unathi" - add_language("Sinta'unathi") - -/mob/living/carbon/monkey/skrell/New() - - ..() - greaterform = "Skrell" - dna.species = "Skrell" - add_language("Skrellian") - -/mob/living/carbon/monkey/tajara/New() - - ..() - greaterform = "Tajaran" - dna.species = "Tajaran" - add_language("Siik'tajr") - -/mob/living/carbon/monkey/vulpkanin/New() - - ..() - greaterform = "Vulpkanin" - dna.species = "Vulpkanin" - add_language("Canilunzt") - -/mob/living/carbon/monkey/diona/New() - - ..() - alien = 1 - gender = NEUTER - greaterform = "Diona" - dna.species = "Diona" - add_language("Rootspeak") - -/mob/living/carbon/monkey/movement_delay() - var/tally = 0 - if(status_flags & GOTTAGOFAST) - tally -= 1 - - var/health_deficiency = (100 - health) - if(health_deficiency >= 45) tally += (health_deficiency / 25) - - if (bodytemperature < 283.222) - tally += (283.222 - bodytemperature) / 10 * 1.75 - return tally+config.monkey_delay - -/mob/living/carbon/monkey/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(70)) - usr << "\red You fail to push [tmob]'s fat ass out of the way." - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if (!( istype(AM, /atom/movable) )) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return - -/mob/living/carbon/monkey/Topic(href, href_list) - ..() - if (href_list["mach_close"]) - var/t1 = text("window=[]", href_list["mach_close"]) - unset_machine() - src << browse(null, t1) - if ((href_list["item"] && !( usr.stat ) && !( usr.restrained() ) && in_range(src, usr) )) - var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( ) - O.source = usr - O.target = src - O.item = usr.get_active_hand() - O.s_loc = usr.loc - O.t_loc = loc - O.place = href_list["item"] - requests += O - spawn( 0 ) - O.process() - return - ..() - return - -/mob/living/carbon/monkey/meteorhit(obj/O as obj) - for(var/mob/M in viewers(src, null)) - M.show_message(text("\red [] has been hit by []", src, O), 1) - if (health > 0) - var/shielded = 0 - adjustBruteLoss(30) - if ((O.icon_state == "flaming" && !( shielded ))) - adjustFireLoss(40) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - return - -/mob/living/carbon/monkey/attack_paw(mob/living/M as mob) - ..() - - if (M.a_intent == "help") - help_shake_act(M) - else - if (M.a_intent == "harm" && !(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))) - M.do_attack_animation(src) - if (prob(75)) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [name]!", \ - "[M.name] bites [name]!") - var/damage = rand(1, 5) - if (health > -100) - adjustBruteLoss(damage) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - else - visible_message("[M.name] has attempted to bite [name]!", \ - "[M.name] has attempted to bite [name]!") - return - -/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L as mob) - - switch(L.a_intent) - if("help") - visible_message("[L] rubs its head against [src].") - - - else - L.do_attack_animation(src) - var/damage = rand(1, 3) - visible_message("[L] bites [src]!", \ - "[L] bites [src]!") - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - adjustBruteLoss(damage) - -/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - if(..()) //To allow surgery to return properly. - return - - if (M.a_intent == "help") - help_shake_act(M) - - else - if (M.a_intent == "harm") - M.do_attack_animation(src) - if (prob(75)) - visible_message("[M] has punched [name]!", \ - "[M] has punched [name]!") - - playsound(loc, "punch", 25, 1, -1) - var/damage = rand(5, 10) - if (prob(40)) - damage = rand(10, 15) - if ( (paralysis < 5) && (health > 0) ) - Paralyse(rand(10, 15)) - spawn( 0 ) - visible_message("[M] has knocked out [name]!", \ - "[M] has knocked out [name]!") - return - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to punch [name]!", \ - "[M] has attempted to punch [name]!") - else - if (M.a_intent == "grab") - if (M == src || anchored) - return - - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src ) - - M.put_in_active_hand(G) - - G.synch() - - LAssailant = M - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has grabbed [name] passively!") - else - if (!( paralysis )) - if (prob(25)) - Paralyse(2) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has pushed down [src]!", \ - "[M] has pushed down [src]!") - else - if(drop_item()) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has disarmed [src]!", \ - "[M] has disarmed [src]!") - return - -/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - switch(M.a_intent) - if ("help") - visible_message(" [M] caresses [src] with its scythe like arm.") - - if ("harm") - M.do_attack_animation(src) - if ((prob(95) && health > 0)) - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - if (paralysis < 15) - Paralyse(rand(10, 15)) - visible_message("[M] has wounded [name]!", \ - "[M] has wounded [name]!") - else - visible_message("[M] has slashed [name]!", \ - "[M] has slashed [name]!") - if (stat != DEAD) - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to lunge at [name]!", \ - "[M] has attempted to lunge at [name]!") - - if ("grab") - if (M == src || anchored) - return - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src ) - - M.put_in_active_hand(G) - - G.synch() - - LAssailant = M - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has grabbed [name] passively!") - - if ("disarm") - M.do_attack_animation(src) - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - var/damage = 5 - if(prob(95)) - Weaken(10) - visible_message("[M] has tackled down [name]!", \ - "[M] has tackled down [name]!") - else - if(drop_item()) - visible_message("[M] has disarmed [name]!", \ - "[M] has disarmed [name]!") - adjustBruteLoss(damage) - updatehealth() - return - -/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M as mob) - if(M.melee_damage_upper == 0) - M.emote("[M.friendly] [src]") - else - M.do_attack_animation(src) - if(M.attack_sound) - playsound(loc, M.attack_sound, 50, 1, 1) - visible_message("[M] [M.attacktext] [src]!", \ - "[M] [M.attacktext] [src]!") - add_logs(M, src, "attacked", admin=0) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) - updatehealth() - - -/mob/living/carbon/monkey/attack_slime(mob/living/carbon/slime/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if(M.Victim) return // can't attack while eating! - - if (health > -100) - - M.do_attack_animation(src) - visible_message("The [M.name] glomps [src]!", \ - "The [M.name] glomps [src]!") - - var/damage = rand(1, 3) - - if(M.is_adult) - damage = rand(20, 40) - else - damage = rand(5, 35) - - adjustBruteLoss(damage) - - if(M.powerlevel > 0) - var/stunprob = 10 - var/power = M.powerlevel + rand(0,3) - - switch(M.powerlevel) - if(1 to 2) stunprob = 20 - if(3 to 4) stunprob = 30 - if(5 to 6) stunprob = 40 - if(7 to 8) stunprob = 60 - if(9) stunprob = 70 - if(10) stunprob = 95 - - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 - - visible_message("[M] shocked [src]!", \ - "[M] shocked [src]!") - - Weaken(power) - if (stuttering < power) - stuttering = power - Stun(power) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - if (prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - - - updatehealth() - - return - -/mob/living/carbon/monkey/Stat() - ..() - statpanel("Status") - stat(null, text("Intent: []", a_intent)) - stat(null, text("Move Mode: []", m_intent)) - if(client && mind) - if (client.statpanel == "Status") - if(mind.changeling) - stat("Chemical Storage", mind.changeling.chem_charges) - stat("Genetic Damage Time", mind.changeling.geneticdamage) - return - - -/mob/living/carbon/monkey/verb/removeinternal() - set name = "Remove Internals" - set category = "IC" - internal = null - return - -/mob/living/carbon/monkey/var/co2overloadtime = null -/mob/living/carbon/monkey/var/temperature_resistance = T0C+75 - -/mob/living/carbon/monkey/emp_act(severity) - if(wear_id) wear_id.emp_act(severity) - ..() - -/mob/living/carbon/monkey/ex_act(severity) - ..() - switch(severity) - if(1.0) - gib() - return - if(2.0) - adjustBruteLoss(60) - adjustFireLoss(60) - if(3.0) - adjustBruteLoss(30) - if (prob(50)) - Paralyse(10) - return - -/mob/living/carbon/monkey/blob_act() - if (stat != 2) - adjustFireLoss(60) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - if (prob(50)) - Paralyse(10) - if (stat == DEAD && client) - gib() - return - if (stat == DEAD && !client) - gibs(loc, viruses) - del(src) - return - - -/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools - if(!ticker) return 0 - if(!ticker.mode.name == "monkey") return 0 - return 1 - -/mob/living/carbon/monkey/canBeHandcuffed() - return 1 - - -/mob/living/carbon/monkey/assess_threat(var/obj/machinery/bot/secbot/judgebot, var/lasercolor) - if(judgebot.emagged == 2) - return 10 //Everyone is a criminal! - var/threatcount = 0 - - //Securitrons can't identify monkeys - if(!lasercolor && judgebot.idcheck ) - threatcount += 4 - - //Lasertag bullshit - if(lasercolor) - if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve - if((istype(r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/redtag))) - threatcount += 4 - - if(lasercolor == "r") - if((istype(r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/bluetag))) - threatcount += 4 - - return threatcount - - //Check for weapons - if(judgebot.weaponscheck) - if(judgebot.check_for_weapons(l_hand)) - threatcount += 4 - if(judgebot.check_for_weapons(r_hand)) - threatcount += 4 - - //Loyalty implants imply trustworthyness - if(isloyal(src)) - threatcount -= 1 - - return threatcount diff --git a/code/modules/mob/living/carbon/monkey/npc.dm b/code/modules/mob/living/carbon/monkey/npc.dm deleted file mode 100644 index f863558605a..00000000000 --- a/code/modules/mob/living/carbon/monkey/npc.dm +++ /dev/null @@ -1,89 +0,0 @@ -mob/living/carbon/monkey/var - mob/npc_target = null // the NPC this monkey is attacking - mob/npc_fleeing = null // the monkey is scared of this mob - mob/hiding_behind = null - hid_behind = 0 - - var/list/hostiles = list() - - fleeing_duration = 0 - -mob/living/carbon/monkey/proc/npc_act() - if(!client && !stat) - if(npc_fleeing && canmove) - var/prevloc = loc - if(!hiding_behind) - for(var/mob/living/carbon/human/H in view(7, src)) - if(!hostiles.Find(H)) - hiding_behind = H - - if(hiding_behind) - if(get_dist(src, hiding_behind) == 1) - if(!hid_behind) - emote("me", 1, "hides behind [hiding_behind]!") - hid_behind = 1 - step_to(src, get_step(hiding_behind, get_dir(npc_fleeing, hiding_behind))) - else - if(!step_to(src, hiding_behind, 1)) - hiding_behind = null - else - step_away(src, npc_fleeing, 7) - - if(prob(7)) - if(prob(50) && (npc_fleeing in view(8,src))) - switch(rand(1,3)) - if(1) - emote("me", 1, "shows [npc_fleeing] its fangs!") - if(2) - emote("me", 2, "gnarls at [npc_fleeing].") - if(3) - emote("me", 2, "eyes [npc_fleeing] fearfully.") - else - switch(rand(1,3)) - if(1) - emote("whimper") - if(2) - emote("me", 1, "trembles heavily.") - if(3) - emote("me", 2, "chimpers nervously.") - - fleeing_duration-- - if(fleeing_duration <= 0) - npc_fleeing = null - hiding_behind = null - hid_behind = 0 - - if(loc == prevloc) dir = get_dir(src, npc_fleeing) - else - if(prob(33) && canmove && isturf(loc)) - step(src, pick(cardinal)) - if(prob(1)) - if(health < 70) - switch(rand(1,3)) - if(1) - emote("me", 1, "cowers on the floor, writhing in pain.") - if(2) - emote("me", 1, "trembles visibly, it seems to be in pain.") - if(3) - emote("me", 1, "wraps its arms around its knees, breathing heavily.") - else - emote(pick("scratch","jump","roll","tail")) - -mob/living/carbon/monkey/react_to_attack(mob/M) - if(npc_fleeing == M) - fleeing_duration += 30 - return - - if(!hostiles.Find(M)) hostiles += M - - spawn(5) - switch(rand(1,3)) - if(1) - emote("me", 1, "flails about wildly!") - if(2) - emote("me", 2, "screams loudly at [M]!") - if(3) - emote("me", 2, "whimpers fearfully!") - - npc_fleeing = M - fleeing_duration = 30 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/say.dm b/code/modules/mob/living/carbon/monkey/say.dm deleted file mode 100644 index 9a629c358fc..00000000000 --- a/code/modules/mob/living/carbon/monkey/say.dm +++ /dev/null @@ -1,28 +0,0 @@ -/mob/living/carbon/monkey/say(var/message) - var/verb = "says" - var/message_range = world.view - - if(client) - if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (Muted)." - return - - message = trim_strip_html_properly(message) - - if(stat == 2) - return say_dead(message) - - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) - - var/datum/language/speaking = parse_language(message) - - if(speaking) - message = copytext(message, 2+length(speaking.key)) - - message = trim(message) - - if(!message || stat) - return - - ..(message, speaking, verb, null, null, message_range, null) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm deleted file mode 100644 index 7c268632876..00000000000 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ /dev/null @@ -1,134 +0,0 @@ -//Monkey Overlays Indexes//////// -#define M_MASK_LAYER 1 -#define M_BACK_LAYER 2 -#define M_HANDCUFF_LAYER 3 -#define M_L_HAND_LAYER 4 -#define M_R_HAND_LAYER 5 -#define TARGETED_LAYER 6 -#define M_FIRE_LAYER 7 -#define M_TOTAL_LAYERS 7 -///////////////////////////////// - -/mob/living/carbon/monkey - var/list/overlays_lying[M_TOTAL_LAYERS] - var/list/overlays_standing[M_TOTAL_LAYERS] - -/mob/living/carbon/monkey/regenerate_icons() - ..() - update_inv_wear_mask(0) - update_inv_back(0) - update_inv_r_hand(0) - update_inv_l_hand(0) - update_inv_handcuffed(0) - update_fire() - update_icons() - //Hud Stuff - update_hud() - return - -/mob/living/carbon/monkey/update_icons() - update_hud() - lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again - overlays.Cut() - for(var/image/I in overlays_standing) - overlays += I - - - if(lying) - var/matrix/M = matrix() - M.Turn(90) - M.Translate(1,-6) - src.transform = M - else - var/matrix/M = matrix() - src.transform = M - - - -//////// -/mob/living/carbon/monkey/update_inv_wear_mask(var/update_icons=1) - if( wear_mask && istype(wear_mask, /obj/item/clothing/mask) ) - overlays_standing[M_MASK_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]") - wear_mask.screen_loc = ui_monkey_mask - else - overlays_standing[M_MASK_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1) - if(r_hand) - var/t_state = r_hand.item_state - if(!t_state) t_state = r_hand.icon_state - overlays_standing[M_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state) - r_hand.screen_loc = ui_rhand - if (handcuffed) drop_r_hand() - else - overlays_standing[M_R_HAND_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_l_hand(var/update_icons=1) - if(l_hand) - var/t_state = l_hand.item_state - if(!t_state) t_state = l_hand.icon_state - overlays_standing[M_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state) - l_hand.screen_loc = ui_lhand - if (handcuffed) drop_l_hand() - else - overlays_standing[M_L_HAND_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_back(var/update_icons=1) - if(back) - overlays_standing[M_BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]") - back.screen_loc = ui_monkey_back - else - overlays_standing[M_BACK_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1) - if(handcuffed) - drop_r_hand() - drop_l_hand() - stop_pulling() - overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1") - else - overlays_standing[M_HANDCUFF_LAYER] = null - if(update_icons) update_icons() - - -/mob/living/carbon/monkey/update_hud() - if (client) - client.screen |= contents - -//Call when target overlay should be added/removed -/mob/living/carbon/monkey/update_targeted(var/update_icons=1) - if (targeted_by && target_locked) - overlays_standing[TARGETED_LAYER] = target_locked - else if (!targeted_by && target_locked) - del(target_locked) - if (!targeted_by) - overlays_standing[TARGETED_LAYER] = null - if(update_icons) update_icons() - -/mob/living/carbon/monkey/update_fire() - overlays -= overlays_standing[M_FIRE_LAYER] - if(on_fire) - overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER) - overlays += overlays_standing[M_FIRE_LAYER] - return - else - overlays_standing[M_FIRE_LAYER] = null - -//Monkey Overlays Indexes//////// -#undef M_MASK_LAYER -#undef M_BACK_LAYER -#undef M_HANDCUFF_LAYER -#undef M_L_HAND_LAYER -#undef M_R_HAND_LAYER -#undef TARGETED_LAYER -#undef M_FIRE_LAYER -#undef M_TOTAL_LAYERS - diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4361b9e74a2..3c5c9b62a15 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -67,13 +67,6 @@ H.UpdateDamageIcon() H.updatehealth() return 1 - else if(istype(src, /mob/living/carbon/monkey)) - if (RESIST_HEAT in src.mutations) //fireproof - return 0 - var/mob/living/carbon/monkey/M = src - M.adjustFireLoss(burn_amount) - M.updatehealth() - return 1 else if(istype(src, /mob/living/silicon/ai)) return 0 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index bcef5aee0b7..9fcea92d006 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1025,11 +1025,6 @@ var/list/robot_verbs_default = list( //if they are holding or wearing a card that has access, that works if(check_access(H.get_active_hand()) || check_access(H.wear_id)) return 1 - else if(istype(M, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/george = M - //they can only hold things :( - if(george.get_active_hand() && istype(george.get_active_hand(), /obj/item/weapon/card/id) && check_access(george.get_active_hand())) - return 1 return 0 /mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 38a3243c1bb..ec32d9f4f2e 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -107,7 +107,7 @@ //Removing from inventory if(href_list["remove_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/remove_from = href_list["remove_inv"] switch(remove_from) @@ -140,7 +140,7 @@ //Adding things to inventory else if(href_list["add_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index fde8333ebdb..09a3ceed3d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -83,7 +83,7 @@ //Removing from inventory if(href_list["remove_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/remove_from = href_list["remove_inv"] switch(remove_from) @@ -113,7 +113,7 @@ //Adding things to inventory else if(href_list["add_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) + if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) return var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 04f5c411957..34d7c63dbd3 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -137,7 +137,7 @@ return //Is the usr's mob type able to do this? - if(ishuman(usr) || ismonkey(usr) || isrobot(usr)) + if(ishuman(usr) || issmall(usr) || isrobot(usr)) //Removing from inventory if(href_list["remove_inv"]) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3e1fd60f404..56d4ffb9f61 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -308,29 +308,6 @@ return -/mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M as mob) - if(!(istype(M, /mob/living/carbon/monkey))) - return // Fix for aliens receiving double messages when attacking simple animals. - - ..() - - switch(M.a_intent) - - if ("help") - if (health > 0) - visible_message(" [M] [response_help] [src].") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - else - M.do_attack_animation(src) - if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - return - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - if (health > -100) - adjustBruteLoss(rand(1, 3)) - return - /mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M as mob) switch(M.a_intent) diff --git a/code/modules/mob/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm index 1cac93904f8..cdc734c49a7 100644 --- a/code/modules/mob/mob_cleanup.dm +++ b/code/modules/mob/mob_cleanup.dm @@ -152,14 +152,6 @@ Put (mob/proc)s here that are in dire need of a code cleanup. // world << "Shoes pass [passed]" */ // - else if(istype(src, /mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/M = src - switch(target_zone) - if(1) - if(M.wear_mask && isobj(M.wear_mask)) - Cl = M.wear_mask - passed = prob((Cl.permeability_coefficient*100) - 1) - //world << "Mask pass [passed]" if(!passed && spread_type == AIRBORNE && !internals) passed = (prob((50*virus.permeability_mod) - 1)) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index ccbcee33e1e..2430e027f87 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -382,7 +382,7 @@ if(isalien(attacker) && iscarbon(prey)) //Xenomorphs eating carbon mobs return 1 - if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/monkey/diona)) //Kidan eating nymphs + if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/alien/diona)) //Kidan eating nymphs return 1 if(ishuman(attacker) && attacker.get_species() == "Tajaran" && istype(prey,/mob/living/simple_animal/mouse)) //Tajaran eating mice. Meow! diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3383ad1eab9..49420198f26 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -5,10 +5,12 @@ return 1 return 0 -/proc/ismonkey(A) - if(A && istype(A, /mob/living/carbon/monkey)) - return 1 - return 0 +/proc/issmall(A) + if(A && istype(A, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = A + if(H.species && H.species.is_small) + return 1 + return 0 /proc/isbrain(A) if(A && istype(A, /mob/living/carbon/brain)) @@ -395,7 +397,7 @@ var/list/intents = list("help","disarm","grab","harm") if(hud_used && hud_used.action_intent) hud_used.action_intent.icon_state = "intent_[a_intent]" - else if(isrobot(src) || ismonkey(src) || islarva(src)) + else if(isrobot(src) || islarva(src)) switch(input) if("help") a_intent = "help" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 4a17773d012..032011a8fe5 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -481,7 +481,7 @@ return 1 //Friendly Creatures! - if(ispath(MP, /mob/living/carbon/monkey/diona) && !jobban_isbanned(src, "Dionaea")) + if(ispath(MP, /mob/living/carbon/alien/diona) && !jobban_isbanned(src, "Dionaea")) return 1 //Not in here? Must be untested! diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 141e3d9ee5d..9cc65e3920d 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -326,12 +326,6 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) if(istype(source,/mob/living/carbon/human)) var/mob/living/carbon/human/M = source source = M.get_blood(M.vessel) - else if(istype(source,/mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/donor = source - if(donor.dna) - source = new() - source.data["blood_DNA"] = donor.dna.unique_enzymes - source.data["blood_type"] = donor.dna.b_type // Are we dripping or splattering? var/list/drips = list() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 757bfc6b40f..889d2f47f62 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -812,8 +812,7 @@ if(!user.client) return 0 if ( ! (istype(user, /mob/living/carbon/human) || \ - istype(user, /mob/living/silicon) || \ - istype(user, /mob/living/carbon/monkey) /*&& ticker && ticker.mode.name == "monkey"*/) ) + istype(user, /mob/living/silicon))) user << "\red You don't have the dexterity to use this [src]!" return 0 if(user.restrained()) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index a434098da03..ccb5e52ff6c 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -229,7 +229,7 @@ display round(lastgen) and plasmatank amount if(panel_open) user << "You open the access panel." else - user << "You close the access panel." + user << "You close the access panel." else if(istype(O, /obj/item/weapon/storage/part_replacer) && panel_open) exchange_parts(user, O) return @@ -238,8 +238,8 @@ display round(lastgen) and plasmatank amount /obj/machinery/power/port_gen/pacman/emag_act(user as mob) emagged = 1 - emp_act(1) - + emp_act(1) + /obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob) ..() if (!anchored) @@ -250,9 +250,6 @@ display round(lastgen) and plasmatank amount /obj/machinery/power/port_gen/pacman/attack_ai(mob/user as mob) interact(user) -/obj/machinery/power/port_gen/pacman/attack_paw(mob/user as mob) - interact(user) - /obj/machinery/power/port_gen/pacman/interact(mob/user) if (get_dist(src, user) > 1 ) if (!istype(user, /mob/living/silicon/ai)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 96feb8cd89d..95eaa69a81f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -96,7 +96,7 @@ qdel(src) return - if (!user.IsAdvancedToolUser() || istype(user, /mob/living/carbon/monkey/diona)) + if (!user.IsAdvancedToolUser() || istype(user, /mob/living/carbon/alien/diona)) user << "\red You don't have the dexterity to do this!" return if(istype(user, /mob/living)) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 0a828d3be11..e002314411a 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -33,11 +33,8 @@ var/mob/living/new_mob - var/randomize = pick("monkey","robot","slime","xeno","human") + var/randomize = pick("robot","slime","xeno","human") switch(randomize) - if("monkey") - new_mob = new /mob/living/carbon/monkey(M.loc) - new_mob.universal_speak = 1 if("robot") new_mob = new /mob/living/silicon/robot(M.loc) new_mob.gender = M.gender diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index cc2a94ad1f0..e06ee2faa12 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -148,11 +148,8 @@ proc/wabbajack(mob/living/M) var/mob/living/new_mob - var/randomize = pick("monkey","robot","slime","xeno","human","animal") + var/randomize = pick("robot","slime","xeno","human","animal") switch(randomize) - if("monkey") - new_mob = new /mob/living/carbon/monkey(M.loc) - new_mob.universal_speak = 1 if("robot") if(prob(30)) new_mob = new /mob/living/silicon/robot/syndicate(M.loc) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index b02dbddc52d..61f1db03b17 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -154,13 +154,6 @@ datum if(self.data["virus2"]) blood_prop.virus2 = virus_copylist(self.data["virus2"]) - - else if(istype(self.data["donor"], /mob/living/carbon/monkey)) - var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T - if(!blood_prop) - blood_prop = new(T) - blood_prop.blood_DNA["Non-Human DNA"] = "A+" - else if(istype(self.data["donor"], /mob/living/carbon/alien)) var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T if(!blood_prop) diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index 9cfa220198b..c3020926188 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -602,10 +602,10 @@ datum/reagent/atrazine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volu H.adjustToxLoss(50) ..() return - if(ismonkey(M)) + if(issmall(M)) var/mob/living/carbon/monkey/MO = M if(MO.dna) - if(istype(MO,/mob/living/carbon/monkey/diona)) //plantmen monkeys (diona) take EVEN MORE damage + if(istype(MO,/mob/living/carbon/alien/diona)) //plantmen monkeys (diona) take EVEN MORE damage MO.adjustToxLoss(100) ..() return diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 7f4d494af0f..c199844a083 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -1669,7 +1669,7 @@ bitesize = 12 filling_color = "#ADAC7F" - var/monkey_type = /mob/living/carbon/monkey + var/monkey_type = "Monkey" New() ..() @@ -1687,6 +1687,7 @@ if(wrapped) Unwrap(user) +/* On_Consume(var/mob/M) M << "Something inside of you suddently expands!" @@ -1714,7 +1715,7 @@ else //someone is having a bad day E.createwound(CUT, 30) E.embed(surprise) - else if (ismonkey(M)) + else if (issmall(M)) M.visible_message("[M] suddenly tears in half!") var/mob/living/carbon/monkey/ook = new monkey_type(M.loc) ook.name = "malformed [ook.name]" @@ -1722,6 +1723,7 @@ ook.add_blood(M) M.gib() ..() +*/ water_act(volume, temperature) if(volume >= 5) return Expand() @@ -1729,7 +1731,8 @@ proc/Expand() for(var/mob/M in viewers(src,7)) M << "\red \The [src] expands!" - new monkey_type(src) + var/mob/living/carbon/human/H = new (src) + H.set_species(monkey_type) del(src) proc/Unwrap(mob/user as mob) @@ -1746,32 +1749,34 @@ /obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube name = "farwa cube" - monkey_type = /mob/living/carbon/monkey/tajara + monkey_type = "Farwa" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube name = "farwa cube" - monkey_type =/mob/living/carbon/monkey/tajara + monkey_type = "Farwa" +/* /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube name = "wolpin cube" monkey_type = /mob/living/carbon/monkey/vulpkanin /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube name = "wolpin cube" monkey_type = /mob/living/carbon/monkey/vulpkanin +*/ /obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube name = "stok cube" - monkey_type = /mob/living/carbon/monkey/unathi + monkey_type = "Stok" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube name = "stok cube" - monkey_type =/mob/living/carbon/monkey/unathi + monkey_type = "Stok" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube name = "neaera cube" - monkey_type =/mob/living/carbon/monkey/skrell + monkey_type = "Neara" /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube name = "neaera cube" - monkey_type =/mob/living/carbon/monkey/skrell + monkey_type = "Neara" /obj/item/weapon/reagent_containers/food/snacks/spellburger diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 564207dacca..c44da6e511d 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -44,8 +44,6 @@ ..() update_icon() - attack_paw() - return attack_hand() attackby(obj/item/I as obj, mob/user as mob, params) @@ -361,8 +359,6 @@ ..() update_icon() - attack_paw() - return attack_hand() attackby(obj/item/I as obj, mob/user as mob) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index ebb92a8474f..0eb8dbafd3f 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -206,15 +206,6 @@ return - // monkeys can only pull the flush lever - attack_paw(mob/user as mob) - if(stat & BROKEN) - return - - flush = !flush - update() - return - // ai as human but can't flush attack_ai(mob/user as mob) interact(user, 1) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm index e4a0992fbcd..3242d7a73ef 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm @@ -41,8 +41,7 @@ /mob/living/simple_animal/slime,\ /mob/living/simple_animal/crab,\ /mob/living/simple_animal/mouse,\ - /mob/living/simple_animal/hostile/retaliate/goat,\ - /mob/living/carbon/monkey\ + /mob/living/simple_animal/hostile/retaliate/goat\ ) //todo: how the hell is the asteroid permanently powered? diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 014fc44cfbf..33b8fd46f6c 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -626,7 +626,7 @@ ..() -var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) +var/list/compatible_mobs = list(/mob/living/carbon/human) /datum/disease2/effect/horsethroat name = "Horse Throat" stage = 3 diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 982bf477cc3..cfc6bd1bdb6 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -69,11 +69,6 @@ proc/airborne_can_reach(turf/source, turf/target, var/radius=5) if(M.reagents.has_reagent("spaceacillin")) return - if(istype(M,/mob/living/carbon/monkey)) - var/mob/living/carbon/monkey/chimp = M - if (!(chimp.greaterform in disease.affected_species)) - return - if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/chump = M if (!(chump.species.name in disease.affected_species)) diff --git a/icons/mob/human_races/masks/blood_human.dmi b/icons/mob/human_races/masks/blood_human.dmi new file mode 100644 index 0000000000000000000000000000000000000000..dc54991c84d2ba811af34ecf5330e96d7e73dccc GIT binary patch literal 8321 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 literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/masks/dam_human.dmi b/icons/mob/human_races/masks/dam_human.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cb6bf82d98e93ab28869a172c32663c5b6d34834 GIT binary patch literal 6471 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 Z#R8}x8syfRg*yNM002ovPDHLkV1kSBy;=YO literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/masks/dam_mask_monkey.dmi b/icons/mob/human_races/masks/dam_mask_monkey.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4761f21fbd5b8a01f424d1071aa18b3547ff3ea6 GIT binary patch literal 688 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 literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/monkeys/r_farwa.dmi b/icons/mob/human_races/monkeys/r_farwa.dmi new file mode 100644 index 0000000000000000000000000000000000000000..585fa3bcf3538c0e7b6549f920b80316fadd361b GIT binary patch literal 1231 zcmV;=1Tg!FP)+Ax9@&MGt zkc;s;4Yu#hI-1ooDmgOzE9=!b58s#i0Nlc=#FRQxX8-^LnMp)JRCt{2-P>}bFbsfU zY>*3S4)6cAYp31W8+2$xVt4z0?aa=sjpP8yMJ1DI0s!2ll$(?u8n<&;0lMd(^CCr- zJnv6P^PHAtY5!>BvMge*Ah#JxfZq9Qgd%V2n-u*FFO7Z$qy^Ycdj8Ya;>)1<>*?9n z_jOaxVLN?`agN*gd40DQ@V=h)0KM~1xvZD%vKDpxz5>zTW?9bblU5z~uRyzsN{HV1>wBzS0sTE#?pHwR(n;4g z7P$f?U-vupdgreR+7-~-km?6e7OhPwU9Ty21=`FZ^GDu;MSl;bd5&EHwNEX8ideMs;800000000000002MljbDicW8(twLzhGe)mB}B`6(4KR!PI0000000000fZxL0zyBMU_4(hRwIHa2tv>G@ z?@p*0vfiK2pHrXDN7U!-6QDidWNObzabp`t$Adhbbposgq7-;}UjI>gQisxE(p6nx zn*9?n>4$#|hk|sK)Gt(=^pVivpTm(T00000000000C=wU{Q|w$&{cbWK<_nl)gF)F zOtGFHaLa!6Ud$<>(z#V!ja28&DQ@qC)xhIDd*E{g)>xo)ZoPtfyjPunW^w-E#*57c=_KMC~u{M?KNEeTV!Z zfu5xb9^xebSO&ncypuRcs{(S%d00000 z003SjR{vLLjb8WnM61?n|G;7O^G>4c*ZK!WFZ+Ay`ps{x{x?y1rNfu~9Z8~3jb3*9 z2d3*|kDdNX!E(QNdTfrD3s-;D{(->8-LEa_wUS%c|4Z4snr62#VC;RX;i|oIulNB{ t^c43Izd!e9-U5vQ;S>M>0091Te*lLd81x(XM(qFq002ovPDHLkV1i?3PF4T_ literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/monkeys/r_monkey.dmi b/icons/mob/human_races/monkeys/r_monkey.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c405a94978d8bfa84bcb2166cfeae7695fae3daa GIT binary patch literal 952 zcmV;p14sOcP)%0000aP)t-sz`($f zNC5wtGcy1HnKJ;B007JY0AXQa;NakZfPnwZW&i-06<9ti00001bW%=J06^y0W&i*H zsCrabbVOxyV{&P5bZKvH004NLjgq?x!!Qg*XZtHmvX{QrE+wI4Xnw&MEI%NzKo;%q zH%W(1CED(VqazJ!&AopNqv@W5egV~t#oWyGaMbFZJ*TBy&RQkNG4Z!lb_`2w$R<~O zqm|E8*D0+6xf#}c`eBm{BO4G|U=v|v9nAungd#gZ6u2Z5BUQ9P$nD=233Cy1`+E~O zFVJn+Ut4SXvD;qi11C%2nK)6X7~4>!!Ye8& zTWgwBS$RSogpwL0=qdSwxTJMQpfi8quftTC_hvln)fgFxbEO}L&eG3d{Ayxi!sbvfMh&4)=INdgJxdtEW)+ z000000002sSPUo8z{b^KYgkJ`RqL6P(8qZl0WL8xa-vX*%86y2QN^F9I{*Lx0O0?| zcJ-$HGE#Zj{8{1#Vb6}b14Df(FQ-5H2CPeMV3fYz8ThD4=H>G3IANHF8(4G)2Kr>4 zZiV?al^-_e`#gk;)aC9CBt<0*KBq4C(jSPMQkRi5?XtADBAoWAqz zU8c6qtM}ZQ4`2OD{oC4QYx~~m0QY9PTi@GnW@8yJcj5%zejMw7_J!C$p?|xfHv0)$ zr@rl}JCyp(iT5T`Tkmy%7mrn`fBP6;i}k^ktUsN6kO8MxZx87=My*G6^hHK}(<$`> z00000006+(6WK3l4F-6-{U1#Ihkz2p15zMtQmuU4WyQ}y}ko5?jw{Qv*}0LRBR zO-HRyK4qiS|8%x~xD>T>vR?m`0hjC1_rv*(z1VEzPcof2>a-WXbin2z{Lkq^zp=yh z4`FDXIBEQ|F8}1O*ORGSFYy~QuV3YkUbpMD45;gcTrczM)AXory!uV3YLxl`00000 aj>vC&)tkk)Y|Z5W0000%0000aP)t-sz`(!& zGXVc)0RNc)GXOLH%m6c)0RNdYVPRpBNB}bc0N~)@MpRCo00001bW%=J06^y0W&i*H zsd`jcbVOxyV{&P5bZKvH004NLjgq?x!!Qg*XZtHmvX{QrE+wI4Xnw&M`~)WgS+u|3 zq~1Ez+U|v;BLwQzeSA!_8lIDUIV=fQbyL^FQHpo66t{9YOA%cPk!mSq$ZfHU&RD&4 zQrLuLpOV6(S=^paKbUV~1XzHft6bX`5Yo!Ca9gWLcB0^mtRK~#90?VLew+b|GCIWkfpU6~YMpk3J( zyss(i1U*4xIP1C#_Xb(pD3EisH)w8H2SpLi3_;c)l^W=OtIUv}q7)_2e33E+fa|~- znxlTUFxJAbWKH2|Ly`jypS%-1o_hD?>kDF9nsyEc#Z`m1iyDdKh z|CL=s`_S?JW%_f6{TFtLT<`hs^kK#?;hqmzsyAdsyj&#Pjpd0_{W&pB$CQan^#A|> z000000079LtLe+?>#V-9E*ZPEtnXXqK$Pmu&2q)!iSJq53QNa0&rGILy_xK`JRZaV z1MhFzElZT@&E!rDAO>vjG!aG6=41j|lSvB7T7~2rk=YlgEY*z-+JD z--!DBpu3dLU>g7V&k@B0~TYL}NYd^wDoLYBmOjw(Y zJpo+^oe96u;6|=ONPZ#W85BHBkLa0(|N&sZf2i4GV370EW000000000171L3p%+rOwAsz2I?_2-XyzJIP> zyqK^=kNE|oPayCBNN&`QQN3gj{D7!mAgOLzJiWXOCi^qrU)nY~y}W6w+dhvkh6Ejs zx?NV}k+-X51b#rwFHoLDZIgoiBZ=KYDu>nG0001f^9!BsVS?JHSHJ)O002ovPDHLk FV1kGd+91<#II4Ob97LNs%@ME$_(q00001 zbW%=J06^y0W&i*HsCrabbVOxyV{&P5bZKvH004NLjnX>`!!Qg6;MqQfN%qp$+NC6v z49yjc!B21^kVSj_CiT#*)+WKHA0gDM`}mkZY!TqZIFCDQ?Z>EJbuF zM5;|8LvAZO)EBPf6j?EN-t)KbE;Hn$q1n>V?OAlM!G6MqG96ynv8a zMqYL8ysWbejMMRy!S-hPpX${(58s#i0I*o9#5St{t^fc7FG)l}RCt{2-P?BCAP|LN zoeTmS>HXifprlRG&cI~JF3$4*T}Hs(mh9vL>J9?{00000007`MjiYJUG|4|6XXVOY zv*)osOs&yc{%nJ3Sq#&2j5s}~&xQqZ$XvezY7Hg$ZVk%(#(^?i!S`+e0000000000UdbqLe9Xq#&0U9aUc~inJ9C-5Ke99zn2ei$^6rXtGo_s} zFVcuvH0HYp!Kr?|kQ6b*j7Q z*DuZ4eOV z000000001hCa3T0e^J}v{?Yk2+s=E8w}&*iN50$QRx7u=;C3}X`0D9~cboS?YtTJE zL?3IXkjfbqA z75YK7{Wzo~z6W!Gn5P>W#GDYt0=@H36-aLd+706RRzP@;z4HfmEaCNodX)m@9q28O zpgaIy-hw%8y27+g@kYHHU{C%n(I9XrqlI@^4$#_9Zz0ov8Z^LN4a z>2yxXH-5Oa8mIFC000000001ZCF=M38^%rZ{Zh0MhJMzUFwDY8^W;&QJR0wSB}E=H zjdxl;n}ye4TK_OgcVJvhb4>-M^>aT{LE9ZzgthE9KrU!{3y3pqqm2Db!)9sFB>vRS r*w3<(^Z~W9O+EKg0RR9106*O?uU{v2114Aw00000NkvXXu0mjf@bDQ+ literal 0 HcmV?d00001 diff --git a/paradise.dme b/paradise.dme index 95230e48fcf..4ec576d4155 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1264,6 +1264,13 @@ #include "code\modules\mob\living\carbon\alien\login.dm" #include "code\modules\mob\living\carbon\alien\logout.dm" #include "code\modules\mob\living\carbon\alien\say.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" +#include "code\modules\mob\living\carbon\alien\diona\life.dm" +#include "code\modules\mob\living\carbon\alien\diona\progression.dm" +#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" +#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" #include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" #include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" #include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" @@ -1309,13 +1316,16 @@ #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" #include "code\modules\mob\living\carbon\human\say.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\whisper.dm" #include "code\modules\mob\living\carbon\human\species\apollo.dm" #include "code\modules\mob\living\carbon\human\species\golem.dm" +#include "code\modules\mob\living\carbon\human\species\monkey.dm" #include "code\modules\mob\living\carbon\human\species\plasmaman.dm" #include "code\modules\mob\living\carbon\human\species\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\station.dm" #include "code\modules\mob\living\carbon\metroid\death.dm" #include "code\modules\mob\living\carbon\metroid\emote.dm" #include "code\modules\mob\living\carbon\metroid\examine.dm" @@ -1327,16 +1337,6 @@ #include "code\modules\mob\living\carbon\metroid\say.dm" #include "code\modules\mob\living\carbon\metroid\subtypes.dm" #include "code\modules\mob\living\carbon\metroid\update_icons.dm" -#include "code\modules\mob\living\carbon\monkey\death.dm" -#include "code\modules\mob\living\carbon\monkey\diona.dm" -#include "code\modules\mob\living\carbon\monkey\emote.dm" -#include "code\modules\mob\living\carbon\monkey\examine.dm" -#include "code\modules\mob\living\carbon\monkey\inventory.dm" -#include "code\modules\mob\living\carbon\monkey\life.dm" -#include "code\modules\mob\living\carbon\monkey\login.dm" -#include "code\modules\mob\living\carbon\monkey\monkey.dm" -#include "code\modules\mob\living\carbon\monkey\say.dm" -#include "code\modules\mob\living\carbon\monkey\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\login.dm" #include "code\modules\mob\living\silicon\say.dm" From e056abfb820735309c173dcc7873c252f3b62ea1 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 May 2015 20:16:34 -0400 Subject: [PATCH 03/16] 3/3 port done --- code/game/dna/genes/monkey.dm | 14 ++-------- code/game/gamemodes/nuclear/nuclearbomb.dm | 28 +++++++++---------- code/game/machinery/Freezer.dm | 3 -- code/game/machinery/OpTable.dm | 19 ++----------- code/game/machinery/Sleeper.dm | 3 -- code/game/machinery/adv_med.dm | 2 -- code/game/machinery/alarm.dm | 5 ---- code/game/machinery/atmoalter/canister.dm | 3 -- code/game/machinery/atmoalter/pump.dm | 3 -- code/game/machinery/atmoalter/scrubber.dm | 3 -- code/game/machinery/autolathe.dm | 7 ++--- code/game/machinery/bots/medbot.dm | 3 -- code/game/machinery/cloning.dm | 3 +- .../machinery/computer/HolodeckControl.dm | 7 ----- code/game/machinery/computer/atmos_control.dm | 5 +--- code/game/machinery/computer/card.dm | 2 -- code/game/machinery/computer/cloning.dm | 2 -- .../game/machinery/computer/communications.dm | 3 -- code/game/machinery/computer/computer.dm | 14 ---------- code/game/machinery/computer/medical.dm | 2 -- code/game/machinery/computer/pod.dm | 4 --- .../computer/pod_tracking_console.dm | 3 -- code/game/machinery/computer/prisonshuttle.dm | 3 -- code/game/machinery/computer/salvage_ship.dm | 3 -- code/game/machinery/computer/security.dm | 3 -- code/game/machinery/computer/skills.dm | 3 -- .../machinery/computer/specops_shuttle.dm | 3 -- code/game/machinery/computer/store.dm | 2 -- .../computer/syndicate_specops_shuttle.dm | 3 -- code/game/machinery/computer/xenos_shuttle.dm | 27 ++++++++---------- code/game/machinery/door_control.dm | 6 ---- .../embedded_controller_base.dm | 8 ++---- code/game/machinery/flasher.dm | 3 -- code/game/machinery/holosign.dm | 3 -- code/game/machinery/igniter.dm | 7 ----- code/game/machinery/kitchen/gibber.dm | 3 -- code/game/machinery/kitchen/juicer.dm | 3 -- code/game/machinery/kitchen/microwave.dm | 3 -- code/game/machinery/kitchen/smartfridge.dm | 3 -- code/game/machinery/lightswitch.dm | 3 -- code/game/machinery/machinery.dm | 3 -- code/game/machinery/newscaster.dm | 4 --- code/game/machinery/pipe/pipe_dispenser.dm | 3 -- code/game/machinery/recharger.dm | 3 -- code/game/machinery/robot_fabricator.dm | 3 -- code/game/machinery/suit_storage_unit.dm | 8 ------ code/game/machinery/vending.dm | 3 -- code/game/mecha/mecha.dm | 3 -- code/game/mecha/mecha_control_console.dm | 3 -- code/game/objects/effects/aliens.dm | 6 +--- code/game/objects/effects/effect_system.dm | 4 --- code/game/objects/items.dm | 2 +- .../objects/items/devices/radio/intercom.dm | 3 -- code/game/objects/items/policetape.dm | 3 -- .../objects/items/weapons/dna_injector.dm | 3 -- .../objects/items/weapons/grenades/grenade.dm | 3 -- code/game/objects/structures/bedsheet_bin.dm | 4 --- .../structures/crates_lockers/closets.dm | 4 --- .../crates_lockers/closets/fireaxe.dm | 4 --- .../closets/secure/secure_closets.dm | 3 -- code/game/objects/structures/displaycase.dm | 4 +-- code/game/objects/structures/extinguisher.dm | 4 --- code/game/objects/structures/grille.dm | 3 -- code/game/objects/structures/inflatable.dm | 6 ---- code/game/objects/structures/ladders.dm | 3 -- code/game/objects/structures/lamarr_cage.dm | 3 -- code/game/objects/structures/mineral_doors.dm | 3 -- code/game/objects/structures/morgue.dm | 13 ++------- .../structures/stool_bed_chair_nest/bed.dm | 3 -- code/game/objects/structures/tables_racks.dm | 14 ---------- code/game/objects/structures/window.dm | 3 -- code/game/turfs/simulated/floor.dm | 4 --- code/game/turfs/simulated/walls.dm | 16 ----------- code/game/turfs/space/space.dm | 5 +--- code/game/turfs/unsimulated/floor.dm | 3 -- code/game/vehicles/spacepods/spacepod.dm | 2 -- code/modules/clothing/masks/miscellaneous.dm | 9 ------ code/modules/food/candy_maker.dm | 3 -- code/modules/food/grill_new.dm | 3 -- code/modules/food/icecream_vat.dm | 3 -- code/modules/food/oven_new.dm | 3 -- .../mob/living/carbon/alien/alien_defenses.dm | 7 ----- .../living/carbon/human/human_attackpaw.dm | 18 ------------ .../silicon/robot/drone/drone_console.dm | 4 --- .../modules/mob/living/silicon/robot/robot.dm | 4 --- .../mob/living/simple_animal/parrot.dm | 20 +------------ .../mob/living/simple_animal/tribbles.dm | 2 -- code/modules/paperwork/paperbin.dm | 4 --- code/modules/paperwork/stamps.dm | 3 -- code/modules/power/engine.dm | 2 -- code/modules/reagents/Chemistry-Machinery.dm | 9 ------ code/modules/reagents/newchem/toxins.dm | 12 ++++---- .../reagents/reagent_containers/hypospray.dm | 4 --- .../security levels/keycard authentication.dm | 18 +++++------- code/modules/shieldgen/shield_capacitor.dm | 3 -- code/modules/shieldgen/shield_gen.dm | 3 -- code/modules/telesci/telesci_computer.dm | 6 +--- code/modules/virus2/curer.dm | 5 ---- code/modules/virus2/diseasesplicer.dm | 3 -- paradise.dme | 1 - 100 files changed, 57 insertions(+), 480 deletions(-) delete mode 100644 code/modules/mob/living/carbon/human/human_attackpaw.dm diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 4c711464777..699d40e40bc 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -11,14 +11,11 @@ if(!istype(H,/mob/living/carbon/human)) // testing("Cannot monkey-ify [M], type is [M.type].") return - if(H.monkeyizing) - return for(var/obj/item/W in H) if (W==H.w_uniform) // will be torn continue - H.drop_from_inventory(W) + H.unEquip(W) H.regenerate_icons() - H.monkeyizing = 1 H.canmove = 0 H.stunned = 1 H.icon = null @@ -33,7 +30,6 @@ sleep(48) //animation = null - H.monkeyizing = 0 H.stunned = 0 H.update_canmove() H.invisibility = initial(H.invisibility) @@ -43,7 +39,7 @@ return for(var/obj/item/W in H) - H.drop_from_inventory(W) + H.unEquip(W) H.set_species(H.species.primitive_form) H << "You are now [H.species.name]. " @@ -55,14 +51,11 @@ if(!istype(H,/mob/living/carbon/human)) // testing("Cannot monkey-ify [M], type is [M.type].") return - if(H.monkeyizing) - return for(var/obj/item/W in H) if (W==H.w_uniform) // will be torn continue - H.drop_from_inventory(W) + H.unEquip(W) H.regenerate_icons() - H.monkeyizing = 1 H.canmove = 0 H.stunned = 1 H.icon = null @@ -77,7 +70,6 @@ sleep(48) //animation = null - H.monkeyizing = 0 H.stunned = 0 H.update_canmove() H.invisibility = initial(H.invisibility) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 2fc85d6fe4a..921b765bf75 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -80,7 +80,7 @@ var/bomb_set if (istype(O, /obj/item/device/multitool) || istype(O, /obj/item/weapon/wirecutters)) ui_interact(user) - + if (src.extended) if (istype(O, /obj/item/weapon/disk/nuclear)) usr.drop_item() @@ -159,8 +159,6 @@ var/bomb_set return ..() -/obj/machinery/nuclearbomb/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) if (src.extended) @@ -182,9 +180,9 @@ var/bomb_set obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) ui_interact(user) - + /obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] + var/data[0] var/uiwidth var/uiheight var/uititle @@ -197,12 +195,12 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) else data["authstatus"] = "Auth. S2" else - if (src.timing) + if (src.timing) data["authstatus"] = "Set" else data["authstatus"] = "Auth. S1" - data["safe"] = src.safety ? "Safe" : "Engaged" - data["time"] = src.timeleft + data["safe"] = src.safety ? "Safe" : "Engaged" + data["time"] = src.timeleft data["timer"] = src.timing data["safety"] = src.safety data["anchored"] = src.anchored @@ -217,7 +215,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) uititle = "Nuke Control Panel" else data["hacking"] = 1 - var/list/tempwires[0] + var/list/tempwires[0] for(var/wire in src.wires) tempwires.Add(list(list("name" = wire, "cut" = src.wires[wire]))) data["wires"] = tempwires @@ -227,17 +225,17 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) uiwidth = 420 uiheight = 440 uititle = "Nuclear Bomb Defusion" - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "nuclear_bomb.tmpl", uititle, uiwidth, uiheight) - ui.set_initial_data(data) + ui.set_initial_data(data) ui.open() /obj/machinery/nuclearbomb/verb/make_deployable() set category = "Object" set name = "Make Deployable" set src in oview(1) - + if(usr.stat || !usr.canmove || usr.restrained()) return @@ -340,8 +338,8 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) if (src.timing == -1.0) return if (src.safety) - usr << "\red The safety is still on." - nanomanager.update_uis(src) + usr << "\red The safety is still on." + nanomanager.update_uis(src) return src.timing = !( src.timing ) if (src.timing) @@ -429,7 +427,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) if(ticker.mode.name == "nuclear emergency") ticker.mode:nukes_left -- else if(off_station == 1) - world << "A nuclear device was set off, but the explosion was out of reach of the station!" + world << "A nuclear device was set off, but the explosion was out of reach of the station!" else if(off_station == 2) world << "A nuclear device was set off, but the device was not on the station!" else diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index fa44371b82e..3c9d02f0f2e 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -236,9 +236,6 @@ /obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_ai(mob/user as mob) src.attack_hand(user) -/obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_paw(mob/user as mob) - src.attack_hand(user) - /obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_hand(mob/user as mob) if(panel_open) user << "Close the maintenance panel first." diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 9cdbe1fd662..6369ed99eee 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -42,19 +42,6 @@ if(prob(75)) del(src) -/obj/machinery/optable/attack_paw(mob/user as mob) - if ((HULK in usr.mutations)) - usr << text("\blue You destroy the operating table.") - visible_message("\red [usr] destroys the operating table!") - src.density = 0 - del(src) - if (!( locate(/obj/machinery/optable, user.loc) )) - step(user, get_dir(user, src)) - if (user.loc == src.loc) - user.layer = TURF_LAYER - visible_message("The monkey hides under the table!") - return - /obj/machinery/optable/attack_hand(mob/user as mob) if (HULK in usr.mutations) usr << text("\blue You destroy the table.") @@ -75,13 +62,13 @@ /obj/machinery/optable/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) if(usr.stat || (!ishuman(user) && !isrobot(user)) || user.restrained() || !check_table(user) || user.weakened || user.stunned) return - + if(!ismob(O)) //humans only return - + if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robots dont fit return - + var/mob/living/L = O take_victim(L,usr) return diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c7d600bf62f..5e4ca5c788d 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -101,9 +101,6 @@ /obj/machinery/sleep_console/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/sleep_console/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/sleep_console/attack_hand(mob/user as mob) if(..()) return diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index d94b779d631..9f0a05974e3 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -340,8 +340,6 @@ default_deconstruction_crowbar(G) -/obj/machinery/body_scanconsole/attack_paw(user as mob) - return src.attack_hand(user) /obj/machinery/body_scanconsole/attack_ai(user as mob) return src.attack_hand(user) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 83381796495..b1fcd04cd08 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1109,8 +1109,6 @@ FIRE ALARM /obj/machinery/firealarm/bullet_act(BLAH) return src.alarm() -/obj/machinery/firealarm/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/machinery/firealarm/emp_act(severity) if(prob(50/severity)) alarm() @@ -1368,9 +1366,6 @@ Just a object used in constructing fire alarms return master_area=A -/obj/machinery/partyalarm/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/partyalarm/attack_hand(mob/user as mob) if((user.stat && !isobserver(user)) || stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 99782c1b022..29746472c85 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -376,9 +376,6 @@ update_flag src.add_hiddenprint(user) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/canister/attack_paw(var/mob/user as mob) - return src.attack_hand(user) - /obj/machinery/portable_atmospherics/canister/attack_alien(mob/living/carbon/alien/humanoid/user) return diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index aec5d82c346..e5b39164cc3 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -96,9 +96,6 @@ src.add_hiddenprint(user) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/pump/attack_paw(var/mob/user as mob) - return src.attack_hand(user) - /obj/machinery/portable_atmospherics/pump/attack_hand(var/mob/user as mob) user.set_machine(src) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 4821ef4f15b..02abbe87d92 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -150,9 +150,6 @@ src.add_hiddenprint(user) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/scrubber/attack_paw(var/mob/user as mob) - return src.attack_hand(user) - /obj/machinery/portable_atmospherics/scrubber/attack_hand(var/mob/user as mob) user.set_machine(src) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6c13db51ad5..7392804f585 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -168,9 +168,6 @@ busy = 0 src.updateUsrDialog() -/obj/machinery/autolathe/attack_paw(mob/user) - return attack_hand(user) - /obj/machinery/autolathe/attack_hand(mob/user) if(..(user, 0)) return @@ -292,14 +289,14 @@ /obj/machinery/autolathe/proc/can_build(var/datum/design/D,var/multiplier=1,var/custom_metal,var/custom_glass) var/coeff = get_coeff(D) - + var/metal_amount = m_amount if(custom_metal) metal_amount = custom_metal var/glass_amount = g_amount if(custom_glass) glass_amount = custom_glass - + if(D.materials["$metal"] && (metal_amount < (multiplier*D.materials["$metal"] / coeff))) return 0 if(D.materials["$glass"] && (glass_amount < (multiplier*D.materials["$glass"] / coeff))) diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index a3bf925ece1..b228e8b5c0c 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -129,9 +129,6 @@ text_dehack = "You reset [name]'s reagent processor circuits." text_dehack_fail = "[name] seems damaged and does not respond to reprogramming!" -/obj/machinery/bot/medbot/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/bot/medbot/attack_hand(mob/user as mob) . = ..() if (.) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 2ae38331a7b..f3fd4eba26d 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -165,8 +165,7 @@ /obj/machinery/clonepod/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/clonepod/attack_paw(mob/user as mob) - return attack_hand(user) + /obj/machinery/clonepod/attack_hand(mob/user as mob) if ((isnull(src.occupant)) || (stat & NOPOWER)) return diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index d7293163318..79af00f560d 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -387,9 +387,6 @@ throwpass = 1 //You can throw objects over this, despite it's density. -/obj/structure/table/holotable/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/structure/table/holotable/attack_alien(mob/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N return attack_hand(user) @@ -570,10 +567,6 @@ user << "The station AI is not to interact with these devices" return -/obj/machinery/readybutton/attack_paw(mob/user as mob) - user << "You are too primitive to use this device" - return - /obj/machinery/readybutton/New() ..() diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index bce0006f488..81545418638 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -19,9 +19,6 @@ src.add_hiddenprint(user) return interact(user) -/obj/machinery/computer/atmoscontrol/attack_paw(var/mob/user as mob) - return interact(user) - /obj/machinery/computer/atmoscontrol/attack_hand(mob/user) if(..()) return @@ -64,7 +61,7 @@ alarm_list+=alarm for(var/obj/machinery/alarm/alarm in sortAtom(alarm_list)) if(!is_in_filter(alarm.alarm_area.type)) - continue + continue if(!alarm.remote_control) continue if(alarm.hidden) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 6f7c803c359..6d07202395d 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -74,8 +74,6 @@ /obj/machinery/computer/card/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/card/attack_paw(var/mob/user as mob) - return attack_hand(user) /obj/machinery/computer/card/attack_hand(mob/user as mob) if(..()) return diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index d5d63057e37..d97d9701321 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -86,8 +86,6 @@ ..() return -/obj/machinery/computer/cloning/attack_paw(mob/user as mob) - return attack_hand(user) /obj/machinery/computer/cloning/attack_ai(mob/user as mob) return attack_hand(user) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f476181db78..66ee77fcf7d 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -256,9 +256,6 @@ var/shuttle_call/shuttle_calls[0] /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/communications/attack_paw(var/mob/user as mob) - return src.attack_hand(user) - /obj/machinery/computer/communications/attack_hand(var/mob/user as mob) if(..(user)) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 03eb5db3dab..c1ec8fb3ddf 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -141,20 +141,6 @@ src.attack_hand(user) return -/obj/machinery/computer/attack_paw(mob/living/user) - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - if(circuit) - if(prob(10)) - user.visible_message("[user.name] smashes the [src.name] with its paws.",\ - "You smash the [src.name] with your paws.",\ - "You hear a smashing sound.") - set_broken() - return - user.visible_message("[user.name] smashes against the [src.name] with its paws.",\ - "You smash against the [src.name] with your paws.",\ - "You hear a clicking sound.") - /obj/machinery/computer/attack_alien(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 1b094542a42..ab8a43b4973 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -21,8 +21,6 @@ /obj/machinery/computer/med_data/attack_ai(user as mob) return src.attack_hand(user) -/obj/machinery/computer/med_data/attack_paw(user as mob) - return src.attack_hand(user) /obj/machinery/computer/med_data/attack_hand(mob/user as mob) if(..()) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index a813e8d63de..e8b160d26f9 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -120,10 +120,6 @@ return attack_hand(user) -/obj/machinery/computer/pod/attack_paw(var/mob/user as mob) - return attack_hand(user) - - /obj/machinery/computer/pod/attack_hand(var/mob/user as mob) if(..()) return diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm index 5de9643fd7d..5e5a4b8df9c 100644 --- a/code/game/machinery/computer/pod_tracking_console.dm +++ b/code/game/machinery/computer/pod_tracking_console.dm @@ -9,9 +9,6 @@ /obj/machinery/computer/podtracker/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/podtracker/attack_paw(var/mob/user as mob) - return src.attack_hand(user) - /obj/machinery/computer/podtracker/attack_hand(var/mob/user as mob) if(..()) return diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index a19bc96211d..4e8ad7498f0 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -31,9 +31,6 @@ var/prison_shuttle_timeleft = 0 return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return src.attack_hand(user) - attackby(I as obj, user as mob, params) if(istype(I, /obj/item/weapon/screwdriver)) diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm index 5e0feda0c20..9c2e2b853c4 100644 --- a/code/game/machinery/computer/salvage_ship.dm +++ b/code/game/machinery/computer/salvage_ship.dm @@ -43,9 +43,6 @@ src.add_hiddenprint(user) return attack_hand(user) -/obj/machinery/computer/salvage_ship/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/computer/salvage_ship/attack_hand(mob/user as mob) if(!allowed(user)) user << "\red Access Denied" diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 4432de9d1cf..b7e009730e5 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -36,9 +36,6 @@ /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/secure_data/attack_paw(mob/user as mob) - return attack_hand(user) - //Someone needs to break down the dat += into chunks instead of long ass lines. /obj/machinery/computer/secure_data/attack_hand(mob/user as mob) if(..()) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 1717a25a92e..21f10e359fc 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -34,9 +34,6 @@ /obj/machinery/computer/skills/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/skills/attack_paw(mob/user as mob) - return attack_hand(user) - //Someone needs to break down the dat += into chunks instead of long ass lines. /obj/machinery/computer/skills/attack_hand(mob/user as mob) if(..()) diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 3f92848f4cd..4c765ecc1b3 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -250,9 +250,6 @@ var/specops_shuttle_timeleft = 0 user << "\red Access Denied." return 1 -/obj/machinery/computer/specops_shuttle/attack_paw(var/mob/user as mob) - return attack_hand(user) - /obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/weapon/card/emag)) user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm index 6578eaf8673..2950ca87f11 100644 --- a/code/game/machinery/computer/store.dm +++ b/code/game/machinery/computer/store.dm @@ -13,8 +13,6 @@ /obj/machinery/computer/merch/New() ..() -/obj/machinery/computer/merch/attack_paw(mob/user as mob) - return attack_hand(user) /obj/machinery/computer/merch/attack_ai(mob/user as mob) src.add_hiddenprint(user) diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 45455b9c663..5ddc7fcaf13 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -184,9 +184,6 @@ var/syndicate_elite_shuttle_timeleft = 0 user << "\red Access Denied." return 1 -/obj/machinery/computer/syndicate_elite_shuttle/attack_paw(var/mob/user as mob) - return attack_hand(user) - /obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/weapon/card/emag)) user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." diff --git a/code/game/machinery/computer/xenos_shuttle.dm b/code/game/machinery/computer/xenos_shuttle.dm index 343c2717b76..0577b0aca7d 100644 --- a/code/game/machinery/computer/xenos_shuttle.dm +++ b/code/game/machinery/computer/xenos_shuttle.dm @@ -24,11 +24,11 @@ moving = 1 lastMove = world.time - + for(var/obj/machinery/door/airlock/alien/A in world) A.close() A.locked = 1 - A.update_icon() + A.update_icon() for(var/mob/M in curr_location) if(M.client) @@ -41,20 +41,20 @@ shake_camera(M, 10, 1) if(istype(M, /mob/living/carbon) && !isalien(M)) if(!M.buckled) - M.Weaken(3) - + M.Weaken(3) + if(curr_location.z != dest_location.z) var/area/transit_location = locate(/area/xenos_station/transit) curr_location.move_contents_to(transit_location) curr_location = transit_location sleep(XENOS_SHUTTLE_MOVE_TIME) - + for(var/obj/machinery/door/airlock/alien/A in world) A.close() - if(dest_location != locate(/area/xenos_station/start)) + if(dest_location != locate(/area/xenos_station/start)) A.locked = 0 - A.update_icon() - + A.update_icon() + var/list/dstturfs = list() var/throwy = world.maxy @@ -78,7 +78,7 @@ for(var/mob/living/simple_animal/pest in dest_location) // And for the other kind of bug... pest.gib() - + curr_location.move_contents_to(dest_location) curr_location = dest_location moving = 0 @@ -91,9 +91,6 @@ /obj/machinery/computer/xenos_station/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/xenos_station/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/computer/xenos_station/attack_alien(mob/user as mob) return attack_hand(user) @@ -101,7 +98,7 @@ if(!allowed(user)) user << "\red Access denied." return - + if(!isalien(user) && !isrobot(user) && !isAI(user)) user << "You do not know how to operate this terminal." return @@ -128,7 +125,7 @@ /obj/machinery/computer/xenos_station/Topic(href, href_list) if(..()) return 1 - + if(!isliving(usr)) return var/mob/living/user = usr @@ -142,7 +139,7 @@ else if(href_list["station_ne"]) xenos_move_to(/area/xenos_station/northeast) else if(href_list["station_e"]) - xenos_move_to(/area/xenos_station/east) + xenos_move_to(/area/xenos_station/east) else if(href_list["station_sw"]) xenos_move_to(/area/xenos_station/southwest) else if(href_list["station_se"]) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index acd88137ebb..e469e358d2e 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -37,9 +37,6 @@ else user << "Error, no route to host." -/obj/machinery/door_control/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob, params) /* For later implementation if (istype(W, /obj/item/weapon/screwdriver)) @@ -140,9 +137,6 @@ /obj/machinery/driver_button/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/driver_button/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/driver_button/attackby(obj/item/weapon/W, mob/user as mob, params) if(istype(W, /obj/item/device/detective_scanner)) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index ec411753803..e6fb2c03322 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -3,7 +3,7 @@ name = "Embedded Controller" anchored = 1 - + use_power = 1 idle_power_usage = 10 @@ -29,10 +29,6 @@ /obj/machinery/embedded_controller/attack_ai(mob/user as mob) src.ui_interact(user) -/obj/machinery/embedded_controller/attack_paw(mob/user as mob) - user << "You do not have the dexterity to use this." - return - /obj/machinery/embedded_controller/attack_hand(mob/user as mob) src.ui_interact(user) @@ -44,7 +40,7 @@ icon_state = "airlock_control_standby" power_channel = ENVIRON density = 0 - + var/id_tag //var/radio_power_use = 50 //power used to xmit signals diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 2c2458df37b..5322c3da301 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -123,9 +123,6 @@ /obj/machinery/flasher_button/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/flasher_button/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/flasher_button/attackby(obj/item/weapon/W, mob/user as mob, params) return src.attack_hand(user) diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index cd1e5a85e62..687a07ced0f 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -46,9 +46,6 @@ /obj/machinery/holosign_switch/attack_ai(mob/user as mob) return src.attack_hand(user) -/ -obj/machinery/holosign_switch/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/machinery/holosign_switch/attackby(obj/item/weapon/W, mob/user as mob, params) if(istype(W, /obj/item/device/detective_scanner)) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 598d448d746..434c4d17336 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -13,10 +13,6 @@ /obj/machinery/igniter/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/igniter/attack_paw(mob/user as mob) - if ((ticker && ticker.mode.name == "monkey")) - return src.attack_hand(user) - return /obj/machinery/igniter/attack_hand(mob/user as mob) if(..()) @@ -122,9 +118,6 @@ /obj/machinery/ignition_switch/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/ignition_switch/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/ignition_switch/attackby(obj/item/weapon/W, mob/user as mob, params) return src.attack_hand(user) diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index e815ffc3257..00da3c157d7 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -164,9 +164,6 @@ else src.overlays += image('icons/obj/kitchen.dmi', "gridle") -/obj/machinery/gibber/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/gibber/relaymove(mob/user as mob) if(locked) return diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm index bf963ea3c0d..2df46989506 100644 --- a/code/game/machinery/kitchen/juicer.dm +++ b/code/game/machinery/kitchen/juicer.dm @@ -60,9 +60,6 @@ src.updateUsrDialog() return 0 -/obj/machinery/juicer/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/juicer/attack_ai(mob/user as mob) return 0 diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 1fba31f1da9..dc4e21f9296 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -183,9 +183,6 @@ return 1 src.updateUsrDialog() -/obj/machinery/microwave/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/microwave/attack_ai(mob/user as mob) return 0 diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 523f52bdff2..d1354d17c9d 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -133,9 +133,6 @@ updateUsrDialog() -/obj/machinery/smartfridge/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/smartfridge/attack_ai(mob/user as mob) return 0 diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 666c49c3e8d..2edd028bde1 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -43,9 +43,6 @@ usr << "A light switch. It is [on? "on" : "off"]." -/obj/machinery/light_switch/attack_paw(mob/user) - src.attack_hand(user) - /obj/machinery/light_switch/attack_hand(mob/user) on = !on diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index a68fe87f068..9651d57e461 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -322,9 +322,6 @@ Class Procs: else return src.attack_hand(user) -/obj/machinery/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/attack_hand(mob/user as mob) if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT)) return 1 diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index bb5c005550a..282ea222d8f 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -744,10 +744,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co return src.attack_hand(user) //or maybe it'll have some special functions? No idea. -/obj/machinery/newscaster/attack_paw(mob/user as mob) - user << "The newscaster controls are far too complicated for your tiny brain!" - return - /obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) if(photo) if(!issilicon(user)) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index d7b47e15aeb..43050cab6ae 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -7,9 +7,6 @@ var/unwrenched = 0 var/wait = 0 -/obj/machinery/pipedispenser/attack_paw(user as mob) - return src.attack_hand(user) - /obj/machinery/pipedispenser/attack_hand(user as mob) if(..()) return diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 944aa0ee312..4ff221e58f5 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -60,9 +60,6 @@ use_power = 1 update_icon() -/obj/machinery/recharger/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/recharger/process() if(stat & (NOPOWER|BROKEN) || !anchored) return diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 504f7ef8956..4465fdccf81 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -40,9 +40,6 @@ else stat |= NOPOWER -/obj/machinery/robotic_fabricator/attack_paw(user as mob) - return src.attack_hand(user) - /obj/machinery/robotic_fabricator/attack_hand(user as mob) var/dat if (..()) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 957111ea9d4..3aea4a33a6d 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -562,10 +562,6 @@ return src.attack_hand(user) -/obj/machinery/suit_storage_unit/attack_paw(mob/user as mob) - user << "The console controls are far too complicated for your tiny brain!" - return - //////////////////////////////REMINDER: Make it lock once you place some fucker inside. @@ -627,10 +623,6 @@ /obj/machinery/suit_cycler/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/suit_cycler/attack_paw(mob/user as mob) - user << "\blue The console controls are far too complicated for your tiny brain!" - return - /obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob, params) if(electrified != 0) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 7b69d8fdee2..c472711e159 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -394,9 +394,6 @@ /obj/machinery/vending/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/vending/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/machinery/vending/attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 356936dbe81..a4832793c7e 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -524,9 +524,6 @@ src.log_append_to_last("Armor saved.") return -/obj/mecha/attack_paw(mob/living/user as mob) - return src.attack_hand(user) - /obj/mecha/attack_alien(mob/living/user as mob) src.log_message("Attack by alien. Attacker - [user].",1) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index c4965210c95..f88992671ca 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -12,9 +12,6 @@ attack_ai(var/mob/user as mob) return src.attack_hand(user) - attack_paw(var/mob/user as mob) - return src.attack_hand(user) - attack_hand(var/mob/user as mob) if(..()) return diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 82886f9f7c5..cac20a32362 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -119,10 +119,6 @@ healthcheck() -/obj/structure/alien/resin/attack_paw(mob/user) - return attack_hand(user) - - /obj/structure/alien/resin/attack_alien(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -314,7 +310,7 @@ Grow() -/obj/structure/alien/egg/attack_paw(mob/user) +/obj/structure/alien/egg/attack_alien(mob/user) if(isalien(user)) switch(status) if(BURST) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index b73c5bf8f1f..cf41bb42fd0 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -1105,10 +1105,6 @@ steam.start() -- spawns the effect if(metal==1 || prob(50)) del(src) - attack_paw(var/mob/user) - attack_hand(user) - return - attack_hand(var/mob/user) if ((HULK in user.mutations) || (prob(75 - metal*25))) user << "\blue You smash through the metal foam wall." diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 91eb8b450bf..2121cae8c43 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -165,7 +165,7 @@ return 1 -/obj/item/attack_paw(mob/user as mob) +/obj/item/attack_alien(mob/user as mob) if(isalien(user)) // -- TLE var/mob/living/carbon/alien/A = user diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index a76d8c1cdeb..48adb04c988 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -40,9 +40,6 @@ spawn (0) attack_self(user) -/obj/item/device/radio/intercom/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/item/device/radio/intercom/attack_hand(mob/user as mob) add_fingerprint(user) spawn (0) diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm index b9d21b36934..95430e24238 100644 --- a/code/game/objects/items/policetape.dm +++ b/code/game/objects/items/policetape.dm @@ -172,9 +172,6 @@ var/list/tape_roll_applications = list() else breaktape(/obj/item/weapon/soap, user)//cant be null, and can't be sharp. -/obj/item/tape/attack_paw(mob/user as mob) - breaktape(/obj/item/weapon/wirecutters,user) - /obj/item/tape/attack_alien(mob/user as mob) breaktape(/obj/item/weapon/wirecutters,user) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 659cc938e2f..e0946240530 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -26,9 +26,6 @@ buf.dna.ResetSE() SetValue(value) -/obj/item/weapon/dnainjector/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/item/weapon/dnainjector/proc/GetRealBlock(var/selblock) if(selblock==0) return block diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index fb9bc8d0ab6..b475e99ad3e 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -102,6 +102,3 @@ /obj/item/weapon/grenade/attack_hand() walk(src, null, null) ..() - -/obj/item/weapon/grenade/attack_paw(mob/user as mob) - return attack_hand(user) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 3b37a08299c..1c4936112a2 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -193,10 +193,6 @@ LINEN BINS -/obj/structure/bedsheetbin/attack_paw(mob/user as mob) - return attack_hand(user) - - /obj/structure/bedsheetbin/attack_hand(mob/user as mob) if(amount >= 1) amount-- diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 8e4be5bd8f7..ce4729c3a03 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -328,10 +328,6 @@ spawn(30) lastbang = 0 - -/obj/structure/closet/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/structure/closet/attack_hand(mob/user as mob) src.add_fingerprint(user) src.toggle(user) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 14807277647..ca6c64318f2 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -183,10 +183,6 @@ usr << "\blue The [src.name] is closed." update_icon() - attack_paw(mob/user as mob) - attack_hand(user) - return - attack_ai(mob/user as mob) if(src.smashed) user << "\red The security of the cabinet is compromised." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 9dd81f658ec..c237650d21e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -100,9 +100,6 @@ else src.toggle(user) -/obj/structure/closet/secure_closet/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/structure/closet/secure_closet/verb/verb_togglelock() set src in oview(1) // One square distance set category = "Object" diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index b7f18ced386..f89ed09d6bb 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -72,7 +72,7 @@ desc = "A display case for the captain's antique laser gun. It taunts you to kick it." /obj/structure/displaycase/captains_laser/New() - req_access = list(access_captain) + req_access = list(access_captain) locked = 1 spawn(5) occupant = new /obj/item/weapon/gun/energy/laser/captain(src) @@ -217,8 +217,6 @@ occupant=W update_icon() -/obj/structure/displaycase/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/structure/displaycase/attack_hand(mob/user as mob) if (destroyed) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 74070214bd8..f8b3317253a 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -55,10 +55,6 @@ opened = !opened update_icon() -/obj/structure/extinguisher_cabinet/attack_paw(mob/user) - attack_hand(user) - return - /obj/structure/extinguisher_cabinet/update_icon() if(!opened) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index bb5838ceffd..9e66774f900 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -54,9 +54,6 @@ if(ismob(user)) shock(user, 70) -/obj/structure/grille/attack_paw(mob/living/user as mob) - attack_hand(user) - /obj/structure/grille/attack_hand(mob/living/user as mob) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 5d4eab9c35b..e75625b6a78 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -67,9 +67,6 @@ //world << "glass at [x],[y],[z] Mhit" deflate(1) - attack_paw(mob/user as mob) - return attack_generic(user, 15) - attack_hand(mob/user as mob) add_fingerprint(user) return @@ -184,9 +181,6 @@ if(get_dist(user,src) <= 1) //not remotely though return TryToSwitchState(user) - attack_paw(mob/user as mob) - return TryToSwitchState(user) - attack_hand(mob/user as mob) return TryToSwitchState(user) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index dfcb2f58270..8a431c43ac1 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -66,8 +66,5 @@ add_fingerprint(user) -/obj/structure/ladder/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/structure/ladder/attackby(obj/item/weapon/W, mob/user as mob, params) return attack_hand(user) \ No newline at end of file diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 5b6acef00ec..229fe4e9055 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -72,9 +72,6 @@ ..() return -/obj/structure/lamarr/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/structure/lamarr/attack_hand(mob/user as mob) if (src.destroyed) return diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 56e589ea1ae..51b0cfb5ea6 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -44,9 +44,6 @@ if(get_dist(user,src) <= 1) //not remotely though return TryToSwitchState(user) - attack_paw(mob/user as mob) - return TryToSwitchState(user) - attack_hand(mob/user as mob) return TryToSwitchState(user) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index c591c75b0e3..ce743717f32 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -27,13 +27,13 @@ if(src.contents.len) var/mob/living/M = locate() in contents - + var/obj/structure/closet/body_bag/B = locate() in contents if(M==null) M = locate() in B if(M) var/mob/dead/observer/G = M.get_ghost() - + if(M.client) src.icon_state = "morgue3" else if(G && G.client) //There is a ghost and it is connected to the server @@ -73,8 +73,6 @@ /obj/structure/morgue/alter_health() return src.loc -/obj/structure/morgue/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/structure/morgue/attack_hand(mob/user as mob) if (src.connected) @@ -155,8 +153,6 @@ anchored = 1.0 throwpass = 1 -/obj/structure/m_tray/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/structure/m_tray/attack_hand(mob/user as mob) if (src.connected) @@ -240,8 +236,6 @@ /obj/structure/crematorium/alter_health() return src.loc -/obj/structure/crematorium/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/structure/crematorium/attack_hand(mob/user as mob) // if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH @@ -375,9 +369,6 @@ anchored = 1.0 throwpass = 1 -/obj/structure/c_tray/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/structure/c_tray/attack_hand(mob/user as mob) if (src.connected) for(var/atom/movable/A as mob|obj in src.loc) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 5d6dac37720..b19876e2e8e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -30,9 +30,6 @@ ..() return -/obj/structure/stool/bed/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/structure/stool/bed/attack_hand(mob/user as mob) manual_unbuckle(user) return diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 523aa5a8e7a..520f951bca3 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -294,13 +294,6 @@ if(prob(75)) destroy() -/obj/structure/table/attack_paw(mob/living/user) - if(HULK in user.mutations) - user.do_attack_animation(src) - user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - visible_message("[user] smashes the [src] apart!") - destroy() - /obj/structure/table/attack_alien(mob/living/user) user.do_attack_animation(src) @@ -923,13 +916,6 @@ destroy() -/obj/structure/rack/attack_paw(mob/living/user) - if(HULK in user.mutations) - user.do_attack_animation(src) - user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - visible_message("[user] smashes [src] apart!") - destroy() - /obj/structure/rack/attack_alien(mob/living/user) user.do_attack_animation(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0ff0b69658e..603792c68c7 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -148,9 +148,6 @@ var/global/wcColored return -/obj/structure/window/attack_paw(mob/user as mob) - return attack_hand(user) - /obj/structure/window/proc/attack_generic(mob/living/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 307696a3a26..c7441526ab9 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -194,10 +194,6 @@ var/list/wood_icons = list("wood","wood-broken") else return 0 - -/turf/simulated/floor/attack_paw(mob/user as mob) - return src.attack_hand(user) - /turf/simulated/floor/attack_hand(mob/user as mob) if (is_light_floor()) var/obj/item/stack/tile/light/T = floor_tile diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 275a247d945..482979bc0e2 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -252,22 +252,6 @@ //Interactions -/turf/simulated/wall/attack_paw(mob/living/user as mob) - user.changeNext_move(CLICK_CD_MELEE) - if ((HULK in user.mutations)) - user.do_attack_animation(src) - if (prob(40)) - usr << text("\blue You smash through the wall.") - usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - dismantle_wall(1) - return - else - usr << text("\blue You punch the wall.") - take_damage(rand(25, 75)) - return - - return src.attack_hand(user) - /turf/simulated/wall/attack_animal(var/mob/living/simple_animal/M) M.changeNext_move(CLICK_CD_MELEE) M.do_attack_animation(src) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index de8201d1595..9d021fa6da2 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -27,9 +27,6 @@ else set_light(0) -/turf/space/attack_paw(mob/user as mob) - return src.attack_hand(user) - /turf/space/attack_hand(mob/user as mob) if ((user.restrained() || !( user.pulling ))) return @@ -343,4 +340,4 @@ proc/setup_map_transitions() //listamania else S.transition = directions[Z_NORTH] - S.Assign_Destination() + S.Assign_Destination() diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 74cd160a86b..cd36c4a1bb5 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -3,9 +3,6 @@ icon = 'icons/turf/floors.dmi' icon_state = "Floor3" -/turf/unsimulated/floor/attack_paw(user as mob) - return src.attack_hand(user) - /turf/unsimulated/floor/attack_hand(var/mob/user as mob) if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) return diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index 14bc5b8e413..c66c6504ad4 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -276,8 +276,6 @@ else user << "\blue \The [src] is fully repaired!" -/obj/spacepod/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/spacepod/attack_hand(mob/user as mob) if(!hatch_open) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index cd3e75e4ce5..72fcc6d4f53 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -16,15 +16,6 @@ icon_state = "gag" w_class = 1 -//Monkeys can not take the muzzle off of themself! Call PETA! -/obj/item/clothing/mask/muzzle/attack_paw(mob/user as mob) - if (src == user.wear_mask) - return - else - ..() - return - - /obj/item/clothing/mask/surgical name = "sterile mask" desc = "A sterile mask designed to help prevent the spread of diseases." diff --git a/code/modules/food/candy_maker.dm b/code/modules/food/candy_maker.dm index 7e12fc327bf..b9afb48ad77 100644 --- a/code/modules/food/candy_maker.dm +++ b/code/modules/food/candy_maker.dm @@ -183,9 +183,6 @@ return 1 src.updateUsrDialog() -/obj/machinery/candy_maker/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/candy_maker/attack_ai(mob/user as mob) return 0 diff --git a/code/modules/food/grill_new.dm b/code/modules/food/grill_new.dm index ee8bd4bf460..43914a63967 100644 --- a/code/modules/food/grill_new.dm +++ b/code/modules/food/grill_new.dm @@ -186,9 +186,6 @@ return 1 src.updateUsrDialog() -/obj/machinery/grill/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/grill/attack_ai(mob/user as mob) return 0 diff --git a/code/modules/food/icecream_vat.dm b/code/modules/food/icecream_vat.dm index 19101f5b8e1..e71afb26482 100644 --- a/code/modules/food/icecream_vat.dm +++ b/code/modules/food/icecream_vat.dm @@ -180,9 +180,6 @@ /obj/machinery/icemachine/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/icemachine/attack_paw(mob/user) - return attack_hand(user) - /obj/machinery/icemachine/proc/show_toppings() var/dat = "" diff --git a/code/modules/food/oven_new.dm b/code/modules/food/oven_new.dm index 7d6022ae9ae..136b26a5bd0 100644 --- a/code/modules/food/oven_new.dm +++ b/code/modules/food/oven_new.dm @@ -186,9 +186,6 @@ return 1 src.updateUsrDialog() -/obj/machinery/oven/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/oven/attack_ai(mob/user as mob) return 0 diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm index 16b7a17721c..6c670bc7fe5 100644 --- a/code/modules/mob/living/carbon/alien/alien_defenses.dm +++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm @@ -62,13 +62,6 @@ In all, this is a lot like the monkey code. /N return 0 -/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M as mob) - if(..()) - if (stat != DEAD) - adjustBruteLoss(rand(1, 3)) - updatehealth() - return - /mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M as mob) if(..()) diff --git a/code/modules/mob/living/carbon/human/human_attackpaw.dm b/code/modules/mob/living/carbon/human/human_attackpaw.dm deleted file mode 100644 index 5df58e09631..00000000000 --- a/code/modules/mob/living/carbon/human/human_attackpaw.dm +++ /dev/null @@ -1,18 +0,0 @@ -/mob/living/carbon/human/attack_paw(mob/living/M as mob) - ..() - if (M.a_intent == "help") - help_shake_act(M) - else - M.do_attack_animation(src) - if (M.is_muzzled()) - return - - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!") - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - - var/damage = rand(1, 3) - var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") - var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) - apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee")) - return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 801dce4c2ef..97a9375c1f8 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -14,10 +14,6 @@ /obj/machinery/computer/drone_control/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/drone_control/attack_paw(var/mob/user as mob) - - return src.attack_hand(user) - return /obj/machinery/computer/drone_control/attack_hand(var/mob/user as mob) if(..()) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9fcea92d006..6c163c41aa3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1012,10 +1012,6 @@ var/list/robot_verbs_default = list( user.visible_message("[user] pets [src]!", \ "You pet [src]!") -/mob/living/silicon/robot/attack_paw(mob/user) - - return attack_hand(user) - /mob/living/silicon/robot/proc/allowed(mob/M) //check if it doesn't require any access at all if(check_access(null)) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 34d7c63dbd3..827e35a428c 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -732,22 +732,4 @@ /mob/living/simple_animal/parrot/proc/parrot_hear(var/message="") if(!message || stat) return - speech_buffer.Add(message) - -/mob/living/simple_animal/parrot/attack_paw(var/mob/user, var/damage, var/attack_message) - - var/success = ..() - - if(client) - return success - - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - if(!success) - return 0 - - parrot_interest = user - parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless - icon_state = "parrot_fly" - return success + speech_buffer.Add(message) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index 52ac279ccce..2b6fab41b8e 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -197,8 +197,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, ..() return -/obj/structure/tribble_cage/attack_paw(mob/user as mob) - return src.attack_hand(user) /obj/structure/tribble_cage/attack_hand(mob/user as mob) if (src.destroyed) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 67d1eacab72..6c567772b99 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -47,10 +47,6 @@ add_fingerprint(M) -/obj/item/weapon/paper_bin/attack_paw(mob/user as mob) - return attack_hand(user) - - /obj/item/weapon/paper_bin/attack_hand(mob/user as mob) if (ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index eaa8bbd1246..e86b0ec9756 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -77,9 +77,6 @@ icon_state = "stamp-cent" _color = "internalaffairs" -/obj/item/weapon/stamp/attack_paw(mob/user as mob) - return attack_hand(user) - // Syndicate stamp to forge documents. /obj/item/weapon/stamp/chameleon/attack_self(mob/user as mob) diff --git a/code/modules/power/engine.dm b/code/modules/power/engine.dm index c07e10ce150..50473d3e445 100644 --- a/code/modules/power/engine.dm +++ b/code/modules/power/engine.dm @@ -1,5 +1,3 @@ -/turf/simulated/floor/engine/attack_paw(var/mob/user as mob) - return src.attack_hand(user) /turf/simulated/floor/engine/attack_hand(var/mob/user as mob) if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index b85e5a7c4c0..f23db641632 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -250,9 +250,6 @@ /obj/machinery/chem_dispenser/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/chem_dispenser/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/chem_dispenser/attack_hand(mob/user as mob) if(stat & BROKEN) return @@ -636,9 +633,6 @@ /obj/machinery/chem_master/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/chem_master/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/chem_master/attack_hand(mob/user as mob) if(stat & BROKEN) return @@ -1114,9 +1108,6 @@ src.updateUsrDialog() return 0 -/obj/machinery/reagentgrinder/attack_paw(mob/user as mob) - return src.attack_hand(user) - /obj/machinery/reagentgrinder/attack_ai(mob/user as mob) return 0 diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index c3020926188..1425d769073 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -602,13 +602,11 @@ datum/reagent/atrazine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volu H.adjustToxLoss(50) ..() return - if(issmall(M)) - var/mob/living/carbon/monkey/MO = M - if(MO.dna) - if(istype(MO,/mob/living/carbon/alien/diona)) //plantmen monkeys (diona) take EVEN MORE damage - MO.adjustToxLoss(100) - ..() - return + else if(istype(M,/mob/living/carbon/alien/diona)) //plantmen monkeys (diona) take EVEN MORE damage + var/mob/living/carbon/alien/diona/D = M + D.adjustToxLoss(100) + ..() + return /datum/chemical_reaction/atrazine name = "atrazine" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index e5a49cc9680..e24378fb137 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -16,10 +16,6 @@ slot_flags = SLOT_BELT var/ignore_flags = 0 -/obj/item/weapon/reagent_containers/hypospray/attack_paw(mob/user as mob) - return src.attack_hand(user) - - /obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user) if(!reagents.total_volume) user << "\red [src] is empty." diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 178662d4fb8..b2cf9c268ed 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -25,10 +25,6 @@ user << "The station AI is not to interact with these devices." return -/obj/machinery/keycard_auth/attack_paw(mob/user as mob) - user << "You are too primitive to use this device." - return - /obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(stat & (NOPOWER|BROKEN)) user << "This device is not powered." @@ -57,7 +53,7 @@ /obj/machinery/keycard_auth/attack_hand(mob/user as mob) ui_interact(user) - + /obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(user.stat || stat & (NOPOWER|BROKEN)) user << "This device is not powered." @@ -67,7 +63,7 @@ return user.set_machine(src) - + var/data[0] data["screen"] = screen data["event"] = event @@ -77,12 +73,12 @@ if((type in ert_chosen)) active = 1 data["erttypes"] += list(list("name" = type, "active" = active)) - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320) - ui.set_initial_data(data) - ui.open() + ui.set_initial_data(data) + ui.open() /obj/machinery/keycard_auth/Topic(href, href_list) if(..()) @@ -184,7 +180,7 @@ var/global/maint_all_access = 0 world << "Attention!" world << "The maintenance access requirement has been revoked on all airlocks." maint_all_access = 1 - + /proc/revoke_maint_all_access() for(var/area/maintenance/A in world) for(var/obj/machinery/door/airlock/D in A) diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 192449d7735..89b30243c3f 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -69,9 +69,6 @@ else ..() -/obj/machinery/shield_capacitor/attack_paw(user as mob) - return src.attack_hand(user) - /obj/machinery/shield_capacitor/attack_ai(user as mob) return src.attack_hand(user) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 97375aa9c26..030f852d08a 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -77,9 +77,6 @@ else ..() -/obj/machinery/shield_gen/attack_paw(user as mob) - return src.attack_hand(user) - /obj/machinery/shield_gen/attack_ai(user as mob) return src.attack_hand(user) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 6d53a63aa10..b4bff7b37f2 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -50,10 +50,6 @@ for(var/i = 1; i <= starting_crystals; i++) crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals -/obj/machinery/computer/telescience/attack_paw(mob/user) - user << "You are too primitive to use this computer." - return - /obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/bluespace_crystal)) if(crystals.len >= max_crystals) @@ -80,7 +76,7 @@ updateUsrDialog() else ..() - + /obj/machinery/computer/telescience/emag_act(user as mob) if (!emagged) user << "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!" diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index df27fdfb841..054f56c8cd4 100644 --- a/code/modules/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -37,11 +37,6 @@ /obj/machinery/computer/curer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/curer/attack_paw(var/mob/user as mob) - - return src.attack_hand(user) - return - /obj/machinery/computer/curer/attack_hand(var/mob/user as mob) if(..()) return diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index d1938d6cdb1..5a407e37908 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -36,9 +36,6 @@ /obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/diseasesplicer/attack_paw(var/mob/user as mob) - return src.attack_hand(user) - /obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob) if(..()) return ui_interact(user) diff --git a/paradise.dme b/paradise.dme index 4ec576d4155..9ff202b6e76 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1307,7 +1307,6 @@ #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_attackalien.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_attackpaw.dm" #include "code\modules\mob\living\carbon\human\human_damage.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\human_defines.dm" From fa5e97deb5531792a48c682a9a25e6f9fa87f309 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 May 2015 20:35:35 -0400 Subject: [PATCH 04/16] Missing dmis, final fixes --- code/controllers/hooks-defs.dm | 2 +- code/game/dna/genes/monkey.dm | 2 +- code/game/gamemodes/mutiny/mutiny_hooks.dm | 2 +- code/modules/hydroponics/seed.dm | 2 +- code/modules/hydroponics/seed_datums.dm | 2 +- code/modules/hydroponics/seed_mobs.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 4 +- .../mob/living/carbon/alien/diona/diona.dm | 34 --------- .../carbon/alien/diona/diona_attacks.dm | 7 -- .../living/carbon/alien/diona/diona_powers.dm | 69 ------------------ .../mob/living/carbon/alien/diona/life.dm | 22 ------ .../living/carbon/alien/diona/progression.dm | 19 ----- .../carbon/alien/diona/say_understands.dm | 6 -- .../living/carbon/alien/diona/update_icons.dm | 8 -- code/modules/mob/living/carbon/human/say.dm | 2 +- .../living/carbon/human/species/station.dm | 6 +- .../{alien/diona => primitive}/dionaold.dm | 48 ++++++------ code/modules/mob/mob_grab.dm | 2 +- code/modules/mob/transform_procs.dm | 2 +- code/modules/organs/organ_alien.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/reagents/newchem/toxins.dm | 4 +- icons/effects/species.dmi | Bin 26747 -> 29511 bytes icons/mob/dam_human.dmi | Bin 23764 -> 0 bytes icons/mob/dam_mask.dmi | Bin 1251 -> 0 bytes icons/mob/uniform.dmi | Bin 287670 -> 288425 bytes icons/obj/clothing/uniforms.dmi | Bin 69908 -> 70214 bytes icons/obj/objects.dmi | Bin 131206 -> 133799 bytes paradise.dme | 8 +- 29 files changed, 43 insertions(+), 214 deletions(-) delete mode 100644 code/modules/mob/living/carbon/alien/diona/diona.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/diona_attacks.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/diona_powers.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/life.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/progression.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/say_understands.dm delete mode 100644 code/modules/mob/living/carbon/alien/diona/update_icons.dm rename code/modules/mob/living/carbon/{alien/diona => primitive}/dionaold.dm (83%) delete mode 100644 icons/mob/dam_human.dmi delete mode 100644 icons/mob/dam_mask.dmi diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index fafb898de6a..0d283a3e5ba 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -54,7 +54,7 @@ /** * Podman hook. * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/alien/diona + * Parameters: var/mob/living/carbon/primitive/diona */ /hook/harvest_podman diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 699d40e40bc..51e998603c9 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -79,7 +79,7 @@ return for(var/obj/item/W in H) - H.drop_from_inventory(W) + H.unEquip(W) H.set_species(H.species.greater_form) H << "You are now [H.species.name]. " diff --git a/code/game/gamemodes/mutiny/mutiny_hooks.dm b/code/game/gamemodes/mutiny/mutiny_hooks.dm index 5fdc1ec01b5..14766e520ec 100644 --- a/code/game/gamemodes/mutiny/mutiny_hooks.dm +++ b/code/game/gamemodes/mutiny/mutiny_hooks.dm @@ -12,7 +12,7 @@ mode.update_icon(H.mind) return 1 -/hook/harvest_podman/proc/update_icon(mob/living/carbon/alien/diona/D) +/hook/harvest_podman/proc/update_icon(mob/living/carbon/primitive/diona/D) var/datum/game_mode/mutiny/mode = get_mutiny_mode() if (!mode) return 1 diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 1919da66b69..ac8b5e0d33e 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -728,7 +728,7 @@ else product = new /obj/item/weapon/reagent_containers/food/snacks/grown(get_turf(user),name) if(get_trait(TRAIT_PRODUCT_COLOUR)) - if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/alien/diona)) + if(!has_mob_product || (has_mob_product && has_mob_product != /mob/living/carbon/primitive/diona)) product.color = get_trait(TRAIT_PRODUCT_COLOUR) if(istype(product,/obj/item/weapon/reagent_containers/food)) var/obj/item/weapon/reagent_containers/food/food = product diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index e70b16a4a69..2fe08928a62 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -1055,7 +1055,7 @@ seed_noun = "nodes" display_name = "replicant pods" can_self_harvest = 1 - has_mob_product = /mob/living/carbon/alien/diona + has_mob_product = /mob/living/carbon/primitive/diona /datum/seed/diona/New() ..() diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index 8d5d26df12b..d00baff79d7 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -69,7 +69,7 @@ host << "\green You awaken slowly, stirring into sluggish motion as the air caresses you." // This is a hack, replace with some kind of species blurb proc. - if(istype(host,/mob/living/carbon/alien/diona)) + if(istype(host,/mob/living/carbon/primitive/diona)) host << "You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." host << "Too much darkness will send you into shock and starve you, but light will help you heal." diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 374cd73ac8c..da6cf21d909 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -138,8 +138,8 @@ return ..() /obj/machinery/portable_atmospherics/hydroponics/proc/attack_generic(var/mob/user) - if(istype(user,/mob/living/carbon/alien/diona)) - var/mob/living/carbon/alien/diona/nymph = user + if(istype(user,/mob/living/carbon/primitive/diona)) + var/mob/living/carbon/primitive/diona/nymph = user if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained()) return diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm deleted file mode 100644 index 981e2507494..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ /dev/null @@ -1,34 +0,0 @@ -/mob/living/carbon/alien/diona - name = "diona nymph" - voice_name = "diona nymph" - adult_form = /mob/living/carbon/human - speak_emote = list("chirrups") - icon_state = "nymph" - language = "Rootspeak" - - universal_understand = 1 - universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. - holder_type = /obj/item/weapon/holder/diona - -/mob/living/carbon/alien/diona/New() - - ..() - species = all_species["Diona"] - verbs += /mob/living/carbon/alien/diona/proc/merge - -/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM) - //TODO: Collapse these checks into one proc (see pai and drone) - if(istype(AM,/obj/item)) - var/obj/item/O = AM - if(O.w_class > 2) - src << "You are too small to pull that." - return - else - ..() - else - src << "You are too small to pull that." - return - -/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. - W.loc = get_turf(src) - return 1 diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm deleted file mode 100644 index 5490d33fcbc..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ /dev/null @@ -1,7 +0,0 @@ -/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M as mob) - if(istype(M) && M.a_intent == "help") - if(M.species && M.species.name == "Diona" && do_merge(M)) - return - get_scooped(M) - return - ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm deleted file mode 100644 index 54678e1ea01..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ /dev/null @@ -1,69 +0,0 @@ -//Verbs after this point. -/mob/living/carbon/alien/diona/proc/merge() - - set category = "Abilities" - set name = "Merge with gestalt" - set desc = "Merge with another diona." - - if(stat == DEAD || paralysis || weakened || stunned || restrained()) - return - - if(istype(src.loc,/mob/living/carbon)) - src.verbs -= /mob/living/carbon/alien/diona/proc/merge - return - - var/list/choices = list() - for(var/mob/living/carbon/C in view(1,src)) - - if(!(src.Adjacent(C)) || !(C.client)) continue - - if(istype(C,/mob/living/carbon/human)) - var/mob/living/carbon/human/D = C - if(D.species && D.species.name == "Diona") - choices += C - - var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices - - if(!M) - src << "There is nothing nearby to merge with." - else if(!do_merge(M)) - src << "You fail to merge with \the [M]..." - -/mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H) - if(!istype(H) || !src || !(src.Adjacent(H))) - return 0 - H << "You feel your being twine with that of \the [src] as it merges with your biomass." - H.status_flags |= PASSEMOTES - src << "You feel your being twine with that of \the [H] as you merge with its biomass." - loc = H - verbs += /mob/living/carbon/alien/diona/proc/split - verbs -= /mob/living/carbon/alien/diona/proc/merge - return 1 - -/mob/living/carbon/alien/diona/proc/split() - - set category = "Abilities" - set name = "Split from gestalt" - set desc = "Split away from your gestalt as a lone nymph." - - if(stat == DEAD || paralysis || weakened || stunned || restrained()) - return - - if(!(istype(src.loc,/mob/living/carbon))) - src.verbs -= /mob/living/carbon/alien/diona/proc/split - return - - src.loc << "You feel a pang of loss as [src] splits away from your biomass." - src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground." - - var/mob/living/M = src.loc - - src.loc = get_turf(src) - src.verbs -= /mob/living/carbon/alien/diona/proc/split - src.verbs += /mob/living/carbon/alien/diona/proc/merge - - if(istype(M)) - for(var/atom/A in M.contents) - if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) - return - M.status_flags &= ~PASSEMOTES \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm deleted file mode 100644 index ec0dd5d7e17..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/life.dm +++ /dev/null @@ -1,22 +0,0 @@ -//Dionaea regenerate health and nutrition in light. -/mob/living/carbon/alien/diona/handle_environment(datum/gas_mixture/environment) - - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(loc)) //else, there's considered to be no light - var/turf/T = loc - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - if(L) - light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights - else - light_amount = 5 - - - nutrition += light_amount - - if(nutrition > 500) - nutrition = 500 - if(light_amount > 2) //if there's enough light, heal - adjustBruteLoss(-1) - adjustFireLoss(-1) - adjustToxLoss(-1) - adjustOxyLoss(-1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm deleted file mode 100644 index 588acea5ad8..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ /dev/null @@ -1,19 +0,0 @@ -/mob/living/carbon/alien/diona/confirm_evolution() - - if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist) - src << alert("You are currently not whitelisted to play as a full diona.") - return null - - if(amount_grown < max_grown) - src << "You are not yet ready for your growth..." - return null - - src.split() - - if(istype(loc,/obj/item/weapon/holder/diona)) - var/obj/item/weapon/holder/diona/L = loc - src.loc = L.loc - qdel(L) - - src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") - return "Diona" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/say_understands.dm b/code/modules/mob/living/carbon/alien/diona/say_understands.dm deleted file mode 100644 index 3f68a44cffb..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/say_understands.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/living/carbon/alien/diona/say_understands(var/mob/other,var/datum/language/speaking = null) - - if (istype(other, /mob/living/carbon/human) && !speaking) - if(languages.len >= 2) // They have sucked down some blood. - return 1 - return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/update_icons.dm b/code/modules/mob/living/carbon/alien/diona/update_icons.dm deleted file mode 100644 index b39972cdad3..00000000000 --- a/code/modules/mob/living/carbon/alien/diona/update_icons.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/carbon/alien/diona/update_icons() - - if(stat == DEAD) - icon_state = "[initial(icon_state)]_dead" - else if(lying || resting || stunned) - icon_state = "[initial(icon_state)]_sleep" - else - icon_state = "[initial(icon_state)]" diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 65d35e5c080..538a1dbbf50 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -190,7 +190,7 @@ //These only pertain to common. Languages are handled by mob/say_understands() if (!speaking) - if (istype(other, /mob/living/carbon/alien/diona)) + if (istype(other, /mob/living/carbon/primitive/diona)) if(other.languages.len >= 2) //They've sucked down some blood and can speak common now. return 1 if (istype(other, /mob/living/silicon)) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 2f50a1b21da..02468e8c8ab 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -388,7 +388,7 @@ ) /datum/species/diona/can_understand(var/mob/other) - var/mob/living/carbon/alien/diona/D = other + var/mob/living/carbon/primitive/diona/D = other if(istype(D)) return 1 return 0 @@ -401,14 +401,14 @@ /* //overpowered and dumb as hell; they get cloning back, though. /datum/species/diona/handle_death(var/mob/living/carbon/human/H) - var/mob/living/carbon/alien/diona/S = new(get_turf(H)) + var/mob/living/carbon/primitive/diona/S = new(get_turf(H)) if(H.mind) H.mind.transfer_to(S) else S.key = H.key - for(var/mob/living/carbon/alien/diona/D in H.contents) + for(var/mob/living/carbon/primitive/diona/D in H.contents) if(D.client) D.loc = H.loc else diff --git a/code/modules/mob/living/carbon/alien/diona/dionaold.dm b/code/modules/mob/living/carbon/primitive/dionaold.dm similarity index 83% rename from code/modules/mob/living/carbon/alien/diona/dionaold.dm rename to code/modules/mob/living/carbon/primitive/dionaold.dm index 9a0612d0a30..9024e4e49a4 100644 --- a/code/modules/mob/living/carbon/alien/diona/dionaold.dm +++ b/code/modules/mob/living/carbon/primitive/dionaold.dm @@ -3,7 +3,7 @@ */ //Mob defines. -/mob/living/carbon/monkey/diona +/mob/living/carbon/primitive/diona name = "diona nymph" voice_name = "diona nymph" speak_emote = list("chirrups") @@ -12,22 +12,22 @@ var/ready_evolve = 0 ventcrawler = 1 -/mob/living/carbon/monkey/diona/New() +/mob/living/carbon/primitive/diona/New() ..() gender = NEUTER - greaterform = "Diona" + //greaterform = "Diona" add_language("Rootspeak") -/mob/living/carbon/monkey/diona/attack_hand(mob/living/carbon/human/M as mob) +/mob/living/carbon/primitive/diona/attack_hand(mob/living/carbon/human/M as mob) //Let people pick the little buggers up. if(M.a_intent == "help") if(M.species && M.species.name == "Diona") M << "You feel your being twine with that of [src] as it merges with your biomass." src << "You feel your being twine with that of [M] as you merge with its biomass." - src.verbs += /mob/living/carbon/monkey/diona/proc/split - src.verbs -= /mob/living/carbon/monkey/diona/proc/merge + src.verbs += /mob/living/carbon/primitive/diona/proc/split + src.verbs -= /mob/living/carbon/primitive/diona/proc/merge src.loc = M else var/obj/item/weapon/holder/diona/D = new(loc) @@ -41,23 +41,23 @@ ..() -/mob/living/carbon/monkey/diona/New() +/mob/living/carbon/primitive/diona/New() ..() gender = NEUTER - greaterform = "Diona" + //greaterform = "Diona" add_language("Rootspeak") - src.verbs += /mob/living/carbon/monkey/diona/proc/merge + src.verbs += /mob/living/carbon/primitive/diona/proc/merge -/mob/living/carbon/monkey/diona/proc/merge() +/mob/living/carbon/primitive/diona/proc/merge() set category = "Diona" set name = "Merge with gestalt" set desc = "Merge with another diona." if(istype(src.loc,/mob/living/carbon)) - src.verbs -= /mob/living/carbon/monkey/diona/proc/merge + src.verbs -= /mob/living/carbon/primitive/diona/proc/merge return var/list/choices = list() @@ -80,19 +80,19 @@ src << "You feel your being twine with that of [M] as you merge with its biomass." src.loc = M - src.verbs += /mob/living/carbon/monkey/diona/proc/split - src.verbs -= /mob/living/carbon/monkey/diona/proc/merge + src.verbs += /mob/living/carbon/primitive/diona/proc/split + src.verbs -= /mob/living/carbon/primitive/diona/proc/merge else return -/mob/living/carbon/monkey/diona/proc/split() +/mob/living/carbon/primitive/diona/proc/split() set category = "Diona" set name = "Split from gestalt" set desc = "Split away from your gestalt as a lone nymph." if(!(istype(src.loc,/mob/living/carbon))) - src.verbs -= /mob/living/carbon/monkey/diona/proc/split + src.verbs -= /mob/living/carbon/primitive/diona/proc/split return src.loc << "You feel a pang of loss as [src] splits away from your biomass." @@ -101,8 +101,8 @@ var/mob/living/M = src.loc src.loc = get_turf(src) - src.verbs -= /mob/living/carbon/monkey/diona/proc/split - src.verbs += /mob/living/carbon/monkey/diona/proc/merge + src.verbs -= /mob/living/carbon/primitive/diona/proc/split + src.verbs += /mob/living/carbon/primitive/diona/proc/merge if(istype(M)) for(var/atom/A in M.contents) @@ -110,7 +110,7 @@ return M.status_flags &= ~PASSEMOTES -/mob/living/carbon/monkey/diona/verb/fertilize_plant() +/mob/living/carbon/primitive/diona/verb/fertilize_plant() set category = "Diona" set name = "Fertilize plant" @@ -129,7 +129,7 @@ target.nutrilevel = 10 src.visible_message("\red [src] secretes a trickle of green liquid from its tail, refilling [target]'s nutrient tray.","\red You secrete a trickle of green liquid from your tail, refilling [target]'s nutrient tray.") -/mob/living/carbon/monkey/diona/verb/eat_weeds() +/mob/living/carbon/primitive/diona/verb/eat_weeds() set category = "Diona" set name = "Eat Weeds" @@ -148,7 +148,7 @@ target.weedlevel = 0 src.visible_message("\red [src] begins rooting through [target], ripping out weeds and eating them noisily.","\red You begin rooting through [target], ripping out weeds and eating them noisily.") -/mob/living/carbon/monkey/diona/verb/evolve() +/mob/living/carbon/primitive/diona/verb/evolve() set category = "Diona" set name = "Evolve" @@ -188,7 +188,7 @@ del(src) -/mob/living/carbon/monkey/diona/verb/steal_blood() +/mob/living/carbon/primitive/diona/verb/steal_blood() set category = "Diona" set name = "Steal Blood" set desc = "Take a blood sample from a suitable donor." @@ -218,7 +218,7 @@ spawn(25) update_progression() -/mob/living/carbon/monkey/diona/proc/update_progression() +/mob/living/carbon/primitive/diona/proc/update_progression() if(!donors.len) return @@ -233,11 +233,11 @@ src << "\green The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind." -/mob/living/carbon/monkey/diona/put_in_hands(obj/item/W) +/mob/living/carbon/primitive/diona/put_in_hands(obj/item/W) W.loc = get_turf(src) W.layer = initial(W.layer) W.dropped() -/mob/living/carbon/monkey/diona/put_in_active_hand(obj/item/W) +/mob/living/carbon/primitive/diona/put_in_active_hand(obj/item/W) src << "\red You don't have any hands!" return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 2430e027f87..cd4b79a4f58 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -382,7 +382,7 @@ if(isalien(attacker) && iscarbon(prey)) //Xenomorphs eating carbon mobs return 1 - if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/alien/diona)) //Kidan eating nymphs + if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/primitive/diona)) //Kidan eating nymphs return 1 if(ishuman(attacker) && attacker.get_species() == "Tajaran" && istype(prey,/mob/living/simple_animal/mouse)) //Tajaran eating mice. Meow! diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 032011a8fe5..4a6138e094a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -481,7 +481,7 @@ return 1 //Friendly Creatures! - if(ispath(MP, /mob/living/carbon/alien/diona) && !jobban_isbanned(src, "Dionaea")) + if(ispath(MP, /mob/living/carbon/primitive/diona) && !jobban_isbanned(src, "Dionaea")) return 1 //Not in here? Must be untested! diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 28d5dd2fb98..0c3a68bc866 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -9,7 +9,7 @@ del(src) spawn(1) // So it has time to be thrown about by the gib() proc. - var/mob/living/carbon/alien/diona/D = new(get_turf(organ)) + var/mob/living/carbon/primitive/diona/D = new(get_turf(organ)) diona.request_player(D) del(organ) */ diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 95eaa69a81f..9d9fef8e0bc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -96,7 +96,7 @@ qdel(src) return - if (!user.IsAdvancedToolUser() || istype(user, /mob/living/carbon/alien/diona)) + if (!user.IsAdvancedToolUser() || istype(user, /mob/living/carbon/primitive/diona)) user << "\red You don't have the dexterity to do this!" return if(istype(user, /mob/living)) diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index 1425d769073..ca38bf6de7f 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -602,8 +602,8 @@ datum/reagent/atrazine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volu H.adjustToxLoss(50) ..() return - else if(istype(M,/mob/living/carbon/alien/diona)) //plantmen monkeys (diona) take EVEN MORE damage - var/mob/living/carbon/alien/diona/D = M + else if(istype(M,/mob/living/carbon/primitive/diona)) //plantmen monkeys (diona) take EVEN MORE damage + var/mob/living/carbon/primitive/diona/D = M D.adjustToxLoss(100) ..() return diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi index 63f67113cdc681ff54b86c332a1c63ab9dec1e65..3124b463c77cbc49e02e4124e4832fbd1234848e 100644 GIT binary patch literal 29511 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%0A!E2W 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 N002ovPDHLkV1nF|o|*sv diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 680f6cdcd525507a8288b607dc057d8e78ff5c07..adc2ba51ef04bb09f9deb2938e7bcedb087f507d 100644 GIT binary patch delta 28393 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 C$Ci!& delta 27632 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 V^CR*a8e;_j`8UeaC6WgI{|EW~yWIc) delta 13562 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%0Ank^k+WeRBk{A|iD!=gLczmQ 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 diff --git a/paradise.dme b/paradise.dme index 9ff202b6e76..4e79d222789 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1264,13 +1264,6 @@ #include "code\modules\mob\living\carbon\alien\login.dm" #include "code\modules\mob\living\carbon\alien\logout.dm" #include "code\modules\mob\living\carbon\alien\say.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" -#include "code\modules\mob\living\carbon\alien\diona\life.dm" -#include "code\modules\mob\living\carbon\alien\diona\progression.dm" -#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" -#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" #include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" #include "code\modules\mob\living\carbon\alien\humanoid\emote.dm" #include "code\modules\mob\living\carbon\alien\humanoid\empress.dm" @@ -1336,6 +1329,7 @@ #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\primitive\dionaold.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\login.dm" #include "code\modules\mob\living\silicon\say.dm" From 7c39634d1d329e4e14d50287fb532a31bc03c099 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 May 2015 20:43:23 -0400 Subject: [PATCH 05/16] Map fixes --- _maps/map_files/cyberiad/cyberiad.dmm | 6 +++--- _maps/map_files/cyberiad/z2.dmm | 2 +- _maps/map_files/cyberiad/z5.dmm | 13 +++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 93930a996d5..b56d79053d4 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2469,7 +2469,7 @@ "aVy" = (/turf/simulated/floor,/area/hallway/primary/central/ne) "aVz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/weapon/pen/blue{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/book/manual/barman_recipes,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aVB" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/carbon/monkey{tag = "icon-punpun1"; name = "Pun Pun"; icon_state = "punpun1"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aVB" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/carbon/human/monkey{tag = "icon-punpun1"; name = "Pun Pun"; icon_state = "punpun1"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVD" = (/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVE" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/lighter/zippo,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) @@ -4881,7 +4881,7 @@ "bPS" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable,/obj/item/roller,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bPT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) "bPU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) -"bPV" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/wolpincubes,/obj/item/weapon/storage/box/farwacubes,/turf/simulated/floor{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics) +"bPV" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/farwacubes,/turf/simulated/floor{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics) "bPW" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/roller,/obj/item/weapon/storage/box/disks,/obj/structure/table/glass,/turf/simulated/floor{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics) "bPX" = (/turf/simulated/wall/r_wall,/area/toxins/server_coldroom) "bPY" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = null; req_access_txt = "30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server) @@ -7465,7 +7465,7 @@ "cNC" = (/obj/item/weapon/storage/fancy/vials,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cND" = (/obj/item/weapon/storage/lockbox/vials,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cNE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology/lab) -"cNF" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/wolpincubes,/obj/item/weapon/storage/box/farwacubes,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) +"cNF" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/farwacubes,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cNG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cNH" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/camera{c_tag = "Virology Lab East"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cNI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/medical/virology/lab) diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index fe7514dd174..43eaa37cc76 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -590,7 +590,7 @@ "lr" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/wizard_station) "ls" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) "lt" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) -"lu" = (/mob/living/carbon/monkey,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) +"lu" = (/mob/living/carbon/human/monkey,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station) "lv" = (/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station) "lw" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) "lx" = (/obj/machinery/door/airlock/external{name = "Shuttle Airlock"; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 4b40ad7a576..580f6935395 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -358,8 +358,8 @@ "gT" = (/obj/machinery/light{dir = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/research_outpost/anomaly) "gU" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/research_outpost/anomaly) "gV" = (/obj/structure/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/color/latex,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly) -"gW" = (/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) -"gX" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access_txt = "47"},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) +"gW" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access_txt = "47"},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) +"gX" = (/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) "gY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "gZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/power/apc{dir = 4; name = "Outpost Hallways APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "ha" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power) @@ -393,8 +393,8 @@ "hC" = (/obj/machinery/door/window/westleft{dir = 8; name = "Locker room"; opacity = 0; req_access_txt = "65"},/turf/simulated/floor,/area/research_outpost/anomaly) "hD" = (/turf/simulated/floor,/area/research_outpost/anomaly) "hE" = (/obj/structure/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/color/latex,/obj/machinery/camera{c_tag = "Research Outpost Anomaly Lab Storage"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly) -"hF" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) -"hG" = (/obj/structure/window/reinforced{dir = 4},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) +"hF" = (/obj/structure/window/reinforced{dir = 4},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) +"hG" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly) "hH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "hI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway) "hJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power) @@ -1588,8 +1588,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafeVeWeXerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkdSaaaaaReseseseseseseseYeZfafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfueOfvfwfxfyeOfzacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaffAfBfCfDerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaResesesesesesesfEfFeufGfHfIfJfKfLfMaMfNfOfPfQfRfSfTfUfVdbfWfXfYfZfZgagbgcgdgeacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafgfggghergigjererererbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaResesesesesesesgkfFeufGfHglgmfKgngoaMgpgqdbgrdbdbdbdbgsdbgtgueOgvgwgxgygzemgAaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafgBgCgDgEgFgGbRdQgHergIgJerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaResesesesesesesbbfFeugKfHgLgMfKgNgOaMgPgQgRgSgTgUgVdbgWgXgYgZhahbhchdhehfemacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhghhgChihjhkhlhmgHhngJgJgIerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaahohphqhrhshthqhuhvhwhxbbhyhzaMaMaMaMaMhAhBhCgShDgUhEdbhFhGhHhIhJhKhLhMhNhOhPhQaMhRbAaBaBaBaBaBaBaChSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafgBgCgDgEgFgGbRdQgHergIgJerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaaaResesesesesesesbbfFeugKfHgLgMfKgNgOaMgPgQgRgSgTgUgVdbgXgWgYgZhahbhchdhehfemacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafhghhgChihjhkhlhmgHhngJgJgIerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaahohphqhrhshthqhuhvhwhxbbhyhzaMaMaMaMaMhAhBhCgShDgUhEdbhGhFhHhIhJhKhLhMhNhOhPhQaMhRbAaBaBaBaBaBaBaChSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahThghhhggDgDgihUhjerfDhVergJhWerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkaaaaaaaaaaaahXhYhZiaibibicidieifigihiiijikiliminioipiqirisitiuivdbiwixiyizeOeOiAeOeOeOiBiCiDiEiFiGiGiHiGiGiGiIbiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafiJiKgDiLiMgDeXiNhkiOiPiQererererererbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacacacacacacacacacaaaaaaaaaaiRiSibibibibiTiUiViWiXiYiZjaikjbjcjdjejfjgjhjijjjkjljmjnjkjojpjqjrjsjtjqjujqjkjvjwjxjyjzjAjBjCjDiGbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafjEjFjGgDiMjHhijIhjjJerjKjLerjMgHjNjOerbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkbkacacacacacacacacacacacacacacaaaaaaaaaajPjQibibjRibjSjTjUjVjWjXjYjZikkakbkckdkekfkgkhkikjkkklkmknkkkoklkpkkklkqkrksktkukvkwkxkykzkAkAkBiGbyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1787,3 +1787,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + From 264369bdfa4362921447e74a83ff3e0000c6bad8 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 May 2015 23:50:53 -0400 Subject: [PATCH 06/16] issmall fixes and order of operations --- code/_onclick/hud/hud.dm | 6 +++--- code/datums/spell.dm | 2 +- code/datums/spells/inflict_handler.dm | 2 +- code/game/dna/dna_modifier.dm | 2 +- code/game/gamemodes/changeling/changeling_power.dm | 4 ++-- code/game/gamemodes/changeling/evolution_menu.dm | 4 ++-- code/game/gamemodes/changeling/powers/tiny_prick.dm | 2 +- code/game/machinery/Sleeper.dm | 2 +- code/game/objects/items/weapons/storage/bags.dm | 2 +- code/game/objects/items/weapons/storage/firstaid.dm | 2 +- code/game/objects/items/weapons/storage/internal.dm | 2 +- code/game/objects/items/weapons/storage/storage.dm | 2 +- .../structures/crates_lockers/closets/statue.dm | 10 +++++----- code/modules/admin/player_panel.dm | 11 ++++++----- code/modules/admin/topic.dm | 2 +- code/modules/clothing/clothing.dm | 4 ++-- code/modules/mob/living/simple_animal/parrot.dm | 2 +- 17 files changed, 31 insertions(+), 30 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index c0159f66390..28d0757f3e5 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -174,10 +174,10 @@ datum/hud/New(mob/owner) var/ui_color = mymob.client.prefs.UI_style_color var/ui_alpha = mymob.client.prefs.UI_style_alpha - if(ishuman(mymob)) - human_hud(ui_style, ui_color, ui_alpha) // Pass the player the UI style chosen in preferences - else if(issmall(mymob)) + if(issmall(mymob)) monkey_hud(ui_style) + else if(ishuman(mymob)) + human_hud(ui_style, ui_color, ui_alpha) // Pass the player the UI style chosen in preferences else if(isbrain(mymob)) brain_hud(ui_style) else if( islarva(mymob) || isfacehugger(mymob) ) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index c9a91dc563d..f0275ae059d 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -84,7 +84,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin user << "Not when you're incapacitated." return 0 - if(ishuman(user) || issmall(user)) + if(ishuman(user)) if(user.is_muzzled()) user << "Mmmf mrrfff!" return 0 diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index 742326464db..eef939d801f 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -26,7 +26,7 @@ if("gib") target.gib() if("gib_brain") - if(ishuman(target) || issmall(target)) + if(ishuman(target)) var/mob/living/carbon/C = target if(C.brain_op_stage != 4) // Their brain is already taken out var/obj/item/organ/brain/B = new(C.loc) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 38804b13067..32c3684ee78 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -132,7 +132,7 @@ return if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other return - if (!ishuman(usr) && !issmall(usr)) //Make sure they're a mob that has dna + if (!ishuman(usr)) //Make sure they're a mob that has dna usr << "\blue Try as you might, you can not climb up into the scanner." return if (src.occupant) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 25875f77f04..27bba094711 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -47,7 +47,7 @@ //Fairly important to remember to return 1 on success >.< /obj/effect/proc_holder/changeling/proc/can_sting(var/mob/user, var/mob/target) - if(!ishuman(user) && !issmall(user)) //typecast everything from mob to carbon from this point onwards + if(!ishuman(user)) //typecast everything from mob to carbon from this point onwards return 0 if(req_human && !ishuman(user)) user << "We cannot do that in this form!" @@ -72,7 +72,7 @@ //used in /mob/Stat() /obj/effect/proc_holder/changeling/proc/can_be_used_by(var/mob/user) - if(!ishuman(user) && !issmall(user)) + if(!ishuman(user)) return 0 if(req_human && !ishuman(user)) return 0 diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index fefc9965a24..9077dee6bfb 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -352,7 +352,7 @@ var/list/sting_paths /mob/proc/make_changeling() if(!mind) return - if(!ishuman(src) && !issmall(src)) + if(!ishuman(src)) return if(!mind.changeling) mind.changeling = new /datum/changeling(gender) @@ -400,7 +400,7 @@ var/list/sting_paths mimicing = "" /mob/proc/remove_changeling_powers(var/keep_free_powers=0) - if(ishuman(src) || issmall(src)) + if(ishuman(src)) if(mind && mind.changeling) digitalcamo = 0 mind.changeling.changeling_speak = 0 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 04446895a4d..0490b00d820 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -82,7 +82,7 @@ /obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target) if(!..()) return - if((HUSK in target.mutations) || (!ishuman(target) && !issmall(target))) + if((HUSK in target.mutations) || (!ishuman(target)) ) user << "Our sting appears ineffective against its DNA." return 0 if(ishuman(target)) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 5e4ca5c788d..b4f60877a8a 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -574,7 +574,7 @@ set name = "Enter Sleeper" set category = null set src in oview(1) - if(usr.stat != 0 || !(ishuman(usr) || issmall(usr))) + if(usr.stat != 0 || !(ishuman(usr))) return if(src.occupant) usr << "\blue The sleeper is already occupied!" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 5a87bc98ca0..2e7ad749b94 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -378,7 +378,7 @@ else playsound(M, 'sound/items/trayhit2.ogg', 50, 1) - if(ishuman(M) || issmall(M)) + if(ishuman(M)) if(prob(10)) M.Weaken(2) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 8a68307065f..c632645ae58 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -168,7 +168,7 @@ /obj/item/weapon/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri - if (ishuman(usr) || issmall(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ + if (ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ var/mob/M = usr if (!( istype(over_object, /obj/screen) )) return ..() diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index e94c806e998..ac1aba944ba 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -26,7 +26,7 @@ //returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. It's strange, but no other way of //doing it without the ability to call another proc's parent, really. /obj/item/weapon/storage/internal/proc/handle_mousedrop(mob/user as mob, obj/over_object as obj) - if (ishuman(user) || issmall(user)) //so monkeys can take off their backpacks -- Urist + if (ishuman(user)) //so monkeys can take off their backpacks -- Urist if (istype(user.loc,/obj/mecha)) // stops inventory actions in a mech return 0 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index cc064ca9489..eb5717f43ff 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -25,7 +25,7 @@ var/use_sound = "rustle" //sound played when used. null for no sound. /obj/item/weapon/storage/MouseDrop(obj/over_object as obj) - if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist + if (ishuman(usr)) //so monkeys can take off their backpacks -- Urist var/mob/M = usr if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 03911c66984..dfe09d025d9 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -14,7 +14,7 @@ /obj/structure/closet/statue/New(loc, var/mob/living/L) - if(ishuman(L) || issmall(L) || iscorgi(L)) + if(ishuman(L) || iscorgi(L)) if(L.buckled) L.buckled = 0 L.anchored = 0 @@ -28,13 +28,13 @@ intialFire = L.getFireLoss() intialBrute = L.getBruteLoss() intialOxy = L.getOxyLoss() - if(ishuman(L)) + if(issmall(L)) + name = "statue of a monkey" + icon_state = "monkey" + else if(ishuman(L)) name = "statue of [L.name]" if(L.gender == "female") icon_state = "human_female" - else if(issmall(L)) - name = "statue of a monkey" - icon_state = "monkey" else if(iscorgi(L)) name = "statue of a corgi" icon_state = "corgi" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 738d21f0d34..5d1b2ab6a7c 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -230,12 +230,13 @@ if(isliving(M)) if(iscarbon(M)) //Carbon stuff - if(ishuman(M)) + if(issmall(M)) + M_job = "Monkey" + else if(ishuman(M)) M_job = M.job else if(isslime(M)) M_job = "slime" - else if(issmall(M)) - M_job = "Monkey" + else if(isalien(M)) //aliens if(islarva(M)) M_job = "Alien larva" @@ -347,6 +348,8 @@ dat += "AI" else if(isrobot(M)) dat += "Cyborg" + else if(issmall(M)) + dat += "Monkey" else if(ishuman(M)) dat += "[M.real_name]" else if(istype(M, /mob/living/silicon/pai)) @@ -355,8 +358,6 @@ dat += "New Player" else if(isobserver(M)) dat += "Ghost" - else if(issmall(M)) - dat += "Monkey" else if(isalien(M)) dat += "Alien" else if(ismask(M)) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 9bd31860ac4..28b855046e3 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1962,7 +1962,7 @@ where = "onfloor" if ( where == "inhand" ) //Can only give when human or monkey - if ( !( ishuman(usr) || issmall(usr) ) ) + if ( !( ishuman(usr) ) ) usr << "Can only spawn in hand when you're a human or a monkey." where = "onfloor" else if ( usr.get_active_hand() ) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d3d0fc747b8..4e868b7765c 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -413,13 +413,13 @@ BLIND // can't see anything A.attack_hand(user) return - if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself + if (ishuman(usr) && src.loc == user) //make it harder to accidentally undress yourself return ..() /obj/item/clothing/under/MouseDrop(obj/over_object as obj) - if (ishuman(usr) || issmall(usr)) + if (ishuman(usr)) //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. if (!(src.loc == usr)) return diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 827e35a428c..ee95a6d06d3 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -137,7 +137,7 @@ return //Is the usr's mob type able to do this? - if(ishuman(usr) || issmall(usr) || isrobot(usr)) + if(ishuman(usr) || isrobot(usr)) //Removing from inventory if(href_list["remove_inv"]) From 5c79a9a06503024ecc69dcdc12ce3072de17f3f1 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 14:00:20 -0400 Subject: [PATCH 07/16] Small object manipulation stuff --- .../embedded_controller_base.dm | 2 ++ code/game/machinery/navbeacon.dm | 2 ++ code/game/machinery/newscaster.dm | 4 ++++ code/game/machinery/suit_storage_unit.dm | 5 +++++ .../objects/items/weapons/dna_injector.dm | 3 +-- code/game/objects/items/weapons/handcuffs.dm | 3 +++ code/modules/clothing/masks/miscellaneous.dm | 7 +++++++ code/modules/mob/living/carbon/human/human.dm | 13 ++++++++---- .../mob/living/carbon/human/species/monkey.dm | 3 ++- code/modules/mob/living/carbon/species.dm | 1 + code/modules/mob/living/silicon/silicon.dm | 3 +++ code/modules/mob/mob.dm | 2 +- code/modules/power/apc.dm | 2 ++ code/modules/projectiles/gun.dm | 2 ++ code/modules/recycling/disposal.dm | 21 ++++++++----------- .../security levels/keycard authentication.dm | 2 ++ 16 files changed, 55 insertions(+), 20 deletions(-) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index e6fb2c03322..535e4cbd826 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -30,6 +30,8 @@ src.ui_interact(user) /obj/machinery/embedded_controller/attack_hand(mob/user as mob) + if(!user.IsAdvancedToolUser()) + return 0 src.ui_interact(user) /obj/machinery/embedded_controller/ui_interact() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 82328073b4b..8ce8273a526 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -130,6 +130,8 @@ /obj/machinery/navbeacon/attack_hand(var/mob/user) + if(!user.IsAdvancedToolUser()) + return 0 interact(user, 0) /obj/machinery/navbeacon/interact(var/mob/user, var/ai = 0) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 282ea222d8f..9aa87881287 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -180,6 +180,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attack_hand(mob/user as mob) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ if(!src.ispowered || src.isbroken) return + + if(!user.IsAdvancedToolUser()) + return 0 + if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) ) var/mob/living/human_or_robot_user = user var/dat diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 3aea4a33a6d..4017d1f3be1 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -96,6 +96,8 @@ return if(stat & NOPOWER) return + if(!user.IsAdvancedToolUser()) + return 0 if(src.panelopen) //The maintenance panel is open. Time for some shady stuff dat+= "Suit storage unit: Maintenance panel" dat+= "Maintenance panel controls
" @@ -743,6 +745,9 @@ if(..() || stat & (BROKEN|NOPOWER)) return + if(!user.IsAdvancedToolUser()) + return 0 + if(electrified != 0) if(src.shock(user, 100)) return diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index e0946240530..7c92cdc2249 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -99,8 +99,7 @@ var/mob/living/carbon/human/H = M if(H.species.flags & IS_SYNTHETIC) return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" + if (!usr.IsAdvancedToolUser()) return M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey])") diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index b0abf1bb4f8..b44235a3c4f 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -17,6 +17,9 @@ var/trashtype = null //For disposable cuffs /obj/item/weapon/restraints/handcuffs/attack(mob/living/carbon/C, mob/user) + if(!user.IsAdvancedToolUser()) + return + if(CLUMSY in user.mutations && prob(50)) user << "Uh... how do those things work?!" apply_cuffs(user,user) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 72fcc6d4f53..49da421a9ca 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -10,6 +10,13 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi' ) + +// Clumsy folks can't take the mask off themselves. +/obj/item/clothing/mask/muzzle/attack_hand(mob/user as mob) + if(user.wear_mask == src && !user.IsAdvancedToolUser()) + return 0 + ..() + /obj/item/clothing/mask/muzzle/gag name = "gag" desc = "Stick this in their mouth to stop the noise." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c60fce02d31..6b5d5ef8263 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1091,9 +1091,6 @@ tinted += MT.tint return tinted -/mob/living/carbon/human/IsAdvancedToolUser() - return 1//Humans can use guns and such - /mob/living/carbon/human/abiotic(var/full_body = 0) if(full_body && ((src.l_hand && !(src.l_hand.flags & ABSTRACT)) || (src.r_hand && !(src.r_hand.flags & ABSTRACT)) || (src.back || src.wear_mask || src.head || src.shoes || src.w_uniform || src.wear_suit || src.glasses || src.l_ear || src.r_ear || src.gloves))) @@ -1690,4 +1687,12 @@ return 1 /mob/living/carbon/human/InCritical() - return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) \ No newline at end of file + return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) + + +/mob/living/carbon/human/IsAdvancedToolUser(var/silent) + if(species.has_fine_manipulation) + return 1 + if(!silent) + src << "You don't have the dexterity to use that!" + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 97c57a1af47..05611d7ffa4 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -11,7 +11,8 @@ default_language = "Chimpanzee" greater_form = "Human" is_small = 1 - //has_fine_manipulation = 0 + has_fine_manipulation = 0 + ventcrawler = 1 show_ssd = 0 eyes = "blank_eyes" diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 3b2f9d0edf7..793bf21f290 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -56,6 +56,7 @@ var/list/default_genes = list() var/ventcrawler = 0 //Determines if the mob can go through the vents. + var/has_fine_manipulation = 1 // Can use small items. var/flags = 0 // Various specific features. var/bloodflags=0 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 6d0b1768f03..095d7af1436 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -321,3 +321,6 @@ if ("Disable") sensor_mode = 0 src << "Sensor augmentations disabled." + +/mob/living/silicon/IsAdvancedToolUser() + return 1 \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ff73ff13259..0d766fa162b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1492,4 +1492,4 @@ mob/proc/yank_out_object() return /mob/proc/handle_ventcrawl() - return // Only living mobs can ventcrawl \ No newline at end of file + return // Only living mobs can ventcrawl diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 889d2f47f62..a6553a6f4fc 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -811,6 +811,8 @@ return 0 if(!user.client) return 0 + if(!user.IsAdvancedToolUser()) + return 0 if ( ! (istype(user, /mob/living/carbon/human) || \ istype(user, /mob/living/silicon))) user << "\red You don't have the dexterity to use this [src]!" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9d9fef8e0bc..87cf5df27df 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -56,6 +56,8 @@ proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. + if(!usr.IsAdvancedToolUser()) + return 0 return 1 diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 0eb8dbafd3f..4bb71244045 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -212,22 +212,19 @@ // human interact with machine attack_hand(mob/user as mob) + if(stat & BROKEN) + return + if(user && user.loc == src) usr << "\red You cannot reach the controls from inside." return - /* - if(mode==-1) - usr << "\red The disposal units power is disabled." - return - */ - interact(user, 0) - // hostile mob escape from disposals - attack_animal(var/mob/living/simple_animal/M) - if(M.environment_smash) - M.do_attack_animation(src) - visible_message("[M.name] smashes \the [src] apart!") - qdel(src) + // Clumsy folks can only flush it. + if(user.IsAdvancedToolUser(1)) + interact(user, 0) + else + flush = !flush + update() return // user interaction diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index b2cf9c268ed..97bca316a2d 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -52,6 +52,8 @@ stat |= NOPOWER /obj/machinery/keycard_auth/attack_hand(mob/user as mob) + if(!user.IsAdvancedToolUser()) + return 0 ui_interact(user) /obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) From bd3c29fc841c98f68cf1e85738e1780bf68ba334 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 14:25:05 -0400 Subject: [PATCH 08/16] Fixed monkey health --- code/modules/mob/living/carbon/human/human.dm | 2 ++ code/modules/mob/living/carbon/human/species/monkey.dm | 2 +- code/modules/mob/living/carbon/species.dm | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6b5d5ef8263..caa4fc870c6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1385,6 +1385,8 @@ vessel = null make_blood() + maxHealth = species.total_health + if(species.language) add_language(species.language) diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 05611d7ffa4..1d07c301086 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -23,7 +23,7 @@ //hud_type = /datum/hud_data/monkey meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey - //total_health = 75 + total_health = 75 brute_mod = 1.5 burn_mod = 1.5 diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 793bf21f290..f7bc6239a26 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -52,6 +52,7 @@ var/light_dam //Light level above which species takes damage, and below which it heals. var/light_effect_amp //If 0, takes/heals 1 burn and brute per tick. Otherwise, both healing and damage effects are amplified. + var/total_health = 100 var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk var/list/default_genes = list() From be689655784bad1c88e1782d7ade280764186a58 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 20:15:53 -0400 Subject: [PATCH 09/16] Fix pun pun runtimes also fixes for datums not initializing before world --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/__HELPERS/global_lists.dm | 2 +- .../mob/living/carbon/human/species/monkey.dm | 4 ++++ code/world.dm | 20 +++++++++++++------ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index b56d79053d4..3b9a3eb0671 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2469,7 +2469,7 @@ "aVy" = (/turf/simulated/floor,/area/hallway/primary/central/ne) "aVz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/packageWrap,/obj/item/weapon/pen/blue{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/book/manual/barman_recipes,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aVB" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/carbon/human/monkey{tag = "icon-punpun1"; name = "Pun Pun"; icon_state = "punpun1"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aVB" = (/obj/structure/disposalpipe/segment{dir = 4},/mob/living/carbon/human/monkey/punpun,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVD" = (/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) "aVE" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/item/weapon/lighter/zippo,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 26380218d1e..f4e9ef1133d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -3,7 +3,7 @@ /////Initial Building///// ////////////////////////// -/hook/startup/proc/makeDatumRefLists() +/proc/makeDatumRefLists() var/list/paths //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 1d07c301086..e28183d6e6d 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -7,6 +7,7 @@ damage_overlays = 'icons/mob/human_races/masks/dam_monkey.dmi' damage_mask = 'icons/mob/human_races/masks/dam_mask_monkey.dmi' blood_mask = 'icons/mob/human_races/masks/blood_monkey.dmi' + path = /mob/living/carbon/human/monkey language = null default_language = "Chimpanzee" greater_form = "Human" @@ -37,6 +38,9 @@ if(prob(1)) H.emote(pick("scratch","jump","roll","tail")) +datum/species/monkey/get_random_name(var/gender) + return + /datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H) H.real_name = "[lowertext(name)] ([rand(100,999)])" H.name = H.real_name diff --git a/code/world.dm b/code/world.dm index 132b18cf6a0..d216b314751 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,3 +1,15 @@ +var/global/datum/global_init/init = new () + +/* + Pre-map initialization stuff should go here. +*/ +/datum/global_init/New() + + makeDatumRefLists() + load_configuration() + + del(src) + /world mob = /mob/new_player turf = /turf/space @@ -61,11 +73,7 @@ map_name = "Unknown" #endif - spawn(3000) //so we aren't adding to the round-start lag - if(config.ToRban) - ToRban_autoupdate() - /*if(config.kick_inactive) HANDLED IN PROCESS SCHEDULER - KickInactiveClients()*/ + #undef RECOMMENDED_VERSION @@ -299,7 +307,7 @@ var/world_topic_spam_protect_time = world.timeofday join_motd = file2text("config/motd.txt") -/world/proc/load_configuration() +/proc/load_configuration() config = new /datum/configuration() config.load("config/config.txt") config.load("config/game_options.txt","game_options") From 86ebb33c7e4d6d4451c6a746949a9712f54b14d8 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 20:18:43 -0400 Subject: [PATCH 10/16] fix monkey language keys --- code/modules/mob/language.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index feb06886004..228e183a595 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -576,22 +576,22 @@ speech_verb = "chimpers" ask_verb = "chimpers" exclaim_verb = "screeches" - key = "6" + key = "m" /datum/language/skrell/monkey name = "Neara" desc = "Squik squik squik." - key = "8" + key = "n" /datum/language/unathi/monkey name = "Stok" desc = "Hiss hiss hiss." - key = "7" + key = "s" /datum/language/tajaran/monkey name = "Farwa" desc = "Meow meow meow." - key = "9" + key = "w" #undef SCRAMBLE_CACHE_LEN From 32c00989d6d296b412fc5a0cc7fd323e87c05468 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 20:26:26 -0400 Subject: [PATCH 11/16] Tigercat's fixes --- code/modules/mob/living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/simple_animal/friendly/corgi.dm | 4 ++-- code/modules/mob/living/simple_animal/friendly/crab.dm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 9fd07805651..813c226858f 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -240,7 +240,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(M.stat == DEAD) return 0 - if(iscorgi(M) || issmall(M)) + if(iscorgi(M)) return 1 var/mob/living/carbon/C = M diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index ec32d9f4f2e..7d5f290fc55 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -107,7 +107,7 @@ //Removing from inventory if(href_list["remove_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr))) return var/remove_from = href_list["remove_inv"] switch(remove_from) @@ -140,7 +140,7 @@ //Adding things to inventory else if(href_list["add_inv"]) - if(!Adjacent(usr) || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) + if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr) || isalienadult(usr))) return var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 09a3ceed3d7..5e8f8d0d54b 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -83,7 +83,7 @@ //Removing from inventory if(href_list["remove_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) + if(get_dist(src,usr) > 1 || !(ishuman(usr) || isrobot(usr) || isalienadult(usr))) return var/remove_from = href_list["remove_inv"] switch(remove_from) @@ -113,7 +113,7 @@ //Adding things to inventory else if(href_list["add_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || issmall(usr) || isrobot(usr) || isalienadult(usr))) + if(get_dist(src,usr) > 1 || !(ishuman(usr) || isrobot(usr) || isalienadult(usr))) return var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) From 0cc15105e58988f5f8919502afc03063bae12240 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 20:29:47 -0400 Subject: [PATCH 12/16] Final fix --- code/game/machinery/doors/door.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 640775a48d0..c9422a930b2 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -284,9 +284,6 @@ L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.emote("scream") L.Weaken(5) - else if(issmall(L)) //For monkeys - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.Weaken(5) else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) var/turf/location = src.loc From a9e2f0c64150ec7355f918d537d5dac1abee443c Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 21:13:02 -0400 Subject: [PATCH 13/16] HUD fixes --- code/game/dna/genes/monkey.dm | 7 + .../mob/living/carbon/human/species/monkey.dm | 2 +- .../living/carbon/human/species/species.dm | 362 ++++++++++++++++++ .../carbon/human/species/species_hud.dm | 74 ++++ .../living/carbon/human/species/station.dm | 1 + code/modules/mob/living/carbon/species.dm | 4 + paradise.dme | 1 + 7 files changed, 450 insertions(+), 1 deletion(-) create mode 100644 code/modules/mob/living/carbon/human/species/species.dm create mode 100644 code/modules/mob/living/carbon/human/species/species_hud.dm diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 51e998603c9..cfae77b2350 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -42,6 +42,9 @@ H.unEquip(W) H.set_species(H.species.primitive_form) + if(H.hud_used) + H.hud_used.monkey_hud() + H << "You are now [H.species.name]. " qdel(animation) @@ -78,6 +81,10 @@ H.gib() return + if(H.hud_used) + H.hud_used.human_hud() + + for(var/obj/item/W in H) H.unEquip(W) H.set_species(H.species.greater_form) diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index e28183d6e6d..5ffb94c0144 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -21,7 +21,7 @@ //unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) //inherent_verbs = list(/mob/living/proc/ventcrawl) - //hud_type = /datum/hud_data/monkey + hud_type = /datum/hud_data/monkey meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey total_health = 75 diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm new file mode 100644 index 00000000000..f7bc6239a26 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -0,0 +1,362 @@ +/* + Datum-based species. Should make for much cleaner and easier to maintain mutantrace code. +*/ + +/datum/species + var/name // Species name. + var/path // Species path + var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set. + var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set. + + // Damage overlay and masks. + var/damage_overlays = 'icons/mob/human_races/masks/dam_human.dmi' + var/damage_mask = 'icons/mob/human_races/masks/dam_mask_human.dmi' + var/blood_mask = 'icons/mob/human_races/masks/blood_human.dmi' + + var/eyes = "eyes_s" // Icon for eyes. + var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen. + + var/primitive_form // Lesser form, if any (ie. monkey for humans) + var/greater_form // Greater form, if any, ie. human for monkeys. + var/tail // Name of tail image in species effects icon file. + var/unarmed //For empty hand harm-intent attack + var/unarmed_type = /datum/unarmed_attack + var/slowdown = 0 // Passive movement speed malus (or boost, if negative) + + var/breath_type = "oxygen" // Non-oxygen gas breathed, if any. + var/poison_type = "plasma" // Poisonous air. + var/exhale_type = "carbon_dioxide" // Exhaled gas type. + + var/cold_level_1 = 260 // Cold damage level 1 below this point. + var/cold_level_2 = 200 // Cold damage level 2 below this point. + var/cold_level_3 = 120 // Cold damage level 3 below this point. + + var/heat_level_1 = 360 // Heat damage level 1 above this point. + var/heat_level_2 = 400 // Heat damage level 2 above this point. + var/heat_level_3 = 460 // Heat damage level 3 above this point; used for body temperature + var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature + + var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing) + var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second + var/reagent_tag //Used for metabolizing reagents. + + var/darksight = 2 + var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. + var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. + var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. + var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure. + + var/brute_mod = null // Physical damage reduction/malus. + var/burn_mod = null // Burn damage reduction/malus. + + var/light_dam //Light level above which species takes damage, and below which it heals. + var/light_effect_amp //If 0, takes/heals 1 burn and brute per tick. Otherwise, both healing and damage effects are amplified. + + var/total_health = 100 + var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk + var/list/default_genes = list() + + var/ventcrawler = 0 //Determines if the mob can go through the vents. + var/has_fine_manipulation = 1 // Can use small items. + + var/flags = 0 // Various specific features. + var/bloodflags=0 + var/bodyflags=0 + var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods + + var/list/abilities = list() // For species-derived or admin-given powers + + var/blood_color = "#A10808" //Red. + var/flesh_color = "#FFC896" //Pink. + var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs + var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human + + var/base_color //Used when setting species. + + //Used in icon caching. + var/race_key = 0 + var/icon/icon_template + var/is_small + var/show_ssd = 1 + + // Language/culture vars. + var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. + var/language = "Galactic Common" // Default racial language, if any. + var/secondary_langs = list() // The names of secondary languages that are available to this species. + var/list/speech_sounds // A list of sounds to potentially play when speaking. + var/list/speech_chance // The likelihood of a speech sound playing. + + // Determines the organs that the species spawns with and + var/list/has_organ = list( // which required-organ checks are conducted. + "heart" = /obj/item/organ/heart, + "lungs" = /obj/item/organ/lungs, + "liver" = /obj/item/organ/liver, + "kidneys" = /obj/item/organ/kidneys, + "brain" = /obj/item/organ/brain, + "appendix" = /obj/item/organ/appendix, + "eyes" = /obj/item/organ/eyes + ) + + var/list/has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/chest), + "groin" = list("path" = /obj/item/organ/external/groin), + "head" = list("path" = /obj/item/organ/external/head), + "l_arm" = list("path" = /obj/item/organ/external/arm), + "r_arm" = list("path" = /obj/item/organ/external/arm/right), + "l_leg" = list("path" = /obj/item/organ/external/leg), + "r_leg" = list("path" = /obj/item/organ/external/leg/right), + "l_hand" = list("path" = /obj/item/organ/external/hand), + "r_hand" = list("path" = /obj/item/organ/external/hand/right), + "l_foot" = list("path" = /obj/item/organ/external/foot), + "r_foot" = list("path" = /obj/item/organ/external/foot/right) + ) + +/datum/species/New() + unarmed = new unarmed_type() + +/datum/species/proc/get_random_name(var/gender) + var/datum/language/species_language = all_languages[language] + return species_language.get_random_name(gender) + +/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. + + for(var/obj/item/organ/organ in H.contents) + if((organ in H.organs) || (organ in H.internal_organs)) + del(organ) + + if(H.organs) H.organs.Cut() + if(H.internal_organs) H.internal_organs.Cut() + if(H.organs_by_name) H.organs_by_name.Cut() + if(H.internal_organs_by_name) H.internal_organs_by_name.Cut() + + H.organs = list() + H.internal_organs = list() + H.organs_by_name = list() + H.internal_organs_by_name = list() + + for(var/limb_type in has_limbs) + var/list/organ_data = has_limbs[limb_type] + var/limb_path = organ_data["path"] + var/obj/item/organ/O = new limb_path(H) + organ_data["descriptor"] = O.name + + for(var/organ in has_organ) + var/organ_type = has_organ[organ] + H.internal_organs_by_name[organ] = new organ_type(H,1) + + for(var/name in H.organs_by_name) + H.organs |= H.organs_by_name[name] + + for(var/obj/item/organ/external/O in H.organs) + O.owner = H + + if(flags & IS_SYNTHETIC) + for(var/obj/item/organ/external/E in H.organs) + if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue + E.robotize() + for(var/obj/item/organ/I in H.internal_organs) + I.robotize() + + +/datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H) + var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa + //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) + var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? + var/safe_toxins_max = 0.005 + var/SA_para_min = 1 + var/SA_sleep_min = 5 + var/oxygen_used = 0 + var/nitrogen_used = 0 + var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + var/vox_oxygen_max = 1 // For vox. + + //Partial pressure of the O2 in our breath + var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure + // Same, but for the toxins + var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure + // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) + var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE + // Nitrogen, for Vox. + var/Nitrogen_pp = (breath.nitrogen/breath.total_moles())*breath_pressure + + // TODO: Split up into Voxs' own proc. + if(O2_pp < safe_oxygen_min && name != "Vox") // Too little oxygen + if(prob(20)) + spawn(0) + H.emote("gasp") + if(O2_pp > 0) + var/ratio = safe_oxygen_min/O2_pp + H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) + H.failed_last_breath = 1 + oxygen_used = breath.oxygen*ratio/6 + else + H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + H.failed_last_breath = 1 + H.oxygen_alert = max(H.oxygen_alert, 1) + else if(Nitrogen_pp < safe_oxygen_min && name == "Vox") //Vox breathe nitrogen, not oxygen. + + if(prob(20)) + spawn(0) H.emote("gasp") + if(Nitrogen_pp > 0) + var/ratio = safe_oxygen_min/Nitrogen_pp + H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) + H.failed_last_breath = 1 + nitrogen_used = breath.nitrogen*ratio/6 + else + H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + H.failed_last_breath = 1 + H.oxygen_alert = max(H.oxygen_alert, 1) + + else // We're in safe limits + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + oxygen_used = breath.oxygen/6 + H.oxygen_alert = 0 + + breath.oxygen -= oxygen_used + breath.nitrogen -= nitrogen_used + breath.carbon_dioxide += oxygen_used + + //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. + if(CO2_pp > safe_co2_max) + if(!H.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. + H.co2overloadtime = world.time + else if(world.time - H.co2overloadtime > 120) + H.Paralyse(3) + H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business + if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! + H.adjustOxyLoss(8) + if(prob(20)) // Lets give them some chance to know somethings not right though I guess. + spawn(0) H.emote("cough") + + else + H.co2overloadtime = 0 + + if(Toxins_pp > safe_toxins_max) // Too much toxins + var/ratio = (breath.toxins/safe_toxins_max) * 10 + //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second + if(H.reagents) + H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + H.toxins_alert = max(H.toxins_alert, 1) + + else if(O2_pp > vox_oxygen_max && name == "Vox") //Oxygen is toxic to vox. + var/ratio = (breath.oxygen/vox_oxygen_max) * 1000 + H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) + H.toxins_alert = max(H.toxins_alert, 1) + else + H.toxins_alert = 0 + + if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. + for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) + var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure + if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit + H.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 + H.sleeping = max(H.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) H.emote(pick("giggle", "laugh")) + + handle_temperature(breath, H) + + return 1 + +/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures + if( (abs(310.15 - breath.temperature) > 50) && !(RESIST_HEAT in H.mutations)) // Hot air hurts :( + if(H.status_flags & GODMODE) return 1 //godmode + if(breath.temperature < cold_level_1) + if(prob(20)) + H << "\red You feel your face freezing and an icicle forming in your lungs!" + else if(breath.temperature > heat_level_1) + if(prob(20)) + H << "\red You feel your face burning and a searing heat in your lungs!" + + + + switch(breath.temperature) + if(-INFINITY to cold_level_3) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") + H.fire_alert = max(H.fire_alert, 1) + + if(cold_level_3 to cold_level_2) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold") + H.fire_alert = max(H.fire_alert, 1) + + if(cold_level_2 to cold_level_1) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold") + H.fire_alert = max(H.fire_alert, 1) + + if(heat_level_1 to heat_level_2) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat") + H.fire_alert = max(H.fire_alert, 2) + + if(heat_level_2 to heat_level_3_breathe) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat") + H.fire_alert = max(H.fire_alert, 2) + + if(heat_level_3_breathe to INFINITY) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") + H.fire_alert = max(H.fire_alert, 2) + return + +/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment. + handle_dna(C) + return + +/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. + return + +// Used for species-specific names (Vox, etc) +/datum/species/proc/makeName(var/gender,var/mob/living/carbon/human/H=null) + if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + +/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). + return + +/datum/species/proc/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) //Handles any species-specific attackhand events. + return + +/datum/species/proc/say_filter(mob/M, message, datum/language/speaking) + return message + +/datum/species/proc/equip(var/mob/living/carbon/human/H) + return + +/datum/species/proc/can_understand(var/mob/other) + return + +// Called in life() when the mob has no client. +/datum/species/proc/handle_npc(var/mob/living/carbon/human/H) + return + +//Species unarmed attacks + +/datum/unarmed_attack + var/attack_verb = list("attack") // Empty hand hurt intent verb. + var/damage = 0 // Extra empty hand attack damage. + var/attack_sound = "punch" + var/miss_sound = 'sound/weapons/punchmiss.ogg' + var/sharp = 0 + var/edge = 0 + +/datum/unarmed_attack/punch + attack_verb = list("punch") + +/datum/unarmed_attack/punch/weak + attack_verb = list("flail") + damage = 1 + +/datum/unarmed_attack/diona + attack_verb = list("lash", "bludgeon") + +/datum/unarmed_attack/claws + attack_verb = list("scratch", "claw") + attack_sound = 'sound/weapons/slice.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + sharp = 1 + edge = 1 + +/datum/unarmed_attack/claws/armalis + attack_verb = list("slash", "claw") + damage = 6 //they're huge! they should do a little more damage, i'd even go for 15-20 maybe... diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm new file mode 100644 index 00000000000..3a8b133f585 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/species_hud.dm @@ -0,0 +1,74 @@ +/datum/hud_data + var/icon // If set, overrides ui_style. + var/has_a_intent = 1 // Set to draw intent box. + var/has_m_intent = 1 // Set to draw move intent box. + var/has_warnings = 1 // Set to draw environment warnings. + var/has_pressure = 1 // Draw the pressure indicator. + var/has_nutrition = 1 // Draw the nutrition indicator. + var/has_bodytemp = 1 // Draw the bodytemp indicator. + var/has_hands = 1 // Set to draw hands. + var/has_drop = 1 // Set to draw drop button. + var/has_throw = 1 // Set to draw throw button. + var/has_resist = 1 // Set to draw resist button. + var/has_internals = 1 // Set to draw the internals toggle button. + var/list/equip_slots = list() // Checked by mob_can_equip(). + + // Contains information on the position and tag for all inventory slots + // to be drawn for the mob. This is fairly delicate, try to avoid messing with it + // unless you know exactly what it does. + var/list/gear = list( + "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), + "o_clothing" = list("loc" = ui_oclothing, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), + "mask" = list("loc" = ui_mask, "name" = "Mask", "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), + "gloves" = list("loc" = ui_gloves, "name" = "Gloves", "slot" = slot_gloves, "state" = "gloves", "toggle" = 1), + "eyes" = list("loc" = ui_glasses, "name" = "Glasses", "slot" = slot_glasses, "state" = "glasses","toggle" = 1), + "l_ear" = list("loc" = ui_l_ear, "name" = "Left Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), + "r_ear" = list("loc" = ui_r_ear, "name" = "Right Ear", "slot" = slot_r_ear, "state" = "ears", "toggle" = 1), + "head" = list("loc" = ui_head, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), + "shoes" = list("loc" = ui_shoes, "name" = "Shoes", "slot" = slot_shoes, "state" = "shoes", "toggle" = 1), + "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "belt", "dir" = 8), + "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), + "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id", "dir" = NORTH), + "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), + "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), + "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt") + ) + +/datum/hud_data/New() + ..() + for(var/slot in gear) + equip_slots |= gear[slot]["slot"] + + if(has_hands) + equip_slots |= slot_l_hand + equip_slots |= slot_r_hand + equip_slots |= slot_handcuffed + + if(slot_back in equip_slots) + equip_slots |= slot_in_backpack + + if(slot_w_uniform in equip_slots) + equip_slots |= slot_tie + + equip_slots |= slot_legcuffed + +/datum/hud_data/diona + has_internals = 0 + gear = list( + "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), + "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), + "l_ear" = list("loc" = ui_gloves, "name" = "Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), + "head" = list("loc" = ui_oclothing, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), + "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "belt", "dir" = 8), + "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), + "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id", "dir" = NORTH), + "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), + "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), + "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt") + ) + +/datum/hud_data/monkey + gear = list( + "mask" = list("loc" = ui_shoes, "name" = "Mask", "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), + "back" = list("loc" = ui_sstore1, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), + ) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 02468e8c8ab..e9ac9bdb2c4 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -331,6 +331,7 @@ default_language = "Galactic Common" language = "Rootspeak" unarmed_type = /datum/unarmed_attack/diona + hud_type = /datum/hud_data/diona //primitive_form = "Nymph" slowdown = 5 diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index f7bc6239a26..fb90cc506e7 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -73,6 +73,10 @@ var/base_color //Used when setting species. + // HUD data vars. + var/datum/hud_data/hud + var/hud_type + //Used in icon caching. var/race_key = 0 var/icon/icon_template diff --git a/paradise.dme b/paradise.dme index 4e79d222789..ed697c41929 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1317,6 +1317,7 @@ #include "code\modules\mob\living\carbon\human\species\monkey.dm" #include "code\modules\mob\living\carbon\human\species\plasmaman.dm" #include "code\modules\mob\living\carbon\human\species\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\species_hud.dm" #include "code\modules\mob\living\carbon\human\species\station.dm" #include "code\modules\mob\living\carbon\metroid\death.dm" #include "code\modules\mob\living\carbon\metroid\emote.dm" From 1aa5a8533d6ce9f8e27af537a5d4ac2a3d4c6032 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 21:21:37 -0400 Subject: [PATCH 14/16] Cleanup and moving of species files --- .../mob/living/carbon/human/species/monkey.dm | 1 - .../carbon/human/species/species_hud.dm | 74 ---- .../living/carbon/human/species/station.dm | 1 - code/modules/mob/living/carbon/species.dm | 366 ------------------ paradise.dme | 3 +- 5 files changed, 1 insertion(+), 444 deletions(-) delete mode 100644 code/modules/mob/living/carbon/human/species/species_hud.dm delete mode 100644 code/modules/mob/living/carbon/species.dm diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 5ffb94c0144..08268e38994 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -21,7 +21,6 @@ //unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) //inherent_verbs = list(/mob/living/proc/ventcrawl) - hud_type = /datum/hud_data/monkey meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey total_health = 75 diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm deleted file mode 100644 index 3a8b133f585..00000000000 --- a/code/modules/mob/living/carbon/human/species/species_hud.dm +++ /dev/null @@ -1,74 +0,0 @@ -/datum/hud_data - var/icon // If set, overrides ui_style. - var/has_a_intent = 1 // Set to draw intent box. - var/has_m_intent = 1 // Set to draw move intent box. - var/has_warnings = 1 // Set to draw environment warnings. - var/has_pressure = 1 // Draw the pressure indicator. - var/has_nutrition = 1 // Draw the nutrition indicator. - var/has_bodytemp = 1 // Draw the bodytemp indicator. - var/has_hands = 1 // Set to draw hands. - var/has_drop = 1 // Set to draw drop button. - var/has_throw = 1 // Set to draw throw button. - var/has_resist = 1 // Set to draw resist button. - var/has_internals = 1 // Set to draw the internals toggle button. - var/list/equip_slots = list() // Checked by mob_can_equip(). - - // Contains information on the position and tag for all inventory slots - // to be drawn for the mob. This is fairly delicate, try to avoid messing with it - // unless you know exactly what it does. - var/list/gear = list( - "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), - "o_clothing" = list("loc" = ui_oclothing, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), - "mask" = list("loc" = ui_mask, "name" = "Mask", "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), - "gloves" = list("loc" = ui_gloves, "name" = "Gloves", "slot" = slot_gloves, "state" = "gloves", "toggle" = 1), - "eyes" = list("loc" = ui_glasses, "name" = "Glasses", "slot" = slot_glasses, "state" = "glasses","toggle" = 1), - "l_ear" = list("loc" = ui_l_ear, "name" = "Left Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), - "r_ear" = list("loc" = ui_r_ear, "name" = "Right Ear", "slot" = slot_r_ear, "state" = "ears", "toggle" = 1), - "head" = list("loc" = ui_head, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), - "shoes" = list("loc" = ui_shoes, "name" = "Shoes", "slot" = slot_shoes, "state" = "shoes", "toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "belt", "dir" = 8), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id", "dir" = NORTH), - "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), - "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), - "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt") - ) - -/datum/hud_data/New() - ..() - for(var/slot in gear) - equip_slots |= gear[slot]["slot"] - - if(has_hands) - equip_slots |= slot_l_hand - equip_slots |= slot_r_hand - equip_slots |= slot_handcuffed - - if(slot_back in equip_slots) - equip_slots |= slot_in_backpack - - if(slot_w_uniform in equip_slots) - equip_slots |= slot_tie - - equip_slots |= slot_legcuffed - -/datum/hud_data/diona - has_internals = 0 - gear = list( - "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), - "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), - "l_ear" = list("loc" = ui_gloves, "name" = "Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), - "head" = list("loc" = ui_oclothing, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "belt", "dir" = 8), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id", "dir" = NORTH), - "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), - "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), - "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt") - ) - -/datum/hud_data/monkey - gear = list( - "mask" = list("loc" = ui_shoes, "name" = "Mask", "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), - "back" = list("loc" = ui_sstore1, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), - ) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index e9ac9bdb2c4..02468e8c8ab 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -331,7 +331,6 @@ default_language = "Galactic Common" language = "Rootspeak" unarmed_type = /datum/unarmed_attack/diona - hud_type = /datum/hud_data/diona //primitive_form = "Nymph" slowdown = 5 diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm deleted file mode 100644 index fb90cc506e7..00000000000 --- a/code/modules/mob/living/carbon/species.dm +++ /dev/null @@ -1,366 +0,0 @@ -/* - Datum-based species. Should make for much cleaner and easier to maintain mutantrace code. -*/ - -/datum/species - var/name // Species name. - var/path // Species path - var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set. - var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set. - - // Damage overlay and masks. - var/damage_overlays = 'icons/mob/human_races/masks/dam_human.dmi' - var/damage_mask = 'icons/mob/human_races/masks/dam_mask_human.dmi' - var/blood_mask = 'icons/mob/human_races/masks/blood_human.dmi' - - var/eyes = "eyes_s" // Icon for eyes. - var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen. - - var/primitive_form // Lesser form, if any (ie. monkey for humans) - var/greater_form // Greater form, if any, ie. human for monkeys. - var/tail // Name of tail image in species effects icon file. - var/unarmed //For empty hand harm-intent attack - var/unarmed_type = /datum/unarmed_attack - var/slowdown = 0 // Passive movement speed malus (or boost, if negative) - - var/breath_type = "oxygen" // Non-oxygen gas breathed, if any. - var/poison_type = "plasma" // Poisonous air. - var/exhale_type = "carbon_dioxide" // Exhaled gas type. - - var/cold_level_1 = 260 // Cold damage level 1 below this point. - var/cold_level_2 = 200 // Cold damage level 2 below this point. - var/cold_level_3 = 120 // Cold damage level 3 below this point. - - var/heat_level_1 = 360 // Heat damage level 1 above this point. - var/heat_level_2 = 400 // Heat damage level 2 above this point. - var/heat_level_3 = 460 // Heat damage level 3 above this point; used for body temperature - var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature - - var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing) - var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second - var/reagent_tag //Used for metabolizing reagents. - - var/darksight = 2 - var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. - var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. - var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. - var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure. - - var/brute_mod = null // Physical damage reduction/malus. - var/burn_mod = null // Burn damage reduction/malus. - - var/light_dam //Light level above which species takes damage, and below which it heals. - var/light_effect_amp //If 0, takes/heals 1 burn and brute per tick. Otherwise, both healing and damage effects are amplified. - - var/total_health = 100 - var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk - var/list/default_genes = list() - - var/ventcrawler = 0 //Determines if the mob can go through the vents. - var/has_fine_manipulation = 1 // Can use small items. - - var/flags = 0 // Various specific features. - var/bloodflags=0 - var/bodyflags=0 - var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods - - var/list/abilities = list() // For species-derived or admin-given powers - - var/blood_color = "#A10808" //Red. - var/flesh_color = "#FFC896" //Pink. - var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs - var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human - - var/base_color //Used when setting species. - - // HUD data vars. - var/datum/hud_data/hud - var/hud_type - - //Used in icon caching. - var/race_key = 0 - var/icon/icon_template - var/is_small - var/show_ssd = 1 - - // Language/culture vars. - var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. - var/language = "Galactic Common" // Default racial language, if any. - var/secondary_langs = list() // The names of secondary languages that are available to this species. - var/list/speech_sounds // A list of sounds to potentially play when speaking. - var/list/speech_chance // The likelihood of a speech sound playing. - - // Determines the organs that the species spawns with and - var/list/has_organ = list( // which required-organ checks are conducted. - "heart" = /obj/item/organ/heart, - "lungs" = /obj/item/organ/lungs, - "liver" = /obj/item/organ/liver, - "kidneys" = /obj/item/organ/kidneys, - "brain" = /obj/item/organ/brain, - "appendix" = /obj/item/organ/appendix, - "eyes" = /obj/item/organ/eyes - ) - - var/list/has_limbs = list( - "chest" = list("path" = /obj/item/organ/external/chest), - "groin" = list("path" = /obj/item/organ/external/groin), - "head" = list("path" = /obj/item/organ/external/head), - "l_arm" = list("path" = /obj/item/organ/external/arm), - "r_arm" = list("path" = /obj/item/organ/external/arm/right), - "l_leg" = list("path" = /obj/item/organ/external/leg), - "r_leg" = list("path" = /obj/item/organ/external/leg/right), - "l_hand" = list("path" = /obj/item/organ/external/hand), - "r_hand" = list("path" = /obj/item/organ/external/hand/right), - "l_foot" = list("path" = /obj/item/organ/external/foot), - "r_foot" = list("path" = /obj/item/organ/external/foot/right) - ) - -/datum/species/New() - unarmed = new unarmed_type() - -/datum/species/proc/get_random_name(var/gender) - var/datum/language/species_language = all_languages[language] - return species_language.get_random_name(gender) - -/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. - - for(var/obj/item/organ/organ in H.contents) - if((organ in H.organs) || (organ in H.internal_organs)) - del(organ) - - if(H.organs) H.organs.Cut() - if(H.internal_organs) H.internal_organs.Cut() - if(H.organs_by_name) H.organs_by_name.Cut() - if(H.internal_organs_by_name) H.internal_organs_by_name.Cut() - - H.organs = list() - H.internal_organs = list() - H.organs_by_name = list() - H.internal_organs_by_name = list() - - for(var/limb_type in has_limbs) - var/list/organ_data = has_limbs[limb_type] - var/limb_path = organ_data["path"] - var/obj/item/organ/O = new limb_path(H) - organ_data["descriptor"] = O.name - - for(var/organ in has_organ) - var/organ_type = has_organ[organ] - H.internal_organs_by_name[organ] = new organ_type(H,1) - - for(var/name in H.organs_by_name) - H.organs |= H.organs_by_name[name] - - for(var/obj/item/organ/external/O in H.organs) - O.owner = H - - if(flags & IS_SYNTHETIC) - for(var/obj/item/organ/external/E in H.organs) - if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue - E.robotize() - for(var/obj/item/organ/I in H.internal_organs) - I.robotize() - - -/datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H) - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_max = 0.005 - var/SA_para_min = 1 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/nitrogen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - var/vox_oxygen_max = 1 // For vox. - - //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - // Same, but for the toxins - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) - var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE - // Nitrogen, for Vox. - var/Nitrogen_pp = (breath.nitrogen/breath.total_moles())*breath_pressure - - // TODO: Split up into Voxs' own proc. - if(O2_pp < safe_oxygen_min && name != "Vox") // Too little oxygen - if(prob(20)) - spawn(0) - H.emote("gasp") - if(O2_pp > 0) - var/ratio = safe_oxygen_min/O2_pp - H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) - H.failed_last_breath = 1 - oxygen_used = breath.oxygen*ratio/6 - else - H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - H.failed_last_breath = 1 - H.oxygen_alert = max(H.oxygen_alert, 1) - else if(Nitrogen_pp < safe_oxygen_min && name == "Vox") //Vox breathe nitrogen, not oxygen. - - if(prob(20)) - spawn(0) H.emote("gasp") - if(Nitrogen_pp > 0) - var/ratio = safe_oxygen_min/Nitrogen_pp - H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) - H.failed_last_breath = 1 - nitrogen_used = breath.nitrogen*ratio/6 - else - H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - H.failed_last_breath = 1 - H.oxygen_alert = max(H.oxygen_alert, 1) - - else // We're in safe limits - H.failed_last_breath = 0 - H.adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - H.oxygen_alert = 0 - - breath.oxygen -= oxygen_used - breath.nitrogen -= nitrogen_used - breath.carbon_dioxide += oxygen_used - - //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. - if(CO2_pp > safe_co2_max) - if(!H.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. - H.co2overloadtime = world.time - else if(world.time - H.co2overloadtime > 120) - H.Paralyse(3) - H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business - if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - H.adjustOxyLoss(8) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) H.emote("cough") - - else - H.co2overloadtime = 0 - - if(Toxins_pp > safe_toxins_max) // Too much toxins - var/ratio = (breath.toxins/safe_toxins_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(H.reagents) - H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - H.toxins_alert = max(H.toxins_alert, 1) - - else if(O2_pp > vox_oxygen_max && name == "Vox") //Oxygen is toxic to vox. - var/ratio = (breath.oxygen/vox_oxygen_max) * 1000 - H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - H.toxins_alert = max(H.toxins_alert, 1) - else - H.toxins_alert = 0 - - if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. - for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit - H.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 - H.sleeping = max(H.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) H.emote(pick("giggle", "laugh")) - - handle_temperature(breath, H) - - return 1 - -/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures - if( (abs(310.15 - breath.temperature) > 50) && !(RESIST_HEAT in H.mutations)) // Hot air hurts :( - if(H.status_flags & GODMODE) return 1 //godmode - if(breath.temperature < cold_level_1) - if(prob(20)) - H << "\red You feel your face freezing and an icicle forming in your lungs!" - else if(breath.temperature > heat_level_1) - if(prob(20)) - H << "\red You feel your face burning and a searing heat in your lungs!" - - - - switch(breath.temperature) - if(-INFINITY to cold_level_3) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") - H.fire_alert = max(H.fire_alert, 1) - - if(cold_level_3 to cold_level_2) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold") - H.fire_alert = max(H.fire_alert, 1) - - if(cold_level_2 to cold_level_1) - H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold") - H.fire_alert = max(H.fire_alert, 1) - - if(heat_level_1 to heat_level_2) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat") - H.fire_alert = max(H.fire_alert, 2) - - if(heat_level_2 to heat_level_3_breathe) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat") - H.fire_alert = max(H.fire_alert, 2) - - if(heat_level_3_breathe to INFINITY) - H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") - H.fire_alert = max(H.fire_alert, 2) - return - -/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment. - handle_dna(C) - return - -/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. - return - -// Used for species-specific names (Vox, etc) -/datum/species/proc/makeName(var/gender,var/mob/living/carbon/human/H=null) - if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - -/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). - return - -/datum/species/proc/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) //Handles any species-specific attackhand events. - return - -/datum/species/proc/say_filter(mob/M, message, datum/language/speaking) - return message - -/datum/species/proc/equip(var/mob/living/carbon/human/H) - return - -/datum/species/proc/can_understand(var/mob/other) - return - -// Called in life() when the mob has no client. -/datum/species/proc/handle_npc(var/mob/living/carbon/human/H) - return - -//Species unarmed attacks - -/datum/unarmed_attack - var/attack_verb = list("attack") // Empty hand hurt intent verb. - var/damage = 0 // Extra empty hand attack damage. - var/attack_sound = "punch" - var/miss_sound = 'sound/weapons/punchmiss.ogg' - var/sharp = 0 - var/edge = 0 - -/datum/unarmed_attack/punch - attack_verb = list("punch") - -/datum/unarmed_attack/punch/weak - attack_verb = list("flail") - damage = 1 - -/datum/unarmed_attack/diona - attack_verb = list("lash", "bludgeon") - -/datum/unarmed_attack/claws - attack_verb = list("scratch", "claw") - attack_sound = 'sound/weapons/slice.ogg' - miss_sound = 'sound/weapons/slashmiss.ogg' - sharp = 1 - edge = 1 - -/datum/unarmed_attack/claws/armalis - attack_verb = list("slash", "claw") - damage = 6 //they're huge! they should do a little more damage, i'd even go for 15-20 maybe... diff --git a/paradise.dme b/paradise.dme index ed697c41929..7d95b27c84f 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1255,7 +1255,6 @@ #include "code\modules\mob\living\carbon\give.dm" #include "code\modules\mob\living\carbon\life.dm" #include "code\modules\mob\living\carbon\shock.dm" -#include "code\modules\mob\living\carbon\species.dm" #include "code\modules\mob\living\carbon\superheroes.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_defenses.dm" @@ -1317,7 +1316,7 @@ #include "code\modules\mob\living\carbon\human\species\monkey.dm" #include "code\modules\mob\living\carbon\human\species\plasmaman.dm" #include "code\modules\mob\living\carbon\human\species\shadow.dm" -#include "code\modules\mob\living\carbon\human\species\species_hud.dm" +#include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\station.dm" #include "code\modules\mob\living\carbon\metroid\death.dm" #include "code\modules\mob\living\carbon\metroid\emote.dm" From e76e33f4eb84a3bb4b823e3098b9b1b837ba326f Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 21:30:13 -0400 Subject: [PATCH 15/16] Fixed language keys for monkeys --- code/modules/mob/language.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 228e183a595..ce69eafc411 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -576,22 +576,22 @@ speech_verb = "chimpers" ask_verb = "chimpers" exclaim_verb = "screeches" - key = "m" + key = "mo" /datum/language/skrell/monkey name = "Neara" desc = "Squik squik squik." - key = "n" + key = "ne" /datum/language/unathi/monkey name = "Stok" desc = "Hiss hiss hiss." - key = "s" + key = "st" /datum/language/tajaran/monkey name = "Farwa" desc = "Meow meow meow." - key = "w" + key = "fa" #undef SCRAMBLE_CACHE_LEN From a3d29eec2fb6f6ac4136c76b56d0fb8c51e32265 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 26 May 2015 21:38:10 -0400 Subject: [PATCH 16/16] Fix for languages using 2 characters in prefix --- code/modules/mob/say.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 38328b16bb7..2f8a790c3c6 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -141,7 +141,8 @@ return all_languages["Noise"] if(length(message) >= 2) - var/language_prefix = lowertext(copytext(message, 1 ,3)) + + var/language_prefix = trim_right(lowertext(copytext(message, 1 ,4))) var/datum/language/L = language_keys[language_prefix] if (can_speak(L)) return L