载入中...
搜索中...
未找到
CardStateProvider.cpp
浏览该文件的文档.
1#include "card/CardState.h"
2
3#include "card/CardTypes.h"
4#include "common/Capability.h"
5#include "common/ECS.h"
7
8#include <string>
9#include <utility>
10
11namespace eve::card {
12namespace {
13
14CardState parseCardState(const std::string& name) {
15 if (name == "deck") return CardState::Deck;
16 if (name == "hand") return CardState::Hand;
17 if (name == "played") return CardState::Played;
18 if (name == "discarded") return CardState::Discarded;
19 if (name == "disabled") return CardState::Disabled;
20 if (name == "returning") return CardState::Returning;
21 return CardState::Hand; // transient Hovered/Dragging normalize to Hand
22}
23
25class CardStateProvider : public eve::caps::IStateProvider {
26public:
27 const char* stateKind() const override { return "card"; }
28
29 bool captureState(StateValue& out) override { return captureCardState(out); }
30 bool restoreState(const StateValue& in, std::string* err) override { return restoreCardState(in, err); }
31 bool resetToDefaults() override { return resetCardState(); }
32};
33
34struct Register {
35 Register() {
36 static CardStateProvider provider;
38 }
39} g_register;
40
41} // namespace
42
45 auto view = ecs::View<CardData, CardData::Identity, CardData::State>();
46 for (auto it = view.begin(); it != view.end(); ++it) {
47 auto [id, st] = *it;
49 item.set("id", StateValue::string(id->id));
50 item.set("phase", StateValue::string(cardStateName(st->phase)));
51 cards.pushBack(std::move(item));
52 }
53 out = StateValue::object();
54 out.set("cards", std::move(cards));
55 return true;
56}
57
58bool restoreCardState(const StateValue& in, std::string* err) {
59 if (!in.isObject()) {
60 if (err) *err = "card: state is not an object";
61 return false;
62 }
63 const StateValue* cards = in.find("cards");
64 if (!cards || !cards->isArray()) {
65 if (err) *err = "card: missing cards";
66 return false;
67 }
68
69 auto view = ecs::View<CardData, CardData::Identity, CardData::State>();
70 for (auto it = view.begin(); it != view.end(); ++it) {
71 auto [id, st] = *it;
72 st->hovered = false;
73 st->dragging = false;
74 for (size_t i = 0; i < cards->arraySize(); ++i) {
75 const StateValue& item = cards->at(i);
76 const StateValue* cid = item.find("id");
77 const StateValue* phase = item.find("phase");
78 if (cid && phase && cid->isString() && phase->isString() && cid->asString() == id->id) {
79 st->phase = parseCardState(phase->asString());
80 break;
81 }
82 }
83 }
84
85 // In-flight drag is transient: dropped on reload.
86 auto hands = ecs::View<Hand, Hand::Drag>();
87 for (auto it = hands.begin(); it != hands.end(); ++it) {
88 auto [drag] = *it;
89 drag->card = nullptr;
90 drag->press = nullptr;
91 drag->wasDown = false;
92 }
93 return true;
94}
95
97 auto view = ecs::View<CardData, CardData::State>();
98 for (auto it = view.begin(); it != view.end(); ++it) {
99 auto [st] = *it;
100 st->phase = CardState::Deck;
101 st->hovered = false;
102 st->dragging = false;
103 }
104 return true;
105}
106
107} // namespace eve::card
std::string id
glm::mat4 view
const char * name
Definition RockMesh.cpp:21
JSON-compatible state value tree used by state hot reload.
Definition StateValue.h:20
static StateValue object()
Empty object.
Definition StateValue.h:39
static StateValue array()
Empty array.
Definition StateValue.h:37
void pushBack(StateValue v)
Append an element; only valid on arrays.
size_t arraySize() const
Element count; only valid on arrays.
Definition StateValue.h:64
bool isString() const
Definition StateValue.h:48
bool isObject() const
Definition StateValue.h:49
bool isArray() const
Definition StateValue.h:50
const std::string & asString() const
String payload; only valid when kind() == Kind::String.
Definition StateValue.h:59
const StateValue * find(const std::string &key) const
Look up key; nullptr when absent.
StateValue & at(size_t index)
Indexed element (bounds-checked); only valid on arrays.
Definition StateValue.h:66
static StateValue string(std::string v)
String value.
void set(const std::string &key, StateValue v)
Insert or replace key; only valid on objects.
Runtime-state serialization for state hot reload.
I * query()
Definition Capability.h:77
bool captureCardState(StateValue &out)
CardData/Hand interaction-state serialization for state hot reload.
bool restoreCardState(const StateValue &in, std::string *err=nullptr)
CardState
单张卡牌的运行时状态。
Definition CardTypes.h:25
const char * cardStateName(CardState state)
状态枚举的字符串名(用于脚本/调试)。
Definition CardTypes.cpp:10