Script này sẽ không được không được cài đặt trực tiếp. Nó là một thư viện cho các script khác để bao gồm các chỉ thị meta
// @require https://update.greasyfork.org/scripts/399256/787085/Knight.js
/***knights tab****/
Tabs.Knights = {
tabOrder: 1050,
tabLabel: 'Knights',
myDiv: null,
displayTimer: null,
action: 0,
MaxSkill:300,
knightRoles : [
['Foreman', 'politics', 'Pol'],
['Marshall', 'combat', 'Com'],
['Alchemyst', 'intelligence', 'Int'],
['Steward', 'resourcefulness', 'Res'],
],
RaidingKnights : [],
init: function (div) {
var t = Tabs.Knights;
t.myDiv = div;
uWExportFunction('ptAssignSkill', Tabs.Knights.clickedAssignPoints);
uWExportFunction('ptButDismiss', Tabs.Knights.postDismissKnight);
uWExportFunction('ptButAppoint', Tabs.Knights.postAppointKnight);
uWExportFunction('ptBoostKnight', Tabs.Knights.BoostKnight);
var m = '<DIV class=divHeader align=center>'+tx('KNIGHT ADMINISTRATION')+'</DIV>';
m += '<div align=center><br>'+tx('Quick Assign Knight Skill')+': <input style="height:20px;font-size:9px;" type=button value="'+tx('Add Default Skills')+'" id="ptknight_def"> <input style="height:20px;font-size:9px;" type=button value="'+tx('Add Combat Skills')+'" id="ptknight_com"></div><br>';
m += '<DIV id=ptknightdiv style="max-height:700px; height:700px; width:'+GlobalOptions.btWinSize.x+'px;overflow-x:scroll;overflow-y:scroll"></div>';
t.myDiv.innerHTML = m;
ById('ptknight_com').addEventListener('click', function () {
t.action = 1;
t.show();
}, false);
ById('ptknight_def').addEventListener('click', function () {
t.action = 2;
t.show();
}, false);
},
hide: function () {
var t = Tabs.Knights;
clearTimeout(t.displayTimer);
},
show: function () {
var t = Tabs.Knights;
clearTimeout(t.displayTimer);
function _dispKnight(roleId, knight, numcid) {
var rid = roleId;
if (roleId == null)
rid = 1;
var sty = 'class=evenRow ';
if (row++ % 2) { sty = 'class=oddRow '; }
m = '<TR ' + sty + 'valign=top align=left><TD class=xtab><B>' + (roleId == null ? '' : tx(t.knightRoles[rid][0])) + '</b></td><TD class=xtab align=left>';
if (knight == null) {
m += '--------</td><TD class=xtab colspan=14> </td></tr>';
}
else {
var kimg = CM.KnightsModel.getSrc(knight.knightName);
var level = parseInt(Math.sqrt(parseInt(knight.experience) / 75)) + 1;
var unpoints = level - parseInt(knight.skillPointsApplied);
var salary = (parseInt(knight.skillPointsApplied) + 1) * 20;
totSalary += salary;
var ass = '';
if (knight.knightStatus == 10) {
ass = '<TD class=xtab align=left colspan=4>'+t.getMarchText(knight.knightId,Cities.cities[numcid].id)+'</td>';
}
else {
if (unpoints > 0) {
if (t.action == 2) {
t.clickedAssignPoints(null, cid, knight.knightId, rid);
}
if (t.action == 1) {
t.clickedAssignPoints(null, cid, knight.knightId, 1);
}
var assignable = false;
for (var i = 0; i < 4; i++) {
var sty = 'padding-left:1px;';
if (i == rid) // bold it
sty += 'font-weight:bold;color:#116654';
ass += '<td width=26 class=xtab align="left" style="'+sty+'">';
if (knight[t.knightRoles[i][1]] < t.MaxSkill) {
assignable = true;
ass += '<a class=xlink title="' + uW.g_js_strings.modaltitles.assignskills + '" style="' + sty + '" onclick="ptAssignSkill(this,' + cid + ',' + knight.knightId + ',' + i + ')">[' + tx(t.knightRoles[i][2]) + ']</a>';
} else {
ass += '<span style="color: #006600; font-size: 10px; font-weight: normal;">(max)</span>';
}
ass += '</td>';
}
if (assignable) {
unpoints = '<SPAN class="boldRed">' + unpoints + '</span>';
}
}
else { ass = '<TD class=xtab colspan=4> </td>'; }
}
var skills = [];
for (var i = 0; i < 4; i++) {
var skillamount = knight[t.knightRoles[i][1]];
var boosted = false;
switch (i) {
case 0:
if (knight.politicsBoostExpireUnixtime > unixTime()) { skillamount *= 1.25; boosted=true;}
break;
case 1:
if (knight.combatBoostExpireUnixtime > unixTime()) { skillamount *= 1.25; boosted=true;}
break;
case 2:
if (knight.intelligenceBoostExpireUnixtime > unixTime()) { skillamount *= 1.25; boosted=true;}
break;
case 3:
if (knight.resourcefulnessBoostExpireUnixtime > unixTime()) { skillamount *= 1.25; boosted=true;}
break;
}
if (boosted) {skillamount='<span style="color:#080;">'+Math.floor(skillamount)+'</span>';}
if (i == rid)
skills[i] = '<B>' + skillamount + '</b>';
else
skills[i] = skillamount;
}
var item211 = "";
var item221 = "";
var item231 = "";
var item241 = "";
if (Seed.items.i211 && Seed.items.i211>0) item211 = '<a onclick="ptBoostKnight(this,'+Cities.cities[numcid].id+','+knight.knightId+',\'i211\')"><img height=20 class=btTop src="'+RoseImage+'" title="'+itemTitle(211)+'"></a>';
if (Seed.items.i221 && Seed.items.i221>0) item221 = '<a onclick="ptBoostKnight(this,'+Cities.cities[numcid].id+','+knight.knightId+',\'i221\')"><img height=20 class=btTop src="'+GauntletImage+'" title="'+itemTitle(221)+'"></a>';
if (Seed.items.i231 && Seed.items.i231>0) item231 = '<a onclick="ptBoostKnight(this,'+Cities.cities[numcid].id+','+knight.knightId+',\'i231\')"><img height=20 class=btTop src="'+MirrorImage+'" title="'+itemTitle(231)+'"></a>';
if (Seed.items.i241 && Seed.items.i241>0) item241 = '<a onclick="ptBoostKnight(this,'+Cities.cities[numcid].id+','+knight.knightId+',\'i241\')"><img height=20 class=btTop src="'+GlovesImage+'" title="'+itemTitle(241)+'"></a>';
m += '<img class=btTop width=20 src="'+kimg+'"><a class=xlink title="'+tx('Assign Role')+'" onclick="pthideMe();citysel_click(document.getElementById(\'citysel_' + (numcid + 1) + '\'));setTimeout (function (){ assign_role_modal(' + knight.knightId + ');return false;}, 500);">' + knight.knightName + '</td>';
m += '<TD class=xtab style="vertical-align:middle;">'+skills[0]+'</td><TD class=xtab style="vertical-align:middle;">'+skills[1]+'</td><TD class=xtab style="vertical-align:middle;">'+skills[2]+'</td><TD class=xtab style="vertical-align:middle;">'+skills[3]+'</td>';
m += '<TD class=xtab align=left>'+item211+' '+item221+' '+item231+' '+item241+'</td><TD width=26 class=xtab align=left>' + unpoints + '</td>' + ass + '<TD class=xtab align=right><a class=xlink title="'+tx('Experience Boost')+'" onclick="pthideMe();citysel_click(document.getElementById(\'citysel_' + (numcid + 1) + '\'));setTimeout (function (){ xpBoost_modal(' + knight.knightId + ');return false; }, 500);">' + level + '</a></td>';
m += '<td class=xtab align=right><a class=xlink title="'+tx('Loyalty Boost')+'" onclick="pthideMe();citysel_click(document.getElementById(\'citysel_' + (numcid + 1) + '\'));setTimeout (function (){ loyalBoost_modal(' + knight.knightId + ');return false;}, 500);">' + knight.loyalty + '</a></td>';
m += '<TD class=xtab align=right>' + addCommas(salary) + '</td><TD align=center class=xtab>'+strButton8(tx('Dismiss'), 'onclick="ptButDismiss(' + knight.knightId + ',' + cid + ')"')+'</td></tr>';
}
return m;
}
var totSalary = 0;
var m = '<TABLE width=98% cellspacing=0 align=center>';
for (var c = 0; c < Cities.numCities; c++) {
var cid = Cities.cities[c].id;
var cKnights = Seed.knights['city' + cid];
var totk = 0;
if (matTypeof(cKnights) == 'object') {
for (var k in cKnights)
++totk;
}
m += '<TR><TD class=xtab colspan=16><DIV class=divHeader align=center><TABLE width=100% cellspacing=0><TR><TD class=xtab width=100> </TD><td class=xtab align=center>' + Cities.cities[c].name + '</td><TD class=xtab width=100 align=right>'+tx('Knights')+': '+totk+' </TD></tr></table></div></td></tr>\
<TR><TD class=xtabHD width=70>'+tx('Role')+'</td><TD class=xtabHD width=140 align=left>'+uW.g_js_strings.commonstr.nametx+'</td><TD class=xtabHD width=26>'+tx('Pol')+'</td><TD class=xtabHD width=26>'+tx('Com')+'</td>\
<TD class=xtabHD width=26>'+tx('Int')+'</td><TD class=xtabHD width=26>'+tx('Res')+'</td><TD class=xtabHD align=center width=40>'+tx('Boosts')+'</td><TD class=xtabHD width=90 align=center colspan=5>'+htmlTitleLine(tx('Unassigned'))+'</td><TD class=xtabHD align=right width=35>'+uW.g_js_strings.commonstr.level+'</td><td class=xtabHD align=right width=40>'+tx('Loyalty')+'</td><TD class=xtabHD width=40 align=right>'+tx('Salary')+'</td><TD class=xtabHD width=70 align=center>'+tx('Dismiss')+'</td></tr>';
totSalary = 0;
var did = {};
var row = 0;
for (var i = 0; i < t.knightRoles.length; i++) {
var leader = Seed.leaders['city' + cid][t.knightRoles[i][1] + 'KnightId'];
if (leader == 0)
m += _dispKnight(i, null, c);
else {
m += _dispKnight(i, Seed.knights['city' + cid]['knt' + leader], c);
did['knt' + leader] = true;
}
}
var list = [];
for (var k in Seed.knights['city' + cid]) {
if (!did[k])
list.push(Seed.knights['city' + cid][k]);
}
list.sort(function (a, b) {
return parseInt(b.combat) - parseInt(a.combat)
});
for (var i = 0; i < list.length; i++)
m += _dispKnight(null, list[i], c, cid);
m += '<TR align=right><TD class=xtab> </td><td class=xtab align=left>'+strButton14(tx('Appoint a Knight'), 'onclick="pthideMe();ptButAppoint('+c+')"')+'</td><TD class=xtab align=right colspan=12><B>'+tx('Total Salary')+':</b></td><TD class=xtab align=right><b>'+addCommas(totSalary)+'</b></td></tr>';
m += '<TR align=right><TD class=xtab colspan=16> </td></tr>';
}
m += '</table><br>';
ById('ptknightdiv').innerHTML = m;
t.action = 0;
t.displayTimer = setTimeout(t.show, 10000);
},
getMarchText : function (kid, cid) {
var t = Tabs.Knights;
var retval = tx("marching");
t.RaidingKnights = [];
var citymarches = Seed.queue_atkp["city"+cid];
if (citymarches) {
for (var n in citymarches) {
if (citymarches[n].knightId && citymarches[n].knightId==kid) {
var MarchType = parseIntNan(citymarches[n].marchType);
switch (MarchType) {
case 1: retval = tx("transporting"); break;
case 2: retval = tx("reinforcing"); break;
case 3: retval = tx("scouting"); break;
case 4: retval = tx("attacking"); break;
case 5: retval = tx("reassigning"); break;
case 9: retval = tx("raiding"); break;
case 10: retval = tx("attacking dark forest"); break;
default: retval = tx("marching");
}
}
}
}
return retval;
},
postDismissKnight: function (kid, cid) {
var t = Tabs.Knights;
var params = uW.Object.clone(uW.g_ajaxparams);
params.cid = cid;
params.kid = kid;
new MyAjaxRequest(uW.g_ajaxpath + "ajax/fireKnight.php" + uW.g_ajaxsuffix, {
method: "post",
parameters: params,
onSuccess: function (rslt) {
if (rslt.ok) {
delete Seed.knights["city" + cid]["knt" + kid];
t.show();
}
},
});
},
postAppointKnight: function (city) {
var t = Tabs.Knights;
SelectCity(city+1);
CM.KnightsAppointView.render();
},
clickedAssignPoints: function (e, cid, kid, rid) {
var t = Tabs.Knights;
clearTimeout(t.displayTimer);
var knight = Seed.knights['city' + cid]['knt' + kid];
if (knight.knightStatus == 10 && e != null) {
var row = e.parentNode.parentNode;
row.childNodes[7].innerHTML = tx('Marching');
return;
}
sk = [];
var unassigned = parseInt(Math.sqrt(parseInt(knight.experience) / 75)) + 1 - parseInt(knight.skillPointsApplied);
for (var i = 0; i < 4; i++) {
sk[i] = parseInt(knight[t.knightRoles[i][1]]);
if (i == rid)
sk[i] += unassigned;
if (sk[i] > t.MaxSkill) {
sk[i] = t.MaxSkill;
unassigned = parseInt(t.MaxSkill - parseInt(knight[t.knightRoles[i][1]]));
}
}
if (unassigned == 0) return;
if (e != null) {
var row = e.parentNode.parentNode;
for (var i = row.cells.length - 1; i >= 1; i--)
row.deleteCell(i);
var newCell = row.insertCell(-1);
newCell.colSpan = 15;
newCell.align = 'left';
newCell.style.padding = '1px 1px 1px 1px';
var div = document.createElement('div');
div.style.backgroundColor = '#ffffff';
div.style.textAlign = 'center';
div.style.border = '1px solid';
div.style.width = '100%';
div.style.whiteSpace = 'normal';
newCell.appendChild(div);
div.innerHTML = tx('Assigning')+' ' + unassigned + ' '+tx('skill points to')+' ' + t.knightRoles[rid][1] + ' ... ';
}
t.postSkillPoints(cid, kid, sk[0], sk[1], sk[2], sk[3], function (r) {
t.postDone(r, div)
});
},
postDone: function (rslt, div) {
var t = Tabs.Knights;
clearTimeout(t.displayTimer);
if (rslt.ok) {
if (div) div.innerHTML += '<B>Done.</b>';
t.displayTimer = setTimeout(t.show, 5000);
} else {
if (div) div.innerHTML += '<BR><SPAN class=boldRed>ERROR: ' + rslt.errorMsg + '</span>';
t.displayTimer = setTimeout(t.show, 5000);
}
},
postSkillPoints: function (cid, kid, pol, com, int, res, notify) {
var t = Tabs.Knights;
var params = uW.Object.clone(uW.g_ajaxparams);
params.cid = cid;
params.kid = kid;
params.p = pol;
params.c = com;
params.i = int;
params.r = res;
new MyAjaxRequest(uW.g_ajaxpath + "ajax/skillupKnight.php" + uW.g_ajaxsuffix, {
method: "post",
parameters: params,
onSuccess: function (rslt) {
if (rslt.ok) {
var knight = Seed.knights["city" + cid]["knt" + kid];
var up = pol + com + int + res - knight.politics - knight.combat - knight.intelligence - knight.resourcefulness;
knight.politics = pol;
knight.combat = com;
knight.intelligence = int;
knight.resourcefulness = res;
knight.skillPointsApplied = (parseInt(knight.skillPointsApplied) + up).toString();
}
if (notify)
notify(rslt);
},
onFailure: function () {
if (notify)
notify(rslt);
},
});
},
BoostKnight : function (e,cid,kid,item) {
var t = Tabs.Knights;
if (e != null) {
var row = e.parentNode.parentNode;
for (var i = row.cells.length - 1; i >= 1; i--)
row.deleteCell(i);
var newCell = row.insertCell(-1);
newCell.colSpan = 15;
newCell.align = 'left';
newCell.style.padding = '1px 1px 1px 1px';
var div = document.createElement('div');
div.style.backgroundColor = '#ffffff';
div.style.textAlign = 'center';
div.style.border = '1px solid';
div.style.width = '100%';
div.style.whiteSpace = 'normal';
newCell.appendChild(div);
div.innerHTML = tx('Applying')+' ' + uW.itemlist[item].name + ' ... ';
}
var params = uW.Object.clone(uW.g_ajaxparams);
params.iid = item.substring(1);
params.cid = cid;
params.kid = kid;
new MyAjaxRequest(uW.g_ajaxpath + "ajax/boostKnight.php" + uW.g_ajaxsuffix, {
method : "post",
parameters : params,
onSuccess : function (rslt) {
if (rslt.ok) {
switch (item) {
case "i211":
uW.seed.knights["city" + cid]["knt" + kid].politicsBoostExpireUnixtime = rslt.expiration.toString();
break;
case "i221":
uW.seed.knights["city" + cid]["knt" + kid].combatBoostExpireUnixtime = rslt.expiration.toString();
break;
case "i231":
uW.seed.knights["city" + cid]["knt" + kid].intelligenceBoostExpireUnixtime = rslt.expiration.toString();
break;
case "i241":
uW.seed.knights["city" + cid]["knt" + kid].resourcefulnessBoostExpireUnixtime = rslt.expiration.toString();
break;
default:
return false
}
uW.seed.items[item] = parseInt(uW.seed.items[item]) - 1;
uW.ksoItems[item.substring(1)].subtract();
CM.MixPanelTracker.track("item_use", uWCloneInto({
item : uW.itemlist[item].name,
usr_gen : Seed.player.g,
usr_byr : Seed.player.y,
usr_ttl : uW.titlenames[Seed.player.title],
distinct_id : uW.tvuid
}))
t.show();
}
},
},true); // noretry
},
}