#define CAT_NORMAL 0 #define CAT_HIDDEN 1 #define CAT_COIN 2 /datum/data/vending_product var/product_name = "generic" var/product_path = null var/amount = 0 var/price = 0 var/display_color = "blue" var/category = CAT_NORMAL /obj/machinery/vending name = "Vendomat" desc = "A generic vending machine." icon = 'icons/obj/vending.dmi' icon_state = "generic" layer = 2.9 anchored = 1 density = 1 use_power = 1 idle_power_usage = 10 var/vend_power_usage = 150 //actuators and stuff var/active = 1 //No sales pitches if off! var/delay_product_spawn // If set, uses sleep() in product spawn proc (mostly for seeds to retrieve correct names). var/vend_ready = 1 //Are we ready to vend?? Is it time?? var/vend_delay = 10 //How long does it take to vend? var/datum/data/vending_product/currently_vending = null // A /datum/data/vending_product instance of what we're paying for right now. // 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. var/product_slogans = "" //String of slogans separated by semicolons, optional var/product_ads = "" //String of small ad messages in the vending screen - random chance var/list/product_records = list() var/list/hidden_records = list() var/list/coin_records = list() var/list/slogan_list = list() var/list/small_ads = list() // small ad messages in the vending screen - random chance of popping up whenever you open it var/vend_reply //Thank you for shopping! var/last_reply = 0 var/last_slogan = 0 //When did we last pitch? var/slogan_delay = 6000 //How long until we can pitch again? var/icon_vend //Icon_state when vending! var/icon_deny //Icon_state when vending! //var/emagged = 0 //Ignores if somebody doesn't have card access to that machine. var/seconds_electrified = 0 //Shock customers like an airlock. var/shoot_inventory = 0 //Fire items at customers! We're broken! var/shut_up = 1 //Stop spouting those godawful pitches! var/extended_inventory = 0 //can we access the hidden inventory? var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar. var/scan_id = 1 var/obj/item/weapon/coin/coin var/datum/wires/vending/wires = null var/check_accounts = 0 // 1 = requires PIN and checks accounts. 0 = You slide an ID, it vends, SPACE COMMUNISM! var/obj/item/weapon/spacecash/ewallet/ewallet /obj/machinery/vending/New() ..() wires = new(src) spawn(4) src.slogan_list = text2list(src.product_slogans, ";") // 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 crated. src.last_slogan = world.time + rand(0, slogan_delay) src.build_inventory(products) //Add hidden inventory src.build_inventory(contraband, 1) src.build_inventory(premium, 0, 1) power_change() return return /obj/machinery/vending/Del() del(wires) // qdel wires = null if(coin) del(coin) // qdel coin = null ..() /obj/machinery/vending/ex_act(severity) switch(severity) if(1.0) del(src) return if(2.0) if (prob(50)) del(src) return if(3.0) if (prob(25)) spawn(0) src.malfunction() return return else return /obj/machinery/vending/blob_act() if (prob(50)) spawn(0) src.malfunction() del(src) return return /obj/machinery/vending/proc/build_inventory(var/list/productlist,hidden=0,req_coin=0) if(delay_product_spawn) sleep(15) //Make ABSOLUTELY SURE the seed datum is properly populated. for(var/typepath in productlist) var/amount = productlist[typepath] var/price = prices[typepath] if(isnull(amount)) amount = 1 var/datum/data/vending_product/R = new /datum/data/vending_product() R.product_path = typepath R.amount = amount R.price = price R.display_color = pick("red","blue","green") if(hidden) R.category=CAT_HIDDEN hidden_records += R else if(req_coin) R.category=CAT_COIN coin_records += R else R.category=CAT_NORMAL product_records += R if(delay_product_spawn) sleep(5) //sleep(1) did not seem to cut it, so here we are. var/atom/temp = typepath R.product_name = initial(temp.name) // world << "Added: [R.product_name]] - [R.amount] - [R.product_path]" return /obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/card/emag)) src.emagged = 1 user << "You short out the product lock on [src]" return else if(istype(W, /obj/item/weapon/screwdriver)) src.panel_open = !src.panel_open user << "You [src.panel_open ? "open" : "close"] the maintenance panel." src.overlays.Cut() if(src.panel_open) src.overlays += image(src.icon, "[initial(icon_state)]-panel") src.updateUsrDialog() return else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters)) if(src.panel_open) attack_hand(user) return else if(istype(W, /obj/item/weapon/coin) && premium.len > 0) user.drop_item() W.loc = src coin = W user << "\blue You insert the [W] into the [src]" return else if(istype(W, /obj/item/weapon/card) && currently_vending) var/obj/item/weapon/card/I = W scan_card(I) else if (istype(W, /obj/item/weapon/spacecash/ewallet)) user.drop_item() W.loc = src ewallet = W user << "\blue You insert the [W] into the [src]" else if(istype(W, /obj/item/weapon/wrench)) if(do_after(user, 20)) if(!src) return playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) switch (anchored) if (0) anchored = 1 user.visible_message("[user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") if (1) user.visible_message("[user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") anchored = 0 return else if(src.panel_open) for(var/datum/data/vending_product/R in product_records) if(istype(W, R.product_path)) stock(R, user) del(W) else ..() /obj/machinery/vending/proc/scan_card(var/obj/item/weapon/card/I) if(!currently_vending) return if (istype(I, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/C = I visible_message("[usr] swipes a card through [src].") var/datum/money_account/CH = get_account(C.associated_account_number) if (CH) // Only proceed if card contains proper account number. if(!CH.suspended) if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) if(vendor_account) var/attempt_pin = input("Enter pin code", "Vendor transaction") as num var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) transfer_and_vend(D) else usr << "\icon[src]Unable to access account. Check security settings and try again." else //Just Vend it. transfer_and_vend(CH) else usr << "\icon[src]Connected account has been suspended." else usr << "\icon[src]Error: Unable to access your account. Please contact technical support if problem persists." /obj/machinery/vending/proc/transfer_and_vend(var/datum/money_account/acc) if(acc) var/transaction_amount = currently_vending.price if(transaction_amount <= acc.money) //transfer the money acc.money -= transaction_amount vendor_account.money += transaction_amount //create entries in the two account transaction logs var/datum/transaction/T = new() T.target_name = "[vendor_account.owner_name] (via [src.name])" T.purpose = "Purchase of [currently_vending.product_name]" if(transaction_amount > 0) T.amount = "([transaction_amount])" else T.amount = "[transaction_amount]" T.source_terminal = src.name T.date = current_date_string T.time = worldtime2text() acc.transaction_log.Add(T) // T = new() T.target_name = acc.owner_name T.purpose = "Purchase of [currently_vending.product_name]" T.amount = "[transaction_amount]" T.source_terminal = src.name T.date = current_date_string T.time = worldtime2text() vendor_account.transaction_log.Add(T) // Vend the item src.vend(src.currently_vending, usr) currently_vending = null else usr << "\icon[src]You don't have that much money!" else usr << "\icon[src]Error: Unable to access your account. Please contact technical support if problem persists." /obj/machinery/vending/attack_ai(mob/user as mob) return attack_hand(user) /obj/machinery/vending/proc/GetProductIndex(var/datum/data/vending_product/P) var/list/plist switch(P.category) if(CAT_NORMAL) plist=product_records if(CAT_HIDDEN) plist=hidden_records if(CAT_COIN) plist=coin_records else warning("UNKNOWN CATEGORY [P.category] IN TYPE [P.product_path] INSIDE [type]!") return plist.Find(P) /obj/machinery/vending/proc/GetProductByID(var/pid, var/category) switch(category) if(CAT_NORMAL) return product_records[pid] if(CAT_HIDDEN) return hidden_records[pid] if(CAT_COIN) return coin_records[pid] else warning("UNKNOWN PRODUCT: PID: [pid], CAT: [category] INSIDE [type]!") return null /obj/machinery/vending/attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) return user.set_machine(src) if(src.seconds_electrified != 0) if(src.shock(user, 100)) return var/vendorname = (src.name) //import the machine's name if(src.currently_vending) var/dat = "
[vendorname]


