Space Station 13 - Modules - Types

Paradise Economy

Introduction

This README was last updated on October 2nd, 2022

Economy SubSystem

The Economy SubSystem performs a few important tasks that turns the gears of the economy

  • payday() - This is called every 30 minutes. the payday proc goes through every single money account and credits it the amount it has its paycheck set to. In addition, it will add/subtract credits based on what bonuses/deductions the money account has on it. In addition, SSeconomy tracks global deductions and bonuses which will be applied to EVERY paycheck and then zero'd out after the payday is over. If a money account is open on a NanoBank app, they will be alerted to the paycheck through the app.

  • process_job_tasks()- This is called every 30 seconds to check if players who have job objectives have completed the requirements of those job objectives, if so, it will add a "bonus" to the players next check and notify the player of the payroll modification. This proc handles calling procs and changing variables that will check completion on the job task and disable it from being checked in the future once payout is given.

The Space Credit Financial System

The Space Credit system is split up into two important datums: money accounts (/datum/money_account) and money account databases (datum/money_account_database). Money accounts represent individual accounts and money account databases represent a collection of money accounts.

Money Accounts

A /datum/money_acount or "money account" is where most economy data is stored. In money accounts information is contained about the owner as well as all relevant credentials and setting for the account. Money accounts are rather barebones and only contain helper functions to simplify direct interaction.

Credit Balance Accounts are primarily a store of space credits for crew /datum/money_account/proc/try_withdraw_credits - used to subtract credits from account balance with some safety checks /datum/money_account/proc/deposit_credits - used to deposit credits into the account balance /datum/money_account/proc/set_credits - used to set credit balance to a specified value

Account Security Accounts are not perfectly secure and safe, in fact, they're built to be broken into when crew members are not careful with their credentials, or an antagonist chooses to try and access another's account

/datum/money_account/proc/authenticate_login This authenticate_login() proc is used to check the provided credentials against the accounts security level, it returns fails (FALSE) or success (TRUE) if the provided values pass the threshold/security reqs for the specificed security level There are a few important accounts level

  • ACCOUNT_SECURITY_ID - Account can be accessed with only the account number
  • ACCOUNT_SECURITY_PIN - Account can be accessed only with the account number AND correct pin
  • ACCOUNT_SECURITY_RESTRICTED - Account has same pin/acc-number restrictions but can only be accessed through special machines
  • ACCOUNT_SECURITY_CC - Account requires user to be an admin, this is for CC character safety
  • ACCOUNT_SECURITY_VENDOR - Account requires forced programmatic access, players in-game cannot access this account

make_transaction_log - Creates a /datum/transaction object to be tracked on money account Transactions are just logs of money going in and out of the account so that players can see where there money comes from and how it is being spent, it provides a paper trail as well for security and legal affairs

Money Transfers Money transfers are the transfer of space credits between money accounts, while the movement of space credits out of one account into another is handled by an account database, the actual requests that have not been resolved are stored and handled on money accounts

/datum/money_account/proc/create_transfer_request Simple helper proc that handles creating a transfer request on the money account, needed to interact with LAZYLISTs /datum/money_account/proc/resolve_transfer_request another helper proc that clears the transfer request

Neither of these procs actually transfer money account and rather just deal with how the information is being stored and processed on the money account, the actual money transfer is done through the account database.

Why You Shouldn't use these Procs You shouldn't be using these procs unless you intend to change how the account database interacts with money accounts. Like mentioned previously, money accounts are only for storing data and don't actual perform the functions and power the moving parts of the economy. This is because there can be upwards of 100 money accounts in one round, in order to make this memory performative, money accounts are focused on being as efficient as possible by utilizing LAZY LISTS and facilitating good Garbage Collection practices

Instead, if you want to perform calculations, purchases, transfers, etc with multiple money accounts, ALL of that should be done through a account database or some form of financial machinery but not the money account.

Account Databases

If Money accounts are just records of data, account databases are a store of multiple money data records. A datum/money_account_database holds lists of money accounts and serves as the primary means in which interactions are carried out

most instances of any financial/economy machinery/programs should have a reference to the main station database. You'll see a lot of machinery already use a var ref to the main station db, through this, most all economy actions can be performed. (Please see each procs documentation for usage). This is how you will interact with money account, through the account database.

Referencing Money Databases A good way to make sure your machine can access the station money database var/datum/money_account_database/account_db = GLOB.station_money_database Additionally, if you need to access a different money database you can go through SSeconomy SSeconomy.money_account_databases

Using a Money DB to find an account The only way to find personal money accounts in a money DB is with the account associated account number you can use find_user_account() for this. /datum/money_account_database/proc/find_user_account(account_number, include_departments = FALSE) for this proc specifically, you can specify to include departments in the search

For the main station type account db, you can also find departments, you can either get all the departments in one list an iterate through it yourself, or just provide the name of the department /datum/money_account_database/main_station/proc/get_all_department_accounts() /datum/money_account_database/main_station/proc/get_account_by_department(department)

Moving Money In and Out of Money Accounts You can charge a money account, when doing this through the account_db, you need to provide information about the purchase so that if the charge goes through, proper transaction logs can be created /datum/money_account_database/proc/charge_account

You can add credits to a money account with the credit account proc, works similairly to charge account /datum/money_account_database/proc/credit_account

Create a money transfer request datum on specified money account, notifies the money account to start storing this data /datum/money_account_database/proc/create_transfer_request Resolves a money transfer request, deletes transfer request and charges/credits involved accounts /datum/money_account_database/proc/resolve_transfer_request

Money Account Security through the DB Check user permission to access a money account based on given parameters /datum/money_account_database/proc/try_authenticate_login Create a transaction log on a money account (and DB in some cases), basically a constructor /datum/money_account_database/proc/log_account_action

for example, in order to interact with money account A you will need to go through your account database account_db.credit_account(A, 50, "Account Credit", ...) as opposed to doing it the wrong way which doesn't create a transaction log or check to see if the DB is online A.deposit_credits(50)

As with the previousl example, you may notice that a lot of these procs exist on the money account level. Those are internal procs that exist for the account database to use. The reason for this is to ensure proper logging for players and admins, handle interactions where two money accounts are involved, and to prevent runtimes that may occur from value mismatches. Many procs such as a charge_account() and resolve_transfer_request() also ensure perfect transfer of credits, this is important (And explained in the next section)

Perfect Credit Transfer

The power of an in-game economy exists because of how much control we have over it. Every credit spent needs to go somewhere, and every credit given needs to come from somewhere. One should avoid just crediting accounts on a whim or removing money for no reason. Since we don't have current implementations of supply/demand or rolling prices (increasing or decreasing), prices of items in-game are fixed. That means that the money supply is the only thing controlling how much or little of items that the crew can buy.

Space Credits Taps (In-Flow of Space Credits into the economy)

  • SSeconomy Payday every 30 minutes
  • Job Objectives Completion
  • Cargo selling crates, plasma, seeds, and research
  • Round-start Money Account Balances
  • Slot Machine Winnings (although this really is a space credit drain in disguise)
  • Contract Completions (contractors)

Space Credit Drains/Exchanges (Out-Flow of space credits out of the economy)

  • Vending Machine Purchases
  • Cargo Supply Console Purchases
  • Physical Destruction of Space cash or credits stored in economy machinery
  • RARE: Sol Traders

Other Important Economy Machinery/Programs