15bool matches(
const TraitSpec &spec,
const std::string &
target) {
16 return spec.target.empty() || spec.target ==
target;
25 auto &ts = *actor->traits();
31 for (
const auto &spec : def->
traits) {
32 if (spec.kind !=
"paramRate" || spec.target.empty())
continue;
34 "trait:" + std::to_string(inst.
instanceId),
"mulAdd",
37 ts.active.push_back(std::move(inst));
42 if (!actor)
return false;
43 auto &ts = *actor->traits();
44 for (
auto it = ts.active.begin(); it != ts.active.end(); ++it) {
45 if (it->instanceId != instanceId)
continue;
47 actor,
"trait:" + std::to_string(instanceId));
56 auto &ts = *actor->traits();
58 for (
auto it = ts.active.begin(); it != ts.active.end();) {
59 if (it->source ==
source) {
61 actor,
"trait:" + std::to_string(it->instanceId));
62 it = ts.active.erase(it);
73 auto &ts = *actor->traits();
75 for (
auto it = ts.active.begin(); it != ts.active.end();) {
76 if (it->traitId == traitId) {
78 actor,
"trait:" + std::to_string(it->instanceId));
79 it = ts.active.erase(it);
90 auto &ts = *actor->traits();
91 for (
const auto &inst : ts.active) {
93 "trait:" + std::to_string(inst.instanceId));
99 if (!actor)
return false;
100 for (
const auto &inst : actor->traits()->active) {
101 if (inst.traitId == traitId)
return true;
107 return actor ? int(actor->traits()->active.size()) : 0;
111 if (!actor ||
index < 0 ||
size_t(
index) >= actor->traits()->active.size())
return 0;
112 return actor->traits()->active[size_t(
index)].instanceId;
116 if (!actor ||
index < 0 ||
size_t(
index) >= actor->traits()->active.size())
return {};
117 return actor->traits()->active[size_t(
index)].traitId;
121 if (!actor ||
index < 0 ||
size_t(
index) >= actor->traits()->active.size())
return {};
122 return actor->traits()->active[size_t(
index)].source;
126 if (!actor)
return 1.0;
127 double product = 1.0;
128 for (
const auto &inst : actor->traits()->active) {
131 for (
const auto &spec : def->
traits) {
132 if (spec.kind ==
"paramRate" && spec.target == param) product *= spec.value;
139 if (!actor)
return 1.0;
140 double product = 1.0;
141 for (
const auto &inst : actor->traits()->active) {
144 for (
const auto &spec : def->
traits) {
145 if (spec.kind ==
"elementRate" && matches(spec,
element)) product *= spec.value;
152 if (!actor)
return 1.0;
153 double product = 1.0;
154 for (
const auto &inst : actor->traits()->active) {
157 for (
const auto &spec : def->
traits) {
158 if (spec.kind ==
"stateRate" && matches(spec, stateId)) product *= spec.value;
165 if (!actor)
return false;
166 for (
const auto &inst : actor->traits()->active) {
169 for (
const auto &spec : def->
traits) {
170 if (spec.kind ==
"stateResist" && matches(spec, stateId))
return true;
177 if (!actor)
return 0.0;
179 for (
const auto &inst : actor->traits()->active) {
182 for (
const auto &spec : def->
traits) {
183 if (spec.kind ==
"exParam" && spec.target == exParam) sum += spec.value;
190 std::vector<std::string> out;
191 if (!actor)
return out;
192 for (
const auto &inst : actor->traits()->active) {
195 for (
const auto &spec : def->
traits) {
196 if (spec.kind ==
"attackElement" && !spec.target.empty()) {
197 if (std::find(out.begin(), out.end(), spec.target) == out.end())
198 out.push_back(spec.target);
206 std::vector<std::string> out;
207 if (!actor)
return out;
208 for (
const auto &inst : actor->traits()->active) {
211 for (
const auto &spec : def->
traits) {
212 if (spec.kind ==
"attackState" && !spec.target.empty()) {
213 if (std::find(out.begin(), out.end(), spec.target) == out.end())
214 out.push_back(spec.target);
222 if (!actor)
return 0.0;
224 for (
const auto &inst : actor->traits()->active) {
227 for (
const auto &spec : def->
traits) {
228 if (spec.kind ==
"attackSpeed") sum += spec.value;
235 if (!actor)
return 0;
237 for (
const auto &inst : actor->traits()->active) {
240 for (
const auto &spec : def->
traits) {
241 if (spec.kind ==
"attackTimes") sum +=
static_cast<int>(spec.value);
RPG's thin compatibility facade over the attributes module.
特征系统:施加/移除运行时特征,并提供耐性/特殊参数/攻击附加等查询。
特征(Trait):RPG Maker 式数据驱动的能力/特性模板与进程级注册表。
const UnitySourceAsset & source
static int removeAllModifiersBySource(RPGActor *actor, const std::string &source)
Compatibility all-attribute source removal facade.
static eve::Result< ModifierId > addModifier(RPGActor *actor, AttributeModifier modifier)
Add one canonical modifier to an actor.
属性 / 状态 / 技能三表合一的 ECS 实体。
static const TraitDefinition * find(const std::string &id)
Find a registered trait definition by id.
static int removeBySource(RPGActor *actor, const std::string &source)
移除该 actor 上所有来自 source 的特征;返回移除数。
static bool hasTrait(RPGActor *actor, const std::string &traitId)
是否已施加某特征。
static double getElementRate(RPGActor *actor, const std::string &element)
元素耐性乘积(1 = 无修正,0.5 = 减半)。
static int getAttackTimesAdd(RPGActor *actor)
攻击次数附加(整数加值)。
static double getExParam(RPGActor *actor, const std::string &exParam)
特殊参数加值(hit/evasion/critRate/critEvade/magicEvade/magicReflect/...)。
static double getAttackSpeed(RPGActor *actor)
攻击速度修正(加值)。
static std::string getSourceAt(RPGActor *actor, int index)
Returns the source at.
static void removeAll(RPGActor *actor)
移除全部特征。
static std::string getTraitIdAt(RPGActor *actor, int index)
Returns the trait id at.
static bool remove(RPGActor *actor, int instanceId)
按实例 id 移除(compatibility facade (脚本兼容门面);成功返回 true)。
static std::vector< std::string > getAttackStates(RPGActor *actor)
攻击附加状态列表。
static double getParamRate(RPGActor *actor, const std::string ¶m)
参数倍率乘积(如 attack → 1.5 表示 +50)。
static bool isStateResist(RPGActor *actor, const std::string &stateId)
是否免疫某状态(stateResist 命中;target 空 = 全部免疫)。
static int apply(RPGActor *actor, const std::string &traitId, const std::string &source="")
施加一个特征。
static int getCount(RPGActor *actor)
Returns the count.
static std::vector< std::string > getAttackElements(RPGActor *actor)
攻击附加元素列表。
static int getInstanceIdAt(RPGActor *actor, int index)
Returns the instance id at.
static double getStateRate(RPGActor *actor, const std::string &stateId)
状态施加率乘积(1 = 正常)。
static int removeByTrait(RPGActor *actor, const std::string &traitId)
移除该 actor 上所有 traitId 匹配的特征;返回移除数。
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
std::vector< TraitSpec > traits