" //display the name, and added a horizontal rule dat += "You have selected [currently_vending.product_name].
Please swipe your ID to pay for the article.

" dat += "Cancel" user << browse(dat, "window=vending") onclose(user, "") return var/dat = "
[vendorname]


" //display the name, and added a horizontal rule dat += "Select an item:

" //the rest is just general spacing and bolding if (premium.len > 0) dat += "Coin slot: [coin ? coin : "No coin inserted"] (Remove)
" if (ewallet) dat += "Charge card's credits: [ewallet ? ewallet.worth : "No charge card inserted"] (Remove)

" if (src.product_records.len == 0) dat += "No product loaded!" else var/list/display_records = list() display_records += src.product_records if(src.extended_inventory) display_records += src.hidden_records if(src.coin) display_records += src.coin_records for (var/datum/data/vending_product/R in display_records) dat += "[R.product_name]:" dat += " [R.amount] " if(R.price) dat += " (Price: [R.price])" if (R.amount > 0) var/idx=GetProductIndex(R) dat += " (Vend)" else dat += " SOLD OUT" dat += "
" dat += "
" if(panel_open) dat += wires() if(product_slogans != "") dat += "The speaker switch is [shut_up ? "off" : "on"]. Toggle" user << browse(dat, "window=vending") onclose(user, "") return // returns the wire panel text /obj/machinery/vending/proc/wires() return wires.GetInteractWindow() /obj/machinery/vending/Topic(href, href_list) if(stat & (BROKEN|NOPOWER)) return if(usr.stat || usr.restrained()) return if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon)) if(!coin) usr << "There is no coin in this machine." return coin.loc = src.loc if(!usr.get_active_hand()) usr.put_in_hands(coin) usr << "\blue You remove the [coin] from the [src]" coin = null if(href_list["remove_ewallet"] && !istype(usr,/mob/living/silicon)) if (!ewallet) usr << "There is no charge card in this machine." return ewallet.loc = src.loc if(!usr.get_active_hand()) usr.put_in_hands(ewallet) usr << "\blue You remove the [ewallet] from the [src]" ewallet = null if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) usr.set_machine(src) if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending)) if(istype(usr,/mob/living/silicon)) if(istype(usr,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = usr if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) )) usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" return else usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" return if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH usr << "Access denied." //Unless emagged of course flick(icon_deny,src) return var/idx=text2num(href_list["vend"]) var/cat=text2num(href_list["cat"]) var/datum/data/vending_product/R = GetProductByID(idx,cat) if (!R || !istype(R) || !R.product_path || R.amount <= 0) return if(R.price == null) src.vend(R, usr) else if (ewallet) if (R.price <= ewallet.worth) ewallet.worth -= R.price src.vend(R, usr) else usr << "\red The ewallet doesn't have enough money to pay for that." src.currently_vending = R src.updateUsrDialog() else src.currently_vending = R src.updateUsrDialog() return else if (href_list["cancel_buying"]) src.currently_vending = null src.updateUsrDialog() return else if ((href_list["togglevoice"]) && (src.panel_open)) src.shut_up = !src.shut_up src.add_fingerprint(usr) src.updateUsrDialog() else usr << browse(null, "window=vending") return return /obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user) if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH usr << "Access denied." //Unless emagged of course flick(src.icon_deny,src) return src.vend_ready = 0 //One thing at a time!! if (R in coin_records) if(!coin) user << "\blue You need to insert a coin to get this item." return if(coin.string_attached) if(prob(50)) user << "\blue You successfully pull the coin out before the [src] could swallow it." else user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." del(coin) else del(coin) R.amount-- if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply) spawn(0) src.speak(src.vend_reply) src.last_reply = world.time use_power(vend_power_usage) //actuators and stuff if (src.icon_vend) //Show the vending animation if needed flick(src.icon_vend,src) spawn(src.vend_delay) new R.product_path(get_turf(src)) src.vend_ready = 1 return src.updateUsrDialog() /obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) if(src.panel_open) user << "\blue You stock the [src] with \a [R.product_name]" R.amount++ src.updateUsrDialog() /obj/machinery/vending/process() if(stat & (BROKEN|NOPOWER)) return if(!src.active) return if(src.seconds_electrified > 0) src.seconds_electrified-- //Pitch to the people! Really sell it! if(((src.last_slogan + src.slogan_delay) <= world.time) && (src.slogan_list.len > 0) && (!src.shut_up) && prob(5)) var/slogan = pick(src.slogan_list) src.speak(slogan) src.last_slogan = world.time if(src.shoot_inventory && prob(2)) src.throw_item() return /obj/machinery/vending/proc/speak(var/message) if(stat & NOPOWER) return if (!message) return for(var/mob/O in hearers(src, null)) O.show_message("[src] beeps, \"[message]\"",2) return /obj/machinery/vending/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)) src.icon_state = "[initial(icon_state)]-off" //Oh no we're malfunctioning! Dump out some product and break. /obj/machinery/vending/proc/malfunction() for(var/datum/data/vending_product/R in src.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 while(R.amount>0) new dump_path(src.loc) R.amount-- break stat |= BROKEN src.icon_state = "[initial(icon_state)]-broken" 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 src.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(src.loc) break if (!throw_item) return 0 spawn(0) throw_item.throw_at(target, 16, 3, src) src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") return 1 /* * 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/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink name = "Tank Vendor" desc = "A vendor with a wide variety of masks and gas tanks." icon = 'icons/obj/objects.dmi' icon_state = "dispenser" product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/phoron;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath" product_amounts = "10;10;10;5;25" vend_delay = 0 */ /obj/machinery/vending/boozeomat name = "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/weapon/reagent_containers/food/drinks/bottle/gin = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/cans/beer = 6, /obj/item/weapon/reagent_containers/food/drinks/cans/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15, /obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 2, /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 2, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9, /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 2,/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 2, /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 2,/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10) vend_delay = 15 idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. product_slogans = "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?" product_ads = "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!" req_access_txt = "25" /obj/machinery/vending/assist products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4, /obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4) contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2) product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" /obj/machinery/vending/coffee name = "Hot Drinks machine" desc = "A vending machine which dispenses hot drinks." product_ads = "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" vend_delay = 34 idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. vend_power_usage = 85000 //85 kJ to heat a 250 mL cup of coffee products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10) prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 3, /obj/item/weapon/reagent_containers/food/drinks/tea = 3, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 3) /obj/machinery/vending/snack name = "Getmore Chocolate Corp" desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars." product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" product_ads = "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/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6, /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6, /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6) contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6) prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 1,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 5,/obj/item/weapon/reagent_containers/food/snacks/chips = 1, /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 2,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 1, /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 1) /obj/machinery/vending/cola name = "Robust Softdrinks" desc = "A softdrink vendor provided by Robust Industries, LLC." icon_state = "Cola_Machine" product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" product_ads = "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/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 10) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko = 5) prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 2,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 1) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. //This one's from bay12 /obj/machinery/vending/cart name = "PTech" desc = "Cartridges for PDAs." product_slogans = "Carts to go!" icon_state = "cart" icon_deny = "cart-deny" products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10, /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/science = 10,/obj/item/device/pda/heads = 10, /obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10) /obj/machinery/vending/cigarette name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating desc = "If you want to get cancer, might as well do it in style!" product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!" product_ads = "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/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/flame/lighter/random = 4) contraband = list(/obj/item/weapon/flame/lighter/zippo = 4) premium = list(/obj/item/weapon/storage/fancy/cigar = 5) prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15,/obj/item/weapon/storage/box/matches = 1,/obj/item/weapon/flame/lighter/random = 2) /obj/machinery/vending/medical name = "NanoMed Plus" desc = "Medical drug dispenser." icon_state = "med" icon_deny = "med-deny" product_ads = "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/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4, /obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4, /obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12, /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2, /obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2) contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. //This one's from bay12 /obj/machinery/vending/phoronresearch name = "Toximate 3000" desc = "All the fine parts you need in one vending machine!" products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6, /obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6, /obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6) /obj/machinery/vending/wallmed1 name = "NanoMed" desc = "Wall-mounted Medical Equipment dispenser." product_ads = "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" req_access_txt = "5" density = 0 //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/weapon/reagent_containers/hypospray/autoinjector = 4,/obj/item/device/healthanalyzer = 1) contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1) /obj/machinery/vending/wallmed2 name = "NanoMed" desc = "Wall-mounted Medical Equipment dispenser." icon_state = "wallmed" icon_deny = "wallmed-deny" req_access_txt = "5" density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3) contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3) /obj/machinery/vending/security name = "SecTech" desc = "A security equipment vendor." product_ads = "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/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5, /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6) contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/donut_box = 2) /obj/machinery/vending/hydronutrients name = "NutriMax" desc = "A plant nutrients vendor." product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" product_ads = "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/weapon/reagent_containers/glass/fertilizer/ez = 35,/obj/item/weapon/reagent_containers/glass/fertilizer/l4z = 25,/obj/item/weapon/reagent_containers/glass/fertilizer/rh = 15,/obj/item/weapon/plantspray/pests = 20, /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5) premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. /obj/machinery/vending/hydroseeds name = "MegaSeed Servitor" desc = "When you need seeds fast!" product_slogans = "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!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" icon_state = "seeds" delay_product_spawn = 1 products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3, /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3, /obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3, /obj/item/seeds/poppyseed = 3,/obj/item/seeds/sugarcaneseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/peanutseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3, /obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/plumpmycelium = 2, /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3) contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/mtearseed = 2, /obj/item/seeds/nettleseed = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/shandseed = 2,) premium = list(/obj/item/toy/waterflower = 1) /obj/machinery/vending/magivend name = "MagiVend" desc = "A magic vending machine." icon_state = "MagiVend" product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!" vend_delay = 15 vend_reply = "Have an enchanted evening!" product_ads = "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/weapon/staff = 2) contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave /obj/machinery/vending/dinnerware name = "Dinnerware" desc = "A kitchen and restaurant equipment vendor." product_ads = "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/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2) contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2) /obj/machinery/vending/sovietsoda name = "BODA" desc = "An old sweet water vending machine,how did this end up here?" icon_state = "sovietsoda" product_ads = "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/weapon/reagent_containers/food/drinks/drinkingglass/soda = 30) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola = 20) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. /obj/machinery/vending/tool name = "YouTool" desc = "Tools for tools." icon_state = "tool" icon_deny = "tool-deny" //req_access_txt = "12" //Maintenance access products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5, /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5) contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2) premium = list(/obj/item/clothing/gloves/yellow = 1) /obj/machinery/vending/engivend name = "Engi-Vend" desc = "Spare tool vending. What? Did you expect some witty description?" icon_state = "engivend" icon_deny = "engivend-deny" req_access_txt = "11" //Engineering Equipment access products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10) contraband = list(/obj/item/weapon/cell/potato = 3) premium = list(/obj/item/weapon/storage/belt/utility = 3) //This one's from bay12 /obj/machinery/vending/engineering name = "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/orange = 4,/obj/item/clothing/head/hardhat = 4, /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12, /obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12, /obj/item/stack/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8, /obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5, /obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5) // There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty. // Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it. // The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu //This one's from bay12 /obj/machinery/vending/robotics name = "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/device/flash = 4, /obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3, /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5, /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5) //everything after the power cell had no amounts, I improvised. -Sayu