294 lines
9.3 KiB
Markdown

# Heroic Opportunities System
The Heroic Opportunities (HO) system implements EverQuest II's cooperative combat mechanic where players coordinate ability usage to complete beneficial spell effects.
## Overview
Heroic Opportunities are multi-stage cooperative encounters that require precise timing and coordination. The system consists of two main phases:
1. **Starter Chain Phase**: Players use abilities in sequence to complete a starter chain
2. **Wheel Phase**: Players complete abilities on a randomized wheel within a time limit
## Architecture
### Core Components
#### HeroicOPStarter
Represents starter chains that initiate heroic opportunities:
- **Class Restrictions**: Specific classes can initiate specific starters
- **Ability Sequence**: Up to 6 abilities that must be used in order
- **Completion Marker**: Special marker (0xFFFF) indicates chain completion
#### HeroicOPWheel
Represents the wheel phase with ability completion requirements:
- **Order Types**: Unordered (any sequence) vs Ordered (specific sequence)
- **Shift Capability**: Ability to change to different wheel once per HO
- **Completion Spell**: Spell cast when wheel is successfully completed
- **Chance Weighting**: Probability factor for random wheel selection
#### HeroicOP
Active HO instance with state management:
- **Multi-phase State**: Tracks progression through starter → wheel → completion
- **Timer Management**: Precise timing controls for wheel phase
- **Participant Tracking**: Manages all players involved in the HO
- **Progress Validation**: Ensures abilities match current requirements
### System Flow
```
Player Uses Starter Ability
System Loads Available Starters for Class
Eliminate Non-matching Starters
Starter Complete? → Yes → Select Random Wheel
↓ ↓
No Start Wheel Phase Timer
↓ ↓
Continue Starter Chain Players Complete Abilities
↓ ↓
More Starters? → No → HO Fails All Complete? → Yes → Cast Spell
No → Timer Expired? → Yes → HO Fails
```
## Database Schema
### heroic_ops Table
Stores both starters and wheels with type discrimination:
```sql
CREATE TABLE heroic_ops (
id INTEGER NOT NULL,
ho_type TEXT CHECK(ho_type IN ('Starter', 'Wheel')),
starter_class INTEGER, -- For starters: class restriction
starter_icon INTEGER, -- For starters: initiating icon
starter_link_id INTEGER, -- For wheels: associated starter ID
chain_order INTEGER, -- For wheels: order requirement
shift_icon INTEGER, -- For wheels: shift ability icon
spell_id INTEGER, -- For wheels: completion spell
chance REAL, -- For wheels: selection probability
ability1-6 INTEGER, -- Ability icons
name TEXT,
description TEXT
);
```
### heroic_op_instances Table
Tracks active HO instances:
```sql
CREATE TABLE heroic_op_instances (
id INTEGER PRIMARY KEY,
encounter_id INTEGER,
starter_id INTEGER,
wheel_id INTEGER,
state INTEGER,
countered_1-6 INTEGER, -- Completion status per ability
shift_used INTEGER,
time_remaining INTEGER,
-- ... additional fields
);
```
## Key Features
### Multi-Class Initiation
- Specific classes can initiate specific starter chains
- Universal starters (class 0) available to all classes
- Class validation ensures proper HO eligibility
### Dynamic Wheel Selection
- Random selection from available wheels per starter
- Weighted probability based on chance values
- Prevents predictable HO patterns
### Wheel Shifting
- **One-time ability** to change wheels during wheel phase
- **Timing Restrictions**: Only before progress (unordered) or at start (ordered)
- **Strategic Element**: Allows adaptation to group composition
### Precise Timing
- Configurable wheel phase timers (default 10 seconds)
- Millisecond precision for fair completion windows
- Automatic cleanup of expired HOs
### Order Enforcement
- **Unordered Wheels**: Any ability can be completed in any sequence
- **Ordered Wheels**: Abilities must be completed in specific order
- **Validation**: System prevents invalid ability usage
## Usage Examples
### Starting a Heroic Opportunity
```go
// Initialize HO manager
manager := NewHeroicOPManager(masterList, database, clientManager, encounterManager, playerManager)
manager.Initialize(ctx, config)
// Start HO for encounter
ho, err := manager.StartHeroicOpportunity(ctx, encounterID, initiatorCharacterID)
if err != nil {
return fmt.Errorf("failed to start HO: %w", err)
}
```
### Processing Player Abilities
```go
// Player uses ability during HO
err := manager.ProcessAbility(ctx, ho.ID, characterID, abilityIcon)
if err != nil {
// Ability not allowed or HO in wrong state
return err
}
// Check if HO completed
if ho.IsComplete() {
// Completion spell will be cast automatically
log.Printf("HO completed by character %d", ho.CompletedBy)
}
```
### Timer Management
```go
// Update all active HO timers (called periodically)
manager.UpdateTimers(ctx, deltaMilliseconds)
// Expired HOs are automatically failed and cleaned up
```
## Client Communication
### Packet Types
- **HO Start**: Initial HO initiation notification
- **HO Update**: Wheel phase updates with ability icons
- **HO Progress**: Real-time completion progress
- **HO Timer**: Timer countdown updates
- **HO Complete**: Success/failure notification
- **HO Shift**: Wheel change notification
### Real-time Updates
- Participants receive immediate feedback on ability usage
- Progress updates show completion status
- Timer updates maintain urgency during wheel phase
## Configuration
### System Parameters
```go
config := &HeroicOPConfig{
DefaultWheelTimer: 10000, // 10 seconds in milliseconds
MaxConcurrentHOs: 3, // Per encounter
EnableLogging: true,
EnableStatistics: true,
EnableShifting: true,
RequireClassMatch: true,
}
```
### Performance Tuning
- **Concurrent HOs**: Limit simultaneous HOs per encounter
- **Cleanup Intervals**: Regular removal of expired instances
- **Database Batching**: Efficient event logging
- **Memory Management**: Instance pooling for high-traffic servers
## Integration Points
### Spell System Integration
- Completion spells cast through spell manager
- Spell validation and effect application
- Integration with existing spell mechanics
### Encounter System Integration
- HO availability tied to active encounters
- Participant validation through encounter membership
- Encounter end triggers HO cleanup
### Player System Integration
- Class validation for starter eligibility
- Ability validation for wheel completion
- Player state checking (online, in combat, etc.)
## Error Handling
### Common Error Scenarios
- **Invalid State**: Ability used when HO not in correct phase
- **Timer Expired**: Wheel phase timeout
- **Ability Not Allowed**: Ability doesn't match current requirements
- **Shift Already Used**: Attempting multiple shifts
- **Player Not in Encounter**: Participant validation failure
### Recovery Mechanisms
- Automatic HO failure on unrecoverable errors
- Client notification of error conditions
- Logging for debugging and analysis
- Graceful degradation when components unavailable
## Thread Safety
All core components use proper Go concurrency patterns:
- **RWMutex Protection**: Reader-writer locks for shared data
- **Atomic Operations**: Lock-free operations where possible
- **Context Cancellation**: Proper cleanup on shutdown
- **Channel Communication**: Safe inter-goroutine messaging
## Performance Considerations
### Memory Management
- Object pooling for frequently created instances
- Efficient cleanup of expired HOs
- Bounded history retention
### Database Optimization
- Indexed queries for fast lookups
- Batch operations for event logging
- Connection pooling for concurrent access
### Network Efficiency
- Minimal packet sizes for real-time updates
- Client version-specific optimizations
- Broadcast optimization for group updates
## Testing
### Unit Tests
- Individual component validation
- State machine testing
- Error condition handling
- Concurrent access patterns
### Integration Tests
- Full HO lifecycle scenarios
- Multi-player coordination
- Database persistence validation
- Client communication verification
## Future Enhancements
### Planned Features
- **Lua Scripting**: Custom HO behaviors
- **Advanced Statistics**: Detailed analytics
- **Dynamic Difficulty**: Adaptive timer adjustments
- **Guild Coordination**: Guild-wide HO tracking
### Scalability Improvements
- **Clustering Support**: Multi-server HO coordination
- **Caching Layer**: Redis integration for high-traffic
- **Async Processing**: Background HO processing
- **Load Balancing**: Distribution across game servers
## Conversion Notes
This Go implementation maintains full compatibility with the original C++ EQ2EMu system while modernizing the architecture:
- **Thread Safety**: Proper Go concurrency patterns
- **Error Handling**: Comprehensive error wrapping
- **Context Usage**: Cancellation and timeout support
- **Interface Design**: Modular, testable components
- **Database Integration**: Modern query patterns
All original functionality has been preserved, including complex mechanics like wheel shifting, ordered/unordered completion, and precise timing requirements.