diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index 87e3ac87e67..cdb0cb7de64 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -97,7 +97,7 @@ var/global/max_secret_rooms = 6
theme = "xenoden"
walltypes = list(/turf/simulated/mineral/random/high_chance=1)
floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand)
- treasureitems = list(/obj/item/clothing/mask/facehugger=1,/obj/item/stack/sheet/animalhide/xeno=2,/obj/item/clothing/suit/xenos=2,/obj/item/clothing/head/xenos=2,/obj/item/weapon/guardiancreator/biological=1)
+ treasureitems = list(/obj/item/clothing/mask/facehugger=1,/obj/item/stack/sheet/animalhide/xeno=2,/obj/item/clothing/suit/xenos=2,/obj/item/clothing/head/xenos=2,/obj/item/weapon/guardiancreator/biological/choose=1)
fluffitems = list(/obj/effect/decal/remains/human=1,/obj/effect/decal/cleanable/blood/xeno=5)
if("hitech")
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index ae432ee7336..bf5e661b299 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -135,13 +135,13 @@
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)) //Make sure they're a mob that has dna
- usr << "\blue Try as you might, you can not climb up into the scanner."
+ usr << "Try as you might, you can not climb up into the [src]."
return
if (src.occupant)
- usr << "\blue The scanner is already occupied!"
+ usr << "The [src] is already occupied!"
return
if (usr.abiotic())
- usr << "\blue Subject cannot have abiotic items on."
+ usr << "Subject cannot have abiotic items on."
return
usr.stop_pulling()
usr.client.perspective = EYE_PERSPECTIVE
@@ -172,21 +172,22 @@
if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc?
return
if(occupant)
- user << "\blue The DNA Scanner is already occupied!"
+ user << "The [src] is already occupied!"
return
var/mob/living/L = O
if(!istype(L) || L.buckled)
return
if(L.abiotic())
- user << "\red Subject cannot have abiotic items on."
+ user << "Subject cannot have abiotic items on."
return
for(var/mob/living/carbon/slime/M in range(1,L))
if(M.Victim == L)
- usr << "[L.name] will not fit into the DNA Scanner because they have a slime latched onto their head."
+ usr << "[L.name] will not fit into the [src] because they have a slime latched onto their head."
return
- if(L == user)
- return
- visible_message("[user] puts [L.name] into the DNA Scanner.")
+ if (L == user)
+ visible_message("[user] climbs into the [src].")
+ else
+ visible_message("[user] puts [L.name] into the [src].")
put_in(L)
if(user.pulling == L)
user.stop_pulling()
@@ -209,7 +210,7 @@
return
else if(istype(item, /obj/item/weapon/reagent_containers/glass))
if(beaker)
- user << "\red A beaker is already loaded into the machine."
+ user << "A beaker is already loaded into the machine."
return
if(!user.drop_item())
@@ -226,13 +227,13 @@
if (!ismob(G.affecting))
return
if (src.occupant)
- user << "\blue The scanner is already occupied!"
+ user << "The scanner is already occupied!"
return
if (G.affecting.abiotic())
- user << "\blue Subject cannot have abiotic items on."
+ user << "Subject cannot have abiotic items on."
return
if(panel_open)
- usr << "\blue Close the maintenance panel first."
+ usr << "Close the maintenance panel first."
return
put_in(G.affecting)
src.add_fingerprint(user)
@@ -266,11 +267,11 @@
/obj/machinery/dna_scannernew/proc/go_out()
if (!src.occupant)
- usr << "The scanner is empty!"
+ usr << "The scanner is empty!"
return
if (src.locked)
- usr << "The scanner is locked!"
+ usr << "The scanner is locked!"
return
if (src.occupant.client)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index a11424fd7cd..95dcf14267f 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -43,6 +43,24 @@
bot_type_name = "Medbot"
bot_filter = RADIO_MEDBOT
+/obj/machinery/bot/medbot/tox
+ skin = "tox"
+
+/obj/machinery/bot/medbot/o2
+ skin = "o2"
+
+/obj/machinery/bot/medbot/brute
+ skin = "brute"
+
+/obj/machinery/bot/medbot/fire
+ skin = "ointment"
+
+/obj/machinery/bot/medbot/adv
+ skin = "adv"
+
+/obj/machinery/bot/medbot/fish
+ skin = "fish"
+
/obj/machinery/bot/medbot/syndicate
name = "Suspicious Medibot"
desc = "You'd better have insurance!"
@@ -71,6 +89,12 @@
var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
w_class = 3.0
+ var/treatment_brute = "salglu_solution"
+ var/treatment_oxy = "salbutamol"
+ var/treatment_fire = "salglu_solution"
+ var/treatment_tox = "charcoal"
+ var/treatment_virus = "spaceacillin"
+ req_one_access = list(access_medical, access_robotics)
/obj/item/weapon/firstaid_arm_assembly/New()
..()
@@ -507,7 +531,23 @@
visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
- new /obj/item/weapon/storage/firstaid(Tsec)
+ switch(skin)
+ if("ointment")
+ new /obj/item/weapon/storage/firstaid/fire/empty(Tsec)
+ if("tox")
+ new /obj/item/weapon/storage/firstaid/toxin/empty(Tsec)
+ if("o2")
+ new /obj/item/weapon/storage/firstaid/o2/empty(Tsec)
+ if("brute")
+ new /obj/item/weapon/storage/firstaid/brute/empty(Tsec)
+ if("adv")
+ new /obj/item/weapon/storage/firstaid/adv/empty(Tsec)
+ if("bezerk")
+ new /obj/item/weapon/storage/firstaid/tactical/empty(Tsec)
+ if("fish")
+ new /obj/item/weapon/storage/firstaid/aquatic_kit(Tsec)
+ else
+ new /obj/item/weapon/storage/firstaid(Tsec)
new /obj/item/device/assembly/prox_sensor(Tsec)
@@ -559,7 +599,20 @@
A.skin = "tox"
else if(istype(src,/obj/item/weapon/storage/firstaid/o2))
A.skin = "o2"
-
+ else if(istype(src,/obj/item/weapon/storage/firstaid/brute))
+ A.skin = "brute"
+ else if(istype(src,/obj/item/weapon/storage/firstaid/adv))
+ A.skin = "adv"
+ else if(istype(src,/obj/item/weapon/storage/firstaid/tactical))
+ A.skin = "bezerk"
+ else if(istype(src,/obj/item/weapon/storage/firstaid/aquatic_kit))
+ A.skin = "fish"
+ A.req_one_access = req_one_access
+ A.treatment_oxy = treatment_oxy
+ A.treatment_brute = treatment_brute
+ A.treatment_fire = treatment_fire
+ A.treatment_tox = treatment_tox
+ A.treatment_virus = treatment_virus
qdel(S)
user.put_in_hands(A)
user << "You add the robot arm to the first aid kit."
@@ -596,5 +649,11 @@
var/obj/machinery/bot/medbot/S = new /obj/machinery/bot/medbot(T)
S.skin = skin
S.name = created_name
+ S.treatment_oxy = treatment_oxy
+ S.treatment_brute = treatment_brute
+ S.treatment_fire = treatment_fire
+ S.treatment_tox = treatment_tox
+ S.treatment_virus = treatment_virus
+ S.req_one_access = req_one_access
user.unEquip(src, 1)
qdel(src)
\ No newline at end of file
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 87f008bc453..7667aaa797a 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -250,7 +250,7 @@
find_control_computer()
/obj/machinery/cryopod/proc/find_control_computer(urgent=0)
- control_computer = locate(/obj/machinery/computer/cryopod) in src.loc.loc
+ control_computer = locate(/obj/machinery/computer/cryopod) in get_area(src)
// Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged
if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time)
@@ -463,6 +463,10 @@
if(do_after(user, 20, target = G:affecting))
if(!M || !G || !G:affecting) return
+ if(src.occupant)
+ user << "\The [src] is in use."
+ return
+
M.loc = src
if(M.client)
@@ -479,7 +483,7 @@
icon_state = occupied_icon_state
M << "[on_enter_occupant_message]"
- M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
occupant = M
time_entered = world.time
@@ -554,6 +558,9 @@
if(do_after(user, 20, target = L))
if(!L) return
+ if(src.occupant)
+ user << "\The [src] is in use."
+ return
L.loc = src
if(L.client)
@@ -569,7 +576,7 @@
icon_state = occupied_icon_state
L << "[on_enter_occupant_message]"
- L << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ L << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
occupant = L
time_entered = world.time
@@ -629,7 +636,7 @@
return
if(src.occupant)
- usr << "\The [src] is in use."
+ usr << "\The [src] is in use."
return
for(var/mob/living/carbon/slime/M in range(1,usr))
@@ -645,7 +652,7 @@
return
if(src.occupant)
- usr << "\The [src] is in use."
+ usr << "\The [src] is in use."
return
usr.stop_pulling()
@@ -660,7 +667,7 @@
icon_state = occupied_icon_state
usr << "[on_enter_occupant_message]"
- usr << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ usr << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
occupant = usr
time_entered = world.time
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index aa848a1b097..520f2ff4fb7 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -123,6 +123,13 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
rendered = "Holopad received, [name_used] [verb], \"[text]\""
master.show_message(rendered, 2)
return
+
+/obj/machinery/hologram/holopad/hear_message(mob/living/M, text)
+ if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
+ var/name_used = M.GetVoice()
+ var/rendered = "Holopad received, [name_used] [text]"
+ master.show_message(rendered, 2)
+ return
/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc)
hologram = new(T)//Spawn a blank effect at the location.
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 49dd158adf3..01443ade04e 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1260,12 +1260,12 @@
product_ads = "House-training costs extra!;Now with 1000% more cat hair!;Allergies are a sign of weakness!;Dogs are man's best friend. Remember that Vulpkanin!; Heat lamps for Unathi!; Vox-y want a cracker?"
vend_delay = 15
icon_state = "crittercare"
- products = list(/obj/item/clothing/accessory/petcollar = 5, /obj/item/weapon/storage/aquatic_kit/full =5, /obj/item/fish_eggs/goldfish = 5,
+ products = list(/obj/item/clothing/accessory/petcollar = 5, /obj/item/weapon/storage/firstaid/aquatic_kit/full =5, /obj/item/fish_eggs/goldfish = 5,
/obj/item/fish_eggs/clownfish = 5, /obj/item/fish_eggs/shark = 5, /obj/item/fish_eggs/feederfish = 10,
/obj/item/fish_eggs/salmon = 5, /obj/item/fish_eggs/catfish = 5, /obj/item/fish_eggs/glofish = 5,
/obj/item/fish_eggs/electric_eel = 5, /obj/item/fish_eggs/shrimp = 10, /obj/item/toy/pet_rock = 5,
)
- prices = list(/obj/item/clothing/accessory/petcollar = 50, /obj/item/weapon/storage/aquatic_kit/full = 60, /obj/item/fish_eggs/goldfish = 10,
+ prices = list(/obj/item/clothing/accessory/petcollar = 50, /obj/item/weapon/storage/firstaid/aquatic_kit/full = 60, /obj/item/fish_eggs/goldfish = 10,
/obj/item/fish_eggs/clownfish = 10, /obj/item/fish_eggs/shark = 10, /obj/item/fish_eggs/feederfish = 5,
/obj/item/fish_eggs/salmon = 10, /obj/item/fish_eggs/catfish = 10, /obj/item/fish_eggs/glofish = 10,
/obj/item/fish_eggs/electric_eel = 10, /obj/item/fish_eggs/shrimp = 5, /obj/item/toy/pet_rock = 100,
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 40e82c38d9c..b9a499e1ff1 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -505,7 +505,7 @@
icon_state = "mecha_plasmacutter"
item_state = "plasmacutter"
energy_drain = 60
- origin_tech = "materials=3;combat=2;powerstorage=3;plasma=3"
+ origin_tech = "materials=3;combat=2;powerstorage=3;plasmatech=3"
projectile = /obj/item/projectile/plasma/adv/mech
fire_sound = 'sound/weapons/laser.ogg'
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index ad6f64c706e..dc47c3fc146 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -13,6 +13,7 @@
item_state = "camera_bug"
throw_speed = 4
throw_range = 20
+ origin_tech = "syndicate=3;engineering=1"
var/obj/machinery/camera/current = null
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 11f706f01ba..6d7c7a26ed6 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -25,28 +25,34 @@
if(spamcheck)
user << "\red \The [src] needs to recharge!"
return
-
- var/message = sanitize(copytext(input(user, "Shout a message?", "Megaphone", null) as text,1,MAX_MESSAGE_LEN))
+
+ var/message = input(user, "Shout a message:", "Megaphone") as text|null
+ if(!message)
+ return
+ message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
if(!message)
return
message = capitalize(message)
if ((src.loc == user && usr.stat == 0))
if(emagged)
if(insults)
- for(var/mob/O in (viewers(user)))
- O.show_message("[user] broadcasts, \"[pick(insultmsg)]\"",2) // 2 stands for hearable message
+ saymsg(user, pick(insultmsg))
insults--
else
user << "\red *BZZZZzzzzzt*"
else
- for(var/mob/O in (viewers(user)))
- O.show_message("[user] broadcasts, \"[message]\"",2) // 2 stands for hearable message
+ saymsg(user, message)
spamcheck = 1
spawn(20)
spamcheck = 0
return
+/obj/item/device/megaphone/proc/saymsg(mob/living/user as mob, message)
+ audible_message("[user] broadcasts, \"[message]\"", hearing_distance = 14)
+ for(var/obj/O in oview(14, get_turf(src)))
+ O.hear_talk(user, "[message]")
+
/obj/item/device/megaphone/emag_act(user as mob)
if(!emagged)
user << "\red You overload \the [src]'s voice synthesizer."
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 89fe2a24232..ebaff840df5 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -93,7 +93,11 @@
mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] exclaims, \"[msg]\""
return
mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] says, \"[msg]\""
-
+
+/obj/item/device/taperecorder/hear_message(mob/living/M as mob, msg)
+ if(mytape && recording)
+ mytape.timestamp += mytape.used_capacity
+ mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] [msg]"
/obj/item/device/taperecorder/verb/record()
set name = "Start Recording"
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index a533efe0a58..2b256298835 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -68,6 +68,11 @@
for(var/obj/O in contents)
O.hear_talk(M, msg)
+/obj/item/device/transfer_valve/hear_message(mob/living/M as mob, msg)
+ ..()
+ for(var/obj/O in contents)
+ O.hear_message(M, msg)
+
/obj/item/device/transfer_valve/attack_self(mob/user as mob)
ui_interact(user)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 41db700ac12..6c77a5d4ed5 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1644,7 +1644,7 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/figure/attack_self(mob/user as mob)
if(cooldown < world.time)
cooldown = (world.time + 30) //3 second cooldown
- user << "The [src] says \"[toysay]\"."
+ user.visible_message("\icon[src] The [src] says \"[toysay]\".")
playsound(user, 'sound/machines/click.ogg', 20, 1)
/obj/item/toy/figure/cmo
@@ -1738,7 +1738,7 @@ obj/item/toy/cards/deck/syndicate/black
toysay = "I'm not qualified for this job."
/obj/item/toy/figure/hop
- name = "Head of Persomnel action figure"
+ name = "Head of Personnel action figure"
icon_state = "hop"
toysay = "Giving out all access!"
@@ -1758,9 +1758,9 @@ obj/item/toy/cards/deck/syndicate/black
toysay = "Look at the signs, you idiot."
/obj/item/toy/figure/lawyer
- name = "Lawyer action figure"
+ name = "Internal Affairs Agent action figure"
icon_state = "lawyer"
- toysay = "My client is a dirty traitor!"
+ toysay = "Standard Operating Procedure says they're guilty! Hacking is proof they're an Enemy of the Corporation!"
/obj/item/toy/figure/librarian
name = "Librarian action figure"
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 26dd1849a8a..6007154db66 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -235,6 +235,10 @@
if(nadeassembly)
nadeassembly.hear_talk(M, msg)
+/obj/item/weapon/grenade/chem_grenade/hear_message(mob/living/M, msg)
+ if(nadeassembly)
+ nadeassembly.hear_message(M, msg)
+
/obj/item/weapon/grenade/chem_grenade/Bump()
..()
if(nadeassembly)
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index a1e97eb3f92..f884e3b368b 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -9,7 +9,7 @@
throwforce = 5.0
throw_speed = 3
throw_range = 5
- w_class = 3.0
+ w_class = 2
var/charge = 0 // note %age conveted to actual charge in New
var/maxcharge = 10000
rating = 1
@@ -24,7 +24,7 @@
/obj/item/weapon/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
- origin_tech = "powerstorage=0"
+ origin_tech = null
maxcharge = 5000
rating = 2
materials = list(MAT_GLASS=40)
@@ -35,7 +35,7 @@
/obj/item/weapon/stock_parts/cell/secborg
name = "\improper Security borg rechargable D battery"
- origin_tech = "powerstorage=0"
+ origin_tech = null
maxcharge = 6000 //6000 max charge / 1000 charge per shot = six shots
rating = 2.5
materials = list(MAT_GLASS=40)
@@ -160,4 +160,4 @@
name = "temperature gun cell"
desc = "A specially designed power cell for heating and cooling projectiles"
icon_state = "icell"
- maxcharge = 900
\ No newline at end of file
+ maxcharge = 900
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index f6690ac0a1d..975a77eeca1 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -344,17 +344,17 @@
///Aquatic Starter Kit
-/obj/item/weapon/storage/aquatic_kit
+/obj/item/weapon/storage/firstaid/aquatic_kit
name = "aquatic starter kit"
- desc = "It's a starter kit box for an acquarium."
+ desc = "It's a starter kit box for an aquarium."
icon_state = "AquaticKit"
throw_speed = 2
throw_range = 8
-/obj/item/weapon/storage/aquatic_kit/full
+/obj/item/weapon/storage/firstaid/aquatic_kit/full
desc = "It's a starter kit for an acquarium; includes 1 tank brush, 1 egg scoop, 1 fish net, and 1 container of fish food."
-/obj/item/weapon/storage/aquatic_kit/full/New()
+/obj/item/weapon/storage/firstaid/aquatic_kit/full/New()
..()
new /obj/item/weapon/egg_scoop(src)
new /obj/item/weapon/fish_net(src)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index c4da0fe3a19..cbbc22c9b36 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -15,6 +15,12 @@
throw_speed = 2
throw_range = 8
var/empty = 0
+ req_one_access =list(access_medical, access_robotics) //Access and treatment are utilized for medbots.
+ var/treatment_brute = "salglu_solution"
+ var/treatment_oxy = "salbutamol"
+ var/treatment_fire = "salglu_solution"
+ var/treatment_tox = "charcoal"
+ var/treatment_virus = "spaceacillin"
/obj/item/weapon/storage/firstaid/fire
@@ -38,6 +44,8 @@
new /obj/item/weapon/reagent_containers/pill/salicylic( src )
return
+/obj/item/weapon/storage/firstaid/fire/empty
+ empty = 1
/obj/item/weapon/storage/firstaid/regular
desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer"
@@ -76,6 +84,9 @@
new /obj/item/device/healthanalyzer( src )
return
+/obj/item/weapon/storage/firstaid/toxin/empty
+ empty = 1
+
/obj/item/weapon/storage/firstaid/o2
name = "oxygen deprivation first aid kit"
desc = "A first aid kit that contains four pills of salbutamol, which is able to counter injuries caused by suffocation. Also contains a health analyzer to determine the health of the patient."
@@ -92,6 +103,9 @@
new /obj/item/device/healthanalyzer( src )
return
+/obj/item/weapon/storage/firstaid/o2/empty
+ empty = 1
+
/obj/item/weapon/storage/firstaid/brute
name = "brute trauma treatment kit"
desc = "A medical kit that contains several medical patches and pills for treating brute injuries. Contains one epinephrine syringe for emergency use and a health analyzer."
@@ -113,6 +127,9 @@
new /obj/item/stack/medical/bruise_pack(src)
return
+/obj/item/weapon/storage/firstaid/brute/empty
+ empty = 1
+
/obj/item/weapon/storage/firstaid/adv
name = "advanced first-aid kit"
desc = "Contains advanced medical treatments."
@@ -131,11 +148,19 @@
new /obj/item/stack/medical/splint(src)
return
+/obj/item/weapon/storage/firstaid/adv/empty
+ empty = 1
+
/obj/item/weapon/storage/firstaid/tactical
name = "first-aid kit"
icon_state = "bezerk"
desc = "I hope you've got insurance."
max_w_class = 3
+ treatment_oxy = "perfluorodecalin"
+ treatment_brute = "styptic_powder"
+ treatment_fire = "silver_sulfadiazine"
+ treatment_tox = "charcoal"
+ req_one_access =list(access_syndicate)
/obj/item/weapon/storage/firstaid/tactical/New()
..()
@@ -149,6 +174,9 @@
new /obj/item/clothing/glasses/hud/health/night(src)
return
+/obj/item/weapon/storage/firstaid/tactical/empty
+ empty =1
+
/obj/item/weapon/storage/firstaid/surgery
name = "field surgery kit"
icon_state = "duffel-med"
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index a6e8ef3ca57..56aecc16a94 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -149,7 +149,6 @@
/obj/proc/hear_talk(mob/M as mob, text)
-
if(talking_atom)
talking_atom.catchMessage(text, M)
@@ -159,8 +158,8 @@
var/rendered = "[M.name]: [text]"
mo.show_message(rendered, 2)
*/
- return
+/obj/proc/hear_message(mob/M as mob, text)
/obj/proc/multitool_menu(var/mob/user,var/obj/item/device/multitool/P)
return "NO MULTITOOL_MENU!"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index f227df88ed6..d59055afdcf 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -2,7 +2,7 @@
icon_state = "girder"
anchored = 1
density = 1
- layer = 2
+ layer = TURF_LAYER + 0.9
var/state = 0
var/health = 200
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index cdad32ee349..dbda18e7b71 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -85,6 +85,9 @@
if(bombassembly)
bombassembly.hear_talk(M, msg)
+/obj/item/device/onetankbomb/hear_message(mob/living/M as mob, msg)
+ if(bombassembly)
+ bombassembly.hear_message(M, msg)
// ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ----------
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index a37eeabcd9b..1d48afde8a5 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -100,6 +100,12 @@
a_left.hear_talk(M, msg)
if(a_right)
a_right.hear_talk(M, msg)
+
+ hear_message(mob/living/M as mob, msg)
+ if(a_left)
+ a_left.hear_message(M, msg)
+ if(a_right)
+ a_right.hear_message(M, msg)
proc/process_movement() // infrared beams and prox sensors
if(a_left && a_right)
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 1510c8791de..4c15b5f860e 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -6,6 +6,7 @@
origin_tech = "magnets=1"
var/listening = 0
var/recorded = null //the activation message
+ var/recorded_type = 0 // 0 for say, 1 for emote
bomb_name = "voice-activated bomb"
@@ -16,15 +17,22 @@
return "[src] is deactivated."
hear_talk(mob/living/M as mob, msg)
+ hear_input(M, msg, 0)
+
+ hear_message(mob/living/M as mob, msg)
+ hear_input(M, msg, 1)
+
+ proc/hear_input(mob/living/M as mob, msg, type)
if(!istype(M,/mob/living))
return
if(listening)
recorded = msg
+ recorded_type = type
listening = 0
var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"")
+ T.visible_message("\icon[src] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"")
else
- if(findtext(msg, recorded))
+ if(findtext(msg, recorded) && type == recorded_type)
pulse(0)
var/turf/T = get_turf(src) //otherwise it won't work in hand
T.visible_message("\icon[src] \red beeps!")
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 5cd501a0b8f..eb514bddba2 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -306,6 +306,7 @@
if (config && config.autoconvert_notes)
convert_notes_sql(ckey)
+
send_resources()
if(!void)
@@ -316,6 +317,7 @@
if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them.
src << "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you."
+
//////////////
//DISCONNECT//
//////////////
@@ -420,8 +422,9 @@
'html/search.js', // Used in various non-NanoUI HTML windows for search functionality
'html/panels.css' // Used for styling certain panels, such as in the new player panel
)
-
- getFilesSlow(src, asset_cache, register_asset = FALSE)
+ spawn (10)
+ //Precache the client with all other assets slowly, so as to not block other browse() calls
+ getFilesSlow(src, asset_cache, register_asset = FALSE)
//For debugging purposes
/client/proc/list_all_languages()
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 2910bd30e6d..d4572017361 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -43,6 +43,7 @@
name = "blood-red magboots"
icon_state = "syndiemag0"
magboot_state = "syndiemag"
+ origin_tech = "magnets=2;syndicate=3"
obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team
desc = "Reverse-engineered magboots that appear to be based on an advanced model, as they have a lighter magnetic pull. Property of Gorlex Marauders."
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 8ff83a239a8..2c2597c0011 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -33,6 +33,10 @@
pockets.hear_talk(M, msg)
..()
+/obj/item/clothing/suit/storage/hear_message(mob/M, var/msg)
+ pockets.hear_message(M, msg)
+ ..()
+
/obj/item/clothing/suit/storage/proc/return_inv()
var/list/L = list( )
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 36e59a86eb3..0bf75d5911b 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -40,6 +40,10 @@
hold.hear_talk(M, msg, verb, speaking)
..()
+/obj/item/clothing/accessory/storage/hear_message(mob/M, var/msg, verb, datum/language/speaking)
+ hold.hear_message(M, msg)
+ ..()
+
/obj/item/clothing/accessory/storage/proc/return_inv()
var/list/L = list( )
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 6b698640d5c..f3091ec5109 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -15,7 +15,7 @@
for(var/obj/item/organ/I in internal_organs)
if(istype(loc,/turf))
- I.removed(src)
+ I.removed()
spawn()
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 28879225b39..c83c35bd61b 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -89,7 +89,7 @@
stance_damage = 0
// standing is poor
- if(stance_damage >= 4)
+ if(stance_damage >= 8)
if(!(lying || resting))
if(species && !(species.flags & NO_PAIN))
emote("scream")
diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm
index a7d07c8485c..f88f41e6d17 100644
--- a/code/modules/mob/living/simple_animal/bees.dm
+++ b/code/modules/mob/living/simple_animal/bees.dm
@@ -3,6 +3,7 @@
name = "bees"
icon = 'icons/obj/apiary_bees_etc.dmi'
icon_state = "bees1"
+ icon_living = "bees1"
icon_dead = "bees1"
var/strength = 1
var/feral = 0
@@ -79,8 +80,8 @@
B.strength = rand(1,5)
src.strength -= B.strength
if(src.strength <= 5)
- src.icon_state = "bees[src.strength]"
- B.icon_state = "bees[B.strength]"
+ src.icon_living = "bees[src.strength]"
+ B.icon_living = "bees[B.strength]"
if(src.parent)
B.parent = src.parent
src.parent.owned_bee_swarms.Add(B)
@@ -117,9 +118,9 @@
if(feral > 0)
src.strength += B.strength
qdel(B)
- src.icon_state = "bees[src.strength]"
+ src.icon_living = "bees[src.strength]"
if(strength > 5)
- icon_state = "bees_swarm"
+ icon_living = "bees_swarm"
else if(prob(10))
//make the other swarm of bees stronger, then move away
var/total_bees = B.strength + src.strength
@@ -127,11 +128,11 @@
B.strength = min(5, total_bees)
src.strength = total_bees - B.strength
- B.icon_state = "bees[B.strength]"
+ B.icon_living = "bees[B.strength]"
if(src.strength <= 0)
qdel(src)
return
- src.icon_state = "bees[B.strength]"
+ src.icon_living = "bees[B.strength]"
var/turf/simulated/floor/T = get_turf(get_step(src, pick(1,2,4,8)))
density = 1
if(T.Enter(src, get_turf(src)))
@@ -180,9 +181,9 @@
if(strength <= 0)
qdel(src)
else if(strength <= 5)
- icon_state = "bees[strength]"
+ icon_living = "bees[strength]"
//debugging
- /*icon_state = "[strength]"
+ /*icon_living = "[strength]"
if(strength > 5)
- icon_state = "unknown"*/
+ icon_living = "unknown"*/
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 2711527642f..fd77e0ff2bd 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -106,7 +106,21 @@
for(var/mob/M in get_mobs_in_view(range, src))
if(self_message && M==src)
msg = self_message
- M.show_message( msg, 2, deaf_message, 1)
+ M.show_message(msg, 2, deaf_message, 1)
+
+ // based on say code
+ var/omsg = replacetext(message, "[src] ", "")
+ var/list/listening_obj = new
+ for(var/atom/movable/A in view(range, src))
+ if(istype(A, /mob))
+ var/mob/M = A
+ for(var/obj/O in M.contents)
+ listening_obj |= O
+ else if(istype(A, /obj))
+ var/obj/O = A
+ listening_obj |= O
+ for(var/obj/O in listening_obj)
+ O.hear_message(src, omsg)
// Show a message to all mobs in earshot of this atom
// Use for objects performing audible actions
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 1c3ea26b911..133018743cc 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -497,7 +497,6 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
var/icon_on = "videocam_on"
var/icon_off = "videocam"
var/canhear_range = 7
- var/watcherslist = list()
/obj/item/device/videocam/attack_self(mob/user)
on = !on
@@ -523,14 +522,19 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
if(..(user, 1))
user << "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active."
-
/obj/item/device/videocam/hear_talk(mob/M as mob, msg)
if (camera && on)
if(get_dist(src, M) <= canhear_range)
talk_into(M, msg)
- for(var/mob/living/carbon/human/H in watcherslist)
- H.show_message(text("\blue (Newscaster) [] says, '[]'",M,msg), 1)
+ for(var/obj/machinery/computer/security/telescreen/T in machines)
+ if(T.current == camera)
+ T.audible_message("(Newscaster) [M] says, '[msg]'", hearing_distance = 2)
+/obj/item/device/videocam/hear_message(mob/M as mob, msg)
+ if (camera && on)
+ for(var/obj/machinery/computer/security/telescreen/T in machines)
+ if(T.current == camera)
+ T.audible_message("(Newscaster) [M] [msg]", hearing_distance = 2)
///hauntings, like hallucinations but more spooky
diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm
index 9bee5b09324..c27bef559ae 100644
--- a/code/modules/reagents/newchem/drugs.dm
+++ b/code/modules/reagents/newchem/drugs.dm
@@ -370,11 +370,14 @@
var/high_message = pick("You feel like you're made of steel!", "You feel invigorated!", "You feel really buff!", "You feel on top of the world!", "You feel full of energy!")
if(prob(5))
M << "[high_message]"
- M.adjustStaminaLoss(-35)
- M.adjustToxLoss(1)
- if(prob(3))
- M.losebreath += 2
- M.Stun(2)
+ M.adjustStaminaLoss(-40)
+ if(prob(90))
+ M.adjustToxLoss(1)
+ if(prob(5))
+ M << "You cannot breathe!"
+ M.losebreath += 1
+ M.adjustOxyLoss(15)
+ M.Stun(1)
..()
return
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 3e64245d2c5..a10e265fecf 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -266,6 +266,10 @@
if(assembly)
assembly.hear_talk(M, msg)
+/obj/item/weapon/reagent_containers/glass/beaker/hear_message(mob/living/M, msg)
+ if(assembly)
+ assembly.hear_message(M, msg)
+
/obj/item/weapon/reagent_containers/glass/beaker/large
name = "large beaker"
desc = "A large beaker. Can hold up to 100 units."
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 6818390cf98..802c2a5f25d 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -176,6 +176,10 @@
if(rig)
rig.hear_talk(M, msg)
+/obj/structure/reagent_dispensers/fueltank/hear_message(mob/living/M, msg)
+ if(rig)
+ rig.hear_message(M, msg)
+
/obj/structure/reagent_dispensers/fueltank/Bump()
..()
if(rig)
diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi
index 1a0d4960abe..b6e60dab2dc 100644
Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