Files
wx_wherigo/WHERIGO_COMPLETION.md
2026-02-14 09:47:27 +01:00

255 lines
5.9 KiB
Markdown

# Wherigo Completion Log (.gwl)
## Overview
The Wherigo Player can now generate **Completion Logs** in `.gwl` format (Wherigo Game Log), which can be uploaded to **wherigo.com** to prove completion of a cartridge.
## Format
The `.gwl` format is an XML format that contains the following information:
### XML Structure
```xml
<?xml version="1.0" encoding="UTF-8"?>
<WherigoGameLog xmlns="http://www.groundspeak.com/wherigo/1.0">
<Cartridge>
<Name>The Ombos Idol</Name>
<GUID>a1b2c3d4-e5f6-7890-abcd-ef1234567890</GUID>
</Cartridge>
<Player>
<Name>Player</Name>
</Player>
<Session>
<StartTime>2026-02-13T14:30:00</StartTime>
<EndTime>2026-02-13T16:45:00</EndTime>
<Duration>8100</Duration>
</Session>
<CompletionStatus>Complete</CompletionStatus>
<Tasks>
<Task>
<Name>Find the Professor</Name>
<Completed>true</Completed>
<CompletionTime>2026-02-13T15:20:00</CompletionTime>
</Task>
<Task>
<Name>Solve the Puzzle</Name>
<Completed>true</Completed>
<CompletionTime>2026-02-13T16:30:00</CompletionTime>
</Task>
</Tasks>
<ItemsCollected>
<Item>
<Name>Key</Name>
<FoundTime>2026-02-13T15:10:00</FoundTime>
</Item>
<Item>
<Name>Map</Name>
<FoundTime>2026-02-13T15:45:00</FoundTime>
</Item>
</ItemsCollected>
<ZonesVisited>
<Zone>
<Name>Town Square</Name>
<VisitTime>2026-02-13T14:35:00</VisitTime>
</Zone>
<Zone>
<Name>Old Library</Name>
<VisitTime>2026-02-13T15:15:00</VisitTime>
</Zone>
</ZonesVisited>
<CompletionCode>A1B2C3D4E5F67890</CompletionCode>
</WherigoGameLog>
```
## Usage
### In-Game
1. Play and complete cartridge
2. **Menu → Export Completion Log** (Ctrl+E)
3. Save file (e.g., `Cartridge.gwl`)
4. Upload to [wherigo.com](https://www.wherigo.com)
### In Code
```cpp
// Generate completion log
wxGetApp().generateCompletionLog(""); // Auto-Path
// With custom path
wxGetApp().generateCompletionLog("/path/to/completion.gwl");
// Get path
std::string path = wxGetApp().getCompletionLogPath();
```
## What is Captured?
### ✅ Cartridge Information
- Cartridge name
- GUID (unique ID)
### ✅ Player Information
- Player name (default: "Player")
### ✅ Session Data
- Start time (currently: generation timestamp)
- End time (currently: generation timestamp)
- Total duration in seconds
### ✅ Completion Status
- `Complete` - All tasks completed
- `Incomplete` - Tasks still pending
### ✅ Tasks
- Task name
- Status (completed: true/false)
- Completion time (if completed)
### ✅ Collected Items
- Item name
- Collection timestamp
- **Only items in player inventory**
### ✅ Visited Zones
- Zone name
- Visit timestamp
- **Only active zones**
### ✅ Completion Code
- Unique hash/signature code
- Based on: Cartridge GUID + Player name + Completion time
- Format: 16-digit hex code (e.g., `A1B2C3D4E5F67890`)
## Technical Details
### File Path
Default path for completion logs:
- **In the same directory as the GWC file**
- Format: `<GWC-Directory>/<CartridgeName>.gwl`
Example:
- GWC file: `/Users/<name>/Downloads/<CartridgeName>.gwc`
- Completion log: `/Users/<name>/Downloads/<CartridgeName>.gwl`
This allows organizing completion logs together with cartridge files.
### XML Encoding
- UTF-8
- Special characters are escaped: `&`, `<`, `>`, `"`, `'`
### Time Format
- ISO 8601: `YYYY-MM-DDTHH:MM:SS`
- Example: `2026-02-13T16:45:00`
- Local timezone
### Completion Code Generation
```cpp
// Simple hash algorithm (use SHA256 for production)
hash = hash_function(cartridgeGUID + playerName + endTime)
completionCode = sprintf("%016lX", hash)
```
## Limitations
### ⚠️ Session Times
Current start/end times are the **generation timestamp**, not actual playtime. To implement real session tracking:
```cpp
// Save in cApp at start:
m_sessionStartTime = time(nullptr);
// Use at completion:
data.startTime = m_sessionStartTime;
data.endTime = time(nullptr);
data.duration = data.endTime - data.startTime;
```
### ⚠️ Completion Code
The current hash algorithm is simple. For real verification, **SHA256** or similar cryptographic hash should be used.
### ⚠️ Wherigo.com Upload
The generated format follows the Wherigo standard, but actual acceptance on wherigo.com depends on their server-side validation.
## Extensions
### Customize Player Name
```cpp
// Store in cApp/cGameScreen:
std::string m_playerName = "Player";
// Use when generating:
wherigo::WherigoCompletion::generateCompletionLog(L, path, m_playerName);
```
### Session Tracking
```cpp
class cApp {
time_t m_sessionStartTime = 0;
void startGame() {
m_sessionStartTime = time(nullptr);
// ...
}
};
```
### Additional Statistics
The `CompletionData` struct can be extended with:
- Number of dialogs
- Distance traveled
- Hints used
- Failed attempts
### Auto-Export on Completion
```cpp
// In cGameScreen::OnTaskCompleted() or on Complete event
if (allTasksCompleted()) {
wxGetApp().generateCompletionLog("");
wxMessageBox("Congratulations! Completion log automatically created.");
}
```
## Example Workflow
1. **Player plays cartridge**
2. **All tasks completed**
3. **Player exports log:** Menu → Export Completion Log
4. **File saved:** `<CartridgeName>.gwl`
5. **Upload to wherigo.com:**
- Login to wherigo.com
- Navigate to cartridge page
- Click "Log completed cartridge"
- Upload `.gwl` file
- Completion verified and displayed
## Debugging
Enable log output:
```cpp
wxLogMessage("Completion log generated: %s", filePath);
wxLogDebug("Tasks completed: %d/%d", completedCount, totalCount);
```
## Future Features
- [ ] Automatic session time tracking
- [ ] Player name input dialog
- [ ] Screenshot/photo attachments
- [ ] GPS coordinates for visited zones
- [ ] Statistics (distance, time per zone, etc.)
- [ ] Automatic export on completion
- [ ] Cloud upload directly from app
- [ ] Cryptographic completion code (SHA256)