DB/WorldStateExpression: Difference between revisions
Jump to navigation
Jump to search
m (Marlamin moved page WorldStateExpression.dbc to DB/WorldStateExpression) |
mNo edit summary |
||
(5 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
expression is a flattened AST. is bytewise. First is enabled == always 1. then, operand {0 (disabled), 1 (uint32), 2 (worldStateID (evals to something other than id, likely something in worldStateRec)), 3 (uint8 op, recurse left, recurse right; where op <=0xc: none, random, month, day, timeofday, region, clockHour, difficultyID, holidayStart, holidayLeft, holidayActive, currentTime, weeknumber)}, then op {1: +, 2:-, 3:*, 4*/, 5:%, 0: no op}, then op2 {…. See CGWorldStateInfo::EvalWorldStateExpression. | expression is a flattened AST. is bytewise. | ||
First is enabled == always 1. then, operand {0 (disabled), 1 (uint32), 2 (worldStateID (evals to something other than id, likely something in worldStateRec)), 3 (uint8 op, recurse left, recurse right; where op <=0xc: none, random, month, day, timeofday, region, clockHour, difficultyID, holidayStart, holidayLeft, holidayActive, currentTime, weeknumber)}, then op {1: +, 2:-, 3:*, 4*/, 5:%, 0: no op}, then op2 {…. See CGWorldStateInfo::EvalWorldStateExpression. | |||
enum arith_operand : char { | |||
id = 0, // lhs; DO NOT READ RHS | |||
add = 1, // lhs + rhs | |||
sub = 2, // lhs - rhs | |||
mul = 3, // lhs * rhs | |||
div = 4, // rhs ≠ 0 ? (lhs / rhs) : 0 | |||
mod = 5, // rhs ≠ 0 ? (lhs % rhs) : 0 | |||
}; | |||
enum log_operand : char { | |||
id = 0, // lhs; do not read rhs? | |||
eq = 1, // lhs = rhs | |||
ne = 2, // lhs ≠ rhs | |||
lt = 3, // lhs < rhs | |||
le = 4, // lhs ≤ rhs | |||
gt = 5, // lhs > rhs | |||
ge = 6, // lhs ≥ rhs | |||
}; | |||
struct value { | |||
char type; | |||
switch (type) { | |||
case 1: | |||
int value; | |||
// result = value | |||
break; | |||
case 2: | |||
int world_state_id; | |||
// result = current world state value of given state | |||
break; | |||
case 3: | |||
enum function_id : int { | |||
none = 0, // => 0 | |||
random = 1, // min, max => random in [min, max) | |||
month = 2, // => g_clientGameTime.month + 1 | |||
day = 3, // => g_clientGameTime.day + 1 | |||
time_of_day = 4, // => g_clientGameTime.GetHourAndMinutes() (in minutes) | |||
region = 5, // => CGServerInfo::regionID | |||
clock_hour = 6, // => g_clientGameTime.hours % 12 | |||
difficulty_id = 7, // => CGGameUI::m_instanceDifficultyID | |||
holiday_start = 8, // holiday_id, duration_id => minutes to begin | |||
holiday_left = 9, // holiday_id, duration_id => minutes to end | |||
holiday_active = 10, // holiday_id => 1 if any left > 0 | |||
timer_current_time = 11, // => time(nullptr) | |||
week_number = 12, // => weeks since raid origin | |||
}; | |||
function_id type; | |||
value lhs; // note: regardless of number of used arguments! | |||
value rhs; | |||
// result = fun(lhs, rhs) | |||
break; | |||
} | |||
} | |||
}; | |||
{{Template:Sandbox/VersionRange|min_expansionlevel=5}} | |||
==6.0.1.18179== | ==6.0.1.18179== | ||
struct WorldStateExpressionRec { | struct WorldStateExpressionRec { | ||
uint32_t m_ID; | uint32_t m_ID; | ||
stringref m_expression; | {{Template:Type|stringref}} m_expression; | ||
}; | }; | ||
[[Category:DBC]] | [[Category:DBC]] | ||
[[Category:DBC_WoD]] | [[Category:DBC_WoD]] | ||
[[Category:6.0.1.18179]] | [[Category:6.0.1.18179]] |
Revision as of 14:41, 8 September 2019
expression is a flattened AST. is bytewise.
First is enabled == always 1. then, operand {0 (disabled), 1 (uint32), 2 (worldStateID (evals to something other than id, likely something in worldStateRec)), 3 (uint8 op, recurse left, recurse right; where op <=0xc: none, random, month, day, timeofday, region, clockHour, difficultyID, holidayStart, holidayLeft, holidayActive, currentTime, weeknumber)}, then op {1: +, 2:-, 3:*, 4*/, 5:%, 0: no op}, then op2 {…. See CGWorldStateInfo::EvalWorldStateExpression.
enum arith_operand : char { id = 0, // lhs; DO NOT READ RHS add = 1, // lhs + rhs sub = 2, // lhs - rhs mul = 3, // lhs * rhs div = 4, // rhs ≠ 0 ? (lhs / rhs) : 0 mod = 5, // rhs ≠ 0 ? (lhs % rhs) : 0 };
enum log_operand : char { id = 0, // lhs; do not read rhs? eq = 1, // lhs = rhs ne = 2, // lhs ≠ rhs lt = 3, // lhs < rhs le = 4, // lhs ≤ rhs gt = 5, // lhs > rhs ge = 6, // lhs ≥ rhs };
struct value { char type; switch (type) { case 1: int value; // result = value break; case 2: int world_state_id; // result = current world state value of given state break; case 3: enum function_id : int { none = 0, // => 0 random = 1, // min, max => random in [min, max) month = 2, // => g_clientGameTime.month + 1 day = 3, // => g_clientGameTime.day + 1 time_of_day = 4, // => g_clientGameTime.GetHourAndMinutes() (in minutes) region = 5, // => CGServerInfo::regionID clock_hour = 6, // => g_clientGameTime.hours % 12 difficulty_id = 7, // => CGGameUI::m_instanceDifficultyID holiday_start = 8, // holiday_id, duration_id => minutes to begin holiday_left = 9, // holiday_id, duration_id => minutes to end holiday_active = 10, // holiday_id => 1 if any left > 0 timer_current_time = 11, // => time(nullptr) week_number = 12, // => weeks since raid origin }; function_id type; value lhs; // note: regardless of number of used arguments! value rhs; // result = fun(lhs, rhs) break; } } };
6.0.1.18179
struct WorldStateExpressionRec { uint32_t m_ID; stringrefⁱ m_expression; };