Merge pull request #48994 from ArcaneMusic/arconomy

[READY]Arconomy: Adds the Vend-A-Tray and the Card Reader stock part
This commit is contained in:
skoglol
2020-02-29 23:04:31 +01:00
committed by GitHub
13 changed files with 290 additions and 17 deletions
+155 -1
View File
@@ -10,6 +10,7 @@
max_integrity = 200
integrity_failure = 0.25
var/obj/item/showpiece = null
var/obj/item/showpiece_type = null //This allows for showpieces that can only hold items if they're the same istype as this.
var/alert = TRUE
var/open = FALSE
var/openable = TRUE
@@ -17,6 +18,7 @@
var/start_showpiece_type = null //add type for items on display
var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk")
var/trophy_message = ""
var/glass_fix = TRUE
/obj/structure/displaycase/Initialize()
. = ..()
@@ -131,11 +133,14 @@
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
toggle_lock(user)
else if(open && !showpiece)
if(showpiece_type && !istype(W, showpiece_type))
to_chat(user, "<span class='notice'>This doesn't belong in this kind of display.</span>")
return TRUE
if(user.transferItemToLoc(W, src))
showpiece = W
to_chat(user, "<span class='notice'>You put [W] on display.</span>")
update_icon()
else if(istype(W, /obj/item/stack/sheet/glass) && broken)
else if(glass_fix && broken && istype(W, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = W
if(G.get_amount() < 2)
to_chat(user, "<span class='warning'>You need two glass sheets to fix the case!</span>")
@@ -206,6 +211,21 @@
electronics = I
to_chat(user, "<span class='notice'>You install the airlock electronics.</span>")
else if(istype(I, /obj/item/stock_parts/card_reader))
var/obj/item/stock_parts/card_reader/C = I
to_chat(user, "<span class='notice'>You start adding [C] to [src]...</span>")
if(do_after(user, 20, target = src))
var/obj/structure/displaycase/forsale/sale = new(src.loc)
if(electronics)
electronics.forceMove(sale)
sale.electronics = electronics
if(electronics.one_access)
sale.req_one_access = electronics.accesses
else
sale.req_access = electronics.accesses
qdel(src)
qdel(C)
else if(istype(I, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = I
if(G.get_amount() < 10)
@@ -342,3 +362,137 @@
name = initial(I.name)
icon = initial(I.icon)
icon_state = initial(I.icon_state)
/obj/structure/displaycase/forsale
name = "vend-a-tray"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "laserbox0"
desc = "A display case with an ID-card swiper. Use your ID to purchase the contents."
density = FALSE
max_integrity = 100
req_access = list(ACCESS_KITCHEN)
showpiece_type = /obj/item/reagent_containers/food
alert = FALSE //No, we're not calling the fire department because someone stole your cookie.
glass_fix = FALSE //Fixable with tools instead.
var/sale_price = 20
var/datum/bank_account/payments_acc = null
/obj/structure/displaycase/forsale/update_icon() //remind me to fix my shitcode later
var/icon/I
if(open)
I = icon('icons/obj/stationobjs.dmi',"laserboxb0")
else
I = icon('icons/obj/stationobjs.dmi',"laserbox0")
if(!showpiece && !open)
I = icon('icons/obj/stationobjs.dmi',"laserbox_open")
if(broken)
I = icon('icons/obj/stationobjs.dmi',"laserbox_broken")
if(showpiece)
var/icon/S = getFlatIcon(showpiece)
S.Scale(17,17)
I.Blend(S,ICON_UNDERLAY,8,12)
src.icon = I
return
/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params)
if(isidcard(I))
//Card Registration
var/obj/item/card/id/potential_acc = I
if(!potential_acc.registered_account)
to_chat(user, "<span class='warning'>This ID card has no account registered!</span>")
return
if(payments_acc && payments_acc != potential_acc.registered_account)
to_chat(user, "<span class='warning'>This Vend-a-tray is already registered!</span>")
return
if(!payments_acc && potential_acc.registered_account)
payments_acc = potential_acc.registered_account
playsound(src, 'sound/machines/click.ogg', 20, TRUE)
to_chat(user, "<span class='notice'>Vend-a-tray registered. Use your ID on grab intent to change the sale price, or disarm intent to open the tray.</span>")
return
//Buying the contained item with the ID.
switch(user.a_intent)
if(INTENT_HELP)
if(!showpiece)
to_chat(user, "<span class='notice'>There's nothing for sale.</span>")
return TRUE
if(broken)
to_chat(user, "<span class='notice'>[src] appears to be broken.</span>")
return TRUE
var/confirm = alert(user, "Purchase [showpiece] for [sale_price]?", "Purchase?", "Confirm", "Cancel")
if(confirm == "Cancel" || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return TRUE
var/datum/bank_account/account = potential_acc.registered_account
if(!account.has_money(sale_price))
to_chat(user, "<span class='notice'>You do not possess the funds to purchase this.</span>")
return TRUE
else
account.adjust_money(-sale_price)
if(payments_acc)
payments_acc.adjust_money(sale_price)
user.put_in_hands(showpiece)
to_chat(user, "<span class='notice'>You purchase [showpiece] for [sale_price] credits.</span>")
playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE)
icon = 'icons/obj/stationobjs.dmi'
flick("laserbox_vend", src)
showpiece = null
update_icon()
return TRUE
//Setting the object's price.
if(INTENT_GRAB)
var/new_price_input = input(user,"Set the sale price for this vend-a-tray.","new price",0) as num|null
if(isnull(new_price_input) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
new_price_input = clamp(round(new_price_input, 1), 10, 1000)
sale_price = new_price_input
to_chat(user, "<span class='notice'>The cost is now set to [sale_price].</span>")
return TRUE
if(I.tool_behaviour == TOOL_WRENCH && open && user.a_intent == INTENT_HELP )
if(anchored)
to_chat(user, "<span class='notice'>You start unsecuring [src]...</span>")
else
to_chat(user, "<span class='notice'>You start securing [src]...</span>")
if(I.use_tool(src, user, 16, volume=50))
if(QDELETED(I))
return
if(anchored)
to_chat(user, "<span class='notice'>You unsecure [src].</span>")
else
to_chat(user, "<span class='notice'>You secure [src].</span>")
anchored = !anchored
return
else if(I.tool_behaviour == TOOL_WRENCH && !open && user.a_intent == INTENT_HELP)
to_chat(user, "<span class='notice'>[src] must be open to move it.</span>")
return
if(istype(I, /obj/item/pda))
return TRUE
. = ..()
/obj/structure/displaycase/forsale/multitool_act(mob/living/user, obj/item/I)
. = ..()
if(obj_integrity <= (integrity_failure * max_integrity))
to_chat(user, "<span class='notice'>You start recalibrating [src]'s hover field...</span>")
if(do_after(user, 20, target = src))
broken = 0
obj_integrity = max_integrity
update_icon()
return TRUE
/obj/structure/displaycase/forsale/emag_act(mob/user)
. = ..()
payments_acc = null
req_access = list()
to_chat(user, "<span class='warning'>[src]'s card reader fizzles and smokes, and the account owner is reset.</span>")
/obj/structure/displaycase/forsale/examine(mob/user)
. = ..()
if(showpiece && !open)
. += "<span class='notice'>[showpiece] is for sale for [sale_price] credits.</span>"
if(broken)
. += "<span class='notice'>[src] is sparking and the hover field generator seems to be overloaded. Use a multitool to fix it.</span>"
/obj/structure/displaycase/forsale/obj_break(damage_flag)
if(!broken && !(flags_1 & NODECONSTRUCT_1))
broken = TRUE
playsound(src, "shatter", 70, TRUE)
update_icon()
trigger_alarm() //In case it's given an alarm anyway.