diff --git a/baystation12.dme b/baystation12.dme
index cc1dfc4721c..f545de5b16e 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -702,6 +702,7 @@
#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm"
+#include "code\modules\admin\secrets.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\DB ban\functions.dm"
diff --git a/code/WorkInProgress/Mini/ATM.dm b/code/WorkInProgress/Mini/ATM.dm
index dc8f9150686..59434f9e591 100644
--- a/code/WorkInProgress/Mini/ATM.dm
+++ b/code/WorkInProgress/Mini/ATM.dm
@@ -22,7 +22,6 @@ log transactions
anchored = 1
use_power = 1
idle_power_usage = 10
- var/obj/machinery/account_database/linked_db
var/datum/money_account/authenticated_account
var/number_incorrect_tries = 0
var/previous_account_number = 0
@@ -33,25 +32,19 @@ log transactions
var/obj/item/weapon/card/held_card
var/editing_security_level = 0
var/view_screen = NO_SCREEN
+ var/datum/effect/effect/system/spark_spread/spark_system
/obj/machinery/atm/New()
..()
machine_id = "[station_name()] RT #[num_financial_terminals++]"
-
-/obj/machinery/atm/initialize()
- ..()
- reconnect_database()
+ spark_system = new /datum/effect/effect/system/spark_spread
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
/obj/machinery/atm/process()
if(stat & NOPOWER)
return
- if(linked_db && ( (linked_db.stat & NOPOWER) || !linked_db.activated ) )
- linked_db = null
- authenticated_account = null
- src.visible_message("\red \icon[src] [src] buzzes rudely, \"Connection to remote database lost.\"")
- updateDialog()
-
if(ticks_left_timeout > 0)
ticks_left_timeout--
if(ticks_left_timeout <= 0)
@@ -69,14 +62,25 @@ log transactions
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
break
-/obj/machinery/atm/proc/reconnect_database()
- for(var/obj/machinery/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
- if( DB.z == src.z && !(DB.stat & NOPOWER) && DB.activated )
- linked_db = DB
- break
-
/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/card))
+ if(emagged > 0)
+ //prevent inserting id into an emagged ATM
+ user << "\red \icon[src] CARD READER ERROR. This system has been compromised!"
+ return
+ else if(istype(I,/obj/item/weapon/card/emag))
+ //short out the machine, shoot sparks, spew money!
+ emagged = 1
+ spark_system.start()
+ spawn_money(rand(100,500),src.loc)
+ //we don't want to grief people by locking their id in an emagged ATM
+ release_held_id(user)
+
+ //display a message to the user
+ var/response = pick("Initiating withdraw. Have a nice day!", "CRITICAL ERROR: Activating cash chamber panic siphon.","PIN Code accepted! Emptying account balance.", "Jackpot!")
+ user << "\red \icon[src] The [src] beeps: \"[response]\""
+ return
+
var/obj/item/weapon/card/id/idcard = I
if(!held_card)
usr.drop_item()
@@ -111,94 +115,96 @@ log transactions
/obj/machinery/atm/attack_hand(mob/user as mob)
if(istype(user, /mob/living/silicon))
- user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005."
+ user << "\red \icon[src] Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005."
return
if(get_dist(src,user) <= 1)
- //check to see if the user has low security enabled
- scan_user(user)
//js replicated from obj/machinery/computer/card
var/dat = "
NanoTrasen Automatic Teller Machine
"
dat += "For all your monetary needs!
"
dat += "This terminal is [machine_id]. Report this code when contacting NanoTrasen IT Support
"
- dat += "Card: [held_card ? held_card.name : "------"]
"
- if(ticks_left_locked_down > 0)
- dat += "Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled."
- else if(authenticated_account)
- switch(view_screen)
- if(CHANGE_SECURITY_LEVEL)
- dat += "Select a new security level for this account:
"
- var/text = "Zero - Either the account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct."
- if(authenticated_account.security_level != 0)
- text = "[text]"
- dat += "[text]
"
- text = "One - An account number and pin must be manually entered to access this account and process transactions."
- if(authenticated_account.security_level != 1)
- text = "[text]"
- dat += "[text]
"
- text = "Two - In addition to account number and pin, a card is required to access this account and process transactions."
- if(authenticated_account.security_level != 2)
- text = "[text]"
- dat += "[text]
"
- dat += "Back"
- if(VIEW_TRANSACTION_LOGS)
- dat += "Transaction logs
"
- dat += "Back"
- dat += ""
- dat += ""
- dat += "| Date | "
- dat += "Time | "
- dat += "Target | "
- dat += "Purpose | "
- dat += "Value | "
- dat += "Source terminal ID | "
- dat += "
"
- for(var/datum/transaction/T in authenticated_account.transaction_log)
- dat += ""
- dat += "| [T.date] | "
- dat += "[T.time] | "
- dat += "[T.target_name] | "
- dat += "[T.purpose] | "
- dat += "$[T.amount] | "
- dat += "[T.source_terminal] | "
- dat += "
"
- dat += "
"
- if(TRANSFER_FUNDS)
- dat += "Account balance: $[authenticated_account.money]
"
- dat += "Back
"
- dat += ""
- else
- dat += "Welcome, [authenticated_account.owner_name].
"
- dat += "Account balance: $[authenticated_account.money]"
- dat += ""
- dat += "Change account security level
"
- dat += "Make transfer
"
- dat += "View transaction log
"
- dat += "Print balance statement
"
- dat += "Logout
"
- else if(linked_db)
- dat += ""
+ if(emagged > 0)
+ dat += "Card: LOCKED
Unauthorized terminal access detected! This ATM has been locked. Please contact NanoTrasen IT Support."
else
- dat += "Unable to connect to accounts database, please retry and if the issue persists contact NanoTrasen IT support."
- reconnect_database()
+ dat += "Card: [held_card ? held_card.name : "------"]
"
+
+ if(ticks_left_locked_down > 0)
+ dat += "Maximum number of pin attempts exceeded! Access to this ATM has been temporarily disabled."
+ else if(authenticated_account)
+ if(authenticated_account.suspended)
+ dat += "\redAccess to this account has been suspended, and the funds within frozen."
+ else
+ switch(view_screen)
+ if(CHANGE_SECURITY_LEVEL)
+ dat += "Select a new security level for this account:
"
+ var/text = "Zero - Either the account number or card is required to access this account. EFTPOS transactions will require a card and ask for a pin, but not verify the pin is correct."
+ if(authenticated_account.security_level != 0)
+ text = "[text]"
+ dat += "[text]
"
+ text = "One - An account number and pin must be manually entered to access this account and process transactions."
+ if(authenticated_account.security_level != 1)
+ text = "[text]"
+ dat += "[text]
"
+ text = "Two - In addition to account number and pin, a card is required to access this account and process transactions."
+ if(authenticated_account.security_level != 2)
+ text = "[text]"
+ dat += "[text]
"
+ dat += "Back"
+ if(VIEW_TRANSACTION_LOGS)
+ dat += "Transaction logs
"
+ dat += "Back"
+ dat += ""
+ dat += ""
+ dat += "| Date | "
+ dat += "Time | "
+ dat += "Target | "
+ dat += "Purpose | "
+ dat += "Value | "
+ dat += "Source terminal ID | "
+ dat += "
"
+ for(var/datum/transaction/T in authenticated_account.transaction_log)
+ dat += ""
+ dat += "| [T.date] | "
+ dat += "[T.time] | "
+ dat += "[T.target_name] | "
+ dat += "[T.purpose] | "
+ dat += "$[T.amount] | "
+ dat += "[T.source_terminal] | "
+ dat += "
"
+ dat += "
"
+ if(TRANSFER_FUNDS)
+ dat += "Account balance: $[authenticated_account.money]
"
+ dat += "Back
"
+ dat += ""
+ else
+ dat += "Welcome, [authenticated_account.owner_name].
"
+ dat += "Account balance: $[authenticated_account.money]"
+ dat += ""
+ dat += "Change account security level
"
+ dat += "Make transfer
"
+ dat += "View transaction log
"
+ dat += "Print balance statement
"
+ dat += "Logout
"
+ else
+ dat += ""
user << browse(dat,"window=atm;size=550x650")
else
@@ -208,14 +214,14 @@ log transactions
if(href_list["choice"])
switch(href_list["choice"])
if("transfer")
- if(authenticated_account && linked_db)
+ if(authenticated_account)
var/transfer_amount = text2num(href_list["funds_amount"])
if(transfer_amount <= 0)
alert("That is not a valid amount.")
else if(transfer_amount <= authenticated_account.money)
var/target_account_number = text2num(href_list["target_acc_number"])
var/transfer_purpose = href_list["purpose"]
- if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount))
+ if(charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount))
usr << "\icon[src]Funds transfer successful."
authenticated_account.money -= transfer_amount
@@ -240,13 +246,17 @@ log transactions
var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0)
authenticated_account.security_level = new_sec_level
if("attempt_auth")
- if(linked_db && !ticks_left_locked_down)
+
+ // check if they have low security enabled
+ scan_user(usr)
+
+ if(!ticks_left_locked_down && held_card)
var/tried_account_num = text2num(href_list["account_num"])
if(!tried_account_num)
tried_account_num = held_card.associated_account_number
var/tried_pin = text2num(href_list["account_pin"])
- authenticated_account = linked_db.attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
+ authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
if(!authenticated_account)
number_incorrect_tries++
if(previous_account_number == tried_account_num)
@@ -256,7 +266,7 @@ log transactions
playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
//create an entry in the account transaction log
- var/datum/money_account/failed_account = linked_db.get_account(tried_account_num)
+ var/datum/money_account/failed_account = get_account(tried_account_num)
if(failed_account)
var/datum/transaction/T = new()
T.target_name = failed_account.owner_name
@@ -299,7 +309,7 @@ log transactions
//remove the money
authenticated_account.money -= amount
- withdraw_arbitrary_sum(amount)
+ spawn_money(amount,src.loc)
//create an entry in the account transaction log
var/datum/transaction/T = new()
@@ -337,56 +347,27 @@ log transactions
else
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
if("insert_card")
- if(held_card)
- held_card.loc = src.loc
- authenticated_account = null
-
- if(ishuman(usr) && !usr.get_active_hand())
- usr.put_in_hands(held_card)
- held_card = null
-
+ if(!held_card)
+ //this might happen if the user had the browser window open when somebody emagged it
+ if(emagged > 0)
+ usr << "\red \icon[src] The ATM card reader rejected your ID because this machine has been sabotaged!"
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if (istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.loc = src
+ held_card = I
else
- var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
- usr.drop_item()
- I.loc = src
- held_card = I
+ release_held_id(usr)
if("logout")
authenticated_account = null
//usr << browse(null,"window=atm")
src.attack_hand(usr)
-//create the most effective combination of notes to make up the requested amount
-/obj/machinery/atm/proc/withdraw_arbitrary_sum(var/arbitrary_sum)
- while(arbitrary_sum >= 1000)
- arbitrary_sum -= 1000
- new /obj/item/weapon/spacecash/c1000(src)
- while(arbitrary_sum >= 500)
- arbitrary_sum -= 500
- new /obj/item/weapon/spacecash/c500(src)
- while(arbitrary_sum >= 200)
- arbitrary_sum -= 200
- new /obj/item/weapon/spacecash/c200(src)
- while(arbitrary_sum >= 100)
- arbitrary_sum -= 100
- new /obj/item/weapon/spacecash/c100(src)
- while(arbitrary_sum >= 50)
- arbitrary_sum -= 50
- new /obj/item/weapon/spacecash/c50(src)
- while(arbitrary_sum >= 20)
- arbitrary_sum -= 20
- new /obj/item/weapon/spacecash/c20(src)
- while(arbitrary_sum >= 10)
- arbitrary_sum -= 10
- new /obj/item/weapon/spacecash/c10(src)
- while(arbitrary_sum >= 1)
- arbitrary_sum -= 1
- new /obj/item/weapon/spacecash(src)
-
//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri
/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user as mob)
- if(!authenticated_account && linked_db)
+ if(!authenticated_account)
if(human_user.wear_id)
var/obj/item/weapon/card/id/I
if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
@@ -395,7 +376,7 @@ log transactions
var/obj/item/device/pda/P = human_user.wear_id
I = P.id
if(I)
- authenticated_account = linked_db.attempt_account_access(I.associated_account_number)
+ authenticated_account = attempt_account_access(I.associated_account_number)
if(authenticated_account)
human_user << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'"
@@ -407,3 +388,17 @@ log transactions
T.date = current_date_string
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
+
+ view_screen = NO_SCREEN
+
+// put the currently held id on the ground or in the hand of the user
+/obj/machinery/atm/proc/release_held_id(mob/living/carbon/human/human_user as mob)
+ if(!held_card)
+ return
+
+ held_card.loc = src.loc
+ authenticated_account = null
+
+ if(ishuman(human_user) && !human_user.get_active_hand())
+ human_user.put_in_hands(held_card)
+ held_card = null
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 5a529b40df3..121cbd3dc94 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -254,4 +254,21 @@
/obj/item/weapon/storage/bag/sheetsnatcher/borg
name = "Sheet Snatcher 9000"
desc = ""
- capacity = 500//Borgs get more because >specialization
\ No newline at end of file
+ capacity = 500//Borgs get more because >specialization
+
+
+// -----------------------------
+// Cash Bag
+// -----------------------------
+
+/obj/item/weapon/storage/bag/cash
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "cashbag"
+ name = "Cash bag"
+ desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front."
+ storage_slots = 50; //the number of cash pieces it can carry.
+ max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class
+ max_w_class = 3
+ w_class = 1
+
+ can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash")
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 79f10fac138..f50952514db 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