60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
//go:build ignore
|
|
|
|
// Retain an observed node battle recipe and its exact route identity. Runtime
|
|
// construction must replace all role/party data; this is not a universal stage.
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
pb "gac-hkrpg-go/protocol/proto"
|
|
"google.golang.org/protobuf/proto"
|
|
"os"
|
|
)
|
|
|
|
func main() {
|
|
capture := flag.String("capture", "", "native EnterBattle response")
|
|
output := flag.String("output", "", "resource output")
|
|
flag.Parse()
|
|
if *capture == "" || *output == "" {
|
|
panic("capture/output required")
|
|
}
|
|
raw, err := os.ReadFile(*capture)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var response pb.GridFightEnterBattleStageScRsp
|
|
if err = proto.Unmarshal(raw, &response); err != nil {
|
|
panic(err)
|
|
}
|
|
battle := response.BattleInfo
|
|
if response.Retcode != 0 || battle == nil || battle.EIGMKOJOEEI == nil || battle.EIGMKOJOEEI.IOCKDJCDMAH == nil || len(battle.EIGMKOJOEEI.GridGameRoleList) == 0 {
|
|
panic("incomplete native CW battle")
|
|
}
|
|
wire, err := proto.Marshal(battle)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
raw, err = os.ReadFile("resources/CurrencyWarsInitialRuns.json")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var identity map[string]json.RawMessage
|
|
if err = json.Unmarshal(raw, &identity); err != nil {
|
|
panic(err)
|
|
}
|
|
result := map[string]any{"format_version": 1, "scope": "Captured first-node enemy recipe only. Runtime replaces party, roles, portal, NPC, equipment and player state. Other nodes need their own recipes.", "battle_wire": wire}
|
|
for _, key := range []string{"target_client_version", "target_assembly_sha256", "source_binary_sha256"} {
|
|
result[key] = identity[key]
|
|
}
|
|
raw, err = json.MarshalIndent(result, "", " ")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err = os.WriteFile(*output, append(raw, '\n'), 0644); err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Println("Captured CW stage", battle.StageId)
|
|
}
|