What actually makes you strong

The game shows you a 战力 number and eight attribute points to spend and explains neither. This is what each point does, what the damage formula reads, and which of the stats on your character sheet are decoration.

Your difficulty decides what a point is worth

The game ships two different conversion tables and picks one by game mode, and no community guide mentions it.

AttributeAdditionInfo.GetTableName()
    => "attribute_addition" + (AppGame.Instance.IsZhenShiJiangHu ? "_zhenshijianghu" : "");

It is a binary switch. 真实江湖 reads the variant; 爽文江湖, 险恶江湖 and 暗黑江湖 all read the default. The two tables feed different stats from the same 点. 专注 is the accuracy stat in one and a health stat in the other.

Read whichever table matches your save. Everything below says which.

真实江湖

Measured on a live character, one 资质 at a time, each raised alone, the eleven combat stats and four pool ceilings read back, reverted, revert confirmed, repeated at +1000 and +300. Every measurement matches its table row exactly.

资质 Gives Per point
元气 气血上限 / 闪避 12 / 0.2
根骨 气血上限 / 闪避 12 / 0.2
精神 气血上限 / 闪避 12 / 0.2
专注 气血上限 / 闪避 12 / 0.2
力道 外攻 / 命中 1.25 / 0.2
内力 内攻 / 命中 1.25 / 0.2
体魄 外防 / 内防 1.0 / 1.0
身法 命中 / 闪避 0.8 / 0.6

Nothing else moves. 要害, 诛心, 御心, 会心 and 真气上限 have no rows at all in this table and the one 化解 row that exists is written 0. So on a 真实江湖 save, no attribute point can ever raise crit chance, crit damage, crit resistance or 真气.

Everything else (爽文 / 险恶 / 暗黑)

Not measured. This is the table read straight, and it is what every community guide is describing.

资质 Gives Per point
根骨 气血上限 / 外防 40 / 2
体魄 外防 / 气血上限 7 / 5
力道 外攻 / 要害 5 / 1.5
内力 内攻 / 化解 5 / 1.5
元气 真气上限 / 内防 / 化解 9 / 2 / 1.5
精神 内防 / 真气上限 7 / 1.5
专注 命中 / 要害 4 / 1.5
身法 闪避 / 轻功点 4 / 1.5

The community's "42 气血, 9 真气, 7 外防, 5 外攻, 4 命中" are these numbers. They are correct — for these three modes. The published figures were never invented; they were read off the table the default save uses, and repeated without the mode qualifier.

How the rate is applied

The table's last column is hundredths and the conversion is recomputed on demand rather than stored:

其他 = Σ over rows where influenceAtt == this stat:  source_stat × additionValue / 100

Two consequences worth knowing.

The conversion reads the stat after its own percentage bonuses. A character carrying +10% 内力 converts as though every 内力 point were 1.1 points, and both of 内力's outputs scale together. That was visible in the measurement run: writing +1000 raw 内力 moved the displayed value by +1100, and 内攻 and 命中 both came in 10% above the table rate. So your effective rates are the table's times whatever percentage modifiers sit on the feeding stat.

Point-spend lands in 基础 and shows up as 其他 on the target. The game stores every attribute as a set of source channels (基础, 装备, 状态, 秘籍, 境界, 经脉, 词条, 特技, 连招) and 基础 is the only one the character owns outright. That is where a spent point goes. The converted result is not stored in any channel: it is appended to the target stat's breakdown as 其他, recomputed each time the tooltip is drawn. So a 资质 tooltip showing a large 基础 and a 命中 tooltip showing a large 其他 are the same points seen from both ends.

What the eight points do, on a 真实江湖 save

Four of the eight are the same point

元气, 根骨, 精神 and 专注 each give 12 气血上限 and 0.2 闪避, and nothing else. Their rows in the table are identical. Half of your spendable points feed one pair of outputs, and which of the four you pick changes nothing at all.

体魄 buys no 气血, and 专注 buys no 命中

The two conversions the names most strongly imply are the two that do not exist here, and both of them do exist in the default table, which is exactly why the community advice misleads on this mode.

体魄 is pure defence, 1.0 外防 and 1.0 内防 with zero 气血. It is the only feeder either defence has.

专注 does not touch 命中. It is a 气血 and 闪避 stat, indistinguishable from 根骨, while 命中 comes from 身法 at 0.8, with 0.2 each from 力道 and 内力.

身法 is worth exactly the gap it closes, so its worth depends on the enemy

0.8 命中 and 0.6 闪避, the only meaningful source of either. Both are threshold stats (see below), so a point of 身法 is worth the distance it closes against what you fight and nothing more: your hit against their dodge, and their hit against yours. Against enemies you already never miss and who already rarely hit you, it is worth nothing.

Three of the eight are hidden, on purpose

元气, 精神 and 专注 do not appear on the character sheet in 真实江湖, because the game keeps a list of exactly these three (AppGame.zhenShiJiangHuHideAttriType) and deactivates their rows on every refresh of the panel whenever the save is a 真实江湖 one. The rows exist and are wired; the mode turns them off.

