From 0c92a3521618cfdd733970c0f749b1c9d65147a0 Mon Sep 17 00:00:00 2001 From: Daniel McCoy Stephenson Date: Sat, 13 Jun 2026 14:31:54 -0600 Subject: [PATCH] Rebalance the fishing business so the boat is worth buying A playtest pass found the business strictly dominated by bait/rod upgrades: workers only ever caught the cheapest species (Minnow, ~$8/day net per worker), so the $500 boat had a ~12-day payback and buying it actually slowed the run. Workers now fish the same waters as the player, landing a rarity-rolled species (fish.rollFishType) instead of a hard-coded Minnow. Per-worker net income roughly triples (~$22/day) and a full crew's boat payback drops to ~4-5 days, making the business a competitive parallel investment rather than a trap. WORKER_FISH_PER_DAY is trimmed 6->5 so the passive income supplements active fishing without overshadowing it (verified by re-running the playtest simulation). Closes #94 Co-Authored-By: Claude Sonnet 4.6 --- src/business/business.py | 14 ++++++++++---- tests/business/test_business.py | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/business/business.py b/src/business/business.py index 82fbf38..bd22448 100644 --- a/src/business/business.py +++ b/src/business/business.py @@ -4,11 +4,12 @@ # bring in a passive catch each day in exchange for a daily wage. This turns # accumulated money into ongoing production rather than just a number that grows. +from fish import fish + BOAT_PRICE = 500 MAX_WORKERS = 5 WORKER_DAILY_WAGE = 10 -WORKER_FISH_PER_DAY = 6 -WORKER_CATCH_SPECIES = "Minnow" # workers bring in the common catch +WORKER_FISH_PER_DAY = 5 def runDailyProduction(player, stats=None): @@ -36,9 +37,14 @@ def runDailyProduction(player, stats=None): return summary wages = affordable * WORKER_DAILY_WAGE - caught = affordable * WORKER_FISH_PER_DAY player.money -= wages - player.addFish(WORKER_CATCH_SPECIES, caught) + # Each worker fishes the same waters as the player, landing a rarity-rolled + # species (not just the cheapest one), so the crew's income is competitive + # with simply upgrading your own gear. + caught = 0 + for _ in range(affordable): + player.addFish(fish.rollFishType(), WORKER_FISH_PER_DAY) + caught += WORKER_FISH_PER_DAY summary["wagesPaid"] = wages summary["fishCaught"] = caught if stats is not None: diff --git a/tests/business/test_business.py b/tests/business/test_business.py index 2ba8381..192ba02 100644 --- a/tests/business/test_business.py +++ b/tests/business/test_business.py @@ -1,3 +1,5 @@ +from unittest.mock import patch + from src.business import business from src.player.player import Player from src.stats.stats import Stats @@ -40,6 +42,22 @@ def test_workers_catch_fish_and_draw_wages(): assert stats.totalFishCaught == expectedFish +def test_workers_catch_rolled_species_not_just_minnow(): + # prepare - a boat and one worker; force the rolled species to Bass + player = Player() + player.hasBoat = True + player.workers = 1 + player.money = 1000 + + # call - workers fish a rarity-rolled species, not a hard-coded one + with patch.object(business.fish, "rollFishType", return_value="Bass"): + business.runDailyProduction(player) + + # check - the catch landed as the rolled species + assert player.fishByType.get("Bass") == business.WORKER_FISH_PER_DAY + assert "Minnow" not in player.fishByType + + def test_unaffordable_workers_quit(): # prepare - 3 workers but only enough money for one day's wage of one worker player = Player()