diff --git a/baystation12.dme b/baystation12.dme index 7b0086129bc..11531b16cc7 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -761,6 +761,7 @@ #include "code\game\objects\objs.dm" #include "code\game\objects\structures.dm" #include "code\game\objects\weapons.dm" +#include "code\game\objects\closets\walllocker.dm" #include "code\game\objects\effects\aliens.dm" #include "code\game\objects\effects\biomass_rift.dm" #include "code\game\objects\effects\bump_teleporter.dm" diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index c0aadf28ad1..2abd48068d4 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -67,7 +67,10 @@ M.fields["alg_d"] = "No allergies have been detected in this patient." M.fields["cdi"] = "None" M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["notes"] = "No notes." + if(H.med_record && !jobban_isbanned(H, "Records")) + M.fields["notes"] = H.med_record + else + M.fields["notes"] = "No notes found." medical += M //Security Record @@ -80,6 +83,10 @@ S.fields["ma_crim"] = "None" S.fields["ma_crim_d"] = "No major crime convictions." S.fields["notes"] = "No notes." + if(H.sec_record && !jobban_isbanned(H, "Records")) + S.fields["notes"] = H.sec_record + else + S.fields["notes"] = "No notes." security += S //Locked Record diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index c87d435e763..79374d24788 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -32,15 +32,8 @@ if(3) if(prob(1)) if (affected_mob.nutrition > 100) - affected_mob.Stun(rand(4,6)) - for(var/mob/O in viewers(world.view, affected_mob)) - O.show_message(text("\red [] throws up!", affected_mob), 1) - playsound(affected_mob.loc, 'sound/effects/splat.ogg', 50, 1) - var/turf/location = affected_mob.loc - if (istype(location, /turf/simulated)) - location.add_vomit_floor(affected_mob) - affected_mob.nutrition -= 95 - affected_mob.adjustToxLoss(-1) + var/mob/living/carbon/human/H = affected_mob + H.vomit() else affected_mob << "\red You gag as you want to throw up, but there's nothing in your stomach!" affected_mob.Weaken(10) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 58edea29c82..56e1c53b51f 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -496,6 +496,12 @@ var/jobName var/realJobName + // hack for alt titles + if(istype(loc, /mob)) + var/mob/M = loc + if(M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs()) + return M.mind.assigned_role + if(istype(src, /obj/item/device/pda)) if(src:id) jobName = src:id:assignment diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 907994efdef..07b1a4ee1a3 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -28,5 +28,8 @@ //the type of the ID the player will have var/idtype = /obj/item/weapon/card/id + //List of alternate titles, if any + var/list/alt_titles + /datum/job/proc/equip(var/mob/living/carbon/human/H) return 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index efd5ba1c55a..fd5ac0f0034 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -40,6 +40,7 @@ spawn_positions = 3 supervisors = "the chief medical officer" selection_color = "#ffeef0" + alt_titles = list("Surgeon", "Emergency Physician") equip(var/mob/living/carbon/human/H) @@ -49,10 +50,17 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) + if(H.mind.role_alt_title && H.mind.role_alt_title == "Emergency Physician") + H.equip_if_possible(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) + H.equip_if_possible(new /obj/item/clothing/suit/fr_jacket(H), slot_wear_suit) + else if(H.mind.role_alt_title && H.mind.role_alt_title == "Surgeon") + H.equip_if_possible(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform) + H.equip_if_possible(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit) + else + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 0c0fe506f74..b12ab1f78f5 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -84,6 +84,7 @@ spawn_positions = 1 supervisors = "the head of security" selection_color = "#ffeeee" + alt_titles = list("Forensic Technician") equip(var/mob/living/carbon/human/H) @@ -96,12 +97,15 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head) - var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H) +/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H) CIG.light("") - H.equip_to_slot_or_del(CIG, slot_wear_mask) + H.equip_to_slot_or_del(CIG, slot_wear_mask) */ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(H), slot_wear_suit) + if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician") + H.equip_to_slot_or_del(new /obj/item/clothing/suit/forensics/blue(H), slot_wear_suit) + else + H.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(H), slot_l_store) if(H.backbag == 1)//Why cant some of these things spawn in his office? diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index d2bb20e88b9..c8a46312806 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -44,6 +44,8 @@ var/global/datum/controller/occupations/job_master if(J.title == rank) return J return null + proc/GetAltTitle(mob/new_player/player, rank) + return player.preferences.GetAltTitle(GetJob(rank)) proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0) Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") @@ -57,6 +59,7 @@ var/global/datum/controller/occupations/job_master if((job.current_positions < position_limit) || position_limit == -1) Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]") player.mind.assigned_role = rank + player.mind.role_alt_title = GetAltTitle(player, rank) unassigned -= player job.current_positions++ return 1 @@ -296,6 +299,9 @@ var/global/datum/controller/occupations/job_master H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator." H.job = rank + if(H.mind && H.mind.assigned_role != rank) + H.mind.assigned_role = rank + H.mind.role_alt_title = null if(!joined_late) var/obj/S = null @@ -338,15 +344,19 @@ var/global/datum/controller/occupations/job_master H << "You are the [rank]." H << "As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this." - spawnId(H,rank) + if(H.mind.assigned_role == rank && H.mind.role_alt_title) + spawnId(H, rank, H.mind.role_alt_title) + else + spawnId(H,rank) H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears) // H.update_icons() return 1 - proc/spawnId(var/mob/living/carbon/human/H, rank) + proc/spawnId(var/mob/living/carbon/human/H, rank, title) if(!H) return 0 + if(!title) title = rank var/obj/item/weapon/card/id/C = null var/datum/job/job = null @@ -364,9 +374,9 @@ var/global/datum/controller/occupations/job_master C = new /obj/item/weapon/card/id(H) if(C) C.registered_name = H.real_name - C.assignment = rank + C.assignment = title C.name = "[C.registered_name]'s ID Card ([C.assignment])" - C.access = get_access(C.assignment) + C.access = get_access(rank) H.equip_to_slot_or_del(C, slot_wear_id) /* if(prob(50)) H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_r_store) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 8689b09b431..1e58a03558a 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -84,7 +84,7 @@ /obj/item/mecha_parts/part/durand_right_leg, /obj/item/mecha_parts/part/durand_armour ), - "H.O.N.K"=list( +/* "H.O.N.K"=list( /obj/item/mecha_parts/chassis/honker, /obj/item/mecha_parts/part/honker_torso, /obj/item/mecha_parts/part/honker_head, @@ -92,7 +92,7 @@ /obj/item/mecha_parts/part/honker_right_arm, /obj/item/mecha_parts/part/honker_left_leg, /obj/item/mecha_parts/part/honker_right_leg - ), + ), */ "Exosuit Equipment"=list( /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/tool/drill, @@ -106,9 +106,9 @@ ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar, + /* /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar, - /obj/item/mecha_parts/mecha_equipment/weapon/honker + /obj/item/mecha_parts/mecha_equipment/weapon/honker*/ ), "Cyborg Upgrade Modules" = list( diff --git a/code/game/objects/closets/walllocker.dm b/code/game/objects/closets/walllocker.dm index 5f5ce55c290..328eae28bf5 100644 --- a/code/game/objects/closets/walllocker.dm +++ b/code/game/objects/closets/walllocker.dm @@ -6,287 +6,33 @@ name = "Wall Locker" icon = 'walllocker.dmi' icon_state = "wall-locker" - density = 1 - flags = FPRINT - var/list/spawnitems = list() - var/amount = 3 // spawns each items X times. + density = 0 anchored = 1 - opened = 0 - var/locked = 1 - var/bang_time = 0 - var/broken = 0 - var/large = 1 icon_closed = "wall-locker" - var/icon_locked = "wall-locker1" icon_opened = "wall-lockeropen" - var/icon_broken = "wall-lockerbroken" - var/icon_off = "wall-lockeroff" -/obj/structure/closet/walllocker/attack_hand(mob/user as mob) +//spawns endless (3 sets) amounts of breathmask, emergency oxy tank and crowbar + +/obj/structure/closet/walllocker/emerglocker + name = "emergency locker" + desc = "A wall mounted locker with emergency supplies" + var/list/spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar) + var/amount = 3 // spawns each items X times. + icon_state = "emerg" + +/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user as mob) if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) if(!amount) - usr << "It's empty.." + usr << "It's empty.." return if(amount) + usr << "You take out some items from \the [src]." for(var/path in spawnitems) new path(src.loc) amount-- return -/obj/structure/closet/walllocker/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (src.opened) - if (istype(W, /obj/item/weapon/grab)) - if (src.large) - src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet - else - user << "The locker is too small to stuff [W] into!" - user.drop_item() - if (W) - W.loc = src.loc - else if(src.broken) - user << "\red It appears to be broken." - return - else if(istype(W, /obj/item/weapon/card/emag) && !src.broken) - var/obj/item/weapon/card/emag/E = W - if(E.uses) - E.uses-- - else - return - src.broken = 1 - src.locked = 0 - src.icon_state = src.icon_broken - for(var/mob/O in viewers(user, 3)) - if ((O.client && !( O.blinded ))) - O << text("\blue The locker has been broken by [user] with an electromagnetic card!") - else if(src.allowed(user)) - src.locked = !src.locked - for(var/mob/O in viewers(user, 3)) - if ((O.client && !( O.blinded ))) - O << text("\blue The locker has been []locked by [].", (src.locked ? null : "un"), user) - if(src.locked) - src.icon_state = src.icon_locked - else - src.icon_state = src.icon_closed - - else - user << "\red Access Denied" - return - -/obj/structure/closet/walllocker/security - name = "wall locker" - req_access = list(ACCESS_SECURITY) - icon_state = "wall-locker1" - density = 1 - -/obj/structure/closet/walllocker/New() - spawn(10) - for(var/obj/item/A in src.loc.contents) - A.loc = src - -/obj/structure/closet/walllocker/alter_health() - return get_turf(src) - -/obj/structure/closet/walllocker/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 - - return src.opened - - for(var/mob/M in src) - M.loc = src.loc - if (M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - - if (!src.can_open()) - return 0 - - src.dump_contents() - - src.icon_state = src.icon_opened - src.opened = 1 - playsound(src.loc, 'click.ogg', 15, 1, -3) - return 1 - - if (!src.can_close()) - return 0 - - for (var/obj/item/I in src.loc) - if (!I.anchored) - I.loc = src - - /*for (var/obj/overlay/o in src.loc) //REMOVE THIS - if (!o.anchored) - o.loc = src*/ - - for (var/mob/M in src.loc) - if (M.buckled) - continue - - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - - M.loc = src - src.icon_state = src.icon_closed - src.opened = 0 - playsound(src.loc, 'click.ogg', 15, 1, -3) - return 1 - -/obj/structure/closet/walllocker/ex_act(severity) - switch(severity) - if (1) - for (var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - if (2) - if (prob(50)) - for (var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - if (3) - if (prob(5)) - for (var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - del(src) - -/obj/structure/closet/walllocker/blob_act() - if (prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - del(src) - -/obj/structure/closet/walllocker/meteorhit(obj/O as obj) - if (O.icon_state == "flaming") - for(var/obj/item/I in src) - I.loc = src.loc - for(var/mob/M in src) - M.loc = src.loc - if (M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - src.icon_state = src.icon_broken - del(src) - return - return - -/obj/structure/closet/walllocker/bullet_act(flag) -/* Just in case someone gives closets health - if (flag == PROJECTILE_BULLET) - src.health -= 1 - src.healthcheck() - return - if (flag != PROJECTILE_LASER) - src.health -= 3 - src.healthcheck() - return - else - src.health -= 5 - src.healthcheck() - return -*/ - if(prob(1.5)) - for (var/atom/movable/A as mob|obj in src) - A.loc = src.loc - del(src) - return - -/obj/structure/closet/walllocker/relaymove(mob/user as mob) - if (user.stat) - return - if (!( src.locked )) - for(var/obj/item/I in src) - I.loc = src.loc - for(var/mob/M in src) - M.loc = src.loc - if (M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - src.icon_state = src.icon_opened - src.opened = 1 - else if(src.locked && world.timeofday - bang_time >= 14) - user << "\blue It's locked!" - for(var/mob/M in hearers(src, null)) - if(!(M.disabilities & 32) && M.ear_deaf == 0) - M << text("BANG, bang!", max(0, 5 - get_dist(src, M))) - //user.unlock_medal("It's a trap!", 0, "Get locked or welded into a locker...", "easy") - bang_time = world.timeofday - return - return - -/obj/structure/closet/walllocker/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) - if ((user.restrained() || user.stat)) - return - if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src))) - return - if(!src.opened) - return - if(istype(O, /obj/structure/closet/walllocker) || istype(O, /obj/structure/closet)) - return - step_towards(O, src.loc) - if (user != O) - for(var/mob/B in viewers(user, 3)) - if ((B.client && !( B.blinded ))) - B << text("\red [] stuffs [] into []!", user, O, src) - src.add_fingerprint(user) - return -/* -//obj/structure/closet/attack_hand(mob/user as mob) - src.add_fingerprint(user) - if (!src.opened && !src.locked) - if(!src.can_open()) - return - //open it - for(var/obj/item/I in src) - I.loc = src.loc - for(var/mob/M in src) - M.loc = src.loc - if (M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - src.icon_state = src.icon_opened - playsound(src.loc, 'click.ogg', 15, 1, -3) - src.opened = 1 - else if(src.opened) - if(!src.can_close()) - return - //close it - for(var/obj/item/I in src.loc) - if (!( I.anchored )) - I.loc = src - for(var/mob/M in src.loc) - if (M.buckled) - continue - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - src.icon_state = src.icon_closed - playsound(src.loc, 'click.ogg', 15, 1, -3) - src.opened = 0 - else - return src.attackby(null, user) - return*/ - -/obj/structure/closet/walllocker/attack_hand(mob/user as mob) - src.add_fingerprint(user) - - if (!src.toggle()) - return src.attackby(null, user) - -/obj/structure/closet/walllocker/attack_paw(mob/user as mob) - return src.attack_hand(user) - -//spawns endless amounts of breathmask, emergency oxy tank and crowbar - -/obj/structure/closet/walllocker/emerglocker - name = "Emergency Locker" - spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar) - icon_state = "emerg" - /obj/structure/closet/walllocker/emerglocker/north pixel_y = 32 dir = SOUTH diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 6348e294e61..0ef3fa6bf1d 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -107,11 +107,8 @@ Implant Specifics:
"} return hear(var/msg) - world << "Implant heard: [msg]" var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "") msg = sanitize_simple(msg, replacechars) - world << "Implant understood: [msg]" - world << "Implant's phrase: [phrase]" if(findtext(msg,phrase)) if(istype(imp_in, /mob/)) var/mob/T = imp_in @@ -269,8 +266,6 @@ the implant may become unstable and either pre-maturely inject the subject or si process() if (!implanted) return var/mob/M = imp_in - if (M == null) - world << "Are?.." var/area/t = get_area(M) if(isnull(M)) // If the mob got gibbed diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 4db772a936d..d94db5c3c27 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -112,4 +112,10 @@ name = "suspenders" desc = "They suspend the illusion of the mime's play." icon = 'icons/obj/clothing/belts.dmi' - icon_state = "suspenders" \ No newline at end of file + icon_state = "suspenders" + +/obj/item/clothing/suit/fr_jacket + name = "first responder jacket" + desc = "A high-visibility jacket worn by medical first responders." + icon_state = "fr_jacket_open" + item_state = "fr_jacket" \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 88c8ec828b5..71e9806cc04 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -332,19 +332,19 @@ icon = 'custom_items.dmi' icon_state = "swatcap" -/obj/item/clothing/head/helmet/welding/fluff/alice_mccrea_1 //madmalicemccrea: Alice McCrea +/obj/item/clothing/head/welding/fluff/alice_mccrea_1 //madmalicemccrea: Alice McCrea name = "flame decal welding helmet" desc = "A welding helmet adorned with flame decals, and several cryptic slogans of varying degrees of legibility. \"Fly the Friendly Skies\" is clearly visible, written above the visor, for some reason." icon = 'custom_items.dmi' icon_state = "alice_mccrea_1" -/obj/item/clothing/head/helmet/welding/fluff/yuki_matsuda_1 //searif: Yuki Matsuda +/obj/item/clothing/head/welding/fluff/yuki_matsuda_1 //searif: Yuki Matsuda name = "white decal welding helmet" desc = "A white welding helmet with a character written across it." icon = 'custom_items.dmi' icon_state = "yuki_matsuda_1" -/obj/item/clothing/head/helmet/welding/fluff/norah_briggs_1 //bountylord13: Norah Briggs +/obj/item/clothing/head/welding/fluff/norah_briggs_1 //bountylord13: Norah Briggs name = "blue flame decal welding helmet" desc = "A welding helmet with blue flame decals on it." icon = 'custom_items.dmi' diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ff330fde1ba..0f74acea11f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -805,4 +805,26 @@ xylophone = 1 spawn(1200) xylophone=0 - return \ No newline at end of file + return + +/mob/living/carbon/human/proc/vomit() + if(!lastpuke) + lastpuke = 1 + src << "You feel nauseous..." + spawn(150) //15 seconds until second warning + src << "You feel like you are about to throw up!" + spawn(100) //and you have 10 more for mad dash to the bucket + Stun(5) + + src.visible_message("[src] throws up!","You throw up!") + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + + var/turf/location = loc + if (istype(location, /turf/simulated)) + location.add_vomit_floor(src, 1) + + nutrition -= 40 + adjustToxLoss(-3) + spawn(350) //wait 35 seconds before next volley + lastpuke = 0 + diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 5fed311fda0..96df8c88465 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -191,6 +191,27 @@ if(w_uniform) w_uniform.add_fingerprint(M) var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) + + if (istype(r_hand,/obj/item/weapon/gun) || istype(l_hand,/obj/item/weapon/gun)) + var/obj/item/weapon/gun/W = null + var/chance = 0 + + if (istype(l_hand,/obj/item/weapon/gun)) + W = l_hand + chance = hand ? 40 : 20 + + if (istype(r_hand,/obj/item/weapon/gun)) + W = r_hand + chance = !hand ? 40 : 20 + + if (prob(chance)) + visible_message("[src]'s [W] goes off during struggle!") + var/list/turfs = list() + for(var/turf/T in view()) + turfs += T + var/turf/target = pick(turfs) + return W.afterattack(target,src) + var/randn = rand(1, 100) if (randn <= 25) apply_effect(4, WEAKEN, run_armor_check(affecting, "melee")) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index cb41d6df7bc..e97635af696 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1400,23 +1400,7 @@ AND YOU */ // Puke if toxloss is too high if(!stat) if (getToxLoss() >= 45 && nutrition > 20) - lastpuke ++ - if(lastpuke >= 25) // about 25 second delay I guess - Stun(5) - - for(var/mob/O in viewers(world.view, src)) - O.show_message(text("\red [] throws up!", src), 1) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - - var/turf/location = loc - if (istype(location, /turf/simulated)) - location.add_vomit_floor(src, 1) - - nutrition -= 20 - adjustToxLoss(-3) - - // make it so you can only puke so fast - lastpuke = 0 + vomit() //0.1% chance of playing a scary sound to someone who's in complete darkness if(isturf(loc) && rand(1,1000) == 1) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index b4362f7aa92..8e4d2e6ee27 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -245,21 +245,8 @@ proc/get_damage_icon_part(damage_state, body_part) lying_icon = new /icon('icons/mob/human.dmi', "torso_[g]_l") individual_limbs = 1 - //remove destroyed limbs from base icon - for(var/datum/organ/external/part in organs) - if(!istype(part, /datum/organ/external/groin) \ - && !istype(part, /datum/organ/external/chest) \ - && (part.status & ORGAN_DESTROYED)) - var/icon/temp = new /icon('dam_mask.dmi', "[part.icon_name]") - temp.MapColors(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,-1, 1,1,1,1) - stand_icon.AddAlphaMask(temp) - - temp = new /icon('dam_mask.dmi', "[part.icon_name]2") - temp.MapColors(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,-1, 1,1,1,1) - lying_icon.AddAlphaMask(temp) - - // Draw each individual limb (AterIgnis: not sure why this is needed at all - base icon have all of these, but that was before me) - if(!husk && individual_limbs) + // Draw each individual limb + if(individual_limbs) stand_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_l"), ICON_OVERLAY) @@ -268,24 +255,35 @@ proc/get_damage_icon_part(damage_state, body_part) stand_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_l"), ICON_OVERLAY) + for(var/datum/organ/external/part in organs) + if(!istype(part, /datum/organ/external/groin) \ + && !istype(part, /datum/organ/external/chest) \ + && !istype(part, /datum/organ/external/head) \ + && !(part.status & ORGAN_DESTROYED)) + var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s") + if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + stand_icon.Blend(temp, ICON_OVERLAY) + temp = new /icon('human.dmi', "[part.icon_name]_l") + if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + lying_icon.Blend(temp , ICON_OVERLAY) + stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY) - // Draw nondestroyed robotic limbs grayscale - for(var/datum/organ/external/part in organs) - if(!istype(part, /datum/organ/external/groin) \ - && !istype(part, /datum/organ/external/chest) \ - && !istype(part, /datum/organ/external/head) \ - && !(part.status & ORGAN_DESTROYED)) - var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s") - if(part.status & ORGAN_ROBOT) - temp.MapColors(rgb(77,77,77,0), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - stand_icon.Blend(temp, ICON_OVERLAY) + if (husk) + var/icon/husk_s = new /icon('human.dmi', "husk_s") + var/icon/husk_l = new /icon('human.dmi', "husk_l") - temp = new /icon('human.dmi', "[part.icon_name]_l") - if(part.status & ORGAN_ROBOT) - temp.MapColors(rgb(77,77,77,0), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - lying_icon.Blend(temp, ICON_OVERLAY) + for(var/datum/organ/external/part in organs) + if(!istype(part, /datum/organ/external/groin) \ + && !istype(part, /datum/organ/external/chest) \ + && !istype(part, /datum/organ/external/head) \ + && (part.status & ORGAN_DESTROYED)) + husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT) + husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT) + + stand_icon.Blend(husk_s, ICON_OVERLAY) + lying_icon.Blend(husk_l, ICON_OVERLAY) //Skin tone if(!skeleton) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 016f3dcb79a..1eb1d159c9a 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -143,6 +143,62 @@ else message = "[src] looks." m_type = 1 + if("beep") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] beeps at [param]." + else + message = "[src] beeps." + playsound(src.loc, 'twobeep.ogg', 50, 0) + m_type = 2 + + if("ping") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] pings at [param]." + else + message = "[src] pings." + playsound(src.loc, 'ping.ogg', 50, 0) + m_type = 2 + + if("buzz") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] buzzes at [param]." + else + message = "[src] buzzes." + playsound(src.loc, 'buzz-sigh.ogg', 50, 0) + m_type = 2 + + if("law") + message = "[src] shows its legal authorization barcode." + + playsound(src.loc, 'biamthelaw.ogg', 50, 0) + m_type = 2 else src << text("Invalid Emote: []", act) if ((message && src.stat == 0)) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index f28dc77e2e7..9809f48773e 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -64,6 +64,8 @@ var/real_name = null // var/original_name = null //Original name is only used in ghost chat! Depracated, now used bb var/flavor_text = "" + var/med_record = "" + var/sec_record = "" var/blinded = null var/bhunger = 0 //Carbon var/ajourn = 0 diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm index d60e7a041a3..1b236500d61 100644 --- a/code/modules/mob/new_player/preferences.dm +++ b/code/modules/mob/new_player/preferences.dm @@ -272,7 +272,7 @@ datum/preferences if(jobban_isbanned(user, "Records")) dat += "You are banned from using character records.
" else - dat += "Character Records

