Semantic registry

An emulator has to reconstruct what every field of the game's data means. The risk is a model that reproduces the cases it was shown and grows special cases for the rest: increasingly coherent while increasingly wrong. This page tracks what we know about the meaning of five generic subsystems, how sure we are, and how much of the real data our implementation handles without per-id code. The format is defined in docs/design/semantic-registry.md; data provenance (where values come from) is in wildstar-delta.md.

Statuses: established (the client's code or several independent sources agree), probable (one strong source, nothing against), hypothesis (a candidate meaning with some evidence), unknown.

Summary

subsystem values established probable hypothesis unknown handled generically special cases
Quest objective types 40 8 18 10 4 7753 of 10031 (77%) 3
Prerequisites 273 30 12 181 50 35876 of 49184 (73%) 0
Spell effects 151 15 34 17 85 118577 of 131010 (91%) 2
Public event objectives 33 11 16 6 0 1248 of 3703 (34%) 156
Creature default properties (max health) 2 2 0 0 0 8616 of 8734 (99%) 0

Quest objective types

What each QuestObjective column and objective type means, how sure we are, and which of our modules implement it.

Registry: apps/bezgelor_data/priv/semantics/quest_objectives.json; table QuestObjective.

established probable hypothesis unknown total
type values 8 18 10 4 40
fields and flag values 2 11 2 6 21

Coverage (data rows our implementation handles generically, from the generalisation test):

  • all rows: 7753 of 10031 (77%);
  • rows of established or probable values: 7671 of 9648 (80%);
  • special cases: 3 registered; the lint finds 3 per-id code paths in the implementation (0 unlisted).

Handled means our code has a generic route that could complete the row; whether that route is right is what the status says (a hypothesis can be handled by a reading the evidence contradicts).

type name status rows handled consumers
2 KillCreature established 598 96% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Zone.PlayerQuests.creature_killed/4 +1
3 TalkTo established 350 97% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Zone.PlayerQuests.interacted/3
4 CollectItem probable 327 72% BezgelorWorld.Quest.Info.collect_item/1, BezgelorWorld.Zone.PlayerQuests.items_changed/2 +1
5 ActivateEntity probable 1556 69% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Quest.Info +7
8 KillTargetGroups established 498 95% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Quest.Info.dynamic?/1
9 ActivateEntity2 probable 18 94% BezgelorWorld.Quest.ObjectiveRules.matches?/3
10 Unknown10 hypothesis 52 63% BezgelorWorld.Quest.ObjectiveRules.matches?/3
11 SpellSuccess probable 128 97% BezgelorWorld.Zone.PlayerQuests.spell_succeeded/4, BezgelorWorld.Quest.Abilities
12 SucceedCSI established 1187 95% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Tutorial +1
13 SpellSuccess2 hypothesis 3 100% BezgelorWorld.Zone.PlayerQuests.spell_succeeded/4, BezgelorWorld.Quest.Abilities
14 ActivateTargetGroupChecklist probable 426 96% BezgelorWorld.Quest.ObjectiveRules.matches?/3
15 Unknown15 hypothesis 26 100% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Quest.Info.dynamic?/1
16 KillTargetGroup established 55 82% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Quest.Info.dynamic?/1
17 EnterZone established 199 99% BezgelorWorld.Zone.PlayerQuests.zone_entered/3, BezgelorWorld.Tutorial
18 TalkToTargetGroup probable 35 91% BezgelorWorld.Quest.ObjectiveRules.matches?/3
19 UNUSED19 unknown 2 0%
20 Unknown20 hypothesis 11 0%
21 GatheResource probable 10 90% BezgelorWorld.Quest.ObjectiveRules.matches?/3
22 EnterArea probable 511 99% BezgelorWorld.Quest.ObjectiveRules.location_objective?/1, BezgelorWorld.Zone.PlayerQuests.moved/3 +1
23 ActivateTargetGroup established 96 93% BezgelorWorld.Quest.ObjectiveRules.matches?/3
24 CompleteQuest established 39 100% BezgelorWorld.Zone.PlayerQuests
25 CompleteEvent probable 152 100% BezgelorWorld.Zone.PublicEvents, BezgelorWorld.Quest.ObjectiveRules.event_stand_in?/1 +2
27 Unknown27 unknown 1 0%
28 Unknown28 hypothesis 5 60% BezgelorWorld.Quest.ObjectiveRules.matches?/3
29 Unknown29 unknown 2 0%
31 Unknown31 unknown 260 0%
32 VirtualCollect probable 709 84% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Quest.ObjectiveRules.purchase_matches?/3
33 CraftSchematic probable 215 34% BezgelorWorld.Tradeskills.QuestHooks
35 SpellSuccess3 hypothesis 10 100% BezgelorWorld.Zone.PlayerQuests.spell_succeeded/4, BezgelorWorld.Quest.Abilities
36 SpellSuccess4 hypothesis 6 100% BezgelorWorld.Zone.PlayerQuests.spell_succeeded/4, BezgelorWorld.Quest.Abilities
37 LearnTradeskill probable 4 100% BezgelorWorld.Tradeskills.QuestHooks
38 ObtainSchematic probable 2520 61% BezgelorWorld.Quest.Info.collect_item/1, BezgelorWorld.Tradeskills.QuestHooks
39 Unknown39 hypothesis 2 0%
40 Unknown40 hypothesis 2 0%
41 PvPKills probable 2 0%
42 EarnCurrency probable 2 0%
44 CombatMomentum probable 7 0%
46 KillCreature2 hypothesis 1 100% BezgelorWorld.Quest.ObjectiveRules.matches?/3, BezgelorWorld.Quest.Info.dynamic?/1
47 CompleteChallenge probable 2 0%
48 BeginMatrix probable 2 0%

Generalisation test: established or probable values with rows we don't handle

type name unhandled errors sample ids
2 KillCreature 26 of 598 0 4772, 5294, 5322, 6231, 6235, 6239, 6243, 6246
3 TalkTo 9 of 350 0 3908, 4062, 6206, 6207, 6213, 6214, 6215, 6216
4 CollectItem 90 of 327 0 1277, 1278, 1279, 1280, 1957, 1959, 1960, 2337
5 ActivateEntity 476 of 1556 0 1962, 1978, 2932, 2933, 3095, 3096, 3097, 3098
8 KillTargetGroups 27 of 498 0 1891, 4112, 4183, 4187, 4189, 4191, 4220, 7656
9 ActivateEntity2 1 of 18 0 2365
11 SpellSuccess 4 of 128 0 9882, 15816, 16525, 16577
12 SucceedCSI 56 of 1187 0 2880, 3460, 3612, 3632, 3738, 3777, 3805, 3970
14 ActivateTargetGroupChecklist 19 of 426 0 1915, 2889, 2901, 3801, 4478, 5316, 6080, 6095
16 KillTargetGroup 10 of 55 0 1892, 3791, 4497, 4499, 4501, 4973, 5905, 6135
17 EnterZone 1 of 199 0 6375
18 TalkToTargetGroup 3 of 35 0 3673, 4061, 13114
21 GatheResource 1 of 10 0 8774
22 EnterArea 3 of 511 0 6652, 6656, 13975
23 ActivateTargetGroup 7 of 96 0 6653, 6657, 8323, 9393, 9819, 12978, 12979
32 VirtualCollect 116 of 709 0 6807, 8037, 8584, 8832, 9554, 10046, 10078, 12626
33 CraftSchematic 141 of 215 0 8054, 8055, 8056, 8057, 8058, 8059, 8062, 8063
38 ObtainSchematic 972 of 2520 0 10615, 10616, 10617, 10618, 10619, 10620, 10621, 10622
41 PvPKills 2 of 2 0 18918, 19379
42 EarnCurrency 2 of 2 0 18919, 18966
44 CombatMomentum 7 of 7 0 18958, 18959, 18960, 18961, 18967, 18968, 18969
47 CompleteChallenge 2 of 2 0 21212, 21367
48 BeginMatrix 2 of 2 0 21491, 21492

Special cases (per-id code paths)

where kind ids issue
apps/bezgelor_world/lib/bezgelor_world/quest/objective_rules.ex:87 id list attribute @scripted_dummies 70_966, 70_967, 70_968, 70_975, 71_382, 71_386 #220
apps/bezgelor_world/lib/bezgelor_world/quest/objective_rules.ex:753 id list attribute @sole_step_stand_ins 4855 bez-8fzv
apps/bezgelor_world/lib/bezgelor_world/quest/objective_rules.ex:760 id list attribute @follow_up_stand_ins 13_062 bez-83i0

Open questions: values the data uses whose meaning is unknown

  • 19 UNUSED19 (2 rows): None: test rows.
  • 27 Unknown27 (1 rows): Find the quest that holds it and its text.
  • 29 Unknown29 (2 rows): Find the quests that hold them.
  • 31 Unknown31 (260 rows): Issue #163: correlate data with the work-order quests' tradeskill and tier.

Prerequisites

What each Prerequisite column, type and comparison means. The client evaluates prerequisites itself, so its evaluator (WildStar64.exe 1.7.8.16042, FUN_1404a1ca0) is the main source; types it never evaluates are server-side.

Registry: apps/bezgelor_data/priv/semantics/prerequisites.json; table Prerequisite.

established probable hypothesis unknown total
prerequisiteTypeId values 30 12 181 50 273
fields and flag values 15 0 1 0 16

Coverage (data conditions our implementation handles generically, from the generalisation test):

  • all conditions: 35876 of 49184 (73%);
  • conditions of established or probable values: 35317 of 35537 (99%);
  • special cases: 2 registered; the lint finds 0 per-id code paths in the implementation (0 unlisted).

Handled means our code has a generic route that could complete the condition; whether that route is right is what the status says (a hypothesis can be handled by a reading the evidence contradicts).

prerequisiteTypeId name status conditions handled consumers
1 Level established 959 100% BezgelorWorld.Spell.Prerequisite
2 Race established 166 100% BezgelorWorld.Spell.Prerequisite
3 Class established 360 100% BezgelorWorld.Spell.Prerequisite
4 Faction hypothesis 299 0%
5 Reputation hypothesis 308 0%
6 QuestState established 8790 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Zone.PlayerQuests
7 AchievementState probable 1096 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Progress.Engine
8 ItemProficiency hypothesis 26 0%
9 EpisodeState hypothesis 34 0%
10 Gender hypothesis 43 0%
11 OtherPrerequisite established 3903 100% BezgelorWorld.Spell.Prerequisite
12 DeadState hypothesis 168 0%
13 ItemEquipped hypothesis 27 0%
14 ItemOnCharacter established 493 100% BezgelorWorld.Spell.Prerequisite
15 UnderSpell established 3711 100% BezgelorWorld.Spell.Prerequisite
16 DistanceToWorldLocation hypothesis 154 0%
18 ScheduledEvent hypothesis 17 0%
19 TradeSkillProfession established 268 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Zone.Harvest
20 GroupSize hypothesis 8 0%
21 TradeSkillSchematicLevel hypothesis 2 0%
22 QuestObjective0 established 597 100% BezgelorWorld.Spell.Prerequisite
23 QuestObjective1 established 379 100% BezgelorWorld.Spell.Prerequisite
24 InPhase unknown 97 0%
25 CanSeePhase unknown 48 0%
26 InSubZone established 711 100% BezgelorWorld.Spell.Prerequisite
27 InTriggerVolume hypothesis 386 0%
28 InCombat established 230 100% BezgelorWorld.Spell.Prerequisite
29 TimeOfDay hypothesis 22 0%
30 FacilityWithinDistance hypothesis 54 0%
31 CreatureWithinDistance hypothesis 215 0%
33 QuestObjective2 established 152 100% BezgelorWorld.Spell.Prerequisite
34 QuestObjective3 established 87 100% BezgelorWorld.Spell.Prerequisite
35 QuestObjective4 established 74 100% BezgelorWorld.Spell.Prerequisite
36 QuestObjective5 established 17 100% BezgelorWorld.Spell.Prerequisite
37 RandomPercent established 117 100% BezgelorWorld.Spell.Prerequisite
38 IsCreature hypothesis 1182 0%
39 IsPlayer hypothesis 200 0%
40 Health probable 406 100% BezgelorWorld.Spell.Prerequisite
41 ZoneExplored hypothesis 16 0%
42 IsGroupLeader unknown 1 0%
43 IsObjectiveActive established 3631 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Zone.VisibilityGates
44 InTargetGroup probable 214 100% BezgelorWorld.Spell.Prerequisite
46 Waypoint hypothesis 8 0%
47 Unknown47 unknown 1788 0%
48 Unknown48 unknown 2 0%
49 Schedule hypothesis 68 0%
50 Unknown50 hypothesis 450 100% BezgelorWorld.Spell.Prerequisite
51 ItemQuantity hypothesis 119 0%
52 Path established 552 100% BezgelorWorld.Spell.Prerequisite
53 PathEpisode hypothesis 33 0%
54 PlayerPathMission hypothesis 256 0%
55 Unknown55 unknown 4 0%
56 Unknown56 unknown 124 0%
59 SpellStack established 909 100% BezgelorWorld.Spell.Prerequisite
60 Spell60 hypothesis 126 0%
61 PathMissionCount hypothesis 25 0%
62 ScanCreature hypothesis 4 0%
63 Unknown63 unknown 4 0%
64 Unknown64 hypothesis 107 100% BezgelorWorld.Spell.Prerequisite
67 PathMissionRequirement hypothesis 191 0%
68 QuestObjective established 2132 100% BezgelorWorld.Spell.Prerequisite
69 ChallengeRequirement hypothesis 396 0%
70 ChallengeTier hypothesis 25 0%
71 Unknown71 unknown 166 0%
73 Vital established 235 100% BezgelorWorld.Spell.Prerequisite
74 ChallengeLocked hypothesis 236 0%
76 Unknown76 unknown 281 0%
77 Unknown77 unknown 9 0%
80 HealthRequirement hypothesis 8 0%
82 Unknown82 unknown 1 0%
83 Vehicle hypothesis 97 0%
84 Mount hypothesis 15 0%
85 Taxi hypothesis 17 0%
86 Jump hypothesis 22 0%
87 Moving hypothesis 26 0%
88 Pet hypothesis 1 0%
90 Unknown90 unknown 9 0%
91 PathLevel hypothesis 139 0%
92 SpellCondition92 hypothesis 1 0%
93 SpellCondition93 hypothesis 5 0%
94 QuestObjective6 hypothesis 781 0%
95 Distance hypothesis 59 0%
96 Unknown96 unknown 3 0%
97 Unknown97 unknown 1 0%
98 Unknown98 unknown 9 0%
99 Unknown99 unknown 2 0%
100 Unknown100 unknown 1 0%
101 Unknown101 unknown 4 0%
102 SpellEffect102 probable 353 100% BezgelorWorld.Spell.Prerequisite
103 SpellEffect103 hypothesis 36 0%
104 SpellEffect104 hypothesis 3 0%
105 SpellEffect105 hypothesis 7 0%
106 Unknown106 hypothesis 10 0%
107 QuestObjective7 hypothesis 124 0%
108 PositionalRequirement hypothesis 75 0%
109 WorldRequirement established 232 100% BezgelorWorld.Spell.Prerequisite
110 PlayerPathMissionCount hypothesis 47 0%
111 HazardProperty111 hypothesis 47 0%
112 HazardProperty112 hypothesis 4 0%
113 HazardProperty113 hypothesis 36 0%
114 Vital114 hypothesis 10 0%
115 Unit hypothesis 18 0%
116 Stealth established 32 100% BezgelorWorld.Spell.Prerequisite
117 PublicEvent117 probable 458 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Zone.PublicEvents.unit_view/2
118 PublicEventObjective188 probable 2422 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Zone.PublicEvents.unit_view/2
119 PublicEventObjectiveObject hypothesis 122 0%
120 PublicEventTeam established 42 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Zone.PublicEvents.unit_view/2
122 PublicEventObjective122 hypothesis 1 0%
123 Unknown123 hypothesis 184 0%
124 ChallengeCompletionCount hypothesis 7 0%
125 Challenge125 hypothesis 153 0%
126 PathHoldout hypothesis 72 0%
127 PathHoldoutPlayer hypothesis 11 0%
128 Faction128 hypothesis 8 0%
129 SpellObj established 146 100% BezgelorWorld.Spell.Prerequisite
130 SpellObjByOther established 55 100% BezgelorWorld.Spell.Prerequisite
131 Level131 hypothesis 3 0%
133 Item133 probable 13 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Progress.Engine
134 Item134 probable 34 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Progress.Engine
135 Item135 hypothesis 31 0%
136 Item136 hypothesis 9 0%
137 ItemLevel probable 25 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Progress.Engine
139 ItemMicrochip hypothesis 2 0%
141 IsOutOfBounds hypothesis 36 0%
142 Unknown142 hypothesis 10 0%
143 Difficulty hypothesis 113 0%
145 ItemIsSelfCraftedWeapon hypothesis 1 0%
146 ItemTradeSkillLevel hypothesis 34 0%
147 PlayersInWorld hypothesis 9 0%
148 InfrastructureState hypothesis 92 0%
149 State hypothesis 46 0%
150 HubEconomyProgress hypothesis 2 0%
151 HubQualityOfLife hypothesis 2 0%
152 HubSecurity hypothesis 2 0%
153 HoldoutWave hypothesis 95 0%
154 Holdout hypothesis 119 0%
155 PathMission155 hypothesis 174 0%
159 Unknown159 hypothesis 1 0%
160 Challenge160 hypothesis 33 0%
162 PublicEventObjective2 hypothesis 8 0%
163 PublicEventParticipantCount hypothesis 2 0%
167 LiveEvent167 hypothesis 18 0%
168 LiveEventCount hypothesis 2 0%
170 Unknown170 hypothesis 14 0%
171 Unknown171 hypothesis 6 0%
175 TradeSkill hypothesis 1 0%
176 ChallengeObject hypothesis 25 0%
177 TrueLevel probable 220 0% BezgelorData.Abilities.slot_unlock/1
178 Item7 hypothesis 2 0%
179 Unknown179 probable 41 100% BezgelorWorld.Spell.Prerequisite
180 Unknown180 hypothesis 143 0%
182 HouseOwnership hypothesis 2 0%
183 Guild hypothesis 1 0%
185 GuildPerk hypothesis 7 0%
186 Unknown186 hypothesis 1 0%
187 WarplotPlugUpgrade hypothesis 3 0%
188 WarplotPermission hypothesis 12 0%
189 Unknown189 unknown 9 0%
190 PetFlair hypothesis 298 0%
191 Spell191 hypothesis 11 0%
192 Unknown192 unknown 3 0%
193 Unknown193 hypothesis 12 0%
194 MountUsage hypothesis 4 0%
195 HoverboardUsage hypothesis 4 0%
196 Racial hypothesis 40 0%
199 PublicEvent199 hypothesis 14 0%
200 PublicEventObjective200 hypothesis 11 0%
201 AchievementObject hypothesis 93 0%
203 Unknown203 unknown 7 0%
204 Dueling hypothesis 4 0%
214 SpellBaseId established 642 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Account.Items
215 Shield215 hypothesis 34 0%
216 Shield216 hypothesis 6 0%
217 PvpFlag hypothesis 9 0%
218 Datacube hypothesis 64 0%
219 Volume hypothesis 3 0%
220 Unknown220 unknown 46 0%
221 Spell221 established 59 100% BezgelorWorld.Spell.Prerequisite
222 Unknown222 hypothesis 2 0%
223 Unknown223 hypothesis 2 0%
224 LevelGrantAbilityTierPoints hypothesis 1 0%
225 LevelGrantAmpPoints hypothesis 2 0%
226 Entitlement hypothesis 6 0%
227 EldanAugmentation227 hypothesis 18 0%
228 TradeSkill228 hypothesis 1 0%
230 WarplotRating hypothesis 8 0%
231 EldanAugmentation231 hypothesis 241 0%
232 Plane hypothesis 10 0%
233 Spell233 hypothesis 81 0%
234 WarplotUpgrade hypothesis 1 0%
235 BonusAbilityTierPoints hypothesis 2 0%
237 BonusPower hypothesis 2 0%
239 ActionBar hypothesis 12 0%
240 Unknown240 unknown 31 0%
241 Unknown241 unknown 6 0%
243 Faction243 hypothesis 2 100% BezgelorWorld.Spell.Prerequisite
244 Unknown244 unknown 1 0%
245 Unknown245 unknown 249 0%
246 Inventory hypothesis 793 0%
248 Unknown248 unknown 2 0%
250 BaseFaction established 573 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Progress.Engine
251 Personal2V2ArenaRating251 hypothesis 21 0%
252 Personal3V3ArenaRating252 hypothesis 27 0%
253 Personal5V5ArenaRating253 hypothesis 21 0%
254 Battlegrounds254 hypothesis 21 0%
255 Warplots255 hypothesis 21 0%
259 Unknown259 unknown 4 0%
260 Unknown260 hypothesis 1 0%
266 Unknown266 unknown 4 0%
267 Unknown267 unknown 2 0%
268 Unknown268 unknown 3 0%
269 Unknown269 unknown 1 0%
270 LoyaltyRewards hypothesis 56 0%
271 Unknown271 unknown 2 0%
273 EntitlementCount hypothesis 17 0%
275 Unknown275 unknown 281 0%
276 OutOfBounds hypothesis 5 0%
277 Unknown277 unknown 1 0%
278 Unknown278 unknown 1 0%
279 Spell279 hypothesis 1 0%
280 Spell280 hypothesis 3 0%
281 Falling hypothesis 1 0%
285 Unknown285 unknown 2 0%
286 Unknown286 unknown 2 0%
288 PurchasedTitle probable 1 100% BezgelorWorld.Spell.Prerequisite, BezgelorWorld.Progress.Engine
289 Unknown289 unknown 3 0%
290 Unknown290 unknown 7 0%
291 Unknown291 unknown 1 0%
292 Unknown292 unknown 24 0%
293 Unknown293 unknown 1 0%
294 Unknown294 unknown 1 0%
295 Unknown295 unknown 1 0%

Types in PrerequisiteType.tbl that no Prerequisite row uses (41) are in the registry but not in this table.

Generalisation test: established or probable values with conditions we don't handle

prerequisiteTypeId name unhandled errors sample ids
177 TrueLevel 220 of 220 0 8235, 8236, 8237, 8238, 8239, 8240, 8241, 8242

Special cases (per-id code paths)

The lint finds none in apps/bezgelor_world/lib/bezgelor_world/spell/prerequisite.ex.

Registered outside the linted files:

  • apps/bezgelor_data/lib/bezgelor_data/abilities.ex (Map.get(entry, :prerequisiteTypeId0) == 177), value 177: A second evaluator: reads type 177's value0 directly instead of going through Prerequisite.met?/2. (#221)
  • apps/bezgelor_world/lib/bezgelor_world/spell/prerequisite.ex (aura_stacks), value 59: The fallback for a unit whose view carries the aura list without stack counts (creatures): each listed aura counts as one stack (#221)

Client differential

The client's own prerequisite evaluator runs under the Unicorn emulator on sampled real rows and character states (tools/semantics/prereq_differential.py); apps/bezgelor_world/test/semantics/prereq_differential_test.exs replays the recorded verdicts against our evaluator. Types modelled: 1, 2, 3, 6, 11, 15, 28, 52, 109, 116, 120, 243, 250. Known differences: 0.

Recorded: 6000 cases over 1500 of the 7971 eligible rows (client 1.7.8.16042, seed 20261012).

Open questions: values the data uses whose meaning is unknown

  • 47 Unknown47 (1788 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 76 Unknown76 (281 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 275 Unknown275 (281 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 245 Unknown245 (249 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 71 Unknown71 (166 conditions): Read the inline case in FUN_1404a2100 for what it compares.
  • 56 Unknown56 (124 conditions): Read the inline case in FUN_1404a2100 for what it compares.
  • 24 InPhase (97 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 25 CanSeePhase (48 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 220 Unknown220 (46 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 240 Unknown240 (31 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 292 Unknown292 (24 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 77 Unknown77 (9 conditions): Read the inline case in FUN_1404a2100 for what it compares.
  • 90 Unknown90 (9 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 98 Unknown98 (9 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 189 Unknown189 (9 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 203 Unknown203 (7 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 290 Unknown290 (7 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 241 Unknown241 (6 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 55 Unknown55 (4 conditions): Read the inline case in FUN_1404a2100 for what it compares.
  • 63 Unknown63 (4 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 101 Unknown101 (4 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 259 Unknown259 (4 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 266 Unknown266 (4 conditions): Decompile the client's per-type function named in the evidence to read what it compares.
  • 96 Unknown96 (3 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • 192 Unknown192 (3 conditions): Server-side only: read the rows that use it (which spells, quests, events) and their objectIds/values to infer the subject.
  • and 21 more with 32 conditions between them: 42 IsGroupLeader, 48 Unknown48, 82 Unknown82, 97 Unknown97, 99 Unknown99, 100 Unknown100, 244 Unknown244, 248 Unknown248, 267 Unknown267, 268 Unknown268, 269 Unknown269, 271 Unknown271, 277 Unknown277, 278 Unknown278, 285 Unknown285, 286 Unknown286, 289 Unknown289, 291 Unknown291, 293 Unknown293, 294 Unknown294, 295 Unknown295.

Spell effects

What each Spell4Effects column, effect type and per-type data column (dataBits00-09) means, how sure we are, and which of our modules implement it. A row is handled generically when Caster.run_effect/6 (the effect dispatch) does something with it for a player caster and hostile or friendly targets, or when the row's own prerequisite stops it.

Registry: apps/bezgelor_data/priv/semantics/spell_effects.json; table Spell4Effects.

established probable hypothesis unknown total
effectType values 15 34 17 85 151
fields and flag values 30 9 6 4 49
per-type data columns 18 23 12 540 593

Coverage (data rows our implementation handles generically, from the generalisation test):

  • all rows: 118577 of 131010 (91%);
  • rows of established or probable values: 108275 of 111867 (97%);
  • special cases: 2 registered; the lint finds 2 per-id code paths in the implementation (0 unlisted).

Handled means our code has a generic route that could complete the row; whether that route is right is what the status says (a hypothesis can be handled by a reading the evidence contradicts).

effectType name status rows handled consumers
0 None unknown 18 0%
1 VitalModifier probable 2049 100% BezgelorWorld.Spell.Caster.run_effect/6, BezgelorWorld.Spell.Vital
2 SpellCounter unknown 200 0%
3 ForcedMove probable 4645 84% BezgelorWorld.Spell.SupportEffects
4 CCStateSet established 7185 94% BezgelorWorld.Spell.AuraEffects, BezgelorWorld.Spell.InterruptArmor
5 Transference established 559 100% BezgelorWorld.Spell.Caster.run_effect/6, BezgelorWorld.Spell.DamageCalculator.base_value/3
6 SummonVehicle unknown 12 0%
7 Activate unknown 2711 100%
8 Damage established 29445 100% BezgelorWorld.Spell.Caster.run_effect/6, BezgelorWorld.Spell.DamageCalculator.calculate/4 +1
9 FactionSet probable 186 0%
10 Heal established 3098 100% BezgelorWorld.Spell.SupportEffects.apply/9, BezgelorWorld.Spell.DamageCalculator.heal/4 +1
11 UnitPropertyModifier established 20105 99% BezgelorWorld.Spell.AuraEffects, BezgelorWorld.Spell.PropertyModifiers
12 DistanceDependentDamage probable 10 0% BezgelorWorld.Spell.DamageCalculator.base_value/3
13 Script unknown 104 0%
14 Proc probable 3498 99% BezgelorWorld.Spell.AuraEffects, BezgelorWorld.Spell.Procs
15 UnitStateSet unknown 752 0%
16 Resurrect unknown 20 90%
17 Fluff probable 10790 99% BezgelorWorld.Spell.SupportEffects, BezgelorWorld.Spell.AuraEffects
18 Scale hypothesis 531 99% BezgelorWorld.Spell.AuraEffects
19 ProxyLinearAE probable 521 0% BezgelorWorld.Spell.EffectCoverage.closure/1
20 UnlockActionBar probable 4 100% BezgelorWorld.Zone.SpecHooks
21 SummonCreature probable 1951 100%
22 HousingTeleport hypothesis 10 100% BezgelorWorld.Zone.HousingHooks
23 ActionBarSet unknown 405 0%
24 ForcedAction hypothesis 95 0%
25 ProxyChannel unknown 6 0%
26 Proxy established 16929 100% BezgelorWorld.Spell.Caster.run_effect/6, BezgelorWorld.Spell.AuraEffects +1
27 CCStateBreak hypothesis 420 100% BezgelorWorld.Spell.AuraEffects
28 ForceFacing unknown 32 0%
29 Absorption established 581 100% BezgelorWorld.Spell.SupportEffects.apply/9, BezgelorWorld.Spell.DamageCalculator.absorb_flat/1
30 SapVital unknown 142 0%
31 Disguise probable 544 100% BezgelorWorld.Spell.AuraEffects.apply/7, BezgelorWorld.Spell.EffectCoverage.outcome/1
32 SpellImmunity unknown 53 0%
33 DistributedDamage probable 123 0% BezgelorWorld.Spell.DamageCalculator.base_value/3
34 ChangePhase unknown 161 0%
35 NpcExecutionDelay hypothesis 3288 0%
36 SummonMount established 244 100% BezgelorWorld.Spell.Caster, BezgelorWorld.Zone.Mounts
37 ReputationModify probable 70 0%
38 GiveSchematic probable 1171 100% BezgelorWorld.Spell.Caster, BezgelorWorld.Zone.TradeskillHooks
41 TradeSkillProfession unknown 3 0%
42 QuestAdvanceObjective probable 251 100% BezgelorWorld.Spell.Caster.run_effect/6, BezgelorWorld.Zone.PlayerQuests.objective_advanced/4
43 GiveItemToPlayer probable 38 0%
44 GiveLootTableToPlayer unknown 29 0%
45 NpcLootTableModify unknown 2 0%
46 ThreatModification hypothesis 152 23% BezgelorWorld.Spell.AuraEffects
47 ThreatTransfer probable 32 0%
48 WarplotTeleport unknown 2 0%
49 CraftItem unknown 1 0%
50 RewardPropertyModifier probable 197 0% BezgelorWorld.Account.EntitlementEffects, BezgelorWorld.Housing.Buffs
51 SpellForceRemoveChanneled unknown 175 0%
52 ModifyInterruptArmor probable 38 87% BezgelorWorld.Spell.AuraEffects, BezgelorWorld.Spell.InterruptArmor
53 SpellDispel hypothesis 168 100% BezgelorWorld.Spell.AuraEffects
55 ModifySpell unknown 255 0%
56 ModifySpellEffect unknown 82 0%
57 AddSpell unknown 4 0%
58 AddSpellEffect unknown 25 0%
59 SuppressSpellEffect unknown 16 0%
60 ModifyCreatureFlags unknown 75 0%
62 VacuumLoot unknown 5 0%
64 ShieldOverload unknown 55 0%
65 Teleport established 389 100% BezgelorWorld.Spell.Caster
66 TitleGrant established 51 100% BezgelorWorld.Spell.Caster.run_effect/6
67 TitleRevoke unknown 1 0%
68 VendorPriceModifier unknown 3 0%
69 ApplyLASChanges unknown 1 0%
71 FacilityModification hypothesis 771 63% BezgelorWorld.Spell.AuraEffects
73 ModifySpellCooldown probable 522 93% BezgelorWorld.Spell.SupportEffects
75 ChangeIcon unknown 23 0%
76 ItemVisualSwap hypothesis 1542 0%
77 AggroImmune unknown 67 0%
78 GiveAbilityPointsToPlayer probable 1 100% BezgelorWorld.Zone.SpecHooks
79 SpellEffectImmunity probable 229 98% BezgelorWorld.Spell.AuraEffects, BezgelorWorld.Spell.Caster
80 SpellForceRemove probable 2294 100% BezgelorWorld.Spell.AuraEffects
81 RavelSignal hypothesis 5262 100% BezgelorWorld.Spell.SupportEffects.apply/9, BezgelorWorld.Spell.EffectCoverage.outcome/1
82 ChangeDisplayName unknown 268 0%
83 Stealth hypothesis 74 100% BezgelorWorld.Spell.AuraEffects
84 RemoveStealth hypothesis 9 100% BezgelorWorld.Spell.AuraEffects
85 PathActionExplorerDig unknown 3 0%
86 HazardEnable unknown 20 0%
87 HazardModify unknown 49 0%
88 HazardSuspend unknown 20 0%
89 NpcForceFacing unknown 79 0%
90 ModifyAbilityCharges hypothesis 12 100% BezgelorWorld.Spell.SupportEffects
92 AchievementAdvance probable 48 0%
93 PathXpModify unknown 5 0%
94 ProxyChannelVariableTime probable 86 0% BezgelorWorld.Spell.EffectCoverage.closure/1
95 FullScreenEffect probable 136 99% BezgelorWorld.Spell.AuraEffects.apply/7, BezgelorWorld.Spell.EffectCoverage.outcome/1
96 ProxyRandomExclusive probable 195 100% BezgelorWorld.Spell.SupportEffects
97 DespawnUnit probable 855 62% BezgelorWorld.Spell.UnitEffects.actions/2, BezgelorWorld.Zone.Instance.apply_state_action/3 +1
98 SummonPet hypothesis 152 95% BezgelorWorld.Spell.AuraEffects, BezgelorWorld.Zone.Pets
99 MimicDisplayName unknown 4 0%
100 MimicDisguise unknown 33 0%
101 GrantXP unknown 6 0%
105 SettlerCampfire unknown 3 0%
106 SummonTrap unknown 64 100%
107 SetBusy probable 571 97% BezgelorWorld.Spell.UnitEffects.actions/2, BezgelorWorld.Zone.Instance.apply_state_action/3 +1
108 CooldownReset unknown 10 0%
109 RestedXpDecorBonus unknown 25 0%
110 LearnDyeColor probable 223 100% BezgelorWorld.Zone.AppearanceHooks
111 PetCastSpell probable 191 0% BezgelorWorld.Spell.EffectCoverage.closure/1
112 DisguiseOutfit hypothesis 358 98% BezgelorWorld.Spell.AuraEffects
113 RewardBuffModifier unknown 3 0%
116 HousingEscape hypothesis 1 100% BezgelorWorld.Zone.HousingHooks
117 NPCForceAIMovement unknown 1 0%
118 HealShields established 262 96% BezgelorWorld.Spell.SupportEffects.heal_shield_target/6
119 PathMissionIncrement unknown 2 0%
120 GrantLevelScaledXP unknown 11 0%
121 DelayDeath unknown 25 0%
122 GrantLevelScaledPrestige unknown 12 0%
123 UnlockPetFlair established 338 99% BezgelorWorld.Zone.AppearanceHooks
124 WarplotPlugUpgrade unknown 1 0%
125 UnlockMount established 221 100% BezgelorWorld.Spell.Caster
126 SetMatchingEligibility unknown 8 0%
127 UnlockInlaidAugment probable 281 100% BezgelorWorld.Zone.SpecHooks
128 GiveAugmentPowerToPlayer unknown 1 0%
129 TemporarilyUnflagPvp unknown 1 0%
130 SupportStuck unknown 2 0%
131 MiniMapIcon unknown 3 0%
132 Disembark unknown 63 0%
133 ChangePlane hypothesis 16 100% BezgelorWorld.Spell.AuraEffects
134 ModifyRestedXP unknown 3 0%
135 HousingPlantSeed unknown 20 0%
136 UnlockVanityPet established 278 100% BezgelorWorld.Zone.AppearanceHooks
137 SummonVanityPet established 280 100% BezgelorWorld.Zone.AppearanceHooks, BezgelorWorld.Zone.VanityPets
138 DamageShields probable 5 0% BezgelorWorld.Spell.DamageCalculator.base_value/3
139 RapidTransport probable 2 100% BezgelorWorld.Spell.Caster
142 VectorSlide unknown 30 0%
143 ClampVital unknown 23 0%
144 HealingAbsorption unknown 7 0%
145 UnitPropertyConversion unknown 6 0%
146 ActivateSpellCooldown unknown 1 0%
148 SharedHealthPool unknown 13 0%
149 Kill unknown 17 0%
151 PersonalDmgHealMod probable 145 0%

Types in the client's SpellEffectType enum that no Spell4Effects row uses (17) are in the registry but not in this table.

EffectCoverage.outcome/1 (the classification telemetry and the portal use) calls 118613 of the 131010 rows handled or visual; the dispatch handles 118577. Where they differ the row's conditions stop it (self-targeted crowd control, damage to oneself, unmodelled ForcedMove kinds) or the classification is broader than the handler.

Per-type data columns: established or probable

Every type's used columns have an entry in the registry (with the data's statistics and the tooltips that print them); these are the ones whose meaning is settled or strongly supported.

effectType column meaning status
1 VitalModifier dataBits00 The Vital changed (15, 6, 8 most often: our Vital module's ids). probable
1 VitalModifier dataBits01 The amount, a signed 32-bit integer. probable
3 ForcedMove dataBits01 A distance in metres (a float). probable
3 ForcedMove dataBits02 A distance in metres (a float); used when set, else dataBits01. probable
4 CCStateSet dataBits00 The CCState applied (8 Knockdown in 2,291 rows, 21 Snare 604, 3 Disarm 398, 16 Knockback 369). established
4 CCStateSet dataBits03 Interrupt armor points this CC removes (1 in 4,424 rows; 0, 2, 5, -1 in others). Our InterruptArmor takes one point for a fixed list of CC states instead. probable
5 Transference dataBits02 A float multiplier of the base and unit parts (the client reads Transference's multiplier here, not in dataBits00). established
5 Transference dataBits03 An unsigned integer base of the value. established
5 Transference dataBits05 The share of the damage dealt that heals the caster (a float). probable
8 Damage dataBits00 A float multiplier of the base and unit parts of the value: (dataBits01 + unit part) x dataBits00. established
8 Damage dataBits01 An unsigned integer added to the unit part before the multiplier. established
10 Heal dataBits00 A float multiplier of the base and unit parts of the value: (dataBits01 + unit part) x dataBits00. established
10 Heal dataBits01 An unsigned integer added to the unit part before the multiplier. established
11 UnitPropertyModifier dataBits00 The UnitProperty2 id modified. established
11 UnitPropertyModifier dataBits02 A float multiplier of the property (1.2 = +20%). probable
11 UnitPropertyModifier dataBits03 A flat amount added to the property (a float). probable
12 DistanceDependentDamage dataBits00 A float multiplier of the base and unit parts of the value: (dataBits01 + unit part) x dataBits00. established
12 DistanceDependentDamage dataBits01 An unsigned integer added to the unit part before the multiplier. established
14 Proc dataBits01 The Spell4 cast when it fires. probable
14 Proc dataBits02 The chance per trigger (a float). probable
14 Proc dataBits04 Milliseconds between firings (0xFFFFFFFF none). probable
26 Proxy dataBits00 The Spell4 cast (a Spell4Base with dataBits08 = 1). established
26 Proxy dataBits01 The Spell4 a periodic Proxy casts each tick (designed reading). probable
26 Proxy dataBits04 Proxied casts per execution: 1, or 0xFFFFFFFF for one per target (designed reading). probable
26 Proxy dataBits06 A Prerequisite the caster must meet for the proxied cast (all 470 values are Prerequisite ids). probable
26 Proxy dataBits08 1: dataBits00 is a Spell4Base cast at the caster's tier. probable
29 Absorption dataBits01 A flat absorb amount, a float. probable
33 DistributedDamage dataBits00 A float multiplier of the base and unit parts of the value: (dataBits01 + unit part) x dataBits00. established
33 DistributedDamage dataBits01 An unsigned integer added to the unit part before the multiplier. established
42 QuestAdvanceObjective dataBits00 The Quest2 id. probable
42 QuestAdvanceObjective dataBits01 The 0-based index of the objective in the quest's objective list (objective0 to objective05 of Quest2). probable
42 QuestAdvanceObjective dataBits02 The amount the objective advances (1 in 248 rows, 2 in 3). probable
65 Teleport dataBits00 The WorldLocation2 (381 of 382 values name one). established
79 SpellEffectImmunity dataBits00 The SpellEffectType the holder is immune to. probable
80 SpellForceRemove dataBits00 1 Spell4GroupList, 2 Spell4, 3 Spell4Base (designed reading; only these three values occur). probable
80 SpellForceRemove dataBits01 The group, Spell4 or Spell4Base removed. probable
107 SetBusy dataBits00 1 busy, 0 not busy. probable
118 HealShields dataBits00 A float multiplier of the base and unit parts of the value: (dataBits01 + unit part) x dataBits00. established
118 HealShields dataBits01 An unsigned integer added to the unit part before the multiplier. established
138 DamageShields dataBits00 A float multiplier of the base and unit parts of the value: (dataBits01 + unit part) x dataBits00. established
138 DamageShields dataBits01 An unsigned integer added to the unit part before the multiplier. established

Generalisation test: established or probable values with rows we don't handle

effectType name unhandled errors sample ids
3 ForcedMove 735 of 4645 0 1536, 1611, 1613, 1615, 1619, 1621, 1623, 1627
4 CCStateSet 466 of 7185 0 2087, 2408, 2409, 4199, 4523, 5797, 7533, 7817
8 Damage 39 of 29445 0 852, 3138, 6512, 9960, 42958, 48887, 50037, 50097
9 FactionSet 186 of 186 0 429, 1323, 1432, 1529, 1766, 2796, 3259, 6741
11 UnitPropertyModifier 156 of 20105 0 2404, 2405, 2406, 61539, 61540, 61541, 72478, 81195
12 DistanceDependentDamage 10 of 10 0 48592, 53306, 53743, 53746, 55227, 55689, 65180, 81233
14 Proc 31 of 3498 0 4435, 35478, 53791, 92542, 106000, 115276, 117192, 117193
17 Fluff 74 of 10790 0 2272, 2273, 2279, 3848, 47738, 47739, 55557, 83649
19 ProxyLinearAE 521 of 521 0 45566, 45567, 45605, 45606, 45607, 45628, 45633, 45635
26 Proxy 31 of 16929 0 56946, 91343, 91344, 92627, 102265, 102370, 107666, 112387
31 Disguise 2 of 544 0 192730, 224745
33 DistributedDamage 123 of 123 0 2581, 2600, 4888, 4896, 5921, 6042, 6043, 6044
37 ReputationModify 70 of 70 0 5376, 7484, 7654, 44081, 44805, 45016, 46528, 46530
43 GiveItemToPlayer 38 of 38 0 7497, 7816, 36844, 37018, 37019, 45698, 66071, 66204
47 ThreatTransfer 32 of 32 0 6520, 6521, 6522, 65067, 67420, 67425, 67853, 70782
50 RewardPropertyModifier 197 of 197 0 6131, 6132, 6133, 9719, 9724, 10900, 10934, 10951
52 ModifyInterruptArmor 5 of 38 0 125840, 127966, 127967, 127968, 127969
65 Teleport 1 of 389 0 15653
73 ModifySpellCooldown 34 of 522 0 125955, 125969, 179929, 179932, 192334, 207203, 207204, 207205
79 SpellEffectImmunity 5 of 229 0 109176, 109178, 109179, 109181, 109183
92 AchievementAdvance 48 of 48 0 125982, 126234, 131694, 133317, 148835, 148840, 148844, 148866
94 ProxyChannelVariableTime 86 of 86 0 35137, 48688, 49051, 49052, 49053, 49054, 49055, 49059
95 FullScreenEffect 2 of 136 0 176759, 226958
97 DespawnUnit 328 of 855 0 51664, 52679, 56929, 64568, 67800, 68292, 68758, 70520
107 SetBusy 18 of 571 0 57281, 61306, 74691, 75082, 89986, 90026, 107602, 110632
111 PetCastSpell 191 of 191 0 70632, 72575, 72576, 72577, 72578, 72611, 72612, 72613
118 HealShields 10 of 262 0 89656, 105816, 127174, 127175, 127176, 127177, 127178, 127179
123 UnlockPetFlair 3 of 338 0 217918, 217919, 217920
138 DamageShields 5 of 5 0 216605, 216612, 216620, 216649, 217698
151 PersonalDmgHealMod 145 of 145 0 209687, 229586, 229593, 229625, 229626, 229627, 229639, 229640

Special cases (per-id code paths)

where kind ids issue
apps/bezgelor_world/lib/bezgelor_world/spell/designed_links.ex:26 id list attribute @links 26468, 42148, 25951, 78061 #238
apps/bezgelor_world/lib/bezgelor_world/zone/mounts.ex:61 id list attribute @riding_spells 52539, 80530 #238

Client differential

The client's own effect value formula runs under the Unicorn emulator (tools/semantics/effect_oracle.py, functions EffectValue (0x140565600), stat part (0x140566d40), unit part (0x140566ad0), LevelBudget (0x14041f1b0)) on sampled real rows and unit states (tools/semantics/effect_differential.py); apps/bezgelor_world/test/semantics/effect_differential_test.exs replays the recorded values against DamageCalculator.base_value/3 and level_budget/1. Types covered: 5, 8, 10, 12, 29, 33, 118, 138. Known differences: 1.

Differences the differential found and we fixed:

  • Absorption read dataBits00/01 as multiplier and base; the client reads no dataBits for it, and dataBits01 is a flat float (241 rows gave absorbs of about 10^9).
  • The stat part rounded up; the client rounds half away from zero.
  • Parameter type 18 squared its value; the client multiplies the level budget.
  • Heals and the other non-damage types took the caster's DamageDealtMultiplier as is; the client uses at least 1.
  • Non-player casters had no GameFormula 712 cap on the stat part.

Recorded differences:

  • The client keeps the stat part in a signed 16-bit integer (movsx eax, r10w after 0x140566d40); stat parts beyond 32,767 wrap there. Unreachable for player stats (about 5,000 at most); not reproduced (designed-values.md). 123 of the 13,080 recorded cases (creature casters with extreme stats).

Recorded: 13080 cases over 6540 of the 34083 eligible rows (client 1.7.8.16042, seed 20261012).

Open questions: values the data uses whose meaning is unknown

  • 7 Activate (2711 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 2708 spells.
  • 15 UnitStateSet (752 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 673 spells.
  • 23 ActionBarSet (405 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 389 spells.
  • 82 ChangeDisplayName (268 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 251 spells.
  • 55 ModifySpell (255 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 236 spells.
  • 2 SpellCounter (200 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 200 spells.
  • 51 SpellForceRemoveChanneled (175 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 104 spells.
  • 34 ChangePhase (161 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 157 spells.
  • 30 SapVital (142 rows): Read the 1 tooltip references to its columns (quoted in the column entries), then find the client code that reads the type.
  • 13 Script (104 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 104 spells.
  • 56 ModifySpellEffect (82 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 57 spells.
  • 89 NpcForceFacing (79 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 31 spells.
  • 60 ModifyCreatureFlags (75 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 72 spells.
  • 77 AggroImmune (67 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 67 spells.
  • 106 SummonTrap (64 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 58 spells.
  • 132 Disembark (63 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 63 spells.
  • 64 ShieldOverload (55 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 47 spells.
  • 32 SpellImmunity (53 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 32 spells.
  • 87 HazardModify (49 rows): Read the 1 tooltip references to its columns (quoted in the column entries), then find the client code that reads the type.
  • 100 MimicDisguise (33 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 33 spells.
  • 28 ForceFacing (32 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 32 spells.
  • 142 VectorSlide (30 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 30 spells.
  • 44 GiveLootTableToPlayer (29 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 29 spells.
  • 58 AddSpellEffect (25 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 14 spells.
  • 109 RestedXpDecorBonus (25 rows): No tooltip names its columns: find the client code that reads the type, or a retail capture of one of its 25 spells.
  • and 43 more with 348 rows between them: 0 None, 6 SummonVehicle, 16 Resurrect, 25 ProxyChannel, 41 TradeSkillProfession, 45 NpcLootTableModify, 48 WarplotTeleport, 49 CraftItem, 57 AddSpell, 59 SuppressSpellEffect, 62 VacuumLoot, 67 TitleRevoke, 68 VendorPriceModifier, 69 ApplyLASChanges, 75 ChangeIcon, 85 PathActionExplorerDig, 86 HazardEnable, 88 HazardSuspend, 93 PathXpModify, 99 MimicDisplayName, 101 GrantXP, 105 SettlerCampfire, 108 CooldownReset, 113 RewardBuffModifier, 117 NPCForceAIMovement, 119 PathMissionIncrement, 120 GrantLevelScaledXP, 121 DelayDeath, 122 GrantLevelScaledPrestige, 124 WarplotPlugUpgrade, 126 SetMatchingEligibility, 128 GiveAugmentPowerToPlayer, 129 TemporarilyUnflagPvp, 130 SupportStuck, 131 MiniMapIcon, 134 ModifyRestedXP, 135 HousingPlantSeed, 143 ClampVital, 144 HealingAbsorption, 145 UnitPropertyConversion, 146 ActivateSpellCooldown, 148 SharedHealthPool, 149 Kill.

Public event objectives

What each PublicEventObjective column, flag bit and objective type means, how sure we are, and which of our modules implement it. A row is handled generically when the public event engine (BezgelorWorld.PublicEvent) can progress it from a game event or the clock using only the row's own data; a row driven by a content script (a dungeon, expedition, battleground or arena script that names it by id) is counted as scripted, not handled.

Registry: apps/bezgelor_data/priv/semantics/public_event_objectives.json; table PublicEventObjective.

established probable hypothesis unknown total
publicEventObjectiveTypeEnum values 11 16 6 0 33
fields and flag values 15 9 11 21 56
per-type data columns 5 49 17 55 126

Coverage (data rows our implementation handles generically, from the generalisation test):

  • all rows: 1248 of 3703 (34%);
  • rows of established or probable values: 1198 of 3581 (33%);
  • special cases: 156 registered; the lint finds 156 per-id code paths in the implementation (0 unlisted).

Handled means our code has a generic route that could complete the row; whether that route is right is what the status says (a hypothesis can be handled by a reading the evidence contradicts).

Coverage by kind of event (an event belongs to the first definition file that names it; no_definition events have none and cannot be started on this server, no_event_row objectives name an event the client table lacks):

events event rows objectives handled generically scripted no event row not handled
battleground_arena 7 26 3 18 0 5
dungeon 145 1159 432 139 0 588
expedition 9 207 125 1 0 81
no_definition 349 2041 537 0 0 1504
no_event_row 16 93 0 0 93 0
open_world 63 177 151 0 0 26
publicEventObjectiveTypeEnum name status rows handled scripted consumers
0 KillTargetGroup established 269 85% 0 BezgelorWorld.PublicEvent.unit_killed/6, BezgelorWorld.Quest.Relations.target_groups/1 +2
1 KillEventUnit probable 26 12% 0 BezgelorWorld.PublicEvent.unit_killed/6, BezgelorWorld.PublicEvent.add_unit/4
2 CollectItem hypothesis 6 0% 0 BezgelorWorld.PublicEvent.credit/4
3 ActivateTargetGroup established 253 93% 0 BezgelorWorld.PublicEvent.credit/4, BezgelorWorld.Zone.PublicEvents.creature_used/5
4 ActivateTargetGroupChecklist established 102 88% 3 BezgelorWorld.PublicEvent.credit/4, BezgelorWorld.ClientObjectiveDisplay
5 Script established 1068 1% 111 BezgelorWorld.PublicEvent.advance/5, BezgelorWorld.Zone.PublicEvents.script_op/5 +1
6 ParticipantsInTriggerVolume established 245 67% 0 BezgelorWorld.PublicEvent.tick/3, BezgelorWorld.Zone.PublicEvents.presence/2
7 InteractDepot established 45 93% 0 BezgelorWorld.PublicEvent.credit/4, BezgelorWorld.Zone.PublicEvents.creature_used/5
8 KillEventObjectiveUnit probable 268 7% 0 BezgelorWorld.PublicEvent.unit_killed/6, BezgelorWorld.PublicEvent.add_unit/4 +1
9 ScriptWithoutCount probable 132 2% 9 BezgelorWorld.PublicEvent.advance/5
10 KillOtherTeam hypothesis 2 0% 0
11 ControlPointDefend hypothesis 9 0% 0
12 DefendObjectiveUnit probable 68 0% 0 BezgelorWorld.PublicEvent.defend_lost/4, BezgelorWorld.PublicEvent.add_unit/4
13 TimedWin established 213 95% 0 BezgelorWorld.PublicEvent.tick/3, BezgelorWorld.ClientObjectiveDisplay
14 KillClusterTargetGroup hypothesis 57 86% 0 BezgelorWorld.PublicEvent.unit_killed/6
15 KillClusterEventUnit hypothesis 4 25% 0 BezgelorWorld.PublicEvent.unit_killed/6
16 KillClusterEventObjectiveUnit hypothesis 44 0% 1 BezgelorWorld.PublicEvent.unit_killed/6
17 TalkTo established 159 99% 0 BezgelorWorld.PublicEvent.credit/4, BezgelorWorld.Zone.PublicEvents.creature_used/5
18 TalkToChecklist established 11 91% 0 BezgelorWorld.PublicEvent.credit/4, BezgelorWorld.ClientObjectiveDisplay
19 Turnstile established 67 0% 1 BezgelorWorld.ClientObjectiveDisplay
20 Exterminate probable 350 11% 0 BezgelorWorld.PublicEvent.unit_killed/6, BezgelorWorld.PublicEvent.add_unit/4 +1
21 ResourcePool probable 73 0% 16
22 VirtualCollect probable 34 0% 0
23 ContestedArea probable 1 0% 0
24 State probable 1 0% 0
25 ScriptWithoutMax established 136 0% 10 BezgelorWorld.PublicEvent.advance/5, BezgelorWorld.PublicEvent.set_count/4
26 GatherResource probable 4 0% 2 BezgelorWorld.PublicEvent.advance/5
27 CapturePointDefend probable 17 0% 0 BezgelorWorld.PublicEvent.status_view/1, BezgelorWorld.PublicEvent.set_owner/4 +1
28 VirtualItemDeposit probable 10 0% 0
30 CapturePoint probable 14 0% 3 BezgelorWorld.PublicEvent.set_owner/4, BezgelorWorld.PublicEvent.status_view/1
31 BombDeployment probable 6 0% 0
32 VictoryPool probable 8 0% 2 BezgelorWorld.PublicEvent.set_count/4, BezgelorWorld.PublicEvent.status_view/1
34 HardMode probable 1 0% 0

Types in the client's PublicEventObjectiveType enum that no PublicEventObjective row uses (0) are in the registry but not in this table.

Per-type data columns: established or probable

Every type's used columns have an entry in the registry (with the data's statistics and the tooltips that print them); these are the ones whose meaning is settled or strongly supported.

publicEventObjectiveTypeEnum column meaning status
0 KillTargetGroup count Kills needed. probable
0 KillTargetGroup failureTimeMs A countdown from the objective's activation: the objective fails when it runs out. probable
0 KillTargetGroup objectId The TargetGroup whose members count. established
0 KillTargetGroup worldLocation2Id The marker the tracker points at (hint arrow, minimap). probable
1 KillEventUnit count Kills needed; 0 in 3 rows (all event units). probable
2 CollectItem count Pickups needed. probable
3 ActivateTargetGroup count Activations needed. probable
3 ActivateTargetGroup failureTimeMs Milliseconds after activation at which the objective fails; the tracker shows the countdown. probable
3 ActivateTargetGroup objectId The TargetGroup whose members count when activated. established
3 ActivateTargetGroup worldLocation2Id The WorldLocation2 the tracker points at (hint arrow, minimap marker). probable
4 ActivateTargetGroupChecklist count Number of distinct targets. probable
4 ActivateTargetGroupChecklist objectId The TargetGroup of the targets. probable
5 Script count Steps the script advances; 0 when the objective is a pass/fail medal. probable
5 Script failureTimeMs Countdown; with a Challenge/Optional category it is a time medal ("complete within 23 minutes"). probable
5 Script worldLocation2Id Marker; enter scripts use it as the area to stand in. probable
6 ParticipantsInTriggerVolume count Participants needed; 0 means every member. probable
6 ParticipantsInTriggerVolume failureTimeMs Milliseconds after activation at which the objective fails; the tracker shows the countdown. probable
6 ParticipantsInTriggerVolume worldLocation2Id The area (position and radius) the participants must be in. probable
7 InteractDepot count Interactions needed (items deposited). probable
7 InteractDepot objectId PublicEventDepot id (its creature2Id is the depot unit, item2Id the item). established
8 KillEventObjectiveUnit count Units to kill; 0: all the objective's units (dynamic max). probable
8 KillEventObjectiveUnit publicEventObjectiveTypeSpecificFlags 0x2: draw a health bar (150 rows); 0x40 in 16 rows unknown. probable
9 ScriptWithoutCount count Mostly 0. probable
9 ScriptWithoutCount failureTimeMs Milliseconds after activation at which the objective fails; the tracker shows the countdown. probable
12 DefendObjectiveUnit count Units to keep alive; 0: the dynamic max. probable
12 DefendObjectiveUnit publicEventObjectiveTypeSpecificFlags 0x2: health bar (37 rows). probable
13 TimedWin failureTimeMs The time after which the objective succeeds. established
13 TimedWin worldLocation2Id The WorldLocation2 the tracker points at (hint arrow, minimap marker). probable
14 KillClusterTargetGroup objectId TargetGroup of the units. probable
16 KillClusterEventObjectiveUnit publicEventObjectiveTypeSpecificFlags 0x2 in 5 rows (health bar). probable
17 TalkTo count Conversations needed; 0 in 22 rows (one). probable
17 TalkTo objectId The TargetGroup of the creatures to talk to (the engine also accepts a Creature2 id). established
17 TalkTo worldLocation2Id The WorldLocation2 the tracker points at (hint arrow, minimap marker). probable
18 TalkToChecklist count Distinct conversations needed. probable
18 TalkToChecklist objectId TargetGroup of the creatures (11 of 11 resolve). probable
19 Turnstile count Participants needed. probable
19 Turnstile worldLocation2Id The WorldLocation2 the tracker points at (hint arrow, minimap marker). probable
20 Exterminate count 0: all units (dynamic). probable
20 Exterminate publicEventObjectiveTypeSpecificFlags 0x2 (24 rows) health bar; 0x40 (11 rows) unknown. probable
21 ResourcePool count The pool's maximum. probable
22 VirtualCollect count Items needed. probable
22 VirtualCollect objectId PublicEventVirtualItem id. probable
25 ScriptWithoutMax count Ignored by the display (0 in 122 rows). probable
25 ScriptWithoutMax failureTimeMs Milliseconds after activation at which the objective fails; the tracker shows the countdown. probable
26 GatherResource count Resources needed (5). probable
26 GatherResource objectId PublicEventObjectiveGatherResource id. probable
27 CapturePointDefend count Thousandths of the required amount. probable
27 CapturePointDefend objectId A TargetGroup in 17 of 17 rows. probable
28 VirtualItemDeposit count Items to deposit (15 to 200). probable
28 VirtualItemDeposit objectId PublicEventVirtualItemDepot id. probable
28 VirtualItemDeposit worldLocation2Id The WorldLocation2 the tracker points at (hint arrow, minimap marker). probable
30 CapturePoint objectId A TargetGroup in 14 of 14 rows (Halls of the Bloodsworn rounds use 14413). probable
31 BombDeployment objectId PublicEventObjectiveBombDeployment id. probable
32 VictoryPool count Thousandths of the required points. probable

Generalisation test: established or probable values with rows we don't handle

publicEventObjectiveTypeEnum name unhandled errors sample ids
0 KillTargetGroup 24 of 269 0 519, 521, 523, 525, 526, 527, 532, 533
1 KillEventUnit 21 of 26 0 748, 789, 965, 984, 1053, 1054, 1055, 1056
3 ActivateTargetGroup 15 of 253 0 407, 528, 529, 530, 531, 536, 537, 538
4 ActivateTargetGroupChecklist 3 of 102 0 403, 404, 3079
5 Script 932 of 1068 0 35, 36, 41, 42, 43, 44, 54, 60
6 ParticipantsInTriggerVolume 80 of 245 0 267, 790, 1273, 1438, 1456, 1489, 1585, 1615
8 KillEventObjectiveUnit 245 of 268 0 13, 37, 179, 185, 194, 202, 218, 253
9 ScriptWithoutCount 118 of 132 0 275, 309, 489, 814, 878, 879, 883, 884
12 DefendObjectiveUnit 62 of 68 0 236, 238, 239, 243, 252, 752, 753, 808
13 TimedWin 3 of 213 0 2057, 4570, 5161
19 Turnstile 65 of 67 0 269, 517, 520, 522, 524, 579, 581, 590
20 Exterminate 310 of 350 0 50, 63, 64, 65, 67, 68, 75, 77
21 ResourcePool 55 of 73 0 311, 408, 762, 763, 797, 798, 1027, 1492
22 VirtualCollect 32 of 34 0 656, 952, 953, 1265, 1584, 1645, 1741, 1748
23 ContestedArea 1 of 1 0 760
25 ScriptWithoutMax 124 of 136 0 877, 972, 1123, 1126, 1152, 1153, 1154, 1155
26 GatherResource 2 of 4 0 881, 882
27 CapturePointDefend 17 of 17 0 971, 973, 974, 1002, 1003, 1312, 1313, 1401
28 VirtualItemDeposit 8 of 10 0 59, 1726, 1734, 1933, 1936, 1937, 1997, 2544
30 CapturePoint 11 of 14 0 1357, 1358, 1359, 1415, 1416, 1417, 1605, 1606
31 BombDeployment 5 of 6 0 1447, 1530, 1725, 1839, 1840
32 VictoryPool 5 of 8 0 1168, 1393, 1403, 2663, 2664
34 HardMode 1 of 1 0 5268

Special cases (per-id code paths)

where kind ids issue
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:93 event objective id in a content script @vortex_objective %{alpha: 395, beta: 396, delta: 397} 395, 396, 397 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:94 event objective id in a content script @datacore %{alpha: 386, beta: 2048, delta: 2049} 386, 2048, 2049 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:95 event objective id in a content script @memory_core 398 398 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:96 event objective id in a content script @immortal_guardian %{earth: 2584, water: 2585, fire: 2586, logic: 2587, air: 2651, life: 2652} 2584, 2585, 2586, 2587, 2651, 2652 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:99 event objective id in a content script {:earth, :air} => 2506, 2506 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:100 event objective id in a content script {:earth, :fire} => 2507, 2507 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:101 event objective id in a content script {:earth, :logic} => 2508, 2508 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:102 event objective id in a content script {:water, :air} => 2509, 2509 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:103 event objective id in a content script {:water, :fire} => 2510, 2510 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:104 event objective id in a content script {:water, :logic} => 2511, 2511 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:105 event objective id in a content script {:life, :air} => 2523, 2523 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:106 event objective id in a content script {:life, :fire} => 2524, 2524 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:107 event objective id in a content script {:life, :logic} => 2525 2525 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:112 event objective id in a content script "" => {385, [2503], 2579}, 385, 2503, 2579 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:113 event objective id in a content script "" => {390, [2504], 2580}, 390, 2504, 2580 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:114 event objective id in a content script "" => {393, [2505], 2581}, 393, 2505, 2581 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:115 event objective id in a content script "" => {394, [2522], 2588}, 394, 2522, 2588 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:116 event objective id in a content script "" => {392, [], 2589}, 392, 2589 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:117 event objective id in a content script "" => {399, [2512], 2583} 399, 2512, 2583 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:119 event objective id in a content script @probe_anchors [{{618.86, -204.5, -508.14}, 648}, {{952.0, -205.0, -174.0}, 649}, {{619.0, -205.0, 159.0}, 650}] 648, 649, 650 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:123 event objective id in a content script @havok_objective 2521 2521 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:125 event objective id in a content script @cool_running 2518 2518 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:127 event objective id in a content script @defy_perspective 2526 2526 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:129 event objective id in a content script @firewalker 2519 2519 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:183 event objective id in a content script (if daemons?, do: [{:public_event, :advance, @event, 385, 1}] ++ oculus_gear(), else: []) ++ 385 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape.ex:483 event objective id in a content script spell4_id == @ragnarok -> fail(ctx, 2507, "") 2507 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/avatus.ex:43 event objective id in a content script @rooms_75 [{:yellow, 46_267, 2513}, {:green, 32_272, 2516}] 2513, 2516 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/avatus.ex:44 event objective id in a content script @rooms_50 [{:red, 46_268, 2515}, {:blue, 46_266, 2514}] 2515, 2514 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/avatus.ex:47 event objective id in a content script @room_amount %{2516 => 18} 2516 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/avatus.ex:48 event objective id in a content script @tactical_strike 2515 2515 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/gloomclaw.ex:39 event objective id in a content script @shield_objective 1557 1557 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/gloomclaw.ex:40 event objective id in a content script @clock_objective 1572 1572 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/gloomclaw.ex:41 event objective id in a content script @essence_objectives [1570, 1571, 1582, 1583] 1570, 1571, 1582, 1583 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/gloomclaw.ex:175 event objective id in a content script {:signal, :map, :challenge_failed, %{objective: 2505, why: ""}}, 2505 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/gloomclaw.ex:222 event objective id in a content script {raid ++ [{:signal, :map, :challenge_failed, %{objective: 2505, why: ""}}], %{s | corruption: clock, ruptures: s.ruptures + 1}} 2505 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/limbo_infomatrix.ex:50 event objective id in a content script @dehydration_objective 2609 2609 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/maelstrom_authority.ex:37 event objective id in a content script @meter_objective 1619 1619 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/maelstrom_authority.ex:217 event objective id in a content script {:signal, :map, :challenge_failed, %{objective: 2504, why: ""}}, 2504 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/system_daemons.ex:64 event objective id in a content script @firewall_objective 1465 1465 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/system_daemons.ex:576 event objective id in a content script do: [{:signal, :map, :challenge_failed, %{objective: 2503, why: "" <> why}}], 2503 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/volatility_lattice.ex:37 event objective id in a content script @power_objective 1817 1817 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/datascape/volatility_lattice.ex:189 event objective id in a content script {[{:despawn, {:spawned, tag}}, {:signal, :map, :challenge_failed, %{objective: 2522, why: ""}}] ++ fallen, 2522 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/evil_from_the_ether.ex:23 event objective id in a content script @dont_get_hit 4942 4942 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:58 event objective id in a content script @seal %{56_174 => 2388, 56_106 => 2389, 54_935 => 2390, 55_066 => 2391} 2388, 2389, 2390, 2391 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:62 event objective id in a content script "" => {410, [2702], 2572}, 410, 2702, 2572 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:63 event objective id in a content script "" => {412, [2498], 2573}, 412, 2498, 2573 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:64 event objective id in a content script "" => {411, [2499, 2615], 2574}, 411, 2499, 2615, 2574 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:65 event objective id in a content script "" => {413, [2500, 2602, 2603, 2604], 2575}, 413, 2500, 2602, 2603, 2604, 2575 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:66 event objective id in a content script "" => {416, [2501], 2576}, 416, 2501, 2576 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:67 event objective id in a content script "" => {415, [2502], 2577} 415, 2502, 2577 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:69 event objective id in a content script @prototype_challenges [2500, 2602, 2603, 2604] 2500, 2602, 2603, 2604 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:70 event objective id in a content script @merely 2605 2605 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:210 event objective id in a content script spell4_id == @forced_production -> fail(ctx, 2604, "") 2604 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives.ex:212 event objective id in a content script spell4_id in @deadly_dance -> fail(ctx, 2498, "") 2498 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives/dreadphage_ohmna.ex:40 event objective id in a content script @cores %{2157 => {2792.5, -446.7, -199.3}, 2158 => {2879.5, -447.4, -112.0}, 2159 => {2792.8, -447.0, -28.4}, 2160 => {2707.2, -447.4, -111.3}} 2157, 2158, 2159, 2160 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/genetic_archives/dreadphage_ohmna.ex:177 event objective id in a content script [{:set_damage_scale, :self, base * :math.pow(@empower, drained)}, {:signal, :map, :challenge_failed, %{objective: 2502, why: ""}}] ++ 2502 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/halls_of_the_bloodsworn.ex:48 event objective id in a content script @points_objective %{0 => 5170, 1 => 5171} 5170, 5171 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/halls_of_the_bloodsworn.ex:50 event objective id in a content script @round_objective %{1 => 5173, 2 => 5174, 3 => 5203} 5173, 5174, 5203 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/halls_of_the_bloodsworn.ex:51 event objective id in a content script @prep_objective %{1 => 5157, 2 => 5159, 3 => 5175} 5157, 5159, 5175 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/halls_of_the_bloodsworn.ex:52 event objective id in a content script @fight_objective %{1 => 5158, 2 => 5160, 3 => 5176} 5158, 5160, 5176 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:37 event objective id in a content script @initiation 4341 4341 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:38 event objective id in a content script @timer_bonus 4960 4960 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:43 event objective id in a content script {"", 4342}, 4342 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:44 event objective id in a content script {"", 4496}, 4496 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:45 event objective id in a content script {"", 4495}, 4495 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:46 event objective id in a content script {"", 4497}, 4497 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:47 event objective id in a content script {"", 4498}, 4498 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:48 event objective id in a content script {"", 4499}, 4499 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:49 event objective id in a content script {"", 4346} 4346 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:55 event objective id in a content script @immortal 4436 4436 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:56 event objective id in a content script @deathless 5156 5156 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:57 event objective id in a content script @cant_hold 4437 4437 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:58 event objective id in a content script @dodge 4438 4438 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:59 event objective id in a content script @meteor 4439 4439 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:60 event objective id in a content script @shard 4487 4487 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:61 event objective id in a content script @defuse 4517 4517 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:62 event objective id in a content script @just_right 4518 4518 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:63 event objective id in a content script @bustle 4519 4519 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:64 event objective id in a content script @cleanup 4934 4934 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:65 event objective id in a content script @bother_bots 4935 4935 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:66 event objective id in a content script @flameling_finisher 4936 4936 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:67 event objective id in a content script @vet_only [4930, 4931, 4932, 4933, 4934, 4935, 4936] 4930, 4931, 4932, 4933, 4934, 4935, 4936 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:68 event objective id in a content script @unbuilt [4930, 4931, 4932, 4933] 4930, 4931, 4932, 4933 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/protogames_academy.ex:262 event objective id in a content script ensure(ctx, 4346) ++ 4346 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:37 event objective id in a content script @briefing 1695 1695 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:38 event objective id in a content script @timer_bonus 3202 3202 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:41 event objective id in a content script @deathless 845 845 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:42 event objective id in a content script @dodging 847 847 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:43 event objective id in a content script @bone_dancing 975 975 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:44 event objective id in a content script @sky_falling 976 976 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:45 event objective id in a content script @trogun_man 977 977 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:67 event objective id in a content script @trogun_objective 449 449 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:68 event objective id in a content script @challenges [845, 847, 975, 976, 977] 845, 847, 975, 976, 977 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ruins_of_kel_voreth.ex:411 event objective id in a content script def on_objective_status(459, 5, _ctx), do: [{:signal, :map, :defenses_down, nil}] 459 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:42 event objective id in a content script @timer_bonus 3204 3204 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:44 event objective id in a content script @selene_objective 492 492 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:46 event objective id in a content script @deathless 1506 1506 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:47 event objective id in a content script @no_falling 2211 2211 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:48 event objective id in a content script @full_health 2212 2212 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:49 event objective id in a content script @resonance 2383 2383 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:50 event objective id in a content script @molten 2384 2384 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:51 event objective id in a content script @splatter 2385 2385 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:52 event objective id in a content script @heartseeker 2386 2386 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:53 event objective id in a content script @blink 2387 2387 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:54 event objective id in a content script @prisoner_objective 1504 1504 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:55 event objective id in a content script @spores_objective 497 497 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:56 event objective id in a content script @challenges [1504, 1506, 2211, 2212, 2383, 2384, 2385, 2386, 2387] 1504, 1506, 2211, 2212, 2383, 2384, 2385, 2386 ... #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:222 event objective id in a content script {[{:public_event, :activate, @ritual, 677}, {:timer, {:wave, 1}, 500}], %{state | ritual: :running}} 677 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:300 event objective id in a content script {[{:public_event, :advance, @ritual, 677, 1}] ++ hurt ++ lost ++ next ++ done, state} 677 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden.ex:393 event objective id in a content script {:public_event, :advance, @event, 655, 1}, 655 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden_bosses.ex:21 event objective id in a content script def on_objective_status(482, 3, _ctx), do: [{:signal, :map, "", nil}] 482 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/sanctuary_of_the_swordmaiden_bosses.ex:30 event objective id in a content script def on_objective_status(678, 1, _ctx), do: [{:signal, :map, "", nil}] 678 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:44 event objective id in a content script @timer_bonus 3203 3203 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:47 event objective id in a content script @chasm 339 339 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:48 event objective id in a content script @cavern 340 340 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:49 event objective id in a content script @obj_thunderfoot 322 322 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:50 event objective id in a content script @obj_octog 323 323 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:51 event objective id in a content script @obj_mordechai 324 324 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:52 event objective id in a content script @obj_chasm_crossed 329 329 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:53 event objective id in a content script @obj_escort 328 328 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:54 event objective id in a content script @obj_jailors 336 336 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:55 event objective id in a content script @obj_essences 337 337 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:56 event objective id in a content script @obj_nodes 338 338 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:57 event objective id in a content script @obj_cavern_heat 838 838 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:58 event objective id in a content script @obj_laveka 839 839 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:59 event objective id in a content script @obj_deathless 840 840 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:60 event objective id in a content script @obj_time 841 841 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:61 event objective id in a content script @obj_tugga_diet 941 941 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:62 event objective id in a content script @obj_jump 942 942 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:63 event objective id in a content script @obj_bosun 943 943 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:64 event objective id in a content script @obj_starin 944 944 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:65 event objective id in a content script @obj_kill_enemies 5345 5345 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/skullcano.ex:66 event objective id in a content script @challenges [838, 839, 840, 841, 941, 942, 943, 944] 838, 839, 840, 841, 941, 942, 943, 944 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:49 event objective id in a content script @obj_blade_wind 312 312 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:50 event objective id in a content script @obj_aethros 313 313 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:51 event objective id in a content script @obj_stormtalon 314 314 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:52 event objective id in a content script @obj_arena 540 540 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:53 event objective id in a content script @obj_data_altar 555 555 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:54 event objective id in a content script @obj_breeze_binder 556 556 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:55 event objective id in a content script @obj_drift_catcher 828 828 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:56 event objective id in a content script @obj_deathless 842 842 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:57 event objective id in a content script @obj_tornado_chasing 844 844 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:58 event objective id in a content script @obj_stormchaser 2380 2380 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:59 event objective id in a content script @obj_swift_sweeper 2381 2381 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:60 event objective id in a content script @obj_swift_sweeper_wave 2487 2487 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:61 event objective id in a content script @obj_lightning_reflexes 2382 2382 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:62 event objective id in a content script @obj_timer_bonus 3201 3201 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/stormtalons_lair.ex:63 event objective id in a content script @obj_kill_enemies 5343 5343 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/the_slaughterdome.ex:34 event objective id in a content script @objective %{0 => 739, 1 => 740} 739, 740 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/the_slaughterdome.ex:37 event objective id in a content script 2 => %{event: 209, prepare: 766, fight: 767}, 766, 767 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/the_slaughterdome.ex:38 event objective id in a content script 3 => %{event: 210, prepare: 768, fight: 769}, 768, 769 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/the_slaughterdome.ex:39 event objective id in a content script 5 => %{event: 211, prepare: 770, fight: 771} 770, 771 #243
apps/bezgelor_world/lib/bezgelor_world/scripts/ultimate_protogames.ex:34 event objective id in a content script @start_objective 3250 3250 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ultimate_protogames.ex:392 event objective id in a content script extra = if enc == "", do: [{:public_event, :advance, @event, 4669, 1}], else: [] 4669 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/ultimate_protogames.ex:637 event objective id in a content script counted_done and room.kills <= done_kills[""] -> for(m <- cfg[""] || [], m != 4669, do: {:public_event, :advance, @event, m, 1}) 4669 #242
apps/bezgelor_world/lib/bezgelor_world/scripts/walatiki_temple.ex:36 event objective id in a content script @objective %{0 => 775, 1 => 776} 775, 776 #243

Client differential

The client's own display methods of PublicEventObjective (GetCount (0x14068E110), GetRequiredCount (0x14068EF30), ShowPercent (0x14068ED90), ShowHealthBar (0x14068EE80), ShouldShowRequiredCount (0x1406908B0), IsHidden (0x140690730), GetTotalTime (0x14068E020), GetMedalPoints (0x140690E80), ShouldShowOnMinimap / Edge (0x140690330 / 0x140690410)) run under the Unicorn emulator (tools/semantics/objective_oracle.py, via tools/semantics/objective_differential.py) on a fake objective built from a row and a status; apps/bezgelor_world/test/semantics/objective_differential_test.exs replays what the client answered for sampled real rows and a synthetic grid of every type, flag and status shape against BezgelorWorld.ClientObjectiveDisplay, our model of what the tracker shows. Known differences: 3.

Differences the differential found and we fixed:

  • Checklist objectives (types 4 and 18) were sent as a plain count; the client reads the status count as a bitmask and shows its number of set bits (3 showed 2 entries, 4 showed 1, 5 showed 2). They now send a bitmask with that many low bits set.
  • The client reads the table count as a signed 32-bit number: 8 rows hold 4294967295 and read as -1 (dungeon briefing talk-to objectives, whose definitions override the count).

Recorded differences:

  • Exterminate (type 20) objectives with count 0: the tracker prints "Remaining: GetCount", which expects the count to be the units left; the engine sends units killed as the count and alive + killed as the dynamic max, so the tracker reads "n of m". Designed; both complete correctly (designed-values.md).
  • The oracle replaces the lookup chain in front of the objective (the Lua userdata, the manager's vtable +0x30), the owning event's busy flag and team size, the live event record (value 7) and the game clock; the display rules are the client's.
  • A TimedWin objective with flag 0x4000 and no failure time divides by zero in the client; no row has the combination, and the model returns 0.

Recorded: 2400 cases over 600 of the 3703 eligible rows and 2340 grid cases (client 1.7.8.16042, seed 20261012).

Creature default properties (max health)

A creature's unit properties are not sent by the client tables alone: the server derives them from the creature's level row (CreatureLevel), its archetype, difficulty and tier multipliers, and the creature's own values (Creature2OverrideProperties). The server sends the result (BaseHealth is the creature's maximum health). NexusForever's model is the multiplied level row; the retail captures show that max health also adds 14 per point of Stamina and that an override replaces the default as it stands. Coverage here counts the captured (creature, level) pairs whose Health the formula reproduces.

Registry: apps/bezgelor_data/priv/semantics/creature_properties.json; table CreatureLevel, Creature2ArcheType, Creature2Difficulty, Creature2Tier, Creature2OverrideProperties.

established probable hypothesis unknown total
UnitProperty2 values 2 0 0 0 2
fields and flag values 1 1 0 0 2

Coverage (tools/ground_truth/reconcile.py over the NexusForever retail captures: a captured (creature, level) pair is handled when the formula gives its Health (within 1.5%)):

  • all captures: 8616 of 8734 (99%);
  • captures of established or probable values: 8616 of 8734 (99%);
  • special cases: 0 registered; the lint finds 0 per-id code paths in the implementation (0 unlisted).

Handled means our code has a generic route that could complete the capture; whether that route is right is what the status says (a hypothesis can be handled by a reading the evidence contradicts).

UnitProperty2 name status captures handled consumers
7 BaseHealth established 8734 99% BezgelorWorld.CreatureProperties.max_health/2
40 Stamina established 0 BezgelorWorld.CreatureProperties.property/3

Fields

field meaning status
Creature max health MaxHealth = BaseHealth' + 14 x Stamina', where X' is the creature's Creature2OverrideProperties value for X (as it stands, no multipliers) when it has one, else CreatureLevel[level].X x Creature2ArcheType x Creature2Difficulty x Creature2Tier multiplier for X. The server sends it as the creature's BaseHealth property (7) and its Health at spawn. established
Creature2OverrideProperties Per-creature UnitProperty2 values (creature2Id, unitPropertyIndex, unitPropertyValue; 15,365 rows, 5,864 creatures). For BaseHealth and Stamina the value replaces the creature's default as it stands, without the archetype, difficulty and tier multipliers. The other properties (interrupt armor, move speed, recharge, regen, armor) are not yet checked. probable

Generalisation test: established or probable values with captures we don't handle

UnitProperty2 name unhandled errors sample ids
7 BaseHealth 118 of 8734 0 13398, 17327, 17328, 31212, 31213, 33870, 48593, 50868

Special cases (per-id code paths)

The lint finds none in apps/bezgelor_world/lib/bezgelor_world/creature_properties.ex.

Updated automatically from the registry data; see how.