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.