From 3273ab1418e5bbc0fc6b1e5c6a73e871dafb88b5 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 25 Nov 2013 06:12:56 -0500 Subject: [PATCH] Econ and hud fixes --- baystation12.dme | 18 +- .../Cael_Aislinn/Economy/Accounts.dm | 349 ------------------ code/_onclick/hud/human.dm | 20 +- code/defines/obj/weapon.dm | 69 ---- code/game/gamemodes/gameticker.dm | 7 - code/game/jobs/job_controller.dm | 48 ++- code/game/machinery/vending.dm | 37 +- .../Mini => modules/economy}/ATM.dm | 0 code/modules/economy/Accounts.dm | 118 ++++++ code/modules/economy/Accounts_DB.dm | 169 +++++++++ .../Economy => modules/economy}/EFTPOS.dm | 128 +++---- .../economy/Events.dm} | 3 - .../economy/Events_Mundane.dm} | 0 .../economy}/Job_Departments.dm | 7 +- .../economy/TradeDestinations.dm} | 0 code/modules/economy/cash.dm | 74 ++++ .../economy/economy_misc.dm} | 77 +++- code/modules/events/money_hacker.dm | 4 +- icons/mob/screen1_Midnight.dmi | Bin 142169 -> 142516 bytes 19 files changed, 553 insertions(+), 575 deletions(-) delete mode 100644 code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm rename code/{WorkInProgress/Mini => modules/economy}/ATM.dm (100%) create mode 100644 code/modules/economy/Accounts.dm create mode 100644 code/modules/economy/Accounts_DB.dm rename code/{WorkInProgress/Cael_Aislinn/Economy => modules/economy}/EFTPOS.dm (74%) rename code/{WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm => modules/economy/Events.dm} (99%) rename code/{WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm => modules/economy/Events_Mundane.dm} (100%) rename code/{WorkInProgress/Cael_Aislinn/Economy => modules/economy}/Job_Departments.dm (90%) rename code/{WorkInProgress/Cael_Aislinn/Economy/Economy_TradeDestinations.dm => modules/economy/TradeDestinations.dm} (100%) create mode 100644 code/modules/economy/cash.dm rename code/{WorkInProgress/Cael_Aislinn/Economy/Economy.dm => modules/economy/economy_misc.dm} (60%) diff --git a/baystation12.dme b/baystation12.dme index f545de5b16e..c4051199740 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -815,6 +815,16 @@ #include "code\modules\DetectiveWork\evidence.dm" #include "code\modules\DetectiveWork\footprints_and_rag.dm" #include "code\modules\DetectiveWork\scanner.dm" +#include "code\modules\economy\Accounts.dm" +#include "code\modules\economy\Accounts_DB.dm" +#include "code\modules\economy\ATM.dm" +#include "code\modules\economy\cash.dm" +#include "code\modules\economy\economy_misc.dm" +#include "code\modules\economy\EFTPOS.dm" +#include "code\modules\economy\Events.dm" +#include "code\modules\economy\Events_Mundane.dm" +#include "code\modules\economy\Job_Departments.dm" +#include "code\modules\economy\TradeDestinations.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\carp_migration.dm" #include "code\modules\events\comms_blackout.dm" @@ -1325,13 +1335,6 @@ #include "code\WorkInProgress\explosion_particles.dm" #include "code\WorkInProgress\periodic_news.dm" #include "code\WorkInProgress\Apples\artifacts.dm" -#include "code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm" -#include "code\WorkInProgress\Cael_Aislinn\Economy\Economy.dm" -#include "code\WorkInProgress\Cael_Aislinn\Economy\Economy_Events.dm" -#include "code\WorkInProgress\Cael_Aislinn\Economy\Economy_Events_Mundane.dm" -#include "code\WorkInProgress\Cael_Aislinn\Economy\Economy_TradeDestinations.dm" -#include "code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm" -#include "code\WorkInProgress\Cael_Aislinn\Economy\Job_Departments.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\falsewall.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle.dm" #include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_animals.dm" @@ -1395,7 +1398,6 @@ #include "code\WorkInProgress\computer3\computers\power.dm" #include "code\WorkInProgress\computer3\computers\robot.dm" #include "code\WorkInProgress\kilakk\fax.dm" -#include "code\WorkInProgress\Mini\ATM.dm" #include "code\WorkInProgress\Mini\atmos_control.dm" #include "code\WorkInProgress\Ported\policetape.dm" #include "code\WorkInProgress\Sayu\belt.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm b/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm deleted file mode 100644 index a786e84872f..00000000000 --- a/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm +++ /dev/null @@ -1,349 +0,0 @@ -var/global/current_date_string -var/global/num_financial_terminals = 1 -var/global/datum/money_account/station_account -var/global/list/datum/money_account/department_accounts = list() -var/global/next_account_number = 0 -var/global/obj/machinery/account_database/centcomm_account_db -var/global/datum/money_account/vendor_account -var/global/list/all_money_accounts = list() - -/proc/create_station_account() - if(!station_account) - next_account_number = rand(111111, 999999) - - station_account = new() - station_account.owner_name = "[station_name()] Station Account" - station_account.account_number = rand(111111, 999999) - station_account.remote_access_pin = rand(1111, 111111) - station_account.money = 75000 - - //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = station_account.owner_name - T.purpose = "Account creation" - T.amount = 75000 - T.date = "2nd April, 2555" - T.time = "11:24" - T.source_terminal = "Biesel GalaxyNet Terminal #277" - - //add the account - station_account.transaction_log.Add(T) - all_money_accounts.Add(station_account) - -/proc/create_department_account(department) - next_account_number = rand(111111, 999999) - - var/datum/money_account/department_account = new() - department_account.owner_name = "[department] Account" - department_account.account_number = rand(111111, 999999) - department_account.remote_access_pin = rand(1111, 111111) - department_account.money = 5000 - - //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = department_account.owner_name - T.purpose = "Account creation" - T.amount = department_account.money - T.date = "2nd April, 2555" - T.time = "11:24" - T.source_terminal = "Biesel GalaxyNet Terminal #277" - - //add the account - department_account.transaction_log.Add(T) - all_money_accounts.Add(department_account) - - department_accounts[department] = department_account - -//the current ingame time (hh:mm) can be obtained by calling: -//worldtime2text() - -/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/account_database/source_db) - - //create a new account - var/datum/money_account/M = new() - M.owner_name = new_owner_name - M.remote_access_pin = rand(1111, 111111) - M.money = starting_funds - - //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = new_owner_name - T.purpose = "Account creation" - T.amount = starting_funds - if(!source_db) - //set a random date, time and location some time over the past few decades - T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]" - T.time = "[rand(0,24)]:[rand(11,59)]" - T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]" - - M.account_number = rand(111111, 999999) - else - T.date = current_date_string - T.time = worldtime2text() - T.source_terminal = source_db.machine_id - - M.account_number = next_account_number - next_account_number += rand(1,25) - - //create a sealed package containing the account details - var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(source_db.loc) - - var/obj/item/weapon/paper/R = new /obj/item/weapon/paper(P) - P.wrapped = R - R.name = "Account information: [M.owner_name]" - R.info = "Account details (confidential)


