engine.go
Обзор
Файл engine.go реализует игровой движок (GameEngine) для валидации игровых действий, расчёта состояния игроков и применения правил игры. Он содержит логику обработки различных игровых событий (например, прокачка уровня, PvP-сражения, крафт предметов, торговля на рынке и др.), а также механизмы валидации, предотвращения читерства и синхронизации состояния игроков между разными блокчейн-сетями (кросс-чейн).
Основная цель файла — обеспечить корректное и справедливое изменение состояния игроков на основе их действий, учитывая текущее состояние, правила игры, а также ограничения для кросс-чейн взаимодействия.
Основные компоненты
GameEngine
Класс GameEngine — это ядро логики игры, содержащее правила и методы валидации и обработки действий.
Свойства
rules *GameRules— текущие правила игры с параметрами затрат, наград и ограничений.
Конструкторы
NewGameEngine() *GameEngineСоздаёт новый экземпляр с дефолтными правилами.
NewGameEngineWithRules(rules *GameRules) *GameEngineСоздаёт экземпляр с пользовательскими правилами.
Методы
GetRules() *GameRulesВозвращает текущие правила игры.
UpdateRules(rules *GameRules)Обновляет правила игры (например, через механизм управления).
ValidateAction(ctx context.Context, action contracts.GameManagerGameAction, currentState PlayerState) ActionResultОсновной метод валидации и обработки входящего действия игрока. В зависимости от типа действия вызывает соответствующую внутреннюю функцию обработки.
BatchValidateActions(ctx context.Context, actions []contracts.GameManagerGameAction, playerStates map[common.Address]PlayerState) (map[common.Address]PlayerState, error)Обрабатывает пакет действий от разных игроков, возвращая обновлённые состояния или ошибку при неудачной валидации.
Методы
processSpendMana,processEarnMana,processLevelUp,processCraftItem,processPvPBattle,processMarketplaceTradeРеализуют логику обработки конкретных типов действий.
Методы для кросс-чейн валидации и синхронизации:
ValidateCrossChainActionProcessCrossChainBatchSynchronizePlayerStateAcrossChainsВспомогательные методы валидации и слияния состояний.
Методы для вычисления опыта, стоимости действий, прогрессии уровней, результатов сражений и торгов.
GameRules
Структура, определяющая основные параметры игры:
Затраты (стоимость повышения уровня, крафта, входа в PvP, комиссия рынка)
Награды (за победу в PvP, квесты, ежедневные бонусы)
Ограничения (максимальное количество маны за действие, максимальное количество действий в батче)
PlayerState
Текущее состояние игрока:
Адрес игрока
Баланс маны
Уровень, опыт
Время последнего действия
Победы/поражения
Рейтинг (ELO)
Статистика по мане и крафту
ActionResult
Результат обработки действия:
Успешность
Новое состояние игрока
Изменение маны (положительное/отрицательное)
Текст ошибки (если есть)
Важные структуры параметров и результатов
LevelUpParams— параметры прокачки уровня (цель, распределение статов, таймстамп)PvPBattleParams— параметры PvP-боя (оппонент, тип боя, хэш боя, таймстамп)BattleResult— результат боя (победа/поражение, урон, длительность)CraftingParams— параметры крафта (рецепт, количество, ресурсы)CraftingResult— результат крафта (успех, качество, бонусы)MarketplaceTradeParams— параметры торговли (товар, количество, цена, тип торговли)MarketplaceTradeResult— результат торговли (успех, количество проданных/купленных, рыночное влияние)CrossChainGameAction — кросс-чейн действие с указанием цепочек
CrossChainActionResult— результат валидации кросс-чейн действия
Основные алгоритмы и особенности реализации
Валидация параметров действий включает проверку таймстампов (ограничены по времени), уровней, количества, ресурсов, рейтинга и других ограничений для предотвращения читерства.
Расчёт стоимости действий учитывает базовые ставки из правил и модификаторы, например скидки за уровень игрока.
Прокачка уровня реализована с квадратичной зависимостью стоимости: (level+1)^2 * базовая стоимость, с начислением бонусов к статам.
PvP сражения используют детерминированный алгоритм с использованием хэша и рейтинга игроков (ELO-система) для вычисления вероятности победы, изменения рейтинга и наград.
Крафтинг учитывает рецепт, количество, ресурсы, шансы на успех, качество предметов и критические успехи. Результаты определяются детерминированно с помощью хэша.
Торговля на рынке включает расчет комиссий, проверку цены, успеха сделки и рыночного влияния, с учетом уровня игрока и параметров сделки.
Кросс-чейн обработка предусматривает дополнительные ограничения и проверку совместимости действий с целевой цепочкой, а также слияние состояний игроков с разных цепочек с разрешением конфликтов.
Взаимодействие с другими частями системы
Использует типы и интерфейсы из пакета
contracts(например,GameManagerGameAction), который, вероятно, содержит определения действий игроков и их сериализацию.Взаимодействует с Ethereum-адресами (
common.Address) и криптографией (crypto.Keccak256Hash) из библиотеки go-ethereum для обеспечения детерминизма и безопасности.Предполагает, что состояние игроков и их действия приходят из внешних источников (смарт-контракты, клиентские приложения), а возвращаемые результаты могут быть использованы для обновления блокчейн-состояния или внутреннего состояния игровой платформы.
Примеры использования
// Создание игрового движка с дефолтными правилами
engine := NewGameEngine()
// Инициализация состояния игрока
playerState := PlayerState{
Player: common.HexToAddress("0x123..."),
ManaBalance: big.NewInt(1000),
Level: big.NewInt(1),
Experience: big.NewInt(0),
// ...
}
// Пример действия - прокачка уровня
action := contracts.GameManagerGameAction{
Player: playerState.Player,
ActionType: 2, // LEVEL_UP
ManaAmount: big.NewInt(0),
ActionParams: []byte{/* сериализованные параметры */},
}
// Валидация действия
result := engine.ValidateAction(context.Background(), action, playerState)
if result.Success {
playerState = result.NewState
} else {
fmt.Println("Ошибка:", result.Error)
}
Mermaid диаграмма структуры
classDiagram
class GameEngine {
- rules: *GameRules
+ NewGameEngine()
+ NewGameEngineWithRules(rules *GameRules)
+ GetRules() *GameRules
+ UpdateRules(rules *GameRules)
+ ValidateAction(ctx, action, currentState) ActionResult
+ BatchValidateActions(ctx, actions, playerStates) (map, error)
+ ValidateCrossChainAction(ctx, action, currentState, targetChain) CrossChainActionResult
+ ProcessCrossChainBatch(ctx, actions, playerStates) (map, error)
+ SynchronizePlayerStateAcrossChains(ctx, player, sourceState, targetState, sourceChain, targetChain) (PlayerState, error)
- processSpendMana(action, state) ActionResult
- processEarnMana(action, state) ActionResult
- processLevelUp(action, state) ActionResult
- processCraftItem(action, state) ActionResult
- processPvPBattle(action, state) ActionResult
- processMarketplaceTrade(action, state) ActionResult
- parseLevelUpParams(actionParams) (LevelUpParams, error)
- validateLevelUp(params, playerState) error
- calculateStatProgression(newLevel) StatProgression
- parsePvPBattleParams(actionParams) (PvPBattleParams, error)
- validatePvPBattle(params, playerState) error
- calculateBattleResult(params, playerState) BattleResult
- parseCraftingParams(actionParams) (CraftingParams, error)
- validateCrafting(params, playerState) error
- calculateCraftingCost(params, playerLevel) *big.Int
- calculateCraftingResult(params, playerState) CraftingResult
- parseMarketplaceTradeParams(actionParams) (MarketplaceTradeParams, error)
- validateMarketplaceTrade(params, playerState) error
- calculateMarketplaceTradeCost(params, playerLevel) MarketplaceTradeCost
- calculateMarketplaceTradeResult(params, playerState) MarketplaceTradeResult
- validateCrossChainConstraints(action, targetChain) error
- mergePlayerStates(sourceState, targetState, sourceChain, targetChain) PlayerState
- isActionTypeCrossChainCompatible(actionType) bool
- validateCrossChainLevelUp(action) error
- validateCrossChainCrafting(action) error
- validateCrossChainPvP(action, targetChain) error
- validateCrossChainMarketplace(action, targetChain) error
}
class GameRules {
+ LevelUpBaseCost: *big.Int
+ CraftingBaseCost: *big.Int
+ PvPEntryFee: *big.Int
+ MarketplaceFee: *big.Int
+ PvPWinReward: *big.Int
+ QuestReward: *big.Int
+ DailyReward: *big.Int
+ MaxManaPerAction: *big.Int
+ MaxActionsPerBatch: int
}
class PlayerState {
+ Player: common.Address
+ ManaBalance: *big.Int
+ Level: *big.Int
+ Experience: *big.Int
+ LastActionTimestamp: *big.Int
+ Wins: *big.Int
+ Losses: *big.Int
+ Rating: *big.Int
+ TotalManaEarned: *big.Int
+ TotalManaSpent: *big.Int
+ ItemsCrafted: *big.Int
}
class ActionResult {
+ Success: bool
+ NewState: PlayerState
+ ManaChange: *big.Int
+ Error: string
}
GameEngine --> GameRules
GameEngine --> PlayerState
GameEngine --> ActionResult
Заключение
Файл engine.go предоставляет комплексный и детализированный игровой движок с поддержкой разнообразных игровых механик и кросс-чейн взаимодействия. Его модульная структура и чёткое разделение логики по типам действий позволяют масштабировать функционал и поддерживать высокую безопасность игрового процесса.