mirror of
https://github.com/Sarjuuk/aowow.git
synced 2025-11-29 15:58:16 +08:00
* split global.js into its components, so it can be reasonably processed by setup * make reputation requirements configurable * move Markup and Locale back into global.js (removed associated build scripts) * extend Icon to display iconId in lightbox popup
330 lines
10 KiB
JavaScript
330 lines
10 KiB
JavaScript
/* aowow - custom: TrinityCore Conditions */
|
|
var ConditionList = new function() {
|
|
var self = this,
|
|
_conditions = null;
|
|
|
|
self.createCell = function(conditions)
|
|
{
|
|
if (!conditions)
|
|
return null;
|
|
|
|
_conditions = conditions;
|
|
|
|
return _createCell();
|
|
};
|
|
|
|
self.createTab = function(conditions)
|
|
{
|
|
if (!conditions)
|
|
return null;
|
|
|
|
_conditions = conditions;
|
|
|
|
return _createTab();
|
|
};
|
|
|
|
function _makeList(mask, src, tpl)
|
|
{
|
|
var arr = Listview.funcBox.assocBinFlags(mask, src).sort(),
|
|
buff = '';
|
|
|
|
for (var i = 0, len = arr.length; i < len; ++i)
|
|
{
|
|
if (len > 1 && i == len - 1)
|
|
buff += LANG.or;
|
|
else if (i > 0)
|
|
buff += LANG.comma;
|
|
|
|
buff += $WH.sprintf(tpl, arr[i], src[arr[i]]);
|
|
}
|
|
|
|
return buff;
|
|
}
|
|
|
|
function _parseEntry(entry, targets, target)
|
|
{
|
|
var str = '',
|
|
negate = false,
|
|
strIdx = 0,
|
|
param = [];
|
|
|
|
[strIdx, ...param] = entry;
|
|
|
|
negate = strIdx < 0;
|
|
strIdx = Math.abs(strIdx);
|
|
|
|
if (!g_conditions[strIdx])
|
|
return 'unknown condition index #' + strIdx;
|
|
|
|
switch (strIdx)
|
|
{
|
|
case 5:
|
|
var standings = {};
|
|
for (let i in g_reputation_standings)
|
|
standings[i * 1 + 1] = g_reputation_standings[i];
|
|
|
|
param[1] = _makeList(entry[2], standings, '$2');
|
|
break;
|
|
|
|
case 6:
|
|
if (entry[1] == 1)
|
|
param[0] = $WH.sprintf('[span class=icon-alliance]$1[/span]', g_sides[1]);
|
|
else if (entry[1] == 2)
|
|
param[0] = $WH.sprintf('[span class=icon-horde]$1[/span]', g_sides[2]);
|
|
else
|
|
param[0] = $WH.sprintf('[span class=icon-alliance]$1[/span]$2[span class=icon-horde]$3[/span]', g_sides[1], LANG.or, g_sides[2]);
|
|
break;
|
|
|
|
case 10:
|
|
param[0] = g_drunk_states[entry[1]] ?? 'UNK DRUNK STATE';
|
|
break;
|
|
|
|
case 13:
|
|
param[2] = g_instance_info[entry[3]] ?? 'UNK INSTANCE INFO';
|
|
break;
|
|
|
|
case 15:
|
|
param[0] = _makeList(entry[1], g_chr_classes, '[class=$1]');
|
|
break;
|
|
|
|
case 16:
|
|
param[0] = _makeList(entry[1], g_chr_races, '[race=$1]');
|
|
break;
|
|
|
|
case 20:
|
|
if (entry[1] == 0)
|
|
param[0] = $WH.sprintf('[span class=icon-$1]$2[/span]', g_file_genders[0], LANG.male);
|
|
else if (entry[1] == 1)
|
|
param[0] = $WH.sprintf('[span class=icon-$1]$2[/span]', g_file_genders[1], LANG.female);
|
|
else
|
|
param[0] = g_npc_types[10]; // not specified
|
|
break;
|
|
|
|
case 21:
|
|
var states = {};
|
|
for (let i in g_unit_states)
|
|
states[i * 1 + 1] = g_unit_states[i];
|
|
|
|
param[0] = _makeList(entry[1], states, '$2');
|
|
break;
|
|
|
|
case 22:
|
|
if (entry[2])
|
|
param[0] = '[zone=' + entry[2] + ']';
|
|
else
|
|
param[0] = g_zone_categories[entry[1]] ?? 'UNK ZONE';
|
|
break;
|
|
|
|
case 24:
|
|
param[0] = g_npc_types[entry[1]] ?? 'UNK NPC TYPE';
|
|
break;
|
|
|
|
case 26:
|
|
var idx = 0, buff = [];
|
|
while (entry[1] >= (1 << idx)) {
|
|
if (!(entry[1] & (1 << idx++)))
|
|
continue;
|
|
|
|
buff.push(idx);
|
|
}
|
|
param[0] = buff ? buff.join(LANG.comma) : '';
|
|
break;
|
|
|
|
case 27:
|
|
case 37:
|
|
case 38:
|
|
param[1] = g_operators[entry[2]];
|
|
break;
|
|
|
|
case 31:
|
|
if (entry[2] && entry[1] == 3)
|
|
param[0] = '[npc=' + entry[2] + ']';
|
|
else if (entry[2] && entry[1] == 5)
|
|
param[0] = '[object=' + entry[2] + ']';
|
|
else
|
|
param[0] = g_world_object_types[entry[1]] ?? 'UNK TYPEID';
|
|
break;
|
|
|
|
case 32:
|
|
var objectTypes = {};
|
|
for (let i in g_world_object_types)
|
|
objectTypes[i * 1 + 1] = g_world_object_types[i];
|
|
|
|
param[0] = _makeList(entry[1], objectTypes, '$2');
|
|
break;
|
|
|
|
case 33:
|
|
param[0] = targets[entry[1]];
|
|
param[1] = g_relation_types[entry[2]] ?? 'UNK RELATION';
|
|
param[2] = targets[target];
|
|
break;
|
|
|
|
case 34:
|
|
param[0] = targets[entry[1]];
|
|
|
|
var standings = {};
|
|
for (let i in g_reputation_standings)
|
|
standings[i * 1 + 1] = g_reputation_standings[i];
|
|
param[1] = _makeList(entry[2], standings, '$2');
|
|
break;
|
|
|
|
case 35:
|
|
param[0] = targets[entry[1]];
|
|
param[2] = g_operators[entry[3]];
|
|
break;
|
|
|
|
case 42:
|
|
if (!entry[1])
|
|
param[0] = g_stand_states[entry[2]] ?? 'UNK STAND_STATE';
|
|
else if (entry[1] == 1)
|
|
param[0] = g_stand_states[entry[2] ? 1 : 0];
|
|
else
|
|
param[0] = '';
|
|
break;
|
|
|
|
case 47:
|
|
var quest_states = {};
|
|
for (let i in g_quest_states)
|
|
quest_states[i * 1 + 1] = g_quest_states[i];
|
|
|
|
param[1] = _makeList(entry[2], quest_states, '$2');
|
|
break;
|
|
}
|
|
|
|
str = g_conditions[strIdx];
|
|
|
|
// fill in params
|
|
str = $WH.sprintfa(str, param[0], param[1], param[2]);
|
|
|
|
// resolve NegativeCondition
|
|
str = str.replace(/\$N([^:]*):([^;]*);/g, '$' + (negate > 0 ? 2 : 1));
|
|
|
|
// resolve vars
|
|
return str.replace(/\$C(\d+)([^:]*):([^;]*);/g, (_, i, y, n) => (i > 0 ? y : n));
|
|
}
|
|
|
|
function _createTab()
|
|
{
|
|
var buff = '';
|
|
|
|
// tabs for conditionsTypes
|
|
for (g in _conditions)
|
|
{
|
|
if (!g_condition_sources[g])
|
|
continue;
|
|
|
|
let k = 0;
|
|
for (h in _conditions[g])
|
|
{
|
|
var srcGroup, srcEntry, srcId, target,
|
|
targets, desc,
|
|
nGroups = Object.keys(_conditions[g][h]).length,
|
|
curGroup = 1;
|
|
|
|
[srcGroup, srcEntry, srcId, target] = h.split(':').map((x) => parseInt(x));
|
|
[targets, desc] = g_condition_sources[g];
|
|
|
|
// resolve targeting
|
|
let src = desc.replace(/\$T([^:]*):([^;]*);/, (_, t1, t2) => (target ? t2 : t1).replace('%', targets[target]));
|
|
let rand = $WH.rs();
|
|
|
|
buff += '[h3][toggler' + (k ? '=hidden' : '') + ' id=' + rand + ']' + $WH.sprintfa(src, srcGroup, srcEntry, srcId) + '[/toggler][/h3][div' + (k++ ? '=hidden' : '') + ' id=' + rand + ']';
|
|
|
|
if (nGroups > 1)
|
|
{
|
|
buff += LANG.note_condition_group + '[br][br]';
|
|
buff += '[table class=grid]';
|
|
}
|
|
|
|
// table for elseGroups
|
|
for (i in _conditions[g][h])
|
|
{
|
|
var group = _conditions[g][h][i],
|
|
nEntries = Object.keys(_conditions[g][h][i]).length;
|
|
|
|
if (nGroups <= 1 && nEntries > 1)
|
|
buff += '[div style="padding-left:15px"]' + LANG.note_condition + '[/div]';
|
|
if (nGroups > 1)
|
|
buff += '[tr][td width=70px valign=middle align=center]' + LANG.group + ' ' + (curGroup++) + LANG.colon + '[/td][td]';
|
|
|
|
// individual conditions
|
|
buff += '[ol]';
|
|
for (j in group)
|
|
buff += '[li]' + _parseEntry(group[j], targets, target) + '[/li]';
|
|
buff += '[/ol]';
|
|
|
|
if (nGroups > 1)
|
|
buff += '[/td][/tr]';
|
|
}
|
|
|
|
if (nGroups > 1)
|
|
buff += '[/tr][/table]';
|
|
|
|
buff += '[/div]';
|
|
}
|
|
}
|
|
|
|
return buff;
|
|
}
|
|
|
|
function _createCell()
|
|
{
|
|
var rows = [];
|
|
|
|
// tabs for conditionsTypes
|
|
for (let g in _conditions)
|
|
{
|
|
if (!g_condition_sources[g])
|
|
continue;
|
|
|
|
for (let h in _conditions[g])
|
|
{
|
|
var target, targets,
|
|
|
|
[, , , target] = h.split(':').map((x) => parseInt(x));
|
|
[targets, ] = g_condition_sources[g];
|
|
|
|
let nElseGroups = Object.keys(_conditions[g][h]).length
|
|
|
|
// table for elseGroups
|
|
for (let i in _conditions[g][h])
|
|
{
|
|
let subGroup = [],
|
|
group = _conditions[g][h][i],
|
|
nEntries = Object.keys(_conditions[g][h][i]).length
|
|
buff = '';
|
|
|
|
if (nElseGroups > 1)
|
|
{
|
|
let rand = $WH.rs();
|
|
buff += '[toggler' + (i > 0 ? '=hidden' : '') + ' id=cell-' + rand + ']' + (i > 0 ? LANG.cnd_or : LANG.cnd_either) + '[/toggler][div' + (i > 0 ? '=hidden' : '') + ' id=cell-' + rand + ']';
|
|
}
|
|
|
|
// individual conditions
|
|
for (let j in group)
|
|
subGroup.push(_parseEntry(group[j], targets, target));
|
|
|
|
for (j in subGroup)
|
|
{
|
|
if (nEntries > 1 && j > 0 && j == subGroup.length - 1)
|
|
buff += LANG.and + '[br]';
|
|
else if (nEntries > 1 && j > 0)
|
|
buff += ',[br]';
|
|
|
|
buff += subGroup[j];
|
|
}
|
|
|
|
if (nElseGroups > 1)
|
|
buff += '[/div]';
|
|
|
|
rows.push(buff);
|
|
}
|
|
}
|
|
}
|
|
|
|
return rows.length > 1 ? rows.join('[br]') : rows[0];
|
|
}
|
|
|
|
}
|
|
/* end custom */
|