busted simulation

This commit is contained in:
Dan 2026-01-28 15:26:12 +00:00
parent 9214d13054
commit 90d6c5c926
6 changed files with 1215 additions and 33 deletions

View file

@ -2,11 +2,16 @@ class_name TickProcess
extends Node
# Dependency injection - can be overridden for simulation
var unlocks_provider: Node = null
var inventory_provider: Node = null
# Using Variant to accept both Node (singletons) and RefCounted (IsolatedGameState)
var unlocks_provider = null
var inventory_provider = null
func _ready():
# Default to singletons if not explicitly set
_ensure_providers_initialized()
func _ensure_providers_initialized():
"""Ensure providers are set (called before every tick if needed)"""
if unlocks_provider == null:
unlocks_provider = Unlocks
if inventory_provider == null:
@ -19,71 +24,72 @@ func set_providers(unlocks, inventory):
func tick():
# Log.pr("Tick Process Ticking...")
_ensure_providers_initialized() # Safety check before each tick
do_autowood()
do_whittling()
do_selling()
func do_autowood():
# If the autowood unlock is unlocked then automatically gain wood based on the modifier
var autowood_unlock = Unlocks.get_unlock_by_id(Global.autowood_unlock_id)
# If the autowood unlock is unlocked then automatically gain wood based on the modifier
var autowood_unlock = unlocks_provider.get_unlock_by_id(Global.autowood_unlock_id)
if autowood_unlock and autowood_unlock.is_unlocked:
# Log.pr("Autowood modifier", str(Unlocks.get_modifier_value("autowood_modifier")))
var wood_to_gather = max(Unlocks.get_wood_per_click() * Unlocks.get_modifier_value("autowood_modifier"), 1)
Inventory.add_wood(wood_to_gather)
# Log.pr("Autowood modifier", str(unlocks_provider.get_modifier_value("autowood_modifier")))
var wood_to_gather = max(unlocks_provider.get_wood_per_click() * unlocks_provider.get_modifier_value("autowood_modifier"), 1)
inventory_provider.add_wood(wood_to_gather)
# Log.pr("Auto-gathered", str(wood_to_gather), "wood via autowood unlock.")
func do_whittling():
# If there's more than 1 whole wood available, then whittle based on the efficiency modifier
if Inventory.get_wood() >= 1:
# If there's more than 1 whole wood available, then whittle based on the efficiency modifier
if inventory_provider.get_wood() >= 1:
whittle_max_wood_possible()
## If multicraft is unlocked, whittle additional wood based on multicraft unlock
var multicraft_unlock = Unlocks.get_unlock_by_id(Global.multicraft_unlock_id)
var multicraft_unlock = unlocks_provider.get_unlock_by_id(Global.multicraft_unlock_id)
if multicraft_unlock and multicraft_unlock.is_unlocked:
var additional_whittles = multicraft_unlock.current_rank # Each rank allows one additional whittling action
for i in range(additional_whittles):
if Inventory.get_wood() >= 1:
if inventory_provider.get_wood() >= 1:
whittle_max_wood_possible()
else:
break
func do_selling():
# If the wholesale unlock is purchased, sell blocks of 100 whittled wood if possible
var wholesale_unlock = Unlocks.get_unlock_by_id(Global.wholesale_unlock_id)
# If the wholesale unlock is purchased, sell blocks of 100 whittled wood if possible
var wholesale_unlock = unlocks_provider.get_unlock_by_id(Global.wholesale_unlock_id)
if wholesale_unlock and wholesale_unlock.is_unlocked:
while Inventory.get_stock() >= Global.wholesale_bundle_size:
Inventory.spend_stock(Global.wholesale_bundle_size)
var currency_earned = Global.wholesale_bundle_size * Unlocks.get_sale_price_per_item() * Global.wholesale_discount_multiplier
Inventory.add_currency(currency_earned)
while inventory_provider.get_stock() >= Global.wholesale_bundle_size:
inventory_provider.spend_stock(Global.wholesale_bundle_size)
var currency_earned = Global.wholesale_bundle_size * unlocks_provider.get_sale_price_per_item() * Global.wholesale_discount_multiplier
inventory_provider.add_currency(currency_earned)
# Log.pr("Sold 100 whittled wood for", str(currency_earned), "currency via wholesale unlock.")
# If there's whittled wood available to sell, sell it for currency
if Inventory.get_stock() > 0:
var whittle_wood_to_sell = Inventory.get_stock()
# Sell whatever people are willing to buy
var purchase_rate = Global.base_purchase_rate * Unlocks.get_modifier_value("purchase_rate_modifier")
if inventory_provider.get_stock() > 0:
var whittle_wood_to_sell = inventory_provider.get_stock()
# Sell whatever people are willing to buy
var purchase_rate = Global.base_purchase_rate * unlocks_provider.get_modifier_value("purchase_rate_modifier")
var max_stock_to_sell = floor(purchase_rate)
# Sell up to the max stock to sell this tick, but no more than available stock
# We should always sell at least one, up to the max
# We should always sell at least one, up to the max
var actual_stock_to_sell = min(whittle_wood_to_sell, max(1, max_stock_to_sell))
Inventory.spend_stock(actual_stock_to_sell)
var currency_earned = actual_stock_to_sell * Unlocks.get_sale_price_per_item()
Inventory.add_currency(currency_earned)
inventory_provider.spend_stock(actual_stock_to_sell)
var currency_earned = actual_stock_to_sell * unlocks_provider.get_sale_price_per_item()
inventory_provider.add_currency(currency_earned)
func whittle_max_wood_possible():
# Get the items that can be produced per tick
var items_produced_per_tick = Unlocks.get_items_produced_per_tick()
# Get the items that can be produced per tick
var items_produced_per_tick = unlocks_provider.get_items_produced_per_tick()
# Log.pr("Items produced per tick:", str(items_produced_per_tick))
var wood_needed = ceil(items_produced_per_tick)
# Whittle as much wood as possible this tick, up to the max allowed by efficiency
var wood_to_whittle = min(Inventory.get_wood(), wood_needed)
var wood_to_whittle = min(inventory_provider.get_wood(), wood_needed)
var actual_items_produced = wood_to_whittle
Inventory.spend_wood(wood_to_whittle)
Inventory.add_stock(actual_items_produced)
inventory_provider.spend_wood(wood_to_whittle)
inventory_provider.add_stock(actual_items_produced)
# Log.pr("Whittled", str(wood_to_whittle), "wood into", str(actual_items_produced), "whittle wood.")