It matters because it hides three of the four interchangeable stats, and a 真实江湖 player reading their own sheet sees 根骨 with no way to discover that 元气, 精神 and 专注 do exactly the same thing.

The trainer puts all three back; see the operating guide.

基础 is small, and the realm is not

The 命中 breakdown at rest, on a realm-4 character. The first five are read off the tooltip; 其他 is the table's own sum, ⌊235×0.2⌋ + ⌊290×0.2⌋ + ⌊116×0.8⌋ from 力道, 内力 and 身法:

基础+26, 装备+42, 境界+104, 词条+31, 连招+23, 其他+197   = 423

423 is what the live character reports, so the decomposition closes. 基础 is 26 of it. 境界 alone is 104, and that figure is itself mode-dependent. The realm grant tables are split four ways (formula_baseattri, _xianejianghu, _zhenshijianghu, _dangmojianghu). Points are the small lever; realm, gear, 词条 and 连招 are the large ones.

What to spend on, in 真实江湖

Damage is two sums with two different attack stats

SpellCalculate.CalculateFormulaDamage, and every real attack effect in the game goes through it:

外功 part = 外攻 × waiDamage%  × (1 − 外防_target / (外防_target + 2000))
内功 part = 内攻 × neiDamage%  × (1 − 内防_target / (内防_target + 2000))
相合 part = 相合 × extraDamage%                      (only when your 偏向 matches the move's)
damage    = (外功 + 内功 + 相合) × crit × combo × the various ± modifiers

Of 783 attack effects that carry a meaningful 外功 percentage, 717 scale from 外攻 and nothing else; of 826 with an 内功 percentage, 783 scale from 内攻. The move's own waiDamage / neiDamage percentage is the multiplier (median 65% and 75%, top decile 235% and 280%).

A move is 外功 or 内功 by which of those two percentages it carries, and your two attack stats are fed by two different 资质 (力道 and 内力). Splitting points between them halves both halves of your damage. Pick the one your martial arts actually use.

威力 stats stack additively into that same percentage before it multiplies: 法术威力 goes into both sides, 外功威力 into the outer, 内功威力 into the inner. They are percentage points on the move, so they are worth most on the moves that already have the largest percentage.

Defence never closes, and the curve is the same on both sides

reduction = defence / (defence + 2000)

2000 defence halves incoming damage of that kind. 4000 takes off two thirds. 6000 takes off three quarters. It never reaches 1, so nothing is ever immune, and each 2000 you add is worth less than the last — the first 2000 buys 50%, the second buys 17%, the third 8%.

Measured. 体魄 was stepped 232 → 2232 → 6232 — 1.0 外防 a point, so 外防 888 → 2888 → 6888 — while the same enemy kept landing the same two attacks, each hit recording the defence it was calculated against. Damage with the combo counter divided out, against what the curve predicts from the 888 baseline:

外防 damage, attack A damage, attack B curve says observed
888 258.0 390.0 1.0000 1.0000
2888 152.0 230.0 0.5908 0.5891 / 0.5897
6888 83.0 126.0 0.3249 0.3217 / 0.3231

Both attacks track the curve to within 0.6%, and the residual is rounding on damage numbers this small. Just under eight times the defence still left 32% of the damage getting through; nothing approached immunity.

Hits taken during a stretch where a buff on the player had lapsed are left out. They read 外防 821, but the same lapse changed other things about how the damage resolved, so they are a different condition rather than a fourth step.

There is no armour penetration attribute that a point buys; the only things that cut a target's defence are equipment affixes read as WORD_TARGET_WAI_FANG / WORD_TARGET_NEI_FANG and subtracted before the curve.

命中 ≥ 闪避 and you cannot miss

The miss check is the first thing that runs and it short-circuits:

if (命中 − 闪避 >= 0)  →  never misses
otherwise, with d = 闪避 − 命中:
    hit chance = 1 − d / (命中 + 30 + 1.35 d),  floored at 1%

So 命中 is a threshold stat, not a curve: every point up to the enemy's 闪避 matters and every point past it does nothing at all.

Which stat clears the bar depends on your mode, and this is where the split above bites hardest. On 爽文 / 险恶 / 暗黑 it is 专注, at 4 命中 a point. On 真实江湖 专注 gives none at all and the work is done by 身法, at 0.8. The same asymmetry runs the other way: buying 闪避 forces the enemy below their own threshold, and their hit chance then falls on the curve above — 身法 at 4 a point in the first three modes, 0.6 in 真实江湖.

Crits are two separate contests, and one of them has a floor

Whether you crit is your 要害 against their 化解, plus 会心 as a flat percentage:

crit% = 会心 + 100 × 要害 / (1.25 × 化解_target + 2.5 × 要害^0.877)

会心 goes in as a straight percentage. 会心 30 is 30 percentage points of crit chance. The 要害 term is self-limiting: against 化解 0 it is worth about 94 points at 要害 1000, but the exponent means doubling 要害 from there adds only a few points. Against a target with real 化解 it collapses. At 化解 500 the same 要害 1000 is worth 59.

How hard the crit lands is your 诛心 against their 御心:

multiplier = max(1.0,  0.5 + 诛心^1.32 / (2.5 × 诛心 + 御心_target))

The max(1.0, …) is the trap. With no 诛心, a crit multiplies damage by exactly 1 — the game plays the crit animation and the number is identical. Against a target with 御心 200 you need roughly 诛心 45 before a crit does anything at all, and past that it scales hard: 诛心 100 is about ×1.47, 诛心 500 about ×3.02, 诛心 1000 about ×3.87. Against a softer 御心 100 the same three are ×1.75, ×3.21 and ×4.01 — the divisor is the target's, so the same 诛心 is worth more against some enemies than others.

Measured, and it is exactly that. 诛心 was written to 0 and the same target hit repeatedly with the same moves, so some swings crit and some did not. Taking only the pairs where the buffs standing on both sides were unchanged between the two hits:

move buffs, attacker / target normal crit
142 32 / 11 1251 1251
144 29 / 11 1069 1069
144 32 / 12 1097 1097

Not a ratio near one — the same integer. The crit fires, the animation plays, the number does not move. A fourth move drifted about 2% across its hits in both directions, tracking the buffs going on and off rather than whether the hit crit, which is why the comparison is made against matched pairs.

The multiplier itself was confirmed away from the floor the same way: at 诛心 181 against 御心 278 the formula gives 1.8077, and two independent crit-against-normal pairings on one move came back at 1.8077 and 1.8077. Three more at 诛心 77 against 御心 278 gave 1.1564, 1.1583 and 1.1553 against a predicted 1.1571.

Stacking 要害 and 会心 without 诛心 buys you a light show, and crit chance and crit damage are not interchangeable here: the one you cannot buy with attribute points is the one with the floor.

One place the crit maths is broken

The 气盾 damage path (CalculateFormulaQidunDamage) uses its own crit line:

crit = 会心 / 1000 + 要害 / (化解 + 2000)

Both terms of the second fraction are integers, so C# does integer division — it is 0 until 要害 exceeds 化解 + 2000, and then jumps to 1 (100%). And 会心 is divided by 1000 rather than 100, so it is worth a tenth of what it is worth everywhere else. On this one attack path, crit investment does almost nothing.

Ten attributes the game barely uses, and eight it does not use at all

Every one of the 95 entries in AttriType was swept for a real read (any use that is not the enum declaration or a bare case label, plus numeric (AttriType)n casts). Eight come back with nothing at all, and two are read in one place only — a spell effect's scaling — and nowhere else:

id Shown on the sheet?
38 暗器 yes nothing reads it
40 医道 yes one spell effect scales off it
41 毒技 yes nothing reads it
64 打猎 yes nothing reads it
65 种植 yes nothing reads it
71 正邪 yes nothing reads it
77 反击 no row anywhere nothing reads it
78 连击 no row anywhere nothing reads it
79 追击 no row anywhere nothing reads it
80 连战 no row anywhere two spell effects scale off it

None of the ten is referenced by an ECT_NPCATTRI condition either, across npc_interact, entrust_event_prototype and mailcondition, so no quest, sect requirement or letter gates on them.

Six of them are on your character sheet and go up when you train them. 暗器, 医道, 毒技, 打猎, 种植 and 正邪 are displayed and raisable; five of the six are read by nothing whatsoever, and 医道 only by the one spell effect that scales off it. Training them is time spent on a number.

The other four have no display at all and exist only in the enum, which matters because equipment affixes and 经脉 nodes can still roll 反击, 连击, 追击 and 连战. Those rolls are stored and never consulted. Reroll them.

The two exceptions are thin but real: 医道 and 连战 each appear as the scaling attribute on one or two spell effects, so a specific move can read them even though nothing else does.

The five elements are specialise-or-lose

阴, 阳, 刚, 柔 and 毒 do not add damage. They do exactly two things.

They pick your 偏向. GetMaxPianXiangState takes whichever of the five is highest, and that is the 偏向 you fight as. Nothing else about the raw values matters for this. Only which is largest.

They set the 相合 bonus, which is the third damage term and a subtraction:

相合(X) = X − (the element after X) − (the element before X)

in the ring 阳 → 阴 → 柔 → 刚 → 毒 → 阳. So:

Your 偏向 相合
阳 阳 − 阴 − 毒
阴 阴 − 柔 − 阳
柔 柔 − 刚 − 阴
刚 刚 − 毒 − 柔
毒 毒 − 阳 − 刚

Spread the five evenly and 相合 is negative. The bonus only exists once your chosen element exceeds its two neighbours added together, and it applies only on moves whose own 偏向 matches yours.

An affix or 经脉 node that adds a neighbouring element is a downgrade, not a small upgrade, and adding 阴 to a 阳 build subtracts from the only term the elements feed.

战力 is not damage, and it is missing the stat that matters most

NpcEntity.GetZhanLi, in full:

战力 = 气血上限
     + 真气上限 × 3
     + (外攻 + 内攻) × 8
     + (外防 + 内防) × 7.2
     + (命中 + 闪避) × 10
     + (诛心 + 御心 + 要害 + 化解) × 10
     + (阴 + 阳 + 刚 + 柔 + 毒) × 4
     + 轻功上限 × 10

Read that against the damage formula and three things fall out:

Use 战力 to compare two NPCs, which is what it is for. Do not use it to judge your own build.

The weapon skills feed nothing until you own one specific 特技

刀法, 剑术, 搏击 and 枪棍 appear on the 武学 tab, they gate sect entry, and no damage formula reads them. Their only mechanical effect in the whole assembly is one branch in ReCalAttriEquip:

weapon base attributes × (1 + min(1.0, skill / 1000))

It applies only if the matching 特技 is equipped, because GetStuntEffectValue returns 0 when the stunt is absent. One stunt per weapon class, each requiring that skill at 700:

特技 Weapon Needs Clue the game gives
鹿门翠微 刀 刀法 ≥ 700 a 刀绝 seen at (1552, 393)
平明寻羽 剑 剑术 ≥ 700 a 剑圣 at (901, 1400)
气吞山河 拳/搏击 搏击 ≥ 700 a 千金王 at (200, 644)
空翠嶙峋 长兵/枪棍 枪棍 ≥ 700 a 飞槊 at (1517, 1044)

At the 700 needed to get it that is +70% to everything the weapon grants; it caps at +100% at skill 1000. Below 700 or without the stunt, the skill is a sect requirement and nothing else.

How the five actually grow, and why 700 is so far away

Not by fighting. AddSkillProficiency, the use-it-and-it-rises system with the per-grade ceiling, is called for 垂钓, 农学 and the craft skills, and never for a weapon. The weapon skills come from the ArtistrySystem — the same machinery behind 读书, 请教, 比试, 传授, 领悟, 作画 and 题字 — and one function grants all of it:

public void GetAttriPoint(AttriType attri, int point)   // Tools.CalculateArtistryValue, then ModAttriField
public static int GetPoint(bool success) => success ? Random.Range(3, 6) : 1;

3 to 5 points on a success, 1 on a failure. That is the unit the whole skill is built out of.

Interaction What decides the gain
请教 your skill ÷ theirs. You gain when Random.value beats that ratio, so a teacher far above you nearly always pays and one barely above you rarely does. At a ratio of 1 or more the branch is skipped: someone no better than you teaches you nothing
比试 3 to 5 for a good showing, 1 otherwise. Even conceding pays 1
传授 3 to 5 for a right answer, 1 for a wrong one

Everything is then multiplied by 1 + floor(奇术 ÷ 100 × 4), read off the hidden 奇术 word entry, so 奇术 is the one stat that makes every point of study worth more.

Books are the fourth route, and the word "book" covers two unrelated things. Keep them apart or the shelves lie to you:

Only the second kind is what follows, and it comes in two lines:

line shape who has one
the tiered library 道学·玄朴经·凡阶, and up through the tiers 70 books each for 道学, 佛学, 儒学, 墨学, 魔法学, 农学; 42 each for 琴艺, 棋艺, 书法, 画道, 酒量, 垂钓
fragments 残篇, 残页, 断章 14 each, for the five weapon skills, the craft skills, and 兵道 and 诡辞

So yes, 佛学 and its siblings have been readable all along, on a 70-volume line, and reading is the main way they climb. The weapon skills have no tiered library either, which is why they lean on 请教 and 比试 instead — but they at least own hundreds of manuals that make a character stronger by another route.

兵道 and 诡辞 get the worst of both. Fourteen fragments, no tiered library, and no moveset of their own to learn either. That is the structural reason those two sit near zero on most saves while 儒学 or 农学 climb into the hundreds.

奇术, 医道 and 毒技 have neither line. Nothing raises them by reading.

The grades are {100, 250, 450, 700, 1000}, and 700 is the top boundary — the weapon 特技 asks you to finish the fourth grade. From a typical mid-run 126 that is 574 points, or something like 140 successful 请教 at 4 points apiece. That is the real reason the four weapon skills sit where they do on most saves, and why a source that pays in the hundreds rather than the singles changes the picture.

The eight schools are 特技 ladders, and that is all they are

道学, 佛学, 儒学, 兵学, 墨学, 鬼学, 魔法学 and 农学 sit between the weapon skills and the life skills on the sheet, and none of them is read for anything on its own. Each carries a ladder of five 特技, gated at 100, 250, 450, 700 and 900, and every one of those 特技 carries the same sentence: 装备后根据 对应属性点数占最大值比例 — equip it and the effect scales by how close that school sits to its own maximum. The school is the key; the 特技 is the lock it opens; equipping is what makes either matter.

school 100 250 450 700 900
道学 真气上限 福气 元气 内攻 better chance of a high-grade drop
佛学 生命上限 坚韧 根骨 内防 and 外防 chance of a second drop
儒学 精力上限 修养 筋骨 外攻 chance to be paid 感悟 and 修为 twice
兵学 阴 阳 刚 柔 毒
墨学 轻功 recovery 内息 轻功 cost 轻功 ceiling chance to spend no 精力
鬼学 life-skill 精力 cost life-skill materials 诡辞 egg items from 炼丹, 酿酒, 烹饪 output quality from 锻造, 缝纫, 巧手
魔法学 经脉 success rate 体魄 chance to open a 经脉 point free better 词条 when opening one 经脉 fixed attributes scale on the school
农学 gathering speed 精神 gathering 精力 cost high-grade gathering chance to gather twice

The number on the sheet is the multiplier, not a gate you pass once

This is the part the panel never says. Crossing a threshold grants the 特技; the school's value then decides how much that 特技 is worth, every frame, forever. The rungs that raise an attribute compute:

ratio  = value1% × your base school value / 1000      // capped at value1%
change = ceil( your base value of the target × ratio )
ModAttri(NST_TEJI, target, change)

So it is a percentage of the target's own base value, and the percentage is the school divided by 1000. 兵道's five rungs each carry value1 = 20, meaning up to +20% to one element apiece, reached only at 兵道 1000.

your 兵道 what 兵无常势 gives
18 20% × 18/1000 = 0.36% of your base 阴
250 5%
700 14%
1000 20%, the cap

Two consequences. At 18 and 22, both of these are worth nothing at all — that is not a bug, it is the formula. And because it multiplies the target's base, a rung is worth zero if you have not built the thing it multiplies: 兵无常势 on a character with no 阴 gives nothing however high 兵道 climbs.

诡辞 is only half built this way. Its first, second, fourth and fifth rungs run through a different hook entirely — the life-skill discounts and crafting rolls in the table above — and only its third, 秋毫之末, uses the percentage mechanism, at value1 = 50. Its data reads 47|87: source 诡辞, target 内功威力, up to +50%. The game's own description for it says 提升诡辞, naming the source instead of the target, and it is the one rung in either ladder with no flavour text at all.

Every element has two boosters, and 兵道 is the weaker one

Because each line owns its own equip slot, a 兵道 rung and a life-skill rung that raise the same element both apply at once. And the life-skill side is stronger, in one case five times over:

element 兵道 rung needs the other one needs max
阴 兵无常势 100 书法 落纸云烟 700 50%
阳 水无常形 250 画道 丹青画骨 700 50%
刚 不动如山 450 酒量 劫邀酒星 700 100%
柔 侵掠如火 700 垂钓 无机秋水 700 100%
毒 军无百疾 900 缝纫 蒲苇时纫 700 50%

兵道 caps at 20% on every rung. Every one of its counterparts beats it, and 书法, 画道, 酒量 and 垂钓 each carry a 42-volume tiered library while 兵道 has fourteen fragments. So the cheapest route to a stronger element is not the school that looks like the combat one: drink, fish, paint or practise calligraphy.

The pairing also runs backwards on 兵道. Its rungs are ordered 阴, 阳, 刚, 柔, 毒 at 100 through 900, so the element you fight as decides what the school costs you — a 阴 build needs 兵道 100, a 毒 build needs 900 for the same 20%.

Three of those rows are worth pulling out.

兵学 is the elements, one per rung: 阴, 阳, 刚, 柔, 毒. Given that the elements are specialise-or-lose, that makes it the school with the sharpest combat consequence, and its own tooltip says the opposite — 兵道并不能直接提升个人作战能力 is true of the attribute and false of the ladder hanging off it.

墨学 is the 轻功 school. Four of its five rungs are recovery, cost, ceiling and 内息, which is why it is the one school the assembly reads outside its own 特技: the 轻功 cost reduction is computed from it directly.

鬼学 and 农学 are the crafting and gathering schools, and neither touches combat at any rung. 鬼学 buys cheaper life skills and better output; 农学 buys faster, cheaper, richer gathering.

Every weapon carries a moveset that appears on no sheet

Holding a weapon gives you a set of moves that is listed nowhere: not in your 武学 tab, not in any 秘籍, not on an enemy's 属性 page. npc_spell_container holds 79 of these, one per weapon class and the rest for specials:

Weapon What the container gives
剑 江湖剑法 ×5, 胁生双翼, 疾风三击, 固念守, 蓄日破, 追魂
刀 江湖刀法-二连击, 云消雾散, 烘云托月, 怀中抱月, 碎日, 破釜沉舟
拳 江湖拳法-二连击, 疾风骤雨, 截拳, 冲拳, 猛虎裂石, 雷音
枪 百转, 飞云击, 风平浪静, 千军倒, 银蛇刺喉

Measured, from a logged spar: the player cast 141–145, 剑招一式 through 五式, which is the 剑 container, alongside the two 武学 actually equipped, 雁云式 and 蚀骨剑. Roughly two thirds of the swings thrown in that fight came from the container.

On an enemy the container is named on the 信息 tab, in the slot beside the 天赋 row: 万相搏击 is the 枪 set. On your own sheet the same thing has no name anywhere.

The spear set has a guard that counters, and it is the reason fights turn

风平浪静 deals no damage. It raises a guard for one second, and the guard names the move it answers with:

effect 130180000     effectType 1 (aura), effectSubType 32 (SpellAuraDefense)
duration  1000       one second
odds      10000      100%
miscValue 13019      ← the spell it fires back: 千军倒

The trigger is your own attack. Inside damage application:

if (target.HasFlag(20) && target.IsFacing(attacker, 180f))
    target.FightBack(attacker);

FightBack rolls against odds, which is 10000, so it always fires; casts miscValue at whoever hit; and then strips the guard, so one guard buys one counter. The enemy does not have to be attacking, does not have to react, and does not have to time anything. You supply the trigger.

The counter is an ordinary attack. 千军倒 and 银蛇刺喉 carry waiDamage 40, neiDamage 40, which is 40% of the caster's 外攻 and 40% of their 内攻. Measured: 千军倒 came back at exactly 3378 on two separate occasions, after quite different player damage in between, which nothing scaled off your own hits could do.

Two ways past it, both from that same line. Stop attacking for a second and the guard expires unused. Or strike from outside the front 180°, where FightBack is never called at all.

The tell is a buff, and it is the only one you get. The guard puts 反击 on the enemy's buff bar, described in the game's own string table as 在受到攻击时会释放反击技能, for the second it lasts.

A true damage reflect does exist and is a different mechanism: an aura carrying flag 4, SpellAuraDamageReflect, which returns miscValue% of the damage you just dealt, on a baseValue chance, and can additionally blunt the incoming hit by baseValue2%. Nothing in the weapon containers uses it.

An enemy carries two movesets and the 属性 tab shows one

ShowNpcSpell reads two different places depending on the character:

if (IsRandomNpc() || IsChongWu() || IsNotRandomNpcRandomSpellAndNoNpcFight())
    → m_SpellManager.GetEquipSpell(type, curTaoluType)   // what the tab draws
else
    → NpcFight.GetNpcSpell(npcFight, type)              // the authored fight list

and a named character with no fight record hits an early return, so the page draws nothing at all.

Both halves get cast. Across 168 logged hits, 163 came from authored spells and 5 from runtime-generated ones, with one enemy drawing on both inside a single fight. So the tab is accurate about what it lists and silent about the container half, which is where the guard and the counter live. Reading an enemy's page tells you some of what they will throw at you.

A generated move's name means nothing. Its name field is a recipe of string ids, 0|-2234|1500045879|-2271|-2277, which the interface stitches together for display. The prefix pool is keyed to the character's dominant element: spellName_Yin_1 is 寂韵, _4 寒潜, _5 隐梦, _7 影密, _8 遁玄. A character whose 阴 is 87 against 24, 26, 22 and 22 gets 阴 prefixes on everything. So a displayed name can never be matched against an authored move, and says nothing about what the move does.

The moves underneath are real. npc_spell_dynamic names a protoSpellId on every row and varies it by 偏向, 境界 tier, shape, range and hit count. Existing moves with parameters, given assembled names.

万宗 is the 连招 system, and it pays into your attributes

云别月沉 is not a spell. It is a lianzhao_node:

id 1001, nextid 1002, taoluType 101, groupId 1, level 1
neigongValue 15, waigongValue 15, formulaAttri 331

33 nodes across 28 graphs, against 3,392 spells. neigongValue and waigongValue are the same two percentages the damage formula multiplies 内攻 and 外攻 by, which is why the tooltip prints them in the same words a move's tooltip does.

The reason it matters for a build is the second half. 连招 is one of the nine source channels every attribute is assembled from, and it is visible in the 命中 decomposition above: 基础+26, 装备+42, 境界+104, 词条+31, 连招+23, 其他+197. So the 万宗 tree drives the combo and feeds the panel at the same time, and 洗练 on a node is rerolling an attribute source, not only a move.

A 招式's 窍穴 pay only while the move is equipped

Every 招式 carries four 窍穴 — 入门, 熟练, 精通, 化境 — and 领悟-ing one grants two different things that reach you by two different routes.

The 强化效果 is written onto the move itself at the moment you 领悟 it (UpGradeNodeAddEffect calls AddSpellEffectId(spellId, …)) and stays there. It changes what that move does when it lands, so it asks nothing of you beyond casting the move.

The 词条 — the block reading 内攻攻击+30, 化解+11, 阴+8, 外攻攻击+35 — are character-wide attributes, and every recompute collects them from exactly one list:

foreach (long id in m_MiJiMgr.m_graphMgr.GetPlayerCurUseSpellNodeIdList())   // ReCalWordEntry

That list is built from the spells equipped in the 套路 you are using, and from nothing else:

GetEquipSpell(ST_ZHAOSHI, curTaoluType)   // 4 slots
GetEquipSpell(ST_AOYI,    curTaoluType)   // 3
GetEquipSpell(ST_GONGTI,  curTaoluType)   // 1

So 领悟 is necessary and not sufficient. A move sitting unequipped in your 秘籍 pays nothing, however many of its 窍穴 are open, and the panel that shows you the block does not say so.

The 套路 follows the weapon in your hand. curTaoluType is assigned from the item in equipment slot 0: 剑, 刀, 枪 and 棍, 拳, 暗器. Sheathing a 棍 for a 剑 swaps the whole equipped set, and with it every 窍穴 词条 that was paying. A move's bonuses are live only while you carry the weapon class the move belongs to.

A 心法 is the same rule with a narrower slot. ReCalAttrMiJi reads its attribute block from GetEquipSpell(ST_GONGTI, curTaoluType)[0], the first of the one 功体 slot there is, and returns early when that slot is empty. A 心法 you own and have not slotted is inert.

All four 窍穴 pay, and each holds its own four 词条

The four are four separate node groups, chained but independent, and GetPlayerCurUseSpellNodeIdList adds every active one it finds for the spell. Nothing there prefers the last. 飞虹击涧, spell 120300, is four groups of one node each:

窍穴 node 感悟 to open 感悟 to reroll 词条 groups 特技
入门 12030000 875 292 8221 & 8400 & 8400 & 8400
熟练 12030010 1,575 525 8222 & 8400 & 8400 & 8400
精通 12030020 2,835 945 8223 & 8400 & 8400 & 8400
化境 12030030 5,103 1,701 8224 & 8400 & 8400 & 8400 406

Read across that table twice. Every node carries four 词条 groups, not one. The first is the node's own and differs per acupoint; the other three are the same common pool, and they are the three material slots on the panel — 道具, 丹药, 密卷, in that order. A node you open and feed nothing gives you one 词条 where it could have given four. Sixteen across a fully opened move.

The one thing 化境 alone carries is the 特技. Only 12030030 has a tejiValue, which is the AddSpellEffectId that 强化属性 on the left page is waiting for. The other three grant 词条 and no enhancement. So the last acupoint is where the move's behaviour changes, and all four are where your attributes come from.

The two rolls are separate, which is what makes materials on an early acupoint safe:

An item rolls its slot one of two ways, by its own mijiNodeWordEntryWash: reroll from the node's common pool carrying the current entry forward, or roll from the item's own table. A 密卷 of item type 3 subtype 19 rolls against the node's controlPianXiang, which is how a scroll biases the result toward one element rather than handing you whatever the pool had.

Learning a move you do not slot gives you nothing

SpellManager.LearnSpell does three things: it adds the id to your learnt list, it registers a listener if that spell declares one, and it fires the UI event that pops the name on screen. No attribute, no proficiency, no counter. The listener clause reaches almost nothing — listener_spell holds five rows for the whole game, each naming one specific condition.

So every channel a move could pay you through is gated on the same thing:

Channel Gate
窍穴 词条 equipped in the current 套路
心法 attribute block in the one 功体 slot of the current 套路
连招 nodes (万宗) ReCalAttrLianZhao reads GetEquipLianZhao(curTaoluType) — equipped, current 套路
the move's own damage you have to cast it, so equipped

And the four weapon skills run the other way round from the guess. Nothing in the assembly writes 刀法, 剑术, 搏击 or 枪棍 by name; all thirteen references are reads. They are raised the way any other attribute is, by books, rewards and allocation, never by learning a move or by swinging one. The game's own tooltip says what they are for: 刀法养成,学习高级刀法的条件,同时可以获得一定的 特技 — the condition for learning the higher-tier moves, and the gate on the 特技 at 700. Proficiency lets you learn; learning does not build proficiency.

The practical read: open 窍穴 on what you intend to carry. A move in the book you never slot is a move you paid 感悟 to look at.

There are five proficiencies, not four — 剑术, 刀法, 枪棍, 搏击 and 暗器 — and all five behave the same way. The trainer's A move you learn raises its weapon skill switch, on by default, is the answer to the design: a learnt 招式 or 奥义 pays its own tier back into its weapon's skill. It counts what you know rather than writing when you learn, so everything already in your 秘籍 counts and switching it off puts the numbers back.

It carries no cap, because the moves are the cap. Counting every one that has a 秘籍 graph, learning all of them pays:

weapon moves that can be cultivated paid if you learn every one
搏击 130 372
剑 126 280
刀 61 147
枪棍 56 132
暗器 38 110

Against the 700 the 特技 asks for, a lifetime of collecting one weapon's manuals is worth roughly half of it at best, and the spread between weapons is simply how much material each art has written for it. 暗器 has the fewest books, so it pays the least.

What the community says, and what survives

Checked against 切游's 加点 guide and the summary that 星界云 and 多多云 circulate.

The headline verdict changed once the mode split was found. These guides are not describing a build that no longer exists. They are describing 爽文江湖, accurately, without saying so.

Claim Verdict
Every "N per point" figure — 42 气血, 9 真气, 7 外防, 5 外攻, 4 命中 Right for 爽文 / 险恶 / 暗黑, wrong for 真实江湖. They are attribute_addition's numbers divided by 100, and that is genuinely the table those three modes read. A 真实江湖 save reads attribute_addition_zhenshijianghu, where the same eight points feed different stats entirely
No mention anywhere that the table depends on game mode The gap that makes the rest misleading. One switch, IsZhenShiJiangHu, picks between two tables. Nothing in the community material acknowledges it
元气 as a core 内功 stat Right in 爽文 (9 真气, 2 内防, 1.5 化解). In 真实江湖 it does nothing for 内功 — it is a 气血 stat identical to 根骨
专注 as the accuracy stat Right in 爽文 (4 命中). In 真实江湖 it gives 0 命中 — accuracy is 身法 at 0.8
体魄 as a health stat Right in 爽文 (5 气血 as well as 7 外防). In 真实江湖 it gives 0 气血
力道 and 专注 as the way to raise 要害 Right in 爽文 (1.5 each). In 真实江湖 要害 has no row at all, so nothing you spend can raise it
"筋骨" and "内息" as stat names Outdated. This build calls them 力道 and 内力
诛心 = crit damage, 要害 = crit rate, 化解 = enemy crit rate down Right, all three, and 御心 is the fourth they omit — it is what divides your 诛心
"经脉洗练建议使用阳+身法" There is no 经脉洗练 in 真实江湖. That mode's meridian screen offers 激活 and attribute points and nothing else; the developer's own note on the change reads 去除繁琐的经脉词条洗炼,改为加点模式. In the modes that still have it, 阳 does nothing unless it is your highest element and your moves are 阳; adding it to any other build subtracts
防具词条 must have 闪避+4%, 身法+5%, 诛心+要害+4% Sound, and the reasoning is better than stated: 闪避 works on a threshold, and 诛心 is the stat with the ×1.0 floor
外功 build → "筋骨" and 根骨; 内功 → 元气 and "内息"; tank → 体魄 and 精神 Holds in 爽文. In 真实江湖 only the attack halves survive — 元气 does nothing for a 内功 build beyond 气血, and a tank wants 体魄 for defence with any of the four interchangeables for 气血

What no community source mentions at any difficulty: the mode split itself, that four of the eight 资质 are interchangeable in 真实江湖, 身法's numbers, the ten dead attributes, the 相合 subtraction, the 诛心 floor, or that 战力 omits 会心.

Where this was read

AttriManager.ReCalAttri / ReCalAttriEquip / GetAttriResultDes, AttributeAdditionInfo.LoadCSV / GetTableName, Tools.TransfromAttriDic, SpellCalculate.CalculateFormulaDamage / CalculateFormulaQidunDamage / CaculateDefenceRate, UnitController.GetXiangHe, NpcEntity.GetMaxPianXiangState / GetZhanLi, StuntManager.GetStuntEffectValue, AttriPart.GetAttriTip / RefreshZhenShiJiangHuAttri, UnitController.Defense / FightBack, SpellCalculate.DoEffectDamage, NpcInformationView.ShowNpcSpell, NpcFight.GetSpellList / GetNpcSpell, and the tables attribute_addition, attribute_addition_zhenshijianghu, spelleffect, spellprotype, npc_spell_container, npc_spell_dynamic, lianzhao_node, pianxiang, stunt_proto.

Column order in those tables is extracted from each loader rather than counted by hand — tools/gamedb.py, which reads a row by field name. Every figure quoted from a data table on this page was read through it.

What was measured. The 真实江湖 rates were taken on a running character, one 资质 at a time: raised alone, the eleven combat stats and four pool ceilings read back once two consecutive reads agreed, then reverted with the revert confirmed before the next stat. Run at +1000 and again at +300, identical per-point rates. Every measured figure then matched its row in attribute_addition_zhenshijianghu to the unit, including the one apparent discrepancy, which turned out to be a +10% 内力 modifier on the test character inflating both of 内力's outputs by exactly 10%. Harness: tools/zizhi_sweep.py, re-runnable against any character.

The 爽文 / 险恶 / 暗黑 rates were not measured. They are attribute_addition read directly. Given that the 真实江湖 table predicted its own measurements exactly, the default table is likely just as reliable, but it has not been checked on a running save of those modes.

The damage formula was measured whole. A hook on CalculateFormulaDamage recorded every input the game read, the damage it returned, and an independent recomputation of the formula above from those same inputs, over 405 calculations of ordinary play. On the 162 where no aura was active on either side — the one path the recomputation deliberately does not repeat, because it runs through methods that take the value by reference — the formula reproduced the game's own damage exactly, 162 times out of 162. The same integer, not a close fit, across many attackers, targets and moves, with crit multipliers spanning 1.0000 to 3.2140 and 126 distinct defence values from 0 to 12,188.

That makes the two claims in the sections above measured rather than read: the defence curve and the crit multiplier are both inside the computation that matched, and both were then demonstrated directly on their own. Harness: tools/damage_probe.py, against the trainer's /damage endpoint.

Note that the same function serves healing and 真气 regeneration, which is most of what it computes outside a fight; rows are marked and the regeneration ones excluded.

The weapon containers were measured; the guard is a code reading. That the container half is really cast, and that both halves are cast by the same character, comes from the same log: 168 landed attacks, 163 from authored spells and 5 from runtime-generated ones. The counter's 3378 appearing twice against different preceding damage is measured too. What is read rather than measured is the mechanism — the guard aura's one-second duration, the 100% odds, the front-180° condition and the single-use consumption are all from Defense / FightBack and the effect row, not observed directly. Confirming them would need a hook on aura application, which does not exist.

Still code readings, not measured: the 相合 ring, 战力, the ten dead attributes and the weapon 特技. The 命中 ≥ 闪避 threshold is also unmeasured, and needs an enemy whose 闪避 already exceeds your 命中 — points only go up, so it cannot be forced. Read those as what the code says rather than as what the game does until each is checked the same way.