Files
Paradise/code/modules/economy
Migratingcocofruit e609a7faf7 Event system refactor and changes (#29420)
* meta resolution

* emerald resolution

* delta resolution

* fartgas resolution

* box box

* stay out stay out

* metastation fixes

* faragus fix

* delta fix

* Changes to role impact on event weight

* adds disaster level to the event config

* weight changes and starts adding disaster level to the ui

* ui fixes

* adjust disaster level timing

* changes disaster timing, weights, disease outbreak role requirements and weights

* lots of weight an requirement adjustments

* Update tear.dm

* some fixes

* meta changes

* Starting over with farragus

* Starting over in faragus

* faragus changes

* Update cerestation.dmm

* Update cerestation.dmm

* Update cerestation.dmm

* Update cerestation.dmm

* Update cerestation.dmm

* resolving some faragus conflicts

* resolve faragus conflicts

* resolves delta conflicts

* resolves cyberiad conflicts

* resolves emerald conflicts

* fixes cables in faragus

* fixes meta cables

* fixes delta cables

* more meta fixes

* more farragus cable fixes

* more cable fixes

* meta and faragus fixes

* box and delta fixes

* more mapping fixes

* hopefully the last fix

* Update metastation.dmm

* Update metastation.dmm

* fixes shorts on cyberiad cerebron and farragus

* CI fixes

* move new event listing to new system

* Adds tracking and cost calculation for blob

* finishes setting up blob event detection and costs

* minor boolog corrections

* fixes events being created at the wrong severity

* adds ongoing cost to disease outbreak

* moves terror spider event to new system

* moves to component based event cost calculation

* morph abductor and carps adjusted for new system

* various fixes and adjusts rev event

* Update revenant_spawn_event.dm

* various fixes and adjusts demon incursion to the new system

* adjusts some major event weights

* correct wrong values of autoend on vendor uprising and rev

* Update event_container.dm

* more event timing adjustments

* adds requirements to traders and incursion

* slightly lowers requirements for biohazards

* timing changes

* temporarily disable loading event times from the config and increases major nothing chance

* adjustments to costs and weights of various events

* Update event_container.dm

* additional adjustments to weights and requirements. moves rev to major

* typo fix

* ion storm adjustment

* Update event_container.dm

* more moderate changes

* e

* Update meteors_event.dm

* removes cooldown from nothing event and changes its weight based on the number of remaining enabled events in the container

* increases morph event requirements and chance of nothing moderate event

* makes morph a major event

* Update morph_event.dm

* adds viro requirement for disease outbreak and fixes a bug with incorrect resource calculation

* allows varediting extra roles for the event system for debug and testing

* Adjust weights of traders and abductors and corrects wrong nominal severity for demonic incursion

* Adds crew cound to rev weight

* makes disasters start rolling later

* reduces weight of communications blackout and increases weight of major nothing

* adjusts door runtime and prisonbreak weights to make them less frequent. kudzu now scales with total crew

* apc overload made less frequent

* oopsy

* Gives the scrubber clog event a name

* fixes a type in a define name

* adjusts demonic incursion weight

* changes brand intelligence weight an d reduces door runtime weight

* more adjustments to demon incursion. Makes additional weight from surplus roles diminish

* adjustments to some minor events

* Increases event length and requirements of some engineering events and lowers their weight slightly. Also increases cost of ongoing diseases events

* fixes a type

* Update meteors_event.dm

* corrects traders nominal severity and adjusts demon weights

* shifts anomaly weights down and increases costs

* rebalance rod requirements

* Update cerestation.dmm

* moves net resource calculation to its own proc and changes the ASSIGNMENT_TOTAL macro to ASSIGNMENT_CREW.

* Adds individual first run time for some events and makes majors start rolling slightly later

* reduces weight of major nothing

* minor reduction to rev and apc overload weight

* Changes the way event weight is calculated

* end time corrections for anomaly rod and meteors

* slightly adjusts down the weights of nothing and some minor events

* Adjusts moedrates towards about 3.5 per round and mundanes towards 8 per round

* adds first run restrictions on traders and incursion and increases the cooldown time of events

* resolve faragus conflicts

* resolve emerald conflict

* fix some faragus cabling

* more cabling correction in faragus

* more cable fixes

* Update cerestation.dmm

* remove doubled scrubber pipe on tile

* reduces moderates nothing chance

* slightly reduces crew requirements for disasters and also reduces crew weight for disasters

* fixes meteor event not removing the alert, and makes it announce a bit later

* Adds an event debugging window for real time midround event data

* Revert "Adds an event debugging window for real time midround event data"

This reverts commit ecd99a6c9e.

* Adds a resource view button to the event manager window and fixes a null in the total resource list

* various bug fixes

* slightly lowers chance of meteor and similar events

* Slightly lowers requirement weights on disaster level events

* resolves faragus conflict

* changes the default power input of engineering SMES to 200kw and 80kW respectively

* connects power monitoring computers to the grid that weren't

* meta station elec maints improvements

* adds missing power monitoring computers on box and delta

* removes dirt from wall

* corrects area boundry on meta

* adds missing cable on box sci

* removes dirt from wall on box

* connects cyberiad bridge to the rest of the powernet

* connects box brig to powernet

* Adds catwalks to box maints

* adds catwalks to meta

* Adds catwalks to delta

* Update deltastation.dmm

* adds ability to insulate cables

* Moves stations to using extra insulated cables for high power network

* Removes catwalks from meta

* Removes catwalks from box

* Removes catwalks from delta

* Delays moderates and majors more and increases disaster chance

* resolves box conflicts

* Update cable.dm

* remove floating request console

* corrects position of fire alarm and removes extra intercom on metastation

* resolves faragus conflict

* reduces meteor variant weights. meaty ores event now has the correct nominal severity

* meaty ore weight to 8

* fixes a stray light bulb and light switch in maints as well as a doubled power

* Delays meteor type events to 40 minutes at the earliest. Moves the time check to be against round time instead of world time

* wires kerberos security checkpoint to the grid

* Update cerestation.dmm

* Removes stray extinguisher cabinet from meta station

* resolves area conflict on faragus

* resolves more faragus issues

* fixes faragus cabling issues

* Update cerestation.dmm

* removes another stray fire extinguisher cabinet

* insulates the APC in delta PTL room

* increases pop requirement and weight for demons and increases medbay and viro weights for diseases

* connect delta fore starboard solars to the high power grid instead of the low power

* Update deltastation.dmm

* deconflict

* solves some unconnected cables

* connects delta customs to network and finishes resolving conflicts

* Update deltastation.dmm

* adds the new cables. needs coils and mapping

* moves connection perms to the heavy duty cables. toggled with engineering permission ID. box gets new cables

* sorts cables on stations

* faragus cable connections

* cable corrections. Adds heavy duty cables to the autolathe

* CI fix

* more fixes and makes the new cables show up on t ray scanners

* box station mapping fixes

* delta mapping fixes

* meta fix

* Update deltastation.dmm

* delta and faragus fixes

* Update emeraldstation.dmm

* removes APC overloard(major) from event pool

* adds diagonal sprites to heavy duty cables. allows sillicons to toggle them and

* Makes borg versions of the heavy duty cable coil

* palete consolidation

* Improves visibility of high power cables

* converts shuttle event to new system

* makes disaster event last run calc use round time instead of world time

* fixes wrong define being used in some event requirements. further increases requirements for demons and meteors. lowers weight of major diseases

* Update slaughterevent.dm

* reduces cargo requirements for shuttle load event

* reduces base weight of major disease event and further increases medical requirements

* fixes a wrong wire under the pet store maints door in delta station

* resolve mapping conflicts

* Revert "resolve mapping conflicts"

This reverts commit 129db52501.

* Revert "Merge branch 'HighPowerMaints' into event_timing"

This reverts commit 2594ac8928, reversing
changes made to a738b5f2f2.

* fixes some wonky stuff with xeno code

* Adds a crew cost to diseases

* makes player contribution towards events variable

* changes major event weights and slightly increases demon requirements

* slightly increases major disease outbreak weight

* comment changes

* Adds safeties to protect against null events getting into container or the active list

* blob fix

* Adds a confirmation to random event toggle

* Adjust particulate event weight to fit the new moderate weights

* Adds additional security costs to changeling and vamp

* Update revenant_spawn_event.dm

* uses correct path for rev event cost proc

* changes some lists to alists

* correctly accesses the event container list and actually uses the config for the event timing

---------

Co-authored-by: FunnyMan3595 (Charlie Nolan) <funnyman3595@gmail.com>
Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
2025-11-07 16:29:47 +00:00
..
2025-06-04 11:54:24 +00:00

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