Browse Source
Add RPG combat system with multi-monster battles and server persistence
Add RPG combat system with multi-monster battles and server persistence
Features: - Trail Runner class with 4 skills (Attack, Brand New Hokas, Runner's High, Shin Kick) - Skill level requirements (unlock at levels 1, 2, 3, 5) - Discarded GU monster type with dialogue escalation phases - Multi-monster combat: all entourage monsters join fight simultaneously - Target selection system (click to select enemy) - Sequential monster turns after player action - XP bar in HUD showing progress to next level - Server-side RPG stats persistence (survives cache clear) Technical: - Added rpg_stats table to database - Added GET/PUT /api/user/rpg-stats endpoints - Fixed auth token name mismatch (accessToken vs authToken) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>master
9 changed files with 6871 additions and 1939 deletions
-
4Dockerfile
-
370database.js
-
2docker-compose.yml
-
513docs/RPG_SYSTEM_DESIGN.md
-
810docs/SKILL_MECHANICS.md
-
593docs/TRAIL_RUNNER_SKILLS_FULL.md
-
7780index.html
-
3package.json
-
493server.js
@ -0,0 +1,370 @@ |
|||
const Database = require('better-sqlite3'); |
|||
const bcrypt = require('bcrypt'); |
|||
const path = require('path'); |
|||
|
|||
const BCRYPT_ROUNDS = parseInt(process.env.BCRYPT_ROUNDS) || 12; |
|||
|
|||
class HikeMapDB { |
|||
constructor(dbPath) { |
|||
this.dbPath = dbPath || path.join(__dirname, 'data', 'hikemap.db'); |
|||
this.db = null; |
|||
} |
|||
|
|||
init() { |
|||
this.db = new Database(this.dbPath); |
|||
this.db.pragma('journal_mode = WAL'); |
|||
this.createTables(); |
|||
console.log(`Database initialized at ${this.dbPath}`); |
|||
return this; |
|||
} |
|||
|
|||
createTables() { |
|||
// Users table
|
|||
this.db.exec(`
|
|||
CREATE TABLE IF NOT EXISTS users ( |
|||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
username TEXT UNIQUE NOT NULL, |
|||
email TEXT UNIQUE NOT NULL, |
|||
password_hash TEXT NOT NULL, |
|||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
|||
total_points INTEGER DEFAULT 0, |
|||
finds_count INTEGER DEFAULT 0, |
|||
avatar_icon TEXT DEFAULT 'account', |
|||
avatar_color TEXT DEFAULT '#4CAF50', |
|||
is_admin BOOLEAN DEFAULT 0 |
|||
) |
|||
`);
|
|||
|
|||
// Geocache finds table
|
|||
this.db.exec(`
|
|||
CREATE TABLE IF NOT EXISTS geocache_finds ( |
|||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
user_id INTEGER NOT NULL, |
|||
geocache_id TEXT NOT NULL, |
|||
found_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
|||
points_earned INTEGER NOT NULL, |
|||
is_first_finder BOOLEAN DEFAULT 0, |
|||
FOREIGN KEY (user_id) REFERENCES users(id), |
|||
UNIQUE(user_id, geocache_id) |
|||
) |
|||
`);
|
|||
|
|||
// Refresh tokens table for logout/token invalidation
|
|||
this.db.exec(`
|
|||
CREATE TABLE IF NOT EXISTS refresh_tokens ( |
|||
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
user_id INTEGER NOT NULL, |
|||
token_hash TEXT NOT NULL, |
|||
expires_at DATETIME NOT NULL, |
|||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
|||
FOREIGN KEY (user_id) REFERENCES users(id) |
|||
) |
|||
`);
|
|||
|
|||
// RPG stats table
|
|||
this.db.exec(`
|
|||
CREATE TABLE IF NOT EXISTS rpg_stats ( |
|||
user_id INTEGER PRIMARY KEY, |
|||
class TEXT NOT NULL DEFAULT 'trail_runner', |
|||
level INTEGER DEFAULT 1, |
|||
xp INTEGER DEFAULT 0, |
|||
hp INTEGER DEFAULT 100, |
|||
max_hp INTEGER DEFAULT 100, |
|||
mp INTEGER DEFAULT 50, |
|||
max_mp INTEGER DEFAULT 50, |
|||
atk INTEGER DEFAULT 12, |
|||
def INTEGER DEFAULT 8, |
|||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
|||
FOREIGN KEY (user_id) REFERENCES users(id) |
|||
) |
|||
`);
|
|||
|
|||
// Create indexes for performance
|
|||
this.db.exec(`
|
|||
CREATE INDEX IF NOT EXISTS idx_geocache_finds_user ON geocache_finds(user_id); |
|||
CREATE INDEX IF NOT EXISTS idx_geocache_finds_geocache ON geocache_finds(geocache_id); |
|||
CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user ON refresh_tokens(user_id); |
|||
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username); |
|||
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email); |
|||
`);
|
|||
} |
|||
|
|||
// User methods
|
|||
async createUser(username, email, password) { |
|||
const passwordHash = await bcrypt.hash(password, BCRYPT_ROUNDS); |
|||
|
|||
try { |
|||
const stmt = this.db.prepare(`
|
|||
INSERT INTO users (username, email, password_hash) |
|||
VALUES (?, ?, ?) |
|||
`);
|
|||
const result = stmt.run(username.toLowerCase(), email.toLowerCase(), passwordHash); |
|||
return { id: result.lastInsertRowid, username, email }; |
|||
} catch (err) { |
|||
if (err.code === 'SQLITE_CONSTRAINT_UNIQUE') { |
|||
if (err.message.includes('username')) { |
|||
throw new Error('Username already exists'); |
|||
} |
|||
if (err.message.includes('email')) { |
|||
throw new Error('Email already exists'); |
|||
} |
|||
} |
|||
throw err; |
|||
} |
|||
} |
|||
|
|||
async validateUser(usernameOrEmail, password) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT * FROM users |
|||
WHERE username = ? OR email = ? |
|||
`);
|
|||
const user = stmt.get(usernameOrEmail.toLowerCase(), usernameOrEmail.toLowerCase()); |
|||
|
|||
if (!user) { |
|||
return null; |
|||
} |
|||
|
|||
const valid = await bcrypt.compare(password, user.password_hash); |
|||
if (!valid) { |
|||
return null; |
|||
} |
|||
|
|||
// Don't return password hash
|
|||
const { password_hash, ...safeUser } = user; |
|||
return safeUser; |
|||
} |
|||
|
|||
getUserById(userId) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT id, username, email, created_at, total_points, finds_count, |
|||
avatar_icon, avatar_color, is_admin |
|||
FROM users WHERE id = ? |
|||
`);
|
|||
return stmt.get(userId); |
|||
} |
|||
|
|||
getUserByUsername(username) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT id, username, email, created_at, total_points, finds_count, |
|||
avatar_icon, avatar_color, is_admin |
|||
FROM users WHERE username = ? |
|||
`);
|
|||
return stmt.get(username.toLowerCase()); |
|||
} |
|||
|
|||
updateUserAvatar(userId, icon, color) { |
|||
const stmt = this.db.prepare(`
|
|||
UPDATE users SET avatar_icon = ?, avatar_color = ? |
|||
WHERE id = ? |
|||
`);
|
|||
return stmt.run(icon, color, userId); |
|||
} |
|||
|
|||
setUserAdmin(userId, isAdmin) { |
|||
const stmt = this.db.prepare(`
|
|||
UPDATE users SET is_admin = ? WHERE id = ? |
|||
`);
|
|||
return stmt.run(isAdmin ? 1 : 0, userId); |
|||
} |
|||
|
|||
setUserAdminByUsername(username, isAdmin) { |
|||
const stmt = this.db.prepare(`
|
|||
UPDATE users SET is_admin = ? WHERE username = ? |
|||
`);
|
|||
return stmt.run(isAdmin ? 1 : 0, username.toLowerCase()); |
|||
} |
|||
|
|||
// Geocache find methods
|
|||
recordFind(userId, geocacheId, pointsEarned, isFirstFinder = false) { |
|||
const transaction = this.db.transaction(() => { |
|||
// Insert the find record
|
|||
const insertStmt = this.db.prepare(`
|
|||
INSERT INTO geocache_finds (user_id, geocache_id, points_earned, is_first_finder) |
|||
VALUES (?, ?, ?, ?) |
|||
`);
|
|||
|
|||
try { |
|||
insertStmt.run(userId, geocacheId, pointsEarned, isFirstFinder ? 1 : 0); |
|||
} catch (err) { |
|||
if (err.code === 'SQLITE_CONSTRAINT_UNIQUE') { |
|||
throw new Error('You have already found this geocache'); |
|||
} |
|||
throw err; |
|||
} |
|||
|
|||
// Update user's total points and finds count
|
|||
const updateStmt = this.db.prepare(`
|
|||
UPDATE users |
|||
SET total_points = total_points + ?, |
|||
finds_count = finds_count + 1 |
|||
WHERE id = ? |
|||
`);
|
|||
updateStmt.run(pointsEarned, userId); |
|||
|
|||
return { success: true, pointsEarned }; |
|||
}); |
|||
|
|||
return transaction(); |
|||
} |
|||
|
|||
hasUserFoundGeocache(userId, geocacheId) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT 1 FROM geocache_finds |
|||
WHERE user_id = ? AND geocache_id = ? |
|||
`);
|
|||
return !!stmt.get(userId, geocacheId); |
|||
} |
|||
|
|||
isFirstFinder(geocacheId) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT 1 FROM geocache_finds |
|||
WHERE geocache_id = ? |
|||
LIMIT 1 |
|||
`);
|
|||
return !stmt.get(geocacheId); |
|||
} |
|||
|
|||
getGeocacheFinders(geocacheId) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT u.id, u.username, u.avatar_icon, u.avatar_color, |
|||
gf.found_at, gf.points_earned, gf.is_first_finder |
|||
FROM geocache_finds gf |
|||
JOIN users u ON gf.user_id = u.id |
|||
WHERE gf.geocache_id = ? |
|||
ORDER BY gf.found_at ASC |
|||
`);
|
|||
return stmt.all(geocacheId); |
|||
} |
|||
|
|||
getUserFinds(userId, limit = 50) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT geocache_id, found_at, points_earned, is_first_finder |
|||
FROM geocache_finds |
|||
WHERE user_id = ? |
|||
ORDER BY found_at DESC |
|||
LIMIT ? |
|||
`);
|
|||
return stmt.all(userId, limit); |
|||
} |
|||
|
|||
// Leaderboard methods
|
|||
getLeaderboard(period = 'all', limit = 50) { |
|||
let whereClause = ''; |
|||
|
|||
if (period === 'weekly') { |
|||
whereClause = "WHERE gf.found_at >= datetime('now', '-7 days')"; |
|||
} else if (period === 'monthly') { |
|||
whereClause = "WHERE gf.found_at >= datetime('now', '-30 days')"; |
|||
} |
|||
|
|||
if (period === 'all') { |
|||
// For all-time, use the cached total_points
|
|||
const stmt = this.db.prepare(`
|
|||
SELECT id, username, avatar_icon, avatar_color, total_points, finds_count |
|||
FROM users |
|||
ORDER BY total_points DESC |
|||
LIMIT ? |
|||
`);
|
|||
return stmt.all(limit); |
|||
} else { |
|||
// For weekly/monthly, calculate from finds
|
|||
const stmt = this.db.prepare(`
|
|||
SELECT u.id, u.username, u.avatar_icon, u.avatar_color, |
|||
SUM(gf.points_earned) as total_points, |
|||
COUNT(gf.id) as finds_count |
|||
FROM users u |
|||
JOIN geocache_finds gf ON u.id = gf.user_id |
|||
${whereClause} |
|||
GROUP BY u.id |
|||
ORDER BY total_points DESC |
|||
LIMIT ? |
|||
`);
|
|||
return stmt.all(limit); |
|||
} |
|||
} |
|||
|
|||
// Refresh token methods
|
|||
async storeRefreshToken(userId, tokenHash, expiresAt) { |
|||
const stmt = this.db.prepare(`
|
|||
INSERT INTO refresh_tokens (user_id, token_hash, expires_at) |
|||
VALUES (?, ?, ?) |
|||
`);
|
|||
return stmt.run(userId, tokenHash, expiresAt); |
|||
} |
|||
|
|||
getRefreshToken(tokenHash) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT * FROM refresh_tokens |
|||
WHERE token_hash = ? AND expires_at > datetime('now') |
|||
`);
|
|||
return stmt.get(tokenHash); |
|||
} |
|||
|
|||
deleteRefreshToken(tokenHash) { |
|||
const stmt = this.db.prepare(`
|
|||
DELETE FROM refresh_tokens WHERE token_hash = ? |
|||
`);
|
|||
return stmt.run(tokenHash); |
|||
} |
|||
|
|||
deleteUserRefreshTokens(userId) { |
|||
const stmt = this.db.prepare(`
|
|||
DELETE FROM refresh_tokens WHERE user_id = ? |
|||
`);
|
|||
return stmt.run(userId); |
|||
} |
|||
|
|||
cleanExpiredTokens() { |
|||
const stmt = this.db.prepare(`
|
|||
DELETE FROM refresh_tokens WHERE expires_at <= datetime('now') |
|||
`);
|
|||
return stmt.run(); |
|||
} |
|||
|
|||
// RPG Stats methods
|
|||
getRpgStats(userId) { |
|||
const stmt = this.db.prepare(`
|
|||
SELECT class, level, xp, hp, max_hp, mp, max_mp, atk, def |
|||
FROM rpg_stats WHERE user_id = ? |
|||
`);
|
|||
return stmt.get(userId); |
|||
} |
|||
|
|||
saveRpgStats(userId, stats) { |
|||
const stmt = this.db.prepare(`
|
|||
INSERT INTO rpg_stats (user_id, class, level, xp, hp, max_hp, mp, max_mp, atk, def, updated_at) |
|||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now')) |
|||
ON CONFLICT(user_id) DO UPDATE SET |
|||
class = excluded.class, |
|||
level = excluded.level, |
|||
xp = excluded.xp, |
|||
hp = excluded.hp, |
|||
max_hp = excluded.max_hp, |
|||
mp = excluded.mp, |
|||
max_mp = excluded.max_mp, |
|||
atk = excluded.atk, |
|||
def = excluded.def, |
|||
updated_at = datetime('now') |
|||
`);
|
|||
return stmt.run( |
|||
userId, |
|||
stats.class || 'trail_runner', |
|||
stats.level || 1, |
|||
stats.xp || 0, |
|||
stats.hp || 100, |
|||
stats.maxHp || 100, |
|||
stats.mp || 50, |
|||
stats.maxMp || 50, |
|||
stats.atk || 12, |
|||
stats.def || 8 |
|||
); |
|||
} |
|||
|
|||
close() { |
|||
if (this.db) { |
|||
this.db.close(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
module.exports = HikeMapDB; |
|||
@ -0,0 +1,513 @@ |
|||
# HikeMap RPG System Design |
|||
|
|||
## Overview |
|||
|
|||
Transform the hiking/geocaching experience into a full RPG adventure. Players earn XP by finding geocaches, walking trails, and completing quests. Level up, learn skills, and become the ultimate trail legend. |
|||
|
|||
--- |
|||
|
|||
## Core Stats |
|||
|
|||
| Stat | Description | Base Value | |
|||
|------|-------------|------------| |
|||
| **HP (Hit Points)** | Health/Stamina - depletes from trail hazards, recovers at rest points | 100 | |
|||
| **MP (Mana Points)** | Energy for skills/spells - regenerates over time or at power spots | 50 | |
|||
| **STR (Strength)** | Physical power - affects carrying capacity, climbing ability | 10 | |
|||
| **DEX (Dexterity)** | Agility - affects movement speed bonus, balance on difficult terrain | 10 | |
|||
| **INT (Intelligence)** | Mental acuity - affects puzzle solving, cache finding radius | 10 | |
|||
| **WIS (Wisdom)** | Awareness - affects danger detection, nature knowledge | 10 | |
|||
| **CHA (Charisma)** | Social skills - affects party bonuses, NPC interactions | 10 | |
|||
| **LCK (Luck)** | Fortune - affects rare finds, critical successes | 10 | |
|||
|
|||
### Stat Bonuses by Race/Class |
|||
- Race provides base stat modifiers |
|||
- Class provides growth rate modifiers per level |
|||
|
|||
--- |
|||
|
|||
## Races |
|||
|
|||
### 1. **Granola Elf** (Classic: Elf) |
|||
*"I was hiking this trail before it was on AllTrails."* |
|||
|
|||
Slender, insufferably enlightened beings who have achieved oneness with nature (and won't shut up about it). Often found doing yoga poses at scenic overlooks. |
|||
|
|||
| Stat Modifier | Bonus | |
|||
|---------------|-------| |
|||
| DEX | +3 | |
|||
| WIS | +2 | |
|||
| INT | +1 | |
|||
| STR | -2 | |
|||
|
|||
**Racial Abilities:** |
|||
- **Plant Whisperer** - Can identify edible plants (passive) |
|||
- **Sunrise Attunement** - +20% MP regen before 7 AM |
|||
- **Leave No Trace** - Invisible to park rangers when breaking minor rules |
|||
|
|||
--- |
|||
|
|||
### 2. **Craft Dwarf** (Classic: Dwarf) |
|||
*"I brewed this IPA at 8,000 feet elevation."* |
|||
|
|||
Stout, bearded enthusiasts of artisanal everything. They carry way too much gear and have strong opinions about hiking boot brands. Their backpacks weigh 60 lbs but they don't complain. |
|||
|
|||
| Stat Modifier | Bonus | |
|||
|---------------|-------| |
|||
| STR | +3 | |
|||
| CON | +2 | |
|||
| WIS | +1 | |
|||
| DEX | -2 | |
|||
|
|||
**Racial Abilities:** |
|||
- **Gear Hoarder** - +50% carrying capacity |
|||
- **Beard of Warmth** - Immune to cold weather penalties |
|||
- **Craft Appreciation** - Can identify quality of any handmade item |
|||
|
|||
--- |
|||
|
|||
### 3. **Crossfit Orc** (Classic: Orc) |
|||
*"BRO, this incline is NOTHING. I did 400 box jumps this morning."* |
|||
|
|||
Massive, protein-shake-fueled creatures who treat every hike as a workout. They wear sleeveless shirts in 40-degree weather and grunt loudly when passing other hikers. |
|||
|
|||
| Stat Modifier | Bonus | |
|||
|---------------|-------| |
|||
| STR | +4 | |
|||
| CON | +2 | |
|||
| INT | -2 | |
|||
| CHA | -1 | |
|||
|
|||
**Racial Abilities:** |
|||
- **BEAST MODE** - Can sprint uphill without stamina penalty (1/day) |
|||
- **Protein Synthesis** - HP regenerates 2x faster when eating |
|||
- **Intimidating Presence** - Wildlife gives you a wider berth |
|||
|
|||
--- |
|||
|
|||
### 4. **Snackling** (Classic: Halfling) |
|||
*"Are we there yet? I brought seventeen different kinds of trail mix."* |
|||
|
|||
Small, perpetually hungry folk whose backpacks are 90% snacks by volume. They have an uncanny ability to find the comfiest sitting rocks and know exactly when it's snack time (always). |
|||
|
|||
| Stat Modifier | Bonus | |
|||
|---------------|-------| |
|||
| LCK | +3 | |
|||
| DEX | +2 | |
|||
| CHA | +1 | |
|||
| STR | -3 | |
|||
|
|||
**Racial Abilities:** |
|||
- **Snack Sense** - Can locate nearby food sources |
|||
- **Smol & Sneaky** - +20% stealth, can fit through small spaces |
|||
- **Second Breakfast** - Gains bonus HP from food items |
|||
|
|||
--- |
|||
|
|||
### 5. **Basic Human** (Classic: Human) |
|||
*"I saw this trail on TikTok!"* |
|||
|
|||
The most common species on trails. They come in all varieties but share a tendency to be unprepared, wear cotton in the rain, and play music from phone speakers. |
|||
|
|||
| Stat Modifier | Bonus | |
|||
|---------------|-------| |
|||
| All stats | +1 | |
|||
|
|||
**Racial Abilities:** |
|||
- **Adaptable** - Can learn skills from any class tree |
|||
- **Main Character Energy** - +10% XP from all sources |
|||
- **Phone Battery Anxiety** - Gains speed boost when phone is below 20% |
|||
|
|||
--- |
|||
|
|||
### 6. **Tech Gnome** (Classic: Gnome) |
|||
*"According to my Garmin, Strava, AllTrails, AND my Apple Watch..."* |
|||
|
|||
Tiny beings obsessed with gadgets, metrics, and optimization. They can't enjoy a hike without knowing their exact heart rate, elevation gain, and estimated calorie burn. |
|||
|
|||
| Stat Modifier | Bonus | |
|||
|---------------|-------| |
|||
| INT | +4 | |
|||
| LCK | +1 | |
|||
| STR | -2 | |
|||
| WIS | -1 | |
|||
|
|||
**Racial Abilities:** |
|||
- **Data Overload** - Access to detailed trail statistics |
|||
- **Battery Wizard** - Devices drain 50% slower |
|||
- **Analysis Paralysis** - Can reroll any failed skill check (1/day) |
|||
|
|||
--- |
|||
|
|||
## Classes |
|||
|
|||
### 1. **Trail Runner** (Classic: Warrior/Fighter) |
|||
*"I'll meet you at the summit. I'm going to run up and back twice first."* |
|||
|
|||
Elite athletes who view hiking as "too slow." They carry nothing but a hydration vest and have mastered the art of endurance. The Trail Runner excels at stamina management, pushing through adverse conditions, and maintaining peak performance over long distances. |
|||
|
|||
**Primary Stats:** STR, CON |
|||
**HP per Level:** +12 |
|||
**MP per Level:** +3 |
|||
|
|||
#### Trail Runner Skills |
|||
|
|||
--- |
|||
|
|||
**Level 1: Second Wind** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | 15 | |
|||
| **Cooldown** | 30 minutes | |
|||
| **Type** | Active - Self | |
|||
|
|||
*"Just gotta catch my breath..."* |
|||
|
|||
Instantly restore 25% of your maximum HP. Can be used while moving. The quintessential runner's recovery - that moment when your body remembers it's actually capable of continuing. |
|||
|
|||
**Effect:** +25% Max HP restored instantly |
|||
|
|||
--- |
|||
|
|||
**Level 2: Steady Pace** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | Passive | |
|||
| **Cooldown** | - | |
|||
| **Type** | Passive | |
|||
|
|||
*"It's not about how fast you go, it's about not stopping."* |
|||
|
|||
Your efficient movement style reduces stamina drain from all activities. You've learned that consistency beats intensity on the long trails. |
|||
|
|||
**Effect:** -15% HP drain from distance traveled and terrain penalties |
|||
|
|||
--- |
|||
|
|||
**Level 3: Trail Legs** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | 10 | |
|||
| **Cooldown** | 10 minutes | |
|||
| **Type** | Active - Self | |
|||
| **Duration** | 20 minutes | |
|||
|
|||
*"Mud? Rocks? Roots? My legs don't care."* |
|||
|
|||
Your legs have seen every type of terrain and laughed. Activate to ignore movement penalties from difficult terrain (mud, steep inclines, rocky paths, stream crossings). |
|||
|
|||
**Effect:** Ignore terrain difficulty penalties for duration |
|||
|
|||
--- |
|||
|
|||
**Level 4: Push Through** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | 20 | |
|||
| **Cooldown** | 45 minutes | |
|||
| **Type** | Active - Self | |
|||
| **Duration** | 15 minutes | |
|||
|
|||
*"Pain is just weakness leaving the body. Or an injury. Probably fine though."* |
|||
|
|||
Temporarily suppress one negative status effect (Exhausted, Blistered, Hangry, etc.). The effect returns after duration if not otherwise cured. Mind over matter - at least temporarily. |
|||
|
|||
**Effect:** Suppress one negative status effect for duration |
|||
|
|||
--- |
|||
|
|||
**Level 5: Elevation Crusher** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | Passive | |
|||
| **Cooldown** | - | |
|||
| **Type** | Passive | |
|||
|
|||
*"Flat trails are just lazy mountains."* |
|||
|
|||
You've developed a strange love for climbing. Gain bonus XP for elevation gain and take reduced stamina damage from uphill travel. |
|||
|
|||
**Effect:** |
|||
- +25% XP bonus for elevation gained |
|||
- -20% HP drain from climbing/elevation gain |
|||
|
|||
--- |
|||
|
|||
**Level 6: Recovery Stride** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | 8 | |
|||
| **Cooldown** | 5 minutes | |
|||
| **Type** | Active - Self | |
|||
| **Duration** | 10 minutes | |
|||
|
|||
*"I don't need to stop to rest. Resting is just slow walking."* |
|||
|
|||
Enter a recovery state while continuing to move. Regenerate HP gradually over the duration. Cannot be used while stationary (that's just regular resting, and Trail Runners don't do that). |
|||
|
|||
**Effect:** Regenerate 3% Max HP per minute while moving |
|||
|
|||
--- |
|||
|
|||
**Level 7: Iron Will** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | Passive | |
|||
| **Cooldown** | - | |
|||
| **Type** | Passive | |
|||
|
|||
*"I've run 50 miles on a sprained ankle. Your 'exhaustion' means nothing to me."* |
|||
|
|||
Your mental fortitude provides resistance to exhaustion and fatigue-based status effects. Exhaustion effects are reduced and take longer to apply. |
|||
|
|||
**Effect:** |
|||
- 50% resistance to Exhaustion status |
|||
- Exhaustion threshold increased by 25% |
|||
|
|||
--- |
|||
|
|||
**Level 8: Marathoner's Resolve** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | 25 | |
|||
| **Cooldown** | 2 hours | |
|||
| **Type** | Active - Self | |
|||
| **Duration** | 1 hour | |
|||
|
|||
*"Mile 20 is where the real race begins."* |
|||
|
|||
Enter a state of focused endurance. For the duration, you gain significant bonuses to stamina management and cannot be reduced below 1 HP by gradual drain effects (you can still be knocked out by sudden damage/events). |
|||
|
|||
**Effect:** |
|||
- -50% HP drain from all sources |
|||
- Cannot be reduced below 1 HP by passive drain |
|||
- +10% XP from distance traveled |
|||
|
|||
--- |
|||
|
|||
**Level 9: Trailblazer's Instinct** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | 30 | |
|||
| **Cooldown** | 1 hour | |
|||
| **Type** | Active - Self | |
|||
| **Duration** | 30 minutes | |
|||
|
|||
*"The map says it's 3 miles. I know a better way."* |
|||
|
|||
Your extensive trail experience lets you identify optimal routes. Activate to reduce the required distance to reach nearby objectives (geocaches, waypoints, quest targets) by finding more efficient paths. |
|||
|
|||
**Effect:** |
|||
- Required distance to objectives within 1km reduced by 20% |
|||
- Reveals any hidden shortcuts in the area |
|||
|
|||
--- |
|||
|
|||
**Level 10: Unstoppable** |
|||
| | | |
|||
|---|---| |
|||
| **MP Cost** | 50 | |
|||
| **Cooldown** | 4 hours | |
|||
| **Type** | Active - Self | |
|||
| **Duration** | 30 minutes | |
|||
|
|||
*"I am become endurance, destroyer of trails."* |
|||
|
|||
The ultimate expression of the Trail Runner's philosophy. For the duration, you become a force of nature - immune to negative status effects, ignoring all terrain penalties, and gaining enhanced regeneration. |
|||
|
|||
**Effect:** |
|||
- Immune to all negative status effects |
|||
- Ignore all terrain penalties |
|||
- +5% HP regeneration per minute |
|||
- +50% XP from all sources |
|||
- Party members within range gain +25% of these bonuses |
|||
|
|||
--- |
|||
|
|||
### 2. **App Wizard** (Classic: Mage) |
|||
*"Hold on, I'm optimizing our route using three different algorithms."* |
|||
|
|||
Tech-savvy magic users who bend reality through the power of apps, gadgets, and strong WiFi signals. Their spells require battery life instead of mystical energy. |
|||
|
|||
**Primary Stats:** INT, WIS |
|||
**HP per Level:** +6 |
|||
**MP per Level:** +15 |
|||
|
|||
**Skills:** |
|||
| Level | Skill | MP Cost | Description | |
|||
|-------|-------|---------|-------------| |
|||
| 1 | **GPS Ping** | 5 | Reveal exact location + nearby POIs | |
|||
| 3 | **Cache Sense** | 15 | Highlight all geocaches within 500m | |
|||
| 5 | **Signal Boost** | 20 | Get cell service anywhere for 10 min | |
|||
| 8 | **Satellite View** | 35 | Bird's eye view of surrounding area | |
|||
| 12 | **Digital Omniscience** | 60 | Reveal all hidden objects on map | |
|||
|
|||
--- |
|||
|
|||
### 3. **Urban Explorer** (Classic: Rogue) |
|||
*"The sign says 'No Trespassing' but it doesn't say 'No Exploring.'"* |
|||
|
|||
Sneaky adventurers who find paths where none exist. They know every shortcut, secret entrance, and technically-not-illegal way to access restricted areas. |
|||
|
|||
**Primary Stats:** DEX, LCK |
|||
**HP per Level:** +8 |
|||
**MP per Level:** +8 |
|||
|
|||
**Skills:** |
|||
| Level | Skill | MP Cost | Description | |
|||
|-------|-------|---------|-------------| |
|||
| 1 | **Sneak** | 5 | Become undetectable for 1 minute | |
|||
| 3 | **Lockpick** | 10 | Open locked gates/caches | |
|||
| 5 | **Shortcut Finder** | 15 | Reveal hidden paths | |
|||
| 8 | **Urban Camo** | 25 | Blend into any environment | |
|||
| 12 | **Ghost Protocol** | 45 | Pass through barriers, leave no trace | |
|||
|
|||
--- |
|||
|
|||
### 4. **Wellness Cleric** (Classic: Cleric/Healer) |
|||
*"Have you tried putting crystals in your water bottle? It's life-changing."* |
|||
|
|||
Healers who draw power from essential oils, positive vibes, and an unshakeable belief in their own wellness journey. They can cure ailments but will also tell you about their gut health. |
|||
|
|||
**Primary Stats:** WIS, CHA |
|||
**HP per Level:** +8 |
|||
**MP per Level:** +12 |
|||
|
|||
**Skills:** |
|||
| Level | Skill | MP Cost | Description | |
|||
|-------|-------|---------|-------------| |
|||
| 1 | **Good Vibes** | 5 | Heal party for 15 HP | |
|||
| 3 | **Essential Blessing** | 10 | Remove one negative status effect | |
|||
| 5 | **Meditation Circle** | 20 | Full party MP restore while resting | |
|||
| 8 | **Crystal Resonance** | 30 | Party-wide stat buff for 30 min | |
|||
| 12 | **Enlightenment** | 50 | Full heal + resurrect party member | |
|||
|
|||
--- |
|||
|
|||
### 5. **Bird Watcher Ranger** (Classic: Ranger) |
|||
*"EVERYONE STOP. I think I see a Yellow-Bellied Sapsucker."* |
|||
|
|||
Nature specialists who know every bird call, animal track, and plant species. They will stop the entire group to look at something you can't see, and get unreasonably excited about it. |
|||
|
|||
**Primary Stats:** WIS, DEX |
|||
**HP per Level:** +10 |
|||
**MP per Level:** +8 |
|||
|
|||
**Skills:** |
|||
| Level | Skill | MP Cost | Description | |
|||
|-------|-------|---------|-------------| |
|||
| 1 | **Wildlife Spot** | 5 | Detect nearby animals | |
|||
| 3 | **Nature's Ally** | 15 | Befriend a wild animal temporarily | |
|||
| 5 | **Camouflage** | 15 | Party becomes invisible to wildlife | |
|||
| 8 | **Apex Knowledge** | 25 | Know all hazards in area | |
|||
| 12 | **Call of the Wild** | 40 | Summon animal companion | |
|||
|
|||
--- |
|||
|
|||
### 6. **Trail Bard** (Classic: Bard) |
|||
*"This is going to get SO many views. Make sure you're in the background looking natural."* |
|||
|
|||
Content creators who document every moment of every adventure. They provide buffs through encouragement and debuffs to enemies through cringe-worthy commentary. |
|||
|
|||
**Primary Stats:** CHA, LCK |
|||
**HP per Level:** +7 |
|||
**MP per Level:** +10 |
|||
|
|||
**Skills:** |
|||
| Level | Skill | MP Cost | Description | |
|||
|-------|-------|---------|-------------| |
|||
| 1 | **Hype Up** | 5 | Boost party morale (+10% all stats) | |
|||
| 3 | **Viral Moment** | 15 | Capture perfect photo for bonus XP | |
|||
| 5 | **Podcast Mode** | 20 | Talk so much enemies flee in confusion | |
|||
| 8 | **Influencer Aura** | 30 | Attract followers, gain helpers | |
|||
| 12 | **Main Character Moment** | 50 | Dramatic scene - massive party buff | |
|||
|
|||
--- |
|||
|
|||
## Experience & Leveling |
|||
|
|||
### XP Sources |
|||
| Activity | XP Reward | |
|||
|----------|-----------| |
|||
| Find geocache (Easy) | 50 XP | |
|||
| Find geocache (Medium) | 100 XP | |
|||
| Find geocache (Hard) | 200 XP | |
|||
| First finder bonus | +50% XP | |
|||
| Complete trail | Distance × 10 XP | |
|||
| Discover new area | 150 XP | |
|||
| Daily login | 25 XP | |
|||
| Party activities | Shared XP pool | |
|||
|
|||
### Level Thresholds |
|||
| Level | Total XP | Title | |
|||
|-------|----------|-------| |
|||
| 1 | 0 | Trailhead Newbie | |
|||
| 2 | 100 | Path Finder | |
|||
| 3 | 300 | Trail Walker | |
|||
| 4 | 600 | Ridge Runner | |
|||
| 5 | 1,000 | Summit Seeker | |
|||
| 10 | 5,000 | Mountain Maven | |
|||
| 15 | 15,000 | Wilderness Wanderer | |
|||
| 20 | 35,000 | Legendary Explorer | |
|||
| 25 | 75,000 | Trail Demigod | |
|||
| 30 | 150,000 | Nature's Champion | |
|||
|
|||
--- |
|||
|
|||
## Status Effects |
|||
|
|||
### Positive |
|||
| Effect | Description | Duration | |
|||
|--------|-------------|----------| |
|||
| **Well-Rested** | +20% HP/MP regen | 2 hours | |
|||
| **Caffeinated** | +15% movement speed | 30 min | |
|||
| **Snacked** | +10 HP regen/min | 15 min | |
|||
| **Inspired** | +25% XP gain | 1 hour | |
|||
| **Group Synergy** | +5% all stats per party member | While in party | |
|||
|
|||
### Negative |
|||
| Effect | Description | Duration | |
|||
|--------|-------------|----------| |
|||
| **Exhausted** | -30% movement speed, -20% HP | Until rest | |
|||
| **Lost** | No map visibility | Until found | |
|||
| **Hangry** | -20% all stats | Until fed | |
|||
| **Blistered** | -50% movement speed | Until healed | |
|||
| **Doomscrolling** | MP drain, can't focus | Until phone put away | |
|||
|
|||
--- |
|||
|
|||
## Party System |
|||
|
|||
- Maximum party size: 6 players |
|||
- Shared XP for nearby activities |
|||
- Party chat and location sharing |
|||
- Combo skills require multiple party members |
|||
- Party roles: Leader (sets destination), Scout (reveals ahead), Support (heals) |
|||
|
|||
--- |
|||
|
|||
## Future Considerations |
|||
|
|||
- [ ] Crafting system (trail snacks, gear upgrades) |
|||
- [ ] Guild/Club system |
|||
- [ ] Seasonal events & limited quests |
|||
- [ ] PvP trail races |
|||
- [ ] Boss encounters (legendary geocaches) |
|||
- [ ] Achievement system |
|||
- [ ] Cosmetic rewards (trail badges, hat skins) |
|||
- [ ] Pet companions |
|||
|
|||
--- |
|||
|
|||
## Questions to Resolve |
|||
|
|||
1. How does HP actually work? Does it deplete over time/distance, or only from events? |
|||
2. Should mana regenerate passively or only at specific locations? |
|||
3. How do we handle PvP interactions (if any)? |
|||
4. Do we want equipment/inventory systems? |
|||
5. Should class abilities be unlocked linearly or allow choice? |
|||
6. Balance: How powerful should racial abilities be vs class abilities? |
|||
|
|||
--- |
|||
|
|||
*Document Version: 0.1* |
|||
*Last Updated: January 2026* |
|||
@ -0,0 +1,810 @@ |
|||
# Skill Mechanics - Detailed Design |
|||
|
|||
## Core Design Principles |
|||
|
|||
1. **Walking is NEVER punished** - No HP drain from travel. Hiking should be rewarded, not penalized. |
|||
2. **Combat is optional and asynchronous** - Monsters queue up during your hike, fight them when convenient. |
|||
3. **Turn-based battles** - Classic RPG style combat when you choose to engage. |
|||
4. **Skills alternate** - Offensive skills on odd levels, Utility/Defensive on even levels. |
|||
|
|||
--- |
|||
|
|||
## Combat System Overview |
|||
|
|||
### Monster Encounters |
|||
|
|||
While hiking, you may randomly encounter monsters based on: |
|||
- Location (different biomes spawn different monsters) |
|||
- Time of day (nocturnal creatures at night) |
|||
- Trail difficulty |
|||
- Player level (scaled encounters) |
|||
|
|||
### The Monster Entourage |
|||
|
|||
When you encounter a monster and don't want to fight, **it follows you around on the map**, yelling insults and taunts at you until you deal with it. |
|||
|
|||
**Maximum followers:** 2 monsters per player level |
|||
- Level 1 player: Max 2 monsters following |
|||
- Level 5 player: Max 10 monsters following |
|||
- Level 10 player: Max 20 monsters following |
|||
|
|||
If you're at max capacity, new monsters can't spawn until you fight or dismiss some. |
|||
|
|||
**Map Display:** |
|||
``` |
|||
🐺 "FIGHT ME COWARD!" |
|||
🦇 "I'LL GET YOU!" 🧭 You |
|||
🌿 "COME BACK HERE!" ↓ |
|||
[===trail===] |
|||
``` |
|||
|
|||
**Monster Taunts (examples):** |
|||
- 🐺 Trail Wolf: "I've been chasing you for 2 MILES!" |
|||
- 🦇 Cave Bat: "You can't ignore me forever!" |
|||
- 🌿 Angry Shrub: "I'm a BUSH and I'm faster than you!" |
|||
- 🐗 Wild Boar: "My legs are getting tired but my RAGE isn't!" |
|||
- 🦎 Trail Lizard: "This is embarrassing for both of us!" |
|||
|
|||
**Interacting with followers:** |
|||
- Tap a monster icon to start combat with just that one |
|||
- "Fight All" button for sequential battles |
|||
- "Dismiss" to shoo them away (no XP, no penalty) |
|||
- Monsters stay between sessions (persistent) |
|||
|
|||
**Comedy escalation:** |
|||
- Monsters following for 10+ min: Taunts get more desperate |
|||
- Monsters following for 30+ min: Start complimenting you instead |
|||
- Monsters following for 1+ hour: Existential crisis dialogue |
|||
|
|||
### Turn-Based Combat |
|||
|
|||
When you choose to fight: |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ │ |
|||
│ 🐺 Trail Wolf │ |
|||
│ HP: ████████░░ 45/60 │ |
|||
│ │ |
|||
│ ───────────────────────── │ |
|||
│ │ |
|||
│ 🏃 You (Trail Runner Lv 3) │ |
|||
│ HP: ██████████ 100/100 │ |
|||
│ MP: ████████░░ 40/50 │ |
|||
│ │ |
|||
├───────────────────────────────┤ |
|||
│ [⚔️ Attack] [🔥 Double Strike] │ |
|||
│ [🎒 Items ] [🏃 Flee ] │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Combat Flow:** |
|||
1. Player turn: Choose action |
|||
2. Action resolves |
|||
3. Enemy turn: Enemy attacks |
|||
4. Repeat until someone hits 0 HP |
|||
|
|||
**Victory:** Gain XP, possible loot drops |
|||
**Defeat:** Lose some gold? Lose queued monsters? (TBD - should be minor) |
|||
|
|||
--- |
|||
|
|||
## HP System (Revised) |
|||
|
|||
### HP is for COMBAT only |
|||
|
|||
- HP does NOT drain from walking |
|||
- HP only changes during battle, skills, or items |
|||
- **HP persists between battles** - adds strategy to combat decisions |
|||
|
|||
### HP Recovery (Out of Combat) |
|||
|
|||
| Method | Recovery | Notes | |
|||
|--------|----------|-------| |
|||
| Time (passive) | 1 HP per minute | Slow but free | |
|||
| Rest at geocache | 5 HP per minute | Must be stationary at location | |
|||
| Food items | Varies | Snacks, trail mix, etc. | |
|||
| Healing skills | Varies | Class abilities | |
|||
| Level up | Full restore | Reward for leveling | |
|||
|
|||
### What Happens at 0 HP? |
|||
|
|||
**In Battle:** |
|||
- You lose the fight |
|||
- Monster escapes (gets dismissed, no XP) |
|||
- You're left at 1 HP (can't die, just knocked out of that fight) |
|||
- Any remaining monsters in your entourage keep following you |
|||
|
|||
**Strategic Implications:** |
|||
- Can't just chain-fight 20 monsters - need to manage HP |
|||
- Healing skills become valuable between fights |
|||
- Might need to dismiss some monsters if HP is low |
|||
- Adds tension: "Can I take one more fight before resting?" |
|||
|
|||
--- |
|||
|
|||
## Skill Leveling System |
|||
|
|||
Skills have their own level that improves with use! This is separate from your character level. |
|||
|
|||
### How Skills Level Up |
|||
|
|||
**XP per skill:** Each time you use a skill, it gains Skill XP |
|||
- Using a skill in combat: +10 Skill XP |
|||
- Skill contributes to victory: +5 bonus Skill XP |
|||
- Using skill effectively (e.g., heal when low HP): +5 bonus Skill XP |
|||
|
|||
**Skill XP thresholds:** |
|||
| Skill Level | Total XP Needed | |
|||
|-------------|-----------------| |
|||
| 1 | 0 (starting) | |
|||
| 2 | 50 | |
|||
| 3 | 150 | |
|||
| 4 | 300 | |
|||
| 5 | 500 | |
|||
| 6 | 800 | |
|||
| 7 | 1200 | |
|||
| 8+ | +500 per level | |
|||
|
|||
### What Skill Levels Do |
|||
|
|||
Each skill defines its own leveling bonuses. Common patterns: |
|||
- **Cooldown reduction** - Use more often |
|||
- **Damage/healing increase** - More powerful |
|||
- **MP cost reduction** - More efficient |
|||
- **Additional effects** - New mechanics unlock |
|||
|
|||
--- |
|||
|
|||
## Trail Runner Skills (Revised) |
|||
|
|||
**Skill Pattern:** Odd levels = Offensive, Even levels = Utility/Defensive |
|||
|
|||
**Class Identity:** Gear snob, endurance athlete, trail obsessed, owns $200 shoes, has opinions about hydration vests |
|||
|
|||
| Level | Skill | Type | Flavor | |
|||
|-------|-------|------|--------| |
|||
| 1 | Brand New Hokas | ⚔️ Offensive | Lightning fast double-strike in premium footwear | |
|||
| 2 | Runner's High | 💚 Utility | Endorphins are nature's healing | |
|||
| 3 | Shin Kick | ⚔️ Offensive | Targets the most painful spot | |
|||
| 4 | Gel Pack | 💚 Utility | Disgusting but effective energy boost | |
|||
| 5 | Pole Vault | ⚔️ Offensive | Trekking pole to the FACE | |
|||
| 6 | Foam Roll | 💚 Utility | Painful recovery that actually works | |
|||
| 7 | Downhill Bomb | ⚔️ Offensive | Reckless descending attack | |
|||
| 8 | Aid Station | 💚 Utility | Full rest stop recovery | |
|||
| 9 | Final Kick | ⚔️ Offensive | That sprint finish energy | |
|||
| 10 | Hundred Miler | 🌟 Ultimate | You simply refuse to stop | |
|||
|
|||
--- |
|||
|
|||
### Reserved for Gym Bro (Barbarian) class: |
|||
- Rep It Out |
|||
- PR Attempt |
|||
- Beast Mode |
|||
- Protein Shake |
|||
- Max Effort |
|||
- Drop Set |
|||
- Pre-Workout |
|||
- Spot Me Bro |
|||
|
|||
--- |
|||
|
|||
## Level 1: Brand New Hokas ⚔️ |
|||
|
|||
### The Skill |
|||
``` |
|||
Name: Brand New Hokas |
|||
Type: Offensive |
|||
MP Cost: 12 (reduces with skill level) |
|||
Cooldown: None (usable every turn) |
|||
Effect: Attack twice in a single turn |
|||
``` |
|||
|
|||
*"These cost $180 and they're worth EVERY PENNY."* |
|||
|
|||
The Trail Runner's premium cushioned footwear allows for lightning-fast strikes. Two rapid kicks delivered with the confidence that only expensive gear can provide. |
|||
|
|||
### Skill Leveling Progression |
|||
|
|||
Brand New Hokas improves its damage and efficiency as you level it: |
|||
|
|||
| Skill Level | Damage per Hit | MP Cost | Total vs Normal Attack | |
|||
|-------------|---------------|---------|------------------------| |
|||
| 1 | 80% | 12 | 160% damage | |
|||
| 2 | 82% | 12 | 164% damage | |
|||
| 3 | 85% | 11 | 170% damage | |
|||
| 4 | 87% | 11 | 174% damage | |
|||
| 5 | 90% | 10 | 180% damage | |
|||
| 6 | 92% | 10 | 184% damage | |
|||
| 7 | 95% | 9 | 190% damage | |
|||
| 8 | 97% | 9 | 194% damage | |
|||
| 9 | 100% | 8 | 200% damage (two full attacks!) | |
|||
| 10+ | 100% + crit bonus | 8 | 200%+ with +5% crit chance per level | |
|||
|
|||
**Milestone unlocks:** |
|||
- **Level 5:** "Swift Strikes" - Animation speeds up (QoL) |
|||
- **Level 9:** "True Double" - Each hit deals full damage |
|||
- **Level 10:** "Relentless" - +5% critical hit chance per level beyond 10 |
|||
|
|||
### Combat Mechanics |
|||
|
|||
**Base Attack Damage Formula:** |
|||
``` |
|||
Damage = (STR × 2) + WeaponDamage + RandomVariance(0 to STR/2) |
|||
``` |
|||
|
|||
For a Level 1 Trail Runner with 12 STR and no weapon: |
|||
- Base Attack: (12 × 2) + 0 + (0-6) = 24-30 damage |
|||
|
|||
**Double Strike at Skill Level 1:** |
|||
- Hit 1: 80% of base = 19-24 damage |
|||
- Hit 2: 80% of base = 19-24 damage |
|||
- Total: 38-48 damage (vs 24-30 from normal attack) |
|||
|
|||
**Double Strike at Skill Level 9:** |
|||
- Hit 1: 100% of base = 24-30 damage |
|||
- Hit 2: 100% of base = 24-30 damage |
|||
- Total: 48-60 damage for only 8 MP! |
|||
|
|||
### How It Works In-Game |
|||
|
|||
**Scenario:** Battle against a Trail Wolf (45 HP) |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ 🐺 Trail Wolf │ |
|||
│ HP: ████████░░ 45/45 │ |
|||
│ │ |
|||
│ 🏃 You │ |
|||
│ HP: ██████████ 100/100 │ |
|||
│ MP: ██████████ 50/50 │ |
|||
├───────────────────────────────┤ |
|||
│ [⚔️ Attack] [⚔️⚔️ Double Strike] │ |
|||
│ [🎒 Items ] [🏃 Flee ] │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Player selects Double Strike:** |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ │ |
|||
│ ⚔️ Double Strike! │ |
|||
│ │ |
|||
│ 💥 Hit 1: 21 damage! │ |
|||
│ 💥 Hit 2: 19 damage! │ |
|||
│ │ |
|||
│ 🐺 Trail Wolf │ |
|||
│ HP: █░░░░░░░░░ 5/45 │ |
|||
│ │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Enemy turn follows, then back to player...** |
|||
|
|||
### Why This Skill is Good for Level 1 |
|||
|
|||
1. **Simple to understand** - "Attack twice" is intuitive |
|||
2. **Immediately useful** - Works in first battle |
|||
3. **Teaches MP management** - Can't spam it forever |
|||
4. **Fighter identity** - Establishes Trail Runner as damage dealer |
|||
|
|||
### Edge Cases |
|||
|
|||
- **Not enough MP?** Skill greyed out, tooltip shows "Need 12 MP" |
|||
- **Can both hits crit?** Yes, each hit rolls independently |
|||
- **Can enemy die on first hit?** Yes, second hit is wasted (no overkill bonus) |
|||
|
|||
--- |
|||
|
|||
## Level 2: Runner's High 💚 |
|||
|
|||
### The Skill |
|||
``` |
|||
Name: Runner's High |
|||
Type: Utility (Healing) |
|||
MP Cost: 15 |
|||
Cooldown: Battle-based (improves with Skill Level) |
|||
Effect: Restore 30% of maximum HP |
|||
``` |
|||
|
|||
*"Around mile 8, something magical happens... the pain becomes pleasure."* |
|||
|
|||
The Trail Runner taps into that euphoric state where endorphins flood the system and everything feels possible. Pain melts away, replaced by a serene confidence. |
|||
|
|||
### Skill Leveling Progression |
|||
|
|||
Runner's High cooldown is based on **number of battles**, and improves as you level the skill: |
|||
|
|||
| Skill Level | Cooldown | In Practice | |
|||
|-------------|----------|-------------| |
|||
| 1 | Once per 5 battles | Very limited, save for emergencies | |
|||
| 2 | Once per 4 battles | Slightly more available | |
|||
| 3 | Once per 3 battles | Every third fight | |
|||
| 4 | Once per 2 battles | Every other fight | |
|||
| 5 | Once per battle | Reliable, use every fight | |
|||
| 6 | Twice per battle | Now we're cooking | |
|||
| 7 | Three times per battle | Significant sustain | |
|||
| 8+ | +1 use per level | Approaching immortality | |
|||
|
|||
**Cooldown Tracking:** |
|||
``` |
|||
Skill Level 1: [✓ Used] [░ 4 battles left] [░] [░] [░] |
|||
Skill Level 5: [✓ Used] [Ready next battle!] |
|||
Skill Level 7: [✓ Used] [✓ Used] [░ Available] |
|||
``` |
|||
|
|||
### Combat Mechanics |
|||
|
|||
For a player with 100 max HP: |
|||
- Runner's High restores 30 HP (scales slightly with skill level) |
|||
- Healing increases with skill level: |
|||
|
|||
| Skill Level | HP Restored | |
|||
|-------------|-------------| |
|||
| 1-3 | 30% max HP | |
|||
| 4-5 | 35% max HP | |
|||
| 6-7 | 40% max HP | |
|||
| 8+ | 45% max HP | |
|||
|
|||
### How It Works In-Game |
|||
|
|||
**Scenario:** Mid-battle, you've taken some hits. Runner's High is available (cooldown ready). |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ 🐺 Trail Wolf │ |
|||
│ HP: ██░░░░░░░░ 12/45 │ |
|||
│ │ |
|||
│ 🏃 You │ |
|||
│ HP: ████░░░░░░ 42/100 │ ← Hurting! |
|||
│ MP: ██████░░░░ 30/50 │ |
|||
├───────────────────────────────┤ |
|||
│ [⚔️ Attack ] [👟 New Hokas ] │ |
|||
│ [🏃♂️ Runner's High] [🚪 Flee ] │ |
|||
│ Lv.3 (1/1) │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Player selects Runner's High:** |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ │ |
|||
│ 🏃♂️ RUNNER'S HIGH! │ |
|||
│ │ |
|||
│ *Breathes rhythmically* │ |
|||
│ *Zones out completely* │ |
|||
│ *Achieves flow state* │ |
|||
│ │ |
|||
│ ✨ Recovered 30 HP! │ |
|||
│ │ |
|||
│ 🏃 You │ |
|||
│ HP: ███████░░░ 72/100 │ ← The endorphins are REAL |
|||
│ MP: ████░░░░░░ 15/50 │ |
|||
│ │ |
|||
│ Runner's High: 0/1 (recharges in 3 battles) |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
### Strategic Implications |
|||
|
|||
**At Skill Level 1 (once per 5 battles):** |
|||
- VERY precious resource |
|||
- Only use when absolutely necessary |
|||
- Might lose fights you could have won if you waste it |
|||
|
|||
**At Skill Level 5 (once per battle):** |
|||
- Reliable tool in every fight |
|||
- Can be more aggressive knowing you have a heal |
|||
- Still need to time it right |
|||
|
|||
**At Skill Level 7+ (multiple per battle):** |
|||
- Major sustain advantage |
|||
- Can take on tougher monsters |
|||
- Enables riskier strategies |
|||
|
|||
### Edge Cases |
|||
|
|||
- **Cooldown not ready?** Skill greyed out, shows "2 battles remaining" |
|||
- **Multiple uses available?** Shows "(2/3)" to indicate uses left this battle |
|||
- **At full HP?** Greyed out with "HP Full" tooltip |
|||
- **Would overheal?** Caps at max HP (no waste, shows actual heal amount) |
|||
|
|||
--- |
|||
|
|||
## Level 3: Shin Kick ⚔️ |
|||
|
|||
### The Skill |
|||
``` |
|||
Name: Shin Kick |
|||
Type: Offensive |
|||
MP Cost: 20 |
|||
Cooldown: Once per battle |
|||
Effect: A devastating strike dealing 250% damage |
|||
``` |
|||
|
|||
*"Right in the shin. You KNOW how much that hurts."* |
|||
|
|||
Every trail runner knows the agony of a shin strike - whether from a hidden root, a rock, or an aggressive trail marker. Now weaponize that pain against your enemies. |
|||
|
|||
### Skill Leveling Progression |
|||
|
|||
| Skill Level | Damage | MP Cost | Bonus Effect | |
|||
|-------------|--------|---------|--------------| |
|||
| 1 | 250% | 20 | - | |
|||
| 2 | 265% | 20 | - | |
|||
| 3 | 280% | 19 | - | |
|||
| 4 | 295% | 19 | - | |
|||
| 5 | 310% | 18 | "New PR!" - 10% chance to reset cooldown | |
|||
| 6 | 325% | 18 | 15% reset chance | |
|||
| 7 | 340% | 17 | 20% reset chance | |
|||
| 8 | 355% | 17 | 25% reset chance | |
|||
| 9 | 370% | 16 | 30% reset chance | |
|||
| 10+ | 400% | 15 | "BONE BRUISE" - 35% reset + stuns enemy 1 turn | |
|||
|
|||
### Combat Mechanics |
|||
|
|||
**Comparison to other attacks:** |
|||
- Normal Attack: 100% damage, 0 MP |
|||
- Brand New Hokas (Lv1): 160% damage, 12 MP |
|||
- Shin Kick (Lv1): 250% damage, 20 MP |
|||
|
|||
**When to use:** |
|||
- Opening move to chunk a tough enemy |
|||
- Finishing blow on a low-HP monster |
|||
- When you can afford the MP investment |
|||
|
|||
### How It Works In-Game |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ 🐗 Wild Boar │ |
|||
│ HP: ██████████ 80/80 │ |
|||
│ │ |
|||
│ 🏃 You │ |
|||
│ HP: ██████████ 100/100 │ |
|||
│ MP: ██████████ 50/50 │ |
|||
├───────────────────────────────┤ |
|||
│ [⚔️ Attack ] [👟 New Hokas ] │ |
|||
│ [🦵 Shin Kick] [🏃♂️ Runner's High] │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Player selects Shin Kick:** |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ │ |
|||
│ 🦵 SHIN KICK! │ |
|||
│ │ |
|||
│ *Winds up* │ |
|||
│ *Aims for the shin* │ |
|||
│ *CRACK* │ |
|||
│ │ |
|||
│ 💥💥💥 62 DAMAGE! 💥💥💥 │ |
|||
│ │ |
|||
│ 🐗 Wild Boar │ |
|||
│ HP: ██░░░░░░░░ 18/80 │ ← Oof, right in the shin |
|||
│ │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
### Edge Cases |
|||
|
|||
- **Already used this battle?** Greyed out, shows "Shin Sore" (already gave 'em one) |
|||
- **Not enough MP?** Greyed out, shows "Need 20 MP" |
|||
- **Kills the enemy?** Displays "CRITICAL SHIN!" celebration text |
|||
- **Cooldown resets (Lv5+)?** Shows "OTHER SHIN!" and skill becomes available again |
|||
|
|||
--- |
|||
|
|||
## Level 4: Gel Pack 💚 |
|||
|
|||
### The Skill |
|||
``` |
|||
Name: Gel Pack |
|||
Type: Utility (Buff) |
|||
MP Cost: 18 |
|||
Cooldown: Once per 3 battles |
|||
Effect: Boost attack damage by 25% for 4 turns |
|||
``` |
|||
|
|||
*"It tastes like chemical birthday cake but it WORKS."* |
|||
|
|||
The Trail Runner squeezes down an energy gel - that weird gooey substance that costs $3 per packet and has the consistency of toothpaste. Disgusting? Yes. Effective? Absolutely. |
|||
|
|||
### Skill Leveling Progression |
|||
|
|||
| Skill Level | Damage Boost | Duration | Cooldown | |
|||
|-------------|-------------|----------|----------| |
|||
| 1 | +25% | 4 turns | 1 per 3 battles | |
|||
| 2 | +27% | 4 turns | 1 per 3 battles | |
|||
| 3 | +30% | 4 turns | 1 per 3 battles | |
|||
| 4 | +32% | 5 turns | 1 per 2 battles | |
|||
| 5 | +35% | 5 turns | 1 per 2 battles | |
|||
| 6 | +37% | 5 turns | 1 per battle | |
|||
| 7 | +40% | 6 turns | 1 per battle | |
|||
| 8 | +42% | 6 turns | 2 per battle | |
|||
| 9 | +45% | 6 turns | 2 per battle | |
|||
| 10+ | +50% | 8 turns | 3 per battle, also +10% crit | |
|||
|
|||
**Bonus at Level 10:** "GU Guru" - Also adds +10% critical hit chance |
|||
|
|||
### Combat Mechanics |
|||
|
|||
**How the buff stacks with attacks:** |
|||
``` |
|||
Normal Attack: 25 damage |
|||
With Gel Pack (+25%): 25 × 1.25 = 31 damage |
|||
|
|||
Brand New Hokas: 40 damage (two hits) |
|||
With Gel Pack: 40 × 1.25 = 50 damage |
|||
|
|||
Shin Kick: 62 damage |
|||
With Gel Pack: 62 × 1.25 = 77 damage |
|||
``` |
|||
|
|||
**Optimal timing:** |
|||
- Use Gel Pack turn 1, then unload damage skills |
|||
- 4 turns is enough for 3-4 buffed attacks |
|||
- Pairs especially well with Brand New Hokas (double benefit) |
|||
|
|||
### How It Works In-Game |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ 🦎 Trail Lizard │ |
|||
│ HP: ██████████ 50/50 │ |
|||
│ │ |
|||
│ 🏃 You │ |
|||
│ HP: ██████████ 100/100 │ |
|||
│ MP: ██████████ 50/50 │ |
|||
├───────────────────────────────┤ |
|||
│ [⚔️ Attack ] [👟 New Hokas ] │ |
|||
│ [🦵 Shin Kick] [🧴 Gel Pack ] │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Player selects Gel Pack:** |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ │ |
|||
│ 🧴 GEL PACK! │ |
|||
│ │ |
|||
│ *Tears open packet* │ |
|||
│ *Squeezes directly into │ |
|||
│ mouth* │ |
|||
│ *Tries not to gag* │ |
|||
│ │ |
|||
│ ⚡ ATK +25% for 4 turns! │ |
|||
│ │ |
|||
│ 🏃 You [🧴 GELLED] │ |
|||
│ HP: ██████████ 100/100 │ |
|||
│ MP: ████████░░ 32/50 │ |
|||
│ │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Buff indicator persists:** |
|||
``` |
|||
│ 🏃 You [🧴 3 turns] │ ← Shows remaining duration |
|||
``` |
|||
|
|||
### Edge Cases |
|||
|
|||
- **Already have the buff?** Can't stack, refreshes duration instead |
|||
- **Buff expires mid-battle?** Shows "Sugar crash..." message |
|||
- **Multiple uses (Lv8+)?** Can refresh before expiring for continuous uptime |
|||
- **Does it affect healing?** No, damage only (it's SUGAR not PROTEIN) |
|||
|
|||
### Synergy Notes |
|||
|
|||
**Gel Pack + Brand New Hokas combo:** |
|||
- Gel Pack Turn 1 (+25% damage) |
|||
- Brand New Hokas Turn 2, 3, 4 (all buffed) |
|||
- Each Hokas attack now deals ~50 damage instead of 40 |
|||
- Total extra damage over 4 turns: ~30-40 bonus damage |
|||
|
|||
**Gel Pack + Shin Kick combo:** |
|||
- Gel Pack Turn 1 |
|||
- Shin Kick Turn 2 for ~77 damage instead of 62 |
|||
- Finish with buffed normal attacks |
|||
|
|||
--- |
|||
|
|||
## Level 5: Pole Vault ⚔️ |
|||
|
|||
### The Skill |
|||
``` |
|||
Name: Pole Vault |
|||
Type: Offensive |
|||
MP Cost: 16 |
|||
Cooldown: None (usable every turn) |
|||
Effect: 150% damage attack with 40% chance to stun enemy for 1 turn |
|||
``` |
|||
|
|||
*"These carbon fiber trekking poles cost $250. Time to get my money's worth."* |
|||
|
|||
The Trail Runner plants their premium trekking pole and launches themselves foot-first into the enemy's face. It's not what the manufacturer intended, but it's devastatingly effective. |
|||
|
|||
### Skill Leveling Progression |
|||
|
|||
| Skill Level | Damage | Stun Chance | MP Cost | |
|||
|-------------|--------|-------------|---------| |
|||
| 1 | 150% | 40% | 16 | |
|||
| 2 | 155% | 42% | 16 | |
|||
| 3 | 160% | 45% | 15 | |
|||
| 4 | 165% | 47% | 15 | |
|||
| 5 | 170% | 50% | 14 | |
|||
| 6 | 175% | 52% | 14 | |
|||
| 7 | 180% | 55% | 13 | |
|||
| 8 | 185% | 57% | 13 | |
|||
| 9 | 190% | 60% | 12 | |
|||
| 10+ | 200% | 65% | 12, "Pole Position" - stun lasts 2 turns | |
|||
|
|||
**Milestone at Level 10:** "Pole Position" - Stuns now last 2 turns instead of 1 |
|||
|
|||
### Combat Mechanics |
|||
|
|||
**Comparison to other offensive skills:** |
|||
| Skill | Damage | Special | MP Cost | |
|||
|-------|--------|---------|---------| |
|||
| Brand New Hokas | 160% (2×80%) | Two hits | 12 | |
|||
| Shin Kick | 250% | Once per battle | 20 | |
|||
| Pole Vault | 150% | 40% stun | 16 | |
|||
|
|||
**When to use Pole Vault:** |
|||
- Enemy is about to use a big attack (stun prevents it) |
|||
- You need breathing room to heal next turn |
|||
- Setting up for a Shin Kick (stunned enemies can't dodge) |
|||
|
|||
**Stun mechanics:** |
|||
- Stunned enemies skip their next turn |
|||
- Stunned enemies take 10% bonus damage from all sources |
|||
- Stun doesn't stack (refreshes duration if re-applied) |
|||
|
|||
### How It Works In-Game |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ 🐗 Wild Boar │ |
|||
│ HP: ██████░░░░ 48/80 │ |
|||
│ [🔄 Charging up...] │ ← About to do something bad |
|||
│ │ |
|||
│ 🏃 You │ |
|||
│ HP: ██████░░░░ 55/100 │ |
|||
│ MP: ████████░░ 40/50 │ |
|||
├───────────────────────────────┤ |
|||
│ [⚔️ Attack ] [👟 New Hokas ] │ |
|||
│ [🦵 Shin Kick] [🥢 Pole Vault ] │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**Player selects Pole Vault:** |
|||
|
|||
``` |
|||
┌─ BATTLE ──────────────────────┐ |
|||
│ │ |
|||
│ 🥢 POLE VAULT! │ |
|||
│ │ |
|||
│ *Plants trekking pole* │ |
|||
│ *YEETS self at enemy* │ |
|||
│ *Both feet connect* │ |
|||
│ │ |
|||
│ 💥 38 DAMAGE! │ |
|||
│ ⭐ STUNNED! │ |
|||
│ │ |
|||
│ 🐗 Wild Boar [💫 STUNNED] │ |
|||
│ HP: ███░░░░░░░ 10/80 │ |
|||
│ │ |
|||
└───────────────────────────────┘ |
|||
``` |
|||
|
|||
**If stun fails (60% chance at Lv1):** |
|||
``` |
|||
│ 💥 38 DAMAGE! │ |
|||
│ (Boar shakes it off) │ |
|||
``` |
|||
|
|||
### Strategic Considerations |
|||
|
|||
**Pole Vault vs Brand New Hokas:** |
|||
- Hokas: More reliable damage (160% vs 150%) |
|||
- Pole Vault: Chance to prevent enemy turn entirely |
|||
- Use Hokas for pure DPS, Pole Vault for control |
|||
|
|||
**Pole Vault + Shin Kick combo:** |
|||
1. Pole Vault (hope for stun) |
|||
2. If stunned: Free Shin Kick next turn (250% damage + 10% stun bonus = 275%) |
|||
3. Enemy wasted a turn, you dealt massive damage |
|||
|
|||
**Pole Vault + Runner's High combo:** |
|||
1. Pole Vault to stun |
|||
2. Runner's High to heal safely while enemy is stunned |
|||
3. Resume attacking at higher HP |
|||
|
|||
### Edge Cases |
|||
|
|||
- **Not enough MP?** Greyed out, shows "Need 16 MP" |
|||
- **Enemy already stunned?** Can still use, refreshes stun duration |
|||
- **Enemy immune to stun?** Damage still applies, shows "Immune to stun!" |
|||
- **Critical hit?** Stun chance increases to 60% on crits |
|||
|
|||
--- |
|||
|
|||
## Implementation Considerations |
|||
|
|||
### Data We Need to Track |
|||
|
|||
```javascript |
|||
player = { |
|||
hp: 80, |
|||
maxHp: 100, |
|||
mp: 35, |
|||
maxMp: 50, |
|||
|
|||
skills: { |
|||
secondWind: { |
|||
unlocked: true, |
|||
cooldownEnds: 1704567890000, // Unix timestamp |
|||
}, |
|||
steadyPace: { |
|||
unlocked: true, |
|||
// No cooldown for passives |
|||
} |
|||
}, |
|||
|
|||
// For passive tracking |
|||
stats: { |
|||
hpSavedBySteadyPace: 47, |
|||
distanceTraveledToday: 8500, // meters |
|||
elevationGainedToday: 320, // meters |
|||
} |
|||
} |
|||
``` |
|||
|
|||
### GPS Integration |
|||
|
|||
The drain system needs to integrate with GPS tracking: |
|||
|
|||
```javascript |
|||
function onPositionUpdate(newPosition) { |
|||
const distance = calculateDistance(lastPosition, newPosition); |
|||
const elevation = calculateElevationGain(lastPosition, newPosition); |
|||
|
|||
let drain = 0; |
|||
|
|||
// Base distance drain |
|||
drain += distance / 100; // 1 HP per 100m |
|||
|
|||
// Elevation drain |
|||
drain += (elevation / 10) * 2; // 2 HP per 10m climbed |
|||
|
|||
// Apply terrain modifier (from trail data) |
|||
drain *= getTerrainModifier(currentTrail); |
|||
|
|||
// Apply passive skills |
|||
if (player.skills.steadyPace.unlocked) { |
|||
drain *= 0.85; // -15% |
|||
} |
|||
|
|||
// Apply racial bonuses |
|||
drain *= player.race.movementDrainModifier; |
|||
|
|||
// Apply the drain |
|||
player.hp = Math.max(0, player.hp - drain); |
|||
|
|||
updateUI(); |
|||
} |
|||
``` |
|||
|
|||
--- |
|||
|
|||
## Next Steps |
|||
|
|||
- [ ] Define how MP regenerates |
|||
- [ ] Define what Difficult Terrain actually means (GPS data? Manual marking?) |
|||
- [ ] Design the skills UI |
|||
- [ ] Define Level 3: Trail Legs mechanics |
|||
@ -0,0 +1,593 @@ |
|||
# Trail Runner - Complete Skill Mechanics |
|||
|
|||
## Class Overview |
|||
|
|||
**Identity:** Gear snob, endurance athlete, trail obsessed, owns $200 shoes, has opinions about hydration vests |
|||
|
|||
**Primary Stats:** STR, CON |
|||
**HP per Level:** +12 |
|||
**MP per Level:** +3 |
|||
|
|||
--- |
|||
|
|||
# Level 1: Brand New Hokas 👟 |
|||
|
|||
*"These cost $180 and they're worth EVERY PENNY."* |
|||
|
|||
**Type:** Offensive |
|||
**Base Effect:** Attack twice in a single turn |
|||
|
|||
The Trail Runner's premium cushioned footwear allows for lightning-fast strikes. Two rapid kicks delivered with the confidence that only expensive gear can provide. |
|||
|
|||
## Skill Level Progression |
|||
|
|||
| Skill Lv | Damage per Hit | Total Damage | MP Cost | Special | |
|||
|----------|---------------|--------------|---------|---------| |
|||
| 1 | 80% | 160% | 12 | - | |
|||
| 2 | 82% | 164% | 12 | - | |
|||
| 3 | 85% | 170% | 11 | - | |
|||
| 4 | 87% | 174% | 11 | - | |
|||
| 5 | 90% | 180% | 10 | 🏅 "Swift Strikes" - faster animation | |
|||
| 6 | 92% | 184% | 10 | - | |
|||
| 7 | 95% | 190% | 9 | - | |
|||
| 8 | 97% | 194% | 9 | - | |
|||
| 9 | 100% | 200% | 8 | 🏅 "True Double" - full damage both hits | |
|||
| 10 | 100% | 200% | 8 | +5% crit chance | |
|||
| 11 | 100% | 200% | 8 | +10% crit chance | |
|||
| 12 | 100% | 200% | 8 | +15% crit chance | |
|||
| 13+ | 100% | 200% | 8 | +5% crit per level beyond 10 | |
|||
|
|||
## Detailed Breakdown |
|||
|
|||
### Skill Level 1 |
|||
``` |
|||
Damage: 80% per hit (160% total) |
|||
MP Cost: 12 |
|||
Cooldown: None |
|||
Crits: Each hit rolls independently |
|||
``` |
|||
**Example:** Base attack = 25 damage |
|||
- Hit 1: 25 × 0.80 = 20 damage |
|||
- Hit 2: 25 × 0.80 = 20 damage |
|||
- Total: 40 damage for 12 MP |
|||
|
|||
### Skill Level 5 - "Swift Strikes" |
|||
``` |
|||
Damage: 90% per hit (180% total) |
|||
MP Cost: 10 |
|||
Cooldown: None |
|||
Bonus: Animation speed increased (QoL) |
|||
``` |
|||
**Example:** Base attack = 25 damage |
|||
- Hit 1: 25 × 0.90 = 22 damage |
|||
- Hit 2: 25 × 0.90 = 23 damage |
|||
- Total: 45 damage for 10 MP |
|||
|
|||
### Skill Level 9 - "True Double" |
|||
``` |
|||
Damage: 100% per hit (200% total) |
|||
MP Cost: 8 |
|||
Cooldown: None |
|||
Bonus: Each hit now deals FULL attack damage |
|||
``` |
|||
**Example:** Base attack = 25 damage |
|||
- Hit 1: 25 × 1.00 = 25 damage |
|||
- Hit 2: 25 × 1.00 = 25 damage |
|||
- Total: 50 damage for 8 MP |
|||
|
|||
### Skill Level 10+ - "Relentless" |
|||
``` |
|||
Damage: 100% per hit (200% total) |
|||
MP Cost: 8 |
|||
Cooldown: None |
|||
Bonus: +5% critical hit chance per level beyond 9 |
|||
``` |
|||
**At Level 15:** |
|||
- Base crit chance: 5% |
|||
- Bonus from skill: +25% (5 levels × 5%) |
|||
- Total crit chance: 30% per hit |
|||
|
|||
## XP to Level |
|||
|
|||
| Skill Lv | XP Required | Cumulative XP | |
|||
|----------|-------------|---------------| |
|||
| 1 → 2 | 50 | 50 | |
|||
| 2 → 3 | 100 | 150 | |
|||
| 3 → 4 | 150 | 300 | |
|||
| 4 → 5 | 200 | 500 | |
|||
| 5 → 6 | 300 | 800 | |
|||
| 6 → 7 | 400 | 1,200 | |
|||
| 7 → 8 | 500 | 1,700 | |
|||
| 8 → 9 | 600 | 2,300 | |
|||
| 9 → 10 | 700 | 3,000 | |
|||
| 10+ | 500 per level | +500 each | |
|||
|
|||
**XP earned per use:** 10 base + 5 if kills enemy + 5 if both hits crit |
|||
|
|||
--- |
|||
|
|||
# Level 2: Runner's High 🏃♂️ |
|||
|
|||
*"Around mile 8, something magical happens... the pain becomes pleasure."* |
|||
|
|||
**Type:** Utility (Healing) |
|||
**Base Effect:** Restore HP based on max HP |
|||
|
|||
The Trail Runner taps into that euphoric state where endorphins flood the system and everything feels possible. Pain melts away, replaced by a serene confidence. |
|||
|
|||
## Skill Level Progression |
|||
|
|||
| Skill Lv | HP Restored | MP Cost | Cooldown | Special | |
|||
|----------|-------------|---------|----------|---------| |
|||
| 1 | 30% max HP | 15 | 1 per 5 battles | - | |
|||
| 2 | 30% max HP | 15 | 1 per 4 battles | - | |
|||
| 3 | 30% max HP | 14 | 1 per 3 battles | - | |
|||
| 4 | 35% max HP | 14 | 1 per 2 battles | 🏅 Healing increased | |
|||
| 5 | 35% max HP | 13 | 1 per battle | 🏅 "Reliable Recovery" | |
|||
| 6 | 40% max HP | 13 | 2 per battle | 🏅 Multi-use unlocked | |
|||
| 7 | 40% max HP | 12 | 3 per battle | - | |
|||
| 8 | 45% max HP | 12 | 4 per battle | 🏅 "Endorphin Overload" | |
|||
| 9 | 45% max HP | 11 | 5 per battle | - | |
|||
| 10 | 50% max HP | 10 | 6 per battle | 🏅 "Ultrarunner's Zen" | |
|||
| 11+ | 50% max HP | 10 | +1 use per level | - | |
|||
|
|||
## Detailed Breakdown |
|||
|
|||
### Skill Level 1 |
|||
``` |
|||
Healing: 30% of max HP |
|||
MP Cost: 15 |
|||
Cooldown: Once per 5 battles |
|||
Uses: 1 charge, recharges after 5 fights |
|||
``` |
|||
**Example:** Max HP = 100 |
|||
- Heals: 30 HP |
|||
- Must wait 5 battles before using again |
|||
- VERY precious, save for emergencies |
|||
|
|||
**Cooldown Tracking:** |
|||
``` |
|||
Battle 1: Use Runner's High ✓ |
|||
Battle 2: [4 battles remaining] |
|||
Battle 3: [3 battles remaining] |
|||
Battle 4: [2 battles remaining] |
|||
Battle 5: [1 battle remaining] |
|||
Battle 6: Runner's High READY ✓ |
|||
``` |
|||
|
|||
### Skill Level 5 - "Reliable Recovery" |
|||
``` |
|||
Healing: 35% of max HP |
|||
MP Cost: 13 |
|||
Cooldown: Once per battle |
|||
Uses: Available every fight |
|||
``` |
|||
**Example:** Max HP = 120 |
|||
- Heals: 42 HP |
|||
- Can use once per fight, every fight |
|||
- Now a reliable tool instead of emergency-only |
|||
|
|||
### Skill Level 6 - Multi-Use Unlocked |
|||
``` |
|||
Healing: 40% of max HP |
|||
MP Cost: 13 |
|||
Cooldown: Twice per battle |
|||
Uses: 2 charges per fight |
|||
``` |
|||
**Example:** Max HP = 130 |
|||
- Heals: 52 HP per use |
|||
- Can use TWICE in the same battle |
|||
- Total potential healing: 104 HP per fight |
|||
|
|||
### Skill Level 10 - "Ultrarunner's Zen" |
|||
``` |
|||
Healing: 50% of max HP |
|||
MP Cost: 10 |
|||
Cooldown: 6 times per battle |
|||
Uses: 6 charges per fight |
|||
``` |
|||
**Example:** Max HP = 150 |
|||
- Heals: 75 HP per use |
|||
- Can use up to 6 times per battle |
|||
- Total potential healing: 450 HP per fight (3x your max HP!) |
|||
- Limited only by MP (60 MP needed for all 6) |
|||
|
|||
## XP to Level |
|||
|
|||
| Skill Lv | XP Required | Cumulative XP | |
|||
|----------|-------------|---------------| |
|||
| 1 → 2 | 50 | 50 | |
|||
| 2 → 3 | 100 | 150 | |
|||
| 3 → 4 | 150 | 300 | |
|||
| 4 → 5 | 200 | 500 | |
|||
| 5 → 6 | 300 | 800 | |
|||
| 6 → 7 | 400 | 1,200 | |
|||
| 7 → 8 | 500 | 1,700 | |
|||
| 8 → 9 | 600 | 2,300 | |
|||
| 9 → 10 | 700 | 3,000 | |
|||
| 10+ | 500 per level | +500 each | |
|||
|
|||
**XP earned per use:** 10 base + 10 if healed from below 30% HP + 5 if survived battle after healing |
|||
|
|||
--- |
|||
|
|||
# Level 3: Shin Kick 🦵 |
|||
|
|||
*"Right in the shin. You KNOW how much that hurts."* |
|||
|
|||
**Type:** Offensive (Nuke) |
|||
**Base Effect:** Massive single-target damage, limited uses |
|||
|
|||
Every trail runner knows the agony of a shin strike - whether from a hidden root, a rock, or an aggressive trail marker. Now weaponize that pain against your enemies. |
|||
|
|||
## Skill Level Progression |
|||
|
|||
| Skill Lv | Damage | MP Cost | Cooldown | Special | |
|||
|----------|--------|---------|----------|---------| |
|||
| 1 | 250% | 20 | 1 per battle | - | |
|||
| 2 | 265% | 20 | 1 per battle | - | |
|||
| 3 | 280% | 19 | 1 per battle | - | |
|||
| 4 | 295% | 19 | 1 per battle | - | |
|||
| 5 | 310% | 18 | 1 per battle | 🏅 10% cooldown reset chance | |
|||
| 6 | 325% | 18 | 1 per battle | 15% reset chance | |
|||
| 7 | 340% | 17 | 1 per battle | 20% reset chance | |
|||
| 8 | 355% | 17 | 1 per battle | 25% reset chance | |
|||
| 9 | 370% | 16 | 1 per battle | 30% reset chance | |
|||
| 10 | 400% | 15 | 1 per battle | 🏅 35% reset + 1 turn stun | |
|||
| 11+ | 400% + 10%/lv | 15 | 1 per battle | +2% reset chance per level | |
|||
|
|||
## Detailed Breakdown |
|||
|
|||
### Skill Level 1 |
|||
``` |
|||
Damage: 250% of base attack |
|||
MP Cost: 20 |
|||
Cooldown: Once per battle (hard limit) |
|||
Reset: None |
|||
``` |
|||
**Example:** Base attack = 25 damage |
|||
- Shin Kick: 25 × 2.50 = 62 damage |
|||
- Can only use once per fight |
|||
- Save for when it matters most |
|||
|
|||
### Skill Level 5 - Reset Chance Unlocked |
|||
``` |
|||
Damage: 310% of base attack |
|||
MP Cost: 18 |
|||
Cooldown: Once per battle |
|||
Reset: 10% chance to reset cooldown on use |
|||
``` |
|||
**Example:** Base attack = 28 damage |
|||
- Shin Kick: 28 × 3.10 = 87 damage |
|||
- 10% chance to immediately use again |
|||
- Shows "OTHER SHIN!" if reset triggers |
|||
|
|||
**Reset Mechanic:** |
|||
``` |
|||
Use Shin Kick → 87 damage! |
|||
Roll for reset: 10% chance |
|||
├─ Success (10%): "OTHER SHIN!" - Skill available again |
|||
└─ Fail (90%): "Shin Sore" - Normal cooldown |
|||
``` |
|||
|
|||
### Skill Level 10 - "Bone Bruise" |
|||
``` |
|||
Damage: 400% of base attack |
|||
MP Cost: 15 |
|||
Cooldown: Once per battle |
|||
Reset: 35% chance to reset cooldown |
|||
Bonus: Stuns enemy for 1 turn |
|||
``` |
|||
**Example:** Base attack = 35 damage |
|||
- Shin Kick: 35 × 4.00 = 140 damage |
|||
- Enemy is STUNNED (skips next turn) |
|||
- 35% chance to kick again immediately |
|||
- Potential for back-to-back 140 damage + double stun |
|||
|
|||
### Skill Level 15 |
|||
``` |
|||
Damage: 450% of base attack (400% + 50% from 5 levels) |
|||
MP Cost: 15 |
|||
Cooldown: Once per battle |
|||
Reset: 45% chance (35% + 10% from 5 levels) |
|||
Bonus: Stuns enemy for 1 turn |
|||
``` |
|||
|
|||
## XP to Level |
|||
|
|||
| Skill Lv | XP Required | Cumulative XP | |
|||
|----------|-------------|---------------| |
|||
| 1 → 2 | 50 | 50 | |
|||
| 2 → 3 | 100 | 150 | |
|||
| 3 → 4 | 150 | 300 | |
|||
| 4 → 5 | 200 | 500 | |
|||
| 5 → 6 | 300 | 800 | |
|||
| 6 → 7 | 400 | 1,200 | |
|||
| 7 → 8 | 500 | 1,700 | |
|||
| 8 → 9 | 600 | 2,300 | |
|||
| 9 → 10 | 700 | 3,000 | |
|||
| 10+ | 500 per level | +500 each | |
|||
|
|||
**XP earned per use:** 10 base + 10 if kills enemy + 15 if reset triggers |
|||
|
|||
--- |
|||
|
|||
# Level 4: Gel Pack 🧴 |
|||
|
|||
*"It tastes like chemical birthday cake but it WORKS."* |
|||
|
|||
**Type:** Utility (Buff) |
|||
**Base Effect:** Boost attack damage for several turns |
|||
|
|||
The Trail Runner squeezes down an energy gel - that weird gooey substance that costs $3 per packet and has the consistency of toothpaste. Disgusting? Yes. Effective? Absolutely. |
|||
|
|||
## Skill Level Progression |
|||
|
|||
| Skill Lv | ATK Boost | Duration | MP Cost | Cooldown | Special | |
|||
|----------|-----------|----------|---------|----------|---------| |
|||
| 1 | +25% | 4 turns | 18 | 1 per 3 battles | - | |
|||
| 2 | +27% | 4 turns | 18 | 1 per 3 battles | - | |
|||
| 3 | +30% | 4 turns | 17 | 1 per 3 battles | - | |
|||
| 4 | +32% | 5 turns | 17 | 1 per 2 battles | 🏅 Duration up | |
|||
| 5 | +35% | 5 turns | 16 | 1 per 2 battles | - | |
|||
| 6 | +37% | 5 turns | 16 | 1 per battle | 🏅 Every battle | |
|||
| 7 | +40% | 6 turns | 15 | 1 per battle | 🏅 Duration up | |
|||
| 8 | +42% | 6 turns | 15 | 2 per battle | 🏅 Multi-use | |
|||
| 9 | +45% | 6 turns | 14 | 2 per battle | - | |
|||
| 10 | +50% | 8 turns | 14 | 3 per battle | 🏅 "GU Guru" +10% crit | |
|||
| 11+ | +50% | 8 turns | 14 | +1 use per level | - | |
|||
|
|||
## Detailed Breakdown |
|||
|
|||
### Skill Level 1 |
|||
``` |
|||
ATK Boost: +25% damage on all attacks |
|||
Duration: 4 turns |
|||
MP Cost: 18 |
|||
Cooldown: Once per 3 battles |
|||
``` |
|||
**Example Combat:** |
|||
``` |
|||
Turn 1: Gel Pack (buff active, 4 turns remain) |
|||
Turn 2: Attack 25 × 1.25 = 31 damage (3 turns remain) |
|||
Turn 3: Attack 25 × 1.25 = 31 damage (2 turns remain) |
|||
Turn 4: Attack 25 × 1.25 = 31 damage (1 turn remains) |
|||
Turn 5: Attack 25 × 1.25 = 31 damage (buff expires) |
|||
Turn 6: Attack 25 damage (no buff) |
|||
``` |
|||
**Cooldown Tracking:** |
|||
``` |
|||
Battle 1: Gel Pack used ✓ |
|||
Battle 2: [2 battles remaining] |
|||
Battle 3: [1 battle remaining] |
|||
Battle 4: Gel Pack READY ✓ |
|||
``` |
|||
|
|||
### Skill Level 6 - Every Battle |
|||
``` |
|||
ATK Boost: +37% damage on all attacks |
|||
Duration: 5 turns |
|||
MP Cost: 16 |
|||
Cooldown: Once per battle |
|||
``` |
|||
- Now available in EVERY fight |
|||
- +37% is significant - turns 25 damage into 34 |
|||
- 5 turns usually covers most of a battle |
|||
|
|||
### Skill Level 8 - Multi-Use |
|||
``` |
|||
ATK Boost: +42% damage on all attacks |
|||
Duration: 6 turns |
|||
MP Cost: 15 |
|||
Cooldown: Twice per battle |
|||
Uses: Can refresh or double-apply? |
|||
``` |
|||
**Stacking Rules:** |
|||
- Buff does NOT stack with itself |
|||
- Using again REFRESHES duration to full |
|||
- Useful for long fights to maintain 100% uptime |
|||
|
|||
### Skill Level 10 - "GU Guru" |
|||
``` |
|||
ATK Boost: +50% damage on all attacks |
|||
Duration: 8 turns |
|||
MP Cost: 14 |
|||
Cooldown: 3 times per battle |
|||
Bonus: Also grants +10% critical hit chance |
|||
``` |
|||
**Example Combat:** |
|||
``` |
|||
Turn 1: Gel Pack (+50% ATK, +10% crit for 8 turns) |
|||
Turn 2: Brand New Hokas = 50 × 1.50 = 75 damage (with +10% crit!) |
|||
Turn 3: Shin Kick = 140 × 1.50 = 210 damage (with +10% crit!) |
|||
... |
|||
Turn 8: Still buffed! |
|||
Turn 9: Gel Pack again to refresh |
|||
``` |
|||
|
|||
## Interaction with Other Skills |
|||
|
|||
| Skill | Base Damage | With Gel Pack Lv1 (+25%) | With Gel Pack Lv10 (+50%) | |
|||
|-------|-------------|--------------------------|---------------------------| |
|||
| Normal Attack | 25 | 31 | 38 | |
|||
| Brand New Hokas | 40 | 50 | 60 | |
|||
| Shin Kick | 62 | 78 | 93 | |
|||
| Pole Vault | 38 | 48 | 57 | |
|||
|
|||
## XP to Level |
|||
|
|||
| Skill Lv | XP Required | Cumulative XP | |
|||
|----------|-------------|---------------| |
|||
| 1 → 2 | 50 | 50 | |
|||
| 2 → 3 | 100 | 150 | |
|||
| 3 → 4 | 150 | 300 | |
|||
| 4 → 5 | 200 | 500 | |
|||
| 5 → 6 | 300 | 800 | |
|||
| 6 → 7 | 400 | 1,200 | |
|||
| 7 → 8 | 500 | 1,700 | |
|||
| 8 → 9 | 600 | 2,300 | |
|||
| 9 → 10 | 700 | 3,000 | |
|||
| 10+ | 500 per level | +500 each | |
|||
|
|||
**XP earned per use:** 10 base + 5 per buffed attack that hits + 10 if win battle while buffed |
|||
|
|||
--- |
|||
|
|||
# Level 5: Pole Vault 🥢 |
|||
|
|||
*"These carbon fiber trekking poles cost $250. Time to get my money's worth."* |
|||
|
|||
**Type:** Offensive (Crowd Control) |
|||
**Base Effect:** Damage with chance to stun |
|||
|
|||
The Trail Runner plants their premium trekking pole and launches themselves foot-first into the enemy's face. It's not what the manufacturer intended, but it's devastatingly effective. |
|||
|
|||
## Skill Level Progression |
|||
|
|||
| Skill Lv | Damage | Stun Chance | Stun Duration | MP Cost | Special | |
|||
|----------|--------|-------------|---------------|---------|---------| |
|||
| 1 | 150% | 40% | 1 turn | 16 | - | |
|||
| 2 | 155% | 42% | 1 turn | 16 | - | |
|||
| 3 | 160% | 45% | 1 turn | 15 | - | |
|||
| 4 | 165% | 47% | 1 turn | 15 | - | |
|||
| 5 | 170% | 50% | 1 turn | 14 | 🏅 50/50 stun chance | |
|||
| 6 | 175% | 52% | 1 turn | 14 | - | |
|||
| 7 | 180% | 55% | 1 turn | 13 | - | |
|||
| 8 | 185% | 57% | 1 turn | 13 | - | |
|||
| 9 | 190% | 60% | 1 turn | 12 | - | |
|||
| 10 | 200% | 65% | 2 turns | 12 | 🏅 "Pole Position" | |
|||
| 11 | 205% | 67% | 2 turns | 12 | - | |
|||
| 12 | 210% | 70% | 2 turns | 12 | - | |
|||
| 13+ | +5%/lv | +2%/lv | 2 turns | 12 | - | |
|||
|
|||
## Detailed Breakdown |
|||
|
|||
### Skill Level 1 |
|||
``` |
|||
Damage: 150% of base attack |
|||
Stun: 40% chance |
|||
Duration: 1 turn (enemy skips next turn) |
|||
MP Cost: 16 |
|||
Cooldown: None (usable every turn) |
|||
``` |
|||
**Example:** Base attack = 25 damage |
|||
- Pole Vault: 25 × 1.50 = 38 damage |
|||
- Roll for stun: 40% chance |
|||
- If stunned: Enemy loses next turn |
|||
|
|||
**Stun Value:** |
|||
- Prevents ~25-30 damage from enemy attack |
|||
- Gives you a free turn to heal or attack |
|||
- Stunned enemies take +10% damage |
|||
|
|||
### Skill Level 5 - Coin Flip Stun |
|||
``` |
|||
Damage: 170% of base attack |
|||
Stun: 50% chance (coin flip!) |
|||
Duration: 1 turn |
|||
MP Cost: 14 |
|||
``` |
|||
**Example:** Base attack = 28 damage |
|||
- Pole Vault: 28 × 1.70 = 48 damage |
|||
- 50/50 shot at stunning |
|||
- Much more reliable CC |
|||
|
|||
### Skill Level 10 - "Pole Position" |
|||
``` |
|||
Damage: 200% of base attack |
|||
Stun: 65% chance |
|||
Duration: 2 TURNS (enemy skips TWO turns) |
|||
MP Cost: 12 |
|||
``` |
|||
**Example:** Base attack = 35 damage |
|||
- Pole Vault: 35 × 2.00 = 70 damage |
|||
- 65% chance to stun for 2 FULL TURNS |
|||
- Enemy loses 2 attacks worth ~60+ damage |
|||
- You get 2 free turns to unload |
|||
|
|||
**2-Turn Stun Combo:** |
|||
``` |
|||
Turn 1: Pole Vault → 70 damage, STUNNED 2 turns |
|||
Turn 2: (Enemy stunned) Shin Kick → 140 × 1.10 = 154 damage |
|||
Turn 3: (Enemy stunned) Brand New Hokas → 50 × 1.10 = 55 damage |
|||
Turn 4: Enemy finally acts (279 damage taken!) |
|||
``` |
|||
|
|||
### Skill Level 15 |
|||
``` |
|||
Damage: 225% of base attack |
|||
Stun: 75% chance |
|||
Duration: 2 turns |
|||
MP Cost: 12 |
|||
``` |
|||
- Nearly guaranteed stun |
|||
- Massive damage + control |
|||
- Can chain stuns to lock down enemies |
|||
|
|||
## Stun Mechanics Deep Dive |
|||
|
|||
**What Stunned Does:** |
|||
- Enemy skips their turn completely |
|||
- Enemy takes +10% damage from all sources |
|||
- Visual: 💫 spinning stars indicator |
|||
- Cannot be stunned again while stunned (prevents permastun abuse) |
|||
|
|||
**Stun Interactions:** |
|||
| Situation | Result | |
|||
|-----------|--------| |
|||
| Enemy already stunned | Damage applies, no stun refresh | |
|||
| Boss/Elite enemy | 50% stun resistance (halve your chance) | |
|||
| Enemy immune to stun | Full damage, "Immune!" message | |
|||
| Critical hit | +20% stun chance | |
|||
|
|||
## XP to Level |
|||
|
|||
| Skill Lv | XP Required | Cumulative XP | |
|||
|----------|-------------|---------------| |
|||
| 1 → 2 | 50 | 50 | |
|||
| 2 → 3 | 100 | 150 | |
|||
| 3 → 4 | 150 | 300 | |
|||
| 4 → 5 | 200 | 500 | |
|||
| 5 → 6 | 300 | 800 | |
|||
| 6 → 7 | 400 | 1,200 | |
|||
| 7 → 8 | 500 | 1,700 | |
|||
| 8 → 9 | 600 | 2,300 | |
|||
| 9 → 10 | 700 | 3,000 | |
|||
| 10+ | 500 per level | +500 each | |
|||
|
|||
**XP earned per use:** 10 base + 15 if stun lands + 5 if enemy dies while stunned |
|||
|
|||
--- |
|||
|
|||
# Skill Comparison Matrix |
|||
|
|||
## Damage Per MP Spent |
|||
|
|||
| Skill | Damage | MP | Damage/MP | Notes | |
|||
|-------|--------|-----|-----------|-------| |
|||
| Brand New Hokas Lv1 | 160% | 12 | 13.3%/MP | Best sustained DPS | |
|||
| Brand New Hokas Lv9 | 200% | 8 | 25%/MP | Incredible efficiency | |
|||
| Shin Kick Lv1 | 250% | 20 | 12.5%/MP | Burst, limited use | |
|||
| Shin Kick Lv10 | 400% | 15 | 26.7%/MP | Best burst + stun | |
|||
| Pole Vault Lv1 | 150% | 16 | 9.4%/MP | Worst raw DPS | |
|||
| Pole Vault Lv10 | 200% | 12 | 16.7%/MP | Value is in stun | |
|||
|
|||
## Cooldown Comparison |
|||
|
|||
| Skill | Lv1 Cooldown | Lv5 Cooldown | Lv10 Cooldown | |
|||
|-------|--------------|--------------|---------------| |
|||
| Brand New Hokas | None | None | None | |
|||
| Runner's High | 1/5 battles | 1/battle | 6/battle | |
|||
| Shin Kick | 1/battle | 1/battle (+10% reset) | 1/battle (+35% reset) | |
|||
| Gel Pack | 1/3 battles | 1/2 battles | 3/battle | |
|||
| Pole Vault | None | None | None | |
|||
|
|||
## Role Summary |
|||
|
|||
| Skill | Primary Role | Secondary Role | |
|||
|-------|--------------|----------------| |
|||
| Brand New Hokas | Sustained DPS | MP efficient | |
|||
| Runner's High | Emergency Heal | Sustain in long fights | |
|||
| Shin Kick | Burst Damage | Execute low HP enemies | |
|||
| Gel Pack | Damage Amplifier | Crit boost at Lv10 | |
|||
| Pole Vault | Crowd Control | Setup for combos | |
|||
7780
index.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue