AI: create outline for main game logic
This commit is contained in:
@@ -3,7 +3,28 @@ Prompt to Kiro AI (Default):
|
||||
|
||||
Use the spec-sheet.md file to create an outline of the game's main python file. please strictly create function definitions with detailed descriptions as comments next to them, and I PERSONALLY will write the actual code content. Clear description and good description of this outline is essential, so that I can implement the most effective methodology. Again, your job is outline and describe right now. not code. Any questions or clarifications can be asked if necessary.
|
||||
|
||||
Committed As: "AI: create outline for main game logic"
|
||||
|
||||
Response:
|
||||
|
||||
Done. I created main.py as a pure outline: function signatures with detailed comment descriptions and pass bodies, no implementation logic for you to write yourself.
|
||||
|
||||
How it's organized (MVC, matching the spec):
|
||||
|
||||
Data I/O — loadCreatures, loadSave, writeSave. Isolates all disk access.
|
||||
Model — onAppStart, resetFishingState, pickRandomCreature, startSkillCheck. State setup and the fishing-cycle data.
|
||||
Controller — onStep, onMousePress, onKeyPress, checkSkillHit. The game loop and input routing (using the real cmu_graphics hook names so they wire up automatically).
|
||||
Economy — sellCreature, buyUpgrade, buyBaitLicense, setActiveBait. The shop and rogue-like upgrade/bait system.
|
||||
View — redrawAll plus drawBackground, drawPlayerAndRod, drawShopEntities, drawSkillCheck, drawCatchDisplay, drawHud. Draw-only, split so redrawAll stays readable.
|
||||
Entry — main() calling runApp.
|
||||
Two things I decided on my own that you may want to adjust:
|
||||
|
||||
Database file: the spec says fish.csv, but your actual file is creatures.tsv at the repo root, tab-separated, with non-fish entries. I wrote the outline around creatures.tsv. If you'd rather follow the spec path, just change what you pass to loadCreatures.
|
||||
|
||||
A few open design questions I left as decisions in the comments rather than deciding for you:
|
||||
|
||||
Multi-bar skill check: must the player clear every bar, or is one good hit enough? (noted in checkSkillHit)
|
||||
Selling: automatic on catch, or a deliberate action in the market? (noted in sellCreature)
|
||||
Keyboard controls: included onKeyPress as optional — drop it if the game is mouse-only.
|
||||
|
||||
###############################################
|
||||
@@ -0,0 +1,243 @@
|
||||
# =============================================================================
|
||||
# Fishing Mini-Project - Main Game File (OUTLINE ONLY)
|
||||
# =============================================================================
|
||||
# This file is a STRUCTURAL OUTLINE: function signatures + descriptive comments.
|
||||
# The actual implementation will be written by the project author (human).
|
||||
#
|
||||
# Engine: cmu_graphics | Pattern: MVC (Model-View-Controller)
|
||||
# Data: creatures.tsv (tab-separated database at repo root)
|
||||
# Save: save.json (persistent progress in the script directory)
|
||||
# =============================================================================
|
||||
|
||||
from cmu_graphics import *
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# SECTION 1: DATA LOADING / FILE I/O
|
||||
# -----------------------------------------------------------------------------
|
||||
# Helpers that read from and write to disk. Kept separate from game logic so
|
||||
# the data source (TSV path, save path) can change without touching gameplay.
|
||||
# =============================================================================
|
||||
|
||||
def loadCreatures(path):
|
||||
# Read creatures.tsv (tab-separated) and parse it into a usable structure.
|
||||
# Suggested return: a list of dicts, one per creature, with keys matching
|
||||
# the header row: name, description, price, sprite-file, difficulty,
|
||||
# length, weight. Convert numeric columns (price, difficulty, length,
|
||||
# weight) from strings to int/float here; leave missing fields as sensible
|
||||
# defaults so partially-filled rows (like the current TSV) don't crash.
|
||||
pass
|
||||
|
||||
|
||||
def loadSave(path):
|
||||
# Load save.json and return the player's saved state (money, owned baits,
|
||||
# owned upgrades, current bait, caught log, etc.). If the file is missing
|
||||
# or unreadable, return a fresh default-state dict so a first-time player
|
||||
# starts cleanly. This is the only place that reads the save file.
|
||||
pass
|
||||
|
||||
|
||||
def writeSave(path, saveState):
|
||||
# Serialize the current player state to save.json. Call this at key moments
|
||||
# (after a sale, after a purchase, on quit) so progress persists between
|
||||
# sessions. Keep the written structure identical to what loadSave expects.
|
||||
pass
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# SECTION 2: MODEL - STATE SETUP & GAME DATA
|
||||
# -----------------------------------------------------------------------------
|
||||
# Everything that initializes and holds game state on the cmu_graphics `app`.
|
||||
# No drawing and no event handling here - just state.
|
||||
# =============================================================================
|
||||
|
||||
def onAppStart(app):
|
||||
# cmu_graphics entry point. Initialize ALL app.* state here:
|
||||
# - window/layout constants (width, height, dock/water/grass regions)
|
||||
# - app.creatures (from loadCreatures)
|
||||
# - app.save (from loadSave) and derived player values
|
||||
# - app.scene (which screen is active: 'dock', 'shop', 'catch', ...)
|
||||
# - fishing state (idle / waiting-for-bite / skill-check / result)
|
||||
# - skill-check state placeholders (cursor angle, bars, speed, result)
|
||||
# - app.stepsPerSecond for the game loop cadence
|
||||
# Delegates to the smaller setup helpers below to keep this readable.
|
||||
pass
|
||||
|
||||
|
||||
def resetFishingState(app):
|
||||
# Return the fishing cycle to its starting "idle" point so a new cast can
|
||||
# begin. Clears any active skill-check data, the pending random bite timer,
|
||||
# and the currently-hooked creature. Called at startup and after each catch
|
||||
# is resolved/dismissed.
|
||||
pass
|
||||
|
||||
|
||||
def pickRandomCreature(app):
|
||||
# Choose which creature the player hooks on this cast. Selection is filtered
|
||||
# by the current bait (bait gates which difficulty tiers are available) and
|
||||
# weighted toward easier creatures, while still giving rarer/harder ones a
|
||||
# real chance (per the spec's "skewed toward easier but still fun" goal).
|
||||
# Returns the chosen creature record (one entry from app.creatures).
|
||||
pass
|
||||
|
||||
|
||||
def startSkillCheck(app, creature):
|
||||
# Configure a new skill check based on the hooked creature's difficulty.
|
||||
# Difficulty maps to: cursor rotation speed, number of target bars, and
|
||||
# bar length/width. Also apply any owned upgrades that modify these values
|
||||
# (e.g. slower cursor, wider bars, extra forgiveness). Stores the resulting
|
||||
# parameters on app for the controller/view to use.
|
||||
pass
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# SECTION 3: CONTROLLER - GAME LOOP & INPUT HANDLING
|
||||
# -----------------------------------------------------------------------------
|
||||
# cmu_graphics event hooks. These advance state and route input; they should
|
||||
# call Model helpers rather than contain heavy logic themselves.
|
||||
# =============================================================================
|
||||
|
||||
def onStep(app):
|
||||
# Runs every time step (the game loop / "controller tick").
|
||||
# Responsibilities depend on the current fishing phase:
|
||||
# - waiting-for-bite: count down the random timer; when it elapses, pick a
|
||||
# creature and transition into the skill check.
|
||||
# - skill-check: advance the cursor's angle around the circle each step.
|
||||
# - otherwise (idle, viewing a catch, in shop): do nothing time-based.
|
||||
pass
|
||||
|
||||
|
||||
def onMousePress(app, mouseX, mouseY):
|
||||
# Primary input router. Behavior depends on app.scene / fishing phase:
|
||||
# - dock idle: clicking starts a cast (begin waiting-for-bite).
|
||||
# - skill-check active: register the click as a timing attempt and
|
||||
# evaluate it via checkSkillHit.
|
||||
# - catch popup showing: dismiss the popup and reset fishing.
|
||||
# - shop / UI sprites clicked: open the shop or trigger that UI action.
|
||||
# Keep this as dispatch only - defer the real work to helper functions.
|
||||
pass
|
||||
|
||||
|
||||
def onKeyPress(app, key):
|
||||
# Optional keyboard controls. Candidates: a key to cast/reel as an
|
||||
# alternative to clicking, a key to open/close the shop, or a debug/reset
|
||||
# key during development. Remove if you decide the game is mouse-only.
|
||||
pass
|
||||
|
||||
|
||||
def checkSkillHit(app):
|
||||
# Evaluate a skill-check click: is the cursor's current angle inside one of
|
||||
# the active target bars? Decide hit vs miss. Define the multi-bar flow here
|
||||
# (e.g. must the player clear every bar, or is one good hit enough?) and
|
||||
# advance or fail the skill check accordingly. On full success, mark the
|
||||
# creature as caught and move to the catch-display phase; on failure, end
|
||||
# the cast without a catch.
|
||||
pass
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# SECTION 4: SHOP / ECONOMY LOGIC
|
||||
# -----------------------------------------------------------------------------
|
||||
# Buying/selling and the rogue-like upgrade system. Pure state changes that the
|
||||
# controller invokes; no drawing here.
|
||||
# =============================================================================
|
||||
|
||||
def sellCreature(app, creature):
|
||||
# Add the creature's market value to the player's money. Value scales with
|
||||
# difficulty (harder creatures pay more, per the spec). Persist the updated
|
||||
# money via writeSave. Decide here whether selling is automatic on catch or
|
||||
# a deliberate action in the shop/market.
|
||||
pass
|
||||
|
||||
|
||||
def buyUpgrade(app, upgradeId):
|
||||
# Attempt to purchase an upgrade. Check the player can afford it and doesn't
|
||||
# already own it; if valid, deduct money, record ownership in app.save, and
|
||||
# persist. Upgrades modify the skill check (cursor speed, bar size/count,
|
||||
# extra attempts, etc.) and are read back in startSkillCheck.
|
||||
pass
|
||||
|
||||
|
||||
def buyBaitLicense(app, baitId):
|
||||
# Purchase a one-time license for a bait tier. Once owned, the player can
|
||||
# freely switch to that bait at no further cost (switching handled by
|
||||
# setActiveBait). Bait determines which creatures are reachable in
|
||||
# pickRandomCreature. Deduct money, record ownership, persist.
|
||||
pass
|
||||
|
||||
|
||||
def setActiveBait(app, baitId):
|
||||
# Switch the currently-equipped bait to any bait the player already owns a
|
||||
# license for. Free action. Updates app state so the next cast's creature
|
||||
# pool reflects the new bait. Reject the switch if the bait isn't owned.
|
||||
pass
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# SECTION 5: VIEW - DRAWING
|
||||
# -----------------------------------------------------------------------------
|
||||
# redrawAll + per-scene draw helpers. These ONLY read state and draw; they must
|
||||
# never mutate app state. Composed top-down so redrawAll stays legible.
|
||||
# =============================================================================
|
||||
|
||||
def redrawAll(app):
|
||||
# Master draw routine. Draw the persistent world first (background, grass,
|
||||
# water, dock, player), then layer the active scene/phase on top:
|
||||
# - the shop UI, or
|
||||
# - the active skill-check overlay, or
|
||||
# - the catch-display popup.
|
||||
# Delegates each piece to the helpers below.
|
||||
pass
|
||||
|
||||
|
||||
def drawBackground(app):
|
||||
# Draw the static scene layout from the spec: grass behind, the dock, and
|
||||
# the lake occupying the bottom ~1/3 of the screen (blue water, optional
|
||||
# wave patterns). This is the backdrop present in every scene.
|
||||
pass
|
||||
|
||||
|
||||
def drawPlayerAndRod(app):
|
||||
# Draw the character sprite seated at the end of the dock with the fishing
|
||||
# rod. When a cast is active, draw the line and the bobber dropping onto the
|
||||
# water surface. Reflects the current fishing phase visually.
|
||||
pass
|
||||
|
||||
|
||||
def drawShopEntities(app):
|
||||
# Draw the clickable shop/UI sprites standing on the grass (per the spec).
|
||||
# Positions here must line up with the hit-testing done in onMousePress so
|
||||
# clicks land on the right entity.
|
||||
pass
|
||||
|
||||
|
||||
def drawSkillCheck(app):
|
||||
# Draw the active skill-check overlay: the circle, the target bars placed
|
||||
# around it (count/length from difficulty), and the rotating cursor at its
|
||||
# current angle. Optionally show which bars are already cleared. Read-only.
|
||||
pass
|
||||
|
||||
|
||||
def drawCatchDisplay(app):
|
||||
# Draw the "you caught it!" popup: the creature's sprite coming out of the
|
||||
# water, plus its name, description, and stats (length, weight, value).
|
||||
# Stays up until dismissed by a click (handled in onMousePress). Read-only.
|
||||
pass
|
||||
|
||||
|
||||
def drawHud(app):
|
||||
# Draw the persistent heads-up display: current money, equipped bait, and
|
||||
# any brief status/instruction text ("click to cast", etc.). Overlaid on
|
||||
# every scene so the player always sees their core stats.
|
||||
pass
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# SECTION 6: PROGRAM ENTRY
|
||||
# -----------------------------------------------------------------------------
|
||||
def main():
|
||||
# Start the cmu_graphics app (runApp with the chosen window dimensions).
|
||||
pass
|
||||
|
||||
|
||||
main()
|
||||
+1
-1
@@ -23,7 +23,7 @@ As previously stated, cmu_graphics should be the main backend engine, with the M
|
||||
- the difficulty of fish available depends on the bait you use, which can be changed in the shop (you pay for a license once, then can switch to any owned bait at any time)
|
||||
- fish are randomly selected, probably skewed towards easier but ensuring the user still has ample opportunity to have some fun skill checks they feel proud of passing
|
||||
- higher difficulty fish give more money when sold to the market
|
||||
- for database, a csv file containing each fish, its description, price, sprite filename, difficulty, length, and weight (among any other info) should be sufficient (this can be "fish.csv" in a "data" directory)
|
||||
- for database, a csv file containing each fish, its description, price, sprite filename, difficulty, length, and weight (among any other info) should be sufficient (this can be "creatures.tsv" in a "data" directory)
|
||||
- sprites will be stored in a "sprites" folder, with all the fish being stored in a "fish" subfolder I will find sprites - leave placeholder files for what should be included (no need for them to be actual png or sprites, just so i know whats needed)
|
||||
- game save data can be stored in JSON format, ensuring it persists between play sessions for a smooth experience. this can just be "save.json" in the same directory as the script.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user