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
+1 -1
View File
@@ -236,7 +236,7 @@
last_itch = world.time
to_chat(O.owner, "<span class='notice'>Your [O.name] itches...</span>")
else if(prob(1))
src.visible_message("<span class='notice'>\The [src] skitters.</span>")
src.visible_message("<b>\The [src]</b> skitters.")
if(amount_grown >= 0)
amount_grown += rand(0,2)
+10 -4
View File
@@ -241,14 +241,15 @@
return
var/old_loc = src.loc
src.pickup(user)
if (istype(src.loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = src.loc
S.remove_from_storage(src)
if(!S.remove_from_storage(src))
return
src.pickup(user)
src.throwing = 0
if (src.loc == user)
if(!user.unEquip(src, null, src))
if(!user.unEquip(src))
return
else
if(isliving(src.loc))
@@ -942,3 +943,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
// Like the above, but used for RPED sorting of parts.
/obj/item/proc/rped_rating()
return get_rating()
/// How are you described if at all when in pockets (or other 'usually not visible' places)
/obj/item/proc/pocket_description(mob/haver, mob/examiner)
return null // most things are hidden
+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)
+27 -4
View File
@@ -71,8 +71,8 @@
/obj/random/powercell
name = "random powercell"
desc = "This is a random powercell."
icon = 'icons/obj/power.dmi'
icon_state = "cell"
icon = 'icons/obj/power_cells.dmi'
icon_state = "random"
/obj/random/powercell/item_to_spawn()
return pick(prob(40);/obj/item/weapon/cell,
@@ -133,8 +133,8 @@
/obj/random/tech_supply
name = "random tech supply"
desc = "This is a random piece of technology supplies."
icon = 'icons/obj/power.dmi'
icon_state = "cell"
icon = 'icons/obj/power_cells.dmi'
icon_state = "random"
spawn_nothing_percentage = 25
/obj/random/tech_supply/item_to_spawn()
@@ -955,3 +955,26 @@
prob(3);/obj/item/clothing/accessory/poncho/thermal/green,
prob(3);/obj/item/clothing/accessory/poncho/thermal/purple,
prob(3);/obj/item/clothing/accessory/poncho/thermal/blue)
/obj/random/pouch
name = "Random Storage Pouch"
desc = "This is a random storage pouch."
icon = 'icons/obj/clothing/pouches.dmi'
icon_state = "random"
/obj/random/pouch/item_to_spawn()
return pick(
prob(10);/obj/item/weapon/storage/pouch, // medium
prob(3);/obj/item/weapon/storage/pouch/large,
prob(8);/obj/item/weapon/storage/pouch/small,
prob(5);/obj/item/weapon/storage/pouch/ammo,
prob(5);/obj/item/weapon/storage/pouch/eng_tool,
prob(5);/obj/item/weapon/storage/pouch/eng_supply,
prob(5);/obj/item/weapon/storage/pouch/eng_parts,
prob(5);/obj/item/weapon/storage/pouch/medical,
prob(5);/obj/item/weapon/storage/pouch/flares/full_flare,
prob(5);/obj/item/weapon/storage/pouch/flares/full_glow,
prob(5);/obj/item/weapon/storage/pouch/holster,
prob(5);/obj/item/weapon/storage/pouch/baton/full,
prob(1);/obj/item/weapon/storage/pouch/holding
)
+7 -7
View File
@@ -7,7 +7,7 @@
var/climb_delay = 3.5 SECONDS
var/breakable
var/parts
var/list/climbers = list()
var/list/climbers
var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies.
var/list/connections = list("0", "0", "0", "0")
@@ -35,7 +35,7 @@
if(H.species.can_shred(user))
attack_generic(user,1,"slices")
if(climbers.len && !(user in climbers))
if(LAZYLEN(climbers) && !(user in climbers))
user.visible_message("<span class='warning'>[user.name] shakes \the [src].</span>", \
"<span class='notice'>You shake \the [src].</span>")
structure_shaken()
@@ -103,21 +103,21 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if (!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
usr.forceMove(get_turf(src))
if (get_turf(user) == get_turf(src))
usr.visible_message("<span class='warning'>[user] climbs onto \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/proc/structure_shaken()
for(var/mob/living/M in climbers)
@@ -204,7 +204,7 @@
if(can_visually_connect_to(S))
if(S.can_visually_connect())
if(propagate)
//S.update_connections() //Not here
S.update_connections()
S.update_icon()
dirs += get_dir(src, S)
+561
View File
@@ -0,0 +1,561 @@
///////////
// EASEL //
///////////
/obj/structure/easel
name = "easel"
desc = "Only for the finest of art!"
icon = 'icons/obj/artstuff.dmi'
icon_state = "easel"
density = TRUE
//resistance_flags = FLAMMABLE
//max_integrity = 60
var/obj/item/canvas/painting = null
//Adding canvases
/obj/structure/easel/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/canvas))
var/obj/item/canvas/canvas = I
user.drop_from_inventory(canvas)
painting = canvas
canvas.forceMove(get_turf(src))
canvas.layer = layer+0.1
user.visible_message("<span class='notice'>[user] puts \the [canvas] on \the [src].</span>","<span class='notice'>You place \the [canvas] on \the [src].</span>")
else
return ..()
//Stick to the easel like glue
/obj/structure/easel/Move()
var/turf/T = get_turf(src)
. = ..()
if(painting && painting.loc == T) //Only move if it's near us.
painting.forceMove(get_turf(src))
else
painting = null
/obj/item/canvas
name = "canvas"
desc = "Draw out your soul on this canvas!"
icon = 'icons/obj/artstuff.dmi'
icon_state = "11x11"
//flags_1 = UNPAINTABLE_1
//resistance_flags = FLAMMABLE
var/width = 11
var/height = 11
var/list/grid
var/canvas_color = "#ffffff" //empty canvas color
var/used = FALSE
var/painting_name = "Untitled Artwork" //Painting name, this is set after framing.
var/finalized = FALSE //Blocks edits
var/author_name
var/author_ckey
var/icon_generated = FALSE
var/icon/generated_icon
///boolean that blocks persistence from saving it. enabled from printing copies, because we do not want to save copies.
var/no_save = FALSE
/// From the origin of the turf we're on, where should the left of the canvas pixel be
var/framed_offset_x = 11
/// From the origin of the turf we're on, where should the bottom of the canvas be
var/framed_offset_y = 10
/// The frame takes the painting's offset, then moves this X offset
var/frame_offset_x = -1
/// The frame takes the painting's offset, then moves this Y offset
var/frame_offset_y = -1
pixel_x = 10
pixel_y = 9
/obj/item/canvas/Initialize()
. = ..()
reset_grid()
/obj/item/canvas/proc/reset_grid()
grid = new/list(width,height)
for(var/x in 1 to width)
for(var/y in 1 to height)
grid[x][y] = canvas_color
/obj/item/canvas/attack_self(mob/user)
. = ..()
tgui_interact(user)
/obj/item/canvas/dropped(mob/user)
pixel_x = initial(pixel_x)
pixel_y = initial(pixel_y)
return ..()
/obj/item/canvas/tgui_state(mob/user)
if(finalized)
return GLOB.tgui_physical_obscured_state
else
return GLOB.tgui_default_state
/obj/item/canvas/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Canvas", name)
ui.set_autoupdate(FALSE)
ui.open()
/obj/item/canvas/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/paint_palette))
var/choice = tgui_alert(user, "Adjusting the base color of this canvas will replace ALL pixels with the selected color. Are you sure?", "Confirm Color Fill", list("Yes", "No"))
if(choice == "No")
return
var/basecolor = input(user, "Select a base color for the canvas:", "Base Color", canvas_color) as null|color
if(basecolor && Adjacent(user, src) && Adjacent(user, I))
canvas_color = basecolor
reset_grid()
user.visible_message("[user] smears paint on [src], covering the entire thing in paint.", "You smear paint on [src], changing the color of the entire thing.", runemessage = "smears paint")
update_appearance()
return
if(user.a_intent == I_HELP)
tgui_interact(user)
else
return ..()
/obj/item/canvas/tgui_data(mob/user)
. = ..()
.["grid"] = grid
.["name"] = painting_name
.["finalized"] = finalized
/obj/item/canvas/examine(mob/user)
. = ..()
tgui_interact(user)
/obj/item/canvas/tgui_act(action, params)
. = ..()
if(. || finalized)
return
var/mob/user = usr
switch(action)
if("paint")
var/obj/item/I = user.get_active_hand()
var/color = get_paint_tool_color(I)
if(!color)
return FALSE
var/x = text2num(params["x"])
var/y = text2num(params["y"])
grid[x][y] = color
used = TRUE
update_appearance()
. = TRUE
if("finalize")
. = TRUE
if(!finalized)
finalize(user)
/obj/item/canvas/proc/finalize(mob/user)
finalized = TRUE
author_name = user.real_name
author_ckey = user.ckey
generate_proper_overlay()
try_rename(user)
/obj/item/canvas/proc/update_appearance()
cut_overlays()
if(icon_generated)
var/mutable_appearance/detail = mutable_appearance(generated_icon)
detail.pixel_x = 1
detail.pixel_y = 1
add_overlay(detail)
return
if(!used)
return
var/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]wip")
detail.pixel_x = 1
detail.pixel_y = 1
add_overlay(detail)
/obj/item/canvas/proc/generate_proper_overlay()
if(icon_generated)
return
var/png_filename = "data/persistent/paintings/temp_painting.png"
var/result = rustg_dmi_create_png(png_filename,"[width]","[height]",get_data_string())
if(result)
CRASH("Error generating painting png : [result]")
generated_icon = new(png_filename)
icon_generated = TRUE
update_appearance()
/obj/item/canvas/proc/get_data_string()
var/list/data = list()
for(var/y in 1 to height)
for(var/x in 1 to width)
data += grid[x][y]
return data.Join("")
//Todo make this element ?
/obj/item/canvas/proc/get_paint_tool_color(obj/item/I)
if(!I)
return
if(istype(I, /obj/item/paint_brush))
var/obj/item/paint_brush/P = I
return P.selected_color
else if(istype(I, /obj/item/weapon/pen/crayon))
var/obj/item/weapon/pen/crayon/crayon = I
return crayon.colour
else if(istype(I, /obj/item/weapon/pen))
var/obj/item/weapon/pen/P = I
switch(P.colour)
if("black")
return "#000000"
if("blue")
return "#0000ff"
if("red")
return "#ff0000"
return P.colour
else if(istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag))
return canvas_color
/obj/item/canvas/proc/try_rename(mob/user)
var/new_name = stripped_input(user,"What do you want to name the painting?")
if(new_name != painting_name && new_name && CanUseTopic(user, GLOB.tgui_physical_state))
painting_name = new_name
SStgui.update_uis(src)
/obj/item/canvas/nineteen_nineteen
icon_state = "19x19"
width = 19
height = 19
pixel_x = 5
pixel_y = 10
framed_offset_x = 8
framed_offset_y = 9
/obj/item/canvas/twentythree_nineteen
icon_state = "23x19"
width = 23
height = 19
pixel_x = 4
pixel_y = 10
framed_offset_x = 6
framed_offset_y = 8
/obj/item/canvas/twentythree_twentythree
icon_state = "23x23"
width = 23
height = 23
pixel_x = 5
pixel_y = 9
framed_offset_x = 5
framed_offset_y = 6
/obj/item/canvas/twentyfour_twentyfour
name = "ai universal standard canvas"
//desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." // Not yet
icon_state = "24x24"
width = 24
height = 24
pixel_x = 2
pixel_y = 2
framed_offset_x = 4
framed_offset_y = 4
frame_offset_x = -2
frame_offset_y = -2
/obj/item/paint_brush
name = "artist's paintbrush"
desc = "When you really want to put together a masterpiece!"
description_info = "Hit this on a palette to set the color, and use it on a canvas to paint with that color."
icon = 'icons/obj/artstuff.dmi'
icon_state = "brush"
var/selected_color = "#000000"
var/image/color_drop
var/hud_level = FALSE
/obj/item/paint_brush/Initialize()
. = ..()
color_drop = image(icon, null, "brush_color")
color_drop.color = selected_color
// When picked up
/obj/item/paint_brush/hud_layerise()
. = ..()
hud_level = TRUE
update_paint()
// When put down
/obj/item/paint_brush/reset_plane_and_layer()
. = ..()
hud_level = FALSE
update_paint()
/obj/item/paint_brush/proc/update_paint(var/new_color)
if(new_color)
selected_color = new_color
color_drop.color = new_color
cut_overlays()
if(hud_level)
add_overlay(color_drop)
/obj/item/paint_palette
name = "artist's palette"
desc = "Helps to have a paintbrush, too."
description_info = "You can hit this on a canvas to set the entire canvas color (but note that it will wipe out any works in progress). You can hit a paintbrush on this to set the color."
icon = 'icons/obj/artstuff.dmi'
icon_state = "palette"
/obj/item/paint_palette/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/paint_brush))
var/obj/item/paint_brush/P = W
var/newcolor = input(user, "Select a new paint color:", "Paint Palette", P.selected_color) as null|color
if(newcolor && Adjacent(user, P) && Adjacent(user, src))
P.update_paint(newcolor)
else
return ..()
/obj/item/frame/painting
name = "painting frame"
desc = "The perfect showcase for your favorite deathtrap memories."
icon = 'icons/obj/decals.dmi'
//custom_materials = list(/datum/material/wood = 2000)
//flags_1 = NONE
icon_state = "frame-empty"
/obj/item/frame/painting/try_build(turf/on_wall, mob/user as mob)
if(get_dist(on_wall, user) > 1)
return
var/ndir = get_dir(on_wall, user)
if (!(ndir in cardinal))
return
if(!istype(on_wall, /turf/simulated/wall))
to_chat(user, "<span class='warning'>Frame cannot be placed on this spot.</span>")
return
new /obj/structure/sign/painting(get_turf(user), ndir, TRUE)
qdel(src)
/obj/structure/sign/painting
name = "Painting"
desc = "Art or \"Art\"? You decide."
icon = 'icons/obj/decals.dmi'
icon_state = "frame-empty"
var/base_icon_state = "frame"
//custom_materials = list(/datum/material/wood = 2000)
//buildable_sign = FALSE
///Canvas we're currently displaying.
var/obj/item/canvas/current_canvas
///Description set when canvas is added.
var/desc_with_canvas
var/persistence_id
//Presets for art gallery mapping, for paintings to be shared across stations
/obj/structure/sign/painting/public
name = "\improper Public Painting Exhibit mounting"
desc = "For art pieces hung by the public."
desc_with_canvas = "A piece of art (or \"art\"). Anyone could've hung it."
persistence_id = "public"
/obj/structure/sign/painting/library_secure
name = "\improper Curated Painting Exhibit mounting"
desc = "For masterpieces hand-picked by the curator."
desc_with_canvas = "A masterpiece hand-picked by the curator, supposedly."
persistence_id = "library"
req_one_access = list(access_library)
/obj/structure/sign/painting/chapel_secure
name = "\improper Religious Painting Exhibit mounting"
desc = "For masterpieces hand-picked by the chaplain."
desc_with_canvas = "A masterpiece hand-picked by the chaplain, supposedly."
persistence_id = "chapel"
req_one_access = list(access_chapel_office)
/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least
name = "\improper Private Painting Exhibit mounting"
desc = "For art pieces deemed too subversive or too illegal to be shared outside of curators."
desc_with_canvas = "A painting hung away from lesser minds."
persistence_id = "library_private"
req_one_access = list(access_library)
/obj/structure/sign/painting/Initialize(mapload, dir, building)
. = ..()
if(persistence_id)
SSpersistence.painting_frames += src
if(dir)
set_dir(dir)
if(building)
pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
/obj/structure/sign/painting/Destroy()
. = ..()
SSpersistence.painting_frames -= src
/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params)
if(!current_canvas && istype(I, /obj/item/canvas))
frame_canvas(user, I)
else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/weapon/pen))
try_rename(user)
else if(current_canvas && I.is_wirecutter())
unframe_canvas(user)
else
return ..()
/obj/structure/sign/painting/examine(mob/user)
. = ..()
if(persistence_id)
. += "<span class='notice'>Any painting placed here will be archived at the end of the shift.</span>"
if(current_canvas)
current_canvas.tgui_interact(user)
. += "<span class='notice'>Use wirecutters to remove the painting.</span>"
/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas)
if(!allowed(user))
to_chat(user, "<span class='warning'>You're not comfortable framing this canvas in such a prestigious spot!</span>")
return
if(user.drop_from_inventory(new_canvas, src))
current_canvas = new_canvas
if(!current_canvas.finalized)
current_canvas.finalize(user)
to_chat(user,"<span class='notice'>You frame [current_canvas].</span>")
update_appearance()
/obj/structure/sign/painting/proc/unframe_canvas(mob/living/user)
if(current_canvas)
current_canvas.forceMove(drop_location())
current_canvas = null
to_chat(user, "<span class='notice'>You remove the painting from the frame.</span>")
update_appearance()
/obj/structure/sign/painting/proc/try_rename(mob/user)
if(current_canvas.painting_name == initial(current_canvas.painting_name))
current_canvas.try_rename(user)
/obj/structure/sign/painting/proc/update_appearance()
name = current_canvas ? "painting - [current_canvas.painting_name]" : initial(name)
desc = current_canvas ? desc_with_canvas : initial(desc)
icon_state = "[base_icon_state]-[current_canvas?.generated_icon ? "hidden" : "empty"]"
cut_overlays()
if(!current_canvas?.generated_icon)
return
. = list()
var/mutable_appearance/MA = mutable_appearance(current_canvas.generated_icon)
MA.pixel_x = current_canvas.framed_offset_x
MA.pixel_y = current_canvas.framed_offset_y
. += MA
var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame")
frame.pixel_x = current_canvas.framed_offset_x + current_canvas.frame_offset_x
frame.pixel_y = current_canvas.framed_offset_y + current_canvas.frame_offset_y
. += frame
add_overlay(.)
/obj/item/canvas/proc/fill_grid_from_icon(icon/I)
var/h = I.Height() + 1
for(var/x in 1 to width)
for(var/y in 1 to height)
grid[x][y] = I.GetPixel(x,h-y)
/**
* Loads a painting from SSpersistence. Called globally by said subsystem when it inits
*
* Deleting paintings leaves their json, so this proc will remove the json and try again if it finds one of those.
*/
/obj/structure/sign/painting/proc/load_persistent()
if(!persistence_id || !SSpersistence.paintings)
return
var/list/painting_category = list()
for (var/list/P in SSpersistence.paintings)
if(P["persistence_id"] == persistence_id)
painting_category[++painting_category.len] = P
var/list/painting
while(!painting)
if(!length(painting_category))
return //aborts loading anything this category has no usable paintings
var/list/chosen = pick(painting_category)
if(!fexists("data/persistent/paintings/[persistence_id]/[chosen["md5"]].png")) //shitmin deleted this art, lets remove json entry to avoid errors
painting_category -= list(chosen)
continue //and try again
painting = chosen
var/title = painting["title"]
var/author_name = painting["author"]
var/author_ckey = painting["ckey"]
var/png = "data/persistent/paintings/[persistence_id]/[painting["md5"]].png"
if(!title)
title = "Untitled Artwork" //legacy artwork allowed null names which was bad for the json, lets fix that
painting["title"] = title
var/icon/I = new(png)
var/obj/item/canvas/new_canvas
var/w = I.Width()
var/h = I.Height()
for(var/T in typesof(/obj/item/canvas))
new_canvas = T
if(initial(new_canvas.width) == w && initial(new_canvas.height) == h)
new_canvas = new T(src)
break
new_canvas.fill_grid_from_icon(I)
new_canvas.generated_icon = I
new_canvas.icon_generated = TRUE
new_canvas.finalized = TRUE
new_canvas.painting_name = title
new_canvas.author_name = author_name
new_canvas.author_ckey = author_ckey
new_canvas.name = "painting - [title]"
current_canvas = new_canvas
update_appearance()
/obj/structure/sign/painting/proc/save_persistent()
if(!persistence_id || !current_canvas || current_canvas.no_save)
return
if(sanitize_filename(persistence_id) != persistence_id)
stack_trace("Invalid persistence_id - [persistence_id]")
return
if(!current_canvas.painting_name)
current_canvas.painting_name = "Untitled Artwork"
var/data = current_canvas.get_data_string()
var/md5 = md5(lowertext(data))
LAZYINITLIST(SSpersistence.paintings)
for(var/list/entry in SSpersistence.paintings)
if(entry["md5"] == md5)
return
var/png_directory = "data/persistent/paintings/[persistence_id]/"
var/png_path = png_directory + "[md5].png"
var/result = rustg_dmi_create_png(png_path,"[current_canvas.width]","[current_canvas.height]",data)
if(result)
CRASH("Error saving persistent painting: [result]")
SSpersistence.paintings += list(list(
"persistence_id" = persistence_id,
"title" = current_canvas.painting_name,
"md5" = md5,
"author" = current_canvas.author_name,
"ckey" = current_canvas.author_ckey
))
/obj/structure/sign/painting/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION("removepainting", "Remove Persistent Painting")
/obj/structure/sign/painting/vv_do_topic(list/href_list)
. = ..()
if(href_list["removepainting"])
if(!check_rights(NONE))
return
var/mob/user = usr
if(!persistence_id || !current_canvas)
to_chat(user,"<span class='warning'>This is not a persistent painting.</span>")
return
var/md5 = md5(lowertext(current_canvas.get_data_string()))
var/author = current_canvas.author_ckey
var/list/filenames_found = list()
for(var/list/entry in SSpersistence.paintings)
if(entry["md5"] == md5)
filenames_found += "data/persistent/paintings/[entry["persistence_id"]]/[entry["md5"]].png"
SSpersistence.paintings -= entry
for(var/png in filenames_found)
if(fexists(png))
fdel(png)
for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames)
if(P.current_canvas && md5(P.current_canvas.get_data_string()) == md5)
QDEL_NULL(P.current_canvas)
P.update_appearance()
log_and_message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")
+1 -1
View File
@@ -30,7 +30,7 @@ LINEN BINS
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
if(is_sharp(I))
user.visible_message("<span class='notice'>\The [user] begins cutting up [src] with [I].</span>", "<span class='notice'>You begin cutting up [src] with [I].</span>")
user.visible_message("<b>\The [user]</b> begins cutting up [src] with [I].", "<span class='notice'>You begin cutting up [src] with [I].</span>")
if(do_after(user, 50))
to_chat(user, "<span class='notice'>You cut [src] into pieces!</span>")
for(var/i in 1 to rand(2,5))
+5 -4
View File
@@ -160,7 +160,7 @@
burning = FALSE
update_icon()
STOP_PROCESSING(SSobj, src)
visible_message("<span class='notice'>\The [src] stops burning.</span>")
visible_message("<b>\The [src]</b> stops burning.")
/obj/structure/bonfire/proc/ignite()
if(!burning && get_fuel_amount())
@@ -180,8 +180,9 @@
O.fire_act(null, 1000, 500)
else if(isliving(A) && get_fuel_amount() > 4)
var/mob/living/L = A
L.adjust_fire_stacks(get_fuel_amount() / 4)
L.IgniteMob()
if(!(L.is_incorporeal()))
L.adjust_fire_stacks(get_fuel_amount() / 4)
L.IgniteMob()
/obj/structure/bonfire/update_icon()
cut_overlays()
@@ -353,7 +354,7 @@
burning = FALSE
update_icon()
STOP_PROCESSING(SSobj, src)
visible_message("<span class='notice'>\The [src] stops burning.</span>")
visible_message("<b>\The [src]</b> stops burning.")
/obj/structure/fireplace/proc/ignite()
if(!burning && get_fuel_amount())
+12 -12
View File
@@ -26,14 +26,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -42,7 +42,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied.
if(!..())
@@ -84,14 +84,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -100,7 +100,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_ropes_bottom/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
@@ -143,14 +143,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -159,7 +159,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_turnbuckle/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
+1 -1
View File
@@ -47,7 +47,7 @@
if(is_stump)
if(istype(W,/obj/item/weapon/shovel))
if(do_after(user, 5 SECONDS))
visible_message("<span class='notice'>\The [user] digs up \the [src] stump with \the [W].</span>")
visible_message("<b>\The [user]</b> digs up \the [src] stump with \the [W].")
qdel(src)
return
@@ -15,7 +15,7 @@
return
if(!activated)
to_chat(user, "<span class='warning'>\the [src] has not yet been activated. Sorry.</span>")
to_chat(user, "<span class='warning'>\The [src] has not yet been activated. Sorry.</span>")
return
if(used)
+4 -4
View File
@@ -55,14 +55,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -71,7 +71,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
@@ -129,10 +129,10 @@
qdel(contained)
contained = new mask_type(src)
breather = null
src.visible_message("<span class='notice'>\The [contained] slips to \the [src]!</span>")
src.visible_message("<b>\The [contained]</b> slips to \the [src]!")
update_icon()
return
usr.visible_message("<span class='notice'>\The [usr] begins carefully placing the mask onto [target].</span>",
usr.visible_message("<b>\The [usr]</b> begins carefully placing the mask onto [target].",
"<span class='notice'>You begin carefully placing the mask onto [target].</span>")
if(!do_mob(usr, target, 100) || !can_apply_to_target(target, usr))
return
@@ -151,14 +151,14 @@
visible_message("\The [attached] is taken off \the [src]")
attached = null
else if(ishuman(target))
usr.visible_message("<span class='notice'>\The [usr] begins inserting needle into [target]'s vein.</span>",
usr.visible_message("<b>\The [usr]</b> begins inserting needle into [target]'s vein.",
"<span class='notice'>You begin inserting needle into [target]'s vein.</span>")
if(!do_mob(usr, target, 50))
usr.visible_message("<span class='notice'>\The [usr]'s hand slips and pricks \the [target].</span>",
"<span class='notice'>Your hand slips and pricks \the [target].</span>")
target.apply_damage(3, BRUTE, pick(BP_R_ARM, BP_L_ARM))
return
usr.visible_message("<span class='notice'>\The [usr] hooks \the [target] up to \the [src].</span>",
usr.visible_message("<b>\The [usr]</b> hooks \the [target] up to \the [src].",
"<span class='notice'>You hook \the [target] up to \the [src].</span>")
attached = target
START_PROCESSING(SSobj,src)
@@ -184,13 +184,13 @@
to_chat(user, "<span class='warning'>There is no tank in \the [src]!</span>")
return
else if (tank && is_loosen)
user.visible_message("<span class='notice'>\The [user] removes \the [tank] from \the [src].</span>", "<span class='warning'>You remove \the [tank] from \the [src].</span</span>>")
user.visible_message("<b>\The [user]</b> removes \the [tank] from \the [src].", "<span class='warning'>You remove \the [tank] from \the [src].</span</span>>")
user.put_in_hands(tank)
tank = null
update_icon()
return
else if (!is_loosen)
user.visible_message("<span class='notice'>\The [user] tries to removes \the [tank] from \the [src] but it won't budge.</span>", "<span class='warning'>You try to removes \the [tank] from \the [src] but it won't budge.</span</span>>")
user.visible_message("<b>\The [user]</b> tries to removes \the [tank] from \the [src] but it won't budge.", "<span class='warning'>You try to removes \the [tank] from \the [src] but it won't budge.</span</span>>")
return
if ("Toggle valve")
if (!tank)
@@ -198,7 +198,7 @@
return
else
if (valve_opened)
src.visible_message("<span class='notice'>\The [user] closes valve on \the [src]!</span>",
src.visible_message("<b>\The [user]</b> closes valve on \the [src]!",
"<span class='notice'>You close valve on \the [src].</span>")
if(breather)
breather.internals?.icon_state = "internal0"
@@ -206,7 +206,7 @@
valve_opened = FALSE
update_icon()
else
src.visible_message("<span class='notice'>\The [user] opens valve on \the [src]!</span>",
src.visible_message("<b>\The [user]</b> opens valve on \the [src]!",
"<span class='notice'>You open valve on \the [src].</span>")
if(breather)
breather.internal = tank
@@ -319,7 +319,7 @@
user.drop_item()
W.forceMove(src)
tank = W
user.visible_message("<span class='notice'>\The [user] attaches \the [tank] to \the [src].</span>", "<span class='notice'>You attach \the [tank] to \the [src].</span>")
user.visible_message("<b>\The [user]</b> attaches \the [tank] to \the [src].", "<span class='notice'>You attach \the [tank] to \the [src].</span>")
src.add_fingerprint(user)
update_icon()
@@ -373,7 +373,7 @@
else
qdel(contained)
contained = new mask_type (src)
src.visible_message("<span class='notice'>\The [contained] slips to \the [src]!</span>")
src.visible_message("<b>\The [contained]</b> slips to \the [src]!")
breather = null
update_icon()
return
@@ -90,11 +90,11 @@
/obj/structure/prop/prism/proc/rotate_auto(var/new_bearing)
if(rotation_lock)
visible_message("<span class='notice'>\The [src] shudders.</span>")
visible_message("<b>\The [src]</b> shudders.")
playsound(src, 'sound/effects/clang.ogg', 50, 1)
return
visible_message("<span class='notice'>\The [src] rotates to a bearing of [new_bearing].</span>")
visible_message("<b>\The [src]</b> rotates to a bearing of [new_bearing].")
var/rotate_degrees = new_bearing - degrees_from_north
+157 -1
View File
@@ -115,6 +115,13 @@
icon = 'icons/obj/structures/decor32x64.dmi'
icon_state = "eotp"
// gravity generator from Eris
/obj/structure/prop/gravygen
icon = 'icons/obj/structures/decor64x64.dmi'
icon_state = "bigdice"
bound_width = 64
bound_height = 64
// dna vault from /tg/
/obj/structure/prop/dna_vault
icon = 'icons/obj/structures/decor96x96.dmi'
@@ -271,6 +278,58 @@
/obj/structure/prop/nt_solifier/starts_on
icon_state = "nt_solidifier_on"
/**
* Possible 'state' options for change_state(state) are:
* off: Boring, round
* on: Spinny glowy
*/
// conduit of soul from Eris
/obj/structure/prop/conduit
icon = 'icons/obj/structures/decor.dmi'
icon_state = "conduit_off"
/obj/structure/prop/conduit/change_state(state)
. = ..()
switch(state)
if("on")
icon_state = "conduit_spin"
flick("conduit_starting", src)
if("off")
icon_state = "conduit_off"
flick("conduit_stopping", src)
/obj/structure/prop/conduit/starts_on
icon_state = "conduit_spin"
/**
* Possible 'state' options for change_state(state) are:
* on: Doing some kinda worky thing
* off: Not doing much of anything
* empty: No blue crystal thingy
* loaded: off but without the animation
*/
// some kinda NT thing from Eris
/obj/structure/prop/core
icon = 'icons/obj/structures/decor.dmi'
icon_state = "core_inactive"
/obj/structure/prop/core/change_state(state)
. = ..()
switch(state)
if("on")
icon_state = "core_active"
flick("core_warmup", src)
if("off")
icon_state = "core_inactive"
flick("core_shutdown", src)
if("empty")
icon_state = "core_empty"
if("loaded")
icon_state = "core_inactive"
/obj/structure/prop/core/starts_on
icon_state = "core_active"
/**
* Possible 'state' options for change_state(state) are:
* down: In the ground, glowing
@@ -278,7 +337,6 @@
*/
// experimental science destructor from /tg/
/obj/structure/prop/tube
icon = 'icons/obj/structures/decor.dmi'
icon = 'icons/obj/structures/decor32x64.dmi'
icon_state = "tube_open"
@@ -393,6 +451,62 @@
/obj/structure/prop/nt_optable/starts_active
icon_state = "nt_optable-active"
/**
* Possible 'state' options for change_state(state) are:
* idle: The default look
* active: Glowy lights in the center
* panel_open: Opened panel (wiring)
* panel_closed: Closed panel
*/
// trade beacon from Eris
/obj/structure/prop/tradebeacon
icon = 'icons/obj/structures/decor.dmi'
icon_state = "tradebeacon"
/obj/structure/prop/tradebeacon/change_state(state)
. = ..()
switch(state)
if("idle")
icon_state = "tradebeacon"
if("active")
icon_state = "tradebeacon_active"
if("panel_open")
cut_overlay("tradebeacon_panel")
add_overlay("tradebeacon_panel")
if("panel_closed")
cut_overlay("tradebeacon_panel")
/obj/structure/prop/tradebeacon/starts_active
icon_state = "tradebeacon_active"
/**
* Possible 'state' options for change_state(state) are:
* idle: The default look
* active: Glowy lights in the center
* panel_open: Opened panel (wiring)
* panel_closed: Closed panel
*/
// another trade beacon from Eris
/obj/structure/prop/tradebeacon2
icon = 'icons/obj/structures/decor.dmi'
icon_state = "tradebeacon"
/obj/structure/prop/tradebeacon2/change_state(state)
. = ..()
switch(state)
if("idle")
icon_state = "tradebeacon_sending"
if("active")
icon_state = "tradebeacon_sending_active"
if("panel_open")
cut_overlay("tradebeacon_sending_panel")
add_overlay("tradebeacon_sending_panel")
if("panel_closed")
cut_overlay("tradebeacon_sending_panel")
/obj/structure/prop/tradebeacon2/starts_active
icon_state = "tradebeacon_sending_active"
/**
* Possible 'state' options for change_state(state) are:
* off: Non-spinny
@@ -414,6 +528,48 @@
/obj/structure/prop/nt_obelisk/starts_on
icon_state = "nt_obelisk_on"
/**
* Possible 'state' options for change_state(state) are:
* off: Inert
* on: Hand destroying machinery
*/
// 'sorter' from Eris
/obj/structure/prop/sorter
icon = 'icons/obj/structures/decor.dmi'
icon_state = "sorter"
/obj/structure/prop/sorter/change_state(state)
. = ..()
switch(state)
if("off")
icon_state = "sorter"
if("on")
icon_state = "sorter-process"
/obj/structure/prop/sorter/starts_on
icon_state = "sorter-process"
/**
* Possible 'state' options for change_state(state) are:
* off: Inert
* on: Hand destroying machinery
*/
// 'smelter' from Eris
/obj/structure/prop/smelter
icon = 'icons/obj/structures/decor.dmi'
icon_state = "smelter"
/obj/structure/prop/smelter/change_state(state)
. = ..()
switch(state)
if("off")
icon_state = "smelter"
if("on")
icon_state = "smelter-process"
/obj/structure/prop/smelter/starts_on
icon_state = "smelter-process"
/**
* Possible 'state' options for change_state(state) are:
* idle: Not doing anything, with yellow template exposed
+7 -7
View File
@@ -205,7 +205,7 @@
if(W.is_wrench() && !anchored)
playsound(src, W.usesound, 50, 1)
if(do_after(user, 20, src))
user.visible_message("<span class='notice'>\The [user] dismantles \the [src].</span>", "<span class='notice'>You dismantle \the [src].</span>")
user.visible_message("<b>\The [user]</b> dismantles \the [src].", "<span class='notice'>You dismantle \the [src].</span>")
new /obj/item/stack/material/steel(get_turf(usr), 2)
qdel(src)
return
@@ -216,13 +216,13 @@
if(F.welding)
playsound(src, F.usesound, 50, 1)
if(do_after(user, 20, src))
user.visible_message("<span class='notice'>\The [user] repairs some damage to \the [src].</span>", "<span class='notice'>You repair some damage to \the [src].</span>")
user.visible_message("<b>\The [user]</b> repairs some damage to \the [src].", "<span class='notice'>You repair some damage to \the [src].</span>")
health = min(health+(maxhealth/5), maxhealth) // 20% repair per application
return
// Install
if(W.is_screwdriver())
user.visible_message(anchored ? "<span class='notice'>\The [user] begins unscrewing \the [src].</span>" : "<span class='notice'>\The [user] begins fasten \the [src].</span>" )
user.visible_message(anchored ? "<b>\The [user]</b> begins unscrewing \the [src]." : "<b>\The [user]</b> begins fasten \the [src]." )
playsound(src, W.usesound, 75, 1)
if(do_after(user, 10, src))
to_chat(user, (anchored ? "<span class='notice'>You have unfastened \the [src] from the floor.</span>" : "<span class='notice'>You have fastened \the [src] to the floor.</span>"))
@@ -286,14 +286,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -303,7 +303,7 @@
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
if(!anchored) take_damage(maxhealth) // Fatboy
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
+1 -1
View File
@@ -18,7 +18,7 @@
playsound(src, I.usesound, 50, 1)
var/actual_time = I.toolspeed * 170
user.visible_message( \
"<span class='notice'>\The [user] begins salvaging from \the [src].</span>", \
"<b>\The [user]</b> begins salvaging from \the [src].", \
"<span class='notice'>You start salvaging from \the [src].</span>")
if(do_after(user, actual_time, target = src))
user.visible_message( \
+1 -1
View File
@@ -324,7 +324,7 @@
to_chat(usr, "<span class='warning'>\The [thing] is empty.</span>")
return
// Clear the vessel.
visible_message("<span class='notice'>\The [usr] tips the contents of \the [thing] into \the [src].</span>")
visible_message("<b>\The [usr]</b> tips the contents of \the [thing] into \the [src].")
thing.reagents.clear_reagents()
thing.update_icon()
+2 -2
View File
@@ -215,7 +215,7 @@
damage = damage / 2
take_damage(damage)
else
visible_message("<span class='notice'>\The [user] bonks \the [src] harmlessly.</span>")
visible_message("<b>\The [user]</b> bonks \the [src] harmlessly.")
user.do_attack_animation(src)
return 1
@@ -302,7 +302,7 @@
if (C.use(1))
playsound(src, 'sound/effects/sparks1.ogg', 75, 1)
user.visible_message( \
"<span class='notice'>\The [user] begins to wire \the [src] for electrochromic tinting.</span>", \
"<b>\The [user]</b> begins to wire \the [src] for electrochromic tinting.", \
"<span class='notice'>You begin to wire \the [src] for electrochromic tinting.</span>", \
"You hear sparks.")
if(do_after(user, 20 * C.toolspeed, src) && state == 0)