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 += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - for(var/datum/transaction/T in authenticated_account.transaction_log) - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "
DateTimeTargetPurposeValueSource terminal ID
[T.date][T.time][T.target_name][T.purpose]$[T.amount][T.source_terminal]
" - if(TRANSFER_FUNDS) - dat += "Account balance: $[authenticated_account.money]
" - dat += "Back

" - dat += "
" - dat += "" - dat += "" - dat += "Target account number:
" - dat += "Funds to transfer:
" - dat += "Transaction purpose:
" - dat += "
" - dat += "
" - else - dat += "Welcome, [authenticated_account.owner_name].
" - dat += "Account balance: $[authenticated_account.money]" - dat += "
" - dat += "" - dat += "" - dat += "
" - dat += "
" - dat += "Change account security level
" - dat += "Make transfer
" - dat += "View transaction log
" - dat += "Print balance statement
" - dat += "Logout
" - else if(linked_db) - dat += "
" - dat += "" - dat += "" - dat += "Account:
" - dat += "PIN:
" - dat += "
" - 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 += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + for(var/datum/transaction/T in authenticated_account.transaction_log) + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
DateTimeTargetPurposeValueSource terminal ID
[T.date][T.time][T.target_name][T.purpose]$[T.amount][T.source_terminal]
" + if(TRANSFER_FUNDS) + dat += "Account balance: $[authenticated_account.money]
" + dat += "Back

" + dat += "
" + dat += "" + dat += "" + dat += "Target account number:
" + dat += "Funds to transfer:
" + dat += "Transaction purpose:
" + dat += "
" + dat += "
" + else + dat += "Welcome, [authenticated_account.owner_name].
" + dat += "Account balance: $[authenticated_account.money]" + dat += "
" + dat += "" + dat += "" + dat += "
" + dat += "
" + dat += "Change account security level
" + dat += "Make transfer
" + dat += "View transaction log
" + dat += "Print balance statement
" + dat += "Logout
" + else + dat += "
" + dat += "" + dat += "" + dat += "Account:
" + dat += "PIN:
" + dat += "
" + 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