mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-19 11:05:50 +01:00
Merge branch 'master' into Arokha/matdefs
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 +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)
|
||||
|
||||
|
||||
@@ -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>")
|
||||
@@ -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))
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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( \
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user