载入中...
搜索中...
未找到
RPG.cpp
浏览该文件的文档.
1#include "rpg/RPG.h"
3#include "rpg/Battle.h"
4#include "rpg/BattleControl.h"
5#include "rpg/BattleVictory.h"
6#include "rpg/BattleSystem.h"
7#include "rpg/BattleTactics.h"
8#include "rpg/Class.h"
9#include "rpg/Effect.h"
10#include "rpg/EquipmentSystem.h"
12#include "rpg/GameState.h"
13#include "rpg/LevelSystem.h"
14#include "rpg/Party.h"
15#include "rpg/ProductControl.h"
16#include "rpg/LootSystem.h"
17#include "rpg/Quest.h"
18#include "rpg/QuestReward.h"
19#include "rpg/RPGSaveSession.h"
20#include "rpg/Skill.h"
21#include "rpg/StatusSystem.h"
22#include "rpg/StoryEvent.h"
23#include "rpg/RpgDialect.h"
24#include "rpg/SkillSystem.h"
25#include "rpg/Settlement.h"
26#include "rpg/ShopCatalogue.h"
27#include "rpg/ShopTransaction.h"
28#include "rpg/Tracker.h"
29#include "rpg/Trait.h"
30#include "rpg/VitalsSystem.h"
31#include "rpg/WorldState.h"
33
34#include <random>
35
36#include <simplesquirrel/simplesquirrel.hpp>
37#include <squirrel.h>
38
39namespace eve::rpg {
40
42
43Party *RPG::newParty() { return new Party(); }
44
46
47int RPG::registerEffectsFromJson(const std::string &json) {
48 return EffectRegistry::loadFromJson(json, nullptr);
49}
50
52
54
55int RPG::registerSkillsFromJson(const std::string &json) {
56 return SkillRegistry::loadFromJson(json, nullptr);
57}
58
60
62
63int RPG::registerQuestsFromJson(const std::string &json) {
64 return QuestRegistry::loadFromJson(json, nullptr);
65}
66
70
72
74
75bool RPG::hasQuestDefinition(const std::string &id) const { return QuestRegistry::contains(id); }
76
78 inventory::Bag *bag, const std::string &questId) {
79 if (!tracker || !gameState || !bag)
82 "claimQuestRewards requires tracker, gameState, and bag", "participants",
83 {}, "rpg.claim-quest-rewards"));
84 return QuestReward::claim(*tracker, *gameState, *bag, questId);
85}
86
89 if (!tracker || !gameState || !bag)
92 "collectWorldLoot requires tracker, gameState, and bag", "participants", {},
93 "rpg.collect-world-loot"));
94 return WorldInteraction::collectLoot(*gameState, *tracker, *bag, request);
95}
96
100 if (!actor || !tracker || !gameState)
103 "settleBattleVictory requires actor, tracker, and gameState", "participants", {},
104 "rpg.settle-battle-victory"));
105 return BattleVictory::settle(*actor, *gameState, *tracker, request);
106}
107
109 const std::string &currencyId, const std::string &itemId,
110 int quantity, double unitPrice) {
111 if (!gameState || !bag)
113 eve::DiagnosticCode::InvalidArgument, "buyFromShop requires gameState and bag",
114 "participants", {}, "rpg.buy-from-shop"));
115 return ShopTransaction::buy(*gameState, *bag, currencyId, itemId, quantity, unitPrice);
116}
117
119 const std::string &currencyId, const std::string &itemId,
120 int quantity, double unitPrice) {
121 if (!gameState || !bag)
123 eve::DiagnosticCode::InvalidArgument, "sellToShop requires gameState and bag",
124 "participants", {}, "rpg.sell-to-shop"));
125 return ShopTransaction::sell(*gameState, *bag, currencyId, itemId, quantity, unitPrice);
126}
127
131
133
135
136bool RPG::hasShopOffer(const std::string &offerId) const {
137 return ShopCatalogue::find(offerId) != nullptr;
138}
139
140std::string RPG::getShopOfferId(int index) const {
141 const auto *offer = ShopCatalogue::at(index);
142 return offer ? offer->id : std::string{};
143}
144
145std::string RPG::getShopOfferItemId(int index) const {
146 const auto *offer = ShopCatalogue::at(index);
147 return offer ? offer->itemId : std::string{};
148}
149
150std::string RPG::getShopOfferName(int index) const {
151 const auto *offer = ShopCatalogue::at(index);
152 return offer ? offer->displayName : std::string{};
153}
154
155std::string RPG::getShopOfferDescription(int index) const {
156 const auto *offer = ShopCatalogue::at(index);
157 return offer ? offer->description : std::string{};
158}
159
161 const auto *offer = ShopCatalogue::at(index);
162 return offer ? offer->buyPrice : 0;
163}
164
166 const auto *offer = ShopCatalogue::at(index);
167 return offer ? offer->sellPrice : 0;
168}
169
171 const std::string &currencyId,
172 const std::string &offerId, int quantity) {
173 if (!gameState || !bag)
175 eve::DiagnosticCode::InvalidArgument, "buyShopOffer requires gameState and bag",
176 "participants", {}, "rpg.buy-shop-offer"));
177 return ShopTransaction::buyOffer(*gameState, *bag, currencyId, offerId, quantity);
178}
179
181 const std::string &currencyId,
182 const std::string &offerId, int quantity) {
183 if (!gameState || !bag)
185 eve::DiagnosticCode::InvalidArgument, "sellShopOffer requires gameState and bag",
186 "participants", {}, "rpg.sell-shop-offer"));
187 return ShopTransaction::sellOffer(*gameState, *bag, currencyId, offerId, quantity);
188}
189
194bool RPG::hasEncounter(const std::string &encounterId) const {
195 return EncounterCatalogue::find(encounterId) != nullptr;
196}
197int RPG::getEncounterMemberCount(const std::string &encounterId) const {
198 return EncounterCatalogue::memberCount(encounterId);
199}
200RPGActor *RPG::newEncounterActor(const std::string &encounterId) {
201 return EncounterCatalogue::createActor(encounterId);
202}
203RPGActor *RPG::newEncounterMemberActor(const std::string &encounterId, int memberIndex) {
204 return EncounterCatalogue::createMemberActor(encounterId, memberIndex);
205}
206std::string RPG::getEncounterDisplayName(const std::string &encounterId) const {
207 const auto *definition = EncounterCatalogue::find(encounterId);
208 return definition ? definition->displayName : std::string{};
209}
210double RPG::getEncounterMaxHp(const std::string &encounterId) const {
211 const auto *definition = EncounterCatalogue::find(encounterId);
212 return definition && !definition->members.empty() ? definition->members.front().maxHp : 0.0;
213}
214std::string RPG::getEncounterMemberDisplayName(const std::string &encounterId,
215 int memberIndex) const {
216 const auto *definition = EncounterCatalogue::find(encounterId);
217 if (!definition || memberIndex < 0 ||
218 static_cast<std::size_t>(memberIndex) >= definition->members.size())
219 return {};
220 return definition->members[static_cast<std::size_t>(memberIndex)].displayName;
221}
222double RPG::getEncounterMemberMaxHp(const std::string &encounterId, int memberIndex) const {
223 const auto *definition = EncounterCatalogue::find(encounterId);
224 if (!definition || memberIndex < 0 ||
225 static_cast<std::size_t>(memberIndex) >= definition->members.size())
226 return 0.0;
227 return definition->members[static_cast<std::size_t>(memberIndex)].maxHp;
228}
229
235 const std::string &tacticsId) {
236 return BattleTacticsCatalogue::queueAction(battle, actor, tacticsId);
237}
243bool RPG::hasStoryEvent(const std::string &eventId) const {
244 return StoryEventCatalogue::contains(eventId);
245}
252bool RPG::hasStory(const std::string &storyId) const { return RpgStoryCatalogue::contains(storyId); }
256 const std::string &encounterId, const std::string &mapId,
257 const std::string &objectId) {
258 if (!actor || !tracker || !gameState)
261 "settleEncounterVictory requires actor, tracker, and gameState", "participants"));
262 const auto *definition = EncounterCatalogue::find(encounterId);
263 if (!definition)
265 eve::DiagnosticCode::NotFound, "unknown encounter definition", "encounterId"));
267 request.mapId = mapId;
268 request.objectId = objectId;
269 request.requiredQuestId = definition->requiredQuestId;
270 request.xpAmount = definition->xpReward;
271 request.xpGrowth = definition->xpGrowth;
272 request.attributeId = "gold";
273 request.attributeAmount = definition->goldReward;
274 request.notifyTopic = definition->notifyTopic;
275 request.notifyTarget = definition->notifyTarget;
276 request.notifyAmount = definition->notifyAmount;
277 request.defeatCounterId = definition->defeatCounterId;
278 request.defeatCounterAmount = definition->defeatCounterAmount;
279 request.levelPointAttributeId = definition->levelPointAttributeId;
280 request.pointsPerLevel = definition->pointsPerLevel;
281 return BattleVictory::settle(*actor, *gameState, *tracker, request);
282}
283
284Tracker *RPG::newTracker() { return new Tracker(); }
285
286int RPG::getLevelUpEventCount() const { return int(levelUps_.size()); }
287
289 if (index < 0 || size_t(index) >= levelUps_.size()) return nullptr;
290 return levelUps_[size_t(index)].actor;
291}
292
294 if (index < 0 || size_t(index) >= levelUps_.size()) return 0;
295 return levelUps_[size_t(index)].previousLevel;
296}
297
299 if (index < 0 || size_t(index) >= levelUps_.size()) return 0;
300 return levelUps_[size_t(index)].newLevel;
301}
302
303int RPG::getVitalsEventCount() const { return int(vitals_.size()); }
304
306 if (index < 0 || size_t(index) >= vitals_.size()) return nullptr;
307 return vitals_[size_t(index)].actor;
308}
309
310std::string RPG::getVitalsEventResource(int index) const {
311 if (index < 0 || size_t(index) >= vitals_.size()) return {};
312 return vitals_[size_t(index)].resource;
313}
314
315std::string RPG::getVitalsEventAction(int index) const {
316 if (index < 0 || size_t(index) >= vitals_.size()) return {};
317 return vitals_[size_t(index)].action;
318}
319
321 if (index < 0 || size_t(index) >= vitals_.size()) return 0.0;
322 return vitals_[size_t(index)].amount;
323}
324
325std::string RPG::getVitalsEventSource(int index) const {
326 if (index < 0 || size_t(index) >= vitals_.size()) return {};
327 return vitals_[size_t(index)].source;
328}
329
331 if (index < 0 || size_t(index) >= vitals_.size()) return 0.0;
332 return vitals_[size_t(index)].current;
333}
334
335double RPG::getVitalsEventMax(int index) const {
336 if (index < 0 || size_t(index) >= vitals_.size()) return 0.0;
337 return vitals_[size_t(index)].max;
338}
339
340int RPG::registerItemStatsFromJson(const std::string &itemId, const std::string &json) {
342}
343
345
347
349
353
354int RPG::registerLootTablesFromJson(const std::string &json) {
356}
357
359
361
362int RPG::rollLoot(const std::string &tableId, inventory::Bag *bag, int seed) {
363 std::mt19937 rng(static_cast<unsigned>(seed));
364 return LootSystem::roll(tableId, bag, rng);
365}
366
367int RPG::registerTraitsFromJson(const std::string &json) {
368 return TraitRegistry::loadFromJson(json, nullptr);
369}
370
372
374
375int RPG::registerSkillDamage(const std::string &skillId, const std::string &damageType,
376 const std::string &formula, const std::string &element,
377 double critChance, int hitChance) {
378 SkillDamageSpec spec;
379 spec.damageType = damageType;
380 spec.formula = formula;
381 spec.element = element;
382 spec.critChance = critChance;
383 spec.hitChance = hitChance;
384 auto registered = BattleSystem::registerSkillDamageChecked(skillId, spec);
385 return registered ? 1 : 0;
386}
387
389
390Battle *RPG::newBattle() { return new Battle(); }
391
393 if (!battle || !instance.isValid())
396 "battle control requires a battle and valid instance", "battleControl"));
398 std::make_unique<BattleControl>(*battle, instance));
399}
400
402 SubjectRef instance, GameState *gameState, Tracker *tracker, inventory::Bag *bag) {
403 if (!instance.isValid() || !gameState || !tracker || !bag)
406 "product control requires valid identity and participants", "productControl"));
408 std::make_unique<ProductControl>(instance, *gameState, *tracker, *bag));
409}
410
412
414 return gameState ? new WorldState(*gameState) : nullptr;
415}
416
418
419int RPG::registerClassesFromJson(const std::string &json) {
420 return ClassRegistry::loadFromJson(json, nullptr);
421}
422
424
426
427void RPG::update(float dt) {
428 StatusSystem::update(static_cast<double>(dt)).ignore("RPG script update tick");
430
431 ticks_.clear();
433 changes_.clear();
435 casts_.clear();
437 levelUps_.clear();
438 LevelSystem::pollLevelUps(levelUps_);
439 vitals_.clear();
441}
442
443int RPG::getTickEventCount() const { return int(ticks_.size()); }
444
446 if (index < 0 || size_t(index) >= ticks_.size()) return nullptr;
447 return ticks_[size_t(index)].actor;
448}
449
451 if (index < 0 || size_t(index) >= ticks_.size()) return 0;
452 return ticks_[size_t(index)].instanceId;
453}
454
455std::string RPG::getTickEventEffectId(int index) const {
456 if (index < 0 || size_t(index) >= ticks_.size()) return {};
457 return ticks_[size_t(index)].effectId;
458}
459
460std::string RPG::getTickEventSource(int index) const {
461 if (index < 0 || size_t(index) >= ticks_.size()) return {};
462 return ticks_[size_t(index)].source;
463}
464
466 if (index < 0 || size_t(index) >= ticks_.size()) return 0;
467 return ticks_[size_t(index)].stacks;
468}
469
470int RPG::getStatusChangeEventCount() const { return int(changes_.size()); }
471
473 if (index < 0 || size_t(index) >= changes_.size()) return nullptr;
474 return changes_[size_t(index)].actor;
475}
476
478 if (index < 0 || size_t(index) >= changes_.size()) return 0;
479 return changes_[size_t(index)].instanceId;
480}
481
483 if (index < 0 || size_t(index) >= changes_.size()) return {};
484 return changes_[size_t(index)].effectId;
485}
486
488 if (index < 0 || size_t(index) >= changes_.size()) return {};
489 return changes_[size_t(index)].source;
490}
491
493 if (index < 0 || size_t(index) >= changes_.size()) return {};
494 return changes_[size_t(index)].action;
495}
496
498 if (index < 0 || size_t(index) >= changes_.size()) return 0;
499 return changes_[size_t(index)].stacks;
500}
501
503 if (index < 0 || size_t(index) >= changes_.size()) return {};
504 return changes_[size_t(index)].reason;
505}
506
507int RPG::getCastEventCount() const { return int(casts_.size()); }
508
510 if (index < 0 || size_t(index) >= casts_.size()) return nullptr;
511 return casts_[size_t(index)].caster;
512}
513
515 if (index < 0 || size_t(index) >= casts_.size()) return nullptr;
516 return casts_[size_t(index)].target;
517}
518
519std::string RPG::getCastEventSkillId(int index) const {
520 if (index < 0 || size_t(index) >= casts_.size()) return {};
521 return casts_[size_t(index)].skillId;
522}
523
525
526void RPG::runSettlement(const std::string &pipeline, SettlementContext *ctx) {
527 if (!ctx) return;
528 SettlementPipeline::run(pipeline, *ctx);
529}
530
531int RPG::getSettlementStageCount(const std::string &pipeline) {
532 return SettlementPipeline::stageCount(pipeline);
533}
534
535bool RPG::hasSettlementStage(const std::string &pipeline, const std::string &stage) {
536 return SettlementPipeline::hasStage(pipeline, stage);
537}
538
539bool RPG::setSettlementStageEnabled(const std::string &pipeline, const std::string &stage,
540 bool enabled) {
541 return SettlementPipeline::setStageEnabled(pipeline, stage, enabled);
542}
543
544bool RPG::setSettlementStagePriority(const std::string &pipeline, const std::string &stage,
545 int priority) {
546 return SettlementPipeline::setStagePriority(pipeline, stage, priority);
547}
548
549bool RPG::removeSettlementStage(const std::string &pipeline, const std::string &stage) {
550 return SettlementPipeline::unregisterStage(pipeline, stage);
551}
552
553void RPG::clearSettlementPipeline(const std::string &pipeline) {
555}
556
557namespace {
558
559void bindNative(ssq::Class &cls, const char *name, SQFUNCTION func, SQInteger minParams,
560 const SQChar *typemask) {
561 HSQUIRRELVM vm = cls.getHandle();
562 sq_pushobject(vm, cls.getRaw());
563 sq_pushstring(vm, name, -1);
564 sq_newclosure(vm, func, 0);
565 sq_setparamscheck(vm, -minParams, typemask);
566 sq_newslot(vm, -3, SQFalse);
567 sq_poptop(vm);
568}
569
570SQInteger sqActorBeginCastSkill(HSQUIRRELVM vm) {
571 const SQInteger n = sq_gettop(vm);
572 if (n < 2 || n > 3)
573 return sq_throwerror(vm, "RPGActor.beginCastSkill expects (skillId [, target])");
574 RPGActor *self = nullptr;
575 if (SQ_FAILED(sq_getinstanceup(vm, 1, reinterpret_cast<SQUserPointer *>(&self), nullptr)) || !self)
576 return sq_throwerror(vm, "invalid RPGActor");
577 const SQChar *skillId = nullptr;
578 if (SQ_FAILED(sq_getstring(vm, 2, &skillId)))
579 return sq_throwerror(vm, "RPGActor.beginCastSkill skillId must be a string");
580 RPGActor *target = nullptr;
581 if (n >= 3 && sq_gettype(vm, 3) != OT_NULL) {
582 if (sq_gettype(vm, 3) != OT_INSTANCE ||
583 SQ_FAILED(sq_getinstanceup(vm, 3, reinterpret_cast<SQUserPointer *>(&target), nullptr)))
584 return sq_throwerror(vm, "RPGActor.beginCastSkill target must be RPGActor or null");
585 }
586 sq_pushbool(vm, self->beginCastSkill(skillId ? skillId : "", target) ? SQTrue : SQFalse);
587 return 1;
588}
589
590} // namespace
591
592void RPG::expose(ssq::Table &table) {
593 const HSQUIRRELVM vm = table.getHandle();
594 auto cls = table.addClass(name, RPG::create, false);
595 expose(cls);
596
597 auto actor = table.addClass<RPGActor>(
598 "RPGActor", std::function<RPGActor *()>([]() -> RPGActor * { return nullptr; }), true);
599 // 绑定为 float:SimpleSquirrel 只有在 squirrel 以 SQUSEDOUBLE 编译时才认识
600 // C++ double(本项目未开启),否则 double 参数/返回值会被当成 INSTANCE
601 // 处理,脚本调用直接抛 "bad cast expected INSTANCE got FLOAT"。
602 // 同样的坑见 mouse/Mouse.cpp、timer/Timer.h 的注释。
603 actor.addFunc("setBaseAttribute", [](RPGActor *a, const std::string &attribute, float value) {
604 if (a) a->setBaseAttribute(attribute, double(value));
605 });
606 actor.addFunc("getBaseAttribute", [](RPGActor *a, const std::string &attribute) -> float {
607 return a ? float(a->getBaseAttribute(attribute)) : 0.f;
608 });
609 actor.addFunc("modifyBaseAttribute", [](RPGActor *a, const std::string &attribute, float delta) {
610 if (a) a->modifyBaseAttribute(attribute, double(delta));
611 });
612 actor.addFunc("hasAttribute", &RPGActor::hasAttribute);
613 actor.addFunc("addAttributeModifier",
614 [](RPGActor *a, const std::string &attribute, const std::string &source,
615 const std::string &op, float value, int priority) -> std::string {
616 return a ? a->addAttributeModifier(attribute, source, op, double(value), priority)
617 : std::string{};
618 });
619 actor.addFunc("removeAttributeModifier",
620 [](RPGActor *a, const std::string &attribute, const std::string &modifierId) {
621 return a && a->removeAttributeModifier(attribute, modifierId);
622 });
623 actor.addFunc("removeAttributeModifiersBySource", &RPGActor::removeAttributeModifiersBySource);
624 actor.addFunc("removeAllAttributeModifiersBySource",
626 actor.addFunc("getFinalAttribute", [](RPGActor *a, const std::string &attribute) -> float {
627 return a ? float(a->getFinalAttribute(attribute)) : 0.f;
628 });
629
630 actor.addFunc("applyEffect", &RPGActor::applyEffect);
631 actor.addFunc("removeStatus", &RPGActor::removeStatus);
632 actor.addFunc("removeStatusByEffect", &RPGActor::removeStatusByEffect);
633 actor.addFunc("removeStatusBySource", &RPGActor::removeStatusBySource);
634 actor.addFunc("removeStatusByTag", &RPGActor::removeStatusByTag);
635 actor.addFunc("hasEffect", &RPGActor::hasEffect);
636 actor.addFunc("hasStatusTag", &RPGActor::hasStatusTag);
637 actor.addFunc("getStatusCount", &RPGActor::getStatusCount);
638 actor.addFunc("getStatusEffectId", &RPGActor::getStatusEffectId);
639 actor.addFunc("getStatusStacks", &RPGActor::getStatusStacks);
640 actor.addFunc("getStatusRemaining", &RPGActor::getStatusRemaining);
641 actor.addFunc("getStatusInstanceId", &RPGActor::getStatusInstanceId);
642 actor.addFunc("getStatusSource", &RPGActor::getStatusSource);
643 actor.addFunc("getStatusProp", &RPGActor::getStatusProp);
644 actor.addFunc("setStatusProp", &RPGActor::setStatusProp);
645
646 actor.addFunc("applyBuff", &RPGActor::applyBuff);
647 actor.addFunc("removeBuff", &RPGActor::removeBuff);
648 actor.addFunc("removeBuffByEffect", &RPGActor::removeBuffByEffect);
649 actor.addFunc("removeBuffBySource", &RPGActor::removeBuffBySource);
650 actor.addFunc("removeBuffByTag", &RPGActor::removeBuffByTag);
651 actor.addFunc("hasBuff", &RPGActor::hasBuff);
652 actor.addFunc("hasBuffTag", &RPGActor::hasBuffTag);
653 actor.addFunc("getBuffCount", &RPGActor::getBuffCount);
654 actor.addFunc("getBuffEffectId", &RPGActor::getBuffEffectId);
655 actor.addFunc("getBuffStacks", &RPGActor::getBuffStacks);
656 actor.addFunc("getBuffRemaining", &RPGActor::getBuffRemaining);
657 actor.addFunc("getBuffInstanceId", &RPGActor::getBuffInstanceId);
658 actor.addFunc("getBuffSource", &RPGActor::getBuffSource);
659 actor.addFunc("getBuffProp", &RPGActor::getBuffProp);
660 actor.addFunc("setBuffProp", &RPGActor::setBuffProp);
661
662 actor.addFunc("learnSkill", &RPGActor::learnSkill);
663 actor.addFunc("knowsSkill", &RPGActor::knowsSkill);
664 actor.addFunc("forgetSkill", &RPGActor::forgetSkill);
665 actor.addFunc("getSkillCooldown", &RPGActor::getSkillCooldown);
666 actor.addFunc("setSkillCooldown", &RPGActor::setSkillCooldown);
667 actor.addFunc("canCastSkill", &RPGActor::canCastSkill);
668 actor.addFunc("canCastSkillReason", &RPGActor::canCastSkillReason);
669 // SimpleSquirrel 把 RPGActor* 当成必填 INSTANCE;脚本传 null(无目标 buff)
670 // 会抛 "bad cast expected INSTANCE got NULLPTR"。C++ 侧 target 本就可空。
671 bindNative(actor, "beginCastSkill", sqActorBeginCastSkill, 2, _SC("xs."));
672 actor.addFunc("cancelCastSkill", &RPGActor::cancelCastSkill);
673 actor.addFunc("isCastingSkill", &RPGActor::isCastingSkill);
674 actor.addFunc("getCastingSkillId", &RPGActor::getCastingSkillId);
675 actor.addFunc("getCastProgress", &RPGActor::getCastProgress);
676
677 // 成长:浮点一律包 float(Squirrel 未开 SQUSEDOUBLE)。
678 actor.addFunc("getLevel", &RPGActor::getLevel);
679 actor.addFunc("getXp", [](RPGActor *a) -> float { return a ? float(a->getXp()) : 0.f; });
680 actor.addFunc("getXpToNext", [](RPGActor *a) -> float { return a ? float(a->getXpToNext()) : 0.f; });
681 actor.addFunc("setXpToNext", [](RPGActor *a, float value) { if (a) a->setXpToNext(double(value)); });
682 actor.addFunc("restoreProgression", [](RPGActor *a, int level, float xp, float xpToNext) -> int {
683 if (!a) return 0;
684 auto result = a->restoreProgression(level, double(xp), double(xpToNext));
685 return result.ok() ? 1 : 0;
686 });
687 actor.addFunc("gainXp", [](RPGActor *a, float amount) -> bool { return a && a->gainXp(double(amount)); });
688
689 // 当前资源:同浮点 float 包装。
690 actor.addFunc("getCurrent", [](RPGActor *a, const std::string &r) -> float {
691 return a ? float(a->getCurrent(r)) : 0.f;
692 });
693 actor.addFunc("getMax", [](RPGActor *a, const std::string &r) -> float {
694 return a ? float(a->getMax(r)) : 0.f;
695 });
696 actor.addFunc("setCurrent",
697 [](RPGActor *a, const std::string &r, float value) { if (a) a->setCurrent(r, double(value)); });
698 actor.addFunc("takeDamage", [](RPGActor *a, const std::string &r, float amount, const std::string &source) -> float {
699 return a ? float(a->takeDamage(r, double(amount), source)) : 0.f;
700 });
701 actor.addFunc("heal", [](RPGActor *a, const std::string &r, float amount) -> float {
702 return a ? float(a->heal(r, double(amount))) : 0.f;
703 });
704 actor.addFunc("revive", [](RPGActor *a, const std::string &r, float amount) {
705 if (a) a->revive(r, double(amount));
706 });
707 actor.addFunc("isDead", [](RPGActor *a, const std::string &r) { return a && a->isDead(r); });
708 // 销毁 actor(ECS owned),供脚本在击杀/重开时释放。
709 actor.addFunc("release", &RPGActor::release);
710
711 // 特征:浮点查询包 float。
712 actor.addFunc("applyTrait", [](RPGActor *a, const std::string &t, const std::string &s) -> int {
713 return a ? a->applyTrait(t, s) : 0;
714 });
715 actor.addFunc("removeTrait", &RPGActor::removeTrait);
716 actor.addFunc("removeTraitsBySource", &RPGActor::removeTraitsBySource);
717 actor.addFunc("removeTraitsByTrait", &RPGActor::removeTraitsByTrait);
718 actor.addFunc("hasTrait", &RPGActor::hasTrait);
719 actor.addFunc("getTraitCount", &RPGActor::getTraitCount);
720 actor.addFunc("getTraitInstanceIdAt", &RPGActor::getTraitInstanceIdAt);
721 actor.addFunc("getTraitIdAt", &RPGActor::getTraitIdAt);
722 actor.addFunc("getTraitSourceAt", &RPGActor::getTraitSourceAt);
723 actor.addFunc("getParamRate", [](RPGActor *a, const std::string &p) -> float {
724 return a ? float(a->getParamRate(p)) : 1.f;
725 });
726 actor.addFunc("getElementRate", [](RPGActor *a, const std::string &e) -> float {
727 return a ? float(a->getElementRate(e)) : 1.f;
728 });
729 actor.addFunc("getStateRate", [](RPGActor *a, const std::string &s) -> float {
730 return a ? float(a->getStateRate(s)) : 1.f;
731 });
732 actor.addFunc("isStateResist", &RPGActor::isStateResist);
733 actor.addFunc("getExParam", [](RPGActor *a, const std::string &e) -> float {
734 return a ? float(a->getExParam(e)) : 0.f;
735 });
736 actor.addFunc("getAttackSpeed", [](RPGActor *a) -> float {
737 return a ? float(a->getAttackSpeed()) : 0.f;
738 });
739 actor.addFunc("getAttackTimesAdd", &RPGActor::getAttackTimesAdd);
740
741 // 职业
742 actor.addFunc("setClass", &RPGActor::setClass);
743 actor.addFunc("getClassId", &RPGActor::getClassId);
744 actor.addFunc("hasClass", &RPGActor::hasClass);
745 actor.addFunc("checkLevelSkills", &RPGActor::checkLevelSkills);
746 actor.addFunc("getClassLearnCount", &RPGActor::getClassLearnCount);
747 actor.addFunc("getClassLearnSkillIdAt", &RPGActor::getClassLearnSkillIdAt);
748 actor.addFunc("getClassLearnLevelAt", &RPGActor::getClassLearnLevelAt);
749 actor.addFunc("checkpointJson", [](RPGActor *value) -> std::string {
750 if (!value) return {};
751 auto result = value->checkpointJson();
752 return result.ok() ? std::move(result).takeValue() : std::string{};
753 });
754 actor.addFunc("restoreCheckpointJson", [](RPGActor *value, const std::string &json) -> int {
755 if (!value) return 0;
756 return value->restoreCheckpointJson(json).ok() ? 1 : 0;
757 });
758
759 auto ctx = table.addClass<SettlementContext>(
760 "SettlementContext", std::function<SettlementContext *()>([]() { return new SettlementContext(); }),
761 true);
762 // 同上:SettlementContext::get/set 用 double,脚本侧包一层转 float。
763 ctx.addFunc("get", [](SettlementContext *c, const std::string &key, float fallback) -> float {
764 return c ? float(c->get(key, double(fallback))) : fallback;
765 });
766 ctx.addFunc("set", [](SettlementContext *c, const std::string &key, float value) {
767 if (c) c->set(key, double(value));
768 });
769 ctx.addFunc("has", &SettlementContext::has);
770 ctx.addFunc("addTag", &SettlementContext::addTag);
771 ctx.addFunc("hasTag", &SettlementContext::hasTag);
772
773 auto tracker = table.addClass<Tracker>(
774 "Tracker", std::function<Tracker *()>([]() { return new Tracker(); }), true);
775 tracker.addFunc("syncAuto", &Tracker::syncAuto);
776 tracker.addFunc("activate", &Tracker::activate);
777 tracker.addFunc("canActivate", &Tracker::canActivate);
778 tracker.addFunc("canActivateReason", &Tracker::canActivateReason);
779 tracker.addFunc("notify", &Tracker::notify);
780 tracker.addFunc("claim", &Tracker::claim);
781 tracker.addFunc("reset", &Tracker::reset);
782 tracker.addFunc("abandon", &Tracker::abandon);
783 tracker.addFunc("fail", &Tracker::fail);
784 tracker.addFunc("pollEvents", &Tracker::pollEvents);
785 tracker.addFunc("snapshotJson", [](Tracker *t) -> std::string {
786 if (!t) return {};
787 auto result = t->snapshotJson();
788 return result.ok() ? std::move(result).takeValue() : std::string{};
789 });
790 tracker.addFunc("restoreSnapshotJson", [](Tracker *t, const std::string &json) -> int {
791 if (!t) return 0;
792 return t->restoreSnapshotJson(json).ok() ? 1 : 0;
793 });
794 tracker.addFunc("getCount", &Tracker::getCount);
795 tracker.addFunc("getId", &Tracker::getId);
796 tracker.addFunc("getState", &Tracker::getState);
797 tracker.addFunc("hasTag", &Tracker::hasTag);
798 tracker.addFunc("getExtra", &Tracker::getExtra);
799 tracker.addFunc("getObjectiveCount", &Tracker::getObjectiveCount);
800 tracker.addFunc("getObjectiveId", &Tracker::getObjectiveId);
801 tracker.addFunc("getObjectiveCurrent", &Tracker::getObjectiveCurrent);
802 tracker.addFunc("getObjectiveCountRequired", &Tracker::getObjectiveCountRequired);
803 tracker.addFunc("isObjectiveDone", &Tracker::isObjectiveDone);
804 tracker.addFunc("getRewardCount", &Tracker::getRewardCount);
805 tracker.addFunc("getRewardType", &Tracker::getRewardType);
806 tracker.addFunc("getRewardId", &Tracker::getRewardId);
807 tracker.addFunc("getRewardAmount",
808 [](Tracker *t, const std::string &id, int index) -> float {
809 return t ? float(t->getRewardAmount(id, index)) : 0.f;
810 });
811 tracker.addFunc("getEventCount", &Tracker::getEventCount);
812 tracker.addFunc("getEventEntryId", &Tracker::getEventEntryId);
813 tracker.addFunc("getEventObjectiveId", &Tracker::getEventObjectiveId);
814 tracker.addFunc("getEventAction", &Tracker::getEventAction);
815 tracker.addFunc("getEventTopic", &Tracker::getEventTopic);
816 tracker.addFunc("getEventTarget", &Tracker::getEventTarget);
817 tracker.addFunc("getEventAmount", &Tracker::getEventAmount);
818 tracker.addFunc("getEventReason", &Tracker::getEventReason);
819
820 auto battle = table.addClass<Battle>(
821 "Battle", std::function<Battle *()>([]() { return new Battle(); }), true);
822 battle.addFunc("addActor", &Battle::addActor);
823 battle.addFunc("configureSettlementRulesJson", [vm](Battle* value, const std::string& json) {
824 if (!value)
827 eve::DiagnosticCode::InvalidArgument, "Battle receiver must not be null", "battle", {},
828 "rpg.squirrel")));
830 if (!rules)
832 return eve::script::projectResult(vm, value->configureSettlementRules(rules.value()));
833 });
834 battle.addFunc("setAction", &Battle::setAction);
835 battle.addFunc("setActionChecked",
836 [vm](Battle *value, RPGActor *actor, const std::string &skillId,
837 RPGActor *target) {
838 if (!value)
842 "Battle receiver must not be null", "battle", {},
843 "rpg.squirrel")));
845 vm, value->setActionChecked(actor, skillId, target));
846 });
847 battle.addFunc("setActionByPolicyChecked",
848 [vm](Battle *value, RPGActor *actor, const std::string &skillId,
849 const std::string &policy) {
850 if (!value)
854 "Battle receiver must not be null", "battle", {},
855 "rpg.squirrel")));
856 BattleTargetPolicy parsed;
857 if (policy == "auto") parsed = BattleTargetPolicy::Auto;
858 else if (policy == "self") parsed = BattleTargetPolicy::Self;
859 else if (policy == "lowestHealthAlly")
861 else if (policy == "lowestHealthEnemy")
863 else
867 "unknown battle target policy", "policy", {},
868 "rpg.squirrel")));
870 vm, value->setActionByPolicyChecked(actor, skillId, parsed));
871 });
872 battle.addFunc("autoEnemyActions", &Battle::autoEnemyActions);
873 battle.addFunc("startRound", &Battle::startRound);
874 battle.addFunc("executeNextAction", &Battle::executeNextAction);
875 battle.addFunc("isFinished", &Battle::isFinished);
876 battle.addFunc("isVictory", &Battle::isVictory);
877 battle.addFunc("isDefeat", &Battle::isDefeat);
878 battle.addFunc("setPlayerSide", &Battle::setPlayerSide);
879 battle.addFunc("getPlayerSide", &Battle::getPlayerSide);
880 battle.addFunc("getWinnerSide", &Battle::getWinnerSide);
881 battle.addFunc("getTurn", &Battle::getTurn);
882 battle.addFunc("isActorAlive", &Battle::isActorAlive);
883 battle.addFunc("getActorCount", &Battle::getActorCount);
884 battle.addFunc("getActor", &Battle::getActor);
885 battle.addFunc("getSide", &Battle::getSide);
886 battle.addFunc("pollEvents", &Battle::pollEvents);
887 battle.addFunc("getEventCount", &Battle::getEventCount);
888 battle.addFunc("getEventAction", &Battle::getEventAction);
889 battle.addFunc("getEventSkillId", &Battle::getEventSkillId);
890 battle.addFunc("getEventCaster", &Battle::getEventCaster);
891 battle.addFunc("getEventTarget", &Battle::getEventTarget);
892 battle.addFunc("getEventAmount", [](Battle *b, int i) -> float { return float(b->getEventAmount(i)); });
893 battle.addFunc("getEventCrit", &Battle::getEventCrit);
894
895 auto party = table.addClass<Party>(
896 "RPGParty", std::function<Party *()>([]() { return new Party(); }), true);
897 party.addFunc("addMember", [vm](Party *value, const std::string &memberId, RPGActor *actor) {
898 if (!value)
902 "RPGParty receiver must not be null", "party", {}, "rpg.squirrel")));
903 return eve::script::projectResult(vm, value->addMember(memberId, actor));
904 });
905 party.addFunc("removeMember", [vm](Party *value, const std::string &memberId) {
906 if (!value)
910 "RPGParty receiver must not be null", "party", {}, "rpg.squirrel")));
911 return eve::script::projectResult(vm, value->removeMember(memberId));
912 });
913 party.addFunc("clear", &Party::clear);
914 party.addFunc("count", &Party::count);
915 party.addFunc("contains", &Party::contains);
916 party.addFunc("hasStaleMembers", &Party::hasStaleMembers);
917 party.addFunc("getMemberId", &Party::getMemberId);
918 party.addFunc("getMemberActor", &Party::getMemberActor);
919 party.addFunc("findMemberActor", &Party::findMemberActor);
920 party.addFunc("addToBattle", [vm](Party *value, Battle *battleValue, int side) {
921 if (!value)
925 "RPGParty receiver must not be null", "party", {}, "rpg.squirrel")),
926 [](int count) { return eve::Value(count); });
927 return eve::script::projectResult(vm, value->addToBattle(battleValue, side),
928 [](int count) { return eve::Value(count); });
929 });
930 party.addFunc("recoverAtCheckpoint",
931 [vm](Party *value, const std::string &healthResource, float healthRatio,
932 const std::string &secondaryResource, float secondaryRatio) {
933 if (!value)
937 "RPGParty receiver must not be null", "party", {}, "rpg.squirrel")),
938 [](int count) { return eve::Value(count); });
940 vm, value->recoverAtCheckpoint(healthResource, healthRatio, secondaryResource,
941 secondaryRatio),
942 [](int count) { return eve::Value(count); });
943 });
944
945 auto gs = table.addClass<GameState>(
946 "GameState", std::function<GameState *()>([]() { return new GameState(); }), true);
947 gs.addFunc("setSwitch", &GameState::setSwitch);
948 gs.addFunc("switchOn", &GameState::switchOn);
949 gs.addFunc("switchOff", &GameState::switchOff);
950 gs.addFunc("isSwitchOn", &GameState::isSwitchOn);
951 gs.addFunc("setVariable", [](GameState *g, const std::string &n, float v) { if (g) g->setVariable(n, double(v)); });
952 gs.addFunc("getVariable", [](GameState *g, const std::string &n) -> float { return g ? float(g->getVariable(n)) : 0.f; });
953 gs.addFunc("addVariable", [](GameState *g, const std::string &n, float d) { if (g) g->addVariable(n, double(d)); });
954 gs.addFunc("setSelfVariable", [](GameState *g, const std::string &s, const std::string &n, float v) { if (g) g->setSelfVariable(s, n, double(v)); });
955 gs.addFunc("getSelfVariable", [](GameState *g, const std::string &s, const std::string &n) -> float { return g ? float(g->getSelfVariable(s, n)) : 0.f; });
956 gs.addFunc("hasSelfVariable", &GameState::hasSelfVariable);
957 gs.addFunc("setSelfString", &GameState::setSelfString);
958 gs.addFunc("getSelfString", &GameState::getSelfString);
959 gs.addFunc("hasSelfString", &GameState::hasSelfString);
960 gs.addFunc("clearSelfString", &GameState::clearSelfString);
961 gs.addFunc("clear", &GameState::clear);
962 gs.addFunc("snapshotJson", [](GameState *g) -> std::string {
963 if (!g) return {};
964 auto result = g->snapshotJson();
965 return result.ok() ? std::move(result).takeValue() : std::string{};
966 });
967 gs.addFunc("restoreSnapshotJson", [](GameState *g, const std::string &json) -> int {
968 if (!g) return 0;
969 auto result = g->restoreSnapshotJson(json);
970 return result.ok() ? 1 : 0;
971 });
972
973 auto worldState = table.addClass<WorldState>(
974 "RPGWorldState", std::function<WorldState *()>([]() { return nullptr; }), true);
975 worldState.addFunc("isObjectConsumed", &WorldState::isObjectConsumed);
976 worldState.addFunc("consumeObject", [vm](WorldState *state, const std::string &mapId,
977 const std::string &objectId) {
978 if (!state)
981 eve::DiagnosticCode::InvalidArgument, "RPGWorldState receiver must not be null",
982 "worldState", {}, "rpg.squirrel")));
983 return eve::script::projectResult(vm, state->consumeObject(mapId, objectId));
984 });
985 worldState.addFunc("resetObject", [vm](WorldState *state, const std::string &mapId,
986 const std::string &objectId) {
987 if (!state)
990 eve::DiagnosticCode::InvalidArgument, "RPGWorldState receiver must not be null",
991 "worldState", {}, "rpg.squirrel")));
992 return eve::script::projectResult(vm, state->resetObject(mapId, objectId));
993 });
994
995 auto storyEvent = table.addClass<StoryEventSession>(
996 "RPGStoryEventSession",
997 std::function<StoryEventSession *()>([]() { return new StoryEventSession(); }), true);
998 storyEvent.addFunc("begin", [vm](StoryEventSession *session, const std::string &eventId,
999 GameState *gameState) {
1000 if (!session)
1004 "RPGStoryEventSession receiver must not be null", "session", {},
1005 "rpg.squirrel")));
1006 return eve::script::projectResult(vm, session->begin(eventId, gameState));
1007 });
1008 storyEvent.addFunc("advance", [vm](StoryEventSession *session, GameState *gameState) {
1009 if (!session)
1013 "RPGStoryEventSession receiver must not be null", "session", {},
1014 "rpg.squirrel")),
1015 [](int remaining) { return eve::Value(remaining); });
1016 return eve::script::projectResult(vm, session->advance(gameState),
1017 [](int remaining) { return eve::Value(remaining); });
1018 });
1019 storyEvent.addFunc("isActive", &StoryEventSession::isActive);
1020 storyEvent.addFunc("isFinished", &StoryEventSession::isFinished);
1021 storyEvent.addFunc("getStepIndex", &StoryEventSession::getStepIndex);
1022 storyEvent.addFunc("getStepCount", &StoryEventSession::getStepCount);
1023 storyEvent.addFunc("getEventId", &StoryEventSession::getEventId);
1024 storyEvent.addFunc("getStepKind", &StoryEventSession::getStepKind);
1025 storyEvent.addFunc("getReference", &StoryEventSession::getReference);
1026 storyEvent.addFunc("getActorId", &StoryEventSession::getActorId);
1027 storyEvent.addFunc("getX", [](StoryEventSession *session) -> float {
1028 return session ? static_cast<float>(session->getX()) : 0.0F;
1029 });
1030 storyEvent.addFunc("getY", [](StoryEventSession *session) -> float {
1031 return session ? static_cast<float>(session->getY()) : 0.0F;
1032 });
1033 storyEvent.addFunc("getDuration", [](StoryEventSession *session) -> float {
1034 return session ? static_cast<float>(session->getDuration()) : 0.0F;
1035 });
1036
1037 auto storySession = table.addClass<RpgStorySession>(
1038 "RPGStorySession", std::function<RpgStorySession *()>([]() { return new RpgStorySession(); }), true);
1039 // `party` / `bag` / `equipment` are optional collaborators: a story that only
1040 // walks actors and shows messages needs none of them, and the C++ entry point
1041 // documents them as nullable. ssq's default pointer binding rejects Squirrel
1042 // `null`, so accept ssq::Object and translate null -> nullptr (the same idiom
1043 // as avatar/Avatar.cpp's addLayer). `gameState` stays typed and required: it
1044 // owns the story completion fact, so a story always has one.
1045 storySession.addFunc("begin", [vm](RpgStorySession *session, const std::string &storyId, GameState *gameState,
1046 ssq::Object partyObject, ssq::Object bagObject, ssq::Object equipmentObject) {
1047 if (!session)
1050 eve::DiagnosticCode::InvalidArgument, "RPGStorySession receiver must not be null",
1051 "session", {}, "rpg.squirrel")));
1052 Party *party = partyObject.isNull() ? nullptr : partyObject.toPtrUnsafe<Party *>();
1053 inventory::Bag *bag = bagObject.isNull() ? nullptr : bagObject.toPtrUnsafe<inventory::Bag *>();
1054 inventory::EquipmentSet *equipment =
1055 equipmentObject.isNull() ? nullptr : equipmentObject.toPtrUnsafe<inventory::EquipmentSet *>();
1056 return eve::script::projectResult(vm, session->begin(storyId, gameState, party, bag, equipment));
1057 });
1058 storySession.addFunc("advance", [vm](RpgStorySession *session) {
1059 if (!session)
1062 eve::DiagnosticCode::InvalidArgument, "RPGStorySession receiver must not be null",
1063 "session", {}, "rpg.squirrel")));
1064 return eve::script::projectResult(vm, session->advance());
1065 });
1066 storySession.addFunc("select", [vm](RpgStorySession *session, const std::string &routeLabel) {
1067 if (!session)
1070 eve::DiagnosticCode::InvalidArgument, "RPGStorySession receiver must not be null",
1071 "session", {}, "rpg.squirrel")));
1072 return eve::script::projectResult(vm, session->select(routeLabel));
1073 });
1074 storySession.addFunc("stop", &RpgStorySession::stop);
1075 storySession.addFunc("isActive", &RpgStorySession::isActive);
1076 storySession.addFunc("isBlocked", &RpgStorySession::isBlocked);
1077 storySession.addFunc("getStoryId", &RpgStorySession::getStoryId);
1078 storySession.addFunc("getStepKind", &RpgStorySession::getStepKind);
1079 storySession.addFunc("getChoiceLabelCount", [](RpgStorySession *session) -> int {
1080 return session ? static_cast<int>(session->getChoiceLabels().size()) : 0;
1081 });
1082 storySession.addFunc("getChoiceLabel", [](RpgStorySession *session, int index) -> std::string {
1083 if (!session) return {};
1084 const auto labels = session->getChoiceLabels();
1085 if (index < 0 || static_cast<std::size_t>(index) >= labels.size()) return {};
1086 return labels[static_cast<std::size_t>(index)];
1087 });
1088 storySession.addFunc("getStepString", [](RpgStorySession *session, const std::string &fieldName) -> std::string {
1089 if (!session) return {};
1090 const eve::Value* value = session->getStepPayload().find(fieldName);
1091 return value && value->isString() ? value->asString() : std::string{};
1092 });
1093 storySession.addFunc("getStepNumber", [](RpgStorySession *session, const std::string &fieldName) -> float {
1094 if (!session) return 0.0F;
1095 const eve::Value* value = session->getStepPayload().find(fieldName);
1096 if (!value || !value->isNumeric()) return 0.0F;
1097 return value->isInt64() ? static_cast<float>(value->asInt()) : static_cast<float>(value->asDouble());
1098 });
1099 storySession.addFunc("getStepBool", [](RpgStorySession *session, const std::string &fieldName) -> bool {
1100 if (!session) return false;
1101 const eve::Value* value = session->getStepPayload().find(fieldName);
1102 return value && value->isBool() && value->asBool();
1103 });
1104
1105 auto saveSession = table.addClass<RPGSaveSession>(
1106 "RPGSaveSession", std::function<RPGSaveSession *()>([]() { return new RPGSaveSession(); }), true);
1107 saveSession.addFunc("bind",
1108 [](RPGSaveSession *session, GameState *gameState, Tracker *tracker, RPGActor *actor,
1109 inventory::Bag *bag, inventory::EquipmentSet *equipment) -> int {
1110 if (!session || !gameState || !tracker || !actor || !bag || !equipment) return 0;
1111 session->bind(*gameState, *tracker, *actor, *bag, *equipment);
1112 return 1;
1113 });
1114 saveSession.addFunc("bindParty",
1115 [](RPGSaveSession *session, GameState *gameState, Tracker *tracker, Party *party,
1116 inventory::Bag *bag, inventory::EquipmentSet *equipment) -> int {
1117 if (!session || !gameState || !tracker || !party || !bag || !equipment) return 0;
1118 session->bindParty(*gameState, *tracker, *party, *bag, *equipment);
1119 return 1;
1120 });
1121 saveSession.addFunc("setContentVersion", [](RPGSaveSession *session, const std::string &version) -> int {
1122 return session && session->setContentVersion(version).ok() ? 1 : 0;
1123 });
1124 saveSession.addFunc("getContentVersion", &RPGSaveSession::getContentVersion);
1125 saveSession.addFunc("allowCompatibleContentVersion",
1126 [](RPGSaveSession *session, const std::string &version) -> int {
1127 return session && session->allowCompatibleContentVersion(version).ok() ? 1 : 0;
1128 });
1129 saveSession.addFunc(
1130 "addIdRenameMigration",
1131 [](RPGSaveSession *session, const std::string &fromVersion, const std::string &domain,
1132 const std::string &oldId, const std::string &newId) -> int {
1133 if (!session) return 0;
1134 RPGSaveIdDomain parsedDomain;
1135 if (domain == "item") parsedDomain = RPGSaveIdDomain::Item;
1136 else if (domain == "quest") parsedDomain = RPGSaveIdDomain::Quest;
1137 else if (domain == "questObjective") parsedDomain = RPGSaveIdDomain::QuestObjective;
1138 else if (domain == "skill") parsedDomain = RPGSaveIdDomain::Skill;
1139 else if (domain == "class") parsedDomain = RPGSaveIdDomain::Class;
1140 else if (domain == "trait") parsedDomain = RPGSaveIdDomain::Trait;
1141 else if (domain == "traitSource") parsedDomain = RPGSaveIdDomain::TraitSource;
1142 else if (domain == "equipmentSlot") parsedDomain = RPGSaveIdDomain::EquipmentSlot;
1143 else return 0;
1144 return session->addIdRenameMigration(fromVersion, parsedDomain, oldId, newId).ok() ? 1 : 0;
1145 });
1146 saveSession.addFunc("addQuestAdditionMigration",
1147 [](RPGSaveSession *session, const std::string &fromVersion,
1148 const std::string &questId) -> int {
1149 return session && session->addQuestAdditionMigration(fromVersion, questId).ok()
1150 ? 1
1151 : 0;
1152 });
1153 saveSession.addFunc("allowSingleActorPartyMigration",
1154 [](RPGSaveSession *session, const std::string &fromVersion) -> int {
1155 return session && session->allowSingleActorPartyMigration(fromVersion).ok() ? 1 : 0;
1156 });
1157 saveSession.addFunc("snapshotJson", [](RPGSaveSession *session) -> std::string {
1158 if (!session) return {};
1159 auto result = session->snapshotJson();
1160 return result.ok() ? std::move(result).takeValue() : std::string{};
1161 });
1162 saveSession.addFunc("validateSnapshotJson", [](RPGSaveSession *session, const std::string &json) -> int {
1163 return session && session->validateSnapshotJson(json).ok() ? 1 : 0;
1164 });
1165 saveSession.addFunc("restoreSnapshotJson", [](RPGSaveSession *session, const std::string &json) -> int {
1166 if (!session) return 0;
1167 return session->restoreSnapshotJson(json).ok() ? 1 : 0;
1168 });
1169}
1170
1171void RPG::expose(ssq::Class &cls) {
1172 const HSQUIRRELVM vm = cls.getHandle();
1173 cls.addFunc("getName", &RPG::getName);
1174 cls.addFunc("newActor", &RPG::newActor);
1175 cls.addFunc("newParty", &RPG::newParty);
1176 cls.addFunc("registerEffectsFromJson", &RPG::registerEffectsFromJson);
1177 cls.addFunc("clearEffectDefinitions", &RPG::clearEffectDefinitions);
1178 cls.addFunc("getEffectDefinitionCount", &RPG::getEffectDefinitionCount);
1179 cls.addFunc("registerSkillsFromJson", &RPG::registerSkillsFromJson);
1180 cls.addFunc("clearSkillDefinitions", &RPG::clearSkillDefinitions);
1181 cls.addFunc("getSkillDefinitionCount", &RPG::getSkillDefinitionCount);
1182 cls.addFunc("registerQuestsFromJson", &RPG::registerQuestsFromJson);
1183 cls.addFunc("replaceQuestsFromJson", [vm](RPG *rpg, const std::string &json) {
1184 if (!rpg)
1187 eve::DiagnosticCode::InvalidArgument, "RPG receiver must not be null", "rpg", {},
1188 "rpg.squirrel")),
1189 [](int count) { return eve::Value(count); });
1190 return eve::script::projectResult(vm, rpg->replaceQuestsFromJson(json),
1191 [](int count) { return eve::Value(count); });
1192 });
1193 cls.addFunc("claimQuestRewards",
1194 [vm](RPG *rpg, Tracker *tracker, GameState *gameState,
1195 inventory::Bag *bag, const std::string &questId) {
1196 if (!rpg)
1200 "claimQuestRewards requires an RPG module", "rpg")),
1201 [](int count) { return eve::Value(count); });
1203 vm, rpg->claimQuestRewards(tracker, gameState, bag, questId),
1204 [](int count) { return eve::Value(count); });
1205 });
1206 cls.addFunc(
1207 "collectWorldLoot",
1208 [vm](RPG *rpg, Tracker *tracker, GameState *gameState, inventory::Bag *bag,
1209 const std::string &mapId, const std::string &objectId,
1210 const std::string &requiredQuestId, const std::string &itemId, int itemQuantity,
1211 const std::string &attributeId, float attributeAmount,
1212 const std::string &notifyTopic, const std::string &notifyTarget, int notifyAmount) {
1213 if (!rpg)
1217 "collectWorldLoot requires an RPG module", "rpg")),
1218 [](int count) { return eve::Value(count); });
1219 WorldLootRequest request;
1220 request.mapId = mapId;
1221 request.objectId = objectId;
1222 request.requiredQuestId = requiredQuestId;
1223 request.itemId = itemId;
1224 request.itemQuantity = itemQuantity;
1225 request.attributeId = attributeId;
1226 request.attributeAmount = static_cast<double>(attributeAmount);
1227 request.notifyTopic = notifyTopic;
1228 request.notifyTarget = notifyTarget;
1229 request.notifyAmount = notifyAmount;
1231 vm, rpg->collectWorldLoot(tracker, gameState, bag, request),
1232 [](int count) { return eve::Value(count); });
1233 });
1234 cls.addFunc(
1235 "settleBattleVictory",
1236 [vm](RPG *rpg, RPGActor *actor, Tracker *tracker, GameState *gameState,
1237 const std::string &mapId, const std::string &objectId,
1238 const std::string &requiredQuestId, float xpAmount, float xpGrowth,
1239 const std::string &attributeId, float attributeAmount,
1240 const std::string &notifyTopic, const std::string &notifyTarget, int notifyAmount,
1241 const std::string &defeatCounterId, int defeatCounterAmount,
1242 const std::string &levelPointAttributeId, int pointsPerLevel) {
1243 if (!rpg)
1247 "settleBattleVictory requires an RPG module", "rpg")),
1248 [](BattleVictoryReceipt receipt) {
1250 value.emplace("levelsGained", eve::Value(receipt.levelsGained));
1251 value.emplace("skillsLearned", eve::Value(receipt.skillsLearned));
1252 return eve::Value(std::move(value));
1253 });
1254 BattleVictoryRequest request;
1255 request.mapId = mapId;
1256 request.objectId = objectId;
1257 request.requiredQuestId = requiredQuestId;
1258 request.xpAmount = static_cast<double>(xpAmount);
1259 request.xpGrowth = static_cast<double>(xpGrowth);
1260 request.attributeId = attributeId;
1261 request.attributeAmount = static_cast<double>(attributeAmount);
1262 request.notifyTopic = notifyTopic;
1263 request.notifyTarget = notifyTarget;
1264 request.notifyAmount = notifyAmount;
1265 request.defeatCounterId = defeatCounterId;
1266 request.defeatCounterAmount = defeatCounterAmount;
1267 request.levelPointAttributeId = levelPointAttributeId;
1268 request.pointsPerLevel = pointsPerLevel;
1270 vm, rpg->settleBattleVictory(actor, tracker, gameState, request),
1271 [](BattleVictoryReceipt receipt) {
1272 eve::Value::Object value;
1273 value.emplace("levelsGained", eve::Value(receipt.levelsGained));
1274 value.emplace("skillsLearned", eve::Value(receipt.skillsLearned));
1275 return eve::Value(std::move(value));
1276 });
1277 });
1278 cls.addFunc("replaceShopOffersFromJson", [vm](RPG *rpg, const std::string &json) {
1279 if (!rpg)
1283 "replaceShopOffersFromJson requires an RPG module", "rpg")),
1284 [](int count) { return eve::Value(count); });
1285 return eve::script::projectResult(vm, rpg->replaceShopOffersFromJson(json),
1286 [](int count) { return eve::Value(count); });
1287 });
1288 cls.addFunc("getShopOfferCount", &RPG::getShopOfferCount);
1289 cls.addFunc("clearShopOffers", &RPG::clearShopOffers);
1290 cls.addFunc("hasShopOffer", &RPG::hasShopOffer);
1291 cls.addFunc("getShopOfferId", &RPG::getShopOfferId);
1292 cls.addFunc("getShopOfferItemId", &RPG::getShopOfferItemId);
1293 cls.addFunc("getShopOfferName", &RPG::getShopOfferName);
1294 cls.addFunc("getShopOfferDescription", &RPG::getShopOfferDescription);
1295 cls.addFunc("getShopOfferBuyPrice", &RPG::getShopOfferBuyPrice);
1296 cls.addFunc("getShopOfferSellPrice", &RPG::getShopOfferSellPrice);
1297 cls.addFunc("buyShopOffer",
1298 [vm](RPG *rpg, GameState *gameState, inventory::Bag *bag,
1299 const std::string &currencyId, const std::string &offerId, int quantity) {
1300 if (!rpg)
1304 "buyShopOffer requires an RPG module", "rpg")),
1305 [](int count) { return eve::Value(count); });
1307 vm, rpg->buyShopOffer(gameState, bag, currencyId, offerId, quantity),
1308 [](int count) { return eve::Value(count); });
1309 });
1310 cls.addFunc("sellShopOffer",
1311 [vm](RPG *rpg, GameState *gameState, inventory::Bag *bag,
1312 const std::string &currencyId, const std::string &offerId, int quantity) {
1313 if (!rpg)
1317 "sellShopOffer requires an RPG module", "rpg")),
1318 [](int count) { return eve::Value(count); });
1320 vm, rpg->sellShopOffer(gameState, bag, currencyId, offerId, quantity),
1321 [](int count) { return eve::Value(count); });
1322 });
1323 cls.addFunc("replaceEncountersFromJson", [vm](RPG *rpg, const std::string &json) {
1324 if (!rpg)
1328 "replaceEncountersFromJson requires an RPG module", "rpg")),
1329 [](int count) { return eve::Value(count); });
1330 return eve::script::projectResult(vm, rpg->replaceEncountersFromJson(json),
1331 [](int count) { return eve::Value(count); });
1332 });
1333 cls.addFunc("clearEncounters", &RPG::clearEncounters);
1334 cls.addFunc("hasEncounter", &RPG::hasEncounter);
1335 cls.addFunc("getEncounterMemberCount", &RPG::getEncounterMemberCount);
1336 cls.addFunc("newEncounterActor", &RPG::newEncounterActor);
1337 cls.addFunc("newEncounterMemberActor", &RPG::newEncounterMemberActor);
1338 cls.addFunc("getEncounterDisplayName", &RPG::getEncounterDisplayName);
1339 cls.addFunc("getEncounterMaxHp", &RPG::getEncounterMaxHp);
1340 cls.addFunc("getEncounterMemberDisplayName", &RPG::getEncounterMemberDisplayName);
1341 cls.addFunc("getEncounterMemberMaxHp", &RPG::getEncounterMemberMaxHp);
1342 cls.addFunc("replaceBattleTacticsFromJson", [vm](RPG *rpg, const std::string &json) {
1343 if (!rpg)
1347 "replaceBattleTacticsFromJson requires an RPG module", "rpg")),
1348 [](int count) { return eve::Value(count); });
1349 return eve::script::projectResult(vm, rpg->replaceBattleTacticsFromJson(json),
1350 [](int count) { return eve::Value(count); });
1351 });
1352 cls.addFunc("clearBattleTactics", &RPG::clearBattleTactics);
1353 cls.addFunc("queueBattleTactic",
1354 [vm](RPG *rpg, Battle *battle, RPGActor *actor, const std::string &tacticsId) {
1355 if (!rpg)
1359 "queueBattleTactic requires an RPG module", "rpg")),
1360 [](const std::string &skillId) { return eve::Value(skillId); });
1361 return eve::script::projectResult(vm, rpg->queueBattleTactic(battle, actor, tacticsId),
1362 [](const std::string &skillId) { return eve::Value(skillId); });
1363 });
1364 cls.addFunc("replaceStoryEventsFromJson", [vm](RPG *rpg, const std::string &json) {
1365 if (!rpg)
1369 "replaceStoryEventsFromJson requires an RPG module", "rpg")),
1370 [](int count) { return eve::Value(count); });
1371 return eve::script::projectResult(vm, rpg->replaceStoryEventsFromJson(json),
1372 [](int count) { return eve::Value(count); });
1373 });
1374 cls.addFunc("clearStoryEvents", &RPG::clearStoryEvents);
1375 cls.addFunc("getStoryEventCount", &RPG::getStoryEventCount);
1376 cls.addFunc("hasStoryEvent", &RPG::hasStoryEvent);
1377 cls.addFunc("newStoryEventSession", &RPG::newStoryEventSession);
1378 cls.addFunc("replaceStoriesFromDnut", [vm](RPG *rpg, const std::string &source, const std::string &path) {
1379 if (!rpg)
1383 "replaceStoriesFromDnut requires an RPG module", "rpg")),
1384 [](int count) { return eve::Value(count); });
1385 return eve::script::projectResult(vm, rpg->replaceStoriesFromDnut(source, path),
1386 [](int count) { return eve::Value(count); });
1387 });
1388 cls.addFunc("clearStories", &RPG::clearStories);
1389 cls.addFunc("getStoryCount", &RPG::getStoryCount);
1390 cls.addFunc("hasStory", &RPG::hasStory);
1391 cls.addFunc("newStorySession", &RPG::newStorySession);
1392 cls.addFunc("settleEncounterVictory",
1393 [vm](RPG *rpg, RPGActor *actor, Tracker *tracker, GameState *gameState,
1394 const std::string &encounterId, const std::string &mapId,
1395 const std::string &objectId) {
1396 if (!rpg)
1401 "settleEncounterVictory requires an RPG module", "rpg")),
1402 [](BattleVictoryReceipt receipt) {
1404 value.emplace("levelsGained", eve::Value(receipt.levelsGained));
1405 value.emplace("skillsLearned", eve::Value(receipt.skillsLearned));
1406 return eve::Value(std::move(value));
1407 });
1409 vm, rpg->settleEncounterVictory(actor, tracker, gameState,
1410 encounterId, mapId, objectId),
1411 [](BattleVictoryReceipt receipt) {
1412 eve::Value::Object value;
1413 value.emplace("levelsGained", eve::Value(receipt.levelsGained));
1414 value.emplace("skillsLearned", eve::Value(receipt.skillsLearned));
1415 return eve::Value(std::move(value));
1416 });
1417 });
1418 cls.addFunc("clearQuestDefinitions", &RPG::clearQuestDefinitions);
1419 cls.addFunc("getQuestDefinitionCount", &RPG::getQuestDefinitionCount);
1420 cls.addFunc("hasQuestDefinition", &RPG::hasQuestDefinition);
1421 cls.addFunc("newTracker", &RPG::newTracker);
1422 cls.addFunc("getLevelUpEventCount", &RPG::getLevelUpEventCount);
1423 cls.addFunc("getLevelUpEventActor", &RPG::getLevelUpEventActor);
1424 cls.addFunc("getLevelUpEventPreviousLevel", &RPG::getLevelUpEventPreviousLevel);
1425 cls.addFunc("getLevelUpEventNewLevel", &RPG::getLevelUpEventNewLevel);
1426 cls.addFunc("getVitalsEventCount", &RPG::getVitalsEventCount);
1427 cls.addFunc("getVitalsEventActor", &RPG::getVitalsEventActor);
1428 cls.addFunc("getVitalsEventResource", &RPG::getVitalsEventResource);
1429 cls.addFunc("getVitalsEventAction", &RPG::getVitalsEventAction);
1430 cls.addFunc("getVitalsEventAmount",
1431 [](RPG *r, int index) -> float { return float(r->getVitalsEventAmount(index)); });
1432 cls.addFunc("getVitalsEventSource", &RPG::getVitalsEventSource);
1433 cls.addFunc("getVitalsEventCurrent",
1434 [](RPG *r, int index) -> float { return float(r->getVitalsEventCurrent(index)); });
1435 cls.addFunc("getVitalsEventMax",
1436 [](RPG *r, int index) -> float { return float(r->getVitalsEventMax(index)); });
1437 cls.addFunc("registerItemStatsFromJson", &RPG::registerItemStatsFromJson);
1438 cls.addFunc("clearItemStats", &RPG::clearItemStats);
1439 cls.addFunc("clearAllItemStats", &RPG::clearAllItemStats);
1440 cls.addFunc("getItemStatCount", &RPG::getItemStatCount);
1441 cls.addFunc("syncEquipModifiers", &RPG::syncEquipModifiers);
1442 cls.addFunc("registerLootTablesFromJson", &RPG::registerLootTablesFromJson);
1443 cls.addFunc("clearLootTables", &RPG::clearLootTables);
1444 cls.addFunc("getLootTableCount", &RPG::getLootTableCount);
1445 cls.addFunc("rollLoot", &RPG::rollLoot);
1446 cls.addFunc("registerTraitsFromJson", &RPG::registerTraitsFromJson);
1447 cls.addFunc("clearTraitDefinitions", &RPG::clearTraitDefinitions);
1448 cls.addFunc("getTraitDefinitionCount", &RPG::getTraitDefinitionCount);
1449 cls.addFunc("registerClassesFromJson", &RPG::registerClassesFromJson);
1450 cls.addFunc("clearClassDefinitions", &RPG::clearClassDefinitions);
1451 cls.addFunc("getClassDefinitionCount", &RPG::getClassDefinitionCount);
1452 cls.addFunc("registerSkillDamage",
1453 [](RPG *r, const std::string &skillId, const std::string &damageType,
1454 const std::string &formula, const std::string &element, float critChance,
1455 int hitChance) -> int {
1456 return r->registerSkillDamage(skillId, damageType, formula, element,
1457 double(critChance), hitChance);
1458 });
1459 cls.addFunc("clearSkillDamage", &RPG::clearSkillDamage);
1460 cls.addFunc("newBattle", &RPG::newBattle);
1461 cls.addFunc("newGameState", &RPG::newGameState);
1462 cls.addFunc("newWorldState", &RPG::newWorldState);
1463 cls.addFunc("globalGameState", &RPG::globalGameState);
1464 cls.addFunc("update", &RPG::update);
1465 cls.addFunc("getTickEventCount", &RPG::getTickEventCount);
1466 cls.addFunc("getTickEventActor", &RPG::getTickEventActor);
1467 cls.addFunc("getTickEventInstanceId", &RPG::getTickEventInstanceId);
1468 cls.addFunc("getTickEventEffectId", &RPG::getTickEventEffectId);
1469 cls.addFunc("getTickEventSource", &RPG::getTickEventSource);
1470 cls.addFunc("getTickEventStacks", &RPG::getTickEventStacks);
1471 cls.addFunc("getStatusChangeEventCount", &RPG::getStatusChangeEventCount);
1472 cls.addFunc("getStatusChangeEventActor", &RPG::getStatusChangeEventActor);
1473 cls.addFunc("getStatusChangeEventInstanceId", &RPG::getStatusChangeEventInstanceId);
1474 cls.addFunc("getStatusChangeEventEffectId", &RPG::getStatusChangeEventEffectId);
1475 cls.addFunc("getStatusChangeEventSource", &RPG::getStatusChangeEventSource);
1476 cls.addFunc("getStatusChangeEventAction", &RPG::getStatusChangeEventAction);
1477 cls.addFunc("getStatusChangeEventStacks", &RPG::getStatusChangeEventStacks);
1478 cls.addFunc("getStatusChangeEventReason", &RPG::getStatusChangeEventReason);
1479 cls.addFunc("getCastEventCount", &RPG::getCastEventCount);
1480 cls.addFunc("getCastEventCaster", &RPG::getCastEventCaster);
1481 cls.addFunc("getCastEventTarget", &RPG::getCastEventTarget);
1482 cls.addFunc("getCastEventSkillId", &RPG::getCastEventSkillId);
1483 cls.addFunc("newSettlementContext", &RPG::newSettlementContext);
1484 cls.addFunc("runSettlement", &RPG::runSettlement);
1485 cls.addFunc("getSettlementStageCount", &RPG::getSettlementStageCount);
1486 cls.addFunc("hasSettlementStage", &RPG::hasSettlementStage);
1487 cls.addFunc("setSettlementStageEnabled", &RPG::setSettlementStageEnabled);
1488 cls.addFunc("setSettlementStagePriority", &RPG::setSettlementStagePriority);
1489 cls.addFunc("removeSettlementStage", &RPG::removeSettlementStage);
1490 cls.addFunc("clearSettlementPipeline", &RPG::clearSettlementPipeline);
1491}
1492
1493} // namespace eve::rpg
LogicalId target
double value
LogicalId itemId
Player-equivalent, host-neutral control adapter for one RPG Battle.
const std::string & s
伤害公式 DSL 与技能伤害注册。
Strict ordered battle-action policies for companions and AI.
Atomic post-battle progression and persistent-world settlement.
回合制战斗对象:参战者、行动顺序、目标选取、行动执行。
int priority
职业(Class)定义:可学技能(升级解锁)与职业基础特征,进程级注册表。
struct SQVM * HSQUIRRELVM
glm::vec4 p[6]
HSQUIRRELVM vm
Definition ECS.cpp:20
HSQOBJECT cls
Definition ECS.cpp:21
Strict RPG encounter definitions and settlement projection.
装备加成:把已装备物品(inventory::EquipmentSet)的注册属性加成同步到 actor 的属性修改器上。
全局游戏状态:开关(bool)、变量(数字)、独立变量(按作用域)。
const GltfImportRequest & request
tensor::Graph g
Definition GpuGraph.cpp:7
std::uint32_t key
glm::vec3 n
Definition Grass.cpp:63
double r
float v
std::int32_t c
角色成长:等级 / 经验 / 升级。
掉落表:按概率随机掉落物品到背包。
std::string name
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
int level
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:26
Generation-safe ordered RPG party relationships.
std::string path
Definition PlayHost.cpp:110
std::uint32_t seed
Definition PointSet.cpp:807
Player-equivalent control adapter for persistent RPG product loops.
float d
float t
Atomic orchestration for claiming data-driven quest rewards.
任务 / 成就 / 教程的通用定义模板与进程级注册表。
Transactional composition of persistent RPG state owners.
RPG vocabulary for the .dnut sequence language, plus its catalogue and session.
std::string string
Strict, atomically replaceable RPG shop content.
Atomic RPG currency and inventory purchase/sale orchestration.
std::uint32_t count
std::string damageType
std::string element
The single Squirrel projection for common Result, Status and Value.
Versioned, resumable presentation-event sequencing for RPG games.
ecs::EntityHandle side
std::optional< InteractionSession > session
Definition Tactics.cpp:39
目标追踪器运行时实例(玩家日志 / 成就 / 教程可各建一份)。
特征(Trait):RPG Maker 式数据驱动的能力/特性模板与进程级注册表。
uint32_t index
const UnitySourceAsset & source
当前资源(hp/mana...)的受伤 / 治疗 / 复活 / 死亡。
Atomic settlement of persistent world loot interactions.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
virtual std::string getName() const =0
Returns the name.
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Strong, domain-neutral reference to a runtime subject.
Definition SubjectRef.h:26
bool isValid() const noexcept
Return whether this reference is valid and non-nil.
Definition SubjectRef.h:38
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
bool isInt64() const noexcept
Return true when this value is an Int64.
Definition Value.h:91
std::map< std::string, Value > Object
Definition Value.h:34
bool isString() const noexcept
Return true when this value is a string.
Definition Value.h:95
bool isBool() const noexcept
Return true when this value is a boolean.
Definition Value.h:89
Value * find(const std::string &key) noexcept
Return an object member, or nullptr when absent.
Definition Value.cpp:124
格子型物品容器(脚本可直接操作)。
Definition Bag.h:21
EVENGINE_API_FOUNDATION public API.
Definition Equipment.h:19
static void clearSkillDamage()
Clears skill damage.
static eve::Result< void > registerSkillDamageChecked(const std::string &skillId, const SkillDamageSpec &spec)
Validate and publish one skill damage definition atomically.
static eve::Result< std::string > queueAction(Battle *battle, RPGActor *actor, const std::string &tacticsId)
Select the first matching rule and queue it through Battle's canonical checked API.
static eve::Result< int > replaceFromJsonStrict(const std::string &json)
Validate and atomically replace all tactic definitions.
static eve::Result< BattleVictoryReceipt > settle(RPGActor &actor, GameState &gameState, Tracker &tracker, const BattleVictoryRequest &request)
Atomically settle XP, derived class skills, attributes, quest progress, and encounter consumption.
一场回合制战斗(任意阵营数)。 @ownership 由调用方创建/销毁;Battle 不持有参与者的所有权(参与者为借用 ECS actor)。 @thread 在单一模拟线程上驱动整场战斗。
Definition Battle.h:54
RPGActor * getActor(int index) const
Return a participant actor by index, or null when out of range.
Definition Battle.cpp:467
void startRound()
结算所有已设行动:先攻排序、清空待行动,回合数 +1。
Definition Battle.cpp:287
void addActor(RPGActor *actor, int side)
加入参战者;side 为任意阵营 id。
Definition Battle.cpp:17
void setPlayerSide(int side)
玩家阵营 id(isVictory/isDefeat 依据),默认 0。
Definition Battle.cpp:174
int getPlayerSide() const
Returns the player side.
Definition Battle.cpp:175
void autoEnemyActions()
未设行动的 AI 侧自动选一个随机已学技能(或普攻)打随机存活敌对目标。
Definition Battle.cpp:261
bool getEventCrit(int index) const
Returns the event crit.
Definition Battle.cpp:506
void setAction(RPGActor *actor, const std::string &skillId, RPGActor *target=nullptr)
为参战者设置本回合行动;target 为空由目标规则自动解析。
Definition Battle.cpp:183
int getSide(int index) const
Returns the side.
Definition Battle.cpp:471
std::string getEventSkillId(int index) const
Returns the event skill id.
Definition Battle.cpp:490
int getWinnerSide() const
获胜阵营 id;未结束或平局(双方全灭)返回 -1。
Definition Battle.cpp:180
RPGActor * getEventCaster(int index) const
Return the caster of a polled event, or null when out of range.
Definition Battle.cpp:494
RPGActor * getEventTarget(int index) const
Return the target of a polled event, or null when out of range.
Definition Battle.cpp:498
std::string getEventAction(int index) const
Returns the event action.
Definition Battle.cpp:486
int getTurn() const
当前回合数(1 起)。
Definition Battle.cpp:181
bool isActorAlive(RPGActor *actor) const
True when actor alive.
Definition Battle.cpp:127
void pollEvents()
Polls events.
Definition Battle.cpp:481
int getActorCount() const
Returns the actor count.
Definition Battle.cpp:466
bool executeNextAction()
执行下一条行动(compatibility facade (脚本兼容门面));返回是否执行了一条。
Definition Battle.cpp:305
bool isDefeat() const
是否战败:已结束且获胜方 != 玩家侧。
Definition Battle.cpp:179
int getEventCount() const
Returns the event count.
Definition Battle.cpp:476
bool isFinished() const
战斗是否已结束(仅剩一方存活 / 双方全灭)。
Definition Battle.cpp:177
bool isVictory() const
是否胜利:获胜方 == 玩家侧。
Definition Battle.cpp:178
static void clear()
Clears .
Definition Class.cpp:40
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组/对象批量注册。元素形如: { "id":"warrior","displayName":"战士", "traits":["mighty"], "learnSkills":[{"ski...
Definition Class.cpp:44
static int count()
Returns the number of .
Definition Class.cpp:42
static void clear()
Clears .
Definition Effect.cpp:38
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组批量注册效果定义,返回成功注册的数量。 每个元素形如: { "id": "poison", "durationPolicy": "duration",...
Definition Effect.cpp:71
static int count()
Returns the number of .
Definition Effect.cpp:40
static int memberCount(const std::string &id)
Return the number of ordered enemy members in an encounter, or zero when unknown.
static eve::Result< int > replaceFromJsonStrict(const std::string &json)
Validate and atomically replace every encounter definition.
static RPGActor * createMemberActor(const std::string &id, int memberIndex)
Create one indexed member of an encounter composition.
static const EncounterDefinition * find(const std::string &id)
Finds .
static RPGActor * createActor(const std::string &id)
Create and initialize an ECS-owned enemy actor from one definition.
static int registerItemStatsFromJson(const std::string &itemId, const std::string &json)
批量注册某物品的属性加成;返回成功条数。
static int syncEquipModifiers(RPGActor *actor, eve::inventory::EquipmentSet *equip)
把装备栏当前装备同步为 actor 属性修改器(先清旧再施加)。
static int statItemCount()
已注册加成的物品数量。
static void clearItemStats(const std::string &itemId)
清除某物品的加成。
static void clearAll()
清除全部物品加成注册。
一份游戏状态(开关/变量/独立变量)。
Definition GameState.h:25
void clearSelfString(const std::string &scope, const std::string &name)
Remove one scoped string fact; no-op when absent.
static GameState & global()
进程级全局单例(脚本便利入口)。
void switchOn(const std::string &name)
Switch on.
Definition GameState.cpp:51
void setSelfString(const std::string &scope, const std::string &name, std::string value)
Scoped string facts (for example a .dnut story cursor JSON blob).
Definition GameState.cpp:88
bool hasSelfVariable(const std::string &scope, const std::string &name) const
True when self variable.
Definition GameState.cpp:82
std::string getSelfString(const std::string &scope, const std::string &name) const
Return a scoped string fact, or an empty string when absent.
Definition GameState.cpp:92
void switchOff(const std::string &name)
Switch off.
Definition GameState.cpp:53
void clear()
清空全部状态。
void setSwitch(const std::string &name, bool on)
设置开关。
Definition GameState.cpp:49
bool hasSelfString(const std::string &scope, const std::string &name) const
Whether a scoped string fact is present.
Definition GameState.cpp:99
bool isSwitchOn(const std::string &name) const
开关是否打开。
Definition GameState.cpp:55
static void pollLevelUps(std::vector< LevelUpEvent > &out)
取出并清空自上次调用以来累积的升级事件(push/poll 风格)。
static int registerTablesFromJson(const std::string &json)
Registers tables from json.
static int count()
Returns the number of .
static void clear()
Clears .
static int roll(const std::string &tableId, eve::inventory::Bag *bag, std::mt19937 &rng)
按掉落表 roll 一次,把命中的物品加入 bag。
Authoritative ordered relationship between stable party member IDs and RPG actors....
Definition Party.h:24
RPGActor * getMemberActor(int index) const
Resolve a member by ordered index.
Definition Party.cpp:91
RPGActor * findMemberActor(const std::string &memberId) const
Resolve a member by stable ID.
Definition Party.cpp:97
void clear()
Clear every relationship without destroying actors.
Definition Party.cpp:70
int count() const
Returns the number of .
Definition Party.cpp:71
bool contains(const std::string &memberId) const
True if active.
Definition Party.cpp:73
std::string getMemberId(int index) const
Returns the member id.
Definition Party.cpp:85
bool hasStaleMembers() const
True when stale members.
Definition Party.cpp:79
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组/对象批量注册;缺 id、重复 objective id、环形 requires 的定义被拒绝。
Definition Quest.cpp:183
static int count()
Returns the number of .
Definition Quest.cpp:170
static void clear()
Clears .
Definition Quest.cpp:168
static eve::Result< int > replaceFromJsonStrict(const std::string &json)
Strictly validate and atomically replace every registered quest definition.
Definition Quest.cpp:226
static bool contains(const std::string &id)
Return whether one exact stable quest id is registered.
Definition Quest.cpp:181
static eve::Result< int > claim(Tracker &tracker, GameState &gameState, inventory::Bag &bag, const std::string &questId)
Validate and atomically claim every reward declared by one ready quest.
属性 / 状态 / 技能三表合一的 ECS 实体。
Definition RPGActor.h:34
int removeTraitsByTrait(const std::string &traitId)
Definition RPGActor.cpp:286
std::string getCastingSkillId()
Definition RPGActor.cpp:229
bool isCastingSkill()
读条状态查询。
Definition RPGActor.cpp:227
bool removeBuff(int instanceId)
Definition RPGActor.cpp:158
bool removeStatus(int instanceId)
Definition RPGActor.cpp:113
int getBuffStacks(int index)
Definition RPGActor.cpp:178
std::string canCastSkillReason(const std::string &skillId)
不能释放的原因("" = 可以)。
Definition RPGActor.cpp:215
std::string getClassId()
Definition RPGActor.cpp:338
std::string getStatusEffectId(int index)
Definition RPGActor.cpp:133
int getClassLearnLevelAt(int index)
Definition RPGActor.cpp:352
int removeAttributeModifiersBySource(const std::string &attribute, const std::string &source)
Definition RPGActor.cpp:92
void release() override
Entity.
Definition RPGActor.h:40
void cancelCastSkill()
取消读条。
Definition RPGActor.cpp:225
int removeAllAttributeModifiersBySource(const std::string &source)
Definition RPGActor.cpp:98
bool hasTrait(const std::string &traitId)
Definition RPGActor.cpp:290
static RPGActor * createActor()
创建一个空白 actor(三张表均为空,按需惰性写入),并纳入 liveActors() 跟踪。
Definition RPGActor.cpp:28
int removeStatusByTag(const std::string &tag)
Definition RPGActor.cpp:123
void setSkillCooldown(const std::string &skillId, float seconds)
Definition RPGActor.cpp:207
int removeStatusBySource(const std::string &source)
Definition RPGActor.cpp:119
std::string getBuffEffectId(int index)
Definition RPGActor.cpp:176
bool hasAttribute(const std::string &attribute)
Definition RPGActor.cpp:71
bool forgetSkill(const std::string &skillId)
Definition RPGActor.cpp:201
float getCastProgress()
Definition RPGActor.cpp:231
void learnSkill(const std::string &skillId)
技能:学习 / 查询 / 冷却。
Definition RPGActor.cpp:197
int getLevel()
成长进度(LevelSystem 的薄转发)。
Definition RPGActor.cpp:233
int getBuffInstanceId(int index)
Definition RPGActor.cpp:182
std::string getBuffProp(int instanceId, const std::string &key, const std::string &fallback={})
Definition RPGActor.cpp:186
bool hasClass(const std::string &classId)
Definition RPGActor.cpp:340
int applyBuff(const std::string &effectId, const std::string &source="")
Buff 别名(与 Status API 等价,便于游戏侧按习惯命名)。
Definition RPGActor.cpp:154
std::string getTraitSourceAt(int index)
Definition RPGActor.cpp:300
int removeTraitsBySource(const std::string &source)
Definition RPGActor.cpp:282
bool canCastSkill(const std::string &skillId)
Definition RPGActor.cpp:211
float getBuffRemaining(int index)
Definition RPGActor.cpp:180
int getStatusStacks(int index)
Definition RPGActor.cpp:137
std::string getTraitIdAt(int index)
Definition RPGActor.cpp:298
int getTraitInstanceIdAt(int index)
Definition RPGActor.cpp:294
bool knowsSkill(const std::string &skillId)
Definition RPGActor.cpp:199
int removeBuffByEffect(const std::string &effectId)
Definition RPGActor.cpp:160
bool hasStatusTag(const std::string &tag)
Definition RPGActor.cpp:129
int removeStatusByEffect(const std::string &effectId)
Definition RPGActor.cpp:115
int removeBuffBySource(const std::string &source)
Definition RPGActor.cpp:164
std::string getClassLearnSkillIdAt(int index)
Definition RPGActor.cpp:348
bool setBuffProp(int instanceId, const std::string &key, const std::string &value)
Definition RPGActor.cpp:191
bool hasBuff(const std::string &effectId)
Definition RPGActor.cpp:170
int getStatusInstanceId(int index)
Definition RPGActor.cpp:141
bool setStatusProp(int instanceId, const std::string &key, const std::string &value)
Definition RPGActor.cpp:150
std::string getStatusSource(int index)
Definition RPGActor.cpp:143
bool isStateResist(const std::string &stateId)
Definition RPGActor.cpp:316
bool hasBuffTag(const std::string &tag)
Definition RPGActor.cpp:172
bool removeTrait(int instanceId)
移除一个特征(compatibility facade (脚本兼容门面);成功返回 true)。
Definition RPGActor.cpp:280
std::string getStatusProp(int instanceId, const std::string &key, const std::string &fallback={})
Definition RPGActor.cpp:145
float getStatusRemaining(int index)
Definition RPGActor.cpp:139
int applyEffect(const std::string &effectId, const std::string &source="")
状态(buff/debuff)—— Statuses ECS 组件的薄封装。
Definition RPGActor.cpp:108
bool hasEffect(const std::string &effectId)
Definition RPGActor.cpp:127
int removeBuffByTag(const std::string &tag)
Definition RPGActor.cpp:168
bool setClass(const std::string &classId)
职业(ClassSystem 的薄转发)。
Definition RPGActor.cpp:336
std::string getBuffSource(int index)
Definition RPGActor.cpp:184
float getSkillCooldown(const std::string &skillId)
Definition RPGActor.cpp:203
std::string getContentVersion() const
Return an owning copy of the configured content contract identifier.
RPG 模块(eve.RPG):Actor 工厂 + 定义注册 + 帧调度 + 事件缓存。
Definition RPG.h:56
int rollLoot(const std::string &tableId, inventory::Bag *bag, int seed)
用种子随机流 roll 掉落表,把命中物品加入背包;返回掉落物品种类数。
Definition RPG.cpp:362
int getEffectDefinitionCount()
Returns the effect definition count.
Definition RPG.cpp:53
int syncEquipModifiers(RPGActor *actor, inventory::EquipmentSet *equip)
把装备栏当前装备同步为 actor 属性修改器;返回施加条数。
Definition RPG.cpp:350
RPG()=default
Rpg.
int getEncounterMemberCount(const std::string &encounterId) const
Returns the encounter member count.
Definition RPG.cpp:197
bool hasSettlementStage(const std::string &pipeline, const std::string &stage)
True when settlement stage.
Definition RPG.cpp:535
eve::Result< int > claimQuestRewards(Tracker *tracker, GameState *gameState, inventory::Bag *bag, const std::string &questId)
Atomically complete one ready quest and apply all item/attribute rewards.
Definition RPG.cpp:77
void clearBattleTactics()
Definition RPG.cpp:233
void clearSkillDefinitions()
Clears skill definitions.
Definition RPG.cpp:59
eve::Result< std::string > queueBattleTactic(Battle *battle, RPGActor *actor, const std::string &tacticsId)
Select and queue one action from a registered tactics definition.
Definition RPG.cpp:234
std::string getStatusChangeEventEffectId(int index) const
Returns the status change event effect id.
Definition RPG.cpp:482
eve::Result< int > replaceShopOffersFromJson(const std::string &json)
Strictly validate and atomically replace the authoritative shop catalogue.
Definition RPG.cpp:128
void clearEncounters()
Definition RPG.cpp:193
void clearAllItemStats()
Clears all item stats.
Definition RPG.cpp:346
bool setSettlementStageEnabled(const std::string &pipeline, const std::string &stage, bool enabled)
Sets the settlement stage enabled.
Definition RPG.cpp:539
RPGActor * getTickEventActor(int index) const
Returns the actor referenced by a retained tick event, or null for an invalid index.
Definition RPG.cpp:445
void runSettlement(const std::string &pipeline, SettlementContext *ctx)
Run settlement.
Definition RPG.cpp:526
int getTraitDefinitionCount()
Returns the trait definition count.
Definition RPG.cpp:373
eve::Result< int > replaceEncountersFromJson(const std::string &json)
Strictly replace the data-driven encounter catalogue.
Definition RPG.cpp:190
int getStoryCount() const
Return the number of published .dnut stories.
Definition RPG.cpp:251
void clearStoryEvents()
Clear story-event content during teardown or content-package rollback.
Definition RPG.cpp:241
int registerSkillDamage(const std::string &skillId, const std::string &damageType, const std::string &formula, const std::string &element, double critChance, int hitChance)
技能伤害注册(战斗用)与战斗对象。
Definition RPG.cpp:375
int getSkillDefinitionCount()
Returns the skill definition count.
Definition RPG.cpp:61
void clearTraitDefinitions()
Clears trait definitions.
Definition RPG.cpp:371
Battle * newBattle()
创建一场新的回合制战斗。
Definition RPG.cpp:390
eve::Result< int > sellToShop(GameState *gameState, inventory::Bag *bag, const std::string &currencyId, const std::string &itemId, int quantity, double unitPrice)
Atomically remove sold items from Bag and credit GameState currency.
Definition RPG.cpp:118
RPGActor * getStatusChangeEventActor(int index) const
Returns the actor referenced by a status event, or null for an invalid index.
Definition RPG.cpp:472
int getVitalsEventCount() const
生命等资源事件缓存(上一次 update() 产生的,供脚本轮询)。
Definition RPG.cpp:303
std::string getVitalsEventSource(int index) const
Returns the vitals event source.
Definition RPG.cpp:325
int getShopOfferBuyPrice(int index) const
Returns the shop offer buy price.
Definition RPG.cpp:160
void clearItemStats(const std::string &itemId)
Clears item stats.
Definition RPG.cpp:344
int registerSkillsFromJson(const std::string &json)
技能定义注册。
Definition RPG.cpp:55
std::string getShopOfferName(int index) const
Returns the shop offer name.
Definition RPG.cpp:150
int getItemStatCount()
Returns the item stat count.
Definition RPG.cpp:348
int getTickEventInstanceId(int index) const
Returns the tick event instance id.
Definition RPG.cpp:450
eve::Result< int > replaceBattleTacticsFromJson(const std::string &json)
Strictly replace ordered companion/AI battle tactics.
Definition RPG.cpp:230
double getVitalsEventAmount(int index) const
Returns the vitals event amount.
Definition RPG.cpp:320
bool setSettlementStagePriority(const std::string &pipeline, const std::string &stage, int priority)
Sets the settlement stage priority.
Definition RPG.cpp:544
int getLevelUpEventCount() const
升级事件缓存(上一次 update() 产生的,供脚本轮询)。
Definition RPG.cpp:286
std::string getEncounterDisplayName(const std::string &encounterId) const
Returns the encounter display name.
Definition RPG.cpp:206
RPGActor * getCastEventTarget(int index) const
Returns the target referenced by a cast event, or null for an invalid index.
Definition RPG.cpp:514
double getVitalsEventCurrent(int index) const
Returns the vitals event current.
Definition RPG.cpp:330
int getStatusChangeEventInstanceId(int index) const
Returns the status change event instance id.
Definition RPG.cpp:477
std::string getShopOfferDescription(int index) const
Returns the shop offer description.
Definition RPG.cpp:155
int getClassDefinitionCount()
Returns the class definition count.
Definition RPG.cpp:425
int getSettlementStageCount(const std::string &pipeline)
Returns the settlement stage count.
Definition RPG.cpp:531
eve::Result< int > buyShopOffer(GameState *gameState, inventory::Bag *bag, const std::string &currencyId, const std::string &offerId, int quantity)
Buy using the item and price from the authoritative shop catalogue.
Definition RPG.cpp:170
int registerEffectsFromJson(const std::string &json)
效果定义注册(数据驱动,进程级注册表)。
Definition RPG.cpp:47
std::string getStatusChangeEventAction(int index) const
Returns the status change event action.
Definition RPG.cpp:492
std::string getVitalsEventAction(int index) const
Returns the vitals event action.
Definition RPG.cpp:315
int getCastEventCount() const
技能释放结算事件。
Definition RPG.cpp:507
StoryEventSession * newStoryEventSession()
Create an empty caller-owned story-event session.
Definition RPG.cpp:246
SettlementContext * newSettlementContext()
结算:新建上下文 / 运行流水线 / 配置阶段。
Definition RPG.cpp:524
RPGActor * newEncounterActor(const std::string &encounterId)
Create the first member through the single-enemy compatibility facade.
Definition RPG.cpp:200
WorldState * newWorldState(GameState *gameState)
Create a typed per-map object-state adapter over one GameState owner.
Definition RPG.cpp:413
RPGActor * getLevelUpEventActor(int index) const
Returns the level up event actor.
Definition RPG.cpp:288
std::string getShopOfferItemId(int index) const
Returns the shop offer item id.
Definition RPG.cpp:145
int registerLootTablesFromJson(const std::string &json)
掉落表注册与 roll。
Definition RPG.cpp:354
Tracker * newTracker()
创建一个新的目标追踪器(任务日志 / 成就 / 教程各建一份)。
Definition RPG.cpp:284
bool hasStory(const std::string &storyId) const
Return whether an exact .dnut story id exists.
Definition RPG.cpp:252
int registerTraitsFromJson(const std::string &json)
特征定义注册。
Definition RPG.cpp:367
void clearSettlementPipeline(const std::string &pipeline)
Clears settlement pipeline.
Definition RPG.cpp:553
std::string getStatusChangeEventReason(int index) const
Returns the status change event reason.
Definition RPG.cpp:502
void clearQuestDefinitions()
Definition RPG.cpp:71
void clearShopOffers()
Clear the shop catalogue for teardown or failed initial publication rollback.
Definition RPG.cpp:134
int registerQuestsFromJson(const std::string &json)
任务定义注册。
Definition RPG.cpp:63
std::string getStatusChangeEventSource(int index) const
Returns the status change event source.
Definition RPG.cpp:487
RPGActor * newActor()
创建一个空白 RPGActor。
Definition RPG.cpp:45
int registerItemStatsFromJson(const std::string &itemId, const std::string &json)
装备加成(物品 id → 属性加成)注册与同步。
Definition RPG.cpp:340
int getTickEventCount() const
周期状态 tick 事件(上一次 update() 产生的,供脚本轮询)。
Definition RPG.cpp:443
void clearClassDefinitions()
Clears class definitions.
Definition RPG.cpp:423
double getVitalsEventMax(int index) const
Returns the vitals event max.
Definition RPG.cpp:335
eve::Result< int > collectWorldLoot(Tracker *tracker, GameState *gameState, inventory::Bag *bag, const WorldLootRequest &request)
Atomically settle one persistent loot object across world, quest, state and inventory owners.
Definition RPG.cpp:87
int getShopOfferCount() const
Return the committed shop-offer count.
Definition RPG.cpp:132
double getEncounterMemberMaxHp(const std::string &encounterId, int memberIndex) const
Returns the encounter member max hp.
Definition RPG.cpp:222
std::string getVitalsEventResource(int index) const
Returns the vitals event resource.
Definition RPG.cpp:310
int getStatusChangeEventCount() const
状态生命周期变更事件(apply/refresh/extend/stack/remove/expire/reject)。
Definition RPG.cpp:470
RPGActor * getVitalsEventActor(int index) const
Returns the vitals event actor.
Definition RPG.cpp:305
eve::Result< int > replaceStoryEventsFromJson(const std::string &json)
Strictly validate and atomically replace versioned story-event content.
Definition RPG.cpp:238
GameState * newGameState()
创建一份新的游戏状态(开关/变量)。
Definition RPG.cpp:411
Result< std::unique_ptr< ProductControl > > newProductControl(SubjectRef instance, GameState *gameState, Tracker *tracker, inventory::Bag *bag)
Create a unified shop, quest-reward and world-loot control adapter.
Definition RPG.cpp:401
int registerClassesFromJson(const std::string &json)
职业定义注册。
Definition RPG.cpp:419
eve::Result< int > replaceStoriesFromDnut(const std::string &source, const std::string &path)
Strictly compile and atomically publish .dnut story content for the RPG dialect.
Definition RPG.cpp:247
int getTickEventStacks(int index) const
Returns the tick event stacks.
Definition RPG.cpp:465
eve::Result< int > replaceQuestsFromJson(const std::string &json)
Strictly validate and atomically replace the process-local quest catalogue.
Definition RPG.cpp:67
std::string getShopOfferId(int index) const
Returns the shop offer id.
Definition RPG.cpp:140
void clearLootTables()
Clears loot tables.
Definition RPG.cpp:358
std::string getTickEventSource(int index) const
Returns the tick event source.
Definition RPG.cpp:460
bool hasStoryEvent(const std::string &eventId) const
Return whether an exact story-event id exists.
Definition RPG.cpp:243
int getLevelUpEventPreviousLevel(int index) const
Returns the level up event previous level.
Definition RPG.cpp:293
std::string getEncounterMemberDisplayName(const std::string &encounterId, int memberIndex) const
Returns the encounter member display name.
Definition RPG.cpp:214
void clearStories()
Clear published .dnut story content during teardown or content rollback.
Definition RPG.cpp:250
RpgStorySession * newStorySession()
Create an empty caller-owned .dnut story session.
Definition RPG.cpp:253
eve::Result< BattleVictoryReceipt > settleEncounterVictory(RPGActor *actor, Tracker *tracker, GameState *gameState, const std::string &encounterId, const std::string &mapId, const std::string &objectId)
Settle a victory using only rewards declared by the encounter catalogue.
Definition RPG.cpp:255
eve::Result< int > sellShopOffer(GameState *gameState, inventory::Bag *bag, const std::string &currencyId, const std::string &offerId, int quantity)
Sell using the item and price from the authoritative shop catalogue.
Definition RPG.cpp:180
Party * newParty()
Create an empty generation-safe party roster.
Definition RPG.cpp:43
void clearEffectDefinitions()
Clears effect definitions.
Definition RPG.cpp:51
double getEncounterMaxHp(const std::string &encounterId) const
Returns the encounter max hp.
Definition RPG.cpp:210
bool removeSettlementStage(const std::string &pipeline, const std::string &stage)
Removes settlement stage.
Definition RPG.cpp:549
RPGActor * newEncounterMemberActor(const std::string &encounterId, int memberIndex)
Create one indexed member from an encounter composition.
Definition RPG.cpp:203
eve::Result< BattleVictoryReceipt > settleBattleVictory(RPGActor *actor, Tracker *tracker, GameState *gameState, const BattleVictoryRequest &request)
Atomically settle one victorious persistent encounter.
Definition RPG.cpp:98
int getStoryEventCount() const
Return the number of committed story-event definitions.
Definition RPG.cpp:242
int getQuestDefinitionCount()
Returns the quest definition count.
Definition RPG.cpp:73
int getLevelUpEventNewLevel(int index) const
Returns the level up event new level.
Definition RPG.cpp:298
GameState * globalGameState()
进程级全局游戏状态(借用,不销毁)。
Definition RPG.cpp:417
RPGActor * getCastEventCaster(int index) const
Returns the caster referenced by a cast event, or null for an invalid index.
Definition RPG.cpp:509
std::string getTickEventEffectId(int index) const
Returns the tick event effect id.
Definition RPG.cpp:455
int getStatusChangeEventStacks(int index) const
Returns the status change event stacks.
Definition RPG.cpp:497
std::string getCastEventSkillId(int index) const
Returns the cast event skill id.
Definition RPG.cpp:519
void clearSkillDamage()
Clears skill damage.
Definition RPG.cpp:388
bool hasShopOffer(const std::string &offerId) const
Return whether an exact shop offer id exists.
Definition RPG.cpp:136
eve::Result< int > buyFromShop(GameState *gameState, inventory::Bag *bag, const std::string &currencyId, const std::string &itemId, int quantity, double unitPrice)
Atomically debit GameState currency and add purchased items to Bag.
Definition RPG.cpp:108
bool hasEncounter(const std::string &encounterId) const
True when encounter.
Definition RPG.cpp:194
void update(float dt)
推进 StatusSystem / SkillSystem,并刷新本帧的 tick / change / cast 事件缓存。
Definition RPG.cpp:427
int getLootTableCount()
Returns the loot table count.
Definition RPG.cpp:360
bool hasQuestDefinition(const std::string &id) const
Return whether one exact quest definition is present in the current catalogue.
Definition RPG.cpp:75
int getShopOfferSellPrice(int index) const
Returns the shop offer sell price.
Definition RPG.cpp:165
Result< std::unique_ptr< BattleControl > > newBattleControl(Battle *battle, SubjectRef instance)
Create a host-neutral control adapter for a caller-owned battle.
Definition RPG.cpp:392
static eve::Result< int > replaceFromDnutStrict(const std::string &source, const std::string &path)
Compile and atomically publish every story block of one document.
static int count()
Return the published story count.
static bool contains(const std::string &storyId)
Return whether an exact story id is published.
static void clear()
Discard every published story.
Caller-owned cursor over one published .dnut story.
Definition RpgDialect.h:275
bool isBlocked() const
Whether the story is suspended and awaiting acknowledgement.
std::string getStepKind() const
Current step type (move, choice, wait, …), or an empty string.
void stop()
Stop and clear the session.
std::string getStoryId() const
Owning copy of the running story id, or an empty string.
bool isActive() const
Whether a story is loaded.
static bool unregisterStage(const std::string &pipeline, const std::string &stage)
Unregisters stage.
static void run(const std::string &pipeline, SettlementContext &ctx)
按 priority 升序依次执行 pipeline 内已启用的阶段;ctx.cancelled 时提前终止。
static int stageCount(const std::string &pipeline)
Stage count.
static bool hasStage(const std::string &pipeline, const std::string &stage)
True when stage.
static bool setStagePriority(const std::string &pipeline, const std::string &stage, int priority)
Sets the stage priority.
static bool setStageEnabled(const std::string &pipeline, const std::string &stage, bool enabled)
Sets the stage enabled.
static void clearPipeline(const std::string &pipeline)
Clears pipeline.
static eve::Result< int > replaceFromJsonStrict(const std::string &json)
Strictly validate and atomically replace the entire offer catalogue.
static const ShopOffer * find(const std::string &id)
Find an offer by stable offer id, or null when absent.
static const ShopOffer * at(int index)
Return an offer by deterministic source index, or null when out of range.
static void clear()
Remove all offers. Intended for teardown and isolated tests.
static int count()
Return the number of committed offers in deterministic source order.
static eve::Result< int > sell(GameState &gameState, inventory::Bag &bag, const std::string &currencyId, const std::string &itemId, int quantity, double unitPrice)
Atomically remove an item quantity and credit its sale proceeds.
static eve::Result< int > sellOffer(GameState &gameState, inventory::Bag &bag, const std::string &currencyId, const std::string &offerId, int quantity)
Sell a quantity using the authoritative price and item in ShopCatalogue.
static eve::Result< int > buyOffer(GameState &gameState, inventory::Bag &bag, const std::string &currencyId, const std::string &offerId, int quantity)
Buy a quantity using the authoritative price and item in ShopCatalogue.
static eve::Result< int > buy(GameState &gameState, inventory::Bag &bag, const std::string &currencyId, const std::string &itemId, int quantity, double unitPrice)
Atomically debit currency and add the purchased item quantity.
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组批量注册技能定义,返回成功注册数量。元素形如: { "id": "fireball", "cooldown": 4, "castTime": 1....
Definition Skill.cpp:163
static void clear()
Clears .
Definition Skill.cpp:103
static int count()
Returns the number of .
Definition Skill.cpp:114
static void update(float dt)
遍历 RPGActor::liveActors():冷却倒计时 + 读条推进/结算。
static void pollCastEvents(std::vector< SkillCastEvent > &out)
Polls cast events.
static void pollChanges(std::vector< StatusChangeEvent > &out)
取出并清空自上次调用以来累积的生命周期变更事件。
static void pollTicks(std::vector< StatusTickEvent > &out)
取出并清空自上次调用以来累积的周期 tick 事件(push/poll 风格,见 event 模块)。
static eve::Result< StatusUpdateSummary > update(double dt)
Advance all live RPG status executors with an injected simulation delta.
static bool contains(const std::string &eventId)
Return whether an exact stable event id exists in the current catalogue.
static int count()
Return the committed definition count on the owning content thread.
static eve::Result< int > replaceFromJsonStrict(const std::string &json)
Validate and atomically replace every story-event definition.
static void clear()
Clear all definitions on the owning content thread without invoking callbacks.
Caller-owned runtime cursor over a copied story-event definition.
Definition StoryEvent.h:68
int getStepIndex() const
Return the zero-based current cursor, or the step count after completion.
std::string getReference() const
Return an owning copy of the current dialogue/message reference.
bool isActive() const
Return whether a current step is awaiting acknowledgement.
bool isFinished() const
Return whether this session acknowledged its final step.
std::string getEventId() const
Return an owning copy of the current event id.
std::string getActorId() const
Return an owning copy of the current move actor id.
int getStepCount() const
Return the copied definition's total step count.
std::string getStepKind() const
Return the current command kind, or an empty string while inactive.
一份任务进度 + 本实例事件队列。
Definition Tracker.h:26
int getObjectiveCountRequired(const std::string &id, int index) const
Returns the objective count required.
Definition Tracker.cpp:206
bool isObjectiveDone(const std::string &id, int index) const
True when objective done.
Definition Tracker.cpp:213
std::string getRewardType(const std::string &id, int i) const
Returns the reward type.
Definition Tracker.cpp:225
bool reset(const std::string &id)
重置进度(compatibility facade (脚本兼容门面))。
Definition Tracker.cpp:31
std::string getEventEntryId(int i) const
Returns the event entry id.
Definition Tracker.cpp:245
std::string getEventAction(int i) const
Returns the event action.
Definition Tracker.cpp:255
void syncAuto()
补建 Registry 里尚未出现的条目并按前置解锁。
Definition Tracker.cpp:15
std::string getExtra(const std::string &id, const std::string &key) const
Returns the extra.
Definition Tracker.cpp:182
bool abandon(const std::string &id)
放弃任务(compatibility facade (脚本兼容门面))。
Definition Tracker.cpp:33
int getEventAmount(int i) const
Returns the event amount.
Definition Tracker.cpp:270
int getRewardCount(const std::string &id) const
Returns the reward count.
Definition Tracker.cpp:220
int getEventCount() const
Returns the event count.
Definition Tracker.cpp:243
std::string getEventTarget(int i) const
Returns the event target.
Definition Tracker.cpp:265
std::string getId(int index) const
Returns the id.
Definition Tracker.cpp:167
int getObjectiveCount(const std::string &id) const
Returns the objective count.
Definition Tracker.cpp:187
bool activate(const std::string &id)
激活任务(compatibility facade (脚本兼容门面))。
Definition Tracker.cpp:17
std::string getEventObjectiveId(int i) const
Returns the event objective id.
Definition Tracker.cpp:250
bool hasTag(const std::string &id, const std::string &tag) const
True when tag.
Definition Tracker.cpp:177
bool canActivate(const std::string &id)
Can activate.
Definition Tracker.cpp:19
void pollEvents()
把 pending 移到 polled 并清空 pending;随后 getEvent* 读 polled。
Definition Tracker.cpp:39
std::string getEventTopic(int i) const
Returns the event topic.
Definition Tracker.cpp:260
std::string getEventReason(int i) const
Returns the event reason.
Definition Tracker.cpp:275
bool claim(const std::string &id)
完成任务(compatibility facade (脚本兼容门面))。
Definition Tracker.cpp:29
bool fail(const std::string &id, const std::string &reason)
失败任务(compatibility facade (脚本兼容门面))。
Definition Tracker.cpp:35
void notify(const std::string &topic, const std::string &target, int amount)
Notify.
Definition Tracker.cpp:25
std::string getState(const std::string &id) const
Returns the state.
Definition Tracker.cpp:172
int getCount() const
Definition Tracker.cpp:165
std::string getRewardId(const std::string &id, int i) const
Returns the reward id.
Definition Tracker.cpp:231
std::string getObjectiveId(const std::string &id, int index) const
Returns the objective id.
Definition Tracker.cpp:192
int getObjectiveCurrent(const std::string &id, int index) const
Returns the objective current.
Definition Tracker.cpp:199
std::string canActivateReason(const std::string &id)
Can activate reason.
Definition Tracker.cpp:21
static int count()
Returns the number of .
Definition Trait.cpp:42
static void clear()
Clears .
Definition Trait.cpp:40
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组/对象批量注册,返回成功数量。元素形如: { "id":"fire_resist", "traits":[{"kind":"elementRate",...
Definition Trait.cpp:44
static void pollEvents(std::vector< VitalsEvent > &out)
取出并清空自上次调用以来累积的资源事件(push/poll 风格)。
static eve::Result< int > collectLoot(GameState &gameState, Tracker &tracker, inventory::Bag &bag, const WorldLootRequest &request)
Atomically grant loot, notify quest progress, and consume one world object.
Non-owning typed adapter for persistent per-map object lifecycle state.
Definition WorldState.h:19
bool isObjectConsumed(std::string_view mapId, std::string_view objectId) const
Query whether a stable object has been consumed in one map.
static eve::Result< SettlementRuleSet > fromJson(std::string_view json)
Decode and compile a strict versioned JSON rule document without mutating an existing rule set.
constexpr int Party
Definition Battle.h:31
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
BattleTargetPolicy
Deterministic target-selection policies for queued battle actions.
Definition Battle.h:36
RPGSaveIdDomain
Definition-reference field kinds supported by direct RPG save ID migrations.
std::unordered_map< std::string, SkillDefinition > & table()
Definition Skill.cpp:65
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
bool enabled
Complete data needed to settle one victorious persistent encounter.
结算上下文:通用的读写数据袋,字段完全由调用方与各阶段自行约定。
Definition Settlement.h:35
void addTag(const std::string &tag)
Adds tag.
bool has(const std::string &key) const
True when active.
bool hasTag(const std::string &tag) const
True when tag.
一次技能命中的伤害规格。
double critChance
追加到攻击方 critRate 的暴击率
int hitChance
命中率(百分比)
std::string formula
公式字符串,如 "a.atk * 4 - b.def * 2";空则对 hp 用默认物理公式。
std::string damageType
"hp" | "hpHeal" | "mp" | "mpHeal"。
std::string element
元素("" = 无);伤害乘目标对应元素耐性。
Complete data needed to settle one persistent loot object.