diff --git a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
index 451a2a8bce..f4207eeba5 100644
--- a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
@@ -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++
diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm
index c866711ab5..f4a1fc2c3b 100644
--- a/code/datums/components/crafting/crafting.dm
+++ b/code/datums/components/crafting/crafting.dm
@@ -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
diff --git a/code/datums/vending/stored_item.dm b/code/datums/vending/stored_item.dm
index 4b8606ff61..3b46c6be3f 100644
--- a/code/datums/vending/stored_item.dm
+++ b/code/datums/vending/stored_item.dm
@@ -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))
diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm
index d4045aefe8..20677bb0ff 100644
--- a/code/game/machinery/CableLayer.dm
+++ b/code/game/machinery/CableLayer.dm
@@ -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, "There's no more cable on the reel.")
/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)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index f079485f19..bc8a8081d0 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -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)
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index e5cf8da8e1..e98e687af4 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -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
diff --git a/code/game/machinery/casino_prize_dispenser_ch.dm b/code/game/machinery/casino_prize_dispenser_ch.dm
index 0678cbcc12..56aab6c55a 100644
--- a/code/game/machinery/casino_prize_dispenser_ch.dm
+++ b/code/game/machinery/casino_prize_dispenser_ch.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD:code/game/machinery/casino_prize_dispenser_ch.dm
// Use this define to register a prize!
// * n - The proper name of the purchasable
// * o - The object type path of the purchasable to spawn
@@ -355,4 +356,614 @@
/obj/machinery/casino_prize_dispenser/process() //Might not need this, but just to be safe for now
if(stat & (BROKEN|NOPOWER))
+||||||| parent of e5c108269d... Merge pull request #11454 from VOREStation/Arokha/stacks:code/modules/casino/casino_prize_vendor.dm
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+// Use this define to register a prize!
+// * n - The proper name of the purchasable
+// * o - The object type path of the purchasable to spawn
+// * r - The amount to dispense
+// * p - The price of the purchasable in chips
+// * l - The restriction of the item
+#define CASINO_PRIZE(n, o, r, p, l) n = new /datum/data/casino_prize(n, o, r, p, l)
+
+/datum/data/casino_prize
+ var/equipment_path = null
+ var/equipment_amt = 1
+ var/cost = 0
+ var/category = null
+ var/restriction = null
+
+/datum/data/casino_prize/New(name, path, amt, cost, restriction)
+ src.name = name
+ src.equipment_path = path
+ src.equipment_amt = amt
+ src.cost = cost
+ src.category = category
+ src.restriction = restriction
+
+/obj/machinery/casino_prize_dispenser
+ name = "Casino Prize Exchanger"
+ desc = "Exchange your chips to obtain wonderful prizes! Hoepfully you'll get to keep some of them for a while."
+ icon = 'icons/obj/casino.dmi'
+ icon_state ="casino_prize_dispenser"
+ var/icon_vend ="casino_prize_dispenser-vend"
+ anchored = 1
+ density = 1
+ opacity = 0
+ var/list/item_list
+
+ clicksound = "button"
+ var/vending_sound = "machines/vending/vending_drop.ogg"
+
+ // Power
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 10
+ var/vend_power_usage = 150 //actuators and stuff
+
+ // Vending-related
+ var/datum/data/casino_prize/currently_vending = null // What we're requesting payment for right now
+ var/list/log = list() //Log only SS13 staff is allowed to look at, CKEYS are listed here for record keeping of prizes and players for events!
+
+ var/category_weapons = 1 //For listing categories, if false then prizes of this categories cant be obtained nor bought for post-shift enjoyment
+ var/category_gear = 1 //If 1 prizes will be only logged
+ var/category_clothing = 1 //If 2 prizes will both be logged and spawned
+ var/category_misc = 1
+ var/category_drinks = 1
+ var/category_implants = 1
+ var/category_event = 1 //For special events, holidays, etc
+
+/obj/machinery/casino_prize_dispenser/Initialize()
+ . = ..()
+ power_change()
+
+ item_list = list()
+ item_list["Weapons"] = list(
+ CASINO_PRIZE("Scepter", /obj/item/weapon/scepter, 1, 500, "weapons"),
+ CASINO_PRIZE("Chain of Command", /obj/item/weapon/melee/chainofcommand, 1, 250, "weapons"),
+ CASINO_PRIZE("Size Gun", /obj/item/weapon/gun/energy/sizegun, 1, 100, "weapons"),
+ CASINO_PRIZE("Advanced Particle Rifle", /obj/item/weapon/gun/energy/particle/advanced, 1, 500, "weapons"),
+ CASINO_PRIZE("Temperature Gun", /obj/item/weapon/gun/energy/temperature, 1, 250, "weapons"),
+ CASINO_PRIZE("Alien Pistol", /obj/item/weapon/gun/energy/alien, 1, 1000, "weapons"),
+ CASINO_PRIZE("Floral Gun", /obj/item/weapon/gun/energy/floragun, 1, 250, "weapons"),
+ CASINO_PRIZE("Net Gun", /obj/item/weapon/gun/energy/netgun, 1, 500, "weapons"),
+ )
+ item_list["Gear"] = list(
+ CASINO_PRIZE("Experimental Welder", /obj/item/weapon/weldingtool/experimental, 1, 500, "gear"),
+ CASINO_PRIZE("Chameleon Tie", /obj/item/clothing/accessory/chameleon, 1, 250, "gear"),
+ CASINO_PRIZE("Chemsprayer", /obj/item/weapon/reagent_containers/spray/chemsprayer, 1, 250, "gear"),
+ CASINO_PRIZE("Bluespace Beaker", /obj/item/weapon/reagent_containers/glass/beaker/bluespace, 1, 200, "gear"),
+ CASINO_PRIZE("Cryo Beaker", /obj/item/weapon/reagent_containers/glass/beaker/noreact, 1, 200, "gear"),
+ )
+ item_list["Clothing"] = list(
+ CASINO_PRIZE("Shark mask", /obj/item/clothing/mask/shark, 1, 50, "clothing"),
+ CASINO_PRIZE("Pig mask", /obj/item/clothing/mask/pig, 1, 50, "clothing"),
+ CASINO_PRIZE("Luchador mask", /obj/item/clothing/mask/luchador, 1, 50, "clothing"),
+ CASINO_PRIZE("Horse mask", /obj/item/clothing/mask/horsehead, 1, 50, "clothing"),
+ CASINO_PRIZE("Goblin mask", /obj/item/clothing/mask/goblin, 1, 50, "clothing"),
+ CASINO_PRIZE("Fake moustache", /obj/item/clothing/mask/fakemoustache, 1, 50, "clothing"),
+ CASINO_PRIZE("Dolphin mask", /obj/item/clothing/mask/dolphin, 1, 50, "clothing"),
+ CASINO_PRIZE("Demon mask", /obj/item/clothing/mask/demon, 1, 50, "clothing"),
+ CASINO_PRIZE("Chameleon mask", /obj/item/clothing/under/chameleon, 1, 250, "clothing"),
+ CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/ian_costume, 1, 50, "clothing"),
+ CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/carp_costume, 1, 50, "clothing"),
+ )
+ item_list["Miscellaneous"] = list(
+ CASINO_PRIZE("Toy sword", /obj/item/toy/sword, 1, 50, "misc"),
+ CASINO_PRIZE("Waterflower", /obj/item/weapon/reagent_containers/spray/waterflower, 1, 50, "misc"),
+ CASINO_PRIZE("Horse stick", /obj/item/toy/stickhorse, 1, 50, "misc"),
+ CASINO_PRIZE("Katana", /obj/item/toy/katana, 1, 50, "misc"),
+ CASINO_PRIZE("Conch", /obj/item/toy/eight_ball/conch, 1, 50, "misc"),
+ CASINO_PRIZE("Eight ball", /obj/item/toy/eight_ball, 1, 50, "misc"),
+ CASINO_PRIZE("Foam sword", /obj/item/weapon/material/sword/foam, 1, 50, "misc"),
+ CASINO_PRIZE("Whistle", /obj/item/toy/bosunwhistle, 1, 50, "misc"),
+ CASINO_PRIZE("Golden cup", /obj/item/weapon/reagent_containers/food/drinks/golden_cup, 1, 50, "misc"),
+ CASINO_PRIZE("Quality cigars", /obj/item/weapon/storage/fancy/cigar/havana, 1, 50, "misc"),
+ CASINO_PRIZE("Casino wallet (kept after event)", /obj/item/weapon/storage/wallet/casino, 1, 50, "misc"),
+ CASINO_PRIZE("Casino cards", /obj/item/weapon/deck/cards/casino, 1, 50, "misc"),
+ )
+ item_list["Drinks"] = list(
+ CASINO_PRIZE("Redeemer's brew", /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew, 1, 50, "drinks"),
+ CASINO_PRIZE("Poison wine", /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine, 1, 50, "drinks"),
+ CASINO_PRIZE("Patron", /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, 1, 50, "drinks"),
+ CASINO_PRIZE("Holy water", /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, 1, 50, "drinks"),
+ CASINO_PRIZE("Goldschlager", /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, 1, 50, "drinks"),
+ CASINO_PRIZE("Champagne", /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne, 1, 50, "drinks"),
+ CASINO_PRIZE("Bottle of Nothing", /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, 1, 50, "drinks"),
+ CASINO_PRIZE("Whiskey bliss", /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey, 1, 50, "drinks"),
+ )
+
+ item_list["Implants"] = list(
+ CASINO_PRIZE("Implanter (Remember to get one unless you want to borrow from station!)", /obj/item/weapon/implanter, 1, 100, "implants"),
+ CASINO_PRIZE("Implant: Tazer", /obj/item/weapon/implantcase/taser, 1, 1000, "implants"),
+ CASINO_PRIZE("Implant: Medkit", /obj/item/weapon/implantcase/medkit, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Shades", /obj/item/weapon/implantcase/shades, 1, 750, "implants"),
+ CASINO_PRIZE("Implant: Sprinter", /obj/item/weapon/implantcase/sprinter, 1, 1500, "implants"),
+ CASINO_PRIZE("Implant: Toolkit", /obj/item/weapon/implantcase/toolkit, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Language", /obj/item/weapon/implantcase/vrlanguage, 1, 1000, "implants"),
+ CASINO_PRIZE("Implant: Analyzer", /obj/item/weapon/implantcase/analyzer, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Size control", /obj/item/weapon/implant/sizecontrol , 1, 500, "implants"),
+ )
+
+ item_list["Event"] = list(
+ )
+
+/obj/machinery/casino_prize_dispenser/power_change()
+ ..()
+ if(stat & BROKEN)
+ icon_state = "[initial(icon_state)]-broken"
+ else
+ if(!(stat & NOPOWER))
+ icon_state = initial(icon_state)
+ else
+ spawn(rand(0, 15))
+ icon_state = "[initial(icon_state)]-off"
+
+/obj/machinery/casino_prize_dispenser/attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ tgui_interact(user)
+
+/obj/machinery/casino_prize_dispenser/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(currently_vending)
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ to_chat(usr, "Please select prize on display with sufficient amount of chips.")
+ else
+ SStgui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ attack_hand(user)
+ return
+ ..()
+
+/obj/machinery/casino_prize_dispenser/proc/pay_with_chips(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user, var/price)
+ //"cashmoney_:[cashmoney] user:[user] currently_vending:[currently_vending]"
+ if(price > cashmoney.worth)
+ to_chat(usr, "\icon[cashmoney] That is not enough chips.")
+ return 0
+
+ if(istype(cashmoney, /obj/item/weapon/spacecasinocash))
+ visible_message("\The [usr] inserts some chips into \the [src].")
+ cashmoney.worth -= price
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ else
+ cashmoney.update_icon()
+ return 1
+
+/obj/machinery/casino_prize_dispenser/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/vending),
+ )
+
+/obj/machinery/casino_prize_dispenser/tgui_data(mob/user)
+ var/list/data[0]
+
+ data["items"] = list()
+ for(var/cat in item_list)
+ var/list/cat_items = list()
+ for(var/prize_name in item_list[cat])
+ var/datum/data/casino_prize/prize = item_list[cat][prize_name]
+ cat_items[prize_name] = list("name" = prize_name, "price" = prize.cost, "restriction" = prize.restriction)
+ data["items"][cat] = cat_items
+ return data
+
+/obj/machinery/casino_prize_dispenser/tgui_interact(mob/user, datum/tgui/ui = null)
+ // Open the window
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CasinoPrizeDispenser", name)
+ ui.open()
+
+/obj/machinery/casino_prize_dispenser/tgui_act(action, params)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(usr.stat || usr.restrained())
+ return
+ if(..())
+ return TRUE
+ . = TRUE
+ switch(action)
+ if("purchase")
+ var/paid = FALSE
+ var/category = params["cat"]
+ var/restriction_category = params["restriction"]
+ var/restriction_check = 0
+ var/item_given = FALSE
+ var/name = params["name"]
+ var/price = params["price"]
+ var/datum/data/casino_prize/bi = item_list[category][name]
+ switch(restriction_category)
+ if("weapons")
+ restriction_check = category_weapons
+ if("gear")
+ restriction_check = category_gear
+ if("clothing")
+ restriction_check = category_clothing
+ if("misc")
+ restriction_check = category_misc
+ if("drinks")
+ restriction_check = category_drinks
+ if("implants")
+ restriction_check = category_implants
+ if("event")
+ restriction_check = category_event
+ else
+ to_chat(usr, "Prize checkout error has occured, purchase cancelled.")
+ return FALSE
+
+ if(restriction_check < 1)
+ to_chat(usr, "[name] is restricted, this prize can't be bought.")
+ return FALSE
+ if(restriction_check > 1)
+ item_given = TRUE
+
+ if(price <= 0 && item_given == TRUE)
+ vend(bi, usr)
+ return TRUE
+
+ currently_vending = bi
+
+ if(istype(usr.get_active_hand(), /obj/item/weapon/spacecasinocash))
+ var/obj/item/weapon/spacecasinocash/cash = usr.get_active_hand()
+ paid = pay_with_chips(cash, usr, price)
+ else
+ to_chat(usr, "Payment failure: Improper payment method, please provide chips.")
+ return TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update.
+ if(paid)
+ if(item_given == TRUE)
+ vend(bi, usr)
+
+ speak("Thank you for your purchase, your [bi] has been logged.")
+ do_logging(currently_vending, usr, bi)
+ . = TRUE
+ else
+ to_chat(usr, "Payment failure: unable to process payment.")
+
+/obj/machinery/casino_prize_dispenser/proc/vend(datum/data/casino_prize/bi, mob/user)
+ 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
+ playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
+ return TRUE
+
+ for(var/i in 1 to bi.equipment_amt)
+ new bi.equipment_path(loc)
+ playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
+
+ currently_vending = null
+ use_power(vend_power_usage) //actuators and stuff
+ flick("[icon_state]-vend",src)
+
+
+/obj/machinery/casino_prize_dispenser/proc/do_logging(item, mob/user, datum/data/casino_prize/bi)
+ var/prize_log = "{ckey:[user.ckey]character_name:[user.name]item_path: [bi.equipment_path]}"
+ log[++log.len] = prize_log
+ //Currently doesnt have an ingame way to show. Can only be viewed through View-Variables, to ensure theres no chance of players ckeys exposed - Jack
+
+/obj/machinery/casino_prize_dispenser/proc/speak(var/message)
+ if(stat & NOPOWER)
+ return
+
+ if(!message)
+ return
+
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\The [src] beeps, \"[message]\"",2)
+ return
+
+/obj/machinery/casino_prize_dispenser/process() //Might not need this, but just to be safe for now
+ if(stat & (BROKEN|NOPOWER))
+=======
+
+//Original Casino Code created by Shadowfire117#1269 - Ported from CHOMPstation
+//Modified by GhostActual#2055 for use with VOREstation
+
+// Use this define to register a prize!
+// * n - The proper name of the purchasable
+// * o - The object type path of the purchasable to spawn
+// * r - The amount to dispense
+// * p - The price of the purchasable in chips
+// * l - The restriction of the item
+#define CASINO_PRIZE(n, o, r, p, l) n = new /datum/data/casino_prize(n, o, r, p, l)
+
+/datum/data/casino_prize
+ var/equipment_path = null
+ var/equipment_amt = 1
+ var/cost = 0
+ var/category = null
+ var/restriction = null
+
+/datum/data/casino_prize/New(name, path, amt, cost, restriction)
+ src.name = name
+ src.equipment_path = path
+ src.equipment_amt = amt
+ src.cost = cost
+ src.category = category
+ src.restriction = restriction
+
+/obj/machinery/casino_prize_dispenser
+ name = "Casino Prize Exchanger"
+ desc = "Exchange your chips to obtain wonderful prizes! Hoepfully you'll get to keep some of them for a while."
+ icon = 'icons/obj/casino.dmi'
+ icon_state ="casino_prize_dispenser"
+ var/icon_vend ="casino_prize_dispenser-vend"
+ anchored = 1
+ density = 1
+ opacity = 0
+ var/list/item_list
+
+ clicksound = "button"
+ var/vending_sound = "machines/vending/vending_drop.ogg"
+
+ // Power
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 10
+ var/vend_power_usage = 150 //actuators and stuff
+
+ // Vending-related
+ var/datum/data/casino_prize/currently_vending = null // What we're requesting payment for right now
+ var/list/log = list() //Log only SS13 staff is allowed to look at, CKEYS are listed here for record keeping of prizes and players for events!
+
+ var/category_weapons = 1 //For listing categories, if false then prizes of this categories cant be obtained nor bought for post-shift enjoyment
+ var/category_gear = 1 //If 1 prizes will be only logged
+ var/category_clothing = 1 //If 2 prizes will both be logged and spawned
+ var/category_misc = 1
+ var/category_drinks = 1
+ var/category_implants = 1
+ var/category_event = 1 //For special events, holidays, etc
+
+/obj/machinery/casino_prize_dispenser/Initialize()
+ . = ..()
+ power_change()
+
+ item_list = list()
+ item_list["Weapons"] = list(
+ CASINO_PRIZE("Scepter", /obj/item/weapon/scepter, 1, 500, "weapons"),
+ CASINO_PRIZE("Chain of Command", /obj/item/weapon/melee/chainofcommand, 1, 250, "weapons"),
+ CASINO_PRIZE("Size Gun", /obj/item/weapon/gun/energy/sizegun, 1, 100, "weapons"),
+ CASINO_PRIZE("Advanced Particle Rifle", /obj/item/weapon/gun/energy/particle/advanced, 1, 500, "weapons"),
+ CASINO_PRIZE("Temperature Gun", /obj/item/weapon/gun/energy/temperature, 1, 250, "weapons"),
+ CASINO_PRIZE("Alien Pistol", /obj/item/weapon/gun/energy/alien, 1, 1000, "weapons"),
+ CASINO_PRIZE("Floral Gun", /obj/item/weapon/gun/energy/floragun, 1, 250, "weapons"),
+ CASINO_PRIZE("Net Gun", /obj/item/weapon/gun/energy/netgun, 1, 500, "weapons"),
+ )
+ item_list["Gear"] = list(
+ CASINO_PRIZE("Experimental Welder", /obj/item/weapon/weldingtool/experimental, 1, 500, "gear"),
+ CASINO_PRIZE("Chameleon Tie", /obj/item/clothing/accessory/chameleon, 1, 250, "gear"),
+ CASINO_PRIZE("Chemsprayer", /obj/item/weapon/reagent_containers/spray/chemsprayer, 1, 250, "gear"),
+ CASINO_PRIZE("Bluespace Beaker", /obj/item/weapon/reagent_containers/glass/beaker/bluespace, 1, 200, "gear"),
+ CASINO_PRIZE("Cryo Beaker", /obj/item/weapon/reagent_containers/glass/beaker/noreact, 1, 200, "gear"),
+ )
+ item_list["Clothing"] = list(
+ CASINO_PRIZE("Shark mask", /obj/item/clothing/mask/shark, 1, 50, "clothing"),
+ CASINO_PRIZE("Pig mask", /obj/item/clothing/mask/pig, 1, 50, "clothing"),
+ CASINO_PRIZE("Luchador mask", /obj/item/clothing/mask/luchador, 1, 50, "clothing"),
+ CASINO_PRIZE("Horse mask", /obj/item/clothing/mask/horsehead, 1, 50, "clothing"),
+ CASINO_PRIZE("Goblin mask", /obj/item/clothing/mask/goblin, 1, 50, "clothing"),
+ CASINO_PRIZE("Fake moustache", /obj/item/clothing/mask/fakemoustache, 1, 50, "clothing"),
+ CASINO_PRIZE("Dolphin mask", /obj/item/clothing/mask/dolphin, 1, 50, "clothing"),
+ CASINO_PRIZE("Demon mask", /obj/item/clothing/mask/demon, 1, 50, "clothing"),
+ CASINO_PRIZE("Chameleon mask", /obj/item/clothing/under/chameleon, 1, 250, "clothing"),
+ CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/ian_costume, 1, 50, "clothing"),
+ CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/carp_costume, 1, 50, "clothing"),
+ )
+ item_list["Miscellaneous"] = list(
+ CASINO_PRIZE("Toy sword", /obj/item/toy/sword, 1, 50, "misc"),
+ CASINO_PRIZE("Waterflower", /obj/item/weapon/reagent_containers/spray/waterflower, 1, 50, "misc"),
+ CASINO_PRIZE("Horse stick", /obj/item/toy/stickhorse, 1, 50, "misc"),
+ CASINO_PRIZE("Katana", /obj/item/toy/katana, 1, 50, "misc"),
+ CASINO_PRIZE("Conch", /obj/item/toy/eight_ball/conch, 1, 50, "misc"),
+ CASINO_PRIZE("Eight ball", /obj/item/toy/eight_ball, 1, 50, "misc"),
+ CASINO_PRIZE("Foam sword", /obj/item/weapon/material/sword/foam, 1, 50, "misc"),
+ CASINO_PRIZE("Whistle", /obj/item/toy/bosunwhistle, 1, 50, "misc"),
+ CASINO_PRIZE("Golden cup", /obj/item/weapon/reagent_containers/food/drinks/golden_cup, 1, 50, "misc"),
+ CASINO_PRIZE("Quality cigars", /obj/item/weapon/storage/fancy/cigar/havana, 1, 50, "misc"),
+ CASINO_PRIZE("Casino wallet (kept after event)", /obj/item/weapon/storage/wallet/casino, 1, 50, "misc"),
+ CASINO_PRIZE("Casino cards", /obj/item/weapon/deck/cards/casino, 1, 50, "misc"),
+ )
+ item_list["Drinks"] = list(
+ CASINO_PRIZE("Redeemer's brew", /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew, 1, 50, "drinks"),
+ CASINO_PRIZE("Poison wine", /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine, 1, 50, "drinks"),
+ CASINO_PRIZE("Patron", /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, 1, 50, "drinks"),
+ CASINO_PRIZE("Holy water", /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, 1, 50, "drinks"),
+ CASINO_PRIZE("Goldschlager", /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, 1, 50, "drinks"),
+ CASINO_PRIZE("Champagne", /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne, 1, 50, "drinks"),
+ CASINO_PRIZE("Bottle of Nothing", /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, 1, 50, "drinks"),
+ CASINO_PRIZE("Whiskey bliss", /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey, 1, 50, "drinks"),
+ )
+
+ item_list["Implants"] = list(
+ CASINO_PRIZE("Implanter (Remember to get one unless you want to borrow from station!)", /obj/item/weapon/implanter, 1, 100, "implants"),
+ CASINO_PRIZE("Implant: Tazer", /obj/item/weapon/implantcase/taser, 1, 1000, "implants"),
+ CASINO_PRIZE("Implant: Medkit", /obj/item/weapon/implantcase/medkit, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Shades", /obj/item/weapon/implantcase/shades, 1, 750, "implants"),
+ CASINO_PRIZE("Implant: Sprinter", /obj/item/weapon/implantcase/sprinter, 1, 1500, "implants"),
+ CASINO_PRIZE("Implant: Toolkit", /obj/item/weapon/implantcase/toolkit, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Language", /obj/item/weapon/implantcase/vrlanguage, 1, 1000, "implants"),
+ CASINO_PRIZE("Implant: Analyzer", /obj/item/weapon/implantcase/analyzer, 1, 500, "implants"),
+ CASINO_PRIZE("Implant: Size control", /obj/item/weapon/implant/sizecontrol , 1, 500, "implants"),
+ )
+
+ item_list["Event"] = list(
+ )
+
+/obj/machinery/casino_prize_dispenser/power_change()
+ ..()
+ if(stat & BROKEN)
+ icon_state = "[initial(icon_state)]-broken"
+ else
+ if(!(stat & NOPOWER))
+ icon_state = initial(icon_state)
+ else
+ spawn(rand(0, 15))
+ icon_state = "[initial(icon_state)]-off"
+
+/obj/machinery/casino_prize_dispenser/attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ tgui_interact(user)
+
+/obj/machinery/casino_prize_dispenser/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(currently_vending)
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ to_chat(usr, "Please select prize on display with sufficient amount of chips.")
+ else
+ SStgui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ attack_hand(user)
+ return
+ ..()
+
+/obj/machinery/casino_prize_dispenser/proc/pay_with_chips(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user, var/price)
+ //"cashmoney_:[cashmoney] user:[user] currently_vending:[currently_vending]"
+ if(price > cashmoney.worth)
+ to_chat(usr, "\icon[cashmoney] That is not enough chips.")
+ return 0
+
+ if(istype(cashmoney, /obj/item/weapon/spacecasinocash))
+ visible_message("\The [usr] inserts some chips into \the [src].")
+ cashmoney.worth -= price
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ else
+ cashmoney.update_icon()
+ return 1
+
+/obj/machinery/casino_prize_dispenser/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/vending),
+ )
+
+/obj/machinery/casino_prize_dispenser/tgui_data(mob/user)
+ var/list/data[0]
+
+ data["items"] = list()
+ for(var/cat in item_list)
+ var/list/cat_items = list()
+ for(var/prize_name in item_list[cat])
+ var/datum/data/casino_prize/prize = item_list[cat][prize_name]
+ cat_items[prize_name] = list("name" = prize_name, "price" = prize.cost, "restriction" = prize.restriction)
+ data["items"][cat] = cat_items
+ return data
+
+/obj/machinery/casino_prize_dispenser/tgui_interact(mob/user, datum/tgui/ui = null)
+ // Open the window
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CasinoPrizeDispenser", name)
+ ui.open()
+
+/obj/machinery/casino_prize_dispenser/tgui_act(action, params)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(usr.stat || usr.restrained())
+ return
+ if(..())
+ return TRUE
+ . = TRUE
+ switch(action)
+ if("purchase")
+ var/paid = FALSE
+ var/category = params["cat"]
+ var/restriction_category = params["restriction"]
+ var/restriction_check = 0
+ var/item_given = FALSE
+ var/name = params["name"]
+ var/price = params["price"]
+ var/datum/data/casino_prize/bi = item_list[category][name]
+ switch(restriction_category)
+ if("weapons")
+ restriction_check = category_weapons
+ if("gear")
+ restriction_check = category_gear
+ if("clothing")
+ restriction_check = category_clothing
+ if("misc")
+ restriction_check = category_misc
+ if("drinks")
+ restriction_check = category_drinks
+ if("implants")
+ restriction_check = category_implants
+ if("event")
+ restriction_check = category_event
+ else
+ to_chat(usr, "Prize checkout error has occured, purchase cancelled.")
+ return FALSE
+
+ if(restriction_check < 1)
+ to_chat(usr, "[name] is restricted, this prize can't be bought.")
+ return FALSE
+ if(restriction_check > 1)
+ item_given = TRUE
+
+ if(price <= 0 && item_given == TRUE)
+ vend(bi, usr)
+ return TRUE
+
+ currently_vending = bi
+
+ if(istype(usr.get_active_hand(), /obj/item/weapon/spacecasinocash))
+ var/obj/item/weapon/spacecasinocash/cash = usr.get_active_hand()
+ paid = pay_with_chips(cash, usr, price)
+ else
+ to_chat(usr, "Payment failure: Improper payment method, please provide chips.")
+ return TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update.
+ if(paid)
+ if(item_given == TRUE)
+ vend(bi, usr)
+
+ speak("Thank you for your purchase, your [bi] has been logged.")
+ do_logging(currently_vending, usr, bi)
+ . = TRUE
+ else
+ to_chat(usr, "Payment failure: unable to process payment.")
+
+/obj/machinery/casino_prize_dispenser/proc/vend(datum/data/casino_prize/bi, mob/user)
+ SStgui.update_uis(src)
+
+ if(ispath(bi.equipment_path, /obj/item/stack))
+ new bi.equipment_path(loc, bi.equipment_amt)
+ playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
+ return TRUE
+
+ for(var/i in 1 to bi.equipment_amt)
+ new bi.equipment_path(loc)
+ playsound(src, 'sound/machines/vending/vending_drop.ogg', 100, 1)
+
+ currently_vending = null
+ use_power(vend_power_usage) //actuators and stuff
+ flick("[icon_state]-vend",src)
+
+
+/obj/machinery/casino_prize_dispenser/proc/do_logging(item, mob/user, datum/data/casino_prize/bi)
+ var/prize_log = "{ckey:[user.ckey]character_name:[user.name]item_path: [bi.equipment_path]}"
+ log[++log.len] = prize_log
+ //Currently doesnt have an ingame way to show. Can only be viewed through View-Variables, to ensure theres no chance of players ckeys exposed - Jack
+
+/obj/machinery/casino_prize_dispenser/proc/speak(var/message)
+ if(stat & NOPOWER)
+ return
+
+ if(!message)
+ return
+
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\The [src] beeps, \"[message]\"",2)
+ return
+
+/obj/machinery/casino_prize_dispenser/process() //Might not need this, but just to be safe for now
+ if(stat & (BROKEN|NOPOWER))
+>>>>>>> e5c108269d... Merge pull request #11454 from VOREStation/Arokha/stacks:code/modules/casino/casino_prize_vendor.dm
return
\ No newline at end of file
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 73cde92e1b..6dbe833b29 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -86,8 +86,7 @@
to_chat(user, "You remove the cables.")
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
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 36befb944e..cc8227147c 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -189,7 +189,7 @@
to_chat(user, "\The [src] is already fully repaired.")
return
var/obj/item/stack/P = C
- if(P.amount < amt)
+ if(P.get_amount() < amt)
to_chat(user, "You don't have enough sheets to repair this! You need at least [amt] sheets.")
return
to_chat(user, "You begin repairing [src]...")
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 3c392cf9a0..fa31ef365f 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -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, "You remove \the [repairing_sheet].")
playsound(src, I.usesound, 100, 1)
diff --git a/code/game/machinery/doors/door_vr.dm b/code/game/machinery/doors/door_vr.dm
index 6c36a2514d..6583b841b8 100644
--- a/code/game/machinery/doors/door_vr.dm
+++ b/code/game/machinery/doors/door_vr.dm
@@ -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, "You remove \the [reinforcing_sheet].")
playsound(src, I.usesound, 100, 1)
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index 6a593ab554..ed4b086e73 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -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
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 5a78697b2a..f3149dc78a 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -71,8 +71,7 @@
to_chat(user, "You start to dismantle the IV drip.")
if(do_after(user, 15))
to_chat(user, "You dismantle the IV drip.")
- 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
diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm
index 77eefb94c9..3fe7074b41 100644
--- a/code/game/machinery/partslathe_vr.dm
+++ b/code/game/machinery/partslathe_vr.dm
@@ -125,12 +125,12 @@
if(!(S.material.name in materials))
to_chat(user, "The [src] doesn't accept [S.material]!")
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)
diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm
index 3debf68f53..bcc1f770a3 100644
--- a/code/game/machinery/pipe/pipelayer.dm
+++ b/code/game/machinery/pipe/pipelayer.dm
@@ -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)
diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm
index 1f9c9c8f70..103ea5f7ae 100644
--- a/code/game/machinery/robot_fabricator.dm
+++ b/code/game/machinery/robot_fabricator.dm
@@ -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++
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index b57a7a3ce8..77c3187458 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -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
diff --git a/code/game/mecha/equipment/tools/cable_layer.dm b/code/game/mecha/equipment/tools/cable_layer.dm
index a431ecdcbf..8de184cb7a 100644
--- a/code/game/mecha/equipment/tools/cable_layer.dm
+++ b/code/game/mecha/equipment/tools/cable_layer.dm
@@ -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) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]"
+ return "[output] \[Cable: [cable ? cable.get_amount() : 0] m\][(cable && cable.get_amount()) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : 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)
diff --git a/code/game/mecha/equipment/tools/generator.dm b/code/game/mecha/equipment/tools/generator.dm
index 78a74bc0f8..cdb8eb4680 100644
--- a/code/game/mecha/equipment/tools/generator.dm
+++ b/code/game/mecha/equipment/tools/generator.dm
@@ -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_charge3\] - [(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate"
+ return "[output] \[[fuel]: [round(fuel.get_amount()*fuel.perunit,0.1)] cm3\] - [(datum_flags & DF_ISPROCESSING)?"Dea":"A"]ctivate"
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
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index cb7cf980f4..7b390223c2 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -665,7 +665,7 @@
visible_message("[bicon(src)] [src] 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)
@@ -673,9 +673,7 @@
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)
+ if(!S.set_amount(ejected, amount))
return
materials[matstring] -= ejected * S.perunit
if(recursive && materials[matstring] >= S.perunit)
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 8d847d0f41..a6194d2402 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -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)
diff --git a/code/game/mecha/micro/mecha_construction_paths_vr.dm b/code/game/mecha/micro/mecha_construction_paths_vr.dm
index bb865d5d3e..646cf7bc3e 100644
--- a/code/game/mecha/micro/mecha_construction_paths_vr.dm
+++ b/code/game/mecha/micro/mecha_construction_paths_vr.dm
@@ -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)
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 8af1c01a2a..b54ea59fc2 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -29,8 +29,7 @@
to_chat(user, "There is another network terminal here.")
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)
diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm
index 1340418249..bbedcc2255 100644
--- a/code/game/objects/items/stacks/marker_beacons.dm
+++ b/code/game/objects/items/stacks/marker_beacons.dm
@@ -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, "You start picking [src] up...")
- 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)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index b014c1810f..7dfa0ed492 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -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
@@ -33,8 +33,10 @@
. = ..()
if(!stacktype)
stacktype = type
- if(amount)
- src.amount = amount
+ if(!isnull(amount)) // Could be 0
+ if(amount < 0)
+ amount = max_amount
+ set_amount(amount, TRUE)
update_icon()
/obj/item/stack/Destroy()
@@ -229,12 +231,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 +256,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 +273,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 +311,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 +335,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
diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm
index e62268c2c1..4831d92e56 100644
--- a/code/game/objects/items/weapons/id cards/cards.dm
+++ b/code/game/objects/items/weapons/id cards/cards.dm
@@ -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, "You are not adding enough telecrystals to fuel \the [src].")
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, "You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses].")
qdel(O)
diff --git a/code/game/objects/items/weapons/material/whetstone.dm b/code/game/objects/items/weapons/material/whetstone.dm
index 12da5d23fd..dd0437198c 100644
--- a/code/game/objects/items/weapons/material/whetstone.dm
+++ b/code/game/objects/items/weapons/material/whetstone.dm
@@ -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)
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index f5ee30319b..268977463a 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -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, "The snatcher is full.")
@@ -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)
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index dee5e284a3..824da68846 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -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 ..()
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index b8c5d95cbf..60eb576db3 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -43,8 +43,7 @@
to_chat(user, "You start to cut the shower curtains.")
if(do_after(user, 10))
to_chat(user, "You cut the shower curtains.")
- 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
diff --git a/code/game/objects/structures/droppod.dm b/code/game/objects/structures/droppod.dm
index 5d2edc3158..551b7f6527 100644
--- a/code/game/objects/structures/droppod.dm
+++ b/code/game/objects/structures/droppod.dm
@@ -109,8 +109,7 @@
if(finished)
to_chat(user, "You start breaking down \the [src].")
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
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
index 0a0811b7c4..f7a2ba693f 100644
--- a/code/game/objects/structures/flora/trees.dm
+++ b/code/game/objects/structures/flora/trees.dm
@@ -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("\The [src] is felled!")
stump()
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index 8b54df0c6c..bd7e7836f6 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -22,8 +22,7 @@
to_chat(user, "You start to cut the plastic flaps.")
if(do_after(user, 10 * P.toolspeed))
to_chat(user, "You cut the plastic flaps.")
- var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
- A.amount = 4
+ new /obj/item/stack/material/plastic(src.loc, 4)
qdel(src)
return
else
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index ab52208b25..098861595b 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -297,7 +297,7 @@
visible_message("[user] dismantles \the [src].")
var/obj/item/stack/material/mats = new glasstype(loc)
if(is_fulltile())
- mats.amount = 4
+ mats.set_amount(4)
qdel(src)
else if(istype(W, /obj/item/stack/cable_coil) && reinf && state == 0 && !istype(src, /obj/structure/window/reinforced/polarized))
var/obj/item/stack/cable_coil/C = W
diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm
index 4f70fc5918..1168f7a081 100644
--- a/code/game/turfs/simulated/floor_attackby.dm
+++ b/code/game/turfs/simulated/floor_attackby.dm
@@ -96,7 +96,7 @@
if(!use_flooring)
return
// Do we have enough?
- if(use_flooring.build_cost && S.amount < use_flooring.build_cost)
+ if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost)
to_chat(user, "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor].")
return
// Stay still and focus...
diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm
index fc4832d845..d9d65510ee 100644
--- a/code/game/turfs/simulated/outdoors/snow.dm
+++ b/code/game/turfs/simulated/outdoors/snow.dm
@@ -31,8 +31,7 @@
to_chat(user, "You begin to remove \the [src] with your [W].")
if(do_after(user, 4 SECONDS * W.toolspeed))
to_chat(user, "\The [src] has been dug up, and now lies in a pile nearby.")
- var/obj/item/stack/material/snow/S = new(src)
- S.amount = 10
+ new /obj/item/stack/material/snow(src, 10)
demote()
else
to_chat(user, "You decide to not finish removing \the [src].")
diff --git a/code/game/turfs/simulated/outdoors/survival_action_vr.dm b/code/game/turfs/simulated/outdoors/survival_action_vr.dm
new file mode 100644
index 0000000000..c7f90171c7
--- /dev/null
+++ b/code/game/turfs/simulated/outdoors/survival_action_vr.dm
@@ -0,0 +1,79 @@
+/turf/simulated/floor/outdoors/newdirt/attack_hand(mob/user)
+ if(user.pulling)
+ return ..()
+ var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
+ if(!Adjacent(user))
+ return ..()
+ if(icon_state in has_rocks)
+ user.visible_message("[user] loosens rocks from \the [src]...", "You loosen rocks from \the [src]...")
+ if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ var/obj/item/stack/material/flint/R = new(get_turf(src), rand(1,4))
+ R.pixel_x = rand(-6,6)
+ R.pixel_y = rand(-6,6)
+ icon_state = "dirt0"
+ return
+ if(locate(/obj) in src)
+ to_chat(user, "The [name] isn't clear.")
+ return
+ else
+ var/choice= tgui_alert(user, "Do you want to build a growplot out of the dirt?", "Build growplot?" , list("Yes", "No"))
+ if(!choice||choice=="No")
+ return
+ user.visible_message("[user] starts piling up \the [src]...", "You start piling up \the [src]...")
+ if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ new /obj/machinery/portable_atmospherics/hydroponics/soil(src)
+
+/turf/simulated/floor/outdoors
+ var/rock_chance = 0
+
+/turf/simulated/floor/outdoors/proc/rock_gathering(var/mob/user as mob)
+ if(locate(/obj) in src)
+ to_chat(user, "The [name] isn't clear.")
+ return
+ user.visible_message("[user] starts digging around in \the [src]...", "You start digging around in \the [src]...")
+ if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ if(prob(rock_chance))
+ var/obj/item/stack/material/flint/R = new(get_turf(src), rand(1,4))
+ to_chat(user, "You found some [R]")
+ R.pixel_x = rand(-6,6)
+ R.pixel_y = rand(-6,6)
+ else
+ to_chat(user, "You didn't find anything...")
+ else
+ return
+
+/turf/simulated/floor/outdoors/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(istype(O, /obj/item/weapon/shovel) && rock_chance)
+ rock_gathering(user)
+ else
+ return ..()
+
+/turf/simulated/floor/outdoors/newdirt
+ rock_chance = 5
+/turf/simulated/floor/outdoors/dirt
+ rock_chance = 10
+/turf/simulated/floor/outdoors/rocks
+ rock_chance = 100
+/turf/simulated/floor/outdoors/ironsand
+ rock_chance = 50
+
+/turf/simulated/floor/outdoors/newdirt/examine(var/mob/user)
+ . = ..()
+ if(Adjacent(user))
+ var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
+ if(icon_state in has_rocks)
+ . += "There are some rocks in the dirt."
+
+/obj/structure/flora/tree
+ var/sticks = TRUE
+
+/obj/structure/flora/tree/attack_hand(mob/user)
+ if(sticks)
+ user.visible_message("[user] searches \the [src] for loose sticks...", "You search \the [src] for loose sticks...")
+ if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ var/obj/item/stack/material/stick/S = new(get_turf(user), rand(1,3))
+ S.pixel_x = rand(-6,6)
+ S.pixel_y = rand(-6,6)
+ sticks = FALSE
+ else
+ to_chat(user, "You don't see any loose sticks...")
\ No newline at end of file
diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm
index d602eb9da2..a44ebab2a9 100644
--- a/code/modules/awaymissions/loot_vr.dm
+++ b/code/modules/awaymissions/loot_vr.dm
@@ -57,8 +57,7 @@
var/bar_type = pick(possible_spawns)
for(var/i=0,i= 5)
+ if(!cable.get_amount() >= 5)
to_chat(user, "You need five units of cable to repair \the [src].")
return
diff --git a/code/modules/economy/coins.dm b/code/modules/economy/coins.dm
index 8f95a424b7..503d8f4959 100644
--- a/code/modules/economy/coins.dm
+++ b/code/modules/economy/coins.dm
@@ -76,8 +76,7 @@
..()
return
- var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
- CC.amount = 1
+ var/obj/item/stack/cable_coil/CC = new (user.loc)
CC.update_icon()
cut_overlays()
string_attached = null
diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm
index ae089d26a2..9a949ad5d9 100644
--- a/code/modules/fishing/fishing_rod.dm
+++ b/code/modules/fishing/fishing_rod.dm
@@ -58,7 +58,7 @@
return
else if(istype(I, /obj/item/stack/cable_coil) && !strung)
var/obj/item/stack/cable_coil/C = I
- if(C.amount < 5)
+ if(C.get_amount() < 5)
to_chat(user, "You do not have enough length in \the [C] to string this!")
return
if(do_after(user, rand(10 SECONDS, 20 SECONDS)))
diff --git a/code/modules/food/kitchen/smartfridge/drying_rack.dm b/code/modules/food/kitchen/smartfridge/drying_rack.dm
index c0ceea5289..346b59f2e4 100644
--- a/code/modules/food/kitchen/smartfridge/drying_rack.dm
+++ b/code/modules/food/kitchen/smartfridge/drying_rack.dm
@@ -60,7 +60,7 @@
for(var/obj/item/stack/wetleather/WL in I.instances)
if(!WL.wetness)
- if(WL.amount)
+ if(WL.get_amount())
WL.forceMove(get_turf(src))
WL.dry()
I.instances -= WL
diff --git a/code/modules/food/kitchen/smartfridge/engineering.dm b/code/modules/food/kitchen/smartfridge/engineering.dm
index 94a40b9dc3..2798854537 100644
--- a/code/modules/food/kitchen/smartfridge/engineering.dm
+++ b/code/modules/food/kitchen/smartfridge/engineering.dm
@@ -20,7 +20,7 @@
while(count > 0)
var/obj/item/stack/S = I.get_product(get_turf(src), min(count, amount))
- count -= S.amount
+ count -= S.get_amount()
SStgui.update_uis(src)
/obj/machinery/smartfridge/sheets/find_record(var/obj/item/O)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index bf83e28bf7..f1bdc5bb50 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -201,12 +201,12 @@
var/obj/item/stack/material/wood/NG = new (user.loc)
if(flesh_colour) NG.color = flesh_colour
for (var/obj/item/stack/material/wood/G in user.loc)
- if(G==NG)
+ if(G == NG)
continue
- if(G.amount>=G.max_amount)
+ if(G.get_amount() >= G.max_amount)
continue
G.attackby(NG, user)
- to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.")
+ to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.get_amount()] planks.")
qdel(src)
return
else if(!isnull(seed.chems["potato"]))
@@ -280,12 +280,12 @@
var/obj/item/stack/tile/grass/G = new (user.loc)
if(flesh_colour) G.color = flesh_colour
for (var/obj/item/stack/tile/grass/NG in user.loc)
- if(G==NG)
+ if(G == NG)
continue
- if(NG.amount>=NG.max_amount)
+ if(NG.get_amount() >= NG.max_amount)
continue
NG.attackby(G, user)
- to_chat(user, "You add the newly-formed grass to the stack. It now contains [G.amount] tiles.")
+ to_chat(user, "You add the newly-formed grass to the stack. It now contains [G.get_amount()] tiles.")
qdel(src)
return
diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index 9970f1dd5f..2089e87afb 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -40,7 +40,7 @@
if(debug)
to_chat(user, span("warning", "\The [src] does not need any material."))
return
- var/num = min((max_metal - metal) / metal_per_sheet, stack.amount)
+ var/num = min((max_metal - metal) / metal_per_sheet, stack.get_amount())
if(num < 1)
to_chat(user, span("warning", "\The [src] is too full to add more metal."))
return
diff --git a/code/modules/materials/fifty_spawner.dm b/code/modules/materials/fifty_spawner.dm
index e3ba667703..9a7786ae21 100644
--- a/code/modules/materials/fifty_spawner.dm
+++ b/code/modules/materials/fifty_spawner.dm
@@ -10,8 +10,7 @@
..()
var/turf/T = get_turf(src)
var/obj/structure/closet/C = locate() in T
- var/obj/item/stack/M = new type_to_spawn(C || T)
- M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty
+ var/obj/item/stack/M = new type_to_spawn(C || T, -1)
M.update_icon() // Some stacks have different sprites depending on how full they are.
return INITIALIZE_HINT_QDEL //Bye!
diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm
index 07b1af73ff..f059aa28c6 100644
--- a/code/modules/materials/materials/_materials.dm
+++ b/code/modules/materials/materials/_materials.dm
@@ -312,9 +312,9 @@ var/list/name_to_material
place_sheet(target)
// Debris product. Used ALL THE TIME.
-/datum/material/proc/place_sheet(var/turf/target)
+/datum/material/proc/place_sheet(var/turf/target, amount)
if(stack_type)
- return new stack_type(target)
+ return new stack_type(target, amount)
// As above.
/datum/material/proc/place_shard(var/turf/target)
diff --git a/code/modules/materials/sheets/organic/tanning/hide.dm b/code/modules/materials/sheets/organic/tanning/hide.dm
index e9617ba921..b6b7778132 100644
--- a/code/modules/materials/sheets/organic/tanning/hide.dm
+++ b/code/modules/materials/sheets/organic/tanning/hide.dm
@@ -24,14 +24,14 @@
//Try locating an exisitng stack on the tile and add to there if possible
var/obj/item/stack/hairlesshide/H = null
for(var/obj/item/stack/hairlesshide/HS in user.loc) // Could be scraping something inside a locker, hence the .loc, not get_turf
- if(HS.amount < HS.max_amount)
+ if(HS.get_amount() < HS.max_amount)
H = HS
break
// Either we found a valid stack, in which case increment amount,
// Or we need to make a new stack
if(istype(H))
- H.amount++
+ H.add(1)
else
H = new /obj/item/stack/hairlesshide(user.loc)
diff --git a/code/modules/materials/sheets/organic/tanning/hide_hairless.dm b/code/modules/materials/sheets/organic/tanning/hide_hairless.dm
index 72b235e415..f504e24a9f 100644
--- a/code/modules/materials/sheets/organic/tanning/hide_hairless.dm
+++ b/code/modules/materials/sheets/organic/tanning/hide_hairless.dm
@@ -21,14 +21,14 @@
for(var/i in 1 to wateramount)
var/obj/item/stack/wetleather/H = null
for(var/obj/item/stack/wetleather/HS in get_turf(src)) // Doesn't have a user, can't just use their loc
- if(HS.amount < HS.max_amount)
+ if(HS.get_amount() < HS.max_amount)
H = HS
break
// Either we found a valid stack, in which case increment amount,
// Or we need to make a new stack
if(istype(H))
- H.amount++
+ H.add(1)
else
H = new /obj/item/stack/wetleather(get_turf(src))
diff --git a/code/modules/materials/sheets/organic/tanning/leather_wet.dm b/code/modules/materials/sheets/organic/tanning/leather_wet.dm
index 64f672512c..6d1df6fd75 100644
--- a/code/modules/materials/sheets/organic/tanning/leather_wet.dm
+++ b/code/modules/materials/sheets/organic/tanning/leather_wet.dm
@@ -38,9 +38,8 @@
dry()
/obj/item/stack/wetleather/proc/dry()
- var/obj/item/stack/material/leather/L = new(src.loc)
- L.amount = amount
- use(amount)
+ var/obj/item/stack/material/leather/L = new(src.loc, get_amount())
+ use(get_amount())
return L
/obj/item/stack/wetleather/transfer_to(obj/item/stack/S, var/tamount=null, var/type_verified)
diff --git a/code/modules/materials/sheets/organic/tanning/tanning_rack.dm b/code/modules/materials/sheets/organic/tanning/tanning_rack.dm
index 885b65dd8f..fdd0fce35e 100644
--- a/code/modules/materials/sheets/organic/tanning/tanning_rack.dm
+++ b/code/modules/materials/sheets/organic/tanning/tanning_rack.dm
@@ -41,7 +41,7 @@
drying = A
else // Drying something, add if possible
var/obj/item/stack/wetleather/W = A
- W.transfer_to(drying, W.amount, TRUE)
+ W.transfer_to(drying, W.get_amount(), TRUE)
update_icon()
return TRUE
return ..()
@@ -50,9 +50,8 @@
if(drying)
var/obj/item/stack/S = drying
if(!drying.wetness) // If it's dry, make a stack of dry leather and prepare to put that in their hands
- var/obj/item/stack/material/leather/L = new(src)
- L.amount = drying.amount
- drying.use(drying.amount)
+ var/obj/item/stack/material/leather/L = new(src, drying.get_amount())
+ drying.set_amount(0)
S = L
if(ishuman(user))
diff --git a/code/modules/materials/sheets/organic/wood.dm b/code/modules/materials/sheets/organic/wood.dm
index d3d1fd6418..00e2ddbfe9 100644
--- a/code/modules/materials/sheets/organic/wood.dm
+++ b/code/modules/materials/sheets/organic/wood.dm
@@ -47,9 +47,8 @@
existing_wood = M
break
- var/obj/item/stack/material/wood/new_wood = new plank_type(user.loc)
- new_wood.amount = 2
+ var/obj/item/stack/material/wood/new_wood = new plank_type(user.loc, 2)
if(existing_wood && new_wood.transfer_to(existing_wood))
- to_chat(user, "You add the newly-formed wood to the stack. It now contains [existing_wood.amount] planks.")
+ to_chat(user, "You add the newly-formed wood to the stack. It now contains [existing_wood.get_amount()] planks.")
else
return ..()
diff --git a/code/modules/mining/machinery/machine_stacking.dm b/code/modules/mining/machinery/machine_stacking.dm
index b0b2a7890e..6567625b54 100644
--- a/code/modules/mining/machinery/machine_stacking.dm
+++ b/code/modules/mining/machinery/machine_stacking.dm
@@ -62,10 +62,8 @@
var/stack = params["stack"]
if(machine.stack_storage[stack] > 0)
var/stacktype = machine.stack_paths[stack]
- var/obj/item/stack/material/S = new stacktype(get_turf(machine.output))
- S.amount = machine.stack_storage[stack]
+ new stacktype(get_turf(machine.output), machine.stack_storage[stack])
machine.stack_storage[stack] = 0
- S.update_icon()
. = TRUE
add_fingerprint(usr)
@@ -125,7 +123,7 @@
var/obj/item/stack/material/S = O
var/matname = S.material.name
if(!isnull(stack_storage[matname]))
- stack_storage[matname] += S.amount
+ stack_storage[matname] += S.get_amount()
qdel(S)
else
O.loc = output.loc
@@ -136,10 +134,8 @@
for(var/sheet in stack_storage)
if(stack_storage[sheet] >= stack_amt)
var/stacktype = stack_paths[sheet]
- var/obj/item/stack/material/S = new stacktype (get_turf(output))
- S.amount = stack_amt
+ new stacktype (get_turf(output), stack_amt)
stack_storage[sheet] -= stack_amt
- S.update_icon()
if(console)
console.updateUsrDialog()
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index f525230124..9e869e0d81 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -298,8 +298,7 @@
new /obj/item/device/assembly/prox_sensor(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
- var/obj/item/stack/tile/floor/T = new /obj/item/stack/tile/floor(Tsec)
- T.amount = amount
+ new /obj/item/stack/tile/floor(Tsec, amount)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
index 474c38b848..32e5c902e8 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
@@ -310,8 +310,8 @@
to_chat(src,"You can't process [substance]!")
return //Only a few things matter, the rest are best not cluttering the lists.
- var/howmuch = input(src,"How much do you want to store? (0-[matstack.amount])","Select amount") as null|num
- if(!howmuch || matstack != get_active_hand() || howmuch > matstack.amount)
+ var/howmuch = input(src,"How much do you want to store? (0-[matstack.get_amount()])","Select amount") as null|num
+ if(!howmuch || matstack != get_active_hand() || howmuch > matstack.get_amount())
return //Quietly fail
var/actually_added = refactory.add_stored_material(substance,howmuch*matstack.perunit)
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
index f3f5b7a315..b31bff8e73 100755
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
@@ -139,10 +139,19 @@
H.synth_color = TRUE
/datum/species/protean/equip_survival_gear(var/mob/living/carbon/human/H)
+<<<<<<< HEAD
var/boxtype = /obj/item/weapon/storage/box/survival //CHOMP Addition
var/obj/item/stack/material/steel/metal_stack = new()
metal_stack.amount = 5 //CHOMP Edit
+||||||| parent of e5c108269d... Merge pull request #11454 from VOREStation/Arokha/stacks
+ var/obj/item/stack/material/steel/metal_stack = new()
+ metal_stack.amount = 3
+
+=======
+ var/obj/item/stack/material/steel/metal_stack = new(null, 3)
+
+>>>>>>> e5c108269d... Merge pull request #11454 from VOREStation/Arokha/stacks
var/obj/item/clothing/accessory/permit/nanotech/permit = new()
permit.set_name(H.real_name)
diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm
index af37f156c5..9a865d3ce1 100644
--- a/code/modules/mob/living/simple_mob/defense.dm
+++ b/code/modules/mob/living/simple_mob/defense.dm
@@ -62,11 +62,8 @@
// This could be done better.
var/obj/item/stack/medical/MED = O
if(health < getMaxHealth())
- if(MED.amount >= 1)
+ if(MED.use(1))
adjustBruteLoss(-MED.heal_brute)
- MED.amount -= 1
- if(MED.amount <= 0)
- qdel(MED)
visible_message("\The [user] applies the [MED] on [src].")
else
var/datum/gender/T = gender_datums[src.get_visible_gender()]
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
index 59ab8e7585..d0d1cf8bed 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
@@ -757,8 +757,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
if(do_after(user, sheartime, exclusive = TASK_USER_EXCLUSIVE, target = src))
user.visible_message("\The [user] shears \the [src] with \the [tool].","You shear \the [src] with \the [tool].")
amount_grown = rand(0,250)
- var/obj/item/stack/material/fur/F = new(get_turf(user))
- F.amount = rand(10,15)
+ var/obj/item/stack/material/fur/F = new(get_turf(user), rand(10,15))
F.color = marking_color
teppi_wool = FALSE
update_icon()
diff --git a/code/modules/persistence/storage/smartfridge.dm b/code/modules/persistence/storage/smartfridge.dm
index 3962262154..9978168c65 100644
--- a/code/modules/persistence/storage/smartfridge.dm
+++ b/code/modules/persistence/storage/smartfridge.dm
@@ -57,8 +57,7 @@
continue
while(count > 0)
- inst = new real_path
- inst.amount = min(count, max_amount)
+ inst = new real_path(null, min(count, max_amount))
count -= inst.get_amount()
. += inst
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 41486dc621..3fd25a83e4 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -559,7 +559,7 @@ GLOBAL_LIST_EMPTY(apcs)
"You start adding cables to the APC frame...")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
- if(C.amount >= 10 && !terminal && opened && has_electronics != APC_HAS_ELECTRONICS_SECURED)
+ if(C.get_amount() >= 10 && !terminal && opened && has_electronics != APC_HAS_ELECTRONICS_SECURED)
var/obj/structure/cable/N = T.get_cable_node()
if(prob(50) && electrocute_mob(usr, N, N))
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index abf536f651..d5993805da 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -163,10 +163,8 @@
//Removes one stack's worth of material from the generator.
/obj/machinery/power/port_gen/pacman/DropFuel()
if(sheets)
- var/obj/item/stack/material/S = new sheet_path(loc)
- var/amount = min(sheets, S.max_amount)
- S.amount = amount
- sheets -= amount
+ var/obj/item/stack/material/S = new sheet_path(loc, sheets)
+ sheets -= S.get_amount()
/obj/machinery/power/port_gen/pacman/UseFuel()
@@ -265,7 +263,7 @@
/obj/machinery/power/port_gen/pacman/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, sheet_path))
var/obj/item/stack/addstack = O
- var/amount = min((max_sheets - sheets), addstack.amount)
+ var/amount = min((max_sheets - sheets), addstack.get_amount())
if(amount < 1)
to_chat(user, "The [src.name] is full!")
return
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 829f07ce37..3dd58f6d7d 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -216,7 +216,7 @@
to_chat(user, "\The [src] is already fully repaired.")
return
var/obj/item/stack/P = W
- if(P.amount < amt)
+ if(!P.can_use(amt))
to_chat(user, "You don't have enough sheets to repair this! You need at least [amt] sheets.")
return
to_chat(user, "You begin repairing \the [src]...")
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index f07b68f763..ac6748fb23 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -63,8 +63,7 @@ GLOBAL_LIST_EMPTY(solars_list)
if(do_after(user, 50))
var/obj/item/solar_assembly/S = new(loc)
S.anchored = TRUE
- var/obj/item/stack/glass = new glass_type(loc)
- glass.amount = 2
+ new glass_type(loc, 2)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the solar panel.")
qdel(src)
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 299d4de823..d6f4603865 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -58,8 +58,7 @@
var/obj/item/solar_assembly/S = new(loc)
S.tracker = TRUE
S.anchored = TRUE
- var/obj/item/stack/glass = new glass_type(loc)
- glass.amount = 2
+ new glass_type(loc, 2)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] takes the glass off the tracker.")
qdel(src)
diff --git a/code/modules/reagents/machinery/grinder.dm b/code/modules/reagents/machinery/grinder.dm
index 3b5ea9e4fd..738830ed1c 100644
--- a/code/modules/reagents/machinery/grinder.dm
+++ b/code/modules/reagents/machinery/grinder.dm
@@ -232,7 +232,7 @@
var/obj/item/stack/stack = O
if(istype(stack))
var/list/sheet_components = sheet_reagents[stack.type]
- var/amount_to_take = max(0,min(stack.amount,round(remaining_volume/REAGENTS_PER_SHEET)))
+ var/amount_to_take = max(0,min(stack.get_amount(),round(remaining_volume/REAGENTS_PER_SHEET)))
if(amount_to_take)
stack.use(amount_to_take)
if(QDELETED(stack))
diff --git a/code/modules/reagents/reactions/instant/instant_vr.dm b/code/modules/reagents/reactions/instant/instant_vr.dm
index 4eef9c3492..40015eb871 100644
--- a/code/modules/reagents/reactions/instant/instant_vr.dm
+++ b/code/modules/reagents/reactions/instant/instant_vr.dm
@@ -271,9 +271,7 @@
var/chosen = pick(material)
if(chosen in rare_types)
spawn_amount = rand(1,15)
- var/obj/item/stack/material/C = new chosen
- C.amount = spawn_amount
- C.loc = get_turf(holder.my_atom)
+ new chosen(get_turf(holder.my_atom), spawn_amount)
/decl/chemical_reaction/instant/slimelight
name = "Slime Glow"
@@ -297,9 +295,7 @@
result_amount = 1
/decl/chemical_reaction/instant/slimephoron/on_reaction(var/datum/reagents/holder)
- var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
- P.amount = 10
- P.loc = get_turf(holder.my_atom)
+ new /obj/item/stack/material/phoron(get_turf(holder.my_atom), 10)
/decl/chemical_reaction/instant/slimefreeze
name = "Slime Freeze"
diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm
index b6990ac5a2..479eaa4f46 100644
--- a/code/modules/reagents/reagents/medicine.dm
+++ b/code/modules/reagents/reagents/medicine.dm
@@ -349,11 +349,11 @@
if(istype(O, /obj/item/stack/medical/bruise_pack) && round(volume) >= 5)
var/obj/item/stack/medical/bruise_pack/C = O
var/packname = C.name
- var/to_produce = min(C.amount, round(volume / 5))
+ var/to_produce = min(C.get_amount(), round(volume / 5))
var/obj/item/stack/medical/M = C.upgrade_stack(to_produce)
- if(M && M.amount)
+ if(M && M.get_amount())
holder.my_atom.visible_message("\The [packname] bubbles.")
remove_self(to_produce * 5)
@@ -1284,11 +1284,11 @@
if(istype(O, /obj/item/stack/medical/crude_pack) && round(volume) >= 1)
var/obj/item/stack/medical/crude_pack/C = O
var/packname = C.name
- var/to_produce = min(C.amount, round(volume))
+ var/to_produce = min(C.get_amount(), round(volume))
var/obj/item/stack/medical/M = C.upgrade_stack(to_produce)
- if(M && M.amount)
+ if(M && M.get_amount())
holder.my_atom.visible_message("\The [packname] bubbles.")
remove_self(to_produce)
diff --git a/code/modules/recycling/recycling.dm b/code/modules/recycling/recycling.dm
index 26eab561e2..37a6081de9 100644
--- a/code/modules/recycling/recycling.dm
+++ b/code/modules/recycling/recycling.dm
@@ -188,8 +188,8 @@
var/stacktype = M.stack_type
var/turf/T = get_step(src, dir)
var/obj/item/stack/S = locate(stacktype) in T
- if(S)
- S.amount++
+ if(S && S.get_amount() < S.max_amount)
+ S.add(1)
else
new stacktype(T)
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index f793c0318a..9cf8d4d338 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -100,8 +100,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
if(materials[f] >= SHEET_MATERIAL_AMOUNT)
var/path = getMaterialType(f)
if(path)
- var/obj/item/stack/S = new path(loc)
- S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT)
+ new path(loc, round(materials[f] / SHEET_MATERIAL_AMOUNT))
..()
/obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 11c44f3e15..a9e9f93ae4 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -233,7 +233,7 @@
new_item.matter[i] = new_item.matter[i] * mat_efficiency
/obj/machinery/r_n_d/protolathe/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
material = lowertext(material)
var/obj/item/stack/material/mattype
var/datum/material/MAT = get_material_by_name(material)
@@ -250,9 +250,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(ejected, amount))
return
materials[material] -= ejected * S.perunit
if(recursive && materials[material] >= S.perunit)
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 76bbe9d167..885ba75297 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -38,6 +38,5 @@
eject = amount == -1 ? eject : min(eject, amount)
if(eject < 1)
return
- var/obj/item/stack/material/S = new sheetType(loc)
- S.amount = eject
+ new sheetType(loc, eject)
materials[material] -= eject * perUnit
diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm
index 205db962b0..5440ed36fb 100644
--- a/code/modules/resleeving/machines.dm
+++ b/code/modules/resleeving/machines.dm
@@ -394,9 +394,9 @@
var/amnt = S.perunit
if(stored_material[S.material.name] + amnt <= max_res_amount)
- if(S && S.amount >= 1)
+ if(S && S.get_amount() >= 1)
var/count = 0
- while(stored_material[S.material.name] + amnt <= max_res_amount && S.amount >= 1)
+ while(stored_material[S.material.name] + amnt <= max_res_amount && S.get_amount() >= 1)
stored_material[S.material.name] += amnt
S.use(1)
count++