Merge branch 'master' into Arokha/matdefs

This commit is contained in:
Aronai Sieyes
2021-07-07 14:29:30 -04:00
committed by GitHub
283 changed files with 4118 additions and 1405 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ env:
jobs:
autochangelog:
name: Autochangelog
runs-on: ubuntu-16.04
runs-on: ubuntu-20.04
if: github.event.pull_request.merged == true
steps:
- uses: /actions/checkout@v2
+4 -4
View File
@@ -10,7 +10,7 @@ env:
jobs:
file_tests:
name: Run Linters
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Ensure +x on CI directory
@@ -26,7 +26,7 @@ jobs:
dreamchecker:
name: DreamChecker
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
@@ -54,7 +54,7 @@ jobs:
unit_tests:
name: Integration Tests
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Ensure +x on CI directory
@@ -69,7 +69,7 @@ jobs:
run: |
sudo dpkg --add-architecture i386
sudo apt update || true
sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 zlib1g:i386
sudo apt install zlib1g-dev:i386 libssl-dev:i386 pkg-config:i386
ldd librust_g.so
- name: Unit Tests
run: |
+1 -1
View File
@@ -14,7 +14,7 @@ on:
jobs:
generate_maps:
name: 'Generate NanoMaps'
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- name: Clone
uses: actions/checkout@v2
@@ -296,7 +296,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear ratchet.")
deconstruct()
@@ -256,7 +256,7 @@ Thus, the two variables affect pump operation are set in New():
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear ratchet.")
deconstruct()
@@ -91,7 +91,7 @@
playsound(src, W.usesound, 50, 1)
if(do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
@@ -162,7 +162,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
@@ -62,7 +62,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
+1 -1
View File
@@ -340,7 +340,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
@@ -81,7 +81,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
@@ -171,7 +171,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
@@ -405,7 +405,7 @@
if(!src || !WT.isOn()) return
playsound(src, WT.usesound, 50, 1)
if(!welded)
user.visible_message("<span class='notice'>\The [user] welds the vent shut.</span>", "<span class='notice'>You weld the vent shut.</span>", "You hear welding.")
user.visible_message("<b>\The [user]</b> welds the vent shut.", "<span class='notice'>You weld the vent shut.</span>", "You hear welding.")
welded = 1
update_icon()
else
@@ -453,7 +453,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
@@ -281,7 +281,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
+1 -1
View File
@@ -301,7 +301,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
+1 -1
View File
@@ -130,7 +130,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if (do_after(user, 10 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear a ratchet.")
deconstruct()
+5
View File
@@ -0,0 +1,5 @@
///tgui tab portrait categories- they're the same across all portrait tguis.
#define TAB_LIBRARY 1
#define TAB_SECURE 2
#define TAB_PRIVATE 3
+14 -14
View File
@@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Cu
var/datum/category_collection/underwear/global_underwear = new()
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag")
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag", "Sports Bag")
var/global/list/pdachoicelist = list("Default", "Slim", "Old", "Rugged", "Holographic", "Wrist-Bound")
var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg)
@@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(mannequins)
var/list/paths
//Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name
paths = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
paths = subtypesof(/datum/sprite_accessory/hair)
for(var/path in paths)
var/datum/sprite_accessory/hair/H = new path()
hair_styles_list[H.name] = H
@@ -133,7 +133,7 @@ GLOBAL_LIST_EMPTY(mannequins)
hair_styles_female_list += H.name
//Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name
paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
paths = subtypesof(/datum/sprite_accessory/facial_hair)
for(var/path in paths)
var/datum/sprite_accessory/facial_hair/H = new path()
facial_hair_styles_list[H.name] = H
@@ -145,27 +145,27 @@ GLOBAL_LIST_EMPTY(mannequins)
facial_hair_styles_female_list += H.name
//Body markings - Initialise all /datum/sprite_accessory/marking into an list indexed by marking name
paths = typesof(/datum/sprite_accessory/marking) - /datum/sprite_accessory/marking
paths = subtypesof(/datum/sprite_accessory/marking)
for(var/path in paths)
var/datum/sprite_accessory/marking/M = new path()
body_marking_styles_list[M.name] = M
//Surgery Steps - Initialize all /datum/surgery_step into a list
paths = typesof(/datum/surgery_step)-/datum/surgery_step
paths = subtypesof(/datum/surgery_step)
for(var/T in paths)
var/datum/surgery_step/S = new T
surgery_steps += S
sort_surgeries()
//List of job. I can't believe this was calculated multiple times per tick!
paths = typesof(/datum/job)-/datum/job
paths = subtypesof(/datum/job)
paths -= exclude_jobs
for(var/T in paths)
var/datum/job/J = new T
joblist[J.title] = J
//Languages
paths = typesof(/datum/language)-/datum/language
paths = subtypesof(/datum/language)
for(var/T in paths)
var/datum/language/L = new T
if (isnull(GLOB.all_languages[L.name]))
@@ -189,7 +189,7 @@ GLOBAL_LIST_EMPTY(mannequins)
//Species
var/rkey = 0
paths = typesof(/datum/species)
paths = subtypesof(/datum/species)
for(var/T in paths)
rkey++
@@ -214,31 +214,31 @@ GLOBAL_LIST_EMPTY(mannequins)
GLOB.whitelisted_species += S.name
//Ores
paths = typesof(/ore)-/ore
paths = subtypesof(/ore)
for(var/oretype in paths)
var/ore/OD = new oretype()
GLOB.ore_data[OD.name] = OD
paths = typesof(/datum/alloy)-/datum/alloy
paths = subtypesof(/datum/alloy)
for(var/alloytype in paths)
GLOB.alloy_data += new alloytype()
//Closet appearances
GLOB.closet_appearances = decls_repository.get_decls_of_type(/decl/closet_appearance)
paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears
paths = subtypesof(/datum/sprite_accessory/ears)
for(var/path in paths)
var/obj/item/clothing/head/instance = new path()
ear_styles_list[path] = instance
// Custom Tails
paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur
paths = subtypesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail/taur
for(var/path in paths)
var/datum/sprite_accessory/tail/instance = new path()
tail_styles_list[path] = instance
// Custom Wings
paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing
paths = subtypesof(/datum/sprite_accessory/wing)
for(var/path in paths)
var/datum/sprite_accessory/wing/instance = new path()
wing_styles_list[path] = instance
@@ -253,7 +253,7 @@ GLOBAL_LIST_EMPTY(mannequins)
/*
// Custom species traits
paths = typesof(/datum/trait) - /datum/trait
paths = subtypesof(/datum/trait) - /datum/trait
for(var/path in paths)
var/datum/trait/instance = new path()
if(!instance.name)
+15 -3
View File
@@ -492,6 +492,18 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_GOLEM, //Some special species that may or may not be ever used in event too,
SPECIES_SHADEKIN) //Shadefluffers just poof away
/var/global/list/alt_titles_with_icons = list(
"Virologist",
"Apprentice Engineer",
"Medical Intern",
"Research Intern",
"Security Cadet",
"Jr. Cargo Tech",
"Jr. Explorer",
"Server",
"Electrician",
"Barista")
/var/global/list/existing_solargrubs = list()
/hook/startup/proc/init_vore_datum_ref_lists()
@@ -512,10 +524,10 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
var/cost = instance.cost
traits_costs[path] = cost
all_traits[path] = instance
// Shakey shakey shake
sortTim(all_traits, /proc/cmp_trait_datums_name, associative = TRUE)
// Split 'em up
for(var/traitpath in all_traits)
var/datum/trait/T = all_traits[traitpath]
@@ -529,7 +541,7 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
everyone_traits[traitpath] = T
if(0.1 to INFINITY)
positive_traits[traitpath] = T
// Weaver recipe stuff
paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure
+2 -2
View File
@@ -686,12 +686,12 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/return_areas()
var/list/area/areas = list()
for(var/area/A in world)
areas += A
areas[A.name] = A
return areas
//Returns: all the areas in the world, sorted.
/proc/return_sorted_areas()
return sortAtom(return_areas())
return sortTim(return_areas(), /proc/cmp_text_asc)
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all areas of that type in the world.
@@ -4,6 +4,10 @@ SUBSYSTEM_DEF(persistence)
flags = SS_NO_FIRE
var/list/tracking_values = list()
var/list/persistence_datums = list()
/// Places our subsystem can spawn paintings (helps with art spawning differently across maps)
var/list/obj/structure/sign/painting/painting_frames = list()
var/list/paintings = list()
/datum/controller/subsystem/persistence/Initialize()
. = ..()
+1
View File
@@ -68,6 +68,7 @@
backpack = /obj/item/weapon/storage/backpack/hydroponics
satchel_one = /obj/item/weapon/storage/backpack/satchel/hyd
messenger_bag = /obj/item/weapon/storage/backpack/messenger/hyd
sports_bag = /obj/item/weapon/storage/backpack/sport/hyd
id_type = /obj/item/weapon/card/id/civilian/service/botanist //VOREStation Edit
pda_type = /obj/item/device/pda/botanist
+1
View File
@@ -65,6 +65,7 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/chemist
backpack = /obj/item/weapon/storage/backpack/chemistry
satchel_one = /obj/item/weapon/storage/backpack/satchel/chem
sports_bag = /obj/item/weapon/storage/backpack/sport/chem
id_type = /obj/item/weapon/card/id/medical/chemist
pda_type = /obj/item/device/pda/chemist
+1
View File
@@ -7,6 +7,7 @@
backpack = /obj/item/weapon/storage/backpack/toxins
satchel_one = /obj/item/weapon/storage/backpack/satchel/tox
messenger_bag = /obj/item/weapon/storage/backpack/messenger/tox
sports_bag = /obj/item/weapon/storage/backpack/sport/tox
/decl/hierarchy/outfit/job/science/rd
name = OUTFIT_JOB_NAME("Research Director")
+1
View File
@@ -8,6 +8,7 @@
satchel_one = /obj/item/weapon/storage/backpack/satchel/sec
backpack_contents = list(/obj/item/weapon/handcuffs = 1)
messenger_bag = /obj/item/weapon/storage/backpack/messenger/sec
sports_bag = /obj/item/weapon/storage/backpack/sport/sec
/decl/hierarchy/outfit/job/security/hos
name = OUTFIT_JOB_NAME("Head of security")
+2
View File
@@ -56,6 +56,7 @@ var/list/outfits_decls_by_type_
var/satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
var/satchel_two = /obj/item/weapon/storage/backpack/satchel
var/messenger_bag = /obj/item/weapon/storage/backpack/messenger
var/sports_bag = /obj/item/weapon/storage/backpack/sport
var/flags // Specific flags
@@ -76,6 +77,7 @@ var/list/outfits_decls_by_type_
if(3) back = satchel_one
if(4) back = satchel_two
if(5) back = messenger_bag
if(6) back = sports_bag
else back = null
/decl/hierarchy/outfit/proc/post_equip(mob/living/carbon/human/H)
+17
View File
@@ -79,6 +79,23 @@
containertype = /obj/structure/closet/crate/allico
containername = "crate of gifts"
/datum/supply_pack/hospitality/painting
name = "Painting equipment"
contains = list(
/obj/item/paint_brush = 2,
/obj/item/paint_palette = 2,
/obj/item/weapon/reagent_containers/glass/rag = 2,
/obj/structure/easel = 1, // How does that even fit
/obj/item/canvas = 1,
/obj/item/canvas/nineteen_nineteen = 1,
/obj/item/canvas/twentyfour_twentyfour = 1,
/obj/item/canvas/twentythree_nineteen = 1,
/obj/item/canvas/twentythree_twentythree = 1
)
cost = 20
containertype = /obj/structure/closet/crate/centauri
containername = "Painting equipment"
/datum/supply_pack/randomised/hospitality/
group = "Hospitality"
@@ -42,6 +42,7 @@ var/datum/antagonist/mercenary/mercs
if(player.backbag == 3) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(player), slot_back)
if(player.backbag == 4) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(player), slot_back)
if(player.backbag == 5) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(player), slot_back)
if(player.backbag == 6) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/sport(player), slot_back)
player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack)
player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
+2 -1
View File
@@ -83,7 +83,8 @@ var/datum/antagonist/wizard/wizards
if(wizard_mob.backbag == 2) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
if(wizard_mob.backbag == 3) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(wizard_mob), slot_back)
if(wizard_mob.backbag == 4) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(wizard_mob), slot_back)
if(wizard_mob.backbag == 5) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
if(wizard_mob.backbag == 5) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(wizard_mob), slot_back)
if(wizard_mob.backbag == 6) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/sport(wizard_mob), slot_back)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box(wizard_mob), slot_in_backpack)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand)
+1 -1
View File
@@ -671,6 +671,6 @@
W.visible_message("<span class='danger'>\The [user] [attack_message] \the [W], obliterating it!</span>")
W.dismantle_wall(1)
else
user.visible_message("<span class='notice'>\The [user] lowers its fist.</span>")
user.visible_message("<b>\The [user]</b> lowers its fist.")
return
qdel(src)
+1 -1
View File
@@ -121,7 +121,7 @@
if(L.stat == DEAD)
summoned_mobs -= L
spawn(1)
L.visible_message("<span class='notice'>\The [L] begins to fade away...</span>")
L.visible_message("<b>\The [L]</b> begins to fade away...")
animate(L, alpha = 255, alpha = 0, time = 30) // Makes them fade into nothingness.
sleep(30)
qdel(L)
@@ -27,7 +27,7 @@
to_chat(L, "<span class='warning'>\The [user] tried to teleport you far away, but failed.</span>")
return 0
else
visible_message("<span class='notice'>\The [L] vanishes!</span>")
visible_message("<b>\The [L]</b> vanishes!")
qdel(L)
else if(istype(L, /mob/living/simple_mob/construct))
var/mob/living/simple_mob/construct/evil = L
@@ -47,7 +47,7 @@
if(L.buckled)
L.buckled.unbuckle_mob()
AM.forceMove(destination)
AM.visible_message("<span class='notice'>\The [AM] vanishes!</span>")
AM.visible_message("<b>\The [AM]</b> vanishes!")
to_chat(AM, "<span class='notice'>You suddenly appear somewhere else!</span>")
new /obj/effect/effect/sparks(destination)
new /obj/effect/effect/sparks(starting)
+1 -1
View File
@@ -236,7 +236,7 @@
return C.registered_name
/proc/get_all_job_icons() //For all existing HUD icons
return joblist + list("Prisoner")
return joblist + alt_titles_with_icons + list("Prisoner")
/obj/proc/GetJobName() //Used in secHUD icon generation
var/obj/item/weapon/card/id/I = GetID()
+1 -5
View File
@@ -16,8 +16,7 @@
access = list() //See /datum/job/intern/get_access()
minimal_access = list() //See /datum/job/intern/get_access()
outfit_type = /decl/hierarchy/outfit/job/assistant/intern
alt_titles = list("Intern" = /datum/alt_title/intern,
"Apprentice Engineer" = /datum/alt_title/intern_eng,
alt_titles = list("Apprentice Engineer" = /datum/alt_title/intern_eng,
"Medical Intern" = /datum/alt_title/intern_med,
"Research Intern" = /datum/alt_title/intern_sci,
"Security Cadet" = /datum/alt_title/intern_sec,
@@ -28,9 +27,6 @@
another job. Though they are part of the crew, they have no real authority."
timeoff_factor = 0 // Interns, noh
/datum/alt_title/intern
title = "Intern"
/datum/alt_title/intern_eng
title = "Apprentice Engineer"
title_blurb = "An Apprentice Engineer attempts to provide whatever the Engineering department needs. They are not proper Engineers, and are \
+1 -1
View File
@@ -382,7 +382,7 @@
beaker = I
user.drop_item()
I.loc = src
user.visible_message("<span class='notice'>\The [user] adds \a [I] to \the [src].</span>", "<span class='notice'>You add \a [I] to \the [src].</span>")
user.visible_message("<b>\The [user]</b> adds \a [I] to \the [src].", "<span class='notice'>You add \a [I] to \the [src].</span>")
else
to_chat(user, "<span class='warning'>\The [src] has a beaker already.</span>")
return
+1 -1
View File
@@ -76,7 +76,7 @@
return
if(draw_power(idle_power_usage) < idle_power_usage)
visible_message("<span class='notice'>\The [src] shuts down.</span>")
visible_message("<b>\The [src]</b> shuts down.")
turn_off()
return
+1 -1
View File
@@ -110,7 +110,7 @@
to_chat(user, "<span class='notice'>You begin to unfasten \the [src]...</span>")
if(do_after(user, 40 * W.toolspeed))
user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<b>\The [user]</b> unfastens \the [src].", \
"<span class='notice'>You have unfastened \the [src].</span>", \
"You hear ratchet.")
new /obj/item/pipe_meter(get_turf(src))
+2 -2
View File
@@ -163,7 +163,7 @@
printing = 1
update_icon()
visible_message("<span class='notice'>\The [src] begins churning.</span>")
visible_message("<b>\The [src]</b> begins churning.")
sleep(print_delay)
@@ -211,7 +211,7 @@
/obj/machinery/organ_printer/proc/can_print(var/choice, var/masscount = 0)
var/biomass = get_biomass_volume()
if(biomass < masscount)
visible_message("<span class='notice'>\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [masscount] needed.'</span>")
visible_message("<b>\The [src]</b> displays a warning: 'Not enough biomass. [biomass] stored and [masscount] needed.'")
return 0
if(!loaded_dna || !loaded_dna["donor"])
+78 -30
View File
@@ -1,38 +1,84 @@
#define CHARGER_EMPTY 0
#define CHARGER_WORKING 1
#define CHARGER_DONE 2
/obj/machinery/cell_charger
name = "heavy-duty cell charger"
desc = "A much more powerful version of the standard recharger that is specially designed for charging power cells."
icon = 'icons/obj/power.dmi'
icon_state = "ccharger0"
icon_state = "recharger"
anchored = 1
use_power = USE_POWER_IDLE
power_channel = EQUIP
idle_power_usage = 5
active_power_usage = 60000 //60 kW. (this the power drawn when charging)
var/efficiency = 60000 //will provide the modified power rate when upgraded
power_channel = EQUIP
var/obj/item/weapon/cell/charging = null
var/chargelevel = -1
circuit = /obj/item/weapon/circuitboard/cell_charger
var/efficiency = 60000 //will provide the modified power rate when upgraded
var/obj/item/weapon/cell/charging = null
var/charging_vis_flags = NONE
var/charge_state = CHARGER_EMPTY
/obj/machinery/cell_charger/Initialize()
. = ..()
default_apply_parts()
/obj/machinery/cell_charger/update_icon()
icon_state = "ccharger[charging ? 1 : 0]"
var/new_state
if(!anchored)
new_state = "[initial(icon_state)]4"
return
if(charging && !(stat & (BROKEN|NOPOWER)))
if(stat & (BROKEN|NOPOWER))
new_state = "[initial(icon_state)]3"
return
var/newlevel = round(charging.percent() * 4.0 / 99)
//to_world("nl: [newlevel]")
switch(charge_state)
if(CHARGER_EMPTY)
new_state = "[initial(icon_state)]0"
if(CHARGER_WORKING)
new_state = "[initial(icon_state)]1"
if(CHARGER_DONE)
new_state = "[initial(icon_state)]2"
if(icon_state != new_state)
icon_state = new_state
if(chargelevel != newlevel)
/obj/machinery/cell_charger/proc/insert_item(obj/item/W, mob/user)
if(!W || !user)
return
cut_overlays()
add_overlay("ccharger-o[newlevel]")
user.drop_item()
charging = W
charging.loc = src
charging_vis_flags = charging.vis_flags
charging.vis_flags = VIS_INHERIT_ID
vis_contents += charging
charge_state = CHARGER_WORKING
update_icon()
chargelevel = newlevel
if((stat & (BROKEN|NOPOWER)) || !anchored)
update_use_power(USE_POWER_OFF)
else
cut_overlays()
update_use_power(USE_POWER_ACTIVE)
/obj/machinery/cell_charger/proc/remove_item(mob/user)
if(!charging || !user)
return
vis_contents -= charging
charging.vis_flags = charging_vis_flags
user.put_in_hands(charging)
charging = null
charge_state = CHARGER_EMPTY
update_icon()
if((stat & (BROKEN|NOPOWER)) || !anchored)
update_use_power(USE_POWER_OFF)
else
update_use_power(USE_POWER_IDLE)
/obj/machinery/cell_charger/examine(mob/user)
. = ..()
@@ -60,11 +106,8 @@
to_chat(user, "<span class='warning'>\The [src] blinks red as you try to insert [W]!</span>")
return
user.drop_item()
W.loc = src
charging = W
insert_item(W, user)
user.visible_message("[user] inserts [charging] into [src].", "You insert [charging] into [src].")
chargelevel = -1
update_icon()
else if(W.is_wrench())
if(charging)
@@ -85,12 +128,8 @@
add_fingerprint(user)
if(charging)
user.put_in_hands(charging)
charging.update_icon()
remove_item(user)
user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].")
charging = null
chargelevel = -1
update_icon()
/obj/machinery/cell_charger/attack_ai(mob/user)
@@ -109,6 +148,9 @@
charging.emp_act(severity)
..(severity)
/obj/machinery/cell_charger/power_change()
. = ..()
update_icon()
/obj/machinery/cell_charger/process()
//to_world("ccpt [charging] [stat]")
@@ -116,16 +158,22 @@
update_use_power(USE_POWER_OFF)
return
if(charging && !charging.fully_charged())
charging.give(efficiency*CELLRATE)
update_use_power(USE_POWER_ACTIVE)
if(charging)
if(!charging.fully_charged())
charge_state = CHARGER_WORKING
charging.give(efficiency*CELLRATE)
update_use_power(USE_POWER_ACTIVE)
else
charge_state = CHARGER_DONE
update_use_power(USE_POWER_IDLE)
update_icon()
else
update_use_power(USE_POWER_IDLE)
/obj/machinery/cell_charger/RefreshParts()
var/E = 0
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
E += C.rating
efficiency = active_power_usage * (1+ (E - 1)*0.5)
efficiency = active_power_usage * (1+ (E - 1)*0.5)
#undef CHARGER_EMPTY
#undef CHARGER_WORKING
#undef CHARGER_DONE
+6 -6
View File
@@ -234,21 +234,21 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva
return
else if(W.is_wrench())
if(anchored)
user.visible_message("<span class='notice'>\The [user] starts to unbolt \the [src] from the plating...</span>")
user.visible_message("<b>\The [user]</b> starts to unbolt \the [src] from the plating...")
playsound(src, W.usesound, 50, 1)
if(!do_after(user,40 * W.toolspeed))
user.visible_message("<span class='notice'>\The [user] decides not to unbolt \the [src].</span>")
user.visible_message("<b>\The [user]</b> decides not to unbolt \the [src].")
return
user.visible_message("<span class='notice'>\The [user] finishes unfastening \the [src]!</span>")
user.visible_message("<b>\The [user]</b> finishes unfastening \the [src]!")
anchored = 0
return
else
user.visible_message("<span class='notice'>\The [user] starts to bolt \the [src] to the plating...</span>")
user.visible_message("<b>\The [user]</b> starts to bolt \the [src] to the plating...")
playsound(src, W.usesound, 50, 1)
if(!do_after(user,40 * W.toolspeed))
user.visible_message("<span class='notice'>\The [user] decides not to bolt \the [src].</span>")
user.visible_message("<b>\The [user]</b> decides not to bolt \the [src].")
return
user.visible_message("<span class='notice'>\The [user] finishes fastening down \the [src]!</span>")
user.visible_message("<b>\The [user]</b> finishes fastening down \the [src]!")
anchored = 1
return
else
+1 -1
View File
@@ -48,7 +48,7 @@
var/confirm = tgui_alert(usr, "Do you really want to deactivate this guest pass? (you can't reactivate it)", "Confirm Deactivation", list("Yes", "No"))
if(confirm == "Yes")
//rip guest pass </3
user.visible_message("<span class='notice'>\The [user] deactivates \the [src].</span>")
user.visible_message("<b>\The [user]</b> deactivates \the [src].")
icon_state = "guest-invalid"
update_icon()
expiration_time = world.time
+1 -1
View File
@@ -47,7 +47,7 @@
playsound(src, S.attack_sound, 75, 1)
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)
/obj/machinery/door/New()
+108 -8
View File
@@ -258,13 +258,7 @@ var/list/dispenser_presets = list()
if((dispenser_flags & GD_UNIQUE) && !emagged)
unique_dispense_list |= user.ckey
flick("[icon_state]-scan",src)
visible_message("\The [src] scans its user.", runemessage = "hums")
sleep(30)
flick("[icon_state]-dispense",src)
dispenser_flags |= GD_BUSY
sleep(15)
dispenser_flags &= ~GD_BUSY
animate_dispensing() // Blocks here until animation is done
var/turf/T = get_turf(src)
if(!(S && T)) // in case we got destroyed while we slept
@@ -277,6 +271,15 @@ var/list/dispenser_presets = list()
if(greet && user && !user.stat) // in case we got destroyed while we slept
to_chat(user,"<span class='notice'>[S.name] dispensing processed. Have a good day.</span>")
/obj/machinery/gear_dispenser/proc/animate_dispensing()
flick("[icon_state]-scan",src)
visible_message("\The [src] scans its user.", runemessage = "hums")
sleep(30)
flick("[icon_state]-dispense",src)
dispenser_flags |= GD_BUSY
sleep(15)
dispenser_flags &= ~GD_BUSY
/obj/machinery/gear_dispenser/emag_act(remaining_charges, mob/user, emag_source)
. = ..()
if(!emagged)
@@ -292,10 +295,100 @@ var/list/dispenser_presets = list()
icon_state = "suitdispenser2"
/obj/machinery/gear_dispenser/suit_old
name = "duit dispenser"
name = "suit dispenser"
desc = "An industrial U-Tak-It Dispenser unit designed to fetch all kinds of space suits. An older model."
icon_state = "suitdispenser"
/obj/machinery/gear_dispenser/suit_fancy
name = "suit dispenser"
desc = "An industrial U-Tak-It Dispenser unit designed to fetch all kinds of space suits. A newer model."
icon_state = "suit_storage_map"
var/obj/effect/overlay/vis/door
var/datum/gear_disp/held_gear_disp
var/special_frame
/obj/machinery/gear_dispenser/suit_fancy/Initialize(mapload)
. = ..()
door = add_vis_overlay("closed", layer = 4, unique = TRUE)
icon_state = "suit_storage"
if(special_frame)
add_overlay(special_frame)
/obj/machinery/gear_dispenser/suit_fancy/Destroy()
qdel_null(door)
held_gear_disp = null
return ..()
/obj/machinery/gear_dispenser/suit_fancy/power_change()
. = ..()
update_icon()
/obj/machinery/gear_dispenser/suit_fancy/update_icon()
cut_overlays()
if(special_frame)
add_overlay(special_frame)
if(needs_power && inoperable())
add_overlay("nopower")
else
add_overlay("light1")
if(held_gear_disp)
add_overlay("fullsuit")
if(operable())
add_overlay("light2")
/obj/machinery/gear_dispenser/suit_fancy/attack_hand(var/mob/living/carbon/human/user)
if(held_gear_disp)
var/turf/T = get_turf(user)
var/list/spawned = held_gear_disp.spawn_gear(T, user)
for(var/obj/item/I in spawned)
user.put_in_hands(I)
to_chat(user, "<span class='notice'>You remove the equipment from [src].</span>")
held_gear_disp = null
animate_close()
return
return ..()
/obj/machinery/gear_dispenser/suit_fancy/dispense(var/datum/gear_disp/S,var/mob/living/carbon/human/user,var/greet=TRUE)
if(!S.amount && !(dispenser_flags & GD_UNLIMITED))
to_chat(user,"<span class='warning'>There are no more [S.name]s left!</span>")
dispenser_flags &= ~GD_BUSY
return 1
else if(!(dispenser_flags & GD_UNLIMITED))
S.amount--
if((dispenser_flags & GD_NOGREED) && !emagged)
gear_distributed_to["[type]"] |= user.ckey
if((dispenser_flags & GD_UNIQUE) && !emagged)
unique_dispense_list |= user.ckey
held_gear_disp = S
animate_dispensing()
dispenser_flags &= ~GD_BUSY
if(emagged)
emagged = FALSE
if(greet && user && !user.stat) // in case we got destroyed while we slept
to_chat(user,"<span class='notice'>[S.name] dispensing processed. Have a good day.</span>")
/obj/machinery/gear_dispenser/suit_fancy/animate_dispensing()
add_overlay("working")
sleep(5 SECONDS)
add_overlay("fullsuit")
door.icon_state = "open"
flick("anim_open", door)
sleep(10.5)
add_overlay("light2")
cut_overlay("working")
/obj/machinery/gear_dispenser/suit_fancy/proc/animate_close()
cut_overlay("fullsuit")
cut_overlay("light2")
door.icon_state = "closed"
flick("anim_close", door)
// For fluff/custom items
/obj/machinery/gear_dispenser/custom
name = "personal gear dispenser"
@@ -467,6 +560,13 @@ var/list/dispenser_presets = list()
dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED
one_setting = /datum/gear_disp/voidsuit/autolok
/obj/machinery/gear_dispenser/suit_fancy/autolok
name = "AutoLok Suit Dispenser"
desc = "An industrial U-Tak-It Dispenser unit designed to fetch a specific AutoLok mass produced suit."
dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED
one_setting = /datum/gear_disp/voidsuit/autolok
special_frame = "frame_grey"
// Adminbuse
/obj/machinery/gear_dispenser/vv_get_dropdown()
. = ..()
+1 -1
View File
@@ -253,7 +253,7 @@
/obj/machinery/media/jukebox/proc/explode()
walk_to(src,0)
src.visible_message("<span class='danger'>\the [src] blows apart!</span>", 1)
src.visible_message("<span class='danger'>\The [src] blows apart!</span>", 1)
explosion(src.loc, 0, 0, 1, rand(1,2), 1)
+4 -2
View File
@@ -133,6 +133,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
light_power = 0.9
light_range = 2
light_color = "#00ff00"
vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature
var/isbroken = 0 //1 if someone banged it with something heavy
var/ispowered = 1 //starts powered, changes with power_change()
//var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
@@ -333,6 +334,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
// Creating Messages
// data["channel_name"] = channel_name
data["msg"] = msg
data["title"] = title
data["photo_data"] = !!photo_data
// Printing menu
@@ -445,11 +447,11 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
return TRUE
if("set_new_message")
msg = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message|null)
msg = sanitize(tgui_input_message(usr, "Write your Feed story", "Network Channel Handler"))
return TRUE
if("set_new_title")
title = sanitize(input(usr, "Enter your Feed title", "Network Channel Handler", "") as message|null)
title = sanitize(tgui_input_text(usr, "Enter your Feed title", "Network Channel Handler"))
return TRUE
if("set_attachment")
+3 -3
View File
@@ -55,7 +55,7 @@
/obj/machinery/oxygen_pump/attack_hand(mob/user as mob)
if((stat & MAINT) && tank)
user.visible_message("<span class='notice'>\The [user] removes \the [tank] from \the [src].</span>", "<span class='notice'>You remove \the [tank] from \the [src].</span>")
user.visible_message("<b>\The [user]</b> removes \the [tank] from \the [src].", "<span class='notice'>You remove \the [tank] from \the [src].</span>")
user.put_in_hands(tank)
src.add_fingerprint(user)
tank.add_fingerprint(user)
@@ -69,7 +69,7 @@
tank.forceMove(src)
breather.remove_from_mob(contained)
contained.forceMove(src)
src.visible_message("<span class='notice'>\The [user] makes \the [contained] rapidly retract back into \the [src]!</span>")
src.visible_message("<b>\The [user]</b> makes \the [contained] rapidly retract back into \the [src]!")
if(breather.internals)
breather.internals.icon_state = "internal0"
breather = null
@@ -140,7 +140,7 @@
user.drop_item()
W.forceMove(src)
tank = W
user.visible_message("<span class='notice'>\The [user] installs \the [tank] into \the [src].</span>", "<span class='notice'>You install \the [tank] into \the [src].</span>")
user.visible_message("<b>\The [user]</b> installs \the [tank] into \the [src].", "<span class='notice'>You install \the [tank] into \the [src].</span>")
src.add_fingerprint(user)
if(istype(W, /obj/item/weapon/tank) && !stat)
to_chat(user, "<span class='warning'>Please open the maintenance hatch first.</span>")
+3 -3
View File
@@ -567,7 +567,7 @@
take_damage(incoming_damage)
S.do_attack_animation(src)
return 1
visible_message("<span class='notice'>\The [L] bonks \the [src]'s casing!</span>")
visible_message("<b>\The [L]</b> bonks \the [src]'s casing!")
return ..()
/obj/machinery/porta_turret/emag_act(var/remaining_charges, var/mob/user)
@@ -1007,7 +1007,7 @@
return
var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun
if(!user.unEquip(I))
to_chat(user, "<span class='notice'>\the [I] is stuck to your hand, you cannot put it in \the [src]</span>")
to_chat(user, "<span class='notice'>\The [I] is stuck to your hand, you cannot put it in \the [src]</span>")
return
installation = I.type //installation becomes I.type
gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge
@@ -1028,7 +1028,7 @@
if(isprox(I))
build_step = 5
if(!user.unEquip(I))
to_chat(user, "<span class='notice'>\the [I] is stuck to your hand, you cannot put it in \the [src]</span>")
to_chat(user, "<span class='notice'>\The [I] is stuck to your hand, you cannot put it in \the [src]</span>")
return
to_chat(user, "<span class='notice'>You add the prox sensor to the turret.</span>")
qdel(I)
+3 -3
View File
@@ -107,7 +107,7 @@
if(Output.get_pairing())
reagents.trans_to_holder(Output.reagents, Output.reagents.maximum_volume)
if(prob(5))
visible_message("<span class='notice'>\The [src] gurgles as it exports fluid.</span>")
visible_message("<b>\The [src]</b> gurgles as it exports fluid.")
if(!on)
return
@@ -148,7 +148,7 @@
on = 1
update_icon()
if(loud)
visible_message("<span class='notice'>\The [src] turns on.</span>")
visible_message("<b>\The [src]</b> turns on.")
return 1
/obj/machinery/pump/proc/turn_off(var/loud = 0)
@@ -156,7 +156,7 @@
set_light(0, 0)
update_icon()
if(loud)
visible_message("<span class='notice'>\The [src] shuts down.</span>")
visible_message("<b>\The [src]</b> shuts down.")
if(!on)
return TRUE
+3 -3
View File
@@ -27,12 +27,13 @@ var/list/obj/machinery/requests_console/allConsoles = list()
desc = "A console intended to send requests to different departments on the station."
anchored = 1
icon = 'icons/obj/terminals_vr.dmi' //VOREStation Edit
icon_state = "req_comp0"
icon_state = "req_comp_0"
layer = ABOVE_WINDOW_LAYER
circuit = /obj/item/weapon/circuitboard/request
blocks_emissive = NONE
light_power = 0.25
light_color = "#00ff00"
vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature
var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department
var/list/message_log = list() //List of all messages
var/departmentType = 0 //Bitflag. Zero is reply-only. Map currently uses raw numbers instead of defines.
@@ -221,8 +222,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
for (var/obj/machinery/requests_console/Console in allConsoles)
if(Console.department == department)
Console.newmessagepriority = 0
Console.icon_state = "req_comp0"
Console.set_light(1)
Console.update_icon()
if(tempScreen == RCS_MAINMENU)
reset_message()
screen = tempScreen
+2 -2
View File
@@ -12,11 +12,11 @@
deploy_path = /obj/machinery/power/supply_beacon/supermatter
/obj/item/supply_beacon/attack_self(var/mob/user)
user.visible_message("<span class='notice'>\The [user] begins setting up \the [src].</span>")
user.visible_message("<b>\The [user]</b> begins setting up \the [src].")
if(!do_after(user, deploy_time))
return
var/obj/S = new deploy_path(get_turf(user))
user.visible_message("<span class='notice'>\The [user] deploys \the [S].</span>")
user.visible_message("<b>\The [user]</b> deploys \the [S].")
user.unEquip(src)
qdel(src)
@@ -25,7 +25,7 @@
if(stat & (BROKEN))
if(occupant)
go_out()
visible_message("<span class='notice'>\The [src] emits a low droning sound, before the pod door clicks open.</span>")
visible_message("<b>\The [src]</b> emits a low droning sound, before the pod door clicks open.")
return
else if(eject_dead && occupant && occupant.stat == DEAD)
visible_message("<span class='warning'>\The [src] sounds an alarm, swinging its hatch open.</span>")
@@ -40,7 +40,7 @@
if(stat & (NOPOWER|BROKEN))
if(occupant)
go_out()
visible_message("<span class='notice'>\The [src] emits a low droning sound, before the pod door clicks open.</span>")
visible_message("<b>\The [src]</b> emits a low droning sound, before the pod door clicks open.")
return
else if(eject_dead && occupant && occupant.stat == DEAD) // If someone dies somehow while inside, spit them out.
visible_message("<span class='warning'>\The [src] sounds an alarm, swinging its hatch open.</span>")
+4 -4
View File
@@ -1964,7 +1964,7 @@
if(ishuman(occupant))
GrantActions(occupant, 1)
else
visible_message("<span class='notice'>\The [usr] starts to climb into [src.name]</span>")
visible_message("<b>\The [usr]</b> starts to climb into [src.name]")
if(enter_after(40,usr))
if(!src.occupant)
moved_inside(usr)
@@ -2604,11 +2604,11 @@
var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P = passengers[pname]
var/mob/occupant = P.occupant
user.visible_message("<span class='notice'>\The [user] begins opening the hatch on \the [P]...</span>", "<span class='notice'>You begin opening the hatch on \the [P]...</span>")
user.visible_message("<b>\The [user]</b> begins opening the hatch on \the [P]...", "<span class='notice'>You begin opening the hatch on \the [P]...</span>")
if (!do_after(user, 40))
return
user.visible_message("<span class='notice'>\The [user] opens the hatch on \the [P] and removes [occupant]!</span>", "<span class='notice'>You open the hatch on \the [P] and remove [occupant]!</span>")
user.visible_message("<b>\The [user]</b> opens the hatch on \the [P] and removes [occupant]!", "<span class='notice'>You open the hatch on \the [P] and remove [occupant]!</span>")
P.go_out()
P.log_message("[occupant] was removed.")
return
@@ -2795,7 +2795,7 @@
if(prob(temp_deflect_chance))//Deflected
src.log_append_to_last("Armor saved.")
src.occupant_message("<span class='notice'>\The [user]'s attack is stopped by the armor.</span>")
visible_message("<span class='notice'>\The [user] rebounds off [src.name]'s armor!</span>")
visible_message("<b>\The [user]</b> rebounds off [src.name]'s armor!")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name]</font>")
playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1)
+1 -1
View File
@@ -236,7 +236,7 @@
last_itch = world.time
to_chat(O.owner, "<span class='notice'>Your [O.name] itches...</span>")
else if(prob(1))
src.visible_message("<span class='notice'>\The [src] skitters.</span>")
src.visible_message("<b>\The [src]</b> skitters.")
if(amount_grown >= 0)
amount_grown += rand(0,2)
+10 -4
View File
@@ -241,14 +241,15 @@
return
var/old_loc = src.loc
src.pickup(user)
if (istype(src.loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = src.loc
S.remove_from_storage(src)
if(!S.remove_from_storage(src))
return
src.pickup(user)
src.throwing = 0
if (src.loc == user)
if(!user.unEquip(src, null, src))
if(!user.unEquip(src))
return
else
if(isliving(src.loc))
@@ -942,3 +943,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
// Like the above, but used for RPED sorting of parts.
/obj/item/proc/rped_rating()
return get_rating()
/// How are you described if at all when in pockets (or other 'usually not visible' places)
/obj/item/proc/pocket_description(mob/haver, mob/examiner)
return null // most things are hidden
+2 -2
View File
@@ -86,7 +86,7 @@
reattach_paddles(user)
else if(istype(W, /obj/item/weapon/cell))
if(bcell)
to_chat(user, "<span class='notice'>\the [src] already has a cell.</span>")
to_chat(user, "<span class='notice'>\The [src] already has a cell.</span>")
else
if(!user.unEquip(W))
return
@@ -392,7 +392,7 @@
user.visible_message("<span class='warning'>\The [user] begins to place [src] on [H]'s chest.</span>", "<span class='warning'>You begin to place [src] on [H]'s chest...</span>")
if(!do_after(user, 30, H))
return
user.visible_message("<span class='notice'>\The [user] places [src] on [H]'s chest.</span>", "<span class='warning'>You place [src] on [H]'s chest.</span>")
user.visible_message("<b>\The [user]</b> places [src] on [H]'s chest.", "<span class='warning'>You place [src] on [H]'s chest.</span>")
playsound(src, 'sound/machines/defib_charge.ogg', 50, 0)
var/error = can_defib(H)
+2 -2
View File
@@ -41,7 +41,7 @@
if(repairing)
to_chat(user, "<span class='notice'>\The [src] is already being repaired!</span>")
return
user.visible_message("<span class='notice'>\The [user] starts trying to repair \the [src]'s bulb.</span>")
user.visible_message("<b>\The [user]</b> starts trying to repair \the [src]'s bulb.")
repairing = TRUE
if(do_after(user, (40 SECONDS + rand(0, 20 SECONDS)) * W.toolspeed) && can_repair)
if(prob(30))
@@ -50,7 +50,7 @@
update_icon()
playsound(src, W.usesound, 50, 1)
else
user.visible_message("<span class='notice'>\The [user] fails to repair \the [src].</span>")
user.visible_message("<b>\The [user]</b> fails to repair \the [src].")
repairing = FALSE
else
..()
@@ -115,7 +115,7 @@
if(!vision)
to_chat(user, "<span class='warning'>You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!</span>")
user.visible_message("<span class='notice'>\The [user] directs [src] to [M]'s eyes.</span>", \
user.visible_message("<b>\The [user]</b> directs [src] to [M]'s eyes.", \
"<span class='notice'>You direct [src] to [M]'s eyes.</span>")
if(H != user) //can't look into your own eyes buster
if(M.stat == DEAD || M.blinded) //mob is dead or fully blind
+1 -1
View File
@@ -49,7 +49,7 @@
playsound(src, O.usesound, 100, 1)
user.visible_message("<span class='notice'>\The [user] opens \the [src] and modifies \the [O].</span>","<span class='notice'>You open \the [src] and modify \the [O].</span>")
user.visible_message("<b>\The [user]</b> opens \the [src] and modifies \the [O].","<span class='notice'>You open \the [src] and modify \the [O].</span>")
I.refit_for_species(target_species)
+1 -1
View File
@@ -32,7 +32,7 @@
tool_qualities = list(TOOL_MULTITOOL)
/obj/item/device/multitool/attack_self(mob/living/user)
var/choice = tgui_alert(usr, "What do you want to do with \the [src]?","Multitool Menu", "Switch Mode", list("Clear Buffers", "Cancel"))
var/choice = tgui_alert(usr, "What do you want to do with \the [src]?", "Multitool Menu", list("Switch Mode", "Clear Buffers", "Cancel"))
switch(choice)
if("Cancel")
to_chat(user,"<span class='notice'>You lower \the [src].</span>")
@@ -11,6 +11,7 @@
light_color = "#00ff00"
light_power = 0.25
blocks_emissive = NONE
vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature
var/circuit = /obj/item/weapon/circuitboard/intercom
var/number = 0
var/wiresexposed = 0
@@ -270,7 +270,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
if(H.resleeve_lock && stored_mind.loaded_from_ckey != H.resleeve_lock)
to_chat(usr,"<span class='warning'>\[H] is protected from impersonation!</span>")
to_chat(usr,"<span class='warning'>\The [H] is protected from impersonation!</span>")
return
usr.visible_message("<span class='warning'>[usr] begins uploading someone's mind into [target]!</span>","<span class='notice'>You begin uploading a mind into [target]!</span>")
+13 -13
View File
@@ -108,7 +108,7 @@
return 1
else
var/available = get_amount()
user.visible_message("<span class='notice'>\The [user] starts bandaging [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts bandaging [M]'s [affecting.name].", \
"<span class='notice'>You start bandaging [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
@@ -131,10 +131,10 @@
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> bandages \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a bandage over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a bandage over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
playsound(src, pick(apply_sounds), 25)
@@ -177,7 +177,7 @@
return 1
else
var/available = get_amount()
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts treating [M]'s [affecting.name].", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
@@ -200,14 +200,14 @@
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> bandages \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
//H.add_side_effect("Itch")
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a bruise patch over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
// W.disinfect() // VOREStation - Tech1 should not disinfect
@@ -250,7 +250,7 @@
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts salving wounds on [M]'s [affecting.name].", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10, exclusive = TRUE))
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
@@ -290,7 +290,7 @@
return 1
else
var/available = get_amount()
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts treating [M]'s [affecting.name].", \
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
@@ -312,13 +312,13 @@
break
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.</span>", \
user.visible_message("<b>\The [user]</b> cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \
"<span class='notice'>You clean and seal \a [W.desc] on [M]'s [affecting.name].</span>" )
else if (W.damage_type == BRUISE)
user.visible_message("<span class='notice'>\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> places a medical patch over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You place a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> smears some bioglue over \a [W.desc] on [M]'s [affecting.name].", \
"<span class='notice'>You smear some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
W.disinfect()
@@ -358,7 +358,7 @@
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
user.visible_message("<b>\The [user]</b> starts salving wounds on [M]'s [affecting.name].", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
if(!do_mob(user, M, 10, exclusive = TRUE))
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
+1 -1
View File
@@ -177,7 +177,7 @@
if(!S.open)
to_chat(user, "<span class='warning'>You have to cut [S] open first!</span>")
return
M.visible_message("<span class='notice'>\The [user] scans the wounds on [M]'s [S.name] with [src]</span>")
M.visible_message("<b>\The [user]</b> scans the wounds on [M]'s [S.name] with [src]")
src.add_data(S)
+2 -2
View File
@@ -97,7 +97,7 @@
/obj/item/weapon/cane/white/collapsible/attack_self(mob/user as mob)
on = !on
if(on)
user.visible_message("<span class='notice'>\The [user] extends the white cane.</span>",\
user.visible_message("<b>\The [user]</b> extends the white cane.",\
"<span class='warning'>You extend the white cane.</span>",\
"You hear an ominous click.")
icon_state = "whitecane1out"
@@ -106,7 +106,7 @@
force = 5
attack_verb = list("smacked", "struck", "cracked", "beaten")
else
user.visible_message("<span class='notice'>\The [user] collapses the white cane.</span>",\
user.visible_message("<b>\The [user]</b> collapses the white cane.",\
"<span class='notice'>You collapse the white cane.</span>",\
"You hear a click.")
icon_state = "whitecane1in"
@@ -9,7 +9,7 @@
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_screwdriver())
playsound(src, I.usesound, 50, 1)
user.visible_message("<span class='notice'>\The [user] adjusts the jumper on \the [src]'s access protocol pins.</span>", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
user.visible_message("<b>\The [user]</b> adjusts the jumper on \the [src]'s access protocol pins.", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
if(build_path == /obj/machinery/computer/rdconsole/core)
name = T_BOARD("RD Console - Robotics")
build_path = /obj/machinery/computer/rdconsole/robotics
@@ -14,7 +14,7 @@
/obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_screwdriver())
playsound(src, I.usesound, 50, 1)
user.visible_message("<span class='notice'>\The [user] adjusts the jumper on \the [src]'s access protocol pins.</span>", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
user.visible_message("<b>\The [user]</b> adjusts the jumper on \the [src]'s access protocol pins.", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
if(build_path == /obj/machinery/r_n_d/server/core)
name = T_BOARD("RD Console - Robotics")
build_path = /obj/machinery/r_n_d/server/robotics
@@ -11,6 +11,8 @@
var/stage = 0
var/state = 0
var/path = 0
/// If TRUE, grenade is permanently sealed when fully assembled, useful for things like off-the-shelf grenades.
var/sealed = FALSE
var/obj/item/device/assembly_holder/detonator = null
var/list/beakers = new/list()
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
@@ -93,7 +95,8 @@
if(active && prob(95))
to_chat(user, "<span class='warning'>You trigger the assembly!</span>")
detonate()
return
else if(sealed)
to_chat(user, "<span class='warning'>This grenade lacks a way to disassemble it.</span>")
else
to_chat(user, "<span class='notice'>You unlock the assembly.</span>")
playsound(src, W.usesound, 50, -3)
@@ -200,8 +203,10 @@
/obj/item/weapon/grenade/chem_grenade/metalfoam
name = "metal-foam grenade"
desc = "Used for emergency sealing of air breaches."
icon_state = "foam"
path = 1
stage = 2
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/metalfoam/Initialize()
. = ..()
@@ -216,13 +221,14 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/incendiary
name = "incendiary grenade"
desc = "Used for clearing rooms of living things."
icon_state = "incendiary"
path = 1
stage = 2
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/incendiary/Initialize()
. = ..()
@@ -239,13 +245,13 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/antiweed
name = "weedkiller grenade"
desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents."
path = 1
stage = 2
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/antiweed/Initialize()
. = ..()
@@ -266,8 +272,10 @@
/obj/item/weapon/grenade/chem_grenade/cleaner
name = "cleaner grenade"
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
icon_state = "cleaner"
stage = 2
path = 1
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/cleaner/Initialize()
. = ..()
@@ -282,13 +290,14 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/teargas
name = "tear gas grenade"
desc = "Concentrated Capsaicin. Contents under pressure. Use with caution."
icon_state = "teargas"
stage = 2
path = 1
sealed = TRUE
/obj/item/weapon/grenade/chem_grenade/teargas/Initialize()
. = ..()
@@ -305,4 +314,4 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
+2 -2
View File
@@ -301,7 +301,7 @@ var/last_chew = 0
return 1
/obj/item/weapon/handcuffs/legcuffs/bola/dropped()
visible_message("<span class='notice'>\The [src] falls apart!</span>")
visible_message("<b>\The [src]</b> falls apart!")
qdel(src)
/obj/item/weapon/handcuffs/legcuffs/bola/place_legcuffs(var/mob/living/carbon/target, var/mob/user)
@@ -313,7 +313,7 @@ var/last_chew = 0
return 0
if(!H.has_organ_for_slot(slot_legcuffed))
H.visible_message("<span class='notice'>\The [src] slams into [H], but slides off!</span>")
H.visible_message("<b>\The [src]</b> slams into [H], but slides off!")
src.dropped()
return 0
@@ -75,6 +75,26 @@
/obj/item/weapon/material/kitchen/utensil/fork/plastic
default_material = "plastic"
/obj/item/weapon/material/kitchen/utensil/foon
name = "foon"
desc = "It's a foon. The forgotten cousin of the spork."
icon_state = "foon"
sharp = TRUE
edge = FALSE
/obj/item/weapon/material/kitchen/utensil/foon/plastic
default_material = "plastic"
/obj/item/weapon/material/kitchen/utensil/spork
name = "spork"
desc = "It's a spork. The (un)holy merger of a spoon and fork."
icon_state = "spork"
sharp = TRUE
edge = FALSE
/obj/item/weapon/material/kitchen/utensil/spork/plastic
default_material = "plastic"
/obj/item/weapon/material/kitchen/utensil/spoon
name = "spoon"
desc = "It's a spoon. You can see your own upside-down face in it."
@@ -123,6 +123,16 @@
icon_state = "render"
applies_material_colour = 0
/obj/item/weapon/material/knife/table
name = "table knife"
icon = 'icons/obj/kitchen.dmi'
icon_state = "knife_table"
sharp = FALSE // blunted tip
force_divisor = 0.1
/obj/item/weapon/material/knife/table/plastic
default_material = "plastic"
/obj/item/weapon/material/knife/butch
name = "butcher's cleaver"
icon_state = "butch"
@@ -333,7 +333,7 @@ var/list/tape_roll_applications = list()
/obj/item/tape/attack_hand(mob/user as mob)
if (user.a_intent == I_HELP && src.allowed(user))
user.show_viewers("<span class='notice'>\The [user] lifts \the [src], allowing passage.</span>")
user.show_viewers("<b>\The [user]</b> lifts \the [src], allowing passage.")
for(var/obj/item/tape/T in gettapeline())
T.lift(100) //~10 seconds
else
@@ -377,7 +377,7 @@ var/list/tape_roll_applications = list()
if(user.a_intent == I_HELP)
to_chat(user, "<span class='warning'>You refrain from breaking \the [src].</span>")
return
user.visible_message("<span class='notice'>\The [user] breaks \the [src]!</span>","<span class='notice'>You break \the [src].</span>")
user.visible_message("<b>\The [user]</b> breaks \the [src]!","<span class='notice'>You break \the [src].</span>")
for (var/obj/item/tape/T in gettapeline())
if(T == src)
@@ -75,57 +75,69 @@
/obj/item/weapon/storage/backpack/cultpack
name = "trophy rack"
desc = "It's useful for both carrying extra gear and proudly declaring your insanity."
icon_state = "cultpack"
icon_state = "backpack_cult"
/obj/item/weapon/storage/backpack/clown
name = "Giggles von Honkerton"
desc = "It's a backpack made by Honk! Co."
icon_state = "clownpack"
icon_state = "backpack_clown"
/obj/item/weapon/storage/backpack/white
name = "white backpack"
icon_state = "backpack_white"
/obj/item/weapon/storage/backpack/fancy
name = "fancy backpack"
icon_state = "backpack_fancy"
/obj/item/weapon/storage/backpack/military
name = "military backpack"
icon_state = "backpack_military"
/obj/item/weapon/storage/backpack/medic
name = "medical backpack"
desc = "It's a backpack especially designed for use in a sterile environment."
icon_state = "medicalpack"
icon_state = "backpack_medical"
/obj/item/weapon/storage/backpack/security
name = "security backpack"
desc = "It's a very robust backpack."
icon_state = "securitypack"
icon_state = "backpack_security"
/obj/item/weapon/storage/backpack/captain
name = "site manager's backpack"
desc = "It's a special backpack made exclusively for officers."
icon_state = "captainpack"
icon_state = "backpack_captain"
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
icon_state = "engiepack"
icon_state = "backpack_industrial"
/obj/item/weapon/storage/backpack/toxins
name = "laboratory backpack"
desc = "It's a light backpack modeled for use in laboratories and other scientific institutions."
icon_state = "toxpack"
icon_state = "backpack_purple"
/obj/item/weapon/storage/backpack/hydroponics
name = "herbalist's backpack"
desc = "It's a green backpack with many pockets to store plants and tools in."
icon_state = "hydpack"
icon_state = "backpack_hydro"
/obj/item/weapon/storage/backpack/genetics
name = "geneticist backpack"
desc = "It's a backpack fitted with slots for diskettes and other workplace tools."
icon_state = "genpack"
icon_state = "backpack_blue"
/obj/item/weapon/storage/backpack/virology
name = "sterile backpack"
desc = "It's a sterile backpack able to withstand different pathogens from entering its fabric."
icon_state = "viropack"
icon_state = "backpack_green"
/obj/item/weapon/storage/backpack/chemistry
name = "chemistry backpack"
desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles."
icon_state = "chempack"
icon_state = "backpack_orange"
/*
* Duffle Types
@@ -162,7 +174,7 @@
/obj/item/weapon/storage/backpack/dufflebag/med
name = "medical dufflebag"
desc = "A large dufflebag for holding extra medical supplies."
icon_state = "duffle_med"
icon_state = "duffle_medical"
/obj/item/weapon/storage/backpack/dufflebag/emt
name = "EMT dufflebag"
@@ -172,17 +184,27 @@
/obj/item/weapon/storage/backpack/dufflebag/sec
name = "security dufflebag"
desc = "A large dufflebag for holding extra security supplies and ammunition."
icon_state = "duffle_sec"
icon_state = "duffle_security"
/obj/item/weapon/storage/backpack/dufflebag/eng
name = "industrial dufflebag"
desc = "A large dufflebag for holding extra tools and supplies."
icon_state = "duffle_eng"
icon_state = "duffle_industrial"
/obj/item/weapon/storage/backpack/dufflebag/sci
name = "science dufflebag"
desc = "A large dufflebag for holding circuits and beakers."
icon_state = "duffle_sci"
icon_state = "duffle_science"
/obj/item/weapon/storage/backpack/dufflebag/drone
name = "drone dufflebag"
desc = "A large dufflebag for holding small robots? Or maybe it's one used by robots!"
icon_state = "duffle_drone"
/obj/item/weapon/storage/backpack/dufflebag/cursed
name = "cursed dufflebag"
desc = "That probably shouldn't be moving..."
icon_state = "duffle_cursed"
/*
* Satchel Types
@@ -192,7 +214,6 @@
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
icon_state = "satchel"
item_state_slots = list(slot_r_hand_str = "briefcase", slot_l_hand_str = "briefcase")
/obj/item/weapon/storage/backpack/satchel/withwallet
starts_with = list(/obj/item/weapon/storage/wallet/random)
@@ -200,67 +221,70 @@
/obj/item/weapon/storage/backpack/satchel/norm
name = "satchel"
desc = "A trendy looking satchel."
icon_state = "satchel-norm"
icon_state = "satchel_grey"
/obj/item/weapon/storage/backpack/satchel/white
name = "white satchel"
icon_state = "satchel_white"
/obj/item/weapon/storage/backpack/satchel/fancy
name = "fancy satchel"
icon_state = "satchel_fancy"
/obj/item/weapon/storage/backpack/satchel/military
name = "military satchel"
icon_state = "satchel_military"
/obj/item/weapon/storage/backpack/satchel/eng
name = "industrial satchel"
desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng"
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
icon_state = "satchel_industrial"
/obj/item/weapon/storage/backpack/satchel/med
name = "medical satchel"
desc = "A sterile satchel used in medical departments."
icon_state = "satchel-med"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
icon_state = "satchel_medical"
/obj/item/weapon/storage/backpack/satchel/vir
name = "virologist satchel"
desc = "A sterile satchel with virologist colours."
icon_state = "satchel-vir"
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
icon_state = "satchel_green"
/obj/item/weapon/storage/backpack/satchel/chem
name = "chemist satchel"
desc = "A sterile satchel with chemist colours."
icon_state = "satchel-chem"
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
icon_state = "satchel_orange"
/obj/item/weapon/storage/backpack/satchel/gen
name = "geneticist satchel"
desc = "A sterile satchel with geneticist colours."
icon_state = "satchel-gen"
item_state_slots = list(slot_r_hand_str = "genpack", slot_l_hand_str = "genpack")
icon_state = "satchel_blue"
/obj/item/weapon/storage/backpack/satchel/tox
name = "scientist satchel"
desc = "Useful for holding research materials."
icon_state = "satchel-tox"
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
icon_state = "satchel_purple"
/obj/item/weapon/storage/backpack/satchel/sec
name = "security satchel"
desc = "A robust satchel for security related needs."
icon_state = "satchel-sec"
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
icon_state = "satchel_security"
/obj/item/weapon/storage/backpack/satchel/hyd
name = "hydroponics satchel"
desc = "A green satchel for plant related work."
icon_state = "satchel_hyd"
icon_state = "satchel_hydro"
/obj/item/weapon/storage/backpack/satchel/cap
name = "site manager's satchel"
desc = "An exclusive satchel for officers."
icon_state = "satchel-cap"
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
icon_state = "satchel_captain"
//ERT backpacks.
/obj/item/weapon/storage/backpack/ert
name = "emergency response team backpack"
desc = "A spacious backpack with lots of pockets, used by members of the Emergency Response Team."
icon_state = "ert_commander"
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
//Commander
/obj/item/weapon/storage/backpack/ert/commander
@@ -292,59 +316,106 @@
/obj/item/weapon/storage/backpack/messenger
name = "messenger bag"
desc = "A sturdy backpack worn over one shoulder."
icon_state = "courierbag"
item_state_slots = list(slot_r_hand_str = "backpack", slot_l_hand_str = "backpack")
icon_state = "courier"
item_state_slots = list(slot_r_hand_str = "satchel_grey", slot_l_hand_str = "satchel_grey")
/obj/item/weapon/storage/backpack/messenger/chem
name = "chemistry messenger bag"
desc = "A serile backpack worn over one shoulder. This one is in Chemsitry colors."
icon_state = "courierbagchem"
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
icon_state = "courier_chemistry"
item_state_slots = list(slot_r_hand_str = "satchel_orange", slot_l_hand_str = "satchel_orange")
/obj/item/weapon/storage/backpack/messenger/med
name = "medical messenger bag"
desc = "A sterile backpack worn over one shoulder used in medical departments."
icon_state = "courierbagmed"
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
icon_state = "courier_medical"
item_state_slots = list(slot_r_hand_str = "satchel_medical", slot_l_hand_str = "satchel_medical")
/obj/item/weapon/storage/backpack/messenger/viro
name = "virology messenger bag"
desc = "A sterile backpack worn over one shoulder. This one is in Virology colors."
icon_state = "courierbagviro"
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
icon_state = "courier_virology"
item_state_slots = list(slot_r_hand_str = "satchel_green", slot_l_hand_str = "satchel_green")
/obj/item/weapon/storage/backpack/messenger/tox
name = "research messenger bag"
desc = "A backpack worn over one shoulder. Useful for holding science materials."
icon_state = "courierbagtox"
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
icon_state = "courier_toxins"
item_state_slots = list(slot_r_hand_str = "satchel_purple", slot_l_hand_str = "satchel_purple")
/obj/item/weapon/storage/backpack/messenger/com
name = "command messenger bag"
desc = "A special backpack worn over one shoulder. This one is made specifically for officers."
icon_state = "courierbagcom"
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
icon_state = "courier_captain"
item_state_slots = list(slot_r_hand_str = "satchel_captain", slot_l_hand_str = "satchel_captain")
/obj/item/weapon/storage/backpack/messenger/engi
name = "engineering messenger bag"
icon_state = "courierbagengi"
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
icon_state = "courier_industrial"
item_state_slots = list(slot_r_hand_str = "satchel_industrial", slot_l_hand_str = "satchel_industrial")
/obj/item/weapon/storage/backpack/messenger/hyd
name = "hydroponics messenger bag"
desc = "A backpack worn over one shoulder. This one is designed for plant-related work."
icon_state = "courierbaghyd"
icon_state = "courier_hydro"
item_state_slots = list(slot_r_hand_str = "satchel_hydro", slot_l_hand_str = "satchel_hydro")
/obj/item/weapon/storage/backpack/messenger/sec
name = "security messenger bag"
desc = "A tactical backpack worn over one shoulder. This one is in Security colors."
icon_state = "courierbagsec"
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
icon_state = "courier_security"
item_state_slots = list(slot_r_hand_str = "satchel_security", slot_l_hand_str = "satchel_security")
/obj/item/weapon/storage/backpack/messenger/black
icon_state = "courierbagblk"
icon_state = "courier_black"
/*
* Sport Bags
*/
/obj/item/weapon/storage/backpack/sport
name = "sports backpack"
icon_state = "backsport"
/obj/item/weapon/storage/backpack/sport/white
name = "white sports backpack"
icon_state = "backsport_white"
/obj/item/weapon/storage/backpack/sport/fancy
name = "fancy sports backpack"
icon_state = "backsport_fancy"
/obj/item/weapon/storage/backpack/sport/vir
name = "virologist sports backpack"
desc = "A sterile sports backpack with virologist colours."
icon_state = "backsport_green"
/obj/item/weapon/storage/backpack/sport/chem
name = "chemist sports backpack"
desc = "A sterile sports backpack with chemist colours."
icon_state = "backsport_orange"
/obj/item/weapon/storage/backpack/sport/gen
name = "geneticist sports backpack"
desc = "A sterile sports backpack with geneticist colours."
icon_state = "backsport_blue"
/obj/item/weapon/storage/backpack/sport/tox
name = "scientist sports backpack"
desc = "Useful for holding research materials."
icon_state = "backsport_purple"
/obj/item/weapon/storage/backpack/sport/sec
name = "security sports backpack"
desc = "A robust sports backpack for security related needs."
icon_state = "backsport_security"
/obj/item/weapon/storage/backpack/sport/hyd
name = "hydroponics sports backpack"
desc = "A green sports backpack for plant related work."
icon_state = "backsport_hydro"
//Purses
/obj/item/weapon/storage/backpack/purse
name = "purse"
@@ -394,29 +465,29 @@
return
if(!parachute) //This packs the parachute
H.visible_message("<span class='notice'>\The [H] starts to pack \the [src]!</span>", \
H.visible_message("<b>\The [H]</b> starts to pack \the [src]!", \
"<span class='notice'>You start to pack \the [src]!</span>", \
"You hear the shuffling of cloth.")
if(do_after(H, 50))
H.visible_message("<span class='notice'>\The [H] finishes packing \the [src]!</span>", \
H.visible_message("<b>\The [H]</b> finishes packing \the [src]!", \
"<span class='notice'>You finish packing \the [src]!</span>", \
"You hear the shuffling of cloth.")
parachute = TRUE
else
H.visible_message("<span class='notice'>\The [src] gives up on packing \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> gives up on packing \the [src]!", \
"<span class='notice'>You give up on packing \the [src]!</span>")
return
else //This unpacks the parachute
H.visible_message("<span class='notice'>\The [src] starts to unpack \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> starts to unpack \the [src]!", \
"<span class='notice'>You start to unpack \the [src]!</span>", \
"You hear the shuffling of cloth.")
if(do_after(H, 25))
H.visible_message("<span class='notice'>\The [src] finishes unpacking \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> finishes unpacking \the [src]!", \
"<span class='notice'>You finish unpacking \the [src]!</span>", \
"You hear the shuffling of cloth.")
parachute = FALSE
else
H.visible_message("<span class='notice'>\The [src] decides not to unpack \the [src]!</span>", \
H.visible_message("<b>\The [src]</b> decides not to unpack \the [src]!", \
"<span class='notice'>You decide not to unpack \the [src]!</span>")
return
@@ -53,6 +53,16 @@
icon_state = "trashbag2"
else icon_state = "trashbag3"
/obj/item/weapon/storage/bag/trash/holding
name = "trash bag of holding"
desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage."
icon_state = "bluetrashbag"
origin_tech = list(TECH_BLUESPACE = 3)
max_w_class = ITEMSIZE_NORMAL
max_storage_space = ITEMSIZE_COST_NORMAL * 10 // Slightly less than BoH
/obj/item/weapon/storage/bag/trash/holding/update_icon()
return
// -----------------------------
// Plastic Bag
@@ -236,7 +236,7 @@
if(istype(W, /obj/item/clothing/mask/smokable/cigarette))
var/obj/item/clothing/mask/smokable/cigarette/C = W
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
..()
return ..()
/obj/item/weapon/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
@@ -343,7 +343,7 @@
var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W
if(!istype(C)) return
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
..()
return ..()
/obj/item/weapon/storage/rollingpapers
name = "rolling paper pack"
@@ -0,0 +1,186 @@
#define INVENTORY_POUCH_SPACE ITEMSIZE_COST_SMALL*4 // 25% the size of a backpack for normal size
// Pouches for small storage in pocket slots
/obj/item/weapon/storage/pouch
name = "storage pouch (medium)"
desc = "This storage pouch can be used to provide some additional storage for quick access."
icon = 'icons/obj/clothing/pouches.dmi'
slot_flags = SLOT_POCKET
drop_sound = 'sound/items/drop/backpack.ogg'
pickup_sound = 'sound/items/pickup/backpack.ogg'
icon_state = "medium_generic"
max_w_class = ITEMSIZE_NORMAL
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = null
pocketable = TRUE
var/insert_delay = 0
var/remove_delay = 2 SECONDS
/obj/item/weapon/storage/pouch/stall_insertion(obj/item/W, mob/user)
// No delay if you have the pouch in your hands
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
return TRUE // Skip delay
if(insert_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE))
return FALSE // Moved or whatever
if(W in src)
return TRUE // Item is still inside
return FALSE
/obj/item/weapon/storage/pouch/stall_removal(obj/item/W, mob/user)
// No delay if you have the pouch in your hands
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
return TRUE // Skip delay
if(remove_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE))
return FALSE // Moved or whatever
if(W in src)
return TRUE // Item is still inside
return FALSE
/obj/item/weapon/storage/pouch/pocket_description(mob/haver, mob/examiner)
return "[src]"
/obj/item/weapon/storage/pouch/large
name = "storage pouch (large)"
desc = "This storage pouch can be used to provide a good amount of additional storage for quick access."
icon_state = "large_generic"
max_storage_space = ITEMSIZE_COST_SMALL*6
/obj/item/weapon/storage/pouch/small
name = "storage pouch (small)"
desc = "This storage pouch can be used to provide a small amount of additional storage for quick access."
icon_state = "small_generic"
max_storage_space = ITEMSIZE_COST_SMALL*2
/obj/item/weapon/storage/pouch/ammo
name = "storage pouch (ammo)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold ammunition and cells."
icon_state = "ammo"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(/obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/cell/device/weapon)
/obj/item/weapon/storage/pouch/eng_tool
name = "storage pouch (tools)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold tools."
icon_state = "engineering_tool"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/weapon/tool,
/obj/item/weapon/weldingtool,
/obj/item/device/multitool,
/obj/item/device/flashlight,
/obj/item/device/t_scanner,
/obj/item/device/analyzer,
/obj/item/clothing/glasses,
/obj/item/clothing/gloves,
)
/obj/item/weapon/storage/pouch/eng_supply
name = "storage pouch (supplies)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold engineering supplies."
icon_state = "engineering_supply"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/weapon/cell/device,
/obj/item/stack/cable_coil,
/obj/item/taperoll,
/obj/item/weapon/extinguisher/mini,
/obj/item/weapon/tape_roll
)
/obj/item/weapon/storage/pouch/eng_parts
name = "storage pouch (parts)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold machinery components."
icon_state = "part_pouch"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/weapon/stock_parts,
/obj/item/stack/cable_coil,
/obj/item/weapon/circuitboard
)
/obj/item/weapon/storage/pouch/medical
name = "storage pouch (medical)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold medical supplies."
icon_state = "medical_supply"
max_storage_space = INVENTORY_POUCH_SPACE
can_hold = list(
/obj/item/device/healthanalyzer,
/obj/item/weapon/dnainjector,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/reagent_containers/glass/beaker,
/obj/item/weapon/reagent_containers/glass/bottle,
/obj/item/weapon/reagent_containers/pill,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/weapon/storage/quickdraw/syringe_case,
/obj/item/weapon/storage/pill_bottle,
/obj/item/stack/medical,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/weapon/storage/quickdraw/syringe_case
)
/obj/item/weapon/storage/pouch/flares
name = "storage pouch (flares)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold flares and glowsticks."
icon_state = "flare"
storage_slots = 5
can_hold = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/glowstick)
/obj/item/weapon/storage/pouch/flares/full_flare
starts_with = list(/obj/item/device/flashlight/flare = 5)
/obj/item/weapon/storage/pouch/flares/full_glow
starts_with = list(/obj/item/device/flashlight/glowstick = 5)
/obj/item/weapon/storage/pouch/flares/update_icon()
cut_overlays()
if(contents.len)
add_overlay("flare_[contents.len]")
..()
/obj/item/weapon/storage/pouch/holster
name = "storage pouch (holster)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one normal sized weapon."
icon_state = "pistol_holster"
storage_slots = 1
can_hold = list(/obj/item/weapon/gun)
remove_delay = 0
/obj/item/weapon/storage/pouch/holster/full_stunrevolver
starts_with = list(/obj/item/weapon/gun/energy/stunrevolver)
/obj/item/weapon/storage/pouch/holster/full_taser
starts_with = list(/obj/item/weapon/gun/energy/taser)
/obj/item/weapon/storage/pouch/holster/update_icon()
cut_overlays()
if(contents.len)
add_overlay("pistol_layer")
..()
/obj/item/weapon/storage/pouch/baton
name = "storage pouch (baton)"
desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one standard baton."
icon_state = "baton_holster"
storage_slots = 1
can_hold = list(/obj/item/weapon/melee/baton)
remove_delay = 0
/obj/item/weapon/storage/pouch/baton/full
starts_with = list(/obj/item/weapon/melee/baton)
/obj/item/weapon/storage/pouch/baton/update_icon()
cut_overlays()
if(contents.len)
add_overlay("baton_layer")
..()
/obj/item/weapon/storage/pouch/holding
name = "storage pouch of holding"
desc = "This storage pouch can be used to provide some additional storage for quick access. Seems to use extradimensional storage!"
icon_state = "holdingpouch"
max_storage_space = INVENTORY_STANDARD_SPACE // Size of a normal backpack, compared to a normal BoH, which is way bigger
#undef INVENTORY_POUCH_SPACE
@@ -49,6 +49,8 @@
var/use_sound = "rustle" //sound played when used. null for no sound.
var/list/starts_with //Things to spawn on the box on spawn
var/empty //Mapper override to spawn an empty version of a container that usually has stuff
/// If you can use this storage while in a pocket
var/pocketable = FALSE
/obj/item/weapon/storage/Initialize()
. = ..()
@@ -101,6 +103,7 @@
count--
new newtype(src)
starts_with = null //Reduce list count.
update_icon()
calibrate_size()
@@ -473,6 +476,9 @@
/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
if(!istype(W)) return 0
if(!stall_insertion(W, usr)) // Can sleep here and delay removal for slow storage
return 0
if(usr)
usr.remove_from_mob(W,target = src) //If given a target, handles forceMove()
W.on_enter_storage(src)
@@ -506,6 +512,9 @@
/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location)
if(!istype(W)) return 0
if(!stall_removal(W, usr)) // Can sleep here and delay removal for slow storage
return 0
if(istype(src, /obj/item/weapon/storage/fancy))
var/obj/item/weapon/storage/fancy/F = src
F.update_icon(1)
@@ -534,6 +543,14 @@
update_icon()
return 1
/// Called before insertion completes, allowing you to delay or cancel it
/obj/item/weapon/storage/proc/stall_insertion(obj/item/W, mob/user)
return TRUE
/// Called before removal completes, allowing you to delay or cancel it
/obj/item/weapon/storage/proc/stall_removal(obj/item/W, mob/user)
return TRUE
//This proc is called when you want to place an item into the storage item.
/obj/item/weapon/storage/attackby(obj/item/W as obj, mob/user as mob)
..()
@@ -579,7 +596,7 @@
return
/obj/item/weapon/storage/attack_hand(mob/user as mob)
if(ishuman(user))
if(ishuman(user) && !pocketable)
var/mob/living/carbon/human/H = user
if(H.l_store == src && !H.get_active_hand()) //Prevents opening if it's in a pocket.
H.put_in_hands(src)
@@ -67,7 +67,7 @@
force = 15//quite robust
attack_verb = list("smacked", "struck", "slapped")
else
user.visible_message("<span class='notice'>\The [user] collapses their telescopic baton.</span>",\
user.visible_message("<b>\The [user]</b> collapses their telescopic baton.",\
"<span class='notice'>You collapse the baton.</span>",\
"You hear a click.")
icon_state = "telebaton0"
@@ -508,7 +508,7 @@
if(mounted_pack.loc != src.loc && src.loc != mounted_pack)
mounted_pack.return_nozzle()
visible_message("<span class='notice'>\The [src] retracts to its fueltank.</span>")
visible_message("<b>\The [src]</b> retracts to its fueltank.")
if(get_fuel() <= get_max_fuel())
mounted_pack.reagents.trans_to_obj(src, 1)
+27 -4
View File
@@ -71,8 +71,8 @@
/obj/random/powercell
name = "random powercell"
desc = "This is a random powercell."
icon = 'icons/obj/power.dmi'
icon_state = "cell"
icon = 'icons/obj/power_cells.dmi'
icon_state = "random"
/obj/random/powercell/item_to_spawn()
return pick(prob(40);/obj/item/weapon/cell,
@@ -133,8 +133,8 @@
/obj/random/tech_supply
name = "random tech supply"
desc = "This is a random piece of technology supplies."
icon = 'icons/obj/power.dmi'
icon_state = "cell"
icon = 'icons/obj/power_cells.dmi'
icon_state = "random"
spawn_nothing_percentage = 25
/obj/random/tech_supply/item_to_spawn()
@@ -955,3 +955,26 @@
prob(3);/obj/item/clothing/accessory/poncho/thermal/green,
prob(3);/obj/item/clothing/accessory/poncho/thermal/purple,
prob(3);/obj/item/clothing/accessory/poncho/thermal/blue)
/obj/random/pouch
name = "Random Storage Pouch"
desc = "This is a random storage pouch."
icon = 'icons/obj/clothing/pouches.dmi'
icon_state = "random"
/obj/random/pouch/item_to_spawn()
return pick(
prob(10);/obj/item/weapon/storage/pouch, // medium
prob(3);/obj/item/weapon/storage/pouch/large,
prob(8);/obj/item/weapon/storage/pouch/small,
prob(5);/obj/item/weapon/storage/pouch/ammo,
prob(5);/obj/item/weapon/storage/pouch/eng_tool,
prob(5);/obj/item/weapon/storage/pouch/eng_supply,
prob(5);/obj/item/weapon/storage/pouch/eng_parts,
prob(5);/obj/item/weapon/storage/pouch/medical,
prob(5);/obj/item/weapon/storage/pouch/flares/full_flare,
prob(5);/obj/item/weapon/storage/pouch/flares/full_glow,
prob(5);/obj/item/weapon/storage/pouch/holster,
prob(5);/obj/item/weapon/storage/pouch/baton/full,
prob(1);/obj/item/weapon/storage/pouch/holding
)
+7 -7
View File
@@ -7,7 +7,7 @@
var/climb_delay = 3.5 SECONDS
var/breakable
var/parts
var/list/climbers = list()
var/list/climbers
var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies.
var/list/connections = list("0", "0", "0", "0")
@@ -35,7 +35,7 @@
if(H.species.can_shred(user))
attack_generic(user,1,"slices")
if(climbers.len && !(user in climbers))
if(LAZYLEN(climbers) && !(user in climbers))
user.visible_message("<span class='warning'>[user.name] shakes \the [src].</span>", \
"<span class='notice'>You shake \the [src].</span>")
structure_shaken()
@@ -103,21 +103,21 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if (!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
usr.forceMove(get_turf(src))
if (get_turf(user) == get_turf(src))
usr.visible_message("<span class='warning'>[user] climbs onto \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/proc/structure_shaken()
for(var/mob/living/M in climbers)
@@ -204,7 +204,7 @@
if(can_visually_connect_to(S))
if(S.can_visually_connect())
if(propagate)
//S.update_connections() //Not here
S.update_connections()
S.update_icon()
dirs += get_dir(src, S)
+561
View File
@@ -0,0 +1,561 @@
///////////
// EASEL //
///////////
/obj/structure/easel
name = "easel"
desc = "Only for the finest of art!"
icon = 'icons/obj/artstuff.dmi'
icon_state = "easel"
density = TRUE
//resistance_flags = FLAMMABLE
//max_integrity = 60
var/obj/item/canvas/painting = null
//Adding canvases
/obj/structure/easel/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/canvas))
var/obj/item/canvas/canvas = I
user.drop_from_inventory(canvas)
painting = canvas
canvas.forceMove(get_turf(src))
canvas.layer = layer+0.1
user.visible_message("<span class='notice'>[user] puts \the [canvas] on \the [src].</span>","<span class='notice'>You place \the [canvas] on \the [src].</span>")
else
return ..()
//Stick to the easel like glue
/obj/structure/easel/Move()
var/turf/T = get_turf(src)
. = ..()
if(painting && painting.loc == T) //Only move if it's near us.
painting.forceMove(get_turf(src))
else
painting = null
/obj/item/canvas
name = "canvas"
desc = "Draw out your soul on this canvas!"
icon = 'icons/obj/artstuff.dmi'
icon_state = "11x11"
//flags_1 = UNPAINTABLE_1
//resistance_flags = FLAMMABLE
var/width = 11
var/height = 11
var/list/grid
var/canvas_color = "#ffffff" //empty canvas color
var/used = FALSE
var/painting_name = "Untitled Artwork" //Painting name, this is set after framing.
var/finalized = FALSE //Blocks edits
var/author_name
var/author_ckey
var/icon_generated = FALSE
var/icon/generated_icon
///boolean that blocks persistence from saving it. enabled from printing copies, because we do not want to save copies.
var/no_save = FALSE
/// From the origin of the turf we're on, where should the left of the canvas pixel be
var/framed_offset_x = 11
/// From the origin of the turf we're on, where should the bottom of the canvas be
var/framed_offset_y = 10
/// The frame takes the painting's offset, then moves this X offset
var/frame_offset_x = -1
/// The frame takes the painting's offset, then moves this Y offset
var/frame_offset_y = -1
pixel_x = 10
pixel_y = 9
/obj/item/canvas/Initialize()
. = ..()
reset_grid()
/obj/item/canvas/proc/reset_grid()
grid = new/list(width,height)
for(var/x in 1 to width)
for(var/y in 1 to height)
grid[x][y] = canvas_color
/obj/item/canvas/attack_self(mob/user)
. = ..()
tgui_interact(user)
/obj/item/canvas/dropped(mob/user)
pixel_x = initial(pixel_x)
pixel_y = initial(pixel_y)
return ..()
/obj/item/canvas/tgui_state(mob/user)
if(finalized)
return GLOB.tgui_physical_obscured_state
else
return GLOB.tgui_default_state
/obj/item/canvas/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Canvas", name)
ui.set_autoupdate(FALSE)
ui.open()
/obj/item/canvas/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/paint_palette))
var/choice = tgui_alert(user, "Adjusting the base color of this canvas will replace ALL pixels with the selected color. Are you sure?", "Confirm Color Fill", list("Yes", "No"))
if(choice == "No")
return
var/basecolor = input(user, "Select a base color for the canvas:", "Base Color", canvas_color) as null|color
if(basecolor && Adjacent(user, src) && Adjacent(user, I))
canvas_color = basecolor
reset_grid()
user.visible_message("[user] smears paint on [src], covering the entire thing in paint.", "You smear paint on [src], changing the color of the entire thing.", runemessage = "smears paint")
update_appearance()
return
if(user.a_intent == I_HELP)
tgui_interact(user)
else
return ..()
/obj/item/canvas/tgui_data(mob/user)
. = ..()
.["grid"] = grid
.["name"] = painting_name
.["finalized"] = finalized
/obj/item/canvas/examine(mob/user)
. = ..()
tgui_interact(user)
/obj/item/canvas/tgui_act(action, params)
. = ..()
if(. || finalized)
return
var/mob/user = usr
switch(action)
if("paint")
var/obj/item/I = user.get_active_hand()
var/color = get_paint_tool_color(I)
if(!color)
return FALSE
var/x = text2num(params["x"])
var/y = text2num(params["y"])
grid[x][y] = color
used = TRUE
update_appearance()
. = TRUE
if("finalize")
. = TRUE
if(!finalized)
finalize(user)
/obj/item/canvas/proc/finalize(mob/user)
finalized = TRUE
author_name = user.real_name
author_ckey = user.ckey
generate_proper_overlay()
try_rename(user)
/obj/item/canvas/proc/update_appearance()
cut_overlays()
if(icon_generated)
var/mutable_appearance/detail = mutable_appearance(generated_icon)
detail.pixel_x = 1
detail.pixel_y = 1
add_overlay(detail)
return
if(!used)
return
var/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]wip")
detail.pixel_x = 1
detail.pixel_y = 1
add_overlay(detail)
/obj/item/canvas/proc/generate_proper_overlay()
if(icon_generated)
return
var/png_filename = "data/persistent/paintings/temp_painting.png"
var/result = rustg_dmi_create_png(png_filename,"[width]","[height]",get_data_string())
if(result)
CRASH("Error generating painting png : [result]")
generated_icon = new(png_filename)
icon_generated = TRUE
update_appearance()
/obj/item/canvas/proc/get_data_string()
var/list/data = list()
for(var/y in 1 to height)
for(var/x in 1 to width)
data += grid[x][y]
return data.Join("")
//Todo make this element ?
/obj/item/canvas/proc/get_paint_tool_color(obj/item/I)
if(!I)
return
if(istype(I, /obj/item/paint_brush))
var/obj/item/paint_brush/P = I
return P.selected_color
else if(istype(I, /obj/item/weapon/pen/crayon))
var/obj/item/weapon/pen/crayon/crayon = I
return crayon.colour
else if(istype(I, /obj/item/weapon/pen))
var/obj/item/weapon/pen/P = I
switch(P.colour)
if("black")
return "#000000"
if("blue")
return "#0000ff"
if("red")
return "#ff0000"
return P.colour
else if(istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag))
return canvas_color
/obj/item/canvas/proc/try_rename(mob/user)
var/new_name = stripped_input(user,"What do you want to name the painting?")
if(new_name != painting_name && new_name && CanUseTopic(user, GLOB.tgui_physical_state))
painting_name = new_name
SStgui.update_uis(src)
/obj/item/canvas/nineteen_nineteen
icon_state = "19x19"
width = 19
height = 19
pixel_x = 5
pixel_y = 10
framed_offset_x = 8
framed_offset_y = 9
/obj/item/canvas/twentythree_nineteen
icon_state = "23x19"
width = 23
height = 19
pixel_x = 4
pixel_y = 10
framed_offset_x = 6
framed_offset_y = 8
/obj/item/canvas/twentythree_twentythree
icon_state = "23x23"
width = 23
height = 23
pixel_x = 5
pixel_y = 9
framed_offset_x = 5
framed_offset_y = 6
/obj/item/canvas/twentyfour_twentyfour
name = "ai universal standard canvas"
//desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." // Not yet
icon_state = "24x24"
width = 24
height = 24
pixel_x = 2
pixel_y = 2
framed_offset_x = 4
framed_offset_y = 4
frame_offset_x = -2
frame_offset_y = -2
/obj/item/paint_brush
name = "artist's paintbrush"
desc = "When you really want to put together a masterpiece!"
description_info = "Hit this on a palette to set the color, and use it on a canvas to paint with that color."
icon = 'icons/obj/artstuff.dmi'
icon_state = "brush"
var/selected_color = "#000000"
var/image/color_drop
var/hud_level = FALSE
/obj/item/paint_brush/Initialize()
. = ..()
color_drop = image(icon, null, "brush_color")
color_drop.color = selected_color
// When picked up
/obj/item/paint_brush/hud_layerise()
. = ..()
hud_level = TRUE
update_paint()
// When put down
/obj/item/paint_brush/reset_plane_and_layer()
. = ..()
hud_level = FALSE
update_paint()
/obj/item/paint_brush/proc/update_paint(var/new_color)
if(new_color)
selected_color = new_color
color_drop.color = new_color
cut_overlays()
if(hud_level)
add_overlay(color_drop)
/obj/item/paint_palette
name = "artist's palette"
desc = "Helps to have a paintbrush, too."
description_info = "You can hit this on a canvas to set the entire canvas color (but note that it will wipe out any works in progress). You can hit a paintbrush on this to set the color."
icon = 'icons/obj/artstuff.dmi'
icon_state = "palette"
/obj/item/paint_palette/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/paint_brush))
var/obj/item/paint_brush/P = W
var/newcolor = input(user, "Select a new paint color:", "Paint Palette", P.selected_color) as null|color
if(newcolor && Adjacent(user, P) && Adjacent(user, src))
P.update_paint(newcolor)
else
return ..()
/obj/item/frame/painting
name = "painting frame"
desc = "The perfect showcase for your favorite deathtrap memories."
icon = 'icons/obj/decals.dmi'
//custom_materials = list(/datum/material/wood = 2000)
//flags_1 = NONE
icon_state = "frame-empty"
/obj/item/frame/painting/try_build(turf/on_wall, mob/user as mob)
if(get_dist(on_wall, user) > 1)
return
var/ndir = get_dir(on_wall, user)
if (!(ndir in cardinal))
return
if(!istype(on_wall, /turf/simulated/wall))
to_chat(user, "<span class='warning'>Frame cannot be placed on this spot.</span>")
return
new /obj/structure/sign/painting(get_turf(user), ndir, TRUE)
qdel(src)
/obj/structure/sign/painting
name = "Painting"
desc = "Art or \"Art\"? You decide."
icon = 'icons/obj/decals.dmi'
icon_state = "frame-empty"
var/base_icon_state = "frame"
//custom_materials = list(/datum/material/wood = 2000)
//buildable_sign = FALSE
///Canvas we're currently displaying.
var/obj/item/canvas/current_canvas
///Description set when canvas is added.
var/desc_with_canvas
var/persistence_id
//Presets for art gallery mapping, for paintings to be shared across stations
/obj/structure/sign/painting/public
name = "\improper Public Painting Exhibit mounting"
desc = "For art pieces hung by the public."
desc_with_canvas = "A piece of art (or \"art\"). Anyone could've hung it."
persistence_id = "public"
/obj/structure/sign/painting/library_secure
name = "\improper Curated Painting Exhibit mounting"
desc = "For masterpieces hand-picked by the curator."
desc_with_canvas = "A masterpiece hand-picked by the curator, supposedly."
persistence_id = "library"
req_one_access = list(access_library)
/obj/structure/sign/painting/chapel_secure
name = "\improper Religious Painting Exhibit mounting"
desc = "For masterpieces hand-picked by the chaplain."
desc_with_canvas = "A masterpiece hand-picked by the chaplain, supposedly."
persistence_id = "chapel"
req_one_access = list(access_chapel_office)
/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least
name = "\improper Private Painting Exhibit mounting"
desc = "For art pieces deemed too subversive or too illegal to be shared outside of curators."
desc_with_canvas = "A painting hung away from lesser minds."
persistence_id = "library_private"
req_one_access = list(access_library)
/obj/structure/sign/painting/Initialize(mapload, dir, building)
. = ..()
if(persistence_id)
SSpersistence.painting_frames += src
if(dir)
set_dir(dir)
if(building)
pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
/obj/structure/sign/painting/Destroy()
. = ..()
SSpersistence.painting_frames -= src
/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params)
if(!current_canvas && istype(I, /obj/item/canvas))
frame_canvas(user, I)
else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/weapon/pen))
try_rename(user)
else if(current_canvas && I.is_wirecutter())
unframe_canvas(user)
else
return ..()
/obj/structure/sign/painting/examine(mob/user)
. = ..()
if(persistence_id)
. += "<span class='notice'>Any painting placed here will be archived at the end of the shift.</span>"
if(current_canvas)
current_canvas.tgui_interact(user)
. += "<span class='notice'>Use wirecutters to remove the painting.</span>"
/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas)
if(!allowed(user))
to_chat(user, "<span class='warning'>You're not comfortable framing this canvas in such a prestigious spot!</span>")
return
if(user.drop_from_inventory(new_canvas, src))
current_canvas = new_canvas
if(!current_canvas.finalized)
current_canvas.finalize(user)
to_chat(user,"<span class='notice'>You frame [current_canvas].</span>")
update_appearance()
/obj/structure/sign/painting/proc/unframe_canvas(mob/living/user)
if(current_canvas)
current_canvas.forceMove(drop_location())
current_canvas = null
to_chat(user, "<span class='notice'>You remove the painting from the frame.</span>")
update_appearance()
/obj/structure/sign/painting/proc/try_rename(mob/user)
if(current_canvas.painting_name == initial(current_canvas.painting_name))
current_canvas.try_rename(user)
/obj/structure/sign/painting/proc/update_appearance()
name = current_canvas ? "painting - [current_canvas.painting_name]" : initial(name)
desc = current_canvas ? desc_with_canvas : initial(desc)
icon_state = "[base_icon_state]-[current_canvas?.generated_icon ? "hidden" : "empty"]"
cut_overlays()
if(!current_canvas?.generated_icon)
return
. = list()
var/mutable_appearance/MA = mutable_appearance(current_canvas.generated_icon)
MA.pixel_x = current_canvas.framed_offset_x
MA.pixel_y = current_canvas.framed_offset_y
. += MA
var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame")
frame.pixel_x = current_canvas.framed_offset_x + current_canvas.frame_offset_x
frame.pixel_y = current_canvas.framed_offset_y + current_canvas.frame_offset_y
. += frame
add_overlay(.)
/obj/item/canvas/proc/fill_grid_from_icon(icon/I)
var/h = I.Height() + 1
for(var/x in 1 to width)
for(var/y in 1 to height)
grid[x][y] = I.GetPixel(x,h-y)
/**
* Loads a painting from SSpersistence. Called globally by said subsystem when it inits
*
* Deleting paintings leaves their json, so this proc will remove the json and try again if it finds one of those.
*/
/obj/structure/sign/painting/proc/load_persistent()
if(!persistence_id || !SSpersistence.paintings)
return
var/list/painting_category = list()
for (var/list/P in SSpersistence.paintings)
if(P["persistence_id"] == persistence_id)
painting_category[++painting_category.len] = P
var/list/painting
while(!painting)
if(!length(painting_category))
return //aborts loading anything this category has no usable paintings
var/list/chosen = pick(painting_category)
if(!fexists("data/persistent/paintings/[persistence_id]/[chosen["md5"]].png")) //shitmin deleted this art, lets remove json entry to avoid errors
painting_category -= list(chosen)
continue //and try again
painting = chosen
var/title = painting["title"]
var/author_name = painting["author"]
var/author_ckey = painting["ckey"]
var/png = "data/persistent/paintings/[persistence_id]/[painting["md5"]].png"
if(!title)
title = "Untitled Artwork" //legacy artwork allowed null names which was bad for the json, lets fix that
painting["title"] = title
var/icon/I = new(png)
var/obj/item/canvas/new_canvas
var/w = I.Width()
var/h = I.Height()
for(var/T in typesof(/obj/item/canvas))
new_canvas = T
if(initial(new_canvas.width) == w && initial(new_canvas.height) == h)
new_canvas = new T(src)
break
new_canvas.fill_grid_from_icon(I)
new_canvas.generated_icon = I
new_canvas.icon_generated = TRUE
new_canvas.finalized = TRUE
new_canvas.painting_name = title
new_canvas.author_name = author_name
new_canvas.author_ckey = author_ckey
new_canvas.name = "painting - [title]"
current_canvas = new_canvas
update_appearance()
/obj/structure/sign/painting/proc/save_persistent()
if(!persistence_id || !current_canvas || current_canvas.no_save)
return
if(sanitize_filename(persistence_id) != persistence_id)
stack_trace("Invalid persistence_id - [persistence_id]")
return
if(!current_canvas.painting_name)
current_canvas.painting_name = "Untitled Artwork"
var/data = current_canvas.get_data_string()
var/md5 = md5(lowertext(data))
LAZYINITLIST(SSpersistence.paintings)
for(var/list/entry in SSpersistence.paintings)
if(entry["md5"] == md5)
return
var/png_directory = "data/persistent/paintings/[persistence_id]/"
var/png_path = png_directory + "[md5].png"
var/result = rustg_dmi_create_png(png_path,"[current_canvas.width]","[current_canvas.height]",data)
if(result)
CRASH("Error saving persistent painting: [result]")
SSpersistence.paintings += list(list(
"persistence_id" = persistence_id,
"title" = current_canvas.painting_name,
"md5" = md5,
"author" = current_canvas.author_name,
"ckey" = current_canvas.author_ckey
))
/obj/structure/sign/painting/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION("removepainting", "Remove Persistent Painting")
/obj/structure/sign/painting/vv_do_topic(list/href_list)
. = ..()
if(href_list["removepainting"])
if(!check_rights(NONE))
return
var/mob/user = usr
if(!persistence_id || !current_canvas)
to_chat(user,"<span class='warning'>This is not a persistent painting.</span>")
return
var/md5 = md5(lowertext(current_canvas.get_data_string()))
var/author = current_canvas.author_ckey
var/list/filenames_found = list()
for(var/list/entry in SSpersistence.paintings)
if(entry["md5"] == md5)
filenames_found += "data/persistent/paintings/[entry["persistence_id"]]/[entry["md5"]].png"
SSpersistence.paintings -= entry
for(var/png in filenames_found)
if(fexists(png))
fdel(png)
for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames)
if(P.current_canvas && md5(P.current_canvas.get_data_string()) == md5)
QDEL_NULL(P.current_canvas)
P.update_appearance()
log_and_message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")
+1 -1
View File
@@ -30,7 +30,7 @@ LINEN BINS
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
if(is_sharp(I))
user.visible_message("<span class='notice'>\The [user] begins cutting up [src] with [I].</span>", "<span class='notice'>You begin cutting up [src] with [I].</span>")
user.visible_message("<b>\The [user]</b> begins cutting up [src] with [I].", "<span class='notice'>You begin cutting up [src] with [I].</span>")
if(do_after(user, 50))
to_chat(user, "<span class='notice'>You cut [src] into pieces!</span>")
for(var/i in 1 to rand(2,5))
+5 -4
View File
@@ -160,7 +160,7 @@
burning = FALSE
update_icon()
STOP_PROCESSING(SSobj, src)
visible_message("<span class='notice'>\The [src] stops burning.</span>")
visible_message("<b>\The [src]</b> stops burning.")
/obj/structure/bonfire/proc/ignite()
if(!burning && get_fuel_amount())
@@ -180,8 +180,9 @@
O.fire_act(null, 1000, 500)
else if(isliving(A) && get_fuel_amount() > 4)
var/mob/living/L = A
L.adjust_fire_stacks(get_fuel_amount() / 4)
L.IgniteMob()
if(!(L.is_incorporeal()))
L.adjust_fire_stacks(get_fuel_amount() / 4)
L.IgniteMob()
/obj/structure/bonfire/update_icon()
cut_overlays()
@@ -353,7 +354,7 @@
burning = FALSE
update_icon()
STOP_PROCESSING(SSobj, src)
visible_message("<span class='notice'>\The [src] stops burning.</span>")
visible_message("<b>\The [src]</b> stops burning.")
/obj/structure/fireplace/proc/ignite()
if(!burning && get_fuel_amount())
+12 -12
View File
@@ -26,14 +26,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -42,7 +42,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied.
if(!..())
@@ -84,14 +84,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -100,7 +100,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_ropes_bottom/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
@@ -143,14 +143,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -159,7 +159,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_turnbuckle/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
+1 -1
View File
@@ -47,7 +47,7 @@
if(is_stump)
if(istype(W,/obj/item/weapon/shovel))
if(do_after(user, 5 SECONDS))
visible_message("<span class='notice'>\The [user] digs up \the [src] stump with \the [W].</span>")
visible_message("<b>\The [user]</b> digs up \the [src] stump with \the [W].")
qdel(src)
return
@@ -15,7 +15,7 @@
return
if(!activated)
to_chat(user, "<span class='warning'>\the [src] has not yet been activated. Sorry.</span>")
to_chat(user, "<span class='warning'>\The [src] has not yet been activated. Sorry.</span>")
return
if(used)
+4 -4
View File
@@ -55,14 +55,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -71,7 +71,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
@@ -129,10 +129,10 @@
qdel(contained)
contained = new mask_type(src)
breather = null
src.visible_message("<span class='notice'>\The [contained] slips to \the [src]!</span>")
src.visible_message("<b>\The [contained]</b> slips to \the [src]!")
update_icon()
return
usr.visible_message("<span class='notice'>\The [usr] begins carefully placing the mask onto [target].</span>",
usr.visible_message("<b>\The [usr]</b> begins carefully placing the mask onto [target].",
"<span class='notice'>You begin carefully placing the mask onto [target].</span>")
if(!do_mob(usr, target, 100) || !can_apply_to_target(target, usr))
return
@@ -151,14 +151,14 @@
visible_message("\The [attached] is taken off \the [src]")
attached = null
else if(ishuman(target))
usr.visible_message("<span class='notice'>\The [usr] begins inserting needle into [target]'s vein.</span>",
usr.visible_message("<b>\The [usr]</b> begins inserting needle into [target]'s vein.",
"<span class='notice'>You begin inserting needle into [target]'s vein.</span>")
if(!do_mob(usr, target, 50))
usr.visible_message("<span class='notice'>\The [usr]'s hand slips and pricks \the [target].</span>",
"<span class='notice'>Your hand slips and pricks \the [target].</span>")
target.apply_damage(3, BRUTE, pick(BP_R_ARM, BP_L_ARM))
return
usr.visible_message("<span class='notice'>\The [usr] hooks \the [target] up to \the [src].</span>",
usr.visible_message("<b>\The [usr]</b> hooks \the [target] up to \the [src].",
"<span class='notice'>You hook \the [target] up to \the [src].</span>")
attached = target
START_PROCESSING(SSobj,src)
@@ -184,13 +184,13 @@
to_chat(user, "<span class='warning'>There is no tank in \the [src]!</span>")
return
else if (tank && is_loosen)
user.visible_message("<span class='notice'>\The [user] removes \the [tank] from \the [src].</span>", "<span class='warning'>You remove \the [tank] from \the [src].</span</span>>")
user.visible_message("<b>\The [user]</b> removes \the [tank] from \the [src].", "<span class='warning'>You remove \the [tank] from \the [src].</span</span>>")
user.put_in_hands(tank)
tank = null
update_icon()
return
else if (!is_loosen)
user.visible_message("<span class='notice'>\The [user] tries to removes \the [tank] from \the [src] but it won't budge.</span>", "<span class='warning'>You try to removes \the [tank] from \the [src] but it won't budge.</span</span>>")
user.visible_message("<b>\The [user]</b> tries to removes \the [tank] from \the [src] but it won't budge.", "<span class='warning'>You try to removes \the [tank] from \the [src] but it won't budge.</span</span>>")
return
if ("Toggle valve")
if (!tank)
@@ -198,7 +198,7 @@
return
else
if (valve_opened)
src.visible_message("<span class='notice'>\The [user] closes valve on \the [src]!</span>",
src.visible_message("<b>\The [user]</b> closes valve on \the [src]!",
"<span class='notice'>You close valve on \the [src].</span>")
if(breather)
breather.internals?.icon_state = "internal0"
@@ -206,7 +206,7 @@
valve_opened = FALSE
update_icon()
else
src.visible_message("<span class='notice'>\The [user] opens valve on \the [src]!</span>",
src.visible_message("<b>\The [user]</b> opens valve on \the [src]!",
"<span class='notice'>You open valve on \the [src].</span>")
if(breather)
breather.internal = tank
@@ -319,7 +319,7 @@
user.drop_item()
W.forceMove(src)
tank = W
user.visible_message("<span class='notice'>\The [user] attaches \the [tank] to \the [src].</span>", "<span class='notice'>You attach \the [tank] to \the [src].</span>")
user.visible_message("<b>\The [user]</b> attaches \the [tank] to \the [src].", "<span class='notice'>You attach \the [tank] to \the [src].</span>")
src.add_fingerprint(user)
update_icon()
@@ -373,7 +373,7 @@
else
qdel(contained)
contained = new mask_type (src)
src.visible_message("<span class='notice'>\The [contained] slips to \the [src]!</span>")
src.visible_message("<b>\The [contained]</b> slips to \the [src]!")
breather = null
update_icon()
return
@@ -90,11 +90,11 @@
/obj/structure/prop/prism/proc/rotate_auto(var/new_bearing)
if(rotation_lock)
visible_message("<span class='notice'>\The [src] shudders.</span>")
visible_message("<b>\The [src]</b> shudders.")
playsound(src, 'sound/effects/clang.ogg', 50, 1)
return
visible_message("<span class='notice'>\The [src] rotates to a bearing of [new_bearing].</span>")
visible_message("<b>\The [src]</b> rotates to a bearing of [new_bearing].")
var/rotate_degrees = new_bearing - degrees_from_north
+157 -1
View File
@@ -115,6 +115,13 @@
icon = 'icons/obj/structures/decor32x64.dmi'
icon_state = "eotp"
// gravity generator from Eris
/obj/structure/prop/gravygen
icon = 'icons/obj/structures/decor64x64.dmi'
icon_state = "bigdice"
bound_width = 64
bound_height = 64
// dna vault from /tg/
/obj/structure/prop/dna_vault
icon = 'icons/obj/structures/decor96x96.dmi'
@@ -271,6 +278,58 @@
/obj/structure/prop/nt_solifier/starts_on
icon_state = "nt_solidifier_on"
/**
* Possible 'state' options for change_state(state) are:
* off: Boring, round
* on: Spinny glowy
*/
// conduit of soul from Eris
/obj/structure/prop/conduit
icon = 'icons/obj/structures/decor.dmi'
icon_state = "conduit_off"
/obj/structure/prop/conduit/change_state(state)
. = ..()
switch(state)
if("on")
icon_state = "conduit_spin"
flick("conduit_starting", src)
if("off")
icon_state = "conduit_off"
flick("conduit_stopping", src)
/obj/structure/prop/conduit/starts_on
icon_state = "conduit_spin"
/**
* Possible 'state' options for change_state(state) are:
* on: Doing some kinda worky thing
* off: Not doing much of anything
* empty: No blue crystal thingy
* loaded: off but without the animation
*/
// some kinda NT thing from Eris
/obj/structure/prop/core
icon = 'icons/obj/structures/decor.dmi'
icon_state = "core_inactive"
/obj/structure/prop/core/change_state(state)
. = ..()
switch(state)
if("on")
icon_state = "core_active"
flick("core_warmup", src)
if("off")
icon_state = "core_inactive"
flick("core_shutdown", src)
if("empty")
icon_state = "core_empty"
if("loaded")
icon_state = "core_inactive"
/obj/structure/prop/core/starts_on
icon_state = "core_active"
/**
* Possible 'state' options for change_state(state) are:
* down: In the ground, glowing
@@ -278,7 +337,6 @@
*/
// experimental science destructor from /tg/
/obj/structure/prop/tube
icon = 'icons/obj/structures/decor.dmi'
icon = 'icons/obj/structures/decor32x64.dmi'
icon_state = "tube_open"
@@ -393,6 +451,62 @@
/obj/structure/prop/nt_optable/starts_active
icon_state = "nt_optable-active"
/**
* Possible 'state' options for change_state(state) are:
* idle: The default look
* active: Glowy lights in the center
* panel_open: Opened panel (wiring)
* panel_closed: Closed panel
*/
// trade beacon from Eris
/obj/structure/prop/tradebeacon
icon = 'icons/obj/structures/decor.dmi'
icon_state = "tradebeacon"
/obj/structure/prop/tradebeacon/change_state(state)
. = ..()
switch(state)
if("idle")
icon_state = "tradebeacon"
if("active")
icon_state = "tradebeacon_active"
if("panel_open")
cut_overlay("tradebeacon_panel")
add_overlay("tradebeacon_panel")
if("panel_closed")
cut_overlay("tradebeacon_panel")
/obj/structure/prop/tradebeacon/starts_active
icon_state = "tradebeacon_active"
/**
* Possible 'state' options for change_state(state) are:
* idle: The default look
* active: Glowy lights in the center
* panel_open: Opened panel (wiring)
* panel_closed: Closed panel
*/
// another trade beacon from Eris
/obj/structure/prop/tradebeacon2
icon = 'icons/obj/structures/decor.dmi'
icon_state = "tradebeacon"
/obj/structure/prop/tradebeacon2/change_state(state)
. = ..()
switch(state)
if("idle")
icon_state = "tradebeacon_sending"
if("active")
icon_state = "tradebeacon_sending_active"
if("panel_open")
cut_overlay("tradebeacon_sending_panel")
add_overlay("tradebeacon_sending_panel")
if("panel_closed")
cut_overlay("tradebeacon_sending_panel")
/obj/structure/prop/tradebeacon2/starts_active
icon_state = "tradebeacon_sending_active"
/**
* Possible 'state' options for change_state(state) are:
* off: Non-spinny
@@ -414,6 +528,48 @@
/obj/structure/prop/nt_obelisk/starts_on
icon_state = "nt_obelisk_on"
/**
* Possible 'state' options for change_state(state) are:
* off: Inert
* on: Hand destroying machinery
*/
// 'sorter' from Eris
/obj/structure/prop/sorter
icon = 'icons/obj/structures/decor.dmi'
icon_state = "sorter"
/obj/structure/prop/sorter/change_state(state)
. = ..()
switch(state)
if("off")
icon_state = "sorter"
if("on")
icon_state = "sorter-process"
/obj/structure/prop/sorter/starts_on
icon_state = "sorter-process"
/**
* Possible 'state' options for change_state(state) are:
* off: Inert
* on: Hand destroying machinery
*/
// 'smelter' from Eris
/obj/structure/prop/smelter
icon = 'icons/obj/structures/decor.dmi'
icon_state = "smelter"
/obj/structure/prop/smelter/change_state(state)
. = ..()
switch(state)
if("off")
icon_state = "smelter"
if("on")
icon_state = "smelter-process"
/obj/structure/prop/smelter/starts_on
icon_state = "smelter-process"
/**
* Possible 'state' options for change_state(state) are:
* idle: Not doing anything, with yellow template exposed
+7 -7
View File
@@ -205,7 +205,7 @@
if(W.is_wrench() && !anchored)
playsound(src, W.usesound, 50, 1)
if(do_after(user, 20, src))
user.visible_message("<span class='notice'>\The [user] dismantles \the [src].</span>", "<span class='notice'>You dismantle \the [src].</span>")
user.visible_message("<b>\The [user]</b> dismantles \the [src].", "<span class='notice'>You dismantle \the [src].</span>")
new /obj/item/stack/material/steel(get_turf(usr), 2)
qdel(src)
return
@@ -216,13 +216,13 @@
if(F.welding)
playsound(src, F.usesound, 50, 1)
if(do_after(user, 20, src))
user.visible_message("<span class='notice'>\The [user] repairs some damage to \the [src].</span>", "<span class='notice'>You repair some damage to \the [src].</span>")
user.visible_message("<b>\The [user]</b> repairs some damage to \the [src].", "<span class='notice'>You repair some damage to \the [src].</span>")
health = min(health+(maxhealth/5), maxhealth) // 20% repair per application
return
// Install
if(W.is_screwdriver())
user.visible_message(anchored ? "<span class='notice'>\The [user] begins unscrewing \the [src].</span>" : "<span class='notice'>\The [user] begins fasten \the [src].</span>" )
user.visible_message(anchored ? "<b>\The [user]</b> begins unscrewing \the [src]." : "<b>\The [user]</b> begins fasten \the [src]." )
playsound(src, W.usesound, 75, 1)
if(do_after(user, 10, src))
to_chat(user, (anchored ? "<span class='notice'>You have unfastened \the [src] from the floor.</span>" : "<span class='notice'>You have fastened \the [src] to the floor.</span>"))
@@ -286,14 +286,14 @@
return
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
climbers |= user
LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
climbers -= user
LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -303,7 +303,7 @@
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
if(!anchored) take_damage(maxhealth) // Fatboy
climbers -= user
LAZYREMOVE(climbers, user)
/obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
+1 -1
View File
@@ -18,7 +18,7 @@
playsound(src, I.usesound, 50, 1)
var/actual_time = I.toolspeed * 170
user.visible_message( \
"<span class='notice'>\The [user] begins salvaging from \the [src].</span>", \
"<b>\The [user]</b> begins salvaging from \the [src].", \
"<span class='notice'>You start salvaging from \the [src].</span>")
if(do_after(user, actual_time, target = src))
user.visible_message( \
+1 -1
View File
@@ -324,7 +324,7 @@
to_chat(usr, "<span class='warning'>\The [thing] is empty.</span>")
return
// Clear the vessel.
visible_message("<span class='notice'>\The [usr] tips the contents of \the [thing] into \the [src].</span>")
visible_message("<b>\The [usr]</b> tips the contents of \the [thing] into \the [src].")
thing.reagents.clear_reagents()
thing.update_icon()
+2 -2
View File
@@ -215,7 +215,7 @@
damage = damage / 2
take_damage(damage)
else
visible_message("<span class='notice'>\The [user] bonks \the [src] harmlessly.</span>")
visible_message("<b>\The [user]</b> bonks \the [src] harmlessly.")
user.do_attack_animation(src)
return 1
@@ -302,7 +302,7 @@
if (C.use(1))
playsound(src, 'sound/effects/sparks1.ogg', 75, 1)
user.visible_message( \
"<span class='notice'>\The [user] begins to wire \the [src] for electrochromic tinting.</span>", \
"<b>\The [user]</b> begins to wire \the [src] for electrochromic tinting.", \
"<span class='notice'>You begin to wire \the [src] for electrochromic tinting.</span>", \
"You hear sparks.")
if(do_after(user, 20 * C.toolspeed, src) && state == 0)
+2 -2
View File
@@ -77,14 +77,14 @@
for(var/thing in thing_to_check)
if(isobj(thing))
var/obj/O = thing
if(O.throwing)
if(O.throwing || O.is_incorporeal())
continue
. = TRUE
O.lava_act()
else if(isliving(thing))
var/mob/living/L = thing
if(L.hovering || L.throwing) // Flying over the lava. We're just gonna pretend convection doesn't exist.
if(L.hovering || L.throwing || L.is_incorporeal()) // Flying over the lava. We're just gonna pretend convection doesn't exist.
continue
. = TRUE
L.lava_act()
+1
View File
@@ -59,6 +59,7 @@
if(S.zone) S.zone.rebuild()
cut_overlays(TRUE)
RemoveElement(/datum/element/turf_z_transparency)
if(ispath(N, /turf/simulated/floor))
var/turf/simulated/W = new N( locate(src.x, src.y, src.z) )
+1 -1
View File
@@ -688,7 +688,7 @@ var/global/floorIsLava = 0
set desc="Announce your desires to the world"
if(!check_rights(0)) return
var/message = input(usr, "Global message to send:", "Admin Announce", null, null) as message//todo: sanitize for all?
var/message = tgui_input_message(usr, "Global message to send:", "Admin Announce")
if(message)
if(!check_rights(R_SERVER,0))
message = sanitize(message, 500, extra = 0)
@@ -13,24 +13,25 @@
if (!shuttle_tag) return
var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag]
var/origin_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", return_areas())
var/list/area_choices = return_areas()
var/origin_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!origin_area) return
var/destination_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", return_areas())
var/destination_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!destination_area) return
var/long_jump = tgui_alert(user, "Is there a transition area for this jump?","Transition?", list("Yes","No"))
if (long_jump == "Yes")
var/transition_area = tgui_input_list(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", return_areas())
var/transition_area = tgui_input_list(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!transition_area) return
var/move_duration = input(user, "How many seconds will this jump take?") as num
S.long_jump(origin_area, destination_area, transition_area, move_duration)
S.long_jump(area_choices[origin_area], area_choices[destination_area], area_choices[transition_area], move_duration)
message_admins("<span class='notice'>[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle</span>", 1)
log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle")
else
S.short_jump(origin_area, destination_area)
S.short_jump(area_choices[origin_area], area_choices[destination_area])
message_admins("<span class='notice'>[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle</span>", 1)
log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle")
+1 -1
View File
@@ -1278,7 +1278,7 @@
var/client/C = usr.client
if(!isobserver(usr)) C.admin_ghost()
sleep(2)
C.jumptomob(M)
C.do_jumptomob(M)
else if(href_list["adminplayerobservefollow"])
if(!check_rights(R_MOD|R_ADMIN|R_SERVER)) //VOREStation Edit

Some files were not shown because too many files have changed in this diff Show More