100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
//go:build ignore
|
|||
|
|
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"flag"
|
||
|
|
"fmt"
|
||
|
|
pb "gac-hkrpg-go/protocol/proto"
|
||
|
|
"google.golang.org/protobuf/encoding/protojson"
|
||
|
|
"google.golang.org/protobuf/proto"
|
||
|
|
"os"
|
||
|
|
"strconv"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
prefix := flag.String("prefix", "", "capture prefix before augment ID")
|
||
|
|
ids := flag.String("ids", "", "comma-separated observed offer IDs")
|
||
|
|
output := flag.String("output", "", "output resource")
|
||
|
|
flag.Parse()
|
||
|
|
read := func(path string) *pb.MPIMAEMCEFH {
|
||
|
|
raw, e := os.ReadFile(path)
|
||
|
|
if e != nil {
|
||
|
|
panic(e)
|
||
|
|
}
|
||
|
|
var d pb.GridFightGetDataScRsp
|
||
|
|
if e = protojson.Unmarshal(raw, &d); e != nil {
|
||
|
|
panic(e)
|
||
|
|
}
|
||
|
|
if d.DHFOFLFCLAH == nil {
|
||
|
|
panic("run absent")
|
||
|
|
}
|
||
|
|
return d.DHFOFLFCLAH
|
||
|
|
}
|
||
|
|
type Choice struct {
|
||
|
|
ID uint32 `json:"augment_id"`
|
||
|
|
GoldDelta int64 `json:"gold_delta"`
|
||
|
|
Info []byte `json:"augment_info_wire"`
|
||
|
|
}
|
||
|
|
var choices []Choice
|
||
|
|
for _, idText := range strings.Split(*ids, ",") {
|
||
|
|
n, e := strconv.ParseUint(idText, 10, 32)
|
||
|
|
if e != nil || n == 0 {
|
||
|
|
panic("invalid augment ID")
|
||
|
|
}
|
||
|
|
id := uint32(n)
|
||
|
|
before, after := read(fmt.Sprintf("%s-%d-data-stage-8.json", *prefix, id)), read(fmt.Sprintf("%s-%d-data-stage-12.json", *prefix, id))
|
||
|
|
normalizedBefore, normalizedAfter := proto.Clone(before).(*pb.MPIMAEMCEFH), proto.Clone(after).(*pb.MPIMAEMCEFH)
|
||
|
|
var beforeGold, afterGold uint32
|
||
|
|
var info *pb.PPGEBEBPMJC
|
||
|
|
for _, pair := range []struct {
|
||
|
|
run *pb.MPIMAEMCEFH
|
||
|
|
gold *uint32
|
||
|
|
}{{normalizedBefore, &beforeGold}, {normalizedAfter, &afterGold}} {
|
||
|
|
for _, c := range pair.run.NAGDJGMMCBE {
|
||
|
|
if p := c.GetFAOCFBOFCJP(); p != nil {
|
||
|
|
*pair.gold = p.Gold
|
||
|
|
p.Gold = 0
|
||
|
|
}
|
||
|
|
if a := c.GetLLDBOIANGDN(); a != nil {
|
||
|
|
for _, v := range a.SyncAugmentInfo {
|
||
|
|
if v.AugmentId == id {
|
||
|
|
info = proto.Clone(v).(*pb.PPGEBEBPMJC)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
a.SyncAugmentInfo = nil
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if !proto.Equal(normalizedBefore, normalizedAfter) || info == nil {
|
||
|
|
panic("augment changes more than gold/augment ownership; a specific effect processor is required")
|
||
|
|
}
|
||
|
|
wire, e := proto.Marshal(info)
|
||
|
|
if e != nil {
|
||
|
|
panic(e)
|
||
|
|
}
|
||
|
|
choices = append(choices, Choice{id, int64(afterGold) - int64(beforeGold), wire})
|
||
|
|
}
|
||
|
|
raw, e := os.ReadFile("resources/CurrencyWarsInitialRuns.json")
|
||
|
|
if e != nil {
|
||
|
|
panic(e)
|
||
|
|
}
|
||
|
|
var identity map[string]json.RawMessage
|
||
|
|
if e = json.Unmarshal(raw, &identity); e != nil {
|
||
|
|
panic(e)
|
||
|
|
}
|
||
|
|
result := map[string]any{"format_version": 1, "scope": "Observed reference outcomes for the three captured initial investment offers only. Validated that only gold and augment ownership change; no party/inventory snapshots copied. Not a general augment effect engine.", "choices": choices}
|
||
|
|
for _, key := range []string{"target_client_version", "target_assembly_sha256", "source_binary_sha256"} {
|
||
|
|
result[key] = identity[key]
|
||
|
|
}
|
||
|
|
raw, e = json.MarshalIndent(result, "", " ")
|
||
|
|
if e != nil {
|
||
|
|
panic(e)
|
||
|
|
}
|
||
|
|
if e = os.WriteFile(*output, append(raw, '\n'), 0644); e != nil {
|
||
|
|
panic(e)
|
||
|
|
}
|
||
|
|
fmt.Println("Exported observed augment outcomes", len(choices))
|
||
|
|
}
|