mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-21 03:51:49 +01:00
807f9917a9
My long-awaited return to coding. The Laptop Vendor had a ton of stuff commented out, likely because it was added before many of these parts were ported to Aurora. In addition, it was unable to vend PDAs or tablets. It can now do so. This machine is really in need of a re-do, since it's rather clunky. But this was a quick option. --------- Co-authored-by: GeneralCamo <n/a>
449 lines
16 KiB
Plaintext
449 lines
16 KiB
Plaintext
// A vendor machine for modular computer portable devices - Laptops and Tablets
|
|
|
|
/obj/machinery/lapvend
|
|
name = "computer vendor"
|
|
desc = "A vending machine with microfabricator capable of dispensing various NT-branded computers."
|
|
icon = 'icons/obj/vending.dmi'
|
|
icon_state = "robotics"
|
|
anchored = TRUE
|
|
density = TRUE
|
|
|
|
// The actual laptop/tablet
|
|
var/obj/item/modular_computer/laptop/fabricated_laptop
|
|
var/obj/item/modular_computer/handheld/fabricated_tablet
|
|
var/obj/item/modular_computer/handheld/pda/fabricated_pda
|
|
|
|
// Utility vars
|
|
var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen
|
|
var/devtype = 0 // 0: None(unselected), 1: Laptop, 2: Tablet
|
|
var/total_price = 0 // Price of currently vended device.
|
|
|
|
// Device loadout
|
|
var/dev_cpu = 1 // 1: Default, 2: Upgraded
|
|
var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced
|
|
var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced
|
|
var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range
|
|
var/dev_tesla = 0 // 0: None, 1: Standard
|
|
var/dev_nanoprint = 0 // 0: None, 1: Standard
|
|
var/dev_card = 0 // 0: None, 1: Standard
|
|
var/dev_aislot = 0 // 0: None, 1: Standard
|
|
|
|
// Removes all traces of old order and allows you to begin configuration from scratch.
|
|
/obj/machinery/lapvend/proc/reset_order()
|
|
state = 0
|
|
devtype = 0
|
|
if(fabricated_laptop)
|
|
qdel(fabricated_laptop)
|
|
fabricated_laptop = null
|
|
if(fabricated_tablet)
|
|
qdel(fabricated_tablet)
|
|
fabricated_tablet = null
|
|
if(fabricated_pda)
|
|
qdel(fabricated_pda)
|
|
fabricated_pda = null
|
|
dev_cpu = 1
|
|
dev_battery = 1
|
|
dev_disk = 1
|
|
dev_netcard = 0
|
|
dev_tesla = 0
|
|
dev_nanoprint = 0
|
|
dev_card = 0
|
|
dev_aislot = 0
|
|
|
|
// Recalculates the price and optionally even fabricates the device.
|
|
/obj/machinery/lapvend/proc/fabricate_and_recalc_price(var/fabricate = 0)
|
|
total_price = 0
|
|
if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles
|
|
if(fabricate)
|
|
fabricated_laptop = new(src)
|
|
total_price = 99
|
|
switch(dev_cpu)
|
|
if(1)
|
|
if(fabricate)
|
|
fabricated_laptop.processor_unit = new/obj/item/computer_hardware/processor_unit/small(fabricated_laptop)
|
|
if(2)
|
|
if(fabricate)
|
|
fabricated_laptop.processor_unit = new/obj/item/computer_hardware/processor_unit(fabricated_laptop)
|
|
total_price += 199
|
|
switch(dev_battery)
|
|
if(1) //Micro(500C)
|
|
if(fabricate)
|
|
fabricated_laptop.battery_module = new/obj/item/computer_hardware/battery_module/micro(fabricated_laptop)
|
|
if(2) // Basic(750C)
|
|
if(fabricate)
|
|
fabricated_laptop.battery_module = new/obj/item/computer_hardware/battery_module(fabricated_laptop)
|
|
total_price += 99
|
|
if(3) // Upgraded(1100C)
|
|
if(fabricate)
|
|
fabricated_laptop.battery_module = new/obj/item/computer_hardware/battery_module/advanced(fabricated_laptop)
|
|
total_price += 499
|
|
switch(dev_disk)
|
|
if(1)
|
|
if(fabricate)
|
|
fabricated_laptop.hard_drive = new/obj/item/computer_hardware/hard_drive/small(fabricated_laptop)
|
|
if(2) // Basic(128GQ)
|
|
if(fabricate)
|
|
fabricated_laptop.hard_drive = new/obj/item/computer_hardware/hard_drive(fabricated_laptop)
|
|
total_price += 99
|
|
if(3) // Upgraded(256GQ)
|
|
if(fabricate)
|
|
fabricated_laptop.hard_drive = new/obj/item/computer_hardware/hard_drive/advanced(fabricated_laptop)
|
|
total_price += 299
|
|
switch(dev_netcard)
|
|
if(1) // Basic(Short-Range)
|
|
if(fabricate)
|
|
fabricated_laptop.network_card = new/obj/item/computer_hardware/network_card(fabricated_laptop)
|
|
total_price += 99
|
|
if(2) // Advanced (Long Range)
|
|
if(fabricate)
|
|
fabricated_laptop.network_card = new/obj/item/computer_hardware/network_card/advanced(fabricated_laptop)
|
|
total_price += 299
|
|
if(dev_tesla)
|
|
total_price += 399
|
|
if(fabricate)
|
|
fabricated_laptop.tesla_link = new/obj/item/computer_hardware/tesla_link(fabricated_laptop)
|
|
if(dev_nanoprint)
|
|
total_price += 99
|
|
if(fabricate)
|
|
fabricated_laptop.nano_printer = new/obj/item/computer_hardware/nano_printer(fabricated_laptop)
|
|
if(dev_card)
|
|
total_price += 99
|
|
if(fabricate)
|
|
fabricated_laptop.card_slot = new/obj/item/computer_hardware/card_slot(fabricated_laptop)
|
|
if(dev_aislot)
|
|
total_price += 499
|
|
if(fabricate)
|
|
fabricated_laptop.ai_slot = new/obj/item/computer_hardware/ai_slot(fabricated_laptop)
|
|
|
|
return total_price
|
|
else if(devtype == 2) // Tablet more expensive, not everyone could probably afford this.
|
|
if(fabricate)
|
|
fabricated_tablet = new(src)
|
|
total_price = 199
|
|
switch(dev_cpu)
|
|
if(1)
|
|
if(fabricate)
|
|
fabricated_tablet.processor_unit = new/obj/item/computer_hardware/processor_unit/small(fabricated_tablet)
|
|
if(2)
|
|
if(fabricate)
|
|
fabricated_tablet.processor_unit = new/obj/item/computer_hardware/processor_unit/small/adv(fabricated_tablet)
|
|
total_price += 299
|
|
switch(dev_battery)
|
|
if(1) // Basic(300C)
|
|
if(fabricate)
|
|
fabricated_tablet.battery_module = new/obj/item/computer_hardware/battery_module/nano(fabricated_tablet)
|
|
if(2) // Upgraded(500C)
|
|
if(fabricate)
|
|
fabricated_tablet.battery_module = new/obj/item/computer_hardware/battery_module/micro(fabricated_tablet)
|
|
total_price += 99
|
|
if(3) // Advanced(750C)
|
|
if(fabricate)
|
|
fabricated_tablet.battery_module = new/obj/item/computer_hardware/battery_module(fabricated_tablet)
|
|
total_price += 149
|
|
switch(dev_disk)
|
|
if(1) // Basic(32GQ)
|
|
if(fabricate)
|
|
fabricated_tablet.hard_drive = new/obj/item/computer_hardware/hard_drive/micro(fabricated_tablet)
|
|
if(2) // Upgraded(64GQ)
|
|
if(fabricate)
|
|
fabricated_tablet.hard_drive = new/obj/item/computer_hardware/hard_drive/small(fabricated_tablet)
|
|
total_price += 49
|
|
if(3) // Advanced(128GQ)
|
|
if(fabricate)
|
|
fabricated_tablet.hard_drive = new/obj/item/computer_hardware/hard_drive(fabricated_tablet)
|
|
total_price += 129
|
|
switch(dev_netcard)
|
|
if(1) // Basic(Short-Range)
|
|
if(fabricate)
|
|
fabricated_tablet.network_card = new/obj/item/computer_hardware/network_card(fabricated_tablet)
|
|
total_price += 49
|
|
if(2) // Advanced (Long Range)
|
|
if(fabricate)
|
|
fabricated_tablet.network_card = new/obj/item/computer_hardware/network_card/advanced(fabricated_tablet)
|
|
total_price += 129
|
|
if(dev_nanoprint)
|
|
total_price += 49
|
|
if(fabricate)
|
|
fabricated_tablet.nano_printer = new/obj/item/computer_hardware/nano_printer(fabricated_tablet)
|
|
if(dev_card)
|
|
total_price += 99
|
|
if(fabricate)
|
|
fabricated_tablet.card_slot = new/obj/item/computer_hardware/card_slot(fabricated_tablet)
|
|
if(dev_tesla)
|
|
total_price += 459
|
|
if(fabricate)
|
|
fabricated_tablet.tesla_link = new/obj/item/computer_hardware/tesla_link(fabricated_tablet)
|
|
if(dev_aislot)
|
|
total_price += 199
|
|
if(fabricate)
|
|
fabricated_tablet.ai_slot = new/obj/item/computer_hardware/ai_slot(fabricated_tablet)
|
|
return total_price
|
|
else if(devtype == 3) // PDA, same cost as tablet but smaller form factor
|
|
if(fabricate)
|
|
fabricated_pda = new(src)
|
|
total_price = 199
|
|
switch(dev_cpu)
|
|
if(1)
|
|
if(fabricate)
|
|
fabricated_pda.processor_unit = new/obj/item/computer_hardware/processor_unit/small(fabricated_pda)
|
|
if(2)
|
|
if(fabricate)
|
|
fabricated_pda.processor_unit = new/obj/item/computer_hardware/processor_unit/small/adv(fabricated_pda)
|
|
total_price += 299
|
|
switch(dev_battery)
|
|
if(1) // Basic(300C)
|
|
if(fabricate)
|
|
fabricated_pda.battery_module = new/obj/item/computer_hardware/battery_module/nano(fabricated_pda)
|
|
if(2) // Upgraded(500C)
|
|
if(fabricate)
|
|
fabricated_pda.battery_module = new/obj/item/computer_hardware/battery_module/micro(fabricated_pda)
|
|
total_price += 99
|
|
if(3) // Advanced(750C)
|
|
if(fabricate)
|
|
fabricated_pda.battery_module = new/obj/item/computer_hardware/battery_module(fabricated_pda)
|
|
total_price += 149
|
|
switch(dev_disk)
|
|
if(1) // Basic(32GQ)
|
|
if(fabricate)
|
|
fabricated_pda.hard_drive = new/obj/item/computer_hardware/hard_drive/micro(fabricated_pda)
|
|
if(2) // Upgraded(64GQ)
|
|
if(fabricate)
|
|
fabricated_pda.hard_drive = new/obj/item/computer_hardware/hard_drive/small(fabricated_pda)
|
|
total_price += 49
|
|
if(3) // Advanced(128GQ)
|
|
if(fabricate)
|
|
fabricated_pda.hard_drive = new/obj/item/computer_hardware/hard_drive(fabricated_pda)
|
|
total_price += 129
|
|
switch(dev_netcard)
|
|
if(1) // Basic(Short-Range)
|
|
if(fabricate)
|
|
fabricated_pda.network_card = new/obj/item/computer_hardware/network_card(fabricated_pda)
|
|
total_price += 49
|
|
if(2) // Advanced (Long Range)
|
|
if(fabricate)
|
|
fabricated_pda.network_card = new/obj/item/computer_hardware/network_card/advanced(fabricated_pda)
|
|
total_price += 129
|
|
if(dev_nanoprint)
|
|
total_price += 49
|
|
if(fabricate)
|
|
fabricated_pda.nano_printer = new/obj/item/computer_hardware/nano_printer(fabricated_pda)
|
|
if(dev_card)
|
|
total_price += 99
|
|
if(fabricate)
|
|
fabricated_pda.card_slot = new/obj/item/computer_hardware/card_slot(fabricated_pda)
|
|
if(dev_tesla)
|
|
total_price += 459
|
|
if(fabricate)
|
|
fabricated_pda.tesla_link = new/obj/item/computer_hardware/tesla_link(fabricated_pda)
|
|
if(dev_aislot)
|
|
total_price += 199
|
|
if(fabricate)
|
|
fabricated_pda.ai_slot = new/obj/item/computer_hardware/ai_slot(fabricated_pda)
|
|
return total_price
|
|
return 0
|
|
|
|
|
|
|
|
|
|
|
|
/obj/machinery/lapvend/Topic(href, href_list)
|
|
if(..())
|
|
return 1
|
|
|
|
if(href_list["pick_device"])
|
|
if(state) // We've already picked a device type
|
|
return 0
|
|
devtype = text2num(href_list["pick_device"])
|
|
state = 1
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["clean_order"])
|
|
reset_order()
|
|
return 1
|
|
if((state != 1) && devtype) // Following IFs should only be usable when in the Select Loadout mode
|
|
return 0
|
|
if(href_list["confirm_order"])
|
|
state = 2 // Wait for ID swipe for payment processing
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_cpu"])
|
|
dev_cpu = text2num(href_list["hw_cpu"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_battery"])
|
|
dev_battery = text2num(href_list["hw_battery"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_disk"])
|
|
dev_disk = text2num(href_list["hw_disk"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_netcard"])
|
|
dev_netcard = text2num(href_list["hw_netcard"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_tesla"])
|
|
dev_tesla = text2num(href_list["hw_tesla"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_nanoprint"])
|
|
dev_nanoprint = text2num(href_list["hw_nanoprint"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_card"])
|
|
dev_card = text2num(href_list["hw_card"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
if(href_list["hw_aislot"])
|
|
dev_aislot = text2num(href_list["hw_aislot"])
|
|
fabricate_and_recalc_price(0)
|
|
return 1
|
|
return 0
|
|
|
|
/obj/machinery/lapvend/attack_hand(var/mob/user)
|
|
if(anchored)
|
|
ui_interact(user)
|
|
else
|
|
to_chat(user, SPAN_NOTICE("\The [src] needs to be anchored to the floor to function!"))
|
|
|
|
/obj/machinery/lapvend/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
|
if(stat & (BROKEN | NOPOWER | MAINT))
|
|
if(ui)
|
|
ui.close()
|
|
return 0
|
|
|
|
var/list/data[0]
|
|
data["state"] = state
|
|
if(state == 1)
|
|
data["devtype"] = devtype
|
|
data["hw_battery"] = dev_battery
|
|
data["hw_disk"] = dev_disk
|
|
data["hw_netcard"] = dev_netcard
|
|
data["hw_tesla"] = dev_tesla
|
|
data["hw_nanoprint"] = dev_nanoprint
|
|
data["hw_card"] = dev_card
|
|
data["hw_cpu"] = dev_cpu
|
|
data["hw_aislot"] = dev_aislot
|
|
if(state == 1 || state == 2)
|
|
data["totalprice"] = total_price
|
|
|
|
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
|
|
if (!ui)
|
|
ui = new(user, src, ui_key, "computer_fabricator.tmpl", "Personal Computer Vendor", 500, 400)
|
|
ui.set_initial_data(data)
|
|
ui.open()
|
|
ui.set_auto_update(1)
|
|
|
|
/obj/machinery/lapvend/attackby(obj/item/attacking_item, mob/user)
|
|
if(attacking_item.iswrench())
|
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
if(anchored)
|
|
user.visible_message("<b>[user]</b> begins unsecuring \the [src] from the floor.", \
|
|
SPAN_NOTICE("You start unsecuring \the [src] from the floor."))
|
|
else
|
|
user.visible_message("<b>[user]</b> begins securing \the [src] to the floor.", \
|
|
SPAN_NOTICE("You start securing \the [src] to the floor."))
|
|
if(attacking_item.use_tool(src, user, 20, volume = 50))
|
|
if(!src)
|
|
return
|
|
to_chat(user, SPAN_NOTICE("You [anchored ? "un" : ""]secured \the [src]!"))
|
|
anchored = !anchored
|
|
return
|
|
else if(state == 2) // awaiting payment state
|
|
var/obj/item/card/id/I = attacking_item.GetID()
|
|
if(I)
|
|
if(process_payment(I, attacking_item))
|
|
create_device(user)
|
|
return TRUE
|
|
else if(istype(attacking_item, /obj/item/card/tech_support))
|
|
create_device(user, "Have a NanoTrasen day!")
|
|
return TRUE
|
|
return ..()
|
|
|
|
/obj/machinery/lapvend/proc/create_device(mob/user, var/message = "Enjoy your new product!")
|
|
fabricate_and_recalc_price(TRUE)
|
|
if((devtype == 1) && fabricated_laptop)
|
|
fabricated_laptop.forceMove(src.loc)
|
|
if(fabricated_laptop.battery_module)
|
|
fabricated_laptop.battery_module.charge_to_full()
|
|
fabricated_laptop.screen_on = 0
|
|
fabricated_laptop.anchored = 0
|
|
fabricated_laptop.update_icon()
|
|
if(Adjacent(user))
|
|
user.put_in_hands(fabricated_laptop)
|
|
fabricated_laptop = null
|
|
else if((devtype == 2) && fabricated_tablet)
|
|
fabricated_tablet.forceMove(src.loc)
|
|
if(fabricated_tablet.battery_module)
|
|
fabricated_tablet.battery_module.charge_to_full()
|
|
if(Adjacent(user))
|
|
user.put_in_hands(fabricated_tablet)
|
|
fabricated_tablet = null
|
|
else if ((devtype == 3) && fabricated_pda)
|
|
fabricated_pda.forceMove(src.loc)
|
|
if(fabricated_pda.battery_module)
|
|
fabricated_pda.battery_module.charge_to_full()
|
|
if(Adjacent(user))
|
|
user.put_in_hands(fabricated_pda)
|
|
fabricated_pda = null
|
|
ping(message)
|
|
intent_message(MACHINE_SOUND)
|
|
state = 3
|
|
|
|
// Simplified payment processing, returns 1 on success.
|
|
/obj/machinery/lapvend/proc/process_payment(var/obj/item/card/id/I, var/obj/item/ID_container)
|
|
var/obj/item/spacecash/S = null
|
|
if (istype(ID_container, /obj/item/spacecash))
|
|
S = ID_container
|
|
if(I==ID_container || ID_container == null)
|
|
visible_message("<span class='info'>\The [usr] swipes \the [I] through \the [src].</span>")
|
|
else
|
|
visible_message("<span class='info'>\The [usr] swipes \the [ID_container] through \the [src].</span>")
|
|
playsound(src.loc, 'sound/machines/id_swipe.ogg', 50, 1)
|
|
if(I)
|
|
//Allow BSTs to take stuff from vendors, for debugging and adminbus purposes
|
|
if (istype(I, /obj/item/card/id/bst))
|
|
return 1
|
|
var/datum/money_account/customer_account = SSeconomy.get_account(I.associated_account_number)
|
|
if (!customer_account || customer_account.suspended)
|
|
ping("Connection error. Unable to connect to account.")
|
|
return 0
|
|
|
|
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
|
|
customer_account = SSeconomy.attempt_account_access(I.associated_account_number, attempt_pin, 2)
|
|
|
|
if(!customer_account)
|
|
ping("Unable to access account: incorrect credentials.")
|
|
return 0
|
|
|
|
if(total_price > customer_account.money)
|
|
ping("Insufficient funds in account.")
|
|
return 0
|
|
else
|
|
customer_account.money -= total_price
|
|
var/datum/transaction/T = new()
|
|
T.target_name = "Computer Manufacturer (via [src.name])"
|
|
T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]."
|
|
T.amount = total_price
|
|
T.source_terminal = src.name
|
|
T.date = worlddate2text()
|
|
T.time = worldtime2text()
|
|
SSeconomy.add_transaction_log(customer_account,T)
|
|
return 1
|
|
else if(S)
|
|
if(total_price > S.worth)
|
|
ping("Insufficient funds!")
|
|
return 0
|
|
else
|
|
S.worth -= total_price
|
|
if(S.worth <= 0)
|
|
qdel(S)
|
|
else
|
|
S.update_icon()
|
|
return 1
|
|
|
|
else // just incase
|
|
ping("You cannot pay with this!")
|
|
return 0
|