60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
package gameserver
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"gac-hkrpg-go/internal/common"
|
|
)
|
|
|
|
type peakBattleRules struct {
|
|
ClientVersion string `json:"client_version"`
|
|
Source struct {
|
|
AssemblySHA256 string `json:"assembly_sha256"`
|
|
CaptureSHA256 string `json:"capture_sha256"`
|
|
} `json:"source"`
|
|
TurnLimits map[string]uint32 `json:"turn_limits"`
|
|
}
|
|
|
|
func (r peakBattleRules) limit(stage PeakStageData, event uint32) (uint32, error) {
|
|
name := "ChallengePeak_Mob_Turn_Limit"
|
|
if stage.IsBoss {
|
|
name = "ChallengePeak_Boss_Turn_Limit"
|
|
if stage.HardEventID != 0 && event == stage.HardEventID {
|
|
name = "ChallengePeak_HardBoss_Turn_Limit"
|
|
}
|
|
}
|
|
limit := r.TurnLimits[name]
|
|
if limit == 0 {
|
|
return 0, fmt.Errorf("missing native Peak constant %s", name)
|
|
}
|
|
return limit, nil
|
|
}
|
|
|
|
func setPeakBattleConfig(s *Session, avatars []uint32, peakID, eventID uint32, buffs []uint32) error {
|
|
raw, err := common.ReadResourceFile("resources/PeakBattleConfig.json")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var rules peakBattleRules
|
|
if err := json.Unmarshal(raw, &rules); err != nil {
|
|
return err
|
|
}
|
|
cfg, err := common.LoadRuntimeConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if rules.ClientVersion != cfg.ClientVersion || len(rules.Source.AssemblySHA256) != 64 || len(rules.Source.CaptureSHA256) != 64 {
|
|
return fmt.Errorf("Peak rules require matching Client version and capture provenance")
|
|
}
|
|
stage, ok := getChallengeData().Peak[itoa(int(peakID))]
|
|
if !ok || (eventID != stage.EventID && (stage.HardEventID == 0 || eventID != stage.HardEventID)) {
|
|
return fmt.Errorf("Peak %d has no matching event %d", peakID, eventID)
|
|
}
|
|
limit, err := rules.limit(stage, eventID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return setChallengeBattleConfigWithLimit(s, avatars, peakID, eventID, buffs, common.BattleTypeAA, limit)
|
|
}
|