Files
mp-xieyingeng/QUICK_REFERENCE.md
2026-04-05 13:37:58 +08:00

5.6 KiB

QUICK REFERENCE - Game Points/Score System

🎮 What is the "Currency"?

LIVES - Not traditional points/coins, but a renewable "health" resource.

📊 Lives Management

Storage Key:        "game_lives" (localStorage)
Default:            10
Min Value:          0
Max Value:          ∞ (no limit)

Methods:
├─ getLives()           → Returns current lives
├─ setLives(n)          → Set specific value
├─ consumeLife()        → Deduct 1 life
├─ addLife()            → Add 1 life
├─ hasLives()           → Check if > 0
└─ resetLives()         → Reset to 10

🎯 How Lives Are Spent

Action Cost Where
Unlock Clue 2 1 Life PageLevel → onUnlockClue(2)
Unlock Clue 3 1 Life PageLevel → onUnlockClue(3)
TOTAL PER LEVEL 0-2 Lives Depends on player choice

🏆 How Lives Are Earned

Action Reward Where
Complete a Level +1 Life PageLevel → showSuccess()
Wrong Answer 0 No penalty
Time Up 0 No penalty

📈 Level Progression

Storage Key:     "game_progress" (localStorage)
Structure:
{
  currentLevelIndex: number,      // 0-based, current level
  maxUnlockedLevelIndex: number   // 0-based, highest reached
}

Default:         { currentLevelIndex: 0, maxUnlockedLevelIndex: 0 }

Progression Rules:

  1. Level 1 always unlocked - Start here
  2. Beat Level N → currentLevel becomes N+1
  3. Beat Level N → maxUnlocked becomes max(maxUnlocked, N)
  4. Can replay earlier levels - But always progress forward

Methods:

getCurrentLevelIndex()          → Get current (0-based)
setCurrentLevelIndex(n)         → Jump to level
getMaxUnlockedLevelIndex()      → Get highest reached
isLevelUnlocked(n)              → Check if playable
onLevelCompleted(n)             → Save win + progress
resetProgress()                 → Reset to level 1

🎨 Level Data (from API)

Endpoint: https://ilookai.cn/api/v1/wechat-game/levels

ApiLevelData {
    id: string,          // UUID
    level: number,       // Level number (1-based display)
    imageUrl: string,    // Main puzzle image
    hint1: string,       // Free clue
    hint2: string,       // Costs 1 life
    hint3: string,       // Costs 1 life
    answer: string,      // The answer (case-sensitive, trimmed)
    sortOrder: number    // Sort order
}

⏱️ Gameplay Mechanics

Time Limit

  • Duration: 60 seconds per level
  • On Timeout: Play fail sound, game doesn't end
  • After Timeout: Can still submit answers

Input System

  • Type: Single text box (not per-character)
  • Processing: Trimmed, case-sensitive comparison
  • Max Length: Based on answer length

Win Condition

input.trim() === answer
↓
Play success sound → Stop timer → Award +1 life 
→ Show PassModal → Save progress

Lose Condition

input.trim() !== answer
↓
Play fail sound → Vibrate → Show toast
→ Lives unchanged → Can retry

🎁 Rewards & Penalties

Event Lives Change Other Effects
Correct Answer +1 Play success sound, show modal
Wrong Answer 0 Play fail sound, vibrate, toast
Unlock Clue -1 Show clue content
Time Up 0 Play fail sound, countdown stops
Level Complete Already +1ed Save progress, move to next

🔄 Economy Balance

Starting Inventory:    10 lives

Without Hints:         +1 life/level   → Infinite
With 1 Hint/Level:     0 lives/level   → Stable
With 2 Hints/Level:    -1 life/level   → Finite (10-20 levels)

Net Formula:           newLives = oldLives - hintsUsed + 1 (on win)

📡 API Integration

LevelDataManager {
    API_URL: "https://ilookai.cn/api/v1/wechat-game/levels"
    TIMEOUT: 8000ms
    RETRY_COUNT: 2
    
    Calls:
    ├─ initialize()          → Load all level metadata + image for level 1
    ├─ ensureLevelReady(n)   → Load specific level image
    ├─ preloadNextLevel(n)   → Silently preload level n+1
    └─ getLevelConfig(n)     → Get cached level data
}

📁 Storage Schema

localStorage: {
    "game_lives": "10",
    "game_progress": "{\"currentLevelIndex\":0,\"maxUnlockedLevelIndex\":0}"
}

🌐 WeChat Integration

Features Used:
├─ WxSDK.initShare()       → Enable sharing
├─ WxSDK.shareAppMessage() → Share to friend with level query param
├─ WxSDK.vibrateLong()     → 400ms vibration on error
└─ WxSDK.vibrateShort()    → 15ms vibration on click

🔑 Key Files

StorageManager.ts         → Lives & progress persistence
LevelDataManager.ts       → API & image loading
PageLevel.ts              → Main game logic
PageLoading.ts            → App initialization
PassModal.ts              → Victory screen
ViewManager.ts            → Page navigation
WxSDK.ts                  → WeChat APIs

⚙️ Constants

DEFAULT_LIVES               10
MIN_LIVES                   0
LEVEL_TIME_LIMIT            60 seconds
LIFE_PER_HINT               1
LIFE_PER_WIN                1
API_TIMEOUT                 8000ms
API_RETRY_COUNT             2

Game Title                  "写英语" (Write English)
Share Query Format          "level=<levelIndex>"

🚨 No Implementation For:

  • User Authentication (wx.login)
  • Backend Progress Save
  • Ads/Monetization
  • Leaderboards
  • Analytics
  • Premium Life Refills
  • Difficulty Levels

In Summary: Players earn/spend LIVES by unlocking clues (-1 each) or winning levels (+1 each). Progress is saved locally with streak tracking. The economy encourages players to solve without hints to maximize lives.