" - R.info += "Account holder: [M.owner_name]
" - R.info += "Account number: [M.account_number]
" - R.info += "Account pin: [M.remote_access_pin]
" - R.info += "Starting balance: $[M.money]
" - R.info += "Date and time: [worldtime2text()], [current_date_string]

" - R.info += "Creation terminal ID: [source_db.machine_id]
" - R.info += "Authorised NT officer overseeing creation: [source_db.held_card.registered_name]
" - - //stamp the paper - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cent" - if(!R.stamped) - R.stamped = new - R.stamped += /obj/item/weapon/stamp - R.overlays += stampoverlay - R.stamps += "
This paper has been stamped by the Accounts Database." - - //add the account - M.transaction_log.Add(T) - all_money_accounts.Add(M) - - return M - -/datum/money_account - var/owner_name = "" - var/account_number = 0 - var/remote_access_pin = 0 - var/money = 0 - var/list/transaction_log = list() - var/security_level = 1 //0 - auto-identify from worn ID, require only account number - //1 - require manual login / account number and pin - //2 - require card and manual login - -/datum/transaction - var/target_name = "" - var/purpose = "" - var/amount = 0 - var/date = "" - var/time = "" - var/source_terminal = "" - -/obj/machinery/account_database - name = "Accounts database" - desc = "Holds transaction logs, account data and all kinds of other financial records." - icon = 'icons/obj/virology.dmi' - icon_state = "analyser" - density = 1 - req_one_access = list(access_hop, access_captain) - var/receipt_num - var/machine_id = "" - var/obj/item/weapon/card/id/held_card - var/access_level = 0 - var/datum/money_account/detailed_account_view - var/creating_new_account = 0 - var/activated = 1 - -/obj/machinery/account_database/New() - ..() - if(!station_account) - create_station_account() - - if(department_accounts.len == 0) - for(var/department in station_departments) - create_department_account(department) - if(!vendor_account) - create_department_account("Vendor") - vendor_account = department_accounts["Vendor"] - - if(!current_date_string) - current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557" - - machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" - -/obj/machinery/account_database/attack_hand(mob/user as mob) - if(get_dist(src,user) <= 1) - var/dat = "Accounts Database
" - dat += "[machine_id]
" - dat += "Confirm identity: [held_card ? held_card : "-----"]
" - - if(access_level > 0) - dat += "[activated ? "Disable" : "Enable"] remote access
" - dat += "You may not edit accounts at this terminal, only create and view them.
" - if(creating_new_account) - dat += "
" - dat += "Return to accounts list" - dat += "
" - dat += "" - dat += "" - dat += "Holder name:
" - dat += "Initial funds: (subtracted from station account)
" - dat += "New accounts are automatically assigned a secret number and pin, which are printed separately in a sealed package.
" - dat += "
" - dat += "
" - else - if(detailed_account_view) - dat += "
" - dat += "Return to accounts list
" - dat += "Account number: #[detailed_account_view.account_number]
" - dat += "Account holder: [detailed_account_view.owner_name]
" - dat += "Account balance: $[detailed_account_view.money]
" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - for(var/datum/transaction/T in detailed_account_view.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]
" - else - dat += "Create new account

