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