Merge branch 'master' into upstream-merge-11432

This commit is contained in:
Nadyr
2021-08-27 21:08:12 -04:00
committed by GitHub
340 changed files with 4322 additions and 2285 deletions
+1 -1
View File
@@ -6,6 +6,6 @@ export NODE_VERSION=12
# Byond Major
export BYOND_MAJOR=514
# Byond Minor
export BYOND_MINOR=1557
export BYOND_MINOR=1558
# Macro Count
export MACRO_COUNT=4
+2 -1
View File
@@ -16,7 +16,8 @@ Pipelines + Other Objects -> Pipe network
power_channel = ENVIRON
var/nodealert = 0
var/power_rating //the maximum amount of power the machine can use to do work, affects how powerful the machine is, in Watts
unacidable = TRUE
layer = ATMOS_LAYER
plane = PLATING_PLANE
@@ -238,9 +238,7 @@
if(amount <= 0)
amount = S.max_amount
var/ejected = min(round(stored_material[material_name] / S.perunit), amount)
S.amount = min(ejected, amount)
if(S.amount <= 0)
qdel(S)
if(!S.set_amount(min(ejected, amount)))
return
stored_material[material_name] -= ejected * S.perunit
if(recursive && stored_material[material_name] >= S.perunit)
@@ -256,7 +254,7 @@
var/max_res_amount = storage_capacity[S.material.name]
if(stored_material[S.material.name] + S.perunit <= max_res_amount)
var/count = 0
while(stored_material[S.material.name] + S.perunit <= max_res_amount && S.amount >= 1)
while(stored_material[S.material.name] + S.perunit <= max_res_amount && S.get_amount() >= 1)
stored_material[S.material.name] += S.perunit
S.use(1)
count++
@@ -6,6 +6,7 @@
icon = 'icons/obj/power.dmi'
icon_state = "circ-unassembled"
anchored = FALSE
unacidable = TRUE
pipe_flags = PIPING_DEFAULT_LAYER_ONLY|PIPING_ONE_PER_TURF
var/kinetic_efficiency = 0.04 //combined kinetic and kinetic-to-electric efficiency
+2 -1
View File
@@ -24,4 +24,5 @@
#define CAT_SPAGHETTI "Spaghettis"
#define CAT_ICE "Frozen"
#define CAT_DRINK "Drinks"
#define CAT_CHEMISTRY "Chemistry"
#define CAT_CHEMISTRY "Chemistry"
#define CAT_TOOL "Tool"
+3 -1
View File
@@ -36,6 +36,7 @@
#define MAT_LEATHER "leather"
#define MAT_CHITIN "chitin"
#define MAT_CLOTH "cloth"
#define MAT_FUR "fur"
#define MAT_SYNCLOTH "syncloth"
#define MAT_FIBERS "fibers"
#define MAT_COPPER "copper"
@@ -47,6 +48,7 @@
#define MAT_PAINITE "painite"
#define MAT_BOROSILICATE "borosilicate glass"
#define MAT_SANDSTONE "sandstone"
#define MAT_FLINT "flint"
#define DEFAULT_TABLE_MATERIAL MAT_PLASTIC
#define DEFAULT_WALL_MATERIAL MAT_STEEL
@@ -73,4 +75,4 @@
///if the user won't receive a warning when attacking the container with an unallowed item.
#define MATCONTAINER_SILENT (1<<3)
#define GET_MATERIAL_REF(arguments...) _GetMaterialRef(list(##arguments))
#define GET_MATERIAL_REF(arguments...) _GetMaterialRef(list(##arguments))
+1
View File
@@ -4,6 +4,7 @@
#define NUM_E 2.71828183
#define SQRT_2 (1.41421356237) //CHOMPEDIT
#define M_PI (3.14159265)
#define INFINITY (1.#INF) //closer then enough
+3
View File
@@ -13,6 +13,9 @@ var/global/list/active_ghost_pods = list()
var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference")
// Used by the ban panel to determine what departments are offmap departments. All these share an 'offmap roles' ban.
var/global/list/offmap_departments = list(DEPARTMENT_TALON)
// Closets have magic appearances
GLOBAL_LIST_EMPTY(closet_appearances)
+8 -9
View File
@@ -15,14 +15,13 @@
return FALSE // should stop you from dragging through windows
return TRUE
/atom/MouseDrop(atom/over)
if(!usr || !over) return
if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows
/atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params)
if(!usr || !over)
return
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows
spawn(0)
over.MouseDrop_T(src,usr)
return
INVOKE_ASYNC(over, /atom/.proc/MouseDrop_T, src, usr, src_location, over_location, src_control, over_control, params)
// recieve a mousedrop
/atom/proc/MouseDrop_T(atom/dropping, mob/user)
return
/atom/proc/MouseDrop_T(atom/dropping, mob/user, src_location, over_location, src_control, over_control, params)
return
+9
View File
@@ -298,6 +298,9 @@ var/list/gamemode_cache = list()
var/static/list/jukebox_track_files
var/static/suggested_byond_version
var/static/suggested_byond_build
/datum/configuration/New()
var/list/L = subtypesof(/datum/game_mode)
@@ -958,6 +961,12 @@ var/list/gamemode_cache = list()
if("jukebox_track_files")
config.jukebox_track_files = splittext(value, ";")
if("suggested_byond_version")
config.suggested_byond_version = text2num(value)
if("suggested_byond_build")
config.suggested_byond_build = text2num(value)
// VOREStation Edit Start - Can't be in _vr file because it is loaded too late.
if("vgs_access_identifier")
config.vgs_access_identifier = value
+1 -1
View File
@@ -9,7 +9,7 @@ SUBSYSTEM_DEF(ticker)
flags = SS_NO_TICK_CHECK | SS_KEEP_TIMING
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME // Every runlevel!
var/const/restart_timeout = 3 MINUTES // Default time to wait before rebooting in desiseconds.
var/const/restart_timeout = 4 MINUTES // Default time to wait before rebooting in desiseconds.
var/current_state = GAME_STATE_INIT // We aren't even at pregame yet // TODO replace with CURRENT_GAME_STATE
/* Relies upon the following globals (TODO move those in here) */
+7 -7
View File
@@ -135,7 +135,7 @@
LAZYADDASSOCLIST(.["instances"], item.type, item)
if(istype(item, /obj/item/stack))
var/obj/item/stack/stack = item
.["other"][item.type] += stack.amount
.["other"][item.type] += stack.get_amount()
else if(item.tool_qualities)
.["tool_qualities"] |= item.tool_qualities
.["other"][item.type] += 1
@@ -297,20 +297,20 @@
var/obj/item/stack/SD
while(amt > 0)
S = locate(path_key) in surroundings
if(S.amount >= amt)
if(S.get_amount() >= amt)
if(!locate(S.type) in Deletion)
SD = new S.type()
Deletion += SD
S.use(amt)
SD = locate(S.type) in Deletion
SD.amount += amt
SD.add(amt)
continue main_loop
else
amt -= S.amount
amt -= S.get_amount()
if(!locate(S.type) in Deletion)
Deletion += S
else
data = S.amount
data = S.get_amount()
S = locate(S.type) in Deletion
S.add(data)
surroundings -= S
@@ -334,8 +334,8 @@
continue
else if(istype(part, /obj/item/stack))
var/obj/item/stack/ST = locate(part) in Deletion
if(ST.amount > partlist[part])
ST.amount = partlist[part]
if(ST.get_amount() > partlist[part])
ST.set_amount(partlist[part])
. += ST
Deletion -= ST
continue
@@ -11,3 +11,27 @@
reqs = list(/obj/item/stack/material/cloth = 2)
time = 40
category = CAT_PRIMAL
/*
* Clothing
*/
/datum/crafting_recipe/primitive_clothes
name = "primitive clothes"
result = /obj/item/clothing/under/primitive
reqs = list(
/obj/item/stack/material/fiber = 4,
/obj/item/stack/material/cloth = 6
)
time = 90
category = CAT_CLOTHING
/datum/crafting_recipe/primitive_shoes
name = "primitive shoes"
result = /obj/item/clothing/shoes/primitive
reqs = list(
/obj/item/stack/material/fiber = 2,
/obj/item/stack/material/cloth = 3
)
time = 60
category = CAT_CLOTHING
@@ -0,0 +1,126 @@
/datum/crafting_recipe/shovel
name = "Wooden Shovel"
result = /obj/item/weapon/shovel/wood
reqs = list(
/obj/item/stack/material/stick = 5,
/obj/item/stack/material/wood = 1,
/obj/item/stack/material/fiber = 3,
/obj/item/stack/material/flint = 1
)
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/stoneblade
name = "stone blade"
result = /obj/item/weapon/material/knife/stone
reqs = list(
/obj/item/stack/material/flint = 2
)
time = 60
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/stonewoodknife
name = "stone knife"
result = /obj/item/weapon/material/knife/stone/wood
reqs = list(
/obj/item/weapon/material/knife/stone = 1,
/obj/item/stack/material/flint = 1,
/obj/item/stack/material/wood = 1,
/obj/item/stack/material/fiber = 3
)
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/stoneboneknife
name = "stone knife"
result = /obj/item/weapon/material/knife/stone/bone
reqs = list(
/obj/item/weapon/material/knife/stone = 1,
/obj/item/stack/material/flint = 1,
/obj/item/weapon/bone = 1,
/obj/item/stack/material/fiber = 3
)
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/woodbucket
name = "wooden bucket"
result = /obj/item/weapon/reagent_containers/glass/bucket/wood
reqs = list(
/obj/item/stack/material/wood = 1,
/obj/item/stack/material/stick = 1,
/obj/item/stack/material/fiber = 2
)
time = 60
category = CAT_TOOL
/datum/crafting_recipe/sticks
name = "sticks"
result = /obj/item/stack/material/stick/fivestack
reqs = list(/obj/item/stack/material/wood = 1)
tool_paths = list(/obj/item/weapon/material/knife)
time = 200
category = CAT_MISC
/datum/crafting_recipe/stonewoodaxe
name = "stone axe"
result = /obj/item/weapon/material/knife/machete/hatchet/stone
reqs = list(
/obj/item/weapon/material/knife/stone = 1,
/obj/item/stack/material/flint = 1,
/obj/item/stack/material/stick = 10,
/obj/item/stack/material/fiber = 3
)
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/stoneboneaxe
name = "stone axe"
result = /obj/item/weapon/material/knife/machete/hatchet/stone/bone
reqs = list(
/obj/item/weapon/material/knife/stone = 1,
/obj/item/stack/material/flint = 1,
/obj/item/weapon/bone = 1,
/obj/item/stack/material/fiber = 3
)
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/stonewoodspear
name = "stone spear"
result = /obj/item/weapon/material/twohanded/spear/flint
reqs = list(
/obj/item/weapon/material/knife/stone = 1,
/obj/item/stack/material/flint = 1,
/obj/item/stack/material/wood = 2,
/obj/item/stack/material/fiber = 3
)
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/stonebonespear
name = "stone spear"
result = /obj/item/weapon/material/twohanded/spear/flint
reqs = list(
/obj/item/weapon/material/knife/stone = 1,
/obj/item/stack/material/flint = 1,
/obj/item/weapon/bone = 2,
/obj/item/stack/material/fiber = 3
)
time = 120
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/ropebindings
name = "rope bindings"
result = /obj/item/weapon/handcuffs/cable/plantfiber
reqs = list(/obj/item/stack/material/fiber = 3)
time = 60
category = CAT_MISC
+6 -1
View File
@@ -52,6 +52,11 @@
/// Send async alerts and ask for responses. Expects you to have tested D for client and type already
/datum/ghost_query/proc/ask_question(var/mob/observer/dead/D)
//VOREStation Add Start Check the ban status before we ask
if(jobban_isbanned(D, "GhostRoles"))
return
//VOREStation Add End
var/client/C = D.client
window_flash(C)
@@ -67,7 +72,7 @@
return
// Unhandled are "No" and "Nevermind" responses, which should just do nothing
// This response is always fine, doesn't warrant retesting
switch(response)
if("Never for this round")
+1 -1
View File
@@ -52,7 +52,7 @@
name = OUTFIT_COSTUME("Cowboy")
uniform = /obj/item/clothing/under/pants{ starting_accessories=list(/obj/item/clothing/accessory/holster/hip) }
shoes = /obj/item/clothing/shoes/boots/cowboy
head = /obj/item/clothing/head/cowboy_hat
head = /obj/item/clothing/head/cowboy
gloves = /obj/item/clothing/gloves/fingerless
suit = /obj/item/clothing/accessory/poncho
r_hand = /obj/item/weapon/gun/projectile/revolver/capgun
+4 -2
View File
@@ -296,8 +296,10 @@
/obj/item/clothing/accessory/collar/spike,
/obj/item/clothing/gloves/fingerless,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/head/cowboy_hat,
/obj/item/clothing/head/cowboy_hat/black
/obj/item/clothing/head/cowboy,
/obj/item/clothing/head/cowboy/bandit,
/obj/item/clothing/accessory/cowboy_vest/brown,
/obj/item/clothing/accessory/cowboy_vest/grey
)
cost = 50
containertype = /obj/structure/closet/crate
+1 -1
View File
@@ -70,7 +70,7 @@
if(.)
var/obj/item/stack/S = product
if(istype(S))
amount += S.amount
amount += S.get_amount()
/datum/stored_item/stack/get_product(var/product_location, var/count)
if(!LAZYLEN(instances))
+1
View File
@@ -70,6 +70,7 @@ var/datum/antagonist/raider/raiders
/obj/item/weapon/gun/energy/mindflayer,
/obj/item/weapon/gun/energy/toxgun,
/obj/item/weapon/gun/energy/stunrevolver,
/obj/item/weapon/gun/energy/stunrevolver/vintage,
/obj/item/weapon/gun/energy/ionrifle,
/obj/item/weapon/gun/energy/taser,
/obj/item/weapon/gun/energy/crossbow/largecrossbow,
+13 -14
View File
@@ -9,8 +9,7 @@
var/on = 0
/obj/machinery/cablelayer/New()
cable = new(src)
cable.amount = 100
cable = new(src, 100)
..()
/obj/machinery/cablelayer/Moved(atom/old_loc, direction, forced = FALSE)
@@ -36,32 +35,32 @@
return
if(O.is_wirecutter())
if(cable && cable.amount)
var/m = round(input(usr,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
m = min(m, cable.amount)
if(cable && cable.get_amount())
var/m = round(input(usr, "Please specify the length of cable to cut", "Cut cable", min(cable.get_amount(), 30)) as num, 1)
m = min(m, cable.get_amount())
m = min(m, 30)
if(m)
playsound(src, O.usesound, 50, 1)
use_cable(m)
var/obj/item/stack/cable_coil/CC = new (get_turf(src))
CC.amount = m
CC.set_amount(m)
else
to_chat(usr, "<span class='warning'>There's no more cable on the reel.</span>")
/obj/machinery/cablelayer/examine(mob/user)
. = ..()
. += "[src]'s cable reel has [cable.amount] length\s left."
. += "[src]'s cable reel has [cable.get_amount()] length\s left."
/obj/machinery/cablelayer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
if(istype(CC) && CC.amount)
var/cur_amount = cable? cable.amount : 0
if(istype(CC) && CC.get_amount())
var/cur_amount = cable ? cable.get_amount() : 0
var/to_load = max(max_cable - cur_amount,0)
if(to_load)
to_load = min(CC.amount, to_load)
to_load = min(CC.get_amount(), to_load)
if(!cable)
cable = new(src)
cable.amount = 0
cable.amount += to_load
cable = new(src, to_load)
else
cable.add(to_load)
CC.use(to_load)
return to_load
else
@@ -69,7 +68,7 @@
return
/obj/machinery/cablelayer/proc/use_cable(amount)
if(!cable || cable.amount<1)
if(!cable || cable.get_amount() < 1)
visible_message("A red light flashes on \the [src].")
return
cable.use(amount)
+1
View File
@@ -5,6 +5,7 @@
icon_state = "table2-idle"
density = TRUE
anchored = TRUE
unacidable = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 1
active_power_usage = 5
+2
View File
@@ -6,6 +6,7 @@
var/obj/machinery/sleeper/sleeper
anchored = TRUE //About time someone fixed this.
density = TRUE //VOREStation Edit - Big console
unacidable = TRUE
dir = 8
use_power = USE_POWER_IDLE
idle_power_usage = 40
@@ -89,6 +90,7 @@
icon_state = "sleeper_0"
density = TRUE
anchored = TRUE
unacidable = TRUE
circuit = /obj/item/weapon/circuitboard/sleeper
var/mob/living/carbon/human/occupant = null
var/list/available_chemicals = list()
+2
View File
@@ -8,6 +8,7 @@
icon_state = "body_scanner_0"
density = TRUE
anchored = TRUE
unacidable = TRUE
circuit = /obj/item/weapon/circuitboard/body_scanner
use_power = USE_POWER_IDLE
idle_power_usage = 60
@@ -547,6 +548,7 @@
dir = 8
density = FALSE
anchored = TRUE
unacidable = TRUE
circuit = /obj/item/weapon/circuitboard/scanner_console
var/printing = null
+1
View File
@@ -36,6 +36,7 @@
layer = ABOVE_WINDOW_LAYER
vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature
anchored = TRUE
unacidable = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 80
active_power_usage = 1000 //For heating/cooling rooms. 1000 joules equates to about 1 degree every 2 seconds for a single tile of air.
+1 -1
View File
@@ -223,7 +223,7 @@
if(multiplier > 1)
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
S.amount = multiplier
S.set_amount(multiplier)
else
for(multiplier; multiplier > 1; --multiplier) // Create multiple items if it's not a stack.
I = new making.path(src.loc)
+1 -2
View File
@@ -183,8 +183,7 @@
points -= cost
if(ispath(bi.equipment_path, /obj/item/stack))
var/obj/item/stack/S = new bi.equipment_path(loc)
S.amount = bi.equipment_amt
new bi.equipment_path(loc, bi.equipment_amt)
playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
return TRUE
@@ -323,8 +323,7 @@
SStgui.update_uis(src)
if(ispath(bi.equipment_path, /obj/item/stack))
var/obj/item/stack/S = new bi.equipment_path(loc)
S.amount = bi.equipment_amt
new bi.equipment_path(loc, bi.equipment_amt)
playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
return TRUE
@@ -355,4 +354,4 @@
/obj/machinery/casino_prize_dispenser/process() //Might not need this, but just to be safe for now
if(stat & (BROKEN|NOPOWER))
return
return
+2 -2
View File
@@ -1,6 +1,7 @@
/obj/structure/AIcore
density = TRUE
anchored = FALSE
unacidable = TRUE
name = "\improper AI core"
icon = 'icons/mob/AI.dmi'
icon_state = "0"
@@ -85,8 +86,7 @@
to_chat(user, "<span class='notice'>You remove the cables.</span>")
state = 2
icon_state = "2"
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
A.amount = 5
new /obj/item/stack/cable_coil(loc, 5)
if(istype(P, /obj/item/stack/material) && P.get_material_name() == "rglass")
var/obj/item/stack/RG = P
+1 -1
View File
@@ -20,7 +20,7 @@
/obj/item/toy/cultsword = 1,
/obj/item/toy/bouquet/fake = 1,
/obj/item/clothing/accessory/badge/sheriff = 2,
/obj/item/clothing/head/cowboy_hat/small = 2,
/obj/item/clothing/head/cowboy/small = 2,
/obj/item/toy/stickhorse = 2
)
var/list/special_prizes = list() // Holds instanced objects, intended for admins to shove surprises inside or something.
+2 -2
View File
@@ -1,5 +1,5 @@
/obj/machinery/computer/arcade
prizes = list( /obj/item/weapon/storage/box/snappops = 2,
prizes = list( /obj/item/weapon/storage/box/snappops = 2,
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
@@ -15,7 +15,7 @@
/obj/item/toy/cultsword = 1,
/obj/item/toy/bouquet/fake = 1,
/obj/item/clothing/accessory/badge/sheriff = 2,
/obj/item/clothing/head/cowboy_hat/small = 2,
/obj/item/clothing/head/cowboy/small = 2,
/obj/item/toy/stickhorse = 2,
/obj/item/toy/rock = 2,
/obj/item/toy/flash = 2,
+1
View File
@@ -4,6 +4,7 @@
icon_state = "computer"
density = TRUE
anchored = TRUE
unacidable = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 300
active_power_usage = 300
+1
View File
@@ -194,6 +194,7 @@
icon_state = "cryopod_0" //VOREStation Edit - New Icon
density = TRUE
anchored = TRUE
unacidable = TRUE
dir = WEST
var/base_icon_state = "cryopod_0" //VOREStation Edit - New Icon
+1 -1
View File
@@ -189,7 +189,7 @@
to_chat(user, "<span class='notice'>\The [src] is already fully repaired.</span>")
return
var/obj/item/stack/P = C
if(P.amount < amt)
if(P.get_amount() < amt)
to_chat(user, "<span class='warning'>You don't have enough sheets to repair this! You need at least [amt] sheets.</span>")
return
to_chat(user, "<span class='notice'>You begin repairing [src]...</span>")
+1 -2
View File
@@ -277,8 +277,7 @@
if(repairing && I.is_crowbar())
var/datum/material/mat = get_material()
var/obj/item/stack/material/repairing_sheet = mat.place_sheet(loc)
repairing_sheet.amount += repairing-1
var/obj/item/stack/material/repairing_sheet = mat.place_sheet(loc, repairing)
repairing = 0
to_chat(user, "<span class='notice'>You remove \the [repairing_sheet].</span>")
playsound(src, I.usesound, 100, 1)
+1 -2
View File
@@ -90,8 +90,7 @@
return TRUE
if(reinforcing && I.is_crowbar())
var/obj/item/stack/material/plasteel/reinforcing_sheet = new /obj/item/stack/material/plasteel(src.loc)
reinforcing_sheet.amount = reinforcing
var/obj/item/stack/material/plasteel/reinforcing_sheet = new /obj/item/stack/material/plasteel(src.loc, reinforcing)
reinforcing = 0
to_chat(user, "<span class='notice'>You remove \the [reinforcing_sheet].</span>")
playsound(src, I.usesound, 100, 1)
+1
View File
@@ -15,6 +15,7 @@ FIRE ALARM
var/timing = 0.0
var/lockdownbyai = 0
anchored = TRUE
unacidable = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 2
active_power_usage = 6
+4 -6
View File
@@ -514,9 +514,8 @@
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CP = P
if(CP.get_amount() > 1)
var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src)
CC.amount = camt
var/camt = min(CP.get_amount(), req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src, camt)
CC.update_icon()
CP.use(camt)
components += CC
@@ -587,9 +586,8 @@
if(istype(P, /obj/item/stack))
var/obj/item/stack/ST = P
if(ST.get_amount() > 1)
var/camt = min(ST.amount, req_components[I]) // amount of stack to take, idealy amount required, but limited by amount provided
var/obj/item/stack/NS = new ST.stacktype(src)
NS.amount = camt
var/camt = min(ST.get_amount(), req_components[I]) // amount of stack to take, idealy amount required, but limited by amount provided
var/obj/item/stack/NS = new ST.stacktype(src, camt)
NS.update_icon()
ST.use(camt)
components += NS
+1 -2
View File
@@ -71,8 +71,7 @@
to_chat(user, "<span class='notice'>You start to dismantle the IV drip.</span>")
if(do_after(user, 15))
to_chat(user, "<span class='notice'>You dismantle the IV drip.</span>")
var/obj/item/stack/rods/A = new /obj/item/stack/rods(src.loc)
A.amount = 6
new /obj/item/stack/rods(src.loc, 6)
if(beaker)
beaker.loc = get_turf(src)
beaker = null
+4 -6
View File
@@ -125,12 +125,12 @@
if(!(S.material.name in materials))
to_chat(user, "<span class='warning'>The [src] doesn't accept [S.material]!</span>")
return 1
if(S.amount < 1)
if(S.get_amount() < 1)
return 1 // Does this even happen? Sanity check I guess.
var/max_res_amount = storage_capacity[S.material.name]
if(materials[S.material.name] + S.perunit <= max_res_amount)
var/count = 0
while(materials[S.material.name] + S.perunit <= max_res_amount && S.amount >= 1)
while(materials[S.material.name] + S.perunit <= max_res_amount && S.get_amount() >= 1)
materials[S.material.name] += S.perunit
S.use(1)
count++
@@ -205,7 +205,7 @@
// 0 amount = 0 means ejecting a full stack; -1 means eject everything
/obj/machinery/partslathe/proc/eject_materials(var/material, var/amount)
var/recursive = amount == -1 ? 1 : 0
var/recursive = amount == -1 ? TRUE : FALSE
material = lowertext(material)
var/mattype
switch(material)
@@ -219,9 +219,7 @@
if(amount <= 0)
amount = S.max_amount
var/ejected = min(round(materials[material] / S.perunit), amount)
S.amount = min(ejected, amount)
if(S.amount <= 0)
qdel(S)
if(!S.set_amount(min(ejected, amount)))
return
materials[material] -= ejected * S.perunit
if(recursive && materials[material] >= S.perunit)
@@ -5,6 +5,7 @@
icon_state = "pipe_d"
density = TRUE
anchored = TRUE
unacidable = TRUE
var/unwrenched = 0
var/wait = 0
var/p_layer = PIPING_LAYER_REGULAR
+3 -4
View File
@@ -146,10 +146,9 @@
var/amount_ejected = 0
while (metal >= 1)
var/datum/material/M = get_material_by_name(MAT_STEEL)
var/obj/item/stack/material/S = new M.stack_type(get_turf(src))
S.amount = min(metal, S.max_amount)
metal -= S.amount
amount_ejected += S.amount
var/obj/item/stack/material/S = new M.stack_type(get_turf(src), metal)
metal -= S.get_amount()
amount_ejected += S.get_amount()
return amount_ejected
/obj/machinery/pipelayer/proc/dismantleFloor(var/turf/new_turf)
+1
View File
@@ -5,6 +5,7 @@
icon_state = "borgcharger0"
density = TRUE
anchored = TRUE
unacidable = TRUE
circuit = /obj/item/weapon/circuitboard/recharge_station
use_power = USE_POWER_IDLE
idle_power_usage = 50
+1 -1
View File
@@ -21,7 +21,7 @@
if(M)
if(!M.get_amount())
return
while(metal_amount < 150000 && M.amount)
while(metal_amount < 150000 && M.get_amount())
metal_amount += O.matter[MAT_STEEL] /*O:height * O:width * O:length * 100000.0*/
M.use(1)
count++
+1
View File
@@ -17,6 +17,7 @@
name = "status display"
anchored = TRUE
density = FALSE
unacidable = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 10
circuit = /obj/item/weapon/circuitboard/status_display
@@ -17,6 +17,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
/obj/machinery/telecomms
icon = 'icons/obj/stationobjs_vr.dmi' //VOREStation Add
unacidable = TRUE
var/list/links = list() // list of machines this machine is linked to
var/traffic = 0 // value increases as traffic increases
var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed)
+1
View File
@@ -13,6 +13,7 @@
icon_state = "control_standby"
anchored = TRUE
density = FALSE
unacidable = TRUE
var/enabled = FALSE
var/lethal = FALSE
var/lethal_is_configurable = TRUE
+2 -3
View File
@@ -67,11 +67,10 @@
//Tanning!
for(var/obj/item/stack/hairlesshide/HH in washing)
var/obj/item/stack/wetleather/WL = new(src)
WL.amount = HH.amount
var/obj/item/stack/wetleather/WL = new(src, HH.get_amount())
washing -= HH
HH.forceMove(get_turf(src))
HH.use(HH.amount)
HH.use(HH.get_amount())
washing += WL
+14 -16
View File
@@ -8,8 +8,7 @@
required_type = list(/obj/mecha/working)
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New()
cable = new(src)
cable.amount = 0
cable = new(src, 0)
..()
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/MoveAction()
@@ -38,13 +37,12 @@
log_message("[equip_ready?"Dea":"A"]ctivated.")
return
if(href_list["cut"])
if(cable && cable.amount)
var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1)
m = min(m, cable.amount)
if(cable && cable.get_amount())
var/m = round(input(chassis.occupant, "Please specify the length of cable to cut", "Cut cable", min(cable.get_amount(), 30)) as num, 1)
m = min(m, cable.get_amount())
if(m)
use_cable(m)
var/obj/item/stack/cable_coil/CC = new (get_turf(chassis))
CC.amount = m
new /obj/item/stack/cable_coil(get_turf(chassis), m)
else
occupant_message("There's no more cable on the reel.")
return
@@ -52,19 +50,19 @@
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info()
var/output = ..()
if(output)
return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- <a href='?src=\ref[src];toggle=1'>[!equip_ready?"Dea":"A"]ctivate</a>|<a href='?src=\ref[src];cut=1'>Cut</a>" : null]"
return "[output] \[Cable: [cable ? cable.get_amount() : 0] m\][(cable && cable.get_amount()) ? "- <a href='?src=\ref[src];toggle=1'>[!equip_ready?"Dea":"A"]ctivate</a>|<a href='?src=\ref[src];cut=1'>Cut</a>" : null]"
return
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC)
if(istype(CC) && CC.amount)
var/cur_amount = cable? cable.amount : 0
if(istype(CC) && CC.get_amount())
var/cur_amount = cable? cable.get_amount() : 0
var/to_load = max(max_cable - cur_amount,0)
if(to_load)
to_load = min(CC.amount, to_load)
to_load = min(CC.get_amount(), to_load)
if(!cable)
cable = new(src)
cable.amount = 0
cable.amount += to_load
cable = new(src, to_load)
else
cable.add(to_load)
CC.use(to_load)
return to_load
else
@@ -72,12 +70,12 @@
return
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount)
if(!cable || cable.amount<1)
if(!cable || cable.get_amount() < 1)
set_ready_state(TRUE)
occupant_message("Cable depleted, [src] deactivated.")
log_message("Cable depleted, [src] deactivated.")
return
if(cable.amount < amount)
if(cable.get_amount() < amount)
occupant_message("No enough cable to finish the task.")
return
cable.use(amount)
+8 -9
View File
@@ -18,8 +18,7 @@
/obj/item/mecha_parts/mecha_equipment/generator/Initialize()
. = ..()
fuel = new fuel_type(src)
fuel.amount = 0
fuel = new fuel_type(src, 0)
/obj/item/mecha_parts/mecha_equipment/generator/Destroy()
qdel(fuel)
@@ -29,7 +28,7 @@
if(!chassis)
set_ready_state(TRUE)
return PROCESS_KILL
if(fuel.amount<=0)
if(fuel.get_amount() <= 0)
log_message("Deactivated - no fuel.")
set_ready_state(TRUE)
return PROCESS_KILL
@@ -43,7 +42,7 @@
if(cur_charge<chassis.cell.maxcharge)
use_fuel = fuel_per_cycle_active
chassis.give_power(power_per_cycle)
fuel.amount -= min(use_fuel/fuel.perunit,fuel.amount)
fuel.set_amount(min(use_fuel/fuel.perunit, fuel.get_amount()), TRUE) // allows fuel to get to 0
update_equip_info()
/obj/item/mecha_parts/mecha_equipment/generator/detach()
@@ -68,7 +67,7 @@
/obj/item/mecha_parts/mecha_equipment/generator/get_equip_info()
var/output = ..()
if(output)
return "[output] \[[fuel]: [round(fuel.amount*fuel.perunit,0.1)] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate</a>"
return "[output] \[[fuel]: [round(fuel.get_amount()*fuel.perunit,0.1)] cm<sup>3</sup>\] - <a href='?src=\ref[src];toggle=1'>[(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate</a>"
return
/obj/item/mecha_parts/mecha_equipment/generator/action(target)
@@ -86,12 +85,12 @@
return
/obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(var/obj/item/stack/material/P)
if(P.type == fuel.type && P.amount)
var/to_load = max(max_fuel - fuel.amount*fuel.perunit,0)
if(P.type == fuel.type && P.get_amount())
var/to_load = max(max_fuel - fuel.get_amount()*fuel.perunit,0)
if(to_load)
var/units = min(max(round(to_load / P.perunit),1),P.amount)
var/units = min(max(round(to_load / P.perunit),1),P.get_amount())
if(units)
fuel.amount += units
fuel.add(units)
P.use(units)
return units
else
+36 -9
View File
@@ -451,6 +451,7 @@
if(..())
return
if(!allowed(user))
to_chat(user, SPAN_WARNING("\The [src] rejects your use due to lack of access!"))
return
tgui_interact(user)
@@ -665,18 +666,44 @@
visible_message("[bicon(src)] <b>[src]</b> beeps: \"No records in User DB\"")
/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
var/recursive = amount == -1 ? 1 : 0
var/recursive = amount == -1 ? TRUE : FALSE
var/matstring = lowertext(material)
var/datum/material/M = get_material_by_name(matstring)
var/obj/item/stack/material/S = M.place_sheet(get_turf(src))
if(amount <= 0)
amount = S.max_amount
var/ejected = min(round(materials[matstring] / S.perunit), amount)
S.amount = min(ejected, amount)
if(S.amount <= 0)
qdel(S)
// 0 or null, nothing to eject
if(!materials[matstring])
return
// Problem, fix problem and abort
if(materials[matstring] < 0)
warning("[src] tried to eject material '[material]', which it has 'materials[matstring]' of!")
materials[matstring] = 0
return
// Find the material datum for our material
var/datum/material/M = get_material_by_name(matstring)
if(!M)
warning("[src] tried to eject material '[matstring]', which didn't match any known material datum!")
return
// Find what type of sheets it makes
var/obj/item/stack/material/S = M.stack_type
if(!S)
warning("[src] tried to eject material '[matstring]', which didn't have a stack_type!")
return
// If we were passed -1, then it's recursive ejection and we should eject all we can
if(amount <= 0)
amount = initial(S.max_amount)
// Smaller of what we have left, or the desired amount (note the amount is in sheets, but the array stores perunit values)
var/ejected = min(round(materials[matstring] / initial(S.perunit)), amount)
// Place a sheet
S = M.place_sheet(get_turf(src), ejected)
if(!istype(S))
warning("[src] tried to eject material '[material]', which didn't generate a proper stack when asked!")
return
// Reduce our amount stored
materials[matstring] -= ejected * S.perunit
// Recurse if we have enough left for more sheets
if(recursive && materials[matstring] >= S.perunit)
eject_materials(matstring, -1)
+1
View File
@@ -5,6 +5,7 @@
desc = "A machine used for construction of prosthetics."
density = TRUE
anchored = TRUE
unacidable = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 20
active_power_usage = 5000
+24 -47
View File
@@ -190,8 +190,7 @@
holder.icon_state = "ripley4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "ripley2"
if(10)
if(diff==FORWARD)
@@ -238,8 +237,7 @@
holder.icon_state = "ripley10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/steel(get_turf(holder), 5)
holder.icon_state = "ripley8"
if(4)
if(diff==FORWARD)
@@ -261,8 +259,7 @@
holder.icon_state = "ripley13"
else
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/plasteel(get_turf(holder), 5)
holder.icon_state = "ripley11"
if(1)
if(diff==FORWARD)
@@ -425,8 +422,7 @@
holder.icon_state = "gygax4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "gygax2"
if(16)
if(diff==FORWARD)
@@ -521,8 +517,7 @@
holder.icon_state = "gygax16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/steel(get_turf(holder), 5)
holder.icon_state = "gygax14"
if(4)
if(diff==FORWARD)
@@ -709,8 +704,7 @@
holder.icon_state = "gygax4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "gygax2"
if(16)
if(diff==FORWARD)
@@ -805,8 +799,7 @@
holder.icon_state = "gygax16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You pry the internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/steel(get_turf(holder), 5)
holder.icon_state = "gygax14"
if(4)
if(diff==FORWARD)
@@ -829,8 +822,7 @@
holder.icon_state = "gygax19-s"
else
user.visible_message("[user] pries the external armor layer from [holder].", "You pry the external armor layer from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) // Fixes serenity giving Gygax Armor Plates for the reverse action...
MS.amount = 5
new /obj/item/stack/material/plasteel(get_turf(holder), 5) // Fixes serenity giving Gygax Armor Plates for the reverse action...
holder.icon_state = "gygax17"
if(1)
if(diff==FORWARD)
@@ -976,8 +968,7 @@
holder.icon_state = "fireripley4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "fireripley2"
if(11)
if(diff==FORWARD)
@@ -1024,8 +1015,7 @@
holder.icon_state = "fireripley10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/plasteel(get_turf(holder), 5)
holder.icon_state = "fireripley8"
if(5)
if(diff==FORWARD)
@@ -1047,8 +1037,7 @@
holder.icon_state = "fireripley13"
else
user.visible_message("[user] removes the external armor from [holder].", "You remove the external armor from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/plasteel(get_turf(holder), 5)
holder.icon_state = "fireripley11"
if(2)
if(diff==FORWARD)
@@ -1056,8 +1045,7 @@
holder.icon_state = "fireripley14"
else
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/plasteel(get_turf(holder), 5)
holder.icon_state = "fireripley12"
if(1)
if(diff==FORWARD)
@@ -1221,8 +1209,7 @@
holder.icon_state = "durand4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "durand2"
if(16)
if(diff==FORWARD)
@@ -1317,8 +1304,7 @@
holder.icon_state = "durand16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/steel(get_turf(holder), 5)
holder.icon_state = "durand14"
if(4)
if(diff==FORWARD)
@@ -1480,8 +1466,7 @@
holder.icon_state = "odysseus4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "odysseus2"
if(10)
if(diff==FORWARD)
@@ -1528,8 +1513,7 @@
holder.icon_state = "odysseus10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/steel(get_turf(holder), 5)
holder.icon_state = "odysseus8"
if(4)
if(diff==FORWARD)
@@ -1550,9 +1534,8 @@
user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
holder.icon_state = "odysseus13"
else
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
user.visible_message("[user] pries [MS] from [holder].", "You prie [MS] from [holder].")
new /obj/item/stack/material/plasteel(get_turf(holder), 5)
user.visible_message("[user] pries the plasteel from [holder].", "You prie the plasteel from [holder].")
holder.icon_state = "odysseus11"
if(1)
if(diff==FORWARD)
@@ -1715,8 +1698,7 @@
holder.icon_state = "phazon4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "phazon2"
if(16)
if(diff==FORWARD)
@@ -1811,8 +1793,7 @@
holder.icon_state = "phazon20"
else
user.visible_message("[user] pries the internal armor layer from [holder].", "You pry the internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/steel(get_turf(holder), 5)
holder.icon_state = "phazon14"
if(4)
if(diff==FORWARD)
@@ -1834,8 +1815,7 @@
holder.icon_state = "phazon23"
else
user.visible_message("[user] pries the external armor layer from [holder].", "You pry external armor layer from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/plasteel(get_turf(holder), 5)
holder.icon_state = "phazon21"
if(1)
if(diff==FORWARD)
@@ -2005,8 +1985,7 @@
holder.icon_state = "janus4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "janus2"
if(18)
if(diff==FORWARD)
@@ -2117,8 +2096,7 @@
holder.icon_state = "janus18"
else
user.visible_message("[user] pries the internal armor layer from [holder].", "You pry the internal armor layer from [holder].")
var/obj/item/stack/material/durasteel/MS = new /obj/item/stack/material/durasteel(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/durasteel(get_turf(holder), 5)
holder.icon_state = "janus16"
if(4)
if(diff==FORWARD)
@@ -2140,8 +2118,7 @@
holder.icon_state = "janus21"
else
user.visible_message("[user] pries the external armor layer from [holder].", "You pry external armor layer from [holder].")
var/obj/item/stack/material/morphium/MS = new /obj/item/stack/material/morphium(get_turf(holder))
MS.amount = 5
new /obj/item/stack/material/morphium(get_turf(holder), 5)
holder.icon_state = "janus19"
if(1)
if(diff==FORWARD)
@@ -145,8 +145,7 @@
holder.icon_state = "polecat4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "polecat2"
if(16)
if(diff==FORWARD)
@@ -241,8 +240,7 @@
holder.icon_state = "polecat16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 3
new /obj/item/stack/material/steel(get_turf(holder), 3)
holder.icon_state = "polecat14"
if(4)
if(diff==FORWARD)
@@ -402,8 +400,7 @@
holder.icon_state = "gopher4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "gopher2"
if(10)
if(diff==FORWARD)
@@ -450,8 +447,7 @@
holder.icon_state = "gopher10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 3
new /obj/item/stack/material/steel(get_turf(holder), 3)
holder.icon_state = "gopher8"
if(4)
if(diff==FORWARD)
@@ -473,8 +469,7 @@
holder.icon_state = "gopher13"
else
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 2
new /obj/item/stack/material/plasteel(get_turf(holder), 2)
holder.icon_state = "gopher11"
if(1)
if(diff==FORWARD)
@@ -635,8 +630,7 @@
holder.icon_state = "weasel4"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
new /obj/item/stack/cable_coil(get_turf(holder), 4)
holder.icon_state = "weasel2"
if(16)
if(diff==FORWARD)
@@ -731,8 +725,7 @@
holder.icon_state = "weasel16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 3
new /obj/item/stack/material/steel(get_turf(holder), 3)
holder.icon_state = "weasel14"
if(4)
if(diff==FORWARD)
@@ -754,8 +747,7 @@
holder.icon_state = "weasel19"
else
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 3
new /obj/item/stack/material/plasteel(get_turf(holder), 3)
holder.icon_state = "weasel17"
if(1)
if(diff==FORWARD)
+7 -4
View File
@@ -164,6 +164,7 @@
icon_state = "weeds"
anchored = TRUE
density = FALSE
unacidable = TRUE
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
@@ -396,16 +397,18 @@
qdel(src)
ticks += 1
if(ticks >= target_strength)
for(var/mob/O in hearers(src, null))
O.show_message("<span class='alium'>[src.target] collapses under its own weight into a puddle of goop and undigested debris!</span>", 1)
if(istype(target, /turf/simulated/wall)) // I hate turf code.
if(iswall(target))
var/turf/simulated/wall/W = target
W.dismantle_wall(1)
else
W.dismantle_wall()
else if(isfloor(target))
var/turf/simulated/floor/T = target
T.ex_act(1)
else if(isobj(target))
qdel(target)
qdel(src)
return
+17 -4
View File
@@ -954,6 +954,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
#define CELLS 8 //Amount of cells per row/column in grid
#define CELLSIZE (world.icon_size/CELLS) //Size of a cell in pixels
/*
Automatic alignment of items to an invisible grid, defined by CELLS and CELLSIZE.
Since the grid will be shifted to own a cell that is perfectly centered on the turf, we end up with two 'cell halves'
@@ -968,7 +969,7 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen
/obj/item/var/list/center_of_mass = list("x" = 16,"y" = 16)
/proc/auto_align(obj/item/W, click_parameters)
/proc/auto_align(obj/item/W, click_parameters, var/animate = FALSE)
if(!W.center_of_mass)
W.randpixel_xy()
return
@@ -985,8 +986,20 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen
var/cell_x = max(0, min(CELLS-1, round(mouse_x/CELLSIZE)))
var/cell_y = max(0, min(CELLS-1, round(mouse_y/CELLSIZE)))
W.pixel_x = (CELLSIZE * (0.5 + cell_x)) - W.center_of_mass["x"]
W.pixel_y = (CELLSIZE * (0.5 + cell_y)) - W.center_of_mass["y"]
var/target_x = (CELLSIZE * (0.5 + cell_x)) - W.center_of_mass["x"]
var/target_y = (CELLSIZE * (0.5 + cell_y)) - W.center_of_mass["y"]
if(animate)
var/dist_x = abs(W.pixel_x - target_x)
var/dist_y = abs(W.pixel_y - target_y)
var/dist = sqrt((dist_x*dist_x)+(dist_y*dist_y))
animate(W, pixel_x=target_x, pixel_y=target_y,time=dist*0.5)
else
W.pixel_x = target_x
W.pixel_y = target_y
#undef CELLS
#undef CELLSIZE
#undef CELLSIZE
// this gets called when the item gets chucked by the vending machine
/obj/item/proc/vendor_action(var/obj/machinery/vending/V)
return
+1 -2
View File
@@ -29,8 +29,7 @@
to_chat(user, "<span class='warning'>There is another network terminal here.</span>")
return
else
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc)
C.amount = 10
new /obj/item/stack/cable_coil(loc, 10)
to_chat(user, "You cut the cables and disassemble the unused power terminal.")
qdel(T)
new /obj/machinery/power/apc(loc, ndir, 1)
-1
View File
@@ -26,7 +26,6 @@
closet_appearance = null
open_sound = 'sound/items/zip.ogg'
close_sound = 'sound/items/zip.ogg'
door_anim_time = 0 //Unsupported
var/item_path = /obj/item/bodybag
density = FALSE
storage_capacity = (MOB_MEDIUM * 2) - 1
+1
View File
@@ -13,6 +13,7 @@
throwforce = 6
preserve_item = 1
w_class = ITEMSIZE_LARGE
unacidable = TRUE
origin_tech = list(TECH_BIO = 4, TECH_POWER = 2)
action_button_name = "Remove/Replace Paddles"
@@ -43,7 +43,9 @@
/mob/living/simple_mob/attack_ghost(mob/observer/dead/user as mob)
if(!ghostjoin)
return ..()
if(jobban_isbanned(user, "GhostRoles"))
to_chat(user, "<span class='warning'>You cannot inhabit this creature because you are banned from playing ghost roles.</span>")
return
if(!evaluate_ghost_join(user))
return ..()
@@ -16,7 +16,7 @@
var/obj/item/device/encryptionkey/keyslot2 = null
var/ks1type = null
var/ks2type = null
drop_sound = 'sound/items/drop/component.ogg'
pickup_sound = 'sound/items/pickup/component.ogg'
@@ -62,10 +62,12 @@
/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
if (aiOverride)
playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
return ..(freq, level)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
if(H.l_ear == src || H.r_ear == src)
playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
return ..(freq, level)
return -1
+97
View File
@@ -0,0 +1,97 @@
/obj/item/tabloid
name = "tabloid magazine"
desc = "It's one of those trashy tabloid magazines. It looks pretty out of date."
icon = 'icons/obj/magazine.dmi'
icon_state = "magazine"
var/headline
var/static/list/tabloid_states = icon_states('icons/obj/magazine.dmi')
var/static/list/tabloid_publishers = list(
"\improper Solar Enquirer",
"\improper Stellar Examiner",
"\improper Antares Daily",
"\improper Weekly Galactic News",
"\improper Spiral"
)
var/static/list/tabloid_headlines = list(
"NARCOALGORITHMS: ARE YOUR CHILDREN SAFE?",
"ARE GMO HUMANS POISONOUS IN BED?",
"TOP 10 REASONS WHY OTHER SPECIES ARE A HOAX",
"CENTENNIAL POSITRONIC EXTENDS LIFESPAN WITH 1 SIMPLE TRICK",
"TOP 10 DANGEROUS FOODS WITH CHEMICALS",
"NEW TERRIFYING TEEN TREND: SUN-DIVING",
"HAS YOUR SPOUSE BEEN REPLACED BY AN ALIEN IMPOSTER? STUDIES SUGGEST YES!",
"SPACE CAUSES CANCER: DOCTORS CONFIRM",
"ARE BODY SCANNERS TOO INVASIVE? FIND OUT INSIDE!",
"HAS SCIENCE GONE TOO FAR? LOCAL SCIENTIST DEBUNKS ALIEN THEORY, DECRIES THEM AS TUBE EXPERIMENTS GONE WRONG",
"100 DELICIOUS RECIPES LETHAL TO CARBON-BASED LIFE",
"TOP FIVE SPECIES WE DROVE TO EXTINCTION; NUMBER TWO WILL SHOCK YOU",
"LOCAL MAN HAS SEIZURE AFTER SAYING SKRELLIAN NAME; FORCED ASSIMILATION SOON?",
"RELIGION WAS RIGHT? SHOCK FINDINGS SHOW ALIEN SIMILARITY TO ANIMALS, EXISTENCE OF BOATS",
"TOP TEN REASONS WHY ONLY HUMANS ARE SENTIENT",
"LOCAL UNATHI SYMPATHIZER: 'I really think you should stop with these spacebaiting articles.'",
"DO UNATHI SYMPATHIZERS HATE THE HUMAN RACE?",
"WHICH PLANET HAS THE BEST LOVERS? THIS AND MORE INSIDE!",
"SHE SAID WE SHOULD SEE OTHER PEOPLE, SO I MARRIED A TESHARI PACK: FULL STORY INSIDE",
"LOSE WEIGHT THREE TIMES FASTER WITH THESE LOW-G MANEUVERS!",
"SHOCKING FIGURES REVEAL MORE TEENS DIE TO UNATHI HONOUR DUELS THAN GUN VIOLENCE",
"MY DAUGHTER JOINED A NEURAL COLLECTIVE AND NOW SHE CAN TASTE SPACETIME: FULL STORY INSIDE",
"WERE THE NAZIS PSYCHIC? ONE HISTORIAN TELLS ALL",
"TAJARANS: CUTE AND CUDDLY, OR INFILTRATING THE GOVERNMENT? FIND OUT MORE INSIDE",
"IS THE SOLAR GOVERNMENT CREATING AN AI SUPERINTELLIGENCE NEAR MERCURY? ONE EXPERT REVEALS SHOCKING INSIDER DETAILS!",
"TOP TEN HISTORICAL FIGURES THAT WERE TWO PROMETHEANS IN A TRENCHCOAT",
"ZADDAT: FACT OR FICTION?",
"TOP 10 SECRET AUGMENTS THE GOVERNMENT DOESN'T WANT YOU TO GET",
"ENLARGE YOUR MENTAL FACULTIES WITH THIS 1 WEIRD HAT",
"'HELP, MY SON THINKS HE'S A 20TH CENTURY VID CHARACTER CALLED SPOCK' AND MORE SHOCKING TALES INSIDE",
"18 RADICAL HIP IMPLANTS ALL THE KIDS ARE GETTING!",
"PRESERVED HEAD OF 21ST CENTURY CAPITALIST INSISTS THAT 'DYSON WALL' ONLY SANE SOLUTION TO RIMWARD MALCONTENTS",
"50 SHADES OF GREEN; BESTSELLING MULTISPECIES ROMANCE COMING TO CINEMAS",
"PLUTO: DWARF PLANET, OR SECRET RAMPANT AI FACILITY HELL-BENT ON CORRUPTING YOUR CHILDREN?",
"TOP TEN ANIME ALIENS. NUMBER 3 WILL SICKEN YOU",
"OCTUBER X'RALLBRE EXPOSED; NUDE PHOTOSHOOT LEAKS",
"WAR ON MARS AFTER NAKED MAN WAS FOUND; WERE THE ROMANS RIGHT?",
"REAL ALIENS ARGUE EARTH MOVIES RACIST!",
"HELP! I MARRIED A HEGEMONOUS SWARM INTELLIGENCE AND MY SON THINKS HE'S A ROUTER!",
"POSITRONICS: HUMAN INGENUITY AND GENEROSITY, OR A HORRIBLE MISTAKE? FIND OUT INSIDE!",
"TENTACLES OF TERROR: SKRELL BLACK OPS SEIGE NYX NAVAL DEPOT. SHOCKING PHOTOGRAPHS INSIDE!",
"THE FREE TRADER UNION: NEITHER FREE NOR A UNION. SHOCKING EXPOSE!",
"HAS THE FREE MARKET GONE TOO FAR? LUNA GLITTERPOP STAR AUCTIONS THIRD TESTICLE FOR TRANS-ORBITAL SHIPPING BONDS",
"THEY SAID IT WAS CANCER, BUT I KNEW IT WAS A TINY, SELF-REPLICATING CLONE OF RAY KURZWEIL: FULL STORY INSIDE",
"WHAT HAS TECHNOLOGY DONE? INDUSTRY BILLIONAIRE MARRIES OWN INFORMORPH MIND-COPY",
"REPTILLIAN ICE WARRIORS FROM ANOTHER WORLD LIVE INSIDE YOUR AIR DUCTS: HERE'S HOW TO GET RID OF THEM",
"10 CRITICAL THINGS YOU NEED TO KNOW ABOUT 'DRONEGATE'",
"THEY CALL THEM JUMPGATES BUT I'VE NEVER SEEN THEM JUMP: AN INDUSTRY INSIDER SPEAKS FOR THE FIRST TIME",
"EMERGENT INTELLIGENCES ARE STEALING YOUR BANK DETAILS, FETISHES: FOIL HAT RECIPE INSIDE",
"TIME TRAVELLERS ARE STEALING YOUR WIFI: 5 TIPS FOR DEFEATING HACKERS FROM THE FUTURE",
"'My mother was an alien spy': THIS CELEBRITY REVEAL WILL SHOCK AND AMAZE YOU",
"LUMINARY SCIENTIST SPEAKS: DIABETES IS A HYPERCORP RETROVIRUS!",
"'I REROUTED MY NEURAL CIRCUITRY SO THAT PAIN TASTES OF STRAWBERRIES' AND FIFTEEN OTHER CRAZY ALMACH STORIES",
"JOINING THE NAVY? HERE'S 15 EXPERT TIPS FOR AVOIDING BRAIN PARASITES"
)
/obj/item/tabloid/Initialize()
. = ..()
pixel_x = 5-rand(10)
pixel_x = 5-rand(10)
icon_state = pick(tabloid_states)
headline = pick(tabloid_headlines)
name = pick(tabloid_publishers)
/obj/item/tabloid/examine(mob/user, distance)
. = ..()
if(headline)
to_chat(user, "The headline screams, \"[headline]\"")
/obj/item/tabloid/attack_self(mob/user)
user.visible_message(SPAN_NOTICE("\The [user] leafs idly through \the [src]."))
if(headline)
to_chat(user, "Most of it is the usual tabloid garbage, but the headline story, \"[headline]\", holds your attention for awhile.")
if(tabloid_headlines[headline])
to_chat(user, tabloid_headlines[headline])
else
to_chat(user, "Most of it is the usual tabloid garbage. You find nothing of interest.")
return TRUE
-1
View File
@@ -65,7 +65,6 @@
closet_appearance = null
catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor)
climbable = FALSE
door_anim_time = 0 //Unsupported
starts_with = list(
/obj/item/weapon/fuel_assembly/deuterium = 6)
@@ -127,7 +127,7 @@ var/list/marker_beacon_colors = list(
if(istype(I, /obj/item/stack/marker_beacon))
var/obj/item/stack/marker_beacon/M = I
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount)
if(do_after(user, remove_speed, target = src) && M.get_amount() + 1 <= M.max_amount)
M.add(1)
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
qdel(src)
+48 -7
View File
@@ -17,7 +17,7 @@
center_of_mass = null
var/list/datum/stack_recipe/recipes
var/singular_name
var/amount = 1
VAR_PROTECTED/amount = 1
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/stacktype //determines whether different stack types can merge
var/build_type = null //used when directly applied to a turf
@@ -29,12 +29,19 @@
var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc.
var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc)
/obj/item/stack/Initialize(var/ml, var/amount)
/obj/item/stack/Initialize(var/ml, var/starting_amount)
. = ..()
if(!stacktype)
stacktype = type
if(amount)
src.amount = amount
if(!isnull(starting_amount)) // Could be 0
// Negative numbers are 'give full stack', like -1
if(starting_amount < 0)
// But sometimes a coder forgot to define what that even means
if(max_amount)
starting_amount = max_amount
else
starting_amount = 1
set_amount(starting_amount, TRUE)
update_icon()
/obj/item/stack/Destroy()
@@ -229,12 +236,15 @@
//Return 1 if an immediate subsequent call to use() would succeed.
//Ensures that code dealing with stacks uses the same logic
/obj/item/stack/proc/can_use(var/used)
if (get_amount() < used)
if(used < 0 || used % 1)
stack_trace("Tried to use a bad stack amount: [used]")
return 0
if(get_amount() < used)
return 0
return 1
/obj/item/stack/proc/use(var/used)
if (!can_use(used))
if(!can_use(used))
return 0
if(!uses_charge)
amount -= used
@@ -251,6 +261,9 @@
return 1
/obj/item/stack/proc/add(var/extra)
if(extra < 0 || extra % 1)
stack_trace("Tried to add a bad stack amount: [extra]")
return 0
if(!uses_charge)
if(amount + extra > get_max_amount())
return 0
@@ -265,6 +278,27 @@
var/datum/matter_synth/S = synths[i]
S.add_charge(charge_costs[i] * extra)
/obj/item/stack/proc/set_amount(var/new_amount, var/no_limits = FALSE)
if(new_amount < 0 || new_amount % 1)
stack_trace("Tried to set a bad stack amount: [new_amount]")
return 0
// Clean up the new amount
new_amount = max(round(new_amount), 0)
// Can exceed max if you really want
if(new_amount > max_amount && !no_limits)
new_amount = max_amount
amount = new_amount
// Can set it to 0 without qdel if you really want
if(amount == 0 && !no_limits)
qdel(src)
return FALSE
return TRUE
/*
The transfer and split procs work differently than use() and add().
Whereas those procs take no action if the desired amount cannot be added or removed these procs will try to transfer whatever they can.
@@ -282,6 +316,10 @@
if (isnull(tamount))
tamount = src.get_amount()
if(tamount < 0 || tamount % 1)
stack_trace("Tried to transfer a bad stack amount: [tamount]")
return 0
var/transfer = max(min(tamount, src.get_amount(), (S.get_max_amount() - S.get_amount())), 0)
@@ -302,7 +340,10 @@
if(uses_charge)
return null
tamount = round(tamount)
if(tamount < 0 || tamount % 1)
stack_trace("Tried to split a bad stack amount: [tamount]")
return null
var/transfer = max(min(tamount, src.amount, initial(max_amount)), 0)
var/orig_amount = src.amount
@@ -37,7 +37,7 @@
prob(5);/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
prob(3);/obj/item/weapon/storage/box/snappops,
prob(2);/obj/item/clothing/under/syndicate/tacticool,
prob(3);/obj/item/clothing/head/cowboy_hat/small,
prob(3);/obj/item/clothing/head/cowboy/small,
prob(3);/obj/item/toy/sword,
prob(3);/obj/item/toy/cultsword,
prob(1);/obj/structure/plushie/ian)
@@ -177,4 +177,4 @@
prob(1);/obj/item/toy/figure/bartender)
playsound(T, 'sound/effects/phasein.ogg', 25, 1)
new path(T)
del(src)
del(src)
+5 -7
View File
@@ -814,13 +814,6 @@
name = "void carp plushie"
icon_state = "voidcarp"
// Eris
/obj/structure/plushie/fumo
name = "Fumo"
desc = "A plushie of a....?."
icon_state = "fumoplushie"
phrase = "I just don't think about losing."
//Large plushies.
/obj/structure/plushie
name = "generic plush"
@@ -1258,6 +1251,11 @@
icon_state = "therapygreen"
item_state = "egg3" // It's the green egg in items_left/righthand
/obj/item/toy/plushie/fumo
name = "Fumo"
desc = "A plushie of a....?"
icon_state = "fumoplushie"
pokephrase = "I just don't think about losing."
//Toy cult sword
/obj/item/toy/cultsword
+6
View File
@@ -44,3 +44,9 @@
name = "ribcage"
desc = "If you had some mallets, you could probably use this as a makeshift xylophone."
icon_state = "ribs"
/obj/item/weapon/bone/horn //Teppi horn!!!!
name = "horn"
desc = "A hard conical structure made of bone or some other similar organic material. Traditionally seen affixed to helmets, hollowed out and filled with tasty drinks, or occasionally, attatched to the heads of animals."
icon = 'icons/obj/bones_vr.dmi'
icon_state = "horn"
@@ -112,3 +112,6 @@
walk(src, null, null)
..()
return
/obj/item/weapon/grenade/vendor_action(var/obj/machinery/vending/V)
activate(V)
@@ -329,3 +329,8 @@ var/last_chew = 0
if(target.hud_used && user.hud_used.move_intent)
target.hud_used.move_intent.icon_state = "walking"
return 1
/obj/item/weapon/handcuffs/cable/plantfiber
name = "rope bindings"
desc = "A length of rope fashioned to hold someone's hands together."
color = "#7e6442"
@@ -130,10 +130,10 @@
/obj/item/weapon/card/emag/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/stack/telecrystal))
var/obj/item/stack/telecrystal/T = O
if(T.amount < 1)
if(T.get_amount() < 1)
to_chat(usr, "<span class='notice'>You are not adding enough telecrystals to fuel \the [src].</span>")
return
uses += T.amount/2 //Gives 5 uses per 10 TC
uses += T.get_amount()*0.5 //Gives 5 uses per 10 TC
uses = CEILING(uses, 1) //Ensures no decimal uses nonsense, rounds up to be nice
to_chat(usr, "<span class='notice'>You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses].</span>")
qdel(O)
@@ -164,3 +164,29 @@
applies_material_colour = FALSE
default_material = "plasteel" //VOREStation Edit
toolspeed = 2 // Use a real axe if you want to chop logs.
/obj/item/weapon/material/knife/stone
name = "stone blade"
desc = "A crude blade made by chipping away at a piece of flint."
icon = 'icons/obj/weapons_vr.dmi'
icon_state = "stone_blade"
applies_material_colour = FALSE
fragile = TRUE
dulled = TRUE
edge = TRUE
sharp = TRUE
default_material = MAT_FLINT
/obj/item/weapon/material/knife/stone/wood
name = "stone knife"
desc = "A crude blade of flint with a wooden handle, secured with plant fibers twined into sturdy ropes. Useful for cutting, stabbing, slicing, and even shearing."
icon_state = "stone_wood_knife"
dulled = FALSE
fragile = FALSE
/obj/item/weapon/material/knife/stone/bone
name = "stone knife"
desc = "A crude blade of flint with a bone handle, secured with plant fibers twined into sturdy ropes. Useful for cutting, stabbing, slicing, and even shearing."
icon_state = "stone_bone_knife"
dulled = FALSE
fragile = FALSE
@@ -217,4 +217,4 @@
applies_material_colour = FALSE
/obj/item/weapon/material/knife/machete/hatchet/stone/bone
icon_state = "stone_bone_axe"
icon_state = "stone_bone_axe"
@@ -189,3 +189,6 @@
base_icon = "riding_crop"
icon_state = "riding_crop0"
attack_verb = list("cropped","spanked","swatted","smacked","peppered")
/obj/item/weapon/material/twohanded/spear/flint
default_material = MAT_FLINT
@@ -13,7 +13,7 @@
/obj/item/weapon/whetstone/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/material))
var/obj/item/stack/material/M = I
if(M.amount >= 5)
if(M.get_amount() >= 5)
to_chat(user, "You begin to refine the [src] with [M]...")
if(do_after(user, 70))
M.use(5)
+23 -25
View File
@@ -262,7 +262,7 @@
return 0
var/current = 0
for(var/obj/item/stack/material/S in contents)
current += S.amount
current += S.get_amount()
if(capacity == current)//If it's full, you're done
if(!stop_messages)
to_chat(usr, "<span class='warning'>The snatcher is full.</span>")
@@ -279,29 +279,27 @@
var/inserted = 0
var/current = 0
for(var/obj/item/stack/material/S2 in contents)
current += S2.amount
if(capacity < current + S.amount)//If the stack will fill it up
current += S2.get_amount()
if(capacity < current + S.get_amount())//If the stack will fill it up
amount = capacity - current
else
amount = S.amount
amount = S.get_amount()
for(var/obj/item/stack/material/sheet in contents)
if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
sheet.amount += amount // they should only be removed through procs in this file, which split them up.
S.amount -= amount
if(S.type == sheet.type)
// we are violating the amount limitation because these are not sane objects
sheet.set_amount(sheet.get_amount() + amount, TRUE)
S.use(amount) // will qdel() if we use it all
inserted = 1
break
if(!inserted || !S.amount)
if(!inserted)
usr.remove_from_mob(S)
usr.update_icons() //update our overlays
if (usr.client && usr.s_active != src)
usr.client.screen -= S
S.dropped(usr)
if(!S.amount)
qdel(S)
else
S.loc = src
S.loc = src
orient2hud(usr)
if(usr.s_active)
@@ -322,7 +320,7 @@
for(var/obj/item/stack/material/I in contents)
adjusted_contents++
var/datum/numbered_display/D = new/datum/numbered_display(I)
D.number = I.amount
D.number = I.get_amount()
numbered_contents.Add( D )
var/row_num = 0
@@ -336,14 +334,14 @@
/obj/item/weapon/storage/bag/sheetsnatcher/quick_empty()
var/location = get_turf(src)
for(var/obj/item/stack/material/S in contents)
while(S.amount)
var/obj/item/stack/material/N = new S.type(location)
var/stacksize = min(S.amount,N.max_amount)
N.amount = stacksize
S.amount -= stacksize
N.update_icon()
if(!S.amount)
qdel(S) // todo: there's probably something missing here
var/cur_amount = S.get_amount()
var/full_stacks = round(cur_amount / S.max_amount) // Floor of current/max is amount of full stacks we make
var/remainder = cur_amount % S.max_amount // Current mod max is remainder after full sheets removed
for(var/i = 1 to full_stacks)
new S.type(location, S.max_amount)
if(remainder)
new S.type(location, remainder)
S.set_amount(0)
orient2hud(usr)
if(usr.s_active)
usr.s_active.show_to(usr)
@@ -359,10 +357,10 @@
//Therefore, make a new stack internally that has the remainder.
// -Sayu
if(S.amount > S.max_amount)
var/obj/item/stack/material/temp = new S.type(src)
temp.amount = S.amount - S.max_amount
S.amount = S.max_amount
if(S.get_amount() > S.max_amount)
var/newstack_amt = S.get_amount() - S.max_amount
new S.type(src, newstack_amt) // The one we'll keep to replace the one we give
S.set_amount(S.max_amount) // The one we hand to the clicker
return ..(S,new_location)
@@ -167,6 +167,7 @@
/obj/item/weapon/melee/baton,
/obj/item/weapon/gun/energy/taser,
/obj/item/weapon/gun/energy/stunrevolver,
/obj/item/weapon/gun/energy/stunrevolver/vintage,
/obj/item/weapon/gun/magnetic/railgun/heater/pistol,
/obj/item/weapon/gun/energy/gun,
/obj/item/weapon/flame/lighter,
@@ -31,6 +31,7 @@
prob(4);/obj/item/weapon/gun/energy/taser,
prob(2);/obj/item/weapon/gun/energy/crossbow/largecrossbow,
prob(4);/obj/item/weapon/gun/energy/stunrevolver,
prob(2);/obj/item/weapon/gun/energy/stunrevolver/vintage,
prob(3);/obj/item/weapon/gun/energy/gun/compact)
/obj/random/energy/sec
@@ -4,6 +4,7 @@
icon = 'icons/mob/alien.dmi'
layer = ABOVE_JUNK_LAYER
var/health = 50
unacidable = TRUE
/obj/structure/alien/proc/healthcheck()
if(health <=0)
+1
View File
@@ -33,6 +33,7 @@ two tiles on initialization, and which way a cliff is facing may change during m
opacity = FALSE
climbable = TRUE
climb_delay = 10 SECONDS
unacidable = TRUE
block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
plane = TURF_PLANE
@@ -34,19 +34,11 @@
var/list/starts_with // List of type = count (or just type for 1)
var/closet_appearance = /decl/closet_appearance // The /decl that defines what decals we end up with, that makes our look unique
var/decl/closet_appearance/closet_appearance = /decl/closet_appearance // The /decl that defines what decals we end up with, that makes our look unique
/// Currently animating the door transform
var/is_animating_door = FALSE
/// Length of time (ds) to animate the door transform
var/door_anim_time = 2.0
/// Amount to 'squish' the full width of the door by
var/door_anim_squish = 0.30
/// Virtual angle at which the door is opened to (136 by default, so not a full 180)
var/door_anim_angle = 136
/// Offset for the door hinge location from centerline
var/door_hinge = -6.5
/// Our visual object for the closet door
/// Our visual object for the closet door, if we're animating
var/obj/effect/overlay/closet_door/door_obj
/obj/structure/closet/Initialize()
@@ -73,15 +65,16 @@
storage_capacity = content_size + 5
if(ispath(closet_appearance))
var/decl/closet_appearance/app = GLOB.closet_appearances[closet_appearance]
if(app)
icon = app.icon
closet_appearance = GLOB.closet_appearances[closet_appearance]
if(istype(closet_appearance))
icon = closet_appearance.icon
color = null
update_icon()
/obj/structure/closet/Destroy()
. = ..()
qdel_null(door_obj)
closet_appearance = null
return ..()
/obj/structure/closet/examine(mob/user)
. = ..()
@@ -500,7 +493,7 @@
return 1
/obj/structure/closet/proc/animate_door(closing = FALSE)
if(!door_anim_time)
if(!closet_appearance?.door_anim_time)
update_icon()
return
if(!door_obj)
@@ -511,9 +504,9 @@
is_animating_door = TRUE
if(!closing)
update_icon()
var/num_steps = door_anim_time / world.tick_lag
var/num_steps = closet_appearance.door_anim_time / world.tick_lag
for(var/I in 0 to num_steps)
var/angle = door_anim_angle * (closing ? 1 - (I/num_steps) : (I/num_steps))
var/angle = closet_appearance.door_anim_angle * (closing ? 1 - (I/num_steps) : (I/num_steps))
var/matrix/M = get_door_transform(angle)
var/door_state = angle >= 90 ? "door_back" : "door_front"
var/door_layer = angle >= 90 ? FLOAT_LAYER : ABOVE_MOB_LAYER
@@ -526,7 +519,7 @@
animate(door_obj, transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag, flags = ANIMATION_END_NOW)
else
animate(transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag)
addtimer(CALLBACK(src,.proc/end_door_animation,closing),door_anim_time,TIMER_UNIQUE|TIMER_OVERRIDE)
addtimer(CALLBACK(src, .proc/end_door_animation,closing), closet_appearance.door_anim_time, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/structure/closet/proc/end_door_animation(closing = FALSE)
is_animating_door = FALSE
@@ -537,7 +530,9 @@
/obj/structure/closet/proc/get_door_transform(angle)
var/matrix/M = matrix()
M.Translate(-door_hinge, 0)
M.Multiply(matrix(cos(angle), 0, 0, -sin(angle) * door_anim_squish, 1, 0))
M.Translate(door_hinge, 0)
if(!closet_appearance)
return M
M.Translate(-closet_appearance.door_hinge, 0)
M.Multiply(matrix(cos(angle), 0, 0, -sin(angle) * closet_appearance.door_anim_squish, 1, 0))
M.Translate(closet_appearance.door_hinge, 0)
return M
@@ -14,6 +14,15 @@
var/decal_icon = 'icons/obj/closets/decals/closet.dmi'
var/can_lock = FALSE
/// Length of time (ds) to animate the door transform
var/door_anim_time = 2.0
/// Amount to 'squish' the full width of the door by
var/door_anim_squish = 0.30
/// Virtual angle at which the door is opened to (136 by default, so not a full 180)
var/door_anim_angle = 136
/// Offset for the door hinge location from centerline
var/door_hinge = -6.5
/decl/closet_appearance/New()
// Build our colour and decal lists.
if(LAZYLEN(extra_decals))
@@ -725,6 +734,7 @@
base_icon = 'icons/obj/closets/bases/crate.dmi'
decal_icon = 'icons/obj/closets/decals/crate.dmi'
color = COLOR_GRAY40
door_anim_time = 0
/decl/closet_appearance/crate/plastic
color = COLOR_GRAY80
@@ -1237,6 +1247,7 @@
decal_icon = 'icons/obj/closets/decals/large_crate.dmi'
decals = null
extra_decals = null
door_anim_time = 0
/decl/closet_appearance/large_crate/critter
color = COLOR_BEIGE
@@ -1349,6 +1360,7 @@
color = WOOD_COLOR_RICH
decals = null
extra_decals = null
door_anim_time = 0
/decl/closet_appearance/cabinet/secure
can_lock = TRUE
@@ -1361,6 +1373,7 @@
"vent"
)
extra_decals = null
door_anim_time = 0
/decl/closet_appearance/wall/emergency
color = COLOR_LIGHT_CYAN
@@ -1402,6 +1415,7 @@
"vent"
)
extra_decals = null
door_anim_time = 0
/decl/closet_appearance/wall_double/kitchen
decals = null
@@ -1431,6 +1445,7 @@
decal_icon = 'icons/obj/closets/decals/cart.dmi'
decals = null
extra_decals = null
door_anim_time = 0
/decl/closet_appearance/cart/trash
color = COLOR_BOTTLE_GREEN
@@ -7,7 +7,6 @@
seal_tool = /obj/item/weapon/tool/screwdriver
breakout_sound = 'sound/weapons/tablehit1.ogg'
closet_appearance = null // Special icon for us
door_anim_time = 0 //Unsupported
/* Graves */
/obj/structure/closet/grave
@@ -21,7 +20,6 @@
max_closets = 1
opened = 1
closet_appearance = null // Special icon for us
door_anim_time = 0 //Unsupported
/obj/structure/closet/grave/attack_hand(mob/user as mob)
if(opened)
@@ -2,4 +2,3 @@
name = "critter crate"
desc = "A crate which can sustain life for a while."
closet_appearance = /decl/closet_appearance/large_crate/critter
door_anim_time = 0 //Unsupported
@@ -13,7 +13,6 @@
opened = 0
sealed = 0 //Don't touch this.
health = 100
door_anim_time = 0 //Unsupported
/obj/structure/closet/secure_closet/egg/update_icon()
if(opened)
@@ -3,7 +3,6 @@
desc = "Old will forever be in fashion."
icon = 'icons/obj/closets/bases/cabinet.dmi'
closet_appearance = /decl/closet_appearance/cabinet
door_anim_time = 0 //Unsupported
/obj/structure/closet/acloset
name = "strange closet"
@@ -47,6 +47,7 @@
/obj/item/clothing/glasses/meson,
/obj/item/clothing/head/soft,
/obj/item/clothing/suit/storage/hooded/wintercoat/cargo,
/obj/item/clothing/suit/storage/hooded/wintercoat/cargo/qm,
/obj/item/clothing/shoes/boots/winter/supply)
/obj/structure/closet/secure_closet/quartermaster/Initialize()
@@ -26,6 +26,7 @@
/obj/item/device/t_scanner/upgraded,
/obj/item/taperoll/engineering,
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering,
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce,
/obj/item/clothing/shoes/boots/winter/engineering,
/obj/item/weapon/tank/emergency/oxygen/engi,
/obj/item/weapon/reagent_containers/spray/windowsealant, //VOREStation Add,
@@ -103,6 +103,7 @@
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/storage/toggle/fr_jacket,
/obj/item/clothing/suit/storage/toggle/labcoat/emt,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical/para,
/obj/item/device/radio/headset/headset_med/alt,
/obj/item/weapon/cartridge/medical,
/obj/item/weapon/storage/briefcase/inflatable,
@@ -137,6 +138,7 @@
/obj/item/device/flash,
/obj/item/weapon/reagent_containers/hypospray/vial,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical/cmo,
/obj/item/clothing/shoes/boots/winter/medical,
/obj/item/weapon/storage/box/freezer,
/obj/item/clothing/mask/gas,
@@ -45,6 +45,7 @@
/obj/item/clothing/mask/gas,
/obj/item/device/flash,
/obj/item/clothing/suit/storage/hooded/wintercoat/science,
/obj/item/clothing/suit/storage/hooded/wintercoat/science/rd,
/obj/item/clothing/shoes/boots/winter/science,
/obj/item/weapon/bluespace_harpoon) //VOREStation Add
@@ -60,7 +60,8 @@
/obj/item/clothing/head/caphat/hop,
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit,
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt,
/obj/item/clothing/glasses/sunglasses)
/obj/item/clothing/glasses/sunglasses,
/obj/item/clothing/suit/storage/hooded/wintercoat/hop)
/obj/structure/closet/secure_closet/hos
@@ -100,6 +101,7 @@
/obj/item/weapon/melee/telebaton,
/obj/item/clothing/head/beret/sec/corporate/hos,
/obj/item/clothing/suit/storage/hooded/wintercoat/security,
/obj/item/clothing/suit/storage/hooded/wintercoat/security/hos,
/obj/item/clothing/shoes/boots/winter/security,
/obj/item/device/flashlight/maglight,
/obj/item/clothing/mask/gas/half,
@@ -240,6 +242,7 @@
/obj/item/clothing/accessory/badge/holo/detective,
/obj/item/clothing/gloves/forensic, //CHOMP Edit replaces black gloves
/obj/item/gunbox, //CHOMP Edit undoes vorestation removal and adds back gunbox
/obj/item/weapon/gun/energy/stunrevolver/vintage,
/obj/item/weapon/storage/belt/detective,
/obj/item/weapon/storage/box/evidence,
/obj/item/device/radio/headset/headset_sec,
@@ -312,4 +315,3 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br
//too small to put a man in
large = 0
door_anim_time = 0 // Unsupported
@@ -21,6 +21,7 @@
/obj/item/clothing/accessory/holster/waist,
/obj/item/clothing/head/beret/sec/corporate/hos,
/obj/item/clothing/suit/storage/hooded/wintercoat/security,
/obj/item/clothing/suit/storage/hooded/wintercoat/security/hos,
/obj/item/clothing/mask/gas/half)
/obj/structure/closet/secure_closet/hos2
@@ -7,7 +7,6 @@
anchored = TRUE
health = 0 //destroying the statue kills the mob within
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
door_anim_time = 0 // Why is this a closet??
var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock
var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils.
var/intialBrute = 0
@@ -116,7 +116,6 @@
for(var/i = 0, i<2, i++)
for(var/res in resources)
var/obj/item/stack/R = new res(src)
R.amount = R.max_amount
new res(src, -1)
return ..()
@@ -10,7 +10,6 @@
anchored = TRUE
store_mobs = 0
wall_mounted = 1
door_anim_time = 0 // Unsupported
//spawns 2 sets of breathmask, emergency oxy tank and crowbar
@@ -92,7 +91,6 @@
wall_mounted = 1
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
door_anim_time = 0 //Unsupported
/obj/structure/closet/walllocker_double/north
pixel_y = 32
@@ -378,8 +378,11 @@
/obj/item/clothing/under/pants/khaki,
/obj/item/clothing/mask/bandana/blue,
/obj/item/clothing/mask/bandana/blue,
/obj/item/clothing/accessory/hawaii,
/obj/item/clothing/accessory/hawaii/random)
/obj/item/clothing/accessory/hawaiian,
/obj/item/clothing/accessory/hawaiian/blue,
/obj/item/clothing/accessory/hawaiian/pink,
/obj/item/clothing/accessory/hawaiian/red,
/obj/item/clothing/accessory/hawaiian/yellow)
/obj/structure/closet/wardrobe/tactical
@@ -7,7 +7,6 @@
closet_appearance = /decl/closet_appearance/crate
climbable = TRUE
dir = 4 //Spawn facing 'forward' by default.
door_anim_time = 0 //Unsupported until appropriate sprites are available
var/points_per_crate = 5
var/rigged = 0
+1 -2
View File
@@ -43,8 +43,7 @@
to_chat(user, "<span class='notice'>You start to cut the shower curtains.</span>")
if(do_after(user, 10))
to_chat(user, "<span class='notice'>You cut the shower curtains.</span>")
var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
A.amount = 3
new /obj/item/stack/material/plastic(src.loc, 3)
qdel(src)
return
else
+1 -2
View File
@@ -109,8 +109,7 @@
if(finished)
to_chat(user, "<span class='notice'>You start breaking down \the [src].</span>")
if(do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE))
var/obj/item/stack/S = new /obj/item/stack/material/plasteel(loc)
S.amount = 10
new /obj/item/stack/material/plasteel(loc, 10)
playsound(user, O.usesound, 50, 1)
qdel(src)
else
+26 -2
View File
@@ -112,9 +112,33 @@
destroy_on_harvest = TRUE
harvest_tool = /obj/item/weapon/material/knife
randomize_harvest_count = FALSE
randomize_harvest_count = TRUE
harvest_loot = list(/obj/item/stack/material/fiber = 1)
max_harvests = 1
min_harvests = 1
max_harvests = 3
/obj/structure/flora/ausbushes/spawn_harvest(var/path = null, var/mob/user = null)
. = ..()
if(. && prob(15))
var/static/list/possibleseeds = list(
/obj/item/seeds/ambrosiavulgarisseed = 1,
/obj/item/seeds/carrotseed = 5,
/obj/item/seeds/chiliseed = 5,
/obj/item/seeds/cornseed = 10,
/obj/item/seeds/grapeseed = 5,
/obj/item/seeds/grassseed = 1,
/obj/item/seeds/lavenderseed = 5,
/obj/item/seeds/onionseed = 5,
/obj/item/seeds/random = 1,
/obj/item/seeds/reishimycelium = 5,
/obj/item/seeds/sugarcaneseed = 5,
/obj/item/seeds/tomatoseed = 5,
/obj/item/seeds/towermycelium = 5,
/obj/item/seeds/watermelonseed = 10,
/obj/item/seeds/wheatseed = 25,
/obj/item/seeds/whitebeetseed = 5)
var/choice = pickweight(possibleseeds)
new choice(get_turf(user))
/obj/structure/flora/ausbushes/New()
..()
+1 -2
View File
@@ -101,8 +101,7 @@
return
if(product && product_amount) // Make wooden logs.
var/obj/item/stack/material/M = new product(get_turf(src))
M.amount = product_amount
var/obj/item/stack/material/M = new product(get_turf(src), product_amount)
M.update_icon()
visible_message("<span class='danger'>\The [src] is felled!</span>")
stump()

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