" - dat += "" - for(var/i=1, i<=all_money_accounts.len, i++) - var/datum/money_account/D = all_money_accounts[i] - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "
#[D.account_number][D.owner_name]View in detail
" - - user << browse(dat,"window=account_db;size=700x650") - else - user << browse(null,"window=account_db") - -/obj/machinery/account_database/attackby(O as obj, user as mob)//TODO:SANITY - if(istype(O, /obj/item/weapon/card)) - var/obj/item/weapon/card/id/idcard = O - if(!held_card) - usr.drop_item() - idcard.loc = src - held_card = idcard - - if(access_cent_captain in idcard.access) - access_level = 2 - else if(access_hop in idcard.access || access_captain in idcard.access) - access_level = 1 - else - ..() - -/obj/machinery/account_database/Topic(var/href, var/href_list) - - if(href_list["toggle_activated"]) - activated = !activated - - if(href_list["choice"]) - switch(href_list["choice"]) - if("create_account") - creating_new_account = 1 - if("finalise_create_account") - var/account_name = href_list["holder_name"] - var/starting_funds = max(text2num(href_list["starting_funds"]), 0) - create_account(account_name, starting_funds, src) - if(starting_funds > 0) - //subtract the money - station_account.money -= starting_funds - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = account_name - T.purpose = "New account funds initialisation" - T.amount = "([starting_funds])" - T.date = current_date_string - T.time = worldtime2text() - T.source_terminal = machine_id - station_account.transaction_log.Add(T) - - creating_new_account = 0 - if("insert_card") - if(held_card) - held_card.loc = src.loc - - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(held_card) - held_card = null - access_level = 0 - - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = I - usr.drop_item() - C.loc = src - held_card = C - - if(access_cent_captain in C.access) - access_level = 2 - else if(access_hop in C.access || access_captain in C.access) - access_level = 1 - if("view_account_detail") - var/index = text2num(href_list["account_index"]) - if(index && index <= all_money_accounts.len) - detailed_account_view = all_money_accounts[index] - if("view_accounts_list") - detailed_account_view = null - creating_new_account = 0 - - src.attack_hand(usr) - -/obj/machinery/account_database/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount) - if(!activated) - return 0 - for(var/datum/money_account/D in all_money_accounts) - if(D.account_number == attempt_account_number) - D.money += amount - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = source_name - T.purpose = purpose - if(amount < 0) - T.amount = "([amount])" - else - T.amount = "[amount]" - T.date = current_date_string - T.time = worldtime2text() - T.source_terminal = terminal_id - D.transaction_log.Add(T) - - return 1 - - return 0 - -//this returns the first account datum that matches the supplied accnum/pin combination, it returns null if the combination did not match any account -/obj/machinery/account_database/proc/attempt_account_access(var/attempt_account_number, var/attempt_pin_number, var/security_level_passed = 0) - if(!activated) - return 0 - for(var/datum/money_account/D in all_money_accounts) - if(D.account_number == attempt_account_number) - if( D.security_level <= security_level_passed && (!D.security_level || D.remote_access_pin == attempt_pin_number) ) - return D - -/obj/machinery/account_database/proc/attempt_account_access_nosec(var/attempt_account_number) - if(!activated) - return 0 - for(var/datum/money_account/D in all_money_accounts) - if(D.account_number == attempt_account_number) - return D - -/obj/machinery/account_database/proc/get_account(var/account_number) - for(var/datum/money_account/D in all_money_accounts) - if(D.account_number == account_number) - return D -/obj/machinery/account_database/process() - return 0 \ No newline at end of file diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index c9e09ebeda4..d5afad47f58 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -448,27 +448,28 @@ client.screen -= hud_used.item_action_list + hud_used.item_action_list = list() for(var/obj/item/I in src) - if(I.action_button_name) - if(hud_used.item_action_list.len < num) - var/obj/screen/item_action/N = new(hud_used) - hud_used.item_action_list += N - - var/obj/screen/item_action/A = hud_used.item_action_list[num] + if(I.icon_action_button) + var/obj/screen/item_action/A = new(hud_used) + //A.icon = 'icons/mob/screen1_action.dmi' + //A.icon_state = I.icon_action_button A.icon = ui_style2icon(client.prefs.UI_style) A.icon_state = "template" - A.overlays = list() var/image/img = image(I.icon, A, I.icon_state) img.pixel_x = 0 img.pixel_y = 0 A.overlays += img - A.name = I.action_button_name + if(I.action_button_name) + A.name = I.action_button_name + else + A.name = "Use [I.name]" A.owner = I - client.screen += hud_used.item_action_list[num] + hud_used.item_action_list += A switch(num) if(1) @@ -483,3 +484,4 @@ A.screen_loc = ui_action_slot5 break //5 slots available, so no more can be added. num++ + src.client.screen += src.hud_used.item_action_list \ No newline at end of file diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 04ac6729587..55e5012d06c 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -25,75 +25,6 @@ flags = TABLEPASS w_class = 3.0 - -/obj/item/weapon/spacecash - name = "1 credit chip" - desc = "It's worth 1 credit." - gender = PLURAL - icon = 'icons/obj/items.dmi' - icon_state = "spacecash" - opacity = 0 - density = 0 - anchored = 0.0 - force = 1.0 - throwforce = 1.0 - throw_speed = 1 - throw_range = 2 - w_class = 1.0 - var/access = list() - access = access_crate_cash - var/worth = 1 - -/obj/item/weapon/spacecash/c10 - name = "10 credit chip" - icon_state = "spacecash10" - access = access_crate_cash - desc = "It's worth 10 credits." - worth = 10 - -/obj/item/weapon/spacecash/c20 - name = "20 credit chip" - icon_state = "spacecash20" - access = access_crate_cash - desc = "It's worth 20 credits." - worth = 20 - -/obj/item/weapon/spacecash/c50 - name = "50 credit chip" - icon_state = "spacecash50" - access = access_crate_cash - desc = "It's worth 50 credits." - worth = 50 - -/obj/item/weapon/spacecash/c100 - name = "100 credit chip" - icon_state = "spacecash100" - access = access_crate_cash - desc = "It's worth 100 credits." - worth = 100 - -/obj/item/weapon/spacecash/c200 - name = "200 credit chip" - icon_state = "spacecash200" - access = access_crate_cash - desc = "It's worth 200 credits." - worth = 200 - -/obj/item/weapon/spacecash/c500 - name = "500 credit chip" - icon_state = "spacecash500" - access = access_crate_cash - desc = "It's worth 500 credits." - worth = 500 - -/obj/item/weapon/spacecash/c1000 - name = "1000 credit chip" - icon_state = "spacecash1000" - access = access_crate_cash - desc = "It's worth 1000 credits." - worth = 1000 - - /obj/item/weapon/bananapeel name = "banana peel" desc = "A peel from a banana." diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 49e7e36c438..0fc89e14dec 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -118,13 +118,6 @@ var/global/datum/controller/gameticker/ticker else src.mode.announce() - //setup the money accounts - if(!centcomm_account_db) - for(var/obj/machinery/account_database/check_db in machines) - if(check_db.z == 2) - centcomm_account_db = check_db - break - create_characters() //Create player characters and transfer them collect_minds() equip_characters() diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index bfb3bf5909f..540d1987938 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -381,37 +381,35 @@ var/global/datum/controller/occupations/job_master if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf)) H.loc = S.loc - //give them an account in the station database - if(centcomm_account_db) - var/balance = round(rand(1,5))*100 // Between $100 and $500 - var/datum/money_account/M = create_account(H.real_name, balance , null) - if(H.mind) - var/remembered_info = "" - remembered_info += "Your account number is: #[M.account_number]
" - remembered_info += "Your account pin is: [M.remote_access_pin]
" - remembered_info += "Your account funds are: $[M.money]
" + var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null) + if(H.mind) + var/remembered_info = "" - if(M.transaction_log.len) - var/datum/transaction/T = M.transaction_log[1] - remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
" - H.mind.store_memory(remembered_info) + remembered_info += "Your account number is: #[M.account_number]
" + remembered_info += "Your account pin is: [M.remote_access_pin]
" + remembered_info += "Your account funds are: $[M.money]
" - H.mind.initial_account = M + if(M.transaction_log.len) + var/datum/transaction/T = M.transaction_log[1] + remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
" + H.mind.store_memory(remembered_info) - // If they're head, give them the account info for their department - if(H.mind && job.head_position) - var/remembered_info = "" - var/datum/money_account/department_account = department_accounts[job.department] + H.mind.initial_account = M - if(department_account) - remembered_info += "Your department's account number is: #[department_account.account_number]
" - remembered_info += "Your department's account pin is: [department_account.remote_access_pin]
" - remembered_info += "Your department's account funds are: $[department_account.money]
" + // If they're head, give them the account info for their department + if(H.mind && job.head_position) + var/remembered_info = "" + var/datum/money_account/department_account = department_accounts[job.department] - H.mind.store_memory(remembered_info) + if(department_account) + remembered_info += "Your department's account number is: #[department_account.account_number]
" + remembered_info += "Your department's account pin is: [department_account.remote_access_pin]
" + remembered_info += "Your department's account funds are: $[department_account.money]
" - spawn(0) - H << "\blueYour account number is: [M.account_number], your account pin is: [M.remote_access_pin]" + H.mind.store_memory(remembered_info) + + spawn(0) + H << "\blueYour account number is: [M.account_number], your account pin is: [M.remote_access_pin]" var/alt_title = null if(H.mind) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f28f1832545..09e7ceff8d4 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -53,8 +53,7 @@ var/datum/wires/vending/wires = null var/scan_id = 1 - var/obj/machinery/account_database/linked_db - var/datum/money_account/linked_account + /obj/machinery/vending/New() ..() @@ -73,18 +72,13 @@ src.build_inventory(premium, 0, 1) power_change() - reconnect_database() - linked_account = vendor_account + return return -/obj/machinery/vending/proc/reconnect_database() - for(var/obj/machinery/account_database/DB in world) - if(DB.z == 1) //Hardcoded to the main station for now. - linked_db = DB - break + /obj/machinery/vending/ex_act(severity) switch(severity) @@ -167,17 +161,8 @@ del(W) else if(istype(W, /obj/item/weapon/card) && currently_vending) - //attempt to connect to a new db, and if that doesn't work then fail - if(!linked_db) - reconnect_database() - if(linked_db) - if(linked_account) - var/obj/item/weapon/card/I = W - scan_card(I) - else - usr << "\icon[src]Unable to connect to linked account." - else - usr << "\icon[src]Unable to connect to accounts database." + var/obj/item/weapon/card/I = W + scan_card(I) @@ -189,19 +174,19 @@ if (istype(I, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/C = I visible_message("[usr] swipes a card through [src].") - if(linked_account) - var/datum/money_account/D = linked_db.attempt_account_access_nosec(C.associated_account_number) + if(vendor_account) + var/datum/money_account/D = attempt_account_access_nosec(C.associated_account_number) if(D) var/transaction_amount = currently_vending.price if(transaction_amount <= D.money) //transfer the money D.money -= transaction_amount - linked_account.money += transaction_amount + vendor_account.money += transaction_amount //create entries in the two account transaction logs var/datum/transaction/T = new() - T.target_name = "[linked_account.owner_name] (via [src.name])" + T.target_name = "[vendor_account.owner_name] (via [src.name])" T.purpose = "Purchase of [currently_vending.product_name]" if(transaction_amount > 0) T.amount = "([transaction_amount])" @@ -219,7 +204,7 @@ T.source_terminal = src.name T.date = current_date_string T.time = worldtime2text() - linked_account.transaction_log.Add(T) + vendor_account.transaction_log.Add(T) // Vend the item src.vend(src.currently_vending, usr) @@ -229,7 +214,7 @@ else usr << "\icon[src]Unable to access account. Check security settings and try again." else - usr << "\icon[src]EFTPOS is not connected to an account." + usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." /obj/machinery/vending/attack_paw(mob/user as mob) return attack_hand(user) diff --git a/code/WorkInProgress/Mini/ATM.dm b/code/modules/economy/ATM.dm similarity index 100% rename from code/WorkInProgress/Mini/ATM.dm rename to code/modules/economy/ATM.dm diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm new file mode 100644 index 00000000000..0bc5c18431d --- /dev/null +++ b/code/modules/economy/Accounts.dm @@ -0,0 +1,118 @@ + +/datum/money_account + var/owner_name = "" + var/account_number = 0 + var/remote_access_pin = 0 + var/money = 0 + var/list/transaction_log = list() + var/suspended = 0 + var/security_level = 0 //0 - auto-identify from worn ID, require only account number + //1 - require manual login / account number and pin + //2 - require card and manual login + +/datum/transaction + var/target_name = "" + var/purpose = "" + var/amount = 0 + var/date = "" + var/time = "" + var/source_terminal = "" + +/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/account_database/source_db) + + //create a new account + var/datum/money_account/M = new() + M.owner_name = new_owner_name + M.remote_access_pin = rand(1111, 111111) + M.money = starting_funds + + //create an entry in the account transaction log for when it was created + var/datum/transaction/T = new() + T.target_name = new_owner_name + T.purpose = "Account creation" + T.amount = starting_funds + if(!source_db) + //set a random date, time and location some time over the past few decades + T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]" + T.time = "[rand(0,24)]:[rand(11,59)]" + T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]" + + M.account_number = rand(111111, 999999) + else + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = source_db.machine_id + + M.account_number = next_account_number + next_account_number += rand(1,25) + + //create a sealed package containing the account details + var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(source_db.loc) + + var/obj/item/weapon/paper/R = new /obj/item/weapon/paper(P) + P.wrapped = R + R.name = "Account information: [M.owner_name]" + R.info = "Account details (confidential)


