Compare commits

..
2 Commits
Author SHA1 Message Date
zephyr 7085fea1b7 umadump/replay: implement race sim decoding
ci/woodpecker/push/zenno Pipeline was successful
ci/woodpecker/push/horsebot Pipeline was successful
2026-08-30 01:56:43 -04:00
zephyr 1f195024e1 umadump/ism: idle single mode model 2026-08-26 21:08:46 -04:00
7 changed files with 12995 additions and 0 deletions
+249
View File
@@ -0,0 +1,249 @@
package ism
import "git.sunturtle.xyz/zephyr/horse"
type Skill struct {
ID horse.SkillID `json:"skill_id"`
Level int32 `json:"level"`
}
type SkillTip struct {
GroupID horse.SkillGroupID `json:"group_id"`
Rarity int32 `json:"rarity"`
Level int32 `json:"level"`
}
type SingleModeSupportCard struct {
Position int32 `json:"position"`
ID horse.SupportCardID `json:"support_card_id"`
LimitBreak int32 `json:"limit_break_count"`
Exp int32 `json:"exp"`
OwnerID int32 `json:"owner_viewer_id"`
}
type GroupOuting struct {
CharaID horse.CharacterID `json:"chara_id"`
IsOuting int32 `json:"is_outing"`
StoryStep int32 `json:"story_step"`
}
type Evaluation struct {
TargetID int32 `json:"target_id"`
TrainingPartner int32 `json:"training_partner_id"`
Evaluation int32 `json:"evaluation"`
IsOuting int32 `json:"is_outing"`
StoryStep int32 `json:"story_step"`
IsAppear int32 `json:"is_appear"`
GroupOutings []GroupOuting `json:"group_outing_info_array"`
}
type TrainingLevel struct {
CommandID int32 `json:"command_id"`
Level int32 `json:"level"`
}
type GuestOuting struct {
SupportCardID horse.SupportCardID `json:"support_card_id"`
StoryStep int32 `json:"story_step"`
GroupOutings []GroupOuting `json:"group_outing_info_array"`
}
type SingleModeSkillUpgrade struct {
ConditionID int32 `json:"condition_id"`
Total int32 `json:"total_count"`
Current int32 `json:"current_count"`
}
type SingleModeChara struct {
SingleModeCharaID int32 `json:"single_mode_chara_id"`
CardID horse.UmaID `json:"card_id"`
CharaGrade int32 `json:"chara_grade"`
Speed int32 `json:"speed"`
Stamina int32 `json:"stamina"`
Power int32 `json:"power"`
Wiz int32 `json:"wiz"`
Guts int32 `json:"guts"`
Vital int32 `json:"vital"`
MaxSpeed int32 `json:"max_speed"`
MaxStamina int32 `json:"max_stamina"`
MaxPower int32 `json:"max_power"`
MaxWiz int32 `json:"max_wiz"`
MaxGuts int32 `json:"max_guts"`
DefaultMaxSpeed int32 `json:"default_max_speed"`
DefaultMaxStamina int32 `json:"default_max_stamina"`
DefaultMaxPower int32 `json:"default_max_power"`
DefaultMaxWiz int32 `json:"default_max_wiz"`
DefaultMaxGuts int32 `json:"default_max_guts"`
MaxVital int32 `json:"max_vital"`
Motivation int32 `json:"motivation"`
Fans int32 `json:"fans"`
Rarity int32 `json:"rarity"`
RaceProgramID int32 `json:"race_program_id"`
ReserveRaceProgramID int32 `json:"reserve_race_program_id"`
RaceRunningStyle int32 `json:"race_running_style"`
IsShortRace int32 `json:"is_short_race"`
TalentLevel int32 `json:"talent_level"`
Skills []Skill `json:"skill_array"`
DisableSkillIDs []horse.SkillID `json:"disable_skill_id_array"`
SkillTips []SkillTip `json:"skill_tips_array"`
SupportCards []SingleModeSupportCard `json:"support_card_array"`
SuccessionTrainedCharaID1 int32 `json:"succession_trained_chara_id_1"`
SuccessionTrainedCharaID2 int32 `json:"succession_trained_chara_id_2"`
ProperDistanceShort horse.AptitudeLevel `json:"proper_distance_short"`
ProperDistanceMile horse.AptitudeLevel `json:"proper_distance_mile"`
ProperDistanceMiddle horse.AptitudeLevel `json:"proper_distance_middle"`
ProperDistanceLong horse.AptitudeLevel `json:"proper_distance_long"`
ProperRunningStyleNige horse.AptitudeLevel `json:"proper_running_style_nige"`
ProperRunningStyleSenko horse.AptitudeLevel `json:"proper_running_style_senko"`
ProperRunningStyleSashi horse.AptitudeLevel `json:"proper_running_style_sashi"`
ProperRunningStyleOikomi horse.AptitudeLevel `json:"proper_running_style_oikomi"`
ProperGroundTurf horse.AptitudeLevel `json:"proper_ground_turf"`
ProperGroundDirt horse.AptitudeLevel `json:"proper_ground_dirt"`
Turn int32 `json:"turn"`
SkillPoint int32 `json:"skill_point"`
ShortCutState int32 `json:"short_cut_state"`
State int32 `json:"state"`
PlayingState int32 `json:"playing_state"`
ScenarioID horse.ScenarioID `json:"scenario_id"`
RouteID int32 `json:"route_id"`
StartTime string `json:"start_time"`
Evaluations []Evaluation `json:"evaluation_info_array"`
TrainingLevels []TrainingLevel `json:"training_level_info_array"`
NicknameIDs []int32 `json:"nickname_id_array"`
CharaEffectIDs []int32 `json:"chara_effect_id_array"`
RouteRaceIDs []int32 `json:"route_race_id_array"`
GuestOutings []GuestOuting `json:"guest_outing_info_array"`
SkillUpgrades []SingleModeSkillUpgrade `json:"skill_upgrade_info_array"`
}
type CharaEffectLog struct {
CharaEffectID int32 `json:"chara_effect_id"`
IsActive bool `json:"is_active"`
}
type IdleSingleModeSignedInt struct {
Sign int32 `json:"sign"`
Value int32 `json:"value"`
}
type IdleSingleModeGainInfo struct {
Speed IdleSingleModeSignedInt `json:"speed"`
Stamina IdleSingleModeSignedInt `json:"stamina"`
Power IdleSingleModeSignedInt `json:"power"`
Wiz IdleSingleModeSignedInt `json:"wiz"`
Guts IdleSingleModeSignedInt `json:"guts"`
MaxSpeed int32 `json:"max_speed"`
MaxStamina int32 `json:"max_stamina"`
MaxPower int32 `json:"max_power"`
MaxWiz int32 `json:"max_wiz"`
MaxGuts int32 `json:"max_guts"`
ProperDistanceShort horse.AptitudeLevel `json:"proper_distance_short"`
ProperDistanceMile horse.AptitudeLevel `json:"proper_distance_mile"`
ProperDistanceMiddle horse.AptitudeLevel `json:"proper_distance_middle"`
ProperDistanceLong horse.AptitudeLevel `json:"proper_distance_long"`
ProperRunningStyleNige horse.AptitudeLevel `json:"proper_running_style_nige"`
ProperRunningStyleSenko horse.AptitudeLevel `json:"proper_running_style_senko"`
ProperRunningStyleSashi horse.AptitudeLevel `json:"proper_running_style_sashi"`
ProperRunningStyleOikomi horse.AptitudeLevel `json:"proper_running_style_oikomi"`
ProperGroundTurf horse.AptitudeLevel `json:"proper_ground_turf"`
ProperGroundDirt horse.AptitudeLevel `json:"proper_ground_dirt"`
SkillPoint int32 `json:"skill_point"`
SkillTips []SkillTip `json:"skill_tips_array"`
}
type IdleSingleModeSupportCardGain struct {
SupportCardID horse.SupportCardID `json:"support_card_id"`
GainInfo IdleSingleModeGainInfo `json:"gain_info"`
}
type Factor struct {
FactorID horse.SparkID `json:"factor_id"`
Level int32 `json:"level"`
}
type IdleSingleModeSuccessionFactorGain struct {
Year int32 `json:"year"`
GainFactorInfo []Factor `json:"gain_factor_info_array"`
}
type SingleRaceHistory struct {
Turn int32 `json:"turn"`
ProgramID int32 `json:"program_id"`
Weather int32 `json:"weather"`
GroundCondition int32 `json:"ground_condition"`
RunningStyle int32 `json:"running_style"`
ResultRank int32 `json:"result_rank"`
FrameOrder int32 `json:"frame_order"`
NPCCount int32 `json:"npc_count"`
}
type RaceReward struct {
ItemType int32 `json:"item_type"`
ItemID int32 `json:"item_id"`
ItemNum int32 `json:"item_num"`
}
type RaceRewardLimit struct {
RewardID int32 `json:"reward_id"`
ItemType int32 `json:"item_type"`
ItemID int32 `json:"item_id"`
ItemNum int32 `json:"item_num"`
RestCount int32 `json:"rest_count"`
}
type CharaRaceReward struct {
ResultRank int32 `json:"result_rank"`
ResultTime int32 `json:"result_time"`
RaceReward []RaceReward `json:"race_reward"`
RaceRewardBonus []RaceReward `json:"race_reward_bonus"`
RaceRewardPlusBonus []RaceReward `json:"race_reward_plus_bonus"`
RaceRewardBonusWin []RaceReward `json:"race_reward_bonus_win"`
RaceRewardLimit []RaceRewardLimit `json:"race_reward_limit"`
GainedFans int32 `json:"gained_fans"`
CampaignIDs []int32 `json:"campaign_id_array"`
}
type IdleSingleModeRaceHistory struct {
RaceHistory SingleRaceHistory `json:"race_history"`
RaceRewardInfo CharaRaceReward `json:"race_reward_info"`
LoseTipsID int32 `json:"lose_tips_id"`
}
type IdleSingleModeProgressLog struct {
CharaEffectLog []CharaEffectLog `json:"chara_effect_log_array"`
SupportCardGains []IdleSingleModeSupportCardGain `json:"support_card_gain_info_array"`
EventGain IdleSingleModeGainInfo `json:"event_gain_info"`
SuccessionGain IdleSingleModeGainInfo `json:"succession_gain_info"`
SuccessionFactorGains []IdleSingleModeSuccessionFactorGain `json:"succession_factor_gain_array"`
RaceHistory []IdleSingleModeRaceHistory `json:"race_history_array"`
GainSkillIDs []horse.SkillID `json:"gain_skill_id_array"`
TotalSkillPoint int32 `json:"total_skill_point"`
}
type AddItem struct {
ItemID int32 `json:"item_id"`
Number int32 `json:"number"`
}
type RewardSummary struct {
AddItem []AddItem `json:"add_item_list"`
}
type End struct {
Chara SingleModeChara `json:"chara_info"`
RewardSummary RewardSummary `json:"reward_summary_info"`
}
type ProgressInfo struct {
Chara SingleModeChara `json:"chara_info"`
StartTime string `json:"start_time"`
EndTime string `json:"end_time"`
DressID int32 `json:"dress_id"`
}
type WorkIdleSingleMode struct {
ProgressInfo ProgressInfo `json:"progress_info"`
ProgressLog IdleSingleModeProgressLog `json:"progress_log_info"`
End End `json:"end_info"`
OldChara *SingleModeChara `json:"chara_info"`
}
+28
View File
@@ -0,0 +1,28 @@
// Code generated by "stringer -type RunningStyle -linecomment"; DO NOT EDIT.
package replay
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[StyleNone-0]
_ = x[StyleNige-1]
_ = x[StyleSenko-2]
_ = x[StyleSashi-3]
_ = x[StyleOikomi-4]
}
const _RunningStyle_name = "NONENIGESENKOSASHIOIKOMI"
var _RunningStyle_index = [...]uint8{0, 4, 8, 13, 18, 24}
func (i RunningStyle) String() string {
idx := int(i) - 0
if i < 0 || idx >= len(_RunningStyle_index)-1 {
return "RunningStyle(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _RunningStyle_name[_RunningStyle_index[idx]:_RunningStyle_index[idx+1]]
}
File diff suppressed because it is too large Load Diff
+353
View File
@@ -0,0 +1,353 @@
package replay
import (
"compress/gzip"
"encoding/base64"
"encoding/binary"
"errors"
"fmt"
"io"
"math"
"strings"
)
type simdecoder struct {
r *gzip.Reader
err error
}
func readfull(r io.Reader, b []byte) error {
_, err := io.ReadFull(r, b)
if err == io.EOF {
return io.ErrUnexpectedEOF
}
return err
}
func (r *simdecoder) f(name string) float32 {
var b [4]byte
err := readfull(r.r, b[:])
switch err {
case nil: // do nothing
case io.ErrUnexpectedEOF:
// Check that the existing error doesn't already have this one
// so we don't spam on short input.
if r.err != nil && errors.Is(r.err, err) {
break
}
fallthrough
default:
r.err = errors.Join(r.err, fmt.Errorf("scanning %s: %w", name, err))
}
return math.Float32frombits(binary.LittleEndian.Uint32(b[:]))
}
func (r *simdecoder) i(name string) int32 {
var b [4]byte
err := readfull(r.r, b[:])
switch err {
case nil: // do nothing
case io.ErrUnexpectedEOF:
// Check that the existing error doesn't already have this one
// so we don't spam on short input.
if r.err != nil && errors.Is(r.err, err) {
break
}
fallthrough
default:
r.err = errors.Join(r.err, fmt.Errorf("scanning %s: %w", name, err))
}
return int32(binary.LittleEndian.Uint32(b[:]))
}
func (r *simdecoder) i16(name string) int16 {
var b [2]byte
err := readfull(r.r, b[:])
switch err {
case nil: // do nothing
case io.ErrUnexpectedEOF:
// Check that the existing error doesn't already have this one
// so we don't spam on short input.
if r.err != nil && errors.Is(r.err, err) {
break
}
fallthrough
default:
r.err = errors.Join(r.err, fmt.Errorf("scanning %s: %w", name, err))
}
return int16(binary.LittleEndian.Uint16(b[:]))
}
func (r *simdecoder) i8(name string) int8 {
var b [1]byte
err := readfull(r.r, b[:])
switch err {
case nil: // do nothing
case io.ErrUnexpectedEOF:
// Check that the existing error doesn't already have this one
// so we don't spam on short input.
if r.err != nil && errors.Is(r.err, err) {
break
}
fallthrough
default:
r.err = errors.Join(r.err, fmt.Errorf("scanning %s: %w", name, err))
}
return int8(b[0])
}
func DecodeSim(simDataBase64 string) (*RaceSimulateData, error) {
r, err := gzip.NewReader(base64.NewDecoder(base64.StdEncoding, strings.NewReader(simDataBase64)))
if err != nil {
return nil, err
}
d := simdecoder{r: r}
s := RaceSimulateData{
Header: RaceSimulateDataHeader{
MaxLength: d.i("RaceSimulateDataHeader.maxLength"),
Version: d.i("RaceSimulateDataHeader.version"),
},
DistanceDiffMax: d.f("distanceDiffMax"),
HorseNum: d.i("horseNum"),
HorseFrameSize: d.i("horseFrameSize"),
HorseResultSize: d.i("horseResultSize"),
PaddingSize1: d.i("PaddingSize1"),
FrameCount: d.i("frameCount"),
FrameSize: d.i("frameSize"),
}
s.Frame = make([]RaceSimulateFrameData, s.FrameCount)
horseframes := make([]RaceSimulateHorseFrameData, s.FrameCount*s.HorseNum)
for i := range s.Frame {
s.Frame[i] = RaceSimulateFrameData{
Time: d.f("RaceSimulateFrameData.time"),
HorseFrame: horseframes[i*int(s.HorseNum) : (i+1)*int(s.HorseNum)],
}
for j := range s.Frame[i].HorseFrame {
s.Frame[i].HorseFrame[j] = RaceSimulateHorseFrameData{
Distance: d.f("RaceSimulateHorseFrameData.distance"),
LanePosition: d.i16("RaceSimulateHorseFrameData.lanePosition"),
Speed: d.i16("RaceSimulateHorseFrameData.speed"),
HP: d.i16("RaceSimulateHorseFrameData.hp"),
TemptationMode: TemptationMode(d.i8("RaceSimulateHorseFrameData.temptationMode")),
BlockFrontHorseIndex: d.i8("RaceSimulateHorseFrameData.blockFrontHorseIndex"),
}
}
}
s.PaddingSize2 = d.i("PaddingSize2")
s.HorseResult = make([]RaceSimulateHorseResultData, s.HorseNum)
for i := range s.HorseResult {
s.HorseResult[i] = RaceSimulateHorseResultData{
FinishOrder: d.i("RaceSimulateHorseResultData.finishOrder"),
FinishTime: d.f("RaceSimulateHorseResultData.finishTime"),
FinishDiffTime: d.f("RaceSimulateHorseResultData.finishDiffTime"),
StartDelayTime: d.f("RaceSimulateHorseResultData.startDelayTime"),
GutsOrder: d.i8("RaceSimulateHorseResultData.gutsOrder"),
WizOrder: d.i8("RaceSimulateHorseResultData.wizOrder"),
LastSpurtStartDistance: d.f("RaceSimulateHorseResultData.lastSpurtStartDistance"),
RunningStyle: RunningStyle(d.i8("RaceSimulateHorseResultData.runningStyle")),
Defeat: d.i("RaceSimulateHorseResultData.defeat"),
FinishTimeRaw: d.f("RaceSimulateHorseResultData.finishTimeRaw"),
}
}
s.PaddingSize3 = d.i("PaddingSize3")
s.EventCount = d.i("eventCount")
s.Event = make([]SizedEvent, s.EventCount)
for i := range s.Event {
s.Event[i] = SizedEvent{
EventSize: d.i16("SizedEvent.eventSize"),
Event: RaceSimulateEventData{
FrameTime: d.f("RaceSimulateEventData.frameTime"),
Type: SimulateEventType(d.i8("RaceSimulateEventData.type")),
ParamCount: d.i8("RaceSimulateEventData.paramCount"),
},
}
s.Event[i].Event.Param = make([]int32, s.Event[i].Event.ParamCount)
for j := range s.Event[i].Event.Param {
s.Event[i].Event.Param[j] = d.i("RaceSimulateEventData.param")
}
}
if d.err != nil {
return nil, d.err
}
return &s, nil
}
type RaceSimulateData struct {
Header RaceSimulateDataHeader `json:"header"`
DistanceDiffMax float32 `json:"distanceDiffMax"`
HorseNum int32 `json:"horseNum"`
HorseFrameSize int32 `json:"horseFrameSize"`
HorseResultSize int32 `json:"horseResultSize"`
PaddingSize1 int32 `json:"PaddingSize1"`
FrameCount int32 `json:"frameCount"`
FrameSize int32 `json:"frameSize"`
Frame []RaceSimulateFrameData `json:"frame"`
PaddingSize2 int32 `json:"PaddingSize2"`
HorseResult []RaceSimulateHorseResultData `json:"horseResult"`
PaddingSize3 int32 `json:"PaddingSize3"`
EventCount int32 `json:"eventCount"`
Event []SizedEvent `json:"event"`
}
type RaceSimulateDataHeader struct {
MaxLength int32
Version int32
}
type RaceSimulateFrameData struct {
Time float32 `json:"time"`
HorseFrame []RaceSimulateHorseFrameData `json:"horseFrame"`
}
type RaceSimulateHorseFrameData struct {
Distance float32 `json:"distance"`
LanePosition int16 `json:"lanePosition"`
Speed int16 `json:"speed"`
HP int16 `json:"hp"`
TemptationMode TemptationMode `json:"temptationMode"`
BlockFrontHorseIndex int8 `json:"blockFrontHorseIndex"`
}
type TemptationMode int8
//go:generate go run golang.org/x/tools/cmd/stringer@v0.41.0 -type TemptationMode -linecomment
const (
TemptationNull TemptationMode = iota // NULL
TemptationPositionSashi // POSITION_SASHI
TemptationPositionSenko // POSITION_SENKO
TemptationPositionNige // POSITION_NIGE
TemptationBoost // BOOST
)
func (t TemptationMode) AppendText(b []byte) ([]byte, error) {
return append(b, t.String()...), nil
}
func (t TemptationMode) MarshalText() ([]byte, error) {
return t.AppendText(nil)
}
func (t *TemptationMode) UnmarshalText(b []byte) error {
switch string(b) {
case "NULL":
*t = TemptationNull
case "POSITION_SASHI":
*t = TemptationPositionSashi
case "POSITION_SENKO":
*t = TemptationPositionSenko
case "POSITION_NIGE":
*t = TemptationPositionNige
case "BOOST":
*t = TemptationBoost
default:
return fmt.Errorf("invalid TemptationMode %q", b)
}
return nil
}
type RaceSimulateHorseResultData struct {
FinishOrder int32 `json:"finishOrder"`
FinishTime float32 `json:"finishTime"`
FinishDiffTime float32 `json:"finishDiffTime"`
StartDelayTime float32 `json:"startDelayTime"`
GutsOrder int8 `json:"gutsOrder"`
WizOrder int8 `json:"wizOrder"`
LastSpurtStartDistance float32 `json:"lastSpurtStartDistance"`
RunningStyle RunningStyle `json:"runningStyle"`
Defeat int32 `json:"defeat"`
FinishTimeRaw float32 `json:"finishTimeRaw"`
}
type RunningStyle int8
//go:generate go run golang.org/x/tools/cmd/stringer@v0.41.0 -type RunningStyle -linecomment
const (
StyleNone RunningStyle = iota // NONE
StyleNige // NIGE
StyleSenko // SENKO
StyleSashi // SASHI
StyleOikomi // OIKOMI
)
func (s RunningStyle) AppendText(b []byte) ([]byte, error) {
return append(b, s.String()...), nil
}
func (s RunningStyle) MarshalText() ([]byte, error) {
return s.AppendText(nil)
}
func (s *RunningStyle) UnmarshalText(b []byte) error {
switch string(b) {
case "NONE":
*s = StyleNone
case "NIGE":
*s = StyleNige
case "SENKO":
*s = StyleSenko
case "SASHI":
*s = StyleSashi
case "OIKOMI":
*s = StyleOikomi
default:
return fmt.Errorf("invalid RunningStyle %q", b)
}
return nil
}
type SizedEvent struct {
EventSize int16 `json:"eventSize"`
Event RaceSimulateEventData `json:"event"`
}
type RaceSimulateEventData struct {
FrameTime float32 `json:"frameTime"`
Type SimulateEventType `json:"type"`
ParamCount int8 `json:"paramCount"`
Param []int32 `json:"param"`
}
type SimulateEventType int8
//go:generate go run golang.org/x/tools/cmd/stringer@v0.41.0 -type SimulateEventType -linecomment
const (
EventScore SimulateEventType = iota // SCORE
EventChallengeMatchPoint // CHALLENGE_MATCH_POINT
EventNoUse2 // NOUSE_2
EventSkill // SKILL
EventCompeteTop // COMPETE_TOP
EventCompeteFight // COMPETE_FIGHT
EventReleaseConservePower // RELEASE_CONSERVE_POWER
)
func (t SimulateEventType) AppendText(b []byte) ([]byte, error) {
return append(b, t.String()...), nil
}
func (t SimulateEventType) MarshalText() ([]byte, error) {
return t.AppendText(nil)
}
func (t *SimulateEventType) UnmarshalText(b []byte) error {
switch string(b) {
case "SCORE":
*t = EventScore
case "CHALLENGE_MATCH_POINT":
*t = EventChallengeMatchPoint
case "NOUSE_2":
*t = EventNoUse2
case "SKILL":
*t = EventSkill
case "COMPETE_TOP":
*t = EventCompeteTop
case "COMPETE_FIGHT":
*t = EventCompeteFight
case "RELEASE_CONSERVE_POWER":
*t = EventReleaseConservePower
default:
return fmt.Errorf("invalid SimulateEventType %q", b)
}
return nil
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,30 @@
// Code generated by "stringer -type SimulateEventType -linecomment"; DO NOT EDIT.
package replay
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[EventScore-0]
_ = x[EventChallengeMatchPoint-1]
_ = x[EventNoUse2-2]
_ = x[EventSkill-3]
_ = x[EventCompeteTop-4]
_ = x[EventCompeteFight-5]
_ = x[EventReleaseConservePower-6]
}
const _SimulateEventType_name = "SCORECHALLENGE_MATCH_POINTNOUSE_2SKILLCOMPETE_TOPCOMPETE_FIGHTRELEASE_CONSERVE_POWER"
var _SimulateEventType_index = [...]uint8{0, 5, 26, 33, 38, 49, 62, 84}
func (i SimulateEventType) String() string {
idx := int(i) - 0
if i < 0 || idx >= len(_SimulateEventType_index)-1 {
return "SimulateEventType(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _SimulateEventType_name[_SimulateEventType_index[idx]:_SimulateEventType_index[idx+1]]
}
+28
View File
@@ -0,0 +1,28 @@
// Code generated by "stringer -type TemptationMode -linecomment"; DO NOT EDIT.
package replay
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[TemptationNull-0]
_ = x[TemptationPositionSashi-1]
_ = x[TemptationPositionSenko-2]
_ = x[TemptationPositionNige-3]
_ = x[TemptationBoost-4]
}
const _TemptationMode_name = "NULLPOSITION_SASHIPOSITION_SENKOPOSITION_NIGEBOOST"
var _TemptationMode_index = [...]uint8{0, 4, 18, 32, 45, 50}
func (i TemptationMode) String() string {
idx := int(i) - 0
if i < 0 || idx >= len(_TemptationMode_index)-1 {
return "TemptationMode(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _TemptationMode_name[_TemptationMode_index[idx]:_TemptationMode_index[idx+1]]
}