Files
CHOMPStation2/code/WorkInProgress/computer3/lapvend.dm
Atlantiscze 5cfe7d9dd8 Fixes #5670
- This also includes other vending machines than laptop vendor. They now actually take money from your account instead of pretending to do so and giving stuff for free. No moar spess communism.
- Vending machines now ask for PIN code only if your account settings require it (ie: Security levels 1 or 2. Default is 0 - only ID card swipe)
2014-07-20 01:55:11 +02:00

412 lines
13 KiB
Plaintext

/obj/machinery/lapvend
name = "Laptop Vendor"
desc = "A generic vending machine."
icon = 'icons/obj/vending.dmi'
icon_state = "robotics"
layer = 2.9
anchored = 1
density = 1
var/datum/browser/popup = null
var/obj/machinery/computer3/laptop/vended/newlap = null
var/obj/item/device/laptop/relap = null
var/vendmode = 0
var/cardreader = 0
var/floppy = 0
var/radionet = 0
var/camera = 0
var/network = 0
var/power = 0
/obj/machinery/lapvend/New()
..()
spawn(4)
power_change()
return
return
/obj/machinery/lapvend/blob_act()
if (prob(50))
spawn(0)
del(src)
return
return
/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(vendmode == 1)
if(istype(W, /obj/item/weapon/card))
var/obj/item/weapon/card/I = W
scan_card(I)
vendmode = 0
if(vendmode == 3)
if(istype(W,/obj/item/weapon/card))
var/obj/item/weapon/card/I = W
reimburse(I)
vendmode = 0
if(vendmode == 0)
if(istype(W, /obj/item/device/laptop))
var/obj/item/device/laptop/L = W
relap = L
calc_reimburse(L)
usr.drop_item()
L.loc = src
vendmode = 3
usr << "<span class='notice'>You slot your [L.name] into \The [src.name]</span>"
else
..()
/obj/machinery/lapvend/attack_hand(mob/user as mob)
user.set_machine(src)
var/vendorname = (src.name) //import the machine's name
var/dat = "<TT><center><b>[vendorname]</b></center><hr /><br>" //display the name, and added a horizontal rule
if(vendmode == 0)
dat += "<center><b>Please choose your laptop customization options</b></center><br>"
dat += "<center>Your comptuer will automatically be loaded with any programs you can use after the transaction is complete."
dat += "<center><b>Some programs will require additional components to be installed!</center></b><hr /><br>"
dat += "<center><b>HDD (Required)</b> : Added</center><br>"
dat += "<center><b>Card Reader</b> : <A href='?src=\ref[src];choice=single_add'>Single (50)</a> | <A href='?src=\ref[src];choice=dual_add'>Dual (125)</a><br>"
dat += "<center><b>Floppy Drive</b>: <A href='?src=\ref[src];choice=floppy_add'>Add (50)</a><br>"
dat += "<center><b>Radio Network card</b> <A href='?src=\ref[src];choice=radio_add'>Add (50)</a><br>"
dat += "<center><b>Camera Card</b> <A href='?src=\ref[src];choice=camnet_add'>Add (100)</a><br>"
dat += "<center><b> Network card</b> <A href='?src=\ref[src];choice=area_add'>Area (75)</a> <A href='?src=\ref[src];choice=prox_add'>Adjacent (50)</a><A href='?src=\ref[src];choice=cable_add'>Powernet (25)</a><br>"
dat += "<hr /><center> Power source upgrade</center> <A href='?src=\ref[src];choice=high_add'>Extended (175)</a> <A href='?src=\ref[src];choice=super_add'>Unreal (250)</a>"
if(vendmode == 0 || vendmode == 1)
dat += "<hr /><br><center>Cart</center><br>"
dat += "<b>Total: [total()]</b><br>"
if(cardreader == 1)
dat += "<A href='?src=\ref[src];choice=single_rem'>Card Reader: (single) (50)</a><br>"
else if (cardreader == 2)
dat += "<A href='?src=\ref[src];choice=dual_rem'>Card Reader: (double) (125)</a><br>"
else
dat += "Card Reader: None<br>"
if(floppy == 0)
dat += "Floppy Drive: None<br>"
else
dat += "<A href='?src=\ref[src];choice=floppy_rem'>Floppy Drive: Added (50)</a><br>"
if(radionet == 1)
dat += "<A href='?src=\ref[src];choice=radio_rem'>Radio Card: Added (50)</a><br>"
else
dat += "Radio Card: None<br>"
if(camera == 1)
dat += "<A href='?src=\ref[src];choice=camnet_rem'>Camera Card: Added (100)</a><br>"
else
dat += "Camera Card: None<br>"
if(network == 1)
dat += "<A href='?src=\ref[src];choice=area_rem'>Network card: Area (75)</a><br>"
else if(network == 2)
dat += "<A href='?src=\ref[src];choice=prox_rem'>Network card: Adjacent (50)</a><br>"
else if(network == 3)
dat += "<A href='?src=\ref[src];choice=cable_rem'>Network card: Powernet (25)</a><br>"
else
dat += "Network card: None"
if (power == 0)
dat += "Power source: Regular"
else if (power == 1)
dat += "<A href='?src=\ref[src];choice=high_rem'>Power source: Extended (175)</a><br>"
else
dat += "<A href='?src=\ref[src];choice=super_rem'>Power source: Unreal (250)</a><br>"
if(vendmode == 0)
dat += "<br><A href='?src=\ref[src];choice=vend'>Vend Laptop</a>"
if(vendmode == 1)
dat += "Please swipe your card and enter your PIN to complete the transaction"
if(vendmode == 3)
dat += "Please swipe your card and enter your PIN to be finish returning your computer<br>"
dat += "<a href='?src=\ref[src];choice=cancel'>Cancel</a>"
popup = new(user, "lapvend", name, 450, 500)
popup.set_content(dat)
popup.open()
return
/obj/machinery/lapvend/Topic(href, href_list)
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
usr.set_machine(src)
switch(href_list["choice"])
if("single_add")
cardreader = 1
if ("dual_add")
cardreader = 2
if ("floppy_add")
floppy = 1
if ("radio_add")
radionet = 1
if ("camnet_add")
camera = 1
if ("area_add")
network = 1
if ("prox_add")
network = 2
if ("cable_add")
network = 3
if ("high_add")
power = 1
if ("super_add")
power = 2
if ("single_rem" || "dual_rem")
cardreader = 0
if ("floppy_rem")
floppy = 0
if ("radio_rem")
radionet = 0
if ("camnet_rem")
camera = 0
if ("area_rem" || "prox_rem" || "cable_rem")
network = 0
if ("high_rem" || "super_rem")
power = 0
if("vend")
vendmode = 1
if("cancel")
relap.loc = src.loc
relap = null
vendmode = 0
src.updateUsrDialog()
return
/obj/machinery/lapvend/proc/vend()
if(cardreader > 0)
if(cardreader == 1)
newlap.spawn_parts += (/obj/item/part/computer/cardslot)
else
newlap.spawn_parts += (/obj/item/part/computer/cardslot/dual)
if(floppy == 1)
newlap.spawn_parts += (/obj/item/part/computer/storage/removable)
if(radionet == 1)
newlap.spawn_parts += (/obj/item/part/computer/networking/radio)
if(camera == 1)
newlap.spawn_parts += (/obj/item/part/computer/networking/cameras)
if (network == 1)
newlap.spawn_parts += (/obj/item/part/computer/networking/area)
if (network == 2)
newlap.spawn_parts += (/obj/item/part/computer/networking/prox)
if (network == 3)
newlap.spawn_parts += (/obj/item/part/computer/networking/cable)
if (power == 1)
del(newlap.battery)
newlap.battery = new /obj/item/weapon/cell/high(newlap)
if (power == 2)
del(newlap.battery)
newlap.battery = new /obj/item/weapon/cell/super(newlap)
newlap.spawn_parts()
/obj/machinery/lapvend/proc/scan_card(var/obj/item/weapon/card/I)
if (istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("<span class='info'>[usr] swipes a card through [src].</span>")
var/datum/money_account/CH = get_account(C.associated_account_number)
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)
if(D)
transfer_and_vend(D, C)
else
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
else
transfer_and_vend(CH, C)
// Transfers money and vends the laptop.
/obj/machinery/lapvend/proc/transfer_and_vend(var/datum/money_account/D, var/obj/item/weapon/card/C)
var/transaction_amount = total()
if(transaction_amount <= D.money)
//transfer the money
D.money -= transaction_amount
vendor_account.money += transaction_amount
//Transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Purchase of Laptop"
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()
D.transaction_log.Add(T)
//
T = new()
T.target_name = D.owner_name
T.purpose = "Purchase of Laptop"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
newlap = new /obj/machinery/computer3/laptop/vended(src.loc)
choose_progs(C)
vend()
popup.close()
newlap.close_computer()
newlap = null
cardreader = 0
floppy = 0
radionet = 0
camera = 0
network = 0
power = 0
else
usr << "\icon[src]<span class='warning'>You don't have that much money!</span>"
/obj/machinery/lapvend/proc/total()
var/total = 0
if(cardreader == 1)
total += 50
if(cardreader == 2)
total += 125
if(floppy == 1)
total += 50
if(radionet == 1)
total += 50
if(camera == 1)
total += 100
if(network == 1)
total += 75
if(network == 2)
total += 50
if(network == 3)
total += 25
if(power == 1)
total += 175
if(power == 2)
total += 250
return total
/obj/machinery/lapvend/proc/choose_progs(var/obj/item/weapon/card/id/C)
if(access_security in C.access)
newlap.spawn_files += (/datum/file/program/secure_data)
newlap.spawn_files += (/datum/file/camnet_key)
newlap.spawn_files += (/datum/file/program/security)
if(access_armory in C.access)
newlap.spawn_files += (/datum/file/program/prisoner)
if(access_atmospherics in C.access)
newlap.spawn_files += (/datum/file/program/atmos_alert)
if(access_change_ids in C.access)
newlap.spawn_files += (/datum/file/program/card_comp)
if(access_heads in C.access)
newlap.spawn_files += (/datum/file/program/communications)
if(access_medical in C.access)
newlap.spawn_files += (/datum/file/program/crew)
newlap.spawn_files += (/datum/file/program/med_data)
if(access_engine in C.access)
newlap.spawn_files += (/datum/file/program/powermon)
if(access_research in C.access)
newlap.spawn_files += (/datum/file/camnet_key/research)
newlap.spawn_files += (/datum/file/camnet_key/bombrange)
newlap.spawn_files += (/datum/file/camnet_key/xeno)
if(access_rd in C.access)
newlap.spawn_files += (/datum/file/program/borg_control)
if(access_cent_specops in C.access)
newlap.spawn_files += (/datum/file/camnet_key/creed)
newlap.spawn_files += (/datum/file/program/arcade)
newlap.spawn_files += (/datum/file/camnet_key/entertainment)
//Atlantis: Each laptop gets "invisible" program/security - REQUIRED for camnetkeys to work.
newlap.spawn_files += (/datum/file/program/security/hidden)
newlap.update_spawn_files()
/obj/machinery/lapvend/proc/calc_reimburse(var/obj/item/device/laptop/L)
if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot))
cardreader = 1
if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot/dual))
cardreader = 2
if(istype(L.stored_computer.floppy,/obj/item/part/computer/storage/removable))
floppy = 1
if(istype(L.stored_computer.radio,/obj/item/part/computer/networking/radio))
radionet = 1
if(istype(L.stored_computer.camnet,/obj/item/part/computer/networking/cameras))
camera = 1
if(istype(L.stored_computer.net,/obj/item/part/computer/networking/area))
network = 1
if(istype(L.stored_computer.net,/obj/item/part/computer/networking/prox))
network = 2
if(istype(L.stored_computer.net,/obj/item/part/computer/networking/cable))
network = 3
if(istype(L.stored_computer.battery, /obj/item/weapon/cell/high))
power = 1
if(istype(L.stored_computer.battery, /obj/item/weapon/cell/super))
power = 2
/obj/machinery/lapvend/proc/reimburse(var/obj/item/weapon/card/I)
if (istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("<span class='info'>[usr] swipes a card through [src].</span>")
var/datum/money_account/CH = get_account(C.associated_account_number)
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)
if(D)
transfer_and_reimburse(D)
else
usr << "\icon[src]<span class='warning'>Unable to access account. Check security settings and try again.</span>"
else
usr << "\icon[src]<span class='warning'>Unable to access vendor account. Please record the machine ID and call CentComm Support.</span>"
else
transfer_and_reimburse(CH)
/obj/machinery/lapvend/proc/transfer_and_reimburse(var/datum/money_account/D)
var/transaction_amount = total()
//transfer the money
D.money += transaction_amount
vendor_account.money -= transaction_amount
//Transaction logs
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Return purchase of Laptop"
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()
D.transaction_log.Add(T)
//
T = new()
T.target_name = D.owner_name
T.purpose = "Return purchase of Laptop"
T.amount = "[transaction_amount]"
T.source_terminal = src.name
T.date = current_date_string
T.time = worldtime2text()
vendor_account.transaction_log.Add(T)
del(relap)
vendmode = 0
cardreader = 0
floppy = 0
radionet = 0
camera = 0
network = 0
power = 0