From 1553afab2438178bfeb658b1f05a43f488eab2d8 Mon Sep 17 00:00:00 2001 From: XDTM Date: Wed, 26 Sep 2018 00:35:02 +0200 Subject: [PATCH] [Ready for review]Adds credit holochips to replace magic cash (#40462) cl XDTM add: Added credit holochips, a form of semi-physical currency to use in transactions. They can be generated by id cards by drawing from bank accounts and can be used to make payments. add: There is no limit to the amount of credits that can be stored on a holochip, but being holograms they are vulnerable to electromagnetic pulses, and may disappear if exposed to one! add: Holochips can be split with alt-click, and can be merged by clicking on another holochip. /cl Inserting physical cash into ids and printing it on the go is really jarring, and since we're on a sci-fi universe i think that hard-light hologram chips with encrypted credits sounds more believable. As a plus, they don't have to deal with messy stack calculations with different denominations, and simply have a credits var that holds their amount. They change color based on the amount of cash for easy recognizability. --- code/game/machinery/bank_machine.dm | 18 +++- code/game/objects/items/cards_ids.dm | 23 +++-- code/game/objects/items/credit_holochip.dm | 83 ++++++++++++++++++ code/game/objects/items/storage/wallets.dm | 4 +- code/modules/economy/pay_stand.dm | 19 +++- code/modules/events/pirates.dm | 19 ++-- code/modules/mining/money_bag.dm | 2 +- code/modules/shuttle/special.dm | 18 +++- .../modules/spells/spell_types/devil_boons.dm | 16 ++-- icons/obj/economy.dmi | Bin 24472 -> 25262 bytes tgstation.dme | 1 + 11 files changed, 160 insertions(+), 43 deletions(-) create mode 100644 code/game/objects/items/credit_holochip.dm diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index fc9b808bcee..d258f7a4d0a 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -8,6 +8,7 @@ var/obj/item/radio/radio var/radio_channel = "Common" var/minimum_time_between_warnings = 400 + var/syphoning_credits = 0 /obj/machinery/computer/bank_machine/Initialize() . = ..() @@ -25,6 +26,9 @@ if(istype(I, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/C = I value = C.value * C.amount + else if(istype(I, /obj/item/holochip)) + var/obj/item/holochip/H = I + value = H.credits if(value) var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) if(D) @@ -40,14 +44,15 @@ if(siphoning) if (stat & (BROKEN|NOPOWER)) say("Insufficient power. Halting siphon.") - siphoning = FALSE + end_syphon() var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) if(!D.has_money(200)) say("Cargo budget depleted. Halting siphon.") - siphoning = FALSE + end_syphon() return - new /obj/item/stack/spacecash/c200(drop_location()) // will autostack + playsound(src, 'sound/items/poster_being_created.ogg', 100, 1) + syphoning_credits += 200 D.adjust_money(-200) if(next_warning < world.time && prob(15)) var/area/A = get_area(loc) @@ -85,4 +90,9 @@ siphoning = TRUE if(href_list["halt"]) say("Station credit withdrawal halted.") - siphoning = FALSE + end_syphon() + +/obj/machinery/computer/bank_machine/proc/end_syphon() + siphoning = FALSE + new /obj/item/holochip(drop_location(), syphoning_credits) //get the loot + syphoning_credits = 0 diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index e57bd6b4ad7..62b7fef8ea9 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -142,14 +142,12 @@ update_label() /obj/item/card/id/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stack/spacecash)) - var/obj/item/stack/spacecash/vbucks = W + if(istype(W, /obj/item/holochip)) + var/obj/item/holochip/holochip = W if(registered_account) - var/fortnite_money = vbucks.value * vbucks.amount - registered_account.adjust_money(fortnite_money) - to_chat(user, "You insert [vbucks] into [src], adding $[fortnite_money] to your account.") - qdel(vbucks) - + registered_account.adjust_money(holochip.credits) + to_chat(user, "You insert [holochip] into [src], adding [holochip.credits] credits to your account.") + qdel(holochip) /obj/item/card/id/attack_self(mob/user) if(!registered_account) @@ -170,10 +168,9 @@ if(!amount_to_remove || amount_to_remove < 0) return if(registered_account.adjust_money(-amount_to_remove)) - var/obj/item/stack/spacecash/c1/dosh = new /obj/item/stack/spacecash/c1(get_turf(user)) - dosh.amount = amount_to_remove - user.put_in_hands(dosh) - to_chat(user, "You withdraw $[amount_to_remove].") + var/obj/item/holochip/holochip = new (get_turf(user), amount_to_remove) + user.put_in_hands(holochip) + to_chat(user, "You withdraw [amount_to_remove] credits into a holochip.") return else to_chat(user, "You don't have the funds for that.") @@ -187,8 +184,8 @@ var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department) if(D) to_chat(user, "The [D.account_holder] reports a balance of $[D.account_balance].") - to_chat(user, "Use your ID in-hand to pull money from your account in the form of cash.") - to_chat(user, "You can insert cash into your account by smashing the money against the ID.") + to_chat(user, "Use your ID in-hand to pull money from your account in the form of holochips.") + to_chat(user, "You can insert credits into your account by pressing holochips against the ID.") to_chat(user, "If you lose this ID card, you can reclaim your account by using a blank ID card inhand and punching in the account ID.") if(mining_points) diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm new file mode 100644 index 00000000000..2a96fa0ca11 --- /dev/null +++ b/code/game/objects/items/credit_holochip.dm @@ -0,0 +1,83 @@ +/obj/item/holochip + name = "credit holochip" + desc = "A hard-light chip encoded with an amount of credits. It is a modern replacement for physical money that can be directly converted to virtual currency and viceversa. Keep away from magnets." + icon = 'icons/obj/economy.dmi' + icon_state = "holochip_1" + throwforce = 0 + force = 0 + w_class = WEIGHT_CLASS_TINY + var/credits = 0 + +/obj/item/holochip/Initialize(mapload, amount) + . = ..() + credits = amount + update_icon() + +/obj/item/holochip/examine(mob/user) + . = ..() + to_chat(user, "It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]") + to_chat(user, "Alt-Click to split.") + +/obj/item/holochip/update_icon() + switch(credits) + if(1 to 9) + icon_state = "holochip_1" + if(10 to 99) + icon_state = "holochip_10" + if(100 to 999) + icon_state = "holochip_100" + if(1000 to 9999) + icon_state = "holochip_1k" + if(10000 to 999999) + icon_state = "holochip_10k" + if(1000000 to 999999999) + icon_state = "holochip_million" + if(1000000000 to INFINITY) + icon_state = "holochip_billion" + +/obj/item/holochip/proc/spend(amount, pay_anyway = FALSE) + if(credits >= amount) + credits -= amount + if(credits == 0) + qdel(src) + update_icon() + return amount + else if(pay_anyway) + qdel(src) + return credits + else + return 0 + +/obj/item/holochip/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/holochip)) + var/obj/item/holochip/H = I + credits += H.credits + to_chat(user, "You insert the credits into [src].") + update_icon() + qdel(H) + +/obj/item/holochip/AltClick(mob/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + var/split_amount = round(input(user,"How many credits do you want to extract from the holochip?") as null|num) + if(split_amount == null || split_amount <= 0 || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + else + var/new_credits = spend(split_amount, TRUE) + var/obj/item/holochip/H = new(user ? user : drop_location(), new_credits) + if(user) + if(!user.put_in_hands(H)) + H.forceMove(user.drop_location()) + add_fingerprint(user) + H.add_fingerprint(user) + to_chat(user, "You extract [split_amount] credits into a new holochip.") + +/obj/item/holochip/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + var/wipe_chance = 60 / severity + if(prob(wipe_chance)) + visible_message("[src] fizzles and disappears!") + qdel(src) //rip cash \ No newline at end of file diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index e9458b28b11..3f28c10212e 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -15,6 +15,7 @@ STR.max_items = 4 STR.can_hold = typecacheof(list( /obj/item/stack/spacecash, + /obj/item/holochip, /obj/item/card, /obj/item/clothing/mask/cigarette, /obj/item/flashlight/pen, @@ -75,6 +76,5 @@ icon_state = "random_wallet" /obj/item/storage/wallet/random/PopulateContents() - var/obj/item/stack/spacecash/c10/cash = new /obj/item/stack/spacecash/c10(src) - cash.amount = rand(1,5) + new /obj/item/holochip(src, rand(5,30)) update_icon() diff --git a/code/modules/economy/pay_stand.dm b/code/modules/economy/pay_stand.dm index bc22b109b69..e703477ab3f 100644 --- a/code/modules/economy/pay_stand.dm +++ b/code/modules/economy/pay_stand.dm @@ -28,8 +28,7 @@ var/obj/item/card/id/vbucks = W if(vbucks.registered_account) if(vbucks.registered_account.adjust_money(-price)) - my_card.registered_account.adjust_money(price) - my_card.registered_account.bank_card_talk("Purchase made at your vendor by [vbucks.registered_account.account_holder] for $[price].") + purchase(vbucks.registered_account.account_holder) to_chat(user, "Thanks for purchasing! The vendor has been informed.") return else @@ -38,6 +37,15 @@ else to_chat(user, "You're going to need an actual bank account for that one, buddy.") return + if(istype(W, /obj/item/holochip)) + var/obj/item/holochip/H = W + if(H.spend(price, FALSE)) + purchase(user) + to_chat(user, "Thanks for purchasing! The vendor has been informed.") + return + else + to_chat(user, "You trying to punk me, kid? Come back when you have the cash.") + return if(istype(W, /obj/item/stack/spacecash)) to_chat(user, "What is this, the 2000s? We only take card here.") return @@ -57,4 +65,9 @@ else if(default_deconstruction_crowbar(W)) return else - return ..() \ No newline at end of file + return ..() + +/obj/machinery/paystand/proc/purchase(buyer) + my_card.registered_account.adjust_money(price) + my_card.registered_account.bank_card_talk("Purchase made at your vendor by [buyer] for [price] credits.") + \ No newline at end of file diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 99a8dc2f7f1..099ed1a83f2 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -146,15 +146,9 @@ new /obj/effect/temp_visual/emp(get_turf(S)) /obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user) - if(credits_stored < 200) - to_chat(user,"Not enough credits to retrieve.") - return - while(credits_stored >= 200) - new /obj/item/stack/spacecash/c200(drop_location()) - credits_stored -= 200 + new /obj/item/holochip(drop_location(), credits_stored) to_chat(user,"You retrieve the siphoned credits!") - /obj/machinery/shuttle_scrambler/proc/send_notification() priority_announce("Data theft signal detected, source registered on local gps units.") @@ -458,4 +452,13 @@ /datum/export/pirate/cash/get_amount(obj/O) var/obj/item/stack/spacecash/C = O - return ..() * C.amount * C.value \ No newline at end of file + return ..() * C.amount * C.value + +/datum/export/pirate/holochip + cost = 1 + unit_name = "holochip" + export_types = list(/obj/item/holochip) + +/datum/export/pirate/holochip/get_cost(atom/movable/AM) + var/obj/item/holochip/H = AM + return H.credits \ No newline at end of file diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 597cad727ce..5d2fc6f4bd8 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -15,7 +15,7 @@ STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_items = 40 STR.max_combined_w_class = 40 - STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash)) + STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/holochip)) /obj/item/storage/bag/money/vault/PopulateContents() new /obj/item/coin/silver(src) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index f61e5fe52b0..dd01ee28131 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -232,25 +232,35 @@ var/list/counted_money = list() for(var/obj/item/coin/C in AM.GetAllContents()) - payees[AM] += C.value - counted_money += C if(payees[AM] >= threshold) break + payees[AM] += C.value + counted_money += C for(var/obj/item/stack/spacecash/S in AM.GetAllContents()) + if(payees[AM] >= threshold) + break payees[AM] += S.value * S.amount counted_money += S + for(var/obj/item/holochip/H in AM.GetAllContents()) if(payees[AM] >= threshold) break + payees[AM] += H.credits + counted_money += H - if(istype(AM.pulling, /obj/item/coin)) + if(payees[AM] < threshold && istype(AM.pulling, /obj/item/coin)) var/obj/item/coin/C = AM.pulling payees[AM] += C.value counted_money += C - else if(istype(AM.pulling, /obj/item/stack/spacecash)) + else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/S = AM.pulling payees[AM] += S.value * S.amount counted_money += S + + else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/holochip)) + var/obj/item/holochip/H = AM.pulling + payees[AM] += H.credits + counted_money += H if(ishuman(AM)) var/mob/living/carbon/human/H = AM diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm index 36b69b1115b..b5174462d4f 100644 --- a/code/modules/spells/spell_types/devil_boons.dm +++ b/code/modules/spells/spell_types/devil_boons.dm @@ -16,14 +16,14 @@ for(var/mob/living/carbon/C in targets) if(user.dropItemToGround(user.get_active_held_item())) var/obj/item = pick( - new /obj/item/coin/gold(user.loc), - new /obj/item/coin/diamond(user.loc), - new /obj/item/coin/silver(user.loc), - new /obj/item/clothing/accessory/medal/gold(user.loc), - new /obj/item/stack/sheet/mineral/gold(user.loc), - new /obj/item/stack/sheet/mineral/silver(user.loc), - new /obj/item/stack/sheet/mineral/diamond(user.loc), - new /obj/item/stack/spacecash/c1000(user.loc)) + new /obj/item/coin/gold(user.drop_location()), + new /obj/item/coin/diamond(user.drop_location()), + new /obj/item/coin/silver(user.drop_location()), + new /obj/item/clothing/accessory/medal/gold(user.drop_location()), + new /obj/item/stack/sheet/mineral/gold(user.drop_location()), + new /obj/item/stack/sheet/mineral/silver(user.drop_location()), + new /obj/item/stack/sheet/mineral/diamond(user.drop_location()), + new /obj/item/holochip(user.drop_location(), 1000)) C.put_in_hands(item) /obj/effect/proc_holder/spell/targeted/view_range diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi index 8e24281aa2d041c231bd3a864326960be98fe18f..ed62351507954c8a0505f343c68b5c7dc5d1f436 100644 GIT binary patch delta 6149 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 E0LB+^EdT%j diff --git a/tgstation.dme b/tgstation.dme index b5c7007cdb4..4820be15228 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -771,6 +771,7 @@ #include "code\game\objects\items\cosmetics.dm" #include "code\game\objects\items\courtroom.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\credit_holochip.dm" #include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" #include "code\game\objects\items\dice.dm"