269 lines
7.3 KiB
Markdown
269 lines
7.3 KiB
Markdown
|
|
# Cat Haven - README
|
|||
|
|
|
|||
|
|
## Testing
|
|||
|
|
|
|||
|
|
Cat Haven includes a comprehensive test suite using a custom testing framework with TAP-style output and XML report generation.
|
|||
|
|
|
|||
|
|
### Test Structure
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
test/
|
|||
|
|
├── test_helper.lua # LOVR mocks and test utilities
|
|||
|
|
├── run_tests.lua # Test runner script
|
|||
|
|
├── spec/ # Unit tests (per module)
|
|||
|
|
│ ├── core_spec.lua
|
|||
|
|
│ ├── json_spec.lua
|
|||
|
|
│ ├── voxel_spec.lua
|
|||
|
|
│ ├── cat_spec.lua
|
|||
|
|
│ ├── house_spec.lua
|
|||
|
|
│ ├── ui_spec.lua
|
|||
|
|
│ └── audio_spec.lua
|
|||
|
|
├── integration/ # Integration tests
|
|||
|
|
│ └── game_flow_spec.lua
|
|||
|
|
└── e2e/ # End-to-end tests
|
|||
|
|
└── edge_cases_spec.lua
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Test Coverage
|
|||
|
|
|
|||
|
|
#### Unit Tests (spec/)
|
|||
|
|
- **JSON Module**: Encoding/decoding, edge cases, round-trip validation
|
|||
|
|
- **Voxel Module**: Texture generation, mesh creation, rendering, raycast
|
|||
|
|
- **Cat Module**: Creation, AI behavior, needs, serialization, animation
|
|||
|
|
- **House Module**: Furniture placement, collision detection, upgrades
|
|||
|
|
- **UI Module**: HUD rendering, interaction, state management
|
|||
|
|
- **Audio Module**: Sound generation, playback, properties
|
|||
|
|
- **Core Module**: Game state, spawn, save/load, happiness calculation
|
|||
|
|
|
|||
|
|
#### Integration Tests (integration/)
|
|||
|
|
- Full game flow initialization
|
|||
|
|
- Module interactions
|
|||
|
|
- Save/load round-trip
|
|||
|
|
- Cat-house interactions
|
|||
|
|
- UI-cat interactions
|
|||
|
|
- Voxel-cat interactions
|
|||
|
|
- JSON serialization round-trips
|
|||
|
|
|
|||
|
|
#### End-to-End Tests (e2e/)
|
|||
|
|
- Empty cat list handling
|
|||
|
|
- Zero distance edge cases
|
|||
|
|
- Nil value handling
|
|||
|
|
- Invalid JSON handling
|
|||
|
|
- Max capacity limits
|
|||
|
|
- Furniture at bounds
|
|||
|
|
- Low happiness departures
|
|||
|
|
- Furniture upgrades
|
|||
|
|
- Personality compatibility
|
|||
|
|
- Audio generation
|
|||
|
|
- Serialization edge cases
|
|||
|
|
- Stress tests (many cats, many furniture)
|
|||
|
|
- Complete game session simulation
|
|||
|
|
|
|||
|
|
### Running Tests
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Run all tests
|
|||
|
|
lua test/run_tests.lua
|
|||
|
|
|
|||
|
|
# Run tests with LuaJIT (faster)
|
|||
|
|
luajit test/run_tests.lua
|
|||
|
|
|
|||
|
|
# Run specific test file
|
|||
|
|
lua test/spec/json_spec.lua
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Test Output
|
|||
|
|
|
|||
|
|
Tests output TAP (Test Anything Protocol) format to stdout and generate an XML report:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
cat_game/
|
|||
|
|
├── test-report.xml # JUnit-compatible XML report
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
The XML report can be used with CI/CD tools like Jenkins, GitHub Actions, etc.
|
|||
|
|
|
|||
|
|
### Writing Tests
|
|||
|
|
|
|||
|
|
Use the `describe` and `it` functions for test organization:
|
|||
|
|
|
|||
|
|
```lua
|
|||
|
|
describe('Module Name', function()
|
|||
|
|
it('should do something', function()
|
|||
|
|
-- Test code here
|
|||
|
|
assert.equals(expected, actual)
|
|||
|
|
assert_truthy(value)
|
|||
|
|
assert_falsy(value)
|
|||
|
|
end)
|
|||
|
|
end)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Mocking LOVR
|
|||
|
|
|
|||
|
|
The test helper provides a complete LOVR mock:
|
|||
|
|
|
|||
|
|
```lua
|
|||
|
|
local helper = require('test.test_helper')
|
|||
|
|
local lovr = helper.lovr
|
|||
|
|
|
|||
|
|
-- Use lovr in tests
|
|||
|
|
lovr.graphics.box('fill', 0, 0, 0, 1, 1, 1, { 1, 0, 0 })
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Assertions
|
|||
|
|
|
|||
|
|
- `assert.equals(a, b)` - Check equality
|
|||
|
|
- `assert_truthy(val)` - Check truthiness
|
|||
|
|
- `assert_falsy(val)` - Check falsiness
|
|||
|
|
- `assert_matches(str, pattern)` - Check regex match
|
|||
|
|
- `assertDeepEqual(a, b)` - Deep table comparison
|
|||
|
|
|
|||
|
|
## Project Overview
|
|||
|
|
|
|||
|
|
Cat Haven is a cozy voxel-styled management game for LOVR (Lua Open Virtual Reality). Players manage a virtual cat shelter, placing furniture, welcoming new cats, and maintaining their happiness.
|
|||
|
|
|
|||
|
|
## Features
|
|||
|
|
|
|||
|
|
### Core Gameplay
|
|||
|
|
- **Cat Management**: Welcome new cats with 5 unique personalities (Lone Wolf, Social Butterfly, Playful Clown, Greedy Eater, Lazy Sleeper)
|
|||
|
|
- **Furniture System**: Place and upgrade furniture (Cat Tree, Scratching Post, Cozy Bed, Window Seat, Food Bowl)
|
|||
|
|
- **Happiness System**: Monitor cat happiness based on comfort, social needs, hunger, and fun
|
|||
|
|
- **Save/Load**: JSON-based save system to preserve game state
|
|||
|
|
|
|||
|
|
### Technical Features
|
|||
|
|
- **Voxel Rendering**: Procedural textures for all game objects
|
|||
|
|
- **Procedural Audio**: Generated sounds for purring, meowing, ambient room noise
|
|||
|
|
- **Grid-based Placement**: Collision detection for furniture placement
|
|||
|
|
- **AI Behavior**: Cats seek comfort, social interaction, and entertainment
|
|||
|
|
- **Headless Environment**: Designed for VR but functional in 2D mode
|
|||
|
|
|
|||
|
|
## Project Structure
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
cat_game/
|
|||
|
|
├── main.lua # LOVR entry point
|
|||
|
|
├── README.md # This file
|
|||
|
|
├── BUILD_NOTES.md # Implementation status
|
|||
|
|
├── src/
|
|||
|
|
│ ├── core.lua # Game state, configuration, save/load
|
|||
|
|
│ ├── json.lua # Custom JSON encoder/decoder
|
|||
|
|
│ ├── voxel/init.lua # Voxel rendering, procedural textures
|
|||
|
|
│ ├── cat/init.lua # Cat AI, behavior, state machine
|
|||
|
|
│ ├── house/init.lua # Grid system, furniture placement
|
|||
|
|
│ ├── ui/init.lua # HUD, inventory, cat log
|
|||
|
|
│ └── audio/init.lua # Procedural audio generation
|
|||
|
|
├── test/ # Test suite
|
|||
|
|
│ ├── test_helper.lua # LOVR mocks and utilities
|
|||
|
|
│ ├── run_tests.lua # Test runner
|
|||
|
|
│ ├── spec/ # Unit tests
|
|||
|
|
│ ├── integration/ # Integration tests
|
|||
|
|
│ └── e2e/ # End-to-end tests
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Testing
|
|||
|
|
|
|||
|
|
### Running Tests
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Run all tests
|
|||
|
|
lua test/run_tests.lua
|
|||
|
|
|
|||
|
|
# Run tests with LuaJIT (faster)
|
|||
|
|
luajit test/run_tests.lua
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Test Coverage
|
|||
|
|
|
|||
|
|
- **JSON Encoding/Decoding**: All data types, edge cases, round-trip validation
|
|||
|
|
- **Cat Creation**: All 5 personalities, AI behavior, serialization
|
|||
|
|
- **Furniture Placement**: Grid system, collision detection, upgrades
|
|||
|
|
- **Happiness Calculation**: All weights, edge cases, empty lists
|
|||
|
|
- **Save/Load Round-trip**: Complete state preservation
|
|||
|
|
- **UI Rendering**: HUD, inventory, cat log, interaction
|
|||
|
|
- **Audio Generation**: Purr, meow, click, ambient sounds
|
|||
|
|
|
|||
|
|
### Test Structure
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
test/
|
|||
|
|
├── test_helper.lua # LOVR mocks and utilities
|
|||
|
|
├── run_tests.lua # Test runner
|
|||
|
|
├── spec/ # Unit tests (per module)
|
|||
|
|
│ ├── core_spec.lua
|
|||
|
|
│ ├── json_spec.lua
|
|||
|
|
│ ├── voxel_spec.lua
|
|||
|
|
│ ├── cat_spec.lua
|
|||
|
|
│ ├── house_spec.lua
|
|||
|
|
│ ├── ui_spec.lua
|
|||
|
|
│ └── audio_spec.lua
|
|||
|
|
├── integration/ # Integration tests
|
|||
|
|
│ └── game_flow_spec.lua
|
|||
|
|
└── e2e/ # End-to-end tests
|
|||
|
|
└── edge_cases_spec.lua
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Controls
|
|||
|
|
|
|||
|
|
- **RThumb + S**: Save game
|
|||
|
|
- **RThumb + L**: Load game
|
|||
|
|
- **ESC**: Pause game
|
|||
|
|
- **Mouse**: Interact with UI elements
|
|||
|
|
|
|||
|
|
## Game Mechanics
|
|||
|
|
|
|||
|
|
### Cat Spawn
|
|||
|
|
- New cats arrive every 30 seconds (if under max capacity)
|
|||
|
|
- Each cat has a random personality affecting behavior and compatibility
|
|||
|
|
|
|||
|
|
### Happiness Formula
|
|||
|
|
```
|
|||
|
|
Total Happiness =
|
|||
|
|
(Avg Comfort × 0.3) +
|
|||
|
|
(Avg Social × 0.2) +
|
|||
|
|
(Avg Hunger × 0.2) +
|
|||
|
|
(Avg Fun × 0.3)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Cat Departure
|
|||
|
|
Cats leave automatically when:
|
|||
|
|
- Comfort drops below 10%
|
|||
|
|
- Hunger drops below 10%
|
|||
|
|
|
|||
|
|
### Furniture Upgrades
|
|||
|
|
- Furniture can be upgraded 3 levels
|
|||
|
|
- Each upgrade increases happiness contribution by 80%
|
|||
|
|
|
|||
|
|
## Technical Details
|
|||
|
|
|
|||
|
|
### Dependencies
|
|||
|
|
- LOVR 2023 (v1.4)
|
|||
|
|
- Lua 5.4
|
|||
|
|
|
|||
|
|
### Audio Format
|
|||
|
|
Audio is generated procedurally using `lovr.audio.newSource()` with 'static' buffer type.
|
|||
|
|
|
|||
|
|
### Texture Generation
|
|||
|
|
Textures are created at runtime using `lovr.graphics.newImage()` with RGBA8 format.
|
|||
|
|
|
|||
|
|
## Building
|
|||
|
|
|
|||
|
|
The game runs directly in LOVR. No compilation required.
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
lovr ./
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Status
|
|||
|
|
|
|||
|
|
All phases complete:
|
|||
|
|
- ✅ MVP setup
|
|||
|
|
- ✅ Core systems
|
|||
|
|
- ✅ Polish
|
|||
|
|
- ✅ Neverending loop
|
|||
|
|
|
|||
|
|
See BUILD_NOTES.md for implementation details.
|
|||
|
|
|
|||
|
|
## License
|
|||
|
|
|
|||
|
|
MIT License
|