feat(all): add hunting and events, commerce and rewards, binary calendars, GameData caching and login diagnostics

Implement hunting AP and progress, event tasks, exchanges, games, stories and actions; connect battle and reward handling.

Add CashShop plugin and installation, server purchases and entitlements, recharge rules and plugin version metadata.

Distribute binary calendars independently; cache GameData in memory and fix single-connection query deadlocks.

Improve automatic login and recovery diagnostics; document configuration and release flows.
This commit is contained in:
2026-10-05 11:50:31 +08:00
parent eb445f88f4
commit d8771caef2
222 changed files with 19000 additions and 4284 deletions
+46
View File
@@ -0,0 +1,46 @@
# Seasonal minigame rules
The registry supplies event identity and dates. This package never creates,
extends or activates a season. Each schedule UID owns independent progress.
Queries initialize a valid new board and return persisted progress. Mutations
require a live matching schedule. Requests are identified by session, path and
sequence; identical retries replay the entire stored response and changed
retries fail.
GameData supplies costs, move ranges, board size, reward sets, completion
thresholds, free roulette draws, special slots and pity thresholds. Client
protobuf and packet callbacks supply field shapes. RouletteInfo capture is a
comparison sample, not runtime data.
LocalText 460038 describes Bingo opening rewards and completed-line rewards.
LocalText 460040 describes puzzle tile rewards, word completion rewards and
the final stage's prohibition on renewal. These meanings drive the following
server rules:
- Dice starts at the first designed scaffold. Each configured controller
samples uniformly inside its inclusive range. Crossing the end advances
completion count; all newly crossed completion rewards and the final
landing scaffold reward settle together.
- Bingo shuffles the reward IDs in its current clear-count reward set.
Opening samples unopened zero-based positions without replacement.
Protocol line types are diagonal 0, row 1 and column 2. Each line pays once
per board. Finishing advances count and creates a fresh board; after the
last designed reward tier, that tier repeats.
- Puzzle starts at designed stage 1. Reward IDs form the board. Opening a
tile pays its reward; opening all members of a word pays that word once.
Renewal requires all current-stage word members, as the client checks,
and advances only while another designed stage exists. Unopened incidental
tiles may be abandoned on renewal. The final stage cannot renew.
- Roulette free draws reset at UTC midnight (KST 09:00); accumulated tries
and special/pity state survive daily reset. Free and paid draws enforce
their separate costs. Weighted sampling uses the design's primary weights,
then secondary weights after a special reward where provided. Pity forces
a designed special slot. Accumulated threshold rewards pay when crossed.
Randomness uses crypto/rand and can be injected in package tests. All submitted
consumed item records must match the server-computed design cost. State is
cloned, an entire batch is simulated and validated, and then economic rewards
and the snapshot are saved. Production must run this handler under the
account repository's request transaction; failed requests roll back item,
wallet and snapshot changes together. The main server passes an entry-backed
snapshot store, so no existing domain core layout changes.