Files
GaCy-GO/internal/sdkserver/api_currency_wars.go
T

85 lines
2.4 KiB
Go

package sdkserver
import (
"fmt"
"gac-hkrpg-go/internal/common"
pb "gac-hkrpg-go/protocol/proto"
"google.golang.org/protobuf/proto"
"net/http"
"strconv"
"strings"
)
func apiCurrencyWarsCommand(w http.ResponseWriter, command string) {
fail := func(err error) { writeJSON(w, map[string]any{"success": false, "output": err.Error()}) }
parts := strings.Fields(command)
usage := "Usage: /cw status | /cw gold <total> | /cw hp <total>. Changes apply in CW Preparation; adventure inventory is unchanged."
if len(parts) < 2 {
fail(fmt.Errorf("%s", usage))
return
}
catalog, err := common.LoadCurrencyWarsCatalog()
if err != nil {
fail(err)
return
}
cfg, err := common.LoadRuntimeConfig()
if err != nil {
fail(err)
return
}
snapshot, err := common.ReadCurrencyWarsSnapshot(cfg.PlayerUID, catalog.ClientVersion, catalog.Provenance.GameAssemblySHA256)
if err != nil {
fail(err)
return
}
if snapshot == nil {
fail(fmt.Errorf("no saved CW run"))
return
}
var data pb.GridFightGetDataScRsp
if err = proto.Unmarshal(snapshot.WireData, &data); err != nil {
fail(err)
return
}
run := data.DHFOFLFCLAH
if run == nil {
fail(fmt.Errorf("no active CW run"))
return
}
var player *pb.NIHNGPKHEPC
for _, c := range run.NAGDJGMMCBE {
if v := c.GetFAOCFBOFCJP(); v != nil {
player = v
}
}
if player == nil {
fail(fmt.Errorf("CW player state missing"))
return
}
field := strings.ToLower(parts[1])
if field == "status" && len(parts) == 2 {
writeJSON(w, map[string]any{"success": true, "output": fmt.Sprintf("CW run=%d revision=%d gold=%d hp=%d/%d level=%d", run.UniqueId, snapshot.Revision, player.Gold, player.GridFightLineupHp, player.PPKKHHNEOHB, player.EHNJDIDABHD)})
return
}
if len(parts) != 3 || (field != "gold" && field != "hp") {
fail(fmt.Errorf("%s", usage))
return
}
value, err := strconv.ParseUint(parts[2], 10, 32)
if err != nil {
fail(fmt.Errorf("value must be a nonnegative uint32"))
return
}
if field == "hp" && (value == 0 || value > uint64(player.PPKKHHNEOHB)) {
fail(fmt.Errorf("HP must be 1..%d", player.PPKKHHNEOHB))
return
}
id, err := common.QueueCurrencyWarsCommand(cfg.PlayerUID, run.UniqueId, field, uint32(value))
if err != nil {
fail(err)
return
}
writeJSON(w, map[string]any{"success": true, "state": "queued", "request_id": id, "output": fmt.Sprintf("Queued CW %s=%d for run %d. Applies at the next heartbeat in Preparation.", field, value, run.UniqueId)})
}