eq2go/internal/recipes/interfaces.go

339 lines
11 KiB
Go

package recipes
import "eq2emu/internal/database"
// RecipeSystemAdapter provides integration interfaces for the recipe system
// Enables seamless integration with player, database, item, and client systems
type RecipeSystemAdapter interface {
// Player Integration
GetPlayerRecipeList(characterID int32) *PlayerRecipeList
GetPlayerRecipeBookList(characterID int32) *PlayerRecipeBookList
LoadPlayerRecipes(characterID int32) error
LoadPlayerRecipeBooks(characterID int32) error
// Recipe Management
GetRecipe(recipeID int32) *Recipe
GetRecipeBook(bookID int32) *Recipe
ValidateRecipe(recipe *Recipe) bool
CanPlayerUseRecipe(characterID int32, recipeID int32) bool
// Progress Tracking
UpdateRecipeProgress(characterID int32, recipeID int32, stage int8) error
GetRecipeProgress(characterID int32, recipeID int32) int8
// System Operations
GetStatistics() RecipeManagerStats
Validate() []string
Size() (recipes int32, recipeBooks int32)
}
// DatabaseRecipeAdapter handles database operations for recipes
// Abstracts database interactions for easier testing and multiple database support
type DatabaseRecipeAdapter interface {
// Recipe Loading
LoadAllRecipes() ([]*Recipe, error)
LoadAllRecipeBooks() ([]*Recipe, error)
LoadRecipeComponents(recipeID int32) (map[int8][]int32, error)
// Player Recipe Operations
LoadPlayerRecipes(characterID int32) ([]*Recipe, error)
LoadPlayerRecipeBooks(characterID int32) ([]*Recipe, error)
SavePlayerRecipe(characterID int32, recipeID int32) error
SavePlayerRecipeBook(characterID int32, recipebookID int32) error
UpdatePlayerRecipe(characterID int32, recipeID int32, highestStage int8) error
// Validation and Utilities
RecipeExists(recipeID int32) bool
RecipeBookExists(bookID int32) bool
GetRecipesByTier(tier int8) ([]*Recipe, error)
GetRecipesBySkill(skillID int32) ([]*Recipe, error)
}
// PlayerRecipeAdapter integrates with player management systems
// Provides player-specific recipe functionality and validation
type PlayerRecipeAdapter interface {
// Player Validation
PlayerExists(characterID int32) bool
GetPlayerLevel(characterID int32) int32
GetPlayerTradeskillLevel(characterID int32, skillID int32) int32
GetPlayerClass(characterID int32) int8
// Recipe Access Control
CanPlayerLearnRecipe(characterID int32, recipeID int32) bool
CanPlayerUseRecipeBook(characterID int32, bookID int32) bool
HasPlayerLearnedRecipe(characterID int32, recipeID int32) bool
HasPlayerRecipeBook(characterID int32, bookID int32) bool
// Experience and Progression
AwardTradeskillExperience(characterID int32, skillID int32, experience int32) error
UpdateTradeskillLevel(characterID int32, skillID int32, level int32) error
// Notifications
NotifyRecipeLearned(characterID int32, recipeID int32) error
NotifyRecipeBookObtained(characterID int32, bookID int32) error
}
// ItemRecipeAdapter integrates with item management systems
// Handles item-related recipe operations and validation
type ItemRecipeAdapter interface {
// Item Validation
ItemExists(itemID int32) bool
GetItemName(itemID int32) string
GetItemIcon(itemID int32) int16
GetItemLevel(itemID int32) int32
IsItemTradeskillTool(itemID int32) bool
// Recipe Component Validation
ValidateRecipeComponents(recipeID int32) bool
GetComponentItemName(itemID int32) string
GetComponentQuantityRequired(recipeID int32, itemID int32) int16
// Inventory Integration
PlayerHasComponents(characterID int32, recipeID int32) bool
ConsumeRecipeComponents(characterID int32, recipeID int32) error
AwardRecipeProduct(characterID int32, itemID int32, quantity int8) error
// Recipe Book Items
IsRecipeBookItem(itemID int32) bool
GetRecipeBookRecipes(bookID int32) ([]int32, error)
ConsumeRecipeBook(characterID int32, bookID int32) error
}
// ClientRecipeAdapter handles client communication for recipes
// Manages packet building and client-side recipe display
type ClientRecipeAdapter interface {
// Recipe Display
SendRecipeList(characterID int32) error
SendRecipeBookList(characterID int32) error
SendRecipeDetails(characterID int32, recipeID int32) error
// Recipe Learning
SendRecipeLearned(characterID int32, recipeID int32) error
SendRecipeBookObtained(characterID int32, bookID int32) error
SendRecipeProgress(characterID int32, recipeID int32, stage int8) error
// Tradeskill Interface
SendTradeskillWindow(characterID int32, deviceID int32) error
SendRecipeComponents(characterID int32, recipeID int32) error
SendCraftingResults(characterID int32, success bool, itemID int32, quantity int8) error
// Error Messages
SendRecipeError(characterID int32, errorMessage string) error
SendInsufficientComponents(characterID int32, recipeID int32) error
SendInvalidRecipe(characterID int32, recipeID int32) error
}
// EventRecipeAdapter handles recipe-related event processing
// Manages recipe learning, crafting events, and system notifications
type EventRecipeAdapter interface {
// Recipe Events
OnRecipeLearned(characterID int32, recipeID int32) error
OnRecipeBookObtained(characterID int32, bookID int32) error
OnRecipeCrafted(characterID int32, recipeID int32, success bool) error
OnCraftingStarted(characterID int32, recipeID int32) error
OnCraftingCompleted(characterID int32, recipeID int32, stage int8) error
// Achievement Integration
CheckCraftingAchievements(characterID int32, recipeID int32) error
UpdateCraftingStatistics(characterID int32, recipeID int32, success bool) error
// Guild Integration
NotifyGuildCrafting(characterID int32, recipeID int32) error
UpdateGuildCraftingContributions(characterID int32, recipeID int32) error
}
// RecipeAware interface for entities that can interact with recipes
// Provides basic recipe interaction capabilities for players and NPCs
type RecipeAware interface {
// Recipe Knowledge
GetKnownRecipes() []int32
GetRecipeBooks() []int32
KnowsRecipe(recipeID int32) bool
HasRecipeBook(bookID int32) bool
// Recipe Learning
LearnRecipe(recipeID int32) error
ObtainRecipeBook(bookID int32) error
ForgetRecipe(recipeID int32) error
// Crafting Capabilities
CanCraftRecipe(recipeID int32) bool
GetCraftingLevel(skillID int32) int32
GetMaxCraftingStage(recipeID int32) int8
}
// CraftingRecipeAdapter integrates with crafting system
// Handles active crafting sessions and recipe execution
type CraftingRecipeAdapter interface {
// Crafting Session Management
StartCraftingSession(characterID int32, recipeID int32, deviceID int32) error
ProcessCraftingStage(characterID int32, stage int8) error
CompleteCraftingSession(characterID int32, success bool) error
CancelCraftingSession(characterID int32) error
// Crafting Validation
ValidateCraftingDevice(deviceID int32, recipeID int32) bool
ValidateCraftingComponents(characterID int32, recipeID int32) bool
ValidateCraftingSkill(characterID int32, recipeID int32) bool
// Progress Tracking
GetCraftingProgress(characterID int32) (recipeID int32, stage int8, success bool)
UpdateCraftingStage(characterID int32, stage int8) error
// Resource Management
ConsumeCraftingResources(characterID int32, recipeID int32, stage int8) error
AwardCraftingProducts(characterID int32, recipeID int32, stage int8) error
CalculateCraftingSuccess(characterID int32, recipeID int32, stage int8) bool
}
// RecipeSystemDependencies aggregates all recipe system dependencies
// Provides a single interface for system-wide recipe functionality
type RecipeSystemDependencies struct {
Database DatabaseRecipeAdapter
Player PlayerRecipeAdapter
Item ItemRecipeAdapter
Client ClientRecipeAdapter
Event EventRecipeAdapter
Crafting CraftingRecipeAdapter
RecipeSystem RecipeSystemAdapter
}
// RecipeManagerAdapter provides high-level recipe management operations
// Simplifies recipe system access for external systems
type RecipeManagerAdapter struct {
manager *RecipeManager
dependencies *RecipeSystemDependencies
}
// NewRecipeManagerAdapter creates a new recipe manager adapter with dependencies
func NewRecipeManagerAdapter(db *database.DB, deps *RecipeSystemDependencies) *RecipeManagerAdapter {
return &RecipeManagerAdapter{
manager: NewRecipeManager(db),
dependencies: deps,
}
}
// GetManager returns the underlying recipe manager
func (rma *RecipeManagerAdapter) GetManager() *RecipeManager {
return rma.manager
}
// GetDependencies returns the system dependencies
func (rma *RecipeManagerAdapter) GetDependencies() *RecipeSystemDependencies {
return rma.dependencies
}
// Initialize loads all recipes and recipe books from the database
func (rma *RecipeManagerAdapter) Initialize() error {
if err := rma.manager.LoadRecipes(); err != nil {
return err
}
return rma.manager.LoadRecipeBooks()
}
// PlayerLearnRecipe handles complete recipe learning workflow
func (rma *RecipeManagerAdapter) PlayerLearnRecipe(characterID int32, recipeID int32) error {
// Validate recipe exists
recipe := rma.manager.GetRecipe(recipeID)
if recipe == nil {
return ErrRecipeNotFound
}
// Check player can learn recipe
if rma.dependencies.Player != nil {
if !rma.dependencies.Player.CanPlayerLearnRecipe(characterID, recipeID) {
return ErrCannotLearnRecipe
}
}
// Save recipe to database
if err := rma.manager.SavePlayerRecipe(characterID, recipeID); err != nil {
return err
}
// Notify client
if rma.dependencies.Client != nil {
if err := rma.dependencies.Client.SendRecipeLearned(characterID, recipeID); err != nil {
return err
}
}
// Fire event
if rma.dependencies.Event != nil {
return rma.dependencies.Event.OnRecipeLearned(characterID, recipeID)
}
return nil
}
// PlayerObtainRecipeBook handles complete recipe book acquisition workflow
func (rma *RecipeManagerAdapter) PlayerObtainRecipeBook(characterID int32, bookID int32) error {
// Validate recipe book exists
book := rma.manager.GetRecipeBook(bookID)
if book == nil {
return ErrRecipeBookNotFound
}
// Check player can use recipe book
if rma.dependencies.Player != nil {
if !rma.dependencies.Player.CanPlayerUseRecipeBook(characterID, bookID) {
return ErrCannotUseRecipeBook
}
}
// Save recipe book to database
if err := rma.manager.SavePlayerRecipeBook(characterID, bookID); err != nil {
return err
}
// Consume recipe book item
if rma.dependencies.Item != nil {
if err := rma.dependencies.Item.ConsumeRecipeBook(characterID, bookID); err != nil {
return err
}
}
// Notify client
if rma.dependencies.Client != nil {
if err := rma.dependencies.Client.SendRecipeBookObtained(characterID, bookID); err != nil {
return err
}
}
// Fire event
if rma.dependencies.Event != nil {
return rma.dependencies.Event.OnRecipeBookObtained(characterID, bookID)
}
return nil
}
// ValidateRecipeSystem performs comprehensive system validation
func (rma *RecipeManagerAdapter) ValidateRecipeSystem() []string {
issues := rma.manager.Validate()
// Add dependency validation
if rma.dependencies == nil {
issues = append(issues, "recipe system dependencies not configured")
return issues
}
if rma.dependencies.Database == nil {
issues = append(issues, "database adapter not configured")
}
if rma.dependencies.Player == nil {
issues = append(issues, "player adapter not configured")
}
if rma.dependencies.Item == nil {
issues = append(issues, "item adapter not configured")
}
if rma.dependencies.Client == nil {
issues = append(issues, "client adapter not configured")
}
return issues
}