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