" + R.info += "Account holder: [M.owner_name]
" + R.info += "Account number: [M.account_number]
" + R.info += "Account pin: [M.remote_access_pin]
" + R.info += "Starting balance: $[M.money]
" + R.info += "Date and time: [worldtime2text()], [current_date_string]

" + R.info += "Creation terminal ID: [source_db.machine_id]
" + R.info += "Authorised NT officer overseeing creation: [source_db.held_card.registered_name]
" + + //stamp the paper + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-cent" + if(!R.stamped) + R.stamped = new + R.stamped += /obj/item/weapon/stamp + R.overlays += stampoverlay + R.stamps += "
This paper has been stamped by the Accounts Database." + + //add the account + M.transaction_log.Add(T) + all_money_accounts.Add(M) + + return M + +/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount) + for(var/datum/money_account/D in all_money_accounts) + if(D.account_number == attempt_account_number && !D.suspended) + D.money += amount + + //create a transaction log entry + var/datum/transaction/T = new() + T.target_name = source_name + T.purpose = purpose + if(amount < 0) + T.amount = "([amount])" + else + T.amount = "[amount]" + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = terminal_id + D.transaction_log.Add(T) + + return 1 + break + + return 0 + +//this returns the first account datum that matches the supplied accnum/pin combination, it returns null if the combination did not match any account +/proc/attempt_account_access(var/attempt_account_number, var/attempt_pin_number, var/security_level_passed = 0) + for(var/datum/money_account/D in all_money_accounts) + if(D.account_number == attempt_account_number) + if( D.security_level <= security_level_passed && (!D.security_level || D.remote_access_pin == attempt_pin_number) ) + return D + break + +/proc/get_account(var/account_number) + for(var/datum/money_account/D in all_money_accounts) + if(D.account_number == account_number) + return D + +/proc/attempt_account_access_nosec(var/attempt_account_number) + for(var/datum/money_account/D in all_money_accounts) + if(D.account_number == attempt_account_number) + return D diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm new file mode 100644 index 00000000000..70bf8ee125f --- /dev/null +++ b/code/modules/economy/Accounts_DB.dm @@ -0,0 +1,169 @@ + +/obj/machinery/account_database + name = "Accounts uplink console" + desc = "Access transaction logs, account data and all kinds of other financial records." + icon = 'icons/obj/computer.dmi' + icon_state = "aiupload" + density = 1 + req_one_access = list(access_hop, access_captain, access_cent_captain) + var/receipt_num + var/machine_id = "" + var/obj/item/weapon/card/id/held_card + var/access_level = 0 + var/datum/money_account/detailed_account_view + var/creating_new_account = 0 + +/obj/machinery/account_database/New() + ..() + machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" + +/obj/machinery/account_database/attack_hand(mob/user as mob) + if(get_dist(src,user) <= 1) + var/dat = "Accounts Database
" + dat += "[machine_id]
" + dat += "Confirm identity: [held_card ? held_card : "-----"]
" + + if(access_level > 0) + dat += "You may not edit accounts at this terminal, only create and view them.
" + if(creating_new_account) + dat += "
" + dat += "Return to accounts list" + dat += "
" + dat += "" + dat += "" + dat += "Holder name:
" + dat += "Initial funds: (subtracted from station account)
" + dat += "New accounts are automatically assigned a secret number and pin, which are printed separately in a sealed package.
" + dat += "
" + dat += "
" + else + if(detailed_account_view) + dat += "
" + dat += "Return to accounts list
" + dat += "Account number: #[detailed_account_view.account_number]
" + dat += "Account holder: [detailed_account_view.owner_name]
" + dat += "Account balance: $[detailed_account_view.money]
" + if(access_level > 1) + dat += "Silently add funds (no transaction log)
" + dat += "Silently remove funds (no transaction log)
" + dat += "[detailed_account_view.suspended ? "Unsuspend account" : "Suspend account"]
" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + for(var/datum/transaction/T in detailed_account_view.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]
" + else + dat += "Create new account

