Skip to main content

wowlab_parsers/parsers/dbc/rows/
trait_tree.rs

1// #t(file: rust_duplicate_strings) DBC field attributes repeat an upstream-schema ownership reason that Rust requires as a literal.
2
3use serde::Deserialize;
4use wowlab_engine_macros::{HasFk, HasId};
5
6/// DBC row from TraitNode.db2: talent tree node position and type.
7#[derive(Clone, Debug, Deserialize, HasId)]
8#[allow(
9    non_snake_case,
10    reason = "fields mirror upstream DBC CSV headers exactly"
11)]
12pub struct TraitNodeRow {
13    pub ID: i32,
14    pub TraitTreeID: i32,
15    pub PosX: i32,
16    pub PosY: i32,
17    pub Type: i32,
18    pub Flags: i32,
19    pub TraitSubTreeID: i32,
20}
21
22/// DBC row from TraitNodeEntry.db2: a node entry linking to a spell or trait definition.
23#[derive(Clone, Debug, Deserialize, HasId)]
24#[allow(
25    non_snake_case,
26    reason = "fields mirror upstream DBC CSV headers exactly"
27)]
28pub struct TraitNodeEntryRow {
29    pub ID: i32,
30    pub TraitDefinitionID: i32,
31    pub MaxRanks: i32,
32    pub NodeEntryType: i32,
33    pub TraitSubTreeID: i32,
34}
35
36/// DBC row from TraitNodeXTraitNodeEntry.db2: maps nodes to their entries.
37#[derive(Clone, Debug, Deserialize, HasFk)]
38#[allow(
39    non_snake_case,
40    reason = "fields mirror upstream DBC CSV headers exactly"
41)]
42#[fk_field = "TraitNodeID"]
43pub struct TraitNodeXTraitNodeEntryRow {
44    pub ID: i32,
45    pub TraitNodeID: i32,
46    pub TraitNodeEntryID: i32,
47    #[serde(rename = "_Index")]
48    pub Index: i32,
49}
50
51/// DBC row from TraitDefinition.db2: talent definition with spell and override data.
52#[derive(Clone, Debug, Deserialize, HasId)]
53#[allow(
54    non_snake_case,
55    reason = "fields mirror upstream DBC CSV headers exactly"
56)]
57pub struct TraitDefinitionRow {
58    pub OverrideName_lang: Option<String>,
59    pub OverrideSubtext_lang: Option<String>,
60    pub OverrideDescription_lang: Option<String>,
61    pub ID: i32,
62    pub SpellID: i32,
63    pub OverrideIcon: i32,
64    pub OverridesSpellID: i32,
65    pub VisibleSpellID: i32,
66}
67
68/// DBC row mapping a talent effect to its rank-value curve.
69#[derive(Clone, Debug, Deserialize, HasFk)]
70#[allow(
71    non_snake_case,
72    reason = "fields mirror upstream DBC CSV headers exactly"
73)]
74#[fk_field = "TraitDefinitionID"]
75pub struct TraitDefinitionEffectPointsRow {
76    pub ID: i32,
77    pub TraitDefinitionID: i32,
78    pub EffectIndex: i32,
79    pub OperationType: i32,
80    pub CurveID: i32,
81}
82
83/// DBC row from TraitTreeLoadout.db2: default talent loadout for a spec.
84#[derive(Clone, Debug, Deserialize, HasId)]
85#[allow(
86    non_snake_case,
87    reason = "fields mirror upstream DBC CSV headers exactly"
88)]
89pub struct TraitTreeLoadoutRow {
90    pub ID: i32,
91    pub TraitTreeID: i32,
92    pub ChrSpecializationID: i32,
93}
94
95/// DBC row from TraitTreeLoadoutEntry.db2: individual node rank in a default loadout.
96#[derive(Clone, Debug, Deserialize, HasFk)]
97#[allow(
98    non_snake_case,
99    reason = "fields mirror upstream DBC CSV headers exactly"
100)]
101#[fk_field = "TraitTreeLoadoutID"]
102pub struct TraitTreeLoadoutEntryRow {
103    pub ID: i32,
104    pub TraitTreeLoadoutID: i32,
105    pub SelectedTraitNodeID: i32,
106    pub SelectedTraitNodeEntryID: i32,
107    pub NumPoints: i32,
108    pub OrderIndex: i32,
109}
110
111/// DBC row from TraitEdge.db2: directed edge between two talent nodes.
112#[derive(Clone, Debug, Deserialize, HasFk)]
113#[allow(
114    non_snake_case,
115    reason = "fields mirror upstream DBC CSV headers exactly"
116)]
117#[fk_field = "LeftTraitNodeID"]
118pub struct TraitEdgeRow {
119    pub ID: i32,
120    pub VisualStyle: i32,
121    pub LeftTraitNodeID: i32,
122    pub RightTraitNodeID: i32,
123    pub Type: i32,
124}
125
126/// DBC row from TraitSubTree.db2: hero talent sub-tree within a talent tree.
127#[derive(Clone, Debug, Deserialize, HasId)]
128#[allow(
129    non_snake_case,
130    reason = "fields mirror upstream DBC CSV headers exactly"
131)]
132pub struct TraitSubTreeRow {
133    pub Name_lang: Option<String>,
134    pub Description_lang: Option<String>,
135    pub ID: i32,
136    pub UiTextureAtlasElementID: i32,
137    pub TraitTreeID: i32,
138}
139
140/// DBC row from SkillLineXTraitTree.db2: links a skill line to its live trait tree.
141///
142/// Only trees referenced here are active; superseded trees keep their `TraitTreeLoadout` rows but lose their skill-line link.
143#[derive(Clone, Debug, Deserialize, HasFk)]
144#[allow(
145    non_snake_case,
146    reason = "fields mirror upstream DBC CSV headers exactly"
147)]
148#[fk_field = "TraitTreeID"]
149pub struct SkillLineXTraitTreeRow {
150    pub ID: i32,
151    pub SkillLineID: i32,
152    pub TraitTreeID: i32,
153    pub Variant: i32,
154}
155
156/// DBC row from TraitTreeXTraitCurrency.db2: currency assigned to a talent tree.
157#[derive(Clone, Debug, Deserialize, HasFk)]
158#[allow(
159    non_snake_case,
160    reason = "fields mirror upstream DBC CSV headers exactly"
161)]
162#[fk_field = "TraitTreeID"]
163pub struct TraitTreeXTraitCurrencyRow {
164    pub ID: i32,
165    #[serde(rename = "_Index")]
166    pub Index: i32,
167    pub TraitTreeID: i32,
168    pub TraitCurrencyID: i32,
169}
170
171/// DBC row from TraitCurrency.db2: talent point currency definition.
172#[derive(Clone, Debug, Deserialize, HasId)]
173#[allow(
174    non_snake_case,
175    reason = "fields mirror upstream DBC CSV headers exactly"
176)]
177pub struct TraitCurrencyRow {
178    pub ID: i32,
179    pub Type: i32,
180    pub CurrencyTypesID: i32,
181    pub Flags: i32,
182    pub Icon: i32,
183    pub PlayerDataElementAccountID: i32,
184    pub PlayerDataElementCharacterID: i32,
185}
186
187/// DBC row from TraitCurrencySource.db2: source that grants talent currency.
188#[derive(Clone, Debug, Deserialize, HasFk)]
189#[allow(
190    non_snake_case,
191    reason = "fields mirror upstream DBC CSV headers exactly"
192)]
193#[fk_field = "TraitCurrencyID"]
194pub struct TraitCurrencySourceRow {
195    pub Requirement_lang: Option<String>,
196    pub ID: i32,
197    pub TraitCurrencyID: i32,
198    pub Amount: i32,
199    pub QuestID: i32,
200    pub AchievementID: i32,
201    pub PlayerLevel: i32,
202    pub TraitNodeEntryID: i32,
203    pub OrderIndex: i32,
204}
205
206/// DBC row from TraitCost.db2: point cost for a trait node entry.
207#[derive(Clone, Debug, Deserialize, HasId)]
208#[allow(
209    non_snake_case,
210    reason = "fields mirror upstream DBC CSV headers exactly"
211)]
212pub struct TraitCostRow {
213    pub InternalName: Option<String>,
214    pub ID: i32,
215    pub Amount: i32,
216    pub TraitCurrencyID: i32,
217    pub CurveID: i32,
218}
219
220/// DBC row from TraitNodeGroupXTraitNode.db2: maps a node group to its member nodes.
221#[derive(Clone, Debug, Deserialize, HasFk)]
222#[allow(
223    non_snake_case,
224    reason = "fields mirror upstream DBC CSV headers exactly"
225)]
226#[fk_field = "TraitNodeID"]
227pub struct TraitNodeGroupXTraitNodeRow {
228    pub ID: i32,
229    pub TraitNodeGroupID: i32,
230    pub TraitNodeID: i32,
231    #[serde(rename = "_Index")]
232    pub Index: i32,
233}
234
235/// DBC row from TraitNodeGroupXTraitCost.db2: maps a node group to its cost.
236#[derive(Clone, Debug, Deserialize, HasFk)]
237#[allow(
238    non_snake_case,
239    reason = "fields mirror upstream DBC CSV headers exactly"
240)]
241#[fk_field = "TraitNodeGroupID"]
242pub struct TraitNodeGroupXTraitCostRow {
243    pub ID: i32,
244    pub TraitNodeGroupID: i32,
245    pub TraitCostID: i32,
246}
247
248/// DBC row from TraitNodeGroupXTraitCond.db2: maps a node group to its condition.
249#[derive(Clone, Debug, Deserialize, HasFk)]
250#[allow(
251    non_snake_case,
252    reason = "fields mirror upstream DBC CSV headers exactly"
253)]
254#[fk_field = "TraitNodeGroupID"]
255pub struct TraitNodeGroupXTraitCondRow {
256    pub ID: i32,
257    pub TraitCondID: i32,
258    pub TraitNodeGroupID: i32,
259}
260
261/// DBC row from TraitNodeXTraitCond.db2: maps a trait node to a condition.
262#[derive(Clone, Debug, Deserialize, HasFk)]
263#[allow(
264    non_snake_case,
265    reason = "fields mirror upstream DBC CSV headers exactly"
266)]
267#[fk_field = "TraitNodeID"]
268pub struct TraitNodeXTraitCondRow {
269    pub ID: i32,
270    pub TraitCondID: i32,
271    pub TraitNodeID: i32,
272}
273
274/// DBC row from TraitCond.db2: condition for unlocking a talent node or group.
275#[derive(Clone, Debug, Deserialize, HasId)]
276#[allow(
277    non_snake_case,
278    reason = "fields mirror upstream DBC CSV headers exactly"
279)]
280pub struct TraitCondRow {
281    pub ID: i32,
282    pub CondType: i32,
283    pub TraitTreeID: i32,
284    pub GrantedRanks: i32,
285    pub QuestID: i32,
286    pub AchievementID: i32,
287    pub SpecSetID: i32,
288    pub TraitNodeGroupID: i32,
289    pub TraitNodeID: i32,
290    pub TraitNodeEntryID: i32,
291    pub TraitCurrencyID: i32,
292    pub SpentAmountRequired: i32,
293    pub Flags: i32,
294    pub RequiredLevel: i32,
295    pub FreeSharedStringID: i32,
296    pub SpendMoreSharedStringID: i32,
297    pub TraitCondAccountElementID: i32,
298}