mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-17 01:54:25 +01:00
Merge branch 'master' into Arokha/matdefs
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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: |
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -236,7 +236,7 @@
|
||||
last_itch = world.time
|
||||
to_chat(O.owner, "<span class='notice'>Your [O.name] itches...</span>")
|
||||
else if(prob(1))
|
||||
src.visible_message("<span class='notice'>\The [src] skitters.</span>")
|
||||
src.visible_message("<b>\The [src]</b> skitters.")
|
||||
|
||||
if(amount_grown >= 0)
|
||||
amount_grown += rand(0,2)
|
||||
|
||||
@@ -241,14 +241,15 @@
|
||||
return
|
||||
|
||||
var/old_loc = src.loc
|
||||
src.pickup(user)
|
||||
if (istype(src.loc, /obj/item/weapon/storage))
|
||||
var/obj/item/weapon/storage/S = src.loc
|
||||
S.remove_from_storage(src)
|
||||
|
||||
if(!S.remove_from_storage(src))
|
||||
return
|
||||
|
||||
src.pickup(user)
|
||||
src.throwing = 0
|
||||
if (src.loc == user)
|
||||
if(!user.unEquip(src, null, src))
|
||||
if(!user.unEquip(src))
|
||||
return
|
||||
else
|
||||
if(isliving(src.loc))
|
||||
@@ -942,3 +943,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
// Like the above, but used for RPED sorting of parts.
|
||||
/obj/item/proc/rped_rating()
|
||||
return get_rating()
|
||||
|
||||
/// How are you described if at all when in pockets (or other 'usually not visible' places)
|
||||
/obj/item/proc/pocket_description(mob/haver, mob/examiner)
|
||||
return null // most things are hidden
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
reattach_paddles(user)
|
||||
else if(istype(W, /obj/item/weapon/cell))
|
||||
if(bcell)
|
||||
to_chat(user, "<span class='notice'>\the [src] already has a cell.</span>")
|
||||
to_chat(user, "<span class='notice'>\The [src] already has a cell.</span>")
|
||||
else
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
@@ -392,7 +392,7 @@
|
||||
user.visible_message("<span class='warning'>\The [user] begins to place [src] on [H]'s chest.</span>", "<span class='warning'>You begin to place [src] on [H]'s chest...</span>")
|
||||
if(!do_after(user, 30, H))
|
||||
return
|
||||
user.visible_message("<span class='notice'>\The [user] places [src] on [H]'s chest.</span>", "<span class='warning'>You place [src] on [H]'s chest.</span>")
|
||||
user.visible_message("<b>\The [user]</b> places [src] on [H]'s chest.", "<span class='warning'>You place [src] on [H]'s chest.</span>")
|
||||
playsound(src, 'sound/machines/defib_charge.ogg', 50, 0)
|
||||
|
||||
var/error = can_defib(H)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
if(repairing)
|
||||
to_chat(user, "<span class='notice'>\The [src] is already being repaired!</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>\The [user] starts trying to repair \the [src]'s bulb.</span>")
|
||||
user.visible_message("<b>\The [user]</b> starts trying to repair \the [src]'s bulb.")
|
||||
repairing = TRUE
|
||||
if(do_after(user, (40 SECONDS + rand(0, 20 SECONDS)) * W.toolspeed) && can_repair)
|
||||
if(prob(30))
|
||||
@@ -50,7 +50,7 @@
|
||||
update_icon()
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] fails to repair \the [src].</span>")
|
||||
user.visible_message("<b>\The [user]</b> fails to repair \the [src].")
|
||||
repairing = FALSE
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
if(!vision)
|
||||
to_chat(user, "<span class='warning'>You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!</span>")
|
||||
|
||||
user.visible_message("<span class='notice'>\The [user] directs [src] to [M]'s eyes.</span>", \
|
||||
user.visible_message("<b>\The [user]</b> directs [src] to [M]'s eyes.", \
|
||||
"<span class='notice'>You direct [src] to [M]'s eyes.</span>")
|
||||
if(H != user) //can't look into your own eyes buster
|
||||
if(M.stat == DEAD || M.blinded) //mob is dead or fully blind
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
playsound(src, O.usesound, 100, 1)
|
||||
|
||||
user.visible_message("<span class='notice'>\The [user] opens \the [src] and modifies \the [O].</span>","<span class='notice'>You open \the [src] and modify \the [O].</span>")
|
||||
user.visible_message("<b>\The [user]</b> opens \the [src] and modifies \the [O].","<span class='notice'>You open \the [src] and modify \the [O].</span>")
|
||||
|
||||
I.refit_for_species(target_species)
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
tool_qualities = list(TOOL_MULTITOOL)
|
||||
|
||||
/obj/item/device/multitool/attack_self(mob/living/user)
|
||||
var/choice = tgui_alert(usr, "What do you want to do with \the [src]?","Multitool Menu", "Switch Mode", list("Clear Buffers", "Cancel"))
|
||||
var/choice = tgui_alert(usr, "What do you want to do with \the [src]?", "Multitool Menu", list("Switch Mode", "Clear Buffers", "Cancel"))
|
||||
switch(choice)
|
||||
if("Cancel")
|
||||
to_chat(user,"<span class='notice'>You lower \the [src].</span>")
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
light_color = "#00ff00"
|
||||
light_power = 0.25
|
||||
blocks_emissive = NONE
|
||||
vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature
|
||||
var/circuit = /obj/item/weapon/circuitboard/intercom
|
||||
var/number = 0
|
||||
var/wiresexposed = 0
|
||||
|
||||
@@ -270,7 +270,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
|
||||
if(istype(target, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.resleeve_lock && stored_mind.loaded_from_ckey != H.resleeve_lock)
|
||||
to_chat(usr,"<span class='warning'>\[H] is protected from impersonation!</span>")
|
||||
to_chat(usr,"<span class='warning'>\The [H] is protected from impersonation!</span>")
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[usr] begins uploading someone's mind into [target]!</span>","<span class='notice'>You begin uploading a mind into [target]!</span>")
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
return 1
|
||||
else
|
||||
var/available = get_amount()
|
||||
user.visible_message("<span class='notice'>\The [user] starts bandaging [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> starts bandaging [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You start bandaging [M]'s [affecting.name].</span>" )
|
||||
var/used = 0
|
||||
for (var/datum/wound/W in affecting.wounds)
|
||||
@@ -131,10 +131,10 @@
|
||||
break
|
||||
|
||||
if (W.current_stage <= W.max_bleeding_stage)
|
||||
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> bandages \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> places a bandage over \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You place a bandage over \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
W.bandage()
|
||||
playsound(src, pick(apply_sounds), 25)
|
||||
@@ -177,7 +177,7 @@
|
||||
return 1
|
||||
else
|
||||
var/available = get_amount()
|
||||
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> starts treating [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
|
||||
var/used = 0
|
||||
for (var/datum/wound/W in affecting.wounds)
|
||||
@@ -200,14 +200,14 @@
|
||||
break
|
||||
|
||||
if (W.current_stage <= W.max_bleeding_stage)
|
||||
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> bandages \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
//H.add_side_effect("Itch")
|
||||
else if (W.damage_type == BRUISE)
|
||||
user.visible_message("<span class='notice'>\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> places a bruise patch over \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You place a bruise patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You place a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
W.bandage()
|
||||
// W.disinfect() // VOREStation - Tech1 should not disinfect
|
||||
@@ -250,7 +250,7 @@
|
||||
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
|
||||
return 1
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> starts salving wounds on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
|
||||
if(!do_mob(user, M, 10, exclusive = TRUE))
|
||||
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
|
||||
@@ -290,7 +290,7 @@
|
||||
return 1
|
||||
else
|
||||
var/available = get_amount()
|
||||
user.visible_message("<span class='notice'>\The [user] starts treating [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> starts treating [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You start treating [M]'s [affecting.name].</span>" )
|
||||
var/used = 0
|
||||
for (var/datum/wound/W in affecting.wounds)
|
||||
@@ -312,13 +312,13 @@
|
||||
break
|
||||
|
||||
if (W.current_stage <= W.max_bleeding_stage)
|
||||
user.visible_message("<span class='notice'>\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.</span>", \
|
||||
user.visible_message("<b>\The [user]</b> cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \
|
||||
"<span class='notice'>You clean and seal \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
else if (W.damage_type == BRUISE)
|
||||
user.visible_message("<span class='notice'>\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> places a medical patch over \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You place a medical patch over \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> smears some bioglue over \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You smear some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
W.bandage()
|
||||
W.disinfect()
|
||||
@@ -358,7 +358,7 @@
|
||||
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been salved.</span>")
|
||||
return 1
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
|
||||
user.visible_message("<b>\The [user]</b> starts salving wounds on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
|
||||
if(!do_mob(user, M, 10, exclusive = TRUE))
|
||||
to_chat(user, "<span class='notice'>You must stand still to salve wounds.</span>")
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
if(!S.open)
|
||||
to_chat(user, "<span class='warning'>You have to cut [S] open first!</span>")
|
||||
return
|
||||
M.visible_message("<span class='notice'>\The [user] scans the wounds on [M]'s [S.name] with [src]</span>")
|
||||
M.visible_message("<b>\The [user]</b> scans the wounds on [M]'s [S.name] with [src]")
|
||||
|
||||
src.add_data(S)
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
/obj/item/weapon/cane/white/collapsible/attack_self(mob/user as mob)
|
||||
on = !on
|
||||
if(on)
|
||||
user.visible_message("<span class='notice'>\The [user] extends the white cane.</span>",\
|
||||
user.visible_message("<b>\The [user]</b> extends the white cane.",\
|
||||
"<span class='warning'>You extend the white cane.</span>",\
|
||||
"You hear an ominous click.")
|
||||
icon_state = "whitecane1out"
|
||||
@@ -106,7 +106,7 @@
|
||||
force = 5
|
||||
attack_verb = list("smacked", "struck", "cracked", "beaten")
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] collapses the white cane.</span>",\
|
||||
user.visible_message("<b>\The [user]</b> collapses the white cane.",\
|
||||
"<span class='notice'>You collapse the white cane.</span>",\
|
||||
"You hear a click.")
|
||||
icon_state = "whitecane1in"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.is_screwdriver())
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
user.visible_message("<span class='notice'>\The [user] adjusts the jumper on \the [src]'s access protocol pins.</span>", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
|
||||
user.visible_message("<b>\The [user]</b> adjusts the jumper on \the [src]'s access protocol pins.", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
|
||||
if(build_path == /obj/machinery/computer/rdconsole/core)
|
||||
name = T_BOARD("RD Console - Robotics")
|
||||
build_path = /obj/machinery/computer/rdconsole/robotics
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.is_screwdriver())
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
user.visible_message("<span class='notice'>\The [user] adjusts the jumper on \the [src]'s access protocol pins.</span>", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
|
||||
user.visible_message("<b>\The [user]</b> adjusts the jumper on \the [src]'s access protocol pins.", "<span class='notice'>You adjust the jumper on the access protocol pins.</span>")
|
||||
if(build_path == /obj/machinery/r_n_d/server/core)
|
||||
name = T_BOARD("RD Console - Robotics")
|
||||
build_path = /obj/machinery/r_n_d/server/robotics
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/stage = 0
|
||||
var/state = 0
|
||||
var/path = 0
|
||||
/// If TRUE, grenade is permanently sealed when fully assembled, useful for things like off-the-shelf grenades.
|
||||
var/sealed = FALSE
|
||||
var/obj/item/device/assembly_holder/detonator = null
|
||||
var/list/beakers = new/list()
|
||||
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
|
||||
@@ -93,7 +95,8 @@
|
||||
if(active && prob(95))
|
||||
to_chat(user, "<span class='warning'>You trigger the assembly!</span>")
|
||||
detonate()
|
||||
return
|
||||
else if(sealed)
|
||||
to_chat(user, "<span class='warning'>This grenade lacks a way to disassemble it.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You unlock the assembly.</span>")
|
||||
playsound(src, W.usesound, 50, -3)
|
||||
@@ -200,8 +203,10 @@
|
||||
/obj/item/weapon/grenade/chem_grenade/metalfoam
|
||||
name = "metal-foam grenade"
|
||||
desc = "Used for emergency sealing of air breaches."
|
||||
icon_state = "foam"
|
||||
path = 1
|
||||
stage = 2
|
||||
sealed = TRUE
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/metalfoam/Initialize()
|
||||
. = ..()
|
||||
@@ -216,13 +221,14 @@
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/incendiary
|
||||
name = "incendiary grenade"
|
||||
desc = "Used for clearing rooms of living things."
|
||||
icon_state = "incendiary"
|
||||
path = 1
|
||||
stage = 2
|
||||
sealed = TRUE
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/incendiary/Initialize()
|
||||
. = ..()
|
||||
@@ -239,13 +245,13 @@
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/antiweed
|
||||
name = "weedkiller grenade"
|
||||
desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents."
|
||||
path = 1
|
||||
stage = 2
|
||||
sealed = TRUE
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/antiweed/Initialize()
|
||||
. = ..()
|
||||
@@ -266,8 +272,10 @@
|
||||
/obj/item/weapon/grenade/chem_grenade/cleaner
|
||||
name = "cleaner grenade"
|
||||
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
|
||||
icon_state = "cleaner"
|
||||
stage = 2
|
||||
path = 1
|
||||
sealed = TRUE
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/cleaner/Initialize()
|
||||
. = ..()
|
||||
@@ -282,13 +290,14 @@
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/teargas
|
||||
name = "tear gas grenade"
|
||||
desc = "Concentrated Capsaicin. Contents under pressure. Use with caution."
|
||||
icon_state = "teargas"
|
||||
stage = 2
|
||||
path = 1
|
||||
sealed = TRUE
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/teargas/Initialize()
|
||||
. = ..()
|
||||
@@ -305,4 +314,4 @@
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
icon_state = initial(icon_state) +"_locked"
|
||||
|
||||
@@ -301,7 +301,7 @@ var/last_chew = 0
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/handcuffs/legcuffs/bola/dropped()
|
||||
visible_message("<span class='notice'>\The [src] falls apart!</span>")
|
||||
visible_message("<b>\The [src]</b> falls apart!")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/handcuffs/legcuffs/bola/place_legcuffs(var/mob/living/carbon/target, var/mob/user)
|
||||
@@ -313,7 +313,7 @@ var/last_chew = 0
|
||||
return 0
|
||||
|
||||
if(!H.has_organ_for_slot(slot_legcuffed))
|
||||
H.visible_message("<span class='notice'>\The [src] slams into [H], but slides off!</span>")
|
||||
H.visible_message("<b>\The [src]</b> slams into [H], but slides off!")
|
||||
src.dropped()
|
||||
return 0
|
||||
|
||||
|
||||
@@ -75,6 +75,26 @@
|
||||
/obj/item/weapon/material/kitchen/utensil/fork/plastic
|
||||
default_material = "plastic"
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/foon
|
||||
name = "foon"
|
||||
desc = "It's a foon. The forgotten cousin of the spork."
|
||||
icon_state = "foon"
|
||||
sharp = TRUE
|
||||
edge = FALSE
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/foon/plastic
|
||||
default_material = "plastic"
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/spork
|
||||
name = "spork"
|
||||
desc = "It's a spork. The (un)holy merger of a spoon and fork."
|
||||
icon_state = "spork"
|
||||
sharp = TRUE
|
||||
edge = FALSE
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/spork/plastic
|
||||
default_material = "plastic"
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon
|
||||
name = "spoon"
|
||||
desc = "It's a spoon. You can see your own upside-down face in it."
|
||||
|
||||
@@ -123,6 +123,16 @@
|
||||
icon_state = "render"
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/knife/table
|
||||
name = "table knife"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "knife_table"
|
||||
sharp = FALSE // blunted tip
|
||||
force_divisor = 0.1
|
||||
|
||||
/obj/item/weapon/material/knife/table/plastic
|
||||
default_material = "plastic"
|
||||
|
||||
/obj/item/weapon/material/knife/butch
|
||||
name = "butcher's cleaver"
|
||||
icon_state = "butch"
|
||||
|
||||
@@ -333,7 +333,7 @@ var/list/tape_roll_applications = list()
|
||||
|
||||
/obj/item/tape/attack_hand(mob/user as mob)
|
||||
if (user.a_intent == I_HELP && src.allowed(user))
|
||||
user.show_viewers("<span class='notice'>\The [user] lifts \the [src], allowing passage.</span>")
|
||||
user.show_viewers("<b>\The [user]</b> lifts \the [src], allowing passage.")
|
||||
for(var/obj/item/tape/T in gettapeline())
|
||||
T.lift(100) //~10 seconds
|
||||
else
|
||||
@@ -377,7 +377,7 @@ var/list/tape_roll_applications = list()
|
||||
if(user.a_intent == I_HELP)
|
||||
to_chat(user, "<span class='warning'>You refrain from breaking \the [src].</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>\The [user] breaks \the [src]!</span>","<span class='notice'>You break \the [src].</span>")
|
||||
user.visible_message("<b>\The [user]</b> breaks \the [src]!","<span class='notice'>You break \the [src].</span>")
|
||||
|
||||
for (var/obj/item/tape/T in gettapeline())
|
||||
if(T == src)
|
||||
|
||||
@@ -75,57 +75,69 @@
|
||||
/obj/item/weapon/storage/backpack/cultpack
|
||||
name = "trophy rack"
|
||||
desc = "It's useful for both carrying extra gear and proudly declaring your insanity."
|
||||
icon_state = "cultpack"
|
||||
icon_state = "backpack_cult"
|
||||
|
||||
/obj/item/weapon/storage/backpack/clown
|
||||
name = "Giggles von Honkerton"
|
||||
desc = "It's a backpack made by Honk! Co."
|
||||
icon_state = "clownpack"
|
||||
icon_state = "backpack_clown"
|
||||
|
||||
/obj/item/weapon/storage/backpack/white
|
||||
name = "white backpack"
|
||||
icon_state = "backpack_white"
|
||||
|
||||
/obj/item/weapon/storage/backpack/fancy
|
||||
name = "fancy backpack"
|
||||
icon_state = "backpack_fancy"
|
||||
|
||||
/obj/item/weapon/storage/backpack/military
|
||||
name = "military backpack"
|
||||
icon_state = "backpack_military"
|
||||
|
||||
/obj/item/weapon/storage/backpack/medic
|
||||
name = "medical backpack"
|
||||
desc = "It's a backpack especially designed for use in a sterile environment."
|
||||
icon_state = "medicalpack"
|
||||
icon_state = "backpack_medical"
|
||||
|
||||
/obj/item/weapon/storage/backpack/security
|
||||
name = "security backpack"
|
||||
desc = "It's a very robust backpack."
|
||||
icon_state = "securitypack"
|
||||
icon_state = "backpack_security"
|
||||
|
||||
/obj/item/weapon/storage/backpack/captain
|
||||
name = "site manager's backpack"
|
||||
desc = "It's a special backpack made exclusively for officers."
|
||||
icon_state = "captainpack"
|
||||
icon_state = "backpack_captain"
|
||||
|
||||
/obj/item/weapon/storage/backpack/industrial
|
||||
name = "industrial backpack"
|
||||
desc = "It's a tough backpack for the daily grind of station life."
|
||||
icon_state = "engiepack"
|
||||
icon_state = "backpack_industrial"
|
||||
|
||||
/obj/item/weapon/storage/backpack/toxins
|
||||
name = "laboratory backpack"
|
||||
desc = "It's a light backpack modeled for use in laboratories and other scientific institutions."
|
||||
icon_state = "toxpack"
|
||||
icon_state = "backpack_purple"
|
||||
|
||||
/obj/item/weapon/storage/backpack/hydroponics
|
||||
name = "herbalist's backpack"
|
||||
desc = "It's a green backpack with many pockets to store plants and tools in."
|
||||
icon_state = "hydpack"
|
||||
icon_state = "backpack_hydro"
|
||||
|
||||
/obj/item/weapon/storage/backpack/genetics
|
||||
name = "geneticist backpack"
|
||||
desc = "It's a backpack fitted with slots for diskettes and other workplace tools."
|
||||
icon_state = "genpack"
|
||||
icon_state = "backpack_blue"
|
||||
|
||||
/obj/item/weapon/storage/backpack/virology
|
||||
name = "sterile backpack"
|
||||
desc = "It's a sterile backpack able to withstand different pathogens from entering its fabric."
|
||||
icon_state = "viropack"
|
||||
icon_state = "backpack_green"
|
||||
|
||||
/obj/item/weapon/storage/backpack/chemistry
|
||||
name = "chemistry backpack"
|
||||
desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles."
|
||||
icon_state = "chempack"
|
||||
icon_state = "backpack_orange"
|
||||
|
||||
/*
|
||||
* Duffle Types
|
||||
@@ -162,7 +174,7 @@
|
||||
/obj/item/weapon/storage/backpack/dufflebag/med
|
||||
name = "medical dufflebag"
|
||||
desc = "A large dufflebag for holding extra medical supplies."
|
||||
icon_state = "duffle_med"
|
||||
icon_state = "duffle_medical"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/emt
|
||||
name = "EMT dufflebag"
|
||||
@@ -172,17 +184,27 @@
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sec
|
||||
name = "security dufflebag"
|
||||
desc = "A large dufflebag for holding extra security supplies and ammunition."
|
||||
icon_state = "duffle_sec"
|
||||
icon_state = "duffle_security"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/eng
|
||||
name = "industrial dufflebag"
|
||||
desc = "A large dufflebag for holding extra tools and supplies."
|
||||
icon_state = "duffle_eng"
|
||||
icon_state = "duffle_industrial"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sci
|
||||
name = "science dufflebag"
|
||||
desc = "A large dufflebag for holding circuits and beakers."
|
||||
icon_state = "duffle_sci"
|
||||
icon_state = "duffle_science"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/drone
|
||||
name = "drone dufflebag"
|
||||
desc = "A large dufflebag for holding small robots? Or maybe it's one used by robots!"
|
||||
icon_state = "duffle_drone"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/cursed
|
||||
name = "cursed dufflebag"
|
||||
desc = "That probably shouldn't be moving..."
|
||||
icon_state = "duffle_cursed"
|
||||
|
||||
/*
|
||||
* Satchel Types
|
||||
@@ -192,7 +214,6 @@
|
||||
name = "leather satchel"
|
||||
desc = "It's a very fancy satchel made with fine leather."
|
||||
icon_state = "satchel"
|
||||
item_state_slots = list(slot_r_hand_str = "briefcase", slot_l_hand_str = "briefcase")
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/withwallet
|
||||
starts_with = list(/obj/item/weapon/storage/wallet/random)
|
||||
@@ -200,67 +221,70 @@
|
||||
/obj/item/weapon/storage/backpack/satchel/norm
|
||||
name = "satchel"
|
||||
desc = "A trendy looking satchel."
|
||||
icon_state = "satchel-norm"
|
||||
icon_state = "satchel_grey"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/white
|
||||
name = "white satchel"
|
||||
icon_state = "satchel_white"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/fancy
|
||||
name = "fancy satchel"
|
||||
icon_state = "satchel_fancy"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/military
|
||||
name = "military satchel"
|
||||
icon_state = "satchel_military"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/eng
|
||||
name = "industrial satchel"
|
||||
desc = "A tough satchel with extra pockets."
|
||||
icon_state = "satchel-eng"
|
||||
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
|
||||
icon_state = "satchel_industrial"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/med
|
||||
name = "medical satchel"
|
||||
desc = "A sterile satchel used in medical departments."
|
||||
icon_state = "satchel-med"
|
||||
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
|
||||
icon_state = "satchel_medical"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/vir
|
||||
name = "virologist satchel"
|
||||
desc = "A sterile satchel with virologist colours."
|
||||
icon_state = "satchel-vir"
|
||||
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
|
||||
icon_state = "satchel_green"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/chem
|
||||
name = "chemist satchel"
|
||||
desc = "A sterile satchel with chemist colours."
|
||||
icon_state = "satchel-chem"
|
||||
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
|
||||
icon_state = "satchel_orange"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/gen
|
||||
name = "geneticist satchel"
|
||||
desc = "A sterile satchel with geneticist colours."
|
||||
icon_state = "satchel-gen"
|
||||
item_state_slots = list(slot_r_hand_str = "genpack", slot_l_hand_str = "genpack")
|
||||
icon_state = "satchel_blue"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/tox
|
||||
name = "scientist satchel"
|
||||
desc = "Useful for holding research materials."
|
||||
icon_state = "satchel-tox"
|
||||
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
|
||||
icon_state = "satchel_purple"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/sec
|
||||
name = "security satchel"
|
||||
desc = "A robust satchel for security related needs."
|
||||
icon_state = "satchel-sec"
|
||||
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
|
||||
icon_state = "satchel_security"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/hyd
|
||||
name = "hydroponics satchel"
|
||||
desc = "A green satchel for plant related work."
|
||||
icon_state = "satchel_hyd"
|
||||
icon_state = "satchel_hydro"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/cap
|
||||
name = "site manager's satchel"
|
||||
desc = "An exclusive satchel for officers."
|
||||
icon_state = "satchel-cap"
|
||||
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
|
||||
icon_state = "satchel_captain"
|
||||
|
||||
//ERT backpacks.
|
||||
/obj/item/weapon/storage/backpack/ert
|
||||
name = "emergency response team backpack"
|
||||
desc = "A spacious backpack with lots of pockets, used by members of the Emergency Response Team."
|
||||
icon_state = "ert_commander"
|
||||
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
|
||||
|
||||
//Commander
|
||||
/obj/item/weapon/storage/backpack/ert/commander
|
||||
@@ -292,59 +316,106 @@
|
||||
/obj/item/weapon/storage/backpack/messenger
|
||||
name = "messenger bag"
|
||||
desc = "A sturdy backpack worn over one shoulder."
|
||||
icon_state = "courierbag"
|
||||
item_state_slots = list(slot_r_hand_str = "backpack", slot_l_hand_str = "backpack")
|
||||
icon_state = "courier"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_grey", slot_l_hand_str = "satchel_grey")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/chem
|
||||
name = "chemistry messenger bag"
|
||||
desc = "A serile backpack worn over one shoulder. This one is in Chemsitry colors."
|
||||
icon_state = "courierbagchem"
|
||||
item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
|
||||
icon_state = "courier_chemistry"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_orange", slot_l_hand_str = "satchel_orange")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/med
|
||||
name = "medical messenger bag"
|
||||
desc = "A sterile backpack worn over one shoulder used in medical departments."
|
||||
icon_state = "courierbagmed"
|
||||
item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
|
||||
icon_state = "courier_medical"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_medical", slot_l_hand_str = "satchel_medical")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/viro
|
||||
name = "virology messenger bag"
|
||||
desc = "A sterile backpack worn over one shoulder. This one is in Virology colors."
|
||||
icon_state = "courierbagviro"
|
||||
item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
|
||||
icon_state = "courier_virology"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_green", slot_l_hand_str = "satchel_green")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/tox
|
||||
name = "research messenger bag"
|
||||
desc = "A backpack worn over one shoulder. Useful for holding science materials."
|
||||
icon_state = "courierbagtox"
|
||||
item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
|
||||
icon_state = "courier_toxins"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_purple", slot_l_hand_str = "satchel_purple")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/com
|
||||
name = "command messenger bag"
|
||||
desc = "A special backpack worn over one shoulder. This one is made specifically for officers."
|
||||
icon_state = "courierbagcom"
|
||||
item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
|
||||
icon_state = "courier_captain"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_captain", slot_l_hand_str = "satchel_captain")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/engi
|
||||
name = "engineering messenger bag"
|
||||
icon_state = "courierbagengi"
|
||||
item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
|
||||
icon_state = "courier_industrial"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_industrial", slot_l_hand_str = "satchel_industrial")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/hyd
|
||||
name = "hydroponics messenger bag"
|
||||
desc = "A backpack worn over one shoulder. This one is designed for plant-related work."
|
||||
icon_state = "courierbaghyd"
|
||||
icon_state = "courier_hydro"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_hydro", slot_l_hand_str = "satchel_hydro")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/sec
|
||||
name = "security messenger bag"
|
||||
desc = "A tactical backpack worn over one shoulder. This one is in Security colors."
|
||||
icon_state = "courierbagsec"
|
||||
item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
|
||||
icon_state = "courier_security"
|
||||
item_state_slots = list(slot_r_hand_str = "satchel_security", slot_l_hand_str = "satchel_security")
|
||||
|
||||
/obj/item/weapon/storage/backpack/messenger/black
|
||||
icon_state = "courierbagblk"
|
||||
icon_state = "courier_black"
|
||||
|
||||
|
||||
/*
|
||||
* Sport Bags
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport
|
||||
name = "sports backpack"
|
||||
icon_state = "backsport"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/white
|
||||
name = "white sports backpack"
|
||||
icon_state = "backsport_white"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/fancy
|
||||
name = "fancy sports backpack"
|
||||
icon_state = "backsport_fancy"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/vir
|
||||
name = "virologist sports backpack"
|
||||
desc = "A sterile sports backpack with virologist colours."
|
||||
icon_state = "backsport_green"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/chem
|
||||
name = "chemist sports backpack"
|
||||
desc = "A sterile sports backpack with chemist colours."
|
||||
icon_state = "backsport_orange"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/gen
|
||||
name = "geneticist sports backpack"
|
||||
desc = "A sterile sports backpack with geneticist colours."
|
||||
icon_state = "backsport_blue"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/tox
|
||||
name = "scientist sports backpack"
|
||||
desc = "Useful for holding research materials."
|
||||
icon_state = "backsport_purple"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/sec
|
||||
name = "security sports backpack"
|
||||
desc = "A robust sports backpack for security related needs."
|
||||
icon_state = "backsport_security"
|
||||
|
||||
/obj/item/weapon/storage/backpack/sport/hyd
|
||||
name = "hydroponics sports backpack"
|
||||
desc = "A green sports backpack for plant related work."
|
||||
icon_state = "backsport_hydro"
|
||||
|
||||
//Purses
|
||||
/obj/item/weapon/storage/backpack/purse
|
||||
name = "purse"
|
||||
@@ -394,29 +465,29 @@
|
||||
return
|
||||
|
||||
if(!parachute) //This packs the parachute
|
||||
H.visible_message("<span class='notice'>\The [H] starts to pack \the [src]!</span>", \
|
||||
H.visible_message("<b>\The [H]</b> starts to pack \the [src]!", \
|
||||
"<span class='notice'>You start to pack \the [src]!</span>", \
|
||||
"You hear the shuffling of cloth.")
|
||||
if(do_after(H, 50))
|
||||
H.visible_message("<span class='notice'>\The [H] finishes packing \the [src]!</span>", \
|
||||
H.visible_message("<b>\The [H]</b> finishes packing \the [src]!", \
|
||||
"<span class='notice'>You finish packing \the [src]!</span>", \
|
||||
"You hear the shuffling of cloth.")
|
||||
parachute = TRUE
|
||||
else
|
||||
H.visible_message("<span class='notice'>\The [src] gives up on packing \the [src]!</span>", \
|
||||
H.visible_message("<b>\The [src]</b> gives up on packing \the [src]!", \
|
||||
"<span class='notice'>You give up on packing \the [src]!</span>")
|
||||
return
|
||||
else //This unpacks the parachute
|
||||
H.visible_message("<span class='notice'>\The [src] starts to unpack \the [src]!</span>", \
|
||||
H.visible_message("<b>\The [src]</b> starts to unpack \the [src]!", \
|
||||
"<span class='notice'>You start to unpack \the [src]!</span>", \
|
||||
"You hear the shuffling of cloth.")
|
||||
if(do_after(H, 25))
|
||||
H.visible_message("<span class='notice'>\The [src] finishes unpacking \the [src]!</span>", \
|
||||
H.visible_message("<b>\The [src]</b> finishes unpacking \the [src]!", \
|
||||
"<span class='notice'>You finish unpacking \the [src]!</span>", \
|
||||
"You hear the shuffling of cloth.")
|
||||
parachute = FALSE
|
||||
else
|
||||
H.visible_message("<span class='notice'>\The [src] decides not to unpack \the [src]!</span>", \
|
||||
H.visible_message("<b>\The [src]</b> decides not to unpack \the [src]!", \
|
||||
"<span class='notice'>You decide not to unpack \the [src]!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -53,6 +53,16 @@
|
||||
icon_state = "trashbag2"
|
||||
else icon_state = "trashbag3"
|
||||
|
||||
/obj/item/weapon/storage/bag/trash/holding
|
||||
name = "trash bag of holding"
|
||||
desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage."
|
||||
icon_state = "bluetrashbag"
|
||||
origin_tech = list(TECH_BLUESPACE = 3)
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 10 // Slightly less than BoH
|
||||
|
||||
/obj/item/weapon/storage/bag/trash/holding/update_icon()
|
||||
return
|
||||
|
||||
// -----------------------------
|
||||
// Plastic Bag
|
||||
|
||||
@@ -236,7 +236,7 @@
|
||||
if(istype(W, /obj/item/clothing/mask/smokable/cigarette))
|
||||
var/obj/item/clothing/mask/smokable/cigarette/C = W
|
||||
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M, /mob))
|
||||
@@ -343,7 +343,7 @@
|
||||
var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W
|
||||
if(!istype(C)) return
|
||||
reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/storage/rollingpapers
|
||||
name = "rolling paper pack"
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
#define INVENTORY_POUCH_SPACE ITEMSIZE_COST_SMALL*4 // 25% the size of a backpack for normal size
|
||||
|
||||
// Pouches for small storage in pocket slots
|
||||
/obj/item/weapon/storage/pouch
|
||||
name = "storage pouch (medium)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access."
|
||||
icon = 'icons/obj/clothing/pouches.dmi'
|
||||
slot_flags = SLOT_POCKET
|
||||
drop_sound = 'sound/items/drop/backpack.ogg'
|
||||
pickup_sound = 'sound/items/pickup/backpack.ogg'
|
||||
|
||||
icon_state = "medium_generic"
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
max_storage_space = INVENTORY_POUCH_SPACE
|
||||
can_hold = null
|
||||
pocketable = TRUE
|
||||
|
||||
var/insert_delay = 0
|
||||
var/remove_delay = 2 SECONDS
|
||||
|
||||
/obj/item/weapon/storage/pouch/stall_insertion(obj/item/W, mob/user)
|
||||
// No delay if you have the pouch in your hands
|
||||
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
|
||||
return TRUE // Skip delay
|
||||
|
||||
if(insert_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE))
|
||||
return FALSE // Moved or whatever
|
||||
|
||||
if(W in src)
|
||||
return TRUE // Item is still inside
|
||||
|
||||
return FALSE
|
||||
|
||||
/obj/item/weapon/storage/pouch/stall_removal(obj/item/W, mob/user)
|
||||
// No delay if you have the pouch in your hands
|
||||
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
|
||||
return TRUE // Skip delay
|
||||
|
||||
if(remove_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE))
|
||||
return FALSE // Moved or whatever
|
||||
|
||||
if(W in src)
|
||||
return TRUE // Item is still inside
|
||||
|
||||
return FALSE
|
||||
|
||||
/obj/item/weapon/storage/pouch/pocket_description(mob/haver, mob/examiner)
|
||||
return "[src]"
|
||||
|
||||
/obj/item/weapon/storage/pouch/large
|
||||
name = "storage pouch (large)"
|
||||
desc = "This storage pouch can be used to provide a good amount of additional storage for quick access."
|
||||
icon_state = "large_generic"
|
||||
max_storage_space = ITEMSIZE_COST_SMALL*6
|
||||
|
||||
/obj/item/weapon/storage/pouch/small
|
||||
name = "storage pouch (small)"
|
||||
desc = "This storage pouch can be used to provide a small amount of additional storage for quick access."
|
||||
icon_state = "small_generic"
|
||||
max_storage_space = ITEMSIZE_COST_SMALL*2
|
||||
|
||||
/obj/item/weapon/storage/pouch/ammo
|
||||
name = "storage pouch (ammo)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold ammunition and cells."
|
||||
icon_state = "ammo"
|
||||
max_storage_space = INVENTORY_POUCH_SPACE
|
||||
can_hold = list(/obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/cell/device/weapon)
|
||||
|
||||
/obj/item/weapon/storage/pouch/eng_tool
|
||||
name = "storage pouch (tools)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold tools."
|
||||
icon_state = "engineering_tool"
|
||||
max_storage_space = INVENTORY_POUCH_SPACE
|
||||
can_hold = list(
|
||||
/obj/item/weapon/tool,
|
||||
/obj/item/weapon/weldingtool,
|
||||
/obj/item/device/multitool,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/device/t_scanner,
|
||||
/obj/item/device/analyzer,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/clothing/gloves,
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/pouch/eng_supply
|
||||
name = "storage pouch (supplies)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold engineering supplies."
|
||||
icon_state = "engineering_supply"
|
||||
max_storage_space = INVENTORY_POUCH_SPACE
|
||||
can_hold = list(
|
||||
/obj/item/weapon/cell/device,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/taperoll,
|
||||
/obj/item/weapon/extinguisher/mini,
|
||||
/obj/item/weapon/tape_roll
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/pouch/eng_parts
|
||||
name = "storage pouch (parts)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold machinery components."
|
||||
icon_state = "part_pouch"
|
||||
max_storage_space = INVENTORY_POUCH_SPACE
|
||||
can_hold = list(
|
||||
/obj/item/weapon/stock_parts,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/weapon/circuitboard
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/pouch/medical
|
||||
name = "storage pouch (medical)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold medical supplies."
|
||||
icon_state = "medical_supply"
|
||||
max_storage_space = INVENTORY_POUCH_SPACE
|
||||
can_hold = list(
|
||||
/obj/item/device/healthanalyzer,
|
||||
/obj/item/weapon/dnainjector,
|
||||
/obj/item/weapon/reagent_containers/dropper,
|
||||
/obj/item/weapon/reagent_containers/glass/beaker,
|
||||
/obj/item/weapon/reagent_containers/glass/bottle,
|
||||
/obj/item/weapon/reagent_containers/pill,
|
||||
/obj/item/weapon/reagent_containers/syringe,
|
||||
/obj/item/weapon/storage/quickdraw/syringe_case,
|
||||
/obj/item/weapon/storage/pill_bottle,
|
||||
/obj/item/stack/medical,
|
||||
/obj/item/weapon/reagent_containers/hypospray,
|
||||
/obj/item/weapon/storage/quickdraw/syringe_case
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/pouch/flares
|
||||
name = "storage pouch (flares)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold flares and glowsticks."
|
||||
icon_state = "flare"
|
||||
storage_slots = 5
|
||||
can_hold = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/glowstick)
|
||||
/obj/item/weapon/storage/pouch/flares/full_flare
|
||||
starts_with = list(/obj/item/device/flashlight/flare = 5)
|
||||
/obj/item/weapon/storage/pouch/flares/full_glow
|
||||
starts_with = list(/obj/item/device/flashlight/glowstick = 5)
|
||||
|
||||
/obj/item/weapon/storage/pouch/flares/update_icon()
|
||||
cut_overlays()
|
||||
if(contents.len)
|
||||
add_overlay("flare_[contents.len]")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/storage/pouch/holster
|
||||
name = "storage pouch (holster)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one normal sized weapon."
|
||||
icon_state = "pistol_holster"
|
||||
storage_slots = 1
|
||||
can_hold = list(/obj/item/weapon/gun)
|
||||
remove_delay = 0
|
||||
/obj/item/weapon/storage/pouch/holster/full_stunrevolver
|
||||
starts_with = list(/obj/item/weapon/gun/energy/stunrevolver)
|
||||
/obj/item/weapon/storage/pouch/holster/full_taser
|
||||
starts_with = list(/obj/item/weapon/gun/energy/taser)
|
||||
|
||||
/obj/item/weapon/storage/pouch/holster/update_icon()
|
||||
cut_overlays()
|
||||
if(contents.len)
|
||||
add_overlay("pistol_layer")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/storage/pouch/baton
|
||||
name = "storage pouch (baton)"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one standard baton."
|
||||
icon_state = "baton_holster"
|
||||
storage_slots = 1
|
||||
can_hold = list(/obj/item/weapon/melee/baton)
|
||||
remove_delay = 0
|
||||
/obj/item/weapon/storage/pouch/baton/full
|
||||
starts_with = list(/obj/item/weapon/melee/baton)
|
||||
|
||||
/obj/item/weapon/storage/pouch/baton/update_icon()
|
||||
cut_overlays()
|
||||
if(contents.len)
|
||||
add_overlay("baton_layer")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/storage/pouch/holding
|
||||
name = "storage pouch of holding"
|
||||
desc = "This storage pouch can be used to provide some additional storage for quick access. Seems to use extradimensional storage!"
|
||||
icon_state = "holdingpouch"
|
||||
max_storage_space = INVENTORY_STANDARD_SPACE // Size of a normal backpack, compared to a normal BoH, which is way bigger
|
||||
|
||||
#undef INVENTORY_POUCH_SPACE
|
||||
@@ -49,6 +49,8 @@
|
||||
var/use_sound = "rustle" //sound played when used. null for no sound.
|
||||
var/list/starts_with //Things to spawn on the box on spawn
|
||||
var/empty //Mapper override to spawn an empty version of a container that usually has stuff
|
||||
/// If you can use this storage while in a pocket
|
||||
var/pocketable = FALSE
|
||||
|
||||
/obj/item/weapon/storage/Initialize()
|
||||
. = ..()
|
||||
@@ -101,6 +103,7 @@
|
||||
count--
|
||||
new newtype(src)
|
||||
starts_with = null //Reduce list count.
|
||||
update_icon()
|
||||
|
||||
calibrate_size()
|
||||
|
||||
@@ -473,6 +476,9 @@
|
||||
/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
|
||||
if(!istype(W)) return 0
|
||||
|
||||
if(!stall_insertion(W, usr)) // Can sleep here and delay removal for slow storage
|
||||
return 0
|
||||
|
||||
if(usr)
|
||||
usr.remove_from_mob(W,target = src) //If given a target, handles forceMove()
|
||||
W.on_enter_storage(src)
|
||||
@@ -506,6 +512,9 @@
|
||||
/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location)
|
||||
if(!istype(W)) return 0
|
||||
|
||||
if(!stall_removal(W, usr)) // Can sleep here and delay removal for slow storage
|
||||
return 0
|
||||
|
||||
if(istype(src, /obj/item/weapon/storage/fancy))
|
||||
var/obj/item/weapon/storage/fancy/F = src
|
||||
F.update_icon(1)
|
||||
@@ -534,6 +543,14 @@
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/// Called before insertion completes, allowing you to delay or cancel it
|
||||
/obj/item/weapon/storage/proc/stall_insertion(obj/item/W, mob/user)
|
||||
return TRUE
|
||||
|
||||
/// Called before removal completes, allowing you to delay or cancel it
|
||||
/obj/item/weapon/storage/proc/stall_removal(obj/item/W, mob/user)
|
||||
return TRUE
|
||||
|
||||
//This proc is called when you want to place an item into the storage item.
|
||||
/obj/item/weapon/storage/attackby(obj/item/W as obj, mob/user as mob)
|
||||
..()
|
||||
@@ -579,7 +596,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/attack_hand(mob/user as mob)
|
||||
if(ishuman(user))
|
||||
if(ishuman(user) && !pocketable)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.l_store == src && !H.get_active_hand()) //Prevents opening if it's in a pocket.
|
||||
H.put_in_hands(src)
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
force = 15//quite robust
|
||||
attack_verb = list("smacked", "struck", "slapped")
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] collapses their telescopic baton.</span>",\
|
||||
user.visible_message("<b>\The [user]</b> collapses their telescopic baton.",\
|
||||
"<span class='notice'>You collapse the baton.</span>",\
|
||||
"You hear a click.")
|
||||
icon_state = "telebaton0"
|
||||
|
||||
@@ -508,7 +508,7 @@
|
||||
|
||||
if(mounted_pack.loc != src.loc && src.loc != mounted_pack)
|
||||
mounted_pack.return_nozzle()
|
||||
visible_message("<span class='notice'>\The [src] retracts to its fueltank.</span>")
|
||||
visible_message("<b>\The [src]</b> retracts to its fueltank.")
|
||||
|
||||
if(get_fuel() <= get_max_fuel())
|
||||
mounted_pack.reagents.trans_to_obj(src, 1)
|
||||
|
||||
@@ -71,8 +71,8 @@
|
||||
/obj/random/powercell
|
||||
name = "random powercell"
|
||||
desc = "This is a random powercell."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
icon = 'icons/obj/power_cells.dmi'
|
||||
icon_state = "random"
|
||||
|
||||
/obj/random/powercell/item_to_spawn()
|
||||
return pick(prob(40);/obj/item/weapon/cell,
|
||||
@@ -133,8 +133,8 @@
|
||||
/obj/random/tech_supply
|
||||
name = "random tech supply"
|
||||
desc = "This is a random piece of technology supplies."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "cell"
|
||||
icon = 'icons/obj/power_cells.dmi'
|
||||
icon_state = "random"
|
||||
spawn_nothing_percentage = 25
|
||||
|
||||
/obj/random/tech_supply/item_to_spawn()
|
||||
@@ -955,3 +955,26 @@
|
||||
prob(3);/obj/item/clothing/accessory/poncho/thermal/green,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/thermal/purple,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/thermal/blue)
|
||||
|
||||
/obj/random/pouch
|
||||
name = "Random Storage Pouch"
|
||||
desc = "This is a random storage pouch."
|
||||
icon = 'icons/obj/clothing/pouches.dmi'
|
||||
icon_state = "random"
|
||||
|
||||
/obj/random/pouch/item_to_spawn()
|
||||
return pick(
|
||||
prob(10);/obj/item/weapon/storage/pouch, // medium
|
||||
prob(3);/obj/item/weapon/storage/pouch/large,
|
||||
prob(8);/obj/item/weapon/storage/pouch/small,
|
||||
prob(5);/obj/item/weapon/storage/pouch/ammo,
|
||||
prob(5);/obj/item/weapon/storage/pouch/eng_tool,
|
||||
prob(5);/obj/item/weapon/storage/pouch/eng_supply,
|
||||
prob(5);/obj/item/weapon/storage/pouch/eng_parts,
|
||||
prob(5);/obj/item/weapon/storage/pouch/medical,
|
||||
prob(5);/obj/item/weapon/storage/pouch/flares/full_flare,
|
||||
prob(5);/obj/item/weapon/storage/pouch/flares/full_glow,
|
||||
prob(5);/obj/item/weapon/storage/pouch/holster,
|
||||
prob(5);/obj/item/weapon/storage/pouch/baton/full,
|
||||
prob(1);/obj/item/weapon/storage/pouch/holding
|
||||
)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
var/climb_delay = 3.5 SECONDS
|
||||
var/breakable
|
||||
var/parts
|
||||
var/list/climbers = list()
|
||||
var/list/climbers
|
||||
var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies.
|
||||
|
||||
var/list/connections = list("0", "0", "0", "0")
|
||||
@@ -35,7 +35,7 @@
|
||||
if(H.species.can_shred(user))
|
||||
attack_generic(user,1,"slices")
|
||||
|
||||
if(climbers.len && !(user in climbers))
|
||||
if(LAZYLEN(climbers) && !(user in climbers))
|
||||
user.visible_message("<span class='warning'>[user.name] shakes \the [src].</span>", \
|
||||
"<span class='notice'>You shake \the [src].</span>")
|
||||
structure_shaken()
|
||||
@@ -103,21 +103,21 @@
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climbers |= user
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay)))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if (!can_climb(user, post_climb_check=1))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
if (get_turf(user) == get_turf(src))
|
||||
usr.visible_message("<span class='warning'>[user] climbs onto \the [src]!</span>")
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/proc/structure_shaken()
|
||||
for(var/mob/living/M in climbers)
|
||||
@@ -204,7 +204,7 @@
|
||||
if(can_visually_connect_to(S))
|
||||
if(S.can_visually_connect())
|
||||
if(propagate)
|
||||
//S.update_connections() //Not here
|
||||
S.update_connections()
|
||||
S.update_icon()
|
||||
dirs += get_dir(src, S)
|
||||
|
||||
|
||||
@@ -0,0 +1,561 @@
|
||||
|
||||
///////////
|
||||
// EASEL //
|
||||
///////////
|
||||
|
||||
/obj/structure/easel
|
||||
name = "easel"
|
||||
desc = "Only for the finest of art!"
|
||||
icon = 'icons/obj/artstuff.dmi'
|
||||
icon_state = "easel"
|
||||
density = TRUE
|
||||
//resistance_flags = FLAMMABLE
|
||||
//max_integrity = 60
|
||||
var/obj/item/canvas/painting = null
|
||||
|
||||
//Adding canvases
|
||||
/obj/structure/easel/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/canvas))
|
||||
var/obj/item/canvas/canvas = I
|
||||
user.drop_from_inventory(canvas)
|
||||
painting = canvas
|
||||
canvas.forceMove(get_turf(src))
|
||||
canvas.layer = layer+0.1
|
||||
user.visible_message("<span class='notice'>[user] puts \the [canvas] on \the [src].</span>","<span class='notice'>You place \the [canvas] on \the [src].</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
//Stick to the easel like glue
|
||||
/obj/structure/easel/Move()
|
||||
var/turf/T = get_turf(src)
|
||||
. = ..()
|
||||
if(painting && painting.loc == T) //Only move if it's near us.
|
||||
painting.forceMove(get_turf(src))
|
||||
else
|
||||
painting = null
|
||||
|
||||
/obj/item/canvas
|
||||
name = "canvas"
|
||||
desc = "Draw out your soul on this canvas!"
|
||||
icon = 'icons/obj/artstuff.dmi'
|
||||
icon_state = "11x11"
|
||||
//flags_1 = UNPAINTABLE_1
|
||||
//resistance_flags = FLAMMABLE
|
||||
var/width = 11
|
||||
var/height = 11
|
||||
var/list/grid
|
||||
var/canvas_color = "#ffffff" //empty canvas color
|
||||
var/used = FALSE
|
||||
var/painting_name = "Untitled Artwork" //Painting name, this is set after framing.
|
||||
var/finalized = FALSE //Blocks edits
|
||||
var/author_name
|
||||
var/author_ckey
|
||||
var/icon_generated = FALSE
|
||||
var/icon/generated_icon
|
||||
///boolean that blocks persistence from saving it. enabled from printing copies, because we do not want to save copies.
|
||||
var/no_save = FALSE
|
||||
|
||||
/// From the origin of the turf we're on, where should the left of the canvas pixel be
|
||||
var/framed_offset_x = 11
|
||||
/// From the origin of the turf we're on, where should the bottom of the canvas be
|
||||
var/framed_offset_y = 10
|
||||
/// The frame takes the painting's offset, then moves this X offset
|
||||
var/frame_offset_x = -1
|
||||
/// The frame takes the painting's offset, then moves this Y offset
|
||||
var/frame_offset_y = -1
|
||||
|
||||
pixel_x = 10
|
||||
pixel_y = 9
|
||||
|
||||
/obj/item/canvas/Initialize()
|
||||
. = ..()
|
||||
reset_grid()
|
||||
|
||||
/obj/item/canvas/proc/reset_grid()
|
||||
grid = new/list(width,height)
|
||||
for(var/x in 1 to width)
|
||||
for(var/y in 1 to height)
|
||||
grid[x][y] = canvas_color
|
||||
|
||||
/obj/item/canvas/attack_self(mob/user)
|
||||
. = ..()
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/item/canvas/dropped(mob/user)
|
||||
pixel_x = initial(pixel_x)
|
||||
pixel_y = initial(pixel_y)
|
||||
return ..()
|
||||
|
||||
/obj/item/canvas/tgui_state(mob/user)
|
||||
if(finalized)
|
||||
return GLOB.tgui_physical_obscured_state
|
||||
else
|
||||
return GLOB.tgui_default_state
|
||||
|
||||
/obj/item/canvas/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Canvas", name)
|
||||
ui.set_autoupdate(FALSE)
|
||||
ui.open()
|
||||
|
||||
/obj/item/canvas/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/paint_palette))
|
||||
var/choice = tgui_alert(user, "Adjusting the base color of this canvas will replace ALL pixels with the selected color. Are you sure?", "Confirm Color Fill", list("Yes", "No"))
|
||||
if(choice == "No")
|
||||
return
|
||||
var/basecolor = input(user, "Select a base color for the canvas:", "Base Color", canvas_color) as null|color
|
||||
if(basecolor && Adjacent(user, src) && Adjacent(user, I))
|
||||
canvas_color = basecolor
|
||||
reset_grid()
|
||||
user.visible_message("[user] smears paint on [src], covering the entire thing in paint.", "You smear paint on [src], changing the color of the entire thing.", runemessage = "smears paint")
|
||||
update_appearance()
|
||||
return
|
||||
|
||||
if(user.a_intent == I_HELP)
|
||||
tgui_interact(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/canvas/tgui_data(mob/user)
|
||||
. = ..()
|
||||
.["grid"] = grid
|
||||
.["name"] = painting_name
|
||||
.["finalized"] = finalized
|
||||
|
||||
/obj/item/canvas/examine(mob/user)
|
||||
. = ..()
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/item/canvas/tgui_act(action, params)
|
||||
. = ..()
|
||||
if(. || finalized)
|
||||
return
|
||||
var/mob/user = usr
|
||||
switch(action)
|
||||
if("paint")
|
||||
var/obj/item/I = user.get_active_hand()
|
||||
var/color = get_paint_tool_color(I)
|
||||
if(!color)
|
||||
return FALSE
|
||||
var/x = text2num(params["x"])
|
||||
var/y = text2num(params["y"])
|
||||
grid[x][y] = color
|
||||
used = TRUE
|
||||
update_appearance()
|
||||
. = TRUE
|
||||
if("finalize")
|
||||
. = TRUE
|
||||
if(!finalized)
|
||||
finalize(user)
|
||||
|
||||
/obj/item/canvas/proc/finalize(mob/user)
|
||||
finalized = TRUE
|
||||
author_name = user.real_name
|
||||
author_ckey = user.ckey
|
||||
generate_proper_overlay()
|
||||
try_rename(user)
|
||||
|
||||
/obj/item/canvas/proc/update_appearance()
|
||||
cut_overlays()
|
||||
if(icon_generated)
|
||||
var/mutable_appearance/detail = mutable_appearance(generated_icon)
|
||||
detail.pixel_x = 1
|
||||
detail.pixel_y = 1
|
||||
add_overlay(detail)
|
||||
return
|
||||
if(!used)
|
||||
return
|
||||
|
||||
var/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]wip")
|
||||
detail.pixel_x = 1
|
||||
detail.pixel_y = 1
|
||||
add_overlay(detail)
|
||||
|
||||
/obj/item/canvas/proc/generate_proper_overlay()
|
||||
if(icon_generated)
|
||||
return
|
||||
var/png_filename = "data/persistent/paintings/temp_painting.png"
|
||||
var/result = rustg_dmi_create_png(png_filename,"[width]","[height]",get_data_string())
|
||||
if(result)
|
||||
CRASH("Error generating painting png : [result]")
|
||||
generated_icon = new(png_filename)
|
||||
icon_generated = TRUE
|
||||
update_appearance()
|
||||
|
||||
/obj/item/canvas/proc/get_data_string()
|
||||
var/list/data = list()
|
||||
for(var/y in 1 to height)
|
||||
for(var/x in 1 to width)
|
||||
data += grid[x][y]
|
||||
return data.Join("")
|
||||
|
||||
//Todo make this element ?
|
||||
/obj/item/canvas/proc/get_paint_tool_color(obj/item/I)
|
||||
if(!I)
|
||||
return
|
||||
if(istype(I, /obj/item/paint_brush))
|
||||
var/obj/item/paint_brush/P = I
|
||||
return P.selected_color
|
||||
else if(istype(I, /obj/item/weapon/pen/crayon))
|
||||
var/obj/item/weapon/pen/crayon/crayon = I
|
||||
return crayon.colour
|
||||
else if(istype(I, /obj/item/weapon/pen))
|
||||
var/obj/item/weapon/pen/P = I
|
||||
switch(P.colour)
|
||||
if("black")
|
||||
return "#000000"
|
||||
if("blue")
|
||||
return "#0000ff"
|
||||
if("red")
|
||||
return "#ff0000"
|
||||
return P.colour
|
||||
else if(istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag))
|
||||
return canvas_color
|
||||
|
||||
/obj/item/canvas/proc/try_rename(mob/user)
|
||||
var/new_name = stripped_input(user,"What do you want to name the painting?")
|
||||
if(new_name != painting_name && new_name && CanUseTopic(user, GLOB.tgui_physical_state))
|
||||
painting_name = new_name
|
||||
SStgui.update_uis(src)
|
||||
|
||||
/obj/item/canvas/nineteen_nineteen
|
||||
icon_state = "19x19"
|
||||
width = 19
|
||||
height = 19
|
||||
pixel_x = 5
|
||||
pixel_y = 10
|
||||
framed_offset_x = 8
|
||||
framed_offset_y = 9
|
||||
|
||||
/obj/item/canvas/twentythree_nineteen
|
||||
icon_state = "23x19"
|
||||
width = 23
|
||||
height = 19
|
||||
pixel_x = 4
|
||||
pixel_y = 10
|
||||
framed_offset_x = 6
|
||||
framed_offset_y = 8
|
||||
|
||||
/obj/item/canvas/twentythree_twentythree
|
||||
icon_state = "23x23"
|
||||
width = 23
|
||||
height = 23
|
||||
pixel_x = 5
|
||||
pixel_y = 9
|
||||
framed_offset_x = 5
|
||||
framed_offset_y = 6
|
||||
|
||||
/obj/item/canvas/twentyfour_twentyfour
|
||||
name = "ai universal standard canvas"
|
||||
//desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." // Not yet
|
||||
icon_state = "24x24"
|
||||
width = 24
|
||||
height = 24
|
||||
pixel_x = 2
|
||||
pixel_y = 2
|
||||
framed_offset_x = 4
|
||||
framed_offset_y = 4
|
||||
frame_offset_x = -2
|
||||
frame_offset_y = -2
|
||||
|
||||
/obj/item/paint_brush
|
||||
name = "artist's paintbrush"
|
||||
desc = "When you really want to put together a masterpiece!"
|
||||
description_info = "Hit this on a palette to set the color, and use it on a canvas to paint with that color."
|
||||
icon = 'icons/obj/artstuff.dmi'
|
||||
icon_state = "brush"
|
||||
var/selected_color = "#000000"
|
||||
var/image/color_drop
|
||||
var/hud_level = FALSE
|
||||
|
||||
/obj/item/paint_brush/Initialize()
|
||||
. = ..()
|
||||
color_drop = image(icon, null, "brush_color")
|
||||
color_drop.color = selected_color
|
||||
|
||||
// When picked up
|
||||
/obj/item/paint_brush/hud_layerise()
|
||||
. = ..()
|
||||
hud_level = TRUE
|
||||
update_paint()
|
||||
|
||||
// When put down
|
||||
/obj/item/paint_brush/reset_plane_and_layer()
|
||||
. = ..()
|
||||
hud_level = FALSE
|
||||
update_paint()
|
||||
|
||||
/obj/item/paint_brush/proc/update_paint(var/new_color)
|
||||
if(new_color)
|
||||
selected_color = new_color
|
||||
color_drop.color = new_color
|
||||
|
||||
cut_overlays()
|
||||
if(hud_level)
|
||||
add_overlay(color_drop)
|
||||
|
||||
/obj/item/paint_palette
|
||||
name = "artist's palette"
|
||||
desc = "Helps to have a paintbrush, too."
|
||||
description_info = "You can hit this on a canvas to set the entire canvas color (but note that it will wipe out any works in progress). You can hit a paintbrush on this to set the color."
|
||||
icon = 'icons/obj/artstuff.dmi'
|
||||
icon_state = "palette"
|
||||
|
||||
/obj/item/paint_palette/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/paint_brush))
|
||||
var/obj/item/paint_brush/P = W
|
||||
var/newcolor = input(user, "Select a new paint color:", "Paint Palette", P.selected_color) as null|color
|
||||
if(newcolor && Adjacent(user, P) && Adjacent(user, src))
|
||||
P.update_paint(newcolor)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/frame/painting
|
||||
name = "painting frame"
|
||||
desc = "The perfect showcase for your favorite deathtrap memories."
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
//custom_materials = list(/datum/material/wood = 2000)
|
||||
//flags_1 = NONE
|
||||
icon_state = "frame-empty"
|
||||
|
||||
/obj/item/frame/painting/try_build(turf/on_wall, mob/user as mob)
|
||||
if(get_dist(on_wall, user) > 1)
|
||||
return
|
||||
var/ndir = get_dir(on_wall, user)
|
||||
if (!(ndir in cardinal))
|
||||
return
|
||||
if(!istype(on_wall, /turf/simulated/wall))
|
||||
to_chat(user, "<span class='warning'>Frame cannot be placed on this spot.</span>")
|
||||
return
|
||||
new /obj/structure/sign/painting(get_turf(user), ndir, TRUE)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/sign/painting
|
||||
name = "Painting"
|
||||
desc = "Art or \"Art\"? You decide."
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
icon_state = "frame-empty"
|
||||
var/base_icon_state = "frame"
|
||||
//custom_materials = list(/datum/material/wood = 2000)
|
||||
//buildable_sign = FALSE
|
||||
///Canvas we're currently displaying.
|
||||
var/obj/item/canvas/current_canvas
|
||||
///Description set when canvas is added.
|
||||
var/desc_with_canvas
|
||||
var/persistence_id
|
||||
|
||||
//Presets for art gallery mapping, for paintings to be shared across stations
|
||||
/obj/structure/sign/painting/public
|
||||
name = "\improper Public Painting Exhibit mounting"
|
||||
desc = "For art pieces hung by the public."
|
||||
desc_with_canvas = "A piece of art (or \"art\"). Anyone could've hung it."
|
||||
persistence_id = "public"
|
||||
|
||||
/obj/structure/sign/painting/library_secure
|
||||
name = "\improper Curated Painting Exhibit mounting"
|
||||
desc = "For masterpieces hand-picked by the curator."
|
||||
desc_with_canvas = "A masterpiece hand-picked by the curator, supposedly."
|
||||
persistence_id = "library"
|
||||
req_one_access = list(access_library)
|
||||
|
||||
/obj/structure/sign/painting/chapel_secure
|
||||
name = "\improper Religious Painting Exhibit mounting"
|
||||
desc = "For masterpieces hand-picked by the chaplain."
|
||||
desc_with_canvas = "A masterpiece hand-picked by the chaplain, supposedly."
|
||||
persistence_id = "chapel"
|
||||
req_one_access = list(access_chapel_office)
|
||||
|
||||
/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least
|
||||
name = "\improper Private Painting Exhibit mounting"
|
||||
desc = "For art pieces deemed too subversive or too illegal to be shared outside of curators."
|
||||
desc_with_canvas = "A painting hung away from lesser minds."
|
||||
persistence_id = "library_private"
|
||||
req_one_access = list(access_library)
|
||||
|
||||
/obj/structure/sign/painting/Initialize(mapload, dir, building)
|
||||
. = ..()
|
||||
if(persistence_id)
|
||||
SSpersistence.painting_frames += src
|
||||
if(dir)
|
||||
set_dir(dir)
|
||||
if(building)
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
|
||||
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
|
||||
|
||||
/obj/structure/sign/painting/Destroy()
|
||||
. = ..()
|
||||
SSpersistence.painting_frames -= src
|
||||
|
||||
/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params)
|
||||
if(!current_canvas && istype(I, /obj/item/canvas))
|
||||
frame_canvas(user, I)
|
||||
else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/weapon/pen))
|
||||
try_rename(user)
|
||||
else if(current_canvas && I.is_wirecutter())
|
||||
unframe_canvas(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/sign/painting/examine(mob/user)
|
||||
. = ..()
|
||||
if(persistence_id)
|
||||
. += "<span class='notice'>Any painting placed here will be archived at the end of the shift.</span>"
|
||||
if(current_canvas)
|
||||
current_canvas.tgui_interact(user)
|
||||
. += "<span class='notice'>Use wirecutters to remove the painting.</span>"
|
||||
|
||||
/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas)
|
||||
if(!allowed(user))
|
||||
to_chat(user, "<span class='warning'>You're not comfortable framing this canvas in such a prestigious spot!</span>")
|
||||
return
|
||||
if(user.drop_from_inventory(new_canvas, src))
|
||||
current_canvas = new_canvas
|
||||
if(!current_canvas.finalized)
|
||||
current_canvas.finalize(user)
|
||||
to_chat(user,"<span class='notice'>You frame [current_canvas].</span>")
|
||||
update_appearance()
|
||||
|
||||
/obj/structure/sign/painting/proc/unframe_canvas(mob/living/user)
|
||||
if(current_canvas)
|
||||
current_canvas.forceMove(drop_location())
|
||||
current_canvas = null
|
||||
to_chat(user, "<span class='notice'>You remove the painting from the frame.</span>")
|
||||
update_appearance()
|
||||
|
||||
/obj/structure/sign/painting/proc/try_rename(mob/user)
|
||||
if(current_canvas.painting_name == initial(current_canvas.painting_name))
|
||||
current_canvas.try_rename(user)
|
||||
|
||||
/obj/structure/sign/painting/proc/update_appearance()
|
||||
name = current_canvas ? "painting - [current_canvas.painting_name]" : initial(name)
|
||||
desc = current_canvas ? desc_with_canvas : initial(desc)
|
||||
icon_state = "[base_icon_state]-[current_canvas?.generated_icon ? "hidden" : "empty"]"
|
||||
|
||||
cut_overlays()
|
||||
|
||||
if(!current_canvas?.generated_icon)
|
||||
return
|
||||
|
||||
. = list()
|
||||
var/mutable_appearance/MA = mutable_appearance(current_canvas.generated_icon)
|
||||
MA.pixel_x = current_canvas.framed_offset_x
|
||||
MA.pixel_y = current_canvas.framed_offset_y
|
||||
. += MA
|
||||
var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame")
|
||||
frame.pixel_x = current_canvas.framed_offset_x + current_canvas.frame_offset_x
|
||||
frame.pixel_y = current_canvas.framed_offset_y + current_canvas.frame_offset_y
|
||||
. += frame
|
||||
|
||||
add_overlay(.)
|
||||
|
||||
/obj/item/canvas/proc/fill_grid_from_icon(icon/I)
|
||||
var/h = I.Height() + 1
|
||||
for(var/x in 1 to width)
|
||||
for(var/y in 1 to height)
|
||||
grid[x][y] = I.GetPixel(x,h-y)
|
||||
|
||||
/**
|
||||
* Loads a painting from SSpersistence. Called globally by said subsystem when it inits
|
||||
*
|
||||
* Deleting paintings leaves their json, so this proc will remove the json and try again if it finds one of those.
|
||||
*/
|
||||
/obj/structure/sign/painting/proc/load_persistent()
|
||||
if(!persistence_id || !SSpersistence.paintings)
|
||||
return
|
||||
var/list/painting_category = list()
|
||||
for (var/list/P in SSpersistence.paintings)
|
||||
if(P["persistence_id"] == persistence_id)
|
||||
painting_category[++painting_category.len] = P
|
||||
var/list/painting
|
||||
while(!painting)
|
||||
if(!length(painting_category))
|
||||
return //aborts loading anything this category has no usable paintings
|
||||
var/list/chosen = pick(painting_category)
|
||||
if(!fexists("data/persistent/paintings/[persistence_id]/[chosen["md5"]].png")) //shitmin deleted this art, lets remove json entry to avoid errors
|
||||
painting_category -= list(chosen)
|
||||
continue //and try again
|
||||
painting = chosen
|
||||
var/title = painting["title"]
|
||||
var/author_name = painting["author"]
|
||||
var/author_ckey = painting["ckey"]
|
||||
var/png = "data/persistent/paintings/[persistence_id]/[painting["md5"]].png"
|
||||
if(!title)
|
||||
title = "Untitled Artwork" //legacy artwork allowed null names which was bad for the json, lets fix that
|
||||
painting["title"] = title
|
||||
var/icon/I = new(png)
|
||||
var/obj/item/canvas/new_canvas
|
||||
var/w = I.Width()
|
||||
var/h = I.Height()
|
||||
for(var/T in typesof(/obj/item/canvas))
|
||||
new_canvas = T
|
||||
if(initial(new_canvas.width) == w && initial(new_canvas.height) == h)
|
||||
new_canvas = new T(src)
|
||||
break
|
||||
new_canvas.fill_grid_from_icon(I)
|
||||
new_canvas.generated_icon = I
|
||||
new_canvas.icon_generated = TRUE
|
||||
new_canvas.finalized = TRUE
|
||||
new_canvas.painting_name = title
|
||||
new_canvas.author_name = author_name
|
||||
new_canvas.author_ckey = author_ckey
|
||||
new_canvas.name = "painting - [title]"
|
||||
current_canvas = new_canvas
|
||||
update_appearance()
|
||||
|
||||
/obj/structure/sign/painting/proc/save_persistent()
|
||||
if(!persistence_id || !current_canvas || current_canvas.no_save)
|
||||
return
|
||||
if(sanitize_filename(persistence_id) != persistence_id)
|
||||
stack_trace("Invalid persistence_id - [persistence_id]")
|
||||
return
|
||||
if(!current_canvas.painting_name)
|
||||
current_canvas.painting_name = "Untitled Artwork"
|
||||
var/data = current_canvas.get_data_string()
|
||||
var/md5 = md5(lowertext(data))
|
||||
LAZYINITLIST(SSpersistence.paintings)
|
||||
for(var/list/entry in SSpersistence.paintings)
|
||||
if(entry["md5"] == md5)
|
||||
return
|
||||
var/png_directory = "data/persistent/paintings/[persistence_id]/"
|
||||
var/png_path = png_directory + "[md5].png"
|
||||
var/result = rustg_dmi_create_png(png_path,"[current_canvas.width]","[current_canvas.height]",data)
|
||||
if(result)
|
||||
CRASH("Error saving persistent painting: [result]")
|
||||
SSpersistence.paintings += list(list(
|
||||
"persistence_id" = persistence_id,
|
||||
"title" = current_canvas.painting_name,
|
||||
"md5" = md5,
|
||||
"author" = current_canvas.author_name,
|
||||
"ckey" = current_canvas.author_ckey
|
||||
))
|
||||
|
||||
/obj/structure/sign/painting/vv_get_dropdown()
|
||||
. = ..()
|
||||
VV_DROPDOWN_OPTION("removepainting", "Remove Persistent Painting")
|
||||
|
||||
/obj/structure/sign/painting/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
if(href_list["removepainting"])
|
||||
if(!check_rights(NONE))
|
||||
return
|
||||
var/mob/user = usr
|
||||
if(!persistence_id || !current_canvas)
|
||||
to_chat(user,"<span class='warning'>This is not a persistent painting.</span>")
|
||||
return
|
||||
var/md5 = md5(lowertext(current_canvas.get_data_string()))
|
||||
var/author = current_canvas.author_ckey
|
||||
var/list/filenames_found = list()
|
||||
for(var/list/entry in SSpersistence.paintings)
|
||||
if(entry["md5"] == md5)
|
||||
filenames_found += "data/persistent/paintings/[entry["persistence_id"]]/[entry["md5"]].png"
|
||||
SSpersistence.paintings -= entry
|
||||
for(var/png in filenames_found)
|
||||
if(fexists(png))
|
||||
fdel(png)
|
||||
for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames)
|
||||
if(P.current_canvas && md5(P.current_canvas.get_data_string()) == md5)
|
||||
QDEL_NULL(P.current_canvas)
|
||||
P.update_appearance()
|
||||
log_and_message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")
|
||||
@@ -30,7 +30,7 @@ LINEN BINS
|
||||
|
||||
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
|
||||
if(is_sharp(I))
|
||||
user.visible_message("<span class='notice'>\The [user] begins cutting up [src] with [I].</span>", "<span class='notice'>You begin cutting up [src] with [I].</span>")
|
||||
user.visible_message("<b>\The [user]</b> begins cutting up [src] with [I].", "<span class='notice'>You begin cutting up [src] with [I].</span>")
|
||||
if(do_after(user, 50))
|
||||
to_chat(user, "<span class='notice'>You cut [src] into pieces!</span>")
|
||||
for(var/i in 1 to rand(2,5))
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
burning = FALSE
|
||||
update_icon()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
visible_message("<span class='notice'>\The [src] stops burning.</span>")
|
||||
visible_message("<b>\The [src]</b> stops burning.")
|
||||
|
||||
/obj/structure/bonfire/proc/ignite()
|
||||
if(!burning && get_fuel_amount())
|
||||
@@ -180,8 +180,9 @@
|
||||
O.fire_act(null, 1000, 500)
|
||||
else if(isliving(A) && get_fuel_amount() > 4)
|
||||
var/mob/living/L = A
|
||||
L.adjust_fire_stacks(get_fuel_amount() / 4)
|
||||
L.IgniteMob()
|
||||
if(!(L.is_incorporeal()))
|
||||
L.adjust_fire_stacks(get_fuel_amount() / 4)
|
||||
L.IgniteMob()
|
||||
|
||||
/obj/structure/bonfire/update_icon()
|
||||
cut_overlays()
|
||||
@@ -353,7 +354,7 @@
|
||||
burning = FALSE
|
||||
update_icon()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
visible_message("<span class='notice'>\The [src] stops burning.</span>")
|
||||
visible_message("<b>\The [src]</b> stops burning.")
|
||||
|
||||
/obj/structure/fireplace/proc/ignite()
|
||||
if(!burning && get_fuel_amount())
|
||||
|
||||
@@ -26,14 +26,14 @@
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climbers |= user
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
@@ -42,7 +42,7 @@
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied.
|
||||
if(!..())
|
||||
@@ -84,14 +84,14 @@
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climbers |= user
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
@@ -100,7 +100,7 @@
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/fitness/boxing_ropes_bottom/can_climb(var/mob/living/user, post_climb_check=0)
|
||||
if(!..())
|
||||
@@ -143,14 +143,14 @@
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climbers |= user
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
@@ -159,7 +159,7 @@
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/fitness/boxing_turnbuckle/can_climb(var/mob/living/user, post_climb_check=0)
|
||||
if(!..())
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
if(is_stump)
|
||||
if(istype(W,/obj/item/weapon/shovel))
|
||||
if(do_after(user, 5 SECONDS))
|
||||
visible_message("<span class='notice'>\The [user] digs up \the [src] stump with \the [W].</span>")
|
||||
visible_message("<b>\The [user]</b> digs up \the [src] stump with \the [W].")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
return
|
||||
|
||||
if(!activated)
|
||||
to_chat(user, "<span class='warning'>\the [src] has not yet been activated. Sorry.</span>")
|
||||
to_chat(user, "<span class='warning'>\The [src] has not yet been activated. Sorry.</span>")
|
||||
return
|
||||
|
||||
if(used)
|
||||
|
||||
@@ -55,14 +55,14 @@
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climbers |= user
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
@@ -71,7 +71,7 @@
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0)
|
||||
if(!..())
|
||||
|
||||
@@ -129,10 +129,10 @@
|
||||
qdel(contained)
|
||||
contained = new mask_type(src)
|
||||
breather = null
|
||||
src.visible_message("<span class='notice'>\The [contained] slips to \the [src]!</span>")
|
||||
src.visible_message("<b>\The [contained]</b> slips to \the [src]!")
|
||||
update_icon()
|
||||
return
|
||||
usr.visible_message("<span class='notice'>\The [usr] begins carefully placing the mask onto [target].</span>",
|
||||
usr.visible_message("<b>\The [usr]</b> begins carefully placing the mask onto [target].",
|
||||
"<span class='notice'>You begin carefully placing the mask onto [target].</span>")
|
||||
if(!do_mob(usr, target, 100) || !can_apply_to_target(target, usr))
|
||||
return
|
||||
@@ -151,14 +151,14 @@
|
||||
visible_message("\The [attached] is taken off \the [src]")
|
||||
attached = null
|
||||
else if(ishuman(target))
|
||||
usr.visible_message("<span class='notice'>\The [usr] begins inserting needle into [target]'s vein.</span>",
|
||||
usr.visible_message("<b>\The [usr]</b> begins inserting needle into [target]'s vein.",
|
||||
"<span class='notice'>You begin inserting needle into [target]'s vein.</span>")
|
||||
if(!do_mob(usr, target, 50))
|
||||
usr.visible_message("<span class='notice'>\The [usr]'s hand slips and pricks \the [target].</span>",
|
||||
"<span class='notice'>Your hand slips and pricks \the [target].</span>")
|
||||
target.apply_damage(3, BRUTE, pick(BP_R_ARM, BP_L_ARM))
|
||||
return
|
||||
usr.visible_message("<span class='notice'>\The [usr] hooks \the [target] up to \the [src].</span>",
|
||||
usr.visible_message("<b>\The [usr]</b> hooks \the [target] up to \the [src].",
|
||||
"<span class='notice'>You hook \the [target] up to \the [src].</span>")
|
||||
attached = target
|
||||
START_PROCESSING(SSobj,src)
|
||||
@@ -184,13 +184,13 @@
|
||||
to_chat(user, "<span class='warning'>There is no tank in \the [src]!</span>")
|
||||
return
|
||||
else if (tank && is_loosen)
|
||||
user.visible_message("<span class='notice'>\The [user] removes \the [tank] from \the [src].</span>", "<span class='warning'>You remove \the [tank] from \the [src].</span</span>>")
|
||||
user.visible_message("<b>\The [user]</b> removes \the [tank] from \the [src].", "<span class='warning'>You remove \the [tank] from \the [src].</span</span>>")
|
||||
user.put_in_hands(tank)
|
||||
tank = null
|
||||
update_icon()
|
||||
return
|
||||
else if (!is_loosen)
|
||||
user.visible_message("<span class='notice'>\The [user] tries to removes \the [tank] from \the [src] but it won't budge.</span>", "<span class='warning'>You try to removes \the [tank] from \the [src] but it won't budge.</span</span>>")
|
||||
user.visible_message("<b>\The [user]</b> tries to removes \the [tank] from \the [src] but it won't budge.", "<span class='warning'>You try to removes \the [tank] from \the [src] but it won't budge.</span</span>>")
|
||||
return
|
||||
if ("Toggle valve")
|
||||
if (!tank)
|
||||
@@ -198,7 +198,7 @@
|
||||
return
|
||||
else
|
||||
if (valve_opened)
|
||||
src.visible_message("<span class='notice'>\The [user] closes valve on \the [src]!</span>",
|
||||
src.visible_message("<b>\The [user]</b> closes valve on \the [src]!",
|
||||
"<span class='notice'>You close valve on \the [src].</span>")
|
||||
if(breather)
|
||||
breather.internals?.icon_state = "internal0"
|
||||
@@ -206,7 +206,7 @@
|
||||
valve_opened = FALSE
|
||||
update_icon()
|
||||
else
|
||||
src.visible_message("<span class='notice'>\The [user] opens valve on \the [src]!</span>",
|
||||
src.visible_message("<b>\The [user]</b> opens valve on \the [src]!",
|
||||
"<span class='notice'>You open valve on \the [src].</span>")
|
||||
if(breather)
|
||||
breather.internal = tank
|
||||
@@ -319,7 +319,7 @@
|
||||
user.drop_item()
|
||||
W.forceMove(src)
|
||||
tank = W
|
||||
user.visible_message("<span class='notice'>\The [user] attaches \the [tank] to \the [src].</span>", "<span class='notice'>You attach \the [tank] to \the [src].</span>")
|
||||
user.visible_message("<b>\The [user]</b> attaches \the [tank] to \the [src].", "<span class='notice'>You attach \the [tank] to \the [src].</span>")
|
||||
src.add_fingerprint(user)
|
||||
update_icon()
|
||||
|
||||
@@ -373,7 +373,7 @@
|
||||
else
|
||||
qdel(contained)
|
||||
contained = new mask_type (src)
|
||||
src.visible_message("<span class='notice'>\The [contained] slips to \the [src]!</span>")
|
||||
src.visible_message("<b>\The [contained]</b> slips to \the [src]!")
|
||||
breather = null
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -90,11 +90,11 @@
|
||||
|
||||
/obj/structure/prop/prism/proc/rotate_auto(var/new_bearing)
|
||||
if(rotation_lock)
|
||||
visible_message("<span class='notice'>\The [src] shudders.</span>")
|
||||
visible_message("<b>\The [src]</b> shudders.")
|
||||
playsound(src, 'sound/effects/clang.ogg', 50, 1)
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>\The [src] rotates to a bearing of [new_bearing].</span>")
|
||||
visible_message("<b>\The [src]</b> rotates to a bearing of [new_bearing].")
|
||||
|
||||
var/rotate_degrees = new_bearing - degrees_from_north
|
||||
|
||||
|
||||
@@ -115,6 +115,13 @@
|
||||
icon = 'icons/obj/structures/decor32x64.dmi'
|
||||
icon_state = "eotp"
|
||||
|
||||
// gravity generator from Eris
|
||||
/obj/structure/prop/gravygen
|
||||
icon = 'icons/obj/structures/decor64x64.dmi'
|
||||
icon_state = "bigdice"
|
||||
bound_width = 64
|
||||
bound_height = 64
|
||||
|
||||
// dna vault from /tg/
|
||||
/obj/structure/prop/dna_vault
|
||||
icon = 'icons/obj/structures/decor96x96.dmi'
|
||||
@@ -271,6 +278,58 @@
|
||||
/obj/structure/prop/nt_solifier/starts_on
|
||||
icon_state = "nt_solidifier_on"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* off: Boring, round
|
||||
* on: Spinny glowy
|
||||
*/
|
||||
// conduit of soul from Eris
|
||||
/obj/structure/prop/conduit
|
||||
icon = 'icons/obj/structures/decor.dmi'
|
||||
icon_state = "conduit_off"
|
||||
|
||||
/obj/structure/prop/conduit/change_state(state)
|
||||
. = ..()
|
||||
switch(state)
|
||||
if("on")
|
||||
icon_state = "conduit_spin"
|
||||
flick("conduit_starting", src)
|
||||
if("off")
|
||||
icon_state = "conduit_off"
|
||||
flick("conduit_stopping", src)
|
||||
|
||||
/obj/structure/prop/conduit/starts_on
|
||||
icon_state = "conduit_spin"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* on: Doing some kinda worky thing
|
||||
* off: Not doing much of anything
|
||||
* empty: No blue crystal thingy
|
||||
* loaded: off but without the animation
|
||||
*/
|
||||
// some kinda NT thing from Eris
|
||||
/obj/structure/prop/core
|
||||
icon = 'icons/obj/structures/decor.dmi'
|
||||
icon_state = "core_inactive"
|
||||
|
||||
/obj/structure/prop/core/change_state(state)
|
||||
. = ..()
|
||||
switch(state)
|
||||
if("on")
|
||||
icon_state = "core_active"
|
||||
flick("core_warmup", src)
|
||||
if("off")
|
||||
icon_state = "core_inactive"
|
||||
flick("core_shutdown", src)
|
||||
if("empty")
|
||||
icon_state = "core_empty"
|
||||
if("loaded")
|
||||
icon_state = "core_inactive"
|
||||
|
||||
/obj/structure/prop/core/starts_on
|
||||
icon_state = "core_active"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* down: In the ground, glowing
|
||||
@@ -278,7 +337,6 @@
|
||||
*/
|
||||
// experimental science destructor from /tg/
|
||||
/obj/structure/prop/tube
|
||||
icon = 'icons/obj/structures/decor.dmi'
|
||||
icon = 'icons/obj/structures/decor32x64.dmi'
|
||||
icon_state = "tube_open"
|
||||
|
||||
@@ -393,6 +451,62 @@
|
||||
/obj/structure/prop/nt_optable/starts_active
|
||||
icon_state = "nt_optable-active"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* idle: The default look
|
||||
* active: Glowy lights in the center
|
||||
* panel_open: Opened panel (wiring)
|
||||
* panel_closed: Closed panel
|
||||
*/
|
||||
// trade beacon from Eris
|
||||
/obj/structure/prop/tradebeacon
|
||||
icon = 'icons/obj/structures/decor.dmi'
|
||||
icon_state = "tradebeacon"
|
||||
|
||||
/obj/structure/prop/tradebeacon/change_state(state)
|
||||
. = ..()
|
||||
switch(state)
|
||||
if("idle")
|
||||
icon_state = "tradebeacon"
|
||||
if("active")
|
||||
icon_state = "tradebeacon_active"
|
||||
if("panel_open")
|
||||
cut_overlay("tradebeacon_panel")
|
||||
add_overlay("tradebeacon_panel")
|
||||
if("panel_closed")
|
||||
cut_overlay("tradebeacon_panel")
|
||||
|
||||
/obj/structure/prop/tradebeacon/starts_active
|
||||
icon_state = "tradebeacon_active"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* idle: The default look
|
||||
* active: Glowy lights in the center
|
||||
* panel_open: Opened panel (wiring)
|
||||
* panel_closed: Closed panel
|
||||
*/
|
||||
// another trade beacon from Eris
|
||||
/obj/structure/prop/tradebeacon2
|
||||
icon = 'icons/obj/structures/decor.dmi'
|
||||
icon_state = "tradebeacon"
|
||||
|
||||
/obj/structure/prop/tradebeacon2/change_state(state)
|
||||
. = ..()
|
||||
switch(state)
|
||||
if("idle")
|
||||
icon_state = "tradebeacon_sending"
|
||||
if("active")
|
||||
icon_state = "tradebeacon_sending_active"
|
||||
if("panel_open")
|
||||
cut_overlay("tradebeacon_sending_panel")
|
||||
add_overlay("tradebeacon_sending_panel")
|
||||
if("panel_closed")
|
||||
cut_overlay("tradebeacon_sending_panel")
|
||||
|
||||
/obj/structure/prop/tradebeacon2/starts_active
|
||||
icon_state = "tradebeacon_sending_active"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* off: Non-spinny
|
||||
@@ -414,6 +528,48 @@
|
||||
/obj/structure/prop/nt_obelisk/starts_on
|
||||
icon_state = "nt_obelisk_on"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* off: Inert
|
||||
* on: Hand destroying machinery
|
||||
*/
|
||||
// 'sorter' from Eris
|
||||
/obj/structure/prop/sorter
|
||||
icon = 'icons/obj/structures/decor.dmi'
|
||||
icon_state = "sorter"
|
||||
|
||||
/obj/structure/prop/sorter/change_state(state)
|
||||
. = ..()
|
||||
switch(state)
|
||||
if("off")
|
||||
icon_state = "sorter"
|
||||
if("on")
|
||||
icon_state = "sorter-process"
|
||||
|
||||
/obj/structure/prop/sorter/starts_on
|
||||
icon_state = "sorter-process"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* off: Inert
|
||||
* on: Hand destroying machinery
|
||||
*/
|
||||
// 'smelter' from Eris
|
||||
/obj/structure/prop/smelter
|
||||
icon = 'icons/obj/structures/decor.dmi'
|
||||
icon_state = "smelter"
|
||||
|
||||
/obj/structure/prop/smelter/change_state(state)
|
||||
. = ..()
|
||||
switch(state)
|
||||
if("off")
|
||||
icon_state = "smelter"
|
||||
if("on")
|
||||
icon_state = "smelter-process"
|
||||
|
||||
/obj/structure/prop/smelter/starts_on
|
||||
icon_state = "smelter-process"
|
||||
|
||||
/**
|
||||
* Possible 'state' options for change_state(state) are:
|
||||
* idle: Not doing anything, with yellow template exposed
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
if(W.is_wrench() && !anchored)
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
if(do_after(user, 20, src))
|
||||
user.visible_message("<span class='notice'>\The [user] dismantles \the [src].</span>", "<span class='notice'>You dismantle \the [src].</span>")
|
||||
user.visible_message("<b>\The [user]</b> dismantles \the [src].", "<span class='notice'>You dismantle \the [src].</span>")
|
||||
new /obj/item/stack/material/steel(get_turf(usr), 2)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -216,13 +216,13 @@
|
||||
if(F.welding)
|
||||
playsound(src, F.usesound, 50, 1)
|
||||
if(do_after(user, 20, src))
|
||||
user.visible_message("<span class='notice'>\The [user] repairs some damage to \the [src].</span>", "<span class='notice'>You repair some damage to \the [src].</span>")
|
||||
user.visible_message("<b>\The [user]</b> repairs some damage to \the [src].", "<span class='notice'>You repair some damage to \the [src].</span>")
|
||||
health = min(health+(maxhealth/5), maxhealth) // 20% repair per application
|
||||
return
|
||||
|
||||
// Install
|
||||
if(W.is_screwdriver())
|
||||
user.visible_message(anchored ? "<span class='notice'>\The [user] begins unscrewing \the [src].</span>" : "<span class='notice'>\The [user] begins fasten \the [src].</span>" )
|
||||
user.visible_message(anchored ? "<b>\The [user]</b> begins unscrewing \the [src]." : "<b>\The [user]</b> begins fasten \the [src]." )
|
||||
playsound(src, W.usesound, 75, 1)
|
||||
if(do_after(user, 10, src))
|
||||
to_chat(user, (anchored ? "<span class='notice'>You have unfastened \the [src] from the floor.</span>" : "<span class='notice'>You have fastened \the [src] to the floor.</span>"))
|
||||
@@ -286,14 +286,14 @@
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climbers |= user
|
||||
LAZYDISTINCTADD(climbers, user)
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
@@ -303,7 +303,7 @@
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
if(!anchored) take_damage(maxhealth) // Fatboy
|
||||
climbers -= user
|
||||
LAZYREMOVE(climbers, user)
|
||||
|
||||
/obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0)
|
||||
if(!..())
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
var/actual_time = I.toolspeed * 170
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] begins salvaging from \the [src].</span>", \
|
||||
"<b>\The [user]</b> begins salvaging from \the [src].", \
|
||||
"<span class='notice'>You start salvaging from \the [src].</span>")
|
||||
if(do_after(user, actual_time, target = src))
|
||||
user.visible_message( \
|
||||
|
||||
@@ -324,7 +324,7 @@
|
||||
to_chat(usr, "<span class='warning'>\The [thing] is empty.</span>")
|
||||
return
|
||||
// Clear the vessel.
|
||||
visible_message("<span class='notice'>\The [usr] tips the contents of \the [thing] into \the [src].</span>")
|
||||
visible_message("<b>\The [usr]</b> tips the contents of \the [thing] into \the [src].")
|
||||
thing.reagents.clear_reagents()
|
||||
thing.update_icon()
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
damage = damage / 2
|
||||
take_damage(damage)
|
||||
else
|
||||
visible_message("<span class='notice'>\The [user] bonks \the [src] harmlessly.</span>")
|
||||
visible_message("<b>\The [user]</b> bonks \the [src] harmlessly.")
|
||||
user.do_attack_animation(src)
|
||||
return 1
|
||||
|
||||
@@ -302,7 +302,7 @@
|
||||
if (C.use(1))
|
||||
playsound(src, 'sound/effects/sparks1.ogg', 75, 1)
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] begins to wire \the [src] for electrochromic tinting.</span>", \
|
||||
"<b>\The [user]</b> begins to wire \the [src] for electrochromic tinting.", \
|
||||
"<span class='notice'>You begin to wire \the [src] for electrochromic tinting.</span>", \
|
||||
"You hear sparks.")
|
||||
if(do_after(user, 20 * C.toolspeed, src) && state == 0)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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) )
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user