Merge branch 'master' into Arokha/matdefs

This commit is contained in:
Aronai Sieyes
2021-07-07 14:29:30 -04:00
committed by GitHub
283 changed files with 4118 additions and 1405 deletions
+2 -2
View File
@@ -86,7 +86,7 @@
reattach_paddles(user)
else if(istype(W, /obj/item/weapon/cell))
if(bcell)
to_chat(user, "<span class='notice'>\the [src] already has a cell.</span>")
to_chat(user, "<span class='notice'>\The [src] already has a cell.</span>")
else
if(!user.unEquip(W))
return
@@ -392,7 +392,7 @@
user.visible_message("<span class='warning'>\The [user] begins to place [src] on [H]'s chest.</span>", "<span class='warning'>You begin to place [src] on [H]'s chest...</span>")
if(!do_after(user, 30, H))
return
user.visible_message("<span class='notice'>\The [user] places [src] on [H]'s chest.</span>", "<span class='warning'>You place [src] on [H]'s chest.</span>")
user.visible_message("<b>\The [user]</b> places [src] on [H]'s chest.", "<span class='warning'>You place [src] on [H]'s chest.</span>")
playsound(src, 'sound/machines/defib_charge.ogg', 50, 0)
var/error = can_defib(H)
+2 -2
View File
@@ -41,7 +41,7 @@
if(repairing)
to_chat(user, "<span class='notice'>\The [src] is already being repaired!</span>")
return
user.visible_message("<span class='notice'>\The [user] starts trying to repair \the [src]'s bulb.</span>")
user.visible_message("<b>\The [user]</b> starts trying to repair \the [src]'s bulb.")
repairing = TRUE
if(do_after(user, (40 SECONDS + rand(0, 20 SECONDS)) * W.toolspeed) && can_repair)
if(prob(30))
@@ -50,7 +50,7 @@
update_icon()
playsound(src, W.usesound, 50, 1)
else
user.visible_message("<span class='notice'>\The [user] fails to repair \the [src].</span>")
user.visible_message("<b>\The [user]</b> fails to repair \the [src].")
repairing = FALSE
else
..()
@@ -115,7 +115,7 @@
if(!vision)
to_chat(user, "<span class='warning'>You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!</span>")
user.visible_message("<span class='notice'>\The [user] directs [src] to [M]'s eyes.</span>", \
user.visible_message("<b>\The [user]</b> directs [src] to [M]'s eyes.", \
"<span class='notice'>You direct [src] to [M]'s eyes.</span>")
if(H != user) //can't look into your own eyes buster
if(M.stat == DEAD || M.blinded) //mob is dead or fully blind
+1 -1
View File
@@ -49,7 +49,7 @@
playsound(src, O.usesound, 100, 1)
user.visible_message("<span class='notice'>\The [user] opens \the [src] and modifies \the [O].</span>","<span class='notice'>You open \the [src] and modify \the [O].</span>")
user.visible_message("<b>\The [user]</b> opens \the [src] and modifies \the [O].","<span class='notice'>You open \the [src] and modify \the [O].</span>")
I.refit_for_species(target_species)
+1 -1
View File
@@ -32,7 +32,7 @@
tool_qualities = list(TOOL_MULTITOOL)
/obj/item/device/multitool/attack_self(mob/living/user)
var/choice = tgui_alert(usr, "What do you want to do with \the [src]?","Multitool Menu", "Switch Mode", list("Clear Buffers", "Cancel"))
var/choice = tgui_alert(usr, "What do you want to do with \the [src]?", "Multitool Menu", list("Switch Mode", "Clear Buffers", "Cancel"))
switch(choice)
if("Cancel")
to_chat(user,"<span class='notice'>You lower \the [src].</span>")
@@ -11,6 +11,7 @@
light_color = "#00ff00"
light_power = 0.25
blocks_emissive = NONE
vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature
var/circuit = /obj/item/weapon/circuitboard/intercom
var/number = 0
var/wiresexposed = 0
@@ -270,7 +270,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
if(H.resleeve_lock && stored_mind.loaded_from_ckey != H.resleeve_lock)
to_chat(usr,"<span class='warning'>\[H] is protected from impersonation!</span>")
to_chat(usr,"<span class='warning'>\The [H] is protected from impersonation!</span>")
return
usr.visible_message("<span class='warning'>[usr] begins uploading someone's mind into [target]!</span>","<span class='notice'>You begin uploading a mind into [target]!</span>")
+13 -13
View File
@@ -108,7 +108,7 @@
return 1
else
var/available = get_amount()
user.visible_message("<span class='notice'>\The [user] starts bandaging [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts bandaging [M]'s [affecting.name].", \
"<span class='notice'>You start bandaging [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
@@ -131,10 +131,10 @@
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> bandages \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a bandage over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a bandage over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
playsound(src, pick(apply_sounds), 25)
@@ -177,7 +177,7 @@
return 1
else
var/available = get_amount()
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts treating [M]'s [affecting.name].", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
@@ -200,14 +200,14 @@
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> bandages \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
//H.add_side_effect("Itch")
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a bruise patch over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
// W.disinfect() // VOREStation - Tech1 should not disinfect
@@ -250,7 +250,7 @@
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts salving wounds on [M]'s [affecting.name].", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10, exclusive = TRUE))
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
@@ -290,7 +290,7 @@
return 1
else
var/available = get_amount()
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts treating [M]'s [affecting.name].", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
@@ -312,13 +312,13 @@
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.</span>", \
user.visible_message("<b>\The [user]</b> cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \
"<span class='notice'>You clean and seal \a [W.desc] on [M]'s [affecting.name].</span>" )
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a medical patch over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> smears some bioglue over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You smear some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
W.disinfect()
@@ -358,7 +358,7 @@
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts salving wounds on [M]'s [affecting.name].", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10, exclusive = TRUE))
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
+1 -1
View File
@@ -177,7 +177,7 @@
if(!S.open)
to_chat(user, "<span class='warning'>You have to cut [S] open first!</span>")
return
M.visible_message("<span class='notice'>\The [user] scans the wounds on [M]'s [S.name] with [src]</span>")
M.visible_message("<b>\The [user]</b> scans the wounds on [M]'s [S.name] with [src]")
src.add_data(S)
+2 -2
View File
@@ -97,7 +97,7 @@
/obj/item/weapon/cane/white/collapsible/attack_self(mob/user as mob)
on = !on
if(on)
user.visible_message("<span class='notice'>\The [user] extends the white cane.</span>",\
user.visible_message("<b>\The [user]</b> extends the white cane.",\
"<span class='warning'>You extend the white cane.</span>",\
"You hear an ominous click.")
icon_state = "whitecane1out"
@@ -106,7 +106,7 @@
force = 5
attack_verb = list("smacked", "struck", "cracked", "beaten")
else
user.visible_message("<span class='notice'>\The [user] collapses the white cane.</span>",\
user.visible_message("<b>\The [user]</b> collapses the white cane.",\
"<span class='notice'>You collapse the white cane.</span>",\
"You hear a click.")
icon_state = "whitecane1in"
@@ -9,7 +9,7 @@
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_screwdriver())
playsound(src, I.usesound, 50, 1)
user.visible_message("<span class='notice'>\The [user] adjusts the jumper on \the [src]'s access protocol pins.</span>", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
user.visible_message("<b>\The [user]</b> adjusts the jumper on \the [src]'s access protocol pins.", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
if(build_path == /obj/machinery/computer/rdconsole/core)
name = T_BOARD("RD Console - Robotics")
build_path = /obj/machinery/computer/rdconsole/robotics
@@ -14,7 +14,7 @@
/obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_screwdriver())
playsound(src, I.usesound, 50, 1)
user.visible_message("<span class='notice'>\The [user] adjusts the jumper on \the [src]'s access protocol pins.</span>", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
user.visible_message("<b>\The [user]</b> adjusts the jumper on \the [src]'s access protocol pins.", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
if(build_path == /obj/machinery/r_n_d/server/core)
name = T_BOARD("RD Console - Robotics")
build_path = /obj/machinery/r_n_d/server/robotics
@@ -11,6 +11,8 @@
var/stage = 0
var/state = 0
var/path = 0
/// If TRUE, grenade is permanently sealed when fully assembled, useful for things like off-the-shelf grenades.
var/sealed = FALSE
var/obj/item/device/assembly_holder/detonator = null
var/list/beakers = new/list()
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
@@ -93,7 +95,8 @@
if(active && prob(95))
to_chat(user, "<span class='warning'>You trigger the assembly!</span>")
detonate()
return
else if(sealed)
to_chat(user, "<span class='warning'>This grenade lacks a way to disassemble it.</span>")
else
to_chat(user, "<span class='notice'>You unlock the assembly.</span>")
playsound(src, W.usesound, 50, -3)
@@ -200,8 +203,10 @@
/obj/item/weapon/grenade/chem_grenade/metalfoam
name = "metal-foam grenade"
desc = "Used for emergency sealing of air breaches."
icon_state = "foam"
path = 1
stage = 2
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/metalfoam/Initialize()
. = ..()
@@ -216,13 +221,14 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/incendiary
name = "incendiary grenade"
desc = "Used for clearing rooms of living things."
icon_state = "incendiary"
path = 1
stage = 2
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/incendiary/Initialize()
. = ..()
@@ -239,13 +245,13 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/antiweed
name = "weedkiller grenade"
desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents."
path = 1
stage = 2
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/antiweed/Initialize()
. = ..()
@@ -266,8 +272,10 @@
/obj/item/weapon/grenade/chem_grenade/cleaner
name = "cleaner grenade"
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
icon_state = "cleaner"
stage = 2
path = 1
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/cleaner/Initialize()
. = ..()
@@ -282,13 +290,14 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/teargas
name = "tear gas grenade"
desc = "Concentrated Capsaicin. Contents under pressure. Use with caution."
icon_state = "teargas"
stage = 2
path = 1
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/teargas/Initialize()
. = ..()
@@ -305,4 +314,4 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
+2 -2
View File
@@ -301,7 +301,7 @@ var/last_chew = 0
return 1
/obj/item/weapon/handcuffs/legcuffs/bola/dropped()
visible_message("<span class='notice'>\The [src] falls apart!</span>")
visible_message("<b>\The [src]</b> falls apart!")
qdel(src)
/obj/item/weapon/handcuffs/legcuffs/bola/place_legcuffs(var/mob/living/carbon/target, var/mob/user)
@@ -313,7 +313,7 @@ var/last_chew = 0
return 0
if(!H.has_organ_for_slot(slot_legcuffed))
H.visible_message("<span class='notice'>\The [src] slams into [H], but slides off!</span>")
H.visible_message("<b>\The [src]</b> slams into [H], but slides off!")
src.dropped()
return 0
@@ -75,6 +75,26 @@
/obj/item/weapon/material/kitchen/utensil/fork/plastic
default_material = "plastic"
/obj/item/weapon/material/kitchen/utensil/foon
name = "foon"
desc = "It's a foon. The forgotten cousin of the spork."
icon_state = "foon"
sharp = TRUE
edge = FALSE
/obj/item/weapon/material/kitchen/utensil/foon/plastic
default_material = "plastic"
/obj/item/weapon/material/kitchen/utensil/spork
name = "spork"
desc = "It's a spork. The (un)holy merger of a spoon and fork."
icon_state = "spork"
sharp = TRUE
edge = FALSE
/obj/item/weapon/material/kitchen/utensil/spork/plastic
default_material = "plastic"
/obj/item/weapon/material/kitchen/utensil/spoon
name = "spoon"
desc = "It's a spoon. You can see your own upside-down face in it."
@@ -123,6 +123,16 @@
icon_state = "render"
applies_material_colour = 0
/obj/item/weapon/material/knife/table
name = "table knife"
icon = 'icons/obj/kitchen.dmi'
icon_state = "knife_table"
sharp = FALSE // blunted tip
force_divisor = 0.1
/obj/item/weapon/material/knife/table/plastic
default_material = "plastic"
/obj/item/weapon/material/knife/butch
name = "butcher's cleaver"
icon_state = "butch"
@@ -333,7 +333,7 @@ var/list/tape_roll_applications = list()
/obj/item/tape/attack_hand(mob/user as mob)
if (user.a_intent == I_HELP && src.allowed(user))
user.show_viewers("<span class='notice'>\The [user] lifts \the [src], allowing passage.</span>")
user.show_viewers("<b>\The [user]</b> lifts \the [src], allowing passage.")
for(var/obj/item/tape/T in gettapeline())
T.lift(100) //~10 seconds
else
@@ -377,7 +377,7 @@ var/list/tape_roll_applications = list()
if(user.a_intent == I_HELP)
to_chat(user, "<span class='warning'>You refrain from breaking \the [src].</span>")
return
user.visible_message("<span class='notice'>\The [user] breaks \the [src]!</span>","<span class='notice'>You break \the [src].</span>")
user.visible_message("<b>\The [user]</b> breaks \the [src]!","<span class='notice'>You break \the [src].</span>")
for (var/obj/item/tape/T in gettapeline())
if(T == src)
@@ -75,57 +75,69 @@
/obj/item/weapon/storage/backpack/cultpack
name = "trophy rack"
desc = "It's useful for both carrying extra gear and proudly declaring your insanity."
icon_state = "cultpack"
icon_state = "backpack_cult"
/obj/item/weapon/storage/backpack/clown
name = "Giggles von Honkerton"
desc = "It's a backpack made by Honk! Co."
icon_state = "clownpack"
icon_state = "backpack_clown"
/obj/item/weapon/storage/backpack/white
name = "white backpack"
icon_state = "backpack_white"
/obj/item/weapon/storage/backpack/fancy
name = "fancy backpack"
icon_state = "backpack_fancy"
/obj/item/weapon/storage/backpack/military
name = "military backpack"
icon_state = "backpack_military"
/obj/item/weapon/storage/backpack/medic
name = "medical backpack"
desc = "It's a backpack especially designed for use in a sterile environment."
icon_state = "medicalpack"
icon_state = "backpack_medical"
/obj/item/weapon/storage/backpack/security
name = "security backpack"
desc = "It's a very robust backpack."
icon_state = "securitypack"
icon_state = "backpack_security"
/obj/item/weapon/storage/backpack/captain
name = "site manager's backpack"
desc = "It's a special backpack made exclusively for officers."
icon_state = "captainpack"
icon_state = "backpack_captain"
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
icon_state = "engiepack"
icon_state = "backpack_industrial"
/obj/item/weapon/storage/backpack/toxins
name = "laboratory backpack"
desc = "It's a light backpack modeled for use in laboratories and other scientific institutions."
icon_state = "toxpack"
icon_state = "backpack_purple"
/obj/item/weapon/storage/backpack/hydroponics
name = "herbalist's backpack"
desc = "It's a green backpack with many pockets to store plants and tools in."
icon_state = "hydpack"
icon_state = "backpack_hydro"
/obj/item/weapon/storage/backpack/genetics
name = "geneticist backpack"
desc = "It's a backpack fitted with slots for diskettes and other workplace tools."
icon_state = "genpack"
icon_state = "backpack_blue"
/obj/item/weapon/storage/backpack/virology
name = "sterile backpack"
desc = "It's a sterile backpack able to withstand different pathogens from entering its fabric."
icon_state = "viropack"
icon_state = "backpack_green"
/obj/item/weapon/storage/backpack/chemistry
name = "chemistry backpack"
desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles."
icon_state = "chempack"
icon_state = "backpack_orange"
/*
* Duffle Types
@@ -162,7 +174,7 @@
/obj/item/weapon/storage/backpack/dufflebag/med
name = "medical dufflebag"
desc = "A large dufflebag for holding extra medical supplies."
icon_state = "duffle_med"
icon_state = "duffle_medical"
/obj/item/weapon/storage/backpack/dufflebag/emt
name = "EMT dufflebag"
@@ -172,17 +184,27 @@
/obj/item/weapon/storage/backpack/dufflebag/sec
name = "security dufflebag"
desc = "A large dufflebag for holding extra security supplies and ammunition."
icon_state = "duffle_sec"
icon_state = "duffle_security"
/obj/item/weapon/storage/backpack/dufflebag/eng
name = "industrial dufflebag"
desc = "A large dufflebag for holding extra tools and supplies."
icon_state = "duffle_eng"
icon_state = "duffle_industrial"
/obj/item/weapon/storage/backpack/dufflebag/sci
name = "science dufflebag"
desc = "A large dufflebag for holding circuits and beakers."
icon_state = "duffle_sci"
icon_state = "duffle_science"
/obj/item/weapon/storage/backpack/dufflebag/drone
name = "drone dufflebag"
desc = "A large dufflebag for holding small robots? Or maybe it's one used by robots!"
icon_state = "duffle_drone"
/obj/item/weapon/storage/backpack/dufflebag/cursed
name = "cursed dufflebag"
desc = "That probably shouldn't be moving..."
icon_state = "duffle_cursed"
/*
* Satchel Types
@@ -192,7 +214,6 @@
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
icon_state = "satchel"
item_state_slots = list(slot_r_hand_str = "briefcase", slot_l_hand_str = "briefcase")
/obj/item/weapon/storage/backpack/satchel/withwallet
starts_with = list(/obj/item/weapon/storage/wallet/random)
@@ -200,67 +221,70 @@
/obj/item/weapon/storage/backpack/satchel/norm
name = "satchel"
desc = "A trendy looking satchel."
icon_state = "satchel-norm"
icon_state = "satchel_grey"
/obj/item/weapon/storage/backpack/satchel/white
name = "white satchel"
icon_state = "satchel_white"
/obj/item/weapon/storage/backpack/satchel/fancy
name = "fancy satchel"
icon_state = "satchel_fancy"
/obj/item/weapon/storage/backpack/satchel/military
name = "military satchel"
icon_state = "satchel_military"
/obj/item/weapon/storage/backpack/satchel/eng
name = "industrial satchel"
desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng"
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
icon_state = "satchel_industrial"
/obj/item/weapon/storage/backpack/satchel/med
name = "medical satchel"
desc = "A sterile satchel used in medical departments."
icon_state = "satchel-med"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
icon_state = "satchel_medical"
/obj/item/weapon/storage/backpack/satchel/vir
name = "virologist satchel"
desc = "A sterile satchel with virologist colours."
icon_state = "satchel-vir"
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
icon_state = "satchel_green"
/obj/item/weapon/storage/backpack/satchel/chem
name = "chemist satchel"
desc = "A sterile satchel with chemist colours."
icon_state = "satchel-chem"
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
icon_state = "satchel_orange"
/obj/item/weapon/storage/backpack/satchel/gen
name = "geneticist satchel"
desc = "A sterile satchel with geneticist colours."
icon_state = "satchel-gen"
item_state_slots = list(slot_r_hand_str = "genpack", slot_l_hand_str = "genpack")
icon_state = "satchel_blue"
/obj/item/weapon/storage/backpack/satchel/tox
name = "scientist satchel"
desc = "Useful for holding research materials."
icon_state = "satchel-tox"
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
icon_state = "satchel_purple"
/obj/item/weapon/storage/backpack/satchel/sec
name = "security satchel"
desc = "A robust satchel for security related needs."
icon_state = "satchel-sec"
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
icon_state = "satchel_security"
/obj/item/weapon/storage/backpack/satchel/hyd
name = "hydroponics satchel"
desc = "A green satchel for plant related work."
icon_state = "satchel_hyd"
icon_state = "satchel_hydro"
/obj/item/weapon/storage/backpack/satchel/cap
name = "site manager's satchel"
desc = "An exclusive satchel for officers."
icon_state = "satchel-cap"
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
icon_state = "satchel_captain"
//ERT backpacks.
/obj/item/weapon/storage/backpack/ert
name = "emergency response team backpack"
desc = "A spacious backpack with lots of pockets, used by members of the Emergency Response Team."
icon_state = "ert_commander"
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
//Commander
/obj/item/weapon/storage/backpack/ert/commander
@@ -292,59 +316,106 @@
/obj/item/weapon/storage/backpack/messenger
name = "messenger bag"
desc = "A sturdy backpack worn over one shoulder."
icon_state = "courierbag"
item_state_slots = list(slot_r_hand_str = "backpack", slot_l_hand_str = "backpack")
icon_state = "courier"
item_state_slots = list(slot_r_hand_str = "satchel_grey", slot_l_hand_str = "satchel_grey")
/obj/item/weapon/storage/backpack/messenger/chem
name = "chemistry messenger bag"
desc = "A serile backpack worn over one shoulder. This one is in Chemsitry colors."
icon_state = "courierbagchem"
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
icon_state = "courier_chemistry"
item_state_slots = list(slot_r_hand_str = "satchel_orange", slot_l_hand_str = "satchel_orange")
/obj/item/weapon/storage/backpack/messenger/med
name = "medical messenger bag"
desc = "A sterile backpack worn over one shoulder used in medical departments."
icon_state = "courierbagmed"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
icon_state = "courier_medical"
item_state_slots = list(slot_r_hand_str = "satchel_medical", slot_l_hand_str = "satchel_medical")
/obj/item/weapon/storage/backpack/messenger/viro
name = "virology messenger bag"
desc = "A sterile backpack worn over one shoulder. This one is in Virology colors."
icon_state = "courierbagviro"
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
icon_state = "courier_virology"
item_state_slots = list(slot_r_hand_str = "satchel_green", slot_l_hand_str = "satchel_green")
/obj/item/weapon/storage/backpack/messenger/tox
name = "research messenger bag"
desc = "A backpack worn over one shoulder. Useful for holding science materials."
icon_state = "courierbagtox"
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
icon_state = "courier_toxins"
item_state_slots = list(slot_r_hand_str = "satchel_purple", slot_l_hand_str = "satchel_purple")
/obj/item/weapon/storage/backpack/messenger/com
name = "command messenger bag"
desc = "A special backpack worn over one shoulder. This one is made specifically for officers."
icon_state = "courierbagcom"
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
icon_state = "courier_captain"
item_state_slots = list(slot_r_hand_str = "satchel_captain", slot_l_hand_str = "satchel_captain")
/obj/item/weapon/storage/backpack/messenger/engi
name = "engineering messenger bag"
icon_state = "courierbagengi"
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
icon_state = "courier_industrial"
item_state_slots = list(slot_r_hand_str = "satchel_industrial", slot_l_hand_str = "satchel_industrial")
/obj/item/weapon/storage/backpack/messenger/hyd
name = "hydroponics messenger bag"
desc = "A backpack worn over one shoulder. This one is designed for plant-related work."
icon_state = "courierbaghyd"
icon_state = "courier_hydro"
item_state_slots = list(slot_r_hand_str = "satchel_hydro", slot_l_hand_str = "satchel_hydro")
/obj/item/weapon/storage/backpack/messenger/sec
name = "security messenger bag"
desc = "A tactical backpack worn over one shoulder. This one is in Security colors."
icon_state = "courierbagsec"
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
icon_state = "courier_security"
item_state_slots = list(slot_r_hand_str = "satchel_security", slot_l_hand_str = "satchel_security")
/obj/item/weapon/storage/backpack/messenger/black
icon_state = "courierbagblk"
icon_state = "courier_black"
/*
* Sport Bags
*/
/obj/item/weapon/storage/backpack/sport
name = "sports backpack"
icon_state = "backsport"
/obj/item/weapon/storage/backpack/sport/white
name = "white sports backpack"
icon_state = "backsport_white"
/obj/item/weapon/storage/backpack/sport/fancy
name = "fancy sports backpack"
icon_state = "backsport_fancy"
/obj/item/weapon/storage/backpack/sport/vir
name = "virologist sports backpack"
desc = "A sterile sports backpack with virologist colours."
icon_state = "backsport_green"
/obj/item/weapon/storage/backpack/sport/chem
name = "chemist sports backpack"
desc = "A sterile sports backpack with chemist colours."
icon_state = "backsport_orange"
/obj/item/weapon/storage/backpack/sport/gen
name = "geneticist sports backpack"
desc = "A sterile sports backpack with geneticist colours."
icon_state = "backsport_blue"
/obj/item/weapon/storage/backpack/sport/tox
name = "scientist sports backpack"
desc = "Useful for holding research materials."
icon_state = "backsport_purple"
/obj/item/weapon/storage/backpack/sport/sec
name = "security sports backpack"
desc = "A robust sports backpack for security related needs."
icon_state = "backsport_security"
/obj/item/weapon/storage/backpack/sport/hyd
name = "hydroponics sports backpack"
desc = "A green sports backpack for plant related work."
icon_state = "backsport_hydro"
//Purses
/obj/item/weapon/storage/backpack/purse
name = "purse"
@@ -394,29 +465,29 @@
return
if(!parachute) //This packs the parachute
H.visible_message("<span class='notice'>\The [H] starts to pack \the [src]!</span>", \
H.visible_message("<b>\The [H]</b> starts to pack \the [src]!", \
"<span class='notice'>You start to pack \the [src]!</span>", \
"You hear the shuffling of cloth.")
if(do_after(H, 50))
H.visible_message("<span class='notice'>\The [H] finishes packing \the [src]!</span>", \
H.visible_message("<b>\The [H]</b> finishes packing \the [src]!", \
"<span class='notice'>You finish packing \the [src]!</span>", \
"You hear the shuffling of cloth.")
parachute = TRUE
else
H.visible_message("<span class='notice'>\The [src] gives up on packing \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> gives up on packing \the [src]!", \
"<span class='notice'>You give up on packing \the [src]!</span>")
return
else //This unpacks the parachute
H.visible_message("<span class='notice'>\The [src] starts to unpack \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> starts to unpack \the [src]!", \
"<span class='notice'>You start to unpack \the [src]!</span>", \
"You hear the shuffling of cloth.")
if(do_after(H, 25))
H.visible_message("<span class='notice'>\The [src] finishes unpacking \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> finishes unpacking \the [src]!", \
"<span class='notice'>You finish unpacking \the [src]!</span>", \
"You hear the shuffling of cloth.")
parachute = FALSE
else
H.visible_message("<span class='notice'>\The [src] decides not to unpack \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> decides not to unpack \the [src]!", \
"<span class='notice'>You decide not to unpack \the [src]!</span>")
return
@@ -53,6 +53,16 @@
icon_state = "trashbag2"
else icon_state = "trashbag3"
/obj/item/weapon/storage/bag/trash/holding
name = "trash bag of holding"
desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage."
icon_state = "bluetrashbag"
origin_tech = list(TECH_BLUESPACE = 3)
max_w_class = ITEMSIZE_NORMAL
max_storage_space = ITEMSIZE_COST_NORMAL * 10 // Slightly less than BoH
/obj/item/weapon/storage/bag/trash/holding/update_icon()
return
// -----------------------------
// Plastic Bag
@@ -236,7 +236,7 @@
if(istype(W, /obj/item/clothing/mask/smokable/cigarette))
var/obj/item/clothing/mask/smokable/cigarette/C = W
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
..()
return ..()
/obj/item/weapon/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
@@ -343,7 +343,7 @@
var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W
if(!istype(C)) return
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
..()
return ..()
/obj/item/weapon/storage/rollingpapers
name = "rolling paper pack"
@@ -0,0 +1,186 @@
#define INVENTORY_POUCH_SPACE ITEMSIZE_COST_SMALL*4 // 25% the size of a backpack for normal size
// Pouches for small storage in pocket slots
/obj/item/weapon/storage/pouch
name = "storage pouch (medium)"
desc = "This storage pouch can be used to provide some additional storage for quick access."
icon = 'icons/obj/clothing/pouches.dmi'
slot_flags = SLOT_POCKET
drop_sound = 'sound/items/drop/backpack.ogg'
pickup_sound = 'sound/items/pickup/backpack.ogg'
icon_state = "medium_generic"
max_w_class = ITEMSIZE_NORMAL
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = null
pocketable = TRUE
var/insert_delay = 0
var/remove_delay = 2 SECONDS
/obj/item/weapon/storage/pouch/stall_insertion(obj/item/W, mob/user)
// No delay if you have the pouch in your hands
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
return TRUE // Skip delay
if(insert_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE))
return FALSE // Moved or whatever
if(W in src)
return TRUE // Item is still inside
return FALSE
/obj/item/weapon/storage/pouch/stall_removal(obj/item/W, mob/user)
// No delay if you have the pouch in your hands
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
return TRUE // Skip delay
if(remove_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE))
return FALSE // Moved or whatever
if(W in src)
return TRUE // Item is still inside
return FALSE
/obj/item/weapon/storage/pouch/pocket_description(mob/haver, mob/examiner)
return "[src]"
/obj/item/weapon/storage/pouch/large
name = "storage pouch (large)"
desc = "This storage pouch can be used to provide a good amount of additional storage for quick access."
icon_state = "large_generic"
max_storage_space = ITEMSIZE_COST_SMALL*6
/obj/item/weapon/storage/pouch/small
name = "storage pouch (small)"
desc = "This storage pouch can be used to provide a small amount of additional storage for quick access."
icon_state = "small_generic"
max_storage_space = ITEMSIZE_COST_SMALL*2
/obj/item/weapon/storage/pouch/ammo
name = "storage pouch (ammo)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold ammunition and cells."
icon_state = "ammo"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(/obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/cell/device/weapon)
/obj/item/weapon/storage/pouch/eng_tool
name = "storage pouch (tools)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold tools."
icon_state = "engineering_tool"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/weapon/tool,
/obj/item/weapon/weldingtool,
/obj/item/device/multitool,
/obj/item/device/flashlight,
/obj/item/device/t_scanner,
/obj/item/device/analyzer,
/obj/item/clothing/glasses,
/obj/item/clothing/gloves,
)
/obj/item/weapon/storage/pouch/eng_supply
name = "storage pouch (supplies)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold engineering supplies."
icon_state = "engineering_supply"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/weapon/cell/device,
/obj/item/stack/cable_coil,
/obj/item/taperoll,
/obj/item/weapon/extinguisher/mini,
/obj/item/weapon/tape_roll
)
/obj/item/weapon/storage/pouch/eng_parts
name = "storage pouch (parts)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold machinery components."
icon_state = "part_pouch"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/weapon/stock_parts,
/obj/item/stack/cable_coil,
/obj/item/weapon/circuitboard
)
/obj/item/weapon/storage/pouch/medical
name = "storage pouch (medical)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold medical supplies."
icon_state = "medical_supply"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/device/healthanalyzer,
/obj/item/weapon/dnainjector,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/reagent_containers/glass/beaker,
/obj/item/weapon/reagent_containers/glass/bottle,
/obj/item/weapon/reagent_containers/pill,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/weapon/storage/quickdraw/syringe_case,
/obj/item/weapon/storage/pill_bottle,
/obj/item/stack/medical,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/weapon/storage/quickdraw/syringe_case
)
/obj/item/weapon/storage/pouch/flares
name = "storage pouch (flares)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold flares and glowsticks."
icon_state = "flare"
storage_slots = 5
can_hold = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/glowstick)
/obj/item/weapon/storage/pouch/flares/full_flare
starts_with = list(/obj/item/device/flashlight/flare = 5)
/obj/item/weapon/storage/pouch/flares/full_glow
starts_with = list(/obj/item/device/flashlight/glowstick = 5)
/obj/item/weapon/storage/pouch/flares/update_icon()
cut_overlays()
if(contents.len)
add_overlay("flare_[contents.len]")
..()
/obj/item/weapon/storage/pouch/holster
name = "storage pouch (holster)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one normal sized weapon."
icon_state = "pistol_holster"
storage_slots = 1
can_hold = list(/obj/item/weapon/gun)
remove_delay = 0
/obj/item/weapon/storage/pouch/holster/full_stunrevolver
starts_with = list(/obj/item/weapon/gun/energy/stunrevolver)
/obj/item/weapon/storage/pouch/holster/full_taser
starts_with = list(/obj/item/weapon/gun/energy/taser)
/obj/item/weapon/storage/pouch/holster/update_icon()
cut_overlays()
if(contents.len)
add_overlay("pistol_layer")
..()
/obj/item/weapon/storage/pouch/baton
name = "storage pouch (baton)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one standard baton."
icon_state = "baton_holster"
storage_slots = 1
can_hold = list(/obj/item/weapon/melee/baton)
remove_delay = 0
/obj/item/weapon/storage/pouch/baton/full
starts_with = list(/obj/item/weapon/melee/baton)
/obj/item/weapon/storage/pouch/baton/update_icon()
cut_overlays()
if(contents.len)
add_overlay("baton_layer")
..()
/obj/item/weapon/storage/pouch/holding
name = "storage pouch of holding"
desc = "This storage pouch can be used to provide some additional storage for quick access. Seems to use extradimensional storage!"
icon_state = "holdingpouch"
max_storage_space = INVENTORY_STANDARD_SPACE // Size of a normal backpack, compared to a normal BoH, which is way bigger
#undef INVENTORY_POUCH_SPACE
@@ -49,6 +49,8 @@
var/use_sound = "rustle" //sound played when used. null for no sound.
var/list/starts_with //Things to spawn on the box on spawn
var/empty //Mapper override to spawn an empty version of a container that usually has stuff
/// If you can use this storage while in a pocket
var/pocketable = FALSE
/obj/item/weapon/storage/Initialize()
. = ..()
@@ -101,6 +103,7 @@
count--
new newtype(src)
starts_with = null //Reduce list count.
update_icon()
calibrate_size()
@@ -473,6 +476,9 @@
/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
if(!istype(W)) return 0
if(!stall_insertion(W, usr)) // Can sleep here and delay removal for slow storage
return 0
if(usr)
usr.remove_from_mob(W,target = src) //If given a target, handles forceMove()
W.on_enter_storage(src)
@@ -506,6 +512,9 @@
/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location)
if(!istype(W)) return 0
if(!stall_removal(W, usr)) // Can sleep here and delay removal for slow storage
return 0
if(istype(src, /obj/item/weapon/storage/fancy))
var/obj/item/weapon/storage/fancy/F = src
F.update_icon(1)
@@ -534,6 +543,14 @@
update_icon()
return 1
/// Called before insertion completes, allowing you to delay or cancel it
/obj/item/weapon/storage/proc/stall_insertion(obj/item/W, mob/user)
return TRUE
/// Called before removal completes, allowing you to delay or cancel it
/obj/item/weapon/storage/proc/stall_removal(obj/item/W, mob/user)
return TRUE
//This proc is called when you want to place an item into the storage item.
/obj/item/weapon/storage/attackby(obj/item/W as obj, mob/user as mob)
..()
@@ -579,7 +596,7 @@
return
/obj/item/weapon/storage/attack_hand(mob/user as mob)
if(ishuman(user))
if(ishuman(user) && !pocketable)
var/mob/living/carbon/human/H = user
if(H.l_store == src && !H.get_active_hand()) //Prevents opening if it's in a pocket.
H.put_in_hands(src)
@@ -67,7 +67,7 @@
force = 15//quite robust
attack_verb = list("smacked", "struck", "slapped")
else
user.visible_message("<span class='notice'>\The [user] collapses their telescopic baton.</span>",\
user.visible_message("<b>\The [user]</b> collapses their telescopic baton.",\
"<span class='notice'>You collapse the baton.</span>",\
"You hear a click.")
icon_state = "telebaton0"
@@ -508,7 +508,7 @@
if(mounted_pack.loc != src.loc && src.loc != mounted_pack)
mounted_pack.return_nozzle()
visible_message("<span class='notice'>\The [src] retracts to its fueltank.</span>")
visible_message("<b>\The [src]</b> retracts to its fueltank.")
if(get_fuel() <= get_max_fuel())
mounted_pack.reagents.trans_to_obj(src, 1)