" + dat += "Character Records

" dat += "Flavor Text
" dat += "Change
" @@ -401,14 +401,14 @@ datum/preferences HTML += "
" HTML += "Set Character Records
" - HTML += "Medical Records
" + HTML += "Medical Records
" if(lentext(med_record) <= 40) HTML += "[med_record]" else HTML += "[copytext(med_record, 1, 37)]..." - HTML += "

Security Records
" + HTML += "

Security Records
" if(lentext(sec_record) <= 40) HTML += "[sec_record]
" @@ -416,7 +416,7 @@ datum/preferences HTML += "[copytext(sec_record, 1, 37)]...
" HTML += "
" - HTML += "\[Done\]" + HTML += "\[Done\]" HTML += "
" user << browse(null, "window=preferences") @@ -453,7 +453,7 @@ datum/preferences //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. var/datum/job/lastJob - + if (!job_master) return for(var/datum/job/job in job_master.occupations) index += 1 @@ -500,6 +500,8 @@ datum/preferences HTML += " \[Low]" else HTML += " \[NEVER]" + if(job.alt_titles) + HTML += "
\[[GetAltTitle(job)]\]" HTML += "" HTML += "" @@ -625,7 +627,6 @@ datum/preferences proc/process_link(mob/user, list/href_list) if(!user) return - if(href_list["preference"] == "job") switch(href_list["task"]) if("close") @@ -634,6 +635,14 @@ datum/preferences if("random") userandomjob = !userandomjob SetChoices(user) + if ("alt_title") + var/datum/job/job = locate(href_list["job"]) + if (job) + var/choices = list(job.title) + job.alt_titles + var/choice = input("Pick a title for [job.title].", "Character Generation", GetAltTitle(job)) as anything in choices | null + if(choice) + SetAltTitle(job, choice) + SetChoices(user) if("input") SetJob(user, href_list["text"]) else @@ -674,6 +683,32 @@ datum/preferences SetSkills(user) return 1 + else if(href_list["preference"] == "records") + if(text2num(href_list["record"]) >= 1) + SetRecords(user) + return + else + user << browse(null, "window=records") + if(href_list["task"] == "med_record") + var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message + + if(medmsg != null) + medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) + medmsg = html_encode(medmsg) + + med_record = medmsg + SetRecords(user) + + if(href_list["task"] == "sec_record") + var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message + + if(secmsg != null) + secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) + secmsg = html_encode(secmsg) + + sec_record = secmsg + SetRecords(user) + switch(href_list["task"]) if("random") switch(href_list["preference"]) @@ -936,33 +971,6 @@ datum/preferences else user << browse(null, "window=disabil") - if("records") - if(text2num(href_list["records"]) >= 1) - SetRecords(user) - return - else - user << browse(null, "window=records") - - if("med_record") - var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message - - if(medmsg != null) - medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN) - medmsg = html_encode(medmsg) - - med_record = medmsg - SetRecords(user) - - if("sec_record") - var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message - - if(secmsg != null) - secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN) - secmsg = html_encode(secmsg) - - sec_record = secmsg - SetRecords(user) - if("limbs") var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") if(!limb_name) return @@ -1139,6 +1147,8 @@ datum/preferences character.dna.real_name = character.real_name character.flavor_text = flavor_text + character.med_record = med_record + character.sec_record = sec_record character.gender = gender diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 21314fcc301..135680dbc8c 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 3aeaa24ca7d..6375e7ce72b 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