79 lines
1.9 KiB
GDScript
79 lines
1.9 KiB
GDScript
# Economy is a game entity that tracks money.
|
|
|
|
# How money is minted, how money changes hands, and which
|
|
# money is valid is all controlled by Economy. When an
|
|
# in-game item is purchased, the money does not disappear
|
|
# but rather goes to the Market, an economic entity which
|
|
# can give back to players through investments or other means.
|
|
|
|
# Economy also tracks GDP, which is the total amount of
|
|
# money that has changed hands so far during the game.
|
|
class_name Economy extends Node
|
|
|
|
# Participant in the game economy
|
|
@abstract class Participant:
|
|
var participant_name = "Unnamed participant"
|
|
var _tokens = PackedInt32Array()
|
|
|
|
func balance():
|
|
return _tokens.size()
|
|
|
|
func hold_tokens(tokens):
|
|
_tokens.append_array(tokens)
|
|
on_balance_update(balance())
|
|
|
|
func pop_tokens(amount):
|
|
if balance() < amount:
|
|
return []
|
|
|
|
var dropped = []
|
|
for i in range(amount):
|
|
dropped.append(_tokens[_tokens.size() - 1])
|
|
_tokens.remove_at(_tokens.size() - 1)
|
|
on_balance_update(balance())
|
|
return dropped
|
|
|
|
@abstract func message(string)
|
|
@abstract func on_balance_update(bal)
|
|
|
|
class Market extends Participant:
|
|
func _init():
|
|
participant_name = "Market"
|
|
func message(_s):
|
|
pass
|
|
func on_balance_update(_bal):
|
|
pass
|
|
|
|
const max_money_supply = 1_000_000
|
|
|
|
var _gdp = 0
|
|
var _market = Market.new()
|
|
var _participants = []
|
|
var _token_ptr = 0
|
|
|
|
# register a Participant to receive benefits
|
|
func register(p: Participant):
|
|
_participants.append(p)
|
|
|
|
func transfer(amount, sender: Participant, recipient: Participant):
|
|
if sender.balance() < amount:
|
|
return false
|
|
recipient.hold_tokens(sender.pop_tokens(amount))
|
|
_gdp += amount
|
|
|
|
func mint(amount):
|
|
var tokens = PackedInt32Array()
|
|
if _token_ptr + amount > max_money_supply:
|
|
return false
|
|
for i in range(amount):
|
|
tokens.append(_token_ptr)
|
|
_token_ptr += 1
|
|
_market.hold_tokens(tokens)
|
|
return true
|
|
|
|
func _ready():
|
|
while true:
|
|
if len(_participants) > 0:
|
|
mint(1000)
|
|
transfer(1000, _market, _participants[0])
|
|
break
|