Commit Graph

329 Commits

Author SHA1 Message Date
Zihao Xu
a6b8198c3f Merge branch 'main' into xzhseh/sqlite-event-manager 2026-01-07 20:05:02 -08:00
bridge
4e95b57152 modify price system 2026-01-08 00:42:40 +08:00
bridge
40d8a0425b refactor self heal system 2026-01-08 00:33:41 +08:00
bridge
b53f428cbb update unittest 2026-01-07 23:14:48 +08:00
bridge
b2a021bf8a rename item -> material & refactor buying action 2026-01-07 22:43:26 +08:00
bridge
7c69d612b0 add refine action 2026-01-07 21:15:04 +08:00
bridge
1dfce734ef fix occupy & gift given bug 2026-01-07 20:11:01 +08:00
Zihao Xu
a1f08dd0ab feat: SQLite event storage with pagination and filtering
Implement SQLite-based event persistence as specified in sqlite-event-manager.md.

## Changes

### Backend
- **EventStorage** (`src/classes/event_storage.py`): New SQLite storage layer
  - Cursor-based pagination with compound cursor `{month_stamp}_{rowid}`
  - Avatar filtering (single and pair queries)
  - Major/minor event separation
  - Cleanup API with `keep_major` and `before_month_stamp` filters

- **EventManager** (`src/classes/event_manager.py`): Refactored to use SQLite
  - Delegates to EventStorage for persistence
  - Memory fallback mode for testing
  - New `get_events_paginated()` method

- **API** (`src/server/main.py`):
  - `GET /api/events` - Paginated event retrieval with filtering
  - `DELETE /api/events/cleanup` - User-triggered cleanup

### Frontend
- **EventPanel.vue**: Scroll-to-load pagination, dual-person filter UI
- **world.ts**: Event state management with pagination
- **game.ts**: New API client methods

### Testing
- 81 new tests for EventStorage, EventManager, and API
- Added `pytest-asyncio` and `httpx` to requirements.txt

## Known Issues: Save/Load is Currently Broken

After loading a saved game, the following issues occur:

1. **Wrong database used**: API returns events from the startup database instead
   of the loaded save's `_events.db` file
2. **Events from wrong time period**: Shows events from year 115 when loaded
   save is at year 114
3. **Pagination broken after load**: `has_more` returns `False` despite hundreds
   of events in the saved database
4. **Filter functionality broken**: Character selection filter stops working
   after loading a game

Root cause: `load_game.py` does not properly switch the EventManager's database
connection to the loaded save's events database.
2026-01-07 00:40:34 -08:00
bridge
e4ff312f58 fix action being executed 3 times bug 2026-01-06 23:41:21 +08:00
bridge
35c0756e85 refactor all gather logic 2026-01-06 23:17:21 +08:00
bridge
8a23dc5576 add lode 2026-01-06 23:01:25 +08:00
bridge
db6df82ea8 refactor cast action 2026-01-06 22:28:25 +08:00
bridge
fbb32adbf6 refactor normalize and resolution 2026-01-06 22:13:47 +08:00
bridge
c266655af9 refactor can_start logic of all actions 2026-01-06 21:43:24 +08:00
bridge
b60481c99c fix death bug 2026-01-06 21:23:06 +08:00
bridge
3f980d4593 fix a bug 2026-01-06 20:42:53 +08:00
bridge
9f5ad04e92 refactor buy and sell 2026-01-05 23:52:38 +08:00
bridge
6873746d29 refactor buy and sell 2026-01-05 23:37:52 +08:00
bridge
4bff8e503b add buy action 2026-01-05 23:16:58 +08:00
bridge
8d7e11b021 add elixir 2026-01-05 23:04:55 +08:00
bridge
2a68f352bc add elixir 2026-01-05 22:26:16 +08:00
bridge
96c43c7cf5 Merge branch 'pr-10' 2026-01-05 20:46:43 +08:00
Zihao Xu
8c8e28264f fix: handle null action_params from LLM response
LLM sometimes returns null instead of {} for action_params when an
action doesn't require parameters (e.g., ["Cultivate", null]). This
caused AttributeError when calling .items() on None.

Changes:
- Add defensive check in ai.py to convert null to {}
- Update prompt to explicitly require {} instead of null
2026-01-05 01:36:50 -08:00
Zihao Xu
8d985e0a2b fix: prevent actions on dead avatars
- Add validate_target_avatar() to TargetingMixin for unified validation.
- Update Attack and Assassinate to use the new validation method.
- Add comment to MutualAction.can_start() explaining why it uses inline check.
- Add tests for dead target validation.
2026-01-04 19:29:35 -08:00
bridge
b74014f9f2 add emotion 2026-01-04 22:49:20 +08:00
bridge
441f8c8e3a refactor battle strength system 2026-01-04 22:28:13 +08:00
bridge
4fc74b1531 refactor battle strength system 2026-01-04 22:25:25 +08:00
bridge
276902bca0 refactor effect system 2026-01-04 22:03:05 +08:00
bridge
806e2c1262 refactor price system 2026-01-04 21:49:58 +08:00
Zihao Xu
354050e2b5 fix: correct master-apprentice relation in fortune event
The set_relation(from, to, rel) means "from views to as rel".
When avatar (student) takes master (teacher), avatar should view
master as MASTER, not APPRENTICE.

Before: avatar.set_relation(master, APPRENTICE) - wrong direction
After:  avatar.set_relation(master, MASTER) - correct direction
2026-01-04 01:22:34 -08:00
bridge
868e355e41 refactor cast 2026-01-03 23:54:47 +08:00
bridge
11cef02d74 add cast readme 2026-01-03 23:29:25 +08:00
bridge
775d830ec3 add cast 2026-01-03 23:25:38 +08:00
bridge
6129e0f898 update choice helper 2026-01-03 22:30:33 +08:00
bridge
3a9a9fd6f0 add choice helper 2026-01-03 22:26:55 +08:00
bridge
5b5cd79cb5 add circulation manager 2026-01-03 22:15:25 +08:00
bridge
f499f63c50 update 2026-01-03 22:05:45 +08:00
bridge
6cc0c355dd add more emojis 2026-01-03 21:48:26 +08:00
bridge
5b5ea31d87 refactor avatar effect desc 2026-01-03 21:45:19 +08:00
bridge
e2d03b587d refactor world desc 2026-01-03 21:25:24 +08:00
bridge
f7a4fb23c8 refactor world desc 2026-01-03 20:25:25 +08:00
bridge
9cb98a61dd fix mutual action interact with self bug 2026-01-03 20:08:53 +08:00
bridge
561f1efe21 add emoji to frontend 2026-01-01 15:08:09 +08:00
bridge
b43530ee99 refactor economy prices 2025-12-31 23:41:45 +08:00
bridge
7197dd1acb refactor equip 2025-12-31 23:18:47 +08:00
bridge
1941218665 fix effects 2025-12-31 22:31:30 +08:00
bridge
462c28fb30 fix effects 2025-12-31 22:26:44 +08:00
bridge
6dc0447293 add misfortune 2025-12-30 23:16:10 +08:00
bridge
17ca0cbbce add misfortune 2025-12-30 23:09:29 +08:00
bridge
c2cb8098ee update llm 2025-12-29 22:02:44 +08:00