mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-29 16:19:36 +01:00
Merge branch 'master' into upstream-merge-11432
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user