Files
Paradise/code/game/machinery/vending.dm
T
2021-07-16 17:34:06 +01:00

1781 lines
80 KiB
Plaintext

/**
* Datum used to hold information about a product in a vending machine
*/
/datum/data/vending_product
name = "generic"
///Typepath of the product that is created when this record "sells"
var/product_path = null
///How many of this product we currently have
var/amount = 0
///How many we can store at maximum
var/max_amount = 0
var/price = 0 // Price to buy one
/obj/machinery/vending
name = "\improper Vendomat"
desc = "A generic vending machine."
icon = 'icons/obj/vending.dmi'
icon_state = "generic"
layer = 2.9
anchored = 1
density = 1
max_integrity = 300
integrity_failure = 100
armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
/// Icon_state when vending
var/icon_vend
/// Icon_state when denying access
var/icon_deny
// Power
use_power = IDLE_POWER_USE
idle_power_usage = 10
var/vend_power_usage = 150
// Vending-related
/// No sales pitches if off
var/active = 1
/// If off, vendor is busy and unusable until current action finishes
var/vend_ready = TRUE
/// How long vendor takes to vend one item.
var/vend_delay = 10
/// Item currently being bought
var/datum/data/vending_product/currently_vending = null
// To be filled out at compile time
var/list/products = list() // For each, use the following pattern:
var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2)
var/list/premium = list() // No specified amount = only one in stock
var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price.
// List of vending_product items available.
var/list/product_records = list()
var/list/hidden_records = list()
var/list/coin_records = list()
var/list/imagelist = list()
/// Unimplemented list of ads that are meant to show up somewhere, but don't.
var/list/ads_list = list()
// Stuff relating vocalizations
/// List of slogans the vendor will say, optional
var/list/slogan_list = list()
var/vend_reply //Thank you for shopping!
/// If true, prevent saying sales pitches
var/shut_up = FALSE
///can we access the hidden inventory?
var/extended_inventory = FALSE
var/last_reply = 0
var/last_slogan = 0 //When did we last pitch?
var/slogan_delay = 6000 //How long until we can pitch again?
//The type of refill canisters used by this machine.
var/obj/item/vending_refill/refill_canister = null
// Things that can go wrong
/// Allows people to access a vendor that's normally access restricted.
emagged = 0
/// Shocks people like an airlock
var/seconds_electrified = 0
/// Fire items at customers! We're broken!
var/shoot_inventory = FALSE
/// How hard are we firing the items?
var/shoot_speed = 3
/// How often are we firing the items? (prob(...))
var/shoot_chance = 2
/// If true, enforce access checks on customers. Disabled by messing with wires.
var/scan_id = TRUE
/// Holder for a coin inserted into the vendor
var/obj/item/coin/coin
var/datum/wires/vending/wires = null
/// boolean, whether this vending machine can accept people inserting items into it, used for coffee vendors
var/item_slot = FALSE
/// the actual item inserted
var/obj/item/inserted_item = null
/// blocks further flickering while true
var/flickering = FALSE
/// do I look unpowered, even when powered?
var/force_no_power_icon_state = FALSE
/obj/machinery/vending/Initialize(mapload)
. = ..()
var/build_inv = FALSE
if(!refill_canister)
build_inv = TRUE
else
component_parts = list()
var/obj/item/circuitboard/vendor/V = new
V.set_type(replacetext(name, "\improper", ""))
component_parts += V
component_parts += new refill_canister
RefreshParts()
wires = new(src)
if(build_inv) //non-constructable vending machine
build_inventory(products, product_records)
build_inventory(contraband, hidden_records)
build_inventory(premium, coin_records)
for(var/datum/data/vending_product/R in (product_records + coin_records + hidden_records))
var/obj/item/I = R.product_path
var/pp = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-")
imagelist[pp] = "[icon2base64(icon(initial(I.icon), initial(I.icon_state)))]"
if(LAZYLEN(slogan_list))
// So not all machines speak at the exact same time.
// The first time this machine says something will be at slogantime + this random value,
// so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is created.
last_slogan = world.time + rand(0, slogan_delay)
power_change()
/obj/machinery/vending/Destroy()
SStgui.close_uis(wires)
QDEL_NULL(wires)
QDEL_NULL(coin)
QDEL_NULL(inserted_item)
return ..()
/obj/machinery/vending/RefreshParts() //Better would be to make constructable child
if(!component_parts)
return
product_records = list()
hidden_records = list()
coin_records = list()
if(refill_canister)
build_inventory(products, product_records, start_empty = TRUE)
build_inventory(contraband, hidden_records, start_empty = TRUE)
build_inventory(premium, coin_records, start_empty = TRUE)
for(var/obj/item/vending_refill/VR in component_parts)
restock(VR)
/obj/machinery/vending/update_icon()
cut_overlays()
if(panel_open)
add_overlay(image(icon, "[initial(icon_state)]-panel"))
if(stat & BROKEN)
icon_state = "[initial(icon_state)]-broken"
else if (stat & NOPOWER || force_no_power_icon_state)
icon_state = "[initial(icon_state)]-off"
else
icon_state = initial(icon_state)
/*
* Reimp, flash the screen on and off repeatedly.
*/
/obj/machinery/vending/flicker()
if(flickering)
return FALSE
if(stat & (BROKEN|NOPOWER))
return FALSE
flickering = TRUE
INVOKE_ASYNC(src, /obj/machinery/vending/.proc/flicker_event)
return TRUE
/*
* Proc to be called by invoke_async in the above flicker() proc.
*/
/obj/machinery/vending/proc/flicker_event()
var/amount = rand(5, 15)
for(var/i in 1 to amount)
force_no_power_icon_state = TRUE
update_icon()
sleep(rand(1, 3))
force_no_power_icon_state = FALSE
update_icon()
sleep(rand(1, 10))
update_icon()
flickering = FALSE
/**
* Build src.produdct_records from the products lists
*
* src.products, src.contraband, src.premium, and src.prices allow specifying
* products that the vending machine is to carry without manually populating
* src.product_records.
*/
/obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, start_empty = FALSE)
for(var/typepath in productlist)
var/amount = productlist[typepath]
if(isnull(amount))
amount = 0
var/atom/temp = typepath
var/datum/data/vending_product/R = new /datum/data/vending_product()
R.name = initial(temp.name)
R.product_path = typepath
if(!start_empty)
R.amount = amount
R.max_amount = amount
R.price = (typepath in prices) ? prices[typepath] : 0
recordlist += R
/**
* Refill a vending machine from a refill canister
*
* This takes the products from the refill canister and then fills the products,contraband and premium product categories
*
* Arguments:
* * canister - the vending canister we are refilling from
*/
/obj/machinery/vending/proc/restock(obj/item/vending_refill/canister)
if(!canister.products)
canister.products = products.Copy()
if(!canister.contraband)
canister.contraband = contraband.Copy()
if(!canister.premium)
canister.premium = premium.Copy()
. = 0
. += refill_inventory(canister.products, product_records)
. += refill_inventory(canister.contraband, hidden_records)
. += refill_inventory(canister.premium, coin_records)
/**
* Refill our inventory from the passed in product list into the record list
*
* Arguments:
* * productlist - list of types -> amount
* * recordlist - existing record datums
*/
/obj/machinery/vending/proc/refill_inventory(list/productlist, list/recordlist)
. = 0
for(var/R in recordlist)
var/datum/data/vending_product/record = R
var/diff = min(record.max_amount - record.amount, productlist[record.product_path])
if (diff)
productlist[record.product_path] -= diff
record.amount += diff
. += diff
/**
* Set up a refill canister that matches this machines products
*
* This is used when the machine is deconstructed, so the items aren't "lost"
*/
/obj/machinery/vending/proc/update_canister()
if(!component_parts)
return
var/obj/item/vending_refill/R = locate() in component_parts
if(!R)
CRASH("Constructible vending machine did not have a refill canister")
R.products = unbuild_inventory(product_records)
R.contraband = unbuild_inventory(hidden_records)
R.premium = unbuild_inventory(coin_records)
/**
* Given a record list, go through and and return a list of type -> amount
*/
/obj/machinery/vending/proc/unbuild_inventory(list/recordlist)
. = list()
for(var/R in recordlist)
var/datum/data/vending_product/record = R
.[record.product_path] += record.amount
/obj/machinery/vending/deconstruct(disassembled = TRUE)
eject_item()
if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame.
new /obj/item/stack/sheet/metal(loc, 3)
qdel(src)
else
..()
/obj/machinery/vending/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/coin))
if(!premium.len)
to_chat(user, "<span class='warning'>[src] does not accept coins.</span>")
return
if(coin)
to_chat(user, "<span class='warning'>There is already a coin in this machine!</span>")
return
if(!user.drop_item())
return
I.forceMove(src)
coin = I
to_chat(user, "<span class='notice'>You insert [I] into [src].</span>")
SStgui.update_uis(src)
return
if(refill_canister && istype(I, refill_canister))
if(!panel_open)
to_chat(user, "<span class='warning'>You should probably unscrew the service panel first!</span>")
else if (stat & (BROKEN|NOPOWER))
to_chat(user, "<span class='notice'>[src] does not respond.</span>")
else
//if the panel is open we attempt to refill the machine
var/obj/item/vending_refill/canister = I
if(canister.get_part_rating() == 0)
to_chat(user, "<span class='warning'>[canister] is empty!</span>")
else
// instantiate canister if needed
var/transferred = restock(canister)
if(transferred)
to_chat(user, "<span class='notice'>You loaded [transferred] items in [src].</span>")
else
to_chat(user, "<span class='warning'>There's nothing to restock!</span>")
return
if(item_slot_check(user, I))
insert_item(user, I)
return
return ..()
/obj/machinery/vending/crowbar_act(mob/user, obj/item/I)
if(!component_parts)
return
. = TRUE
default_deconstruction_crowbar(user, I)
/obj/machinery/vending/multitool_act(mob/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
wires.Interact(user)
/obj/machinery/vending/screwdriver_act(mob/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(anchored)
panel_open = !panel_open
panel_open ? SCREWDRIVER_OPEN_PANEL_MESSAGE : SCREWDRIVER_CLOSE_PANEL_MESSAGE
update_icon()
SStgui.update_uis(src)
/obj/machinery/vending/wirecutter_act(mob/user, obj/item/I)
. = TRUE
if(I.use_tool(src, user, 0, volume = 0))
wires.Interact(user)
/obj/machinery/vending/wrench_act(mob/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, 0, volume = 0))
return
default_unfasten_wrench(user, I, time = 60)
//Override this proc to do per-machine checks on the inserted item, but remember to call the parent to handle these generic checks before your logic!
/obj/machinery/vending/proc/item_slot_check(mob/user, obj/item/I)
if(!item_slot)
return FALSE
if(inserted_item)
to_chat(user, "<span class='warning'>There is something already inserted!</span>")
return FALSE
return TRUE
/* Example override for item_slot_check proc:
/obj/machinery/vending/example/item_slot_check(mob/user, obj/item/I)
if(!..())
return FALSE
if(!istype(I, /obj/item/toy))
to_chat(user, "<span class='warning'>[I] isn't compatible with this machine's slot.</span>")
return FALSE
return TRUE
*/
/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W)
if(!istype(W))
return FALSE
if(!W.works_from_distance)
return FALSE
if(!component_parts || !refill_canister)
return FALSE
var/moved = 0
if(panel_open || W.works_from_distance)
if(W.works_from_distance)
to_chat(user, display_parts(user))
for(var/I in W)
if(istype(I, refill_canister))
moved += restock(I)
else
to_chat(user, display_parts(user))
if(moved)
to_chat(user, "[moved] items restocked.")
W.play_rped_sound()
return TRUE
/obj/machinery/vending/on_deconstruction()
update_canister()
. = ..()
/obj/machinery/vending/proc/insert_item(mob/user, obj/item/I)
if(!item_slot || inserted_item)
return
if(!user.drop_item())
to_chat(user, "<span class='warning'>[I] is stuck to your hand, you can't seem to put it down!</span>")
return
inserted_item = I
I.forceMove(src)
to_chat(user, "<span class='notice'>You insert [I] into [src].</span>")
SStgui.update_uis(src)
/obj/machinery/vending/proc/eject_item(mob/user)
if(!item_slot || !inserted_item)
return
var/put_on_turf = TRUE
if(user && iscarbon(user) && user.Adjacent(src))
if(user.put_in_hands(inserted_item))
put_on_turf = FALSE
if(put_on_turf)
var/turf/T = get_turf(src)
inserted_item.forceMove(T)
inserted_item = null
SStgui.update_uis(src)
/obj/machinery/vending/emag_act(user as mob)
emagged = TRUE
to_chat(user, "You short out the product lock on [src]")
/obj/machinery/vending/proc/pay_with_cash(obj/item/stack/spacecash/cashmoney, mob/user)
if(currently_vending.price > cashmoney.amount)
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
to_chat(usr, "[bicon(cashmoney)] <span class='warning'>That is not enough money.</span>")
return FALSE
// Bills (banknotes) cannot really have worth different than face value,
// so we have to eat the bill and spit out change in a bundle
// This is really dirty, but there's no superclass for all bills, so we
// just assume that all spacecash that's not something else is a bill
visible_message("<span class='info'>[usr] inserts a credit chip into [src].</span>")
cashmoney.use(currently_vending.price)
// Vending machines have no idea who paid with cash
GLOB.vendor_account.credit(currently_vending.price, "Sale of [currently_vending.name]", name, "(cash)")
return TRUE
/obj/machinery/vending/proc/pay_with_card(obj/item/card/id/I, mob/M)
visible_message("<span class='info'>[M] swipes a card through [src].</span>")
return pay_with_account(get_card_account(I), M)
/obj/machinery/vending/proc/pay_with_account(datum/money_account/customer_account, mob/M)
if(!customer_account)
to_chat(M, "<span class='warning'>Error: Unable to access account. Please contact technical support if problem persists.</span>")
return FALSE
if(customer_account.suspended)
to_chat(M, "<span class='warning'>Unable to access account: account suspended.</span>")
return FALSE
// Have the customer punch in the PIN before checking if there's enough money.
// Prevents people from figuring out acct is empty at high security levels
if(customer_account.security_level != 0)
// If card requires pin authentication (ie seclevel 1 or 2)
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
if(!attempt_account_access(customer_account.account_number, attempt_pin, 2))
to_chat(M, "<span class='warning'>Unable to access account: incorrect credentials.</span>")
return FALSE
if(currently_vending.price > customer_account.money)
to_chat(M, "<span class='warning'>Your bank account has insufficient money to purchase this.</span>")
return FALSE
// Okay to move the money at this point
customer_account.charge(currently_vending.price, GLOB.vendor_account,
"Purchase of [currently_vending.name]", name, GLOB.vendor_account.owner_name,
"Sale of [currently_vending.name]", customer_account.owner_name)
return TRUE
/obj/machinery/vending/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/vending/attack_ghost(mob/user)
return attack_hand(user)
/obj/machinery/vending/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
if(src.seconds_electrified != 0)
if(src.shock(user, 100))
return
ui_interact(user)
wires.Interact(user)
/obj/machinery/vending/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
var/estimated_height = 100 + min(length(product_records) * 34, 500)
if(length(prices) > 0)
estimated_height += 100 // to account for the "current user" interface
ui = new(user, src, ui_key, "Vending", name, 470, estimated_height, master_ui, state)
ui.open()
/obj/machinery/vending/ui_data(mob/user)
var/list/data = list()
var/mob/living/carbon/human/H
var/obj/item/card/id/C
data["guestNotice"] = "No valid ID card detected. Wear your ID, or present cash.";
data["userMoney"] = 0
data["user"] = null
if(ishuman(user))
H = user
C = H.get_idcard(TRUE)
if(!C && istype(H.wear_pda, /obj/item/pda))
var/obj/item/pda/P = H.wear_pda
if(istype(P.id, /obj/item/card/id))
C = P.id
var/obj/item/stack/spacecash/S = H.get_active_hand()
if(istype(S))
data["userMoney"] = S.amount
data["guestNotice"] = "Accepting Cash. You have: [S.amount] credits."
else if(istype(C))
var/datum/money_account/A = get_card_account(C)
if(istype(A))
data["user"] = list()
data["user"]["name"] = A.owner_name
data["userMoney"] = A.money
data["user"]["job"] = (istype(C) && C.rank) ? C.rank : "No Job"
else
data["guestNotice"] = "Unlinked ID detected. Present cash to pay.";
data["stock"] = list()
for (var/datum/data/vending_product/R in product_records + coin_records + hidden_records)
data["stock"][R.name] = R.amount
data["extended_inventory"] = extended_inventory
data["vend_ready"] = vend_ready
data["coin_name"] = coin ? coin.name : FALSE
data["panel_open"] = panel_open ? TRUE : FALSE
data["speaker"] = shut_up ? FALSE : TRUE
data["item_slot"] = item_slot // boolean
data["inserted_item_name"] = inserted_item ? inserted_item.name : FALSE
return data
/obj/machinery/vending/ui_static_data(mob/user)
var/list/data = list()
data["chargesMoney"] = length(prices) > 0 ? TRUE : FALSE
data["product_records"] = list()
var/i = 1
for (var/datum/data/vending_product/R in product_records)
var/list/data_pr = list(
path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"),
name = R.name,
price = (R.product_path in prices) ? prices[R.product_path] : 0,
max_amount = R.max_amount,
req_coin = FALSE,
is_hidden = FALSE,
inum = i
)
data["product_records"] += list(data_pr)
i++
data["coin_records"] = list()
for (var/datum/data/vending_product/R in coin_records)
var/list/data_cr = list(
path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"),
name = R.name,
price = (R.product_path in prices) ? prices[R.product_path] : 0,
max_amount = R.max_amount,
req_coin = TRUE,
is_hidden = FALSE,
inum = i,
premium = TRUE
)
data["coin_records"] += list(data_cr)
i++
data["hidden_records"] = list()
for (var/datum/data/vending_product/R in hidden_records)
var/list/data_hr = list(
path = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-"),
name = R.name,
price = (R.product_path in prices) ? prices[R.product_path] : 0,
max_amount = R.max_amount,
req_coin = FALSE,
is_hidden = TRUE,
inum = i,
premium = TRUE
)
data["hidden_records"] += list(data_hr)
i++
data["imagelist"] = imagelist
return data
/obj/machinery/vending/ui_act(action, params)
. = ..()
if(.)
return
if(issilicon(usr) && !isrobot(usr))
to_chat(usr, "<span class='warning'>The vending machine refuses to interface with you, as you are not in its target demographic!</span>")
return
switch(action)
if("toggle_voice")
if(panel_open)
shut_up = !shut_up
. = TRUE
if("eject_item")
eject_item(usr)
. = TRUE
if("remove_coin")
if(!coin)
to_chat(usr, "<span class='warning'>There is no coin in this machine.</span>")
return
if(istype(usr, /mob/living/silicon))
to_chat(usr, "<span class='warning'>You lack hands.</span>")
return
to_chat(usr, "<span class='notice'>You remove [coin] from [src].</span>")
usr.put_in_hands(coin)
coin = null
. = TRUE
if("vend")
if(!vend_ready)
to_chat(usr, "<span class='warning'>The vending machine is busy!</span>")
return
if(panel_open)
to_chat(usr, "<span class='warning'>The vending machine cannot dispense products while its service panel is open!</span>")
return
var/key = text2num(params["inum"])
var/list/display_records = product_records + coin_records
if(extended_inventory)
display_records = product_records + coin_records + hidden_records
if(key < 1 || key > length(display_records))
to_chat(usr, "<span class='warning'>ERROR: invalid inum passed to vendor. Report this bug.</span>")
return
var/datum/data/vending_product/R = display_records[key]
if(!istype(R))
to_chat(usr, "<span class='warning'>ERROR: unknown vending_product record. Report this bug.</span>")
return
var/list/record_to_check = product_records + coin_records
if(extended_inventory)
record_to_check = product_records + coin_records + hidden_records
if(!R || !istype(R) || !R.product_path)
to_chat(usr, "<span class='warning'>ERROR: unknown product record. Report this bug.</span>")
return
if(R in hidden_records)
if(!extended_inventory)
// Exploit prevention, stop the user purchasing hidden stuff if they haven't hacked the machine.
to_chat(usr, "<span class='warning'>ERROR: machine does not allow extended_inventory in current state. Report this bug.</span>")
return
else if (!(R in record_to_check))
// Exploit prevention, stop the user
message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!")
return
if (R.amount <= 0)
to_chat(usr, "Sold out of [R.name].")
flick(icon_deny, src)
return
vend_ready = FALSE // From this point onwards, vendor is locked to performing this transaction only, until it is resolved.
if(!ishuman(usr) || R.price <= 0)
// Either the purchaser is not human, or the item is free.
// Skip all payment logic.
vend(R, usr)
add_fingerprint(usr)
vend_ready = TRUE
. = TRUE
return
// --- THE REST OF THIS PROC IS JUST PAYMENT LOGIC ---
var/mob/living/carbon/human/H = usr
var/obj/item/card/id/C = H.get_idcard(TRUE)
if(!GLOB.vendor_account || GLOB.vendor_account.suspended)
to_chat(usr, "Vendor account offline. Unable to process transaction.")
flick(icon_deny, src)
vend_ready = TRUE
return
currently_vending = R
var/paid = FALSE
if(istype(usr.get_active_hand(), /obj/item/stack/spacecash))
var/obj/item/stack/spacecash/S = usr.get_active_hand()
paid = pay_with_cash(S)
else if(istype(C, /obj/item/card))
// Because this uses H.get_idcard(TRUE), it will attempt to use:
// active hand, inactive hand, pda.id, and then wear_id ID in that order
// this is important because it lets people buy stuff with someone else's ID by holding it while using the vendor
paid = pay_with_card(C, usr)
else if(usr.can_advanced_admin_interact())
to_chat(usr, "<span class='notice'>Vending object due to admin interaction.</span>")
paid = TRUE
else
to_chat(usr, "<span class='warning'>Payment failure: you have no ID or other method of payment.")
vend_ready = TRUE
flick(icon_deny, src)
. = TRUE // we set this because they shouldn't even be able to get this far, and we want the UI to update.
return
if(paid)
vend(currently_vending, usr)
. = TRUE
else
to_chat(usr, "<span class='warning'>Payment failure: unable to process payment.")
vend_ready = TRUE
if(.)
add_fingerprint(usr)
/obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user)
if(!allowed(user) && !user.can_admin_interact() && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
to_chat(user, "<span class='warning'>Access denied.</span>")//Unless emagged of course
flick(icon_deny, src)
vend_ready = TRUE
return
if(!R.amount)
to_chat(user, "<span class='warning'>The vending machine has ran out of that product.</span>")
vend_ready = TRUE
return
vend_ready = FALSE //One thing at a time!!
if(coin_records.Find(R))
if(!coin)
to_chat(user, "<span class='notice'>You need to insert a coin to get this item.</span>")
vend_ready = TRUE
return
if(coin.string_attached)
if(prob(50))
to_chat(user, "<span class='notice'>You successfully pull the coin out before [src] could swallow it.</span>")
else
to_chat(user, "<span class='notice'>You weren't able to pull the coin out fast enough, the machine ate it, string and all.</span>")
QDEL_NULL(coin)
else
QDEL_NULL(coin)
R.amount--
if(((last_reply + (vend_delay + 200)) <= world.time) && vend_reply)
speak(src.vend_reply)
last_reply = world.time
use_power(vend_power_usage) //actuators and stuff
if(icon_vend) //Show the vending animation if needed
flick(icon_vend, src)
playsound(get_turf(src), 'sound/machines/machine_vend.ogg', 50, TRUE)
addtimer(CALLBACK(src, .proc/delayed_vend, R, user), vend_delay)
/obj/machinery/vending/proc/delayed_vend(datum/data/vending_product/R, mob/user)
do_vend(R, user)
vend_ready = TRUE
currently_vending = null
//override this proc to add handling for what to do with the vended product when you have a inserted item and remember to include a parent call for this generic handling
/obj/machinery/vending/proc/do_vend(datum/data/vending_product/R, mob/user)
if(!item_slot || !inserted_item)
var/put_on_turf = TRUE
var/obj/vended = new R.product_path()
if(user && iscarbon(user) && user.Adjacent(src))
if(user.put_in_hands(vended))
put_on_turf = FALSE
if(put_on_turf)
var/turf/T = get_turf(src)
vended.forceMove(T)
return TRUE
return FALSE
/* Example override for do_vend proc:
/obj/machinery/vending/example/do_vend(datum/data/vending_product/R)
if(..())
return
var/obj/item/vended = new R.product_path()
if(inserted_item.force == initial(inserted_item.force)
inserted_item.force += vended.force
inserted_item.damtype = vended.damtype
qdel(vended)
*/
/obj/machinery/vending/process()
if(stat & (BROKEN|NOPOWER))
return
if(!active)
return
if(src.seconds_electrified > 0)
src.seconds_electrified--
//Pitch to the people! Really sell it!
if(((last_slogan + src.slogan_delay) <= world.time) && (LAZYLEN(slogan_list)) && (!shut_up) && prob(5))
var/slogan = pick(src.slogan_list)
speak(slogan)
last_slogan = world.time
if(shoot_inventory && prob(shoot_chance))
throw_item()
/obj/machinery/vending/proc/speak(message)
if(stat & NOPOWER)
return
if(!message)
return
atom_say(message)
/obj/machinery/vending/power_change()
if(powered())
stat &= ~NOPOWER
else
stat |= NOPOWER
update_icon()
/obj/machinery/vending/obj_break(damage_flag)
if(!(stat & BROKEN))
stat |= BROKEN
update_icon()
var/dump_amount = 0
var/found_anything = TRUE
while (found_anything)
found_anything = FALSE
for(var/record in shuffle(product_records))
var/datum/data/vending_product/R = record
if(R.amount <= 0) //Try to use a record that actually has something to dump.
continue
var/dump_path = R.product_path
if(!dump_path)
continue
R.amount--
// busting open a vendor will destroy some of the contents
if(found_anything && prob(80))
continue
var/obj/O = new dump_path(loc)
step(O, pick(GLOB.alldirs))
found_anything = TRUE
dump_amount++
if(dump_amount >= 16)
return
//Somebody cut an important wire and now we're following a new definition of "pitch."
/obj/machinery/vending/proc/throw_item()
var/obj/throw_item = null
var/mob/living/target = locate() in view(7, src)
if(!target)
return 0
for(var/datum/data/vending_product/R in product_records)
if(R.amount <= 0) //Try to use a record that actually has something to dump.
continue
var/dump_path = R.product_path
if(!dump_path)
continue
R.amount--
throw_item = new dump_path(loc)
break
if(!throw_item)
return
throw_item.throw_at(target, 16, 3)
visible_message("<span class='danger'>[src] launches [throw_item.name] at [target.name]!</span>")
/obj/machinery/vending/onTransitZ()
return
/*
* Vending machine types
*/
/*
/obj/machinery/vending/[vendors name here] // --vending machine template :)
name = ""
desc = ""
icon = ''
icon_state = ""
vend_delay = 15
products = list()
contraband = list()
premium = list()
*/
/obj/machinery/vending/assist
products = list( /obj/item/assembly/prox_sensor = 5,/obj/item/assembly/igniter = 3,/obj/item/assembly/signaler = 4,
/obj/item/wirecutters = 1, /obj/item/cartridge/signal = 4)
contraband = list(/obj/item/flashlight = 5,/obj/item/assembly/timer = 2, /obj/item/assembly/voice = 2, /obj/item/assembly/health = 2)
ads_list = list("Only the finest!","Have some tools.","The most robust equipment.","The finest gear in space!")
refill_canister = /obj/item/vending_refill/assist
/obj/machinery/vending/boozeomat
name = "\improper Booze-O-Mat"
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles
icon_deny = "boozeomat-deny"
products = list(/obj/item/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/reagent_containers/food/drinks/bottle/tequila = 5,
/obj/item/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/reagent_containers/food/drinks/bottle/vermouth = 5,
/obj/item/reagent_containers/food/drinks/bottle/rum = 5,
/obj/item/reagent_containers/food/drinks/bottle/wine = 5,
/obj/item/reagent_containers/food/drinks/bag/goonbag = 3,
/obj/item/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/reagent_containers/food/drinks/bottle/kahlua = 5,
/obj/item/reagent_containers/food/drinks/cans/beer = 6,
/obj/item/reagent_containers/food/drinks/cans/ale = 6,
/obj/item/reagent_containers/food/drinks/cans/synthanol = 15,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/limejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/cream = 4,
/obj/item/reagent_containers/food/drinks/cans/tonic = 8,
/obj/item/reagent_containers/food/drinks/cans/cola = 8,
/obj/item/reagent_containers/food/drinks/cans/sodawater = 15,
/obj/item/reagent_containers/food/drinks/drinkingglass = 30,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 30,
/obj/item/reagent_containers/food/drinks/ice = 9)
contraband = list(/obj/item/reagent_containers/food/drinks/tea = 10,
/obj/item/reagent_containers/food/drinks/bottle/fernet = 5)
vend_delay = 15
slogan_list = list("I hope nobody asks me for a bloody cup o' tea...","Alcohol is humanity's friend. Would you abandon a friend?","Quite delighted to serve you!","Is nobody thirsty on this station?")
ads_list = list("Drink up!","Booze is good for you!","Alcohol is humanity's best friend.","Quite delighted to serve you!","Care for a nice, cold beer?","Nothing cures you like booze!","Have a sip!","Have a drink!","Have a beer!","Beer is good for you!","Only the finest alcohol!","Best quality booze since 2053!","Award-winning wine!","Maximum alcohol!","Man loves beer.","A toast for progress!")
refill_canister = /obj/item/vending_refill/boozeomat
/obj/machinery/vending/boozeomat/syndicate_access
req_access = list(ACCESS_SYNDICATE)
/obj/machinery/vending/coffee
name = "\improper Hot Drinks machine"
desc = "A vending machine which dispenses hot drinks."
ads_list = list("Have a drink!","Drink up!","It's good for you!","Would you like a hot joe?","I'd kill for some coffee!","The best beans in the galaxy.","Only the finest brew for you.","Mmmm. Nothing like a coffee.","I like coffee, don't you?","Coffee helps you work!","Try some tea.","We hope you like the best!","Try our new chocolate!","Admin conspiracies")
icon_state = "coffee"
icon_vend = "coffee-vend"
item_slot = TRUE
vend_delay = 34
products = list(/obj/item/reagent_containers/food/drinks/coffee = 25,/obj/item/reagent_containers/food/drinks/tea = 25,/obj/item/reagent_containers/food/drinks/h_chocolate = 25,
/obj/item/reagent_containers/food/drinks/chocolate = 10, /obj/item/reagent_containers/food/drinks/chicken_soup = 10,/obj/item/reagent_containers/food/drinks/weightloss = 10,
/obj/item/reagent_containers/food/drinks/mug = 15)
contraband = list(/obj/item/reagent_containers/food/drinks/ice = 10)
premium = list(/obj/item/reagent_containers/food/drinks/mug/novelty = 5)
prices = list(/obj/item/reagent_containers/food/drinks/coffee = 25, /obj/item/reagent_containers/food/drinks/tea = 25, /obj/item/reagent_containers/food/drinks/h_chocolate = 25, /obj/item/reagent_containers/food/drinks/chocolate = 25,
/obj/item/reagent_containers/food/drinks/chicken_soup = 30,/obj/item/reagent_containers/food/drinks/weightloss = 50, /obj/item/reagent_containers/food/drinks/mug = 50)
refill_canister = /obj/item/vending_refill/coffee
/obj/machinery/vending/coffee/free
prices = list()
/obj/machinery/vending/coffee/item_slot_check(mob/user, obj/item/I)
if(!(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks)))
return FALSE
if(!..())
return FALSE
if(!I.is_open_container())
to_chat(user, "<span class='warning'>You need to open [I] before inserting it.</span>")
return FALSE
return TRUE
/obj/machinery/vending/coffee/do_vend(datum/data/vending_product/R, mob/user)
if(..())
return
var/obj/item/reagent_containers/food/drinks/vended = new R.product_path()
if(istype(vended, /obj/item/reagent_containers/food/drinks/mug))
var/put_on_turf = TRUE
if(user && iscarbon(user) && user.Adjacent(src))
if(user.put_in_hands(vended))
put_on_turf = FALSE
if(put_on_turf)
var/turf/T = get_turf(src)
vended.forceMove(T)
return
vended.reagents.trans_to(inserted_item, vended.reagents.total_volume)
if(vended.reagents.total_volume)
var/put_on_turf = TRUE
if(user && iscarbon(user) && user.Adjacent(src))
if(user.put_in_hands(vended))
put_on_turf = FALSE
if(put_on_turf)
var/turf/T = get_turf(src)
vended.forceMove(T)
else
qdel(vended)
/obj/machinery/vending/snack
name = "\improper Getmore Chocolate Corp"
desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars."
slogan_list = list("Try our new nougat bar!","Twice the calories for half the price!")
ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!")
icon_state = "snack"
products = list(/obj/item/reagent_containers/food/snacks/candy/candybar = 6,/obj/item/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/reagent_containers/food/snacks/chips =6,
/obj/item/reagent_containers/food/snacks/sosjerky = 6,/obj/item/reagent_containers/food/snacks/no_raisin = 6,/obj/item/reagent_containers/food/snacks/pistachios =6,
/obj/item/reagent_containers/food/snacks/spacetwinkie = 6,/obj/item/reagent_containers/food/snacks/cheesiehonkers = 6,/obj/item/reagent_containers/food/snacks/tastybread = 6)
contraband = list(/obj/item/reagent_containers/food/snacks/syndicake = 6)
prices = list(/obj/item/reagent_containers/food/snacks/candy/candybar = 20,/obj/item/reagent_containers/food/drinks/dry_ramen = 30,
/obj/item/reagent_containers/food/snacks/chips =25,/obj/item/reagent_containers/food/snacks/sosjerky = 30,/obj/item/reagent_containers/food/snacks/no_raisin = 20,
/obj/item/reagent_containers/food/snacks/pistachios = 35, /obj/item/reagent_containers/food/snacks/spacetwinkie = 30,/obj/item/reagent_containers/food/snacks/cheesiehonkers = 25,/obj/item/reagent_containers/food/snacks/tastybread = 30)
refill_canister = /obj/item/vending_refill/snack
/obj/machinery/vending/snack/free
prices = list()
/obj/machinery/vending/chinese
name = "\improper Mr. Chang"
desc = "A self-serving Chinese food machine, for all your Chinese food needs."
slogan_list = list("Taste 5000 years of culture!","Mr. Chang, approved for safe consumption in over 10 sectors!","Chinese food is great for a date night, or a lonely night!","You can't go wrong with Mr. Chang's authentic Chinese food!")
icon_state = "chang"
products = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 6, /obj/item/reagent_containers/food/snacks/chinese/newdles = 6,
/obj/item/reagent_containers/food/snacks/chinese/rice = 6, /obj/item/reagent_containers/food/snacks/fortunecookie = 6)
prices = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 50, /obj/item/reagent_containers/food/snacks/chinese/newdles = 50,
/obj/item/reagent_containers/food/snacks/chinese/rice = 50, /obj/item/reagent_containers/food/snacks/fortunecookie = 50)
refill_canister = /obj/item/vending_refill/chinese
/obj/machinery/vending/chinese/free
prices = list()
/obj/machinery/vending/cola
name = "\improper Robust Softdrinks"
desc = "A soft drink vendor provided by Robust Industries, LLC."
icon_state = "Cola_Machine"
slogan_list = list("Robust Softdrinks: More robust than a toolbox to the head!")
ads_list = list("Refreshing!","Hope you're thirsty!","Over 1 million drinks sold!","Thirsty? Why not cola?","Please, have a drink!","Drink up!","The best drinks in space.")
products = list(/obj/item/reagent_containers/food/drinks/cans/cola = 10,/obj/item/reagent_containers/food/drinks/cans/space_mountain_wind = 10,
/obj/item/reagent_containers/food/drinks/cans/dr_gibb = 10,/obj/item/reagent_containers/food/drinks/cans/starkist = 10,
/obj/item/reagent_containers/food/drinks/cans/space_up = 10,/obj/item/reagent_containers/food/drinks/cans/grape_juice = 10)
contraband = list(/obj/item/reagent_containers/food/drinks/cans/thirteenloko = 5)
prices = list(/obj/item/reagent_containers/food/drinks/cans/cola = 20,/obj/item/reagent_containers/food/drinks/cans/space_mountain_wind = 20,
/obj/item/reagent_containers/food/drinks/cans/dr_gibb = 20,/obj/item/reagent_containers/food/drinks/cans/starkist = 20,
/obj/item/reagent_containers/food/drinks/cans/space_up = 20,/obj/item/reagent_containers/food/drinks/cans/grape_juice = 20)
refill_canister = /obj/item/vending_refill/cola
/obj/machinery/vending/cola/free
prices = list()
/obj/machinery/vending/cart
name = "\improper PTech"
desc = "Cartridges for PDA's."
slogan_list = list("Carts to go!")
icon_state = "cart"
icon_deny = "cart-deny"
products = list(/obj/item/pda =10,/obj/item/cartridge/mob_hunt_game = 25,/obj/item/cartridge/medical = 10,/obj/item/cartridge/chemistry = 10,
/obj/item/cartridge/engineering = 10,/obj/item/cartridge/atmos = 10,/obj/item/cartridge/janitor = 10,
/obj/item/cartridge/signal/toxins = 10,/obj/item/cartridge/signal = 10)
contraband = list(/obj/item/cartridge/clown = 1,/obj/item/cartridge/mime = 1)
prices = list(/obj/item/pda =300,/obj/item/cartridge/mob_hunt_game = 50,/obj/item/cartridge/medical = 200,/obj/item/cartridge/chemistry = 150,/obj/item/cartridge/engineering = 100,
/obj/item/cartridge/atmos = 75,/obj/item/cartridge/janitor = 100,/obj/item/cartridge/signal/toxins = 150,
/obj/item/cartridge/signal = 75)
refill_canister = /obj/item/vending_refill/cart
/obj/machinery/vending/cart/free
prices = list()
/obj/machinery/vending/liberationstation
name = "\improper Liberation Station"
desc = "An overwhelming amount of <b>ancient patriotism</b> washes over you just by looking at the machine."
icon_state = "liberationstation"
req_access_txt = "1"
slogan_list = list("Liberation Station: Your one-stop shop for all things second amendment!","Be a patriot today, pick up a gun!","Quality weapons for cheap prices!","Better dead than red!")
ads_list = list("Float like an astronaut, sting like a bullet!","Express your second amendment today!","Guns don't kill people, but you can!","Who needs responsibilities when you have guns?")
vend_reply = "Remember the name: Liberation Station!"
products = list(/obj/item/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/gun/projectile/automatic/pistol/deagle/camo = 2,
/obj/item/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/gun/projectile/automatic/proto = 2,
/obj/item/gun/projectile/shotgun/automatic/combat = 2,/obj/item/gun/projectile/automatic/gyropistol = 1,
/obj/item/gun/projectile/shotgun = 2,/obj/item/gun/projectile/automatic/ar = 2)
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/bedsheet/patriot = 3)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/toyliberationstation
name = "\improper Syndicate Donksoft Toy Vendor"
desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!"
icon_state = "syndi"
slogan_list = list("Get your cool toys today!","Trigger a valid hunter today!","Quality toy weapons for cheap prices!","Give them to HoPs for all access!","Give them to HoS to get permabrigged!")
ads_list = list("Feel robust with your toys!","Express your inner child today!","Toy weapons don't kill people, but valid hunters do!","Who needs responsibilities when you have toy weapons?","Make your next murder FUN!")
vend_reply = "Come back for more!"
products = list(/obj/item/gun/projectile/automatic/toy = 10,
/obj/item/gun/projectile/automatic/toy/pistol= 10,
/obj/item/gun/projectile/shotgun/toy = 10,
/obj/item/toy/sword = 10,
/obj/item/ammo_box/foambox = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/syndicateballoon = 10,
/obj/item/clothing/suit/syndicatefake = 5,
/obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant
contraband = list(/obj/item/gun/projectile/shotgun/toy/crossbow= 10, //Congrats, you unlocked the +18 setting!
/obj/item/gun/projectile/automatic/c20r/toy/riot = 10,
/obj/item/gun/projectile/automatic/l6_saw/toy/riot = 10,
/obj/item/gun/projectile/automatic/sniper_rifle/toy = 10,
/obj/item/ammo_box/foambox/riot = 20,
/obj/item/toy/katana = 10,
/obj/item/twohanded/dualsaber/toy = 5,
/obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/cigarette
name = "cigarette machine"
desc = "If you want to get cancer, might as well do it in style."
slogan_list = list("Space cigs taste good like a cigarette should.","I'd rather toolbox than switch.","Smoke!","Don't believe the reports - smoke today!")
ads_list = list("Probably not bad for you!","Don't believe the scientists!","It's good for you!","Don't quit, buy more!","Smoke!","Nicotine heaven.","Best cigarettes since 2150.","Award-winning cigs.")
vend_delay = 34
icon_state = "cigs"
products = list(/obj/item/storage/fancy/cigarettes/cigpack_robust = 12, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 6, /obj/item/storage/fancy/cigarettes/cigpack_random = 6, /obj/item/reagent_containers/food/pill/patch/nicotine = 10, /obj/item/storage/box/matches = 10,/obj/item/lighter/random = 4,/obj/item/storage/fancy/rollingpapers = 5)
contraband = list(/obj/item/lighter/zippo = 4)
premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2, /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 1)
prices = list(/obj/item/storage/fancy/cigarettes/cigpack_robust = 60, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 80, /obj/item/storage/fancy/cigarettes/cigpack_random = 120, /obj/item/reagent_containers/food/pill/patch/nicotine = 70, /obj/item/storage/box/matches = 10,/obj/item/lighter/random = 60, /obj/item/storage/fancy/rollingpapers = 20)
refill_canister = /obj/item/vending_refill/cigarette
/obj/machinery/vending/cigarette/free
prices = list()
/obj/machinery/vending/cigarette/syndicate
products = list(/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 7,
/obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
/obj/item/storage/fancy/cigarettes/cigpack_robust = 2,
/obj/item/storage/fancy/cigarettes/cigpack_carp = 3,
/obj/item/storage/fancy/cigarettes/cigpack_midori = 1,
/obj/item/storage/box/matches = 10,
/obj/item/lighter/zippo = 4,
/obj/item/storage/fancy/rollingpapers = 5)
/obj/machinery/vending/cigarette/syndicate/free
prices = list()
/obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin
name = "\improper ShadyCigs Ultra"
desc = "Now with extra premium products!"
ads_list = list("Probably not bad for you!","Dope will get you through times of no money better than money will get you through times of no dope!","It's good for you!")
slogan_list = list("Turn on, tune in, drop out!","Better living through chemistry!","Toke!","Don't forget to keep a smile on your lips and a song in your heart!")
products = list(/obj/item/storage/fancy/cigarettes = 5,
/obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
/obj/item/storage/fancy/cigarettes/cigpack_robust = 3,
/obj/item/storage/fancy/cigarettes/cigpack_carp = 3,
/obj/item/storage/fancy/cigarettes/cigpack_midori = 3,
/obj/item/storage/box/matches = 10,
/obj/item/lighter/random = 4,
/obj/item/storage/fancy/rollingpapers = 5)
premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2,
/obj/item/storage/fancy/cigarettes/cigpack_robustgold = 1,
/obj/item/lighter/zippo = 3)
prices = list()
/obj/machinery/vending/medical
name = "\improper NanoMed Plus"
desc = "Medical drug dispenser."
icon_state = "med"
icon_deny = "med-deny"
ads_list = list("Go save some lives!","The best stuff for your medbay.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?","Ping!")
req_access_txt = "5"
products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 4, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 4, /obj/item/reagent_containers/applicator/brute = 3, /obj/item/reagent_containers/applicator/burn = 3,
/obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 4,
/obj/item/reagent_containers/glass/bottle/salicylic = 4, /obj/item/reagent_containers/glass/bottle/potassium_iodide =3, /obj/item/reagent_containers/glass/bottle/saline = 5,
/obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/ether = 4, /obj/item/reagent_containers/glass/bottle/atropine = 3,
/obj/item/reagent_containers/glass/bottle/oculine = 2, /obj/item/reagent_containers/glass/bottle/toxin = 4, /obj/item/reagent_containers/syringe/antiviral = 6,
/obj/item/reagent_containers/syringe/insulin = 6, /obj/item/reagent_containers/syringe/calomel = 10, /obj/item/reagent_containers/syringe/heparin = 4, /obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/food/pill/salbutamol = 10,
/obj/item/reagent_containers/food/pill/mannitol = 10, /obj/item/reagent_containers/food/pill/mutadone = 5, /obj/item/stack/medical/bruise_pack/advanced = 4, /obj/item/stack/medical/ointment/advanced = 4, /obj/item/stack/medical/bruise_pack = 4,
/obj/item/stack/medical/splint = 4, /obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/dropper = 4, /obj/item/healthanalyzer = 4,
/obj/item/healthupgrade = 4, /obj/item/reagent_containers/hypospray/safety = 2, /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2)
contraband = list(/obj/item/reagent_containers/glass/bottle/sulfonal = 1, /obj/item/reagent_containers/glass/bottle/pancuronium = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical
/obj/machinery/vending/medical/syndicate_access
name = "\improper SyndiMed Plus"
req_access = list(ACCESS_SYNDICATE)
/obj/machinery/vending/plasmaresearch
name = "\improper Toximate 3000"
desc = "All the fine parts you need in one vending machine!"
products = list(/obj/item/assembly/prox_sensor = 8, /obj/item/assembly/igniter = 8, /obj/item/assembly/signaler = 8,
/obj/item/wirecutters = 1, /obj/item/assembly/timer = 8)
contraband = list(/obj/item/flashlight = 5, /obj/item/assembly/voice = 3, /obj/item/assembly/health = 3, /obj/item/assembly/infra = 3)
/obj/machinery/vending/wallmed
name = "\improper NanoMed"
desc = "Wall-mounted Medical Equipment dispenser."
ads_list = list("Go save some lives!","The best stuff for your medbay.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?")
icon_state = "wallmed"
icon_deny = "wallmed-deny"
density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, /obj/item/healthanalyzer = 1)
contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4, /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/food/pill/tox = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/wallmed
/obj/machinery/vending/wallmed/syndicate
name = "\improper SyndiMed Plus"
desc = "<b>EVIL</b> wall-mounted Medical Equipment dispenser."
icon_state = "syndimed"
icon_deny = "syndimed-deny"
ads_list = list("Go end some lives!","The best stuff for your ship.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?","Ping!")
req_access_txt = "150"
products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/reagent_containers/hypospray/autoinjector = 4,/obj/item/healthanalyzer = 1)
contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1)
/obj/machinery/vending/security
name = "\improper SecTech"
desc = "A security equipment vendor."
ads_list = list("Crack capitalist skulls!","Beat some heads in!","Don't forget - harm is good!","Your weapons are right here.","Handcuffs!","Freeze, scumbag!","Don't tase me bro!","Tase them, bro.","Why not have a donut?")
icon_state = "sec"
icon_deny = "sec-deny"
req_access_txt = "1"
products = list(/obj/item/restraints/handcuffs = 8,/obj/item/restraints/handcuffs/cable/zipties = 8,/obj/item/grenade/flashbang = 4,/obj/item/flash = 5,
/obj/item/reagent_containers/food/snacks/donut = 12,/obj/item/storage/box/evidence = 6,/obj/item/flashlight/seclite = 4,/obj/item/restraints/legcuffs/bola/energy = 7,
/obj/item/clothing/mask/muzzle/safety = 4)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/storage/fancy/donut_box = 2,/obj/item/hailer = 5)
refill_canister = /obj/item/vending_refill/security
/obj/machinery/vending/hydronutrients
name = "\improper NutriMax"
desc = "A plant nutrients vendor"
slogan_list = list("Aren't you glad you don't have to fertilize the natural way?","Now with 50% less stink!","Plants are people too!")
ads_list = list("We like plants!","Don't you want some?","The greenest thumbs ever.","We like big plants.","Soft soil...")
icon_state = "nutri"
icon_deny = "nutri-deny"
products = list(/obj/item/reagent_containers/glass/bottle/nutrient/ez = 20,/obj/item/reagent_containers/glass/bottle/nutrient/l4z = 13,/obj/item/reagent_containers/glass/bottle/nutrient/rh = 6,/obj/item/reagent_containers/spray/pestspray = 20,
/obj/item/reagent_containers/syringe = 5,/obj/item/storage/bag/plants = 5,/obj/item/cultivator = 3,/obj/item/shovel/spade = 3,/obj/item/plant_analyzer = 4)
contraband = list(/obj/item/reagent_containers/glass/bottle/ammonia = 10,/obj/item/reagent_containers/glass/bottle/diethylamine = 5)
refill_canister = /obj/item/vending_refill/hydronutrients
/obj/machinery/vending/hydroseeds
name = "\improper MegaSeed Servitor"
desc = "When you need seeds fast!"
slogan_list = list("THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!","Hands down the best seed selection on the station!","Also certain mushroom varieties available, more for experts! Get certified today!")
ads_list = list("We like plants!","Grow some crops!","Grow, baby, growww!","Aw h'yeah son!")
icon_state = "seeds"
products = list(/obj/item/seeds/aloe =3,
/obj/item/seeds/ambrosia = 3,
/obj/item/seeds/apple = 3,
/obj/item/seeds/banana = 3,
/obj/item/seeds/berry = 3,
/obj/item/seeds/cabbage = 3,
/obj/item/seeds/carrot = 3,
/obj/item/seeds/cherry = 3,
/obj/item/seeds/chanter = 3,
/obj/item/seeds/chili = 3,
/obj/item/seeds/cocoapod = 3,
/obj/item/seeds/coffee = 3,
/obj/item/seeds/comfrey =3,
/obj/item/seeds/corn = 3,
/obj/item/seeds/cotton = 3,
/obj/item/seeds/nymph =3,
/obj/item/seeds/eggplant = 3,
/obj/item/seeds/garlic = 3,
/obj/item/seeds/grape = 3,
/obj/item/seeds/grass = 3,
/obj/item/seeds/lemon = 3,
/obj/item/seeds/lime = 3,
/obj/item/seeds/mint = 3,
/obj/item/seeds/onion = 3,
/obj/item/seeds/orange = 3,
/obj/item/seeds/peanuts = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/poppy = 3,
/obj/item/seeds/potato = 3,
/obj/item/seeds/pumpkin = 3,
/obj/item/seeds/replicapod = 3,
/obj/item/seeds/wheat/rice = 3,
/obj/item/seeds/soya = 3,
/obj/item/seeds/sugarcane = 3,
/obj/item/seeds/sunflower = 3,
/obj/item/seeds/tea = 3,
/obj/item/seeds/tobacco = 3,
/obj/item/seeds/tomato = 3,
/obj/item/seeds/tower = 3,
/obj/item/seeds/watermelon = 3,
/obj/item/seeds/wheat = 3,
/obj/item/seeds/whitebeet = 3)
contraband = list(/obj/item/seeds/cannabis = 3,
/obj/item/seeds/amanita = 2,
/obj/item/seeds/fungus = 3,
/obj/item/seeds/glowshroom = 2,
/obj/item/seeds/liberty = 2,
/obj/item/seeds/nettle = 2,
/obj/item/seeds/plump = 2,
/obj/item/seeds/reishi = 2,
/obj/item/seeds/starthistle = 2,
/obj/item/seeds/random = 2)
premium = list(/obj/item/reagent_containers/spray/waterflower = 1)
refill_canister = /obj/item/vending_refill/hydroseeds
/obj/machinery/vending/magivend
name = "\improper MagiVend"
desc = "A magic vending machine."
icon_state = "MagiVend"
slogan_list = list("Sling spells the proper way with MagiVend!","Be your own Houdini! Use MagiVend!")
vend_delay = 15
vend_reply = "Have an enchanted evening!"
ads_list = list("FJKLFJSD","AJKFLBJAKL","1234 LOONIES LOL!",">MFW","Kill them fuckers!","GET DAT FUKKEN DISK","HONK!","EI NATH","Destroy the station!","Admin conspiracies since forever!","Space-time bending hardware!")
products = list(/obj/item/clothing/head/wizard = 1,
/obj/item/clothing/suit/wizrobe = 1,
/obj/item/clothing/head/wizard/red = 1,
/obj/item/clothing/suit/wizrobe/red = 1,
/obj/item/clothing/shoes/sandal = 1,
/obj/item/clothing/suit/wizrobe/clown = 1,
/obj/item/clothing/head/wizard/clown = 1,
/obj/item/clothing/mask/gas/clownwiz = 1,
/obj/item/clothing/shoes/clown_shoes/magical = 1,
/obj/item/clothing/suit/wizrobe/mime = 1,
/obj/item/clothing/head/wizard/mime = 1,
/obj/item/clothing/mask/gas/mime/wizard = 1,
/obj/item/clothing/shoes/sandal/marisa = 1,
/obj/item/twohanded/staff = 2)
contraband = list(/obj/item/reagent_containers/glass/bottle/wizarditis = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/autodrobe
name = "\improper AutoDrobe"
desc = "A vending machine for costumes."
icon_state = "theater"
icon_deny = "theater-deny"
slogan_list = list("Dress for success!","Suited and booted!","It's show time!","Why leave style up to fate? Use AutoDrobe!")
vend_delay = 15
vend_reply = "Thank you for using AutoDrobe!"
products = list(/obj/item/clothing/suit/chickensuit = 1,
/obj/item/clothing/head/chicken = 1,
/obj/item/clothing/under/gladiator = 1,
/obj/item/clothing/head/helmet/gladiator = 1,
/obj/item/clothing/under/gimmick/rank/captain/suit = 1,
/obj/item/clothing/head/flatcap = 1,
/obj/item/clothing/suit/storage/labcoat/mad = 1,
/obj/item/clothing/glasses/gglasses = 1,
/obj/item/clothing/shoes/jackboots = 1,
/obj/item/clothing/under/schoolgirl = 1,
/obj/item/clothing/under/blackskirt = 1,
/obj/item/clothing/suit/toggle/owlwings = 1,
/obj/item/clothing/under/owl = 1,
/obj/item/clothing/mask/gas/owl_mask = 1,
/obj/item/clothing/suit/toggle/owlwings/griffinwings = 1,
/obj/item/clothing/under/griffin = 1,
/obj/item/clothing/shoes/griffin = 1,
/obj/item/clothing/head/griffin = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/under/suit_jacket = 1,
/obj/item/clothing/head/that =1,
/obj/item/clothing/under/kilt = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/glasses/monocle =1,
/obj/item/clothing/head/bowlerhat = 1,
/obj/item/cane = 1,
/obj/item/clothing/under/sl_suit = 1,
/obj/item/clothing/mask/fakemoustache = 1,
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,
/obj/item/clothing/head/plaguedoctorhat = 1,
/obj/item/clothing/mask/gas/plaguedoctor = 1,
/obj/item/clothing/suit/apron = 1,
/obj/item/clothing/under/waiter = 1,
/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/suit/jacket/miljacket/white = 1,
/obj/item/clothing/suit/jacket/miljacket/desert = 1,
/obj/item/clothing/suit/jacket/miljacket/navy = 1,
/obj/item/clothing/under/pirate = 1,
/obj/item/clothing/suit/pirate_brown = 1,
/obj/item/clothing/suit/pirate_black =1,
/obj/item/clothing/under/pirate_rags =1,
/obj/item/clothing/head/pirate = 1,
/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/under/soviet = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/suit/imperium_monk = 1,
/obj/item/clothing/mask/gas/cyborg = 1,
/obj/item/clothing/suit/holidaypriest = 1,
/obj/item/clothing/head/wizard/marisa/fake = 1,
/obj/item/clothing/suit/wizrobe/marisa/fake = 1,
/obj/item/clothing/under/sundress = 1,
/obj/item/clothing/head/witchwig = 1,
/obj/item/twohanded/staff/broom = 1,
/obj/item/clothing/suit/wizrobe/fake = 1,
/obj/item/clothing/head/wizard/fake = 1,
/obj/item/twohanded/staff = 3,
/obj/item/clothing/mask/gas/clown_hat/sexy = 1,
/obj/item/clothing/under/rank/clown/sexy = 1,
/obj/item/clothing/mask/gas/sexymime = 1,
/obj/item/clothing/under/sexymime = 1,
/obj/item/clothing/mask/face/bat = 1,
/obj/item/clothing/mask/face/bee = 1,
/obj/item/clothing/mask/face/bear = 1,
/obj/item/clothing/mask/face/raven = 1,
/obj/item/clothing/mask/face/jackal = 1,
/obj/item/clothing/mask/face/fox = 1,
/obj/item/clothing/mask/face/tribal = 1,
/obj/item/clothing/mask/face/rat = 1,
/obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1,
/obj/item/clothing/head/sombrero = 1,
/obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/poncho/green = 1,
/obj/item/clothing/suit/poncho/red = 1,
/obj/item/clothing/accessory/blue = 1,
/obj/item/clothing/accessory/red = 1,
/obj/item/clothing/accessory/black = 1,
/obj/item/clothing/accessory/horrible = 1,
/obj/item/clothing/under/maid = 1,
/obj/item/clothing/under/janimaid = 1,
/obj/item/clothing/under/jester = 1,
/obj/item/clothing/head/jester = 1,
/obj/item/clothing/under/pants/camo = 1,
/obj/item/clothing/mask/bandana = 1,
/obj/item/clothing/mask/bandana/black = 1,
/obj/item/clothing/shoes/singery = 1,
/obj/item/clothing/under/singery = 1,
/obj/item/clothing/shoes/singerb = 1,
/obj/item/clothing/under/singerb = 1,
/obj/item/clothing/suit/hooded/carp_costume = 1,
/obj/item/clothing/suit/hooded/bee_costume = 1,
/obj/item/clothing/suit/snowman = 1,
/obj/item/clothing/head/snowman = 1,
/obj/item/clothing/head/cueball = 1,
/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/victdress = 1,
/obj/item/clothing/under/victdress/red = 1,
/obj/item/clothing/suit/victcoat = 1,
/obj/item/clothing/suit/victcoat/red = 1,
/obj/item/clothing/under/victsuit = 1,
/obj/item/clothing/under/victsuit/redblk = 1,
/obj/item/clothing/under/victsuit/red = 1,
/obj/item/clothing/suit/tailcoat = 1,
/obj/item/clothing/under/tourist_suit = 1,
/obj/item/clothing/suit/draculacoat = 1,
/obj/item/clothing/head/zepelli = 1,
/obj/item/clothing/under/redhawaiianshirt = 1,
/obj/item/clothing/under/pinkhawaiianshirt = 1,
/obj/item/clothing/under/bluehawaiianshirt = 1,
/obj/item/clothing/under/orangehawaiianshirt = 1)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
/obj/item/gun/magic/wand = 1,
/obj/item/clothing/mask/balaclava=1,
/obj/item/clothing/mask/horsehead = 2)
premium = list(/obj/item/clothing/suit/hgpirate = 1,
/obj/item/clothing/head/hgpiratecap = 1,
/obj/item/clothing/head/helmet/roman/fake = 1,
/obj/item/clothing/head/helmet/roman/legionaire/fake = 1,
/obj/item/clothing/under/roman = 1,
/obj/item/clothing/shoes/roman = 1,
/obj/item/shield/riot/roman/fake = 1,
/obj/item/clothing/under/cuban_suit = 1,
/obj/item/clothing/head/cuban_hat = 1)
refill_canister = /obj/item/vending_refill/autodrobe
/obj/machinery/vending/dinnerware
name = "\improper Plasteel Chef's Dinnerware Vendor"
desc = "A kitchen and restaurant equipment vendor."
ads_list = list("Mm, food stuffs!","Food and food accessories.","Get your plates!","You like forks?","I like forks.","Woo, utensils.","You don't really need these...")
icon_state = "dinnerware"
products = list(/obj/item/storage/bag/tray = 8,
/obj/item/kitchen/utensil/fork = 6,
/obj/item/trash/plate = 20,
/obj/item/trash/bowl = 20,
/obj/item/kitchen/knife = 3,
/obj/item/kitchen/rollingpin = 2,
/obj/item/kitchen/sushimat = 3,
/obj/item/reagent_containers/food/drinks/drinkingglass = 8,
/obj/item/clothing/suit/chef/classic = 2,
/obj/item/storage/belt/chef = 2,
/obj/item/reagent_containers/food/condiment/pack/ketchup = 5,
/obj/item/reagent_containers/food/condiment/pack/hotsauce = 5,
/obj/item/reagent_containers/food/condiment/saltshaker =5,
/obj/item/reagent_containers/food/condiment/peppermill =5,
/obj/item/whetstone = 2,
/obj/item/mixing_bowl = 10,
/obj/item/kitchen/mould/bear = 1, /obj/item/kitchen/mould/worm = 1,
/obj/item/kitchen/mould/bean = 1, /obj/item/kitchen/mould/ball = 1,
/obj/item/kitchen/mould/cane = 1, /obj/item/kitchen/mould/cash = 1,
/obj/item/kitchen/mould/coin = 1, /obj/item/kitchen/mould/loli = 1,
/obj/item/kitchen/cutter = 2)
contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2)
refill_canister = /obj/item/vending_refill/dinnerware
/obj/machinery/vending/sovietsoda
name = "\improper BODA"
desc = "Old sweet water vending machine."
icon_state = "sovietsoda"
ads_list = list("For Tsar and Country.","Have you fulfilled your nutrition quota today?","Very nice!","We are simple people, for this is all we eat.","If there is a person, there is a problem. If there is no person, then there is no problem.")
products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/soda = 30)
contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/cola = 20)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/sovietsoda
/obj/machinery/vending/tool
name = "\improper YouTool"
desc = "Tools for tools."
icon_state = "tool"
icon_deny = "tool-deny"
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/crowbar = 5,/obj/item/weldingtool = 3,/obj/item/wirecutters = 5,
/obj/item/wrench = 5,/obj/item/analyzer = 5,/obj/item/t_scanner = 5,/obj/item/screwdriver = 5)
contraband = list(/obj/item/weldingtool/hugetank = 2,/obj/item/clothing/gloves/color/fyellow = 2)
premium = list(/obj/item/clothing/gloves/color/yellow = 1)
refill_canister = /obj/item/vending_refill/youtool
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
resistance_flags = FIRE_PROOF
/obj/machinery/vending/engivend
name = "\improper Engi-Vend"
desc = "Spare tool vending. What? Did you expect some witty description?"
icon_state = "engivend"
icon_deny = "engivend-deny"
req_one_access_txt = "11;24" // Engineers and atmos techs can use this
products = list(/obj/item/clothing/glasses/meson/engine = 2,/obj/item/multitool = 4, /obj/item/geiger_counter = 5, /obj/item/airlock_electronics = 10,/obj/item/firelock_electronics = 10,/obj/item/firealarm_electronics = 10,/obj/item/apc_electronics = 10,/obj/item/airalarm_electronics = 10,/obj/item/stock_parts/cell/high = 10,/obj/item/camera_assembly = 10)
contraband = list(/obj/item/stock_parts/cell/potato = 3)
premium = list(/obj/item/storage/belt/utility = 3)
refill_canister = /obj/item/vending_refill/engivend
/obj/machinery/vending/engineering
name = "\improper Robco Tool Maker"
desc = "Everything you need for do-it-yourself station repair."
icon_state = "engi"
icon_deny = "engi-deny"
req_access_txt = "11"
products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/workboots = 4,/obj/item/clothing/head/hardhat = 4,
/obj/item/storage/belt/utility = 4,/obj/item/clothing/glasses/meson/engine = 4,/obj/item/clothing/gloves/color/yellow = 4, /obj/item/screwdriver = 12,
/obj/item/crowbar = 12,/obj/item/wirecutters = 12,/obj/item/multitool = 12,/obj/item/wrench = 12,/obj/item/t_scanner = 12,
/obj/item/stack/cable_coil/heavyduty = 8, /obj/item/stock_parts/cell = 8, /obj/item/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/stock_parts/scanning_module = 5,/obj/item/stock_parts/micro_laser = 5,
/obj/item/stock_parts/matter_bin = 5,/obj/item/stock_parts/manipulator = 5)
refill_canister = /obj/item/vending_refill/engineering
/obj/machinery/vending/robotics
name = "\improper Robotech Deluxe"
desc = "All the tools you need to create your own robot army."
icon_state = "robotics"
icon_deny = "robotics-deny"
req_access_txt = "29"
products = list(/obj/item/clothing/suit/storage/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/flash = 4,
/obj/item/stock_parts/cell/high = 12, /obj/item/assembly/prox_sensor = 3,/obj/item/assembly/signaler = 3,/obj/item/healthanalyzer = 3,
/obj/item/scalpel = 2,/obj/item/circular_saw = 2,/obj/item/tank/internals/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/screwdriver = 5,/obj/item/crowbar = 5)
refill_canister = /obj/item/vending_refill/robotics
/obj/machinery/vending/sustenance
name = "\improper Sustenance Vendor"
desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement."
slogan_list = list("Enjoy your meal.","Enough calories to support strenuous labor.")
ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!")
icon_state = "sustenance"
products = list(/obj/item/reagent_containers/food/snacks/tofu = 24,
/obj/item/reagent_containers/food/drinks/ice = 12,
/obj/item/reagent_containers/food/snacks/candy/candy_corn = 6)
contraband = list(/obj/item/kitchen/knife = 6,
/obj/item/reagent_containers/food/drinks/coffee = 12,
/obj/item/tank/internals/emergency_oxygen = 6,
/obj/item/clothing/mask/breath = 6)
refill_canister = /obj/item/vending_refill/sustenance
/obj/machinery/vending/hatdispenser
name = "\improper Hatlord 9000"
desc = "It doesn't seem the slightest bit unusual. This frustrates you immensely."
icon_state = "hats"
ads_list = list("Warning, not all hats are dog/monkey compatible. Apply forcefully with care.","Apply directly to the forehead.","Who doesn't love spending cash on hats?!","From the people that brought you collectable hat crates, Hatlord!")
products = list(/obj/item/clothing/head/bowlerhat = 10,
/obj/item/clothing/head/beaverhat = 10,
/obj/item/clothing/head/boaterhat = 10,
/obj/item/clothing/head/fedora = 10,
/obj/item/clothing/head/fez = 10,
/obj/item/clothing/head/beret = 10)
contraband = list(/obj/item/clothing/head/bearpelt = 5)
premium = list(/obj/item/clothing/head/soft/rainbow = 1)
refill_canister = /obj/item/vending_refill/hatdispenser
/obj/machinery/vending/suitdispenser
name = "\improper Suitlord 9000"
desc = "You wonder for a moment why all of your shirts and pants come conjoined. This hurts your head and you stop thinking about it."
icon_state = "suits"
ads_list = list("Pre-Ironed, Pre-Washed, Pre-Wor-*BZZT*","Blood of your enemies washes right out!","Who are YOU wearing?","Look dapper! Look like an idiot!","Dont carry your size? How about you shave off some pounds you fat lazy- *BZZT*")
products = list(/obj/item/clothing/under/color/black = 10,/obj/item/clothing/under/color/blue = 10,/obj/item/clothing/under/color/green = 10,/obj/item/clothing/under/color/grey = 10,/obj/item/clothing/under/color/pink = 10,/obj/item/clothing/under/color/red = 10,
/obj/item/clothing/under/color/white = 10, /obj/item/clothing/under/color/yellow = 10,/obj/item/clothing/under/color/lightblue = 10,/obj/item/clothing/under/color/aqua = 10,/obj/item/clothing/under/color/purple = 10,/obj/item/clothing/under/color/lightgreen = 10,
/obj/item/clothing/under/color/lightblue = 10,/obj/item/clothing/under/color/lightbrown = 10,/obj/item/clothing/under/color/brown = 10,/obj/item/clothing/under/color/yellowgreen = 10,/obj/item/clothing/under/color/darkblue = 10,/obj/item/clothing/under/color/lightred = 10, /obj/item/clothing/under/color/darkred = 10)
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 5,/obj/item/clothing/under/color/orange = 5)
premium = list(/obj/item/clothing/under/rainbow = 1)
refill_canister = /obj/item/vending_refill/suitdispenser
/obj/machinery/vending/shoedispenser
name = "\improper Shoelord 9000"
desc = "Wow, hatlord looked fancy, suitlord looked streamlined, and this is just normal. The guy who designed these must be an idiot."
icon_state = "shoes"
ads_list = list("Put your foot down!","One size fits all!","IM WALKING ON SUNSHINE!","No hobbits allowed.","NO PLEASE WILLY, DONT HURT ME- *BZZT*")
products = list(/obj/item/clothing/shoes/black = 10,/obj/item/clothing/shoes/brown = 10,/obj/item/clothing/shoes/blue = 10,/obj/item/clothing/shoes/green = 10,/obj/item/clothing/shoes/yellow = 10,/obj/item/clothing/shoes/purple = 10,/obj/item/clothing/shoes/red = 10,/obj/item/clothing/shoes/white = 10,/obj/item/clothing/shoes/sandal=10)
contraband = list(/obj/item/clothing/shoes/orange = 5)
premium = list(/obj/item/clothing/shoes/rainbow = 1)
refill_canister = /obj/item/vending_refill/shoedispenser
/obj/machinery/vending/syndicigs
name = "\improper Suspicious Cigarette Machine"
desc = "Smoke 'em if you've got 'em."
slogan_list = list("Space cigs taste good like a cigarette should.","I'd rather toolbox than switch.","Smoke!","Don't believe the reports - smoke today!")
ads_list = list("Probably not bad for you!","Don't believe the scientists!","It's good for you!","Don't quit, buy more!","Smoke!","Nicotine heaven.","Best cigarettes since 2150.","Award-winning cigs.")
vend_delay = 34
icon_state = "cigs"
products = list(/obj/item/storage/fancy/cigarettes/syndicate = 10,/obj/item/lighter/random = 5)
/obj/machinery/vending/syndisnack
name = "\improper Getmore Chocolate Corp"
desc = "A modified snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars"
slogan_list = list("Try our new nougat bar!","Twice the calories for half the price!")
ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!")
icon_state = "snack"
products = list(/obj/item/reagent_containers/food/snacks/chips =6,/obj/item/reagent_containers/food/snacks/sosjerky = 6,
/obj/item/reagent_containers/food/snacks/syndicake = 6, /obj/item/reagent_containers/food/snacks/cheesiehonkers = 6)
//don't forget to change the refill size if you change the machine's contents!
/obj/machinery/vending/clothing
name = "\improper ClothesMate" //renamed to make the slogan rhyme
desc = "A vending machine for clothing."
icon_state = "clothes"
slogan_list = list("Dress for success!","Prepare to look swagalicious!","Look at all this free swag!","Why leave style up to fate? Use the ClothesMate!")
vend_delay = 15
vend_reply = "Thank you for using the ClothesMate!"
products = list(/obj/item/clothing/head/that = 2,
/obj/item/clothing/head/fedora = 1,
/obj/item/clothing/glasses/monocle = 1,
/obj/item/clothing/under/suit_jacket/navy = 2,
/obj/item/clothing/under/kilt = 1,
/obj/item/clothing/under/overalls = 1,
/obj/item/clothing/under/suit_jacket/really_black = 2,
/obj/item/clothing/suit/storage/lawyer/blackjacket = 2,
/obj/item/clothing/under/pants/jeans = 3,
/obj/item/clothing/under/pants/classicjeans = 2,
/obj/item/clothing/under/pants/camo = 1,
/obj/item/clothing/under/pants/blackjeans = 2,
/obj/item/clothing/under/pants/khaki = 2,
/obj/item/clothing/under/pants/white = 2,
/obj/item/clothing/under/pants/red = 1,
/obj/item/clothing/under/pants/black = 2,
/obj/item/clothing/under/pants/tan = 2,
/obj/item/clothing/under/pants/blue = 1,
/obj/item/clothing/under/pants/track = 1,
/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/head/beanie = 3,
/obj/item/clothing/head/beanie/black = 3,
/obj/item/clothing/head/beanie/red = 3,
/obj/item/clothing/head/beanie/green = 3,
/obj/item/clothing/head/beanie/darkblue = 3,
/obj/item/clothing/head/beanie/purple = 3,
/obj/item/clothing/head/beanie/yellow = 3,
/obj/item/clothing/head/beanie/orange = 3,
/obj/item/clothing/head/beanie/cyan = 3,
/obj/item/clothing/head/beanie/christmas = 3,
/obj/item/clothing/head/beanie/striped = 3,
/obj/item/clothing/head/beanie/stripedred = 3,
/obj/item/clothing/head/beanie/stripedblue = 3,
/obj/item/clothing/head/beanie/stripedgreen = 3,
/obj/item/clothing/head/beanie/rasta = 3,
/obj/item/clothing/accessory/scarf/red = 1,
/obj/item/clothing/accessory/scarf/green = 1,
/obj/item/clothing/accessory/scarf/darkblue = 1,
/obj/item/clothing/accessory/scarf/purple = 1,
/obj/item/clothing/accessory/scarf/yellow = 1,
/obj/item/clothing/accessory/scarf/orange = 1,
/obj/item/clothing/accessory/scarf/lightblue = 1,
/obj/item/clothing/accessory/scarf/white = 1,
/obj/item/clothing/accessory/scarf/black = 1,
/obj/item/clothing/accessory/scarf/zebra = 1,
/obj/item/clothing/accessory/scarf/christmas = 1,
/obj/item/clothing/accessory/stripedredscarf = 1,
/obj/item/clothing/accessory/stripedbluescarf = 1,
/obj/item/clothing/accessory/stripedgreenscarf = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/under/sundress = 2,
/obj/item/clothing/under/stripeddress = 1,
/obj/item/clothing/under/sailordress = 1,
/obj/item/clothing/under/redeveninggown = 1,
/obj/item/clothing/under/blacktango = 1,
/obj/item/clothing/suit/jacket = 3,
/obj/item/clothing/suit/jacket/motojacket = 3,
/obj/item/clothing/glasses/regular = 2,
/obj/item/clothing/glasses/sunglasses_fake = 2,
/obj/item/clothing/head/sombrero = 1,
/obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/ianshirt = 1,
/obj/item/clothing/shoes/laceup = 2,
/obj/item/clothing/shoes/black = 4,
/obj/item/clothing/shoes/sandal = 1,
/obj/item/clothing/gloves/fingerless = 2,
/obj/item/storage/belt/fannypack = 1,
/obj/item/storage/belt/fannypack/blue = 1,
/obj/item/storage/belt/fannypack/red = 1,
/obj/item/clothing/suit/mantle = 2,
/obj/item/clothing/suit/mantle/old = 1,
/obj/item/clothing/suit/mantle/regal = 2)
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 1,
/obj/item/clothing/mask/balaclava = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/under/soviet = 1,
/obj/item/storage/belt/fannypack/black = 1)
premium = list(/obj/item/clothing/under/suit_jacket/checkered = 1,
/obj/item/clothing/head/mailman = 1,
/obj/item/clothing/under/rank/mailman = 1,
/obj/item/clothing/suit/jacket/leather = 1,
/obj/item/clothing/under/pants/mustangjeans = 1)
refill_canister = /obj/item/vending_refill/clothing
/obj/machinery/vending/artvend
name = "\improper ArtVend"
desc = "A vending machine for art supplies."
slogan_list = list("Stop by for all your artistic needs!","Color the floors with crayons, not blood!","Don't be a starving artist, use ArtVend. ","Don't fart, do art!")
ads_list = list("Just like Kindergarten!","Now with 1000% more vibrant colors!","Screwing with the janitor was never so easy!","Creativity is at the heart of every spessman.")
vend_delay = 15
icon_state = "artvend"
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/camera = 4,/obj/item/camera_film = 6,
/obj/item/storage/photo_album = 2,/obj/item/stack/wrapping_paper = 4,/obj/item/stack/tape_roll = 5,/obj/item/stack/packageWrap = 4,
/obj/item/storage/fancy/crayons = 4,/obj/item/hand_labeler = 4,/obj/item/paper = 10,
/obj/item/c_tube = 10,/obj/item/pen = 5,/obj/item/pen/blue = 5,
/obj/item/pen/red = 5)
contraband = list(/obj/item/toy/crayon/mime = 1,/obj/item/toy/crayon/rainbow = 1)
premium = list(/obj/item/poster/random_contraband = 5)
/obj/machinery/vending/crittercare
name = "\improper CritterCare"
desc = "A vending machine for pet supplies."
slogan_list = list("Stop by for all your animal's needs!","Cuddly pets deserve a stylish collar!","Pets in space, what could be more adorable?","Freshest fish eggs in the system!","Rocks are the perfect pet, buy one today!")
ads_list = list("House-training costs extra!","Now with 1000% more cat hair!","Allergies are a sign of weakness!","Dogs are man's best friend. Remember that Vulpkanin!"," Heat lamps for Unathi!"," Vox-y want a cracker?")
vend_delay = 15
icon_state = "crittercare"
products = list(/obj/item/clothing/accessory/petcollar = 5, /obj/item/storage/firstaid/aquatic_kit/full =5, /obj/item/fish_eggs/goldfish = 5,
/obj/item/fish_eggs/clownfish = 5, /obj/item/fish_eggs/shark = 5, /obj/item/fish_eggs/feederfish = 10,
/obj/item/fish_eggs/salmon = 5, /obj/item/fish_eggs/catfish = 5, /obj/item/fish_eggs/glofish = 5,
/obj/item/fish_eggs/electric_eel = 5, /obj/item/fish_eggs/shrimp = 10, /obj/item/toy/pet_rock = 5,
)
prices = list(/obj/item/clothing/accessory/petcollar = 50, /obj/item/storage/firstaid/aquatic_kit/full = 60, /obj/item/fish_eggs/goldfish = 10,
/obj/item/fish_eggs/clownfish = 10, /obj/item/fish_eggs/shark = 10, /obj/item/fish_eggs/feederfish = 5,
/obj/item/fish_eggs/salmon = 10, /obj/item/fish_eggs/catfish = 10, /obj/item/fish_eggs/glofish = 10,
/obj/item/fish_eggs/electric_eel = 10, /obj/item/fish_eggs/shrimp = 5, /obj/item/toy/pet_rock = 100,
)
contraband = list(/obj/item/fish_eggs/babycarp = 5)
premium = list(/obj/item/toy/pet_rock/fred = 1, /obj/item/toy/pet_rock/roxie = 1)
refill_canister = /obj/item/vending_refill/crittercare
/obj/machinery/vending/crittercare/free
prices = list()