diff --git a/baystation12.dme b/baystation12.dme
index 8fe8cc3f78b..cc4ebdfc30c 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -159,6 +159,7 @@
#define FILE_DIR "code/unused/powerarmor"
#define FILE_DIR "code/unused/spacecraft"
#define FILE_DIR "code/WorkInProgress"
+#define FILE_DIR "code/WorkInProgress/animusstation"
#define FILE_DIR "code/WorkInProgress/Apples"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
@@ -1139,6 +1140,7 @@
#include "code\WorkInProgress\AI_Visibility.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm"
+#include "code\WorkInProgress\animusstation\atm.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_field.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\Rust\core_monitor.dm"
@@ -1159,7 +1161,6 @@
#include "code\WorkInProgress\Cael_Aislinn\Tajara\tajaran.dm"
#include "code\WorkInProgress\Cael_Aislinn\Tajara\whisper.dm"
#include "code\WorkInProgress\Chinsky\ashtray.dm"
-#include "code\WorkInProgress\Mini\ATM.dm"
#include "code\WorkInProgress\Mini\atmos_control.dm"
#include "code\WorkInProgress\Mini\pipe_heater.dm"
#include "code\WorkInProgress\Mloc\Shortcuts.dm"
diff --git a/code/WorkInProgress/animusstation/atm.dm b/code/WorkInProgress/animusstation/atm.dm
new file mode 100644
index 00000000000..cbb61e6e79c
--- /dev/null
+++ b/code/WorkInProgress/animusstation/atm.dm
@@ -0,0 +1,165 @@
+/*
+
+TODO:
+give money an actual use (QM stuff, vending machines)
+send money to people (might be worth attaching money to custom database thing for this, instead of being in the ID)
+log transactions
+
+*/
+
+/obj/machinery/atm
+ name = "\improper NanoTrasen Automatic Teller Machine"
+ desc = "For all your monetary needs!"
+ icon = 'terminals.dmi'
+ icon_state = "atm"
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 10
+ var
+ obj/item/weapon/card/id/card
+ obj/item/weapon/spacecash/cashes = list()
+ inserted = 0
+ accepted = 0
+ pincode = 0
+
+ attackby(var/obj/A, var/mob/user)
+ if(istype(A,/obj/item/weapon/spacecash))
+ cashes += A
+ user.drop_item()
+ A.loc = src
+ inserted += A:worth
+ return
+ if(istype(A,/obj/item/weapon/coin))
+ if(istype(A,/obj/item/weapon/coin/iron))
+ cashes += A
+ user.drop_item()
+ A.loc = src
+ inserted += 1
+ return
+ if(istype(A,/obj/item/weapon/coin/silver))
+ cashes += A
+ user.drop_item()
+ A.loc = src
+ inserted += 10
+ return
+ if(istype(A,/obj/item/weapon/coin/gold))
+ cashes += A
+ user.drop_item()
+ A.loc = src
+ inserted += 50
+ return
+ if(istype(A,/obj/item/weapon/coin/plasma))
+ cashes += A
+ user.drop_item()
+ A.loc = src
+ inserted += 2
+ return
+ if(istype(A,/obj/item/weapon/coin/diamond))
+ cashes += A
+ user.drop_item()
+ A.loc = src
+ inserted += 300
+ return
+ user << "You insert your [A.name] in ATM"
+ ..()
+
+ attack_hand(var/mob/user)
+ if(istype(user, /mob/living/silicon))
+ user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005."
+ return
+
+ if(!(stat && NOPOWER) && ishuman(user))
+ var/dat
+ user.machine = src
+ if(!accepted)
+ if(scan(user))
+ pincode = input(usr,"Enter a pin-code") as num
+ if(card.checkaccess(pincode,usr))
+ accepted = 1
+// usr << sound('nya.mp3')
+ else
+ dat = null
+ dat += "
NanoTrasen Automatic Teller Machine
"
+ dat += "For all your monetary needs!
"
+ dat += "Welcome, [card.registered_name]. You have [card.money] credits deposited.
"
+ dat += "Current inserted item value: [inserted] credits.
"
+ dat += "Please, select action
"
+ dat += "Withdraw Physical Credits
"
+ dat += "Eject Inserted Items
"
+ dat += "Convert Inserted Items to Credits
"
+ dat += "Lock ATM
"
+ user << browse(dat,"window=atm")
+ onclose(user,"close")
+ proc
+ withdraw(var/mob/user)
+ if(accepted)
+ var/amount = input("How much would you like to withdraw?", "Amount", 0) in list(1,10,20,50,100,200,500,1000, 0)
+ if(amount == 0)
+ return
+ if(card.money >= amount)
+ card.money -= amount
+ switch(amount)
+ if(1)
+ new /obj/item/weapon/spacecash(loc)
+ if(10)
+ new /obj/item/weapon/spacecash/c10(loc)
+ if(20)
+ new /obj/item/weapon/spacecash/c20(loc)
+ if(50)
+ new /obj/item/weapon/spacecash/c50(loc)
+ if(100)
+ new /obj/item/weapon/spacecash/c100(loc)
+ if(200)
+ new /obj/item/weapon/spacecash/c200(loc)
+ if(500)
+ new /obj/item/weapon/spacecash/c500(loc)
+ if(1000)
+ new /obj/item/weapon/spacecash/c1000(loc)
+ else
+ user << "\red Error: Insufficient funds."
+ return
+
+ scan(var/mob/user)
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ if(H.wear_id)
+ if(istype(H.wear_id, /obj/item/weapon/card/id))
+ card = H.wear_id
+ return 1
+ if(istype(H.wear_id,/obj/item/device/pda))
+ var/obj/item/device/pda/P = H.wear_id
+ if(istype(P.id,/obj/item/weapon/card/id))
+ card = P.id
+ return 1
+ return 0
+ return 0
+
+ insert()
+ if(accepted)
+ card.money += inserted
+ inserted = 0
+
+ Topic(href,href_list)
+ if (usr.machine==src && get_dist(src, usr) <= 1 || istype(usr, /mob/living/silicon/ai))
+ if(href_list["eca"])
+ if(accepted)
+ for(var/obj/item/weapon/spacecash/M in cashes)
+ M.loc = loc
+ inserted = 0
+ if(!cashes)
+ cashes = null
+ if(href_list["with"] && card)
+ withdraw(usr)
+ if(href_list["ins"] && card)
+ if(accepted)
+ card.money += inserted
+ inserted = 0
+ if(href_list["lock"])
+ card = null
+ accepted = 0
+ usr.machine = null
+ usr << browse(null,"window=atm")
+ src.updateUsrDialog()
+ else
+ usr.machine = null
+ usr << browse(null,"window=atm")
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 1bc78daa926..1abcbba3ab6 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -159,7 +159,7 @@
ammo = 30
/obj/item/weapon/spacecash
- name = "space cash"
+ name = "stack of credits"
desc = "It's worth 1 credit."
gender = PLURAL
icon = 'items.dmi'
@@ -175,6 +175,7 @@
var/access = list()
access = access_crate_cash
var/worth = 1
+ var/amount = 1
/obj/item/weapon/spacecash/c10
icon_state = "spacecash10"
@@ -211,6 +212,51 @@
access = access_crate_cash
desc = "It's worth 1000 credits."
worth = 1000
+/obj/item/weapon/spacecash/attack_self(var/mob/user)
+ var/dat = "Space cash stack"
+ dat += "Credit amount - [worth * amount]
"
+ dat += "Take amount
"
+ user << browse(dat,"window=money")
+
+/obj/item/weapon/spacecash/Topic(href, href_list)
+ if(href_list["takemoney"])
+ var/a = 1
+ a = input(usr,"How much you want take?") as num
+ if((a > src.amount) || (a < 0))
+ usr << "\red You don't have that many credits"
+ return
+ src.amount -= a
+ var/obj/item/weapon/spacecash/S
+ if(a <= 0)
+ return
+ switch(src.worth)
+ if(1)
+ S = new /obj/item/weapon/spacecash(get_turf(src))
+ if(10)
+ S = new /obj/item/weapon/spacecash/c10(get_turf(src))
+ if(20)
+ S = new /obj/item/weapon/spacecash/c20(get_turf(src))
+ if(50)
+ S = new /obj/item/weapon/spacecash/c50(get_turf(src))
+ if(100)
+ S = new /obj/item/weapon/spacecash/c100(get_turf(src))
+ if(200)
+ S = new /obj/item/weapon/spacecash/c200(get_turf(src))
+ if(500)
+ S = new /obj/item/weapon/spacecash/c500(get_turf(src))
+ if(1000)
+ S = new /obj/item/weapon/spacecash/c1000(get_turf(src))
+ S.amount = a
+ if(src.amount == 0)
+ del(src)
+/obj/item/weapon/spacecash/attackby(var/obj/I, var/mob/user)
+ if(!I)
+ return
+ if(istype(I,src))
+ src.amount += I:amount
+ user << "You add [I:amount] credits to stack"
+ del(I)
+
/obj/item/device/mass_spectrometer
desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
@@ -573,11 +619,12 @@
item_state = "card-id"
var/access = list()
var/registered_name = null // The name registered_name on the card
-
+ var/pin = 0
+ var/money = 0
var/assignment = null
var/over_jumpsuit = 1 // If set to 0, it won't display on top of the mob's jumpsuit
var/dorm = 0 // determines if this ID has claimed a dorm already
-
+ var/obj/item/weapon/credit_card/card
var/blood_type = "\[UNSET\]"
var/dna_hash = "\[UNSET\]"
var/fingerprint_hash = "\[UNSET\]"
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 7b9e21ab0ac..2eb8bfb6515 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -304,6 +304,11 @@ var/global/datum/controller/occupations/job_master
C.assignment = title
C.name = "[C.registered_name]'s ID Card ([C.assignment])"
C.access = get_access(rank)
+ C.pin = rand(1000,9999)
+ C.money = 10 * rand(50,200)
+ H << "\bold \red Your station account has [C.money] credits. The pin-code is [C.pin]."
+ if(H.mind)
+ H.mind.memory += "Your pin-code is - [C.pin]
"
H.equip_if_possible(C, H.slot_wear_id)
if(!H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_r_store))
H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_ears)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 5f6a3e80ebe..96e712bc5d0 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -107,6 +107,12 @@ FINGERPRINT CARD
else
..()
+/obj/item/weapon/card/id/proc/checkaccess(p,var/mob/user)
+ if(p == pin)
+ user << "\green Access granted"
+ return 1
+ user << "\red Access denied"
+ return 0
// FINGERPRINT HOLDER