diff --git a/code/modules/mining/mining_vending.dm b/code/modules/mining/mining_vending.dm new file mode 100644 index 0000000000..f3721a35cc --- /dev/null +++ b/code/modules/mining/mining_vending.dm @@ -0,0 +1,272 @@ +/** + * A vending machine + */ +/obj/machinery/vending_mining + name = "Mining Redemption Machine" + desc = "A place for you to spend your hard earned lucre" + icon = 'icons/obj/vending_vr.dmi' //VOREStation Edit - Eris vending machine sprites + icon_state = "engivend" + layer = 2.9 + anchored = 1 + density = 1 + + var/icon_vend //Icon_state when vending + var/icon_deny = "engivend-deny" //Icon_state when denying access + + // Power + use_power = 1 + idle_power_usage = 10 + var/vend_power_usage = 150 //actuators and stuff + + // Vending-related + var/points = 0 //number of supply points + var/active = 1 //No sales pitches if off! + var/vend_ready = 1 //Are we ready to vend?? Is it time?? + var/vend_delay = 10 //How long does it take to vend? + var/status_message = "" // Status screen messages like "insufficient funds", displayed in NanoUI + + /* + Variables used to initialize the product list + These are used for initialization only, and so are optional if + product_records is specified + */ + var/list/products = list( + /obj/item/stack/marker_beacon/thirty = 10, + /obj/item/weapon/storage/fancy/cigar = 5, + /obj/item/weapon/rig/industrial = 5, + /obj/item/toy/plushie/face_hugger = 3, + /obj/item/weapon/storage/firstaid/regular = 5, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/beltminer = 5, + /obj/machinery/mining/drill = 5, + /obj/machinery/mining/brace = 16, + /obj/mecha/working/ripley/mining = 3, + /obj/mecha/working/ripley/deathripley = 1, + /obj/item/weapon/pickaxe/drill = 5, + /obj/item/weapon/pickaxe/jackhammer = 5, + /obj/item/weapon/pickaxe/plasmacutter = 5, + /obj/item/weapon/pickaxe/borgdrill = 5, + /obj/item/weapon/pickaxe/diamonddrill = 3, + /obj/item/device/gps/mining = 5, + /obj/item/rig_module/device/drill = 3, + ) + + // For each, use the following pattern: + // list(/type/path = amount,/type/path2 = amount2) + // Prices for each item, list(/type/path = price), items not in the list don't have a price. + var/list/prices = list( + /obj/item/weapon/storage/fancy/cigar = 1, + /obj/item/weapon/rig/industrial = 10, + /obj/item/toy/plushie/face_hugger = 1, + /obj/item/weapon/storage/firstaid/regular = 2, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/beltminer = 3, + /obj/machinery/mining/drill = 1, + /obj/machinery/mining/brace = 1, + /obj/mecha/working/ripley/mining = 10, + /obj/mecha/working/ripley/deathripley = 40, + /obj/item/weapon/pickaxe/drill = 3, + /obj/item/weapon/pickaxe/jackhammer = 5, + /obj/item/weapon/pickaxe/plasmacutter = 7, + /obj/item/weapon/pickaxe/borgdrill = 10, + /obj/item/weapon/pickaxe/diamonddrill = 15, + /obj/item/device/gps/mining = 2, + /obj/item/rig_module/device/drill = 3, + ) + + // List of vending_product items available. + var/list/product_records = list() + +/obj/machinery/vending_mining/New() + ..() + spawn(4) + + build_inventory() + power_change() + + return + return + +/** + * Build produdct_records from the products lists + * + * products, contraband, and prices allow specifying + * products that the vending machine is to carry without manually populating + * product_records. + */ +/obj/machinery/vending_mining/proc/build_inventory() + var/list/all_products = list( + list(products, CAT_NORMAL)) + + for(var/current_list in all_products) + var/category = current_list[2] + + for(var/entry in current_list[1]) + var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry) + + product.price = (entry in prices) ? prices[entry] : 0 + product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1 + product.category = category + + product_records.Add(product) + +/obj/machinery/vending_mining/Destroy() + for(var/datum/stored_item/vending_product/R in product_records) + qdel(R) + product_records = null + return ..() + +/obj/machinery/vending_mining/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if(prob(50)) + qdel(src) + return + if(3.0) + if(prob(25)) + spawn(0) + malfunction() + return + return + else + return + +/obj/machinery/vending_mining/attackby(obj/item/weapon/W as obj, mob/user as mob) + + if(istype(W, /obj/item/weapon/coin)) + var/obj/item/weapon/coin/C = W + insert_coin(C, user) + + else if(istype(W, /obj/item/weapon/wrench)) + playsound(src, W.usesound, 100, 1) + if(anchored) + user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") + else + user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") + + if(do_after(user, 20 * W.toolspeed)) + if(!src) return + to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") + anchored = !anchored + return + else + ..() + +/** + * Receive payment with coin + */ +/obj/machinery/vending_mining/proc/insert_coin(var/obj/item/weapon/coin/C, mob/user) + + //TODO: different point values based on material + + visible_message("\The [usr] inserts a coin into \the [src].") + points++ + usr.drop_from_inventory(C) + qdel(C) + return 1 + +/obj/machinery/vending_mining/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/vending_mining/attack_hand(mob/user as mob) + if(stat & (BROKEN|NOPOWER)) + return + + ui_interact(user) + +/** + * Display the NanoUI window for the vending machine. + * + * See NanoUI documentation for details. + */ +/obj/machinery/vending_mining/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + user.set_machine(src) + + var/list/data = list() + data["points"] = points + var/list/listed_products = list() + + for(var/key = 1 to product_records.len) + var/datum/stored_item/vending_product/I = product_records[key] + + listed_products.Add(list(list( + "key" = key, + "name" = I.item_name, + "price" = I.price, + "color" = I.display_color, + "amount" = I.get_amount()))) + + data["products"] = listed_products + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "vending_machine_mining.tmpl", name, 440, 600) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/vending_mining/Topic(href, href_list) + if(stat & (BROKEN|NOPOWER)) + return + if(usr.stat || usr.restrained()) + return + + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) + if((href_list["vend"]) && (vend_ready)) + + var/key = text2num(href_list["vend"]) + var/datum/stored_item/vending_product/R = product_records[key] + + if(R.price <= points) + points -= R.price + vend(R, usr) + else + to_chat(usr, "Not enough points. Requisition Denied.") + + add_fingerprint(usr) + nanomanager.update_uis(src) + +/obj/machinery/vending_mining/proc/vend(datum/stored_item/vending_product/R, mob/user) + + vend_ready = 0 //One thing at a time!! + status_message = "Vending..." + nanomanager.update_uis(src) + + use_power(vend_power_usage) //actuators and stuff + if(icon_vend) //Show the vending animation if needed + flick(icon_vend,src) + + visible_message("\The [src]'s motors wirr, retreiving an item.") + spawn(vend_delay) + R.get_product(get_turf(src)) + if(prob(1)) + sleep(3) + if(R.get_product(get_turf(src))) + visible_message("\The [src] clunks as it vends an additional item.") + + status_message = "" + vend_ready = 1 + nanomanager.update_uis(src) + return 1 + +/obj/machinery/vending_mining/power_change() + ..() + if(stat & BROKEN) + icon_state = "[initial(icon_state)]-broken" + else + if(!(stat & NOPOWER)) + icon_state = initial(icon_state) + else + spawn(rand(0, 15)) + icon_state = "[initial(icon_state)]-off" + +//Oh no we're malfunctioning! Dump out some product and break. +/obj/machinery/vending_mining/proc/malfunction() + for(var/datum/stored_item/vending_product/R in product_records) + while(R.get_amount()>0) + R.get_product(loc) + break + + stat |= BROKEN + icon_state = "[initial(icon_state)]-broken" + return \ No newline at end of file diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 8ff3b7b272..13ed35f6b9 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -5635,7 +5635,7 @@ "ces" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor,/area/maintenance/medbay_aft) "cet" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/medbay_aft) "ceu" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_1_berth_hatch"; locked = 1; name = "Large Escape Pod 1"; req_access = list(13)},/turf/simulated/floor,/area/hallway/secondary/escape/medical_escape_pod_hallway) -"cev" = (/obj/effect/floor_decal/corner/brown{dir = 9},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/critical{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"cev" = (/obj/effect/floor_decal/corner/brown{dir = 9},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/critical{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/vending_mining,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "cew" = (/obj/effect/floor_decal/corner/brown{dir = 6},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "cex" = (/obj/structure/disposalpipe/sortjunction/wildcard{dir = 1},/turf/simulated/floor,/area/maintenance/cargo) "cey" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/tagger/partial{dir = 4; name = "Sorting Office"; sort_tag = "Sorting Office"},/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor,/area/maintenance/cargo) diff --git a/nano/templates/vending_machine_mining.tmpl b/nano/templates/vending_machine_mining.tmpl new file mode 100644 index 0000000000..4fe25d15f4 --- /dev/null +++ b/nano/templates/vending_machine_mining.tmpl @@ -0,0 +1,31 @@ + + +