Difference between revisions of "DB/WorldStateExpression"

From wowdev
Jump to: navigation, search
m
 
(3 intermediate revisions by the same user 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}}
 
{{Template:Sandbox/VersionRange|min_expansionlevel=5}}

Latest revision as of 15: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;
    }
  }
};

≥ Mists

6.0.1.18179

struct WorldStateExpressionRec {
  uint32_t m_ID;
  stringref m_expression;
};