" + dat += "" + for(var/i=1, i<=all_money_accounts.len, i++) + var/datum/money_account/D = all_money_accounts[i] + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
#[D.account_number][D.owner_name][D.suspended ? "SUSPENDED" : ""]View in detail
" + + user << browse(dat,"window=account_db;size=700x650") + else + user << browse(null,"window=account_db") + +/obj/machinery/account_database/attackby(O as obj, user as mob)//TODO:SANITY + if(istype(O, /obj/item/weapon/card)) + var/obj/item/weapon/card/id/idcard = O + if(!held_card) + usr.drop_item() + idcard.loc = src + held_card = idcard + + if(access_cent_captain in idcard.access) + access_level = 2 + else if(access_hop in idcard.access || access_captain in idcard.access) + access_level = 1 + else + ..() + +/obj/machinery/account_database/Topic(var/href, var/href_list) + + if(href_list["choice"]) + switch(href_list["choice"]) + if("create_account") + creating_new_account = 1 + if("add_funds") + var/amount = input("Enter the amount you wish to add", "Silently add funds") as num + if(detailed_account_view) + detailed_account_view.money += amount + if("remove_funds") + var/amount = input("Enter the amount you wish to remove", "Silently remove funds") as num + if(detailed_account_view) + detailed_account_view.money -= amount + if("toggle_suspension") + if(detailed_account_view) + if(detailed_account_view.suspended) + detailed_account_view.suspended = 0 + else + detailed_account_view.suspended = 1 + if("finalise_create_account") + var/account_name = href_list["holder_name"] + var/starting_funds = max(text2num(href_list["starting_funds"]), 0) + create_account(account_name, starting_funds, src) + if(starting_funds > 0) + //subtract the money + station_account.money -= starting_funds + + //create a transaction log entry + var/datum/transaction/T = new() + T.target_name = account_name + T.purpose = "New account funds initialisation" + T.amount = "([starting_funds])" + T.date = current_date_string + T.time = worldtime2text() + T.source_terminal = machine_id + station_account.transaction_log.Add(T) + + creating_new_account = 0 + if("insert_card") + if(held_card) + held_card.loc = src.loc + + if(ishuman(usr) && !usr.get_active_hand()) + usr.put_in_hands(held_card) + held_card = null + access_level = 0 + + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/C = I + usr.drop_item() + C.loc = src + held_card = C + + if(access_cent_captain in C.access) + access_level = 2 + else if(access_hop in C.access || access_captain in C.access) + access_level = 1 + if("view_account_detail") + var/index = text2num(href_list["account_index"]) + if(index && index <= all_money_accounts.len) + detailed_account_view = all_money_accounts[index] + if("view_accounts_list") + detailed_account_view = null + creating_new_account = 0 + + src.attack_hand(usr) diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm similarity index 74% rename from code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm rename to code/modules/economy/EFTPOS.dm index 27d8533c59d..12f941bd1cf 100644 --- a/code/WorkInProgress/Cael_Aislinn/Economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -10,14 +10,12 @@ var/transaction_amount = 0 var/transaction_purpose = "Default charge" var/access_code = 0 - var/obj/machinery/account_database/linked_db var/datum/money_account/linked_account /obj/item/device/eftpos/New() ..() machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]" access_code = rand(1111,111111) - reconnect_database() spawn(0) print_reference() @@ -69,16 +67,6 @@ D.wrapped = R D.name = "small parcel - 'EFTPOS access code'" -/obj/item/device/eftpos/proc/reconnect_database() - var/turf/location = get_turf(src) - if(!location) - return - - for(var/obj/machinery/account_database/DB in machines) //Hotfix until someone finds out why it isn't in 'machines' - if(DB.z == location.z) - linked_db = DB - break - /obj/item/device/eftpos/attack_self(mob/user as mob) if(get_dist(src,user) <= 1) var/dat = "[eftpos_name]
" @@ -109,17 +97,11 @@ /obj/item/device/eftpos/attackby(O as obj, user as mob) if(istype(O, /obj/item/weapon/card)) - //attempt to connect to a new db, and if that doesn't work then fail - if(!linked_db) - reconnect_database() - if(linked_db) - if(linked_account) - var/obj/item/weapon/card/I = O - scan_card(I) - else - usr << "\icon[src]Unable to connect to linked account." + if(linked_account) + var/obj/item/weapon/card/I = O + scan_card(I) else - usr << "\icon[src]Unable to connect to accounts database." + usr << "\icon[src]Unable to connect to linked account." else ..() @@ -145,14 +127,12 @@ else usr << "\icon[src]Incorrect code entered." if("link_account") - if(!linked_db) - reconnect_database() - if(linked_db) - var/attempt_account_num = input("Enter account number to pay EFTPOS charges into", "New account number") as num - var/attempt_pin = input("Enter pin code", "Account pin") as num - linked_account = linked_db.attempt_account_access(attempt_account_num, attempt_pin, 1) - else - usr << "\icon[src]Unable to connect to accounts database." + var/attempt_account_num = input("Enter account number to pay EFTPOS charges into", "New account number") as num + var/attempt_pin = input("Enter pin code", "Account pin") as num + linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1) + if(linked_account.suspended) + linked_account = null + usr << "\icon[src]Account has been suspended." if("trans_purpose") transaction_purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") if("trans_value") @@ -172,10 +152,7 @@ else usr << "\icon[src] No account connected to send transactions to." if("scan_card") - //attempt to connect to a new db, and if that doesn't work then fail - if(!linked_db) - reconnect_database() - if(linked_db && linked_account) + if(linked_account) var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card)) scan_card(I) @@ -201,46 +178,63 @@ visible_message("[usr] swipes a card through [src].") if(transaction_locked && !transaction_paid) if(linked_account) - var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num - var/datum/money_account/D = linked_db.attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - if(transaction_amount <= D.money) - playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] The [src] chimes.") - transaction_paid = 1 + if(!linked_account.suspended) + var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num + var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) + if(D) + if(!D.suspended) + if(transaction_amount <= D.money) + playsound(src, 'sound/machines/chime.ogg', 50, 1) + src.visible_message("\icon[src] The [src] chimes.") + transaction_paid = 1 - //transfer the money - D.money -= transaction_amount - linked_account.money += transaction_amount + //transfer the money + D.money -= transaction_amount + linked_account.money += transaction_amount - //create entries in the two account transaction logs - var/datum/transaction/T = new() - T.target_name = "[linked_account.owner_name] (via [eftpos_name])" - T.purpose = transaction_purpose - if(transaction_amount > 0) - T.amount = "([transaction_amount])" + //create entries in the two account transaction logs + var/datum/transaction/T = new() + T.target_name = "[linked_account.owner_name] (via [eftpos_name])" + T.purpose = transaction_purpose + if(transaction_amount > 0) + T.amount = "([transaction_amount])" + else + T.amount = "[transaction_amount]" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + D.transaction_log.Add(T) + // + T = new() + T.target_name = D.owner_name + T.purpose = transaction_purpose + T.amount = "[transaction_amount]" + T.source_terminal = machine_id + T.date = current_date_string + T.time = worldtime2text() + linked_account.transaction_log.Add(T) + else + usr << "\icon[src]You don't have that much money!" else - T.amount = "[transaction_amount]" - T.source_terminal = machine_id - T.date = current_date_string - T.time = worldtime2text() - D.transaction_log.Add(T) - // - T = new() - T.target_name = D.owner_name - T.purpose = transaction_purpose - T.amount = "[transaction_amount]" - T.source_terminal = machine_id - T.date = current_date_string - T.time = worldtime2text() - linked_account.transaction_log.Add(T) + usr << "\icon[src]Your account has been suspended." else - usr << "\icon[src]You don't have that much money!" + usr << "\icon[src]Unable to access account. Check security settings and try again." else - usr << "\icon[src]Unable to access account. Check security settings and try again." + usr << "\icon[src]Connected account has been suspended." else usr << "\icon[src]EFTPOS is not connected to an account." + else if (istype(I, /obj/item/weapon/card/emag)) + if(transaction_locked) + if(transaction_paid) + usr << "\icon[src]You stealthily swipe [I] through [src]." + transaction_locked = 0 + transaction_paid = 0 + else + visible_message("[usr] swipes a card through [src].") + playsound(src, 'sound/machines/chime.ogg', 50, 1) + src.visible_message("\icon[src] The [src] chimes.") + transaction_paid = 1 else ..() - //emag? \ No newline at end of file + //emag? diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm b/code/modules/economy/Events.dm similarity index 99% rename from code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm rename to code/modules/economy/Events.dm index 2aa5cc42d1e..bd5e3c0a1e6 100644 --- a/code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm +++ b/code/modules/economy/Events.dm @@ -8,9 +8,6 @@ var/datum/trade_destination/affected_dest /datum/event/economic_event/start() - if(!setup_economy) - setup_economy() - affected_dest = pickweight(weighted_randomevent_locations) if(affected_dest.viable_random_events.len) endWhen = rand(60,300) diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm b/code/modules/economy/Events_Mundane.dm similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm rename to code/modules/economy/Events_Mundane.dm diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Job_Departments.dm b/code/modules/economy/Job_Departments.dm similarity index 90% rename from code/WorkInProgress/Cael_Aislinn/Economy/Job_Departments.dm rename to code/modules/economy/Job_Departments.dm index 7eacc8c727a..64abe66acc1 100644 --- a/code/WorkInProgress/Cael_Aislinn/Economy/Job_Departments.dm +++ b/code/modules/economy/Job_Departments.dm @@ -1,4 +1,4 @@ -var/list/station_departments = list("Command", "Medical", "Engineering", "Science", "Security", "Cargo", "Civilian", "Trade") +var/list/station_departments = list("Command", "Medical", "Engineering", "Science", "Security", "Cargo", "Civilian") // The department the job belongs to. /datum/job/var/department = null @@ -67,7 +67,4 @@ var/list/station_departments = list("Command", "Medical", "Engineering", "Scienc /datum/job/detective/department = "Security" -/datum/job/officer/department = "Security" - -/datum/job/trader/department = "Trade" -/datum/job/trader/head_position = 1 \ No newline at end of file +/datum/job/officer/department = "Security" \ No newline at end of file diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Economy_TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm similarity index 100% rename from code/WorkInProgress/Cael_Aislinn/Economy/Economy_TradeDestinations.dm rename to code/modules/economy/TradeDestinations.dm diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm new file mode 100644 index 00000000000..c352caa88d4 --- /dev/null +++ b/code/modules/economy/cash.dm @@ -0,0 +1,74 @@ +/obj/item/weapon/spacecash + name = "0 credit chip" + desc = "It's worth 0 credits." + gender = PLURAL + icon = 'icons/obj/items.dmi' + icon_state = "spacecash" + opacity = 0 + density = 0 + anchored = 0.0 + force = 1.0 + throwforce = 1.0 + throw_speed = 1 + throw_range = 2 + w_class = 1.0 + var/access = list() + access = access_crate_cash + var/worth = 0 + +/obj/item/weapon/spacecash/c1 + name = "1 credip chip" + icon_state = "spacecash" + desc = "It's worth 1 credit." + worth = 1 + +/obj/item/weapon/spacecash/c10 + name = "10 credit chip" + icon_state = "spacecash10" + desc = "It's worth 10 credits." + worth = 10 + +/obj/item/weapon/spacecash/c20 + name = "20 credit chip" + icon_state = "spacecash20" + desc = "It's worth 20 credits." + worth = 20 + +/obj/item/weapon/spacecash/c50 + name = "50 credit chip" + icon_state = "spacecash50" + desc = "It's worth 50 credits." + worth = 50 + +/obj/item/weapon/spacecash/c100 + name = "100 credit chip" + icon_state = "spacecash100" + desc = "It's worth 100 credits." + worth = 100 + +/obj/item/weapon/spacecash/c200 + name = "200 credit chip" + icon_state = "spacecash200" + desc = "It's worth 200 credits." + worth = 200 + +/obj/item/weapon/spacecash/c500 + name = "500 credit chip" + icon_state = "spacecash500" + desc = "It's worth 500 credits." + worth = 500 + +/obj/item/weapon/spacecash/c1000 + name = "1000 credit chip" + icon_state = "spacecash1000" + desc = "It's worth 1000 credits." + worth = 1000 + +proc/spawn_money(var/sum, spawnloc) + var/cash_type + for(var/i in list(1000,500,200,100,50,20,10,1)) + cash_type = text2path("/obj/item/weapon/spacecash/c[i]") + while(sum >= i) + sum -= i + new cash_type(spawnloc) + return \ No newline at end of file diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Economy.dm b/code/modules/economy/economy_misc.dm similarity index 60% rename from code/WorkInProgress/Cael_Aislinn/Economy/Economy.dm rename to code/modules/economy/economy_misc.dm index 84000d1b46f..ffe8a114717 100644 --- a/code/WorkInProgress/Cael_Aislinn/Economy/Economy.dm +++ b/code/modules/economy/economy_misc.dm @@ -44,7 +44,7 @@ #define ROBOTICS 13 #define BIOMEDICAL 14 -#define EVA 15 +#define GEAR_EVA 15 //---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel: //Corporation NanoTrasen - Generalised / high tech research and plasma exploitation. @@ -63,10 +63,20 @@ //Destroyers are medium sized vessels, often used for escorting larger ships but able to go toe-to-toe with them if need be. //Frigates are medium sized vessels, often used for escorting larger ships. They will rapidly find themselves outclassed if forced to face heavy warships head on. -var/setup_economy = 0 +var/global/current_date_string + +var/global/datum/money_account/vendor_account +var/global/datum/money_account/station_account +var/global/list/datum/money_account/department_accounts = list() +var/global/num_financial_terminals = 1 +var/global/next_account_number = 0 +var/global/list/all_money_accounts = list() +var/global/economy_init = 0 + /proc/setup_economy() - if(setup_economy) - return + if(economy_init) + return 2 + var/datum/feed_channel/newChannel = new /datum/feed_channel newChannel.channel_name = "Tau Ceti Daily" newChannel.author = "CentComm Minister of Information" @@ -86,4 +96,61 @@ var/setup_economy = 0 weighted_randomevent_locations[D] = D.viable_random_events.len weighted_mundaneevent_locations[D] = D.viable_mundane_events.len - setup_economy = 1 \ No newline at end of file + create_station_account() + + for(var/department in station_departments) + create_department_account(department) + create_department_account("Vendor") + vendor_account = department_accounts["Vendor"] + + current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557" + + economy_init = 1 + return 1 + +/proc/create_station_account() + if(!station_account) + next_account_number = rand(111111, 999999) + + station_account = new() + station_account.owner_name = "[station_name()] Station Account" + station_account.account_number = rand(111111, 999999) + station_account.remote_access_pin = rand(1111, 111111) + station_account.money = 75000 + + //create an entry in the account transaction log for when it was created + var/datum/transaction/T = new() + T.target_name = station_account.owner_name + T.purpose = "Account creation" + T.amount = 75000 + T.date = "2nd April, 2555" + T.time = "11:24" + T.source_terminal = "Biesel GalaxyNet Terminal #277" + + //add the account + station_account.transaction_log.Add(T) + all_money_accounts.Add(station_account) + +/proc/create_department_account(department) + next_account_number = rand(111111, 999999) + + var/datum/money_account/department_account = new() + department_account.owner_name = "[department] Account" + department_account.account_number = rand(111111, 999999) + department_account.remote_access_pin = rand(1111, 111111) + department_account.money = 5000 + + //create an entry in the account transaction log for when it was created + var/datum/transaction/T = new() + T.target_name = department_account.owner_name + T.purpose = "Account creation" + T.amount = department_account.money + T.date = "2nd April, 2555" + T.time = "11:24" + T.source_terminal = "Biesel GalaxyNet Terminal #277" + + //add the account + department_account.transaction_log.Add(T) + all_money_accounts.Add(department_account) + + department_accounts[department] = department_account diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 5171f22fe8f..754ec0c6579 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -10,7 +10,7 @@ /datum/event/money_hacker/setup() if(all_money_accounts.len) for(var/obj/machinery/account_database/DB in world) - if( DB.z == 1 && !(DB.stat&NOPOWER) && DB.activated ) + if( DB.z == 1 && !(DB.stat&NOPOWER)) affected_db = DB break if(affected_db) @@ -60,7 +60,7 @@ /datum/event/money_hacker/tick() if(world.time > time_start + time_duration) var/message - if(affected_account && affected_db && affected_db.activated && !(affected_db.stat & (NOPOWER|BROKEN)) ) + if(affected_account && affected_db && !(affected_db.stat & (NOPOWER|BROKEN)) ) //hacker wins message = "The hack attempt has succeeded." diff --git a/icons/mob/screen1_Midnight.dmi b/icons/mob/screen1_Midnight.dmi index 187ee61637087e034f88c3e2dc3e8844515763aa..65b9f2353370f1363a540df73a5e41e165a701fc 100644 GIT binary patch delta 22613 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�KRv$+YP3v(;44R(?I{am>}H*Nj>_MXv~wu&cX!W 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 IM6N<$f~Slg-2eap