// ==UserScript== // @name Power Bot Plus Lite // @namespace PBP // @description PB+ LITE // @icon https://koc-cdn.popreach.com/fb/e2/src/img/items/70/30356.jpg // @include *.rycamelot.com/*main_src.php* // @include *.beta.rycamelot.com/*main_src.php* // @include *apps.facebook.com/kingdomsofcamelot/* // @include *.rockyou.com/rya/* // @include *facebook.com/*dialog/feed* // @include *rycamelot.com/*acceptToken_src.php* // @include *rycamelot.com/*helpFriend_src.php* // @include *rycamelot.com/*claimVictoryToken_src.php* // @include *rycamelot.com/*merlinShare_src.php* // @exclude *sharethis* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js // @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js // @resource sound_files https://koc-cdn.popreach.com/fb/e2/src/pb/resource/sound_files.js // @resource image_files https://koc-cdn.popreach.com/fb/e2/src/pb/resource/image_files.js // @resource champion_uniques https://koc-cdn.popreach.com/fb/e2/src/pb/resource/champion_uniques.js // @resource emoticons https://koc-cdn.popreach.com/fb/e2/src/pb/resource/emoticons.js // @connect * // @connect greasyfork.org // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM_addStyle // @grant GM_log // @grant GM_getResourceText // @grant GM_registerMenuCommand // @grant GM_xmlhttpRequest // @grant unsafeWindow // @run-at document-end // @author DarknessKoc // @license CC-BY-4.0 // @original-script https://sourceforge.net/p/koc-battle-console/code/HEAD/tree/trunk/KoCPowerBotPlus.user.js // @original-license http://creativecommons.org/licenses/by/4.0/ // @original-changes Updated to include latest items from KoC // @original-author barbarossa69 // @version 3.64.1 // @releasenotes

added uplate links

// @downloadURL none // ==/UserScript== var Version = '3.64.1'; var SourceName = "Power Bot Plus Lite"; function GlobalOptionsUpdate () { } function OptionsUpdate () { } this.jQuery = jQuery.noConflict(true); var JSON2 = JSON; var uW = unsafeWindow; var Seed = uW.seed; var CM = uW.cm; var FFVersion = getFirefoxVersion(); var GMVersion = getGMVersion(); var NoRegEx = (FFVersion.Mozilla && (parseIntNan(FFVersion.Version) <= 16)); var http = window.location.protocol+"\/\/"; var EXTERNAL_RESOURCE = 'https://koc-cdn.popreach.com/fb/e2/src/pb/'; var KOCMON_LOGO = ''; var KOCMON_ON = false; var GameURL = 'www.rycamelot.com'; var Cities = {}; var Tabs = {}; var Buttons = {}; var Images = {}; var OpenDiv = {}; var local_atkp = {}; var local_atkinc = {}; var LanguageArray = {}; var NoTranslation = {}; var ReportCache = {}; var ReportDetailCache = {}; var inc = []; var incCity = []; var out = []; var outCity = []; var mainPop; var popDash; var popMon; var popInc; var popOut; var popBat; var popMarch; var SelectiveDefending = true; var giftAccepted = false; var Infantry = []; var Ranged = []; var Horsed = []; var Siege = []; var SpellCaster = []; var TTSort = []; var GlobalEffects = [1,2,3,4,5,6,7,17,18,19,20,21,22,23,102,103,8,9,73]; var AttackEffects = [1,17,24,29,34,39,44,50,56,61,102,113,119,135,140]; var DefenceEffects = [2,18,25,30,35,40,45,51,114,120,125,126,136,141]; var LifeEffects = [3,19,26,31,36,41,46,52,104,115,121,127,128,137,142]; var RangeEffects = [5,21,37,42,58,63,117,123,131,132,133,134,138,143]; var SpeedEffects = [4,20,27,32,47,53,57,62,116,122,129,130]; var AccuracyEffects = [7,23,28,33,38,43,49,55,60,65,139,144]; var OtherCombatEffects = [8,9,118,124,13,14,15,16,73,145,147,148,149,150]; var OtherPVPEffects = [6,22,48,54,59,64]; var DebuffEffects = [17,18,19,20,22,21,23,29,39,50,54,61,30,40,51,31,41,52,42,63,64,32,53,62,119,120,121,122,123,124,126,128,130,132,134,140,141,142,143,144,147,149]; var AlternateSortOrder = [5,37,58,117,131,133,138,21,42,63,123,132,134,143,1,24,34,44,56,102,113,135,17,29,39,50,61,119,140,2,25,35,45,114,125,136,18,30,40,51,120,126,141,3,26,36,46,104,115,127,137,19,31,41,52,121,128,142,4,27,47,57,116,20,32,53,62,122,129,130,7,28,38,49,60,139,23,33,43,55,65,144,8,9,118,147,148,149,150,124,13,14,15,16,73,145,6,48,59,22,54,64]; var CompositeEffects = {147:[17,20],148:[44,45],149:[19,21],150:[113,114]}; var EffectDebuffs = {1:17,2:18,3:19,4:20,5:21,6:22,7:23,24:29,25:30,26:31,27:32,28:33,34:39,35:40,36:41,37:42,38:43,44:50,45:51,46:52,47:53,48:54,49:55,56:61,57:62,58:63,59:64,60:65,113:119,114:120,115:121,116:122,117:123,118:124,125:126,127:128,129:130,131:132,133:134,135:140,136:141,137:142,138:143,139:144,147:147,149:149}; var DebuffOnly = ["147","149"]; var InfantryEffects = [24,25,26,27,28,133]; var RangedEffects = [34,35,36,37,38,129]; var HorsedEffects = [44,45,46,47,48,49,131,148]; var SiegeEffects = [56,57,58,59,60,127]; var SpellcasterEffects = [113,114,115,116,117,118,150]; var TowerEffects = [135,136,137,138,139]; var cardQuality = ['Simple','Common','Uncommon','Rare','Epic','Wondrous','Miraculous']; var champImageTypes = {0:"weapon",1:"chestArmor",2:"helmet",3:"feet",4:"shield",5:"ring1",7:"pendant",8:"cloak"}; var champUniqueImageTypes = {0:"weapon",1:"chestArmor",2:"helmet",3:"feet",4:"shield",5:"ring",7:"pendant",8:"cloak"}; var chTypeStrings = {0:"weapon",1:"chest",2:"helm",3:"boots",4:"shield",5:"ring",7:"pendant",8:"cloak"}; var chTypes = ['weapon','chest','helm','boots','shield','ring1','ring2','pendant','cloak']; // must be in this order var trTypes = ['chair', 'advisor', 'window', 'banner', 'table', 'trophy', 'candelabrum', 'hero', 'statue', 'pet', 'tapestry', 'pillar']; // must be in this order var cardFaction = ['briton','fey','druid']; var jewelTypes = ["general_buff", "general_debuff", "unit_specific", "base_building"]; var jewelQuality = ["cracked", "flawed", "cloudy", "subdued", "bright"]; var guardTypes = ["wood", "ore", "food", "stone"]; var tileTypes = {0:"Bog",10:"Grassland",11:"Lake",20:"Wood",30:"Hill",40:"Mountain",50:"Plain",51:"City",52:"Ruin",53:"Misted City",54:"Dark Forest",55:"Merc Camp",56:"Nomad Camp",57:"Megalith"}; var wildImages = {0:"bog",10:"grasslands",11:"lake",20:"forest",30:"hills",40:"mountains",50:"plains"}; var SpellBlessings = {1:12, 2:22, 3:32}; var SpellTypes = {1:11, 2:21, 3:31}; var BaseChamp = {201:30,202:0,203:7,204:27,205:27,206:60,207:4,208:3,209:3}; var SteelHoofItems = [28119, 28120, 28121, 28122, 28123, 28124, 2812, 28510, 28638]; var LightBringerItems = [28125, 28126, 28127, 28128, 28129, 28130, 28131, 28640]; var DragonScaleItems = [28133, 28134, 28135, 28136, 28137, 28138, 28139, 28644]; var TestItems = [28657, 28663, 28662, 28658, 28659, 28660, 28661, 28664]; var WildHideItems = [28140, 28141, 28142, 28143, 28144, 28145, 28146, 28669, 28677]; var VespersItems = [28679, 28653, 28656, 28665, 28666, 28670, 28671, 28678]; var SilverItems = [28147, 28148, 28149, 28150, 28151, 28152, 28153, 28154, 28155]; var WarlocksItems = [28688, 28689, 28690, 28691, 28692, 28693, 28694, 28695, 28696]; var IceQueensItems = [28703, 28704, 28705, 28706, 28707, 28708, 28709, 28710, 28711]; var EagleItems = [28721,28722,28723,28724,28725,28726,28727,28728,28729]; var DragonWarriorsItems = [28740,28741,28742,28743,28744,28745,28746,28747,28748]; var fortmight = {f53:4, f55:7, f60:1, f61:2, f62:3, f63:10}; var ScoutTroops = {3:'',46:''}; var TranslatePublish = {80:"300645083384735", 50:"275425949243301", 40:"291667064279714", 10:"286958161406148"}; var CE_EFFECT_TIERS = null; var CE_MIGHT_RARITY_MAP = {}; var CE_MIGHT_LEVEL_MAP = {}; var ChampionStatTiers = {}; var Provinces = { // top left co-ords (origin) p1:{x:0,y:0}, p2:{x:150,y:0}, p3:{x:300,y:0}, p4:{x:450,y:0}, p5:{x:600,y:0}, p6:{x:0,y:150}, p7:{x:150,y:150}, p8:{x:300,y:150}, p9:{x:450,y:150}, p10:{x:600,y:150}, p11:{x:0,y:300}, p12:{x:150,y:300}, p13:{x:450,y:300}, p14:{x:600,y:300}, p15:{x:0,y:450}, p16:{x:150,y:450}, p17:{x:300,y:450}, p18:{x:450,y:450}, p19:{x:600,y:450}, p20:{x:0,y:600}, p21:{x:150,y:600}, p22:{x:300,y:600}, p23:{x:450,y:600}, p24:{x:600,y:600} } provMapCoords = { // for province map imgWidth: 710, imgHeight: 708, mapWidth: 670, mapHeight: 670, leftMargin: 31, topMargin: 19 } var TileOrigin = 0; var TileOriginChecked = false; var IMGURL = uW.stimgUrl+"img/"; var GiftText = [ 'Yeni Hediye Alındı', 'Neues Geschenk erhalten', 'Nouveaux Cadeaux reçus', 'Nuevo regalo recibido', 'Nuovo Regalo ricevuto', 'Nieuwe cadeau ontvangen', 'New Gift Received' ]; var HQText = ['has donated','Donations Report of your Alliance']; var HQText2 = ['A new Temple Arcana has been activated']; var AlertBG = IMGURL+"tower/timer_bg.png"; var GuardBG = IMGURL+"guardian_change_spritemap102.png"; var AttackImage = IMGURL+"attacking.jpg"; var ScoutImage = IMGURL+"scouting.jpg"; var ReinforceImage = IMGURL+"reinforce.jpg"; var ReassignImage = IMGURL+"autoAttack/raid_resting.png"; var TransportImage = IMGURL+"transporting.jpg"; var ReturnImage = IMGURL+"returning.jpg"; var RoseImage = IMGURL+"items/70/211.jpg"; var GauntletImage = IMGURL+"items/30/221.jpg"; var MirrorImage = IMGURL+"items/70/231.jpg"; var GlovesImage = IMGURL+"items/70/241.jpg"; var RightArrow = IMGURL+"autoAttack/across_arrow.png"; var DownArrow = IMGURL+"autoAttack/down_arrow.png"; var ThroneImage = IMGURL+"bonus_throne.png"; var PresetImage = IMGURL+"throne/modal/set_active.png"; var PresetImage_SEL = IMGURL+"throne/modal/set_selected.png"; var PresetImage_LCK = IMGURL+"throne/modal/set_locked.png"; var MistImage = IMGURL+"items/70/10021.jpg"; var DoveImage = IMGURL+"items/70/901.jpg"; var RefugeImage = IMGURL+"items/70/911.jpg"; var OrderImage = IMGURL+"items/70/912.jpg"; var GoldImage = IMGURL+"gold_30.png"; var FoodImage = IMGURL+"food_30.png"; var WoodImage = IMGURL+"wood_30.png"; var StoneImage = IMGURL+"stone_30.png"; var OreImage = IMGURL+"iron_30.png"; var AetherImage = IMGURL+"aetherstone_30.png"; var AmberImage = IMGURL+"resource_icon_amber.png"; var ArcaneTabletImage = IMGURL+"items/70/43000.jpg"; var PopulationImage = IMGURL+"population_40.png"; var BagImage = IMGURL+"items/70/276.jpg"; var SturdyBagImage = IMGURL+"items/70/277.jpg"; var HeavyBagImage = IMGURL+"items/70/278.jpg"; var AuthorityImage = IMGURL+"items/70/285.jpg"; var DominionImage = IMGURL+"items/70/286.jpg"; var BlueEagleImage = IMGURL+"items/70/279.jpg"; var ChestImage = IMGURL+"feeds/treasurechest_icon.png"; var TokenImage = IMGURL+"feeds/merlin_magical_token.jpg"; var BuildImage = IMGURL+"feeds/new_city_outskirts.jpg"; var GameIcons = { goldImgTiny: '', foodImgTiny: '', woodImgTiny: '', stoneImgTiny: '', oreImgTiny: '', astoneImgTiny: '', }; var ArcaneResources = {gold:0,aetherstone:5,amber:6,arcanetablet:7}; var ArcaneResourceImages = {gold:GoldImage,aetherstone:AetherImage,amber:AmberImage,arcanetablet:ArcaneTabletImage}; var TroopImagePrefix = IMGURL+"units/unit_"; var TroopImageSuffix = "_30.jpg"; var ChampImagePrefix = IMGURL+"champion_hall/championPort_0"; var ChampImageSuffix = "_50x50.jpg"; var ShieldImage = IMGURL+"items/70/362.jpg"; var BrokenIcon = IMGURL+"throne/modal/sm_fail_overlay.png"; var EquippedIcon = IMGURL+"throne/modal/equip.png"; var EquippedOtherIcon = IMGURL+"champion_hall/equippedOther.png"; var LONG_BROWN_BTN = IMGURL+"button11_brown.png"; var GLORY_BACKGROUND = ""; var RAINBOW_BACKGROUND = ""; var URL_CASTLE_BUT_HOVER = ""; var THEMES; var UniqueJewels = {}; var boxmightarray = {}; var AlertSounds = {allianceattack: 'Submarine', alert: 'Honk Honk Honk', airraid: 'Air Raid Siren'}; var WhisperSounds = {timeout: 'Arrow', monitor: 'Doorbell'}; var Smileys = {}; var ChatStyles = {'[#0]':'color:black','[#1]':'color:red','[#2]':'color:green','[#3]':'color:blue','[#4]':'color:magenta','[#5]':'color:cyan','[#6]':'color:yellow','[#7]':'color:white','[#8]':'font-weight:bold','[#9]':'font-style:italic'}; var SpeedColour = '#000'; var LinkColour = '#00c00a'; eval(GM_getResourceText("emoticons")); eval(GM_getResourceText("image_files")); eval(GM_getResourceText("sound_files")); if (URL_CASTLE_BUT_HOVER=="") URL_CASTLE_BUT_HOVER=URL_CASTLE_BUT_SEL; var MAP_DELAY = 2000; // 2 second map delay var MAX_BLOCKS = 20; var MAP_DELAY_WATCH = 0; var DEFAULT_ALERT_SOUND_URL = EXTERNAL_RESOURCE+'Fire_alarm.ogg'; var DEFAULT_SCOUT_SOUND_URL = EXTERNAL_RESOURCE+'Red-Alert.mp3'; var SWF_PLAYER_URL = EXTERNAL_RESOURCE+'pdxminiplayer.swf'; var SWF_PREFIX = ''; var AudioManager; var HourGlasses = [1,2,3,4,5,6,7,8,10]; var HourGlassName = {}; var SpeedupArray = [60, 900, 3600, 9000, 28800, 54000, 86400, 216000, 0, 345600]; var HGLimit = [30, 301, 2701, 7201, 26101, 50431, 82831, 172800, 302400]; var HourGlassThreshold = HGLimit; // remember tabs! var HourGlassHint = [ 'Usage Condition: 30s+', 'Usage Condition: 5m & 1s+', 'Usage Condition: 45m & 1s+', 'Usage Condition: 2h & 1s+', 'Usage Condition: 7h & 30m & 1s+', 'Usage Condition: 14h & 30m & 1s+', 'Usage Condition: 23h & 30m & 1s+', 'Usage Condition: 48h+', 'Usage Condition: 3d & 12h+', ]; var StorehouseLevels = {0:0,1:100000,2:200000,3:300000,4:400000,5:500000,6:600000,7:700000,8:800000,9:900000,10:1000000,11:5000000,12:50000000}; var ArcaneRequirements = {}; var Filter = { Null:atob('rQ=='), Period:".", Space:" ", UnicodeLS:"
", }; var InitialCityId = null; var btStartupTimer = null; var btLoadTimer = null; var SecondLooper = 1; var ResetAll = false; var RefreshingSeed = false; var RefreshSeedInterval = 15; var KeyTimer = null; var LoadCheckCounter = 12; var MinuteInterval = 60; var presetFailures = 0; var presetTimer = null; var guardianFailures = 0; var ChampionDelayer = 0; var allianceleader = false; var officertype = 4; var CurrPreset = null; var HTMLRegister = {}; var AJAX_LOG = []; function $(ID,root) {return (root||document).getElementById(ID);} var GlobalOptions = { btWatchdog : false, btNoMoreRy : false, btWideScreenStyle : 'normal', btPowerBar : false, btFloatingPowerBar : true, btPowerBarPopups : true, btPowerBarOpen : false, DashboardToggle : true, btOverviewDashboardBtn : true, btChatOnRight : true, btChatBeforeDash : true, btWideMap : true, btWinSize : {x:1000,y:100}, btTrackOpen : true, btTransparent : false, AutoUpdates : true, UpdateLocation : 0, // 0 - Greasyfork ExtendedDebugMode : false, InOutToggle : true, MarchPlusToggle : true, BattleToggle : true, TokenEnabled : true, LastTopURL : '', GlobalOptionsVersion : '0', ExtraTabsVersion : '0', TabAutoCheck : true, ExtraTabs : [ {"source":EXTERNAL_RESOURCE+"tabs/AutoDF.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/BulkAttack.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Defend.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Raid.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/GuardWidget.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Debug.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Tournament.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Megalith.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Aport.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Throne.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Champ.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Research.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Boss.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Resources.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/MAR.js","data":null,"enabled":false,"lastchecked":0,"version":""}, {"source":EXTERNAL_RESOURCE+"tabs/Joust.js","data":null,"enabled":false,"lastchecked":0,"version":""}, ], }; var UserOptions = { autoPublishGamePopups : false, autoCancelGamePopups : true, autoPublishPrivacySetting : 40, CustomPublish : {}, CustomListId : "", TokenAuto : false, OverrideRefresh : "", TokenDomain : null, TokenDate : 0, TokenCount : 0, TokenLink : "", TokenCollected : false, LastTokenStatus : "", BuildLink : "", BuildCollected : false, LastBuildStatus : "", ChestDomainList : "", ChestCollected : {}, BadChestDomains : {}, BonusCollected : false, LastChestStatus : "", TreasureChest : true, BankTreasureChests : true, MaxBankedTreasureChests : 500, TreasureChestBank : [], // {tokenId, feedId, serverId, playerId, tileName, unixTime_taken, link} TreasureChestBankOther : [], TokenRequest : "", TokenResponse : "", TokenSuccessLink : "", TokenChestFeedId : 0, TokenChestUID : 0, }; var Options = { MonitorOptions : { MonitorFontSize : 11, MonPresetChange : true, TRMonPresetByName : false, }, Colors : { Title: '#342819', TitleText: '#FFFFFF', DividerTop: '#E9D9AE', DividerBottom: '#8C7D5D', DividerText: '#000000', Panel: '#F7F3E6', PanelText: '#000000', Highlight: '#FFFFCC', HighlightText: '#000000', }, ChatOptions : { Colors : { ChatLeaders: '#0ca8f2', ChatGlobal: '#CCCCFF', ChatAll: '#99CCFF', ChatAtt: '#FF4D4D', ChatScout: '#FF8800', ChatRecall: '#6B8E23', ChatWhisper: '#FF4D4D', ChatVC: '#00FF00', ChatChancy: '#F8E151', }, }, btEveryEnable : false, btEveryMins : 30, btEveryToggle : false, detAFK : false, btWinIsOpen : false, currentTab : null, btWinPos : {}, btDashPos : {}, btMonPos : {}, btIncPos : {}, btOutPos : {}, btBatPos : {}, btMarchPos : {}, TRFixPresetWidth : false, fixKnightSelect : true, attackCityPicker : true, dispBattleRounds : true, reportDeleteButton : true, fixChatTime : true, gmtClock : true, gmtClockType : 0, MoveFurniture : true, fixLoadCap : true, hideOnGoto : true, DontFilterTransportTroops : true, MapShowExtra : false, MapShowLevel : false, mapInfo : true, mapInfo2 : true, mapInfo3 : true, mapMenuInfo : true, dispStatus : true, fixPageNav : true, enhancedinbox : true, enhanceARpts : true, enhanceViewMembers : true, EnhCBtns : true, DbClkDefBtns : false, ColrCityBtns : true, WarnAscension : true, WarnAscensionInterval : 1, mapCoordsTop : true, fixTRAetherCost : true, fixMMBImage : true, OverrideAttackAlert : true, FetchMarchInfo : true, LoginReward : true, MagicBox : true, KillFairie : true, MiniRefresh : false, MiniRefreshInterval : 3, StalledMarches : true, amain : true, smain : -1, lmain : 0, KillSounds : true, KillMusic : true, hideAttackEfforts : true, OneClickAttack : true, OneClickAttackPreset : 0, AllowMultiBrowser : false, PremiumAccessCode : '', AFKTimeout : 2, RaidRunning : true, RaidLastReset : 0, FreeRallySlots : 0, pbGoldHappy : 95, pbGoldEnable : false, lastCollect : {}, pbFoodAlert : false, pbFoodAlertInt : 1, lastAlert : {}, countAlert : {}, FixMightDisplay : true, MapInterval : 5, TRWidget : false, ThroneHUD : false, DFReport : false, DFReportInterval : 1, LastDFReport : 0, RaidToggle : false, RaidButtons : false, RaidDeleteButton : false, presetPosition : null, DraggableWidget : true, coordsPosition : null, DraggableCoords : true, ClickForReports : false, AutoMist : false, AutoMistMarch : false, LanguageLastChecked : 0, FixCastleLag : true, OpenSettingsDiv : '', btDashboard : true, GreenCastles : true, Theme : 'Default', OptionsVersion : '0', AlternateSortOrder : true, btFloatingDashboard : false, DisableRedX : true, DisableGreenTick : false, ShowMarchMight : false, ShowGloryMight : true, ShowServerTraffic : true, RemovePointlessItems : false, QuickScoutTroops : 3, }; //** Auto Update **// var AutoUpdater = { id: 999999, GreasyForkURL:'https://greasyfork.org/scripts/465634-power-bot-plus-lite/code/Power%20Bot%20Plus%20Lite.user.js', name: 'KoC Power Bot Plus Lite', version: Version, secure: true, call: function(secure,response) {logit("Checking for "+tx(this.name)+" Update!"+(secure ? ' (SSL)' : ' (plain)')); this.secure = secure; var CheckURL = this.SourceForgeURL; if (GlobalOptions.UpdateLocation == 0) {CheckURL = this.GreasyForkURL;} try { GM_xmlhttpRequest({ method: 'GET', url: 'http'+(secure ? 's' : '')+'://'+CheckURL, onload: function(xpr) {AutoUpdater.compare(xpr,response);}, onerror: function(xpr) {if (secure) {AutoUpdater.call(false,response);} else {AutoUpdater.compare({responseText:""},response);}} }); } catch (e){ logerr(e); } }, compareVersion: function(r_version, l_version) { var r_parts = r_version.split(''), l_parts = l_version.split(''), r_len = r_parts.length, l_len = l_parts.length, r = l = 0; for(var i = 0, len = (r_len > l_len ? r_len : l_len); i < len && r == l; ++i) { r = +(parseIntNan(r_parts[i]||0)); l = +(parseIntNan(l_parts[i]||0)); } return (r !== l) ? r > l : false; }, compare: function(xpr,response) { this.xversion=/\/\/\s*@version\s+(.+)\s*\n/i.exec(xpr.responseText); if (this.xversion) this.xversion = this.xversion[1]; else { if (response) { uW.Modal.showAlert('
'+tx('Unable to check for updates to')+' '+tx(this.name)+'.
'+tx('Please change the update options or visit the')+'
'+tx('script homepage')+'
'); } logit("Unable to check for updates :("); return; } this.xrelnotes=/\/\/\s*@releasenotes\s+(.+)\s*\n/i.exec(xpr.responseText); if (this.xrelnotes) this.xrelnotes = this.xrelnotes[1]; var updated = this.compareVersion(this.xversion, this.version); if (updated) {logit('New Version Available!'); var body = '
'+tx('New version')+' '+this.xversion+' '+tx('is available!')+'

'; if (this.xrelnotes) body+='
'+tx('New Features!')+'

'+this.xrelnotes+'


'; var DownloadURL = AutoUpdater.SourceForgeURL; if (GlobalOptions.UpdateLocation == 1) {DownloadURL = AutoUpdater.GreasyForkURL;} body+='
Update
'; this.ShowUpdate(body); } else { logit("No updates available :("); if (response) { uW.Modal.showAlert('
'+tx('No updates available for')+' '+tx(this.name)+' '+tx('at this time.')+'
'); } } }, check: function() { var now = unixTime(); var lastCheck = 0; if (GM_getValue('updated_'+this.id, 0)) lastCheck = parseInt(GM_getValue('updated_'+this.id, 0)); if (now > (lastCheck + 60*60*24)) this.call(true,false); GM_setValue('updated_'+AutoUpdater.id, now); }, ShowUpdate: function (body) { var ModalBody = uWCreateObjectIn ('btModalBody',{}); ModalBody.title = tx(this.name); ModalBody.body = body; ModalBody.closeNow = false; ModalBody["class"] = "Warning"; ModalBody.curtain = false; ModalBody.width = 500; ModalBody.height = 700; ModalBody.left = 140; ModalBody.top = 140; exportFunction(function () { CM.ModalManager.closeAll(); },ModalBody,{defineAs:'close'}); CM.ModalManager.addMedium(ModalBody); ById('doBotUpdate').addEventListener ('click', this.doUpdate, false); }, doUpdate: function () { CM.ModalManager.closeAll(); CM.ModalManager.close(); }, }; var nHtml={ FindByXPath:function(obj,xpath,nodetype) { if (!nodetype) { nodetype = XPathResult.FIRST_ORDERED_NODE_TYPE; } try { var q=document.evaluate(xpath,obj,null,nodetype,null); } catch (e) { GM_log('bad xpath:'+xpath); } if (nodetype == XPathResult.FIRST_ORDERED_NODE_TYPE) { if (q && q.singleNodeValue) { return q.singleNodeValue; }} else { if(q){ return q; }} return null; }, ClickWin:function(obj,evtName) { var evt = window.document.createEvent("MouseEvents"); evt.initMouseEvent(evtName, true, true, obj.ownerDocument.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null); return !obj.dispatchEvent(evt); }, Click:function(obj) { return this.ClickWin(obj,'click'); }, ClickTimeout:function(obj,millisec) { window.setTimeout(function() { return nHtml.ClickWin(obj,'click'); },millisec+Math.floor(Math.random()*500)); }, SetSelect:function(obj,v) { for(var o=0; o= 0) { FacebookInstance (); HandleInlinePublishPopup (); LoadChecker(true); } else { if (document.URL.search(/games\/kingdoms-of-camelot\/play/i) >= 0) { StandAloneInstance (); LoadChecker(true); } else { if (document.URL.search(/facebook.com/i) >= 0) { if(document.URL.search(/dialog\/feed/i) >= 0) { HandlePublishPopup (); } } else { if (document.URL.search(/rycamelot.com/i) >= 0) { if (window.self.location != window.parent.location) { // Fix weird bug with koc game? if (document.URL.search(/main_src.php/i) != -1) { SetGameScreen (); } else { CheckTokenCollection(); } } } } } } /** Initialise BOT **/ function PowerBotStartup () { clearTimeout (btStartupTimer); if (uW.btLoaded) return; var metc = getClientCoords(ById('main_engagement_tabs')); if (metc.width==null || metc.width==0) { // wait until page loaded btStartupTimer = setTimeout (PowerBotStartup, 1000); return; } // initialise Bot logit('initialising Power Bot Plus Lite'); PBPWatchdog(); // set up top tabs var tabs=ById('main_engagement_tabs'); if (tabs) { SetupMainTab(tabs); SetupSubTab(tabs); } readUserOptions (uW.user_id); // fb user id readOptions (); Dashboard.OptionsInit(); // always initialise dashboard options Options.Language = uW.g_ajaxparams.lang; readLanguage(Options.Language); // initially load any language settings stored in browser memory cache AreYouALeader(); RefreshEvery.init (); RefreshEvery.box.innerHTML = '    '+tx('Initialising PowerBot+ Lite')+' ...'; ModifyUWObjects(); InitialiseAudioManager(); DefaultWindowPos('btWinPos','main_engagement_tabs'); DefaultWindowPos('btDashPos','main_engagement_tabs'); if (GlobalOptions.btTransparent) { Opacity = 0.9; } else { Opacity = 1.0; } var HeadColour = 'rgba('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+',0.5)'; if ((HEXtoRGB(Options.Colors.Panel).r*0.299) + (HEXtoRGB(Options.Colors.Panel).g*0.587) + (HEXtoRGB(Options.Colors.Panel).b*0.114) <= 100) { SpeedColour = '#fff'; LinkColour = '#00ff00'; } if (!Options.GreenCastles) { URL_CASTLE_BUT_SEL=URL_CASTLE_BUT_HOVER; } var styles = '\ .buttonv2.std {width:123px; height:20px; line-height:20px; padding:2px 7px;} \ .kocmain .mod_comm .comm_global .chatlist .global {background-color:transparent;}\ table.xtab td {padding-right: 5px; border:none; background:none; white-space:nowrap;}\ table.xtabBR td {padding-right: 5px; border:none; background:none; white-space:normal;}\ .xtabBorder {background:none; border:1px solid #ccc; padding: 1px;}\ .xtab {padding-right:5px; border:none; background:none; white-space:nowrap;}\ .xtabBR {padding-right:5px; border:none; background:none; white-space:normal;}\ .xtabHD {padding-right:5px; border-bottom:1px solid '+HeadColour+'; background:none; white-space:nowrap;font-weight:bold;font-size:11px;color:'+HeadColour+';margin-left:10px;margin-right:10px;margin-top:5px;margin-bottom:5px;vertical-align:text-top;align:left}\ .xtabHDDef {padding-right: 5px; border-bottom:1px solid '+HeadColour+'; background:none; white-space:nowrap;font-weight:bold;font-size:11px;color:#f00;margin-left:10px;margin-right:10px;margin-top:5px;margin-bottom:5px;vertical-align:text-top;align:left}\ .xtabBRTop {padding-right: 5px; border:none; background:none; white-space:normal; vertical-align:top;}\ .xtabH {background:'+Options.Colors.Panel+'; border:none; padding-right: 5px; padding-left: 5px; margin-left:10px;}\ .xtabHL {background:'+Options.Colors.Panel+'; border-width: 1px; border-style: none none none solid; padding-right:5px; padding-left:5px; margin-left:10px;}\ .xtabL {background:none; border-width: 1px; border-style: none none none solid; padding-right:5px; padding-left: 5px; margin-left:10px;}\ .xtabLine {padding:0px; spacing:0px; height:1px; border-color:black; border-width: 1px; border-style: none none solid none;}\ a.xlink {color:'+LinkColour+' !important;}\ table.xtab td.xtabTotal {border-bottom:1px solid '+HeadColour+'; border-top:1px solid '+HeadColour+';}\ tr.btPopupTop td {background-color:'+Options.Colors.Title+'; border:1px solid #000000; height: 21px; padding:0px; color:'+Options.Colors.TitleText+';}\ .btPopMain {background-color:'+Options.Colors.Panel+'; border:1px solid #000000; -moz-box-shadow:inset 0px 0px 10px #6a6a6a; -moz-border-radius-bottomright: 20px; -moz-border-radius-bottomleft: 20px; border-bottom-right-radius: 20px; border-bottom-left-radius: 20px; font-size:11px; color:'+Options.Colors.PanelText+'}\ .btMonitor_btPopMain {font-size:'+Options.MonitorOptions.MonitorFontSize+'px;}\ .btPopup {border:5px ridge #666; opacity:'+Opacity+'; -moz-border-radius:25px; border-radius:25px; -moz-box-shadow: 1px 1px 5px #000000;}\ .btReportPopup_btPopMain {font-size:12px;}\ .btSelector {font-size:11px;}\ .btInput {font-size:10px;}\ .AlertStyle {background:url("'+AlertBG+'") no-repeat left;}\ .AlertContent {border:none; background:none; white-space:nowrap;font:bold 11px Georgia;color:#551000;text-align:left;height:13px;}\ .AlertLink {text-decoration:none;color:#ecddc1;text-shadow: 0px 0px 15px #000;}\ .TextLink {text-decoration:none;}\ .TextLink:Hover {text-decoration:none;}\ .TextLink:Active {text-decoration:none;}\ .divHide {display:none}\ .divHeader {border:0px solid; border-color:#000000; background: -moz-linear-gradient(top,'+Options.Colors.DividerTop+','+Options.Colors.DividerBottom+'); background: -webkit-linear-gradient(top,'+Options.Colors.DividerTop+', '+Options.Colors.DividerBottom+'); -moz-border-radius:5px; height: 16px;border-bottom:0px solid #000000;font-weight:bold;font-size:11px;opacity:0.75;margin-left:0px;margin-right:0px;margin-top:1px;margin-bottom:0px;padding-top:4px;padding-right:10px;padding-left:4px;vertical-align:text-top;align:left; color:'+Options.Colors.DividerText+';}\ .btButton:Hover {color:#FFFF80;}\ .oddRow {height:20px;background: rgba(0,0,0,0.05);}\ .evenRow {height:20px;background: rgba(0,0,0,0);}\ .highRow {height:20px;font-weight:bold;background-color:'+Options.Colors.Highlight+';color:'+Options.Colors.HighlightText+';}\ .totalCell {background-color:'+Options.Colors.Highlight+';color:'+Options.Colors.HighlightText+'}\ .divLink {color:#000;text-decoration:none;}\ .divLink:Hover {color:#000;text-decoration:none;}\ .divLink:Active {color:#000;text-decoration:none;}\ .castleBut {outline:0px; margin-left:0px; margin-right:0px; width:23px; height:25px; font-size:12px; font-weight:bold;}\ .castleBut:hover {background:url("'+URL_CASTLE_BUT_HOVER+'") no-repeat center center;}\ .castleButNon {background:url("'+URL_CASTLE_BUT+'") no-repeat center center;}\ .castleButSel {background:url("'+URL_CASTLE_BUT_SEL+'") no-repeat center center;}\ .castleButBack {background-color:#f00;display:inline-block;width:23px; height:25px;}\ .trimg:hover span.trtip {display:block; opacity: 1.0; z-index:999999; font-size:11px; text-align:left; position:absolute; background: #FFFFAA; color: #000; border: 1px solid #FFAD33; padding: 0.5em 0.5em;}\ .trimg span.trtip {display:none;}\ .trimg span.trtip:hover {display:none;}\ .presetBut {outline:0px; margin-left:0px; margin-right:0px; width:22px; height:22px; font-family: georgia,arial,sans-serif;font-size: 12px;color:white; line-height:19px;}\ .presetButNon {background:url("'+PresetImage+'") no-repeat center center;}\ .presetButLck {background:url("'+PresetImage_LCK+'") no-repeat center center;}\ .presetButSel {background:url("'+PresetImage_SEL+'") no-repeat center center;}\ .presetButDis {opacity: 0.4;}\ .guardBut {outline:0px; margin-left:0px; margin-right:0px; width:31px; height:33px; font-family: georgia,arial,sans-serif;line-height:52px;font-size:11px;font-weight:bold;color:#fff;text-shadow: 1px 1px 2px #000,-1px -1px 2px #000; background: url("'+GuardBG+'") no-repeat scroll 0% 0% transparent; background-size:350px;}\ .guardButNon {border: 2px solid transparent;}\ .guardButSel {border: 2px solid blue;}\ .champBut {outline:0px; margin-left:0px; margin-right:0px; width:31px; height:33px; font-family: georgia,arial,sans-serif;line-height:52px;font-size:11px;font-weight:bold;color:#fff;text-shadow: 1px 1px 2px #000,-1px -1px 2px #000;}\ .champButNon {border: 2px solid transparent;}\ .champButSel {border: 2px solid green;}\ .champButMarch {border: 2px solid red;}\ .ptChatAttack {color: #000; font-weight:bold; background-color:'+Options.ChatOptions.Colors.ChatAtt+';}\ .ptChatScout {color: #000; font-weight:bold; background-color:'+Options.ChatOptions.Colors.ChatScout+';}\ .ptChatRecall {color: #000; font-weight:bold; background-color:'+Options.ChatOptions.Colors.ChatRecall+';}\ .ptChatWhisper {font-weight:bold; color:'+Options.ChatOptions.Colors.ChatWhisper+';}\ .ptChatAlliance {background-color:'+Options.ChatOptions.Colors.ChatAll+';}\ .ptChatGlobal {background-color:'+Options.ChatOptions.Colors.ChatGlobal+';}\ .ptChatBold {font-weight:bold}\ .ptChatGlobalAll {font-weight:bold;background-color:'+Options.ChatOptions.Colors.ChatGlobal+';}\ .ptChatIcon {border: 1px inset black}\ .ptChatCHAN {color:#000; background-color:'+Options.ChatOptions.Colors.ChatChancy+';}\ .ptChatVICE {color:#000; background-color:'+Options.ChatOptions.Colors.ChatVC+';}\ .ptChatOFFI {color:#000; background-color:'+Options.ChatOptions.Colors.ChatLeaders+';}\ .ptChatGLORY {background-image: url('+GLORY_BACKGROUND+'); background-size: 40px 33px; background-position: right bottom; background-repeat: no-repeat; min-height:65px; }\ .ptChatRAINBOW {background-image: url('+RAINBOW_BACKGROUND+'); background-size: 280px 1px; background-position: left top; background-repeat: repeat-y; }\ table.ptTab tr td {border:none; background:none; white-space:nowrap;}\ .whiteOnRed {padding-left:3px; padding-right:3px; background-color:#f00; color:white; font-weight:bold}\ .whiteOnGreen {padding-left:3px; padding-right:3px; background-color:#080; color:white; font-weight:bold}\ span.boldRed {color:#800; font-weight:bold}\ span.boldOrange {color:#F80; font-weight:bold}\ span.boldGreen {color:#080; font-weight:bold}\ span.boldMagenta {color:#808; font-weight:bold}\ .kocHeader .timeAndDomain {margin: 13px 0px 0px -5px;}\ .kocmain .mod_maparea .mod_citylist .city_warning{background: url('+URL_CASTLE_WARN+') no-repeat; margin-top: 4px;}\ .btExpander {background:none; -moz-border-radius-bottomright: 20px; -moz-border-radius-topright: 20px; border-bottom-right-radius: 20px; border-top-right-radius: 20px;}\ .btBackExpander {background:none; -moz-border-radius-bottomleft: 20px; -moz-border-radius-topleft: 20px; border-bottom-left-radius: 20px; border-top-left-radius: 20px;}\ .tooldesc:hover span.tooltip {display:block; position:absolute; color: #000000; background: #FFFFAA; border: 1px solid #FFAD33; padding: 0.5em 0.5em;}\ .tooldesc span.tooltip {display:none;}\ .tooldesc span.tooltip:hover {display:none;}\ .flip {-webkit-transform: rotate(180deg); -moz-transform: rotate(180deg); transform: rotate(180deg);}\ .smileyimage {width:17px !important;height:17px !important;float:none !important;}\ .wrap {white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;}\ .ui-tabs { padding: 0px; background: transparent; border-width: 0px; }\ .ui-tabs .ui-tabs-nav { padding-left: 0px; background: transparent; border-width: 0px 0px 1px 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; }\ .ui-tabs li.ui-tabs-active { border-width: 1px 1px 0px 1px; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; background-color:'+Options.Colors.Panel+'; }\ .ui-tabs .ui-tabs-panel { border-width: 0px 0px 0px 1px; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; font-family: georgia,arial,sans-serif; font-size:11px; }\ .ui-tabs .ui-state-active { background: none;}\ .ui-widget-content a { color: #fff; }\ .buttonv2.purple { background: -moz-linear-gradient(center top , #F0F, #808 100%) repeat scroll 0% 0% transparent; background: -webkit-linear-gradient(top , #F0F, #808 100%) repeat scroll 0% 0% transparent; }\ .buttonv2.purple:hover { background: -moz-linear-gradient(center top , #FF44FF, #A044A0 100%) repeat scroll 0% 0% transparent; background: -webkit-linear-gradient(top , #FF44FF, #A044A0 100%) repeat scroll 0% 0% transparent; }\ .buttonv2.orange { background: -moz-linear-gradient(center top , #FF8000, #FF4500 100%) repeat scroll 0% 0% transparent; background: -webkit-linear-gradient(top , #FF8000, #FF4500 100%) repeat scroll 0% 0% transparent; }\ .buttonv2.orange:hover { background: -moz-linear-gradient(center top , #FFB045, #FF8045 100%) repeat scroll 0% 0% transparent; background: -webkit-linear-gradient(top , #FFB045, #FF8045 100%) repeat scroll 0% 0% transparent; }\ .btIcon { vertical-align:text-bottom; }\ .btTop { vertical-align:text-top; }\ .btFaint { opacity:0.8; }\ div.ErrText {color:#FF0000;}'; GM_addStyle("a.inlineButton.brown11 span {background: url("+LONG_BROWN_BTN+") no-repeat scroll left top transparent; !important}"); GM_addStyle(".castleBut.defending {border-top: 2px; border-bottom: 2px; border-left: 2px; border-right: 2px; border-style: ridge; border-color: red;}"); GM_addStyle(".castleBut.hiding {border-top: 2px; border-bottom: 2px; border-left: 2px; border-right: 2px; border-style: ridge; border-color: rgb(229, 221, 201);}"); GM_addStyle(".castleBut.attack {opacity: 0.6;}"); GM_addStyle("#directory_tabs {background: -moz-linear-gradient(center top , rgba(0,0,0,0) 50%, #1B64CB 55%, #163665 100%) repeat scroll 0% 0% transparent}"); GM_addStyle('div.rored {color:#fff !important}'); if (Options.ShowServerTraffic) { if (ById('kochead_time')) { var newdiv = document.createElement('div'); newdiv.innerHTML = tx('Server Traffic')+':  '; ById('kochead_time').parentNode.parentNode.appendChild(newdiv); ByCl('timeAndDomain')[0].style.marginTop = '4px'; ByCl('avatarInfo')[0].style.marginTop = '10px'; } } if(uW.g_js_strings) { uW.g_js_strings.commonstr.yourScriptVersionIsOut = uW.g_js_strings.checkoutofdate.reloadconfirm; // more meaningful!! if (uW.cm.thronestats && uW.cm.thronestats.boosts && uW.cm.thronestats.boosts.Speed) { uW.cm.thronestats.boosts.Speed.BoostName = uW.g_js_strings.throneRoom.effectName_4; // change speed to combat speed in TR Caps } } var gg = ByCl('gem_gifting'); if(gg.length > 0) for(var g = 0; g < gg.length;g++) gg[g].style.display = 'none'; if (!GlobalOptions.btPowerBar) { AddMainTabLink(tx('PowerBot+ Lite'), 'PBPButton', eventHideShow, mouseMainTab); } /* add all effects to alternate sort order */ for (k in uW.cm.thronestats.tiers) { if (AlternateSortOrder.indexOf(parseInt(k)) == -1) { AlternateSortOrder.push(parseInt(k)); } } setCities(); if (ArcanaEnabled()) { for (var l=1;l<=parseIntNan(Seed.allianceHQ.buildings[3].buildingLevel);l++) { for (var ll in Seed.arcaneRequirements[l]) { if (Seed.arcaneRequirements[l][ll].isAvailable) { ArcaneRequirements[ll] = JSON2.parse(JSON2.stringify(Seed.arcaneRequirements[l][ll])); } } } } if (!Seed.arcanaApothecaryBuffValue) { Seed.arcanaApothecaryBuffValue = 0; } if (!Seed.arcanaAetherstoneCapBuffValue) { Seed.arcanaAetherstoneCapBuffValue = 0; } /* set initial city ID (for city selectors in all the panels and tabs, NOT Dashboard!) */ InitialCityId = uW.currentcityid; if (Options.amain) { if (Options.smain == -1) { if (Cities.cities[Options.lmain]) { InitialCityId = Cities.cities[Options.lmain].id; } } else { if (Cities.cities[Options.smain]) { InitialCityId = Cities.cities[Options.smain].id; } } } setTroops(); SelectiveDefending = uW.g_serverType != CM.SERVER_TYPES.PVP; CE_EFFECT_TIERS = CM.WorldSettings.getSettingAsObject("CE_EFFECTS_TIERS"); for (var i in ScoutTroops) { ScoutTroops[i] = uW.unitnamedesctranslated['unt'+i][0]; } var effectTiers = CE_EFFECT_TIERS; var effObjSize=0,effsplit={},basegrowth={}; for (var k in effectTiers) { effsplit=effectTiers[k]["Id_Tier"].split(","); ChampionStatTiers[''+effsplit[0]]={}; } for (var k in effectTiers) { effsplit=effectTiers[k]["Id_Tier"].split(","); basegrowth={}; basegrowth['base']=effectTiers[k]["Base"]; basegrowth['growth']=effectTiers[k]["Growth"]; ChampionStatTiers[''+effsplit[0]][''+effsplit[1]]=basegrowth; } CE_MIGHT_RARITY_MAP = CM.WorldSettings.getSettingAsObject("CE_MIGHT_RARITY_MAP"); CE_MIGHT_LEVEL_MAP = CM.WorldSettings.getSettingAsObject("CE_MIGHT_LEVEL_MAP"); for (var h=0;h'; WideScreen.setDashboard (Options.btDashboard); // do after styles added ^^ // Load in Additional/Optional Tabs var NewVersion = false; if (!GlobalOptions.ExtraTabsVersion || AutoUpdater.compareVersion(Version, GlobalOptions.ExtraTabsVersion)) { NewVersion = true; GlobalOptions.ExtraTabsVersion = Version; saveGlobalOptions(); } CheckDelay = 0; for (var e in GlobalOptions.ExtraTabs) { if (GlobalOptions.ExtraTabs[e].enabled) { try { eval(atob(GlobalOptions.ExtraTabs[e].data)); } catch (err){ logerr(err);} if (GlobalOptions.TabAutoCheck) { var now = unixTime(); if (NewVersion || (!GlobalOptions.ExtraTabs[e].lastchecked || GlobalOptions.ExtraTabs[e].lastchecked + (3600*24*3) < now)) { // only check for new tabs once every 3 days, or if main script version changes CheckDelay++; setTimeout(Tabs.Options.TabLoad,(CheckDelay*1250),e,true); } } } } // Basic initialisation complete tabManager.init (mainPop.getMainDiv()); Incoming.init(); Outgoing.init(); QuickMarch.init(); Battle.init(); QuickScout.init(); // check token response Tabs.Options.CheckTokenResponse(); if (GlobalOptions.DashboardToggle) { AddPowerBarLink(tx('Dashboard'), 'PBPDashButton', function() { WideScreen.ShowDashboard(!Options.btDashboard);}, function(me) { if (Options.btFloatingDashboard) ResetWindowPos (me,'main_engagement_tabs',popDash);}); } if (Options.btWinIsOpen && GlobalOptions.btTrackOpen){ mainPop.show (true); tabManager.showTab(true); } // fix leaderboard display so you can always see might leaderboard even if glory leaderboard returns no results! var lbfix = new CalterUwFunc("modal_fow_leaderboard",[['e.emptySet','false']]); lbfix.setEnable(true); // Set to check for updates in 15 seconds // if (GlobalOptions.AutoUpdates) setTimeout(function(){AutoUpdater.check();},15000); // start main looper afkdetector.init(); SecondTimer = setTimeout(EverySecond,0); // TEMP FIX FOR REPORTS var rptfix = new CalterUwFunc('Messages.deleteCheckedReports', [['MessagesController', 'MessageController']]); rptfix.setEnable(true); // UPDATE_SEED_AJAX IS CRASHING OUT IN UPDATE_MARCH SOMETIMES - THIS IS BAD, SO PUT A TRY-CATCH AROUND IT. t.updateseedfix = new CalterUwFunc('update_seed_ajax', [ [/if\s*\(typeof\s*isCancelTraining/im, 'var l_lastCallTime = cm.l_lastCallTime; var reload_requests = cm.reload_requests; var l_callIntervalMin = cm.l_callIntervalMin; if(typeof isCancelTraining'], [/update_march\(rslt.updateMarch\)/im, 'try {update_march(rslt.updateMarch);} catch (V) {}'], ]); t.updateseedfix.setEnable(true); // initialisation complete! uW.btLoaded = true; LoadChecker(false); window.addEventListener('beforeunload', onUnload, false); RefreshEvery.box.innerHTML = '    PowerBot+ Lite Initialised!'; actionLog('Power Bot Plus Lite ('+Version+') successfully initialised'); } var contents = document.getElementById("contents"); var link; if(contents){ if(contents.textContent.match('.*(Routine Check).*')){ link = contents.getElementsByTagName("a")[1].href; setTimeout(Captcha,250);//use a delay } } function Captcha(){ location.href = link; } function RememberWindowPositions() { Options.btWinPos = mainPop.getLocation(); if (popDash && Options.btFloatingDashboard) { Options.btDashPos = popDash.getLocation(); } if (popMon) { Options.btMonPos = popMon.getLocation(); } if (popInc) { Options.btIncPos = popInc.getLocation(); } if (popOut) { Options.btOutPos = popOut.getLocation(); } if (popBat) { Options.btBatPos = popBat.getLocation(); } if (popMarch) { Options.btMarchPos = popMarch.getLocation(); } } function onUnload (){ if (uW.btLoaded) { Options.lmain = Cities.byID[uW.currentcityid].idx; RememberWindowPositions(); if (!ResetAll) { saveGlobalOptions(); saveUserOptions(uW.user_id); saveOptions(); } } // clear down uW Objects on unload?? if (uW.cpopupWins) uW.cpopupWins = null; if (uW.calterRegistry) uW.calterRegistry = null; if (uW.uWFunc) uW.uWFunc = null; } /** uW Modifiers **/ function ModifyUWObjects () { function DoveOfPeace (iid) { // popup ModalMultiButton({ buttons: [ { txt: tx("Use Dove of Peace"), exe: function () {uW.Modal.hideModal();UseDove(iid);}}, { txt: tx("Cancel Request"), exe: function () {uW.Modal.hideModal();}}], body: "
"+tx('Please confirm you want to use a Dove of Peace')+"?
", title: tx("Confirm Dove") }); }; function ShowCity (idx) { SelectCity(idx); uW.changeview_city(ById("mod_views_city")); uW.btChangeDashCity(uW.currentcityid); } function ShowKnightsHall (city) { if (OpenBuilding(city+1,"7")) { uW.changeKnightModalTabs(1); } } function ShowGuardians(city) { SelectCity(city+1); CM.guardianModalModel.open(); } function ShowEmbassy (city) { OpenBuilding(city+1,"8"); } function ShowWalls (city) { SelectCity(city+1); if (Seed.buildings["city" + uW.currentcityid].pos1) { uW.modal_build(1); } else { uW.modal_buildnew(1); } } function SendAllHome (cityId) { jQuery('#btSendAllHome').addClass("disabled"); Dashboard.serverwait = true; var Returns = []; Returns = Dashboard.Reins.slice(); var delayer = 0; for (var r in Returns) { var mid = Returns[r]; delayer = delayer + 1; setTimeout (Dashboard.SendHome,(500*delayer),mid); // spread them out ... } delayer = delayer + 1; function ClearAtEnd () { jQuery('#btSendAllHome').removeClass("disabled"); Dashboard.serverwait = false; }; setTimeout (ClearAtEnd,(500*delayer)); // let screen updates run again } function CreateChampionPopUp (elem,chkcityId,localchamp,champid,maparea,cityinfo) { effects = ById(elem.id+'effects'); // do a compare, or get local champ details... if (Options.DashboardOptions.ChampionCompare || localchamp) { var oureffects = '

'+uW.g_js_strings.champ.no_champ+'
'+tx('Assigned')+'!
'; try { for (var y in Seed.champion.champions) { chkchamp = Seed.champion.champions[y]; if (chkchamp.assignedCity && !Cities.byID[chkchamp.assignedCity]) { chkchamp.assignedCity = 0; } if (chkchamp.championId) { if ((!champid && chkchamp.assignedCity == chkcityId) || (chkchamp.championId == champid)) { var status = ''; var champstatus = chkchamp.status; if (maparea) { if (champstatus != "10") { status = ' ('+tx('Defending')+')'; } else { status = ' ('+tx('Marching')+')'; } } else { if (cityinfo) { var status = '
'; if (chkchamp.assignedCity==0) { status += tx('Unassigned')+''; } else { if (champstatus != "10") { status += tx('Defending')+' '; } else { status += tx('Marching from')+' '; } status += Cities.byID[chkchamp.assignedCity].name+''; } } } oureffects = ''; // equipped items var CHAMP_DATA = BuildChampData (uW.kocChampionItems,chkchamp.championId); var equippedchampstats = CHAMP_DATA.equippedchampstats; var equippedtroopstats = CHAMP_DATA.equippedtroopstats; var equippedbossstats = CHAMP_DATA.equippedbosstats; var SteelHoofCount = CHAMP_DATA.SteelHoofCount; var LightBringerCount = CHAMP_DATA.LightBringerCount; var DragonScaleCount = CHAMP_DATA.DragonScaleCount; var TestCount = CHAMP_DATA.TestCount; var WildHideCount = CHAMP_DATA.WildHideCount; var VespersCount = CHAMP_DATA.VespersCount; var SilverCount = CHAMP_DATA.SilverCount; var WarlockCount = CHAMP_DATA.WarlockCount; var IceQueenCount = CHAMP_DATA.IceQueenCount; var EagleCount = CHAMP_DATA.EagleCount; var DragonWarriorCount = CHAMP_DATA.DragonWarriorCount; var gotchamp = false; for (var k in equippedchampstats) { gotchamp = true; str = uW.g_js_strings.effects['name_'+k]; var chEffect = getChampCappedValue(k,equippedchampstats[k]); if (k>= 300) { if (k==314) { str = tx('Add. Defend Bonus'); } else { str = tx('Inc. Bonus')+' '+str.split(" "+tx("equipment"))[0]; } var champvalue = +((chEffect*100).toFixed(2))+"%"; } else { var champvalue = +(chEffect.toFixed(2)); } if (str && str!= "") { oureffects+=""; } } if (VespersCount >= 4) { gotchamp = true; oureffects+=""; } if (!gotchamp) { oureffects += ''; } oureffects+=""; var gottroops = false; if ((SteelHoofCount >= 4 && LightBringerCount >= 5) || (DragonScaleCount >= 6 && LightBringerCount >= 5)) { gottroops = true; if (SteelHoofCount >= 4 && LightBringerCount >= 5) { oureffects+=""; } else { oureffects+=""; } } else { if (SteelHoofCount >= 4 || DragonScaleCount >= 6) { gottroops = true; if (SteelHoofCount >= 4) { oureffects+=""; } else { oureffects+=""; } } else { if (LightBringerCount >= 5) { gottroops = true; oureffects+=""; } else { if (WildHideCount >= 5) { gottroops = true; oureffects+=""; } else { if (SilverCount >= 5) { gottroops = true; oureffects+=""; } if (WarlockCount >= 5) { gottroops = true; } if (IceQueenCount >= 5) { gottroops = true; } if (EagleCount >= 5) { gottroops = true; } if (DragonWarriorCount >= 5) { gottroops = true; } } } } } for (var k in equippedtroopstats) { gottroops = true; str = uW.g_js_strings.effects['name_'+k]; if (str && str!= "") { var chEffect = getChampCappedValue(k,equippedtroopstats[k]); oureffects+=""; } } if (!gottroops) { oureffects += ''; } for (var k in equippedbossstats) { var gotboss = false; var bosseffects = ''; for (var kk in equippedbossstats[k]) { gotboss = true; str = uW.g_js_strings.effects['name_'+kk]; if (str && str!= "") { var chEffect = getChampCappedValue(kk,equippedbossstats[k][kk]); var champvalue = +(chEffect.toFixed(2))+"%"; bosseffects+=""; } } if (gotboss) { oureffects += ""+bosseffects; } } oureffects+="
'+chkchamp.name+status+'
'+uW.g_js_strings.report_view.champion_stats+'
"+str+""+champvalue+"
"+uW.g_js_strings.champ.vespers+": "+uW.g_js_strings.champ.damage+""+CM.CHAMPION.getVespersDamageSetBonus().replace('+','')+"
None Available
"+uW.g_js_strings.report_view.troop_stats+"
"+uW.g_js_strings.champ.doubleBonus+": "+uW.g_js_strings.champ.attackRange+""+CM.CHAMPION.getSteelhoofsRangeSetBonus().replace('+','')+"
"+uW.g_js_strings.champ.doubleBonus+": "+uW.g_js_strings.champ.attackLife+""+CM.CHAMPION.getSteelhoofsRangeSetBonus().replace('+','')+"
"+uW.g_js_strings.champ.steelhoofsBonus+": "+uW.g_js_strings.champ.range+""+CM.CHAMPION.getSteelhoofsRangeSetBonus().replace('+','')+"
"+uW.g_js_strings.champ.dragonscalesBonus+": "+uW.g_js_strings.champ.life+""+CM.CHAMPION.getSteelhoofsRangeSetBonus().replace('+','')+"
"+uW.g_js_strings.champ.lightbringersBonus+": "+uW.g_js_strings.champ.attack+""+CM.CHAMPION.getLightbringersRangeSetBonus().replace('+','')+"
"+uW.g_js_strings.champ.wildhideBonus+": "+uW.g_js_strings.champ.attack+""+CM.CHAMPION.getWildhideAttackSetBonus().replace('+','')+"
"+uW.g_js_strings.champ.silver+": "+uW.g_js_strings.champ.silverKnightBonus+""+CM.CHAMPION.getSilverknightSpeedDefenceSetBonus().replace('+','')+"
"+str+""+(Math.round(chEffect*100)/100)+"
None Available
"+str+""+champvalue+"
"+uW.itemlist['i'+k].name+' '+uW.g_js_strings.commonstr.stats+"
"; } } } } catch (err) { logerr(err); // write to log oureffects = '
'+tx('Error reading champion data')+'
'; } } td = ById(elem.id+'td'); jQuery('#'+td.id).children("span").remove(); if (maparea) { uW.showTooltip(oureffects,td,null,'mod_maparea');return; } else { if (localchamp) { jQuery('#'+td.id).append('
'+oureffects+'
'); } else { if (Options.ChampionCompare) { jQuery('#'+td.id).append('
'+effects.value+''+oureffects+'
'); } else { jQuery('#'+td.id).append(''+effects.value+''); } } } } function ChangeDashCity(city) { Dashboard.show(Cities.byID[city]); } function StopProp (e) { e.stopPropagation(); } function CityChanged () { if (popDash) uW.btChangeDashCity(uW.currentcityid); Options.lmain = Cities.byID[uW.currentcityid].idx; saveOptions(); SetChampionIcon(); } uWExportFunction('btArthurCheck',function(a) { logit('arthurCheck intercepted'); return; }); uW.arthurCheck = uW.btArthurCheck; uWExportFunction('pthideMe', hideMe); uWExportFunction('ptStopProp', StopProp); uWExportFunction ('btDoveOfPeace', DoveOfPeace); uWExportFunction ('btShowCity', ShowCity); uWExportFunction ('btGotoMapHide', GotoMapHide); uWExportFunction ('btGotoMap', GotoMap); uWExportFunction ('btGotoMapRpt', GotoMapRpt); uWExportFunction ('btShowKnightsHall', ShowKnightsHall); uWExportFunction ('btShowGuardians', ShowGuardians); uWExportFunction ('btShowEmbassy', ShowEmbassy); uWExportFunction ('btShowWalls', ShowWalls); uWExportFunction ('btSendAllHome', SendAllHome); uWExportFunction ('btCreateChampionPopUp', CreateChampionPopUp); uWExportFunction ('btDashboardButtonClick', WideScreen.ShowDashboard); uWExportFunction ('btChangeDashCity', ChangeDashCity); uWExportFunction ('btStartKeyTimer', StartKeyTimer); uWExportFunction ('btSelectTroopType', Dashboard.SelectTroopType); uWExportFunction ('btSetRitualLength', Dashboard.SetRitualLength); uWExportFunction ('btCheckDefaultRitual', Dashboard.CheckDefaultRitual); uWExportFunction ('btStartRitual', Dashboard.StartRitual); uWExportFunction ('btStopRitual', Dashboard.StopRitual); uWExportFunction ('btQuickSacrifice', Dashboard.QuickSacrifice); uWExportFunction ('btSetMaxTroops', Dashboard.SetMaxTroops); uWExportFunction ('btSendHome', Dashboard.SendHome); uWExportFunction ('btSwitchThroneRoom', Dashboard.SwitchThroneRoom); uWExportFunction ('btCancelMarshall', Dashboard.CancelMarshall); uWExportFunction ('btChangeMarshall', Dashboard.ChangeMarshall); uWExportFunction ('btSetMarshall', Dashboard.SetMarshall); uWExportFunction ('btBoostMarshall', Dashboard.BoostMarshall); uWExportFunction ('btCancelChampion', Dashboard.CancelChampion); uWExportFunction ('btChangeChampion', Dashboard.ChangeChampion); uWExportFunction ('btFreeChampion', Dashboard.FreeChampion); uWExportFunction ('btSetChampion', Dashboard.SetChampion); uWExportFunction ('btSelectDefenders', Dashboard.SelectDefenders); uWExportFunction ('btSelectDefTroopType', Dashboard.SelectDefTroopType); uWExportFunction ('btSetMaxDefTroops', Dashboard.SetMaxDefTroops); uWExportFunction ('btAddDefenders', Dashboard.AddDefenders); uWExportFunction ('btNewDefPreset', Dashboard.NewDefPreset); uWExportFunction ('btChgDefPreset', Dashboard.ChgDefPreset); uWExportFunction ('btDelDefPreset', Dashboard.DelDefPreset); uWExportFunction ('btSaveDefPreset', Dashboard.SaveDefPreset); uWExportFunction ('btSetCurrentPreset', Dashboard.SetCurrentPreset); uWExportFunction ('btCancelDefPreset', Dashboard.CancelDefPreset); uWExportFunction ('btSelectDefPreset', Dashboard.SelectDefPreset); uWExportFunction ('btSetPresetDefenders', Dashboard.SetPresetDefenders); uWExportFunction ('btRecall', Dashboard.Recall); uWExportFunction ('btToggleSanctuary', Dashboard.ToggleSanctuary); uWExportFunction ('btOverrideDash', Tabs.Options.OverrideDash); uWExportFunction ('btResetDash', Tabs.Options.ResetDash); uWExportFunction ('btDelMarchPreset', QuickMarch.DelMarchPreset); uWExportFunction ('btSaveMarchPreset', QuickMarch.SaveMarchPreset); uWExportFunction ('btSelectMarchPreset', QuickMarch.SelectMarchPreset); uWExportFunction('btAddPowerBarLink', AddPowerBarLink); uWExportFunction ('btAlliArcanaSelChange', Dashboard.SetAlliArcanaDesc); uWExportFunction ('btPersArcanaSelChange', Dashboard.SetPersArcanaDesc); uWExportFunction('btDeactivateArcana', Dashboard.DeactivateArcana); uWExportFunction ('btBoostSpeedSelChange', Dashboard.SetSpeedBoostDesc); uWExportFunction ('btBoostAccuracySelChange', Dashboard.SetAccuracyBoostDesc); // add a battle button next to overview if (GlobalOptions.btOverviewDashboardBtn) { var el1 = ById('mod_cityinfo'); var el2 = el1.getElementsByClassName('hd'); for (var e in el2) { el2[e].innerHTML += ' '+tx('Dashboard')+''; var el3 = el2[e].getElementsByClassName('button14'); for (var e2 in el3) { el3[e2].style["position"] = "static"; el3[e2].className = 'inlineButton btButton blue14'; break; } break; } }; uWExportFunction ('btCityChanged', CityChanged); var cityselmod = new CalterUwFunc("citysel_click",[['cm.PrestigeCityView.render()','cm.PrestigeCityView.render();btCityChanged();']]); cityselmod.setEnable(cityselmod.isAvailable()); // check dashboard and powerbar positions in 5 seconds... (after any other scripts loaded) setTimeout (WideScreen.CheckDashPosition, 5000); // check for login reward after 5 seconds... setTimeout (ClaimDailyReward, 5000); } function uWExportFunction (uwfunc,func) { try { if (typeof exportFunction == 'function') { exportFunction(func,uW,{defineAs:uwfunc}); } else { eval('uW.'+uwfunc+ ' = '+func); } } catch (e) { logerr(e); } } function uWCloneInto (obj) { try { if (typeof cloneInto == 'function') { return cloneInto(obj,uW); } else { return obj; } } catch (e) { logerr(e); } } function uWCreateObjectIn (objname,obj) { try { if (typeof createObjectIn == 'function') { return createObjectIn(uW, {defineAs: objname}); } else { uW[objname] = obj; return uW[objname]; } } catch (e) { logerr(e); } } function RefreshSeed() { RefreshingSeed = true; if (!Options.DashboardOptions.RefreshSeed) { jQuery('#btRefreshSeed').addClass("disabled"); jQuery('#btRefreshSeedInc').addClass("disabled"); jQuery('#btRefreshSeedOut').addClass("disabled"); } // if update_seed_ajax is running, wait for it to finish before going any further.. if (uW.g_update_seed_ajax_do) { setTimeout(RefreshSeed,1000); return; } // stop update_seed_ajax from running again until we are done here.. uW.g_update_seed_ajax_do = true; var params = uW.Object.clone(uW.g_ajaxparams); var ts = (new Date().getTime() / 1000) + uW.g_timeoff; var cts = parseInt( (ts - 25.1) * 1000); var upd = window.self.location.href; upd=upd.replace(/ts=\d*\.\d+/, "ts="+ts); upd=upd.replace(/cts=\d*/, "cts="+cts); new AjaxRequest(upd, { method: "POST", parameters: params, onSuccess: function (rslt) { var mainSrcHTMLCode = rslt.responseText; var myregexp = /var\ seed=\{.*?\};/; var match = myregexp.exec(mainSrcHTMLCode); if (match != null) { result = match[0]; result = result.substr(4); var seed = eval(result); // save values missing from initial load var activeBuffs = Seed.activeBuffs; var arcanaApothecaryBuffValue = Seed.arcanaApothecaryBuffValue; var arcanaAetherstoneCapBuffValue = Seed.arcanaAetherstoneCapBuffValue; var queue_champion = Seed.queue_champion; uW.seed = uWCloneInto(seed); Seed = uW.seed; // restore values missing from initial load Seed.player.g = Seed.players["u"+uW.tvuid].s; if (!Seed.activeBuffs) { Seed.activeBuffs = activeBuffs; } if (!Seed.queue_champion) { Seed.queue_champion = queue_champion; } Seed.arcanaApothecaryBuffValue = arcanaApothecaryBuffValue; Seed.arcanaAetherstoneCapBuffValue = arcanaAetherstoneCapBuffValue; Tabs.Options.DeletePointlessItems(); } SecondLooper = 1; // let update_seed_ajax run again setTimeout( function () {uW.g_update_seed_ajax_do = false;},5000); // 5 second delay before we allow update_seed_ajax to run again :) RefreshingSeed = false; if (!Options.DashboardOptions.RefreshSeed) { jQuery('#btRefreshSeed').removeClass("disabled"); jQuery('#btRefreshSeedInc').removeClass("disabled"); jQuery('#btRefreshSeedOut').removeClass("disabled"); } }, onFailure: function () { if (notify != null) notify(rslt.errorMsg); SecondLooper = 1; // let update_seed_ajax run again setTimeout( function () {uW.g_update_seed_ajax_do = false;},5000); // 5 second delay before we allow update_seed_ajax to run again :) RefreshingSeed = false; if (!Options.DashboardOptions.RefreshSeed) { jQuery('#btRefreshSeed').removeClass("disabled"); jQuery('#btRefreshSeedInc').removeClass("disabled"); jQuery('#btRefreshSeedOut').removeClass("disabled"); } }, }); } /** Widescreen/Environment Functions **/ function LoadChecker (init) { if (!GlobalOptions.btWatchdog) return; var Sresult = getServerId(); if(init) { if(Sresult == '??') { GM_setValue ('Loaded', 0); setTimeout(LoadCheckLoop,5000,'Loaded'); } else { GM_setValue (Sresult+'Loaded', 0); setTimeout(LoadCheckLoop,5000,Sresult+'Loaded'); }; // check firefox and GM version, if dodgy, display a message bar ValidCombo = true; if (GMVersion.Handler == 'Greasemonkey' && parseIntNan(GMVersion.Version) > 1 && parseIntNan(FFVersion.Version) > 31 && parseIntNan(FFVersion.Version) < 38) { ValidCombo = false; } if (!ValidCombo) { div = document.createElement('div'); var msg = tx('Power Bot Plus Lite has detected you are running')+' '+GMVersion.Handler+' '+tx('version')+' : '+GMVersion.Version+' '+tx('and')+' '+FFVersion.Browser+' '+tx('version')+' : '+FFVersion.Version+'. '+tx('Some features may not work correctly')+'. ['+tx('Close')+']'; div.innerHTML = '
'+msg+'
'; document.body.insertBefore (div, document.body.firstChild); } } else { GM_setValue ('Loaded', 1); GM_setValue (Sresult+'Loaded', 1); } } function LoadCheckLoop (checkvalue) { if (GM_getValue(checkvalue) == 0) { LoadCheckCounter = LoadCheckCounter - 1; if (LoadCheckCounter<=0) { KOCnotFound(20,true); } else { setTimeout(LoadCheckLoop,5000,checkvalue); } } } function SetGameScreen() { function setGame (){ try { var kocFrame = parent.document.getElementById('kocIframes1'); } catch (err) {}; if (!kocFrame){ setTimeout (setGame, 1000); return; } kocFrame.style.width = '100%'; kocFrame.style.height = '3000px'; if (GlobalOptions.btWideScreenStyle=="wide") kocFrame.style.width = '1520px'; if (GlobalOptions.btWideScreenStyle=="ultra") kocFrame.style.width = '1900px'; var style = document.createElement('style'); style.innerHTML = 'body {margin:0; width:100%; !important;}'; kocFrame.parentNode.appendChild(style); try { ById('progressBar').parentNode.removeChild(ById('progressBar')); } catch (e) { } try { ById('crossPromoBarContainer').parentNode.removeChild(ById('crossPromoBarContainer')); } catch (e) { } } setTimeout(function() { var url=document.URL; var dom = /s=([0-9]+)/i.exec(url); if (dom) uW.window.document.title="KofC "+dom[1]; }, 10000) KOCWatchdog(); setGame(); } function FacebookInstance () { function setWideFb (){ var iFrame = ById('iframe_canvas'); if (!iFrame){ setTimeout (setWideFb, 1000); return; } iFrame.style.width = '100%'; while ( (iFrame=iFrame.parentNode) != null) { if (iFrame.tagName=='DIV') { iFrame.style.width = '100%'; iFrame.style.maxWidth = '100%'; } } ById('globalContainer').style.left = '0px'; var e = ById('mainContainer'); if (e) { e.parentNode.style.minWidth = '100%'; if (GlobalOptions.btWideScreenStyle=="wide") e.parentNode.style.minWidth = '1520px'; if (GlobalOptions.btWideScreenStyle=="ultra") e.parentNode.style.minWidth = '1900px'; for(i=0; i= 0 || CheckString.match(/standalone=1/i)); return Standalone; } function StandAloneInstance () { function setWideKb () { var iFrames = $('game_frame'); if (!iFrames){ setTimeout (setWideKb, 1000); return; } iFrames.style.width = '100%'; iFrames.style.height = '3000px'; if (GlobalOptions.btWideScreenStyle=="wide") iFrames.style.width = '1520px'; if (GlobalOptions.btWideScreenStyle=="ultra") iFrames.style.width = '1900px'; while ( (iFrames=iFrames.parentNode) != null && iFrames.tagName !== "BODY") { iFrames.style.width = '100%'; if (GlobalOptions.btWideScreenStyle=="wide") iFrames.style.width = '1520px'; if (GlobalOptions.btWideScreenStyle=="ultra") iFrames.style.width = '1900px'; } try { ById('promo-sidebar').parentNode.removeChild(ById('promo-sidebar')); } catch (e) { } } function sendmeaway () { var serverID = /s=([0-9]+)/im.exec (document.location.href); var sr = /value="(.*?)"/im.exec ($("post_form").innerHTML); var goto = $("post_form").action+(serverID?"s="+serverID[1]:''); goto += '&platform_req=A&signed_request='+sr[1]; setTimeout (function (){window.top.location = goto;}, 0); } if ((document.URL.search(/merlinshare/i) != -1) || (document.URL.search(/accepttoken/i) != -1) || (document.URL.search(/claimvictorytoken/i) != -1)) { GlobalOptions.LastTopURL = document.URL; saveGlobalOptions(); } if (GlobalOptions.btNoMoreRy) { sendmeaway(); } else { setTimeout(function() { var url=document.URL; var dom = /s=([0-9]+)/i.exec(url); if (dom) uW.window.document.title="KofC "+dom[1]; }, 10000) setWideKb(); } } function FacebookWatchdog () { function fbwatchdog () { if (!ById('app_content_130402594779')) { logit ("KOC NOT FOUND (FB)!"); KOCnotFound(30); } } var INTERVAL = 50000; // wait 50 seconds before checking DOM if (!GlobalOptions.btWatchdog) return; setTimeout (fbwatchdog, INTERVAL); } function KOCWatchdog () { function kbwatchdog (){ if (!ById('mod_maparea')==null){ logit ("KOC NOT FOUND (STANDALONE)!"); KOCnotFound(30); } } var INTERVAL = 50000; // wait 50 seconds before checking DOM if (!GlobalOptions.btWatchdog) return; setTimeout (kbwatchdog, INTERVAL); } function PBPWatchdog () { function botwatchdog (){ if (!uW.btLoaded){ logit ("PBP NOT INITIALISED"); KOCnotFound(20,false,true); } } var INTERVAL = 50000; // wait 50 seconds before checking DOM setTimeout (botwatchdog, INTERVAL); } function KOCnotFound(secs,bot,inst){ var div; var countdownTimer = null; var endSecs = (new Date().getTime()/1000) + secs; function countdown (){ var secsLeft = endSecs - (new Date().getTime()/1000); ById('btwdsecs').innerHTML = timestr(secsLeft); if (secsLeft < 0) { clearTimeout (countdownTimer); ReloadKOC(); } } function cancel (){ clearTimeout (countdownTimer); document.body.removeChild (div); } div = document.createElement('div'); var msg = tx('Power Bot Plus Lite has detected that KofC is not loaded'); if (bot) msg = tx('Power Bot Plus Lite failed to initialise - You may need to reinstall'); if (inst) msg = tx('Power Bot Plus Lite failed to fully initialise - Some features may not work as expected'); msg = '
'+msg+'. '; if (!inst) { msg = msg+tx('Refreshing in')+' . ['+tx('cancel refresh')+']'; } msg = msg + '
'; div.innerHTML = msg; document.body.insertBefore (div, document.body.firstChild); if (!inst) { ById('btwdcan').addEventListener('click', cancel, false); countdownTimer = setInterval (countdown, 1000); } } function ReloadKOC (timer,params){ var serverId = getServerId(); if (serverId == '??') { window.location.reload(true); return; } params = (params?params:''); var goto = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?s='+serverId+params; if (CheckStandAlone()) { goto = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?s='+serverId+params; } if (timer && GlobalOptions.TokenEnabled && UserOptions.TokenAuto && serverId==UserOptions.TokenDomain) { // check for token collection if (!UserOptions.TokenCollected && UserOptions.TokenLink != "" && UserOptions.TokenLink.search(/merlinshare/i) != -1 && UserOptions.LastTokenStatus == "") { UserOptions.TokenRequest = 'TOKEN'; saveUserOptions(uW.user_id); var goto = UserOptions.TokenLink; } else { // check for build collection if (!UserOptions.BuildCollected && UserOptions.BuildLink != "" && UserOptions.BuildLink.search(/accepttoken/i) != -1 && UserOptions.LastBuildStatus == "") { UserOptions.TokenRequest = 'BUILD'; saveUserOptions(uW.user_id); var goto = UserOptions.BuildLink; } else { if (!UserOptions.BonusCollected && UserOptions.TreasureChestBankOther.length>0 && UserOptions.TreasureChestBankOther[0].playerId!=uW.tvuid && UserOptions.LastChestStatus == "") { Tabs.Options.CreateLink(false,true); return; } else { var DomArray = UserOptions.ChestDomainList.split(","); var freedomain = false; for (var d=0; d < DomArray.length; d++) { if (DomArray[d]) { if (!UserOptions.ChestCollected[DomArray[d]] && !UserOptions.BadChestDomains[DomArray[d]]) { freedomain = true; break; } } } if (freedomain) { if (UserOptions.TreasureChestBankOther.length>0) { Tabs.Options.CreateLink(false,true); return; } else { if (UserOptions.TreasureChestBank.length>0) { Tabs.Options.CreateLink(true,true); return; } } } } } } } setTimeout (function (){window.top.location = goto;}, 0); } function CheckRemoveAlert() { var x = ByCl('kofcalert'); if(x.length > 0) for(var i = 0; i < x.length;i++) if(String(x[i].innerHTML).indexOf('atk march no row change') > -1) {uW.Modal.hideModal(true); actionLog('Removed "atk march no row change" dialog'); } var y = ById('fb_dialog_ipad_overlay'); if (y) y.style.display = 'none'; var z = ByCl('kofctrackeralert'); if(z.length > 0) for(var i = 0; i < z.length;i++) {uW.Modal.hideModal(true); actionLog('Removed "something has gone wrong" dialog'); } setTimeout(CheckRemoveAlert, 2000); } function CheckDisableAds() { if (Seed.player.ryPlayer && Seed.player.ryPlayer.dau) { var RY1 = ById('ryAdCurtain'); if (RY1) { RY1.style.width='0px';RY1.style.height='0px';RY1.style.zIndex='-1'; } var RY2 = ById('ryAdContainerOuter'); if (RY2) { RY2.style.width='0px';RY2.style.height='0px';RY2.style.zIndex='-1'; } var RY3 = ById('ryAdContainer'); if (RY3) { RY3.parentNode.removeChild(RY3); logit('Disabled RockYou popup ad controller'); } } setTimeout(CheckDisableAds, 3000); } function HandlePublishPopup() { var myregexp = /USER_ID\"\:\"([0-9]+)"/; var match = myregexp.exec(document.documentElement.outerHTML)[1]; if (!match) { myregexp = /ACCOUNT_ID\"\:\"([0-9]+)"/; match = myregexp.exec(document.documentElement.outerHTML)[1]; } if (!match) { return; } readUserOptions(match); if (UserOptions.autoPublishGamePopups || UserOptions.autoCancelGamePopups){ var FBInputForm = ById('uiserver_form'); if (!FBInputForm) FBInputForm = ById('platformDialogForm'); if(FBInputForm){ CheckPublish(FBInputForm); } } setTimeout(HandlePublishPopup, 1000); } function HandleInlinePublishPopup() { var FBInputForm = ById('platformDialogForm'); if(FBInputForm){ var myregexp = /&to=([0-9]+)&/; var match = myregexp.exec(document.documentElement.outerHTML)[1]; if (match) { readUserOptions(match); if (UserOptions.autoPublishGamePopups || UserOptions.autoCancelGamePopups){ CheckPublish(FBInputForm); } } } setTimeout(HandleInlinePublishPopup, 1000); } function CheckPublish (FBInputForm) { var channel_input = nHtml.FindByXPath(FBInputForm,".//input[contains(@name,'app_id')]"); if(channel_input){ var current_app_id = channel_input.value; if (current_app_id=="130402594779") { // koc var publish_button = nHtml.FindByXPath(FBInputForm,".//input[@type='submit' and contains(@name,'publish')]"); if (!publish_button) publish_button = nHtml.FindByXPath(FBInputForm,".//button[@type='submit' and contains(@name,'__CONFIRM__')]"); var cancel_publish_button = nHtml.FindByXPath(FBInputForm,".//input[@type='submit' and contains(@name,'cancel')]"); if (!cancel_publish_button) cancel_publish_button = nHtml.FindByXPath(FBInputForm,".//button[@type='submit' and contains(@name,'__CANCEL__')]"); var privacy_setting = nHtml.FindByXPath(FBInputForm,".//select[@name='audience[0][value]']"); var privacy_input = nHtml.FindByXPath(FBInputForm,".//input[@name='privacyx']"); if (UserOptions.autoPublishGamePopups){ if (publish_button) { if (privacy_setting) { // 80: Everyone // 50: Friends of Friends // 40: Friends Only // 10: Only Me // 99: Custom List var PublishList = UserOptions.autoPublishPrivacySetting; if (PublishList==99) { if (UserOptions.CustomListId!=0) { PublishList = UserOptions.CustomListId; } else { PublishList = 10; } // default to only me if no list } privacy_setting.innerHTML = ''; privacy_setting.selectedIndex = 0; } else { if (privacy_input) { // new facebook audience crap - translate option to new value var PublishList = UserOptions.autoPublishPrivacySetting; if (PublishList==99) { if (UserOptions.CustomListId!=0) { PublishList = UserOptions.CustomListId; } else { PublishList = TranslatePublish[10]; } // default to only me if no list } else { PublishList = TranslatePublish[PublishList]||TranslatePublish[10]; } privacy_input.value = PublishList; } } publish_button.click(); setTimeout(CheckHideFBDialogs,1500); return; } } else if (UserOptions.autoCancelGamePopups) { if (cancel_publish_button) { cancel_publish_button.click(); setTimeout(CheckHideFBDialogs,1500); return; } } } } }; function CheckHideFBDialogs () { var FBClasses = ByCl('_10 uiLayer _4-hy _3qw'); var i = FBClasses.length; while(i--) { FBClasses[i].parentNode.removeChild(FBClasses[i]); } }; function CheckTokenCollection () { LoadChecker(false); var user_id = uW.user_id; if (user_id) { readUserOptions(user_id); } var UserDomain = getTokenServerId(); if (GlobalOptions.TokenEnabled && !giftAccepted){ var CheckTokenFunc = function (e) { if (giftAccepted) { return; } // Find the gift claiming container div var claim_gift = ById('claimgift'); if (!claim_gift) { claim_gift = ById('claimhelp'); } if (!claim_gift) { setTimeout(CheckTokenFunc,1000); return; } // Look for the select drop-down var domain_selector = ById('serverid'); // Look for the next button var next_button1 = nHtml.FindByXPath(claim_gift, ".//a[contains(@onclick,'checkServer')]"); var next_button2 = nHtml.FindByXPath(claim_gift, ".//a[@class='nextbtn']"); var next_button3 = nHtml.FindByXPath(claim_gift, ".//a[contains(@onclick,'claimhelpform')]"); var back_button = nHtml.FindByXPath(claim_gift, ".//a"); if (domain_selector && (next_button1 || next_button2)) { for (var i = 0; i < domain_selector.options.length; i++) { if (domain_selector.options[i].value == UserDomain) { domain_selector.selectedIndex = i; logit("Merlins Token collected :)"); giftAccepted = true; CheckTokenDay(user_id); if (document.URL.search(/merlinShare_src.php/i) != -1) { UserOptions.TokenCollected = true; UserOptions.TokenRequest = 'TOKEN'; } if (document.URL.search(/accepttoken_src.php/i) != -1) { UserOptions.BuildCollected = true; UserOptions.TokenRequest = 'BUILD'; } if (document.URL.search(/claimVictoryToken_src.php/i) != -1) { if (parseIntNan(getFeedServerId())==parseIntNan(UserDomain)) { UserOptions.BonusCollected = true; } else { UserOptions.ChestCollected[getFeedServerId()] = true; } UserOptions.TokenRequest = 'CHEST'; } UserOptions.TokenCount = UserOptions.TokenCount + 1; UserOptions.TokenResponse = 'OK'; UserOptions.TokenSuccessLink = GlobalOptions.LastTopURL; saveUserOptions(user_id); if (next_button1) { nHtml.Click(next_button1); } else { nHtml.Click(next_button2); } return; } } } else { if (next_button3) { nHtml.Click(next_button3); } else { if (next_button2 || back_button) { logit("Merlins Token could not be collected :("); UserOptions.TokenResponse = 'FAILED'; saveUserOptions(user_id); var a = document.createElement('div'); a.innerHTML = '

'+tx('Merlins Token could not be collected')+'.
('+tx('KofC will automatically reload in 10 seconds')+')
'; var claim_help_bdy = nHtml.FindByXPath(claim_gift, ".//div[contains(@class,'helpbodycontent')]"); if (!claim_help_bdy) claim_help_bdy = nHtml.FindByXPath(claim_gift, ".//div[@class='claimhelpbdy']"); if (claim_help_bdy) { claim_help_bdy.appendChild(a); } else { claim_gift.appendChild(a); } var goto1 = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?s='+UserDomain; if (CheckStandAlone(GlobalOptions.LastTopURL)) { goto1 = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?s='+UserDomain; } if (document.URL.search(/page=friendFeed/i)>0) { if (claim_gift.textContent.indexOf("Someone else has claimed this bonus.")>-1|| claim_gift.textContent.indexOf("You have already claimed this")>-1 || claim_gift.textContent.indexOf("You have followed an invalid feed link")>-1) { UserOptions.TokenResponse = 'USED'; } else { UserOptions.TokenResponse = 'BAD ('+getFeedServerId()+')'; UserOptions.BadChestDomains[getFeedServerId()] = true; } saveUserOptions(user_id); } if (document.URL.search(/accepttoken_src.php/i)>0) { if (claim_gift.textContent.indexOf("You are not eligible")>-1) { UserOptions.TokenResponse = 'EXPIRED'; saveUserOptions(user_id); } } setTimeout (function (){window.top.location = goto1;}, 10000); } else { if (domain_selector == null && (typeof unsafeWindow.checkServer == 'function')) { logit("Suspected Blank Decree page..."); var FeedID = getFeedId(); var goto_null = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?s='+UserDomain; if (CheckStandAlone(GlobalOptions.LastTopURL)) { goto_null = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?s='+UserDomain; } if (FeedID !='n/a'){ goto_null = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?f='+FeedID+'&t=118&lang=en&f='+FeedID+'&t=118&in='+getFeedUserId()+'&si=118&s='+UserDomain; if (CheckStandAlone(GlobalOptions.LastTopURL)) { goto_null = window.location.protocol+'//apps.facebook.com/kingdomsofcamelot/?f='+FeedID+'&t=118&lang=en&f='+FeedID+'&t=118&in='+getFeedUserId()+'&si=118&s='+UserDomain; } logit("Merlins Token collected :)"); giftAccepted = true; CheckTokenDay(user_id); if (document.URL.search(/merlinShare_src.php/i) != -1) { UserOptions.TokenCollected = true; UserOptions.TokenRequest = 'TOKEN'; } if (document.URL.search(/accepttoken_src.php/i) != -1) { UserOptions.BuildCollected = true; UserOptions.TokenRequest = 'BUILD'; } if (document.URL.search(/claimVictoryToken_src.php/i) != -1) { UserOptions.ChestCollected[getFeedServerId()] = true; UserOptions.TokenRequest = 'CHEST'; } UserOptions.TokenCount = UserOptions.TokenCount + 1; UserOptions.TokenResponse = 'OK'; UserOptions.TokenSuccessLink = GlobalOptions.LastTopURL; saveUserOptions(user_id); window.top.location = goto_null; } else { var a = document.createElement('div'); a.innerHTML = '

'+tx('Token Id not found')+'.

'+tx('Merlins Token could not be collected')+'.
('+tx('KofC will automatically reload in 10 seconds')+')
'; claim_gift.appendChild(a); if (UserOptions.TokenResponse=="") { UserOptions.TokenResponse = 'USED'; // assume used token.. saveUserOptions(user_id); } setTimeout (function (){window.top.location = goto_null;}, 10000); } } } } } } CheckTokenFunc(); } } function CheckTokenDay(user_id) { var date = new Date(); var utc = date.getTime() + (date.getTimezoneOffset() * 60000); var offset = -8 + (getDST(date)/3600); var today = new Date(utc + (3600000 * offset)); var dd = today.getDate(); var mm = today.getMonth()+1; //January is 0! var yyyy = today.getFullYear(); if(dd<10) {dd='0'+dd} if(mm<10) {mm='0'+mm} today = dd+'/'+mm+'/'+yyyy; if (today != UserOptions.TokenDate) { UserOptions.TokenDate = today; UserOptions.TokenCount = 0; UserOptions.TokenCollected = false; UserOptions.BuildCollected = false; UserOptions.BonusCollected = false; UserOptions.ChestCollected = {}; UserOptions.LastTokenStatus = ''; UserOptions.LastBuildStatus = ''; UserOptions.LastChestStatus = ''; UserOptions.BadChestDomains = {}; saveUserOptions(user_id); } } var WideScreen = { chatIsRight : false, WideMap : false, PowerBar : false, PowerBarOpen : false, Dashboard : false, MapExpanded : false, PowerBarWidth : 0, OffsetTop : 0, rail : null, init : function (){ var t = WideScreen; t.rail = searchDOM (ById('mod_maparea'), 'node.className=="maparea_rrail"', 10); uWExportFunction('btGetOffset',WideScreen.getOffset); var ttmod = new CalterUwFunc("showTooltip",[['t.cumulativeOffset()[0]','t.cumulativeOffset()[0]-n.cumulativeOffset()[0]']]); ttmod.setEnable(ttmod.isAvailable()); var modalmod = new CalterUwFunc("Modal.showModal",[[/cm.ModalManager.addLevel/ig,'m=btGetOffset(m,true);i=btGetOffset(i,false);cm.ModalManager.addLevel'],[/\s*p\s*[+]\s*["]px/,' p + "px !important'],['break;','d+="left:"+m+"px !important";break;']]); modalmod.setEnable(modalmod.isAvailable()); }, getOffset : function(c,Horizon) { var t = WideScreen; if (Horizon) { return parseIntNan(c+t.PowerBarWidth); } else { return parseIntNan(c+t.OffsetTop); } }, chgChatBeforeDash : function (tf) { var t = WideScreen; t.CheckDashPosition(); t.CheckChatPosition(); }, RestartDashboard : function (tf) { var t = WideScreen; if (popDash) { document.body.appendChild(popDash.div); popDash.show(false); popDash.destroy(); popDash = null; } t.CheckDashPosition(); t.CheckChatPosition(); if (Options.btDashboard) { Dashboard.Curr = Cities.byID[uW.currentcityid].idx; Dashboard.init(); } }, setChatOnRight : function (tf){ var t = WideScreen; if (tf == t.chatIsRight) return; var chat = ById('kocmain_bottom').childNodes[1]; if (!chat || chat.className!='mod_comm') { setTimeout (function (){t.setChatOnRight(tf)}, 1000); return; } if (tf){ chat.style.top = '-570px'; chat.style.height = '1167px'; chat.style.background = 'url("'+ CHAT_BG_IMAGE +'")'; ById('mod_comm_list1').style.height = '1013px'; ById('mod_comm_list2').style.height = '1013px'; t.CheckDashPosition(); t.CheckChatPosition(); } else { chat.style.top = '0px'; chat.style.left = '0px'; chat.style.height = ''; chat.style.background = ''; ById('mod_comm_list1').style.height = '287px'; ById('mod_comm_list2').style.height = '287px'; t.CheckDashPosition(); t.CheckChatPosition(); } var divheight = chat.offsetHeight; t.chatIsRight = tf; }, CheckChatPosition : function () { var t = WideScreen; var chat = ById('kocmain_bottom').childNodes[1]; if (chat && chat.className=='mod_comm') { if (parseIntNan(getStyle(chat,'top')) < 0) { var left = 760; if (Options.btDashboard && !GlobalOptions.btChatBeforeDash && !Options.btFloatingDashboard) { left += Dashboard.DashWidth+20; } chat.style.left = left+'px'; } else { var widget1 = ById('tr_presetBox'); // ne0's widget var widget2 = ById('btTRWidget'); // my widget if (widget1 || widget2) { if (widget2) var hh = widget2.offsetHeight-6; if (widget1) hh = widget1.offsetHeight-6; if (!widget1 && Options.ThroneHUD) hh=0; if (hh<0) hh=0; chat.style.top = hh+'px'; chat.style.background = 'url("'+ CHAT_BG_IMAGE +'")'; ById('mod_comm_list1').style.height = (287-hh)+'px'; ById('mod_comm_list2').style.height = (287-hh)+'px'; } } } }, useWideMap : function (tf) { var t = WideScreen; if (tf == t.WideMap) return; if (tf){ t.rail.style.display = 'none'; ById('mapwindow').style.height = "436px"; ById('mapwindow').style.zIndex = "50"; } else { t.rail.style.display = 'block'; ById('mapwindow').style.height = "439px"; ById('mapwindow').style.zIndex = ""; } t.WideMap = tf; t.MapExpanded = true; t.ExpandWideMap(); }, ExpandWideMap : function () { var t = WideScreen; if (!t.WideMap) { var MapToggle = ById('btMapToggle'); if (MapToggle) { MapToggle.style.display = 'none'; } return; } t.MapExpanded = !t.MapExpanded; var MapWindow = ById('mapwindow'); if (!MapWindow) return; if (t.MapExpanded){ MapWindow.style.width = "1220px"; var buttontext = ''; } else { MapWindow.style.width = "760px"; var buttontext = ''; } var MapToggle = ById('btMapToggle'); var MapWidth = parseIntNan(getStyle(MapWindow,'width')); var MapHeight = parseIntNan(getStyle(MapWindow,'height')); if (MapToggle) { MapToggle.style.left = MapWidth-20+'px'; MapToggle.style.display = 'block'; ById('btMapToggleLabel').innerHTML = buttontext; } else { var MapToggle = document.createElement('div'); MapToggle.id = 'btMapToggle'; MapToggle.style.position = 'absolute'; MapToggle.style.width = '20px'; MapToggle.style.left = MapWidth-20+'px'; MapToggle.style.top = t.getTop(MapWindow)+parseInt(MapHeight/2)-30+'px'; MapToggle.style.height = '60px'; MapToggle.style.zIndex = '50'; // keep above dashboard MapToggle.style.display = 'block'; ById('mapwindow').appendChild(MapToggle); var m = '
 
'; MapToggle.innerHTML = m; ById('btMapToggleLabel').innerHTML = buttontext; ById('btMapToggleOpener').addEventListener ('click', t.ExpandWideMap, false); } }, setDashboard : function (tf){ var t = WideScreen; if (tf == t.Dashboard) return; if (popDash) { if (Options.btFloatingDashboard) { Options.btDashPos = popDash.getLocation(); } else { document.body.appendChild(popDash.div); } popDash.show(false); popDash.destroy(); popDash = null; } if (tf){ // append dashboard div to koc container var Dash = document.createElement('div'); Dash.id='btDashboard'; Dash.style.position = 'absolute'; Dash.style.width = (Options.DashboardOptions.DashWidth+20)+'px'; Dash.style.top = "0px"; Dash.style.height = "5000px"; ById('kocContainer').appendChild(Dash); t.CheckDashPosition(); t.CheckChatPosition(); Dashboard.init(); } else { // remove dashboard div from koc container if it exists var elem = ById('btDashboard'); if (elem) { if (popDash) { document.body.appendChild(popDash.div); popDash.show(false); popDash.destroy(); popDash = null; } elem.parentNode.removeChild(elem); } t.CheckChatPosition(); } t.Dashboard = tf; }, CheckDashPosition : function () { var t = WideScreen; var kochead = ById('kochead'); t.OffsetTop = t.getTop(kochead); // adjust left setting for chat var Chat = ById('kocmain_bottom').childNodes[1]; var ChatWidth = 0; if (Chat && (Chat.className == 'mod_comm') && (parseIntNan(getStyle(Chat,'top')) < 0) && GlobalOptions.btChatBeforeDash) { ChatWidth = parseIntNan(getStyle(Chat,'width')); } // adjust left setting for powerbar t.PowerBarWidth = 0; var PowerBar = ById('btPowerBar'); if (PowerBar) { t.PowerBarWidth = parseIntNan(getStyle(PowerBar,'width')); PowerBar.style.top = t.OffsetTop+'px'; } var Dash = ById('btDashboard'); if (Dash) { Dash.style.left = 760+ChatWidth+t.PowerBarWidth+"px"; Dash.style.top = t.OffsetTop+'px'; if (Options.btFloatingDashboard) { Dash.style.display = 'none'; } else { Dash.style.display = 'block'; } } t.setDialogContainerStyles(); }, setPowerBar : function (tf,open){ var t = WideScreen; if (tf == t.PowerBar && open == t.PowerBarOpen) return; var offset = 24; var PowerBarLabel = '





'; if (open) { if (!GlobalOptions.btFloatingPowerBar) { offset = 164; } PowerBarLabel = '





'; } if (tf){ if (ById("main_engagement_tabs")) ById("main_engagement_tabs").style.left = offset+'px'; var kochead = ById('kochead'); if (!kochead) { setTimeout (function (){t.setPowerBar(tf,open)}, 1000); return; } kochead.style.position = 'relative'; kochead.style.left = offset+'px'; t.OffsetTop = t.getTop(kochead); var kocmain = ById('kocmain'); if (!kocmain) { setTimeout (function (){t.setPowerBar(tf,open)}, 1000); return; } var oldkm = getAbsoluteOffsets(kocmain); kocmain.style.left = offset+'px'; var newkm = getAbsoluteOffsets(kocmain); var widgetshift = newkm.left - oldkm.left; t.setDialogContainerStyles(); // keep ne0's widgets in line with kocmain movement if (ById("tr_guardBox")) { var newgpos = ById("tr_guardBox").offsetLeft + widgetshift; ById("tr_guardBox").style.left = newgpos+'px'; } if (ById("tr_presetBox")) { var newtpos = ById("tr_presetBox").offsetLeft + widgetshift; ById("tr_presetBox").style.left = newtpos+'px'; } var GameHeight = parseInt(kochead.offsetHeight)+parseInt(kocmain.offsetHeight); var PowerBar = ById('btPowerBar'); if (PowerBar) { PowerBar.style.width = offset+'px'; ById('btPowerBarLabel').innerHTML = PowerBarLabel; } else { var PowerBar = document.createElement('div'); PowerBar.id='btPowerBar'; PowerBar.style.position = 'absolute'; PowerBar.style.width = offset+'px'; PowerBar.style.top = t.OffsetTop+'px'; PowerBar.style.height = GameHeight+'px'; PowerBar.style.zIndex = '100411'; ById('kocContainer').appendChild(PowerBar); var m = '
 
 
'; PowerBar.innerHTML = m; ById('btPowerBarLabel').innerHTML = PowerBarLabel; ById('btPowerBarOpener').addEventListener ('click', t.e_TogglePowerBar, false); ById('btPowerBarOpener').addEventListener ('mousedown', mouseMainTab, false); } if (open) jQuery('#btPowerBarButtons').removeClass("divHide"); else jQuery('#btPowerBarButtons').addClass("divHide"); } t.CheckDashPosition(); t.CheckChatPosition(); t.PowerBar = tf; t.PowerBarOpen = open; }, e_TogglePowerBar : function (){ var t = WideScreen; GlobalOptions.btPowerBarOpen = !GlobalOptions.btPowerBarOpen; saveGlobalOptions(); t.setPowerBar(true,GlobalOptions.btPowerBarOpen); }, getTop : function (elm) { var y = 0; y = elm.offsetTop; elm = elm.offsetParent; while(elm != null) { y = parseInt(y) + parseInt(elm.offsetTop); elm = elm.offsetParent; } return y; }, ShowDashboard : function (tf) { Options.btDashboard = tf; saveOptions(); WideScreen.setDashboard(tf); }, setDialogContainerStyles : function () { var t = WideScreen; GM_addStyle ('.modalCurtain {left:'+t.PowerBarWidth+'px !important;top:'+t.OffsetTop+'px !important;width:768px !important}'); GM_addStyle ('.curtainMM{left:'+t.PowerBarWidth+'px !important;top:'+t.OffsetTop+'px !important;width:768px !important}'); GM_addStyle ('.dialogContainer {left:'+t.PowerBarWidth+'px !important;top:'+t.OffsetTop+'px !important;width:768px !important}'); GM_addStyle ('.notificationMessageDialog {margin-top:60px !important}'); GM_addStyle ('div.largeModal {left:'+(27+t.PowerBarWidth)+'px !important;top:'+(5+t.OffsetTop)+'px !important}'); GM_addStyle ('div.xLargeModal {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(60+t.OffsetTop)+'px !important}'); GM_addStyle ('div.mediumModal {left:'+(120+t.PowerBarWidth)+'px !important;top:'+(60+t.OffsetTop)+'px !important}'); GM_addStyle ('div.smallModal {left:'+(200+t.PowerBarWidth)+'px !important;top:'+(190+t.OffsetTop)+'px !important}'); GM_addStyle ('div.newGame {left:'+(7+t.PowerBarWidth)+'px !important;top:'+(5+t.OffsetTop)+'px !important}'); GM_addStyle ('.animatedChestModal {left:'+(85+t.PowerBarWidth)+'px !important;top:'+(100+t.OffsetTop)+'px !important}'); GM_addStyle ('.guardianModal {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(200+t.OffsetTop)+'px !important}'); GM_addStyle ('.choose_modal {left:'+(55+t.PowerBarWidth)+'px !important;top:'+(110+t.OffsetTop)+'px !important}'); GM_addStyle ('.guardian_item {left:'+(225+t.PowerBarWidth)+'px !important;top:'+(155+t.OffsetTop)+'px !important}'); GM_addStyle ('.nomadModal {left:'+(40+t.PowerBarWidth)+'px !important;top:'+(40+t.OffsetTop)+'px !important}'); GM_addStyle ('.alliance_patch {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(t.OffsetTop)+'px !important;}'); GM_addStyle ('.alliance_layover {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(127+t.OffsetTop)+'px !important;}'); GM_addStyle ('.alliance_layover_stats {left:'+(187+t.PowerBarWidth)+'px !important;top:'+(102+t.OffsetTop)+'px !important}'); GM_addStyle ('.chancellorModal {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(5+t.OffsetTop)+'px !important}'); GM_addStyle ('.mine_view {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(5+t.OffsetTop)+'px !important}'); GM_addStyle ('.vaultModal {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(5+t.OffsetTop)+'px !important}'); GM_addStyle ('div.templeModal.cmModal1 {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(5+t.OffsetTop)+'px !important}'); GM_addStyle ('.claimgiftWhFb {left:'+(5+t.PowerBarWidth)+'px !important;top:'+(5+t.OffsetTop)+'px !important}'); GM_addStyle ('.Champion .champItemHover {margin-top:-'+(4+t.OffsetTop)+'px !important}'); }, } /** Afk detector **/ var afkdetector = { target : 120, // default check every 2 mins counter : 1, isAFK : true, // always begin in AFK mode! This will allow tower to revert following autoport init : function () { var t = afkdetector; if (parseIntNan(Options.AFKTimeout) < 1) Options.AFKTimeout = 1; t.target = Options.AFKTimeout*60; document.body.onmousemove = t.clear; document.body.onkeypress = t.clear; }, check : function () { var t = afkdetector; if (!t.isAFK) { t.counter++; if (t.counter >= t.target) { if (GlobalOptions.ExtendedDebugMode) actionLog('afk detected'); t.isAFK = true; } } }, clear : function () { var t = afkdetector; t.counter = 1; if (t.isAFK) { if (GlobalOptions.ExtendedDebugMode) actionLog('afk cleared'); t.isAFK = false; } }, reset : function () { var t = afkdetector; if (parseIntNan(Options.AFKTimeout) < 1) Options.AFKTimeout = 1; t.target = Options.AFKTimeout*60; t.counter = 1; t.isAFK = false; }, } function createButton (label,id){ var a=document.createElement('a'); a.className='button20'; a.id = id; a.innerHTML=''+ label +''; return a; } function AddMainTabLink (text, id, eventListener, mouseListener) { var a = createButton (text,id); a.className='tab'; var tabs=ById('main_engagement_tabs'); if (tabs) { gmTabs = SetupMainTab(tabs); if (gmTabs) { gmTabs.appendChild(a); a.addEventListener('click',eventListener, false); if (mouseListener != null) { a.addEventListener('mousedown',mouseListener, true); } if (id != null) { a.id = id; } return a; } } return null; } function AddSubTabLink (text, eventListener, id, colourclass) { var a = createButton (text,id); if (colourclass == null) colourclass = 'blue20'; a.className='inlineButton btButton '+colourclass; a.style.paddingLeft = '2px'; var tabs=ById('main_engagement_tabs'); if (tabs) { gmTabs = SetupSubTab(tabs); if (gmTabs) { gmTabs.appendChild(a); a.addEventListener('click',eventListener, false); if (id != null) { a.id = id; } return a; } } return null; } function SetToggleButtonState (entity,tf,text) { var btn = ById(entity+'ToggleTab'); if (btn) { if (tf) { btn.innerHTML = ''+tx(text)+': '+tx('On')+''; } else { btn.innerHTML = ''+tx(text)+': '+tx('Off')+''; } } } function SetupMainTab (tabs) { var e = tabs.parentNode; var gmTabs = null; for (var i=0; i'; PBX.appendChild(a); a.addEventListener('click',eventListener, false); if (mouseListener != null) a.addEventListener('mousedown',mouseListener, true); if (id != null) a.id = id; return a; } function mouseMainTab (me) { // right-click on main button resets window location if (me.button == 2){ var c = getClientCoords (ById('main_engagement_tabs')); mainPop.setLocation ({x: c.x+4, y: c.y+c.height}); } } function eventHideShow () { if (mainPop.toggleHide(mainPop)){ tabManager.showTab(false); Options.btWinIsOpen = true; } else { tabManager.hideTab(); Options.btWinIsOpen = false; } saveOptions(); } function DefaultWindowPos(OptPos,elem,force) { if (force || (Options[OptPos]==null) || (Options[OptPos].x==null) || (Options[OptPos].x=='') || (isNaN(Options[OptPos].x))) { var c = getClientCoords (ById(elem)); Options[OptPos].x = c.x+4; Options[OptPos].y = c.y+c.height; saveOptions(); } } function ToggleDivDisplay(form,h,w,div, autoclose) { var dc = jQuery('#'+div).attr('class'); if (dc) { if (dc.indexOf('divHide') >= 0) { jQuery('#'+div).attr('class',''); jQuery('#'+div+'Arrow').attr('src',DownArrow); if (autoclose) { lastdiv = ""; if (OpenDiv[form]) { lastdiv = OpenDiv[form]; } if (lastdiv != "") { ToggleDivDisplay(form,h,w,lastdiv); } OpenDiv[form] = div; } } else { jQuery('#'+div).attr('class','divHide'); jQuery('#'+div+'Arrow').attr('src',RightArrow); if (autoclose) { OpenDiv[form] = '';} } } else { jQuery('#'+div).attr('class','divHide'); jQuery('#'+div+'Arrow').attr('src',RightArrow); if (autoclose) { OpenDiv[form] = '';} } if (form) ResetFrameSize(form,h,w); } function ToggleMainDivDisplay(form,h,w,div, autoclose, opt) { var dc = jQuery('#'+div).attr('class'); if (dc) { if (dc.indexOf('divHide') >= 0) { jQuery('#'+div).attr('class',''); jQuery('#'+div+'Arrow').attr('src',DownArrow); if (autoclose) { lastdiv = ""; if (OpenDiv[form]) { lastdiv = OpenDiv[form]; } if (lastdiv != "") { ToggleDivDisplay(form,h,w,lastdiv); } OpenDiv[form] = div; if (opt) { Options[opt] = div; } } } else { jQuery('#'+div).attr('class','divHide'); jQuery('#'+div+'Arrow').attr('src',RightArrow); if (autoclose) { OpenDiv[form] = ''; if (opt) { Options[opt] = ''; } } } } else { jQuery('#'+div).attr('class','divHide'); jQuery('#'+div+'Arrow').attr('src',RightArrow); if (autoclose) { OpenDiv[form] = '';} } ResetFrameSize('btMain',h,w); } function ResetFrameSize(prefix,minheight,minwidth) { var h1 = ById(prefix+'_bar'); var h2 = ById(prefix+'_content'); if (!h1 || !h2) return; var h = h1.clientHeight + h2.clientHeight; if (h < minheight) h = minheight; jQuery('#'+prefix+'_outer').css('height',h+10); w = ById(prefix+'_content').clientWidth; w2 = ById(prefix+'_outer').clientWidth; if (w < minwidth) w = minwidth; if (w2 < w) // I don't know why I need this.. must look at this later to try and get it to shrink again jQuery('#'+prefix+'_outer').css('width',w+10); } function UpdateMarch (cityId,marchId) { if (!Seed.queue_atkp["city"+cityId]["m"+marchId]) { return; } var params = uW.Object.clone(uW.g_ajaxparams); params.rid = marchId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/fetchMarch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.march) { var now = unixTime(); if (Seed.queue_atkp["city"+cityId]["m"+marchId] && Seed.queue_atkp["city"+cityId]["m"+marchId].destinationUnixTime && Seed.queue_atkp["city"+cityId]["m"+marchId].destinationUnixTime' function FNChampPopup () {uW.btCreateChampionPopUp(e,citychamp.assignedCity,true,null,true);} function FNChampClear () {uW.removeTooltip();} ById('maparea_boosts_champion_image').addEventListener('mouseover',FNChampPopup,false); ById('maparea_boosts_champion_image').addEventListener('mouseout',FNChampClear,false); } else { e.style.display = 'none'; } } function BuildChampData (champItems,championId) { var effectTiers = CE_EFFECT_TIERS; var res = {}; res.equippedchampstats = JSON.parse(JSON.stringify(BaseChamp)); res.equippedtroopstats = {}; res.equippedbossstats = {}; res.SetBonus = {}; res.SteelHoofCount = 0; res.LightBringerCount = 0; res.DragonScaleCount = 0; res.WildHideCount = 0; res.VespersCount = 0; res.SilverCount = 0; res.WarlockCount = 0; res.IceQueenCount = 0; res.EagleCount = 0; res.DragonWarriorCount = 0; res.TestCount = 0; res.might = 0; for (var y in champItems) { // calculate unique set bonuses var item = champItems[y]; if (item.equippedTo && item.equippedTo==championId) { if (!item.quality) item.quality = parseIntNan(item.rarity); item.level = parseIntNan(item.level); if (SteelHoofItems.indexOf(parseIntNan(item.unique)) !== -1) { res.SteelHoofCount++ } if (LightBringerItems.indexOf(parseIntNan(item.unique)) !== -1) { res.LightBringerCount++ } if (DragonScaleItems.indexOf(parseIntNan(item.unique)) !== -1) { res.DragonScaleCount++ } if (TestItems.indexOf(parseIntNan(item.unique)) !== -1) { res.TestCount++ } if (WildHideItems.indexOf(parseIntNan(item.unique)) !== -1) { res.WildHideCount++ } if (VespersItems.indexOf(parseIntNan(item.unique)) !== -1) { res.VespersCount++ } if (SilverItems.indexOf(parseIntNan(item.unique)) !== -1) { res.SilverCount++ } if (WarlocksItems.indexOf(parseIntNan(item.unique)) !== - 1) { res.WarlockCount++ } if (IceQueensItems.indexOf(parseIntNan(item.unique)) !== - 1) { res.IceQueenCount++ } if (EagleItems.indexOf(parseIntNan(item.unique)) !== - 1) { res.EagleCount++ } if (DragonWarriorsItems.indexOf(parseIntNan(item.unique)) !== -1) { res.DragonWarriorCount++ } for (var e in item.effects) { if (Number(e) <= Number(item.rarity)) { var id = item.effects[e].id; if (id >= 300 && id < 400) { var Set = item.set; var tier = item.effects[e].tier; if (id==312) Set = 'U'; if (id==313) Set = 'N'; if (id==314) Set = 'D'; if (id==324) Set = 'U'; //snake and ophidian rings var S = effectTiers; var P = id + "," + tier var TV = S[P]; while (!TV && (tier > 0)) { tier--;P=id+","+tier;TV=S[P]; } if (TV) { var base = +TV.Base || 0; var growth = +TV.Growth || 0; var level = Number(item.level) || 0; percent = Number(base + (level * growth)); if (!res.SetBonus[Set]) { res.SetBonus[Set] = 0; } res.SetBonus[Set] += percent; } } } } } } for (var y in champItems) { var item = champItems[y]; if (item.equippedTo && item.equippedTo==championId) { if (!item.quality) item.quality = parseIntNan(item.rarity); item.level = parseIntNan(item.level); res.might += CardMight(item,true); for (var e in item.effects) { if (Number(e) <= Number(item.rarity)) { var id = item.effects[e].id; var tier = item.effects[e].tier; var S = effectTiers; var P = id + "," + tier; var TV = S[P]; while (!TV && (tier > 0)) { tier--;P=id+","+tier;TV=S[P]; } if (TV) { var base = +TV.Base || 0; var growth = +TV.Growth || 0; var level = Number(item.level) || 0; var bonus = 0; if (id<300 || id>=400) { bonus = res.SetBonus[item.set] || 0; if (item.unique && item.unique!=0 && res.SetBonus['U']) bonus += res.SetBonus['U']; if ((!item.unique || item.unique==0) && res.SetBonus['N']) bonus += res.SetBonus['N']; //if (SetBonus['D']) bonus += res.SetBonus['D']; } var percent = Number(base + ((level * level + level) * growth * 0.5)); if (id >= 300) { percent = Number(base + (level * growth)); } if (id>=400) { if (!res.equippedbossstats[item.unique]) { res.equippedbossstats[item.unique] = {}; } if (!res.equippedbossstats[item.unique][id]) { res.equippedbossstats[item.unique][id] = 0; } res.equippedbossstats[item.unique][id] += percent + (percent*bonus); // can this apply to boss stats? } else { if (id>=200) { var chAdj = 0; if (id==201 && item.unique && item.unique!=0 && res.VespersCount>=0) { chAdj = 0.05; } if (!res.equippedchampstats[id]) { res.equippedchampstats[id] = 0; } res.equippedchampstats[id] += percent + (percent*bonus); res.equippedchampstats[id] += (percent*chAdj); } else { if (!res.equippedtroopstats[id]) { res.equippedtroopstats[id] = 0; } res.equippedtroopstats[id] += percent; } } } } } } } return res; } /** main loop **/ function EverySecond () { try { SecondLooper = SecondLooper+1; inc = []; incCity = []; /* check local marches still exist */ for(var n in local_atkinc) { if (!Seed.queue_atkinc[n]) { delete local_atkinc[n]; } } for(var n in Seed.queue_atkinc) { if (Seed.queue_atkinc[n].marchType) { inc.push(Seed.queue_atkinc[n]); /* check and copy to local */ Copy_Local_ATKINC(n); } } inc.sort(function(a, b){ if(!a.arrivalTime) a.arrivalTime = -1; if(!b.arrivalTime) b.arrivalTime = -1;return a.arrivalTime-b.arrivalTime }); try { CheckForIncoming(); } catch (err) { logerr(err); // write to log } out = []; outCity = []; for(var n in Seed.queue_atkp) { for(var m in Seed.queue_atkp[n]) { if (Seed.queue_atkp[n][m].marchType && (parseInt(Seed.queue_atkp[n][m].marchType) != 9)) { // no raids! Copy_Local_ATKP(n,m); var marchobj = local_atkp[m]; out.push(marchobj); if (marchobj.marchCityId == Dashboard.CurrentCityId) { outCity.push(marchobj); } } } } out.sort(function(a, b){ return /*a.destinationUnixTime-b.destinationUnixTime*/ }); outCity.sort(function(a, b){ return a.destinationUnixTime-b.destinationUnixTime }); /* Periodically remember window positions in Chrome because onbeforeunload doesn't work */ if (FFVersion.Browser=="Chrome" && (SecondLooper % MinuteInterval) == 1) { RememberWindowPositions(); saveOptions(); } /* Check Throne Preset hasn't changed */ if (CurrPreset != Seed.throne.activeSlot) { Dashboard.PaintTRPresets(); } /* Update Dashboard */ if (popDash && Dashboard.Loaded) { Dashboard.EverySecond(); }; /* Update Incoming and Outgoing and March popups */ if (popInc) { Incoming.EverySecond(); }; if (popOut) { Outgoing.EverySecond(); }; if (popMarch) { QuickMarch.EverySecond(); }; /* loop through tabs */ tabManager.EverySecond(); /* check for afk */ afkdetector.check(); /* display/clean up ajax log */ var activity = 0; var now = unixTime(); for(var aj=AJAX_LOG.length-1;aj>=0;aj--) { if (AJAX_LOG[aj].timestamp<(now-60)) { AJAX_LOG.splice(aj,1); } else { if (AJAX_LOG[aj].timestamp>(now-20)) { activity++; } } } if (Options.ShowServerTraffic) { activity = activity*3; var trafficcolor = '#0F0'; if (activity>75) { trafficcolor = '#FF0'; } if (activity>150) { trafficcolor = '#FA0'; } if (ById('btTraffic')) { ById('btTraffic').innerHTML = activity+tx('/min'); ById('btTraffic').style.color = trafficcolor; } } /* restart loop */ SecondTimer = setTimeout(EverySecond,1000); } catch (err) { logerr(err); // write to log SecondTimer = setTimeout(EverySecond,1000); } } function CheckForIncoming () { var atype = ""; var atime = ""; var to = ""; var name = ""; var who = ""; var bywho = ""; var soonest = {}; soonest.arrivalTime = -1; var soonestattack = false; Dashboard.StillComing = false; var PopupVisible = false; // Find big popup gem container element if it exists.. var el1, el2, el3; if (typeof Array.filter == 'function') { // legacy browsers el1 = ByCl('primarytitlebar'); el2 = ByCl('gemContainer'); el3 = Array.filter( el2, function(elem){ return Array.indexOf( el1, elem.parentNode ) > -1; }); } else { el1 = Object.values(ByCl('primarytitlebar')); el2 = Object.values(ByCl('gemContainer')); el3 = el2.filter(function(elem){ return el1.indexOf(elem.parentNode) > -1; }); } for (var e=0;e0) { ChampionDelayer-- } if (!PopupVisible) { // override main screen gem container for (var e=0;e= 0 && (a.arrivalTime < unixTime())) { continue; // don't display arrival times already happened } Dashboard.StillComing = true; if ((a.arrivalTime >= 0 && (a.arrivalTime < soonest.arrivalTime)) || (soonest.arrivalTime == -1)) { soonest = a; if (!soonest.arrivalTime) soonest.arrivalTime = -1; } if (a.arrivalTime >= 0) { if (a.arrivalTime - unixTime() < 2) { // auto-replace defending troops if (Seed.citystats["city" + a.toCityId].gate != 0) { // only do this if defending // save defending unit configuration if (Options.DashboardOptions.ReplaceDefendingTroops[Cities.byID[a.toCityId].idx] && SelectiveDefending) { Dashboard.AttackedCity = a.toCityId; Dashboard.StoreDefendingTroops(Dashboard.AttackedCity); } setTimeout(function() {Dashboard.ForceTries = 0;Dashboard.ForceUpdateSeed();},3000); // force update defending troops immediately after attacks land } } if (a.marchType==4) { // set champ on attack only soonestattack = true; var changeok = (Options.TowerOptions && Options.TowerOptions.SaveCityState[a.toCityId] && Options.TowerOptions.SaveCityState[a.toCityId].ChangeChampion); // only if tower alerted if (Options.TowerOptions.ChangeChamp && changeok && a.arrivalTime - unixTime() <= parseIntNan(Options.TowerOptions.ChampTime)) { // auto-assign champion if (ChampionDelayer==0) { var currChamp = getCityChampion(a.toCityId).championId; if (Options.TowerOptions.ChampId !=0 && currChamp != Options.TowerOptions.ChampId && (currChamp==0 || !Options.TowerOptions.ChampNoChamp)) { if (getChampionStatus(Options.TowerOptions.ChampId)=="10") { actionLog('Champion is marching - Cannot assign','TOWER'); } else { if (currChamp!=0 && getChampionStatus(currChamp)=="10") { actionLog(Cities.byID[a.toCityId].name+': Current Champion is marching - Cannot unassign','TOWER'); } else { actionLog(Cities.byID[a.toCityId].name+': Assigning Champion','TOWER'); SwitchChampion(a.toCityId,Options.TowerOptions.ChampId); } } ChampionDelayer=3; // only try every 3 seconds } } } } } if (soonest.arrivalTime >= 0 && soonestattack) { break; } } if (Dashboard.StillComing) { if (soonest.marchType && (soonest.marchType == 3)) atype = ''; else atype = ''; to = Cities.byID[soonest.toCityId]; if (to && to.tileId == soonest.toTileId ) name = to.name; else name = "Wilderness"; if (soonest.arrivalTime != -1) atime = CM.TimeFormatter.format(parseInt(soonest.arrivalTime-unixTime())); else atime = '??????'; if (soonest.pid && Seed.players['u'+soonest.pid]) {who = Seed.players['u'+soonest.pid].n; bywho = ' by '+MonitorLink(soonest.pid,who,"AlertLink");} else { bywho = '  (Upgrade WatchTower)' ;} msgcontainer = '
'; msglink1 = ''; msglink3 = ''; msgtable = '
  '+atime+'
'+atype+'
'; msgend = '
'; if (Options.OverrideAttackAlert) { if (CanNotify) { ById('btGemContainer').innerHTML = msgcontainer+msgtable+msglink1+'btAlertIncoming'+msglink2+name+msglink3+msgend+'
'+bywho+'
'; ById('btGemContainer').style.display = 'block'; ById('btAlertIncoming').addEventListener ('click', function(){Dashboard.show(to)}, false); jQuery('.alliance_patch').hide(); } if (PopupVisible) { GemContainer.innerHTML = msgcontainer+msgtable+msglink1+'btAlertIncoming2'+msglink2+name+msglink3+msgend+''; GemContainer.style.width=250+'px'; ById('btAlertIncoming2').addEventListener ('click', function(){Dashboard.show(to)}, false); } } } if (Dashboard.Incoming && !Dashboard.StillComing) { if (Options.OverrideAttackAlert) { if (CanNotify) { ById('btGemContainer').innerHTML = SaveGemHTML; if (jQuery('#ahqbutton').hasClass('sel')) { ById('btGemContainer').style.display = 'none'; jQuery('.alliance_patch').show(); } } if (PopupVisible) { GemContainer.innerHTML = SaveGemHTML2; } } } Dashboard.Incoming = Dashboard.StillComing; // check for city incoming if (popDash && (Dashboard.CurrentCityId != 0)) { var citysoonest = {}; citysoonest.arrivalTime = -1; Dashboard.CityStillComing = false; for(n in inc) { var a = inc[n]; if (!a.score) continue; if (a.arrivalTime >= 0 && (a.arrivalTime < unixTime())) continue; // don't display arrival times already happened if (inc[n].toCityId == Dashboard.CurrentCityId) { Dashboard.CityStillComing = true; if ((a.arrivalTime >= 0 && (a.arrivalTime < citysoonest.arrivalTime)) || (citysoonest.arrivalTime == -1)) { citysoonest = a; if (!citysoonest.arrivalTime) citysoonest.arrivalTime = -1; if (citysoonest.arrivalTime > 0) break; } } } if (Dashboard.CityStillComing) { if (citysoonest.arrivalTime != -1) atime = CM.TimeFormatter.format(parseInt(citysoonest.arrivalTime-unixTime())); else atime = '??????'; msgcontainer = '
'; msgtable = '
 '+atime; msgend = '
'; ById('btCityAlert').innerHTML = msgcontainer+msgtable+msgend+'
'; } if (Dashboard.CityIncoming && !Dashboard.CityStillComing) { ById('btCityAlert').innerHTML = ""; } Dashboard.CityIncoming = Dashboard.CityStillComing; } } function Copy_Local_ATKP(cid,mid) { var now = unixTime(); if (Seed.queue_atkp[cid][mid].marchStatus==0) return; if (!local_atkp[mid] || (Seed.queue_atkp[cid][mid].marchUnixTime!=local_atkp[mid].marchUnixTime) || (Seed.queue_atkp[cid][mid].returnUnixTime!=local_atkp[mid].returnUnixTime)) { // add new march, or newly recalled march var march = new Object(); for (var p in Seed.queue_atkp[cid][mid]) { march[p] = Seed.queue_atkp[cid][mid][p]; } local_atkp[mid] = march; local_atkp[mid].marchCityId = cid.split("city")[1]; // from city if (!local_atkp[mid].marchId) { local_atkp[mid].marchId = mid.split("m")[1]; // march id } local_atkp[mid].btIncomplete = true; local_atkp[mid].btRequestSent = 0; } var destinationUnixTime = local_atkp[mid].destinationUnixTime - now; var returnUnixTime = local_atkp[mid].returnUnixTime - now; var marchStatus = parseInt(local_atkp[mid].marchStatus); if (destinationUnixTime < 0 && marchStatus != 2 && marchStatus != 8 && marchStatus != 7 && marchStatus != 0 && returnUnixTime > 0) { // refresh return journey local_atkp[mid].btIncomplete = true; // force a march refresh } if (local_atkp[mid].btIncomplete == true && Options.FetchMarchInfo) { if (local_atkp[mid].btRequestSent > 0) { local_atkp[mid].btRequestSent = local_atkp[mid].btRequestSent - 1; } else { local_atkp[mid].btRequestSent = 5; // delay any further requests for 5 seconds setTimeout(UpdateMarch,2000,local_atkp[mid].marchCityId,local_atkp[mid].marchId); // 2 sec delay on this } } } function Copy_Local_ATKINC(mid) { if (!local_atkinc[mid] || (Seed.queue_atkinc[mid].marchUnixTime!=local_atkinc[mid].marchUnixTime)) { // new march var march = new Object(); for (var p in Seed.queue_atkinc[mid]) { march[p] = Seed.queue_atkinc[mid][p]; } local_atkinc[mid] = march; local_atkinc[mid].btIncomplete = true; local_atkinc[mid].btRequestSent = 0; if (!local_atkinc[mid].marchId) { local_atkinc[mid].marchId = mid.split("m")[1]; // march id } } if (local_atkinc[mid].score) { // build an array of cities under attack var to = Cities.byID[local_atkinc[mid].toCityId]; if (to) { if (incCity.indexOf(to.idx) < 0) incCity.push(to.idx); } } if (local_atkinc[mid].btIncomplete == true && Options.FetchMarchInfo) { if (local_atkinc[mid].btRequestSent > 0) { local_atkinc[mid].btRequestSent = local_atkinc[mid].btRequestSent - 1; } else { local_atkinc[mid].btRequestSent = 5; // delay any further requests for 5 seconds setTimeout(UpdateIncomingMarch,2000,local_atkinc[mid].marchId); // 2 sec delay on this } } } /** Standard Functions **/ function translate (str) { if (LanguageArray[str]) { str = LanguageArray[str]; } else { NoTranslation[str] = ""; } return str; } function tx(str) {return translate(str);} function ById(id) {return document.getElementById(id);} function ByCl(cn) {return document.getElementsByClassName(cn);} function CheckForHTMLChange (panel,div,newHTML,wait) { var oldHTML = HTMLRegister[panel][div]; if (!wait && (oldHTML != newHTML)) { ById(div).innerHTML = newHTML; HTMLRegister[panel][div] = newHTML; return true; } return false; }; function ResetHTMLRegister (panel,div) { HTMLRegister[panel][div] = ''; }; function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex ; // While there remain elements to shuffle... while (0 !== currentIndex) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; // And swap it with the current element. temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } function getAbsoluteOffsets(e) { ret = { left: 0, top: 0 }; while (e.offsetParent) { if (e.style.position == 'absolute') break; ret.left += e.offsetLeft - e.scrollLeft; ret.top += e.offsetTop - e.scrollTop; e = e.offsetParent; } return ret; } function getOffset(el) { ret = { left: 0, top: 0 }; while(el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) { ret.left += el.offsetLeft - el.scrollLeft; ret.top += el.offsetTop - el.scrollTop; el = el.offsetParent; } return ret; } function getStyle(x,styleProp) { if (x.currentStyle) var y = x.currentStyle[styleProp]; else if (window.getComputedStyle) var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp); return y; } function getFirefoxVersion() { var ver = '', i; var ua = navigator.userAgent; if (ua) { i = ua.indexOf('CometBird/'); if (i >= 0) return {'Browser':'CometBird','Version':ua.substr(i + 10).split(' ')[0],'Mozilla':true}; i = ua.indexOf('OPR/'); if (i >= 0) return {'Browser':'Opera','Version':ua.substr(i + 4).split(' ')[0],'Mozilla':false}; i = ua.indexOf('Vivaldi/'); if (i >= 0) return {'Browser':'Vivaldi','Version':ua.substr(i + 8).split(' ')[0],'Mozilla':false}; i = ua.indexOf('Chrome/'); if (i >= 0) return {'Browser':'Chrome','Version':ua.substr(i + 7).split(' ')[0],'Mozilla':false}; i = ua.indexOf('Safari/'); if (i >= 0) return {'Browser':'Safari','Version':ua.substr(i + 7).split(' ')[0],'Mozilla':false}; i = ua.indexOf('PaleMoon/'); if (i >= 0) return {'Browser':'Palemoon','Version':ua.substr(i + 9).split(' ')[0],'Mozilla':true}; i = ua.indexOf('IceDragon/'); if (i >= 0) return {'Browser':'IceDragon','Version':ua.substr(i + 10).split(' ')[0],'Mozilla':true}; i = ua.indexOf('Firefox/'); if (i >= 0) return {'Browser':'Firefox','Version':ua.substr(i + 8).split(' ')[0],'Mozilla':true}; } return {Browser:'Firefox',Version:'0.00'}; } function getGMVersion() { if (typeof (GM_info) != 'object') { return {'Handler':'Scriptish','Version':'Unknown'}; } var Vers = GM_info.version || 'Unknown'; var Handler = GM_info.scriptHandler || 'Greasemonkey'; return {'Handler':Handler,'Version':Vers}; } function HEXtoRGB(hex) { if (hex.length==7) { var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); } else { if (hex.length==4) { var result = /^#?([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$/i.exec(hex); result[1] = result[1]+'0'; result[2] = result[2]+'0'; result[3] = result[3]+'0'; } } return result ? { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16) } : {r:0, g:0, b:0}; } function searchDOM (node, condition, maxLevel, doMult){ var found = []; eval ('var compFunc = function (node) { return ('+ condition +') }'); doOne(node, 1); if(!doMult){ if (found.length==0) return null; return found[0]; } return found; function doOne (node, curLevel){ try { if (compFunc(node)) found.push(node); } catch (e){ } if (!doMult && found.length>0) return; if (++curLevelSWF Disabled or not Installed'; } else { t.alertdiv.innerHTML = t.source; } } else { logit('sound probs on play'); } } }; function stop(){ clearTimeout(t.stoptimer); if(t.type == 'html5'){ t.player.pause(); if (t.player.readyState === 4) { t.player.currentTime = 0 } } else { if (t.alertdiv) { if (t.hasFlash) { t.alertdiv.innerHTML = 'SWF Audio Played'; } } else { logit('sound probs on stop'); } } }; function setSource(src){ if (matTypeof(src) == 'object') { if(t.defaulttype == 'html5'){ t.player.src = src.OGG; t.type = 'html5'; } else { logit('Browser has no native Audio support'); t.source = SWF_PREFIX+src.URL+'&volume='+t.volume+SWF_SUFFIX; t.type = 'swf'; } } else { if ((src.split('.').pop().toUpperCase()=='MP3') && !t.canPlayMP3) { logit('Browser has no native MP3 support'); t.source = SWF_PREFIX+src+'&volume='+t.volume+SWF_SUFFIX; t.type = 'swf'; } else { if(t.defaulttype == 'html5'){ t.player.src = src; t.type = 'html5'; } else { logit('Browser has no native Audio support'); // probably can't play the sound, send it to SWF anyway.. t.source = SWF_PREFIX+src+'&volume='+t.volume+SWF_SUFFIX; t.type = 'swf'; } } } // if source changed need to load.. ( not SWF) if (t.type == 'html5') { if (t.source != t.player.src) { t.player.load(); t.source = t.player.src; } } }; function initSWF(e){ t.alertdiv = document.createElement("span"); t.alertdiv.style.verticalAlign = 'top'; t.alertdiv.style.paddingLeft = '20px'; e.appendChild(t.alertdiv); e.style.height = '20px'; try { var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); if (fo) { t.hasFlash = true; } } catch (e) { if (navigator.mimeTypes && navigator.mimeTypes['application/x-shockwave-flash'] != undefined && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) { t.hasFlash = true; } } }; } function hideMe() { if (!Options.btWinIsOpen) return; mainPop.show(false); Options.btWinIsOpen = false; saveOptions(); } function showMe() { mainPop.show(true); Options.btWinIsOpen = true; saveOptions(); } var WinManager = { wins : {}, // prefix : CPopup obj get : function (prefix){ var t = WinManager; return t.wins[prefix]; }, add : function (prefix, pop){ var t = WinManager; t.wins[prefix] = pop; if (uW.cpopupWins == null) { uWCreateObjectIn('cpopupWins',{}); } uW.cpopupWins[prefix] = pop; }, delete : function (prefix){ var t = WinManager; delete t.wins[prefix]; delete uW.cpopupWins[prefix]; } } // value is 0 to 1.0 function SliderBar (container, width, height, value, classPrefix, margin){ var self = this; this.listener = null; if (value==null) value = 0; if (!margin) margin = parseInt(width*0.05); this.value = value; if (width<20) width=20; if (height<5) height=5; if (classPrefix == null){ classPrefix = 'slider'; var noClass = true; } var sliderHeight = parseInt(height/2); var sliderTop = parseInt(height/4); this.sliderWidth = width - (margin*2); this.div = document.createElement ('div'); this.div.style.height = height +'px'; this.div.style.width = width +'px'; this.div.className = classPrefix +'Cont'; this.slider = document.createElement ('div'); this.slider.setAttribute ('style', 'position:relative;'); this.slider.style.height = sliderHeight + 'px' this.slider.style.top = sliderTop + 'px'; this.slider.style.width = this.sliderWidth +'px'; this.slider.style.left = margin +'px'; ///// this.slider.className = classPrefix +'Bar'; this.slider.draggable = true; if (noClass) this.slider.style.backgroundColor='#fff'; this.sliderL = document.createElement ('div'); this.sliderL.setAttribute ('style', 'width:100px; height:100%; position:relative;'); this.sliderL.className = classPrefix +'Part'; this.sliderL.draggable = true; if (noClass) this.sliderL.style.backgroundColor='#0c0'; this.knob = document.createElement ('div'); this.knob.setAttribute ('style', 'width:3px; position:relative; left:0px; background-color:#222;'); this.knob.style.height = height +'px'; this.knob.style.top = (0-sliderTop) +'px'; this.knob.className = classPrefix +'Knob'; this.knob.draggable = true; this.slider.appendChild(this.sliderL); this.sliderL.appendChild (this.knob); this.div.appendChild (this.slider); container.appendChild (this.div); this.div.addEventListener('mousedown', mouseDown, false); this.getValue = function (){ return self.value; } this.setValue = function (val){ var relX = (val * self.sliderWidth); self.sliderL.style.width = relX + 'px'; self.knob.style.left = relX + 'px'; self.value = val; if (self.listener) self.listener(self.value); } this.setChangeListener = function (listener){ self.listener = listener; } function moveKnob (me){ var relX = me.clientX - self.divLeft; if (relX < 0) relX = 0; if (relX > self.sliderWidth) relX = self.sliderWidth; self.knob.style.left = (relX - (self.knob.clientWidth/2) ) +'px'; // - half knob width !?!? self.sliderL.style.width = relX + 'px'; self.value = relX / self.sliderWidth; if (self.listener) self.listener(self.value); } function doneMoving (){ self.div.removeEventListener('mousemove', mouseMove, true); document.removeEventListener('mouseup', mouseUp, true); } function mouseUp (me){ moveKnob (me); doneMoving(); } function mouseDown(me){ var e = self.slider; self.divLeft = 0; while (e.offsetParent){ // determine actual clientX self.divLeft += e.offsetLeft; e = e.offsetParent; } moveKnob (me); document.addEventListener('mouseup', mouseUp, true); self.div.addEventListener('mousemove', mouseMove, true); } function mouseMove(me){ moveKnob (me); } } // creates a 'popup' div // prefix must be a unique (short) name for the popup window function CPopup (prefix, x, y, width, height, enableDrag, onClose) { var pop = WinManager.get(prefix); if (pop){ pop.show (false); return pop; } this.BASE_ZINDEX = 111111; // protos ... this.show = show; this.toggleHide = toggleHide; this.getTopDiv = getTopDiv; this.getMainDiv = getMainDiv; this.getLayer = getLayer; this.setLayer = setLayer; this.setEnableDrag = setEnableDrag; this.getLocation = getLocation; this.setLocation = setLocation; this.getDimensions = getDimensions; this.setDimensions = setDimensions; this.focusMe = focusMe; this.unfocusMe = unfocusMe; this.centerMe = centerMe; this.destroy = destroy; // object vars ... this.div = document.createElement('div'); this.prefix = prefix; this.onClose = onClose; var t = this; this.div.className = 'btPopup '+ prefix +'_btPopup'; this.div.id = prefix +'_outer'; this.div.style.background = "#fff"; this.div.style.zIndex = this.BASE_ZINDEX; this.div.style.display = 'none'; this.div.style.width = width + 'px'; this.div.style.height = height + 'px'; this.div.style.position = "absolute"; this.div.style.top = y +'px'; this.div.style.left = x + 'px'; var m = '\ \
X
'; document.body.appendChild(this.div); this.div.innerHTML = m; ById(prefix+'_X').addEventListener ('click', e_XClose, false); this.dragger = new CWinDrag (ById(prefix+'_bar'), this.div, enableDrag); this.div.addEventListener ('mousedown', e_divClicked, false); WinManager.add(prefix, this); function e_divClicked (){ t.focusMe(); } function e_XClose (){ t.show(false); if (t.onClose != null) t.onClose(); } function focusMe (){ t.setLayer(5); for (var k in uW.cpopupWins){ if (k != t.prefix) uW.cpopupWins[k].unfocusMe(); } } function unfocusMe (){ t.setLayer(-5); } function getLocation (){ return {x: parseInt(this.div.style.left), y: parseInt(this.div.style.top)}; } function getDimensions (){ return {x: parseInt(this.div.style.width), y: parseInt(this.div.style.height)}; } function setLocation (loc){ t.div.style.left = loc.x +'px'; t.div.style.top = loc.y +'px'; } function setDimensions (loc){ t.div.style.width = loc.x +'px'; t.div.style.height = loc.y +'px'; } function destroy (){ document.body.removeChild(t.div); WinManager.delete (t.prefix); } function centerMe (parent){ if (parent == null){ var coords = getClientCoords(document.body); } else var coords = getClientCoords(parent); var x = ((coords.width - parseInt(t.div.style.width)) / 2) + coords.x; var y = ((coords.height - parseInt(t.div.style.height)) / 2) + coords.y; if (x<0) x = 0; if (y<0) y = 0; t.div.style.left = x +'px'; t.div.style.top = y +'px'; } function setEnableDrag (tf){ t.dragger.setEnable(tf); } function setLayer(zi){ t.div.style.zIndex = ''+ (this.BASE_ZINDEX + zi); } function getLayer(){ return parseInt(t.div.style.zIndex) - this.BASE_ZINDEX; } function getTopDiv(){ return ById(this.prefix+'_top'); } function getMainDiv(){ return ById(this.prefix+'_content'); } function show(tf){ if (tf){ t.div.style.display = 'block'; t.focusMe (); } else { t.div.style.display = 'none'; } return tf; } function toggleHide(t){ if (t.div.style.display == 'block') { return t.show (false); } else { return t.show (true); } } } function CWinDrag (clickableElement, movingDiv, enabled) { var t=this; this.setEnable = setEnable; this.setBoundRect = setBoundRect; this.lastX = null; this.lastY = null; this.enabled = true; this.moving = false; this.theDiv = movingDiv; this.body = document.body; this.ce = clickableElement; this.moveHandler = new CeventMove(this).handler; this.outHandler = new CeventOut(this).handler; this.upHandler = new CeventUp(this).handler; this.downHandler = new CeventDown(this).handler; this.clickableRect = null; this.boundRect = null; this.bounds = null; this.enabled = false; if (enabled == null) enabled = true; this.setEnable (enabled); function setBoundRect (b){ // this rect (client coords) will not go outside of current body this.boundRect = boundRect; this.bounds = null; } function setEnable (enable){ if (enable == t.enabled) return; if (enable){ clickableElement.addEventListener('mousedown', t.downHandler, false); t.body.addEventListener('mouseup', t.upHandler, false); } else { clickableElement.removeEventListener('mousedown', t.downHandler, false); t.body.removeEventListener('mouseup', t.upHandler, false); } t.enabled = enable; } function CeventDown (that){ this.handler = handler; var t = that; function handler (me){ if (t.bounds == null){ t.clickableRect = getClientCoords(clickableElement); t.bodyRect = getClientCoords(document.body); if (t.boundRect == null) t.boundRect = t.clickableRect; t.bounds = {top:10-t.clickableRect.height, bot:t.bodyRect.height-25, left:40-t.clickableRect.width, right:t.bodyRect.width-25}; } if (me.button==0 && t.enabled){ t.body.addEventListener('mousemove', t.moveHandler, true); t.body.addEventListener('mouseout', t.outHandler, true); t.lastX = me.clientX; t.lastY = me.clientY; t.moving = true; } } } function CeventUp (that){ this.handler = handler; var t = that; function handler (me){ if (me.button==0 && t.moving) _doneMoving(t); } } function _doneMoving (t){ t.body.removeEventListener('mousemove', t.moveHandler, true); t.body.removeEventListener('mouseout', t.outHandler, true); t.moving = false; } function CeventOut (that){ this.handler = handler; var t = that; function handler (me){ if (me.button==0){ t.moveHandler (me); } } } function CeventMove (that){ this.handler = handler; var t = that; function handler (me){ if (t.enabled && !t.wentOut){ var newTop = parseInt(t.theDiv.style.top) + me.clientY - t.lastY; var newLeft = parseInt(t.theDiv.style.left) + me.clientX - t.lastX; if (newTop < t.bounds.top){ // if out-of-bounds... newTop = t.bounds.top; _doneMoving(t); } else if (newLeft < t.bounds.left){ newLeft = t.bounds.left; _doneMoving(t); } else if (newLeft > t.bounds.right){ newLeft = t.bounds.right; _doneMoving(t); } else if (newTop > t.bounds.bot){ newTop = t.bounds.bot; _doneMoving(t); } t.theDiv.style.top = newTop + 'px'; t.theDiv.style.left = newLeft + 'px'; t.lastX = me.clientX; t.lastY = me.clientY; } } } } function ResetWindowPos (me,el,pop){ if (me.button == 2){ var c = getClientCoords (ById(el)); if (pop) { pop.setLocation ({x: c.x+4, y: c.y+c.height}); mainPop.unfocusMe();pop.focusMe();} saveOptions(); } } var tabManager = { tabList : {}, // {name, obj, div} currentTab : null, init : function (mainDiv){ var t = tabManager; var sorter = []; var LineBreak = 10; if (GlobalOptions.btWinSize.x == 750) {LineBreak = 8;} if (GlobalOptions.btWinSize.x == 1250) {LineBreak = 12;} for (var k in Tabs){ if (!Tabs[k].tabDisabled){ t.tabList[k] = {}; t.tabList[k].name = k; t.tabList[k].tabColor = Tabs[k].tabColor?Tabs[k].tabColor:'blue'; t.tabList[k].obj = Tabs[k]; if (Tabs[k].tabLabel != null) { t.tabList[k].label = tx(Tabs[k].tabLabel); } else { t.tabList[k].label = k; } if (Tabs[k].tabOrder != null) sorter.push([Tabs[k].tabOrder, t.tabList[k]]); else sorter.push([1000, t.tabList[k]]); t.tabList[k].div = document.createElement('div'); } } sorter.sort (function (a,b){return a[0]-b[0]}); var m = '
PowerBot+ Lite (Version '+Version+')
'; if (!GlobalOptions.btPowerBar) { m += ''; for (var i=0; i'+ sorter[i][1].label +''; if ((i+1)%LineBreak == 0) m+=''; } m+='
'; } else { var n = ''; if(GlobalOptions.btPowerBarPopups) { n = '
'; } for (var i=0; i'+ sorter[i][1].label +''; } ById('btPowerBarButtons').innerHTML = n; } mainPop.getTopDiv().innerHTML = m; for (var k in t.tabList) { if (t.tabList[k].name == Options.currentTab) t.currentTab =t.tabList[k] ; ById('bttc'+ k).addEventListener('click', this.e_clickedTab, false); var div = t.tabList[k].div; div.style.display = 'none'; div.style.height = '100%'; mainDiv.appendChild(div); try { t.tabList[k].obj.init(div); } catch (e){ logerr(e); div.innerHTML = "
INIT ERROR: "+e.message; try { div.innerHTML += '

Debug Info
'+e.stack+'
'; } catch (e) { } } } if (t.currentTab == null) t.currentTab = sorter[0][1]; if (!GlobalOptions.btPowerBar) { t.setTabStyle (t.currentTab, true); } t.currentTab.div.style.display = 'block'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, hideTab : function (){ var t = tabManager; if (matTypeof(t.currentTab.obj.hide)=="function") t.currentTab.obj.hide(); if (GlobalOptions.btPowerBar) { Options.btWinIsOpen = false; Options.currentTab = null; saveOptions(); t.setTabStyle (t.currentTab, false); } }, showTab : function (init){ var t = tabManager; if (matTypeof(t.currentTab.obj.show)=="function") t.currentTab.obj.show(init); if (GlobalOptions.btPowerBar) { t.setTabStyle (t.currentTab, true); Options.btWinIsOpen = true; Options.currentTab = t.currentTab.name; saveOptions(); } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, setTabStyle : function (Tab, selected){ var e = ById ('bttc'+ Tab.name) var c = Tab.tabColor?Tab.tabColor:"blue"; if (selected){ e.className = 'buttonv2 std green'; } else { e.className = 'buttonv2 std '+c; } }, e_clickedTab : function (e){ var t = tabManager; if (!Options.btWinIsOpen) { mainPop.show (true); } if (!GlobalOptions.btPowerBar) { if (e.target.id) var newTab = t.tabList[e.target.id.substring(4)]; else var newTab = t.tabList[e.target.parentNode.id.substring(4)]; } else { var newTab = t.tabList[e.target.id.substring(4)]; t.setTabStyle (newTab, true); Options.currentTab = newTab.name; Options.btWinIsOpen = true; saveOptions(); } if (t.currentTab.name != newTab.name){ t.setTabStyle(t.currentTab, false); t.setTabStyle(newTab, true); if (matTypeof(t.currentTab.obj.hide)=="function") t.currentTab.obj.hide(); t.currentTab.div.style.display = 'none'; t.currentTab = newTab; newTab.div.style.display = 'block'; Options.currentTab = newTab.name; saveOptions(); } if (matTypeof(newTab.obj.show)=="function") newTab.obj.show(); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, EverySecond : function () { var t = tabManager; for (var k in t.tabList) { if (!t.tabList[k].tabDisabled && matTypeof(t.tabList[k].obj.EverySecond)=="function") { try { t.tabList[k].obj.EverySecond(); } catch (e){ logerr(e);} } } }, } //This is a new implementation of the CalterUwFunc class to modify a function of the 'uW' object. function addScript (scriptText){ var scr = document.createElement('script'); scr.innerHTML = scriptText; document.body.appendChild(scr); } addScript ('uWFunc = function (text){ eval (text); }'); var CalterUwFunc = function (funcName, findReplace) { this.isAvailable = isAvailable; this.setEnable = setEnable; this.funcName = funcName; this.funcModifier = null; this.modIndex = 0; this.numberMods = 0; // find an existing CalterUwFunc if it already exists if (!uW.calterRegistry) uWCreateObjectIn('calterRegistry',{}); var calterF = null; if (uW.calterRegistry[funcName]) { // use the existing function modifier calterF = uW.calterRegistry[funcName]; for (var i=0; i< findReplace.length; i++) { uW.calterRegistry[funcName].addModifier(findReplace[i]); } } else { // create and register the new calter calterF = new CalterFuncModifier(funcName, findReplace); if (typeof createObjectIn == 'function') { var newfunc = createObjectIn(uW.calterRegistry,{defineAs: funcName}); exportFunction(calterF.applyModifiers,newfunc,{defineAs:'applyModifiers'}); exportFunction(calterF.addModifier,newfunc,{defineAs:'addModifier'}); exportFunction(calterF.enableModifier,newfunc,{defineAs:'enableModifier'}); exportFunction(calterF.testModifier,newfunc,{defineAs:'testModifier'}); exportFunction(calterF.modEnabled,newfunc,{defineAs:'modEnabled'}); exportFunction(calterF.numModifiers,newfunc,{defineAs:'numModifiers'}); exportFunction(calterF.funcOld,newfunc,{defineAs:'funcOld'}); newfunc.funcName = cloneInto(calterF.funcName,newfunc); newfunc.funcOldString = cloneInto(calterF.funcOldString,newfunc); newfunc.modifiers = cloneInto(calterF.modifiers,newfunc); newfunc.modsActive = cloneInto(calterF.modsActive,newfunc); } else { uW.calterRegistry[funcName] = uWCloneInto(calterF); } } if (typeof Object.assign == 'function') { this.funcModifier = Object.assign({}, uW.calterRegistry[funcName]); } else { this.funcModifier = calterF; } if (findReplace != null) { this.numberMods = findReplace.length; this.modIndex = this.funcModifier.numModifiers()- this.numberMods; } function isAvailable() { // check if any of the replace strings matched the original function var avail = false; for (var i = this.modIndex; i < this.modIndex + this.numberMods; i++ ) { if (this.funcModifier.testModifier(i)) avail= true; } return avail; } function setEnable(tf) { this.funcModifier.enableModifier(this.modIndex, tf, this.numberMods); } } var CalterFuncModifier = function (funcName, findReplace) { // (second argument is now optional ) this.applyModifiers = applyModifiers; this.addModifier = addModifier; this.enableModifier = enableModifier; this.testModifier = testModifier; this.modEnabled = modEnabled; this.numModifiers = numModifiers; this.funcName = funcName; this.funcOld = null; this.funcOldString = null; this.funcNew = null; this.modifiers = []; this.modsActive = []; try { var x = this.funcName.split('.'); var f = uW; for (var i=0; i=0 && typeof(v.splice)=='function') return 'array'; else return 'object'; } return typeof (v); } function implodeUrlArgs (obj){ var a = []; for (var k in obj) a.push (k +'='+ encodeURI(obj[k]) ); return a.join ('&'); } // NOTE: args can be either a string which will be appended as is to url or an object of name->values function addUrlArgs (url, args){ if (!args) return url; if (url.indexOf('?') < 0) url += '?'; else if (url.substr(url.length-1) != '&') url += '&'; if (matTypeof(args == 'object')) return url + implodeUrlArgs (args); return url + args; } function myClone(source) { var dest = {}; for (var property in source) dest[property] = source[property]; return dest; } function MyAjaxRequest (url, o, noRetry){ var opts = myClone(o); var wasSuccess = o.onSuccess; var wasFailure = o.onFailure; // if failure, retry 3 times every 2 secs? var retry = 3; var delay = 2; var noRetry = noRetry===true?true:false; opts.onSuccess = mySuccess; opts.onFailure = myFailure; var obj = {}; obj.timestamp = unixTime(); obj.url = url; AJAX_LOG.push(obj); new AjaxRequest(url, opts); return; function myRetry(rslt){ --retry; if (retry > 0) new AjaxRequest(url, opts); else wasSuccess (rslt); // let the calling function handle it } function myFailure(){ var o = {}; o.ok = false; o.errorMsg = "AJAX Communication Failure"; wasFailure (o); } function mySuccess (msg){ var rslt; if(typeof msg.responseText === 'string'){ var hasCode = (msg.responseText.indexOf("function() {")!=-1); if(!hasCode){ var rslt = eval("(" + msg.responseText + ")"); } } if (!rslt) { rslt = {}; rslt.errorMsg = "Unexpected Response from Server"; rslt.BotCode = 999; // alert!!! rslt.responseText = msg.responseText; // for logging! Usually map captcha type delay function wasSuccess (rslt); return; } if (rslt.ok){ rslt.errorMsg = null; ///// !!!!!!!!!!!!! ************ if (rslt.updateSeed) uW.update_seed(uWCloneInto(rslt.updateSeed)); wasSuccess (rslt); return; } rslt.errorMsg = uW.printLocalError((rslt.error_code || null), (rslt.msg || null), (rslt.feedback || "999")); // null causes error sometimes if (!noRetry && (rslt.error_code==0 ||rslt.error_code==8 || rslt.error_code==1 || rslt.error_code==3)){ setTimeout (function(){myRetry(rslt)}, delay*1000); } else { wasSuccess (rslt); } } } function AjaxRequest (url, opts){ var headers = { 'X-Requested-With': 'XMLHttpRequest', 'X-Prototype-Version': '1.7.1', 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' }; var ajax = null; if (window.XMLHttpRequest) ajax=new XMLHttpRequest(); else ajax=new ActiveXObject("Microsoft.XMLHTTP"); if (opts.method==null || opts.method=='') method = 'GET'; else method = opts.method.toUpperCase(); if (method == 'POST'){ headers['Content-type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; } else if (method == 'GET'){ addUrlArgs (url, opts.parameters); } ajax.onreadystatechange = function(){ // ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; states 0-4 if (ajax.readyState==4) { if (ajax.status >= 200 && ajax.status < 305) if (opts.onSuccess) opts.onSuccess(ajax); else if (opts.onFailure) opts.onFailure(ajax); } else { if (opts.onChange) opts.onChange (ajax); } } ajax.open(method, url, true); // always async! for (var k in headers) ajax.setRequestHeader (k, headers[k]); if (matTypeof(opts.requestHeaders)=='object') for (var k in opts.requestHeaders) ajax.setRequestHeader (k, opts.requestHeaders[k]); if (method == 'POST'){ var a = []; for (var k in opts.parameters) { if (matTypeof(opts.parameters[k]) == 'object') { for (var h in opts.parameters[k]) { if (matTypeof(opts.parameters[k][h]) == 'object') { for (var i in opts.parameters[k][h]) { if (matTypeof(opts.parameters[k][h][i]) == 'object') { for (var j in opts.parameters[k][h][i]) { a.push (k+'['+h+']['+i+']['+j+'] ='+ opts.parameters[k][h][i][j]); } } else { a.push (k+'['+h+']['+i+']'+' ='+ opts.parameters[k][h][i]); } } } else { a.push (k+'['+h+'] ='+ opts.parameters[k][h] ); } } } else { a.push (k +'='+ opts.parameters[k] ); } } ajax.send (a.join ('&')); } else { ajax.send(); } }; function DouW(func, execute_by_embed) { if(this.isChrome || execute_by_embed) { var scr=document.createElement('script'); scr.innerHTML=func; document.body.appendChild(scr); } else { try { eval("uW."+func); } catch (error) { logit("A javascript error has occurred when executing a function via DouW. Error description: "+error.description); } } } /** Standard Game Functions **/ function getThroneEffectName(id,tier) { var RetVal = uW.g_js_strings.throneRoom["effectName_" + id]; if (CM.THRONE_ROOM_TYPE_DEBUFF_EFFECTS.indexOf(parseInt(id)) != -1 && tier) { RetVal = RetVal.replace("%1$s", CM.THRONE_ROOM_TYPE_DEBUFF_EFFECTS_TIER_PERCENTAGE[tier - 1] + "% "); } return RetVal; } function SelectText(elem) { var range, selection; if (document.body.createTextRange) { range = document.body.createTextRange(); range.moveToElementText(elem); range.select(); } else if (window.getSelection) { selection = window.getSelection(); range = document.createRange(); range.selectNodeContents(elem); selection.removeAllRanges(); selection.addRange(range); } } function StartKeyTimer(elem,notify,entry) { if (KeyTimer) { clearTimeout(KeyTimer); } KeyTimer = setTimeout( function () {notify(elem,entry);},1000); } function htmlTitleLine(msg) { return '

[ ' + msg + ' ]
'; } function strButton20(label, tags) { if (tags == null) tags = ''; return ('' + label + ''); } function strButton14(label, tags, colourclass) { if (tags == null) tags = ''; if (colourclass == null) colourclass = 'blue14'; return ('' + label + ''); } function strButton8(label, tags) { if (tags == null) tags = ''; return ('' + label + ''); } function makeButtonv2(color,tags,label) { return ''+ label +''; } function getServerId() { var m=/^[a-zA-Z]+([0-9]+)\./.exec(document.location.hostname); if(m) return m[1]; return '??'; } function getTokenServerId() { // domain for tokens may be passed in URL as &token_s parameter... var myServerId = UserOptions.TokenDomain; var squery = /[\?,\&]token_s=\d+/; var dquery = /\d+/; var Sresult = dquery.exec(squery.exec(document.location.search)); if (Sresult) myServerId = Sresult; return myServerId; } function getFeedServerId() { var myServerId = UserOptions.TokenDomain; var squery = /[\?,\&]s=\d+/; var dquery = /\d+/; var Sresult = dquery.exec(squery.exec(document.location.search)); if (Sresult) myServerId = Sresult; return myServerId; } function getFeedId() { var myFeedId = 'n/a'; var squery = /[\?,\&]f=\d+/; var dquery = /\d+/; var Sresult = dquery.exec(squery.exec(document.location.search)); if (Sresult) myFeedId = Sresult; return myFeedId; } function getFeedUserId() { var myFeedUserId = 'n/a'; var squery = /[\?,\&]in=\d+/; var dquery = /\d+/; var Sresult = dquery.exec(squery.exec(document.location.search)); if (Sresult) myFeedUserId = Sresult; return myFeedUserId; } function readGlobalOptions (){ s = GM_getValue ('Options_??'); if (s != null){ opts = JSON2.parse (s); for (var k in opts){ if (matTypeof(opts[k]) == 'object') { for (var kk in opts[k]) { if (GlobalOptions[k]) { GlobalOptions[k][kk] = opts[k][kk]; } } } else { GlobalOptions[k] = opts[k]; } } } if (GlobalOptions.GlobalOptionsVersion && GlobalOptions.GlobalOptionsVersion!="0" && AutoUpdater.compareVersion(Version, GlobalOptions.GlobalOptionsVersion)) { GlobalOptionsUpdate(); GlobalOptions.GlobalOptionsVersion = Version; saveGlobalOptions(); } } function saveGlobalOptions (){ setTimeout (function (){ GM_setValue ('Options_??', JSON2.stringify(GlobalOptions));}, 0); // get around GM_SetValue uW error } function readOptions (){ var serverID = getServerId(); s = GM_getValue ('Options_'+serverID+'_'+uW.tvuid); if (s != null){ opts = JSON2.parse (s); for (var k in opts) Options[k] = opts[k]; } if (Options.OptionsVersion && Options.OptionsVersion!="0" && AutoUpdater.compareVersion(Version, Options.OptionsVersion)) { OptionsUpdate(); Options.OptionsVersion = Version; saveOptions(); } } function saveOptions (){ if (uW.btLoaded) { var serverID = getServerId(); setTimeout(function (){ GM_setValue ('Options_'+serverID+'_'+uW.tvuid, JSON2.stringify(Options)); }, 0); // get around GM_SetValue uW error } } function readUserOptions (user_id){ // facebook user id if (!user_id || user_id=="") {return;} s = GM_getValue ('UserOptions_'+user_id); if (s != null){ opts = JSON2.parse (s); for (var k in opts) UserOptions[k] = opts[k]; } } function saveUserOptions (user_id){ // facebook user id if (!user_id || user_id=="") {return;} setTimeout(function (){ GM_setValue ('UserOptions_'+user_id, JSON2.stringify(UserOptions)); }, 0); // get around GM_SetValue uW error } function readLanguage (lang) { NoTranslation = {}; LanguageArray = {}; var s = GM_getValue ("LanguageArray_"+lang); if (s != null){ var lang = JSON2.parse (s); for (var k in lang){ LanguageArray[k] = lang[k]; } } } function saveLanguage (lang) { setTimeout ( function (){GM_setValue ("LanguageArray_"+lang, JSON2.stringify(LanguageArray));}, 0); } function ToggleOption(optionArea, checkboxId, optionName, callOnChange, callIsAvailable) { var checkbox = ById(checkboxId); if (callIsAvailable && callIsAvailable() == false) { checkbox.disabled = true; return; }; if (optionArea=="") { var checkMe = Options[optionName] } else { var checkMe = Options[optionArea][optionName] } checkbox.checked = checkMe; checkbox.addEventListener ('change', eventHandler, false); function eventHandler () { if (optionArea=="") { Options[optionName] = this.checked; } else { Options[optionArea][optionName] = this.checked; } saveOptions(); if (callOnChange) callOnChange(this.checked); } } function ChangeOption(optionArea, valueId, optionName, callOnChange) { var e = ById(valueId); if (optionArea=="") { e.value = Options[optionName] } else { e.value = Options[optionArea][optionName] } e.addEventListener ('change', eventHandler, false); function eventHandler (){ if (optionArea=="") { Options[optionName] = this.value; } else { Options[optionArea][optionName] = this.value; } saveOptions(); if (callOnChange) { callOnChange (this.value); } } } function ChangeIntegerOption(optionArea, valueId, optionName, defaultValue, callOnChange) { var e = ById(valueId); if (optionArea=="") { e.value = Options[optionName] } else { e.value = Options[optionArea][optionName] } e.addEventListener ('change', eventHandler, false); function eventHandler (){ if (isNaN(this.value)) { this.value = parseIntNan(defaultValue); } if (optionArea=="") { Options[optionName] = parseIntNan(this.value); this.value = Options[optionName]; } else { Options[optionArea][optionName] = parseIntNan(this.value); this.value = Options[optionArea][optionName]; } saveOptions(); if (callOnChange) { callOnChange (this.value); } } } function GetDisplayName(){ var DisplayName = ById('topnavDisplayName'); if (DisplayName) { DisplayName = DisplayName.innerHTML; } else { DisplayName = null; } return DisplayName } function setCities() { Cities.numCities = Seed.cities.length; Cities.cities = []; Cities.byID = {}; for (var i=0; i
'+ bd +''; } return msg; }; function getAscensionValues (cityId) { var ret = {isPrestigeCity:false, prestigeLevel:0, prestigeType:0, prestigeBuffExpire:0, blessings:""}; if(Seed.cityData.city[cityId].isPrestigeCity){ ret.isPrestigeCity = true; ret.prestigeLevel = parseIntNan(Seed.cityData.city[cityId].prestigeInfo.prestigeLevel); ret.prestigeType = parseIntNan(Seed.cityData.city[cityId].prestigeInfo.prestigeType); ret.prestigeBuffExpire = Seed.cityData.city[cityId].prestigeInfo.prestigeBuffExpire; ret.blessings = Seed.cityData.city[cityId].prestigeInfo.blessings.slice(); } return ret; }; function getSpellData (cityId) { var ret = {faction: "", spellavailable:false, cooldownactive:false, cooldown:0}; var ascended = getAscensionValues(cityId); if (ascended.isPrestigeCity) { ret.faction = ascended.prestigeType; ret.spellavailable = (ascended.blessings.indexOf(SpellBlessings[ret.faction]) != -1); ret.cooldownactive = (Seed.cityData.city[cityId].spells && Seed.cityData.city[cityId].spells[SpellTypes[ret.faction]] && parseInt(Seed.cityData.city[cityId].spells[SpellTypes[ret.faction]].endDate) > uW.unixtime()); if (ret.spellavailable && ret.cooldownactive) { ret.cooldown = uW.timestr(parseInt(Seed.cityData.city[cityId].spells[SpellTypes[ret.faction]].endDate) - uW.unixtime()); } } return ret; }; function getFactionBonus (slot) { var equippeditems = Seed.throne.slotEquip[slot]; var EQ = {}; jQuery.each(equippeditems, function (A, B) { x = uW.kocThroneItems[B]; EQ[x.id] = x; }); return CM.ThroneController.hasFactionBonus(uWCloneInto(EQ)); } function getTREffectStyle(i) { var ret = {}; ret.LineStyle = ''; ret.EndStyle = ''; if (AttackEffects.indexOf(parseInt(i)) > -1) ret.LineStyle = ''; if (DefenceEffects.indexOf(parseInt(i)) > -1) ret.LineStyle = ''; if (LifeEffects.indexOf(parseInt(i)) > -1) ret.LineStyle = ''; if (RangeEffects.indexOf(parseInt(i)) > -1) ret.LineStyle = ''; if (SpeedEffects.indexOf(parseInt(i)) > -1) ret.LineStyle = ''; if (AccuracyEffects.indexOf(parseInt(i)) > -1) ret.LineStyle = ''; if (OtherCombatEffects.indexOf(parseInt(i)) > -1) ret.LineStyle = ''; if (GlobalEffects.indexOf(parseInt(i)) > -1) { ret.LineStyle = ret.LineStyle + ''; ret.EndStyle = '' + ret.EndStyle; } if (DebuffEffects.indexOf(parseInt(i)) > -1) { ret.LineStyle = ret.LineStyle + ''; ret.EndStyle = '' + ret.EndStyle; } return ret; }; function setTroops() { for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; var tt = CM.unitFrontendType[i]; switch(tt) { case "spellcaster": SpellCaster.push(i); break; case "siege": Siege.push(i); break; case "horsed": Horsed.push(i); break; case "ranged": Ranged.push(i); break; default: Infantry.push(i); } if (TTSort.indexOf(i) == -1) { TTSort.push(i); } } }; function distance(d, f, c, e) { var a = 750; var g = a / 2; var b = Math.abs(c - d); if (b > g) b = a - b; var h = Math.abs(e - f); if (h > g) h = a - h; return Math.round(100 * Math.sqrt(b * b + h * h)) / 100; }; function CalculateTileId(x, y) { var prov = ''; for (var i in Provinces) { if (x>=Provinces[i].x && x=Provinces[i].y && y= dst_start && today < dst_end) { //does today fall inside of DST period? dstadj = (3600); // 60 mins! } return dstadj; } function FullDateTime(str) { var time = new Date(str*1000); D = addZero(time.getDate()); M = addZero(time.getMonth()+1); Y = addZero(time.getFullYear()); h = addZero(time.getHours()); m = addZero(time.getMinutes()); s = addZero(time.getUTCSeconds()); var fullDate = D +"/"+ M +"/"+ Y +" "+ h + ":" + m + ":" + s; return fullDate; } function yyyymmdd(dateIn) { var yyyy = dateIn.getFullYear(); var mm = dateIn.getMonth()+1; // getMonth() is zero-based var dd = dateIn.getDate(); return String(10000*yyyy + 100*mm + dd); // Leading zeros for mm and dd } function replaceAll (str,find,replace,ignoreCase) { var _token; var token=find; var newToken=replace; var i = -1; if (typeof token === "string") { if (ignoreCase) { _token = token.toLowerCase(); while((i = str.toLowerCase().indexOf(token, i >= 0 ? i + newToken.length : 0)) !== -1) { str = str.substring( 0, i )+newToken+str.substring(i+token.length); } } else { str = str.split(token).join(newToken); } } return str; } function addZero(i) { if (i<10) i="0" + i; return i; } function parseIntNan (n){ x = parseInt(n, 10); if (isNaN(x)) return 0; return x; } function parseIntCommas (n){ n = n.split(','); n = n.join(''); x = parseInt(n, 10); if (isNaN(x)) return 0; return x; } function parseIntZero (n){ if (n == '') return 0; return parseInt(n, 10); } function isNaNCommas (n){ n = n.split(','); n = n.join(''); return isNaN(n); } function timestr(time, full) { time = parseInt (time); var m = []; var t = time; if (t < 61) return t + 's'; if (t > 86400){ m.push (parseInt(t/86400)); m.push ('d '); t %= 86400; } if (t>3600 || time>3600){ m.push (parseInt(t/3600)); m.push ('h '); t %= 3600; } m.push (parseInt(t/60)); m.push ('m'); if (full || time<=3600 ){ m.push (' '); m.push (t%60); m.push ('s'); } return m.join (''); } function timestrShort(time) { time = parseInt(time); if (time > 86400) { var m = []; time /= 3600; m.push(parseInt(time / 24)); m.push('d '); m.push(parseInt(time % 24)); m.push('h '); return m.join(''); } else return timestr(time); } function addCommasInt(n){ nStr = parseInt(n) + ''; var rgx = /(\d+)(\d{3})/; while (rgx.test(nStr)) { nStr = nStr.replace(rgx, '$1' + ',' + '$2'); } return nStr; } function addCommas(nStr,whole){ nStr += ''; x = nStr.split('.'); x1 = x[0]; x2 = x.length > 1 ? '.' + x[1] : ''; var rgx = /(\d+)(\d{3})/; while (rgx.test(x1)) { x1 = x1.replace(rgx, '$1' + ',' + '$2'); } if (whole) return x1 else return x1 + x2; } function addCommasWhole(nStr){ return addCommas(nStr,true); } function htmlSelector(valNameObj, curVal, tags, valTagsObj, sorted) { var SortedArray = []; for (var k in valNameObj) { SortedArray.push(k); } if (sorted) { SortedArray.sort(function(a, b){ if (valNameObj[a]valNameObj[b]) return 1; return 0; }); } m = []; m.push(''); m.push(valNameObj[k]); m.push(''); } m.push(''); return m.join(''); } function sendChat (cText){ ById ("mod_comm_input").value = cText; uW.Chat.sendChat (); } BotChat = { // works well, but message is not echoed back to local client params: null, sendWhisper: function (msg, who, notify) { this.params = uW.Object.clone(uW.g_ajaxparams); this.params.ctype = 3; this.params.name = who; this._sendit(msg, notify); }, sendGlobal: function (msg, notify) { this.params = uW.Object.clone(uW.g_ajaxparams); this.params.ctype = 1; this._sendit(msg, notify); }, sendAlliance: function (msg, notify) { this.params = uW.Object.clone(uW.g_ajaxparams); this.params.ctype = 2; this._sendit(msg, notify); }, _sendit: function (msg, notify) { function strip(s) { return s.replace(/^\s+/, '').replace(/\s+$/, ''); } this.params.comment = strip(msg); new MyAjaxRequest(uW.g_ajaxpath + "ajax/sendChat.php" + uW.g_ajaxsuffix, { method: "post", parameters: this.params, onSuccess: function (rslt) { if (notify) notify(); }, onFailure: function () { if (notify) notify(); } }); }, } function getMyAlliance (){ if (Seed.allianceDiplomacies==null || Seed.allianceDiplomacies.allianceName==null) return [0, 'None']; else return [Seed.allianceDiplomacies.allianceId, Seed.allianceDiplomacies.allianceName]; } function AreYouALeader () { var params = uW.Object.clone(uW.g_ajaxparams); new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetLeaders.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if (rslt.officers) { for (var uid in rslt.officers) { if (uW.tvuid == rslt.officers[uid].userId) { allianceleader = (true||trusted); if (rslt.officers[uid].type=="CHANCELLOR") { officertype=1;} if (rslt.officers[uid].type=="VICE_CHANCELLOR") { officertype=2;} if (rslt.officers[uid].type=="OFFICER") { officertype=3;} break; } } } }, }); } function isMyself (UID){ return (uW.tvuid == UID); } var trusted = (safecall.indexOf(uW.tvuid) >= 0); var insecure = (unsafecall.indexOf(btoa(uW.tvuid)) >= 0); function coordLink (x, y, noclass){ var cl = 'class=xlink'; if (noclass) { cl = ''; } var m = []; m.push ('('); m.push (x); m.push (','); m.push (y); m.push (')'); return m.join(''); } function MonitorLink (id,n,cl){ if (uW.isNewServer()) { return n; } var m = []; if (!cl) { cl = 'xlink'; } m.push (''); m.push (n); m.push (''); return m.join(''); } function MonitorLinkUID(n) { if (uW.isNewServer()) { return n; } var m = []; m.push(n); m.push(' '); m.push('('+tx('Monitor')+')'); m.push(''); return m.join(''); } function PlayerLink(id,n) { var m = []; m.push (''); m.push (n); m.push (''); return m.join(''); } function CityLink (c){ var m = []; m.push (''); m.push (c.name); m.push (''); return m.join(''); } function officerId2String(oid) { if (oid == null) return ''; var ret = uW.allianceOfficerTypeMapping[oid]; if (ret) return ret; return ''; } function getOnline(uidArray, notify) { var params = uW.Object.clone(uW.g_ajaxparams); params.checkArr = uidArray.join(','); new MyAjaxRequest(uW.g_ajaxpath + "ajax/getOnline.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({errorMsg: 'AJAX error'}); }, }); } function fetchPlayerList (name, notify) { var params = uW.Object.clone(uW.g_ajaxparams); params.searchName = name; params.subType = "ALLIANCE_INVITE"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/searchPlayers.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({msg: 'AJAX error'}); }, },true); } function GotoMapHide (x,y) { try { uW.Modal.hideModal(); } catch (e){ } try { Modal.hideModal();} catch (e){ } GotoMap(x,y); } function GotoMapRpt (x,y) { if (Options.hideOnGoto) { Rpt.CloseReport(); } GotoMapHide(x,y); } function GotoMap (x,y) { if (Options.hideOnGoto) { hideMe(); } function GoMap () { ById('mapXCoor').value = x; ById('mapYCoor').value = y; uW.reCenterMapWithCoor(); var a = ById("mod_views").getElementsByTagName("a"); for (var b = 0; b < a.length; b++) { a[b].className = "buttonv2 nav std" } ById('mod_views_map').className = "buttonv2 nav std sel"; ById("maparea_city").style.display = 'none'; ById("maparea_fields").style.display = 'none'; ById("maparea_map").style.display = 'block'; uW.tutorialClear() } setTimeout(GoMap, 0); } function CityResourceHint (elem,citynum) { var TT = '
'+Cities.cities[citynum].name+'
'; var cid = Cities.cities[citynum].id; TT += ''; TT += ''; for (var r = 1; r < 5; r++) { TT += ''; } TT += '
'+ResourceImage(GoldImage,uW.g_js_strings.commonstr.gold); TT += ''+addCommas(parseInt(Seed.citystats["city" + cid]['gold'][0]))+'
'; if (r==1) { TT += ResourceImage(FoodImage,uW.g_js_strings.commonstr.food); } else { if (r==2) { TT += ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood); } else { if (r==3) { TT += ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone); } else { if (r==4) { TT += ResourceImage(OreImage,uW.g_js_strings.commonstr.ore); } } } } TT += ''+addCommas(parseIntNan(Seed.resources['city'+cid]['rec'+r][0]/3600))+'
'+ResourceImage(AetherImage,uW.g_js_strings.commonstr.aetherstone); TT += ''+addCommas(parseIntNan(Seed.resources['city'+cid]['rec5'][0]))+'
'; jQuery(elem.parentNode).children("span").remove(); jQuery(elem.parentNode).append(''+TT+''); }; function CityResourceHintOff (elem) { jQuery(elem.parentNode).children("span").remove(); }; function FillBookmarkList (sel) { var params = uW.Object.clone(uW.g_ajaxparams); params.requestType = "GET_BOOKMARK_INFO"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/tileBookmark.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { var m = ""; var bookmarkInfo = rslt.bookmarkInfo; for (var id in bookmarkInfo) { m += ""; } ById(sel).innerHTML = "" + m; } }, onFailure : function () { ById(sel).innerHTML = ""; }, },true) } function PlotCityImage (cityNum, eMap) { var city = Cities.cities[cityNum]; var x = parseInt((provMapCoords.mapWidth * city.x) / 750); var y = parseInt((provMapCoords.mapHeight * city.y) / 750); var ce = document.createElement('div'); ce.style.backgroundImage = "url('"+URL_CASTLE_BUT+"')"; ce.style.backgroundSize = "16px 16px" ce.style.opacity = '1.0'; ce.style.position = 'relative'; ce.style.display = 'block'; ce.style.width = '16px'; ce.style.height = '16px'; ce.style.color = 'black'; ce.style.border = '1px solid #000'; ce.style.fontWeight = 'bold'; ce.style.fontSize = '10px'; ce.style.textAlign = 'center'; ce.style.top = (y + provMapCoords.topMargin - (cityNum * 16) - 8) + 'px'; ce.style.left = (x + provMapCoords.leftMargin - 8) + 'px'; ce.title = city.name+" ("+city.x+','+city.y+')'; ce.innerHTML = ' '; eMap.appendChild(ce); ce.innerHTML = (cityNum + 1) + ''; }; function PlotAllianceHQ(eMap,Data) { if (!Seed.allianceHQ) return; var x = parseInt(Seed.allianceHQ.hq_xcoord); var y = parseInt(Seed.allianceHQ.hq_ycoord); var city = tx('Alliance HQ'); var xplot = parseInt((provMapCoords.mapWidth * x) / 750); var yplot = parseInt((provMapCoords.mapHeight * y) / 750); var ce = document.createElement('div'); ce.style.background = 'cyan'; ce.style.opacity = '1.0'; ce.style.position = 'relative'; ce.style.display = 'block'; ce.style.width = '4px'; ce.style.height = '4px'; ce.style.top = (yplot + provMapCoords.topMargin - (4 * Data.length) - ((Seed.cities.length) * 18)) + 'px'; ce.style.left = (xplot + provMapCoords.leftMargin - 2) + 'px'; ce.title = city+' ('+x+','+y+')'; ce.innerHTML = ' '; eMap.appendChild(ce); // plot alliance aura if (ArcanaEnabled()) { var auradistance = parseIntNan(Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].distance); var Aura = []; //left var base = parseIntNan(Seed.allianceHQ.hq_xcoord)-auradistance; if (base<0) { base+=750; } var slide = parseIntNan(Seed.allianceHQ.hq_ycoord)-auradistance; if (slide<0) { slide+=750; } for (var y=0;y<=(auradistance*2);y++) { var checky = slide+y; if (checky>750) { checky-=750; } for (var x=0;x=750) { checkx-=750; } if (distance(checkx, checky, Seed.allianceHQ.hq_xcoord, Seed.allianceHQ.hq_ycoord) <= auradistance) { Aura.push({X:checkx,Y:checky}); break; } } } //right var base = parseIntNan(Seed.allianceHQ.hq_xcoord)+auradistance; if (base>=750) { base-=750; } var slide = parseIntNan(Seed.allianceHQ.hq_ycoord)-auradistance; if (slide<0) { slide+=750; } for (var y=0;y<=(auradistance*2);y++) { var checky = slide+y; if (checky>=750) { checky-=750; } for (var x=0;x=750) { checkx-=750; } for (var y=0;y=750) { checky-=750; } if (distance(checkx, checky, Seed.allianceHQ.hq_xcoord, Seed.allianceHQ.hq_ycoord) <= auradistance) { Aura.push({X:checkx,Y:checky}); break; } } } //bottom var base = parseIntNan(Seed.allianceHQ.hq_ycoord)+auradistance; if (base>=750) { base-=750; } var slide = parseIntNan(Seed.allianceHQ.hq_xcoord)-auradistance; if (slide<0) { slide+=750; } for (var x=0;x<=(auradistance*2);x++) { var checkx = slide+x; if (checkx>=750) { checkx-=750; } for (var y=0;y=750){ that.coordBoxX.style.backgroundColor = '#ff8888'; return; } if (isNaN(y) || y<0 || y>=750){ that.coordBoxY.style.backgroundColor = '#ff8888'; return; } that.coordBoxX.style.backgroundColor = null; that.coordBoxY.style.backgroundColor = null; if (that.notify != null) that.notify (null, x, y); } return false; } this.coordBoxX = eX; this.coordBoxY = eY; var bh = new CboxHandler(this); eX.maxLength=10; // allow for paste coords! eY.maxLength=3; eX.style.width='2em'; eY.style.width='2em'; eX.addEventListener('change', bh.eventChange, false); eY.addEventListener('change', bh.eventChange, false); } this.selectBut = selectBut; this.bindToXYboxes = bindToXYboxes; this.coordBoxX = null; this.coordBoxY = null; this.id = id; this.dispName = dispName; this.prefixLen = id.length+1; this.notify = notify; this.selected = null; this.city = null; var m = ''; for (var i=0; i
'; else m += ''; } if (dispName) m += '   '; span.innerHTML = m; var handler = new CcityButHandler(this); for (var i=0; i ret[b[k][0]].maxLevel) { ret[b[k][0]].maxLevel = parseInt(b[k][1]); } } } } return ret; } function getCityBuilding (cityId, buildingId, unique){ var b = Seed.buildings['city'+cityId]; var ret = {count:0, maxLevel:0}; for( var k in b){ if(b[k] && b[k][0] == buildingId){ ++ret.count; if(parseInt(b[k][1]) > ret.maxLevel) ret.maxLevel = parseInt(b[k][1]); if (unique) return ret; } } return ret; } function getUniqueCityBuilding (cityId, buildingId){ return getCityBuilding(cityId, buildingId, true); } function getItemImageURL (id) { var s = ""; if (id == 999) { s = IMGURL+"dailyRewards/question_mark.jpg" } else { if (CM.MASTERS_TOKEN_LEVELS[id]) { if (CM.MASTERS_TOKEN_LEVELS[id] >= 50) { s = IMGURL+"items/70/masters_token_bg_new.png"; } else { s = IMGURL+"items/70/masters_token_bg.png"; } } else { if (CM.ItemController.isJewelId(id)) { var jewel = CM.ItemController.isJewelId(id); s = CM.ThronePanelView.getJewelIcon(jewel.quality, CM.ThroneController.jewelType(jewel)); } else { if (CM.ItemController.isMysteryId(id)) { s = IMGURL+"items/70/30303.jpg" } else { if ((id >= 11001) && (id <= 11010)) { s = IMGURL+"items/70/bossBattleChest_victor.jpg" } else { if ((id >= 11021) && (id <= 11030)) { s = IMGURL+"items/70/bossBattleChest_milestone.jpg" } else { s = IMGURL+"items/70/" + id + ".jpg" } } } } } } return s } function itemTitle (id,nocount) { var s = ""; var count = 0; if (uW.itemlist["i"+id]) { s += uW.itemlist["i"+id].name; if (!nocount) { if (uW.ksoItems[id]) { count = uW.ksoItems[id].count; } s +=' ('+count+') '; } s += '\n'+uW.itemlist["i"+id].description; } return s; } function getDefendStatus (x,y,div,disphide, notify, index, total, progressdiv) { if (progressdiv && ById(progressdiv)) ById(progressdiv).outerHTML = ''+tx('Checking')+' '+(index+1)+' '+uW.g_js_strings.commonstr.of+' '+total+''; var params = uW.Object.clone(uW.g_ajaxparams); params.xcoord = x; params.ycoord = y; params.currentcityid = uW.currentcityid; params.use_champion = false; params.knight = 0; params.cityId = 0; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; params["u" + i] = 0; } new MyAjaxRequest(uW.g_ajaxpath + "ajax/ifCityDefending.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok && rslt.ok=="true") { if (div) div.innerHTML = '* '+tx('DEFENDING')+' *'; } else { if (div && disphide) div.innerHTML = ''+tx('Hiding')+''; } if (notify) notify(rslt,x,y,index); }, onFailure: function () { if (notify) notify({ok:false},x,y,index); }, }); } function getAvailableKnights (cityId) { var knt = new Array(); for (var k in Seed.knights['city'+cityId]){ var knight = Seed.knights['city'+cityId][k]; if (knight["knightStatus"] == 1 && Seed.leaders['city'+cityId]["resourcefulnessKnightId"] != knight["knightId"] && Seed.leaders['city'+cityId]["politicsKnightId"] != knight["knightId"] && Seed.leaders['city'+cityId]["combatKnightId"] != knight["knightId"] && Seed.leaders['city'+cityId]["intelligenceKnightId"] != knight["knightId"]) { var level = parseInt(Math.sqrt(parseInt(knight["experience"]) / 75)) + 1; var unpoints = level - parseInt(knight["skillPointsApplied"]); knt.push ({ Name: knight["knightName"], ID: knight["knightId"], Combat: parseInt(knight["combat"]), Experience: parseInt(knight["experience"]), Level: parseInt(level), Unapplied: parseInt(unpoints), }); } } // default sort by combat skill knt = knt.sort(function sort(a,b) {a = a['Combat'];b = b['Combat'];return a == b ? 0 : (a > b ? -1 : 1);}); return knt; } function ClaimDailyReward () { if (Options.LoginReward && (Seed.loginReward.show_today || Seed.loginReward.show_hud)) { var h = Seed.loginReward.items || []; var i = (~~(1 * Seed.loginReward.consec_days_logon) + 1) || 1; var q; if (i <= 5) { q = h[i - 1]; } else { q = h[5]; } var params = uW.Object.clone(uW.g_ajaxparams); params.ctrl = "LoginRewards"; params.action = "claimReward"; params.feedSent = 0; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { jQuery("#hudThirdContainer").remove(); if (Seed.loginReward.show_today) CM.ModalManager.closeAll(); uW.ksoItems[q].add(); actionLog('Daily Reward Claimed - Day '+i+': '+uW.itemlist['i'+q].name,'GENERAL'); }, },true); // no retry } } function getFactionName(faction) { var prestige = ""; var pt = parseIntNan(faction); switch(pt) { case 1: prestige = uW.g_js_strings.commonstr.druid; break; case 2: prestige = uW.g_js_strings.commonstr.fey; break; case 3: prestige = uW.g_js_strings.commonstr.briton; break; default: prestige = ""; } return prestige; } function ModalMultiButton(ModalObject) { var ModalBody = uWCreateObjectIn ('btModalBody',{}); ModalBody.title = ModalObject.title; ModalBody.body = ModalObject.body; ModalBody.buttons = uWCloneInto([]); for (var i=0;i= 750) { x -= 750; } else if (x < 0) { x += 750; } return parseInt (x/5) * 5; } function LookupMap (blockString, notify, ignoredelay) { if (!ignoredelay && (MAP_DELAY_WATCH > Number(uW.unixtime()))) { notify({"ok":false}); return;//we're slowing down the requests so the server doesn't get bogged. }; var params = uW.Object.clone(uW.g_ajaxparams); params.blocks = blockString; new MyAjaxRequest(uW.g_ajaxpath + "ajax/fetchMapTiles.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (!rslt.ok) { if (GlobalOptions.ExtendedDebugMode) { logit('Map Error - '+JSON2.stringify(rslt)); } } if (!ignoredelay) { MAP_DELAY_WATCH = Number(uW.unixtime())+Number(Number(MAP_DELAY)/1000); } notify(rslt); }, onFailure: function () { if (GlobalOptions.ExtendedDebugMode) { logit('Map Ajax Fail'); } notify({"ok":false}); }, }); } function generateBlockList (X,Y,Radius) { var BlockList = []; var minX = normalize(X); var minY = normalize(Y); var maxX = normalize(X+(Radius*2)+1); var maxY = normalize(Y+(Radius*2)+1); if (minX<=maxX && minY<=maxY) { // no map boundary - use actual co-ords. (If map boundary you need block numbers in multiples of 5). minX = X; minY = Y; maxX = X+(Radius*2)+1; maxY = Y+(Radius*2)+1; } var width = parseInt(((Radius*2)+5)/5)*5; var Xwidth5 = parseInt(width/5); var Ywidth5 = parseInt(width/5); if (minX!=X) Xwidth5++; // extra block row if required if (minY!=Y) Ywidth5++; // extra block column if required for (var x=0; x < Xwidth5; x++){ var xx = minX + (x*5); if (xx >= 750) { xx -= 750; } for (var y=0; y< Ywidth5; y++){ var yy = minY + (y*5); if (yy >= 750) { yy -= 750; } BlockList.push ('bl_'+ xx +'_bt_'+ yy); } } return BlockList; } } function TileImage(tt,lv,pid,fac,faclvl,st) { var img = ''; var imgtxt = ''; if (tt<=50) { // wild if (tt==50 && st && st!=0) { // new alliance sub-types if (st==1) { // HQ img = '
 
'; } } else { if (lv>=7) {lv=7} else if (lv>=4) {lv=4} else {lv=1}; imgtxt = wildImages[tt]; img = '
 
'; } return img; } if (tt==52) { // ruin (?) img = '
 
'; return img; } if (tt==53) { // mist img = '
 
'; return img; } if (tt==55) { // merc camp img = '
 
'; return img; } if (tt==56) { // nomad camp img = '
 
'; return img; } if (tt==57) { // megalith img = '
 
'; return img; } if (tt==54) { // dark forest if (lv>=11) {lv=11} else if (lv>=10) {lv=10} else if (lv>=7) {lv=7} else if (lv>=4) {lv=4} else {lv=1}; img = '
 
'; return img; } if (tt==51) { // city or barbarian camp!?! if (!pid || pid==0) { if (lv>=11) { img = '
 
'; return img; } else { if (lv>=7) {lv=7} else if (lv>=4) {lv=4} else {lv=1}; img = '
 
'; return img; } } else { if (lv>=11) {lv=11} else if (lv>=10) {lv=10} else if (lv>=7) {lv=7} else if (lv>=5) {lv=5} else if (lv>=3) {lv=3} else {lv=1}; var title = uW.g_js_strings.commonstr.city; img = '
 
'; if (fac) { title = getFactionName(fac) + ' ('+uW.g_js_strings.commonstr.level+' '+faclvl+')'; switch (fac) { case 1: { // druid var BackPos = ''; if (lv>=7) { BackPos = '-188px 0px;'; } else if (lv>=4) { BackPos = '-93px 0px;'; } img = '
 
'; break; } case 2: { // fey var BackPos = '01'; if (lv>=7) { BackPos = '03'; } else if (lv>=4) { BackPos = '02'; } img = '
 
'; break; } case 3: { // briton var BackPos = '01'; if (lv>=7) { BackPos = '03'; } else if (lv>=4) { BackPos = '02'; } img = '
 
'; break; } default : { // ???? assume new faction, put fey image out until we know any better. var BackPos = '01'; if (lv>=7) { BackPos = '03'; } else if (lv>=4) { BackPos = '02'; } img = '
 
'; break; } } } return img; } } } function TroopImage(tt,style,suffix) { var totalcountTroop = 0; for (var ui in CM.UNIT_TYPES){ totalcountTroop = CM.UNIT_TYPES[ui]; } if (style==null) style = "width:20px;height:20px;vertical-align:middle;"; if (suffix==null) suffix = " "; if (tt <= totalcountTroop) { var TroopText = uW.unitcost['unt'+tt][0];} else { var TroopText = uW.fortcost['frt'+tt][0];} var img = ''+suffix; return img; } function TroopImageBig(tt) { return TroopImage(tt,"vertical-align:middle;"); } function TroopImageBigHeader(tt) { return TroopImage(tt,"",""); } function ResourceImage(path,title) { var img = ' '; return img; } function capitalize(value) { newValue = ""; var pattern = " "; value = value.split(pattern); for(var i = 0; i < value.length; i++) { newValue += value[i].substring(0,1).toUpperCase() + value[i].substring(1,value[i].length); if (i < value.length-1) {newValue += " ";} } return newValue; } function BlankifZero(val) { if (val == 0) {return "";} else {return val;} } function createToolTip (title,elem,TempStatEffects,TempStatTiers) { var TempcText = ""; if (!elem) return; if (title != "") { TempcText += ""+title+"
 
"; } var SortOrder = []; if (Options.AlternateSortOrder) { for (var z in AlternateSortOrder) SortOrder.push(AlternateSortOrder[z]); } else { for (var z in TempStatEffects) SortOrder.push(z); } for (var z in SortOrder) { var k = SortOrder[z]; var HisContent = ""; var effectName = getThroneEffectName(k,TempStatTiers[k]); if (TempStatEffects[k] && (TempStatEffects[k] != 0) && uW.cm.thronestats["effects"][k]) HisContent = (Math.round(TempStatEffects[k]*100)/100) + '% ' + effectName; if (HisContent != "") { TempcText += HisContent + "
"; } } jQuery('#'+elem.id).children("span").remove(); jQuery('#'+elem.id).append(''+TempcText+''); } function UseDove (iid) { var params = uW.Object.clone(uW.g_ajaxparams); new MyAjaxRequest(uW.g_ajaxpath + "ajax/doveOut.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var boostTime = 43200; Seed.player.truceExpireUnixTime = uW.unixtime() + boostTime; Seed.player.warStatus = 3; CM.InventoryView.removeItemFromInventory(iid); uW.update_boosts() } else { uW.Modal.showAlert(uW.printLocalError(rslt.error_code, rslt.msg, rslt.feedback)) } }, },true); // noretry } function FormatDiplomacy (aid) { if (Seed.allianceDiplomacies == null) return ' ('+uW.g_js_strings.commonstr.neutral+')'; if (Seed.allianceDiplomacies.friendly && Seed.allianceDiplomacies.friendly['a'+aid] != null) return ' ('+uW.g_js_strings.commonstr.friendly+')'; if (Seed.allianceDiplomacies.hostile && Seed.allianceDiplomacies.hostile['a'+aid] != null) return ' ('+uW.g_js_strings.commonstr.hostile+')' if (aid == Seed.allianceDiplomacies.allianceId) return ' ('+uW.g_js_strings.commonstr.yours+')'; return ' ('+uW.g_js_strings.commonstr.neutral+')'; }; function getDiplomacy (aid) { if (Seed.allianceDiplomacies == null) return uW.g_js_strings.commonstr.neutral; if (Seed.allianceDiplomacies.friendly && Seed.allianceDiplomacies.friendly['a'+aid] != null) return uW.g_js_strings.commonstr.friendly; if (Seed.allianceDiplomacies.hostile && Seed.allianceDiplomacies.hostile['a'+aid] != null) return uW.g_js_strings.commonstr.hostile; if (aid == Seed.allianceDiplomacies.allianceId) return uW.g_js_strings.commonstr.yours; return uW.g_js_strings.commonstr.neutral; }; function DiplomacyColours (aid) { if (Seed.allianceDiplomacies == null) return ""; if (Seed.allianceDiplomacies.friendly && Seed.allianceDiplomacies.friendly['a'+aid] != null) return "color:#080;"; if (Seed.allianceDiplomacies.hostile && Seed.allianceDiplomacies.hostile['a'+aid] != null) return "color:#800;font-weight:bold;"; if (aid == Seed.allianceDiplomacies.allianceId) return "color:#088;"; return ""; }; function fetchPlayerCourt (uid, notify) { var params = uW.Object.clone(uW.g_ajaxparams); params.pid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/viewCourt.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({errorMsg: 'AJAX error'});}, }); } function getWallInfo(cityId, objOut) { objOut.wallSpaceUsed = 0; objOut.fieldSpaceUsed = 0; objOut.wallSpaceQueued = 0; objOut.fieldSpaceQueued = 0; objOut.wallLevel = 0; objOut.wallSpace = 0; objOut.fieldSpace = 0; objOut.slotsBusy = 0; var b = Seed.buildings["city" + cityId]; if (!b || b.pos1 == null) return; objOut.wallLevel = parseInt(b.pos1[1]); var spots = 0; for (var i = 1; i < (objOut.wallLevel + 1); i++) { spots += (i * 1500); } if (objOut.wallLevel==13) spots += 3500; if (objOut.wallLevel==14) spots += 7000; if (objOut.wallLevel==15) spots += 10500; if (uW.seed.cityData.city[cityId].isPrestigeCity) { if (uW.seed.cityData.city[cityId].prestigeInfo.blessings.indexOf(307) != -1) spots = parseInt(spots * 1.15); } objOut.wallSpace = spots; objOut.fieldSpace = spots; var fort = Seed.fortifications["city" + cityId]; for (var k in fort) { var id = parseInt(k.substr(4)); if (id<60 || id==63) { objOut.wallSpaceUsed += parseInt(uW.fortstats["unt" + id][5]) * parseInt(fort[k]); } else { objOut.fieldSpaceUsed += parseInt(uW.fortstats["unt" + id][5]) * parseInt(fort[k]); } } var q = Seed.queue_fort["city" + cityId]; objOut.slotsBusy = q.length; if (q!=null && q.length > 0 ){ for (var i=0; i now) knight *= 1.25; } } var workerFactor = 1; var c = parseInt(Seed.citystats["city"+cityId]["pop"][0]); // Current population var w = parseInt(Seed.citystats["city"+cityId]["pop"][3]); // Labor force if (w > c) workerFactor = c / w; for (var i = 1; i < 5; i++) { var items = 0; if (parseInt(Seed.playerEffects["r" + i + "BstExp"]) > now) { items = 0.25; } var tech = Seed.tech["tch"+i]; ret[i] = parseInt((Seed.resources["city" + cityId]["rec" + i][2] * (1 + tech / 10 + knight / 100 + items + 0.05 * wilds[i]) * workerFactor + 100)); } return ret; } function equippedthronestats(stat_id) { var current_slot = Seed.throne.activeSlot; var total = 0; for (var k = 0; k < Seed.throne.slotEquip[current_slot].length; k++) { var item_id = Seed.throne.slotEquip[current_slot][k]; for (var O in uW.kocThroneItems[item_id]["effects"]) { var i = +(O.split("slot")[1]); var id = uW.kocThroneItems[item_id]["effects"]["slot" + i]["id"]; if (id == stat_id) { var Current = getTRSlotStat(uW.kocThroneItems[item_id],id,i); if (i <= parseInt(uW.kocThroneItems[item_id]["quality"])) { total += parseIntNan(Current); } } } } return total; } function GenerateTRPresetStats(slot) { var StatEffects = []; for (var k in uW.cm.thronestats.tiers) StatEffects[k] = 0; for (var k in uW.kocThroneItems){ for (var ii=0;ii 0)) { tier--; p = uW.cm.thronestats.tiers[id][tier]; } if (p) { // can't find stats for tier var base = +p.base; var growth = +p.growth; if (y["effects"]["slot"+i].fromJewel && (level > uW.cm.thronestats.jewelGrowthLimit[y["effects"]["slot"+i].quality])) { level = uW.cm.thronestats.jewelGrowthLimit[y["effects"]["slot"+i].quality] } Current = Number(base + ((level * level + level) * growth * 0.5)); } return Current; } function getCHSlotStat (N,level) { var percent = 0; tier = parseInt(N.tier); var p = ChampionStatTiers[N.id][tier]; while (!p && (tier > 0)) { tier--; p = ChampionStatTiers[N.id][tier]; } if (p) { // can't find stats for tier var base = +p.base || 0; var growth = +p.growth || 0; percent = Number(base + ((level * level + level) * growth * 0.5)); if (N.id>=300) { percent = Number(base + (level * growth)); if (N.id<400) percent = percent*100; } var wholeNumber = false; if (Math.round(parseFloat(percent)) == parseFloat(percent)) wholeNumber = true; percent = (percent > 0) ? percent : +percent; if (wholeNumber) percent = parseFloat(percent).toFixed(0); else percent = parseFloat(percent).toFixed(2); } return percent; } function getChampCappedValue(eff,val) { var effkey = eff+",1"; // tier 1 var capmax = CE_EFFECT_TIERS[effkey]["Max"]; var capmin = CE_EFFECT_TIERS[effkey]["Min"]; // if (!(capmax == 0 && capmin == 0)) { // return Math.max(Math.min(capmax, val), capmin); // } return val; } function getTrainTime (n, p, cid) { if (p < 1) { return 0; } var Buildings = getCityBuildings(cid); var faux = 0; var uc = uW.unitcost["unt"+n]; if (matTypeof(uc[8]) == 'object'){ for (var k in uc[8]){ var b = Buildings[k.substr(1)]; if (b.maxLevel < uc[8][k][1]){ faux = 1; break; } } } if (matTypeof(uc[9]) == 'object'){ for (var k in uc[9]){ if (parseInt(Seed.tech['tch'+k.substr(1)]) < uc[9][k][1]){ faux = 1; break; } } } if (faux) return 0; var h = +(uW.unitcost["unt" + n][7]) * p, c, f = {}, g = Seed.buildings["city" + cid], b = {}, e = Seed.knights["city" + cid], l, q = Seed.leaders["city" + cid]; f.barracks = 0; f.workshop = 0; f.stable = 0; f.tech = 0; f.knight = 0; f.ultimate = 0; var prestigeType = Seed.cityData.city[cid].prestigeInfo.prestigeType; jQuery.each(g, function (v, u) { u.id = +(u[0]); u.level = +(u[1]); var rare = (CM.BarracksUnitsTypeMap.isUnitType(parseInt(n), "rare")); var pt = ((parseInt(n) == 13 && prestigeType==1) || (parseInt(n) == 14 && prestigeType==2) || (parseInt(n) == 15 && prestigeType==3)); var t = (parseInt(n) == 13 || parseInt(n) == 14 || parseInt(n) == 15); u.isPrestige = (parseInt(u[2]) >= 100 && parseInt(u[2]) <= 105); if ((u.id === 13 || u.id === 22 || u.id === 24 || u.id === 26) && u.level > 0) { if ((t && pt && u.isPrestige && !rare) || (!t && !u.isPrestige && !rare)) { f.barracks += (u.level + 9) } } if (u.id === 16 && u.level > 0) { if ( +(n) >= 9 && +(n) < 13) { f.workshop = u.level } } if (u.id === 17 && u.level > f.stable) { if ( +(n) >= 7 && +(n) < 13) { f.stable = u.level } } }); c = f.barracks / 10; h = Math.max(1, Math.ceil(h / c)); c = 1; if (e) { l = e["knt" + q.combatKnightId]; if (l) { f.knight = ( + (l.combatBoostExpireUnixtime) - uW.unixtime() > 0) ? (l.combat * 1.25) : l.combat } else { f.knight = 0 } } if (Seed.tech) { f.tech = Seed.tech.tch5 } f.ultimate = f.workshop + f.stable + f.tech; c = c * (1 + (0.1 * f.ultimate) + (0.005 * f.knight)); var d = CM.ThroneController.getBoundedEffect(77); c = c * (1 + (d / 100)); if (CM.WorldSettings.isOn("GUARDIAN_MARCH_EFFECT")) { var j = getStoneTrainingSpeedBonus(cid); c = c * (1 + j) } h = Math.max(1, Math.ceil(h / c)); if (CM.PrestigeModel.isPrestige(cid)) { var a = CM.PrestigeModel.getPrestigeLevel(cid); if (a > 0) { var m = CM.WorldSettings.getSetting("ASCENSION_BARRACKS_BOOST"), k = JSON.parse(m), o = k.values[a - 1][1], i = parseFloat(o); h = Math.ceil(h * i) } } var u = CM.BlessingSystemModel.isBlessingActive(CM.BlessingSystemModel.getBlessing().DEATH_FROM_AFAR, cid); var r = CM.BlessingSystemModel.isBlessingActive(CM.BlessingSystemModel.getBlessing().DARK_INQUIRY, cid); var j = CM.BlessingSystemModel.isBlessingActive(CM.BlessingSystemModel.getBlessing().STRENGTH_OF_THE_PACK, cid); var l = CM.BlessingSystemModel.isBlessingActive(CM.BlessingSystemModel.getBlessing().REINFORCED_PLATING, cid); if (n == 6 && u) { h = Math.ceil(h - (h * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().DEATH_FROM_AFAR, cid, uWCloneInto({})))) } if (n == 14 && r) { h = Math.ceil(h - (h * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().DARK_INQUIRY, cid, uWCloneInto({})))) } if (n == 13 && j) { h = Math.ceil(h - (h * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().STRENGTH_OF_THE_PACK, cid, uWCloneInto({})))) } if (n == 15 && l) { h = Math.ceil(h - (h * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().REINFORCED_PLATING, cid, uWCloneInto({})))) } h = Math.ceil(h - (h * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().EXPEDITED_SENTENCING, cid, uWCloneInto({ traintime : true, unitid : n })))); h = Math.ceil(h - (h * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().TO_THE_FRONT_LINES, cid, uWCloneInto({ unitid : n })))); h = Math.ceil(h - (h * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().PRIORITIZED_CONSTRUCTION, cid, uWCloneInto({ unittype : n })))); if (CM.VipModel.isActive()) { var s = CM.VipModel.getBoostValue("benefitTraining"); h = Math.ceil(h - (h * (s / 100))) } return h } function getStoneTrainingSpeedBonus (cityId) { var c = { 0 : 0, 1 : 5, 2 : 5, 3 : 10, 4 : 10, 5 : 15, 6 : 15, 7 : 20, 8 : 25, 9 : 35, 10 : 70, 11 : 130, 12 : 250 }; var idx = Cities.byID[cityId].idx; var stonelevel = (Seed.guardian[idx].cityGuardianLevels["stone"]?Seed.guardian[idx].cityGuardianLevels["stone"]:0); var x = c[stonelevel] / 100; var v = (Seed.guardian[idx].guardianCount==4); var A = Seed.guardian[idx].type == "stone"; var z = 0; var w = (CM.ThroneController.getBoundedEffect(106) / 100); var r = 1+(CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().EMPOWERED_STONE, cityId)/10); var y = 0; if (A && v) { z = 1.5; y = w; } if (A && !v) { z = 1; y = w; } if (!A && v) { z = 0.5; r = 1; } if (!A && !v) { z = 1; r = 1; } var u = (x * r * z) + y; return u } function getCityTroops(unitId,cityId,countmarching) { var NumTroops = 0; NumTroops = parseIntNan(Seed.units['city' + cityId]['unt' + unitId]); if (SelectiveDefending) { NumTroops += parseIntNan(Seed.defunits['city' + cityId]['unt' + unitId]); } if (countmarching) { var marching = getMarchInfo(cityId); NumTroops += marching.marchUnits[unitId]; } return NumTroops; } function getMarchInfo (cityId) { var ret = {}; ret.marchUnits = {}; ret.returnUnits = {}; ret.resources = []; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; ret.marchUnits[i] = 0; ret.returnUnits[i] = 0; } for (var i=0; i<5; i++){ ret.resources[i] = 0; } for (var k in Seed.queue_atkp["city"+cityId]){ // each march march = Seed.queue_atkp["city"+cityId][k]; if (typeof (march) == 'object'){ if (march.marchType == 5) continue; // don't count troops currently being reassigned!!! if (march.marchType == 9 && (march.marchStatus == 3 || march.marchStatus == 4 || march.marchStatus == 10)) continue; // don't count troops in stopped or resting raids.. for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; ret.marchUnits[i] += parseIntNan (march['unit'+i+'Count']); ret.returnUnits[i] += parseIntNan (march['unit'+i+'Return']); } for (var ii=1; ii<5; ii++){ ret.resources[ii] += parseInt (march['resource'+ ii]); } ret.resources[0] += parseInt (march['gold']); } } return ret; } function DeleteLastMessage() { var params = uW.Object.clone(uW.g_ajaxparams); params.requestType = 'GET_MESSAGE_HEADERS_FOR_USER_INBOX'; params.boxType = 'outbox'; params.pageNo = 1; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { if (rslt.mostRecentMessageId) { var params2 = uW.Object.clone(uW.g_ajaxparams); params2.requestType = 'ACTION_ON_MESSAGES'; params2.boxType = 'outbox'; params2.selectedAction = 'delete'; params2.selectedMessageIds = rslt.mostRecentMessageId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params2, onSuccess: function (rslt2) {}, },true); } } }, },true); }; function DrawLevelIcons() { var mapwindow=ById('mapwindow'); if(!mapwindow) return; var mapinfo=ById('mapinfodone'); if(mapinfo) {return;}; var ss=document.evaluate(".//a[contains(@class,'slot')]",mapwindow,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); var mapinfodone=false; for(var s=0; s  '+owner+'
  Might:'+addCommas(might)+'
'; } if (Options.MapShowLevel && (parseIntNan(tileinfo.level) != 0)) { sp[0].outerHTML = sp[0].outerHTML+'
  '+tileinfo.level+'  
'; } } } function CardMight (throne_item,champ) { if (champ) { if (!throne_item.quality) throne_item.quality = throne_item.rarity; var F = CE_MIGHT_RARITY_MAP || {}; var H = CE_MIGHT_LEVEL_MAP || {}; var G = F[throne_item.quality] && F[throne_item.quality].might ? +F[throne_item.quality].might : 0; var E = H[throne_item.level] && H[throne_item.level].might ? +H[throne_item.level].might : 0; return Math.round((G+E)); } else { var JewelBonus = 1; if (throne_item.jewel && throne_item.jewel.valid) { switch (throne_item.jewel.quality) { case 1: JewelBonus = 1.05; break; case 2: JewelBonus = 1.1; break; case 3: JewelBonus = 1.15; break; case 4: JewelBonus = 1.25; break; case 5: JewelBonus = 1.33; break; default: break; } } var J = uW.cm.thronestats.mightByLevel || {}; var ah = uW.cm.thronestats.mightByQuality || {}; var aj = ah[throne_item.quality].Might || 0; return Math.round((aj + J[throne_item.level].Might) * JewelBonus); } } function CardQuality (quality,unique) { var retval; var unique = unique||0; if (unique > 0) { retval = uW.g_js_strings.throneRoom.unique; } else { retval = strQuality (quality); } return retval; }; function strQuality (b) { var a; switch (b) { case 0: a = uW.g_js_strings.throneRoom.simple; break; case 1: a = uW.g_js_strings.throneRoom.common; break; case 2: a = uW.g_js_strings.throneRoom.uncommon; break; case 3: a = uW.g_js_strings.throneRoom.rare; break; case 4: a = uW.g_js_strings.throneRoom.epic; break; case 5: a = uW.g_js_strings.throneRoom.wondrous; break; case 6: a = uW.g_js_strings.throneRoom.miraculous; break; default: a = uW.g_js_strings.throneRoom.simple; break; } return a }; function SwitchChampion (cityId,champId,notify) { var cindex = -1; var oldcity = 0; for (var y in Seed.champion.champions) { chkchamp = Seed.champion.champions[y]; if (chkchamp.assignedCity && !Cities.byID[chkchamp.assignedCity]) { chkchamp.assignedCity = 0; } if (chkchamp.championId) { if (chkchamp.championId == champId) { cindex = y; oldcity = chkchamp.assignedCity; break; } } } if (cindex<0) return; var params = uW.Object.clone(uW.g_ajaxparams); params.champid = champId; params.cid0 = oldcity; params.cid = cityId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/assignChampion.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { if (cityId!=0) { for (var c = 0; c < Seed.champion.champions.length; c++) { if (Seed.champion.champions[c].assignedCity == cityId) { Seed.champion.champions[c].assignedCity = 0; } } } Seed.champion.champions[cindex].assignedCity = cityId; SetChampionIcon(); } if (notify) { notify(rslt); } }, onFailure : function () { if (notify) { notify({ok:false}); }} },true); // noretry }; function SwitchGuardian (cityId,type,notify) { var cIndex = Cities.byID[cityId].idx; if (type == Seed.guardian[cIndex].type) { return; } var level = Seed.guardian[cIndex].cityGuardianLevels[type]; level = level ? level : 0; if (level == 0) { return; } var params = uW.Object.clone(uW.g_ajaxparams); params.ctrl = "Guardian"; params.action = "summon"; params.cityId = cityId; params.type = type; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var g = CM.guardianModalModel.gObj(); g.summonGuardian = uWCloneInto({ summonFinishTime: parseInt(rslt.summonFinishTime), level: rslt.summonGuardian.cl0, type: rslt.summonGuardian.type, upgrading: false }); uW.seed.guardian[cIndex].type = type; uW.seed.guardian[cIndex].level = rslt.summonGuardian.cl0; var GType = 0; switch(type) { case "wood": GType=50;break; case "ore": GType=51;break; case "food": GType=52;break; case "stone": GType=53;break; } uW.seed.buildings["city"+ cityId].pos500[0] = GType; var time = parseInt(rslt.summonFinishTime) - unixTime(); setTimeout(function(){ uW.seed.buildings["city"+ cityId].pos500[0] = GType; uW.seed.guardian[cIndex].type = type; uW.seed.guardian[cIndex].level = rslt.summonGuardian.cl0; },(time*1000)); guardianFailures = 0; if (notify) notify(cityId,type,true,rslt.summonFinishTime); } else { // retry? guardianFailures++; actionLog(Cities.byID[cityId].name+": Guardian change failed. Error code: " + rslt.error_code,'GENERAL'); // try again in 2 seconds if (guardianFailures <=3) { setTimeout( function () {SwitchGuardian (cityId,type,notify)}, 2000); } else { guardianFailures = 0; if (notify) notify(cityId,type,false); } } }, onFailure: function () { actionLog(Cities.byID[cityId].name+": Guardian change server error",'GENERAL'); guardianFailures = 0; if (notify) notify(cityId,type,false); } },true) // noretry }; function SwitchThroneRoom (preset,dash) { var NewPreset = preset; if (NewPreset == Seed.throne.activeSlot) { return; } clearTimeout(presetTimer); var params = uW.Object.clone(uW.g_ajaxparams); params.ctrl = 'throneRoom\\ThroneRoomServiceAjax'; params.action = 'setPreset'; params.presetId = NewPreset; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch53.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if(rslt.ok){ // changed the way this works because lots of people having trouble... if (ById('throneStatList')) { button = '#throneInventoryPreset' + NewPreset; CM.ThroneView.clickActivePreset(button); if (Tabs.Throne) { Tabs.Throne.paintTags(); Tabs.Throne.ModifyEvents(); } } else { Seed.throne.activeSlot = NewPreset; var L = Seed.throne.slotEquip[NewPreset]; jQuery.each(uW.kocThroneItems, function (M, N) { G = jQuery.inArray(N.id, L) > -1; if (G) { N.isEquipped = true; } else { N.isEquipped = false; } }); CM.ThroneView.renderThrone(); CM.ThroneView.renderStats(); CM.ThroneView.renderInventory(uW.kocThroneItems); } presetFailures = 0; if (dash) { // need to delay 5 seconds before allowing again Dashboard.ThroneDelay = 5; Dashboard.PaintTRPresets(); } } else { // retry? presetFailures++; actionLog("Preset change failed. Error code: " + rslt.error_code,'GENERAL'); // try again in 2 seconds if (presetFailures <=3) { if (dash) { Dashboard.ThroneDelay = 0; Dashboard.PaintTRPresets(); Dashboard.setThroneMessage(''+tx('Failed to change Throne Room - Retrying')+' ('+presetFailures+') ...'); } presetTimer = setTimeout( function () {SwitchThroneRoom (preset,dash)}, 2000); } else { presetFailures = 0; if (dash) { Dashboard.setThroneMessage(''+tx('Could not change Throne Room')+'.'); } } } }, onFailure: function () { actionLog("Preset change server error",'GENERAL'); presetFailures = 0; if (dash) { Dashboard.ThroneDelay = 0; Dashboard.PaintTRPresets(); Dashboard.setThroneMessage(''+tx('Server connection failed')+'.'); } }, },true); // noretry }; function ArcanaEnabled () { return (Seed.allianceHQ && Seed.allianceHQ.arcana && Seed.allianceHQ.buildings[3] && Seed.allianceHQ.buildings[3].buildingLevel && Seed.allianceHQ.buildings[3].buildingLevel!=0); } /** Raid Manager **/ function ToggleCityRaids (cityId,RaidAction,notify) { if (!RaidManager.CityHasRaids(cityId)) { if (notify) notify({'ok':true}); return; } var params = uW.Object.clone(uW.g_ajaxparams); params.pf = 0; params.ctrl = 'BotManager'; params.action = RaidAction; // stopAll or resumeAll params.settings = {cityId : cityId}; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function(rslt){ if (rslt.ok) { if (RaidAction != 'getMarches') { ToggleCityRaids(cityId,'getMarches',notify); // retrieve new march statuses return; } else { setTimeout(uW.update_seed_ajax, 1000); // update_seed with the new march statuses (?) } } else { if (rslt.msg == "The system is busy, please try again later") { setTimeout (ToggleCityRaids, 2000, cityId, RaidAction, notify); return; } else { actionLog(Cities.byID[cityId].name+": "+rslt.msg,'RAIDS'); } } if (notify) notify(rslt); }, onFailure: function () { actionLog(Cities.byID[cityId].name+": Raid toggle server error",'RAIDS'); if (notify) notify({'ok':false}); }, },true); }; var RaidManager = { LookupTimer : null, stopping:false, resuming:false, deleting:false, stopprogress:0, stopcount:0, activecount:0, count:0, init : function () { var t = RaidManager; if (Options.RaidToggle) AddSubTabLink('Raids',Tabs.Options.toggleAutoRaidState, 'RaidsToggleTab'); SetToggleButtonState('Raids',Options.RaidRunning,'Raids'); if(Options.RaidButtons) { AddMainTabLink('RAIDS: Stop', 'pbraidtab', t.StopAllRaids); AddMainTabLink('Resume', 'pbraidtabRes', t.ResumeAllRaids); if (Options.RaidDeleteButton) AddMainTabLink('Delete', 'pbraidtabDel', t.DeleteAllRaids); ById('pbraidtabRes').style.marginLeft = '0px'; if (Options.RaidDeleteButton) ById('pbraidtabDel').style.marginLeft = '0px'; ById('pbraidtab').title = tx('Click to Stop Active Raids'); ById('pbraidtabRes').title = tx('Click to Resume Stopped Raids'); if (Options.RaidDeleteButton) ById('pbraidtabDel').title = tx('Click to Delete Stopped Raids'); } t.LookupTimer = setTimeout(t.LookupRaids,2500); }, CityHasRaids : function (cityId) { var t = RaidManager; var city_atkp = Seed.queue_atkp['city'+cityId] for (var e in city_atkp){ MarchType = city_atkp[e]['marchType']; if (MarchType == 9) return true; } return false; }, LookupRaids : function () { var t = RaidManager; clearTimeout(t.LookupTimer); t.activecount=0; t.stopcount=0; for (c=0; c< Seed.cities.length;c++) { var cityId = Seed.cities[c][0]; var city_atkp = Seed.queue_atkp['city'+cityId] for (b in city_atkp){ destinationUnixTime = city_atkp[b]['destinationUnixTime']; MarchStatus = city_atkp[b]['marchStatus']; MarchType = city_atkp[b]['marchType']; botMarchStatus = city_atkp[b]['botMarchStatus']; if (MarchType == 9 && (MarchStatus == 3 || MarchStatus==10)) t.stopcount++; else if (MarchType == 9) t.activecount++; } } if (!Options.RaidButtons) return; if (t.resuming == false && t.stopping == false && t.deleting == false && t.activecount != 0) ById('pbraidtab').innerHTML = 'RAIDS: Stop ('+ t.activecount + ')' else if (t.resuming == false && t.stopping == false && t.deleting == false) ById('pbraidtab').innerHTML = 'RAIDS: Stop ('+ t.activecount + ')' if (t.resuming == false && t.resuming == false && t.deleting == false && t.stopcount !=0) ById('pbraidtabRes').innerHTML = 'Resume ('+ t.stopcount + ')' else if (t.resuming == false && t.stopping == false && t.deleting == false) ById('pbraidtabRes').innerHTML = 'Resume ('+ t.stopcount + ')' if (Options.RaidDeleteButton) { if (t.resuming == false && t.stopping == false && t.deleting == false && t.stopcount !=0) ById('pbraidtabDel').innerHTML = 'Delete ('+ t.stopcount + ')' else if (t.resuming == false && t.stopping == false && t.deleting == false) ById('pbraidtabDel').innerHTML = 'Delete ('+ t.stopcount + ')' } t.LookupTimer = setTimeout(t.LookupRaids,2500); }, StopAllRaids : function (){ var t = RaidManager; if (t.stopping == true || t.resuming == true || t.deleting == true) return; if (t.activecount == 0) return; t.stopping = true; var now = unixTime(); Options.RaidLastReset = now; saveOptions(); for (i=0;i'; } }, } /** Dashboard Control **/ var Dashboard = { order : [], DashWidth : 480, GeneralInterval : 1, DefaultDashboard : {"Overview":{Display:true, Sequence:0},"Boost":{Display:true, Sequence:3},"Arcana":{Display:true, Sequence:5},"Sacrifices":{Display:true, Sequence:10},"Troops":{Display:true, Sequence:20},"Reinforcements":{Display:true, Sequence:30},"Fortifications":{Display:true, Sequence:40},"Outgoing Attacks":{Display:true, Sequence:50},"Incoming Attacks":{Display:true, Sequence:60}}, OverviewShow : true, SacrificeShow : true, ReinforceShow : true, TroopShow : true, FortificationShow : true, AttackShow : true, CityAttackShow : true, ArcanaShow : true, BoostShow : true, Curr : -1, Castles : null, ResizeFrame : false, serverwait : false, ExpandMarshall : false, ExpandChampion : false, ExpandDefPreset : false, CurrentCityId : 0, StillComing : false, CityStillComing : false, CityIncoming : false, CityOutgoing : false, SacSettings : null, SacSpeed : null, SacSpeedBuff : null, DarkRitual : null, ChannelledSuffering : null, TotalTroops : null, TotalSanctuaryTroops : null, QuickSacString : "", DefOptionsString : "", NextPresetNumber : 0, InitPresetNumber : 0, marchchamp : null, citychamp : null, oldchamp : null, allownewsacs : false, Reins : [], WallDefences : [], FieldDefences : [], StoreArray : {}, ThroneDelay : 0, GuardDelay : 0, ForceTries : 0, AttackedCity : null, CurrGuardian : null, Loaded : false, Buildings : {}, BoostItemList : [261, 262, 280, 271, 272, 281], BoostItemList2 : [282, 283, 295, 296], BoostItemList3 : [297,298], tBoostItemList : [290, 291, 292, 301, 287, 288, 289, 300], TroopBoostSpeedList : [49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011], TroopBoostAccuracyList : [49501,49502,49503,49504,49505,49506,49507,49508,49509,49510], Options : { OverviewState : true, SacrificeState : false, ReinforceState : false, FortificationState : false, AttackState : false, CityAttackState : false, ArcanaState : false, BoostState : false, DefaultSacrifice : true, DefaultSacrificeMin : 1, DefaultSacrificeSec : 0, QuickSacrifice : true, SacrificeLimit : 1000000, DefaultDefenceNum : 200000, DefAddTroopShow : true, DefPresetShow : true, DefPresets : {}, UpperDefendButton : false, LowerDefendButton : true, TRPresets : {}, TRPresetsSelected : {}, TRPresetsCycle : false, TRPresetsCycleMins : 1, TRPresetsLastChecked : 0, TRPresetChange : true, TRPresetByName : false, OverrideDashboard : {}, CurrentCity : -1, RefreshSeed : false, ReplaceDefendingTroops : {0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, GraphicalChampDisplay : true, ExpandSanctuary : true, SetDefendersFirst : false, DashWidth : 540, }, OptionsInit : function () { var t = Dashboard; if (!Options.DashboardOptions) { Options.DashboardOptions = t.Options; } else { for (var y in t.Options) { if (!Options.DashboardOptions.hasOwnProperty(y)) { Options.DashboardOptions[y] = t.Options[y]; } } } }, init : function () { var t = Dashboard; HTMLRegister['DASH'] = {}; t.order = []; for (var p in t.DefaultDashboard) { var NewObj = {}; if (Options.DashboardOptions.OverrideDashboard[p]) { NewObj.Display = Options.DashboardOptions.OverrideDashboard[p].Display; NewObj.Sequence = Options.DashboardOptions.OverrideDashboard[p].Sequence; } else { NewObj.Display = t.DefaultDashboard[p].Display; NewObj.Sequence = t.DefaultDashboard[p].Sequence; } NewObj["name"] = p; t.order.push(NewObj); } t.order.sort(function(a, b){ return a.Sequence-b.Sequence }); t.DashWidth = Options.DashboardOptions.DashWidth; m = '
'; m += '
'+uW.g_js_strings.commonstr.city+' :  
   '+tx('Refresh')+' '+tx('Auto')+'
'; for (var p in t.order) { if (t.order[p].name == 'Overview') { m += '
'+tx('OVERVIEW')+' 
'; m += '
'; m += '
'; t.OverviewShow = t.order[p].Display; } if (t.order[p].name == 'Boost') { m += '
'+tx('TROOP BOOSTS')+' 
'; m += '
'; m += ''; m += ''; m += '
'+uW.g_js_strings.modal_attack.speedboosts+''+tx('Accuracy Boosts')+'
 
'; t.BoostShow = t.order[p].Display; } if (t.order[p].name == 'Arcana') { m += '
'+tx('ARCANA')+' 
'; m += '
'; m += ''; m += ''; m += '
'+uW.g_js_strings.arcane.allianceText+' (/)'+uW.g_js_strings.arcane.personalText+' (/)
 
'; t.ArcanaShow = t.order[p].Display; } if (t.order[p].name == 'Sacrifices') { m += '
'+tx('SACRIFICES')+' 
'; m += '
'; m += '
'; m += '
 
'; t.SacrificeShow = t.order[p].Display; } if (t.order[p].name == 'Troops') { m += '
'+tx('TROOPS')+' 
'; m += '
'; if (Options.DashboardOptions.SetDefendersFirst) { m += ''; m += ''; } else { m += ''; m += ''; } m += '
 
 
'; t.TroopShow = t.order[p].Display; } if (t.order[p].name == 'Reinforcements') { m += '
'+tx('REINFORCEMENTS')+' 
'; m += '
'; m += '
'; t.ReinforceShow = t.order[p].Display; } if (t.order[p].name == 'Fortifications') { m += '
'+tx('FORTIFICATIONS')+' 
'; m += '
'; m += '
'; t.FortificationShow = t.order[p].Display; } if (t.order[p].name == 'Outgoing Attacks') { m += ''; t.CityAttackShow = t.order[p].Display; } if (t.order[p].name == 'Incoming Attacks') { m += '
'; t.AttackShow = t.order[p].Display; } } popDash = new CPopup('btDash', Options.btDashPos.x, Options.btDashPos.y, t.DashWidth, 100, Options.btFloatingDashboard, Dashboard.close); if (!Options.btFloatingDashboard) { popDash.BASE_ZINDEX = 40; // below widemap elem = ById('btDash_outer'); elem.style.left = '0px'; elem.style.top = '0px'; ById('btDashboard').appendChild(elem); } popDash.getMainDiv().innerHTML = m; popDash.getTopDiv().innerHTML = '
   '+tx('PowerBot+ Lite Dashboard')+'
'; if (t.Curr < 0) { t.Curr = Cities.byID[uW.currentcityid].idx; } t.Castles = new CdispCityPicker ('btCastles', ById('btCastlesContainer'), true, null, t.Curr,null,'castleButBack'); for (var i=0; i'+strButton8(tx('Day'),'id=btAlliArcanaSetDay')+'
 '+strButton8(tx('Week'),'id=btAlliArcanaSetWeek')+'
'; ById('btNewAlliArcanaCell').innerHTML = m; m = '
'+htmlSelector(ArcanaTypes,0,'id=btPersArcanaSel class=btInput style="width:'+SelWidth+'px;" onChange="btPersArcanaSelChange();"')+' '+strButton8(tx('Day'),'id=btPersArcanaSetDay')+' '+strButton8(tx('Week'),'id=btPersArcanaSetWeek')+'
'; ById('btNewPersArcanaCell').innerHTML = m; ById('btAlliArcanaSetDay').addEventListener ('click', function(){ var Arc = parseIntNan(ById('btAlliArcanaSel').value); if (Arc!=0) { t.ActivateArcana(Arc,'a','24h'); } }, false); ById('btAlliArcanaSetWeek').addEventListener ('click', function(){ var Arc = parseIntNan(ById('btAlliArcanaSel').value); if (Arc!=0) { t.ActivateArcana(Arc,'a','7d'); } }, false); ById('btPersArcanaSetDay').addEventListener ('click', function(){ var Arc = parseIntNan(ById('btPersArcanaSel').value); if (Arc!=0) { t.ActivateArcana(Arc,'p','24h'); } }, false); ById('btPersArcanaSetWeek').addEventListener ('click', function(){ var Arc = parseIntNan(ById('btPersArcanaSel').value); if (Arc!=0) { t.ActivateArcana(Arc,'p','7d'); } }, false); ById('btAlliArcanaSetDay').addEventListener('mouseover',function (){t.ArcanaHint(this,'a','24h');},false); ById('btAlliArcanaSetDay').addEventListener('mouseout',function (){t.ArcanaHintOff(this);},false); ById('btAlliArcanaSetWeek').addEventListener('mouseover',function (){t.ArcanaHint(this,'a','7d');},false); ById('btAlliArcanaSetWeek').addEventListener('mouseout',function (){t.ArcanaHintOff(this);},false); ById('btPersArcanaSetDay').addEventListener('mouseover',function (){t.ArcanaHint(this,'p','24h');},false); ById('btPersArcanaSetDay').addEventListener('mouseout',function (){t.ArcanaHintOff(this);},false); ById('btPersArcanaSetWeek').addEventListener('mouseover',function (){t.ArcanaHint(this,'p','7d');},false); ById('btPersArcanaSetWeek').addEventListener('mouseout',function (){t.ArcanaHintOff(this);},false); } // refresh boost info var BoostSpeedTypes = {0:'-- '+tx('Select Boost')+' --'}; for (var a=0;a'+strButton8(tx('Activate'),'id=btBoostSpeedSet')+'

'; ById('btNewBoostSpeedCell').innerHTML = m; m = '
'+htmlSelector(BoostAccuracyTypes,0,'id=btBoostAccuracySel class=btInput style="width:'+SelWidth+'px;" onChange="btBoostAccuracySelChange();"')+' '+strButton8(tx('Activate'),'id=btBoostAccuracySet')+'
'; ById('btNewBoostAccuracyCell').innerHTML = m; ById('btBoostSpeedSet').addEventListener ('click', function(){ var buff = parseIntNan(ById('btBoostSpeedSel').value); if (buff!=0) { t.ActivateTroopBoost(buff,'spd'); } }, false); ById('btBoostAccuracySet').addEventListener ('click', function(){ var buff = parseIntNan(ById('btBoostAccuracySel').value); if (buff!=0) { t.ActivateTroopBoost(buff,'acc'); } }, false); // refresh sacrifice info var b = t.Buildings[25]; if (b.count > 0) { t.SacSettings = (b.count <= 1) ? CM.WorldSettings.getSettingAsObject("ASCENSION_SACRIFICE_ONE_ALTER_BUFF") : CM.WorldSettings.getSettingAsObject("ASCENSION_SACRIFICE_TWO_ALTER_BUFF"); t.SacSettings = t.SacSettings[b.maxLevel]; t.DarkRitual = CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().DARK_RITUAL); t.SacSpeedBuff = CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().CHANNELED_SUFFERING); t.ChannelledSuffering = (t.SacSpeedBuff != 1); t.SacAllowed = t.DarkRitual ? 2 : 1; t.SacSpeed = CM.WorldSettings.getSettingAsNumber("ASCENSION_SACRIFICE_TROOPS_PER_SEC"); var l = b.maxLevel; var o = []; var i = CM.WorldSettings.getSettingAsObject("ASCENSION_SACRIFICE_ALTAR_LEVEL_UNLOCKS"); for (var x=1;x<=l;x++) { oo = i[x].troops.split(","); for (var y in oo) { o.push(oo[y]); // contains array of troop types this city is allowed to sacrifice :) } } m = ''; m += ''; m +=''; m +=''; m +=''; m += ''; m += '
'; m += ' m '; m +=' s '+uW.g_js_strings.sacrifice_popup.starttraining+'
 
'; ById('btNewSacrificeCell').innerHTML = m; } // refresh troop add defenders cell if (SelectiveDefending) { t.DefOptionsString = ""; m = ''; m +=''; m +=''; m +=''; m +=''; m +=''; m += '
'+tx('Assign Defenders')+''+uW.g_js_strings.openCastle.selecttroops+'
'; m +=''+tx('Add')+'
'; m +=''; m +='
'; m +=''+tx('New')+' '+tx('Chg')+'+ '+tx('Replace')+'
'; if (t.ExpandDefPreset) m += '
'; else m += '
'; m +=''; m +=''; m +='
 
'+tx('Preset Name')+': '+tx('Set Current')+' '+tx('Save')+'
'; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; m += '
'+TroopImageBig(i)+''+uW.unitcost["unt"+i][0].substring(0,15)+'
'; } m +='
'+uW.g_js_strings.commonstr.deletetx+' '+uW.g_js_strings.commonstr.cancel+'
'; m +='
 
'; ById('btTroopAddCell').innerHTML = m; if (t.InitPresetNumber != 0) { ById('btDefendPreset').value = t.InitPresetNumber; t.SelectDefPreset(ById('btDefendPreset')); t.InitPresetNumber = 0; } } else { jQuery('#btTroopAddCell').addClass("divHide"); } t.PaintCityInfo(cityId); }, PaintCityInfo : function (cityId) { var t = Dashboard; if (!popDash) return; t.Curr = Cities.byID[cityId].idx; var CityTag = '
'+cityId+'
'; // header items t.ResizeFrame = false; var Mists = Seed.items.i10021; var Doves = Seed.items.i901; var Refuges = Seed.items.i911; var Orders = Seed.items.i912; var now = unixTime(); var TruceDuration = 0; if (Seed.player.truceExpireUnixTime != undefined) TruceDuration = Seed.player.truceExpireUnixTime - now; var CannotDove = ((TruceDuration > 0) && (Seed.player.warStatus != 1)); var items = ''; if (Mists) { items += ''; } else { items += ''; } if (Seed.playerEffects.fogExpire > now) { items += ''; } if (Doves && !CannotDove) { items += ''; } else { items += ''; } if (TruceDuration > 0) { if (Seed.player.warStatus != 3) { items += ''; } else { var ts = "color:#080"; if (TruceDuration < 3600) {ts = "color:#f00"}; items += ''; } } if (Refuges) { items += ''; } else { items += ''; } if (Orders) { items += ''; } else { items += ''; } items += '
'+uW.timestr(Seed.playerEffects.fogExpire-now)+''+tx('BROKEN!')+''+uW.timestr(Seed.player.truceExpireUnixTime-now)+'
' if (CheckForHTMLChange('DASH','btItems',items)) { t.ResizeFrame = true; } // overview t.Buildings = getCityBuildings(cityId); // refresh buildings info each loop var Status = ''; var ascended = getAscensionValues(t.CurrentCityId); var cityExpTime = ascended.prestigeBuffExpire; var prestigeexp = ''; if ((!isNaN(cityExpTime)) && (cityExpTime +(3600*24) >= unixTime())) { if (cityExpTime < unixTime()) { prestigeexp = ' '+tx('Expired!')+''; } else { prestigeexp = ' '+uW.timestr(cityExpTime-unixTime())+' '+tx('Remaining')+''; } } if (!ascended.isPrestigeCity) { CityFaction = tx('Not ascended');} else { CityFaction = getFactionName(ascended.prestigeType) + ' ('+uW.g_js_strings.commonstr.level+' '+ascended.prestigeLevel+')'; } DefState = parseInt(Seed.citystats["city" + cityId].gate); if (DefState) DefButton = '
'+tx('Troops are Defending!')+'
'; else DefButton = '
'+tx('Troops are Hiding!')+'
'; ArcaneAura = ''; if (ArcanaEnabled()) { var HQDist = distance(Seed.cities[t.Curr][2], Seed.cities[t.Curr][3], Seed.allianceHQ.hq_xcoord, Seed.allianceHQ.hq_ycoord); var AuraDist = parseIntNan(Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].distance); if (HQDist<=AuraDist) { ArcaneAura = ''+tx('HQ Dist')+': '+HQDist+''; } else { ArcaneAura = ''+tx('HQ Dist')+': '+HQDist+''; } } Status += ''; Status += ''; Status += ''; Status += ''; Embassy = ''+tx('No Embassy!')+''; var emb = t.Buildings[8]; if (emb.count > 0){ var availSlots = emb.maxLevel; for (var k in Seed.queue_atkinc){ if ((Seed.queue_atkinc[k].toCityId == cityId) && (Seed.queue_atkinc[k].marchStatus == 2) && (Seed.queue_atkinc[k].fromCityId != cityId) && (Cities.byID[Seed.queue_atkinc[k].fromCityId]==null)) { --availSlots; } } Embassy = availSlots +' '+uW.g_js_strings.commonstr.of+' '+ emb.maxLevel +' '+tx('slots available'); } Status += ''; var hall = t.Buildings[7]; Marshall = ''+tx('No Marshall!')+''; Combat = 0; var s = Seed.knights["city" + cityId]; if (s) { s = s["knt" + Seed.leaders["city" + cityId].combatKnightId]; if (s){ Combat = s.combat; if (s.combatBoostExpireUnixtime > unixTime()) { Combat *= 1.25; } Marshall = s.knightName+' (Atk:'+Combat+')'; if (!t.ExpandMarshall && (hall.count >= 1)) { Marshall += '  '+tx('Change')+''; Gauntlets = Seed.items.i221; if (!(s.combatBoostExpireUnixtime > unixTime()) && Gauntlets ) { Marshall += ' '+uW.g_js_strings.commonstr.boost+''; } else { if (s.combatBoostExpireUnixtime > unixTime()) { Marshall += '  '+tx('Boosted for')+' '+uW.timestr(s.combatBoostExpireUnixtime-unixTime())+''; } } } } else { t.ExpandMarshall = true; } } else { t.ExpandMarshall = false; // no knights ffs! } if (hall.count < 1) {t.ExpandMarshall = false;} // no fricken knights hall! if (t.ExpandMarshall) Marshall += '
'; else Marshall += '
'; Marshall +=''; Marshall += '   '+uW.g_js_strings.commonstr.assign+' '+uW.g_js_strings.commonstr.cancel+'
'; Status += '
'; var GotChamp = false; var CheckChamp = false; if (!uW.isNewServer()) { Champion = '
'+uW.g_js_strings.commonstr.nametx+''+Seed.cities[t.Curr][1]+''+DefButton+'
'+tx('Location')+''+uW.provincenames['p'+Seed.cities[t.Curr][4]]+' '+coordLink(Seed.cities[t.Curr][2],Seed.cities[t.Curr][3])+' '+ArcaneAura+'
'+uW.g_js_strings.commonstr.faction+''+CityFaction+' 
'+uW.buildingcost.bdg8[0]+''+Embassy+'
'+tx('Marshall')+''+Marshall+'
'; } else { Status += ''; } } Status += ''; var now = unixTime(); atkboost = ''+tx('No Active Boost!')+''; if (Seed.playerEffects.atk2Expire >now) { atkboost = '50% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.atk2Expire-now)+''; } else { if (Seed.playerEffects.atkExpire >now) { atkboost = '20% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.atkExpire-now)+''; } } defboost = ''+tx('No Active Boost!')+''; if (Seed.playerEffects.def2Expire >now) { defboost = '50% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.def2Expire-now)+''; } else { if (Seed.playerEffects.defExpire >now) { defboost = '20% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.defExpire-now)+''; } } lifeboost = ''+tx('No Active Boost!')+''; if (Seed.playerEffects.lifeExpire >now) { lifeboost = '10% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.lifeExpire-now)+''; } spellboost = ''+tx('No Active Boost!')+''; if (Seed.playerEffects.spExpire && Seed.playerEffects.spExpire >now) { spellboost = '25% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.spExpire-now)+''; } debuffboost = ''+tx('No Active Boost!')+''; if (Seed.playerEffects.spdatkExpire && Seed.playerEffects.spdatkExpire >now) { debuffboost = '25% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.spdatkExpire-now)+''; } boosts = '
'+uW.g_js_strings.champ.no_champ+'!'; try { if (!Options.DashboardOptions.GraphicalChampDisplay) { t.citychamp = getCityChampion(cityId); if (t.citychamp.championId) { GotChamp = true; if (t.oldchamp != t.citychamp.championId) { t.ExpandChampion = false; } if (t.citychamp.status != '10') {champstat = '('+uW.g_js_strings.commonstr.defending+')';} else { champstat = '('+uW.g_js_strings.commonstr.marching+')';} Champion = '
'+t.citychamp.name+''+champstat+''; } if (t.ExpandChampion) { Champion += ''+uW.g_js_strings.commonstr.cancel+'
'; } else { if (!GotChamp) { Champion += ''+uW.g_js_strings.commonstr.assign+''; } else { if (t.citychamp.status != '10') { Champion += ''+tx('Change')+''; }} if (GotChamp && (t.citychamp.status != '10')) { Champion += ' '+uW.g_js_strings.commonstr.unassign+''; } Champion += '
'; } for (var y in Seed.champion.champions) { chkchamp = Seed.champion.champions[y]; if (chkchamp.championId) { if (!chkchamp.assignedCity || chkchamp.assignedCity != cityId) { CheckChamp = true; if (chkchamp.assignedCity && !Cities.byID[chkchamp.assignedCity]) { chkchamp.assignedCity = 0; } if (!chkchamp.assignedCity || chkchamp.assignedCity == 0) { chkcity = 'Unassigned';} else { chkcity = Cities.byID[chkchamp.assignedCity].name;} chkbtn = ''; defendingCity = chkcity; chkcol = ""; if (chkchamp.status == '10') { defendingCity = tx('Marching From')+' '+defendingCity; chkcol='color:#800;' } else { if (defendingCity != 'Unassigned') { defendingCity = uW.g_js_strings.commonstr.defending+' '+defendingCity; chkcol = 'color:#f80;'; } chkbtn = ''+uW.g_js_strings.commonstr.assign+''; } Champion += ''; } } } Champion += '
'+chkchamp.name+''+defendingCity+''+chkbtn+'
'; } else { Champion = t.PaintChampionSelector(cityId); } } catch (err) { logerr(err); // write to log Champion = ''+tx('Error reading champion data')+' :('; } if (!Options.DashboardOptions.GraphicalChampDisplay) { Status += '
'+uW.g_js_strings.champ.champion+''+Champion+'
'+uW.g_js_strings.champ.champion+''+Champion+'
'+uW.g_js_strings.report_view.guardian+'
'; for (var i = 0; i < t.BoostItemList.length; i++) { if (uW.ksoItems[t.BoostItemList[i]].count) { boosts += ''; } } boosts += '
' boosts2 = ''; for (var i = 0; i < t.BoostItemList2.length; i++) { if (uW.ksoItems[t.BoostItemList2[i]].count) { boosts2 += ''; } } boosts2 += '
' boosts3 = ''; for (var i = 0; i < t.BoostItemList3.length; i++) { if (uW.ksoItems[t.BoostItemList3[i]] && uW.ksoItems[t.BoostItemList3[i]].count) { boosts3 += ''; } } boosts3 += '
' Status += ''+uW.g_js_strings.commonstr.attack+' '+boosts+''; Status += ''+uW.g_js_strings.commonstr.defense+' '; Status += ''+tx('Health')+' '+boosts2+''; Status += ''+uW.g_js_strings.spells.spells+' '; Status += ''+uW.g_js_strings.champ.debuffs+' '+boosts3+''; Status += '  '; if (Seed.activeRoyalConquestBuff && matTypeof(Seed.activeRoyalConquestBuff)=="array" && Seed.activeRoyalConquestBuff.length>=1) { Status += ''+tx('Conquest')+' '; var conqboost = ''; for (var k=0;k'+uW.itemlist["i"+conqitem.buffId].name+' '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(conqitem.endTime-now)+''; } } Status += ''; if (!uW.isNewServer()) { Status += '
'; } if (CheckForHTMLChange('DASH','btStatusCell',CityTag+Status,t.serverwait)) { ById('btCityStatus').addEventListener ('click', function(){t.ToggleDefenceMode (cityId);} , false); t.PaintTRPresets(); t.PaintGuardianSelector(); if (GotChamp) { t.oldchamp = t.citychamp.championId; } else { t.oldchamp = 0; } t.ResizeFrame = true; } ById('atkboostcell').innerHTML = atkboost; ById('defboostcell').innerHTML = defboost; ById('lifeboostcell').innerHTML = lifeboost; ById('spellboostcell').innerHTML = spellboost; ById('debuffboostcell').innerHTML = debuffboost; ById('prestigeexpcell').innerHTML = prestigeexp; if (ById('conquestboostcell')) ById('conquestboostcell').innerHTML = conqboost; // arcana if (ArcanaEnabled()) { var AlliArcana = ''; var PersArcana = ''; var now = unixTime(); var arcanaAlliActive = 0; if (Seed.activeBuffs && matTypeof(Seed.activeBuffs) == 'object') { for (var a in Seed.activeBuffs) { var arc = Seed.activeBuffs[a]; var time1 = arc.a_24h?arc.a_24h:0; var time2 = arc.a_7d?arc.a_7d:0; if (time1 > now || time2 > now) { arcanaAlliActive++; var remspan = ''; var rem = (time2-now); var adur = '7d'; if (time1>now) { rem = (time1-now); adur = '24h'; } if (rem<=3600) remspan = 'boldRed'; AlliArcana += '
'+uW.itemlist['i'+a].name+''; if (Seed.is_chancellor || Seed.is_vicechancellor) { AlliArcana += ''+strButton8(tx('Deactivate'),'onClick=btDeactivateArcana('+a+',"a","'+adur+'")')+''; } AlliArcana += '
'+timestr(rem)+' '+tx('remaining')+'
'; } } } if (arcanaAlliActive==0) { AlliArcana += ''+tx('No Active Boost!')+'
 
'; } var arcanaPersActive = 0; if (Seed.activeBuffs && matTypeof(Seed.activeBuffs) == 'object') { for (var a in Seed.activeBuffs) { var arc = Seed.activeBuffs[a]; var time1 = arc.p_24h?arc.p_24h:0; var time2 = arc.p_7d?arc.p_7d:0; if (time1 > now || time2 > now) { arcanaPersActive++; var remspan = ''; var rem = (time2-now); var pdur = '7d'; if (time1>now) { rem = (time1-now); pdur = '24h'; } if (rem<=3600) remspan = 'boldRed'; PersArcana += '
'+uW.itemlist['i'+a].name+''+strButton8(tx('Deactivate'),'onClick=btDeactivateArcana('+a+',"p","'+pdur+'")')+'
'+timestr(rem)+' '+tx('remaining')+'
'; } } } if (arcanaPersActive==0) { PersArcana += ''+tx('No Active Boost!')+'
 
'; } if (arcanaAlliActive now) { var remspan = ''; var rem = (endtime-now); if (rem<=3600) remspan = 'boldRed'; if (t.TroopBoostSpeedList.indexOf(parseInt(a)) != -1) { BoostSpeedActive = true; BoostSpeed += '
'+uW.itemlist['i'+a].name+'
'+timestr(rem)+' '+tx('remaining')+'
'; } if (t.TroopBoostAccuracyList.indexOf(parseInt(a)) != -1) { BoostAccuracyActive = true; BoostAccuracy += '
'+uW.itemlist['i'+a].name+'
'+timestr(rem)+' '+tx('remaining')+'
'; } } } } if (!BoostSpeedActive) { BoostSpeed += ''+tx('No Active Boost!')+'
 
'; } if (!BoostAccuracyActive) { BoostAccuracy += ''+tx('No Active Boost!')+'
 
'; } CheckForHTMLChange('DASH','btBoostSpeedCell',CityTag+BoostSpeed); CheckForHTMLChange('DASH','btBoostAccuracyCell',CityTag+BoostAccuracy); // sacrifices var s = ""; var z = ""; var b = t.Buildings[25]; if (b.count > 0 && t.SacSettings) { s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += ''; s += '
'+tx('No. of Altars')+''+b.count+''+uW.g_js_strings.blessingSystem.blessing_name_203+'?'+(t.DarkRitual?uW.g_js_strings.commonstr.yes:uW.g_js_strings.commonstr.no)+'
'+tx('Increase')+''+t.SacSettings.stat_inc+'%'+uW.g_js_strings.blessingSystem.blessing_name_206+'?'+(t.ChannelledSuffering?uW.g_js_strings.commonstr.yes:uW.g_js_strings.commonstr.no)+'
'+tx('Max. Troops')+''+addCommas(t.SacSettings.max_amount)+''+tx('Troops per Second')+''+(Math.round(t.SacSpeed * 100 / t.SacSpeedBuff)/100)+'
'+t.QuickSacString+'
'; sac = Seed.queue_sacr["city" + cityId], sacrifices = false; var r = 0; if (sac.length > 0) { sacrifices = true; jQuery.each(sac, function (P, R) { var Q = parseInt(R.eta, 10) - unixTime(), S = Math.round((R.multiplier[0] - 1) * 100), T = R.buffedUnitType[0]; if (++r % 25) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''+uW.unitcost["unt"+T][0]+''+R.quantity+''+uW.timestr(Q)+''+uW.g_js_strings.commonstr.cancel+''; }) } z = '
'+z; z += '
'+uW.g_js_strings.openCastle.trooptype+''+uW.g_js_strings.commonstr.amount+''+uW.g_js_strings.commonstr.time+' 
'; if (r < t.SacAllowed) { t.ShowNewSacrifice(true); t.allownewsacs = true; } else { t.ShowNewSacrifice(false); t.allownewsacs = false; z += '
 
'; } z += ''; } else { z = '

'+tx('No fey altars!')+'

'; t.ShowNewSacrifice(false); t.allownewsacs = false; } if (CheckForHTMLChange('DASH','btSacrificeCell',CityTag+s+z)) { t.PaintQuickSac(); t.ResizeFrame = true; } // troops var GotTroops = false; var defendMight = 0; var TroopColour = Options.Colors.PanelText; var TitleColour = 'rgba('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+',0.5)'; var TitleStyle = 'xtabHD'; if (DefState) { TroopColour = '#f00'; TitleColour = '#f00'; TitleStyle = 'xtabHDDef'; } if (DefState) DefButton2 = '
'+uW.g_js_strings.commonstr.defending+'!
'; else DefButton2 = '
'+tx('Hiding!')+'
'; TroopCell = '
'; if (SelectiveDefending) { Troops = ''; Troops += ''; if (!GotTroops) {Troops = '';} else { if (Options.ShowMarchMight) { Troops += '';} } TroopCell += Troops + ''; GotTroops = false; TroopColour = Options.Colors.PanelText; TitleColour = 'rgba('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+',0.5)'; TitleStyle = 'xtabHD'; TroopCell += ''; } Troops = ''; Troops += ''; if (!GotTroops) {Troops = '';} TroopCell += Troops + '
'; if (SelectiveDefending) { TroopCell += ''+tx('Auto-Replace')+''; } TroopCell += ''+uW.g_js_strings.commonstr.defending+'
'+DefButton2+'
'+uW.g_js_strings.modal_barracks_trainingtab.unittypeinfantry+''+uW.g_js_strings.modal_barracks_trainingtab.unittyperanged+''+uW.g_js_strings.modal_barracks_trainingtab.unittypehorsed+''+uW.g_js_strings.modal_barracks_trainingtab.unittypesiege+''+uW.g_js_strings.modal_barracks_trainingtab.spellcaster+'
'; for(c=0; c 0) { GotTroops = true; defendMight += (Seed.defunits['city' + Seed.cities[t.Curr][0]]['unt'+i]*parseInt(uW.unitmight["unt"+i])); Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; defendMight += (Seed.defunits['city' + Seed.cities[t.Curr][0]]['unt'+i]*parseInt(uW.unitmight["unt"+i])); Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; defendMight += (Seed.defunits['city' + Seed.cities[t.Curr][0]]['unt'+i]*parseInt(uW.unitmight["unt"+i])); Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; defendMight += (Seed.defunits['city' + Seed.cities[t.Curr][0]]['unt'+i]*parseInt(uW.unitmight["unt"+i])); Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; defendMight += (Seed.defunits['city' + Seed.cities[t.Curr][0]]['unt'+i]*parseInt(uW.unitmight["unt"+i])); Troops += '';} } Troops += '
'+tx('No Troops')+'
'+tx('Defending Might')+': '+addCommas(defendMight)+'
 
 '+tx('Sanctuary')+'
'+tx('hide')+'
'+uW.g_js_strings.modal_barracks_trainingtab.unittypeinfantry+''+uW.g_js_strings.modal_barracks_trainingtab.unittyperanged+''+uW.g_js_strings.modal_barracks_trainingtab.unittypehorsed+''+uW.g_js_strings.modal_barracks_trainingtab.unittypesiege+''+uW.g_js_strings.modal_barracks_trainingtab.spellcaster+'
'; for(c=0; c 0) { GotTroops = true; Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; Troops += '';} } Troops += ''; for(c=0; c 0) { GotTroops = true; Troops += '';} } Troops += '
'+tx('No Troops')+'
 
'; if (CheckForHTMLChange('DASH','btTroopCell',CityTag+TroopCell)) { t.ShowHideSanctuary(); if (SelectiveDefending) { ById('btFixTroopsChk').addEventListener ('click', function(e) { Options.DashboardOptions.ReplaceDefendingTroops[t.Curr] = e.target.checked; saveOptions(); },false); } ById('btCityStatus2').addEventListener ('click', function(){t.ToggleDefenceMode (cityId);} , false); // check if troop types dropdowns need refreshing - Defence AND Sacrifice! CheckOptionsString = ""; for (var y in uW.unitcost) { var tot = parseIntNan(Seed.units['city' + Seed.cities[t.Curr][0]]['unt'+y.substr(3)]); if ((tot > 0)) { CheckOptionsString = CheckOptionsString + y.substr(3); } } if (t.DefOptionsString != CheckOptionsString) { if (SelectiveDefending) { t.InitPresetNumber = ById('btDefendPreset').value; } t.SetCurrentCity(Seed.cities[t.Curr][0],true); } else { if (SelectiveDefending) { t.SelectDefTroopType (ById("btDefendTroops")); } } t.ResizeFrame = true; } // reinforcements reinforcements = false; reinforceMight = 0; t.Reins = []; var z = ""; var r = 0; for (var k in inc){ var to = Cities.byID[inc[k].toCityId]; if ((inc[k].toCityId == cityId) && (to.tileId == inc[k].toTileId) && ((inc[k].marchStatus == 2) || (inc[k].marchType == 2)) && (inc[k].fromCityId != cityId)) { reinforcements = true; var a = inc[k]; var player = Seed.players['u'+a.fromPlayerId]; var fromname = player.n; marchdir = "Return"; // always show troops remaining var marchtime=uW.timestr(a.arrivalTime - unixTime()); if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''+fromname+''; if (a["knightId"] > 0) z +=''+uW.g_js_strings.commonstr.knight+' (Atk:'+ a["knightCombat"]+') '; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if(a["unit"+i+marchdir] > 0) { z += ''+ uW.unitcost['unt'+i][0] +': '+ addCommas(a["unit"+i+marchdir])+' '; reinforceMight += (a["unit"+i+marchdir]*parseInt(uW.unitmight["unt"+i])); } } if ((a.marchStatus == 2) || (a.arrivalTime - unixTime() <= 0)) { z += ''+uW.g_js_strings.openEmbassy.senthome+''; t.Reins.push(a.marchId); // for send all home logic } else { z += ''+marchtime+''; } } } if (!reinforcements) { z = '

'+tx('No Reinforcements')+'

'; } else { z = '
'+z; if (Options.ShowMarchMight) { z += ''; } z += '
'+uW.g_js_strings.commonstr.from+''+uW.g_js_strings.commonstr.troops+''+tx('Send All Home')+'
'+tx('Reinforcing Might')+': '+addCommas(reinforceMight)+'
 
'; } if (CheckForHTMLChange('DASH','btReinforceCell',CityTag+z,t.serverwait)) { t.ResizeFrame = true; } // incoming attacks cityincoming = false; var cityinctimes = {}; var z = ""; var r = 0; for (var k in inc){ if ((inc[k].toCityId == cityId) && (inc[k].score)) { var a = inc[k]; if (a.arrivalTime < unixTime()) continue; // don't display arrival times already happened cityincoming = true; var icon,hint,marchtime,fromname,marchdir,fromcoords; var marchId = a.mid; var marchScore = parseInt(a.score); var marchType = parseInt(a.marchType); var marchStatus = parseInt(a.marchStatus); var marchMight = 0; if (!a.marchType) {a.marchType = 4;} if (!a.arrivalTime || a.arrivalTime == -1) {marchtime = '??????';} else {marchtime=uW.timestr(a.arrivalTime - unixTime());} cityinctimes[marchId] = marchtime; var player = Seed.players['u'+a.pid]; fromname = ""; if (player) {fromname = player.n;} if (!a.fromXCoord) {fromcoords = "";} else {fromcoords = coordLink(a.fromXCoord,a.fromYCoord);} if (fromname == "") {fromname = '('+tx('Upgrade WatchTower')+')';} else {fromname = MonitorLink(a.pid,fromname);} switch (marchType) { case 3: icon=ScoutImage;hint=uW.g_js_strings.commonstr.scout;break; case 4: icon=AttackImage;hint=uW.g_js_strings.commonstr.attack;break; } if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ' '; z += ''+fromname+' '; if (fromcoords != "") { z+= ''+fromcoords+''; } var zz = ''; if ((safecall.indexOf(a.pid) < 0 || trusted) && a["championInfo"]) { t.marchchamp = ''; var gotchamp = false; if (a["championInfo"].effects[1] && !(a["championInfo"].effects[1] instanceof Array) && typeof(a["championInfo"].effects[1]) === "object") { got202 = false; for (var cy in a["championInfo"].effects[1]) { // missing bonus damage? if ((cy == '202') && gotchamp) {got202 = true;} if ((cy == '203') && !got202) { t.marchchamp += ""; } str = uW.g_js_strings.effects['name_'+cy]; if (str && str!= "") { gotchamp = true; t.marchchamp += ""; } else { break; } } } if (!gotchamp) { t.marchchamp += ''; } t.marchchamp+=''; var gottroop = false; if (a["championInfo"].effects[2] && !(a["championInfo"].effects[2] instanceof Array) && typeof(a["championInfo"].effects[2]) === "object") { for (var ty in a["championInfo"].effects[2]) { str = uW.g_js_strings.effects['name_'+ty]; if (str && str!= "") { gottroop = true; t.marchchamp += ""; } else { break; } } } if (!gottroop) { t.marchchamp += ''; } t.marchchamp+="
'+a["championInfo"].name+'
'+uW.g_js_strings.report_view.champion_stats+'
"+uW.g_js_strings.effects.name_202+"0
"+str+""+a["championInfo"].effects[1][cy]+"
'+tx('None Available')+'
'+uW.g_js_strings.report_view.troop_stats+'
"+str+""+a["championInfo"].effects[2][ty]+"
'+tx('None Available')+'
"; zz +='
Champion: '+a["championInfo"].name+' 
'; } if (a["knt"] && a["knt"]["cbt"]) zz +=''+uW.g_js_strings.commonstr.knight+' ('+uW.g_js_strings.commonstr.atk+':'+ a["knt"]["cbt"]+') '; if (a["unts"]) { for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (a["unts"]["u"+i]) { if (a["unts"]["u"+i] > 0) { zz += ''+ uW.unitnamedesctranslated['unt'+i][0] +': '+ addCommas(a["unts"]["u"+i])+' '; marchMight += (a["unts"]["u"+i]*parseInt(uW.unitmight["unt"+i])); } else { zz += ''+ a["unts"]["u"+i]+' '+ uW.unitnamedesctranslated['unt'+i][0] +' '; } } } } else { if (a["cnt"]) { zz += ''+a["cnt"]+' ';} else { zz += '('+uW.g_js_strings.attack_viewimpending_view.upgradetoseeinfo+') '; } } if (local_atkinc["m"+marchId]["fromSpellType"]) { var spell = uW.g_js_strings.spells['name_'+local_atkinc["m"+marchId]["fromSpellType"]]; if (spell) { var spellstyle = 'color:#808;'; zz +='
* '+spell+' *' } } z += ''; } } if (!cityincoming) { z = '

'+tx('No Incoming Attacks')+'
'; } else { z = '
'+z; } z += '
 '+uW.g_js_strings.commonstr.time+''+uW.g_js_strings.commonstr.from+''+uW.g_js_strings.commonstr.troops+'
'; if (CheckForHTMLChange('DASH','btAttackCell',CityTag+z)) { t.ResizeFrame = true; } for (var m in cityinctimes) { mt = cityinctimes[m]; if (ById('citymarchtime'+m)) { ById('citymarchtime'+m).innerHTML = mt; } } // fortifications GotDef = false; t.WallDefences = []; t.FieldDefences = []; var d = Seed.fortifications["city" + Seed.cities[t.Curr][0]]; var a = Object.keys(d); for (var c = 0; c < a.length; c++) { var f = parseInt(a[c].split("fort")[1]); if (f < 60 || f==63) { t.WallDefences.push(a[c]) } else { t.FieldDefences.push(a[c]) } } var dt = t.Buildings[30]; var rt = t.Buildings[31]; var wall = {}; getWallInfo(cityId,wall); var TArcDesc = ''; var TArcEffect = ''; if (ArcanaEnabled()) { var TArc = t.GetArcanaEffect(42001,t.Curr)+t.GetArcanaEffect(42013,t.Curr); if (TArc!=0) { TArcDesc = tx('Arcana Bonus'); TArcEffect = TArc+'%'; } } Walls = '
'; Walls += ''; Walls += ''; Walls += ''; Walls += '
'+tx('Walls')+''+(wall.wallLevel?uW.g_js_strings.commonstr.level+' '+wall.wallLevel:''+tx('No Walls')+'')+''+tx('Wall Space')+''+wall.wallSpaceUsed+'/'+wall.wallSpace+'
'+uW.buildingcost.bdg30[0]+''+(dt.maxLevel?'Level '+dt.maxLevel:''+tx('None')+'!')+''+tx('Field Space')+''+wall.fieldSpaceUsed+'/'+wall.fieldSpace+'
'+uW.buildingcost.bdg31[0]+''+(rt.maxLevel?'Level '+rt.maxLevel:''+tx('None')+'!')+''+TArcDesc+''+TArcEffect+'

'; var now = unixTime(); tatkboost = ''+tx('No Active Boost!')+''; if (Seed.playerEffects.tatk2Expire >now) { tatkboost = '50% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.tatk2Expire-now)+''; } else { if (Seed.playerEffects.tatkExpire >now) { tatkboost = '20% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.tatkExpire-now)+''; } } tlifeboost = ''+tx('No Active Boost!')+''; if (Seed.playerEffects.tlife2Expire >now) { tlifeboost = '50% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.tlife2Expire-now)+''; } else { if (Seed.playerEffects.tlifeExpire >now) { tlifeboost = '20% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.tlifeExpire-now)+''; } } tboosts = ''; for (var i = 0; i < t.tBoostItemList.length; i++) { if (uW.ksoItems[t.tBoostItemList[i]].count) { tboosts += ''; } } tboosts += '
'; var tStatus = ''; tStatus += ''; tStatus += ''; tStatus += '
'+tx('Tower Attack')+' '+tboosts+'
'+tx('Tower Life')+' 

'; Defences = '
'; Defences += '
'+uW.g_js_strings.openCastle.walldefenses+''+tx('Field Defenses')+'
'; for(c=0; c 0) { GotDef = true; Defences += ''+TroopImage(f)+ addCommas(Seed.fortifications['city' + Seed.cities[t.Curr][0]]['fort'+f])+' ';} } Defences += ''; for(c=0; c 0) { GotDef = true; Defences += ''+TroopImage(f)+ addCommas(Seed.fortifications['city' + Seed.cities[t.Curr][0]]['fort'+f])+' ';} } Defences += '
'; if (!GotDef) {Defences = '

'+tx('No Fortifications')+'
';} Defences += '
'; if (CheckForHTMLChange('DASH','btWallDefenceCell',CityTag+Walls+tStatus+Defences)) { t.ResizeFrame = true; } ById('tatkboostcell').innerHTML = tatkboost; ById('tlifeboostcell').innerHTML = tlifeboost; // outgoing attacks cityoutgoing = false; var cityouttimes = {}; var z = ""; var r = 0; for (var k in outCity){ var a = outCity[k]; if (a.destinationUnixTime < unixTime()) continue; // don't display arrival times already happened var icon, hint, marchtime, totile, tocity, toname, marchdir, tocoords; var marchId = a.marchId; var marchStatus = parseInt(a.marchStatus); var marchType = parseInt(a.marchType); var marchMight = 0; if (marchType == 10) marchType=4; // Change Dark Forest type to Attack! if (marchType != 4 && marchType != 3) continue; // attacks and scouts only cityoutgoing = true; var now = unixTime(); var destinationUnixTime = a["destinationUnixTime"] - now; marchdir = "Count"; totile = ""; tocity = ""; toname = ""; totile = tileTypes[parseInt(a["toTileType"])]; if (a["toTileType"] == 51) { if (!a["toPlayerId"]) { totile = ""; } else { if (a["toPlayerId"] == 0) totile = tx('Barb Camp'); } } totile = 'Lvl '+a["toTileLevel"]+' '+totile; if (a["toPlayerId"] && (a["toPlayerId"] != 0)) { if (a.players && a.players['u'+a.toPlayerId]) { toname = MonitorLink(a.toPlayerId,a.players['u'+a.toPlayerId].n); } else { if (Seed.players['u'+a.toPlayerId]) { toname = MonitorLink(a.toPlayerId,Seed.players['u'+a.toPlayerId].n); } } } var iconType = marchType; if (destinationUnixTime < (60)) { marchtime = ''+uW.timestr(destinationUnixTime)+''; } else { marchtime = uW.timestr(destinationUnixTime); } cityouttimes[marchId] = marchtime; if (!a.toXCoord || (tocity != "")) {tocoords = "";} else {tocoords = coordLink(a.toXCoord,a.toYCoord);} hint = ""; switch (marchType) { case 3: hint=uW.g_js_strings.commonstr.scout;break; case 4: hint=uW.g_js_strings.commonstr.attack;break; } switch (iconType) { case 3: icon=ScoutImage;break; case 4: icon=AttackImage;break; } hint=tx('Recall march')+" ("+marchId+")"; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ' '; z += ''; if (toname != "") { z+= ''+toname+' '; } if (totile != "") { z+= ''+totile+' '; } if (tocity != "") { z+= ''+tocity+' '; } if (tocoords != "") { z+= ''+tocoords+''; } z += ''; var zz = ''; if (a["championInfo"]) { // stats here are sort of obsolete, because it uses city champ data, but kept in for completeness... t.marchchamp = ''; var gotchamp = false; if (a["championInfo"].effects) { if (a["championInfo"].effects[1] && !(a["championInfo"].effects[1] instanceof Array) && typeof(a["championInfo"].effects[1]) === "object") { got202 = false; for (var cy in a["championInfo"].effects[1]) { // missing bonus damage? if ((cy == '202') && gotchamp) {got202 = true;} if ((cy == '203') && !got202) { t.marchchamp += ""; } str = uW.g_js_strings.effects['name_'+cy]; if (str && str!= "") { gotchamp = true; t.marchchamp += ""; } else { break; } } } if (!gotchamp) { t.marchchamp += ''; } t.marchchamp+=''; var gottroop = false; if (a["championInfo"].effects[2] && !(a["championInfo"].effects[2] instanceof Array) && typeof(a["championInfo"].effects[2]) === "object") { for (var ty in a["championInfo"].effects[2]) { str = uW.g_js_strings.effects['name_'+ty]; if (str && str!= "") { gottroop = true; t.marchchamp += ""; } else { break; } } } if (!gottroop) { t.marchchamp += ''; } t.marchchamp+="
'+a["championInfo"].name+'
'+uW.g_js_strings.report_view.champion_stats+'
"+uW.g_js_strings.effects.name_202+"0
"+str+""+a["championInfo"].effects[1][cy]+"
'+tx('None Available')+'
'+uW.g_js_strings.report_view.troop_stats+'
"+str+""+a["championInfo"].effects[2][ty]+"
'+tx('None Available')+'
"; } zz +='
'+uW.g_js_strings.champ.champion+': '+a["championInfo"].name+' 
'; } if ((a["knightId"] > 0) && (!a["knightCombat"])) { for (var i in Seed.knights["city"+a.marchCityId]) { if (i == ("knt" + a["knightId"])) { Combat = Seed.knights["city"+a.marchCityId][i]["combat"]; if (Seed.knights["city"+a.marchCityId][i]["combatBoostExpireUnixtime"] > unixTime()) { Combat *= 1.25; } a["knightCombat"] = Combat; } } } if (a["knightId"] > 0) zz +=''+uW.g_js_strings.commonstr.knight+' ('+uW.g_js_strings.commonstr.atk+':'+ a["knightCombat"]+') '; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if((a["unit"+i+"Count"] > 0) || (a["unit"+i+"Return"] > 0)) { trpcol = Options.Colors.PanelText; zz += ''+ uW.unitcost['unt'+i][0] +': '+ addCommas(a["unit"+i+marchdir])+' '; marchMight += (a["unit"+i+marchdir]*parseInt(uW.unitmight["unt"+i])); } } if (a["fromSpellType"]) { var spell = uW.g_js_strings.spells['name_'+a["fromSpellType"]]; if (spell) { var spellstyle = 'color:#808;'; zz +='
* '+spell+' *' } } z += ''; } if (!cityoutgoing) { z = '

'+tx('No Outgoing Attacks')+'
'; } else { z = '
'+z; } z += '
 '+uW.g_js_strings.commonstr.time+''+uW.g_js_strings.commonstr.target+''+uW.g_js_strings.commonstr.troops+'
 
'; if (CheckForHTMLChange('DASH','btCityAttackCell',CityTag+z)) { t.ResizeFrame = true; } for (var m in cityouttimes) { mt = cityouttimes[m]; if (ById('cityoutmarchtime'+m)) { ById('cityoutmarchtime'+m).innerHTML = mt; } } // toggle section displays t.ShowHideSection("btStatus",t.OverviewShow); t.ShowHideSection("btArcana",t.ArcanaShow && ArcanaEnabled()); t.ShowHideSection("btSacrifice",t.SacrificeShow && (ascended.prestigeType == "2")); t.ShowHideSection("btTroop",t.TroopShow); t.ShowHideSection("btReinforce",t.ReinforceShow); t.ShowHideSection("btWallDefence",t.FortificationShow); t.ShowHideSection("btAttack",t.AttackShow); t.ShowHideSection("btCityAttack",t.CityAttackShow); t.ShowHideRow("btDefAddTroopRow",Options.DashboardOptions.DefAddTroopShow); t.ShowHideRow("btDefPresetRow",Options.DashboardOptions.DefPresetShow); if (t.ResizeFrame == true) { ResetFrameSize('btDash',100,t.DashWidth); } }, EverySecond : function () { var t = Dashboard; try { /* Reduce Delayers if they are Active */ if (t.ThroneDelay > 0) { t.ThroneDelay--; t.PaintTRPresets(); } if (t.GuardDelay > 0) { t.GuardDelay--; t.PaintGuardianSelector(); } if (!(Options.DashboardOptions.CurrentCity < 0)) { if (((SecondLooper % t.GeneralInterval) == 1) || t.GeneralInterval == 1) { t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); } }; /* check defence status, incoming status, selected guardian */ for (var cityId in Cities.byID){ var city_num = Cities.byID[cityId].idx; if (Seed.citystats["city" + cityId].gate != 0) { jQuery("#btCastles_" + city_num).removeClass("hiding").addClass("defending"); } else { jQuery("#btCastles_" + city_num).removeClass("defending").addClass("hiding"); } if (incCity.indexOf(city_num) >= 0) { jQuery("#btCastles_" + city_num).addClass("attack"); } else {jQuery("#btCastles_" + city_num).removeClass("attack"); } } if (t.CurrGuardian != Seed.guardian[Options.DashboardOptions.CurrentCity].type) { t.PaintGuardianSelector(); } if (Options.DashboardOptions.RefreshSeed && ((SecondLooper % RefreshSeedInterval) == 1) && !RefreshingSeed) { setTimeout(function() {RefreshSeed();},250); } } catch (err) { logerr(err); // write to log } }, ToggleSanctuary : function () { var t = Dashboard; Options.DashboardOptions.ExpandSanctuary = !Options.DashboardOptions.ExpandSanctuary; saveOptions(); t.ShowHideSanctuary(); }, ShowHideSanctuary : function () { var t = Dashboard; var a = ById('btShowHideSanct'); if (Options.DashboardOptions.ExpandSanctuary) { disp = ''; if (a) a.innerHTML = tx('hide'); }else{ disp = 'none'; if (a) a.innerHTML = tx('show'); } ById('btsanctroops').style.display = disp; if (ById('btsanctroopstitle')) ById('btsanctroopstitle').style.display = disp; }, SetAlliArcanaDesc : function () { var t = Dashboard; ById('btAlliArcanaDesc').innerHTML = ''; var Arc = parseIntNan(ById('btAlliArcanaSel').value); if (Arc != 0) { ById('btAlliArcanaDesc').innerHTML = uW.itemlist["i"+Arc].description; } }, SetPersArcanaDesc : function () { var t = Dashboard; ById('btPersArcanaDesc').innerHTML = ''; var Arc = parseIntNan(ById('btPersArcanaSel').value); if (Arc != 0) { ById('btPersArcanaDesc').innerHTML = uW.itemlist["i"+Arc].description; } }, ArcanaHint : function (elem,itemType,timeType) { var t = Dashboard; if (itemType == 'a') { var Arc = ById('btAlliArcanaSel').value; } else { var Arc = ById('btPersArcanaSel').value; } if (Arc!=0) { var TT = '
'+tx('Cost')+'
'; var Cost = ArcaneRequirements[Arc][itemType+"_"+timeType].cost; if (Cost) { for (var r in Cost) { if (itemType=="p") { // arcane tablets only I think! if (r=='43000') { var resspan = ''; if (parseIntNan(Cost[r])>parseIntNan(Seed.items.i43000)) { resspan = ''; } TT += ResourceImage(ArcaneTabletImage,uW.g_js_strings.playerGuide.ahq_14_h)+' '+resspan+addCommas(Cost[r])+'
'; } } else { var restype = ArcaneResources[r]; var resicon = ArcaneResourceImages[r]; var resspan = ''; TT += ResourceImage(resicon,'')+' '+resspan+addCommas(Cost[r])+'
'; } } } else { TT += tx('Unknown'); } TT += '
' if (itemType=="p") { TT += '
'+tx('Owned')+'
'+ResourceImage(ArcaneTabletImage,uW.g_js_strings.playerGuide.ahq_14_h)+' '+addCommas(parseIntNan(Seed.items.i43000))+'
'; } jQuery(elem.parentNode).children("span").remove(); jQuery(elem.parentNode).append(''+TT+''); } }, ArcanaHintOff : function (elem) { jQuery(elem.parentNode).children("span").remove(); }, GetArcanaEffect : function (item,citynum) { var res = 0; if (ArcanaEnabled()) { if (Seed.activeBuffs && Seed.activeBuffs[item] && ArcaneRequirements[item]) { var arc = Seed.activeBuffs[item]; var eff = ArcaneRequirements[item].effects; var alliance = 0; var personal = 0; var now = unixTime(); var HQDist = distance(Seed.cities[citynum][2], Seed.cities[citynum][3], Seed.allianceHQ.hq_xcoord, Seed.allianceHQ.hq_ycoord); var AuraDist = parseIntNan(Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].distance); var time1 = arc.a_24h?arc.a_24h:0; var time2 = arc.a_7d?arc.a_7d:0; if (time1 > now || time2 > now) { if (HQDist<=AuraDist) { for (var k in eff.inAura) { alliance = eff.inAura[k]; break; } } else { for (var k in eff.outAura) { alliance = eff.outAura[k]; break; } } } var time1 = arc.p_24h?arc.p_24h:0; var time2 = arc.p_7d?arc.p_7d:0; if (time1 > now || time2 > now) { for (var k in eff.personal) { personal = eff.personal[k]; break; } } if (alliance!=0 && item!=42015) { personal=personal/2; } res = alliance+personal; } } return res; }, setArcanaMessage : function (msg) { var t = Dashboard; ById('btArcanaErr').innerHTML = msg; }, ActivateArcana : function (itemId,itemType,timeType) { var t = Dashboard; t.setArcanaMessage(tx('Sending Request')+'...'); var params = uW.Object.clone(uW.g_ajaxparams); params.itemId = itemId; params.itemType = itemType; params.timeType = timeType; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceHqTempleActivateBuff.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if (rslt.ok) { var j = CM.AHQTempleModel.buffActivated(uWCloneInto(rslt.activatedBuff)); OpenTemple(function(rslt) { Tabs.Alliance.SetBoosts(rslt);Dashboard.setArcanaMessage('');Dashboard.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); }); // refresh seed from server } else { // error handling if (rslt.error_code) { t.setArcanaMessage(''+uW.g_js_strings.errorcode["err_"+rslt.error_code]+''); } else { t.setArcanaMessage(''+tx('Error activating arcana')+''); } } }, onFailure: function () { // error handling t.setArcanaMessage(''+tx('Server connection failed')+'.'); } },true); //no retry }, DeactivateArcana : function (itemId,itemType,timeType) { var t = Dashboard; t.setArcanaMessage(tx('Sending Request')+'...'); var params = uW.Object.clone(uW.g_ajaxparams); params.itemId = itemId; params.itemType = itemType; params.timeType = timeType; params.deactivate = 1; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceHqTempleActivateBuff.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if (rslt.ok) { var j = CM.AHQTempleModel.buffDeActivated(uWCloneInto(rslt.activatedBuff)); OpenTemple(function(rslt) { Tabs.Alliance.SetBoosts(rslt);Dashboard.setArcanaMessage('');Dashboard.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); }); // refresh seed from server } else { // error handling if (rslt.error_code) { t.setArcanaMessage(''+uW.g_js_strings.errorcode["err_"+rslt.error_code]+''); } else { t.setArcanaMessage(''+tx('Error Deactivating arcana')+''); } } }, onFailure: function () { // error handling t.setArcanaMessage(''+tx('Server connection failed')+'.'); } },true); //no retry }, SetSpeedBoostDesc : function () { var t = Dashboard; ById('btBoostSpeedDesc').innerHTML = ''; var buff = parseIntNan(ById('btBoostSpeedSel').value); if (buff != 0) { ById('btBoostSpeedDesc').innerHTML = uW.itemlist["i"+buff].description; } }, SetAccuracyBoostDesc : function () { var t = Dashboard; ById('btBoostAccuracyDesc').innerHTML = ''; var buff = parseIntNan(ById('btBoostAccuracySel').value); if (buff != 0) { ById('btBoostAccuracyDesc').innerHTML = uW.itemlist["i"+buff].description; } }, ActivateTroopBoost : function (itemId,label) { var t = Dashboard; t.setTroopBoostMessage(tx('Sending Request')+'...'); var params = uW.Object.clone(uW.g_ajaxparams); params.iid = itemId; params.label = label; new MyAjaxRequest(uW.g_ajaxpath + "ajax/useSpecificTroopBoost.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { CM.InventoryView.removeItemFromInventory(itemId, 1); if (rslt.specificTroopBuffInfo) { Seed.activeSpecificTroopBuff = rslt.specificTroopBuffInfo.b; Seed.isSpecificTroopBuffActive = rslt.specificTroopBuffInfo.a; uW.update_boosts(); t.setTroopBoostMessage(''); t.SetCurrentCity(Seed.cities[t.Curr][0],true); } } else { var errorMsg = "Unknown Error"; if (rslt.error_code == 3102) { errorMsg = uW.g_js_strings.errorcode.err_3102 } else { if (rslt.error_code == 3333) { errorMsg = "This item cannot be used." } else { if (rslt.error_code == 4444) { errorMsg = "You do not have the item in your inventory." } else { errorMsg = "Unknown Error" } } } t.setTroopBoostMessage(errorMsg); } } },true); //no retry }, setTroopBoostMessage : function (msg) { var t = Dashboard; ById('btBoostErr').innerHTML = msg; }, PaintQuickSac : function () { var t = Dashboard; if (!ById('btQuickSac')) { return; } if ((Options.DashboardOptions.QuickSacrifice == true) && (t.allownewsacs == true)) t.ShowQuickSac(true); else t.ShowQuickSac(false); }, ShowQuickSac : function (tf) { var t = Dashboard; var dc = jQuery('#btQuickSac').attr('class'); if (tf) {if (dc.indexOf('divHide') >= 0) jQuery('#btQuickSac').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#btQuickSac').attr('class','divHide');} }, ShowNewSacrifice : function (tf) { var t = Dashboard; var dc = jQuery('#btNewSacrificeCell').attr('class'); if (tf) {if (dc.indexOf('divHide') >= 0) jQuery('#btNewSacrificeCell').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#btNewSacrificeCell').attr('class','divHide');} }, SelectTroopType : function (sel) { var t = Dashboard; if ((sel.value == 0) || (sel.value == "")) { ById('btTotalTroops').innerHTML = ""; ById('btMaxTroops').innerHTML = ""; t.TotalTroops = 0; return false } else { if (SelectiveDefending) { t.TotalTroops = parseIntNan(Seed.units['city' + Seed.cities[Options.DashboardOptions.CurrentCity][0]]['unt'+sel.value])+parseIntNan(Seed.defunits['city' + Seed.cities[Options.DashboardOptions.CurrentCity][0]]['unt'+sel.value]); } else { t.TotalTroops = parseIntNan(Seed.units['city' + Seed.cities[Options.DashboardOptions.CurrentCity][0]]['unt'+sel.value]); } ById('btTotalTroops').innerHTML = ' / '+addCommas(t.TotalTroops); ById('btMaxTroops').innerHTML = 'max'; // set default sac length if blank if (Options.DashboardOptions.DefaultSacrifice) { var elemin = ById('btRitualMinutes'); var elesec = ById('btRitualSeconds'); if ((elemin.value == "") && (elesec.value == "")) { elemin.value = Options.DashboardOptions.DefaultSacrificeMin; elesec.value = Options.DashboardOptions.DefaultSacrificeSec; t.SetRitualLength(elesec); } } var elem = ById('btRitualAmount'); if (parseInt(elem.value) > t.TotalTroops) { elem.value = t.TotalTroops; t.SetRitualLength(elem); } } }, SetMaxTroops : function () { var t = Dashboard; var elem = ById('btRitualAmount'); elem.value = t.SacSettings.max_amount; if (elem.value > t.TotalTroops) {elem.value = t.TotalTroops;} if ((elem.value > Options.DashboardOptions.SacrificeLimit) && (parseIntNan(Options.DashboardOptions.SacrificeLimit) > 0)) {elem.value = Options.DashboardOptions.SacrificeLimit;} t.SetRitualLength(elem); }, SetRitualLength : function (sel) { var t = Dashboard; sel.value = parseInt(sel.value); if (isNaN(sel.value)) sel.value = 0; var trp, min, sec; if (sel.id == 'btRitualMinutes') { min = parseIntNan(sel.value); if (isNaN(ById('btRitualSeconds').value)) sec = 0; else sec = parseIntNan(ById('btRitualSeconds').value); trp = Math.round((parseIntNan(min * 60) + sec) * (t.SacSpeed / t.SacSpeedBuff)); // troops } if (sel.id == 'btRitualSeconds') { sec = parseIntNan(sel.value); if (isNaN(ById('btRitualMinutes').value)) min = 0; else min = parseIntNan(ById('btRitualMinutes').value); min += (parseIntNan( sec / 60 )); sec = sec % 60; trp = Math.round(((min * 60)+sec) * (t.SacSpeed / t.SacSpeedBuff)); // troops } if (sel.id == 'btRitualAmount') { trp = parseIntNan(sel.value); } if (trp > t.TotalTroops) {trp = t.TotalTroops;} if (trp > parseInt(t.SacSettings.max_amount)) {trp = t.SacSettings.max_amount;} if ((trp > Options.DashboardOptions.SacrificeLimit) && (parseIntNan(Options.DashboardOptions.SacrificeLimit) > 0)) {trp = Options.DashboardOptions.SacrificeLimit;} sec = parseIntNan(trp / (t.SacSpeed / t.SacSpeedBuff), 10); // seconds min = parseIntNan( sec / 60 ); sec = sec % 60; ById('btRitualAmount').value = BlankifZero(trp); ById('btRitualMinutes').value = BlankifZero(min); ById('btRitualSeconds').value = BlankifZero(sec); }, setTroopMessage : function (msg) { var t = Dashboard; ById('btTroopMsg').innerHTML = msg; }, ToggleDefenceMode : function (cityId) { var t = Dashboard; if (!SelectiveDefending) return; jQuery('#btCityStatus').addClass("disabled"); jQuery('#btCityStatus2').addClass("disabled"); ResetHTMLRegister('DASH','btStatusCell'); t.serverwait = true; var state = 1; if (Seed.citystats["city" + cityId].gate != 0) state = 0; var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.state = state; new MyAjaxRequest(uW.g_ajaxpath + "ajax/gate.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { t.serverwait = false; if (rslt.ok) { Seed.citystats["city" + cityId].gate = state; if (t.CurrentCityId==cityId) {t.PaintCityInfo(cityId);} } jQuery('#btCityStatus').removeClass("disabled"); jQuery('#btCityStatus2').removeClass("disabled"); }, onFailure: function () { t.serverwait = false; jQuery('#btCityStatus').removeClass("disabled"); jQuery('#btCityStatus2').removeClass("disabled"); } }); }, SelectDefenders : function (sel,def) { var t = Dashboard; if (!SelectiveDefending) return; var MoveArray = []; if (!def) { // switch to sanctuary if (sel == "A") { // All for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; MoveArray[i] = 0 - parseIntNan(Seed.defunits['city' + t.CurrentCityId]['unt'+i]); } } if (sel == "I") { // Infantry for(c=0; c'+rslt.msg+''); } else { t.setTroopMessage(''+tx('Error setting defending troops')+''); } } jQuery('#btAddDefendButton').removeClass("disabled"); jQuery('#btAddPresetButton').removeClass("disabled"); jQuery('#btReplacePresetButton').removeClass("disabled"); }, onFailure: function () { // error handling t.setTroopMessage('Server connection failed.'); jQuery('#btAddDefendButton').removeClass("disabled"); jQuery('#btAddPresetButton').removeClass("disabled"); jQuery('#btReplacePresetButton').removeClass("disabled"); } },true); //no retry }, SelectDefTroopType : function (sel) { var t = Dashboard; if ((sel.value == 0) || (sel.value == "")) { ById('btTotalDefTroops').innerHTML = ""; ById('btMaxDefTroops').innerHTML = ""; t.TotalSanctuaryTroops = 0; return false } else { t.TotalSanctuaryTroops = parseIntNan(Seed.units['city' + Seed.cities[Options.DashboardOptions.CurrentCity][0]]['unt'+sel.value]); ById('btTotalDefTroops').innerHTML = ' / '+addCommas(t.TotalSanctuaryTroops); ById('btMaxDefTroops').innerHTML = 'max'; // set default defender amount var elem = ById('btDefendAmount'); if ((elem.value == 0) || (elem.value == "")) { elem.value = Options.DashboardOptions.DefaultDefenceNum; } if (parseInt(elem.value) > t.TotalSanctuaryTroops) { elem.value = t.TotalSanctuaryTroops; } } }, SetMaxDefTroops : function () { var t = Dashboard; var elem = ById('btDefendAmount'); elem.value = t.TotalSanctuaryTroops; }, AddDefenders : function () { var t = Dashboard; var MoveArray = []; var TT = ById('btDefendTroops'); var AM = ById('btDefendAmount'); if (!TT.value || (TT.value == 0)) {t.setTroopMessage(''+tx('Please select troop type')+'');return;} if (!AM.value || (AM.value == 0)) {t.setTroopMessage(''+tx('Please enter a number of troops')+'');return;} if (AM.value > t.TotalSanctuaryTroops) {t.setTroopMessage(''+tx('You do not have enough troops')+'');return;} jQuery('#btAddDefendButton').addClass("disabled"); MoveArray[TT.value] = AM.value; t.ChangeDefendingTroops (t.CurrentCityId, MoveArray, false); }, NewDefPreset : function () { var t = Dashboard; if (t.ExpandDefPreset) return; ById('btDefendPreset').value = 0; /* Initialise Edit fields */ for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; ById('btPresetTroop'+i).value = ""; } ById('btDefPresetName').value = 'Defensive Preset #'+t.NextPresetNumber; t.ExpandDefPreset = true; jQuery('#btNewDefPreset').addClass("disabled"); jQuery('#btChgDefPreset').addClass("disabled"); jQuery('#btDelDefPreset').addClass("disabled"); jQuery('#DefEditPresetRow').removeClass("divHide"); }, ChgDefPreset : function () { var t = Dashboard; if (t.ExpandDefPreset) return; var PN = ById('btDefendPreset'); if (!PN.value || (PN.value == 0) || (PN.value.substr(0,1) == 'T')) {return;} /* Load preset details into edit fields */ for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (Options.DashboardOptions.DefPresets[PN.value][i]) { ById('btPresetTroop'+i).value = Options.DashboardOptions.DefPresets[PN.value][i]; } else { ById('btPresetTroop'+i).value = ""; } } ById('btDefPresetName').value = Options.DashboardOptions.DefPresets[PN.value][0]; t.ExpandDefPreset = true; jQuery('#btNewDefPreset').addClass("disabled"); jQuery('#btChgDefPreset').addClass("disabled"); jQuery('#btDelDefPreset').removeClass("disabled"); jQuery('#DefEditPresetRow').removeClass("divHide"); }, SetCurrentPreset : function () { var t = Dashboard; /* Initialise Edit fields to current values */ for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (Seed.defunits["city" + t.CurrentCityId]['unt'+i] && (!isNaN(Seed.defunits["city" + t.CurrentCityId]['unt'+i])) && (parseIntNan(Seed.defunits["city" + t.CurrentCityId]['unt'+i]) != 0)) { ById('btPresetTroop'+i).value = Seed.defunits["city" + t.CurrentCityId]['unt'+i]; } else { ById('btPresetTroop'+i).value = ""; } } }, SaveDefPreset : function () { var t = Dashboard; var PN = ById('btDefendPreset'); if (PN.value.substr(0,1) == 'T') return; if (!PN.value || (PN.value == 0)) { SavePN = t.NextPresetNumber; } else { SavePN = PN.value; } Options.DashboardOptions.DefPresets[SavePN]={}; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; TroopVal = ById('btPresetTroop'+i).value; if (!isNaN(TroopVal) && (TroopVal != "")) { Options.DashboardOptions.DefPresets[SavePN][i] = TroopVal; } } Options.DashboardOptions.DefPresets[SavePN][0] = ById('btDefPresetName').value; saveOptions(); t.ExpandDefPreset = false; t.InitPresetNumber = SavePN; t.SetCurrentCity(Seed.cities[t.Curr][0],true); }, CancelDefPreset : function () { var t = Dashboard; jQuery('#btNewDefPreset').removeClass("disabled"); var PN = ById('btDefendPreset'); if (PN.value && (PN.value != 0)) { jQuery('#btChgDefPreset').removeClass("disabled"); } jQuery('#DefEditPresetRow').addClass("divHide"); t.ExpandDefPreset = false; }, DelDefPreset : function () { var t = Dashboard; var PN = ById('btDefendPreset'); if (!PN.value || (PN.value == 0) || (PN.value.substr(0,1) == 'T')) return; Options.DashboardOptions.DefPresets[PN.value]={}; delete Options.DashboardOptions.DefPresets[PN.value]; saveOptions(); t.ExpandDefPreset = false; t.SetCurrentCity(Seed.cities[t.Curr][0],true); }, SelectDefPreset : function (sel) { var t = Dashboard; t.CancelDefPreset(); if ((sel.value == 0) || (sel.value == "") || (sel.value.substr(0,1) == 'T')) { jQuery('#btChgDefPreset').addClass("disabled"); return false } else { jQuery('#btChgDefPreset').removeClass("disabled"); } t.InitPresetNumber = sel.value; }, SetPresetDefenders : function (Replace) { var t = Dashboard; t.CancelDefPreset(); var MoveArray = []; var PN = ById('btDefendPreset'); if (!PN.value || (PN.value == 0)) {t.setTroopMessage(''+tx('Please select a defensive preset')+'');return;} jQuery('#btAddPresetButton').addClass("disabled"); jQuery('#btReplacePresetButton').addClass("disabled"); for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (Options.DashboardOptions.DefPresets[PN.value][i]) { MoveArray[i] = Options.DashboardOptions.DefPresets[PN.value][i]; } } t.ChangeDefendingTroops (t.CurrentCityId, MoveArray, Replace); }, StoreDefendingTroops : function (CityId) { var t = Dashboard; t.StoreArray[cityId] = []; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; t.StoreArray[cityId][i] = parseIntNan(Seed.defunits['city' + CityId]['unt'+i]); } }, ResetDefendingTroops : function (CityId) { var t = Dashboard; t.ChangeDefendingTroops (CityId, t.StoreArray[cityId], true); }, SendHome : function (marchId) { var t = Dashboard; t.setReinError(' '); jQuery('#btSendHome'+marchId).addClass("disabled"); ResetHTMLRegister('DASH','btReinforceCell') var march = {}; march = Seed.queue_atkinc['m'+ marchId]; if (!march) { return; } var params = uW.Object.clone(uW.g_ajaxparams); params.mid = marchId; params.cid = march.toCityId; params.fromUid = march.fromPlayerId; params.fromCid = march.fromCityId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/kickoutReinforcements.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok){ var upkeep = 0; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; upkeep += parseInt(march["unit" + i + "Return"]) * parseInt(uW.unitupkeeps[i]) } uW.seed.resources["city"+ march.toCityId].rec1[3] -= upkeep; if (parseInt(march.fromPlayerId) == parseInt(uW.tvuid)) { var mymarch = uW.seed.queue_atkp["city" + march.fromCityId]["m" + marchId]; var marchtime = Math.abs(parseInt(mymarch.destinationUnixTime) - parseInt(mymarch.eventUnixTime)); mymarch.returnUnixTime = unixTime() + marchtime; mymarch.marchStatus = 8; } delete uW.seed.queue_atkinc["m" + marchId]; } else { t.setReinError(rslt.errorMsg); } }, onFailure: function () { t.setReinError('AJAX Error'); }, }); }, setReinError : function (msg) { var t = Dashboard; ById('btReinErr').innerHTML = msg; }, QuickSacrifice : function (tt) { var t = Dashboard; var sel = ById('btRitualTroops'); if (!sel) return; sel.value = tt; t.SelectTroopType(sel); t.StartRitual(true); }, StartRitual : function (QS) { var t = Dashboard; t.setSacError(' '); var unitid = parseInt(ById('btRitualTroops').value); var numUnits = parseInt(ById('btRitualAmount').value); if (!unitid || (unitid == 0)) {t.setSacError(tx('Please select troop type'));return;} if (!numUnits || (numUnits == 0)) {t.setSacError(tx('Please enter a number of troops'));return;} if (numUnits > t.TotalTroops) {t.setSacError(tx('You do not have enough troops'));return;} jQuery('#btStartRitualButton').addClass("disabled"); // see if we need to claw back units from defending units var clawback = uW.seed.units["city" + t.CurrentCityId]['unt'+unitid] - numUnits; if (clawback < 0) { var MoveArray = []; MoveArray[unitid] = clawback; t.ChangeDefendingTroops (t.CurrentCityId, MoveArray, false, function () { t.StartRitual(QS); }); return; } var params = uW.Object.clone(uW.g_ajaxparams); params.cid = t.CurrentCityId; params.type = unitid; params.quant = numUnits; new MyAjaxRequest(uW.g_ajaxpath + "ajax/sacrifice.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { uW.seed.queue_sacr["city" + t.CurrentCityId].push(uWCloneInto(rslt.queue_sacr)); uW.seed.units["city" + t.CurrentCityId] = uWCloneInto(rslt.units); uW.seed.cityData.city[t.CurrentCityId].population = rslt.cityData_city.population; uW.seed.cityData.city[t.CurrentCityId].populationCap = rslt.cityData_city.populationCap; t.setSacError(' '); ById('btRitualTroops').value = 0; ById('btTotalTroops').innerHTML = ""; ById('btMaxTroops').innerHTML = ""; if (!QS) { ById('btRitualAmount').value = ""; ById('btRitualMinutes').value = ""; ById('btRitualSeconds').value = ""; } } else { t.setSacError(rslt.feedback); } jQuery('#btStartRitualButton').removeClass("disabled"); }, onFailure: function () { t.setSacError('AJAX Error'); jQuery('#btStartRitualButton').removeClass("disabled"); } }); }, setSacError : function (msg) { var t = Dashboard; ById('btSacErr').innerHTML = msg; }, StopRitual : function (sacNo, notify){ var t = Dashboard; jQuery('#btStopRitual'+sacNo).addClass("disabled"); ResetHTMLRegister('DASH','btSacrificeCell'); var queue = uW.seed.queue_sacr["city" + t.CurrentCityId][sacNo]; var params = uW.Object.clone(uW.g_ajaxparams); var cityId = t.CurrentCityId; params.cid = cityId; params.type = queue.unitType; params.quant = queue.quantity; params.start = queue.start; params.eta = queue.eta; new MyAjaxRequest(uW.g_ajaxpath + "ajax/cancelSacrificing.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { uW.seed.queue_sacr["city" + t.CurrentCityId].splice(sacNo, 1); if (t.CurrentCityId==cityId) {t.PaintCityInfo(cityId);} } jQuery('#btStopRitual'+sacNo).removeClass("disabled"); }, onFailure: function () { if (notify != null) notify('AJAX Error'); jQuery('#btStopRitual'+sacNo).removeClass("disabled"); }, }); }, SwitchGuardianResult : function(cityId,type,ok,summonFinishTime) { var t = Dashboard; // need to delay 8 seconds before allowing again if (ok) { t.GuardDelay = 8; t.PaintGuardianSelector(); } else { t.GuardDelay = 0; t.PaintGuardianSelector(); t.setGuardMessage(''+tx('Could not change Guardian')+'.'); } }, SwitchGuardian : function (elem) { var t = Dashboard; var type = guardTypes[elem.id.substr(9)-1]; if (type == t.CurrGuardian) { return; } var level = Seed.guardian[Options.DashboardOptions.CurrentCity].cityGuardianLevels[type]; level = level ? level : 0; if (level == 0) { return; } t.GuardDelay = 999; t.setGuardMessage(tx('Sending Request')+'...'); SwitchGuardian(uW.currentcityid,type,t.SwitchGuardianResult); }, SwitchThroneRoom : function (elem) { var t = Dashboard; var NewPreset = parseIntNan(elem.id.substr(6)); if (NewPreset == Seed.throne.activeSlot) { return; } t.ThroneDelay = 999; t.setThroneMessage(tx('Sending Request')+'...'); SwitchThroneRoom(NewPreset,true); }, PaintTRPresets : function () { if (uW.isNewServer()) { return; } var t = Dashboard; var fontratio = Options.MonitorOptions.MonitorFontSize / 11; if (!(ById('btTRWidget')) && !(ById('btTRPresets')) && !(ById('btMonTRPresets')) && !(ById('trpresetopt1'))) { return; } if (t.ThroneDelay > 10) { return; } if ((ById('btTRPresets')) && !Options.DashboardOptions.TRPresetChange) { ById('btTRPresets').innerHTML = ""; } if ((ById('btMonTRPresets')) && !Options.MonitorOptions.MonPresetChange) { ById('btMonTRPresets').innerHTML = ""; } if ((ById('btTRWidget')) && !Options.TRWidget) { ById('btTRWidget').innerHTML = ""; } var m = '
 
'; var n = '
 
'; var o = '
'; if (Options.DashboardOptions.TRPresetByName) { m+=''; } m+=''; } if (Options.MonitorOptions.TRMonPresetByName) { n+=' '; } else { if ((i % permonrow)==1) { n+=''; } n+=''; } if (((i % perrow)==1 && !Options.ThroneHUD) || (Options.ThroneHUD && i==25)) { o+=''; } o+=''; } if (Options.TRFixPresetWidth) { while ((i % perrow)!=1) { if (!Options.DashboardOptions.TRPresetByName) { m+=''; } if (!Options.MonitorOptions.TRMonPresetByName) { n+=''; } o+=''; i++; } } if (Options.DashboardOptions.TRPresetByName) { m+=''; } if (Options.MonitorOptions.TRMonPresetByName) { n+=''; } m += '
'; } if (Options.MonitorOptions.TRMonPresetByName) { n+=''; } var numrows = Math.ceil(Seed.throne.slotNum/16); var perrow = Math.ceil(Seed.throne.slotNum/numrows); var nummonrows = Math.ceil(Seed.throne.slotNum/12); var permonrow = Math.ceil(Seed.throne.slotNum/nummonrows); if (Options.TRFixPresetWidth) { perrow = 8; permonrow = 8; } for (var i=1;i<=Seed.throne.slotNum;i++) { if (Options.DashboardOptions.TRPresetByName) { m+=' '; } else { if ((i % perrow)==1) { m+='
'+i+'
'+i+'
'+i+'
'; n += ''; o += ''; if ((ById('btTRPresets')) && Options.DashboardOptions.TRPresetChange) { ById('btTRPresets').innerHTML = m; ResetFrameSize('btDash',100,t.DashWidth); } if ((ById('btMonTRPresets')) && Options.MonitorOptions.MonPresetChange) { ById('btMonTRPresets').innerHTML = n; ResetFrameSize('btMonitor',Tabs.Monitor.MonHeight,Tabs.Monitor.MonWidth); } if ((ById('btTRWidget')) && Options.TRWidget) { ById('btTRWidget').innerHTML = o; WideScreen.CheckChatPosition(); } if (t.ThroneDelay != 0) { t.setThroneMessage(''+tx('Throne Room changed! Change again in')+' '+t.ThroneDelay+' '+tx('secs')+'...'); } else { t.setThroneMessage(' '); } CurrPreset = Seed.throne.activeSlot; for (var i=1;i<=Seed.throne.slotNum;i++) { if ((ById('btTRPresets')) && Options.DashboardOptions.TRPresetChange) { ById('trlink'+i).addEventListener ('click', function(){t.SwitchThroneRoom(this);},false); ById('trpreset'+i).addEventListener ('mouseover', function(){t.BuildTRPresetStats(this.id.substring(8));},false); } if ((ById('btMonTRPresets')) && Options.MonitorOptions.MonPresetChange) { ById('tmlink'+i).addEventListener ('click', function(){t.SwitchThroneRoom(this);},false); ById('tmpreset'+i).addEventListener ('mouseover', function(){t.BuildTRPresetStats(this.id.substring(8));},false); } if ((ById('btTRWidget')) && Options.TRWidget) { ById('twlink'+i).addEventListener ('click', function(){t.SwitchThroneRoom(this);},false); ById('trwidget'+i).addEventListener ('mouseover', function(){t.BuildTRPresetStats(this.id.substring(8));},false); } if (ById('trpresetopt1')) { ById('trpresetopt'+i).addEventListener ('mouseover', function(){t.BuildTRPresetStats(this.id.substring(11));},false); } if (i==CurrPreset) { if ((ById('btTRPresets')) && Options.DashboardOptions.TRPresetChange) { if (Options.DashboardOptions.TRPresetByName) { jQuery("#trlink"+i).removeClass("brown11").addClass("blue11"); } else { jQuery("#trpreset"+i).removeClass("presetButNon").addClass("presetButSel"); } } if ((ById('btMonTRPresets')) && Options.MonitorOptions.MonPresetChange) { if (Options.MonitorOptions.TRMonPresetByName) { jQuery("#tmlink"+i).removeClass("brown11").addClass("blue11"); } else { jQuery("#tmpreset"+i).removeClass("presetButNon").addClass("presetButSel"); } } if ((ById('btTRWidget')) && Options.TRWidget) { jQuery("#trwidget"+i).removeClass("presetButNon").addClass("presetButSel"); } t.BuildTRPresetStats(i); } } }, BuildTRPresetStats : function (slot){ var t = Dashboard; var StatEffects = GenerateTRPresetStats(slot); var Tiers = GenerateTRPresetTiers(slot); var presetname = (Options.DashboardOptions.TRPresets[slot]?Options.DashboardOptions.TRPresets[slot].name:'Preset '+slot); if (ById('trpresetopt'+slot)) { createToolTip(presetname,ById('trpresetopt'+slot),StatEffects.slice(),Tiers.slice()); } if ((ById('btTRPresets')) && Options.DashboardOptions.TRPresetChange) { createToolTip(presetname,ById('trpresetcell'+slot),StatEffects.slice(),Tiers.slice()); } if ((ById('btMonTRPresets')) && Options.MonitorOptions.MonPresetChange) { createToolTip(presetname,ById('tmpresetcell'+slot),StatEffects.slice(),Tiers.slice()); } if ((ById('btTRWidget')) && Options.TRWidget) { createToolTip(presetname,ById('trwidgetcell'+slot),StatEffects.slice(),Tiers.slice()); } }, setThroneMessage : function (msg) { var t = Dashboard; if (ById('btThroneMsg') && Options.DashboardOptions.TRPresetChange) { ById('btThroneMsg').innerHTML = msg; } if (ById('btMonThroneMsg') && Options.MonitorOptions.MonPresetChange) { ById('btMonThroneMsg').innerHTML = msg; } }, setGuardMessage : function (msg) { var t = Dashboard; if (popDash) {ById('btGuardMsg').innerHTML = msg; } }, setChampMessage : function (msg) { var t = Dashboard; if (popDash && ById('btChampMsg')) {ById('btChampMsg').innerHTML = msg; } }, CancelMarshall : function() { var t = Dashboard; t.ExpandMarshall = false; t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); }, ChangeMarshall : function () { var t = Dashboard; t.ExpandMarshall = true; t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); }, SetMarshall : function () { var t = Dashboard; jQuery('#btSetMarshall').addClass("disabled"); var pos = '13'; var kid = ById('btKnightList').value; if (kid == "") {kid = "0";} var params = uW.Object.clone(uW.g_ajaxparams); params.pos = pos; params.kid = kid; params.cid = uW.currentcityid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/assignknight.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { jQuery('#btSetMarshall').removeClass("disabled"); if (rslt.ok) { if (kid == 0) { uW.seed.leaders["city" + uW.currentcityid].combatKnightId = "0"; } else { uW.seed.leaders["city" + uW.currentcityid].combatKnightId = kid.toString(); t.ExpandMarshall = false; t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); } } }, onFailure : function () { jQuery('#btSetMarshall').removeClass("disabled"); } },true); // noretry }, BoostMarshall : function () { var t = Dashboard; jQuery('#btBoostMarshall').addClass("disabled"); var item = 'i221'; var kid = Seed.leaders["city" + uW.currentcityid].combatKnightId; var params = uW.Object.clone(uW.g_ajaxparams); params.iid = item.substring(1); params.cid = uW.currentcityid; params.kid = kid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/boostKnight.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { jQuery('#btBoostMarshall').removeClass("disabled"); if (rslt.ok) { uW.seed.knights["city" + uW.currentcityid]["knt" + kid].combatBoostExpireUnixtime = rslt.expiration.toString(); uW.seed.items[item] = parseInt(uW.seed.items[item]) - 1; uW.ksoItems[item.substring(1)].subtract(); CM.MixPanelTracker.track("item_use", { 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.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); } }, onFailure : function () { jQuery('#btBoostMarshall').removeClass("disabled"); } },true); // noretry }, CancelChampion : function () { var t = Dashboard; t.ExpandChampion = false; t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); }, ChangeChampion : function () { var t = Dashboard; t.ExpandChampion = true; t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); }, FreeChampion : function (champId,ButtonClick) { var t = Dashboard; t.setChampMessage(tx('Sending Request')+'...'); if (ButtonClick) jQuery('#btFreeChampion').addClass("disabled"); t.AssignChampion(champId, 0); }, SetChampion : function (champId,ButtonClick) { var t = Dashboard; t.setChampMessage(tx('Sending Request')+'...'); if (ButtonClick) jQuery('#btSetChampion'+champId).addClass("disabled"); t.AssignChampion(champId, uW.currentcityid); }, AssignChampionResult : function(rslt) { var t = Dashboard; if (rslt.ok) { t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); } else { t.setChampMessage(tx('Error Assigning Champion')+'!'); } }, AssignChampion : function (champId,cityId) { var t = Dashboard; SwitchChampion(cityId,champId,t.AssignChampionResult); }, PaintChampionSelector : function (cityId) { var t = Dashboard; if (!popDash) { return; } var Curr = Options.DashboardOptions.CurrentCity; var m = ''; var allowclick = true; chkchamp = getCityChampion(cityId); if (chkchamp.championId && chkchamp.status == '10') { allowclick = false; } for (var y in Seed.champion.champions) { chkchamp = Seed.champion.champions[y]; if (chkchamp.championId) { var outlineclass = 'champButNon'; var opacity = '0.6'; var onclick = 'onclick="btSetChampion('+chkchamp.championId+',false)"'; if (chkchamp.assignedCity && chkchamp.assignedCity == cityId) { outlineclass = 'champButSel'; opacity = '1.0'; onclick = 'onclick="btFreeChampion('+chkchamp.championId+',false)"'; if (chkchamp.status == '10') { outlineclass = 'champButMarch'; } } if (chkchamp.status == '10' || !allowclick) { onclick = ''; } m+=''; } } m += '
 
'; return m; }, PaintGuardianSelector : function () { var t = Dashboard; if (!popDash) { return; } if (t.GuardDelay > 10) { return; } var Curr = Options.DashboardOptions.CurrentCity; var y_offset = {wood: " 47% ", ore: " 72.5% ", food: " 59.5% ", stone: " 85% "}; var x_offset = {plate: 20, junior: 134, teenager: 248, adult: 362, adult2: 476, adult3: 590}; var x_by_level = {0: x_offset.plate, 1: x_offset.junior, 2: x_offset.junior, 3: x_offset.junior, 4: x_offset.teenager, 5: x_offset.teenager, 6: x_offset.adult, 7: x_offset.adult, 8: x_offset.adult, 9: x_offset.adult, 10: x_offset.adult2, 11: x_offset.adult3, 12: x_offset.adult3, 13: x_offset.adult3, 14: x_offset.adult3, 15: x_offset.adult3}; var m = ''; for (var i=1;i<=4;i++) { var level = Seed.guardian[Curr].cityGuardianLevels[guardTypes[i-1]]; level = level ? level : ""; m+=''; } m += '
'+level+'
'+uW.g_js_strings.guardian["tooltipSummon_" + guardTypes[i-1]]+'
 
'; ById('btGuardianSelector').innerHTML = m; if (t.GuardDelay != 0) { t.setGuardMessage(''+tx('Guardian changed')+'!
'+tx('Change again in')+' '+t.GuardDelay+' '+tx('secs')+'...
'); } else { t.setGuardMessage(' '); } t.CurrGuardian = Seed.guardian[Curr].type; for (var i=1;i<=4;i++) { /* show correct portion of image */ var level = Seed.guardian[Curr].cityGuardianLevels[guardTypes[i-1]]; level = level ? level : 0; var bg_offset = x_by_level[level]/776*100 + "% " + y_offset[guardTypes[i-1]]; jQuery("#guardimg"+i).css('background-position', bg_offset); if (popDash) { ById('guardlink'+i).addEventListener ('click', function(){t.SwitchGuardian(this);},false); } if ((guardTypes[i-1]==(t.CurrGuardian)) && (Seed.guardian[Curr]['level'] != 0)) { jQuery("#guardimg"+i).removeClass("guardButNon").addClass("guardButSel"); } } }, Recall : function (marchId,cityview) { var t = Dashboard; t.setOutError(' ',cityview); var ajaxtype = 'undefend'; var params = uW.Object.clone(uW.g_ajaxparams); for (var k in out) { if (out[k].marchId == marchId) { params.cid = out[k].marchCityId; if (out[k].marchStatus != 2) { ajaxtype = 'cancelMarch'; } break; } } params.mid = marchId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/"+ajaxtype+".php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok){ var march = uW.seed.queue_atkp["city" + params.cid]["m" + params.mid]; var marchtime = parseInt(march.returnUnixTime) - parseInt(march.destinationUnixTime); var ut = uW.unixtime(); if (Seed.playerEffects.returnExpire > ut) { marchtime *= 0.5 } march.destinationUnixTime = rslt.destinationUnixTime || ut; march.returnUnixTime = Math.floor(rslt.returnUnixTime || ut + marchtime * rslt.returnMultiplier); march.marchStatus = 8; if (ajaxtype == 'cancelMarch') { for (var j in CM.UNIT_TYPES) { j = CM.UNIT_TYPES[j]; Seed.queue_atkp["city" + params.cid]["m" + params.mid]["unit" + j + "Return"] = parseInt(Seed.queue_atkp["city" + params.cid]["m" + params.mid]["unit" + j + "Count"]) } } t.setOutError('March Recalled',cityview); } else { if (rslt.error_code == 253) t.setOutError(uW.g_js_strings.recall.error,cityview); else t.setOutError(tx('Unable to recall march'),cityview); } }, onFailure: function () { t.setOutError(tx('Unable to recall march'),cityview); }, }); }, setOutError : function (msg,cityview) { var t = Dashboard; var elem = ById('btOutErr'); if (cityview) elem = ById('btCityOutErr'); if (elem) elem.innerHTML = msg; }, ShowHideSection : function (div,tf) { var t = Dashboard; var dh = ById(div+'Header'); if (dh) { if (tf && jQuery('#'+div+'Header').hasClass('divHide')) { jQuery('#'+div+'Header').removeClass('divHide'); t.ResizeFrame = true; } if (!tf && !jQuery('#'+div+'Header').hasClass('divHide')) { jQuery('#'+div+'Header').addClass('divHide'); t.ResizeFrame = true;} } }, ShowHideRow : function (div,tf) { var t = Dashboard; var dh = ById(div); if (dh) { if (tf && jQuery('#'+div).hasClass('divHide')) { jQuery('#'+div).removeClass('divHide'); t.ResizeFrame = true; } if (!tf && !jQuery('#'+div).hasClass('divHide')) { jQuery('#'+div).addClass('divHide'); t.ResizeFrame = true; } } }, ForceUpdateSeed : function () { var t = Dashboard; if (uW.g_update_seed_ajax_do && (t.ForceTries < 10)) { // refresh seed is occurring? But we need to make sure this runs, so delay for 1 second and try up to 10 times ... t.ForceTries = t.ForceTries + 1; logit('force update seed - waiting for server to be ready ('+t.ForceTries+')'); setTimeout(function() {t.ForceUpdateSeed();}, 1000); } logit('force update seed - request sent to server'); var retfunc = function () { var t = Dashboard; logit('force update seed - response received from server'); t.PaintCityInfo(Seed.cities[Options.DashboardOptions.CurrentCity][0]); if (Options.DashboardOptions.ReplaceDefendingTroops[Cities.byID[t.AttackedCity].idx]) { t.ResetDefendingTroops(t.AttackedCity); } } uWExportFunction('btretfunc',retfunc); uW.g_update_seed_ajax_force = true; setTimeout(function() {uW.update_seed_ajax(true, uW.btretfunc, false);}, 250); }, ToggleAutoRefresh : function () { var t = Dashboard; Options.DashboardOptions.RefreshSeed = !Options.DashboardOptions.RefreshSeed; if (Options.DashboardOptions.RefreshSeed) { jQuery('#btRefreshSeed').addClass("disabled"); jQuery('#btAutoRefresh').addClass("red14"); jQuery('#btAutoRefresh').removeClass("blue14"); ById('btAutoRefresh').innerHTML = 'Off'; } else { jQuery('#btRefreshSeed').removeClass("disabled"); jQuery('#btAutoRefresh').removeClass("red14"); jQuery('#btAutoRefresh').addClass("blue14"); ById('btAutoRefresh').innerHTML = 'Auto'; } saveOptions(); }, UpdatePresetLabel: function (elem,entry) { var t = Dashboard; if (KeyTimer) { clearTimeout(KeyTimer); } if (!Options.DashboardOptions.TRPresets[entry]) { Options.DashboardOptions.TRPresets[entry] = {};} if (elem.value == "") { elem.value = 'Preset '+entry; } Options.DashboardOptions.TRPresets[entry].name = elem.value; saveOptions(); t.PaintTRPresets(); }, CheckDefaultRitual : function (sel) { sel.value = parseInt(sel.value); if (isNaN(sel.value)) sel.value = 0; var min, sec; if (sel.id == 'btDefaultRitualMinutes') { min = parseIntNan(sel.value); if (isNaN(ById('btDefaultRitualSeconds').value)) sec = 0; else sec = parseIntNan(ById('btDefaultRitualSeconds').value); } if (sel.id == 'btDefaultRitualSeconds') { sec = parseIntNan(sel.value); if (isNaN(ById('btDefaultRitualMinutes').value)) min = 0; else min = parseIntNan(ById('btDefaultRitualMinutes').value); min += (parseIntNan( sec / 60 )); sec = sec % 60; } ById('btDefaultRitualMinutes').value = BlankifZero(min); ById('btDefaultRitualSeconds').value = BlankifZero(sec); Options.DashboardOptions.DefaultSacrificeMin = BlankifZero(min); Options.DashboardOptions.DefaultSacrificeSec = BlankifZero(sec); saveOptions(); }, } /** Might Breakdown Popup **/ function ShowMightBreakdown () { function PlayerCourtCallBack (rslt) { var MightPop = null; var m = ''; if (rslt.playerInfo) { m += ''; m += ''; if (Options.ShowGloryMight) { m += ''; } } else { m += ''; } m += '
'+uW.g_js_strings.commonstr.might+': ' + addCommas(Math.round(rslt.playerInfo.might)) + '
'+tx('Classic Might')+': ' + addCommas(Math.round(rslt.playerInfo.mightClassic)) + '
'+tx('Glory Might')+': ' + addCommas(Math.round(rslt.playerInfo.mightGlory)) + '
'+(rslt.errorMsg||tx('No Data'))+'
' // cities var rownum = 1; m += '
'+tx('CITIES')+'
'; m += '

'; var u = '\ \ \ \ '; var mightarray = [0,0,0,0,0,0,0,0]; var totalarray = [0,0,0,0,0,0,0,0]; for (var i = 1; i <= Cities.numCities; i++) { var cityId = Cities.cities[i-1].id; var afactor = 1; if (Seed.cityData.city[cityId].isPrestigeCity) { var l = Seed.cityData.city[cityId].prestigeInfo.prestigeLevel; if (l > 0) { afactor = Math.pow(CM.PrestigeModel.buildingBoost, l); } } if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } mightarray = [0,0,0,0,0,0,0,0]; for (var y in Seed.buildings['city'+cityId]) { var b = Seed.buildings['city'+cityId][y]; var btype = parseInt(b[0]); var blvl = parseInt(b[1]); var bpos = parseInt(b[2]); var might = 0; if (uW.buildingmight[btype]) { for (var l in uW.buildingmight[btype]) { if (l\ '; for (var t in totalarray) { totalarray[t]+=mightarray[t]; } } u += ''; if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } u += '\ '; u += ''; m += u + '
'+tx('BUILDINGS')+''+tx('TROOPS')+''+tx('TOTAL')+'
'+uW.g_js_strings.commonstr.buildings+''+tx('Fortifications')+''+tx('Def. Tower')+''+tx('Redoubt Tower')+''+tx('Sanctuary')+''+tx('Defending')+''+tx('Marching')+' 
' + Cities.cities[i-1].name.substring(0, 12) + '' + addCommas(mightarray[0]) + '' + addCommas(mightarray[1]) + '' + addCommas(mightarray[2]) + '' + addCommas(mightarray[3]) + '' + addCommas(mightarray[4]) + '' + addCommas(mightarray[5]) + '' + addCommas(mightarray[6]) + '' + addCommas(mightarray[7]) + '
'+tx('TOTAL')+'' + addCommas(totalarray[0]) + '' + addCommas(totalarray[1]) + '' + addCommas(totalarray[2]) + '' + addCommas(totalarray[3]) + '' + addCommas(totalarray[4]) + '' + addCommas(totalarray[5]) + '' + addCommas(totalarray[6]) + '' + addCommas(totalarray[7]) + '

'; //champs var rownum = 1; var champs = {}; mightarray = []; var totalmight = 0; for (var y in Seed.champion.champions) { if (Seed.champion.champions[y].championId) { champs[Seed.champion.champions[y].championId] = y; mightarray.push(0); } } mightarray.push(0); // unassigned mightarray.push(0); // broken for (var z in uW.kocChampionItems) { var item = uW.kocChampionItems[z]; if (!item.quality) item.quality = parseIntNan(item.rarity); item.level = parseIntNan(item.level); var might = CardMight(item,true); if (item.status==1) { if (item.equippedTo && champs[item.equippedTo]) { mightarray[champs[item.equippedTo]] += might; } else { mightarray[mightarray.length-2] += might; // unassigned } } else { mightarray[mightarray.length-1] += might; // broken } totalmight += might; } m += '
'+tx('CHAMPION HALL')+'
'; m += '

'; var u = ''; for (var y in Seed.champion.champions) { if (Seed.champion.champions[y].championId) { var champcity = 'Unassigned'; if (Seed.champion.champions[y].assignedCity && Cities.byID[Seed.champion.champions[y].assignedCity]) { champcity = Cities.byID[Seed.champion.champions[y].assignedCity].name; } u += ''; } } u += ''; for (var y in Seed.champion.champions) { if (Seed.champion.champions[y].championId) { u += ''; } } u += ''; m += u + '
'+Seed.champion.champions[y].name+'
'+champcity+'
'+tx('Unassigned')+''+tx('Broken')+''+tx('Total')+'
'+addCommas(mightarray[y])+''+addCommas(mightarray[mightarray.length-2])+''+addCommas(mightarray[mightarray.length-1])+''+addCommas(totalmight)+'

'; //throne var rownum = 1; var throne = {}; mightarray = []; var totalmight = 0; var numslots = Seed.throne.slotNum; for (var y=1;y<=numslots;y++) { mightarray.push(0); } mightarray.push(0); // unassigned mightarray.push(0); // broken if (matTypeof(Seed.throne.inventory) == 'object') { for (var z in Seed.throne.inventory) { var item = Seed.throne.inventory[z]; var might = CardMight(item); if (item.status==1) { var InPreset = false; for (var y in Seed.throne.slotEquip) { if (Seed.throne.slotEquip[y].indexOf(item.id)!= -1) { InPreset = true; mightarray[y-1] += might; } } if (!InPreset) { mightarray[mightarray.length-2] += might; // unassigned } } else { mightarray[mightarray.length-1] += might; // broken } totalmight += might; } } m += '
'+tx('THRONE ROOM')+'
'; m += '

'; var u = ''; u += ''; u += ''; u += '
'+tx('Unassigned')+''+tx('Broken')+''+tx('Total')+'
'+addCommas(mightarray[mightarray.length-2])+''+addCommas(mightarray[mightarray.length-1])+''+addCommas(totalmight)+'

'; var startslot = 1; var numrow = 6; while (startslot < numslots) { for (var y=startslot;y<=numslots;y++) { if (y>startslot+numrow) { break; } var presetname = (Options.DashboardOptions.TRPresets[y]?Options.DashboardOptions.TRPresets[y].name:'Preset '+y); var active = ''; if (y==Seed.throne.activeSlot) active = '('+tx('Active')+')'; u += ''; } u += ''; for (var y=startslot;y<=numslots;y++) { if (y>startslot+numrow) { startslot = y; break; } u += ''; } u += ''; if (y>=numslots) { startslot=numslots; } else { u += ''; } } m += u + '
'+presetname+'
'+active+'
'+addCommas(mightarray[y-1])+'
 
'; m += '
'+tx('OTHER MIGHT')+'
'; m += '

'; var QM = 0; for (var q in Seed.quests) { if (Seed.quests[q]==1) { var R = uW.questlist[q].reward; if (parseInt(R[3][1]) != 0) { QM += parseInt(R[3][1]); } } } var u = ''; u += '
'+tx('Quest Rewards')+': '+addCommas(QM)+'
'; m += u + '
'; m += '

'+strButton20(tx('Refresh'), 'id=ptmightrefresh')+'
'; var off = getAbsoluteOffsets(ById('btMightPop')); MightPop = new CPopup('btShowMight', off.left, off.top, 600, 500, true); MightPop.getTopDiv().innerHTML = '
'+tx('Might Breakdown')+'
'; MightPop.getMainDiv().innerHTML = m; ById('ptmightrefresh').addEventListener('click',ShowMightBreakdown, false); MightPop.show(true); ResetFrameSize('btShowMight',500,600); } // get court might values from server fetchPlayerCourt(uW.tvuid, PlayerCourtCallBack); } /** Battle Popup **/ var Battle = { userobj : {}, ReqSent : {}, dat : [], playerpos : {x: -999, y: -999}, SearchUID : false, init : function () { var t = Battle; uWExportFunction('ptBatClickSort', Battle.ClickSort); DefaultWindowPos('btBatPos','main_engagement_tabs'); if (GlobalOptions.BattleToggle) { AddPowerBarLink(tx('Battle'), 'PBPBatButton', Battle.ToggleBattle,function(me) {ResetWindowPos (me,'main_engagement_tabs',popBat);}); } }, ToggleBattle : function () { var t = Battle; if (popBat) { popBat.toggleHide(popBat) } else { var initvalue = Options.MonitorOptions.LastMonitored; if (t.SearchUID) { initvalue = Options.MonitorOptions.LastMonitoredUID; if (initvalue==0) { initvalue = ""; } } m = '
'; m += '
'+tx('Enemy')+':  '+tx('Search UID')+'
'; m += '
 
'; if (!uW.isNewServer()) { m += ''+tx('Monitor')+' '; } m += ''+tx('Details')+' '; if (!uW.isNewServer()) { m += ''+tx('Champions')+'
 
'; } popBat = new CPopup('btBattle', Options.btBatPos.x, Options.btBatPos.y, 420, 100, true, Battle.close); popBat.getMainDiv().innerHTML = m; popBat.getTopDiv().innerHTML = '
   '+tx('Battle')+'
'; ById('btBatUID').addEventListener('change', function() { t.SearchUID = (ById('btBatUID').checked); }); if (!uW.isNewServer()) { ById('btBatMonitor').addEventListener('click', function(){ t.BattleClick(1); },false); ById('btBatChamp').addEventListener('click', function(){ t.BattleClick(2); },false); } ById('btBatDetails').addEventListener('click', function(){ t.BattleClick(3); },false); popBat.show(true); ResetFrameSize('btBattle',100,420); } }, close : function () { Options.btBatPos = popBat.getLocation(); saveOptions(); popBat=null; }, setError : function (msg) { ById('btBatPlayErr').innerHTML = msg; }, BattleClick : function (funtype) { var t = Battle; t.setError(' '); var name = ById('btBatPlayer').value; name = name.replace(/\'/g,"_").replace(/\,/g,"_").replace(/\-/g,"_"); if (name.toUpperCase() == Seed.player.name.toUpperCase()) { if (funtype==1) { Tabs.Monitor.initMonitor (uW.tvuid, false) } if (funtype==2) { Tabs.Player.ViewChamps (uW.tvuid, Seed.player.name, popBat.getMainDiv()) } if (funtype==3) { t.fetchPlayerInfo(uW.tvuid,t.clickedPlayerDetails); } return; } if (t.SearchUID) { if (funtype==1) { Tabs.Monitor.initMonitor (name, false); } if (funtype==2) { t.getPlayerName(name, Tabs.Player.ViewChamps, popBat.getMainDiv()); } if (funtype==3) { t.fetchPlayerInfo(name,t.clickedPlayerDetails); } return; } if (getMyAlliance()[0] == 0) { t.setError(uW.g_js_strings.membersInfo.youmustbelong); return; } if (name.length < 3){ setError(uW.g_js_strings.getAllianceSearchResults.entryatleast3); return; } // Get User details.. need to use alliance search to get UserID from name if (funtype==1) { fetchPlayerList(name, t.eventMatchNameMonitor); } if (funtype==2) { fetchPlayerList(name, t.eventMatchNameChamp); } if (funtype==3) { fetchPlayerList(name, t.eventMatchNameDetails); } }, eventMatchNameMonitor : function (rslt){ var t = Battle; if (!rslt.ok){ t.setError(rslt.msg); return; } var matchname = ById('btBatPlayer').value; var uid = ""; for (var k in rslt.matchedUsers) { if (rslt.matchedUsers[k].name.toUpperCase() == matchname.toUpperCase()) {uid = rslt.matchedUsers[k].userId;} } if (uid==""){ t.setError(tx('User not found')+'!'); return; } Tabs.Monitor.initMonitor (uid, false); }, eventMatchNameChamp : function (rslt){ var t = Battle; if (!rslt.ok){ t.setError(rslt.msg); return; } var matchname = ById('btBatPlayer').value; var uid = ""; var name = ""; for (var k in rslt.matchedUsers) { if (rslt.matchedUsers[k].name.toUpperCase() == matchname.toUpperCase()) { uid = rslt.matchedUsers[k].userId; name = rslt.matchedUsers[k].name; } } if (uid==""){ t.setError(tx('User not found')+'!'); return; } Tabs.Player.ViewChamps (uid, name, popBat.getMainDiv()); }, eventMatchNameDetails : function (rslt){ var t = Battle; if (!rslt.ok){ t.setError(rslt.msg); return; } var matchname = ById('btBatPlayer').value; var uid = ""; for (var k in rslt.matchedUsers) { if (rslt.matchedUsers[k].name.toUpperCase() == matchname.toUpperCase()) { uid = rslt.matchedUsers[k].userId; } } if (uid==""){ t.setError(tx('User not found')+'!'); return; } t.fetchPlayerInfo(uid,t.clickedPlayerDetails); }, getPlayerName : function (uid, notify){ var t = Battle; var params = uW.Object.clone(uW.g_ajaxparams); params.uid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rsltInfo) { if (!rsltInfo.ok) { t.setError('Unknown UID'); return; } notify(uid,rsltInfo.userInfo[0].name); }, onFailure: function () { t.setError ('AJAX error (server not responding)'); }, },true); }, fetchPlayerInfo : function (uid, notify){ var t = Battle; if (t.popPlayer) { t.popPlayer.show(false); if (t.popPlayer.onClose) t.popPlayer.onClose(); t.popPlayer.destroy(); t.popPlayer = null; } t.popPlayer = new CPopup('btPlayerPop', t.playerpos.x, t.playerpos.y, 500, 100, true, function () { t.playerpos = t.popPlayer.getLocation(); clearTimeout(1000); }); if ((t.playerpos.x == -999) && (t.playerpos.y == -999)) { if (popBat) { t.popPlayer.centerMe(popBat.getMainDiv()); } else { t.popPlayer.centerMe(mainPop.getMainDiv()); } } t.popPlayer.getMainDiv().innerHTML = '
'+tx('Loading')+'...
'; t.popPlayer.getTopDiv().innerHTML = '
  '+tx('Player Details')+'  
'; t.popPlayer.show(true); ResetFrameSize('btPlayerPop',100,500); var uList = []; uList.push(uid); getOnline(uList, function (r) { if (!r.ok) { t.setError(rslt.errorMsg);return; } else { notify(uid,r.data[uid]);} }); }, clickedPlayerDetails : function (uid,online) { var t = Battle; var params = uW.Object.clone(uW.g_ajaxparams); params.uid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { t.userobj = {}; t.userobj[uid] = rslt.userInfo[0]; t.userobj[uid].might = Math.round(t.userobj[uid].might); t.userobj[uid].online = (online?true:false); fetchPlayerCourt(uid, function (rslt2) { if (rslt2.ok) { u = unixTime(); f = convertTime(new Date(rslt2.playerInfo.fogExpireTimestamp.replace(" ","T")+"Z")); t.userobj[uid].misted = (f >= u); t.userobj[uid].fogExpireTimestamp = rslt2.playerInfo.fogExpireTimestamp; t.userobj[uid].warStatus = rslt2.playerInfo.warStatus; t.userobj[uid].truceExpireTimestamp = rslt2.playerInfo.truceExpireTimestamp; t.userobj[uid].cityCount = rslt2.playerInfo.cityCount; t.userobj[uid].mightClassic = rslt2.playerInfo.mightClassic; t.userobj[uid].mightGlory = rslt2.playerInfo.mightGlory; t.userobj[uid].fbuid = parseInt(rslt2.playerInfo.fbuid); t.userobj[uid].lastLogin = rslt2.playerInfo.lastLogin; t.fetchPlayerLeaderboard(uid, function (r) { t.gotPlayerLeaderboard(r, uid) }); } else { t.setError(uW.g_js_strings.barbarian.erroroccured); } }); } else { t.setError(uW.g_js_strings.barbarian.erroroccured); } }, onFailure: function () {t.setError(uW.g_js_strings.errorcode.err_602);}, }); }, fetchPlayerLeaderboard: function (uid, notify) { var t = Battle; var params = uW.Object.clone(uW.g_ajaxparams); params.userId = uid; params.type = "might"; params.page = 1; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserLeaderboard.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({errorMsg: 'AJAX error'});}, }); }, gotPlayerLeaderboard : function (rslt,uid) { var t = Battle; if (!rslt.ok) { t.setError(rslt.errorMsg); return; } t.dat = []; var prestige = ""; var aid = getMyAlliance()[0]; if (rslt.totalResults == 0) { t.displayPlayer(uid,false); return; } var p = rslt.results[0]; for (var c = 0; c < p.cities.length; c++) { var pt = p.cities[c].prestigeType; var prestige = getFactionName(pt); if (prestige == "") { prestigelvl = ""; } else { prestigelvl = " (" + p.cities[c].prestigeLevel + ")"; } ExpTime = convertTime(new Date(p.cities[c].prestigeBuffExpire.replace(" ", "T")+"Z")); if ((ExpTime + (3600 * 24) < unixTime()) || isNaN(ExpTime)) { prestigeexp = ""; } else { prestigeexp = Tabs.Player.getDuration(p.cities[c].prestigeBuffExpire); } t.dat.push([p.displayName, parseInt(p.might), p.officerType, parseInt(p.numCities), parseInt(p.cities[c].tileLevel), parseInt(p.cities[c].xCoord), parseInt(p.cities[c].yCoord), p.cities[c].cityName, 0, t.userobj[uid].online, '--', p.cities[c].cityId, prestige, p.userId, prestigelvl, prestigeexp, p.cities[c].prestigeBuffExpire, prestige + prestigelvl, p.cities[c].blessing,false]); } t.displayPlayer(uid,true); }, displayPlayer: function (uid,locations) { var t = Battle; var u = t.userobj[uid]; var n = '
'; n += '
'; if (u.allianceId && u.allianceId != 0) { n += ''; } else { n += ''; } if (!u.online) { n += ' '; } else { n += ' '; } if (u.misted) n += ''; n += ''; n += ''; n += ''; if (Options.ShowGloryMight) { n += ''; } n += ''; n += ''; n += ''; var pids = u.provinceIds.split(','); var p = []; for (var i = 0; i < pids.length; i++) { p.push(uW.provincenames['p' + pids[i]]); } n += ''; // create notes link var notes = ""; if (Tabs.Notes && Tabs.Notes.noteValues[uid]) { notes = Tabs.Notes.noteValues[uid]; notes = notes.text; } if (notes != "") { n += ''; } n += '
'+uW.g_js_strings.commonstr.alliance+': ' + u.allianceName + FormatDiplomacy(u.allianceId) + '
'+uW.g_js_strings.commonstr.alliance+': '+uW.g_js_strings.commonstr.none+'!
'+uW.g_js_strings.modal_messages_viewreports_view.lastlogin+': '+ Tabs.Player.getLastLogDuration(u.lastLogin) +'
'+tx('Last login')+': '+tx('ONLINE')+'
'+tx('Misted')+': ' + Tabs.Monitor.getDuration(u.fogExpireTimestamp) + '
'+uW.g_js_strings.commonstr.status+': ' + Tabs.Monitor.GetStatusText(u.warStatus,u.truceExpireTimestamp) + '
'+uW.g_js_strings.commonstr.might+': ' + addCommas(Math.round(u.might)) + '
'+tx('Classic Might')+': ' + addCommas(Math.round(u.mightClassic)) + '
'+tx('Glory Might')+': ' + addCommas(Math.round(u.mightGlory)) + '
'+uW.g_js_strings.commonstr.glory+': 
 
'+tx('Maximum Glory')+': 
'+tx('Lifetime Glory')+': 
'+tx('Provinces')+': 
'+p.join(', ')+'
'+tx('Player Notes')+':
' + notes + '
'; n += ''; n+= '
'; if (!locations) { n += ''; } else { n += ''; } n += '
'+tx('City locations unavailable')+'
'+tx('City Locations')+'
'; if (locations) { n += ''; } n += '

'; t.popPlayer.getMainDiv().innerHTML = n; if (locations) { ById('BatCitySelect').style.display='block'; if (ById('clickBat' + Options.PlayerOptions.sortColNum)) { ById('clickBat' + Options.PlayerOptions.sortColNum).className = 'buttonv2 std green'; } ById('BatToggleScoutCheckbox').addEventListener('change', t.doSelectall, false); t.RepaintList(); } t.PaintGlory(uid); if (ById('BatScoutExport')) ById('BatScoutExport').addEventListener('click', t.ExportScoutList, false); if (ById('BatBulkAttackExport')) ById('BatBulkAttackExport').addEventListener('click', t.ExportAttackList, false); ById('BatHighDefenders').addEventListener('click', t.HighlightDefenders, false); t.popPlayer.getTopDiv().innerHTML = '
  '+u.name+' ('+uid+')  
'; t.popPlayer.show(true); ResetFrameSize('btPlayerPop',100,500); }, ClickSort : function (e) { var t = Battle; var newColNum = e.id.substr(8); if (ById('clickBat' + Options.PlayerOptions.sortColNum)) ById('clickBat' + Options.PlayerOptions.sortColNum).className = 'buttonv2 std blue'; e.className = 'buttonv2 std green'; if (newColNum == Options.PlayerOptions.sortColNum) { Options.PlayerOptions.sortDir *= -1; } else { Options.PlayerOptions.sortColNum = newColNum; } saveOptions(); t.RepaintList(); }, PaintGlory: function (uid) { var t = Battle; var params = uW.Object.clone(uW.g_ajaxparams); params.userId = uid; params.ctrl = 'PlayerProfile'; params.action = 'get'; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { ById('ptBatPaintGlory').innerHTML = addCommas(rslt.profile.glory); ById('ptBatPaintMaxGlory').innerHTML = addCommas(rslt.profile.maxGlory); ById('ptBatPaintLifetimeGlory').innerHTML = addCommas(parseIntNan(rslt.profile.lifetimeGlory)); ById('ptBatGloryIcon').innerHTML = ''; } else { ById('ptBatPaintGlory').innerHTML = '(error)'; ById('ptBatPaintMaxGlory').innerHTML = '(error)'; ById('ptBatPaintLifetimeGlory').innerHTML = '(error)'; ById('ptBatGloryIcon').innerHTML = ' '; } }, },true); }, doSelectall: function () { var t = Battle; var city = ""; for (var k = 0; k < t.dat.length; k++) { city = t.dat[k][11].toString(); if (ById('BatToggleScoutCheckbox').checked) ById('ptBatScout_' + city).checked = true; else ById('ptBatScout_' + city).checked = false; } }, RepaintList: function () { var t = Battle; function sortFunc(a, b) { var t = Battle; if (typeof (a[Options.PlayerOptions.sortColNum]) == 'number') { if (Options.PlayerOptions.sortDir > 0) return a[Options.PlayerOptions.sortColNum] - b[Options.PlayerOptions.sortColNum]; else return b[Options.PlayerOptions.sortColNum] - a[Options.PlayerOptions.sortColNum]; } else if (typeof (a[Options.PlayerOptions.sortColNum]) == 'boolean') { return 0; } else { if (Options.PlayerOptions.sortDir > 0) return a[Options.PlayerOptions.sortColNum].localeCompare(b[Options.PlayerOptions.sortColNum]); else return b[Options.PlayerOptions.sortColNum].localeCompare(a[Options.PlayerOptions.sortColNum]); } } t.dat.sort(sortFunc); var m = ''; var RowId = ""; var r = 0; for (var i = 0; i < t.dat.length; i++) { RowId = 'bat_'+t.dat[i][5].toString()+'_'+t.dat[i][6].toString(); var bless = showBlessings(t.dat[i][18]); if (bless != "") { var bless = ''+bless+'
'; } var status = ''; if (t.dat[i][9] == 1) status = ''; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } if (t.dat[i][19]) rowClass += ' highRow'; m += ''+t.dat[i][7]+''; m += ''+t.dat[i][4]+''; m += ''+bless+t.dat[i][12]+t.dat[i][14]+''; m += ''+t.dat[i][15]+''; m += ''; m += ''+t.dat[i][5]+','+t.dat[i][6]+''; } if (ById('BatBody')) { ById('BatBody').innerHTML = m; ResetFrameSize('btPlayerPop',100,400); } }, ExportScoutList : function () { var t = Battle; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkScout.ImportCoords(coordlist.split(" ")); } }, ExportAttackList : function () { var t = Battle; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkAttack.ImportCoords(coordlist.split(" ")); } }, getSelected : function () { var t = Battle; var coordlist = ""; var city = ""; for (var k = 0; k < t.dat.length; k++) { city = t.dat[k][11].toString(); if (ById('ptBatScout_' + city).checked) { coordlist += t.dat[k][5].toString()+','+t.dat[k][6].toString()+' '; ById('ptBatScout_' + city).checked = false; } } return coordlist; }, HighlightDefenders : function () { var t = Battle; var delayer = 0; ById('BatHighDefenders').outerHTML = ' '; for (var k = 0; k < t.dat.length; k++) { if (!t.ReqSent[t.dat[k][5]+'_'+t.dat[k][6]] || t.ReqSent[t.dat[k][5]+'_'+t.dat[k][6]]==0) { t.ReqSent[t.dat[k][5]+'_'+t.dat[k][6]]=1; setTimeout(getDefendStatus,(250*delayer),t.dat[k][5],t.dat[k][6],false,false,t.UpdateDefendStatus,k,t.dat.length,'BatHighDefendersProg'); delayer = delayer + 1; } } function ClearAtEnd () { if (ById('BatHighDefendersProg')) { ById('BatHighDefendersProg').outerHTML = strButton20(tx('Highlight Defending Cities'),'id=BatHighDefenders'); ById('BatHighDefenders').addEventListener('click', t.HighlightDefenders, false); } }; setTimeout (ClearAtEnd,(250*delayer)); }, UpdateDefendStatus : function (rslt,x,y,k) { var t = Battle; t.ReqSent[x+'_'+y]=0; var div = ById('bat_'+x+'_'+y); var city = t.dat[k][11].toString(); if (rslt.ok && rslt.ok=="true") { t.dat[k][19] = true; if (div) jQuery(div).addClass("highRow"); if (ById('ptBatScout_' + city)) ById('ptBatScout_' + city).checked = true; } else { t.dat[k][19] = false; if (div) jQuery(div).removeClass("highRow"); if (ById('ptBatScout_' + city)) ById('ptBatScout_' + city).checked = false; } }, } /** Incoming Marches Popup **/ var Incoming = { Options : { IncomingStartState : false, IncAttack : true, IncScout : true, IncReinforce : true, IncReassign : false, IncTransport : false, IncWilds : false, IncYours : false, IncResources : true, }, init : function () { var t = Incoming; DefaultWindowPos('btIncPos','main_engagement_tabs'); if (GlobalOptions.InOutToggle) { AddPowerBarLink(tx('Incoming'), 'PBPIncButton', Incoming.ToggleIncoming,function(me) {ResetWindowPos (me,'main_engagement_tabs',popInc);}); } HTMLRegister['INC']= {}; if (!Options.IncomingOptions) { Options.IncomingOptions = t.Options; } else { for (var y in t.Options) { if (!Options.IncomingOptions.hasOwnProperty(y)) { Options.IncomingOptions[y] = t.Options[y]; } } } if (Options.IncomingOptions.IncomingStartState) {t.ToggleIncoming();} }, ToggleIncoming : function () { var t = Incoming; ResetHTMLRegister('INC','btIncomingMain'); if (popInc) { Options.IncomingOptions.IncomingStartState = popInc.toggleHide(popInc) } else { m = '
'; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
'+uW.g_js_strings.commonstr.attack+''+uW.g_js_strings.commonstr.scout+''+uW.g_js_strings.commonstr.reinforce+''+uW.g_js_strings.commonstr.reassign+''+uW.g_js_strings.commonstr.transport+''+tx('To Wilds')+''+tx('From You')+''+uW.g_js_strings.commonstr.resources+'

'; popInc = new CPopup('btIncoming', Options.btIncPos.x, Options.btIncPos.y, 720, 200, true, Incoming.close); popInc.getMainDiv().innerHTML = m; popInc.getTopDiv().innerHTML = '
   '+tx('Incoming Marches')+'
'; ToggleOption('IncomingOptions','IncAttackChk','IncAttack'); ToggleOption('IncomingOptions','IncScoutChk','IncScout'); ToggleOption('IncomingOptions','IncReinforceChk','IncReinforce'); ToggleOption('IncomingOptions','IncReassignChk','IncReassign'); ToggleOption('IncomingOptions','IncTransportChk','IncTransport'); ToggleOption('IncomingOptions','IncWildsChk','IncWilds'); ToggleOption('IncomingOptions','IncYoursChk','IncYours'); ToggleOption('IncomingOptions','IncResChk','IncResources'); popInc.show(true); Options.IncomingOptions.IncomingStartState = true; } saveOptions(); }, close : function () { Options.IncomingOptions.IncomingStartState = false; Options.btIncPos = popInc.getLocation(); saveOptions(); popInc=null; }, PaintIncoming : function () { var t = Incoming; var z = ''; var r = 0; var incomingshow = false; var incomingfiltered = false; var inctimes = {}; var bclass = "brown11"; if (RefreshingSeed || Options.DashboardOptions.RefreshSeed) bclass += " disabled"; var z = '
'; z += ''; for(n in inc) { var a = inc[n]; var icon, hint, marchtime, targetcity, targetcoords, fromname, marchdir, fromcoords; var marchScore = parseInt(a.score); var marchType = parseInt(a.marchType); var marchStatus = parseInt(a.marchStatus); var marchMight = 0; var to = Cities.byID[a.toCityId]; if (to) { if ( to.tileId == a.toTileId ) {targetcity = CityLink(to);targetcoords = "";} else {targetcity = uW.g_js_strings.commonstr.wilderness;targetcoords = coordLink(a.toXCoord,a.toYCoord);} } else { targetcity = "";targetcoords = coordLink(a.toXCoord,a.toYCoord); } fromname = ""; if (a.score) { if (a.arrivalTime < unixTime()) continue; // don't display arrival times already happened var marchId = a.mid; var pid = a.pid; if (!a.marchType) {a.marchType = 4;} if (!a.arrivalTime || a.arrivalTime == -1) {marchtime = '??????';} else {marchtime=uW.timestr(a.arrivalTime - unixTime());} if (a.players && a.players['u'+a.pid]) {fromname = a.players['u'+a.pid].n;} else if (Seed.players['u'+a.pid]) {fromname = Seed.players['u'+a.pid].n;} } else { var marchId = a.marchId; var pid = a.fromPlayerId; if ((a.arrivalTime - unixTime()) < 0) continue; marchtime=uW.timestr(a.arrivalTime - unixTime()); player = Seed.players['u'+a.fromPlayerId]; if (Seed.players['u'+a.fromPlayerId]) {fromname = Seed.players['u'+a.fromPlayerId].n;} else if (a.players && a.players['u'+a.fromPlayerId]) {fromname = a.players['u'+a.fromPlayerId].n;} } inctimes[marchId] = marchtime; if (!a.fromXCoord) {fromcoords = "";} else {fromcoords = coordLink(a.fromXCoord,a.fromYCoord);} if (fromname.toUpperCase() == Seed.player.name.toUpperCase()) { fromname = tx('Yourself'); var fr = Cities.byID[a.fromCityId]; fromcoords = ' ('+CityLink(fr)+')'; } else { if (fromname == "") { if (a.score) {fromname = '('+uW.g_js_strings.attack_viewimpending_view.upgradetoseeinfo+')';} else {fromname = '('+tx('Unknown')+')';}} else {fromname = MonitorLink(pid,fromname);} } icon = ""; switch (marchType) { case 1: icon=TransportImage;hint=uW.g_js_strings.commonstr.transport;break; case 2: icon=ReinforceImage;hint=uW.g_js_strings.commonstr.reinforce;break; case 3: icon=ScoutImage;hint=uW.g_js_strings.commonstr.scout;break; case 4: icon=AttackImage;hint=uW.g_js_strings.commonstr.attack;break; case 5: icon=ReassignImage;hint=uW.g_js_strings.commonstr.reassign;break; } if(icon=="")continue; // tampermonkey fix incomingfiltered = true; /* Apply Filters */ if ((marchType == 1) && !Options.IncomingOptions.IncTransport) continue; if ((marchType == 2) && !Options.IncomingOptions.IncReinforce) continue; if ((marchType == 5) && !Options.IncomingOptions.IncReassign) continue; if ((marchType == 3) && !Options.IncomingOptions.IncScout) continue; if (((marchType == 4) || (!marchType && marchScore)) && !Options.IncomingOptions.IncAttack) continue; if ((targetcity == "Wilderness") && !Options.IncomingOptions.IncWilds) continue; if ((fromname == "Yourself") && !Options.IncomingOptions.IncYours) continue; incomingshow = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ''; z += ''; z += ''; if (a.destinationUnixTime < unixTime() || marchStatus == 8) marchdir = "Return"; else marchdir = "Count"; var zz = ''; if (marchType == 3 || marchType == 4){ if ((safecall.indexOf(a.pid) < 0 || trusted) && a["championInfo"]) { marchchamp = "
 '+uW.g_js_strings.commonstr.time+''+uW.g_js_strings.commonstr.target+''+tx('From')+''+uW.g_js_strings.commonstr.troops+''+tx('Refresh')+'
 '; if (targetcity != "") z += ''+targetcity+' '; if (targetcoords != "") z += ''+targetcoords+''; z += ''+fromname+' '; if (fromcoords != "") { z+= ''+fromcoords+''; } z += '
"; var gotchamp = false; if (a["championInfo"].effects[1] && !(a["championInfo"].effects[1] instanceof Array) && typeof(a["championInfo"].effects[1]) === "object") { got202 = false; for (var cy in a["championInfo"].effects[1]) { // missing bonus damage? if ((cy == '202') && gotchamp) {got202 = true;} if ((cy == '203') && !got202) { marchchamp += ""; } str = uW.g_js_strings.effects['name_'+cy]; if (str && str!= "") { gotchamp = true; marchchamp += ""; } else { break; } } } if (!gotchamp) { marchchamp += ''; } marchchamp+=""; var gottroop = false; if (a["championInfo"].effects[2] && !(a["championInfo"].effects[2] instanceof Array) && typeof(a["championInfo"].effects[2]) === "object") { for (var ty in a["championInfo"].effects[2]) { str = uW.g_js_strings.effects['name_'+ty]; if (str && str!= "") { gottroop = true; marchchamp += ""; } else { break; } } } if (!gottroop) { marchchamp += ''; } marchchamp+="
"+a["championInfo"].name+"
"+uW.g_js_strings.report_view.champion_stats+"
"+uW.g_js_strings.effects.name_202+"0
"+str+""+a["championInfo"].effects[1][cy]+"
'+tx('None Available')+'
"+uW.g_js_strings.report_view.troop_stats+"
"+str+""+a["championInfo"].effects[2][ty]+"
'+tx('None Available')+'
"; zz +='
'+tx('Champion')+': '+a["championInfo"].name+' 
'; } if (a["knt"] && a["knt"]["cbt"]) zz +=''+uW.g_js_strings.commonstr.knight+' (Atk:'+ a["knt"]["cbt"]+') '; if (a["unts"]) { for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (a["unts"]["u"+i]) { if (a["unts"]["u"+i] > 0) { zz += ''+ uW.unitcost['unt'+i][0] +': '+ addCommas(a["unts"]["u"+i])+' '; marchMight += (a["unts"]["u"+i]*parseInt(uW.unitmight["unt"+i])); } else { zz += ''+ a["unts"]["u"+i]+' '+ uW.unitcost['unt'+i][0] +' '; } } } } else { if (a["cnt"]) { zz += ''+a["cnt"]+' ';} else { zz += '('+uW.g_js_strings.attack_viewimpending_view.upgradetoseeinfo+') '; } } } else { if (a["knightId"] > 0) zz +=''+uW.g_js_strings.commonstr.knight+' (Atk:'+ a["knightCombat"]+') '; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if(a["unit"+i+marchdir] > 0) { zz += ''+ uW.unitcost['unt'+i][0] +': '+ addCommas(a["unit"+i+marchdir])+' '; marchMight += (a["unit"+i+marchdir]*parseInt(uW.unitmight["unt"+i])); } } } if (local_atkinc["m"+marchId]["fromSpellType"]) { var spell = uW.g_js_strings.spells['name_'+local_atkinc["m"+marchId]["fromSpellType"]]; if (spell) { var spellstyle = 'color:#808;'; zz +='
* '+spell+' *' } } if (Options.IncomingOptions.IncResources) { if ((a["gold"] > 0) || (a["resource1"] > 0) || (a["resource2"] > 0) || (a["resource3"] > 0) || (a["resource4"] > 0) || (local_atkinc["m"+marchId]["resource5"] > 0)) { zz+="
"; } if (a["gold"] > 0) zz += ''+ResourceImage(GoldImage,uW.g_js_strings.commonstr.gold) + addCommas(a["gold"]) +' '; if (a["resource1"] > 0) zz += ''+ResourceImage(FoodImage,uW.g_js_strings.commonstr.food) + addCommas(a["resource1"]) +' '; if (a["resource2"] > 0) zz += ''+ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood) + addCommas(a["resource2"]) +' '; if (a["resource3"] > 0) zz += ''+ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone) + addCommas(a["resource3"]) +' '; if (a["resource4"] > 0) zz += ''+ResourceImage(OreImage,uW.g_js_strings.commonstr.ore) + addCommas(a["resource4"]) +' '; if (local_atkinc["m"+marchId]["resource5"] > 0) zz += ''+ResourceImage(AetherImage,uW.g_js_strings.commonstr.aetherstone) + addCommas(local_atkinc["m"+marchId]["resource5"]) +' '; } z += ''; } if (!incomingshow) { if (!incomingfiltered) z += '


'+tx('No incoming marches')+'
'; else z += '


'+tx('No incoming marches matching search parameters')+'
'; } z += '

'; if (CheckForHTMLChange('INC','btIncomingMain',z)) { if (Options.DashboardOptions.RefreshSeed) jQuery('#btRefreshSeedInc').addClass("disabled"); else ById('btRefreshSeedInc').addEventListener ('click', function() {setTimeout(function() {RefreshSeed();},250);}, false); ResetFrameSize('btIncoming',200,720); } for (var m in inctimes) { mt = inctimes[m]; if (ById('marchtime'+m)) { ById('marchtime'+m).innerHTML = mt; } } }, EverySecond : function () { var t = Incoming; try { if (((SecondLooper % Dashboard.GeneralInterval) == 1) || Dashboard.GeneralInterval == 1) { t.PaintIncoming(); } } catch (err) { logerr(err); // write to log } }, } /** Outgoing Marches Popup **/ var Outgoing = { Options : { OutgoingStartState : false, OutAttack : true, OutScout : true, OutReinforce : true, OutReassign : false, OutTransport : false, OutYours : false, OutReturning : false, OutResources : false, }, init : function () { var t = Outgoing; DefaultWindowPos('btOutPos','main_engagement_tabs'); if (GlobalOptions.InOutToggle) { AddPowerBarLink(tx('Outgoing'), 'PBPOutButton', Outgoing.ToggleOutgoing,function(me) {ResetWindowPos (me,'main_engagement_tabs',popOut);}); } HTMLRegister['OUT']= {}; if (!Options.OutgoingOptions) { Options.OutgoingOptions = t.Options; } else { for (var y in t.Options) { if (!Options.OutgoingOptions.hasOwnProperty(y)) { Options.OutgoingOptions[y] = t.Options[y]; } } } if (Options.OutgoingOptions.OutgoingStartState) {t.ToggleOutgoing();} }, ToggleOutgoing : function () { var t = Outgoing; ResetHTMLRegister('OUT','btOutgoingMain'); if (popOut) { Options.OutgoingOptions.OutgoingStartState = popOut.toggleHide(popOut) } else { m = '
'; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
'+uW.g_js_strings.commonstr.attack+''+uW.g_js_strings.commonstr.scout+''+uW.g_js_strings.commonstr.reinforce+''+uW.g_js_strings.commonstr.reassign+''+uW.g_js_strings.commonstr.transport+''+uW.g_js_strings.commonstr.returning+''+tx('To You')+''+uW.g_js_strings.commonstr.resources+'

'; popOut = new CPopup('btOutgoing', Options.btOutPos.x, Options.btOutPos.y, 720, 200, true, Outgoing.close); popOut.getMainDiv().innerHTML = m; popOut.getTopDiv().innerHTML = '
   '+tx('Outgoing Marches')+'
'; ToggleOption('OutgoingOptions','OutAttackChk','OutAttack'); ToggleOption('OutgoingOptions','OutScoutChk','OutScout'); ToggleOption('OutgoingOptions','OutReinforceChk','OutReinforce'); ToggleOption('OutgoingOptions','OutReassignChk','OutReassign'); ToggleOption('OutgoingOptions','OutTransportChk','OutTransport'); ToggleOption('OutgoingOptions','OutReturningChk','OutReturning'); ToggleOption('OutgoingOptions','OutYoursChk','OutYours'); ToggleOption('OutgoingOptions','OutResChk','OutResources'); popOut.show(true); Options.OutgoingOptions.OutgoingStartState = true; } saveOptions(); }, close : function () { Options.OutgoingOptions.OutgoingStartState = false; Options.btOutPos = popOut.getLocation(); saveOptions(); popOut=null; }, PaintOutgoing : function () { var t = Outgoing; var z = ''; var r = 0; var outgoingshow = false; var outgoingfiltered = false; var outtimes = {}; var bclass = "brown11"; if (RefreshingSeed || Options.DashboardOptions.RefreshSeed) bclass += " disabled"; var z = '
'; for(n in out) { var a = out[n]; var icon, hint, marchtime, fromcity, totile, tocity, toname, marchdir, tocoords; var marchId = a.marchId; var marchStatus = parseInt(a.marchStatus); var marchType = parseInt(a.marchType); var marchMight = 0; if (marchType == 10) marchType=4; // Change Dark Forest type to Attack! var from = Cities.byID[a.marchCityId];if(!from)continue; // tampermonkey fix fromcity = CityLink(from); var now = unixTime(); var destinationUnixTime = a["destinationUnixTime"] - now; var returnUnixTime = a["returnUnixTime"] - now; if ((returnUnixTime <= 0) && ((marchStatus == 8) || (marchStatus == 0))) continue; // never show returned march once completed if ((destinationUnixTime < 0) || (marchStatus == 8) || (marchStatus == 2)) marchdir = "Return"; else marchdir = "Count"; totile = ""; tocity = ""; toname = ""; for (var i=0; i= 0) { if (destinationUnixTime < (60)) { marchtime = ''+uW.timestr(destinationUnixTime)+''; } else { marchtime = uW.timestr(destinationUnixTime); } } else { if (marchStatus == 2) { marchtime = uW.g_js_strings.commonstr.encamped; iconType = 102; } else { if (marchStatus == 8) { marchtime = uW.timestr(returnUnixTime); iconType = 8; } else { marchtime = tx("Waiting"); iconType = 102; } } } outtimes[marchId] = marchtime; if (!a.toXCoord || (tocity != "")) {tocoords = "";} else {tocoords = coordLink(a.toXCoord,a.toYCoord);} hint = ""; switch (marchType) { case 1: hint=uW.g_js_strings.commonstr.transport;break; case 2: hint=uW.g_js_strings.commonstr.reinforce;break; case 3: hint=uW.g_js_strings.commonstr.scout;break; case 4: hint=uW.g_js_strings.commonstr.attack;break; case 5: hint=uW.g_js_strings.commonstr.reassign;break; } switch (iconType) { case 1: icon=TransportImage;break; case 2: icon=ReinforceImage;break; case 3: icon=ScoutImage;break; case 4: icon=AttackImage;break; case 5: icon=ReassignImage;break; case 8: icon=ReturnImage;break; case 102: icon=ReinforceImage;break; } hint=tx('Recall March')+" ("+marchId+")"; outgoingfiltered = true; /* Apply Filters */ if ((marchType == 1) && !Options.OutgoingOptions.OutTransport) continue; if ((marchType == 2) && !Options.OutgoingOptions.OutReinforce) continue; if ((marchType == 5) && !Options.OutgoingOptions.OutReassign) continue; if ((marchType == 3) && !Options.OutgoingOptions.OutScout) continue; if ((marchType == 4) && !Options.OutgoingOptions.OutAttack) continue; if (((marchdir == "Return") && (marchStatus != 2) && (marchtime != "Waiting")) && !Options.OutgoingOptions.OutReturning) continue; if (((toname == "Yourself") || (tocity != 0)) && !Options.OutgoingOptions.OutYours && marchType != 5) continue; // irrelevent for reassigns! outgoingshow = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ''; z += ''; var zz = ''; if (a["championInfo"]) { // stats here are sort of obsolete, because it uses city champ data, but kept in for completeness... marchchamp = "
 '+uW.g_js_strings.commonstr.time+''+tx('From')+''+uW.g_js_strings.commonstr.target+''+uW.g_js_strings.commonstr.troops+''+tx('Refresh')+'
 '; if (fromcity != "") z += ''+fromcity+' '; z += ''; if (toname != "") { z+= ''+toname+' '; } if (totile != "") { z+= ''+totile+' '; } if (tocity != "") { z+= ''+tocity+' '; } if (tocoords != "") { z+= ''+tocoords+''; } z += '
"; var gotchamp = false; if (a["championInfo"].effects) { if (a["championInfo"].effects[1] && !(a["championInfo"].effects[1] instanceof Array) && typeof(a["championInfo"].effects[1]) === "object") { got202 = false; for (var cy in a["championInfo"].effects[1]) { // missing bonus damage? if ((cy == '202') && gotchamp) {got202 = true;} if ((cy == '203') && !got202) { marchchamp += ""; } str = uW.g_js_strings.effects['name_'+cy]; if (str && str!= "") { gotchamp = true; marchchamp += ""; } else { break; } } } if (!gotchamp) { marchchamp += ''; } marchchamp+=""; var gottroop = false; if (a["championInfo"].effects[2] && !(a["championInfo"].effects[2] instanceof Array) && typeof(a["championInfo"].effects[2]) === "object") { for (var ty in a["championInfo"].effects[2]) { str = uW.g_js_strings.effects['name_'+ty]; if (str && str!= "") { gottroop = true; marchchamp += ""; } else { break; } } } if (!gottroop) { marchchamp += ''; } marchchamp+="
"+a["championInfo"].name+"
"+uW.g_js_strings.report_view.champion_stats+"
"+uW.g_js_strings.effects.name_202+"0
"+str+""+a["championInfo"].effects[1][cy]+"
'+tx('None Available')+'
"+uW.g_js_strings.report_view.troop_stats+"
"+str+""+a["championInfo"].effects[2][ty]+"
'+tx('None Available')+'
"; } zz +='
'+tx('Champion')+': '+a["championInfo"].name+' 
'; } if ((a["knightId"] > 0) && (!a["knightCombat"])) { for (var i in Seed.knights["city"+a.marchCityId]) { if (i == ("knt" + a["knightId"])) { Combat = Seed.knights["city"+a.marchCityId][i]["combat"]; if (Seed.knights["city"+a.marchCityId][i]["combatBoostExpireUnixtime"] > unixTime()) { Combat *= 1.25; } a["knightCombat"] = Combat; } } } if (a.btIncomplete == true && a.marchType!=9 && Options.FetchMarchInfo) {marchdir = "Count"; } // no return info yet if (a["knightId"] > 0) zz +=''+uW.g_js_strings.commonstr.knight+' (Atk:'+ a["knightCombat"]+') '; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if((a["unit"+i+"Count"] > 0) || (a["unit"+i+"Return"] > 0)) { trpcol = Options.Colors.PanelText; if ((marchdir == "Return") && (a["unit"+i+"Return"] < a["unit"+i+"Count"])) { trpcol = '#f00'; } zz += ''+ uW.unitcost['unt'+i][0] +': '+ addCommas(a["unit"+i+marchdir])+' '; marchMight += (a["unit"+i+marchdir]*parseInt(uW.unitmight["unt"+i])); } } if (a["fromSpellType"]) { var spell = uW.g_js_strings.spells['name_'+a["fromSpellType"]]; if (spell) { var spellstyle = 'color:#808;'; zz +='
* '+spell+' *' } } if (Options.OutgoingOptions.OutResources) { if ((a["gold"] > 0) || (a["resource1"] > 0) || (a["resource2"] > 0) || (a["resource3"] > 0) || (a["resource4"] > 0) || (a["resource5"] > 0)) { zz+="
"; } if (a["gold"] > 0) zz += ''+ResourceImage(GoldImage,uW.g_js_strings.commonstr.gold) + addCommas(a["gold"]) +' '; if (a["resource1"] > 0) zz += ''+ResourceImage(FoodImage,uW.g_js_strings.commonstr.food) + addCommas(a["resource1"]) +' '; if (a["resource2"] > 0) zz += ''+ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood) + addCommas(a["resource2"]) +' '; if (a["resource3"] > 0) zz += ''+ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone) + addCommas(a["resource3"]) +' '; if (a["resource4"] > 0) zz += ''+ResourceImage(OreImage,uW.g_js_strings.commonstr.ore) + addCommas(a["resource4"]) +' '; if (a["resource5"] > 0) zz += ''+ResourceImage(AetherImage,uW.g_js_strings.commonstr.aetherstone) + addCommas(a["resource5"]) +' '; } z += ''; } if (!outgoingshow) { if (!outgoingfiltered) z += '


'+tx('No outgoing marches')+'
'; else z += '


'+tx('No outgoing marches matching search parameters')+'
'; } z += '
 

'; if (CheckForHTMLChange('OUT','btOutgoingMain',z)) { if (Options.DashboardOptions.RefreshSeed) jQuery('#btRefreshSeedOut').addClass("disabled"); else ById('btRefreshSeedOut').addEventListener ('click', function() {setTimeout(function() {RefreshSeed();},250);}, false); ResetFrameSize('btOutgoing',200,720); } for (var m in outtimes) { mt = outtimes[m]; if (ById('omarchtime'+m)) { ById('omarchtime'+m).innerHTML = mt; } } }, EverySecond : function () { var t = Outgoing; try { if (((SecondLooper % Dashboard.GeneralInterval) == 1) || Dashboard.GeneralInterval == 1) { t.PaintOutgoing(); } } catch (err) { logerr(err); // write to log } }, } /** QUICK SCOUT **/ QuickScout = { init : function () { var t = QuickScout; try { // add new options to the context menu CM.ContextMenuMapController.prototype.MapContextMenus.City["5"].push("bookmark"); CM.ContextMenuMapController.prototype.MapContextMenus.City["5"].push("aamod"); CM.ContextMenuMapController.prototype.MapContextMenus.City["5"].push("qqmod"); if (Options.OneClickAttack) CM.ContextMenuMapController.prototype.MapContextMenus.City["5"].push("qamod"); var cityType = CM.CITY_STATUS.ANOTHER_PLAYER_CITY_AND_NOT_IN_YOUR_ALLIANCE; CM.ContextMenuMapController.prototype.MapContextMenus.City[cityType].push("aamod"); CM.ContextMenuMapController.prototype.MapContextMenus.City[cityType].push("qqmod"); if (Options.OneClickAttack) CM.ContextMenuMapController.prototype.MapContextMenus.City[cityType].push("qamod"); var wildContext; wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.EnemyWilderness; for (var wild in wildContext) { wildContext[wild].push("aamod"); wildContext[wild].push("qqmod"); if (Options.OneClickAttack) wildContext[wild].push("qamod"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.Wilderness; for (var wild in wildContext) { wildContext[wild].push("aamod"); wildContext[wild].push("qqmod"); if (Options.OneClickAttack) wildContext[wild].push("qamod"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.FriendlyWilderness; for (var wild in wildContext) { wildContext[wild].push("aamod"); wildContext[wild].push("qqmod"); if (Options.OneClickAttack) wildContext[wild].push("qamod"); } // add actions to the menu item var mod = new CalterUwFunc('cm.ContextMenuMapController.prototype.calcButtonInfo', [['default:', 'case "qqmod":' + ' b.text = "'+tx('QuickScout')+'"; b.color = "green"; ' + ' b.action = function () { ' + ' quickscout(e); ' + ' }; ' + ' d.push(b); break; ' + 'case "qamod":' + ' b.text = "'+tx('QuickAttack')+'"; b.color = "red"; ' + ' b.action = function () { ' + ' quickattack(e); ' + ' }; ' + ' d.push(b); break; ' + 'case "aamod":' + ' b.text = "'+tx('Auto Attack')+'"; b.color = "blue"; ' + ' b.action = function () { ' + ' autoattack(e); ' + ' }; ' + ' d.push(b); break; ' + ' default: ']]); mod.setEnable(true); function FNQuickScout(e) { // send 1 scout var params = uW.Object.clone(uW.g_ajaxparams); params.cid = uW.currentcityid; params.type = 3 params.kid = 0 params.xcoord = e.tile.x; params.ycoord = e.tile.y; params["u"+Options.QuickScoutTroops] = 1; params.gold = 0; params.r1 = 0; params.r2 = 0; params.r3 = 0; params.r4 = 0; params.r5 = 0; March.addMarch(params, function(rslt){ if (rslt.ok) { if (e.tile.level == 0 && (Options.FetchMarchInfo)) QuickScout.fetchmarch(rslt.marchId,QuickScout.PlayerPopup); // mist scout } else { uW.Modal.showAlert(uW.printLocalError(rslt.error_code, rslt.msg, rslt.feedback)); } }, true); // force march so it never gets queued } uWExportFunction('quickscout', FNQuickScout); function FNQuickScoutSearch (x,y,cid,auto) { // if auto check rally slots if (auto) { var marches = parseIntNan(March.getMarchSlots(cid)); var maxmarches = parseIntNan(March.getTotalSlots(cid)); var keepfree = Number(Options.FreeRallySlots); if ((marches+keepfree) >= maxmarches) { divid = 'pbsrch_'+x+'_'+y; if (ById(divid)) { msg = '     '+tx('Rally Point Full')+'!  '+tx("QuickScout")+''; ById(divid).innerHTML = msg; } if (Tabs.Search) { Tabs.Search.QSMarching[x+'_'+y] = 0; } return; } } // send 1 scout var params = uW.Object.clone(uW.g_ajaxparams); if (cid==null) params.cid = uW.currentcityid; else params.cid = cid; params.type = 3 params.kid = 0 params.xcoord = x; params.ycoord = y; params["u"+Options.QuickScoutTroops] = 1; params.gold = 0; params.r1 = 0; params.r2 = 0; params.r3 = 0; params.r4 = 0; params.r5 = 0; March.addMarch(params, function(rslt){ if (rslt.ok) { QuickScout.fetchmarch(rslt.marchId,QuickScout.FillSearchDiv); // mist scout } else { divid = 'pbsrch_'+x+'_'+y; if (!ById(divid)) return; var msg = '     '+tx('Error Code')+' - '+rslt.error_code+'  '+tx("QuickScout")+''; if(rslt.error_code == 208 || rslt.error_code == 207) { // errors that mean you can never scout if (rslt.error_code == 208) { msg = '     '+tx('Target is truced - Cannot scout')+'!'; } else { msg = '     '+tx('You are truced - Cannot scout another player')+'!'; } // update search results .. find correct row var t = Tabs.Search; if (t) { var numRows = t.mapDat.length; for (var i=0; i  '+tx("QuickScout")+''; } ById(divid).innerHTML = msg; if (Tabs.Search) { Tabs.Search.scouted++; Tabs.Search.updateMistProgress(); } } if (Tabs.Search) { Tabs.Search.QSMarching[x+'_'+y] = 0; } }); } uWExportFunction('quickscoutsearch', FNQuickScoutSearch); function FNQuickAttack (e) { if (Options.OneClickAttackPreset == 0 || !Options.QuickMarchOptions.MarchPresets[Options.OneClickAttackPreset]) { QuickMarch.MapClick(e.tile.x,e.tile.y); return; } // send selected preset on attack var knt = getAvailableKnights(uW.currentcityid); if (!knt[0]) { QuickMarch.MapClick(e.tile.x,e.tile.y); return; } var params = uW.Object.clone(uW.g_ajaxparams); params.cid = uW.currentcityid; params.type = 4; params.kid = knt[0].ID; if (e.tile.type=="megalith") { params.kid = 0; } params.xcoord = e.tile.x; params.ycoord = e.tile.y; params.gold = 0; params.r1 = 0; params.r2 = 0; params.r3 = 0; params.r4 = 0; params.r5 = 0; for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; params["u"+i] = 0; if (Options.QuickMarchOptions.MarchPresets[Options.OneClickAttackPreset][i]) { params["u"+i] = parseIntNan(Options.QuickMarchOptions.MarchPresets[Options.OneClickAttackPreset][i]); } } var iused = new Array(); for (var i = 0; i < QuickMarch.ItemList.length; i++) { if (Options.QuickMarchOptions.MarchPresets[Options.OneClickAttackPreset]["item"+QuickMarch.ItemList[i]] == true && Seed.items["i"+QuickMarch.ItemList[i]]) { iused.push(QuickMarch.ItemList[i]); } } params.items = iused.join(","); params.champid = 0; if (Options.QuickMarchOptions.AutoChamp) { citychamp = getCityChampion(uW.currentcityid); if (citychamp.championId && citychamp.status != "10") { params.champid = citychamp.championId; } } if (Options.QuickMarchOptions.AutoSpell) { var spells = getSpellData(uW.currentcityid); if (spells.spellavailable && !spells.cooldownactive) { params.bs = SpellTypes[faction]; } } March.addMarch(params, function(rslt){ if (!rslt.ok) { uW.Modal.showAlert(uW.printLocalError(rslt.error_code, rslt.msg, rslt.feedback)); } }, true); // force march so it never gets queued } uWExportFunction('quickattack', FNQuickAttack); function FNAutoAttack (e) { Tabs.Attack.RouteObject = null; // clear route object Tabs.Attack.NewRoute(e.tile.x,e.tile.y); ById('bttcAttack').click(); }; uWExportFunction('autoattack', FNAutoAttack); } catch (err) { logerr(err); // write to log } }, fetchmarch : function (mid,notify) { var t = QuickScout; var params = uW.Object.clone(uW.g_ajaxparams); params.rid = mid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/fetchMarch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (!rslt.ok){ return; } if (rslt.march.toPlayerId != 0) { t.fetchmarchPlayerInfo(rslt.march.toPlayerId, notify, rslt.march) } else { notify({errorMsg:"
"+tx('There is no longer a city at this location')+"
"}, rslt.march); } }, onFailure: function () {notify ({errorMsg:'AJAX error'});} },true); }, fetchmarchPlayerInfo : function (uid, notify, march) { var t = QuickScout; var params = uW.Object.clone(uW.g_ajaxparams); params.uid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify (rslt,march); }, onFailure: function () { notify ({errorMsg:'AJAX error'}); }, },true); }, PlayerPopup : function (rslt,march) { var t = QuickScout; if(rslt.errorMsg) { Dashboard.Recall(march.marchId); uW.Modal.showAlert(rslt.errorMsg); return; } var u = rslt.userInfo[0]; var a = 'None'; if (u.allianceName) a = u.allianceName +' ('+ getDiplomacy(u.allianceId) + ')'; var n = '
Name: ' + u.genderAndName + '
Might: ' + addCommas(parseInt(u.might)) + '
' + uW.g_js_strings.commonstr.alliance+': '+ a + '
'+tx('City Co-ords')+': ('+ march.toXCoord + ',' + march.toYCoord + ')' + '
'+tx('City Level')+': '+ march.toTileLevel + "
"; ModalMultiButton({ buttons: [{ txt: "Recall Scout", exe: function () { uW.attack_recall(march.marchId, 2, uW.currentcityid); uW.Modal.hideModal(); } }, { txt: "Post to Chat", exe: function () { cText = 'Name: ' + u.genderAndName + '||UID: ' + enFilter(u.userId)+'||Might: ' + addCommas(parseInt(u.might)) + '||' + uW.g_js_strings.commonstr.alliance+': '+ a + '||City Co-ords: ('+ march.toXCoord + ',' + march.toYCoord + ')' + '||City Level: '+ march.toTileLevel; cText = ":::. |QuickScout Report|| "+ cText; sendChat ("/a "+cText); } }, { txt: "Monitor", exe: function () { uW.btMonitorExternalCallUID(u.userId); } }, { txt: uW.g_js_strings.commonstr.cancel, exe: function () { uW.Modal.hideModal(); } }], body: n, title: "QuickScout Result" }); }, FillSearchDiv : function (rslt,march) { setTimeout (Dashboard.Recall,2000,march.marchId); divid = 'pbsrch_'+march.toXCoord+'_'+march.toYCoord; if (!ById(divid)) return; if(rslt.errorMsg) { var n = '     Misted Plain'; ById(divid).innerHTML = n; // update search results .. find correct row var t = Tabs.Search; if (t) { var numRows = t.mapDat.length; for (var i=0; i'; var u = rslt.userInfo[0]; var alli = '---'; var aID = parseIntNan(u.allianceId); if (aID!=0) { alli = u.allianceName; } var n = ''+status+PlayerLink(u.userId,u.name)+' '+addCommas(parseIntNan(u.might))+''+alli+''; ById(divid).outerHTML = n; // update search results .. find correct row var t = Tabs.Search; if (t) { var numRows = t.mapDat.length; for (var i=0; i
 '+tx('TO')+'
'; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
 
'+tx('Select Closest City to Destination')+'
'+tx('Rally Point')+':  '+tx('Auto')+'
'+uW.g_js_strings.commonstr.knight+' 
'+tx('Champ')+'  
'+tx('Spell')+'  
'; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
X: Y:'+tx('Dist')+':  
 
 
'+tx('Quick Links')+':
 
'+tx('Bookmarks')+':
'+uW.g_js_strings.commonstr.alliance+':
'; m += '
 
'; m += '
      
'; m += '
'+tx('MARCH PRESETS')+'
'; m +=''; m += '
'; m += ''; m += '
'+tx('TROOPS')+' 
'+tx('RESOURCES')+' 
'; var r = 0; var QMTroops = '
'+tx('Selected Troop Might')+':  
'; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } QMTroops += ''; } m += '
'+tx("All Troops")+''+tx('Reset Troops')+'
'+TroopImage(i)+' 
'+QMTroops+'
'; var QMRes = '
'; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += ''; QMRes += '
 '+tx('Reset Resources')+'
 
 
 
 
 
 
'; m += ''+QMRes+''; m += '
 '+tx('BOOSTS')+'
'; var QMBoosts = '
 '+tx('March Speed')+':   '+tx('March Size')+':  
'; QMBoosts += ''; for (var i = 0; i < 5; i++) { QMBoosts += ''; } QMBoosts += ''; for (var i = 0; i < 5; i++) { QMBoosts += ''; } QMBoosts += ''; for (var i = 0; i < 5; i++) { QMBoosts += ''; } QMBoosts += '
 
('+uW.ksoItems[t.ItemList[i]].count+')
'; QMBoosts += ''; for (var i = 5; i < t.ItemList.length; i++) { if (uW.itemlist["i"+t.ItemList[i]]) { QMBoosts += ''; } } QMBoosts += ''; for (var i = 5; i < t.ItemList.length; i++) { if (uW.itemlist["i"+t.ItemList[i]]) { QMBoosts += ''; } } QMBoosts += ''; for (var i = 5; i < t.ItemList.length; i++) { if (uW.itemlist["i"+t.ItemList[i]]) { QMBoosts += ''; } } QMBoosts += '
 
('+uW.ksoItems[t.ItemList[i]].count+')
'; QMBoosts += '
 
'; m += QMBoosts+'

'; popMarch = new CPopup('btQuickMarch', Options.btMarchPos.x, Options.btMarchPos.y, 620, 870, true, QuickMarch.close); popMarch.getMainDiv().innerHTML = m; popMarch.getTopDiv().innerHTML = '
   '+tx('March+')+'
'; ById("QMAutoKnight").addEventListener('click', function () { Options.QuickMarchOptions.AutoKnight = this.checked; saveOptions(); if (Options.QuickMarchOptions.AutoKnight) t.BuildKnightSelect(); }, false); ById("QMAutoChamp").addEventListener('click', function () { Options.QuickMarchOptions.AutoChamp = this.checked; saveOptions(); if (Options.QuickMarchOptions.AutoChamp) t.BuildChampSelect(); }, false); ById("QMAutoSpell").addEventListener('click', function () { Options.QuickMarchOptions.AutoSpell = this.checked; saveOptions(); if (Options.QuickMarchOptions.AutoSpell) t.BuildSpellSelect(); }, false); ById("QMSpell").addEventListener('click', function () { t.CalcMarchTime(); },false); var FromCityId = uW.currentcityid; if (init && Cities.byID[InitialCityId]) { FromCityId = InitialCityId; } t.dcp0 = new CdispCityPicker('QMCastles0', ById('QMFromCity'), true, t.FromCityClick, Cities.byID[FromCityId].idx); t.dcp1 = new CdispCityPicker('QMCastles1', ById('QMToCity'), true, t.DestinationChanged).bindToXYboxes(ById("QMToX"), ById("QMToY")); for (var i=0; i" + p.displayName + " - " + p.cities[c].cityName + " (" + p.cities[c].xCoord + "," + p.cities[c].yCoord + ")"; } } } } ById('QMAlliance').innerHTML = "" + m; } }, onFailure: function () { ById('QMAlliance').innerHTML = ""; }, },true); } else { ById('QMAlliance').innerHTML = ""; } }, false); ById('QMAlliance').addEventListener('change', function () { if (this.value != '') { var val = this.value; var x = val.substr(0, val.lastIndexOf(',')); var y = val.substr(val.lastIndexOf(',') + 1, val.length); ById('QMToX').value = x; ById('QMToY').value = y; t.DestinationChanged(); } }, false); ById('QMFetchBookmarks').addEventListener('click', function () { FillBookmarkList('QMBookmarks'); },false); ById('QMBookmarks').addEventListener('change', function () { if (this.value != '') { var val = this.value; var x = val.substr(0, val.lastIndexOf(',')); var y = val.substr(val.lastIndexOf(',') + 1, val.length); ById('QMToX').value = x; ById('QMToY').value = y; t.DestinationChanged(); } }, false); if (t.MapLaunch) { ById('QMToX').value = t.MapX; ById('QMToY').value = t.MapY; if (t.MapC) { t.dcp0.selectBut(t.MapC); } t.DestinationChanged(); } else { if (ById('maparea_map').style.display != "none") { ById('QMToX').value = ById('mapXCoor').value; ById('QMToY').value = ById('mapYCoor').value; t.DestinationChanged(); } } var x = parseInt(ById('QMToX').value); var y = parseInt(ById('QMToY').value); if(isNaN(x) || isNaN(y)) { ById('QMLookupButtonDiv').style.display = 'none'; } t.LoadMarchPresets(); ById("QMAllTroops").addEventListener('click', function() { Options.QuickMarchOptions.AllTroops = this.checked; saveOptions(); t.RepaintMarchData(); }, false); ById("QMResetTroops").addEventListener('click', function () { for (var ui in CM.UNIT_TYPES) ById("QMMarchUnit" + CM.UNIT_TYPES[ui]).value = 0; t.RepaintMarchData(); t.PaintMarchSizeInfo(); t.PaintLoadInfo(); t.CalcMarchTime(); }, false); ById("QMResetResources").addEventListener('click', function () { ById('QMMarchGold').value = 0; ById('QMMarchFood').value = 0; ById('QMMarchWood').value = 0; ById('QMMarchStone').value = 0; ById('QMMarchOre').value = 0; ById('QMMarchAether').value = 0; t.Food = 0; t.Wood = 0; t.Stone = 0; t.Ore = 0; t.Gold = 0; t.Aether = 0; t.PaintLoadInfo(); }, false); for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; ById("QMMaxUnit"+i).addEventListener('click', function () { var MarchUnit = this.id.replace("QMMaxUnit", "QMMarchUnit"); var TotalUnits = parseIntNan(Seed.units["city"+t.SourceCity.id]['unt'+this.id.split("QMMaxUnit")[1]]); t.GetMaxMarchSize(); ById(MarchUnit).value = 0; var NumUnits = 0; for (var ui in CM.UNIT_TYPES) { NumUnits += parseIntNan(ById("QMMarchUnit"+CM.UNIT_TYPES[ui]).value); } var FreeUnits = parseInt(t.MaxTroops - NumUnits); if (FreeUnits<0) FreeUnits=0; if (TotalUnits >= FreeUnits) { ById(MarchUnit).value = FreeUnits; } else { ById(MarchUnit).value = TotalUnits; } t.PaintMarchSizeInfo(); t.PaintLoadInfo(); t.CalcMarchTime(); }, false); ById("QMMarchUnit"+i).addEventListener('change', function () { t.PaintMarchSizeInfo(); t.PaintLoadInfo(); t.CalcMarchTime(); }, false); } ById('QMMaxGold').addEventListener('click', function () { t.CalcMaxLoad(); t.Gold = Math.min(t.MaxLoad - (t.Food + t.Wood + t.Stone + t.Ore + t.Aether),t.MaxGold); ById('QMMarchGold').value = t.Gold; t.PaintLoadInfo(); }, false); ById('QMMaxFood').addEventListener('click', function () { t.CalcMaxLoad(); t.Food = Math.min(t.MaxLoad - (t.Wood + t.Stone + t.Ore + t.Gold + t.Aether),t.MaxFood); ById('QMMarchFood').value = t.Food; t.PaintLoadInfo(); }, false); ById('QMMaxWood').addEventListener('click', function () { t.CalcMaxLoad(); t.Wood = Math.min(t.MaxLoad - (t.Food + t.Stone + t.Ore + t.Gold + t.Aether),t.MaxWood); ById('QMMarchWood').value = t.Wood; t.PaintLoadInfo(); }, false); ById('QMMaxStone').addEventListener('click', function () { t.CalcMaxLoad(); t.Stone = Math.min(t.MaxLoad - (t.Food + t.Wood + t.Ore + t.Gold + t.Aether),t.MaxStone); ById('QMMarchStone').value = t.Stone; t.PaintLoadInfo(); }, false); ById('QMMaxOre').addEventListener('click', function () { t.CalcMaxLoad(); t.Ore = Math.min(t.MaxLoad - (t.Food + t.Wood + t.Stone + t.Gold + t.Aether),t.MaxOre); ById('QMMarchOre').value = t.Ore; t.PaintLoadInfo(); }, false); ById('QMMaxAether').addEventListener('click', function () { t.CalcMaxLoad(); t.Aether = Math.min(t.MaxLoad - (t.Food + t.Wood + t.Stone + t.Ore + t.Gold),t.MaxAether*5); ById('QMMarchAether').value = Math.floor(t.Aether/5); t.PaintLoadInfo(); }, false); ById('QMMarchGold').addEventListener('change', function () { t.Gold = parseIntNan(ById('QMMarchGold').value); t.PaintLoadInfo(); }, false); ById('QMMarchFood').addEventListener('change', function () { t.Food = parseIntNan(ById('QMMarchFood').value); t.PaintLoadInfo(); }, false); ById('QMMarchWood').addEventListener('change', function () { t.Wood = parseIntNan(ById('QMMarchWood').value); t.PaintLoadInfo(); }, false); ById('QMMarchStone').addEventListener('change', function () { t.Stone = parseIntNan(ById('QMMarchStone').value); t.PaintLoadInfo(); }, false); ById('QMMarchOre').addEventListener('change', function () { t.Ore = parseIntNan(ById('QMMarchOre').value); t.PaintLoadInfo(); }, false); ById('QMMarchAether').addEventListener('change', function () { t.Aether = parseIntNan(ById('QMMarchAether').value)*5; t.PaintLoadInfo(); }, false); ById("QMItem931").addEventListener('click', function (e) { if (e.target.checked) { ById("QMItem932").checked = false; } t.PaintMarchSizeInfo(); }, false); ById("QMItem932").addEventListener('click', function (e) { if (e.target.checked) { ById("QMItem931").checked = false; } t.PaintMarchSizeInfo(); }, false); ById("QMItem59").addEventListener('click', function (e) { if (e.target.checked) { ById("QMItem58").checked = false; ById("QMItem57").checked = false; ById("QMItem55").checked = false; } t.CalcMarchTime(); }, false); ById("QMItem58").addEventListener('click', function (e) { if (e.target.checked) { ById("QMItem59").checked = false; ById("QMItem57").checked = false; ById("QMItem55").checked = false; } t.CalcMarchTime(); }, false); ById("QMItem57").addEventListener('click', function (e) { if (e.target.checked) { ById("QMItem59").checked = false; ById("QMItem58").checked = false; ById("QMItem55").checked = false; } t.CalcMarchTime(); }, false); ById("QMItem55").addEventListener('click', function (e) { if (e.target.checked) { ById("QMItem59").checked = false; ById("QMItem58").checked = false; ById("QMItem57").checked = false; } t.CalcMarchTime(); }, false); ById("QMItem293").addEventListener('click', function (e) { if (e.target.checked) { // ById("QMItem294").checked = false; } }, false); ById("QMItem294").addEventListener('click', function (e) { if (e.target.checked) { // ById("QMItem293").checked = false; } }, false); ById("QMTransport").addEventListener('click', function () { t.DoMarch(1); }, false); ById("QMReinforce").addEventListener('click', function () { t.DoMarch(2); }, false); ById("QMReinforceFood").addEventListener('click', function () { t.DoMarch(2,true); }, false); ById("QMScout").addEventListener('click', function () { t.DoMarch(3); }, false); ById("QMAttack").addEventListener('click', function () { t.DoMarch(4); }, false); ById("QMReassign").addEventListener('click', function () { t.DoMarch(5); }, false); ById("QMRaid").addEventListener('click', function () { t.AddRaid(); }, false); t.RefreshTimedBoosts(); if (Options.ShowMarchMight) { jQuery('#QMMarchMightDiv').removeClass('divHide'); } popMarch.show(true); ResetFrameSize('btQuickMarch',870,620); Options.QuickMarchOptions.QuickMarchStartState = true; t.MapLaunch = false; } saveOptions(); }, close : function () { Options.QuickMarchOptions.QuickMarchStartState = false; Options.btMarchPos = popMarch.getLocation(); saveOptions(); popMarch=null; }, GotoMapTile : function () { var t = QuickMarch; var x = parseInt(ById('QMToX').value); var y = parseInt(ById('QMToY').value); if(isNaN(x) || isNaN(y)) return; GotoMap (x,y); }, LookupMapTile : function () { var t = QuickMarch; t.targetType = null; ById("QMLookupInfo").innerHTML = ''; var x = parseInt(ById('QMToX').value); var y = parseInt(ById('QMToY').value); if(isNaN(x) || isNaN(y)) return; ById("QMLookupInfo").innerHTML = tx('Searching')+'...'; t.Blocks = t.MapAjax.generateBlockList(x,y,1); var blockString = t.Blocks.join("%2C"); t.MapAjax.LookupMap (blockString, function(rslt) { t.DestLookup = false; if (!rslt.ok) { if (rslt.BotCode && rslt.BotCode==999) { ById("QMLookupInfo").innerHTML = 'Captcha!'; } else { ById("QMLookupInfo").innerHTML = 'Error!'; } return; } var map = rslt.data; for (var k in map){ if (x==map[k].xCoord && y==map[k].yCoord) { var m = ""; var uid=map[k].tileUserId; var cid=map[k].tileCityId; var typeid = map[k].tileType; t.targetType = typeid; t.CalcMarchTime(); // for megaliths march time is different var tiletype = tileTypes[parseInt(typeid)]; var subtype = map[k].premiumTile; if (typeid==50 && subtype==1) { m = tx('Alliance HQ')+' ('+map[k].allianceHq.allianceName+')'; ById("QMLookupInfo").innerHTML = m; } else { var misted = map[k].misted; var lvl = parseIntNan(map[k].tileLevel); if (!uid || uid==0 || uid=="0") { if (typeid==51) { tiletype = tx('Barb Camp'); } m = tiletype; if (misted) { m = uW.g_js_strings.commonstr.level+' '+lvl+' '+m+' ('+tx('Owner Misted')+')'; ById("QMLookupInfo").innerHTML = m; } else { if (typeid==53) { m += ' '+tx('or plain')+'    '; ById("QMLookupInfo").innerHTML = m; getDefendStatus(x,y,ById('QMDefendStatus'),true); } else { if (lvl!=0) { m = uW.g_js_strings.commonstr.level+' '+lvl+' '+m; } ById("QMLookupInfo").innerHTML = m; } } } else { // lookup user var params = uW.Object.clone(uW.g_ajaxparams); params.checkArr = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getOnline.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { var p = rslt.data; var params = uW.Object.clone(uW.g_ajaxparams); params.pid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/viewCourt.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { m = MonitorLink(rslt.playerInfo.userId,rslt.playerInfo.displayName); if (p[uid]) m+= ' ('+uW.g_js_strings.commonstr.online.toUpperCase()+')'; if (typeid==51) { m += '    '; ById("QMLookupInfo").innerHTML = m; getDefendStatus(x,y,ById('QMDefendStatus'),true); } else { m += ' '+uW.g_js_strings.commonstr.level+' '+lvl+' '+tiletype; ById("QMLookupInfo").innerHTML = m; } } }, }); }, }); } } return; } } ById("QMLookupInfo").innerHTML = 'No Data'; },true); // ignore delay }, RefreshItemCounts : function () { var t = QuickMarch; for (var i = 0; i < t.ItemList.length; i++) { if (ById('QMItemCount'+t.ItemList[i])) ById('QMItemCount'+t.ItemList[i]).innerHTML = '('+uW.ksoItems[t.ItemList[i]].count+')'; } }, RefreshTimedBoosts : function () { var t = QuickMarch; ById('QMMarchSpeed').innerHTML = Math.floor(equippedthronestats(67)+equippedthronestats(163))+'%'; ById('QMMarchSize').innerHTML = Math.floor(equippedthronestats(66)+equippedthronestats(163))+'%'; var now = unixTime(); Bags = Seed.items.i276; SturdyBags = Seed.items.i277; HeavyBags = Seed.items.i278; var loadboost = ''+uW.g_js_strings.commonstr.none+'!'; if (Seed.playerEffects.loadExpire >now) { loadboost = '25% for '+uW.timestr(Seed.playerEffects.loadExpire-now)+''; } var QMLoad = ''; Authority = Seed.items.i285; Dominion = Seed.items.i286; var sizeboost = ''+uW.g_js_strings.commonstr.none+'!'; ById("QMItem931").disabled = false; ById("QMItem932").disabled = false; if (Seed.playerEffects.auras2Expire && Seed.playerEffects.auras2Expire >now) { sizeboost = '30% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.auras2Expire-now)+''; ById("QMItem931").checked = false; ById("QMItem932").checked = false; ById("QMItem931").disabled = true; ById("QMItem932").disabled = true; } else { if (Seed.playerEffects.aurasExpire && Seed.playerEffects.aurasExpire >now) { sizeboost = '15% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.aurasExpire-now)+''; ById("QMItem931").checked = false; ById("QMItem932").checked = false; ById("QMItem931").disabled = true; ById("QMItem932").disabled = true; } } QMLoad += ''; BlueEagle = Seed.items.i279; var speedboost = ''+uW.g_js_strings.commonstr.none+'!'; if (Seed.playerEffects.returnExpire && Seed.playerEffects.returnExpire >now) { speedboost = '50% '+uW.g_js_strings.commonstr.fortxl+' '+uW.timestr(Seed.playerEffects.returnExpire-now)+''; } QMLoad += ''; QMLoad += '
'+tx('Load')+': '+loadboost+''; if (Bags) { QMLoad += ''; } if (SturdyBags) { QMLoad += ''; } if (HeavyBags) { QMLoad += ''; } QMLoad += '
'+tx('Size')+': '+sizeboost+''; if (Authority) { QMLoad += ''; } if (Dominion) { QMLoad += ''; } QMLoad += '
'+tx('Return')+': '+speedboost+''; if (BlueEagle) { QMLoad += ''; } QMLoad += '
'; ById('QMTimedBoosts').innerHTML = '
 
'+QMLoad; // check champ status if (jQuery('#QMChampSpan').hasClass('divHide')) { citychamp = getCityChampion(t.SourceCity.id); if (citychamp.championId && citychamp.status!="10") { t.BuildChampSelect(); } } // check spell cooldown if (jQuery('#QMSpellSpan').hasClass('divHide')) { var spells = getSpellData(t.SourceCity.id); if (spells.spellavailable) { if (spells.cooldownactive) { if (ById('QMCoolTime')) { ById('QMCoolTime').innerHTML = spells.cooldown; } } else { t.BuildSpellSelect(); } } } }, GetMaxMarchSize : function () { var t = QuickMarch; var e = 1; var f = uW.unixtime(); var koth = false; if (t.targetType==57) { koth=true; } var elem = ById("QMItem931"); var elem2 = ById("QMItem932"); if (elem2 && elem2.checked && parseInt(Seed.items["i932"]) > 0) { e = 1.5; } else { if (elem && elem.checked && parseInt(Seed.items["i931"]) > 0) { e = 1.25; } } // timed auras take priority if (Seed.playerEffects.auras2Expire && Seed.playerEffects.auras2Expire > f) { e = 1.3 } else { if (Seed.playerEffects.aurasExpire && Seed.playerEffects.aurasExpire > f) { e = 1.15 } } //(var trmarchsizebuff = Math.min(equippedthronestats(66),uW.cm.thronestats.boosts.MarchSize.Max); var trmarchsizebuff = Math.min(equippedthronestats(66)+equippedthronestats(163),uW.cm.thronestats.boosts.MarchSize.Max); if (trmarchsizebuff > 0) e *= (1 + trmarchsizebuff / 100); if (Seed.cityData.city[t.SourceCity.id].isPrestigeCity) { var b = Seed.cityData.city[t.SourceCity.id].prestigeInfo.prestigeLevel; var r = CM.WorldSettings.getSetting("ASCENSION_RALLYPOINT_BOOST"); var m = JSON.parse(r); var u = 1; if (m.values[b-1]) { u = m.values[b-1][1]; } var k = parseFloat(u); e *= k if (Seed.cityData.city[t.SourceCity.id].prestigeInfo.blessings.indexOf(207) != -1) { e *= 1.1; } } if (koth) { e=1; } var RallyPointLevel = parseInt(getUniqueCityBuilding(t.SourceCity.id, 12).maxLevel); t.MaxTroops = Math.round(RallyPointLevel * 10000 * e - 0.001); if (RallyPointLevel == 11) { t.MaxTroops = Math.round(150000 * e - 0.001); } if (RallyPointLevel == 12) { t.MaxTroops = Math.round(200000 * e - 0.001); } if (RallyPointLevel == 13) { t.MaxTroops = Math.round(215000 * e - 0.001); } if (RallyPointLevel == 14) { t.MaxTroops = Math.round(250000 * e - 0.001); } if (RallyPointLevel == 15) { t.MaxTroops = Math.round(275000 * e - 0.001); } var domainBoosterBonus = 1; if(CM.WorldSettings.hasSetting('DOMAIN_BOOST_RALLYPIONT')) { domainBoosterBonus = parseInt(CM.WorldSettings.getSetting("DOMAIN_BOOST_RALLYPIONT")); t.MaxTroops *= domainBoosterBonus; } }, PaintMarchSizeInfo : function () { var t = QuickMarch; t.CheckMarchNumbers(); t.GetMaxMarchSize(); var NumUnits = 0; var MarchMight = 0; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; var TroopUnits = parseIntNan(ById("QMMarchUnit"+i).value); NumUnits += TroopUnits; MarchMight += (TroopUnits*parseInt(uW.unitmight["unt"+i])); } if (NumUnits > t.MaxTroops) ById('QMTroopHeader').innerHTML = '' + addCommas(NumUnits) + ' / ' + addCommas(t.MaxTroops) + ''; else ById('QMTroopHeader').innerHTML = addCommas(NumUnits) + ' / ' + addCommas(t.MaxTroops); ById('QMMarchMight').innerHTML = addCommas(MarchMight); }, PaintLoadInfo : function () { var t = QuickMarch; t.CalcMaxLoad(); var Resources = t.Food + t.Wood + t.Stone + t.Ore + t.Gold + t.Aether; if (Resources > t.MaxLoad) ById('QMResourceHeader').innerHTML = '' + addCommas(Resources) + ' / ' + addCommas(t.MaxLoad) + ''; else ById('QMResourceHeader').innerHTML = addCommas(Resources) + ' / ' + addCommas(t.MaxLoad); }, PaintRallyPoint : function () { var t = QuickMarch; cityId = t.SourceCity.id; var marches = March.getMarchSlots(cityId); var maxmarches = March.getTotalSlots(cityId); if (marches >= maxmarches) ById('QMRP').innerHTML = '' + marches + '/' + maxmarches + ''; else ById('QMRP').innerHTML = marches + '/' + maxmarches; }, RepaintMarchData : function (ignoreTT) { var t = QuickMarch; var r = 0; for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; var troopnum = parseIntNan(Seed.units["city"+t.SourceCity.id]['unt'+i]); if (troopnum > 0) { var ritual = false; for (var sacIndex = 0; sacIndex < Seed.queue_sacr["city" + t.SourceCity.id].length; sacIndex++) { if (Seed.queue_sacr["city" + t.SourceCity.id][sacIndex]["unitType"] == i) { ritual = true; } } if (ritual) { ById('QMTotalUnit'+i).innerHTML = ''+addCommas(troopnum)+''; } else { ById('QMTotalUnit'+i).innerHTML = addCommas(troopnum); } if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } } else { ById('QMTotalUnit'+i).innerHTML = ''; if (Options.QuickMarchOptions.AllTroops || parseIntNan(ById('QMMarchUnit'+i).value) != 0) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } } else { rowClass = 'divHide'; } } ById('QMTroopRow'+i).className = rowClass; } t.MaxFood = parseInt(Seed.resources["city"+t.SourceCity.id]['rec1'][0] / 3600); t.MaxWood = parseInt(Seed.resources["city"+t.SourceCity.id]['rec2'][0] / 3600); t.MaxStone = parseInt(Seed.resources["city"+t.SourceCity.id]['rec3'][0] / 3600); t.MaxOre = parseInt(Seed.resources["city"+t.SourceCity.id]['rec4'][0] / 3600); t.MaxAether = parseInt(Seed.resources["city"+t.SourceCity.id]['rec5'][0]); t.MaxGold = parseInt(Seed.citystats["city"+t.SourceCity.id]['gold'][0]); ById('QMTotalGold').innerHTML = addCommas(t.MaxGold); ById('QMTotalFood').innerHTML = addCommas(t.MaxFood); ById('QMTotalWood').innerHTML = addCommas(t.MaxWood); ById('QMTotalStone').innerHTML = addCommas(t.MaxStone); ById('QMTotalOre').innerHTML = addCommas(t.MaxOre); ById('QMTotalAether').innerHTML = addCommas(t.MaxAether); var cityExpTime = Seed.cityData.city[t.SourceCity.id].prestigeInfo.prestigeBuffExpire; if (cityExpTime && cityExpTime > unixTime()) { ById("QMAttack").style.color = '#f00'; ById("QMScout").style.color = '#f00'; } else { ById("QMAttack").style.color = '#000'; ById("QMScout").style.color = '#000'; } t.PaintRallyPoint(); ResetFrameSize('btQuickMarch',870,620); }, FromCityClick : function (city, force) { var t = QuickMarch; if (t.SourceCity != city || force) { t.SourceCity = city; t.RepaintMarchData(); t.BuildKnightSelect(); t.BuildChampSelect(); t.BuildSpellSelect(); t.PaintMarchSizeInfo(); t.PaintLoadInfo(); t.CalcDistance(); t.CalcMarchTime(); t.SelectMarchPreset(ById('QMMarchPreset')); } }, CheckMarchNumbers : function () { var t = QuickMarch; for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; var troopnum = parseIntNan(Seed.units["city"+t.SourceCity.id]['unt'+i]); if (ById('QMMarchUnit'+i).value > troopnum) { ById('QMMarchUnit'+i).style.color = '#f00'; } else { ById('QMMarchUnit'+i).style.color = '#000'; } } if (t.MaxGold < t.Gold) { ById('QMMarchGold').style.color = '#f00'; } else { ById('QMMarchGold').style.color = '#000'; } if (t.MaxFood < t.Food) { ById('QMMarchFood').style.color = '#f00'; } else { ById('QMMarchFood').style.color = '#000'; } if (t.MaxWood < t.Wood) { ById('QMMarchWood').style.color = '#f00'; } else { ById('QMMarchWood').style.color = '#000'; } if (t.MaxStone < t.Stone) { ById('QMMarchStone').style.color = '#f00'; } else { ById('QMMarchStone').style.color = '#000'; } if (t.MaxOre < t.Ore) { ById('QMMarchOre').style.color = '#f00'; } else { ById('QMMarchOre').style.color = '#000'; } if (t.MaxAether < t.Aether) { ById('QMMarchAether').style.color = '#f00'; } else { ById('QMMarchAether').style.color = '#000'; } }, DestinationChanged : function () { var t = QuickMarch; if (t.DestLookup) { return; } // don't duplicate lookups t.DestLookup = true; Options.QuickMarchOptions.StartCoords.x = ById('QMToX').value; Options.QuickMarchOptions.StartCoords.y = ById('QMToY').value; var x = parseInt(ById('QMToX').value); var y = parseInt(ById('QMToY').value); if(isNaN(x) || isNaN(y)) { ById('QMLookupButtonDiv').style.display = 'none'; } else { ById('QMLookupButtonDiv').style.display = ''; } ById("QMLookupInfo").innerHTML = ''; t.LookupMapTile(); t.CalcDistance(); }, CalcDistance : function () { var t = QuickMarch; ById("QMDist").innerHTML = ''; t.distance = 0; var x1 = parseInt(t.SourceCity.x); var x2 = parseInt(ById('QMToX').value); var y1 = parseInt(t.SourceCity.y); var y2 = parseInt(ById('QMToY').value); if(isNaN(x1) || isNaN(y1) || isNaN(x2) || isNaN(y2)) return; t.distance = distance(x1, y1, x2, y2); ById("QMDist").innerHTML = t.distance; }, SelectClosest : function () { var t = QuickMarch; var closestdist = 999999; var closestcity; var x2 = parseInt(ById('QMToX').value); var y2 = parseInt(ById('QMToY').value); if(isNaN(x2) || isNaN(y2)) return; for (var i = 0; i < Cities.numCities; i++) { var cityId = Cities.cities[i].id; var x1 = parseInt(Cities.cities[i].x); var y1 = parseInt(Cities.cities[i].y); if (x1 != x2 || y1 != y2) { // if one of your cities, pick the nearest other city! var dist = distance(x1, y1, x2, y2); if (dist < closestdist) { closestdist = dist; closestcity = i; } } } t.dcp0.selectBut(closestcity); }, BuildKnightSelect : function () { var t = QuickMarch; var knt = getAvailableKnights(t.SourceCity.id); ById('QMKnight').options.length = 0; var o = document.createElement("option"); o.text = "-- "+tx('Select Knight')+" --" o.value = 0; ById("QMKnight").options.add(o); for (var k in knt) { if (knt[k]["Name"] != undefined) { var o = document.createElement("option"); o.text = (knt[k]["Name"] + ' (' + knt[k]["Combat"] + ')') o.value = knt[k]["ID"]; ById("QMKnight").options.add(o); } } if (ById('QMKnight').options.length > 1) { if (Options.QuickMarchOptions.AutoKnight) ById('QMKnight').selectedIndex = 1; } }, BuildChampSelect : function () { var t = QuickMarch; ById('QMChamp').options.length = 0; var o = document.createElement("option"); o.text = "-- "+tx('Select Champion')+" --"; o.value = 0; ById("QMChamp").options.add(o); var citychamp; var NoChampText = ''+uW.g_js_strings.champ.no_champ+'!'; citychamp = getCityChampion(t.SourceCity.id); if (citychamp.championId) { var champname = citychamp.name; var champstatus = citychamp.status; if (champstatus != "10") { var o = document.createElement("option"); o.text = champname; o.value = citychamp.championId; ById("QMChamp").options.add(o); } else { NoChampText = ''+champname+' '+tx('is Marching')+'!'; } } if (ById('QMChamp').options.length > 1) { jQuery("#QMChampSpan").removeClass("divHide"); jQuery("#QMNoChampSpan").addClass("divHide"); if (Options.QuickMarchOptions.AutoChamp) ById('QMChamp').selectedIndex = 1; } else { jQuery("#QMNoChampSpan").removeClass("divHide"); jQuery("#QMChampSpan").addClass("divHide"); ById('QMNoChampSpan').innerHTML = NoChampText; } }, BuildSpellSelect : function () { var t = QuickMarch; var spells = getSpellData(t.SourceCity.id); var faction = spells.faction; ById('QMSpell').options.length = 0; var o = document.createElement("option"); o.text = "-- "+tx('Select Battle Spell')+" --"; o.value = 0; ById("QMSpell").options.add(o); var NoSpellText = ''+tx('No Spell')+'!'; if (spells.spellavailable) { var SpellName = uW.g_js_strings.spells["name_"+SpellTypes[faction]]; if (!spells.cooldownactive) { var o = document.createElement("option"); o.text = SpellName; o.value = SpellTypes[faction]; ById("QMSpell").options.add(o); } else { NoSpellText = ''+SpellName+' ('+spells.cooldown+')'; var Squire = parseIntNan(Seed.items.i1); var Knight = parseIntNan(Seed.items.i2); var Guinevere = parseIntNan(Seed.items.i3); var Morgana = parseIntNan(Seed.items.i4); var Arthur = parseIntNan(Seed.items.i5); var Merlin = parseIntNan(Seed.items.i6); var Speedups = ''; Speedups += t.dspHG(t.SourceCity.id,faction,1,Squire); Speedups += t.dspHG(t.SourceCity.id,faction,2,Knight); Speedups += t.dspHG(t.SourceCity.id,faction,3,Guinevere); Speedups += t.dspHG(t.SourceCity.id,faction,4,Morgana); Speedups += t.dspHG(t.SourceCity.id,faction,5,Arthur); Speedups += t.dspHG(t.SourceCity.id,faction,6,Merlin); if (Speedups != "") Speedups = "" + Speedups + "
"; NoSpellText = NoSpellText+'
'+Speedups+'
'; } } if (ById("QMSpell").options.length > 1) { jQuery("#QMSpellSpan").removeClass("divHide"); jQuery("#QMNoSpellSpan").addClass("divHide"); if (Options.QuickMarchOptions.AutoSpell) { ById("QMSpell").selectedIndex = 1; t.CalcMarchTime(); } } else { jQuery("#QMNoSpellSpan").removeClass("divHide"); jQuery("#QMSpellSpan").addClass("divHide"); ById('QMNoSpellSpan').innerHTML = NoSpellText; } }, dspHG : function (cityId, faction, item, count) { var t = QuickMarch; var n = ''; if (count>0) { n += ''; } return n; }, speedupSpell : function (cityId,item,spell) { var t = QuickMarch; var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.iid = item; params.sid = spell; params.apothecary = false; new MyAjaxRequest(uW.g_ajaxpath + "ajax/speedupBattleSpellCooldown.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { if (rslt.endDate) { Seed.cityData.city[cityId].spells = uWCloneInto({}); Seed.cityData.city[cityId].spells[spell] = uWCloneInto({ endDate : rslt.endDate }); } Seed.items["i"+item] = Number(parseInt(Seed.items["i"+item])-1); uW.ksoItems[item].subtract(); if (cityId == uW.currentcityid) uW.update_queue(); t.BuildSpellSelect(); } }, },true); }, MapClick : function (x,y,c) { var t = QuickMarch; if (popMarch) { ById('QMToX').value = x; ById('QMToY').value = y; if (c) { t.dcp0.selectBut(c); } t.DestinationChanged(); } else { t.MapX = x; t.MapY = y; if (c) { t.MapC = c; } else { t.MapC = null; } t.MapLaunch = true; t.ToggleQuickMarch(false); } }, CalcMaxLoad : function () { var t = QuickMarch; t.MaxLoad = 0; var featherweight = parseInt(Seed.tech.tch10) * 0.1; var loadEffectBoost = 0; if (Seed.playerEffects.loadExpire > uW.unixtime()) { loadEffectBoost = 0.25; }; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; var loadBoostBase = (Math.floor(CM.ThroneController.effectBonus(6)) * 0.01) + loadEffectBoost; if (CM.unitFrontendType[i] == "siege") { loadBoostBase += (CM.ThroneController.effectBonus(59) * 0.01) }; if (CM.unitFrontendType[i] == "horsed") { loadBoostBase += (CM.ThroneController.effectBonus(48) * 0.01); }; var Load = parseInt(uW.unitstats['unt'+i]['5']); var LoadSac = ""; if (uW.seed.queue_sacr["city"+t.SourceCity.id]) { for(var sacIndex = 0; sacIndex < uW.seed.queue_sacr["city"+t.SourceCity.id].length; sacIndex ++ ) { if(uW.seed.queue_sacr["city"+t.SourceCity.id][sacIndex]["unitType"] == i) { Load *= uW.seed.queue_sacr["city"+t.SourceCity.id][sacIndex]["multiplier"][0]; } } } if (loadBoostBase > Number(uW.cm.thronestats.boosts.Load.Max)/100) { loadBoostBase = Number(uW.cm.thronestats.boosts.Load.Max)/100; }; loadBoostBase += featherweight; //Should be done after throne room max check to get max boost? loadBoostBase += 1; var LoadUnit = Math.floor(loadBoostBase*Load); t.MaxLoad += parseInt(LoadUnit * ById("QMMarchUnit" + i).value); } if (t.MaxLoad > 0) t.MaxLoad = t.MaxLoad - 1; // reduce max by 1 to avoid load capacity errors due to roundoff }, LoadMarchPresets : function () { var t = QuickMarch; ById('QMMarchPreset').options.length = 0; var o = document.createElement("option"); o.text = "-- "+tx('Select Preset')+" --" o.value = 0; ById("QMMarchPreset").options.add(o); for (var y in Options.QuickMarchOptions.MarchPresets) { var o = document.createElement("option"); o.text = Options.QuickMarchOptions.MarchPresets[y][0]; o.value = y; ById("QMMarchPreset").options.add(o); } t.NextPresetNumber = parseIntNan(y) + 1; if (t.InitPresetNumber != 0) { ById('QMMarchPreset').value = t.InitPresetNumber; t.SelectMarchPreset(ById('QMMarchPreset')); t.InitPresetNumber = 0; } }, SelectMarchPreset : function (sel) { var t = QuickMarch; var PN = sel.value; if ((PN == 0) || (PN == "")) { jQuery('#btDeleteMarchPreset').addClass("disabled"); return false } else { jQuery('#btDeleteMarchPreset').removeClass("disabled"); } /* Load preset details into edit fields */ for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (Options.QuickMarchOptions.MarchPresets[PN][i]) { ById('QMMarchUnit'+i).value = Options.QuickMarchOptions.MarchPresets[PN][i]; } else { ById('QMMarchUnit'+i).value = "0"; } } t.Food = 0; t.Wood = 0; t.Stone = 0; t.Ore = 0; t.Gold = 0; t.Aether = 0; if (Options.QuickMarchOptions.MarchPresets[PN].Gold) { t.Gold = Options.QuickMarchOptions.MarchPresets[PN].Gold; } if (Options.QuickMarchOptions.MarchPresets[PN].Food) { t.Food = Options.QuickMarchOptions.MarchPresets[PN].Food; } if (Options.QuickMarchOptions.MarchPresets[PN].Wood) { t.Wood = Options.QuickMarchOptions.MarchPresets[PN].Wood; } if (Options.QuickMarchOptions.MarchPresets[PN].Stone) { t.Stone = Options.QuickMarchOptions.MarchPresets[PN].Stone; } if (Options.QuickMarchOptions.MarchPresets[PN].Ore) { t.Ore = Options.QuickMarchOptions.MarchPresets[PN].Ore; } if (Options.QuickMarchOptions.MarchPresets[PN].Aether) { t.Aether = Options.QuickMarchOptions.MarchPresets[PN].Aether; } ById('QMMarchGold').value = t.Gold; ById('QMMarchFood').value = t.Food; ById('QMMarchWood').value = t.Wood; ById('QMMarchStone').value = t.Stone; ById('QMMarchOre').value = t.Ore; ById('QMMarchAether').value = t.Aether; for (var i = 0; i < t.ItemList.length; i++) { var elem = ById("QMItem"+t.ItemList[i]); if (elem) { elem.checked = (Options.QuickMarchOptions.MarchPresets[PN]["item"+t.ItemList[i]] == true); } } t.RepaintMarchData(); t.PaintMarchSizeInfo(); t.PaintLoadInfo(); t.CalcMarchTime(); }, SaveMarchPreset : function () { var t = QuickMarch; ById('btMarchMessages').innerHTML = ""; // need to induce a flicker or something, so they know something has happened.. var PN = ById('QMMarchPreset'); var NewName = ById('QMPresetName').value.trim(); var OldName = ""; if (!PN.value || (PN.value == 0)) { if (NewName == "") { ById('btMarchMessages').innerHTML = ""+tx('Please enter a name for the march preset')+""; return false; } SavePN = t.NextPresetNumber; } else { if (NewName != "") { SavePN = t.NextPresetNumber; } else { SavePN = PN.value; OldName = Options.QuickMarchOptions.MarchPresets[SavePN][0]; } } Options.QuickMarchOptions.MarchPresets[SavePN]={}; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; TroopVal = ById('QMMarchUnit'+i).value; if (!isNaN(TroopVal) && (TroopVal != "")) { Options.QuickMarchOptions.MarchPresets[SavePN][i] = TroopVal; } } if (!isNaN(t.Gold) && (t.Gold != 0)) { Options.QuickMarchOptions.MarchPresets[SavePN].Gold = t.Gold; } if (!isNaN(t.Food) && (t.Food != 0)) { Options.QuickMarchOptions.MarchPresets[SavePN].Food = t.Food; } if (!isNaN(t.Wood) && (t.Wood != 0)) { Options.QuickMarchOptions.MarchPresets[SavePN].Wood = t.Wood; } if (!isNaN(t.Stone) && (t.Stone != 0)) { Options.QuickMarchOptions.MarchPresets[SavePN].Stone = t.Stone; } if (!isNaN(t.Ore) && (t.Ore != 0)) { Options.QuickMarchOptions.MarchPresets[SavePN].Ore = t.Ore; } if (!isNaN(t.Aether) && (t.Aether != 0)) { Options.QuickMarchOptions.MarchPresets[SavePN].Aether = t.Aether; } for (var i = 0; i < t.ItemList.length; i++) { var elem = ById("QMItem"+t.ItemList[i]); if (elem && elem.checked) { Options.QuickMarchOptions.MarchPresets[SavePN]["item"+t.ItemList[i]] = true; } } Options.QuickMarchOptions.MarchPresets[SavePN][0] = OldName; if (NewName != "") { Options.QuickMarchOptions.MarchPresets[SavePN][0] = NewName; } saveOptions(); t.InitPresetNumber = SavePN; t.LoadMarchPresets(); ById('QMPresetName').value = ""; ById('btMarchMessages').innerHTML = tx("March Preset Saved"); }, DelMarchPreset : function () { var t = QuickMarch; var PN = ById('QMMarchPreset'); if (!PN.value || (PN.value == 0)) return; Options.QuickMarchOptions.MarchPresets[PN.value]={}; delete Options.QuickMarchOptions.MarchPresets[PN.value]; saveOptions(); t.LoadMarchPresets(); ById('btMarchMessages').innerHTML = tx("March Preset Deleted"); }, DoMarch: function (MarchType, SendMaxFood) { var t = QuickMarch; t.RepaintMarchData(); t.GetMaxMarchSize(); var koth = false; if (t.targetType==57) { koth=true; } var totalunit = 0; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (MarchType != 3 || i==3 || i==46) { totalunit = totalunit + parseIntNan(ById("QMMarchUnit"+i).value); } } var x = ById("QMToX").value; var y = ById("QMToY").value; if (ById("QMKnight").value == 0 && MarchType == 4 && !koth) { // attack, try to automatically select knight if none assigned if (ById('QMKnight').options.length > 1) { ById('QMKnight').selectedIndex = 1; } } var errMsg = ""; if (x=="" || y=="" || isNaN(x) || isNaN(y) || x < 0 || x > 749 || y < 0 || y > 749) { errMsg += tx("Map co-ordinates must be between 0 and 749")+"!
"; } if (ById("QMKnight").value == 0 && MarchType == 4 && !koth) { errMsg += tx("No knight selected")+"!
"; } if (MarchType != 3 && MarchType != 4 && !SendMaxFood) { t.CalcMaxLoad(); if ((t.Food + t.Wood + t.Stone + t.Ore + t.Gold + t.Aether) > t.MaxLoad) { errMsg += tx("Too much to carry")+"!
"; } if (MarchType == 1 && (t.Food + t.Wood + t.Stone + t.Ore + t.Gold + t.Aether) <= 0) { errMsg += tx("You must transport something")+"!
"; } } if (totalunit == 0 && MarchType != 3) { errMsg += tx("You must select some troops")+"!
"; } if (totalunit > t.MaxTroops) { errMsg += tx("You can only send")+" "+t.MaxTroops+" "+tx("units")+".
"; } if (errMsg != "") { ById('btMarchMessages').innerHTML = ""+errMsg+""; return; } // if we get this far we are good to march... var iused = new Array(); for (var i = 0; i < t.ItemList.length; i++) { var elem = ById("QMItem"+t.ItemList[i]); if (elem && elem.checked && parseInt(Seed.items["i"+t.ItemList[i]]) > 0) { iused.push(t.ItemList[i]); } } var params = uW.Object.clone(uW.g_ajaxparams); params.r1 = 0; params.r2 = 0; params.r3 = 0; params.r4 = 0; params.r5 = 0; params.gold = 0; var res = 0; if (SendMaxFood) { for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; res += Tabs.Transport.getLoadUnit(i,t.SourceCity.id) * ById("QMMarchUnit"+i).value; } res = res - 1; params.r1 = res; } params.items = iused.join(","); params.cid = t.SourceCity.id; params.type = MarchType; // 5 Reassign, 4 Attack, 3 Scout, 2 Reinforce, 1 Transport params.xcoord = x; params.ycoord = y; if (koth) { params.kid = 0; } else { params.kid = ById("QMKnight").value; } if (MarchType != 3 && MarchType != 4 && !SendMaxFood) { params.r1 = Math.min(t.Food,t.MaxFood); params.r2 = Math.min(t.Wood,t.MaxWood); params.r3 = Math.min(t.Stone,t.MaxStone); params.r4 = Math.min(t.Ore,t.MaxOre); params.r5 = Math.floor(Math.min(t.Aether/5,t.MaxAether)); params.gold = Math.min(t.Gold,t.MaxGold); } for (var ui in CM.UNIT_TYPES) { params["u"+CM.UNIT_TYPES[ui]] = 0; } if (MarchType != 3) { for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (ById("QMMarchUnit"+i).value > 0) {params["u"+i] = parseIntNan(ById("QMMarchUnit"+i).value);} } } else { params.u46 = parseIntNan(ById("QMMarchUnit46").value); if (params.u46==0) { params.u3 = parseIntNan(ById("QMMarchUnit3").value); if (params.u3==0) { params.u3=1; } } } params.champid = 0; if (MarchType == 4) { if (ById('QMChamp').value != 0 && ById('QMChamp').value != "") { var championidx = ""; for (var i = 0; i < Seed.champion.champions.length; i++) { if (Seed.champion.champions[i].championId == ById('QMChamp').value) championidx = i; } params.champid = ById('QMChamp').value; } } if (ById('QMSpell').value != 0 && ById('QMSpell').value != "") { if (MarchType == 4 || ById('QMSpell').value != "21") { params.bs = ById('QMSpell').value; } } t.DisableButtons(true); ById('btMarchMessages').innerHTML = ""+tx('Sending march')+"...."; March.addMarch(params, function(rslt){ if (rslt.ok) { var ReturnMessage = ""; switch (MarchType) { case 1: ReturnMessage = tx("Transport successful"); break; case 2: ReturnMessage = tx("Reinforce successful"); break; case 3: ReturnMessage = tx("Scout successful"); break; case 4: ReturnMessage = tx("Attack successful"); break; case 5: ReturnMessage = tx("Reassign successful"); break; default: ReturnMessage = tx("March successful"); } ById('btMarchMessages').innerHTML = ReturnMessage; t.FromCityClick(t.SourceCity,true); // force update t.RefreshItemCounts(); } else { if (rslt.msg) { ById('btMarchMessages').innerHTML = "" + rslt.msg + ""; } else { ById('btMarchMessages').innerHTML = ""+tx('Error sending march')+"!"; } } t.DisableButtons(false); }, true); }, AddRaid : function (){ var t = QuickMarch; t.RepaintMarchData(); t.GetMaxMarchSize(); var totalunit = 0; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; totalunit = totalunit + parseIntNan(ById("QMMarchUnit"+i).value); } var x = ById("QMToX").value; var y = ById("QMToY").value; if (ById("QMKnight").value == 0) { // attack, try to automatically select knight if none assigned if (ById('QMKnight').options.length > 1) { ById('QMKnight').selectedIndex = 1; } } var errMsg = ""; if (x=="" || y=="" || isNaN(x) || isNaN(y) || x < 0 || x > 749 || y < 0 || y > 749) { errMsg += tx("Map co-ordinates must be between 0 and 749")+"!
"; } if (ById("QMKnight").value == 0) { errMsg += tx("No knight selected")+"!
"; } if (totalunit == 0) { errMsg += tx("You must select some troops")+"!
"; } if (totalunit > t.MaxTroops) { errMsg += tx("You can only send")+" "+t.MaxTroops+" "+tx("units")+".
"; } if (errMsg != "") { ById('btMarchMessages').innerHTML = ""+errMsg+""; return; } var params = uW.Object.clone(uW.g_ajaxparams); params.pf = 0; params.ctrl = 'BotManager'; params.action = 'saveMarch'; params.settings = {}; params.queue = {0:{botMarches:{botMarchStatus:1,botState:1},cityMarches:{}}}; params.settings.cityId = t.SourceCity.id; params.queue[0].cityMarches.knightId = ById("QMKnight").value; params.queue[0].cityMarches.toXCoord = x; params.queue[0].cityMarches.toYCoord = y; for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; params.queue[0]['cityMarches']['unit'+i+'Count'] = parseIntNan(ById("QMMarchUnit"+i).value); } t.DisableButtons(true); ById('btMarchMessages').innerHTML = ""+tx("Adding Raid")+"...."; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function(rslt){ var t = QuickMarch; if (rslt.ok) { uW.cityinfo_army(); setTimeout(uW.update_seed_ajax, 250); ById('btMarchMessages').innerHTML = tx("Raid Added Successfully"); Seed.knights['city' +params.settings.cityId]['knt' + params.queue[0].cityMarches.knightId].knightStatus = 10; // update knight instantly! t.FromCityClick(t.SourceCity,true); // force update } else { if (rslt.msg) { ById('btMarchMessages').innerHTML = "" + rslt.msg + ""; } else { ById('btMarchMessages').innerHTML = ""+tx("Error setting raid")+"!"; } } t.DisableButtons(false); }, onFailure: function () { var t = QuickMarch; ById('btMarchMessages').innerHTML = ""+tx("Error communicating with server")+"!"; t.DisableButtons(false); } },true); }, DisableButtons : function (tf) { ById("QMTransport").disabled = tf; ById("QMReinforce").disabled = tf; ById("QMReinforceFood").disabled = tf; ById("QMScout").disabled = tf; ById("QMAttack").disabled = tf; ById("QMReassign").disabled = tf; }, CalcMarchTime : function () { var t = QuickMarch; var unit_types = {}; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; var troop_number = parseIntNan(ById("QMMarchUnit"+i).value); if (troop_number > 0) { unit_types[ui] = i; } } var phoenix_wings_used = false; var thunder_wings_used = false; var red_wings_used = false; var green_wings_used = false; var elem = ById("QMItem59"); if (elem && elem.checked && parseInt(Seed.items["i59"]) > 0) { phoenix_wings_used = true; } else { elem = ById("QMItem58"); if (elem && elem.checked && parseInt(Seed.items["i58"]) > 0) { thunder_wings_used = true; } else { elem = ById("QMItem57"); if (elem && elem.checked && parseInt(Seed.items["i57"]) > 0) { red_wings_used = true; } else { elem = ById("QMItem55"); if (elem && elem.checked && parseInt(Seed.items["i55"]) > 0) { green_wings_used = true; } } } } var MarchTime = March.getMarchTime(t.SourceCity.id,unit_types,t.distance,ById("QMSpell").value,phoenix_wings_used,thunder_wings_used,red_wings_used,green_wings_used,(t.targetType==57)); if (MarchTime.foe==0) { ById("QMTime").innerHTML = ""; return; } ById("QMTime").innerHTML = tx("Est. Time")+": "+uW.timestr(MarchTime.friend)+" ("+tx("Friend")+"), "+uW.timestr(MarchTime.foe)+" ("+tx("Foe")+")"; }, EverySecond : function () { var t = QuickMarch; t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter >= 3) { // refresh display every 3 seconds t.LoopCounter = 0; if (t.SourceCity) { t.RepaintMarchData(); t.RefreshTimedBoosts(); t.RefreshItemCounts(); } } }, } /** OPTION OBJECTS **/ var anticd = { isInited: false, KOCversion: '?', init: function () { try { if (this.isInited) return this.KOCversion; var nullfunc = function () { return; }; if (typeof exportFunction == 'function') { exportFunction(nullfunc,CM.cheatDetector, {defineAs:"detect"}); } else { CM.cheatDetector.detect = nullfunc; }; var scripts = document.getElementsByTagName('script'); for (var i = 0; i < scripts.length; i++) { if (scripts[i].src.indexOf('camelotmain') >= 0) { break; } } if (i < scripts.length) { var m = scripts[i].src.match(/camelotmain[_]{0,1}[a-z]{0,2}-(.*).js/); if (m) this.KOCversion = m[1]; } this.isInited = true; } catch (err) { logerr(err); // write to log } }, getKOCversion: function () { return this.KOCversion; }, }; var TreasureChestClick = { clickTreasureChest : null, init : function (){ t = TreasureChestClick; try { uWExportFunction ('treasure_chest_post_hook', t.hook); t.clickTreasureChest = new CalterUwFunc ('pop_treasure_chest_modal', [[/if/im, 'treasure_chest_post_hook(a); return; if']]); t.clickTreasureChest.setEnable(UserOptions.TreasureChest); } catch (err) { logerr(err); // write to log } }, setEnable : function (tf){ var t = TreasureChestClick; t.clickTreasureChest.setEnable (tf); }, isAvailable : function (){ var t = TreasureChestClick; return t.clickTreasureChest.isAvailable(); }, hook : function (tid) { var mid = tid; var city = null; var coords = ""; var tileName = "Barbarian Camp"; var logTile = ""; for (var k in Seed.queue_atkp) { if (Seed.queue_atkp[k]['m'+mid]) { city = k; coords = ' ('+Seed.queue_atkp[k]['m'+mid].toXCoord+','+Seed.queue_atkp[k]['m'+mid].toYCoord+')'; break; } } if (city) { try { tileName = (Seed.queue_atkp[city]["m" + mid].toTileType == 51) ? "Barbarian Camp" : capitalize(uW.g_mapObject.types[parseInt(Seed.queue_atkp[city]["m" + mid].toTileType)]); logTile = ' in '+tileName+' Level '+Seed.queue_atkp[city]["m" + mid].toTileLevel; if (tileName=="Boss") { // DF!! if (DeleteReports.ReportLog.ItemsFoundDF["T"]) { DeleteReports.ReportLog.ItemsFoundDF["T"] += 1; } else { DeleteReports.ReportLog.ItemsFoundDF["T"] = 1; } } else { for (var i in Options.AttackOptions.Routes) { var a = Options.AttackOptions.Routes[i]; if (Seed.queue_atkp[city]['m'+mid].toXCoord == a.target_x && Seed.queue_atkp[city]['m'+mid].toYCoord == a.target_y && Seed.queue_atkp[city]['m'+mid].marchType==4) { if (DeleteReports.ReportLog.ItemsFound["T"]) { DeleteReports.ReportLog.ItemsFound["T"] += 1; } else { DeleteReports.ReportLog.ItemsFound["T"] = 1; } break; } } } } catch(e) { }; } var params = uW.Object.clone(uW.g_ajaxparams); params.tid = tid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/postFriendVictoryTokenShare.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { if (UserOptions.BankTreasureChests && UserOptions.TreasureChestBank.length < UserOptions.MaxBankedTreasureChests) { var post_link = 'convert.php?pl=1&ty=3&si=118&wccc=fcf-feed-118&ln=31&da='+yyyymmdd(new Date())+'&in=' + uW.tvuid + '&ex=s%3A' + getServerId() + '%7Cf%3A' + rslt.feedId + '%7Cm%3A' + rslt.tokenId + '%7Cimg%3Ahttps%3A%2F%2F'+GameURL+'%2Ffb%2Fe2%2Fsrc%2Fimg%2Fbronze_vip.png%7C&page=convert'; UserOptions.TreasureChestBank.push({tokenId:rslt.tokenId, feedId:rslt.feedId, serverId:getServerId(), playerId:uW.tvuid, tileName:tileName, unixTime_taken:unixTime(), link:post_link}); saveUserOptions(uW.user_id); actionLog('Chest found'+logTile+coords+' - Link Stored','TREASURE'); } else { var reparr = new Array(); reparr.push(["REPLACE_TiLeNaMe", tileName]); reparr.push(["REPLACE_fEeDiD", rslt.feedId]); reparr.push(["REPLACE_tOkEnId", rslt.tokenId]); uW.common_postToProfile("118", uWCloneInto(reparr)); actionLog('Chest found'+logTile+coords+' - Link Posted to FB','TREASURE'); } } else { actionLog('Chest found'+logTile+coords+' - Error: ' +rslt.error_code+ ',' +rslt.msg+ ',' +rslt.feedback,'TREASURE') } }, onFailure: function () { actionLog('Chest found'+logTile+coords+' - AJAX Error','TREASURE') }, },true); }, } var KillBox = { kboxtime : 1, init:function () { var t = KillBox; t.kboxtime += 1; if(!Options.MagicBox) { return; } if (t.kboxtime > 50) { return; } if (Number(uW.seed.items.i599) == 0) { return; } if (!ById('modal_mmb')) { setTimeout(KillBox.init,100); } else { uW.Modal.hideModal(); } }, } var FairieKiller = { saveFunc : null, init : function (tf){ try { FairieKiller.saveFunc = uW.Modal.showModalUEP; FairieKiller.setEnable (tf); } catch (err) { logerr(err); // write to log } }, setEnable : function (tf){ if (tf) uW.Modal.showModalUEP = eval ('function FairieKiller (a,b,c) {actionLog ("Blocked Faire popup");}'); else uW.Modal.showModalUEP = FairieKiller.saveFunc; }, } function fixgamelag () { var kfutime = Number(uW.unixtime()+30); for (var city in Seed.queue_atkp) { var knighthashX = []; if(Seed.queue_atkp[city] != "") { for (var march in Seed.queue_atkp[city]) { if(Seed.queue_atkp[city][march].marchType) { if(!Seed.queue_atkp[city][march].botMarchStatus && Seed.queue_atkp[city][march].marchStatus == 5) { if (Seed.queue_atkp[city][march].returnUnixTime < kfutime) { actionLog(Cities.byID[String(city).replace(/city/,'')].name+': Fixing march '+march, 'MARCH'); for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; if (Seed.queue_atkp[city][march]['unit'+i+'Count'] > 0) { if(Seed.queue_atkp[city][march]['unit'+i+'Return'] == 0 || Seed.queue_atkp[city][march]['unit'+i+'Return'] == undefined) { Seed.queue_atkp[city][march]['unit'+i+'Return'] = Seed.queue_atkp[city][march]['unit'+i+'Count']; } } } Seed.queue_atkp[city][march].hasUpdated = true; Seed.queue_atkp[city][march].marchStatus = 8; } else { knighthashX.push(Seed.queue_atkp[city][march].knightId); } } else { knighthashX.push(Seed.queue_atkp[city][march].knightId); } } } } for (var knight in Seed.knights[city]) { if(Seed.knights[city][knight].knightStatus != 1) { if(knighthashX.indexOf(Seed.knights[city][knight].knightId) == -1) { Seed.knights[city][knight].knightStatus = 1; actionLog(Cities.byID[String(city).replace(/city/,'')].name+': Fixing knight '+Seed.knights[city][knight].knightName, 'MARCH'); } } } } } var ChampLagFix = { LagFix1: null, LagFix2: null, init: function () { t = ChampLagFix; try { uW.CE_EFFECT_TIERS = uWCloneInto(CE_EFFECT_TIERS); uWExportFunction('btGetTierEffects', function (T) { var U = +T.id || 0, R = +T.tier || 0, V = CE_EFFECT_TIERS, S = U + "," + R; if (!V[S]) { if (R > 1) { CM.log.error(2, CM.ERROR_TYPE.INFORMATION_MISSING, "Champion equipment tier {tier} doesn't exist for Effect ID {effectId}. Trying the next tier down.".replace("{effectId}", U).replace("{tier}", R)); return uW.btGetTierEffects({ id : U, tier : R - 1 }) } else { CM.log.error(1, CM.ERROR_TYPE.INFORMATION_MISSING, "Champion equipment tier doesn't exist for Effect ID {effectId}. All tiers attempted.".replace("{effectId}", U)); return {} } } return V[S] }); t.LagFix1 = new CalterUwFunc("cm.ChampionManager.getEffectAmount",[['o(U),','btGetTierEffects(U),']]); t.LagFix2 = new CalterUwFunc("cm.ChampionManager.getEffect",[['L(R,','cm.ChampionManager.getEffectAmount(R,'],['e(R','cm.ChampionManager.getEffectName(R']]); if (ChampLagFix.isAvailable()) { ChampLagFix.setEnable(Options.FixCastleLag); } } catch (err) { logerr(err); // write to log } }, setEnable: function (tf) { var t = ChampLagFix; t.LagFix1.setEnable(tf); t.LagFix2.setEnable(tf); }, isAvailable: function () { var t = ChampLagFix; return (t.LagFix1.isAvailable() && t.LagFix2.isAvailable()); }, }; var CollectGold = { colCity : null, colHappy : 0, init : function (){ var t = CollectGold; for (var c=0; c < Cities.numCities; c++) { if (!Options.lastCollect[Cities.cities[c].id]) { Options.lastCollect[Cities.cities[c].id] = 0; } } saveOptions(); }, tick : function (){ var t = CollectGold; for (var c=0; c= parseIntNan(Options.pbGoldHappy)) && (since > 15*60)) { // KoC Restriction 15 mins! t.colCity = city; t.colHappy = happy; t.ajaxCollectGold (city, t.e_ajaxDone); break; } } }, e_ajaxDone : function (rslt){ var t = CollectGold; Options.lastCollect[t.colCity.id] = unixTime(); saveOptions(); if (rslt.ok) { actionLog (t.colCity.name+': Collected '+ rslt.goldGained +' gold (Happiness was '+ t.colHappy +'%)','GOLD'); } else { actionLog (t.colCity.name+': Error collecting gold ('+rslt.errorMsg+')','GOLD'); } }, ajaxCollectGold : function (city, notify){ var params = uW.Object.clone(uW.g_ajaxparams); params.cid = city.id; new MyAjaxRequest(uW.g_ajaxpath + "ajax/levyGold.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify (rslt); }, onFailure: function () { notify ({errorMsg:'AJAX error'}); }, },true); }, } var FoodAlerts = { init : function (){ var t = FoodAlerts; for (var c=0; c < Cities.numCities; c++) { if (!Options.lastAlert[Cities.cities[c].id]) { Options.lastAlert[Cities.cities[c].id] = 0; } if (!Options.countAlert[Cities.cities[c].id]) { Options.countAlert[Cities.cities[c].id] = 0; } } saveOptions(); }, tick : function (){ var t = FoodAlerts; var now = unixTime(); var trupkeepreduce = 0; trupkeepreduce = Math.min(equippedthronestats(79), uW.cm.thronestats.boosts.Upkeep.Max); var trprodres = Math.min(equippedthronestats(82),uW.cm.thronestats.boosts.ResourceProduction.Max); var trprod = [0, 0, 0, 0, 0]; trprod[1] = Math.min(equippedthronestats(83), uW.cm.thronestats.boosts.ResourceProduction.Max)+trprodres; if (Options.pbFoodAlertInt < 1) Options.pbFoodAlertInt = 1; for(i=0; i < Cities.numCities; i++) { var cityId = Cities.cities[i].id; if (isNaN(Seed.resources["city" + cityId]['rec1'][0])) continue; // no alert if can't read the amount... var rp = getResourceProduction(cityId); var usage = parseIntNan(Seed.resources['city'+cityId]['rec1'][3]); var bp = CM.Resources.getProductionBase(1,cityId); usage = parseIntNan(rp[1] - usage + bp * trprod[1] / 100); var foodleft = parseInt(Seed.resources["city" + cityId]['rec1'][0])/3600; if (usage!=0) { var timeLeft = parseInt(Seed.resources["city" + cityId]['rec1'][0]) / 3600 / (0-usage) * 3600; var msg = ''; if (usage < 0) { var since = unixTime() - Options.lastAlert[cityId]; if ((timeLeft < (Options.pbFoodAlertInt*3600)) && (since > 15*60)) { Options.countAlert[cityId]++; if (Options.countAlert[cityId]>3) { // only post alert if more than 3 positive results in a row msg += tx('My city')+' '+Cities.cities[i].name.substring(0,10)+' ('+Cities.cities[i].x+','+Cities.cities[i].y+')'; msg += ' '+tx('is low on food. Remaining')+': '+addCommas(foodleft,true)+' ('+timestrShort(timeLeft)+') '+tx('Upkeep')+': '+addCommas(usage); sendChat ("/a " + msg); Options.lastAlert[cityId] = unixTime(); } } else { Options.countAlert[cityId] = 0; } } else { Options.countAlert[cityId] = 0; } } else { Options.countAlert[cityId] = 0; } } }, } var RefreshEvery = { timer : null, PaintTimer : null, NextRefresh : 0, box : null, target : null, init : function (){ var t = RefreshEvery; t.creatediv(); if (Options.btEveryMins < 1) Options.btEveryMins = 1; }, creatediv : function(){ var t = RefreshEvery; t.target = ById('comm_tabs'); if(t.target == null){ setTimeout(t.creatediv, 2000); return; } t.box = document.createElement('div'); t.target.appendChild(t.box); t.box.addEventListener('click', function () {t.setEnable(Options.btEveryEnable)}, false); }, setEnable : function (tf){ var t = RefreshEvery; clearTimeout (t.timer); if (tf) { t.NextRefresh = unixTime() + (Options.btEveryMins*60); t.timer = setTimeout (t.Paint, 1000); } else { t.timer = null; t.NextRefresh = 0; t.box.innerHTML = '    '+ getMyAlliance()[1] + ' (' + getServerId() +')'; } }, doit : function (){ var t = RefreshEvery; t.box.innerHTML = '    '+tx("Reloading Now!")+'
'; actionLog ('Refreshing ('+ Options.btEveryMins +' minutes expired)'); ReloadKOC(true); }, setTimer : function (){ var t = RefreshEvery; clearTimeout (t.timer); if (Options.btEveryMins < 1) Options.btEveryMins = 1; RefreshEvery.setEnable (Options.btEveryEnable); }, Paint : function(){ var t = RefreshEvery; if (t.timer == null) return; now = unixTime(); var text = ''; var Left = parseInt(t.NextRefresh - now); var txtbox = ById('modal_msg_write_txt'); if ((Left < 0) && (!txtbox || txtbox.value=="") && (!Options.detAFK || afkdetector.isAFK)) { clearTimeout (t.timer); Left = 0; t.doit(); return; }; if (Left <= -1) text += '    '+tx("Ready to Reload...")+''; else if (Left < 60 && (!Options.detAFK || afkdetector.isAFK)) text += '    '+tx("Next refresh in")+': '+ timestr(Left) +''; else text += '    '+tx("Next refresh in")+': '+ timestr(Left) +''; t.box.innerHTML = ''+text+''; t.timer = setTimeout (t.Paint, 1000); }, } function ChatComOverlay () { if(!ByCl('postaction')[0].getElementsByClassName('button20')[0])return;//safety thebutton = ByCl('postaction')[0].getElementsByClassName('button20')[0]; thebutton.onclick=function(){OSendChat()}; var overlay = document.createElement("div"); var mod_comm_input = ById('mod_comm_input'); var mod_comm_forum = ByCl('mod_comm_forum')[0]; var mod_comm_list1 = ById('mod_comm_list1'); var mod_comm_list2 = ById('mod_comm_list2'); mod_comm_forum.style.position = 'absolute'; mod_comm_forum.style.height = '30px'; mod_comm_forum.style.top = '30px'; mod_comm_list1.style.top = '20px'; mod_comm_list2.style.top = '20px'; overlay.setAttribute("id","overlay"); overlay.setAttribute("class", "overlay"); mod_comm_input.hidden=true; mod_comm_input.parentNode.appendChild(overlay); overlay.innerHTML = ''; var bot_comm_input = ById('bot_comm_input'); bot_comm_input.style.width = "75%"; bot_comm_input.style.float = "left"; bot_comm_input.addEventListener ('keypress', function(e) {if(e.which == 13)OSendChat();}, false); var x = new CalterUwFunc("Chat.whisper",[[/mod.comm.input/ig,'bot_comm_input']]); x.setEnable(true); if (Options.ChatOptions.Emoticons) { var ab = document.createElement('a'); ab.className="mod_comm_set"; ab.innerHTML=tx("Emoticons"); ab.id="btEmoticonLink"; ab.style.paddingLeft = '0px'; mod_comm_forum.insertBefore(ab,mod_comm_forum.firstChild); ab.addEventListener ('click', ChatStuff.SmileyHelp, false); } }; function OSendChat () { if(Options.ChatOptions.filter) ById('mod_comm_input').value = BtFilter(ById('bot_comm_input')); else ById('mod_comm_input').value = ById('bot_comm_input').value; ById('bot_comm_input').value = ""; uW.Chat.sendChat(); }; function BtFilter(e) { var whisper = ""; var firstindex = 0; var enctype = 0; if(e.value.charAt(0) == "\\") { e.value = String(e.value).slice(1); enctype = 1; }; if(e.value.charAt(0) == "/" || e.value.charAt(0) == "@") { firstindex = e.value.indexOf(" "); whisper = e.value.slice(0,firstindex)+' '; }; var m = e.value.substr(firstindex,e.value.length); if(enctype == 1) { var unicodeString = ''; for (var i=0; i < m.length; i++) { var theUnicode = m.charCodeAt(i);;; theUnicode = '&#' + theUnicode+';'; unicodeString += theUnicode; } m = unicodeString; }; if(enctype == 0) { var m = e.value.substr(firstindex,e.value.length); var x = Filter[Options.ChatOptions.fchar]; m = m.replace(/Fa/g,'F'+x+'a').replace(/fA/g,'f'+x+'A').replace(/FA/g,'F'+x+'A').replace(/fa/g,'f'+x+'a'); m = m.replace(/Gr/g,'G'+x+'r').replace(/gR/g,'g'+x+'R').replace(/GR/g,'G'+x+'R').replace(/gr/g,'g'+x+'r'); m = m.replace(/Ri/g,'R'+x+'i').replace(/rI/g,'r'+x+'I').replace(/RI/g,'R'+x+'I').replace(/ri/g,'r'+x+'i'); m = m.replace(/Na/g,'N'+x+'a').replace(/nA/g,'n'+x+'A').replace(/NA/g,'N'+x+'A').replace(/na/g,'n'+x+'a'); m = m.replace(/885/g,'8'+x+'8'+x+'5').replace(/80085/g,'8'+x+'0'+x+'0'+x+'8'+x+'5'); }; // strip http:// and https:// m = m.replace('https://',''); m = m.replace('http://',''); return(whisper+m); }; function enFilter(e) { var x = Filter["Null"]; var m = String(e); m = m.replace(/885/g,'8'+x+'8'+x+'5').replace(/80085/g,'8'+x+'0'+x+'0'+x+'8'+x+'5'); return m; } function deFilter(e) { var x = Filter["Null"]; var m = String(e); m = m.replace(new RegExp(x, 'g'),''); return m; } var ChatPane = { init : function(){ var t = ChatPane; t.myregexp1 = new RegExp(tx("You are # [0-9]+ of [0-9]+ to help"),"i"); t.myregexp2 = new RegExp(tx("\'s Kingdom does not need help\."),"i"); t.myregexp3 = new RegExp(tx("\'s project has already been completed\."),"i"); t.myregexp4 = new RegExp(tx("\'s project has received the maximum amount of help\."),"i"); t.myregexp5 = new RegExp(tx("You already helped with (.*?)\'s project\."),"i"); t.myregexp6 = new RegExp(tx("is low on food. Remaining:"),"i"); t.myregexp7 = new RegExp(tx("\> "+uW.g_js_strings.getChat.saystoalliance+"\:\<\/b\>"),"i"); t.myregexp8 = new RegExp(tx("\> "+uW.g_js_strings.sendChat.saystoalliance+"\:\<\/b\>"),"i"); t.myregexp9 = new RegExp("[(]spam[)]","i"); t.myregexp10 = new RegExp("[{]spam[}]","i"); t.myregexp11 = new RegExp("[-]spam[-]","i"); t.myregexp12 = new RegExp("ptChatAttack","i"); t.myregexp13 = new RegExp("ptChatScout","i"); t.myregexp14 = new RegExp(tx("has been")+" "+tx("attacked")+" "+tx("by"),"i"); t.myregexp15 = new RegExp(tx("has been")+" "+tx("scouted")+" "+tx("by"),"i"); setInterval(t.HandleChatPane, 2500); }, HandleChatPane : function() { var t = ChatPane; var DisplayName = GetDisplayName(); var AllianceChatBox=ById('mod_comm_list2'); var GlobalChatBox=ById('mod_comm_list1'); if(AllianceChatBox){ var chatPosts = document.evaluate(".//div[contains(@class,'chatwrap')]", AllianceChatBox, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(chatPosts){ for (var i = 0; i < chatPosts.snapshotLength; i++) { thisPost = chatPosts.snapshotItem(i); if(Options.ChatOptions.HelpRequest){ var postAuthor = document.evaluate('.//*[@class="nm"]', thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(postAuthor.snapshotItem(0)){ var postAuthorName = postAuthor.snapshotItem(0).innerHTML; if(postAuthorName != DisplayName){ var helpAllianceLinks=document.evaluate(".//a[contains(@onclick,'claimAllianceChatHelp')]", thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(helpAllianceLinks){ for (var j = 0; j < helpAllianceLinks.snapshotLength; j++) { thisLink = helpAllianceLinks.snapshotItem(j); var alreadyClicked = thisLink.getAttribute("clicked"); if(!alreadyClicked){ thisLink.setAttribute('clicked', 'true'); var myregexp = /(claimAllianceChatHelp\(.*\);)/; var match = myregexp.exec(thisLink.getAttribute("onclick")); if (match != null) { onclickCode = match[0]; DouW(onclickCode); } } } } } } } t.HidePostOptions(thisPost,DisplayName); if(Options.ChatOptions.DeleteAllianceSpam){ // hide alli spam in alli chat if (thisPost.innerHTML.match(t.myregexp9) || thisPost.innerHTML.match(t.myregexp10) || thisPost.innerHTML.match(t.myregexp11)) { thisPost.parentNode.removeChild(thisPost); } } } } // delete alliance chats from global chat if required if(Options.ChatOptions.DeleteRequest || Options.ChatOptions.DeleteFood || Options.ChatOptions.DeleteAlert || Options.ChatOptions.DeleteReport || Options.ChatOptions.DeletegAl) { var gchatPosts = document.evaluate(".//div[contains(@class,'chatwrap')]", GlobalChatBox, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(gchatPosts) { for (var i = 0; i < gchatPosts.snapshotLength; i++) { var gthisPost = gchatPosts.snapshotItem(i); if (Options.ChatOptions.DeleteRequest) { // Hide alliance request reports in chat - note they don't say "says to the alliance" :/ if (gthisPost.innerHTML.match(t.myregexp1) || gthisPost.innerHTML.match(t.myregexp2) || gthisPost.innerHTML.match(t.myregexp3) || gthisPost.innerHTML.match(t.myregexp4) || gthisPost.innerHTML.match(t.myregexp5)) { gthisPost.parentNode.removeChild(gthisPost); } } if(Options.ChatOptions.DeletegAl) { // hide alliance chat from global chat if (gthisPost.innerHTML.match(t.myregexp7) || gthisPost.innerHTML.match(t.myregexp8)) gthisPost.parentNode.removeChild(gthisPost); } else { t.HidePostOptions(gthisPost,DisplayName); } } } } } // check for global spam if(Options.ChatOptions.DeleteGlobalSpam){ var gchatPosts = document.evaluate(".//div[contains(@class,'chatwrap')]", GlobalChatBox, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(gchatPosts) { for (var i = 0; i < gchatPosts.snapshotLength; i++) { var gthisPost = gchatPosts.snapshotItem(i); if (!gthisPost.innerHTML.match(t.myregexp7) && !gthisPost.innerHTML.match(t.myregexp8) && (gthisPost.innerHTML.match(t.myregexp9) || gthisPost.innerHTML.match(t.myregexp10) || gthisPost.innerHTML.match(t.myregexp11))) { // hide spam from global gthisPost.parentNode.removeChild(gthisPost); } } } } }, HidePostOptions : function (thisPost,DisplayName) { var t = ChatPane; if(Options.ChatOptions.DeleteRequest){ // Hide alliance requests in alli chat var helpAllianceLinks=document.evaluate(".//a[contains(@onclick,'claimAllianceChatHelp')]", thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(helpAllianceLinks){ for (var j = 0; j < helpAllianceLinks.snapshotLength; j++) { thisLink = helpAllianceLinks.snapshotItem(j); thisLink.parentNode.parentNode.parentNode.parentNode.parentNode.removeChild(thisLink.parentNode.parentNode.parentNode.parentNode); } } // Hide alliance request reports in alli chat if (thisPost.innerHTML.match(t.myregexp1) || thisPost.innerHTML.match(t.myregexp2) || thisPost.innerHTML.match(t.myregexp3) || thisPost.innerHTML.match(t.myregexp4) || thisPost.innerHTML.match(t.myregexp5)) { thisPost.parentNode.removeChild(thisPost); } } if(Options.ChatOptions.DeleteFood){ // hide food alerts in alli chat var NameArray = []; if (Options.ChatOptions.DeleteFoodUsers.trim() != "") NameArray = Options.ChatOptions.DeleteFoodUsers.trim().toUpperCase().split(","); var postAuthor = document.evaluate('.//*[@class="nm"]', thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(postAuthor.snapshotItem(0)){ var postAuthorName = postAuthor.snapshotItem(0).innerHTML; if(postAuthorName != DisplayName && ((NameArray.indexOf(postAuthorName.split(" ")[1].toUpperCase()) != -1) || NameArray.length==0)){ if (thisPost.innerHTML.match(t.myregexp6)) { thisPost.parentNode.removeChild(thisPost); } } } } if(Options.ChatOptions.DeleteAlert){ // hide tower attack alerts in alli chat var NameArray = []; if (Options.ChatOptions.DeleteAlertUsers.trim() != "") NameArray = Options.ChatOptions.DeleteAlertUsers.trim().toUpperCase().split(","); var postAuthor = document.evaluate('.//*[@class="nm"]', thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(postAuthor.snapshotItem(0)){ var postAuthorName = postAuthor.snapshotItem(0).innerHTML; if(postAuthorName != DisplayName && ((NameArray.indexOf(postAuthorName.split(" ")[1].toUpperCase()) != -1) || NameArray.length==0)){ if (thisPost.outerHTML.match(t.myregexp12)) { thisPost.parentNode.removeChild(thisPost); } } } } if(Options.ChatOptions.DeleteReport){ // hide reports in alli chat var postAuthor = document.evaluate('.//*[@class="nm"]', thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if (postAuthor.snapshotItem(0)){ var postAuthorName = postAuthor.snapshotItem(0).innerHTML; if (postAuthorName != DisplayName){ if (thisPost.innerHTML.match(t.myregexp14) || thisPost.innerHTML.match(t.myregexp15)) { thisPost.parentNode.removeChild(thisPost); } } } } if(Options.ChatOptions.DeleteScout){ // hide tower scout alerts in alli chat var NameArray = []; if (Options.ChatOptions.DeleteScoutUsers.trim() != "") NameArray = Options.ChatOptions.DeleteScoutUsers.trim().toUpperCase().split(","); var postAuthor = document.evaluate('.//*[@class="nm"]', thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(postAuthor.snapshotItem(0)){ var postAuthorName = postAuthor.snapshotItem(0).innerHTML; if(postAuthorName != DisplayName && ((NameArray.indexOf(postAuthorName.split(" ")[1].toUpperCase()) != -1) || NameArray.length==0)){ if (thisPost.outerHTML.match(t.myregexp13)) { thisPost.parentNode.removeChild(thisPost); } } } } } } var ChatStuff = { chatDivContentFunc: null, getChatFunc: null, leaders: {}, ChatIcons : {}, Colors : { ChatLeaders: '#B8B8B8', ChatGlobal: '#CCCCFF', ChatAll: '#99CCFF', ChatAtt: '#FF4D4D', ChatScout: '#FF8800', ChatRecall: '#6B8E23', ChatWhisper: '#FF4D4D', ChatVC: '#00FF00', ChatChancy: '#F8E151', }, marchtimer : null, marchETA : null, marchDIR : '', BAOAttack : ['Type : ATTAQUE','Type: ATTACK','Tipo: ATTACCO','TYP: ANGRIFF','Tipo : ATACAR'], BAOScout : ['Type : ECLAIREUR','Type: SCOUT','Tipo: ESPLORAZIONE','TYP: Anerkennung','Tipo : EXPLORACION'], init: function () { var t = ChatStuff; try { if (getMyAlliance()[0] > 0) { t.getAllianceLeaders(); } t.readChatIcons(); t.chatDivContentFunc = new CalterUwFunc('Chat.chatDivContent', [['return f.join("")', 'var msg = f.join("");\n msg=chatDivContent_hook(msg,d);\n return msg;']]); uWExportFunction ('chatDivContent_hook', t.chatDivContentHook); uWExportFunction ('chatDivContent_hook2', t.chatDivContentHook2); uWExportFunction ('ptChatIconClicked', t.e_iconClicked); uWExportFunction ('ptChatReportClicked', Rpt.FindReport); uWExportFunction ('ptfetchmarch', t.fetchmarchcaller); uWExportFunction('btSelectSmiley', ChatStuff.SelectSmiley); uWExportFunction('btSelectText', SelectText); t.setEnable(Options.ChatOptions.chatEnhance); if (Options.ChatOptions.chatGlobal) { ById('mod_comm_list1').className += ' ptChatGlobal '; } if (Options.ChatOptions.chatAlliance) { ById('mod_comm_list2').className += ' ptChatAlliance '; } ChatComOverlay(); // enable chat filter buster! ChatPane.init(); // initialise chat hide functions } catch (err) { logerr(err); // write to log } }, isAvailable: function () { var t = ChatStuff; t.chatDivContentFunc.isAvailable(); }, setEnable: function (tf) { var t = ChatStuff; t.chatDivContentFunc.setEnable(tf); }, e_iconClicked: function (name) { if (ById('bot_comm_input')) var e = ById('bot_comm_input'); else var e = ById('mod_comm_input'); name = name.replace(/°°/g, "'"); e.value = '@' + name + ' '; }, chatDivContentHook2: function (msg) { var div = document.createElement('div'); div.innerHTML = msg; div.innerText = div.innerHTML; msg = div.innerHTML.toString(); return msg.htmlSpecialCharsDecode(); }, chatDivContentHook: function (msg, type) { function FormatChatTable (msg) { var f = msg.indexOf('
'); if (f >= 0) { msg = msg.replace(/
/, '
') msg = msg.replace(/\|\|/g, '
'); var a = msg.indexOf('', f); msg = msg.slice(0, a) + '
'+tx('hide')+'
' + msg.slice(a); } return msg; } var t = ChatStuff; var element_class = ''; var alliance = false; var whisper = false; var whisper2 = false; var m = /div class=\'info\'>.*<\/div>/im.exec(msg); if (m == null) return msg; if (type != null) { if (type.indexOf(uW.g_js_strings.getChat.saystoalliance) > 0) { alliance = true; } if (type.indexOf(uW.g_js_strings.getChat.whisperstoyou) > 0) { whisper = true; } if (type.indexOf(uW.g_js_strings.sendChat.whispersto) > 0) { // when local whisper it says your name! need this for tower alert whisper whisper2 = true; } } var whisp = m[0]; if (whisper) { if (Options.ChatOptions.chatWhisper) { element_class += ' ptChatWhisper '; } } else { //Global & Alliance if (Options.ChatOptions.chatBold) element_class += ' ptChatBold '; } var suid = /viewProfile\(this,([0-9]+),/i.exec(m[0]); if (!suid) { suid = uW.tvuid; } else { suid = suid[1]; } if (Options.ChatOptions.chatLeaders) { if (t.leaders[suid]) element_class += ' ptChat' + t.leaders[suid]; } var glorytitle = ''; var aid = getMyAlliance()[0]; if (Options.ChatOptions.GloryLeader && Options.ChatOptions.GloryLeaderAID==aid && Options.ChatOptions.GloryLeaderUID==suid) { element_class += ' ptChatGLORY'; glorytitle = "title='Glory: "+addCommas(Options.ChatOptions.GloryLeaderGlory)+"'"; } if (Options.ChatOptions.Rainbow && suid==uW.tvuid) { element_class += ' ptChatRAINBOW'; } if (Options.ChatOptions.chatIcons) { if (t.ChatIcons[suid]) { msg = msg.replace(/\bhttps\:\/\/[-a-z].*\'\/\>/i, "https://graph.facebook.com/" + t.ChatIcons[suid] + "/picture\'\/\>"); } else { t.getfbid(suid); } } msg = msg.replace("class='chatIcon'", " class='chatIcon' title='"+tx('Click to send a message')+"' onclick='getMessageWindow("+suid+",\"UID:"+suid+"\");return false;' "); var fchar = new RegExp(atob('rQ=='), "g"); msg = msg.replace(fchar, "").replace(/\&\#8232\;/g, ""); if ((alliance || whisper2) && Options.ChatOptions.chatAttack) { //barcode style catch if (m[0].indexOf('.::.') >= 0) { element_class = ' ptChatRecall'; msg = FormatChatTable(msg); msg = msg.replace('.::.', ''); } if (m[0].indexOf('.:..') >= 0) { element_class = ' ptChatScout'; msg = FormatChatTable(msg); msg = msg.replace('.:..', ''); } if (m[0].indexOf('..:.') >= 0) { element_class = ' ptChatAttack'; msg = FormatChatTable(msg); msg = msg.replace('..:.', ''); } // legacy if (m[0].indexOf(uW.g_js_strings.modal_messages_viewreports_view.scoutingat) >= 0) element_class = ' ptChatScout'; // detect BAO alerts for (var a=0;a= 0) { element_class = ' ptChatAttack'; break; } } for (var a=0;a= 0) { element_class = ' ptChatScout'; break; } } } //general use tables if (m[0].indexOf(':::.') >= 0) { msg = FormatChatTable(msg); msg = msg.replace(':::.', ''); } msg = msg.replace(/\|/g, '
'); msg = msg.replace("class=\'content\'", "class='content " + element_class + "' "+glorytitle); msg = msg.replace(/
/, '
') if (m[0].indexOf('Report No:') && Options.ReportOptions.NoDuplicateReports){ var rid = /(\bReport\sNo:\s([0-9]+))/g.exec(msg); if (rid) {AllianceReportsCheck.addAllianceReport({reportId:rid[2], reportUnixTime:unixTime()});} } msg = msg.replace(/(\bReport\sNo\:\s([0-9]+))/g, '$1'); msg = msg.replace(/(\bRpt\:([0-9]+))/g, '$1'); msg = msg.replace(/#([0-9]+)#/g, '$1'); if (m[0].indexOf('UID:')){ msg = msg.replace (/(\bUID:\s([0-9]+))/g, 'UID: $2 (Monitor)'); } if (m[0].indexOf('TRC:')){ msg = msg.replace (/(\bTRC:\s([0-9]+))/g, 'UID: $2 (Monitor)'); } if (m[0].indexOf('March id:') && Options.FetchMarchInfo){ var mid = /(\bMarch\sid:\s([0-9]+))/g.exec(msg); if (mid && Tabs.MarchCrawl && Tabs.MarchCrawl.CrawlResult) {t.fetchmarch(mid[2],Tabs.MarchCrawl.CrawlResult);} msg = msg.replace (/(\bMarch\sid:\s([0-9]+))/g, ''+tx('Additional March details')+' --->'); } msg = msg.replace(/(\byoutube([0-9a-z\.\?\/\=\-\_]+))/gi, '$1'); msg = msg.replace(/(\byoutu\.be([0-9a-z\.\?\/\=\-\_]+))/gi, '$1'); msg = msg.replace(/(\btinyurl([0-9a-z\.\?\/\=\-\_]+))/gi, '$1'); msg = msg.replace(/(\W)(botl)(\W)/gi, '$1$2$3'); msg = msg.replace(/(\W)(PB+)(\W)/gi, '$1$2$3'); if (KOCMON_ON) { msg = msg.replace(/(\W)(kocmon)(\W)/gi, '$1$2$3'); } msg = msg.replace(/(\W)(kocinfo)(\W)/gi, '$1$2$3'); var m = /(Lord|Lady) (.*?))/img, ''); if (Options.ChatOptions.ImagePreviews) { msg = msg.replace(/(\bi.imgur([0-9a-z\.\?\/\=\-\_]+))/gi, '
'+tx('hide')+'
'); } else { msg = msg.replace(/(\bi.imgur([0-9a-z\.\?\/\=\-\_]+))/gi, '$1'); } if (Options.ChatOptions.ImagePreviews) { msg = msg.replace(/(\bi.giphy([0-9a-z\.\?\/\=\-\_]+))/gi, '
'+tx('hide')+'
'); } else { msg = msg.replace(/(\bi.giphy([0-9a-z\.\?\/\=\-\_]+))/gi, '$1'); } if (Options.ChatOptions.ImagePreviews) { msg = msg.replace(/(\bi[0-9]+.tinypic([0-9a-z\.\?\/\=\-\_]+))/gi, '
'+tx('hide')+'
'); } else { msg = msg.replace(/(\bi[0-9]+.tinypic([0-9a-z\.\?\/\=\-\_]+))/gi, '$1'); } if (Options.ChatOptions.ImagePreviews) { msg = msg.replace(/(\bs[0-9]+.postimg([0-9a-z\.\?\/\=\-\_]+))/gi, '
'+tx('hide')+'
'); } else { msg = msg.replace(/(\bs[0-9]+.postimg([0-9a-z\.\?\/\=\-\_]+))/gi, '$1'); } if (Options.ChatOptions.Emoticons) { for (k in Smileys) { msg=replaceAll(msg,k, '',false); // no ignore case! } } for (k in ChatStyles) { if (Options.ChatOptions.Styles) { msg=replaceAll(msg,k, '',true); } else { msg=replaceAll(msg,k, '',true); } } if (Options.ChatOptions.Styles) { msg=replaceAll(msg,'[#]', '',true); } else { msg=replaceAll(msg,'[#]', '',true); } if (whisper && Options.ChatOptions.enableWhisperAlert) { AudioManager.setVolume(Options.ChatOptions.Volume); AudioManager.setSource(eval('SOUND_FILES.' + Options.ChatOptions.WhisperPlay)); AudioManager.play(); AudioManager.stoptimer = setTimeout(function () { AudioManager.stop(); }, 2500); } if ((element_class == ' ptChatAttack') && Options.ChatOptions.enableTowerAlert) { var SoundAlert = true; if (Options.ChatOptions.DeleteAlert){ var NameArray = []; if (Options.ChatOptions.DeleteAlertUsers.trim() != "") NameArray = Options.ChatOptions.DeleteAlertUsers.trim().toUpperCase().split(","); if ((NameArray.indexOf(m[2].toUpperCase()) != -1) || NameArray.length==0){ SoundAlert = false; } } if (SoundAlert) { AudioManager.setVolume(Options.ChatOptions.Volume); AudioManager.setSource(eval('SOUND_FILES.' + Options.ChatOptions.TowerPlay)); AudioManager.play(); AudioManager.stoptimer = setTimeout(function () { AudioManager.stop(); }, 5000); } } if ((element_class == ' ptChatScout') && Options.ChatOptions.enableScoutAlert) { var SoundAlert = true; if (Options.ChatOptions.DeleteScout){ var NameArray = []; if (Options.ChatOptions.DeleteScoutUsers.trim() != "") NameArray = Options.ChatOptions.DeleteScoutUsers.trim().toUpperCase().split(","); if ((NameArray.indexOf(m[2].toUpperCase()) != -1) || NameArray.length==0){ SoundAlert = false; } } if (SoundAlert) { AudioManager.setVolume(Options.ChatOptions.Volume); AudioManager.setSource(eval('SOUND_FILES.' + Options.ChatOptions.ScoutPlay)); AudioManager.play(); AudioManager.stoptimer = setTimeout(function () { AudioManager.stop(); }, 5000); } } return msg; }, getAllianceLeaders: function () { var t = ChatStuff; var params = uW.Object.clone(uW.g_ajaxparams); new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetLeaders.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if (rslt.officers) { for (var uid in rslt.officers) { var user = rslt.officers[uid]; t.leaders[user.userId] = user.type.substr(0, 4); } } }, }); }, getfbid: function (uid) { fetchPlayerCourt(uid, ChatStuff.addfbuid); }, addfbuid: function (rslt) { var t = ChatStuff; if (rslt.ok) { var uid = parseInt(rslt.playerInfo.userId); var fbid = parseInt(rslt.playerInfo.fbuid); t.ChatIcons[uid] = fbid; t.saveChatIcons(); } }, readChatIcons : function () { var t = ChatStuff; s = GM_getValue('ChatIcons'); if (s != null) { opts = JSON2.parse(s); for (var k in opts) { t.ChatIcons[k] = opts[k]; } } }, saveChatIcons : function () { var t = ChatStuff; GM_setValue('ChatIcons', JSON2.stringify(t.ChatIcons)); }, fetchmarchcaller : function(mid) { var t = ChatStuff; t.fetchmarch(mid,ChatStuff.MarchPopup); }, fetchmarch : function (mid,notify,qc) { var t = ChatStuff; if(!mid) { notify({}); return; } if (ById('ptfetchmarch')) ById('ptfetchmarch').innerHTML = tx("Fetching March")+"..."; var params = uW.Object.clone(uW.g_ajaxparams); params.rid = mid; var atimer = setTimeout(function() {notify ({errorMsg:'Fetch march timed out (March ID '+mid+')'});}, 6000); new MyAjaxRequest(uW.g_ajaxpath + "ajax/fetchMarch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { clearTimeout(atimer); if (rslt.ok){ if (qc) { var ui = []; var n = {name:'???'} ui.push(n); notify ({userInfo:ui},{userInfo:ui},rslt.march); } else { t.fetchmarchPlayerInfo(rslt.march.fromPlayerId, rslt.march.toPlayerId, notify, rslt.march); } } else { notify ({errorMsg:'Fetch march error (March ID '+mid+')'}); } }, onFailure: function () { clearTimeout(atimer); notify ({errorMsg:'AJAX error'}); }, },true); }, fetchmarchPlayerInfo : function (uid, uid2, notify, march, uidrslt) { var t = ChatStuff; var params = uW.Object.clone(uW.g_ajaxparams); params.uid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (uid2 && uid2 != 0) { t.fetchmarchPlayerInfo(uid2,0,notify,march,rslt); } else { if (!uidrslt) { notify (rslt,uidrslt,march); } else { notify (uidrslt,rslt,march); } } }, onFailure: function () { notify ({errorMsg:'AJAX error'}); }, },true); }, UpdateMarchTime : function () { var t = ChatStuff; clearTimeout(t.marchtimer); var now = unixTime(); var arrivalTime = t.marchETA - now; if (arrivalTime >= 0) { marchtime = uW.timestr(arrivalTime); t.marchtimer = setTimeout(t.UpdateMarchTime, 1000); } else { if (t.marchDIR == "") { marchtime = tx('Landed! (Please Refresh)'); } else { marchtime = tx("Completed."); } } if (ById('ptmarchtime')) { ById('ptmarchtime').innerHTML = marchtime+t.marchDIR; } }, MarchPopup : function (rslt,rslt2,march) { var t = ChatStuff; clearTimeout(t.marchtimer); var n = ''; n += ''; if (rslt.userInfo) { if (Tabs.MarchCrawl && Tabs.MarchCrawl.catalogMarch) setTimeout( function () {Tabs.MarchCrawl.catalogMarch(rslt,rslt2,march);},0); var u = rslt.userInfo[0]; var alli = 'None'; if (u.allianceName) alli = u.allianceName + FormatDiplomacy(u.allianceId); var u2; if (rslt2 && rslt2.userInfo) { u2 = rslt2.userInfo[0]; var alli2 = 'None'; if (u2.allianceName) alli2 = u2.allianceName + FormatDiplomacy(u2.allianceId); } var a = march; n += ''; n += ''; var marchStatus = parseInt(a.marchStatus); var now = unixTime(); var destinationUnixTime = convertTime(new Date(a["destinationEta"].replace(" ", "T")+"Z")) - now; var returnUnixTime = convertTime(new Date(a["returnEta"].replace(" ", "T")+"Z")) - now; if ((destinationUnixTime < 0) || (marchStatus == 8) || (marchStatus == 2)) marchdir = "Return"; else marchdir = "Count"; if (destinationUnixTime >= 0) { marchtime = uW.timestr(destinationUnixTime); t.marchETA = convertTime(new Date(a["destinationEta"].replace(" ", "T")+"Z")); t.marchDIR = ''; t.marchtimer = setTimeout(t.UpdateMarchTime, 1000); } else { if (marchStatus == 2) { marchtime = uW.g_js_strings.commonstr.encamped; } else { if (returnUnixTime < 0) { marchtime = tx("Completed")+" ("+uW.timestr(returnUnixTime*(-1)) +" "+tx('ago')+")"; } else { if (marchStatus == 8) { marchtime = uW.timestr(returnUnixTime)+' ('+uW.g_js_strings.commonstr.returning+')'; t.marchETA = convertTime(new Date(a["returnEta"].replace(" ", "T")+"Z")); t.marchDIR = ' ('+uW.g_js_strings.commonstr.returning+')'; t.marchtimer = setTimeout(t.UpdateMarchTime, 1000); } else { marchtime = tx("Waiting"); } } } } n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; var marchType = parseInt(a.marchType); if (marchType == 10) marchType=4; // Change Dark Forest type to Attack! var hint = ""; switch (marchType) { case 1: hint=uW.g_js_strings.commonstr.transport;break; case 2: hint=uW.g_js_strings.commonstr.reinforce;break; case 3: hint=uW.g_js_strings.commonstr.scout;break; case 4: hint=uW.g_js_strings.commonstr.attack;break; case 5: hint=uW.g_js_strings.commonstr.reassign;break; } n += ''; n += ''; n += ''; n += ''; var totile = tileTypes[parseInt(a["toTileType"])]; if (a["toTileType"] == 51) { if (!a["toPlayerId"]) { totile = "???"; } else { if (a["toPlayerId"] == 0) totile = 'Barb Camp'; } } totile = 'Lvl '+a["toTileLevel"]+' '+totile; n += ''; if (a["toCityId"] != 0) n += ''; if (a["toPlayerId"] != 0 && a["toPlayerId"] != a["fromPlayerId"]) n += ''; if (a["toPlayerId"] != 0 && a["toPlayerId"] != a["fromPlayerId"]) n += ''; if (a["toPlayerId"] != 0 && a["toPlayerId"] != a["fromPlayerId"]) n += ''; if (a["toPlayerId"] != 0 && a["toPlayerId"] != a["fromPlayerId"]) n += ''; n += ''; if (a["championId"] && a["championId"] != 0) { n +=''; // this is all we can get from march :/ } if (a["knightId"] > 0) n +=''; n += ''; if (a["fromSpellType"]) { var spell = uW.g_js_strings.spells['name_'+a["fromSpellType"]]; if (spell) { n +=''; } } if (a["gold"] > 0) n += ''; if (a["resource1"] > 0) n += ''; if (a["resource2"] > 0) n += ''; if (a["resource3"] > 0) n += ''; if (a["resource4"] > 0) n += ''; if (a["resource5"] > 0) n += ''; } else { n += ''; if (rslt.errorMsg) { n += ''; n += ''; } } n += '
 
'+tx('March ID')+'  '+tx('Refresh')+'
 
'+tx('Time/Status')+''+marchtime+'
 
'+uW.g_js_strings.commonstr.nametx+'' + u.genderAndName + '
UID' + MonitorLinkUID(a.fromPlayerId)+'
'+uW.g_js_strings.commonstr.might+'' + addCommas(parseInt(u.might))+'
'+uW.g_js_strings.commonstr.alliance+''+ alli +'
 
'+tx('March Type')+''+hint+'
'+tx('From')+''+coordLink(a.fromXCoord,a.fromYCoord)+'
'+tx('CityID')+''+a.fromCityId+'
 
To'+coordLink(a.toXCoord,a.toYCoord)+' '+totile+'
'+tx('CityID')+''+a.toCityId+'
'+uW.g_js_strings.commonstr.nametx+''+u2.genderAndName+'
UID'+MonitorLinkUID(a.toPlayerId)+'
'+uW.g_js_strings.commonstr.might+'' + addCommas(parseInt(u2.might))+'
'+uW.g_js_strings.commonstr.alliance+''+ alli2 +'
 
'+tx('Champion')+''+tx('Champion ID')+':'+a["championId"]+'
'+uW.g_js_strings.commonstr.knight+''+a.knightName+' (Atk:'+ a["knightCombat"]+')
'+uW.g_js_strings.commonstr.troops+''; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if((a["unit"+i+"Count"] > 0) || (a["unit"+i+"Return"] > 0)) { trpcol = Options.Colors.PanelText; original = ''; if ((marchdir == "Return") && (a["unit"+i+"Return"] < a["unit"+i+"Count"])) { trpcol = '#f00'; original = ' ('+addCommas(a["unit"+i+"Count"])+')'} n += ''+ uW.unitcost['unt'+i][0] +': '+ addCommas(a["unit"+i+marchdir])+original+' '; } } n += '
'+tx('Battle Spell')+''+spell+'
'+uW.g_js_strings.commonstr.gold+''+ addCommas(a["gold"]) +'
'+uW.g_js_strings.commonstr.food+''+ addCommas(a["resource1"]) +'
'+uW.g_js_strings.commonstr.wood+''+ addCommas(a["resource2"]) +'
'+uW.g_js_strings.commonstr.stone+''+ addCommas(a["resource3"]) +'
'+uW.g_js_strings.commonstr.ore+''+ addCommas(a["resource4"]) +'
'+tx('Aether')+''+ addCommas(a["resource5"]) +'
'+tx('March ID')+'  '+tx('Fetch')+'
 
'+rslt.errorMsg+'
'; var MarchPop = null; var off = getAbsoluteOffsets(ById('mod_comm_list2')); if (off.top<=0) { off.top = 0; } MarchPop = new CPopup('ptShowMarch', off.left, off.top, 500, 500, true, function () { clearTimeout(t.marchtimer); }); MarchPop.getTopDiv().innerHTML = '
'+tx('MARCH DETAILS')+'
'; MarchPop.getMainDiv().innerHTML = n; ById('ptfetchmarch').addEventListener('click', function () { uW.ptfetchmarch(ById('ptmid').value) }, false); MarchPop.show(true); }, SelectSmiley: function(what) { function insertAtCaret(areaId, text) { var txtarea = ById(areaId); var scrollPos = txtarea.scrollTop; var caretPos = txtarea.selectionStart; var front = (txtarea.value).substring(0, caretPos); var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length); txtarea.value = front + text + back; caretPos = caretPos + text.length; txtarea.selectionStart = caretPos; txtarea.selectionEnd = caretPos; txtarea.focus(); txtarea.scrollTop = scrollPos; }; insertAtCaret("bot_comm_input"," "+what+" ");return; }, SmileyHelp : function (){ var t = ChatStuff; if (t.smileypop) { t.smileypop.show(false); if (t.smileypop.onClose) t.smileypop.onClose(); t.smileypop.destroy(); t.smileypop = null; return; } var helpText = '
'; helpText += ''; var row=0; for (k in Smileys) { helpText += ''; } helpText += ''; for (k in ChatStyles) { helpText += ''; } helpText += ''; helpText += '
'+k+'
'+tx('Text Styles')+' 
'+ChatStyles[k]+''+k+'
'+tx('end style')+'[#]

'; var off = getOffset(ById('btEmoticonLink')); t.smileypop = new CPopup('BotHelp', off.left, off.top+20, 200, 400, true); t.smileypop.getMainDiv().innerHTML = helpText; t.smileypop.getTopDiv().innerHTML = '
'+tx("Emoticons")+'
'; t.smileypop.show (true); ResetFrameSize('BotHelp',400,200); }, } var Rpt = { reportpos:{x: -999, y: -999}, popReport:null, atkmight:0, defmight:0, FindReport: function (rpId, pageNum) { var t = Rpt; FetchReport(rpId,function(rslt) { jQuery('#viewreports_marchreport_'+rpId).removeClass('unread'); if (!rslt.ok) { var a = document.createElement("div"); a.className = "chatwrap clearfix noalliance"; a.innerHTML = "
" + rslt.msg + "
"; jQuery("#mod_comm_list" + uW.Chat.chatType).prepend(a); } else { var rpt = rslt['index']; rpt.Side0PlayerId = rslt['index']['side0PlayerId']; rpt.Side0AllianceId = rslt['index']['side0AllianceId']; rpt.Side1PlayerId = rslt['index']['side1PlayerId']; t.GetNames(rpId, rpt); } }); }, GetNames: function (rpId, rpt) { var t = Rpt; var params = uW.Object.clone(uW.g_ajaxparams); params.uid = rpt.Side1PlayerId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { rpt.side1Name = rslt['userInfo']['0']['name']; rpt.side1AllianceName = rslt['userInfo']['0']['allianceName']; if (rpt.Side0PlayerId && rpt.Side0PlayerId != 0) { var params = uW.Object.clone(uW.g_ajaxparams); params.uid = rpt.Side0PlayerId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { rpt.side0Name = rslt['userInfo']['0']['name']; rpt.side0AllianceName = rslt['userInfo']['0']['allianceName']; t.GetReport(rpId, rpt); }, }, false); } else { rpt.side0Name = uW.g_js_strings.commonstr.enemy; t.GetReport(rpId, rpt); } }, }, true); }, GetReport: function (rpId, rpt) { var t = Rpt; var side = 1; if (rpt.Side0PlayerId == uW.tvuid) { side = 0; } else { if (rpt.Side1PlayerId == uW.tvuid) { side = 1; } else { if (Seed.allianceDiplomacies) { if (parseInt(rpt.side0AllianceId) == parseInt(Seed.allianceDiplomacies.allianceId)) { side = 0; } } } } rpt.sideId = side; FetchReportDetail(rpId,side,function(rslt) { if (!rslt || rslt.error_code) actionLog('Unable to display report','REPORTS'); else t.ReportPopup(rslt, rpt, rpId); }); }, ReportPopup : function (rslt, rpt, reportId) { var t = Rpt; var m = ''; var unitImg = []; var unitName = []; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; unitName[i] = uW.unitcost['unt' + i][0]; unitImg[i] = ''; } unitName[53] = tx('Crossbows'); unitName[55] = tx('Trebuchet'); unitName[60] = uW.fortcost.frt60[0]; unitName[61] = uW.fortcost.frt61[0]; unitName[62] = uW.fortcost.frt62[0]; unitName[63] = uW.fortcost.frt63[0]; unitName[99] = uW.buildingcost.bdg31[0]; unitName[100] = uW.buildingcost.bdg30[0]; unitImg[53] = ''; unitImg[55] = ''; unitImg[60] = ''; unitImg[61] = ''; unitImg[62] = ''; unitImg[63] = ''; unitImg[99] = ''; unitImg[100] = ''; for (var i = 101; i < 111; i++) { unitName[i] = uW.g_js_strings.monsterUnitsNames["m" + i]; unitImg[i] = ''; } var trEffect = []; for (var k in uW.cm.thronestats.tiers) trEffect[k] = uW.g_js_strings.effects["name_" + k].replace("%1$s", "nn% "); var chEffect = ["hpm", "hpr", "dam", "arm", "str", "dex", "con", "hit", "cri", "blk"]; var chEffectName = [uW.g_js_strings.champion_stats.hp, uW.g_js_strings.report_view.hp_remaining, uW.g_js_strings.champion_stats.damage, uW.g_js_strings.effects.name_203, uW.g_js_strings.effects.name_204, uW.g_js_strings.effects.name_205, uW.g_js_strings.effects.name_206, uW.g_js_strings.effects.name_207, uW.g_js_strings.effects.name_208, uW.g_js_strings.effects.name_209]; rpt.marchName = '?'; if (rpt.marchType == 0) rpt.marchName = tx('Desertion'); else if (rpt.marchType == 1) rpt.marchName = uW.g_js_strings.commonstr.transport; else if (rpt.marchType == 2) rpt.marchName = uW.g_js_strings.commonstr.reinforce; else if (rpt.marchType == 3) { if (rpt.sideId == 0) rpt.marchName = tx('Anti-Scout'); else rpt.marchName = uW.g_js_strings.commonstr.scout; } else if (rpt.marchType == 4) { if (rpt.sideId == 0) rpt.marchName = uW.g_js_strings.commonstr.defend; else rpt.marchName = uW.g_js_strings.commonstr.attack; } else if (rpt.marchType == 9) rpt.marchName = uW.g_js_strings.commonstr.raid; else if (rpt.marchType == 10) rpt.marchName = uW.g_js_strings.commonstr.darkForest; if (parseInt(rpt.side0TileType) <= 50) rpt.side0TileTypeText = tileTypes[parseInt(rpt.side0TileType)]; else if (parseInt(rpt.side0TileType) == 57) rpt.side0TileTypeText = tx('Runic Megalith'); else if (parseInt(rpt.side0CityId) == 0) rpt.side0TileTypeText = tx('Barb Camp'); else rpt.side0TileTypeText = tx('City'); var koth=false; if (parseInt(rpt.side0TileType) == 57) koth=true; function buildHeader() { var h = '
'; h += '
'; h += formatUnixTime(rpt.reportUnixTime); h += '
'; h += ''+tx('Glory Gained')+': '; if (parseInt(rpt.side0TileType) == 57){ if(rpt.sideId == 0){ h += rslt['fght']["s0"]["glory"];}if(rpt.sideId == 1){ h += rslt['fght']["s1"]["glory"];}} else{ if (rslt['glory']) h += addCommas(rslt['glory']);else h += '0';} h += '
'; h += '
'; if (rpt.side0TileTypeText != tx('City') && rpt.side0TileTypeText != tx('Barb Camp') && rpt.marchType == 4) { if (rpt.sideId == 0) { if (rslt['conquered'] != 0) { h += ''+tx('Conquered')+''; } else { h += ''+tx('Secured')+''; } } else { if (rslt['conquered'] != 0) { h += ''+tx('Conquered')+''; } else { h += ''+tx('Secured')+''; } } } else if ((rslt['winner'] == 1 && rpt.sideId == 0) || (rslt['winner'] == 0 && rpt.sideId == 1)) { if (rpt.marchName == uW.g_js_strings.commonstr.scout) h += ''+tx('Scouting Failed')+''; else h += ''+tx('You were defeated')+''; } else if (rslt['winner'] == 0 && rpt.sideId == 0) h += ''+tx('You defended successfully')+'!'; else if (rslt['winner'] == 1 && rpt.sideId == 1) { if (rpt.marchName == uW.g_js_strings.commonstr.scout) h += ''+tx('Scouting Report')+''; else h += ''+tx('You were victorious')+'!'; } h += '
'; h += '
'; h += 'Report No: ' + reportId; h += '
'; if ((rpt.side1PlayerId && (rpt.side1PlayerId == uW.tvuid)) || (rpt.side0PlayerId && (rpt.side0PlayerId == uW.tvuid))) { h += ' '; } //Delete button for own reports h += '
'; return h; } function formatTroopLine(side,unit_type,overwhelmed,fought,survived) { var t = Rpt; var n = ''; n += ''+unitImg[unit_type]+''+unitName[unit_type]+''; if (overwhelmed) { n += '???'; n += '???'; if (fought > 0) { n += '(' + addCommas(fought) + ')'; if (side=="s0" && unit_type<50) { t.defmight += parseInt(uW.unitmight['unt'+unit_type] * fought); } if (side=="s0" && unit_type>=50 && unit_type<99) { var fm = parseIntNan(fortmight['f'+unit_type]); t.defmight += parseInt(fm * fought); } } else { n += '0'; } } else { var killed = parseInt(fought)-parseInt(survived); if (killed > 0) { n += '' + addCommas(fought) + ''; n += '' + addCommas(survived) + ''; n += '(' + addCommas(killed) + ')'; if (side=="s1") { t.atkmight += parseInt(uW.unitmight['unt'+unit_type] * killed); } if (side=="s0" && unit_type<51) { t.defmight += parseInt(uW.unitmight['unt'+unit_type] * killed); } if (side=="s0" && unit_type>=51 && unit_type<99) { var fm = parseIntNan(fortmight['f'+unit_type]); t.defmight += parseInt(fm * killed); } } else { n += '' + addCommas(fought) + ''; n += '' + addCommas(survived) + ''; } } return n; }; function buildBattle() { var t = Rpt; var m = ''; t.atkmight = 0; t.defmight = 0; //header m += '
'+tx('Battle Results').toUpperCase()+'
'; //summary m += '
'; //summary - attacker m += '
'; m += ''+tx('Attackers')+': '+rpt.side1Name+' ('+rpt.side1XCoord+','+rpt.side1YCoord+') '; if (rslt['winner'] == 1) m += ' '+tx('Winner')+''; m += '
'; if (rpt.side1AllianceId && (rpt.side1AllianceId != 0)) m += uW.g_js_strings.commonstr.alliance+': '+rpt.side1AllianceName+'
'; if (rpt.side1PlayerId && (rpt.side1PlayerId != 0)) m += 'UID: '+MonitorLinkUID(rpt.side1PlayerId)+'
'; if (rpt.marchName == uW.g_js_strings.commonstr.attack || rpt.marchName == uW.g_js_strings.commonstr.defend) m += tx('Knight Combat Skill')+': '+rslt['s1KCombatLv']+'
'; if (rslt['s1spell'] && (rslt['s1spell'] != "0")) { m += tx('Spell Used')+': '+uW.g_js_strings.spells['name_' + rslt['s1spell']]+'
'; } m += ' 
'; //summary - defender m += '
'; m += ''+tx('Defenders')+' ' + rpt.side0Name + ' (' + rpt.side0XCoord + ',' + rpt.side0YCoord + ') '; if (rslt['winner'] == 0) m += ' '+tx('Winner')+''; m += '
'; if (rpt.side0AllianceId && (rpt.side0AllianceId != 0)) m += uW.g_js_strings.commonstr.alliance+': ' + rpt.side0AllianceName + '
'; if (rpt.side0PlayerId && (rpt.side0PlayerId != 0)) m += 'UID:' + MonitorLinkUID(rpt.side0PlayerId) + '
'; if (rpt.marchName == uW.g_js_strings.commonstr.attack || rpt.marchName == uW.g_js_strings.commonstr.defend) m += tx('Knight Combat Skill')+': ' + rslt['s0KCombatLv'] + '
'; if (rslt['s0spell'] && (rslt['s0spell'] != "0")) { m += tx('Spell Used')+': ' + uW.g_js_strings.spells['name_' + rslt['s0spell']] + '
'; } if (rslt['fght']["s0"] && rpt.side0PlayerId && (rpt.side0PlayerId != 0)) { m += ' 
'; } if (rslt['rnds']) m += tx('Rounds')+': ' + rslt['rnds'] + '
'; if (rslt['darkForestConflict']) { m += uW.g_js_strings.report_view.darkForestConflict; } else { if (rpt.marchName == uW.g_js_strings.commonstr.attack || rpt.marchName == uW.g_js_strings.commonstr.defend) { if (rpt.side0TileTypeText != tx('City') && rpt.side0TileTypeText != tx('Barb Camp')) { if (rslt['conquered'] != 0) m += tx('Attackers conquered the')+' '+rpt.side0TileTypeText+'.'; else if (rslt['conquered'] == 0) m += tx('Attackers did not conquer the')+' '+rpt.side0TileTypeText+'.'; } else { if (rslt['wall']) { if (rslt['wall'] == 100) m += tx('Attackers breached the walls')+'.'; else m += tx('Attackers did not breach the walls')+'. '+tx('The walls are')+' ' + rslt['wall'] + '% '+tx('damaged'); } } } } m += '
'; m += '
'; //end battlesummary div //troops m += '
'; //troops - attacker m += '
'; if (rslt['fght']["s1"]) { m += ''; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (rslt['fght']["s1"]['u'+i]) { m += formatTroopLine("s1",i,false,rslt['fght']["s1"]['u'+i][0],rslt['fght']["s1"]['u'+i][1]); } } } m += '
'+uW.g_js_strings.commonstr.troops+''+tx('Fought')+''+tx('Survived')+''+tx('Killed')+'
'; //troops - defender m += '
'; m += ''; if (rslt['fght']["s0"]) { m += ''; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (rslt['fght']["s0"]['u'+i] && rslt['fght']["s0"]['u'+i][0]!=null) { m += formatTroopLine("s0",i,rslt.overwhelmed,rslt['fght']["s0"]['u'+i][0],rslt['fght']["s0"]['u'+i][1]); } } for (var i = 53; i <= 55; i++) { if (rslt['fght']["s0"]['f'+i]) { m += formatTroopLine("s0",i,rslt.overwhelmed,rslt['fght']["s0"]['f'+i][0],rslt['fght']["s0"]['f'+i][1]); } } for (var i = 60; i <= 63; i++) { if (rslt['fght']["s0"]['f'+i]) { m += formatTroopLine("s0",i,rslt.overwhelmed,rslt['fght']["s0"]['f'+i][0],rslt['fght']["s0"]['f'+i][1]); } } for (var i = 99; i <= 100; i++) { if (rslt['fght']["s0"]['u'+i] && rslt['fght']["s0"]['u'+i][0]!=null) { m += formatTroopLine("s0",i,rslt.overwhelmed,rslt['fght']["s0"]['u'+i][0],rslt['fght']["s0"]['u'+i][1]); } } for (var i = 101; i <= 110; i++) { if (rslt['fght']["s0"]['m'+i]) { m += formatTroopLine("s0",i,rslt.overwhelmed,rslt['fght']["s0"]['m'+i][0],rslt['fght']["s0"]['m'+i][1]); } } } else { m += ''; } m += '
'+uW.g_js_strings.commonstr.troops+''+tx('Fought')+''+tx('Survived')+''+tx('Killed')+'
'+tx('No Troops Defended')+'
'; m += '
'; m += '
'; //end troops div m += '
'; return m; } function formatTroopStat(Attr,name,spelltitle,unitId,pulseHits) { var TroopString = ''; var TroopStyle = ''; var TroopTitle = ''; if (Attr) { if (Attr[0] < Attr[1]) TroopStyle = 'color:green'; if (Attr[1] < Attr[0]) TroopStyle = 'color:red'; if (Attr[1]!=Attr[0] && Attr[0]!=0) TroopTitle = 'title="'+Math.round((Attr[1]-Attr[0])/Math.round(Attr[0])*100*100)/100+'%"'; if (spelltitle) { if (unitId==38 || unitId==49) { TroopTitle = 'title="'+uW.g_js_strings.report_view["spellcaster" + unitId].replace("%2$s", addCommas(Math.round(Attr[1] * 100) / 100))+'"'; if (unitId==38) { TroopTitle = TroopTitle.replace("%1$s%", pulseHits); } else { TroopTitle = TroopTitle.replace("%1$s", pulseHits); } } else { if (unitId==41) { TroopTitle = 'title="'+uW.g_js_strings.report_view["spellcaster" + unitId].replace("%2$s", addCommas(Math.round(Attr[1] * 100) / 100))+'"'; TroopTitle = TroopTitle.replace("%1$s", addCommas(Math.round(pulseHits * 100) / 100)); } else { if (unitId==39 || unitId==40 || unitId==43) { TroopTitle = 'title="'+uW.g_js_strings.report_view["spellcaster" + unitId].replace("%1$s%", addCommas(pulseHits))+'"'; } else { TroopTitle = 'title="'+uW.g_js_strings.report_view["spellcaster" + unitId].replace("%1$s", addCommas(Math.round(Attr[1] * 100) / 100))+'"'; } } } } if (unitId==38 || unitId==49) { TroopString = ''+tx(name)+': ' + pulseHits + ' / '+addCommas(Math.round(Attr[1] * 100) / 100) + '%'; } else { if (unitId==41) { TroopString = ''+tx(name)+': ' + addCommas(Math.round(pulseHits * 100) / 100) + '% / '+addCommas(Math.round(Attr[1] * 100) / 100)+'%'; } else { if (unitId==39 || unitId==40 || unitId==43) { TroopString = ''+tx(name)+': ' + addCommas(pulseHits) + ''; } else { TroopString = ''+tx(name)+': ' + addCommas(Math.round(Attr[1] * 100) / 100) + ''; } } } } return TroopString; }; function buildTroopStats() { var m = ''; if (rslt['bonus']) { //header m += '
 '+uW.g_js_strings.report_view.troop_stats.toUpperCase()+'
'; //stats m += '
'; //troops - attacker - stats m += '
'; if (rslt['fght']["s1"]) { for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (rslt['fght']["s1"]['u'+i] && rslt['bonus']['mod']["s1"]['u'+i]) { m += '
' + unitImg[i] + '
'; m += '
'; m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['hp'],'HP'); m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['atk'],'Atk'); m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['def'],'Def'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['spd'],'Spd'); m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['rng'],'Rng'); m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['ld'],'Ld'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['sp'],'Spell'); if(i==38) { m += formatTroopStat([rslt['bonus']['mod']['s1']['u'+i]['pulseBuff'],rslt['bonus']['mod']['s1']['u'+i]['pulseBuff']],'Effect',true,i,rslt['bonus']['mod']['s1']['u'+i]['pulseHits']); } else { if(i==41) { m += formatTroopStat([rslt['bonus']['mod']['s1']['u'+i]['troopSpeedBuff'],rslt['bonus']['mod']['s1']['u'+i]['troopSpeedBuff']],'Effect',true,i,rslt['bonus']['mod']['s1']['u'+i]['troopLoadBuff']); } else { if(i==39) { m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['spellEffect'],'Effect',true,i,rslt['bonus']['mod']['s1']['u'+i]['lWitchHits']); } else { if(i==40) { m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['spellEffect'],'Effect',true,i,rslt['bonus']['mod']['s1']['u'+i]['draHits']); } else { if(i==43) { m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['spellEffect'],'Effect',true,i,rslt['bonus']['mod']['s1']['u'+i]['giantHits']); } else { if(i==49) { m += formatTroopStat([rslt['bonus']['mod']['s1']['u'+i]['curseBuff'],rslt['bonus']['mod']['s1']['u'+i]['curseBuff']],'Effect',true,i,rslt['bonus']['mod']['s1']['u'+i]['curseHits']); } else { m += formatTroopStat(rslt['bonus']['mod']['s1']['u'+i]['spellEffect'],'Effect',true,i); } } } } } } m += '
'; } } } m += '
'; //troops - defender - stats m += '
'; if (rslt['fght']["s0"]) { for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (rslt['fght']["s0"]['u'+i] && rslt['bonus']['mod']["s0"]['u'+i]) { m += '
' + unitImg[i] + '
'; m += '
'; m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['hp'],'HP'); m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['atk'],'Atk'); m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['def'],'Def'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['spd'],'Spd'); m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['rng'],'Rng'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['sp'],'Spell'); if(i==38) { m += formatTroopStat([rslt['bonus']['mod']['s0']['u'+i]['pulseBuff'],rslt['bonus']['mod']['s0']['u'+i]['pulseBuff']],'Effect',true,i,rslt['bonus']['mod']['s0']['u'+i]['pulseHits']); } else { if(i==41) { m += formatTroopStat([rslt['bonus']['mod']['s0']['u'+i]['troopSpeedBuff'],rslt['bonus']['mod']['s0']['u'+i]['troopSpeedBuff']],'Effect',true,i,rslt['bonus']['mod']['s0']['u'+i]['troopLoadBuff']); } else { if(i==39) { m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['spellEffect'],'Effect',true,i,rslt['bonus']['mod']['s0']['u'+i]['lWitchHits']); } else { if(i==40) { m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['spellEffect'],'Effect',true,i,rslt['bonus']['mod']['s0']['u'+i]['draHits']); } else { if(i==43) { m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['spellEffect'],'Effect',true,i,rslt['bonus']['mod']['s0']['u'+i]['giantHits']); } else { if(i==49) { m += formatTroopStat([rslt['bonus']['mod']['s0']['u'+i]['curseBuff'],rslt['bonus']['mod']['s0']['u'+i]['curseBuff']],'Effect',true,i,rslt['bonus']['mod']['s0']['u'+i]['curseHits']); } else { m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['spellEffect'],'Effect',true,i); } } } } } } m += '
'; } } for (var i = 53; i <= 55; i++) { if (rslt['fght']["s0"]['f'+i] && rslt['bonus']['mod']['s0']['f'+i]) { m += '
' + unitImg[i] + '
'; m += '
'; m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['hp'],'HP'); m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['atk'],'Atk'); m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['def'],'Def'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['spd'],'Spd'); m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['rng'],'Rng'); m += '
'; } } for (var i = 60; i <= 63; i++) { if (rslt['fght']["s0"]['f'+i] && rslt['bonus']['mod']['s0']['f'+i]) { m += '
' + unitImg[i] + '
'; m += '
'; m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['hp'],'HP'); m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['atk'],'Atk'); m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['def'],'Def'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['spd'],'Spd'); m += formatTroopStat(rslt['bonus']['mod']['s0']['f'+i]['rng'],'Rng'); m += '
'; } } for (var i = 99; i <= 100; i++) { if (rslt['fght']["s0"]['u'+i] && rslt['bonus']['mod']["s0"]['u'+i]) { m += '
' + unitImg[i] + '
'; m += '
'; m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['hp'],'HP'); m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['atk'],'Atk'); m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['def'],'Def'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['spd'],'Spd'); m += formatTroopStat(rslt['bonus']['mod']['s0']['u'+i]['rng'],'Rng'); m += '
'; } } for (var i = 101; i <= 110; i++) { if (rslt['fght']["s0"]['m'+i] && rslt['bonus']['mod']['s0']['m'+i]) { m += '
' + unitImg[i] + '
'; m += '
'; m += formatTroopStat(rslt['bonus']['mod']['s0']['m'+i]['hp'],'HP'); m += formatTroopStat(rslt['bonus']['mod']['s0']['m'+i]['atk'],'Atk'); m += formatTroopStat(rslt['bonus']['mod']['s0']['m'+i]['def'],'Def'); m += ''; m += formatTroopStat(rslt['bonus']['mod']['s0']['m'+i]['spd'],'Spd'); m += formatTroopStat(rslt['bonus']['mod']['s0']['m'+i]['rng'],'Rng'); m += '
'; } } } m += '
'; m += '
 
'; m += '
'; //end reportTroopStats div } return m; } function buildChampDuel() { var m = ''; if (rslt['champion_stats']) { s1name = rslt.champion_stats['s1'].nam; s1win = rslt.champion_stats['s1'].won; s1percent = Math.round(1000*parseIntNan(rslt.champion_stats['s1'].hpr)/parseIntNan(rslt.champion_stats['s1'].hpm))/10; s0name = rslt.champion_stats['s0'].nam; s0win = rslt.champion_stats['s0'].won; s0percent = Math.round(1000*parseIntNan(rslt.champion_stats['s0'].hpr)/parseIntNan(rslt.champion_stats['s0'].hpm))/10; if ((s1name != '') || (s0name != '') || s1win || s0win) { //header m += '
 '+tx('Champion Duel').toUpperCase()+'
'; //summary m += '
'; m += '
'; m += '
'; if ((s1name == '') && (s1win || s0win)) { s1name = uW.g_js_strings.champ.no_champ; } if (s1win) { s1name += ' ('+tx('Winner')+')'; } m += '' + s1name + '
'; for (var i = 1; i < chEffect.length; i++) { if (rslt.champion_stats['s1'][chEffect[i]]) { m += chEffectName[i] + ': ' + rslt.champion_stats['s1'][chEffect[i]]; if (i==1&&s1win) m += ' ('+s1percent+'%)'; m += '
'; } } m += '
'; //attacker m += '
'; if ((s0name == '') && (s1win || s0win)) { s0name = uW.g_js_strings.champ.no_champ; } if (s0win) { s0name += ' ('+tx('Winner')+')'; } m += '' + s0name + '
'; for (var i = 1; i < chEffect.length; i++) { if (rslt.champion_stats['s0'][chEffect[i]]) { m += chEffectName[i] + ': ' + rslt.champion_stats['s0'][chEffect[i]]; if (i==1&&s0win) m += ' ('+s0percent+'%)'; m += '
'; } } m += '
'; //defender m += '
'; //ChampStatContainer m += '
 
'; if (rslt.bonus) { if (rslt.bonus['chp']) { m+='
'; m+='
'; m+=''+tx('Champion Adjustments')+'
'; if (rslt.bonus['chp']['s0'] || rslt.bonus['chp']['s1']) { for (var i in uW.cm.thronestats.tiers) { trEffect[i] = uW.g_js_strings.throneRoom["effectName_" + i]; var TRStyles = getTREffectStyle(i); if (rslt.bonus['chp']['s1'] && rslt.bonus['chp']['s1'][0][i]) { m+=''; } if (rslt.bonus['chp']['s0'] && rslt.bonus['chp']['s0'][1][i]) { m+=''; } } } m+='
' + TRStyles.LineStyle + trEffect[i] +': ' + (Math.round(rslt.bonus['chp']['s1'][0][i]*100)/100) + TRStyles.EndStyle + '
' + TRStyles.LineStyle + trEffect[i] +': ' + (Math.round(rslt.bonus['chp']['s0'][1][i]*100)/100) + TRStyles.EndStyle + '

' m+='
';//attacker m+='
'; m+=''+tx('Champion Adjustments')+'
'; if (rslt.bonus['chp']['s0'] || rslt.bonus['chp']['s1']) { for (var i in uW.cm.thronestats.tiers) { trEffect[i] = uW.g_js_strings.throneRoom["effectName_" + i]; var TRStyles = getTREffectStyle(i); if (rslt.bonus['chp']['s0'] && rslt.bonus['chp']['s0'][0][i]) { m+=''; } if (rslt.bonus['chp']['s1'] && rslt.bonus['chp']['s1'][1][i]) { m+=''; } } } m+='
' + TRStyles.LineStyle + trEffect[i] +': ' + (Math.round(rslt.bonus['chp']['s0'][0][i]*100)/100) + TRStyles.EndStyle + '
' + TRStyles.LineStyle + trEffect[i] +': ' + (Math.round(rslt.bonus['chp']['s1'][1][i]*100)/100) + TRStyles.EndStyle + '

' m+='
';//defender m+='
';//ChampAdjContainer m+='
 
'; } } m += '
'; //reportChampDuel } } return m; } function buildThroneStats() { var m = ''; //header m += '
 '+tx('Throne Stats').toUpperCase()+'
'; //summary m += '
'; m += '
'; var SortOrder = []; if (Options.AlternateSortOrder) { for (var z in AlternateSortOrder) SortOrder.push(AlternateSortOrder[z]); } else { for (var z in trEffect) SortOrder.push(z); } if (rslt['s1ThroneRoomBoosts']) { for (var id in rslt['s1ThroneRoomBoosts']) { if (CompositeEffects.hasOwnProperty(id)) { var Composite = CompositeEffects[id] for (var e=0;e
'; } } } else { m += ' '; } m += '
'; //attacker m += '
'; if (rslt['s0ThroneRoomBoosts']) { for (var id in rslt['s0ThroneRoomBoosts']) { if (CompositeEffects.hasOwnProperty(id)) { var Composite = CompositeEffects[id] for (var e=0;e
'; } } } else { m += ' '; } m += '
'; //defender m += '
 
'; m += '
'; //throne container return m; } function buildBoosts() { var m = ''; //header m += '
 '+tx('Troop Adjustments').toUpperCase()+'
'; //summary m += '
'; if (rslt['s1atkBoost'] || rslt['s1defBoost'] || rslt['s1lifeBoost'] || rslt['s0atkBoost'] || rslt['s0defBoost'] || rslt['s0lifeBoost']) { m += '
'; m += ''+tx('Item Boosts')+'
'; if (rslt['s1atkBoost']) m += tx('Attack Boosted')+': ' + 100 * rslt['s1atkBoost'] + '%
'; if (rslt['s1defBoost']) m += tx('Defence Boosted')+': ' + 100 * rslt['s1defBoost'] + '%
'; if (rslt['s1lifeBoost']) m += tx('Health Boosted')+': ' + 100 * rslt['s1lifeBoost'] + '%
'; m += '
'; //attacker m += '
'; m += ''+tx('Item Boosts')+'
'; if (rslt['s0atkBoost']) m += tx('Attack Boosted')+': ' + 100 * rslt['s0atkBoost'] + '%
'; if (rslt['s0defBoost']) m += tx('Defence Boosted')+': ' + 100 * rslt['s0defBoost'] + '%
'; if (rslt['s0lifeBoost']) m += tx('Health Boosted')+': ' + 100 * rslt['s0lifeBoost'] + '%
'; m += '
'; //defender m += '
 
'; } if (rslt['arcaneBonus'] && (rslt['arcaneBonus']['s0AllianceBonus'] || rslt['arcaneBonus']['s1AllianceBonus'])) { m += '
'; m += ''+tx('Arcane Temple Boosts')+' ('+tx('Alliance')+')
'; if (rslt['arcaneBonus']['s1AllianceBonus']) { var ArcBonus = rslt['arcaneBonus']['s1AllianceBonus']; for (var z in ArcBonus) { if (ArcBonus.hasOwnProperty(z)) { var ArcName = uW.itemlist['i'+ArcBonus[z].itemId].name + ' - ' + uW.itemlist['i'+ArcBonus[z].itemId].description; m += ArcName + ': ' + ArcBonus[z].effect + '%
'; } } } m += '
'; //attacker m += '
'; m += ''+tx('Arcane Temple Boosts')+' ('+tx('Alliance')+')
'; if (rslt['arcaneBonus']['s0AllianceBonus']) { var ArcBonus = rslt['arcaneBonus']['s0AllianceBonus']; for (var z in ArcBonus) { if (ArcBonus.hasOwnProperty(z)) { var ArcName = uW.itemlist['i'+ArcBonus[z].itemId].name + ' - ' + uW.itemlist['i'+ArcBonus[z].itemId].description; m += ArcName + ': ' + ArcBonus[z].effect + '%
'; } } } m += '
'; //defender m += '
 
'; } if (rslt['arcaneBonus'] && (rslt['arcaneBonus']['s0PersonalBonus'] || rslt['arcaneBonus']['s1PersonalBonus'])) { m += '
'; m += ''+tx('Arcane Temple Boosts')+' ('+tx('Personal')+')
'; if (rslt['arcaneBonus']['s1PersonalBonus']) { var ArcBonus = rslt['arcaneBonus']['s1PersonalBonus']; for (var z in ArcBonus) { if (ArcBonus.hasOwnProperty(z)) { var ArcName = uW.itemlist['i'+ArcBonus[z].itemId].name + ' - ' + uW.itemlist['i'+ArcBonus[z].itemId].description; m += ArcName + ': ' + ArcBonus[z].effect + '%
'; } } } m += '
'; //attacker m += '
'; m += ''+tx('Arcane Temple Boosts')+' ('+tx('Personal')+')
'; if (rslt['arcaneBonus']['s0PersonalBonus']) { var ArcBonus = rslt['arcaneBonus']['s0PersonalBonus']; for (var z in ArcBonus) { if (ArcBonus.hasOwnProperty(z)) { var ArcName = uW.itemlist['i'+ArcBonus[z].itemId].name + ' - ' + uW.itemlist['i'+ArcBonus[z].itemId].description; m += ArcName + ': ' + ArcBonus[z].effect + '%
'; } } } m += '
'; //defender m += '
 
'; } if (rslt['s1guardianAtkBoost'] || rslt['s1guardianDefBoost'] || rslt['s1guardianMarchBoost'] || rslt['s1guardianTrainBoost'] || rslt['s0guardianAtkBoost'] || rslt['s0guardianDefBoost'] || rslt['s0guardianMarchBoost'] || rslt['s0guardianTrainBoost']) { m += '
'; m += ''+tx('Guardian Boosts')+'
'; if (rslt['s1guardianAtkBoost']) m += tx('Guardian Attack Boost')+': ' + parseFloat(100 * rslt['s1guardianAtkBoost']).toFixed(1) + '%
'; if (rslt['s1guardianDefBoost']) m += tx('Guardian Life Boost')+': ' + parseFloat(100 * rslt['s1guardianDefBoost']).toFixed(1) + '%
'; if (rslt['s1guardianMarchBoost']) m += tx('Guardian March Speed Boost')+': ' + parseFloat(100 * rslt['s1guardianMarchBoost']).toFixed(1) + '%
'; if (rslt['s1guardianTrainBoost']) m += tx('Guardian Training Boost')+': ' + parseFloat(100 * rslt['s1guardianTrainBoost']).toFixed(1) + '%
'; m += '
'; //attacker m += '
'; m += ''+tx('Guardian Boosts')+'
'; if (rslt['s0guardianAtkBoost']) m += tx('Guardian Attack Boost')+': ' + parseFloat(100 * rslt['s0guardianAtkBoost']).toFixed(1) + '%
'; if (rslt['s0guardianDefBoost']) m += tx('Guardian Life Boost')+': ' + parseFloat(100 * rslt['s0guardianDefBoost']).toFixed(1) + '%
'; if (rslt['s0guardianMarchBoost']) m += tx('Guardian March Speed Boost')+': ' + parseFloat(100 * rslt['s0guardianMarchBoost']).toFixed(1) + '%
'; if (rslt['s0guardianTrainBoost']) m += tx('Guardian Training Boost')+': ' + parseFloat(100 * rslt['s0guardianTrainBoost']).toFixed(1) + '%
'; m += '
'; //defender m += '
 
'; } if (rslt.bonus) { if (rslt.bonus['tch'] || rslt.bonus['tch2']) { m += '
'; m += ''+tx('Research')+'
'; if (rslt.bonus['tch']) { for (var t1l in rslt.bonus.tch.s1) { var normaltech = ''; if (t1l == 'hp') normaltech = tx('Health'); if (t1l == 'atk') normaltech = uW.g_js_strings.commonstr.attack; if (t1l == 'def') normaltech = uW.g_js_strings.commonstr.defense; if (t1l == 'spd') normaltech = tx('Speed'); if (t1l == 'rng') normaltech = tx('Range'); if (t1l == 'ld') normaltech = tx('Load'); if (normaltech != '') m += normaltech + ': ' + parseFloat(rslt.bonus.tch.s1[t1l] * 100).toFixed(0) + '%
'; } } if (rslt.bonus['tch2']) { for (var t2l in rslt.bonus.tch2.s1) { var britontech = ''; if (t2l == 'ic') britontech = uW.g_js_strings.commonstr.improved; if (t2l == 'id') britontech = uW.g_js_strings.commonstr.improved_def; if (t2l == 'sr') britontech = uW.g_js_strings.commonstr.strengthen_ranks; if (t2l == 'if') britontech = uW.g_js_strings.commonstr.improved_fletching; if (britontech != '') m += britontech + ': ' + parseFloat(rslt.bonus.tch2.s1[t2l] * 100).toFixed(0) + '%
'; } } m += '
'; //attacker m += '
'; m += ''+tx('Research')+'
'; if (rslt.bonus['tch']) { for (var t1l in rslt.bonus.tch.s0) { var normaltech = ''; if (t1l == 'hp') normaltech = tx('Health'); if (t1l == 'atk') normaltech = uW.g_js_strings.commonstr.attack; if (t1l == 'def') normaltech = uW.g_js_strings.commonstr.defense; if (t1l == 'spd') normaltech = tx('Speed'); if (t1l == 'rng') normaltech = tx('Range'); if (normaltech != '') m += normaltech + ': ' + parseFloat(rslt.bonus.tch.s0[t1l] * 100).toFixed(0) + '%
'; } } if (rslt.bonus['tch2']) { for (var t2l in rslt.bonus.tch2.s0) { var britontech = ''; if (t2l == 'ic') britontech = uW.g_js_strings.commonstr.improved; if (t2l == 'id') britontech = uW.g_js_strings.commonstr.improved_def; if (t2l == 'sr') britontech = uW.g_js_strings.commonstr.strengthen_ranks; if (t2l == 'if') britontech = uW.g_js_strings.commonstr.improved_fletching; if (britontech != '') m += britontech + ': ' + parseFloat(rslt.bonus.tch2.s0[t2l] * 100).toFixed(0) + '%
'; } } } m += '
'; //defender m += '
 
'; } m += '
'; //boosts m += '
'; return m; } function handleLoot() { var m = ''; if (rslt['loot'] || rslt['throneRoomDrop'] || rslt['equipmentDrop'] || rslt['lootJewel']) { m += '
'+uW.g_js_strings.commonstr.loot.toUpperCase()+'
'; if (rslt['loot']) { m += ''; m += ''; else m += '0' m += ''; else m += '0'; m += ''; else m += '0' m += ''; else m += '0'; m += ''; else m += '0' m += ''; else { m += '0'; } m += '' } if ((rslt['loot'] && rslt['loot'][5]) || rslt['throneRoomDrop'] || rslt['equipmentDrop'] || rslt['lootJewel']) { var itemdetails = ''; var thronedetails = ''; var equipdetails = ''; var jeweldetails = ''; if (rslt['loot'] && rslt['loot'][5] && JSON2.stringify(rslt['loot'][5]) != '[]') { // crapola var D = true; if (parseInt(rpt.side0TileType) == 57) { D = ((rslt['winner'] == 1 && rpt.sideId == 1) || (rslt['winner'] == 0 && rpt.sideId == 0)); } if (D) { for (var item in rslt['loot'][5]) { var amt=""; if (rslt['loot'][5][item] != 1) { amt = ' ('+rslt['loot'][5][item]+')';} var itemurl = parseInt(item); if (itemurl > 30669 && itemurl < 32111) itemurl = 30303; itemdetails += ' ' + uW.itemlist['i' + item].name + amt +'   '; } } } if (rslt['throneRoomDrop']) { var TR = rslt['throneRoomDrop']; var thronename = CardQuality(TR.quality)+" "+uW.g_js_strings.throneRoom[TR.type]+" "+uW.g_js_strings.commonstr.of+" "+uW.g_js_strings.effects["suffix_"+TR.effects.slot5.id]+" ("+uW.g_js_strings.commonstr[TR.faction]+")"; var TRCard = {}; TRCard.id = TR.id; TRCard.name = CardQuality(TR.quality)+" "+uW.g_js_strings.throneRoom[TR.type]+" "+uW.g_js_strings.commonstr.of+" "+uW.g_js_strings.effects["suffix_"+TR.effects.slot5.id]; TRCard.faction = TR.faction; TRCard.type = TR.type; TRCard.unique = parseIntNan(TR.unique); TRCard.level = TR.level; TRCard.quality = TR.quality; TRCard.createPrefix = function () { return ""; }; TRCard.createSuffix = function () { return ""; }; TRCard.effects = {}; var slot = 0; for (var k in TR.effects) { slot++ TRCard.effects["slot"+slot] = {}; TRCard.effects["slot"+slot].id = TR.effects[k].id; TRCard.effects["slot"+slot].tier = TR.effects[k].tier; } thronedetails += ' ' + thronename + ''+Tabs.Reference.DisplayTRCard(TRCard,false)+'   '; } if (rslt['equipmentDrop']) { var EQ = rslt['equipmentDrop']; var equipname = CardQuality(EQ.rarity)+" "+uW.g_js_strings.champ[chTypeStrings[parseInt(EQ.type)-1]]+" "+uW.g_js_strings.commonstr.of+" "+uW.g_js_strings.effects["suffix_"+EQ["effects"][5]["id"]]+" ("+uW.g_js_strings.commonstr[cardFaction[EQ.faction-1]]+")"; var CHCard = {}; CHCard.id = EQ.equipmentId; CHCard.name = CardQuality(EQ.rarity)+" "+uW.g_js_strings.champ[chTypeStrings[parseInt(EQ.type)-1]]+" "+uW.g_js_strings.commonstr.of+" "+uW.g_js_strings.effects["suffix_"+EQ["effects"][5]["id"]]; CHCard.faction = EQ.faction; CHCard.type = EQ.type; CHCard.unique = parseIntNan(EQ.itemId); CHCard.level = EQ.level; CHCard.rarity = EQ.rarity; CHCard.createPrefix = function () { return ""; }; CHCard.createSuffix = function () { return ""; }; CHCard.effects = {}; var slot = 0; for (var k in EQ.effects) { slot++ CHCard.effects["slot"+slot] = {}; CHCard.effects["slot"+slot].id = EQ.effects[k].id; CHCard.effects["slot"+slot].tier = EQ.effects[k].tier; } equipdetails += ' ' + equipname + ''+Tabs.Reference.DisplayCHCard(CHCard,false)+'   '; } if (rslt['lootJewel'] && JSON2.stringify(rslt['lootJewel']) != '[]') { item = rslt['lootJewel']; var amt=""; if (item.quantity != 1) { amt = ' ('+item.quantity+')';} jeweldetails += ' ' + CM.ThroneController.jewelQualityName(item.quality)+" "+CM.ThroneController.getEffectName(item.id)+" "+uW.g_js_strings.commonstr.jewel + amt +'   '; } m += ''; } m += '
'+GameIcons.goldImgTiny+' '; if (rslt['loot'][0] > 0) m += addCommas(parseFloat(rslt['loot'][0]).toFixed(0)) + '' + GameIcons.foodImgTiny+' '; if (rslt['loot'][1] > 0) m += addCommas(parseFloat(rslt['loot'][1]).toFixed(0)) + '' + GameIcons.woodImgTiny+' '; if (rslt['loot'][2] > 0) m += addCommas(parseFloat(rslt['loot'][2]).toFixed(0)) + '' + GameIcons.stoneImgTiny+' '; if (rslt['loot'][3] > 0) m += addCommas(parseFloat(rslt['loot'][3]).toFixed(0)) + '' + GameIcons.oreImgTiny+' '; if (rslt['loot'][4] > 0) m += addCommas(parseFloat(rslt['loot'][4]).toFixed(0)) + '' + GameIcons.astoneImgTiny+' '; if (rslt['loot'][6] > 0) m += addCommas(parseFloat(rslt['loot'][6]).toFixed(0)) + '
'+itemdetails+thronedetails+equipdetails+jeweldetails+'

'; } return m; } function handleTransportLoot() { var m = ''; m += '
'+uW.g_js_strings.commonstr.loot.toUpperCase()+'
'; m += ''; else m += '0' m += ''; else m += '0'; m += ''; else m += '0' m += ''; else m += '0'; m += ''; else m += '0' m += ''; else m += '0'; m += '' m += '
' + GameIcons.goldImgTiny; if (rslt['gold'] > 0) m += addCommas(rslt['gold']) + '' + GameIcons.foodImgTiny; if (rslt['resource1'] > 0) m += addCommas(rslt['resource1']) + '' + GameIcons.woodImgTiny; if (rslt['resource2'] > 0) m += addCommas(rslt['resource2']) + '' + GameIcons.stoneImgTiny; if (rslt['resource3'] > 0) m += addCommas(rslt['resource3']) + '' + GameIcons.oreImgTiny; if (rslt['resource4'] > 0) m += addCommas(rslt['resource4']) + '' + GameIcons.astoneImgTiny; if (rslt['resource5'] > 0) m += addCommas(rslt['resource5']) + '

'; return m; } function deleteThisRpt(testing) { var side0 = ''; var side1 = ''; if (rpt.sideId == 1) side1 = rpt.marchReportId; if (rpt.sideId == 0) side0 = rpt.marchReportId; var params = uW.Object.clone(uW.g_ajaxparams); params.s0rids = side0; params.s1rids = side1; params.cityrids = ''; new MyAjaxRequest(uW.g_ajaxpath + "ajax/deleteCheckedReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { delete ReportCache[rpt.marchReportId]; delete ReportDetailCache[rpt.marchReportId]; t.CloseReport(); if (ById('modal_msg_tabs_report') && jQuery('#modal_msg_tabs_report').hasClass('selected')) { uW.Messages.listReports(); } if (Tabs.Messages && (Options.MessagesOptions.rptType == 'alliance' || Options.MessagesOptions.rptType == 'player')) { var ind = Tabs.Messages.DisplayIdArray.indexOf(parseInt(rpt.marchReportId)); if (ind>=0) { Tabs.Messages.data.splice(Tabs.Messages.DisplayArray[ind],1); delete Tabs.Messages.report[rpt.marchReportId]; Tabs.Messages.DisplayRpt(); } } } }, onFailure: function () { if (notify) { notify('AJAX ERROR'); } }, }); } function handleunts() { // Troops sent to Reinforce or troops found on a Scout (also show destination for transports) var m = ''; //header if (rpt.marchName == uW.g_js_strings.commonstr.reinforce) m += '
'+tx('Reinforcement').toUpperCase()+'
'; else if (rpt.marchName == uW.g_js_strings.commonstr.transport) m += '
'+tx('Destination').toUpperCase()+'
'; else m += '
'+tx('Scout Report').toUpperCase()+'
'; //summary m += '
'; //summary - troops m += '
'; if (rpt.marchName == uW.g_js_strings.commonstr.reinforce) m += ''+tx('Ally')+': ' + rpt.side1Name + ' (' + rpt.side1XCoord + ',' + rpt.side1YCoord + ')
'; if (rslt['unts'] != undefined) { m += ''; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (rslt['unts']['u'+i] && parseIntNan(rslt['unts']['u'+i]) != 0) m += ''; } m += '
'+unitImg[i]+''+unitName[i]+'' + addCommas(rslt['unts']['u' + i]) + '
'; } m += ' 
'; //summary - city and defences m += '
'; if ((rpt.marchName == uW.g_js_strings.commonstr.reinforce) || (rpt.marchName == uW.g_js_strings.commonstr.transport)) m += ''+tx('Destination')+' ' + rpt.side0Name + ' (' + rpt.side0XCoord + ',' + rpt.side0YCoord + ')
'; else { m += ''; m += ''; if (rpt.side0AllianceId && (rpt.side0AllianceId != 0)) m += ''; if (rpt.side0PlayerId && (rpt.side0PlayerId != 0)) m += ''; if (rslt['lstlgn']) { if (!rslt['lstlgn']) m += ''; else m += ''; } m += ''; if (rslt['pop']) m += ''; if (rslt['hap']) m += '
' + rpt.side0Name + ' (' + rpt.side0XCoord + ',' + rpt.side0YCoord + ')
'+uW.g_js_strings.commonstr.alliance+': ' + rpt.side0AllianceName + '
UID: ' + MonitorLinkUID(rpt.side0PlayerId)+'
'+uW.g_js_strings.modal_messages_viewreports_view.lastlogin+': '+tx('Not recorded')+'
'+uW.g_js_strings.modal_messages_viewreports_view.lastlogin+': ' + formatUnixTime(rslt['lstlgn']) + '
'+tx('Marshall Combat')+': '; if (rslt['knt'] && rslt['knt']['cbt']) m += rslt['knt']['cbt']; else m += uW.g_js_strings.commonstr.none; m += '
'+uW.g_js_strings.commonstr.population+': ' + addCommas(rslt['pop']) + '
'+uW.g_js_strings.commonstr.happiness+': ' + addCommas(rslt['hap']) + '
'; m += '
'; m += handlefrt(); } m += '
'; m += '
'; //end scoutsummary div m += '
'; return m; } function buildResearch() { var m = ''; //header m += '
 '+tx('Buildings and Research').toUpperCase()+'
'; //summary m += '
'; if (rslt['blds']) { m += '
'; if (rslt['blds']) { m += ''; for (var bi in rslt['blds']) if ((bi != 'b1') && (bi != 'b2') && (bi != 'b3') && (bi != 'b4')) { m += handleblds(bi.split("b")[1]); } m += '
'+tx('Buildings')+'
'; } if (rslt['blds']['b1'] || rslt['blds']['b2'] || rslt['blds']['b3'] || rslt['blds']['b4']) { m += ''; for (var i = 1; i < 5; i++) if (rslt['blds']['b' + i]) m += handleblds(i); m += '
'+tx('Fields')+'
'; } m += '
'; } if (rslt['tch'] || rslt['tch2']) { m += '
'; if (rslt['tch']) { m += ''; for (var tl in rslt.tch) { tid = /[0-9]+/.exec(tl); m += ''; } m += '
'+tx('Research')+'
' + uW.techcost['tch' + tid[0]][0] + '' + rslt.tch[tl] + '
'; } if (rslt['tch2']) { m += ''; for (var tl in rslt.tch2) { tid = /[0-9]+/.exec(tl); m += ''; } m += '
'+tx('Briton Research')+'
' + uW.techcost2['tch' + tid[0]][0] + '' + rslt.tch2[tl] + '
'; } m += '
'; m += '
 
'; } m += '
'; return m; } function handlersc(scout) { // Resources brought with reinforcements or found on a Scout var m = ''; if (rslt['rsc'] != undefined) { if (rslt['rsc']['r1'] > 0 || rslt['rsc']['r2'] > 0 || rslt['rsc']['r3'] > 0 || rslt['rsc']['r4'] > 0) { if (rpt.marchName == uW.g_js_strings.commonstr.reinforce) m += '
'+tx('Goodies Brought').toUpperCase()+'
'; else m += '
'+tx('Goodies Found').toUpperCase()+'
'; m += ''; else m += '0'; m += ''; else m += '0'; m += ''; else m += '0'; m += ''; else m += '0'; m += ''; else m += '0'; if (rslt['rsc']['r5'] > 0) { m += ''; } else { if (scout != true) { m += ''; } } m += '
' + GameIcons.goldImgTiny; if (rslt['gld'] > 0) m += addCommas(parseFloat(rslt['gld']).toFixed(0)) + '' + GameIcons.foodImgTiny; if (rslt['rsc']['r1'] > 0) m += addCommas(parseFloat(rslt['rsc']['r1']).toFixed(0)) + '' + GameIcons.woodImgTiny; if (rslt['rsc']['r2'] > 0) m += addCommas(parseFloat(rslt['rsc']['r2']).toFixed(0)) + '' + GameIcons.stoneImgTiny; if (rslt['rsc']['r3'] > 0) m += addCommas(parseFloat(rslt['rsc']['r3']).toFixed(0)) + '' + GameIcons.oreImgTiny; if (rslt['rsc']['r4'] > 0) m += addCommas(parseFloat(rslt['rsc']['r4']).toFixed(0)) + '' + GameIcons.astoneImgTiny; m += addCommas(parseFloat(rslt['rsc']['r5']).toFixed(0)) + '' + GameIcons.astoneImgTiny + '0
'; } } return m; } function handlefrt() { // Fortifications found on a Scout var m = ''; if (rslt['frt'] || (rslt['blds'] && rslt['blds']['b30'])|| (rslt['blds'] && rslt['blds']['b31'])) { if (rslt['frt']['f53'] != undefined || rslt['frt']['f55'] != undefined || rslt['frt']['f60'] != undefined || rslt['frt']['f61'] != undefined || rslt['frt']['f62'] != undefined || rslt['frt']['f63'] != undefined || (rslt['blds'] && rslt['blds']['b30']) || (rslt['blds'] && rslt['blds']['b31'])) { m = ''; if (rslt['frt']['f53'] != undefined) m += ''; if (rslt['frt']['f55'] != undefined) m += ''; if (rslt['frt']['f60'] != undefined) m += ''; if (rslt['frt']['f61'] != undefined) m += ''; if (rslt['frt']['f62'] != undefined) m += ''; if (rslt['frt']['f63'] != undefined) m += ''; if (rslt['blds'] && rslt['blds']['b31']) m += ''; if (rslt['blds'] && rslt['blds']['b30']) m += ''; m += '
'+tx('Defences Found')+'
' + unitImg[53] + ''+unitName[53]+'' + addCommas(rslt['frt']['f53']) + '
' + unitImg[55] + ''+unitName[55]+'' + addCommas(rslt['frt']['f55']) + '
' + unitImg[60] + ''+unitName[60]+'' + addCommas(rslt['frt']['f60']) + '
' + unitImg[61] + ''+unitName[61]+'' + addCommas(rslt['frt']['f61']) + '
' + unitImg[62] + ''+unitName[62]+'' + addCommas(rslt['frt']['f62']) + '
' + unitImg[63] + ''+unitName[63]+'' + addCommas(rslt['frt']['f63']) + '
' + unitImg[99] + ''+unitName[99]+'('+uW.g_js_strings.commonstr.level+' ' + rslt['blds']['b31'] + ')
' + unitImg[100] + ''+unitName[100]+'('+uW.g_js_strings.commonstr.level+' ' + rslt['blds']['b30'] + ')
'; } } return m; } function handleblds(bType) { if (rslt['blds']) { var blds = rslt['blds']['b' + bType]; var maxlvl = uW.buildingmaxlvl[bType]||12; var b = ''; arField = [], firstbld = true; b += uW.buildingcost['bdg'+bType][0]; b += ''; for (var i = 1; i <= maxlvl; i++) arField[i] = 0; for (var i = 0; i < blds.length; i++) arField[blds[i]]++ for (var i = maxlvl; i > 0; i--) { if (arField[i] > 0) { if (firstbld) firstbld = false; else b += ', '; if (arField[i] > 1) b += arField[i] + ' x '; b += ' ' + i; } } b += ''; return b; } } t.CloseReport(); if (rpt.marchName == uW.g_js_strings.commonstr.reinforce) { t.popReport = new CPopup('btReportPopup', t.reportpos.x, t.reportpos.y, 750, 240, true, function () { t.reportpos = t.popReport.getLocation(); clearTimeout(1000); }); m += '
'; } else if (rpt.marchName == uW.g_js_strings.commonstr.transport) { t.popReport = new CPopup('btReportPopup', t.reportpos.x, t.reportpos.y, 750, 240, true, function () { t.reportpos = t.popReport.getLocation(); clearTimeout(1000); }); m += '
'; } else if (rpt.marchName == uW.g_js_strings.commonstr.scout && rslt['winner'] == 1 && rpt.sideId == 1) { t.popReport = new CPopup('btReportPopup', t.reportpos.x, t.reportpos.y, 750, 800, true, function () { t.reportpos = t.popReport.getLocation(); clearTimeout(1000); }); m += '
'; } else { t.popReport = new CPopup('btReportPopup', t.reportpos.x, t.reportpos.y, 750, 800, true, function () { t.reportpos = t.popReport.getLocation(); clearTimeout(1000); }); m += '
'; } if ((t.reportpos.x == -999) && (t.reportpos.y == -999)) { t.popReport.centerMe(mainPop.getMainDiv()); } m += buildHeader(); if (rpt.marchName == uW.g_js_strings.commonstr.transport) { // Transport m += handleTransportLoot(); m += handleunts(); } m += handleLoot(); if (rpt.marchName == uW.g_js_strings.commonstr.reinforce) { m += handlersc(false); m += handleunts(); } if (rpt.marchName == uW.g_js_strings.commonstr.scout && rslt['winner'] == 1) { m += handlersc(true); m += handleunts(); m += buildResearch(); } if (rslt['fght']) { m += buildBattle(); m += buildTroopStats(); if (!koth) { m += buildChampDuel(); m += buildThroneStats(); } m += buildBoosts(); } m += '
'; t.popReport.getMainDiv().innerHTML = m; if (ById('atkmightlost')) { ById('atkmightlost').innerHTML = tx('Might Lost')+': ' + addCommas(t.atkmight); } if (ById('defmightlost')) { ById('defmightlost').innerHTML = tx('Might Lost')+': ' + addCommas(t.defmight); } if (ById('ptDeleteReport')) { ById('ptDeleteReport').addEventListener('click', function () { deleteThisRpt(rslt, rpt); }, false); } t.popReport.getTopDiv().innerHTML = '
'+rpt.marchName+' '+uW.g_js_strings.commonstr.report+'
'; if (ById('reportTroopStatsHdr')) { ById('reportTroopStatsHdr').addEventListener('click', function () { ToggleDivDisplay(false, 500, 500, "reportTroopStats"); }, false); } if (ById('reportChampDuelHdr')) { ById('reportChampDuelHdr').addEventListener('click', function () { ToggleDivDisplay(false, 500, 500, "reportChampDuel"); }, false); } if (ById('reportThroneHdr')) { ById('reportThroneHdr').addEventListener('click', function () { ToggleDivDisplay(false, 500, 500, "reportThrone"); }, false); } if (ById('reportBoostsHdr')) { ById('reportBoostsHdr').addEventListener('click', function () { ToggleDivDisplay(false, 500, 500, "reportBoosts"); }, false); } if (ById('reportResearchHdr')) { ById('reportResearchHdr').addEventListener('click', function () { ToggleDivDisplay(false, 500, 500, "reportResearch"); }, false); } t.popReport.show(true); }, CloseReport : function () { var t = Rpt; if (t.popReport) { t.popReport.show(false); if (t.popReport.onClose) t.popReport.onClose(); t.popReport.destroy(); t.popReport = null; } }, }; var ChatTimeFix = { ChatTime: null, init: function () { t = ChatTimeFix; try { uWExportFunction('ptConvertTime', t.TimeFix); t.ChatTime = new CalterUwFunc("Chat.getChat", [ ['rslt.data.newChats[i][j][1],', 'ptConvertTime(rslt.data.newChats[i][j][1]),'], ['rslt.data.newChats[i][j][1],', 'ptConvertTime(rslt.data.newChats[i][j][1]),'] ]); t.ChatTime.setEnable(Options.fixChatTime); } catch (err) { logerr(err); // write to log } }, TimeFix : function (timestr) { time = timestr.split(/:/); var AddMins = 480 - parseInt(getDST(new Date()) / 60) - (new Date().getTimezoneOffset()); // convert from local pacific time var min = (parseInt(time[0]) * 60) + parseInt(time[1]) + AddMins; if (min >= 1440) { min = min - 1440; } return parseInt(min / 60) + ':' + ('00' + parseInt(min % 60).toString()).slice(-2); }, setEnable: function (tf) { var t = ChatTimeFix; t.ChatTime.setEnable(tf); }, isAvailable: function () { var t = ChatTimeFix; return t.ChatTime.isAvailable(); }, }; var AttackDialog = { hideAttackEffortsState : true, init: function () { var t = AttackDialog; t.hideAttackEffortsState = Options.hideAttackEfforts; try { t.modal_attackFunc = new CalterUwFunc('modal_attack', [ [/}\s*$/, '; attackDialog_hook(); }'] ]); uWExportFunction('attackDialog_hook', t.modalAttackHook); t.modal_attackFunc.setEnable(true); } catch (err) { logerr(err); // write to log } }, setEnable: function () {}, isAvailable: function () { var t = AttackDialog; return t.modal_attackFunc.isAvailable(); }, modalAttackHook: function () { var t = AttackDialog; if (Options.fixKnightSelect || Options.attackCityPicker) { for (var i = 1; i < 6; i++) ById('modal_attack_tab_' + i).addEventListener('click', t.e_changeMarchType, false); } if (Options.attackCityPicker) { setTimeout(t.initCityPicker, 0); } if (Options.DontFilterTransportTroops) { var sf = ById('modal_attack_supplyfilter_checkbox'); if (sf) { if (sf.checked) { sf.click(); }} } var divContainer = ById('modal_attack_speed_boost'); divContainer.appendChild(t.HideAttackEfforts()); }, HideAttackEfforts: function () { var t = AttackDialog; if (!ById('modal_attack_march_boost')) { return; } var span = document.createElement('span'); var a = document.createElement('a'); a.innerHTML = tx('Show Attack/Speed Boosts'); a.id = 'ptShowBoosts'; span.appendChild(a); if (t.hideAttackEffortsState) { hideshow(); } a.addEventListener('click', function (evt) { t.hideAttackEffortsState = !t.hideAttackEffortsState; hideshow(); }, false); for (var i = 1; i < 5; i++) { ById('modal_attack_tab_' + i).addEventListener('click', hideshow, false); } return span; function hideshow() { var a = ById('ptShowBoosts'); if (t.hideAttackEffortsState) { disp = 'none'; if (a) a.innerHTML = tx('Show Attack/Speed Boosts'); }else{ disp = 'block'; if (a) a.innerHTML = tx('Hide Attack/Speed Boosts'); } ById('modal_attack_march_boost').style.display = disp; ById('modal_attack_attack_boost').style.display = disp; ById('modal_attack_defense_boost').style.display = disp; var div = ById('modal_attack_speed_boost'); for (var i = 0; i < i < div.childNodes.length; i++) { if (div.childNodes[i].className == 'section_title'){ div.childNodes[i].style.display = disp; } if (div.childNodes[i].className == 'section_content') { div = div.childNodes[i]; for (var i = 0; i < div.childNodes.length; i++) { if (div.childNodes[i].style != undefined && div.childNodes[i].className != 'estimated') { div.childNodes[i].style.display = disp; } } break; } } } }, initCityPicker: function () { var t = AttackDialog; var div = ById('modal_attack_target_numflag'); // as of KofC version 96; var mySpan; if (div) { div.parentNode.innerHTML += '   '; } else { var span = ById('modal_attack_target_coords'); // KofC version 116+; span.parentNode.parentNode.firstChild.innerHTML += '   '; } var disabled = []; for (var cid in Cities.byID){ var x = Cities.byID[cid].idx; disabled[x] = (Cities.byID[uW.currentcityid].idx==x)?true: false; } new CdispCityPicker('ptatp', ById('modal_attack_citybuts'), false, t.e_CityButton,null,disabled); for (var i=0; i 1 && (marchType == 4 || marchType == 2)) // if 'attack' or 'reinforce' knightVal = 1; selector.selectedIndex = knightVal; selector.disabled = false; } if (Options.DontFilterTransportTroops) { var sf = ById('modal_attack_supplyfilter_checkbox'); if (sf) { if (sf.checked) { sf.click(); }} } }, }; var battleReports = { init: function () { var t = battleReports; try { t.getReportDisplayFunc = new CalterUwFunc('getReportDisplay', [ ['return K.join("")', 'var themsg=K.join(""); themsg=getReportDisplay_hook(themsg, arguments[1]); return themsg'] ]); //Alliance report battle rounds function uWExportFunction('getReportDisplay_hook', t.hook); t.getReportDisplayFunc.setEnable(true); t.renderBattleReportFunc = new CalterUwFunc('Messages.viewMarchReport', [ [/\$\("modal_msg_list"\)\.innerHTML\s*=\s*cm\.MarchReportController\.getMarchReport\(c,\s*y\)/, 'var msg = cm.MarchReportController.getMarchReport(c, y); $("modal_msg_list").innerHTML = renderBattleReport_hook(msg,c,y);'] ]); //March reports battle rounds function uWExportFunction('renderBattleReport_hook', t.hook2); t.renderBattleReportFunc.setEnable(true); uWExportFunction('deleteAreport', t.e_deleteReport); uWExportFunction('PostReport', t.e_PostReport); } catch (err) { logerr(err); // write to log } }, setEnable: function () {}, isRoundsAvailable: function () { var t = battleReports; return t.getReportDisplayFunc.isAvailable() || t.renderBattleReportFunc.isAvailable(); }, e_deleteReport: function (rptid) { var t = battleReports; t.ajaxDeleteMyReport(rptid); }, e_PostReport: function (rptid) { var msg = 'Report No: ' + enFilter(rptid); sendChat("/a " + msg); }, ajaxDeleteMyReport: function (rptid, isUnread, side, isCityReport, notify) { var params = uW.Object.clone(uW.g_ajaxparams); params.s0rids = rptid; params.s1rids = ''; params.cityrids = ''; new MyAjaxRequest(uW.g_ajaxpath + "ajax/deleteCheckedReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { delete ReportCache[rptid]; delete ReportDetailCache[rptid]; if (isUnread) { uW.seed.newReportCount = parseInt(seed.newReportCount) - 1; uW.messages_notify_bug() } } if (notify) notify(rslt.errorMsg); }, }); }, hook2: function (msg, args, rslt) { if (rslt.rnds && Options.dispBattleRounds) { msg = msg.replace(/<\/ul>.*\s*<\/div>.*\s*
/im, '
  • Rounds: ' + rslt.rnds + '
  • '); } if (Options.reportDeleteButton) { msg = msg.replace(/Reports<\/span><\/a>/im, 'ReportsPost To Chat'); //Post to Chat button msg = msg.replace(/Reports<\/span><\/a>/im, 'ReportsMore'); //More button msg = msg.replace(/Reports<\/span><\/a>/im, 'Reports' + uW.g_js_strings.commonstr.deletetx + ''); //Delete button } return msg; }, hook: function (msg, rslt) { msg = msg.replace(/(\bReport\sNo\:\s([0-9]+))/g, '$1'); if (rslt.rnds && Options.dispBattleRounds) { msg = msg.replace(/(Attackers /im, '$1
    Rounds: ' + rslt.rnds + '
    '); } return msg; }, }; var MapDistanceFix = { popSlotsFunc: null, init: function () { var t = MapDistanceFix; try { t.popSlotsFunc = new CalterUwFunc('MapObject.prototype.populateSlots', [ ['this.distance', 'fixMapDistance_hook'] ]); if (t.isAvailable()) { uWExportFunction('fixMapDistance_hook', MapDistanceFix.fixMapDistance_hook); t.enable(true); } } catch (err) { logerr(err); // write to log } }, fixMapDistance_hook: function (cityX, cityY, tileX, tileY) { var city = Cities.byID[uW.currentcityid]; return distance(city.x, city.y, tileX, tileY); }, enable: function (tf) { var t = MapDistanceFix; t.popSlotsFunc.setEnable(tf); }, isAvailable: function () { var t = MapDistanceFix; return t.popSlotsFunc.isAvailable(); }, } var mapinfoFix = { init: function () { var t = mapinfoFix; try { t.calcButtonInfo = new CalterUwFunc('cm.ContextMenuMapController.prototype.calcButtonInfo', [ [/case\s*"reassign":b\.text\s*=\s*g_js_strings\.commonstr\.reassign;b\.color\s*=\s*"blue";b\.action\s*=\s*function\s*\(\)\s*{modal_attack\(2,\s*e\.tile\.x,\s*e\.tile\.y\);*};d\.push\(b\);break;/, 'case "reassign":b.text=g_js_strings.commonstr.reassign;b.color="blue";b.action=function(){modal_attack(5,e.tile.x,e.tile.y);};d.push(b);break;' ] ]); t.bookMarkMod = new CalterUwFunc('cm.ContextMenuMapController.prototype.calcButtonInfo', [ [/case\s*"bookmark":/, 'case "bookmark": try { if (e.city && cm.tileInfo[e.tile.id] && cm.tileInfo[e.tile.id].cityName ) {e.tile.name = e.user.username + "/" + cm.tileInfo[e.tile.id].cityName;}} catch (err1) {} '] ]); t.MapContextMenus = new CalterUwFunc('cm.ContextMenuMapController.prototype.calcCityType', [ ['return c', 'c = calcCityTypeFix(c,d);return c'] ]); t.calcButtonInfo.setEnable(Options.mapInfo); t.MapContextMenus.setEnable(Options.mapInfo2); t.bookMarkMod.setEnable(Options.mapInfo3); CM.ContextMenuMapController.prototype.MapContextMenus.City["2"].splice(4, 0, "reassign"); // add reinforce alliance wilds for (var jj in CM.ContextMenuMapController.prototype.MapContextMenus.AllianceWilderness) { CM.ContextMenuMapController.prototype.MapContextMenus.AllianceWilderness[jj] = ["profile", "throne", "reinforce", "reinforcements", "message", "bookmark"]; } // add megaliths to wild types CM.ContextMenuMapController.prototype.MapContextMenus.OwnedWilderness.megalith = ["bookmark"]; CM.ContextMenuMapController.prototype.MapContextMenus.OwnedWildernessNoDefend.megalith = ["bookmark"]; CM.ContextMenuMapController.prototype.MapContextMenus.AllianceWilderness.megalith = ["profile","bookmark"]; CM.ContextMenuMapController.prototype.MapContextMenus.FriendlyWilderness.megalith = ["profile", "attack_koth", "scout_koth", "bookmark"]; CM.ContextMenuMapController.prototype.MapContextMenus.EnemyWilderness.megalith = ["profile", "attack_koth", "scout_koth", "bookmark"]; uWExportFunction('calcCityTypeFix', t.calcCityType_hook); // add the province and the city status (Normal/Truce) to the tooltips if (!NoRegEx) { t.dispStatusMod = new CalterUwFunc('MapObject.prototype.populateSlots', [ [/var\s*h\s*=""/, 'var h = ""; h+="
    "+U.tileUserId+"
    "+provincenames["p" + U.tileProvinceId]+"
    ";if (M) h += "
    "+g_js_strings.commonstr.status+": "+M+"
    ";'] ]); } else { t.dispStatusMod = new CalterUwFunc('MapObject.prototype.populateSlots', [ ['var h = "";', 'var h = ""; h+="
    "+U.tileUserId+"
    "+provincenames["p" + U.tileProvinceId]+"
    ";if (M) h += "
    "+g_js_strings.commonstr.status+": "+M+"
    ";'] ]); } t.dispStatusMod.setEnable(Options.dispStatus); t.MapContextMenuAdd = new CalterUwFunc ('modal_maptile', [[/}\s*$/, ';setTimeout(function() { MapContextMenuAdd_hook(j,k,m,a,h,f,o,e); },0); }']]); uWExportFunction('MapContextMenuAdd_hook', mapinfoFix.MapContextMenu); t.MapContextMenuAdd.setEnable (Options.mapMenuInfo); } catch (err) { logerr(err); // write to log } }, setEnable: function (tf) { var t = mapinfoFix; t.calcButtonInfo.setEnable(tf); }, setEnable2: function (tf) { var t = mapinfoFix; t.MapContextMenus.setEnable(tf); }, setEnable3: function (tf) { var t = mapinfoFix; t.bookMarkMod.setEnable(tf); }, setMenuEnable: function (tf) { var t = mapinfoFix; t.MapContextMenuAdd.setEnable(tf); }, setEnableDispStatus: function (tf) { var t = mapinfoFix; t.dispStatusMod.setEnable(tf); }, calcCityType_hook: function (c, d) { if (Cities.byID[d.city.id] && c != 1) c = CM.CITY_STATUS.MY_CITY_AND_NOT_CURRENT_CITY; return c; }, isAvailable: function () { var t = mapinfoFix; return t.calcButtonInfo.isAvailable(); }, isAvailable2: function () { var t = mapinfoFix; return t.MapContextMenus.isAvailable(); }, isAvailable3: function () { var t = mapinfoFix; return t.bookMarkMod.isAvailable(); }, isMenuAvailable: function () { var t = mapinfoFix; return t.MapContextMenuAdd.isAvailable(); }, isAvailableDispStatus: function () { var t = mapinfoFix; return t.dispStatusMod.isAvailable(); }, MapSelMarchPreset : function () { Options.OneClickAttackPreset = ById('ptMapOneClickAttackPreset').value; saveOptions(); }, MapContextMenu : function(uid,x,y,a,h,f,o,e) { var t = mapinfoFix; var div = ById('contextMenu'); var MarchPresets = {0:"-- "+tx('Select March Preset')+" --"}; for (var PN in Options.QuickMarchOptions.MarchPresets) { MarchPresets[PN] = Options.QuickMarchOptions.MarchPresets[PN][0]; } var HQ = false; if (CM.FoundingModel) HQ = CM.FoundingModel.get_hq(x,y); var DefendStat = ''; var citytile = ((e.indexOf("city") > -1 && uid!=null && uid!=0 && uid!="0") || e.indexOf("mist") > -1); if (citytile) { DefendStat = '
     
    ';} if ((citytile || (uid!=null && uid!=0 && uid!="0")) && (!uid || uid!=uW.tvuid)) { var ascended = getAscensionValues(uW.currentcityid); if (ascended.isPrestigeCity) { var cityExpTime = ascended.prestigeBuffExpire; if (cityExpTime && cityExpTime > unixTime()) { var AP = document.createElement('div'); AP.innerHTML = '
    '+tx('ASCENSION')+'
    '+tx('PROTECTION')+'
    '+tx('WARNING')+'!
    '; div.insertBefore(AP,div.firstChild); } } } uWExportFunction('ptMapSelMarchPreset', t.MapSelMarchPreset); var QAPreset = '
    '+htmlSelector(MarchPresets, Options.OneClickAttackPreset, 'id=ptMapOneClickAttackPreset class=btInput onChange="ptMapSelMarchPreset();" onMouseMove="ptStopProp(event);" onMouseOut="ptStopProp(event);" onClick="ptStopProp(event);" onMouseUp="ptStopProp(event);"')+'
    '; var champ = false; if (Options.QuickMarchOptions.AutoChamp) { citychamp = getCityChampion(uW.currentcityid); if (citychamp.championId) { champ = true; if (citychamp.status != "10") { QAPreset += '
    '+tx('Champion Ready')+'!
    '; } else {QAPreset += '
    Champion Unavailable!
    ';} } if (!champ) { QAPreset += '
    '+uW.g_js_strings.champ.no_champ+'!
    '; } } if (Options.QuickMarchOptions.AutoSpell) { var faction = ''; var spellavailable = false; var cooldownactive = false; if (Seed.cityData.city[uW.currentcityid].isPrestigeCity) { faction = parseInt(Seed.cityData.city[uW.currentcityid].prestigeInfo.prestigeType); spellavailable = (Seed.cityData.city[uW.currentcityid].prestigeInfo.blessings.indexOf(SpellBlessings[faction]) != -1) cooldownactive = (Seed.cityData.city[uW.currentcityid].spells && Seed.cityData.city[uW.currentcityid].spells[SpellTypes[faction]] && parseInt(Seed.cityData.city[uW.currentcityid].spells[SpellTypes[faction]].endDate) > uW.unixtime()); } if (spellavailable) { if (!cooldownactive) { QAPreset += '
    '+uW.g_js_strings.spells['name_'+SpellTypes[faction]]+' '+tx('Ready')+'!
    '; } else { QAPreset += '
    '+uW.g_js_strings.spells['name_'+SpellTypes[faction]]+' '+tx('Regenerating')+'!
    '; } } else { QAPreset += '
    '+tx('No Spell Available')+'!
    '; } } if (uid!=null && uid!=0 && uid!="0") { var scr = document.createElement('div'); if ((h!=0 && h == getMyAlliance()[0]) || uid == uW.tvuid || !Options.OneClickAttack || HQ) { var QAPreset = ''; } scr.innerHTML = QAPreset+'
    '+tx('Loading')+'...
    '; div.appendChild(scr); var params = uW.Object.clone(uW.g_ajaxparams); params.checkArr = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getOnline.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { var p = rslt.data; var params = uW.Object.clone(uW.g_ajaxparams); params.pid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/viewCourt.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var u = unixTime(); var f = convertTime(new Date(rslt.playerInfo.fogExpireTimestamp.replace(" ","T")+"Z")); var truce = ""; if (rslt.playerInfo.warStatus != "1") { truce = " ("+Tabs.Monitor.getDuration(rslt.playerInfo.truceExpireTimestamp)+")"; } var misted = (f >= u); m = ''; m += ''; var g=uW.g_js_strings.commonstr,h={1:g.normal,2:uW.g_js_strings.MapObject.begprotect,3:g.truce,4:g.vacation}; m += ''; if (!p[uid]) m+= ''; else m+= ''; if (misted) m += ''; scr.innerHTML = QAPreset+m + '
    ' + rslt.playerInfo.displayName +'
    ' + parseInt(rslt.playerInfo.userId)+'
    ' + h[rslt.playerInfo.warStatus]+truce+'
    '+ t.getLastLogDuration(rslt.playerInfo.lastLogin) +'
    ('+uW.g_js_strings.commonstr.online.toUpperCase()+')
    *** '+tx("MISTED")+' ***
    '+DefendStat; ById('btMapDetails').addEventListener('click', function(){ Battle.fetchPlayerInfo(rslt.playerInfo.userId,Battle.clickedPlayerDetails); },false); var MenuHeight = parseInt(div.offsetHeight); div.style.height = MenuHeight + 'px'; div.style.overflow = 'visible'; scr.style.height = '500px'; scr.style.background = ''; if (citytile) {getDefendStatus(x,y,ById('ptDefendStatus'),true);} } }, }); }, }); } else { if (HQ || !Options.OneClickAttack) { var QAPreset = ''; } var scr = document.createElement('div'); scr.innerHTML = QAPreset+DefendStat; div.appendChild(scr); var MenuHeight = parseInt(div.offsetHeight); div.style.height = MenuHeight + 'px'; div.style.overflow = 'visible'; scr.style.height = '500px'; scr.style.background = ''; if (citytile) {getDefendStatus(x,y,ById('ptDefendStatus'),true);} } }, getLastLogDuration: function (datestr){ if (!datestr) return; var Interval = convertTime(new Date(datestr.replace(" ","T")+"Z")) - unixTime(); if (Interval < 0) return uW.timestr(Interval*(-1)); else return tx('minutes ago'); }, }; var GMTclock = { span: null, timer: null, init: function () { this.span = document.createElement('span'); this.span.style.fontWeight = 'bold'; ById('kochead_time').parentNode.appendChild(this.span); this.setEnable(Options.gmtClock); }, setEnable: function (tf) { var t = GMTclock; if (tf) { setTimeout(function () { t.EverySecond(); }, 1000); } else { t.span.innerHTML = ''; } }, EverySecond: function () { var t = GMTclock; var now = new Date(); if (Options.gmtClockType == 1) { now.setTime(now.getTime() + (now.getTimezoneOffset() * 60000) - (480*60000) + parseInt(getDST(now)*1000) + (uW.g_timeoff*1000)); } else { now.setTime(now.getTime() + (now.getTimezoneOffset() * 60000)); } GMTclock.span.innerHTML = '   (' + formatGMTClock(now) + ')'; if (Options.gmtClock) { setTimeout(function () { t.EverySecond(); }, 1000); } else { GMTclock.span.innerHTML = ''; } }, }; var DeleteReports = { deleting : false, pageNo : 1, maxpages : 10, scandelay : 30, // 30 secs between scans UIDArray : [], ReportLog : { ItemsFound : {}, ThroneItemsFound : {}, ChampItemsFound : {}, JewelItemsFound : {}, ItemsFoundDF : {}, ThroneItemsFoundDF : {}, ChampItemsFoundDF : {}, JewelItemsFoundDF : {}, DFCount : 0, }, init : function(){ var t = DeleteReports; t.loadLog(); setTimeout(t.startdeletereports, 20*1000); // start in 20 seconds }, loadLog : function () { var t = DeleteReports; var serverID = getServerId(); s = GM_getValue ('ReportLog_'+serverID+'_'+uW.tvuid); if (s != null){ opts = JSON2.parse (s); for (var k in opts) t.ReportLog[k] = opts[k]; } }, saveLog : function () { var t = DeleteReports; setTimeout(function () { GM_setValue ('ReportLog_'+getServerId()+'_'+uW.tvuid, JSON2.stringify(t.ReportLog));} ,0); // get around GM_SetValue uW error }, startdeletereports : function(){ var t = DeleteReports; if(!t.deleting) { if (Options.ReportOptions.DeleteRptbc || Options.ReportOptions.DeleteRpttr || Options.ReportOptions.DeleteRptwl || Options.ReportOptions.DeleteRptaa || Options.ReportOptions.DeleteRptfr || Options.ReportOptions.DeleteRptid || Options.ReportOptions.DeleteRptdf || Options.ReportOptions.DeleteRptsc){ t.deleting = true; t.listreports(t.pageNo, t.checkreports); } else { t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); } }; }, listreports : function(pageNo, callback){ var t = DeleteReports; t.pageNo = pageNo; if (!Options.ReportOptions.DeleteRptbc && !Options.ReportOptions.DeleteRpttr && !Options.ReportOptions.DeleteRptwl && !Options.ReportOptions.DeleteRptaa && !Options.ReportOptions.DeleteRptfr && !Options.ReportOptions.DeleteRptid && !Options.ReportOptions.DeleteRptdf && !Options.ReportOptions.DeleteRptsc){ t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); } var params = uW.Object.clone(uW.g_ajaxparams); if (t.pageNo >= 1) params.pageNo = t.pageNo; new MyAjaxRequest(uW.g_ajaxpath + "ajax/listReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { callback(rslt); }, onFailure: function () { callback({ok:false}); }, }); }, checkreports : function(rslt){ var t = DeleteReports; if(!rslt.ok || (rslt.arReports.length < 1)){ // no results or no reports t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); return; } var reports = rslt.arReports; var players = rslt.arPlayerNames; var totalPages = rslt.totalPages; if (rslt.totalPages > t.maxpages) var totalPages = t.maxpages; var deletes1 = new Array(); var deletes0 = new Array(); for(k in reports){ if (reports[k].reportType == 0) { var reportUnixTime = Number(reports[k].reportUnixTime); if(Options.ReportOptions.DeleteRptbc){ if((reports[k].marchType==4 || reports[k].marchType==9) && reports[k].side0PlayerId==0 && reports[k].side0TileType == 51) { if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } else if(reports[k].marchType==1 && isMyself(reports[k].side1PlayerId)) { if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } } if (Options.ReportOptions.DeleteRpttr){ if(reports[k].marchType==1 && isMyself(reports[k].side0PlayerId)) { if (deletes0.indexOf(k.substr(2)) == -1) deletes0.push(k.substr(2)); } } if (Options.ReportOptions.DeleteRptwl){ if(reports[k].side0TileType <= 50 && reports[k].side0PlayerId==0) { if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } } if (Options.ReportOptions.DeleteRptdf){ if(reports[k].side0TileType==54 && reports[k].side0PlayerId==0) { t.checkreportforitems(k.substr(2),false); if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } } if (Options.ReportOptions.DeleteRptaa && Options.AttackOptions && Options.AttackOptions.Routes){ for(var i in Options.AttackOptions.Routes) { var a = Options.AttackOptions.Routes[i]; if(reports[k].side0XCoord == a.target_x && reports[k].side0YCoord == a.target_y && reports[k].marchType==4 && isMyself(reports[k].side1PlayerId)) { if(reports[k].side0PlayerId!=0) { // don't delete deleted crests on other players t.checkreportforitems(k.substr(2),true); } else { t.checkreportforitems(k.substr(2),false); if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } break; } } } if (Options.ReportOptions.DeleteRptfr){ for (var l in uW.seed.allianceDiplomacies.friendlyToThem) { if(reports[k].side1AllianceId == uW.seed.allianceDiplomacies.friendlyToThem[l].allianceId) { if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } } for (var l in uW.seed.allianceDiplomacies.friendly) { if(reports[k].side1AllianceId == uW.seed.allianceDiplomacies.friendly[l].allianceId) { if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } } } if (Options.ReportOptions.DeleteRptid){ if (Options.ReportOptions.DeleteRptUID != "") { // split string by commas t.UIDArray = Options.ReportOptions.DeleteRptUID.split(","); if (t.UIDArray.indexOf(reports[k].side1PlayerId) != -1) { if (deletes1.indexOf(k.substr(2)) == -1) { if (Options.ReportOptions.DeleteRptidType==0 || Options.ReportOptions.DeleteRptidType==reports[k].marchType) { deletes1.push(k.substr(2)); } } } } } if (Options.ReportOptions.DeleteRptsc){ if(reports[k].marchType==3 && isMyself(reports[k].side0PlayerId)) { if (deletes1.indexOf(k.substr(2)) == -1) deletes1.push(k.substr(2)); } } } } if(deletes1.length > 0 || deletes0.length > 0){ t.deleteCheckedReports(deletes1, deletes0); } else { if (t.pageNo <= totalPages) { t.deleting = false; t.pageNo++; setTimeout(t.startdeletereports, 5*1000); // next page in 5 seconds return; } else { t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); return; } } }, deleteCheckedReports : function(deletes1, deletes0){ var t = DeleteReports; var params = uW.Object.clone(uW.g_ajaxparams); params.s1rids = deletes1.join(","); params.s0rids = deletes0.join(","); params.cityrids = ''; new MyAjaxRequest(uW.g_ajaxpath + "ajax/deleteCheckedReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if(rslt.ok){ if (deletes0.length>0) { for (var j=0;j0) { for (var j=0;j/, "
    "],[/backButtonHtml;/,"backButtonHtml;parseLinks();"]]); uWExportFunction('parseLinks', DispReport.parseLinks); t.modal_MessageText.setEnable(true); uWExportFunction('makeReportLink', makeReportLink); uWExportFunction('makeReportPopup', makeReportPopup); } catch (err) { logerr(err); // write to log } }, setEnable: function (tf) { var t = DispReport; t.modal_InboxFunc.setEnable(tf); }, isDispReportAvailable: function () { var t = DispReport; return t.modal_InboxFunc.isAvailable(); }, AddMsgButtons :function() { var t = DispReport; if (ById('modal_msg_links')) ById('modal_msg_links').style.top = '8px'; msgBody = ByCl('messageDeletes'); var div = msgBody[0]; var a = document.createElement('a'); a.className = 'inlineButton brown20'; a.style.marginRight = '6px'; a.innerHTML = ''+tx('Delete Gift Report')+''; a.addEventListener('click', function(){t.checkinbox(1);}, false); div.appendChild(a); msgBody = ByCl('reportDeletes'); var div = msgBody[0]; var a = document.createElement('a'); a.className = 'buttonDown20'; a.innerHTML = ''+tx('Delete Wild/Barb/Transport')+''; a.style.float = 'left'; a.addEventListener('click', t.checkreportlist, false); div.appendChild(a); }, ModalInboxHook : function (rslt,boxType,msghtml){ var t = DispReport; var div = ById('ptPageNavBar'); if (div) div.style.marginLeft = '20px'; // fix outbox buttons.... game bug! if (boxType == 'outbox') { uW.hideMessageTabs(); jQuery(".messageDeletes").show(); } if (ById('modal_msg_view_body')) { var msgdiv = ById('modal_msg_view_body').getElementsByClassName('bodytext')[0]; if (msgdiv) { msgdiv.addEventListener('dblclick', function () { SelectText(msgdiv); },false); } } }, parseLinks: function() { var t = DispReport; if (ById('modal_msg_view_body')) { var msgdiv = ById('modal_msg_view_body').getElementsByClassName('bodytext')[0]; if (msgdiv) { msgdiv.innerHTML = msgdiv.innerHTML.replace(/(\bReport\sNo\:\s([0-9]+))/g, '$1'); msgdiv.innerHTML = msgdiv.innerHTML.replace(/(\bRpt\:([0-9]+))/g, '$1'); msgdiv.innerHTML = msgdiv.innerHTML.replace(/#([0-9]+)#/g, '$1'); } } }, checkinbox: function (what) { var t = DispReport; var body = ById('tbl_messages'); if (!body) return; var trs = body.getElementsByTagName('tr'); var reports = []; for (var i = 0; i < trs.length; i++) { var tds = trs[i].getElementsByTagName('td'); for (var j = 0; j < tds.length; j++) { if(tds[j].className == 'chkcol') var checkbox = tds[j]; if(tds[j].className == 'dtcol') var date = tds[j]; if(tds[j].className == 'nmcol') var sender = tds[j]; if(tds[j].className == 'subjcol') var subject = tds[j]; } reports.push({ checkbox: checkbox, date:date, sender: sender, subject: subject }); } if (what==1) t.parseGiftReport(reports); }, parseGiftReport: function (rpts) { var t = DispReport; for (var i = 0; i < rpts.length; i++) { var GiftMessage = false; for (var j in GiftText) { if (rpts[i].subject.innerHTML.indexOf(GiftText[j]) != -1) { GiftMessage = true; break; } } if(rpts[i].sender.innerHTML.indexOf('Kingdoms Of Camelot') >= 0 && GiftMessage){ rpts[i].checkbox.firstChild.checked = true; } } uW.messages_action("delete", "tbl_messages"); }, ModalReportListHook: function (rslt, msghtml) { var t = DispReport; // fix HQ buttons.... rockyou bug! jQuery(".hqMessageDeletes").hide(); if (rslt.ok) { msgBody = ById('modal_msg_reports_tablediv'); var mml = ById('modal_msg_list'); if (mml != null) mml.style.minHeight = '400px'; var trs = msgBody.getElementsByTagName('tr'); for (var i = 0; i < trs.length; i++) { var tds = trs[i].getElementsByTagName('td'); for (var j = 0; j < tds.length; j++) { if (tds[j].className == 'subjcol') { tds[j].style.width = '190px'; var original = tds[j].innerHTML; original = original.replace("
    ", ""); original = original.replace("
    ", ""); var popup = original.replace(uW.g_js_strings.modal_messages_viewtrades.viewrpt, tx("Pop-up")); popup = popup.replace(uW.g_js_strings.commonstr.view, tx("Pop-up")); popup = popup.replace("Messages.viewMarchReport", "makeReportPopup"); var makelink = original.replace(uW.g_js_strings.modal_messages_viewtrades.viewrpt, tx("Share")); makelink = makelink.replace(uW.g_js_strings.commonstr.view, tx("Share")); makelink = makelink.replace("Messages.viewMarchReport", "makeReportLink"); original = original.replace(uW.g_js_strings.modal_messages_viewtrades.viewrpt, uW.g_js_strings.commonstr.view); var newContent = original + " | " + popup + " | " + makelink; tds[j].innerHTML = '
    ' + newContent + '
    '; } if (tds[j].className == 'nmcol') { tds[j].style.width = '400px'; } } } } }, checkreportlist: function () { var t = DispReport; var body = ById('modal_msg_reports_tablediv'); var trs = body.getElementsByTagName('tr'); var reports = []; for (var i = 0; i < trs.length; i++) { var tds = trs[i].getElementsByTagName('td'); for (var j = 0; j < tds.length; j++) { if (tds[j].className == 'chkcol') { var checkbox = tds[j]; } if (tds[j].className == 'nmcol') { var type = tds[j]; } if (tds[j].className == 'subjcol') { var view = tds[j]; } } reports.push({ checkbox: checkbox, type: type, view: view }); } t.parseBarbReport(reports); }, parseBarbReport: function (rpts) { var t = DispReport; if (NoRegEx) { // regular expression fix for cometbird var regex = /Messages.viewMarchReport\(([^&]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([^&]+),([^&]+),([^&]+),([^&]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+)/; } else { var regex = /Messages.viewMarchReport\(([^"]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([^"]+),([^"]+),([^"]+),([^"]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+)/; } for (var i = 0; i < rpts.length; i++) { var m = regex.exec(rpts[i].view.innerHTML); if (m) { if (m[6] == m[8] && m[7] == m[9]) { //Source and target id the same. // continue; //Infer transport to self } else if (m[5] != 0) { continue; } rpts[i].checkbox.firstChild.checked = true; } } uW.Messages.deleteCheckedReports(); } }; function makeReportLink(rptid, side, tiletype, tilelv, defid, defnm, defgen, atknm, atkgen, marchtype, xcoord, ycoord, timestamp, unread, atkxcoord, atkycoord, side0AllianceName, side1AllianceName, link) { uW.Chat.sendChat("/a Report No: "+enFilter(rptid)); }; function makeReportPopup(rptid, side, tiletype, tilelv, defid, defnm, defgen, atknm, atkgen, marchtype, xcoord, ycoord, timestamp, unread, atkxcoord, atkycoord, side0AllianceName, side1AllianceName, link) { Rpt.FindReport(rptid, 0); }; var AllianceReports = { init: function () { t = AllianceReports; try { uWExportFunction('ListAR_hook',AllianceReports.myAllianceReports); t.listFunc = new CalterUwFunc('allianceReports', [ ['var params', 'ListAR_hook(pageNo);return;var params'] ]); t.listFunc.setEnable(Options.enhanceARpts); uWExportFunction('getReportDisplay_hook2', AllianceReports.getReportDisplayHook); uWExportFunction('FindReport', Rpt.FindReport); t.marvFunc = new CalterUwFunc('modal_alliance_report_view', [ ['getReportDisplay', 'getReportDisplay_hook2'] ]); t.marvFunc.setEnable(true); t.memListFunc = new CalterUwFunc('membersInfo', [ ['commonstr.might', 'commonstr.might + "" + g_js_strings.commonstr.cities + "" + g_js_strings.membersInfo.lastonline'], ['memberInfo[key].prestige\)', 'memberInfo[key].prestige)+ "");memhtml.push("" + memberInfo[key].cities + "");memhtml.push("" + memberInfo[key].lastLogin'] ]); t.enable_viewmembers(Options.enhanceViewMembers); } catch (err) { logerr(err); // write to log } }, getReportDisplayHook: function (a, b) { var x = ''; try { x = uW.getReportDisplay(a, b); } catch (e) { x = 'Error formatting report: ' + e.message; } return x; }, enable_viewmembers: function (tf) { t = AllianceReports; t.memListFunc.setEnable(tf); }, enable: function (tf) {}, myAllianceReports: function (pageNum) { var params = uW.Object.clone(uW.g_ajaxparams); if (pageNum) params.pageNo = pageNum; params.group = "a"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/listReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { displayReports(rslt.arReports, rslt.arPlayerNames, rslt.arAllianceNames, rslt.arCityNames, rslt.totalPages); }, }, false); function displayReports(ar, playerNames, allianceNames, cityNames, totalPages) { var msg = ""; var myAllianceId = getMyAlliance()[0]; msg += ""; msg += ""; ById('allianceContent').innerHTML = msg; if (pageNum) { uW.ctrlPagination("modal_report_list_pagination", totalPages, "allianceReports", pageNum) } else { uW.ctrlPagination("modal_report_list_pagination", totalPages, "allianceReports") } } }, }; var AllianceReportsCheck = { aRpt: {}, init: function () { var t = AllianceReportsCheck; var b = GM_getValue('allianceRpt_'+getServerId()+'_'+uW.tvuid); if (b != null) t.aRpt = JSON2.parse(b); else { t.aRpt = {}; } t.enable(Options.ReportOptions.EnhanceAR); }, enable: function (tf) { var t = AllianceReportsCheck; if (Options.ReportOptions.EnhanceAR) { t.checkAllianceReport(); } setTimeout(t.enable, parseInt((Math.random() * 15 * 1000) + (Options.ReportOptions.alertinterval * 1000)), Options.ReportOptions.EnhanceAR); }, checkAllianceReport: function () { var t = AllianceReportsCheck; var params = uW.Object.clone(uW.g_ajaxparams); params.group = "a"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/listReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { t.parseAReports(rslt.arReports, rslt.arPlayerNames, rslt.arAllianceNames, rslt.arCityNames, rslt.totalPages); }, }, true); }, parseAReports: function (ar, playerNames, allianceNames, cityNames, totalPages) { var t = AllianceReportsCheck; var myAllianceId = getMyAlliance()[0]; var rptkeys = uW.Object.keys(uWCloneInto(ar)); if (ar && matTypeof(ar) != 'array') { for (var i = 0; i < rptkeys.length; i++) { var rpt = ar[rptkeys[i]]; if (rpt.side1AllianceId != myAllianceId && Options.ReportOptions.PostIncoming) { var ID = rpt.reportId; var target = tx("city"); if (t.aRpt["a" + ID]) continue; if (rpt.marchType == 3) {atkType = tx('scouted');} else if (rpt.marchType == 4) {atkType = tx('attacked');} if (rpt.side0TileType == 57) {target = tx("megalith");} else if (rpt.side0TileType <= 50) {target = tx("wild");} var allianceName = ''; if (parseIntNan(rpt.side1AllianceId) != 0) { allianceName = ' of '+allianceNames["a"+rpt.side1AllianceId]+' ('+getDiplomacy(rpt.side1AllianceId)+')'; } var date = uW.formatDateByUnixTime(rpt.reportUnixTime); var msg = ':::. | Report No: ' + enFilter(rpt.reportId) + ' || ' + date + ' || ' + playerNames['p' + rpt.side0PlayerId] + '\'s ' + target + ' '+tx('at')+' ' + rpt.side0XCoord + ',' + rpt.side0YCoord + ' '+tx('has been')+' ' + atkType + ' '+tx('by')+' ' + playerNames["p" + rpt.side1PlayerId] + ' '+tx('at')+' ' + rpt.side1XCoord + ',' + rpt.side1YCoord + allianceName; t.fetchreport(ID, rpt, msg, playerNames, cityNames, rpt.side0TileType, rpt.marchType); t.addAllianceReport(rpt); } if (rpt.side1PlayerId == uW.tvuid && Options.ReportOptions.WhisperOutgoing) { var ID = rpt.reportId; if (t.aRpt["a" + ID]) continue; if ((rpt.marchType == 4) && Options.AttackOptions && Options.AttackOptions.Routes){ var crest = false; for(var j in Options.AttackOptions.Routes) { var a = Options.AttackOptions.Routes[j]; if(rpt.side0XCoord == a.target_x && rpt.side0YCoord == a.target_y) { crest = true; break; } } if (crest) { t.addAllianceReport(rpt); // no try again continue; // no whisper on crest targets } } if (rpt.marchType == 3) {atkType = tx('scouted');} else if (rpt.marchType == 4) {atkType = tx('attacked');} target = tileTypes[parseInt(rpt.side0TileType)]; if (parseInt(rpt.side0PlayerId) == 0) { var playerName = '';} else { var playerName = playerNames['p' + rpt.side0PlayerId] + '\'s ';} var date = uW.formatDateByUnixTime(rpt.reportUnixTime); var msg = ':::. | Report No: ' + enFilter(rpt.reportId) + ' || ' + date + ' || ' + playerName + target + ' '+tx('at')+' ' + rpt.side0XCoord + ',' + rpt.side0YCoord + ' '+tx('has been')+' ' + atkType + ' '+tx('by you'); var automsg = sendChat("/" + Seed.player.name + ' ' + msg); t.addAllianceReport(rpt); } } } }, addAllianceReport: function (rpt) { t = AllianceReportsCheck; var ID = rpt.reportId; t.aRpt["a" + ID] = rpt.reportUnixTime; var now = unixTime() - (5 * 24 * 60 * 60); for (var k in t.aRpt) { if (t.aRpt[k] < now) delete t.aRpt[k]; } var string = JSON2.stringify(t.aRpt); setTimeout(function () { GM_setValue("allianceRpt_" + getServerId()+"_"+uW.tvuid, string); }, 0); }, fetchreport: function (rpId, rpt, msg, playerNames, cityNames, TileType, MarchType) { var t = AllianceReportsCheck; if (Options.ReportOptions.IgnoreScouts && MarchType == 3) return; if (Options.ReportOptions.IgnoreWilds && TileType <= 50) return; FetchReport(rpId,function(rslt) { if (rslt.detail.winner && rslt.detail.winner == 1) { var DefeatedText = ' ||[#1][#8] '+tx('You were defeated')+'![#][#]'; } else { var DefeatedText = ' ||[#2] '+tx('You defended successfully')+'![#]'; } var troops = rslt.detail.fght.s1; var trooptot = 0; for (var i in troops) { trooptot += Number(troops[i][0]); } if (Options.ReportOptions.alertmtroops > trooptot) return; msg = msg+' || '+uW.g_js_strings.commonstr.troops+' '+trooptot+DefeatedText; if (Options.ReportOptions.WhisperAR) { var automsg = sendChat("/"+Seed.player.name+' '+msg); var WList = Options.ReportOptions.WhisperARList.split(','); for (var i = 0; i < WList.length; i++) { var WName = WList[i].trim(); if (WName) BotChat.sendWhisper(msg,WName); } } else { var automsg = sendChat('/a '+msg); } }); }, }; var towho = { mmFunc: null, init: function () { t = towho; try { t.mmFunc = new CalterUwFunc('cm.messageController.messageWide', [ [/params\.subject\s*=\s*..".modal_msg_write_subj".\.val.../im, 'params.subject = cm.messageController.escape\(allianceall?"{"+g_js_strings.commonstr.alliance+"} "+document.getElementById(\'modal_msg_write_subj\').value:"{"+g_js_strings.commonstr.officers+"} "+document.getElementById(\'modal_msg_write_subj\').value\);'], [/\$\("#modal_msg_write_to/im, 'jQuery("#modal_msg_write_to'] ]); t.mmFunc.setEnable(true); } catch (err) { logerr(err); // write to log } } } var PageNavigator = { modalMessagesFunc: null, ctrlPaginationOld: null, loadPage_paginationOld: null, cpPager: null, init: function () { var t = PageNavigator; try { t.modalMessagesFunc = new CalterUwFunc('modal_messages', [ [/pageNavigatorModel\s*=.*?;/i, 'var pager=ptPagerHook(0,5);pageNavigatorModel=pager;'], [/pageNavigatorView\s*=.*?;/i, 'pageNavigatorView=pager;'], [/pageNavigatorController\s*=.*?;/i, 'pageNavigatorController=pager;'] ]); uWExportFunction('ptPagerHook',PageNavigator.ConstructCPager); t.ctrlPaginationOld = uW.ctrlPagination; t.loadPage_paginationOld = uW.loadPage_pagination; t.cpPager = new t.Cpager(0, 0); t.cpPager.oldStyle = true; uWExportFunction("oldctrlPagination", PageNavigator.ctrlPaginationOld); uWExportFunction("newctrlPagination", PageNavigator.ctrlPagination); uWExportFunction("oldloadPage_pagination", PageNavigator.loadPage_paginationOld); uWExportFunction("newloadPage_pagination", PageNavigator.loadPage_pagination); t.enable(Options.fixPageNav); } catch (err) { logerr(err); // write to log } }, // called on 'back' ... loadPage_pagination: function (divId, currentPage, callbackFunction, totalPages) { var t = PageNavigator; var curPage = parseInt(currentPage); if (divId == t.cpPager.divId) // if 'old' style ... uW[callbackFunction](t.cpPager.getCurrentPage()); else uW[callbackFunction](currentPage); }, ctrlPagination: function (navDivId, numPages, notify, curPage) { var t = PageNavigator; if (ById(navDivId).firstChild == null) ById(navDivId).appendChild(t.cpPager.getHtmlElement()); t.cpPager.setPageCount(numPages); t.cpPager.divId = navDivId; if (!curPage) curPage = 1; t.cpPager.gotoPage(curPage); t.cpPager.onClick = uW[notify]; if (typeof createObjectIn == 'function') { var newobj = createObjectIn(uW,{defineAs: 'cpPager'}); exportFunction(t.cpPager.getHtmlElement,newobj,{defineAs:'getHtmlElement'}); exportFunction(t.cpPager.setPageCount,newobj,{defineAs:'setPageCount'}); exportFunction(t.cpPager.getPageCount,newobj,{defineAs:'getPageCount'}); exportFunction(t.cpPager.getCurrentPage,newobj,{defineAs:'getCurrentPage'}); exportFunction(t.cpPager.gotoPage,newobj,{defineAs:'gotoPage'}); exportFunction(t.cpPager.e_but,newobj,{defineAs:'e_but'}); exportFunction(t.cpPager.e_inp,newobj,{defineAs:'e_inp'}); exportFunction(t.cpPager.onClick,newobj,{defineAs:'onClick'}); newobj.numPages = t.cpPager.numPages; newobj.curPage = t.cpPager.curPage; newobj.oldStyle = t.cpPager.oldStyle; newobj.divId = t.cpPager.divId; uW.pageNavigatorView = newobj; } else { uW.pageNavigatorView = t.cpPager; } }, enable: function (tf) { var t = PageNavigator; t.modalMessagesFunc.setEnable(tf); if (tf) { uW.ctrlPagination = uW.newctrlPagination; uW.loadPage_pagination = uW.newloadPage_pagination; } else { uW.ctrlPagination = uW.oldctrlPagination; uW.loadPage_pagination = uW.oldloadPage_pagination; } }, isAvailable: function () { var t = PageNavigator; return t.modalMessagesFunc.isAvailable(); }, ConstructCPager : function (a, b) { var t = PageNavigator; var localobj = new t.Cpager(a, b); localobj.onClick = function(a) { uW.pageNavigatorController.onClick(a); } if (typeof createObjectIn == 'function') { var newobj = createObjectIn(uW,{defineAs: 'ptPagerObj'}); exportFunction(localobj.getHtmlElement,newobj,{defineAs:'getHtmlElement'}); exportFunction(localobj.setPageCount,newobj,{defineAs:'setPageCount'}); exportFunction(localobj.getPageCount,newobj,{defineAs:'getPageCount'}); exportFunction(localobj.getCurrentPage,newobj,{defineAs:'getCurrentPage'}); exportFunction(localobj.gotoPage,newobj,{defineAs:'gotoPage'}); exportFunction(localobj.e_but,newobj,{defineAs:'e_but'}); exportFunction(localobj.e_inp,newobj,{defineAs:'e_inp'}); exportFunction(localobj.onClick,newobj,{defineAs:'onClick'}); newobj.numPages = t.cpPager.numPages; newobj.curPage = t.cpPager.curPage; newobj.oldStyle = t.cpPager.oldStyle; return newobj; } else { return localobj; } }, Cpager: function (a, b) { // public function protos ... this.getHtmlElement = getHtmlElement; this.setPageCount = setPageCount; this.getPageCount = getPageCount; this.getCurrentPage = getCurrentPage; this.gotoPage = gotoPage; this.e_but = e_but; this.e_inp = e_inp; // var t = this; this.onClick = null; this.numPages = b; this.curPage = a; this.oldStyle = false; function getHtmlElement() { function aButton(msg, evtPage) { return '' + msg + ''; } var div = document.createElement('div'); div.id = 'ptPageNavBar'; div.innerHTML = '\ \ \ \ \ \ \
    ' + aButton('▏▏', 'F') + '' + aButton('◄', '-') + '' + aButton('►', '+') + '' + aButton('▏▏', 'L') + ' '+tx('Page')+'  '+tx('of')+' ?
    '; var mml = ById('modal_msg_list'); if (mml != null) mml.style.minHeight = '400px'; return div; } function getPageCount() { // koc needs for 'back' return t.numPages; } function getCurrentPage() { // koc needs for 'back' return t.curPage; } function setPageCount(c) { t.numPages = c; ById('ptPagerNumPages').innerHTML = c; var mml = ById('modal_msg_list'); if (mml != null) { if (ById('modal_msg_tabs_report').className.indexOf('selected') >= 0) mml.style.minHeight = '460px'; else mml.style.minHeight = '400px'; } } function gotoPage(p) { t.curPage = parseIntZero(p); ById('ptPagerPageNum').value = t.curPage; } function e_but(p) { if (p == 'F' && t.curPage != 1) loadPage(1); else if (p == '-' && t.curPage > 1) loadPage(t.curPage - 1); else if (p == '+' && t.curPage < t.numPages) loadPage(t.curPage + 1); else if (p == 'L' && t.curPage != t.numPages) loadPage(t.numPages); function loadPage(p) { if (t.oldStyle) t.gotoPage(p); t.onClick(p); } } function e_inp(p) { var pageNum = parseIntZero(ById('ptPagerPageNum').value); t.onClick(pageNum); } }, }; var TowerAlerts = { viewImpendingFunc: null, fixTargetEnabled: false, init: function () { var t = TowerAlerts; try { t.viewImpendingFunc = new CalterUwFunc('attack_viewimpending_view', [ [/Modal.showModal\((.*)\)/im, 'Modal.showModal\($1\); ptViewImpending_hook(a);'] ]); uWExportFunction('ptViewImpending_hook', t.viewImpending_hook); t.viewImpendingFunc.setEnable(true); } catch (err) { logerr(err); // write to log } }, // fix 'target' viewImpending_hook: function (atkinc) { var t = TowerAlerts; var div = ById('modal_attackimpending_view'); var isFalse = false; if (t.fixTargetEnabled) { var city = Cities.byID[atkinc.toCityId]; var target = ''; if (!city || (atkinc.marchType != 3 && atkinc.marchType != 4)) { target = ''+tx('FALSE REPORT')+'!'; isFalse = true; } else if (city.tileId == atkinc.toTileId) { target = city.name + ' (' + city.x + ',' + city.y + ')'; } else { wilds = Seed.wilderness['city' + atkinc.toCityId]; m = ''; for (var k in wilds) { if (wilds[k].tileId == atkinc.toTileId) { m = 'at ' + wilds[k].xCoord + ',' + wilds[k].yCoord; break; } } target = city.name + ', '+tx('WILD')+' ' + m + ''; } div.childNodes[0].innerHTML = ''+tx('Target')+': ' + target; } }, enableFixTarget: function (tf) { var t = TowerAlerts; t.fixTargetEnabled = tf; }, isFixTargetAvailable: function () { var t = TowerAlerts; return t.viewImpendingFunc.isAvailable(); }, } var CoordBox = { MapZoom : Boolean, init: function () { var t = CoordBox; uWExportFunction('btToggleMapZoom', CoordBox.ToggleMapZoom); t.MapZoom = false; t.boxDiv = searchDOM(ById('maparea_map'), 'node.className=="mod_coord"', 3, false); t.boxDiv.id = 'btCoordsBox'; t.setEnable(Options.mapCoordsTop); var newdiv = document.createElement('div'); newdiv.id = 'btZoom'; newdiv.innerHTML = ''; jQuery("#btCoordsBox > div:first").after(newdiv); }, setEnable: function (tf) { var t = CoordBox; if (t.boxDiv == null) return; if (tf) t.boxDiv.style.zIndex = '100000'; else t.boxDiv.style.zIndex = '10011'; }, isAvailable: function () { var t = CoordBox; return !(t.boxDiv == null); }, ToggleMapZoom : function () { var t = CoordBox; t.MapZoom = !t.MapZoom; uW.g_mapObject.setCenterSlot(); if (t.MapZoom) { uW.g_mapObject.vpxmultiplier = 30; uW.g_mapObject.hpxmultiplier = 50; var style = document.createElement('style'); style.id = 'btMapZoomStyle'; style.innerHTML = '\ .map1 .slot {width:50px !important;height:30px !important; background-size:cover !important;}\ .map1 .slot.PrestigeCity_4, .map1 .slot.PrestigeCity_5, .map1 .slot.PrestigeCity_6 {background-position: -50px 0px !important;}\ .map1 .slot.PrestigeCity_7, .map1 .slot.PrestigeCity_8, .map1 .slot.PrestigeCity_9, .map1 .slot.PrestigeCity_10, \ .map1 .slot.PrestigeCity_11, .map1 .slot.PrestigeCity_12, .map1 .slot.PrestigeCity_13, .map1 .slot.PrestigeCity_14, .map1 .slot.PrestigeCity_15 {background-position: -100px 0px !important;}\ .map1 .slot.shield span {left:-18px !important; top:-6px !important; background-size:15% !important;}\ .map1 .slot.sword span {left:-18px !important; top:-6px !important; background-size:15% !important;}\ .map1 .slot.mapcastle span {width:16px !important; height:16px !important; left:20px !important; padding-top:5px !important; font-size:7px !important; background-size:16px !important;}'; ById('btZoom').appendChild(style); ById('btZoomLink').innerHTML = tx('Zoom In'); } else { uW.g_mapObject.vpxmultiplier = 58; uW.g_mapObject.hpxmultiplier = 96; jQuery('#btMapZoomStyle').remove(); ById('btZoomLink').innerHTML = tx('Zoom Out'); } uW.g_mapObject.setPosition(); uW.g_mapObject.getMoreSlots(); }, }; var cdtd = { views: null, oldupdate_citylist: null, newupdate_citylist: null, init: function () { var t = cdtd; try { if (typeof uW.watch == 'function') { uW.watch("update_citylist",function(c,a,b){return b;}); // palemoon 'unwatch' doesn't work } if (typeof uW.unwatch == 'function') { uW.unwatch("update_citylist"); // naughty RockYou! } uWExportFunction('ptcheckascension', cdtd.checkascension); uWExportFunction('ptgetchampstatus', cdtd.getchampstatus); uWExportFunction('cdtdhook', cdtd.citychange); var z = new CalterUwFunc("showCityTooltip",[ [/showTooltip/,'a += "
    "+g_js_strings.guardian[seed.guardian[j].type+"_fullName"]+"
    " + ptgetchampstatus(seed.cities[j][0])+"
    ";showTooltip'], ['g_js_strings.showPopTooltip.currpop','provincenames[\'p\'+seed.cities[j][4]] + "
    " + ptcheckascension(seed.cities[j][0]) + g_js_strings.showPopTooltip.currpop'] ]); z.setEnable(true); t.views = new CalterUwFunc("citysel_click", [ [/cm\.PrestigeCityView\.render\(\)/im, 'cm.PrestigeCityView.render();cdtdhook();'] ]); if (Options.EnhCBtns) { t.views.setEnable(true); t.oldupdate_citylist = uW.update_citylist; t.newupdate_citylist = function () { cdtd.oldupdate_citylist(); cdtd.drawdefendstatus(); if (Options.ColrCityBtns) cdtd.drawfactioncolors(); }; uWExportFunction('newupdate_citylist',cdtd.newupdate_citylist); uW.update_citylist = uW.newupdate_citylist; t.drawdefendstatus(); }; } catch (err) { logerr(err); // write to log } }, citychange: function () { cdtd.drawdefendstatus(); Tabs.Options.checkAscension(); // ascension expiry tied into enhanced city buttons }, drawdefendstatus: function () { var t = cdtd; for (var i = 0; i < uW.seed.cities.length; i++) { var cityidx = i + 1; var city = ById('citysel_' + cityidx); if (!city) { setTimeout(t.drawdefendstatus, 100); return; } var cityId = uW.seed.cities[i][0]; var color = 'blue'; if (uW.seed.citystats['city'+cityId].gate != 0) { color = 'red'; } if (Tabs.PortalTime && ((Options.PortOptions.PortCities && Options.PortOptions.PortCities[Cities.byID[cityId].idx+1]==true) || (Options.PortOptions.PortCity && cityId==Options.PortOptions.PortCity)) && Options.PortOptions.Running) { color = 'cyan'; } city.style.color = color; city.style.border = '2px inset '+color; city.style.display = 'inline'; city.style.width = 10 + '%'; if (Options.DbClkDefBtns && SelectiveDefending) { city.ondblclick = function () { t.setdefendstatus(this.name); }; } } }, setdefendstatus: function (city) { var t = cdtd; var state = 1; if (uW.seed.citystats["city" + city].gate != 0) state = 0; var params = uW.Object.clone(uW.g_ajaxparams); params.cid = city; params.state = state; new MyAjaxRequest(uW.g_ajaxpath + "ajax/gate.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { uW.seed.citystats["city" + city].gate = state; t.drawdefendstatus(); } }, onFailure: function () { t.drawdefendstatus(); }, },true); }, drawfactioncolors: function () { var t = cdtd; for (var i = 0; i < uW.seed.cities.length; i++) { color = "black"; var ascended = getAscensionValues(uW.seed.cities[i][0]); if (ascended.isPrestigeCity) { switch (parseIntNan(ascended.prestigeType)) { case 1: color = "#228b22"; break; case 2: color = "#A944DB"; break; case 3: color = "#E36600"; break; } } ById('mod_citylist').children[i].innerHTML = "" + uW.roman[i] + ""; } }, checkascension : function(id) { var str = "" var protection = CM.PrestigeCityPlayerProtectionController.isActive(id); if (protection) { str += ""+tx('Ascension Protection')+": "+uW.timestr(CM.PrestigeCityPlayerProtectionController.getTimeLeft(id),false)+"
    "; } var ascended = getAscensionValues(id); var canAscend = true; if (ascended.isPrestigeCity) { var MaxLevel = CM.PrestigeModel.getLevelCapSoft(ascended.prestigeType); canAscend = (MaxLevel>parseIntNan(ascended.prestigeLevel)); } if (Options.BuildOptions && Options.BuildOptions.AscendRunning) { if (protection && !canAscend) { str += ''+tx("Maximum Ascension Level")+"!
    "; } else if (Options.BuildOptions.AscendEnabled[Cities.byID[id].idx+1]) { str += ''+tx("Auto-Ascend Enabled")+"!
    "; } } return str; }, getchampstatus : function(id) { var citychamp; var ChampText = uW.g_js_strings.champ.no_champ+"!"; var gotchamp = false; citychamp = getCityChampion(id); if (citychamp.championId) { gotchamp = true; var champname = citychamp.name; var champstatus = citychamp.status; if (champstatus != "10") { ChampText = champname + ' ('+tx('Defending')+')'; } else { ChampText = champname + ' ('+tx('Marching')+')'; } } if (gotchamp) { return '
    '+ChampText+'
    '; } else { return '
    '+ChampText+'
    '; } }, } var LoadCapFix = { init: function () { var t = LoadCapFix; try { if (!NoRegEx) { t.capLoadEffect = new CalterUwFunc('cm.MarchModal.updateTroopResource', [ [/\$\("#modal/ig, 'jQuery("#modal'], [/if\(jQuery/i, 'loadBoost = Math.min(loadBoost,(cm.thronestats.boosts.Load.Max/100)+techLoadBoost); for(var sacIndex = 0; sacIndex < seed.queue_sacr["city" + currentcityid].length; sacIndex ++ ) if(seed.queue_sacr["city" + currentcityid][sacIndex]["unitType"] == untid) unit_number *= seed.queue_sacr["city" + currentcityid][sacIndex]["multiplier"][0]; if(jQuery'], [/var\s*resources/i, 'load=load-1;var resources'] ]); } else { t.capLoadEffect = new CalterUwFunc('cm.MarchModal.updateTroopResource', [ [/\$\("#modal/ig, 'jQuery("#modal'], ['if (jQuery', 'loadBoost = Math.min(loadBoost,(cm.thronestats.boosts.Load.Max/100)+techLoadBoost); for(var sacIndex = 0; sacIndex < seed.queue_sacr["city" + currentcityid].length; sacIndex ++ ) if(seed.queue_sacr["city" + currentcityid][sacIndex]["unitType"] == untid) unit_number *= seed.queue_sacr["city" + currentcityid][sacIndex]["multiplier"][0]; if(jQuery'], ['var resources', 'load=load-1;var resources'] ]); } t.capLoadEffect.setEnable(Options.fixLoadCap); } catch (err) { logerr(err); // write to log } }, setEnable: function (tf) { var t = LoadCapFix; t.capLoadEffect.setEnable(tf); }, isAvailable: function () { var t = LoadCapFix; return t.capLoadEffect.isAvailable(); }, } var TRAetherCostFix = { aethercostFix: null, init: function () { t = TRAetherCostFix; try { t.aethercostFix = new CalterUwFunc('cm.ThronePanelController.calcCost', [ [/if\(k\(/im, 'if(cm.ThronePanelController.isLastLevel('], [/E\.stones\.use\s*=\s*E\.stones\.total/im, 'E.stones.use = B'], [/if\(E\.stones\.use\s*==/im, 'if(E.stones.use >='], [/E\.gems\.use\s*=\s*b\(E\.stones\.total\s*-\s*B\)/im, 'var xx = + (cm.WorldSettings.getSetting("TR_AETHERSTONE_CONVERSION_COST")), y; E.gems.use = Math.ceil((E.stones.total - B)/xx)'], [/E\.gems\.use\s*=\s*b\(z\[D]\.Stones\)/im, 'var xx = + (cm.WorldSettings.getSetting("TR_AETHERSTONE_CONVERSION_COST")), y; E.gems.use = Math.ceil((z[D].Stones)/xx)'], ]); t.aethercostFix.setEnable(Options.fixTRAetherCost); if (NoRegEx) { t.aethercostFixCB = new CalterUwFunc('cm.ThronePanelController.calcCost', [ [/if\s*\(k\(/im, 'if(cm.ThronePanelController.isLastLevel('], //fix for cometbird [/if\s*\(E\.stones\.use\s*==/im, 'if(E.stones.use >='] ]); //fix for cometbird t.aethercostFixCB.setEnable(Options.fixTRAetherCost); } } catch (err) { logerr(err); // write to log } }, setEnable: function (tf) { var t = TRAetherCostFix; t.aethercostFix.setEnable(tf); if (NoRegEx) { t.aethercostFixCB.setEnable(tf); } }, isAvailable: function () { var t = TRAetherCostFix; if (!NoRegEx) { return t.aethercostFix.isAvailable(); } else { return (t.aethercostFix.isAvailable() && t.aethercostFixCB.isAvailable()); } }, } var mmbImageFix = { imageFix: null, init: function () { t = mmbImageFix; try { t.imageFix = new CalterUwFunc('cm.mww.mmb_share', [ [/img\/items\/130/im, 'img/items/70/'], [/common_postToProfile\(\"85\"/im, 'template_data_85.img1=template_data_85.media[0].src; common_postToProfile(\"85\"'] ]); t.imageFix.setEnable(Options.fixMMBImage); } catch (err) { logerr(err); // write to log } }, setEnable: function (tf) { var t = mmbImageFix; t.imageFix.setEnable(tf); }, isAvailable: function () { var t = mmbImageFix; return t.imageFix.isAvailable(); }, } /** Global march function **/ var March = { tt : null, currentrequests : 0, maxrequests : 3, queue : [], waittime : 0, waitwarning : false, addMarch : function (params, callback, forcemarch){ var t = March; var opts = {params:params, callback:callback}; if(t.currentrequests < t.maxrequests || forcemarch){ t.sendMarch(opts.params, opts.callback); } else { t.queue.push(opts); actionLog(t.getMarchType(opts.params.type)+' added to march queue. Queue now contains '+ t.getQueueLength() +' marches.','MARCH'); } }, loop : function (){ var t = March; if(t.currentrequests < t.maxrequests){ var opts = t.queue.shift(); if(opts) { t.sendMarch(opts.params, opts.callback); actionLog(t.getMarchType(opts.params.type)+' triggered from march queue. Queue now contains '+ t.getQueueLength() +' marches.','MARCH'); } } }, getMarchType : function (mt){ switch (parseIntNan(mt)) { case 1: return 'Transport'; case 2: return 'Reinforcement'; case 3: return 'Scout'; case 4: return 'Attack'; case 5: return 'Reassign'; default: return 'March'; } }, getQueueLength : function (){ var t = March; return t.queue.length; }, RallyPoint : function (cityId){ var t = March; var ret = {}; ret.level = t.getRallypointLevel(cityId); ret.maxSlots = t.getTotalSlots(cityId); ret.marching = t.getMarchSlots(cityId); ret.emptySlots = t.getEmptySlots(cityId); ret.maxSize = t.getMaxSize(cityId,''); // assume no items return ret; }, getRallypointLevel : function (cityId){ var t = March; cityId = "city"+cityId; rallypointlevel = 0; for (var o in Seed.buildings[cityId]){ var buildingType = parseInt(Seed.buildings[cityId][o][0]); var buildingLevel = parseInt(Seed.buildings[cityId][o][1]); if (buildingType == 12) { rallypointlevel=parseInt(buildingLevel); break; } } return rallypointlevel; }, getTotalSlots : function (cityId){ var t = March; var ascended = getAscensionValues(cityId); var rallypointlevel = t.getRallypointLevel(cityId); var slots = rallypointlevel; //Set default number of slots to rallypointlevel if(slots >= 13)slots = 12;// a level 13 and above rallypoint only allows for 12 marches. if(ascended.isPrestigeCity){ slots +=3; } return slots; }, getMarchSlots : function (cityId){ var t = March; cityId = "city"+cityId; var slots=0; var now = unixTime(); if (Seed.queue_atkp[cityId] != undefined && Seed.queue_atkp[cityId] != []){ for(var k in Seed.queue_atkp[cityId]){ var m = Seed.queue_atkp[cityId][k]; if(m.marchType == 9) { if(m.botMarchStatus < 3 || m.botMarchStatus > 9)slots++; //If raid is stopped take it as empty slot } else { if ((m.returnUnixTime > now) || m.marchStatus == 2){ // count encamped marches! slots++; } } } } else { slots=0; } return slots; }, getEmptySlots : function (cityId){ var t = March; var slots = t.getTotalSlots(cityId); slots -= t.getMarchSlots(cityId); if(slots < 0) slots = 0; return slots; }, getMaxSize : function (cityId,items){ var t = March; var rallypointlevel = getUniqueCityBuilding(cityId, 12).maxLevel; var ascended = getAscensionValues(cityId); var buff = 1; var max = 0; var now = unixTime(); var Conquest = false; var Command = false; var koth = false; var iused = null; if (items) { iused = items.split(","); } if (iused) { for (var i = 0; i < iused.length; i++) { if (iused[i] == 931) { Command = true; } if (iused[i] == 932) { Conquest = true; } } } if (Conquest) { buff = 1.5; } else { if (Command) { buff = 1.25; }}; // timed auras take priority if (Seed.playerEffects.auras2Expire && Seed.playerEffects.auras2Expire > now) { buff = 1.3 } else { if (Seed.playerEffects.aurasExpire && Seed.playerEffects.aurasExpire > now) { buff = 1.15 } } //var tr = Math.floor(equippedthronestats(66)); var tr = Math.floor(equippedthronestats(66)+equippedthronestats(163)); if (tr > uW.cm.thronestats.boosts.MarchSize.Max) { tr=uW.cm.thronestats.boosts.MarchSize.Max; } if (tr > 0) { buff *= (1 + tr / 100); } if(ascended.isPrestigeCity){ var b = ascended.prestigeLevel; var r = CM.WorldSettings.getSetting("ASCENSION_RALLYPOINT_BOOST"); var m = JSON.parse(r); var u = 1; if (m.values[b-1]) { u = m.values[b-1][1]; } var k = parseFloat(u); buff *= k if (uW.seed.cityData.city[cityId].prestigeInfo.blessings.indexOf(207) != -1) { buff *= 1.1; } } if (koth) max=1; switch(rallypointlevel){ case 11: max = 150000 * buff; break; case 12: max = 200000 * buff; break; case 13: max = 215000 * buff; break; case 14: max = 250000 * buff; break; case 15: max = 275000 * buff; break; default: max = (rallypointlevel * 10000) * buff; break; } var domainBoosterBonus = 1; if(CM.WorldSettings.hasSetting('DOMAIN_BOOST_RALLYPIONT')) { domainBoosterBonus = parseInt(CM.WorldSettings.getSetting("DOMAIN_BOOST_RALLYPIONT")); max *= domainBoosterBonus; } return Math.floor(max+0.0001); }, getMarchTime : function (cityId,unit_types,distance,spell_type,phoenix_wings_used,thunder_wings_used,red_wings_used,green_wings_used,koth) { var speed = 99999; var speedfriend = 99999; var unitsfound = false; var QualifyAU = false; var QualifyFF = false; var QualifyGW = false; for (var ui in unit_types) { unitsfound = true; i = unit_types[ui]; var troop_speed = parseInt(uW.unitstats["unt" + i][3]); troop_speed *= (1 + 0.1 * parseInt(Seed.tech.tch11)); for (var sacIndex = 0; sacIndex < Seed.queue_sacr["city" + cityId].length; sacIndex++) { if (Seed.queue_sacr["city" + cityId][sacIndex]["unitType"] == i) { troop_speed *= Seed.queue_sacr["city" + cityId][sacIndex]["multiplier"][0] } } if (spell_type=='31' && CM.attack_modal.isUnitSiege(i)) { troop_speed *= 2; } if (CM.unitHorsedBenefit[i]) { troop_speed = troop_speed * (1 + 0.05 * parseInt(Seed.tech.tch12)); } else { troop_speed *= (1 + 0.05 * (parseInt(Seed.tech2.tch1) || 0)); troop_speed *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().BLOOD_LUST, cityId, uWCloneInto({ speed : true })); } if (troop_speed < speed) { speed = troop_speed; } if (!koth) { if (i==14 || i==37) { QualifyAU = true; } if (i==13 || uW.spellCasterUnits["unt"+i]) { QualifyFF = true; } if (i==11 || i==36) { QualifyGW = true; } } } speedfriend = speed; speedfriend *= 1 + (getUniqueCityBuilding (cityId, 18).maxLevel/2); speed *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().FILL_THE_RANKS, cityId, uWCloneInto({ marchspeed : true })); speed *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().REDUCE_FATIGUE, cityId, uWCloneInto({})); if (QualifyAU) { speed *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().AGGRESSIVE_URGE, cityId, uWCloneInto({})); } if (QualifyFF) { speed *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().FLASH_FEET, cityId, uWCloneInto({})); } if (QualifyGW) { speed *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().GREASED_WHEELS, cityId, uWCloneInto({})); } speedfriend *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().FILL_THE_RANKS, cityId, uWCloneInto({ marchspeed : true })); speedfriend *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().REDUCE_FATIGUE, cityId, uWCloneInto({})); if (QualifyAU) { speedfriend *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().AGGRESSIVE_URGE, cityId, uWCloneInto({})); } if (QualifyFF) { speedfriend *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().FLASH_FEET, cityId, uWCloneInto({})); } if (QualifyGW) { speedfriend *= CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().GREASED_WHEELS, cityId, uWCloneInto({})); } if (!koth) { trMarchAllSpeed = CM.ThroneController.getBoundedEffect(67) + CM.ThroneController.getBoundedEffect(163); trAttackSpeed = CM.ThroneController.getBoundedEffect(68); trReinforceSpeed = CM.ThroneController.getBoundedEffect(69); trTransportSpeed = CM.ThroneController.getBoundedEffect(70); trReassignSpeed = CM.ThroneController.getBoundedEffect(71); trScoutSpeed = CM.ThroneController.getBoundedEffect(72); var throneBoost = trMarchAllSpeed + trAttackSpeed; var throneBoostFriend = trMarchAllSpeed + Math.min(trReinforceSpeed,trTransportSpeed); speed = speed * (1 + (throneBoost * 0.01)) speedfriend = speedfriend * (1 + (throneBoostFriend * 0.01)) } var gi = CM.guardianModalModel.getMarchBonus(); var multiplier = 1 + (gi * 0.01); speed = speed * multiplier speedfriend = speedfriend * multiplier if (0 == speed || 0 == distance) { return {friend:0,foe:0,speedfriend:speedfriend,speed:speed}; } var time = 0; var timefriend = 0; if (unitsfound) { if (speed > 0) { time = Math.ceil(parseFloat(distance) * 6000 / speed); } if (speedfriend > 0) { timefriend = Math.ceil(parseFloat(distance) * 6000 / speedfriend); } var wings_used = red_wings_used || green_wings_used; var delay = CM.WorldSettings.isOn("MARCH_SINGLE_TRIP_DELAY") ? parseInt(uW.g_marchSingleTripDelay) : 0; time += delay; timefriend += delay; if (phoenix_wings_used) { time = parseInt(time * 0.1); timefriend = parseInt(timefriend * 0.1); } else { if (thunder_wings_used) { time = parseInt(time * 0.25); timefriend = parseInt(timefriend * 0.25); } else { if (red_wings_used) { time = parseInt(time * 0.5); timefriend = parseInt(timefriend * 0.5); } else { if (green_wings_used) { time = parseInt(time * 0.75); timefriend = parseInt(timefriend * 0.75); } } } } if (Seed.playerEffects.returnExpire > uW.unixtime()) { time = parseInt(time * 0.75); timefriend = parseInt(timefriend * 0.75); } if (spell_type=='11') { time *= 0.01; timefriend *= 0.01; } time = Math.ceil(time < 30 ? 30 : time); timefriend = Math.ceil(timefriend < 30 ? 30 : timefriend); } return {friend:timefriend,foe:time,speedfriend:speedfriend,speed:speed}; }, sendMarch : function (params, callback){ var t = March; if(March.waittime > uW.unixtime()){ if (March.waitwarning) { actionLog('Marches suspended to deal with march Captcha','MARCH'); March.waitwarning = false; } if (callback) callback({msg:"Marches suspended to deal with march Captcha"}); return; }; //need to check that march is not oversized! var maxsize = March.getMaxSize(params.cid, params.items); var x = 0; for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; var y = eval('params.u'+i); if (matTypeof(y)== 'number') { x+=y; } } if(maxsize < x) { actionLog(Cities.byID[params.cid].name+': Attempted to send march size '+x+' - max allowed is '+maxsize,'MARCH'); if (callback) callback({msg:"Maximum Troops Exceeded"}); return; } t.currentrequests++; new MyAjaxRequest(uW.g_ajaxpath + "ajax/march.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) {try{ --t.currentrequests; if (t.currentrequests<0) t.currentrequests=0; setTimeout(March.loop, 3000); //Always check for the next queued march 3 seconds after a request CM.MarchModal.setBackedOff(false); if (rslt.ok) { if (rslt.bsEndDate) { Seed.cityData.city[params.cid].spells = uWCloneInto({}); Seed.cityData.city[params.cid].spells[params.bs] = uWCloneInto({endDate : rslt.bsEndDate}); } if (params.champid && params.champid != 0) { var championidx = ""; for (var i = 0; i < Seed.champion.champions.length; i++) { if (Seed.champion.champions[i].championId == params.champid) championidx = i; } // update seed immediately Seed.champion.champions[championidx].status = "10"; } var timediff = parseInt(rslt.eta) - parseInt(rslt.initTS); var rtimediff = parseInt(rslt.returnTS) - parseInt(rslt.initTS); var ut = uW.unixtime(); var unitsarr = {}; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (params["u" + i]) unitsarr[i] = params["u" + i]; else unitsarr[i] = 0; } var resources = new Array(); resources[0] = params.gold; for (var i = 1; i <= 5; i++) { resources[i] = params["r" + i]; } uW.attach_addoutgoingmarch(rslt.marchId, rslt.marchUnixTime, ut + timediff, params.xcoord, params.ycoord, uWCloneInto(unitsarr), params.type, params.kid, uWCloneInto(resources), rslt.tileId, rslt.tileType, rslt.tileLevel, params.cid, true, ut + rtimediff); if (params.items && params.items != "") { var iused = params.items.split(","); for (var i = 0; i < iused.length; i++) { Seed.items["i" + iused[i]] = parseInt(Seed.items["i" + iused[i]]) - 1; uW.ksoItems[iused[i]].subtract(); } } uW.updateBoosts(uWCloneInto(rslt)); if (rslt.liftFog) { Seed.playerEffects.fogExpire = 0; uW.g_mapObject.getMoreSlots(); uW.update_boosts(); if (Options.AutoMistMarch && uW.ksoItems[10021].count>0) { CM.ItemController.usePotionOfMist('10021'); actionLog('Automatically applying Potion of Mist','MARCH'); } } if (Tabs.Megalith && params.type==4) { Tabs.Megalith.CheckAddAttackTime(params.xcoord,params.ycoord,rslt.marchUnixTime); } if (callback) { callback(rslt); } } else { if (rslt.user_action) { actionLog('March Error: Server Response - '+rslt.user_action,'MARCH'); if (rslt.user_action == "backOffWaitTime") { CM.MarchModal.setBackedOff(true); if (rslt.tt) { params.tt = rslt.tt; } var wait = 2; if (rslt.wait_time) { wait = rslt.wait_time; } setTimeout (t.sendMarch, wait*1000, params, callback); // retry march after wait time return; } if (rslt.user_action == "marchWarning" || rslt.user_action == "marchCaptcha") { // send captcha through here now (no more captcha - it doesn't work anyway) March.waittime = Number(uW.unixtime()+120); // suspend marches for 2 mins March.waitwarning = true; rslt.msg = uW.g_js_strings.modal_attack.useractionwarningmessage; } } var msg = ''; var g = Number(rslt.error_code); switch (g) { case 0: msg = tx("Unexpected Error"); break; // unexpected error case 8: msg = tx("Excess Traffic"); CM.GATracker("Error", "Excess traffic. ("+g+")", uW.g_server); break; case 3: msg = tx("Game out of Sync"); break; //game out of sync case 4: msg = tx("You have insufficient units"); break; //not enough units case 104: msg = uW.g_js_strings.errorcode.err_104; break; //unable to attack target case 208: msg = uW.g_js_strings.errorcode.err_208; break; // beginner protection case 210: msg = uW.g_js_strings.errorcode.err_210; break; // Max marches case 212: if (Seed.knights['city'+params.cid]['knt'+params.kid]) Seed.knights['city'+params.cid]['knt'+params.kid].knightStatus = 10; //remove knight from list, set to 1 to make available again. msg = uW.g_js_strings.errorcode.err_212; break; case 213: if (Seed.knights['city'+params.cid]['knt'+params.kid]) Seed.knights['city'+params.cid]['knt'+params.kid].knightStatus = 10; //remove knight from list, set to 1 to make available again. msg = uW.g_js_strings.errorcode.err_213; break; default: CM.GATracker("Error", "Something has gone wrong. ("+g+")", uW.g_server); break; msg = uW.g_js_strings.errorcode["err_"+g]; break; } if (typeof rslt.cooldownTime !== "undefined") { rslt.msg = uW.g_js_strings.koth.timeRemaining.replace("%1$s", uW.timestr(rslt.cooldownTime)); if (Tabs.Megalith) { var now = unixTime(); Tabs.Megalith.CheckAddAttackTime(params.xcoord,params.ycoord,(now+(rslt.cooldownTime)-(Tabs.Megalith.CoolDown*60))); } } if (!rslt.msg) { rslt.msg = msg; } if (callback) { callback(rslt); } //return all server excess traffic error to original function to handle return; } } catch (err){ logerr(err);} }, onFailure: function () { --t.currentrequests; if (t.currentrequests<0) t.currentrequests=0; setTimeout(March.loop, 3000); //Always check for the next queued march 3 seconds after a request if(callback) { callback({msg:"AJAX Error"}); } } }); }, }; var ItemMultiUseController = { city_holder : 0, max : 1, init : function () { var t = ItemMultiUseController; //Hack for ItemController t.ItemController = new CalterUwFunc("cm.MultiBuyUse.getNumberUsed", [[/(.|\n)*/i,'function (e) {return ItemController_hook();}']]); uWExportFunction('ItemController_hook', ItemMultiUseController.e_total); }, UseItems : function (iid,num,cid) { var t = ItemMultiUseController; t.max = num; t.ItemController.setEnable(true); //Set to use current value specified if(cid){ //Set to use city specified t.city_holder = uW.currentcityid; uW.currentcityid = cid; } CM.ItemController.use(iid); if(cid){ //Set currentcity to old value uW.currentcityid = t.city_holder; } t.ItemController.setEnable(false); //Switch off value fixed }, e_total : function () { var t = ItemMultiUseController; return t.max; }, } /** TABS **/ /** Options Tab **/ Tabs.Options = { tabOrder: 9000, tabLabel: 'Settings', tabColor: 'red', tabMandatory: true, myDiv: null, WarnAscensionTimer: null, MiniRefreshTimer: null, LoopCounter:0, serverwait:false, PointlessItems : [4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,30300], PublishLists : {0:'----', 80:tx("Everyone"), 50:tx("Friends of Friends"), 40:tx("Friends Only"), 10:tx("Only Me"), 99:tx('Custom List')}, trstyles : 'div#throneMainContainer div#tableContainer{width:80px;height:213px;top:400px;left:450px;}\ div#throneMainContainer div#trophyContainer{width:71px;height:86px;top:41px;left:381px;}\ div#throneMainContainer div#statueContainer{width:124px;height:296px;top:274px;left:150px;z-index:97;}\ div#throneMainContainer div#advisorContainer{width:141px;height:240px;bottom:0pt;right:0pt;}\ div#throneMainContainer div#heroContainer{width:85px;height:150px;top:190px;left:585px;z-index:97;}', Colors : { Default: { Title: '#342819', TitleText: '#FFFFFF', DividerTop: '#E9D9AE', DividerBottom: '#8C7D5D', DividerText: '#000000', Panel: '#F7F3E6', PanelText: '#000000', Highlight: '#FFFFCC', HighlightText: '#000000',}, }, ReportOptions : { EnhanceAR: false, alertinterval: 10, alertmtroops: 0, WhisperAR:false, WhisperARList:"", WhisperOutgoing:false, PostIncoming: true, DeleteRptbc: false, DeleteRpttr: false, DeleteRptwl: false, DeleteRptaa: false, DeleteRptfr: false, DeleteRptid: false, DeleteRptdf: false, DeleteRptsc: false, DeleteRptUID: "", DeleteRptidType: 0, NoDuplicateReports: true, IgnoreWilds : false, IgnoreScouts : false, }, ChatOptions : { chatEnhance: true, chatIcons: true, chatGlobal: true, chatWhisper: true, chatBold: false, chatAttack: true, chatLeaders: true, enableWhisperAlert: true, WhisperPlay: 'monitor', enableTowerAlert: false, enableScoutAlert: false, TowerPlay: 'allianceattack', ScoutPlay: 'allianceattack', filter: true, fchar: "Null", HelpRequest: true, DeleteRequest: true, DeletegAl: true, DeleteFood: false, DeleteFoodUsers: "", DeleteAlert: false, DeleteAlertUsers: "", DeleteScout: false, DeleteScoutUsers: "", DeleteReport: false, DeleteGlobalSpam: false, DeleteAllianceSpam: false, SpamActive: false, SpamType: "g", SpamText: "Join my Alliance!", SpamInterval: 15, Emoticons: true, ImagePreviews: true, Volume: 100, GloryLeader: true, GloryLeaderInterval: 15, GloryLeaderUID: 0, GloryLeaderAID: 0, GloryLeaderLastChecked: 0, GloryLeaderGlory: 0, Rainbow: false, Styles: true, }, TowerOptions : { aChat : true, aPrefix : '** Red Alert! **', scouting : false, wilds : false, defend : true, tech : false, upkeep : true, champ : true, afk : true, guard : true, minTroops : 1000, whisper : true, whisperTroops : 500000, towercitytext : {}, towercityactive : {}, alertSound : { enabled : false, soundUrl : DEFAULT_ALERT_SOUND_URL, scoutUrl : DEFAULT_SCOUT_SOUND_URL, repeat : true, playLength : 10, repeatDelay : 0.5, volume : 100, alarmActive : false, expireTime : 0, }, AFKEvents : true, ChangeTR : false, ChangeTRPreset : "", StopRaids : false, StopMarches : false, ChangeGuardian : false, ChangeChamp : false, ChampId : 0, ChampTime : 10, ChampOriginalCity : 0, ChampNoChamp : false, Revert : false, RevertMinutes : 2, RecentActivity : false, LastAttack : 0, HandledMarches : [], LatestAttackTimes : {}, RecentCityActivity : {}, SaveCityState : {}, SaveTR : 0, DefendMonitor : true, }, soundRepeatTimer : null, soundStopTimer : null, updatemarchfunc : null, mss : null, languagestatus : '', popLang : null, init : function (div){ var t = Tabs.Options; t.myDiv = div; if (THEMES) { for (var a in THEMES) { t.Colors[a] = THEMES[a]; } } uWExportFunction('btTabDelete', Tabs.Options.TabDelete); uWExportFunction('btTabRefresh', Tabs.Options.TabRefresh); uWExportFunction('btTabAdd', Tabs.Options.TabAdd); uWExportFunction('btTabReset', Tabs.Options.TabReset); uWExportFunction('btTabReloadAll', Tabs.Options.TabReloadAll); uWExportFunction('btTabToggle', Tabs.Options.TabToggle); uWExportFunction ('btToggleTRPreset', Tabs.Options.ToggleTRPreset); if (!Options.ReportOptions) { Options.ReportOptions = t.ReportOptions; } else { for (var y in t.ReportOptions) { if (!Options.ReportOptions.hasOwnProperty(y)) { Options.ReportOptions[y] = t.ReportOptions[y]; } } } if (!Options.ChatOptions) { Options.ChatOptions = t.ChatOptions; } else { for (var y in t.ChatOptions) { if (!Options.ChatOptions.hasOwnProperty(y)) { Options.ChatOptions[y] = t.ChatOptions[y]; } } } if (!Options.TowerOptions) { Options.TowerOptions = t.TowerOptions; } else { for (var y in t.TowerOptions) { if (!Options.TowerOptions.hasOwnProperty(y)) { Options.TowerOptions[y] = t.TowerOptions[y]; } } for (var y in t.TowerOptions.alertSound) { if (!Options.TowerOptions.alertSound.hasOwnProperty(y)) { Options.TowerOptions.alertSound[y] = t.TowerOptions.alertSound[y]; } } } if (!Options.TowerOptions.RecentActivity) { t.resetCityStates(); } // safety! for (var cityId in Cities.byID) { if (!Options.TowerOptions.towercityactive.hasOwnProperty(cityId)) { // default city alert indicator to ON! Options.TowerOptions.towercityactive[cityId] = true; saveOptions(); } // if city has ported since citystate set, then reset arrival time to revert actions that were taken... if (Options.TowerOptions.SaveCityState[cityId] && Options.TowerOptions.SaveCityState[cityId].tileId != Cities.byID[cityId].tileId) { Options.TowerOptions.LatestAttackTimes[cityId] = 0; } } if (!UserOptions.TokenDomain) { // default token domain to current domain if not already set for user... UserOptions.TokenDomain = getServerId(); saveUserOptions(uW.user_id); } // do all the initialising here MAP_DELAY = Options.MapInterval * 1000; anticd.init(); ChatStuff.init(); AttackDialog.init(); ChatTimeFix.init(); GMTclock.init(); battleReports.init(); AllianceReports.init(); DispReport.init(); AllianceReportsCheck.init(); mapinfoFix.init(); MapDistanceFix.init(); PageNavigator.init(); CoordBox.init(); towho.init(); cdtd.init(); LoadCapFix.init(); TRAetherCostFix.init(); mmbImageFix.init(); TowerAlerts.init(); TreasureChestClick.init(); KillBox.init(); FairieKiller.init (Options.KillFairie); DeleteReports.init(); CollectGold.init(); FoodAlerts.init(); ItemMultiUseController.init(); RaidManager.init(); ChampLagFix.init(); if (Options.EnhCBtns && Options.WarnAscension) { Tabs.Options.checkAscension(); clearInterval(t.WarnAscensionTimer); t.WarnAscensionTimer = setInterval(function () { Tabs.Options.checkAscension(); }, 60 * 1000); }; t.MiniRefresh(); CheckRemoveAlert(); CheckDisableAds(); if (Options.MoveFurniture) { GM_addStyle(t.trstyles); } t.DeletePointlessItems(); var oldStatusAnim = CM.ThronePanelView.statusAnim; var newStatusAnim = function(result) { if (result == "success" && !Options.DisableGreenTick) { oldStatusAnim(result); } if (result == "failure" && !Options.DisableRedX) { oldStatusAnim(result); } } if (typeof exportFunction == 'function') { exportFunction(newStatusAnim,CM.ThronePanelView, {defineAs:"statusAnim"}); } else { CM.ThronePanelView.statusAnim = newStatusAnim; }; if (uW.g_js_strings) {uW.g_js_strings.commonstr.yourScriptVersionIsOut = uW.g_js_strings.checkoutofdate.reloadconfirm;} if (Options.amain) { if (Options.smain == -1) { setTimeout( function (){uW.citysel_click(ById('citysel_'+Number(Number(Options.lmain)+1)));if (popDash) uW.btChangeDashCity(uW.currentcityid);},1000); } else { setTimeout( function (){uW.citysel_click(ById('citysel_'+Number(Number(Options.smain)+1)));if (popDash) uW.btChangeDashCity(uW.currentcityid);},1000); } } if (Options.FixMightDisplay) { var ai = ByCl('avatarInfo')[0]; var al = ByCl('avatarLevel')[0]; var am = ByCl('avatarMight')[0]; var ag = ByCl('avatarGlory')[0]; if (ai) ai.style.marginLeft = '-10px'; if (al) al.style.display = 'none'; if (am) am.style.paddingLeft = '0px'; if (ag) ag.style.paddingLeft = '0px'; am.innerHTML = ''; ById('btMightPop').addEventListener('click',ShowMightBreakdown); } if (Options.KillSounds) { var killsound = ByCl('sfx_effects')[0]; if (killsound && killsound.classList.contains("on")) {killsound.click();} } if (Options.KillMusic) { var killmusic = ByCl('sfx_music')[0]; if (killmusic && killmusic.classList.contains("on")) {uW.AM_pauseMusic();killmusic.click();} } if (uW.update_march) { // for recalled marches t.updatemarchfunc = new CalterUwFunc ('update_march', [[/var\s*w\s*=\s*cm.IncomingAttackManager.getAllAttacks/i,'var Dar = seed.queue_atkinc\[o\];Dar.marchStatus = D.marchStatus;RecIncT\(Dar\);var w = cm.IncomingAttackManager.getAllAttacks']]); t.updatemarchfunc.setEnable(true); uWExportFunction('RecIncT',Tabs.Options.newIncoming); }; if (Options.ClickForReports) { var btnrep1 = new CalterUwFunc("modal_messages",[['getHtmlElement())','getHtmlElement());Messages.listReports();']]); btnrep1.setEnable(true); var btnrep2 = new CalterUwFunc("modal_alliance",[['modal_alliance_init','function() {allianceReports();modal_alliance_changetab(4);}']]); btnrep2.setEnable(true); } var Market = new CalterUwFunc('modal_marketplace', [[/maxlength..\d./gim, '']]); Market.setEnable(true); // remove max selling amount in the market! var Market2 = new CalterUwFunc('market_resource_maxpossible', [[/g\s*=\s*999000/i, 'g = g']]); Market2.setEnable(true); // remove max buy button limit in the market! var e = document.createElement('div'); document.body.appendChild(e); // NEEDS TO BE VISIBLE FOR ALERT SOUND TO WORK! t.mss = new AudioMan(); if (t.mss) { t.mss.init(e); } // create a container for TR Widget var e = document.createElement('div'); e.id = 'btTRWidget'; ById('mod_maparea').appendChild(e); t.SetTRWidgetDisplay(); if (Options.DraggableWidget) { jQuery("#btTRWidget").draggable({ start: function( event, ui) { jQuery('#btTRWidget').css({"right":"",}); }, stop: function( event, ui ) { Options.presetPosition = jQuery("#btTRWidget").position(); saveOptions(); }, }); if (Options.presetPosition) { jQuery('#btTRWidget').css({"left": Options.presetPosition.left + "px","top": Options.presetPosition.top + "px","right":"",}); } } else { Options.presetPosition = null; saveOptions(); } if (Options.DraggableCoords) { jQuery("#btCoordsBox").draggable({ stop: function( event, ui ) { Options.coordsPosition = jQuery("#btCoordsBox").position(); saveOptions(); }, }); if (Options.coordsPosition) { jQuery('#btCoordsBox').css({"left": Options.coordsPosition.left + "px","top": Options.coordsPosition.top + "px","right":"",}); } } else { Options.coordsPosition = null; saveOptions(); } // Check for new Language Pack Availability... if (LanguageArray.LangVersion) { t.languagestatus = tx('Language pack')+' ('+LanguageArray.CurrLang+') '+tx('Version')+' '+LanguageArray.LangVersion+' '+tx('loaded');} else { if (Options.Language != 'en') { t.languagestatus = tx('Language pack unavailable'); } }; var now = unixTime(); if (Options.LanguageLastChecked + (3600*24*7) < now) { // only check for new lang pack once a week t.LoadLanguage(Options.Language); } if (Options.btEveryToggle) AddSubTabLink('Refresh',t.toggleAutoRefreshState, 'RefreshToggleTab'); SetToggleButtonState('Refresh',Options.btEveryEnable,'Refresh'); if (Options.ChatOptions.GloryLeader) { setTimeout(Tabs.Options.CheckGlory,10000,true); } // force check glory after 10 secs if (Options.RaidRunning) { t.checkResetRaids(); } t.sendDFReport(); // check every refresh OpenDiv["Options"] = Options.OpenSettingsDiv; setTimeout(function() { RefreshEvery.setEnable (Options.btEveryEnable);t.CheckTokenTimerOverride(); },5*1000); // last one - start refresh cycle in 5 seconds }, SetTRWidgetDisplay : function (e) { if (uW.isNewServer()) { return; } var e = ById('btTRWidget'); e.style.position = "absolute"; if (Options.ThroneHUD) { e.style.top = "29px"; e.style.left = ""; e.style.right = "228px"; e.style.width = ""; e.style.zIndex = 100000; } else { e.style.top = ById('mod_maparea').offsetHeight+6+"px"; e.style.left = "4px"; e.style.right = ""; e.style.width = ""; e.style.zIndex = 100000; } Dashboard.PaintTRPresets(); }, DeletePointlessItems : function () { var t = Tabs.Options; if (Options.RemovePointlessItems) { for (var i=0;i0) { uW.ksoItems[iid].count = 0; } } } }, CheckTokenResponse : function () { CheckTokenDay(uW.user_id) if (UserOptions.TokenRequest != '') { if (UserOptions.TokenRequest == 'TOKEN') { UserOptions.LastTokenStatus = UserOptions.TokenResponse; if (UserOptions.LastTokenStatus=='OK') { if (UserOptions.TokenSuccessLink!="") { UserOptions.TokenLink = UserOptions.TokenSuccessLink; } actionLog('Merlin share token collected','TOKENS'); } else { actionLog('Merlin share token collection failed - '+UserOptions.LastTokenStatus,'TOKENS'); } } if (UserOptions.TokenRequest == 'BUILD') { UserOptions.LastBuildStatus = UserOptions.TokenResponse; if (UserOptions.LastBuildStatus=="") { UserOptions.LastBuildStatus = 'UNKNOWN'; } // build may not update if user_id not known if (UserOptions.LastBuildStatus=='OK') { if (UserOptions.TokenSuccessLink!="") { UserOptions.BuildLink = UserOptions.TokenSuccessLink; } actionLog('Help token collected','TOKENS'); } else { actionLog('Help token collection failed - '+UserOptions.LastBuildStatus,'TOKENS'); } } if (UserOptions.TokenRequest == 'CHEST') { UserOptions.LastChestStatus = UserOptions.TokenResponse; if (UserOptions.LastChestStatus=='OK') { actionLog('Treasure chest token collected','TOKENS'); } else { actionLog('Treasure chest token collection failed - '+UserOptions.LastChestStatus,'TOKENS'); } if (UserOptions.LastChestStatus=='OK' || UserOptions.LastChestStatus=='USED') { if (UserOptions.TokenChestUID != 0) { // remove used link from bank for (var c=0;c0 || UserOptions.TreasureChestBank.length>0) { if (!UserOptions.BonusCollected && UserOptions.TreasureChestBankOther.length>0 && UserOptions.TreasureChestBankOther[0].playerId!=uW.tvuid && UserOptions.LastChestStatus == "") { CanCollect = true; } else { var DomArray = UserOptions.ChestDomainList.split(","); for (var d=0; d < DomArray.length; d++) { if (DomArray[d]) { if (!UserOptions.ChestCollected[DomArray[d]] && !UserOptions.BadChestDomains[DomArray[d]]) { CanCollect = true; break; } } } } } } } } if (CanCollect && parseIntNan(UserOptions.OverrideRefresh)!=0) { if (!Options.btEveryEnable) { RefreshEvery.setEnable (true); } RefreshEvery.NextRefresh = unixTime() + (parseIntNan(UserOptions.OverrideRefresh)*60); } }, EverySecond : function () { var t = Tabs.Options; var now = unixTime(); /* check tower FIRST!!! */ t.CheckWatchTower(); /* check if map drawing event required */ DrawLevelIcons(); /* check and send spam */ if (Options.ChatOptions.SpamActive && Options.ChatOptions.LastSpamSent + (Options.ChatOptions.SpamInterval*60) < now) { var spam = String(Options.ChatOptions.SpamText); if (spam.charAt(0) == "\\") { // not sure what this is all about, but we'll leave it in. spam = spam.slice(1); var unicodeString = ''; for (var i=0; i < spam.length; i++) { var theUnicode = spam.charCodeAt(i); theUnicode = '&#' + theUnicode+';'; unicodeString += theUnicode; } spam = String(unicodeString); }; var spamtype = 'global'; if (Options.ChatOptions.SpamType == 'a') { spamtype = 'alliance';} var spamreason = Options.ChatOptions.SpamInterval+' minutes elapsed'; if (Options.ChatOptions.LastSpamSent == 0) { spamreason = 'spam activated' } actionLog ('Sending '+spamtype+' spam ('+spamreason+')','SPAM'); sendChat(String('/' + Options.ChatOptions.SpamType + ' {spam} ' + spam)); Options.ChatOptions.LastSpamSent = now; saveOptions(); }; /* check throne room rotation */ if (Options.DashboardOptions.TRPresetsCycle && Options.DashboardOptions.TRPresetsLastChecked + (Options.DashboardOptions.TRPresetsCycleMins*60) < now) { if (afkdetector.isAFK && !Options.TowerOptions.RecentActivity) { t.RotateThrone(); } Options.DashboardOptions.TRPresetsLastChecked = now; saveOptions(); } t.LoopCounter = t.LoopCounter + 1; /* Check gold collect and food alerts every 15 seconds */ if ((t.LoopCounter % 15) == 1) { if (Options.pbGoldEnable) { CollectGold.tick(); } if (Options.pbFoodAlert) { FoodAlerts.tick(); } if (Options.ChatOptions.GloryLeader) { t.CheckGlory(false); } } if (t.LoopCounter >= 60) { // functions for every minute if (Options.AutoMist) { t.CheckMistStatus(); } if (Options.StalledMarches) { new fixgamelag(); } if (Options.RaidRunning) { t.checkResetRaids(); } // reset the march queue requests, in case the logic has failed if (March.currentrequests >= March.maxrequests) { March.currentrequests = 0; } if (March.getQueueLength() > 0) { setTimeout(March.loop,0); } t.LoopCounter = 0; t.sendDFReport(); } }, CheckMistStatus : function () { var t = Tabs.Options; var now = unixTime(); if (Options.AutoMist && afkdetector.isAFK && parseIntNan(Seed.playerEffects.fogExpire) < now) { if (uW.ksoItems[10021].count>0) { CM.ItemController.usePotionOfMist('10021'); actionLog('Automatically applying Potion of Mist','GENERAL'); } } }, CheckGlory : function (force) { var t = Tabs.Options; var aid = getMyAlliance()[0]; var now = unixTime(); /* check alliance glory leader */ if (aid > 0) { if ((Options.ChatOptions.GloryLeaderLastChecked + (Options.ChatOptions.GloryLeaderInterval*60) < now) || (Options.ChatOptions.GloryLeaderAID!=aid) || force) { actionLog ('Checking alliance glory leader','GENERAL'); Options.ChatOptions.GloryLeaderAID = aid; Options.ChatOptions.GloryLeaderUID = 0; Options.ChatOptions.GloryLeaderLastChecked = now; saveOptions(); Tabs.Alliance.totalmembers = 0; Tabs.Alliance.alliancemembers = []; Tabs.Alliance.error = false; Tabs.Alliance.fetchAllianceMemberList(true,t.SetGloryLeader); } } }, SetGloryLeader : function() { var t = Tabs.Options; var glory = 0; for (var y in Tabs.Alliance.alliancemembers) { if (Tabs.Alliance.alliancemembers[y][6]) { if (Tabs.Alliance.alliancemembers[y][9] > glory) { glory = Tabs.Alliance.alliancemembers[y][9]; Options.ChatOptions.GloryLeaderUID = Tabs.Alliance.alliancemembers[y][6]; Options.ChatOptions.GloryLeaderGlory = glory; } } } saveOptions(); }, checkResetRaids : function() { var t = Tabs.Options; var now = unixTime(); if (now - Options.RaidLastReset > 3600) { // every hour actionLog('Resetting Raid Timers','RAIDS'); Options.RaidLastReset = now; saveOptions(); for (var g=0;g'; m += ''; m += ''; m += ''; m += '
    '+tx("Reset ALL window positions!")+''+uW.g_js_strings.commonstr.domain+':'+getServerId()+''+tx("User Id")+':'+uW.tvuid+''+tx("Reset ALL Settings!")+'
     ('+tx("options marked with * require a refresh")+') 
    '; m += '
     '+tx("GENERAL SETTINGS (ALL DOMAINS)")+'
    '; m += '
    '; m += '
     '+tx("USER SETTINGS")+'
    '; m += '
    '; m += '
     '+tx("PowerBot+ Lite FEATURES")+'
    '; m += '
    '; m += '
     '+tx("GAME FEATURES")+'
    '; m += '
    '; m += '
     '+tx("GAME FIXES")+'
    '; m += '
    '; m += '
     '+tx("WATCHTOWER SETTINGS")+'
    '; m += '
    '; m += '
     '+tx("DASHBOARD SETTINGS")+'
    '; m += '
    '; m += '
     '+tx("CHAT SETTINGS")+'
    '; m += '
    '; m += '
     '+tx("REPORT SETTINGS")+'
    '; m += '
    '; m += '
     '+tx("THRONE ROOM PRESETS")+'
    '; m += '
    '; m += '
     '+tx("TAB MANAGER")+'
    '; m += '
    '; m += '
     '+tx("LANGUAGE OPTIONS")+'
    '; m += '
    '; m += '
     '+tx("EXPORT AND IMPORT")+'
    '; m += '

    '; m += ''; m += ''; m += '
       
    '+tx('Copy from')+':  '+uW.g_js_strings.commonstr.totx+':    '+tx('Force Overwrite')+'
    '; m += '
     
    '; m += '

    '; m += '
    '; m += '
    '+tx('This tool is inspired from tremendous contributions by Barbarbossa69 towards KoC Power Bot'); m += '

    '; t.myDiv.innerHTML = m; ById('btSaveSettings').addEventListener ('click',function() { var Export = {}; Export.GlobalOptions = GlobalOptions; Export.UserOptions = UserOptions; Export.Options = Options; uriContent = 'data:application/octet-stream;content-disposition:attachment;filename=file.txt,' + encodeURIComponent(JSON2.stringify(Export)); t.saveConfig(uriContent,'config_'+getServerId()+'_'+uW.tvuid+'.txt'); },false); ById('btLoadSettings').addEventListener ('click',function() { ById('pbexport_messages').innerHTML = ' ' var fileInput = ById("btLoadSettingsFile"); var files = fileInput.files; if (files.length == 0) { ById('pbexport_messages').innerHTML = ''+tx('Please select a config file')+''; return; } var file = files[0]; var reader = new FileReader(); reader.onload = function (e) { var Import = JSON2.parse(e.target.result); GlobalOptions = Import.GlobalOptions; UserOptions = Import.UserOptions; Options = Import.Options; actionLog('Settings file successfully loaded','OPTIONS'); ReloadKOC(); }; reader.readAsText(file); },false); ById('pbexport_submit').addEventListener ('click',function() { ById('pbexport_messages').innerHTML = ' ' var NewServerID = parseIntNan(ById('pbexport_to').value); var OldServerID = parseIntNan(ById('pbexport_from').value); if(NewServerID == 0 || NewServerID == OldServerID){ ById('pbexport_messages').innerHTML = ''+tx('Invalid destination domain number')+''; return; } if(OldServerID == 0){ ById('pbexport_messages').innerHTML = ''+tx('Invalid source domain number')+''; return; } var s = GM_getValue ('Options_'+NewServerID+'_'+uW.tvuid); if ((s || NewServerID == getServerId()) && !ById('pbexport_overwrite').checked){ ById('pbexport_messages').innerHTML = ''+tx('Destination domain configuration already exists - use "Force Overwrite" indicator to overwrite settings')+''; return; } if (OldServerID != getServerId()) { s = GM_getValue ('Options_'+OldServerID+'_'+uW.tvuid); if (!s) { ById('pbexport_messages').innerHTML = ''+tx('Source domain configuration does not exist')+''; return; } // export/import from s... GM_setValue('Options_'+ NewServerID+'_'+uW.tvuid, s); if (NewServerID == getServerId()) { ResetAll = true; actionLog('PowerBot+ Lite configuration imported from '+OldServerID); Tabs.ActionLog.save(); ReloadKOC(); return; } else { ById('pbexport_messages').innerHTML = tx('PowerBot+ Lite configuration exported from')+' '+OldServerID+' '+tx('to')+' '+NewServerID; return; } } else { // export from Options... GM_setValue ('Options_'+NewServerID+'_'+uW.tvuid, JSON2.stringify(Options)); ById('pbexport_messages').innerHTML = tx('PowerBot+ Lite configuration exported from')+' '+OldServerID+' '+tx('to')+' '+NewServerID; return; } }, false); ById('btResetWindows').addEventListener ('click', function() {t.ResetAllWindows();}, false); ById('btResetAll').addEventListener ('click', function() {t.ResetAll();}, false); ById('btResetSettings').addEventListener ('click', function() {t.ResetSettings();}, false); ById('btGeneralOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btGeneralOption",true,"OpenSettingsDiv")}, false); ById('btUserOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btUserOption",true,"OpenSettingsDiv")}, false); ById('btTowerOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btTowerOption",true,"OpenSettingsDiv")}, false); ById('btDashOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btDashOption",true,"OpenSettingsDiv")}, false); ById('btPBPOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btPBPOption",true,"OpenSettingsDiv")}, false); ById('btGameOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btGameOption",true,"OpenSettingsDiv")}, false); ById('btChatOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btChatOption",true,"OpenSettingsDiv")}, false); ById('btReportOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btReportOption",true,"OpenSettingsDiv")}, false); ById('btFixOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btFixOption",true,"OpenSettingsDiv")}, false); ById('btTRPresetOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btTRPresetOption",true,"OpenSettingsDiv")}, false); ById('btTabManagerLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btTabManager",true,"OpenSettingsDiv")}, false); ById('btLanguageLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btLanguage",true,"OpenSettingsDiv")}, false); ById('btExportLink').addEventListener ('click', function () {ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,"btExport",true,"OpenSettingsDiv")}, false); t.PaintGeneralOptions(); t.PaintUserOptions(); t.PaintTowerOptions(); t.PaintPBPOptions(); t.PaintGameOptions(); t.PaintFixOptions(); t.PaintReportOptions(); t.PaintDashOptions(); t.PaintChatOptions(); t.PaintTRPresetOptions(); t.PaintLanguageOptions(); t.PaintTabManagerOptions(); if (!OpenDiv["Options"]) { OpenDiv["Options"] = ""; } if (OpenDiv["Options"] != "") { var LastOpenDiv = OpenDiv["Options"]; OpenDiv["Options"] = ""; ToggleMainDivDisplay("Options",100,GlobalOptions.btWinSize.x,LastOpenDiv,true); } }, saveConfig : function (uri, filename) { var link = document.createElement('a'); if (typeof link.download === 'string') { document.body.appendChild(link); // Firefox requires the link to be in the body link.download = filename; link.href = uri; link.click(); document.body.removeChild(link); // remove the link when done } else { window.open(uri,filename); } }, PaintGeneralOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; var UpdateLocations = {0:"GreasyFork"}; m += ''; m += ''; m += '
    '+tx("Refresh if KofC not loaded within 1 minute")+' *
    '+tx("Send me away !")+' *
    '+tx("Remember window open state on refresh")+'
     '+tx("Widescreen Style:")+' '+ htmlSelector({normal:'Normal (100%)', wide:'Wide (1520px)', ultra:'Ultra (1900px)'},GlobalOptions.btWideScreenStyle,'id=btWideScreenStyle')+' *
     '+tx("PowerBot+ Lite Window Size:")+' '+ htmlSelector({750:'750 pixels', 1000:'1000 pixels', 1250:'1250 pixels'},GlobalOptions.btWinSize.x,'id=btWinSize')+' *
    '+tx("Use Powerbar")+' *
     '+tx("Power Bar floats above game screen")+'
       '+tx("Add Popup buttons to Power Bar")+' *
    '+tx("Dashboard toggle button on main screen header")+' * '+tx("Dashboard Button next to Overview Button")+' *
    '+tx("Incoming/Outgoing toggle buttons on main screen header")+' * '+tx("March+ toggle button on main screen header")+' *
    '+tx("Battle toggle button on main screen header")+' * 
    '+tx("Put chat on right")+'
     '+tx("Put chat before dashboard")+'
    '+tx("Enable wide map expansion button on the map panel")+'
    '+tx("Use Transparent Windows")+' *
    '+tx("Automatically check for script updates on")+' '+htmlSelector(UpdateLocations,GlobalOptions.UpdateLocation,'id="btUpdateLocation" class="btInput"')+'    '+tx('Check Now')+'
    '+tx("Extended debug mode (Activates additional logging)")+'
    '; ById('btGeneralOption').innerHTML = m; t.togGlobalOpt ('btWatchdog', 'btWatchdog',t.RestartReminder); t.togGlobalOpt ('btNoMoreRy', 'btNoMoreRy',t.RestartReminder); t.changeGlobalOpt ('btWideScreenStyle','btWideScreenStyle',t.RestartReminder); ById('btWinSize').addEventListener ('change', function(){ GlobalOptions.btWinSize.x = parseIntNan(ById('btWinSize').value); if (GlobalOptions.btWinSize.x == 0) GlobalOptions.btWinSize.x = 750; saveGlobalOptions (); t.RestartReminder(); },false); t.togGlobalOpt ('btShowPowerBar', 'btPowerBar',t.RestartReminder); t.togGlobalOpt ('btFloatingPowerBar', 'btFloatingPowerBar'); t.togGlobalOpt ('btPopupPowerBar', 'btPowerBarPopups',t.RestartReminder); t.togGlobalOpt ('btDashboardToggle', 'DashboardToggle',t.RestartReminder); t.togGlobalOpt ('btInOutToggle', 'InOutToggle',t.RestartReminder); t.togGlobalOpt ('btBattleToggle', 'BattleToggle',t.RestartReminder); t.togGlobalOpt ('btMarchPlusToggle', 'MarchPlusToggle',t.RestartReminder); t.togGlobalOpt ('btOverviewDashboardBtn', 'btOverviewDashboardBtn',t.RestartReminder); t.togGlobalOpt ('btChatOnRight', 'btChatOnRight',WideScreen.setChatOnRight); t.togGlobalOpt ('btChatBeforeDash', 'btChatBeforeDash',WideScreen.chgChatBeforeDash); t.togGlobalOpt ('btWideMap', 'btWideMap', WideScreen.useWideMap); t.togGlobalOpt ('btTrackOpen', 'btTrackOpen'); t.togGlobalOpt ('btTransparent', 'btTransparent',t.RestartReminder); // t.togGlobalOpt ('AutoUpdateChk', 'AutoUpdates'); t.togGlobalOpt ('ExtendedDebugChk', 'ExtendedDebugMode',t.RestartReminder); ById('btUpdateCheck').addEventListener ('click', function() {AutoUpdater.call(true,true);}, false); t.changeGlobalOpt ('btUpdateLocation','UpdateLocation'); }, PaintUserOptions : function () { var t = Tabs.Options; for (var l in UserOptions.CustomPublish) { t.PublishLists[l] = UserOptions.CustomPublish[l]; } m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    FBUID: '+uW.user_id+' 
    '+tx("Auto-publish Facebook posts for")+' '+ htmlSelector(t.PublishLists,UserOptions.autoPublishPrivacySetting,'id=selectprivacymode') +'   Refresh User Lists'+tx('Custom List ID')+':  
    '+tx("Auto-cancel Facebook posts")+'
    '+tx("Merlin's Magical Token Options")+' 
    '+tx("Enable automatic domain selection")+'  ('+tx('All Users')+')
     '+tx('Domain to receive tokens')+':'+tx('Collected Today')+':'+UserOptions.TokenCount+'
     '+tx('Substitution domains for Chest links')+':'+tx('Total Owned')+': 
       
       
        
    '+tx("Enable automatic token collection during reload cycle")+'
     '+tx("Override reload interval to")+' '+tx("minutes")+' *
    '+tx("Treasure Chest Options")+' 
    '+tx("Auto-click found Treasure Chests")+'
    '+tx("Store Treasure Chest links internally")+'
     '+tx('Maximum number of your links to store')+':
     '+tx('Your Links')+':      '+tx('links')+'
     '+tx('Other Links')+':    
    '; m += '
     
    '; ById('btUserOption').innerHTML = m; ById('btBankYours').innerHTML = ''+UserOptions.TreasureChestBank.length+''; ById('btBankOthers').innerHTML = ''+UserOptions.TreasureChestBankOther.length+''; ById('btTokenNum').innerHTML = parseIntNan(Seed.items.i599); if (UserOptions.TokenCollected) { ById('btCollectToken').style.display = 'none'; ById('btTokenStatus').innerHTML = ''+tx('Collected')+''; } else { if (UserOptions.LastTokenStatus != "" && UserOptions.LastTokenStatus != "OK") { ById('btTokenStatus').innerHTML = ''+tx(capitalize(UserOptions.LastTokenStatus))+''; } } if (UserOptions.BuildCollected) { ById('btCollectBuild').style.display = 'none'; ById('btBuildStatus').innerHTML = ''+tx('Collected')+''; } else { if (UserOptions.LastBuildStatus != "" && UserOptions.LastBuildStatus != "OK") { ById('btBuildStatus').innerHTML = ''+tx(capitalize(UserOptions.LastBuildStatus))+''; } } var bonus = ""; if (UserOptions.BonusCollected) { bonus = " +1"; } var chestcollected = 0; var DomArray = UserOptions.ChestDomainList.split(","); var chesttotal = DomArray.length; for (var d=0; d < DomArray.length; d++) { if (DomArray[d]) { if (UserOptions.ChestCollected[DomArray[d]]) { chestcollected++; } } } if (chestcollected!=0 || UserOptions.BonusCollected) { if (chestcollected >= chesttotal) { ById('btChestStatus').innerHTML = ''+tx('Collected')+' ('+chestcollected+'/'+chesttotal+')'+bonus+''; ById('btCollectChest').style.display = 'none'; } else { ById('btChestStatus').innerHTML = '('+chestcollected+'/'+chesttotal+')'+bonus+''; } } if (UserOptions.LastChestStatus != "" && UserOptions.LastChestStatus != "OK") { ById('btChestStatus').innerHTML += ' '+tx(capitalize(UserOptions.LastChestStatus))+''; } ById('btPubReq').addEventListener('change', function() { UserOptions.autoPublishGamePopups = ById('btPubReq').checked; if (UserOptions.autoPublishGamePopups) { UserOptions.autoCancelGamePopups = false; ById('btCancelReq').checked = false; } saveUserOptions(uW.user_id); },false); ById('btCancelReq').addEventListener('change', function() { UserOptions.autoCancelGamePopups = ById('btCancelReq').checked; if (UserOptions.autoCancelGamePopups) { UserOptions.autoPublishGamePopups = false; ById('btPubReq').checked = false; } saveUserOptions(uW.user_id); },false); ById('RefreshPublishList').addEventListener ('click',function(){t.AddUserLists()},false); t.changeUserOpt ('btCustomList','CustomListId'); t.changeUserOpt ('selectprivacymode','autoPublishPrivacySetting',t.ToggleCustomList); t.ToggleCustomList(); ById ('pbFBListHelp').addEventListener ('click', t.helpPop, false); t.togGlobalOpt('btTokenEnabled','TokenEnabled'); // GLOBAL!!!! t.changeUserOpt ('btTokenDomain','TokenDomain'); t.togUserOpt('btTokenAuto','TokenAuto'); ById('btOverrideRefresh').addEventListener('change', function() { if (parseIntNan(ById('btOverrideRefresh').value)==0) { ById('btOverrideRefresh').value = ""; } UserOptions.OverrideRefresh = ById('btOverrideRefresh').value; saveUserOptions(uW.user_id); t.RestartReminder(); },false); ById('btChestDomainList').addEventListener ('change', t.DomainListChange, false); ById('btChestDomainList').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.DomainListChange); }, false); ById('btTokenLink').addEventListener ('change', t.TokenLinkChange, false); ById('btTokenLink').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.TokenLinkChange); }, false); ById('btBuildLink').addEventListener ('change', t.BuildLinkChange, false); ById('btBuildLink').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.BuildLinkChange); }, false); ById('btCollectToken').addEventListener('click', function () { if (UserOptions.TokenLink != "" && UserOptions.TokenLink.search(/merlinshare/i) != -1) { if (GlobalOptions.TokenEnabled){ UserOptions.TokenRequest = 'TOKEN'; saveUserOptions(uW.user_id); } var goto = UserOptions.TokenLink; setTimeout (function (){window.top.location = goto;}, 0); } }, false); ById('btCollectBuild').addEventListener('click', function () { if (UserOptions.BuildLink != "" && UserOptions.BuildLink.search(/accepttoken/i) != -1) { if (GlobalOptions.TokenEnabled){ UserOptions.TokenRequest = 'BUILD'; saveUserOptions(uW.user_id); } var goto = UserOptions.BuildLink; setTimeout (function (){window.top.location = goto;}, 0); } }, false); ById('btCollectChest').addEventListener('click', function () { if (ById('btChestLink').value != "") { if (GlobalOptions.TokenEnabled){ UserOptions.TokenRequest = 'CHEST'; saveUserOptions(uW.user_id); } var goto = ById('btChestLink').value; // replace domain in link... var DomArray = UserOptions.ChestDomainList.split(","); for (var d=0; d < DomArray.length; d++) { if (DomArray[d]) { if (!UserOptions.ChestCollected[DomArray[d]]) { repstring = "=s%3A"+DomArray[d]; goto = goto.replace(/=s%3A\d\d\d/g,repstring); goto = goto.replace(/&s=\d\d\d/g,repstring); break; } } } setTimeout (function (){window.top.location = goto;}, 0); } }, false); if (trusted) jQuery('#btStoreChestSpan').removeClass("divHide"); ById('btStoreChest').addEventListener('click', t.StoreChest, false); t.togUserOpt ('btTreasureChest', 'TreasureChest', TreasureChestClick.setEnable, TreasureChestClick.isAvailable); t.togUserOpt ('btChestBank', 'BankTreasureChests'); ById('btMaxChestBank').addEventListener('change', function() { UserOptions.MaxBankedTreasureChests = parseIntNan(ById('btMaxChestBank').value); ById('btMaxChestBank').value = UserOptions.MaxBankedTreasureChests; saveUserOptions(uW.user_id); },false); ById('btUseYourChests').addEventListener ('click',function() { t.CreateLink(true,false); },false); ById('btUseOtherChests').addEventListener ('click',function() { t.CreateLink(false,false); },false); ById('btPostYourChests').addEventListener ('click',function() { var chest = UserOptions.TreasureChestBank.shift(); var reparr = new Array(); reparr.push(["REPLACE_TiLeNaMe", chest.tileName]); reparr.push(["REPLACE_fEeDiD", chest.feedId]); reparr.push(["REPLACE_tOkEnId", chest.tokenId]); uW.common_postToProfile("118", reparr); saveUserOptions(uW.user_id); ById('btuser_messages').innerHTML = tx('Treasure Chest posted to Facebook'); ById('btBankYours').innerHTML = ''+UserOptions.TreasureChestBank.length+''; },false); ById('btClearYourChests').addEventListener ('click',function() { UserOptions.TreasureChestBank = []; saveUserOptions(uW.user_id); ById('btuser_messages').innerHTML = tx('Your Treasure Chest links cleared'); ById('btBankYours').innerHTML = ''+UserOptions.TreasureChestBank.length+''; },false); ById('btClearOtherChests').addEventListener ('click',function() { UserOptions.TreasureChestBankOther = []; saveUserOptions(uW.user_id); ById('btuser_messages').innerHTML = tx('Other Treasure Chest links cleared'); ById('btBankOthers').innerHTML = ''+UserOptions.TreasureChestBankOther.length+''; },false); ById('btExportChests').addEventListener ('click',function() { var numchests = parseIntNan(ById('btExportChestsNumber').value); if (numchests<=0) { ById('btuser_messages').innerHTML = ''+tx('Please enter number of links to export')+''; return; } if (numchests>UserOptions.TreasureChestBank.length) { ById('btuser_messages').innerHTML = ''+tx('Insufficient chests')+'!'; return; } var Export = {}; Export.data = []; for (var i=0;i'; uriContent = 'data:application/octet-stream;content-disposition:attachment;filename=file.txt,' + encodeURIComponent(JSON2.stringify(Export)); t.saveConfig(uriContent,'Chests_'+uW.tvuid+'_'+yyyymmdd(new Date())+'.txt'); },false); ById('btImportChests').addEventListener ('click',function() { ById('btuser_messages').innerHTML = ' ' var fileInput = ById("btImportChestsFile"); var files = fileInput.files; if (files.length == 0) { ById('btuser_messages').innerHTML = ''+tx('Please select a link file')+''; return; } var file = files[0]; var reader = new FileReader(); reader.onload = Tabs.Options.ChestReader; reader.readAsText(file); },false); }, StoreChest : function () { var t = Tabs.Options; if (ById('btChestLink').value != "") { var post_link = ById('btChestLink').value; if (post_link.indexOf("convert.php?pl=1&ty=3&si=118&")!=-1) { var c_tokenId = post_link.slice(post_link.indexOf('%7Cm%3A') + 7, post_link.indexOf('%7Cimg')); var c_serverId = post_link.slice(post_link.indexOf('&ex=s%3A') + 8, post_link.indexOf('%7Cf%3A')); var c_playerId = post_link.slice(post_link.indexOf('&in=') + 4, post_link.indexOf('&ex=s')); var c_feedId = post_link.slice(post_link.indexOf('%7Cf%3A') + 7, post_link.indexOf('%7Cm%3A')); if (c_tokenId && c_feedId && c_playerId && c_serverId) { if (c_playerId!=uW.tvuid) { if (!t.checkFeedId(c_feedId)) { UserOptions.TreasureChestBankOther.push({tokenId:c_tokenId, feedId:c_feedId, serverId:c_serverId, playerId:c_playerId, tileName:"", unixTime_taken:unixTime(), link:post_link}); ById('btChestLink').value = ""; ById('btuser_messages').innerHTML = tx('Link successfully loaded to Other Links'); ById('btBankOthers').innerHTML = ''+UserOptions.TreasureChestBank.length+''; } else { ById('btuser_messages').innerHTML = tx('Link already stored'); } } else { if (!t.checkYourFeedId(c_feedId)) { UserOptions.TreasureChestBank.push({tokenId:c_tokenId, feedId:c_feedId, serverId:c_serverId, playerId:c_playerId, tileName:"", unixTime_taken:unixTime(), link:post_link}); ById('btChestLink').value = ""; ById('btuser_messages').innerHTML = tx('Link successfully loaded to Your Links'); ById('btBankYours').innerHTML = ''+UserOptions.TreasureChestBank.length+''; } else { ById('btuser_messages').innerHTML = tx('Link already stored'); } } saveUserOptions(uW.user_id); } else { ById('btuser_messages').innerHTML = tx('Invalid Treasure Chest link'); } } else { ById('btuser_messages').innerHTML = tx('Invalid Treasure Chest link'); } } }, ChestReader : function (e) { var t = Tabs.Options; var Import = JSON2.parse(e.target.result); var counter = 0; if (Import.data) { for (var link in Import.data) { if (Import.data[link].tokenId && Import.data[link].feedId && Import.data[link].playerId && Import.data[link].serverId) { if (Import.data[link].playerId==uW.tvuid) { if (!t.checkYourFeedId(Import.data[link].feedId)) { counter++; UserOptions.TreasureChestBank.push(Import.data[link]); } } else { if (!t.checkFeedId(Import.data[link].feedId)) { counter++; UserOptions.TreasureChestBankOther.push(Import.data[link]); } } } else { if (Import.data[link].link) { var post_link = Import.data[link].link; if (post_link.indexOf("convert.php?pl=1&ty=3&si=118&")!=-1) { var c_tokenId = post_link.slice(post_link.indexOf('%7Cm%3A') + 7, post_link.indexOf('%7Cimg')); var c_serverId = post_link.slice(post_link.indexOf('&ex=s%3A') + 8, post_link.indexOf('%7Cf%3A')); var c_playerId = post_link.slice(post_link.indexOf('&in=') + 4, post_link.indexOf('&ex=s')); var c_feedId = post_link.slice(post_link.indexOf('%7Cf%3A') + 7, post_link.indexOf('%7Cm%3A')); if (c_tokenId && c_feedId && c_playerId && c_serverId) { if (c_playerId==uW.tvuid) { if (!t.checkYourFeedId(c_feedId)) { counter++; UserOptions.TreasureChestBank.push({tokenId:c_tokenId, feedId:c_feedId, serverId:c_serverId, playerId:c_playerId, tileName:"", unixTime_taken:unixTime(), link:post_link}); } } else { if (!t.checkFeedId(c_feedId)) { counter++; UserOptions.TreasureChestBankOther.push({tokenId:c_tokenId, feedId:c_feedId, serverId:c_serverId, playerId:c_playerId, tileName:"", unixTime_taken:unixTime(), link:post_link}); } } } } } } } ById('btuser_messages').innerHTML = counter+' '+tx('Chest links successfully loaded'); ById('btBankYours').innerHTML = ''+UserOptions.TreasureChestBank.length+''; ById('btBankOthers').innerHTML = ''+UserOptions.TreasureChestBankOther.length+''; saveUserOptions(uW.user_id); } else { ById('btuser_messages').innerHTML = ''+tx('Invalid link file')+''; } }, checkFeedId : function (FeedId) { var t = Tabs.Options; for (var c=0;c'; helpText += '

    '+tx('Unfortunately the custom lists can no longer be searched for, but you can still publish to just that list if you know the List ID')+'.

    '; helpText += '

    '+tx('If you click on the list, the web address of the list will be displayed in the title bar of the browser. It is in the format')+'

    www.facebook.com/lists/{LISTID}

    '+tx('Copy the {LISTID} number and paste it into the Custom List ID box')+'.


    '; var pop = new CPopup ('BotHelp', 0, 0, 460, 280, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Facebook Lists")+'
    '; pop.show (true); }, helpimgPop : function (){ var t = Tabs.Options; var helpText = '
    '+tx("Previewing Images in Chat"); helpText += '

    '+tx('Paste the direct link to the image, NOT the image hosting page!')+'.

    '; helpText += '

    '+tx('Supported image hosting services are as follows')+':-

    '; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += '
    '+tx('Image Host')+''+tx('Image Link Example')+'
    imgur.comi.imgur.com/XXXX.jpg
    tinypic.comi99.tinypic.com/XXXX.jpg
    postimage.orgs99.postimg.org/YYYY/XXXX.jpg
    giphy.comi.giphy.com/XXXX.gif

    '; var pop = new CPopup ('BotHelp', 0, 0, 460, 280, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Image Previews")+'
    '; pop.show (true); }, helpstylePop : function (){ var t = Tabs.Options; var helpText = '
    '+tx("Using Text Styles in Chat"); helpText += '

    '+tx('Use the following control codes to change the style of your text in chat')+'.

    '; helpText += '

    '+tx('Note that multiple styles can be embedded, but must all be closed off separately')+'.

    '; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += '
    '+tx('Control Code')+''+tx('Style')+'
    [#0]'+tx('Black')+'
    [#1]'+tx('Red')+'
    [#2]'+tx('Green')+'
    [#3]'+tx('Blue')+'
    [#4]'+tx('Magenta')+'
    [#5]'+tx('Cyan')+'
    [#6]'+tx('Yellow')+'
    [#7]'+tx('White')+'
    [#8]'+tx('Bold')+'
    [#9]'+tx('Italic')+'
    [#]'+tx('End Previous Style')+'

    '; var pop = new CPopup ('BotHelp', 0, 0, 460, 380, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Chat Styles")+'
    '; pop.show (true); }, ToggleCustomList : function () { var t = Tabs.Options; var pub = UserOptions.autoPublishPrivacySetting; if (pub==99) { jQuery('#btCustomListSpan').removeClass("divHide"); } else { jQuery('#btCustomListSpan').addClass("divHide"); } }, changeRefreshOption: function(tf) { var t = Tabs.Options; RefreshEvery.setEnable (tf); SetToggleButtonState('Refresh',Options.btEveryEnable,'Refresh'); }, toggleAutoRefreshState: function(){ var t = Tabs.Options; var obj = ById('btEveryEnable'); Options.btEveryEnable = !Options.btEveryEnable; if (obj) obj.checked = Options.btEveryEnable; RefreshEvery.setEnable (Options.btEveryEnable); saveOptions(); SetToggleButtonState('Refresh',Options.btEveryEnable,'Refresh'); }, toggleAutoRaidState: function(){ var t = Tabs.Options; var obj = ById('togResetRaids'); Options.RaidRunning = !Options.RaidRunning; saveOptions(); if (obj) obj.checked = Options.RaidRunning; t.ToggleRaidActive(); }, PaintTowerOptions : function () { var t = Tabs.Options; m = '
    '; m += ''; m += '
    '+tx("Minimum number of Troops to trigger Tower Alert")+':  ('+tx("Controls All Tower Options")+')
     
    '; for (var cityId in Cities.byID) { var wlevel = getUniqueCityBuilding(cityId,14).maxLevel; if (wlevel!=0) {wleveltext = 'Level '+wlevel; } else {wleveltext = 'None!';} m+= ''; }; ChampionObj = {0:'-- '+tx('Select Champion')+' --'}; for (var y in Seed.champion.champions) { var chkchamp = Seed.champion.champions[y]; if (chkchamp.championId) { ChampionObj[chkchamp.championId] = chkchamp.name; } } m += '
     '+uW.g_js_strings.commonstr.city+''+tx("Active")+' '+tx("WatchTower")+' '+tx("Chat Alert Message")+'
    '+Cities.byID[cityId].name+''+wleveltext+'

    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Alert when being scouted")+'   '; m += ' '+tx("Alert on wilderness attack")+'  
    '+tx("Post incoming attacks to Alliance Chat")+'
      '+tx("Whisper to yourself instead, if less than")+'  '+tx("incoming troops")+'
     '+tx("Chat Message Prefix")+': 
      '+tx("Display your AFK status")+'
      '+tx("Display your city champion name")+'
      '+tx("Display your city defend status")+'
      '+tx("Display your research information")+'
      '+tx("Display your city food remaining")+'
      '+tx("Display defender throne monitor link")+'
    '+tx("Sound Options")+':
    '+tx("Play sound on incoming attack/scout")+'
     
    '; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Attack sound")+':  
    '+tx("Scout sound")+':  
    '+tx("Volume")+': 
    0
     Play for '+tx("seconds")+' '+tx("Repeat every")+'  '+tx("minutes")+'
    '+tx("Automatic Event Options")+':
    '+tx("Only do the selected actions when AFK (Untick to always do the selected actions)")+'
    '+tx("Revert selected actions back after")+'  '+tx("minutes after the last attack lands")+' 
    '+tx("Automatic Events")+':
    '+tx("Change Throne Room to Preset")+' 
    '+tx("Switch to Wood Guardian in city being attacked")+'
    '+tx("Assign Champion")+' '+htmlSelector(ChampionObj,Options.TowerOptions.ChampId,"id=pbChampionId")+' '+tx("when attacking march is")+'  '+tx("seconds away")+'
      '+tx("Only when city does not already have a champion")+'
    '+tx("Suspend Barbarian Raids in city being attacked")+'
    '+tx("Suspend ALL automatic marches in city being attacked")+'

    '; ById('btTowerOption').innerHTML = m; for (var cityId in Cities.byID){ ById ('toweractive_'+ cityId).addEventListener('click',function(e){Options.TowerOptions.towercityactive[e.target.name] = e.target.checked;saveOptions();},false); ById ('towertext_'+ cityId).addEventListener('change',function(e){Options.TowerOptions.towercitytext[e.target.name] = e.target.value;saveOptions();},false); } t.volSlider = new SliderBar (ById('pbVolSlider'), 200, 21, 0); t.volSlider.setValue (Options.TowerOptions.alertSound.volume/100); t.volSlider.setChangeListener(t.e_volChanged); t.e_volChanged(Options.TowerOptions.alertSound.volume/100); t.loadUrl (Options.TowerOptions.alertSound.soundUrl); // preload URL ById('pbPlayNow').addEventListener ('click', function (){t.playSound(Options.TowerOptions.alertSound.soundUrl,false,'pbSoundStop')}, false); ById('pbSoundStop').addEventListener ('click', t.stopSoundAlerts, false); ById('pbSoundStop').disabled = true; ById('pbScoutPlayNow').addEventListener ('click', function (){t.playSound(Options.TowerOptions.alertSound.scoutUrl,false,'pbScoutStop')}, false); ById('pbScoutStop').addEventListener ('click', t.stopSoundAlerts, false); ById('pbScoutStop').disabled = true; ById('pbSoundRepeat').addEventListener ('change', function (e){Options.TowerOptions.alertSound.repeat = e.target.checked;saveOptions();}, false); ById('pbSoundEvery').addEventListener ('change', function (e){Options.TowerOptions.alertSound.repeatDelay = e.target.value;saveOptions();}, false); ById('pbSoundLength').addEventListener ('change', function (e){Options.TowerOptions.alertSound.playLength = e.target.value;saveOptions();}, false); ById('pbSoundEnable').addEventListener ('change', function (e){Options.TowerOptions.alertSound.enabled = e.target.checked;saveOptions();}, false); ToggleOption('TowerOptions','pbalertEnable','aChat'); ToggleOption('TowerOptions','pbalertScout','scouting'); ToggleOption('TowerOptions','pbalertWild','wilds'); ToggleOption('TowerOptions','pbalertChamp','champ'); ToggleOption('TowerOptions','pbalertAFK','afk'); ToggleOption('TowerOptions','pbalertDefend','defend'); ToggleOption('TowerOptions','pbalertTech','tech'); ToggleOption('TowerOptions','pbalertUpkeep','upkeep'); ToggleOption('TowerOptions','pbalertWhisper','whisper'); ToggleOption('TowerOptions','pbAFKEvents','AFKEvents'); ToggleOption('TowerOptions','pbRevert','Revert'); ToggleOption('TowerOptions','pbChangeTR','ChangeTR'); ToggleOption('TowerOptions','pbChangeChampion','ChangeChamp'); ToggleOption('TowerOptions','pbChampNoChamp','ChampNoChamp'); ToggleOption('TowerOptions','pbChangeGuardian','ChangeGuardian'); ToggleOption('TowerOptions','pbStopRaids','StopRaids'); ToggleOption('TowerOptions','pbStopMarches','StopMarches'); ToggleOption('TowerOptions','pbalertDefendMonitor','DefendMonitor'); ChangeOption('TowerOptions','pbalertPrefix','aPrefix'); ChangeOption('TowerOptions','pbalertTroops','minTroops'); ChangeOption('TowerOptions','pbwhisperTroops','whisperTroops'); ChangeOption('TowerOptions','pbRevertMinutes','RevertMinutes'); ChangeOption('TowerOptions','pbChangeTRPreset','ChangeTRPreset'); ChangeIntegerOption('TowerOptions','pbChampTime','ChampTime',10); ChangeOption('TowerOptions','pbChampionId','ChampId'); ById('pbResetTower').addEventListener ('click', t.resetCityStates, false); ById('pbsoundFile').addEventListener ('change', function (){ Options.TowerOptions.alertSound.soundUrl = ById('pbsoundFile').value; saveOptions(); t.loadUrl (Options.TowerOptions.alertSound.soundUrl); }, false); ById('pbSoundDefault').addEventListener ('click', function (){ Options.TowerOptions.alertSound.soundUrl = DEFAULT_ALERT_SOUND_URL; saveOptions(); ById('pbsoundFile').value = DEFAULT_ALERT_SOUND_URL; t.loadUrl (DEFAULT_ALERT_SOUND_URL); }, false); ById('pbscoutFile').addEventListener ('change', function (){ Options.TowerOptions.alertSound.scoutUrl = ById('pbscoutFile').value; saveOptions(); t.loadUrl (Options.TowerOptions.alertSound.scoutUrl); }, false); ById('pbScoutDefault').addEventListener ('click', function (){ Options.TowerOptions.alertSound.scoutUrl = DEFAULT_SCOUT_SOUND_URL; saveOptions(); ById('pbscoutFile').value = DEFAULT_SCOUT_SOUND_URL; t.loadUrl (DEFAULT_SCOUT_SOUND_URL); }, false); }, resetCityStates : function () { var t = Tabs.Options; Options.TowerOptions.RecentActivity = false; Options.TowerOptions.LastAttack = 0; Options.TowerOptions.HandledMarches = new Array(); Options.TowerOptions.LatestAttackTimes = {}; Options.TowerOptions.RecentCityActivity = {}; Options.TowerOptions.SaveCityState = {}; Options.TowerOptions.SaveTR = 0; Options.TowerOptions.ChampOriginalCity = 0; saveOptions(); }, loadUrl : function (url) { var t = Tabs.Options; if (t.mss) { t.mss.setSource(url); } }, PaintFixOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+tx("Refresh Data/Marches every"); m += ' '+tx("minutes")+'
    '+tx("Hide pointless items from Inventory views")+' *
    '+tx("Fix delay when opening Castle, Rally Point and Boss Battle")+'
    '+tx("Fix tower alert to show exact target (city or wild)")+'
    '+tx("Do not automatically select a knight when changing march type to Scout, Transport or Reassign")+'
    '+tx("Don't filter troop types for transport")+'
    '+tx("Fix stalled marches and missing knights")+'
    '+tx("Keep map coordinate box/bookmarks on top of troop activity")+'
    '+tx("Add reassign button when clicked on own city")+'
    '+tx("Fix reassign button on maptile info")+'
    '+tx("Include player name / city name in new bookmarks")+'
    '+tx("Limit load capacity to not exceed throne room load cap")+'
    '+tx("Fix display of aetherstones for throne room upgrade/enhance")+'
    '+tx("Post correct image to facebook for Merlin Box")+'
    '+tx("Always show local time on chat posts")+'
    '+tx("Rearrange throne room furniture for better visibility")+' *
    '+tx("Fix might display on main screen")+' *
    '+tx("Kill music on startup")+'
    '+tx("Kill sound effects on startup")+'
    '+tx('Disable "Red X" failure animation')+'
    '+tx('Disable "Green Tick" success animation')+'
    '; ById('btFixOption').innerHTML = m; ById('ptEnableMiniRefresh').addEventListener('change', t.MiniRefreshChanged, false); ChangeIntegerOption('','ptMiniRefreshInterval','MiniRefreshInterval',3,t.MiniRefresh); ToggleOption('','togTowerFix', 'fixTower', TowerAlerts.enableFixTarget, TowerAlerts.isFixTargetAvailable); ToggleOption('','togKnightSelect', 'fixKnightSelect', AttackDialog.setEnable, AttackDialog.isAvailable); ToggleOption('','togFilterTroopsFix', 'DontFilterTransportTroops', AttackDialog.setEnable, AttackDialog.isAvailable); ToggleOption('','togStalledMarches', 'StalledMarches'); ToggleOption('','togCoordBox', 'mapCoordsTop', CoordBox.setEnable, CoordBox.isAvailable); ToggleOption('','togMapInfo2', 'mapInfo2', mapinfoFix.setEnable2, mapinfoFix.isAvailable2); ToggleOption('','togMapInfo', 'mapInfo', mapinfoFix.setEnable, mapinfoFix.isAvailable); ToggleOption('','togMapInfo3', 'mapInfo3', mapinfoFix.setEnable3, mapinfoFix.isAvailable3); ToggleOption('','togLoadCapFix', 'fixLoadCap', LoadCapFix.setEnable, LoadCapFix.isAvailable); ToggleOption('','togTRAetherCostFix', 'fixTRAetherCost', TRAetherCostFix.setEnable, TRAetherCostFix.isAvailable); ToggleOption('','togMMBImageFix', 'fixMMBImage', mmbImageFix.setEnable, mmbImageFix.isAvailable); ToggleOption('','togChatTimeFix', 'fixChatTime', ChatTimeFix.setEnable, ChatTimeFix.isAvailable); ToggleOption('','togChampLagFix', 'FixCastleLag', ChampLagFix.setEnable, ChampLagFix.isAvailable); ToggleOption('','togRemovePointless', 'RemovePointlessItems',t.RestartReminder); ToggleOption('','togMoveFurniture', 'MoveFurniture',t.RestartReminder); ToggleOption('','togFixMightDisplay', 'FixMightDisplay',t.RestartReminder); ToggleOption('','ptkillmusic', 'KillMusic'); ToggleOption('','ptkillsounds', 'KillSounds'); ToggleOption('','ptdisableredx', 'DisableRedX'); ToggleOption('','ptdisablegreentick', 'DisableGreenTick'); }, PaintReportOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Alliance Report Scanner")+':
    '+tx("Enable scanning of Alliance Reports")+'
     '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Scan interval")+': '+tx("seconds")+'
    '+tx("Scan incoming attack reports")+'
     '+tx("Min troops")+':
     '+tx("Ignore incoming wild attacks")+'
     '+tx("Ignore incoming scouts")+'
     '+tx("Whisper incoming attack reports to yourself and the following players (separated by commas)")+'
      
     '+tx("Do not post reports already posted by another alliance member")+'    (WORK IN PROGRESS)
    '+tx("Whisper your own outgoing attack reports to yourself")+'
    '+tx('Automatic Report Deletion')+':
    '+tx("Delete barbarian camp reports/Transport reports from you")+'
    '+tx("Delete transport reports to you")+'
    '+tx("Delete wilderness reports")+'
    '+tx("Delete auto-attack reports (and log items for attack summary)")+'
    '+tx("Delete dark forest reports (and log items for DF summary)")+'
      '+tx("Send DF report every")+'  '+tx('hours')+'   '+strButton8(tx('Send Now'), 'id=pbdfreportsend')+'
    '+tx("Delete ALL incoming scout reports")+'
    '+tx("Delete incoming attack/scout reports from friendly alliances")+'
    '+tx("Delete incoming")+' '+htmlSelector({0:tx("attack/scout"),4:tx("attack"),3:tx("scout")},Options.ReportOptions.DeleteRptidType,"id=pbdeleteidtype class=btInput")+' '+tx("reports from the following UIDs (separated by commas)")+'
     
    '; ById('btReportOption').innerHTML = m; ToggleOption('ReportOptions','togEnhanceAR', 'EnhanceAR', AllianceReportsCheck.enable); ToggleOption('ReportOptions','ptincomingar', 'PostIncoming'); ToggleOption('ReportOptions','ptwhisperoutgoing', 'WhisperOutgoing'); ToggleOption('ReportOptions','ptalertignorescouts', 'IgnoreScouts'); ToggleOption('ReportOptions','ptalertignorewilds', 'IgnoreWilds'); ToggleOption('ReportOptions','ptwhisperar', 'WhisperAR'); ToggleOption('ReportOptions','pbdeletebctoggle', 'DeleteRptbc'); ToggleOption('ReportOptions','pbdeletetrtoggle', 'DeleteRpttr'); ToggleOption('ReportOptions','pbdeletewltoggle', 'DeleteRptwl'); ToggleOption('ReportOptions','pbdeleteaatoggle', 'DeleteRptaa'); ToggleOption('ReportOptions','pbdeletefrtoggle', 'DeleteRptfr'); ToggleOption('ReportOptions','pbdeleteidtoggle', 'DeleteRptid'); ToggleOption('ReportOptions','pbdeletedftoggle', 'DeleteRptdf'); ToggleOption('ReportOptions','pbdeletesctoggle', 'DeleteRptsc'); ChangeOption('ReportOptions','ptalertinterval', 'alertinterval'); ChangeOption('ReportOptions','ptalertmtroops', 'alertmtroops'); ChangeOption('ReportOptions','ptwhisperarlist', 'WhisperARList'); ChangeOption('ReportOptions','pbdeleteuidreps', 'DeleteRptUID'); ChangeOption('ReportOptions','pbdeleteidtype', 'DeleteRptidType'); ChangeOption('ReportOptions','ptnoduplicatereports', 'NoDuplicateReports'); ById('pbdfreportinterval').addEventListener('keyup', function () { if (isNaN(ById('pbdfreportinterval').value) || ById('pbdfreportinterval').value<1) { ById('pbdfreportinterval').value = 1; } Options.DFReportInterval = ById('pbdfreportinterval').value; saveOptions(); t.sendDFReport(); }, false); ById('pbdfreportsend').addEventListener('click', function () { Options.LastDFReport = 0; saveOptions(); t.sendDFReport(true); }, false); ToggleOption('','pbdfreport','DFReport',t.sendDFReport); }, PaintDashOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; if (SelectiveDefending) { m += ''; m += ''; m += ''; m += ''; } m += ''; m += '
    '+tx("Show Dashboard")+'
    '+tx("Floating Dashboard")+'
     '+tx("Dashboard Width:")+' '+ htmlSelector({480:'480 pixels', 540:'540 pixels', 600:'600 pixels'},Options.DashboardOptions.DashWidth,'id=btDashWidth')+' *
    '+tx("Overview defend button")+''+tx("Troops defend button")+'
    '+tx("Show throne room preset changer")+'
    '+tx("Select presets by name")+'
    '+tx("Graphical champion selector")+'
    '+tx("Show quick sacrifice icons")+'
    '+tx("Default sacrifice duration")+' '+uW.g_js_strings.timestr.timemin+' '; m +=' '+uW.g_js_strings.timestr.timesec+'
     '+tx("Maximum troops to sacrifice")+' '+tx("troops")+'
    '+tx("Show Assign Defenders section above Troop Display")+'
    '+tx("Show defence add troops")+'
     '+tx("Default add defence amount")+' '+tx("troops")+'
    '+tx("Show defensive presets")+'
     '; m += ''; for (var p in Dashboard.DefaultDashboard) { var NewObj = {}; if (Options.DashboardOptions.OverrideDashboard[p]) { NewObj.Display = Options.DashboardOptions.OverrideDashboard[p].Display; NewObj.Sequence = Options.DashboardOptions.OverrideDashboard[p].Sequence; } else { NewObj.Display = Dashboard.DefaultDashboard[p].Display; NewObj.Sequence = Dashboard.DefaultDashboard[p].Sequence; } NewObj["name"] = p; m += ''; m +=''; m += ''; m += ''; m += ''; } m += '
    '+tx("Show")+''+tx("Section")+''+tx("Sequence")+''+tx("Reset")+'
    '+tx(NewObj["name"])+' 
    '; ById('btDashOption').innerHTML = m; ById('btResetDash').addEventListener ('click', function() {t.ResetDash();}, false); ToggleOption('','btShowDashboard', 'btDashboard',WideScreen.setDashboard); // options, not dash options... ToggleOption('', 'btFloatingDashboard', 'btFloatingDashboard',WideScreen.RestartDashboard); ById('btDashWidth').addEventListener ('change', function(){ Options.DashboardOptions.DashWidth = parseIntNan(ById('btDashWidth').value); if (Options.DashboardOptions.DashWidth == 0) Options.DashboardOptions.DashWidth = 480; saveOptions (); t.RestartReminder(); },false); ToggleOption('DashboardOptions','UpperDefChk', 'UpperDefendButton'); ToggleOption('DashboardOptions','LowerDefChk', 'LowerDefendButton'); ToggleOption('DashboardOptions','PresetChk', 'TRPresetChange', t.PresetToggle); t.PresetToggle(); if (SelectiveDefending) { ToggleOption('DashboardOptions','DefSetFirst', 'SetDefendersFirst', WideScreen.RestartDashboard); ToggleOption('DashboardOptions','DefAddTroopChk', 'DefAddTroopShow', t.DefToggle); t.DefToggle (); ToggleOption('DashboardOptions','DefPresetChk', 'DefPresetShow'); ChangeIntegerOption('DashboardOptions','btDefaultDefenceNum','DefaultDefenceNum'); } ToggleOption('DashboardOptions','QuickSacChk', 'QuickSacrifice',Dashboard.PaintQuickSac); ToggleOption('DashboardOptions','DefaultSacChk', 'DefaultSacrifice', t.SacToggle); t.SacToggle(); ToggleOption('DashboardOptions','TRPresetByNameChk', 'TRPresetByName'); ToggleOption('DashboardOptions','GraphChampChk', 'GraphicalChampDisplay'); ChangeIntegerOption('DashboardOptions','btSacrificeLimit','SacrificeLimit'); }, PaintTRPresetOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += '
     '; m += ''; for (var i=1;i<=Seed.throne.slotNum;i++) { m += ''; m +=''; m += ''; m += ''; m += ''; } m += ''; if (uW.tcoPresetNames) { m += ''; } m += ''; m += '
    '+tx('Num')+''+uW.g_js_strings.commonstr.nametx+''+uW.g_js_strings.commonstr.select+'
    '+i+'
    '+tx('Cycle through selected presets when AFK, every')+' '+' '+tx('minutes')+''+tx('Copy Preset Names from Throne/Champ')+'
    '; ById('btTRPresetOption').innerHTML = m; ToggleOption('DashboardOptions','btpresetCycle', 'TRPresetsCycle'); ChangeIntegerOption('DashboardOptions','btpresetCycleMins','TRPresetsCycleMins',1); if (ById('btCopyTCOPresets')) { ById('btCopyTCOPresets').addEventListener('click',function () { for (var i=1;i<=Seed.throne.slotNum;i++) { var PresetName = uW.tcoPresetNames[i]; if (PresetName && PresetName != "" && PresetName != "undefined") { ById('btpresetLabel'+i).value = uW.tcoPresetNames[i].substring(0, 15); Dashboard.UpdatePresetLabel(ById('btpresetLabel'+i),i); } } saveOptions(); },false); } Dashboard.PaintTRPresets(); }, PaintChatOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Enable Chat Enhancements (Clickable Co-ords, Click on Icon to Whisper, Colours, Emoticons)")+'
    '+tx("Beat chat filter so words such as \'deSCRIPTion\' can be typed")+''+tx('Replacement Char')+' : 
    '+tx("Show Facebook profile picture in chat instead of avatar")+'
    '+tx("Show emoticons in chat")+'
    '+tx("Show text styles in chat")+' 
    '+tx("Show linked image previews in chat")+' 
    '+tx("Help alliance build/research posts")+'
    '+tx("Hide alliance chat from global chat")+'
    '+tx("Hide alliance requests in chat")+'
    '+tx("Hide alliance report scanner posts in chat")+'
    '+tx("Hide spam messages from global chat")+'
    '+tx("Hide spam messages from alliance chat")+'
    '+tx("Hide alliance food alerts in chat from player names")+': 
    '+tx("Hide alliance attack alerts in chat from player names")+': 
    '+tx("Hide alliance scout alerts in chat from player names")+': 
    '+tx("Enable sound alert on alliance Attack alerts")+'' + htmlSelector(AlertSounds, Options.ChatOptions.TowerPlay, 'id=btTowerPlay') + ' Test
    '+tx("Enable sound alert on alliance Scout alerts")+'' + htmlSelector(AlertSounds, Options.ChatOptions.ScoutPlay, 'id=btScoutPlay') + ' Test
    '+tx("Enable sound alert on whisper")+'' + htmlSelector(WhisperSounds, Options.ChatOptions.WhisperPlay, 'id=btWhisperPlay') + ' Test
     
    '+tx('Chat sounds volume')+' 0
    '; m += ''; m += ''; m += ''; m += ''; m += '

    '+tx("Chat Spam")+' 
    '+tx("Spam Enabled")+'' + htmlSelector({g: 'Send to Global Chat',a: 'Send to Alliance Chat'}, Options.ChatOptions.SpamType, 'id=pbspamtype') + '
     '+tx("Spam Interval")+': '+tx("minutes")+'
     '+tx("Spam Text")+':
    '; m += ''; m += ''; m += ''; m += ''; var cb = ''; if (Options.ChatOptions.chatBold) { cb = ';font-weight:bold;'; } m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ' '; m += ''; m += '
    '+tx("Chat Colours")+' 
    '+tx("Highlight Alliance Glory Leader")+''+tx("Check every")+'  '+tx('minutes')+'
    '+tx("Display your own messages with a rainbow background")+'
    '+tx("Enable Bold Font")+'
    '+tx("Enable Global Chat Background Colour")+''+tx("Global")+'
    '+tx("Enable Alliance Chat Background Colour")+''+tx("Alliance")+'
    '+tx("Enable Whisper Colour")+''+tx("Whisper")+'
    '+tx("Enable Tower Alert Background Colours")+''+tx("Attack")+' '+tx("Scout")+' '+tx("Recall")+'
    '+tx("Enable Alliance Leaders Background Colours")+''+tx("Chancellor")+' '+tx("Vice")+' '+tx("Officer")+'
     '+tx('HTML colours')+': '+tx('Colour Picker')+' / '+tx('Colours')+''; m += makeButtonv2('blue', 'id=btResetChatColors', tx("Reset Chat Colours")); m += '
    '; ById('btChatOption').innerHTML = m; t.ChatVolSlider = new SliderBar (ById('ptVolSlider'), 200, 21, 0); t.ChatVolSlider.setValue (Options.ChatOptions.Volume/100); t.ChatVolSlider.setChangeListener(t.ChatVolumeChanged); t.ChatVolumeChanged (Options.ChatOptions.Volume/100); t.ChatSoundToggle(); ById('btTestWhisperSound').addEventListener ('click', function() { AudioManager.setVolume(Options.ChatOptions.Volume); AudioManager.setSource(eval('SOUND_FILES.' + Options.ChatOptions.WhisperPlay)); AudioManager.play(); AudioManager.stoptimer = setTimeout(AudioManager.stop, 2500); }, false); ById('btTestTowerSound').addEventListener ('click', function() { AudioManager.setVolume(Options.ChatOptions.Volume); AudioManager.setSource(eval('SOUND_FILES.' + Options.ChatOptions.TowerPlay)); AudioManager.play(); AudioManager.stoptimer = setTimeout(AudioManager.stop, 5000); }, false); ById('btTestScoutSound').addEventListener ('click', function() { AudioManager.setVolume(Options.ChatOptions.Volume); AudioManager.setSource(eval('SOUND_FILES.' + Options.ChatOptions.ScoutPlay)); AudioManager.play(); AudioManager.stoptimer = setTimeout(AudioManager.stop, 5000); }, false); ToggleOption('ChatOptions','togChatStuff', 'chatEnhance', ChatStuff.setEnable, ChatStuff.isAvailable); ToggleOption('ChatOptions','togChatGlobal', 'chatGlobal'); ToggleOption('ChatOptions','togChatAlliance', 'chatAlliance'); ToggleOption('ChatOptions','togChatWhisper', 'chatWhisper'); ToggleOption('ChatOptions','togChatBold', 'chatBold',t.PaintChatOptions); ToggleOption('ChatOptions','togChatAttack', 'chatAttack'); ToggleOption('ChatOptions','togChatLead', 'chatLeaders'); ToggleOption('ChatOptions','togChatIcon', 'chatIcons'); ToggleOption('ChatOptions','togChatEmoticons', 'Emoticons'); ToggleOption('ChatOptions','togChatStyles', 'Styles'); ToggleOption('ChatOptions','togChatImages', 'ImagePreviews'); ToggleOption('ChatOptions','togEnableWhisperAlert', 'enableWhisperAlert', t.ChatSoundToggle); ToggleOption('ChatOptions','togEnableTowerAlert', 'enableTowerAlert', t.ChatSoundToggle); ToggleOption('ChatOptions','togEnableScoutAlert', 'enableScoutAlert', t.ChatSoundToggle); ToggleOption('ChatOptions','pbspamactive', 'SpamActive',t.ToggleSpamActive); ChangeOption('ChatOptions','pbspamtype','SpamType'); ChangeOption('ChatOptions','pbspamtext','SpamText'); ChangeIntegerOption('ChatOptions','pbspaminterval','SpamInterval',1); ToggleOption('ChatOptions','CFilter', 'filter'); ChangeOption('ChatOptions','pbfilter','fchar'); ToggleOption('ChatOptions','pbChatHelpRequest', 'HelpRequest'); ToggleOption('ChatOptions','pbDeleteRequest', 'DeleteRequest'); ToggleOption('ChatOptions','pbDeletegAl', 'DeletegAl'); ToggleOption('ChatOptions','pbDeleteFood', 'DeleteFood'); ToggleOption('ChatOptions','pbDeleteAlert', 'DeleteAlert'); ToggleOption('ChatOptions','pbDeleteScout', 'DeleteScout'); ToggleOption('ChatOptions','pbDeleteReport', 'DeleteReport'); ToggleOption('ChatOptions','pbDeleteGlobalSpam', 'DeleteGlobalSpam'); ToggleOption('ChatOptions','pbDeleteAllianceSpam', 'DeleteAllianceSpam'); ChangeOption('ChatOptions','pbDelFoodUsers', 'DeleteFoodUsers'); ChangeOption('ChatOptions','pbDelAlertUsers', 'DeleteAlertUsers'); ChangeOption('ChatOptions','pbDelScoutUsers', 'DeleteScoutUsers'); ChangeOption('ChatOptions','btTowerPlay','TowerPlay'); ChangeOption('ChatOptions','btScoutPlay','ScoutPlay'); ChangeOption('ChatOptions','btWhisperPlay','WhisperPlay'); ById('togGlobal').addEventListener('change', function () { Options.ChatOptions.Colors.ChatGlobal = ById('togGlobal').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togChatLeaders').addEventListener('change', function () { Options.ChatOptions.Colors.ChatLeaders = ById('togChatLeaders').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togChatC').addEventListener('change', function () { Options.ChatOptions.Colors.ChatChancy = ById('togChatC').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togChatVC').addEventListener('change', function () { Options.ChatOptions.Colors.ChatVC = ById('togChatVC').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togAll').addEventListener('change', function () { Options.ChatOptions.Colors.ChatAll = ById('togAll').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togChatAtt').addEventListener('change', function () { Options.ChatOptions.Colors.ChatAtt = ById('togChatAtt').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togChatScout').addEventListener('change', function () { Options.ChatOptions.Colors.ChatScout = ById('togChatScout').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togChatRecall').addEventListener('change', function () { Options.ChatOptions.Colors.ChatRecall = ById('togChatRecall').value; saveOptions(); t.PaintChatOptions(); }, false); ById('togWhisper').addEventListener('change', function () { Options.ChatOptions.Colors.ChatWhisper = ById('togWhisper').value; saveOptions(); t.PaintChatOptions(); }, false); ById('btResetChatColors').addEventListener('click', function () { for (var p in ChatStuff.Colors) { Options.ChatOptions.Colors[p] = ChatStuff.Colors[p]; } saveOptions(); t.PaintChatOptions(); }, false); ToggleOption('ChatOptions','togChatGlory','GloryLeader'); ToggleOption('ChatOptions','togChatRainbow','Rainbow'); ChangeIntegerOption('ChatOptions','pbglorycheck','GloryLeaderInterval',1); ById ('pbIMGLinkHelp').addEventListener ('click', t.helpimgPop, false); ById ('pbChatStyleHelp').addEventListener ('click', t.helpstylePop, false); }, ChatVolumeChanged : function (val) { var t = Tabs.Options; ById('ptVolOut').innerHTML = parseInt(val*100); Options.ChatOptions.Volume = parseInt(val*100); saveOptions(); }, ChatSoundToggle : function () { var t = Tabs.Options; var dc = jQuery('#ptSoundOpts').attr('class'); if (Options.ChatOptions.enableTowerAlert || Options.ChatOptions.enableScoutAlert || Options.ChatOptions.enableWhisperAlert) {if (dc.indexOf('divHide') >= 0) jQuery('#ptSoundOpts').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#ptSoundOpts').attr('class','divHide');} ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, PaintGameOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Enable Target City Picker in Attack Dialog (Reinforce, Reassign and Transport)")+'
    '+tx("Hide Attack/Speed boosts by default in attack dialog")+'
    '+tx("Enhanced Page Navigation for Messages and Reports")+'
    '+tx("Enhanced Alliance Reports")+'
    '+tx("Enhanced Inbox/Report functions")+'
    '+tx("Enhanced Alliance Members View")+'
    '+tx("Alliance and Messages buttons open on Report View")+'
    '+tx("Automatically restart raid timer")+' '+tx("Auto-raid restart toggle on screen header")+' *
    '+tx("Raid Stop/Resume buttons on screen header")+' * '+tx("Raid delete button on screen header")+' *
    '+tx("Automatically collect gold when happiness reaches")+' %
    '+tx("Display food alert in alliance chat when less than")+' '+tx("hours of food remaining (checked every 15 min)")+'
    '+tx("Display Number of Rounds in Battle Reports")+'
    '+tx("Enable Delete Button on Battle Report")+'
    '+tx("Show")+' ' + htmlSelector({ 0: 'GMT', 1: 'Pacific' }, Options.gmtClockType, 'id=btClockType') + ' '+tx("Time next to Camelot Time")+'
    '+tx("Display Province, Truce Status and Player Notes in Map Tooltips")+'
    '+tx("Include Extra Player Information in Map Context Menu")+'
    '+tx("Show Player & Might in map")+'
    '+tx("Show Tile Level in map")+'
    '+tx("Enhanced city buttons")+'
     '+tx("Hide/Defend by Double-Clicking City Icon")+'
     '+tx("Enable Colour Icon for City Faction")+' *
     '+tx("Highlight when Ascension Protection will Expire within")+' '; m += ' '+tx("Hours")+'
    '+tx("Auto-select city on startup"); m += ' 
    '+tx("Kill annoying Faire and Court popups")+'
    '+tx("Auto-click and accept Daily Login Reward")+'
    '+tx("Kill Merlins Magical Boxes on start up")+'
    '; ById('btGameOption').innerHTML = m; ById('btClockType').addEventListener('change', function () { Options.gmtClockType = this.value; saveOptions(); }, false); ToggleOption('','togPageNav', 'fixPageNav', PageNavigator.enable, PageNavigator.isAvailable); ToggleOption('','togRptGift', 'enhancedinbox', DispReport.setEnable, DispReport.isDispReportAvailable); ToggleOption('','togCV', 'EnhCBtns', function () { t.EnhCBtnsToggle();t.RestartReminder(); }); ToggleOption('','togDbClkDef', 'DbClkDefBtns'); ToggleOption('','togColrCty', 'ColrCityBtns',t.RestartReminder); t.EnhCBtnsToggle(); ToggleOption('','togResetRaids', 'RaidRunning',t.ToggleRaidActive); ToggleOption('','togAutoRaidToggle', 'RaidToggle',t.RestartReminder); ToggleOption('','togRaidButtons', 'RaidButtons',t.RestartReminder); ToggleOption('','togRaidDeleteButton', 'RaidDeleteButton',t.RestartReminder); ToggleOption('','togRptClick', 'ClickForReports',t.RestartReminder); ToggleOption('','togAttackPicker', 'attackCityPicker', AttackDialog.setEnable, AttackDialog.isAvailable); ToggleOption('','togHideAttackEfforts', 'hideAttackEfforts'); ToggleOption('','togGmtClock', 'gmtClock', GMTclock.setEnable); ToggleOption('','togAllRpts', 'enhanceARpts', AllianceReports.listFunc.setEnable); ToggleOption('','togAllMembers', 'enhanceViewMembers', AllianceReports.enable_viewmembers); ToggleOption('','togBatRounds', 'dispBattleRounds', null, battleReports.isRoundsAvailable); ToggleOption('','togAtkDelete', 'reportDeleteButton', null, battleReports.isRoundsAvailable); ToggleOption('','MapExtra', 'MapShowExtra'); ToggleOption('','MapLevel', 'MapShowLevel'); ToggleOption('','togMapInfo4', 'dispStatus', mapinfoFix.setEnableDispStatus, mapinfoFix.isAvailableDispStatus); ToggleOption('','togMapMenuInfo', 'mapMenuInfo', mapinfoFix.setMenuEnable, mapinfoFix.isMenuAvailable); ToggleOption('','btLoginReward', 'LoginReward'); ToggleOption('','btMagicBox', 'MagicBox'); ToggleOption('','btFairie', 'KillFairie', FairieKiller.setEnable); ToggleOption('','pbmaintoggle', 'amain'); ChangeOption('','pbwhichcity', 'smain'); ToggleOption('','pbGoldEnable', 'pbGoldEnable'); ChangeOption('','pbGoldLimit', 'pbGoldHappy'); ToggleOption('','pbFoodToggle', 'pbFoodAlert'); ChangeOption('','pbFoodAlertInt', 'pbFoodAlertInt'); ById('ptWarnAscension').addEventListener('change', t.EnhCBtnsToggle, false); ChangeIntegerOption('','ptWarnAscensionInterval','WarnAscensionInterval',1,Tabs.Options.checkAscension); }, PaintPBPOptions : function () { var t = Tabs.Options; var Themes = {}; for (var a in t.Colors) Themes[a] = tx(a); m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Refresh KofC every")+' '+tx("minutes")+' '+tx("Only when AFK")+'     '+tx("Add Toggle Button")+'
    '+tx('Automatically apply Potion of Mist when AFK')+'
    '+tx('Automatically apply Potion of Mist if you lose it when marching')+'
     '+tx("Use")+' '+htmlSelector(ScoutTroops,Options.QuickScoutTroops,' id=btquickscouttroops class=btInput')+' '+tx("for Quick Scout")+'
     '+tx("Automatic march functions should ALWAYS keep")+' '+tx("free rally slots")+'
    '+tx("Hide PowerBot+ Lite when clicking on Map Coordinates")+'
    '+tx("Enable one-click attack from the map")+' *
    '+tx("Enable draggable map co-ordinates box")+' *
    '+tx("Display selected castle in green on city selection widgets")+' *
    '+tx("Fetch additional march information from server")+'
    '+tx("Replace gem containers with incoming attack alert timer")+'
    '+tx('Display throne room stats in alternate sort order')+'
    '+tx("Enable main screen throne room widget")+' '+tx("Draggable")+' *     '+tx("Display widget as Throne HUD")+'
    '+tx('Fix throne room preset changer width to 8 per row')+'
    '+tx('Display Glory Might')+'
    '+tx('Display Defending/Marching Troop Might')+'
    '+tx('Display Server Traffic Monitor')+' *
     '+tx("Detect AFK when mouse and keyboard idle for")+' '+tx("minutes")+'
     '+tx("Map lookup request interval")+' '+tx("seconds")+'
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("PowerBot+ Lite Colours")+' *
     '+tx("Title Background")+': Text: '+tx('Title')+'
     '+tx("Divider Background")+':  - Text: '+tx('DIVIDER')+'
     '+tx("Panel Background")+': Text: '+tx('Panel')+'
     '+tx("Highlight Background")+': Text: '+tx('Highlight')+'
     '+tx("HTML colours")+': '+tx("Colour Picker")+' / '+tx('Colours')+''; m += tx('Theme')+': '+htmlSelector(Themes,Options.Theme,'id=btTheme')+' '+makeButtonv2('blue', 'id=btResetColors', tx("Reset Colours")); m += '
    '; ById('btPBPOption').innerHTML = m; ChangeOption ('','btEveryMins', 'btEveryMins' , RefreshEvery.setTimer); ToggleOption ('','btEveryEnable', 'btEveryEnable', t.changeRefreshOption); ToggleOption ('','btEveryToggle', 'btEveryToggle', t.RestartReminder); ToggleOption ('','btTrafficOpt', 'ShowServerTraffic', t.RestartReminder); ToggleOption ('','btAutoMist', 'AutoMist'); ToggleOption ('','btGloryMight', 'ShowGloryMight'); ToggleOption ('','btMarchMight', 'ShowMarchMight'); ToggleOption ('','btAutoMistMarch', 'AutoMistMarch'); ToggleOption ('','btdetafk', 'detAFK'); ById('togTitleBack').addEventListener('change', function () { Options.Colors.Title = ById('togTitleBack').value; saveOptions(); t.PaintPBPOptions(); t.RestartReminder(); }, false); ById('togTitleText').addEventListener('change', function () { Options.Colors.TitleText = ById('togTitleText').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('togDividerTop').addEventListener('change', function () { Options.Colors.DividerTop = ById('togDividerTop').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('togDividerBottom').addEventListener('change', function () { Options.Colors.DividerBottom = ById('togDividerBottom').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('togDividerText').addEventListener('change', function () { Options.Colors.DividerText = ById('togDividerText').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('togPanelBack').addEventListener('change', function () { Options.Colors.Panel = ById('togPanelBack').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('togPanelText').addEventListener('change', function () { Options.Colors.PanelText = ById('togPanelText').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('togHighlightBack').addEventListener('change', function () { Options.Colors.Highlight = ById('togHighlightBack').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('togHighlightText').addEventListener('change', function () { Options.Colors.HighlightText = ById('togHighlightText').value; saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ById('btResetColors').addEventListener('click', function () { var Theme = ById('btTheme').value; for (var p in Tabs.Options.Colors[Theme]) { Options.Colors[p] = Tabs.Options.Colors[Theme][p]; } saveOptions(); t.PaintPBPOptions() t.RestartReminder(); }, false); ToggleOption('','ptOneClickAttack', 'OneClickAttack',t.RestartReminder); ToggleOption('','btDraggableCoords', 'DraggableCoords',t.RestartReminder); ToggleOption('','btGreenCastles', 'GreenCastles',t.RestartReminder); ToggleOption('','ptHideOnGoto', 'hideOnGoto'); ToggleOption('','ptFetchMarchInfo', 'FetchMarchInfo'); ToggleOption('','ptAlertOverrideChk', 'OverrideAttackAlert'); ChangeOption('','btTheme','Theme'); ChangeOption('','btafktimeout', 'AFKTimeout' , afkdetector.reset); ById('btquickscouttroops').addEventListener('change', function() { Options.QuickScoutTroops = ById('btquickscouttroops').value; saveOptions(); }, false); ToggleOption('','AlternateSortOrderChk', 'AlternateSortOrder'); ToggleOption('','btWidgetCheck', 'TRWidget', function() { Dashboard.PaintTRPresets(); WideScreen.CheckChatPosition();} ); ToggleOption('','btDraggableWidget', 'DraggableWidget',t.RestartReminder); ToggleOption('','btThroneHUD', 'ThroneHUD', function() { Options.presetPosition = null; t.SetTRWidgetDisplay(); Dashboard.PaintTRPresets(); WideScreen.CheckChatPosition();} ); ToggleOption('','TRFixPresetWidth', 'TRFixPresetWidth', Dashboard.PaintTRPresets); ChangeIntegerOption('','btmapinterval','MapInterval',2,function () { MAP_DELAY = Options.MapInterval * 1000; }); ChangeIntegerOption('','btfreerallyslots','FreeRallySlots'); }, PaintLanguageOptions : function () { var t = Tabs.Options; m = ''; m += ''; m += ''; m += '
     '+tx('Current Language')+':  '+strButton20(uW.g_js_strings.getUserSettings.changelang,'id=btChangeLangButton')+' '+strButton20(tx('Refresh'),'id=btRefreshLangButton')+''+t.languagestatus+'  
     
    '; ById('btLanguage').innerHTML = m; ById('btChangeLangButton').addEventListener('click', t.ChangeLanguage, false); ById('btRefreshLangButton').addEventListener('click', t.ChangeLanguage, false); ById('btEditLang').addEventListener('click', t.editTranslations, false); }, PaintTabManagerOptions : function () { var t = Tabs.Options; var m = ''; m += ''; m += '
    '+tx('Additional Tabs')+' '+tx("Automatically Check for Updates")+' '+tx('Check Now')+'
    '; var r = 0; for (var e in GlobalOptions.ExtraTabs) { if (GlobalOptions.ExtraTabs[e].source) { var dispvers = ''; if (GlobalOptions.ExtraTabs[e].version && GlobalOptions.ExtraTabs[e].version!="0") dispvers = 'v'+GlobalOptions.ExtraTabs[e].version; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } m += ''; } } m += ''; m += ''; m += ''; m += '
    '+GlobalOptions.ExtraTabs[e].source+''+dispvers+''+tx('Reload')+' '+tx('Remove')+'
     '+tx('Add Tab')+'
     

    '+tx('Autoport Access Code')+': 

    '; m += ''; m += '
     '+tx('Reset Additional Tabs')+'
    '; ById('btTabManager').innerHTML = m; t.togGlobalOpt ('btTabAutoCheck', 'TabAutoCheck'); ChangeOption('','btPremiumCode','PremiumAccessCode',t.RestartReminder); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, ToggleTRPreset : function (entry) { var t = Tabs.Options; if (!Options.DashboardOptions.TRPresetsSelected[entry]) { Options.DashboardOptions.TRPresetsSelected[entry] = true; } Options.DashboardOptions.TRPresetsSelected[entry] = ById('btpresetSelect'+entry).checked; saveOptions(); }, TabToggle : function(e) { var t = Tabs.Options; GlobalOptions.ExtraTabs[e].enabled = ById('btTabEnabled_'+e).checked; if (GlobalOptions.ExtraTabs[e].enabled && !GlobalOptions.ExtraTabs[e].data) { t.TabLoad(e); } saveGlobalOptions(); t.RestartReminder(); }, RotateThrone: function () { var t = Tabs.Options; var activeSlot = Number(Seed.throne.activeSlot); var oldActive = activeSlot; var foundone = false; do { activeSlot++; if (activeSlot > Number(Seed.throne.slotNum)) activeSlot = 1; if (Options.DashboardOptions.TRPresetsSelected[activeSlot]) { SwitchThroneRoom(activeSlot); foundone = true; break; } } while (!foundone && (activeSlot != oldActive)) }, TabDelete : function(e) { var t = Tabs.Options; GlobalOptions.ExtraTabs.splice(e,1); saveGlobalOptions(); t.RestartReminder(); t.PaintTabManagerOptions(); ById('btTabMessage').innerHTML = tx('Tab Removed'); }, TabRefresh : function(e) { var t = Tabs.Options; t.TabLoad(e); }, TabReset : function() { var t = Tabs.Options; delete GlobalOptions.ExtraTabs; saveGlobalOptions(); t.RestartReminder(); t.PaintTabManagerOptions(); }, TabReloadAll : function() { var t = Tabs.Options; CheckDelay = 0; ById('btTabMessage').innerHTML = tx('Checking Additional Tabs for updates')+'...'; for (var e in GlobalOptions.ExtraTabs) { if (GlobalOptions.ExtraTabs[e].enabled) { CheckDelay++; setTimeout( t.TabLoad,(CheckDelay*1250),e,true); } } CheckDelay++; setTimeout( function() { ById('btTabMessage').innerHTML = tx('Complete! Please reload Kingdoms of Camelot')+'!'; },(CheckDelay*1250)); }, TabAdd : function() { var t = Tabs.Options; var TabObj = {}; TabObj.source = ById('btTabSource').value.trim(); TabObj.data = null; TabObj.enabled = true; TabObj.lastchecked = 0; GlobalOptions.ExtraTabs.push(TabObj); t.TabLoad(GlobalOptions.ExtraTabs.length-1); }, TabLoad : function(e,background) { var t = Tabs.Options; var src = GlobalOptions.ExtraTabs[e].source; if (src!="") { var TabMessage = tx('Tab Added'); if (GlobalOptions.ExtraTabs[e].data) { TabMessage = tx('Tab Updated'); } GlobalOptions.ExtraTabs[e].lastchecked = unixTime(); saveGlobalOptions(); remotefun = function (e) { try { GM_xmlhttpRequest({ method: 'GET', url: src+'?'+new Date(), headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', }, onload: function (remote) { if (remote.status == 200) { try { var oldvers = null; if (GlobalOptions.ExtraTabs[e].data) { oldvers=/\/\/\s*@tabversion\s+(.+)\s*\n/i.exec(atob(GlobalOptions.ExtraTabs[e].data)); } if (oldvers) { oldvers=oldvers[1]; } else { oldvers='0'; } var newvers=/\/\/\s*@tabversion\s+(.+)\s*\n/i.exec(remote.responseText); if (newvers) { newvers=newvers[1]; } else { newvers='0'; } if (!background || AutoUpdater.compareVersion(newvers, oldvers)) { GlobalOptions.ExtraTabs[e].data = btoa(unescape(encodeURIComponent(remote.responseText))); GlobalOptions.ExtraTabs[e].version = newvers; saveGlobalOptions(); if (!background) { t.RestartReminder(); } else { actionLog(TabMessage+': '+src+' ('+tx('Restart Required')+')','GENERAL'); } } } catch (err) { TabMessage = err.message; logerr(err); } } else { TabMessage = tx('Unable to open source file'); logit('unable to open file '+src); } if (!GlobalOptions.ExtraTabs[e].data) { GlobalOptions.ExtraTabs.splice(e,1); // remove bad tab saveGlobalOptions(); } if (!background) { t.PaintTabManagerOptions(); ById('btTabMessage').innerHTML = TabMessage; } }, }); } catch (err){ logerr(err); } } setTimeout(remotefun,0,e); } }, ChangeLanguage : function () { var t = Tabs.Options; var params=uW.Object.clone(uW.g_ajaxparams); params.lang=ById('btChangeLang').value; new MyAjaxRequest(uW.g_ajaxpath +"ajax/changeLanguage.php"+uW.g_ajaxsuffix, { method:"post", parameters:params, onSuccess:function(rslt) { Options.Language=(params.lang); LanguageArray = {}; t.LoadLanguage(Options.Language,function () { saveLanguage(Options.Language); ReloadKOC(false,'&lang='+Options.Language); }); }, },true); }, LoadLanguage : function (lang,notify) { var t = Tabs.Options; Options.LanguageLastChecked = unixTime(); saveOptions(); if (lang=='en') { if (notify) {notify();} return; } // english is default language - no pack available! var LangURL = EXTERNAL_RESOURCE+'languages/translation_'+lang+'.js?'+new Date(); try { GM_xmlhttpRequest({ method: 'GET', url: LangURL, onload: function(xpr) { var rslt = null; if (xpr.status==200) { try { rslt = JSON2.parse(xpr.responseText); } catch (e){ t.languagestatus = "Invalid Language Pack"; logerr(e); if (notify) {notify();} return; } if (!LanguageArray.CurrLang || LanguageArray.CurrLang != rslt.CurrLang) { t.UpdateLangArray(rslt); } else { if (!LanguageArray.LangVersion || parseIntNan(LanguageArray.LangVersion.substring(0, 8)) < parseIntNan(rslt.LangVersion.substring(0, 8))) { t.languagestatus = "New Language Pack Available!"; } } } if (notify) {notify();} }, onerror: function() { t.languagestatus = tx('Language pack unavailable'); if (notify) {notify();} } }); } catch (e){ logerr(e); } }, UpdateLangArray : function (rslt) { var t = Tabs.Options; for (var k in rslt){ LanguageArray[k] = rslt[k]; } saveLanguage(Options.Language); t.languagestatus = tx('Language pack')+' ('+rslt.CurrLang+') '+tx('Version')+' '+rslt.LangVersion+' '+tx('loaded'); }, editTranslations : function () { var t = Tabs.Options; var m = ''; m += ''; m += '
       
    Exiting window without clicking "Save Changes" will cause any amendments to be lost!
    '; m += '

    '; if (!LanguageArray.CurrLang) { LanguageArray.CurrLang = Options.Language; } var r = 0; m += ''; r=r+1; if (LanguageArray.LangVersion) { m += ''; r=r+1; } for (var l in NoTranslation) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } m += ''; } for (var l in LanguageArray) { if (l != "CurrLang" && l != "LangVersion") { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } m += ''; } } m += '
    CurrLang
    '+LanguageArray.CurrLang+'
    LangVersion
    '+LanguageArray.LangVersion+'
    '+l+'
    '+l+'
    '; t.popLang = new CPopup('btEditLanguage', 10, 10, GlobalOptions.btWinSize.x, 500, true, function() { saveLanguage(Options.Language); t.popLang.destroy();}); t.popLang.getTopDiv().innerHTML = '
    '+tx("Edit Translations")+'
    '; t.popLang.getMainDiv().innerHTML = m; t.popLang.show(true); ById("btSaveLang").addEventListener('click', function(){ for (var l in LanguageArray) { var elem = ById("btlang_"+escape(l)); if (elem && elem.value != '') { LanguageArray[l] = elem.value; } } for (var l in NoTranslation) { var elem = ById("btlang_"+escape(l)); if (elem && elem.value != '') { LanguageArray[l] = elem.value; delete NoTranslation[l]; } } saveLanguage(Options.Language); t.editTranslations(); },false); ById('btExportLang').addEventListener ('click',function() { var Export = {}; for (var k in LanguageArray) { Export[k] = LanguageArray[k]; } if (Options.Language = 'en') { for (var k in NoTranslation) { Export[k] = NoTranslation[k]; } } uriContent = 'data:application/octet-stream;content-disposition:attachment;filename=file.txt,' + encodeURIComponent(JSON2.stringify(Export)); t.saveConfig(uriContent,'lang_'+LanguageArray.CurrLang+'.txt'); ById('btEditTransMsg').innerHTML = 'Translations Exported'; },false); ById('btImportLang').addEventListener ('click',function() { var fileInput = ById("btImportLangFile"); var files = fileInput.files; if (files.length == 0) { return; } var file = files[0]; var reader = new FileReader(); reader.onload = function (e) { var Import = JSON2.parse(e.target.result); if (Import.CurrLang && LanguageArray.CurrLang && Import.CurrLang != LanguageArray.CurrLang) { ById('btEditTransMsg').innerHTML = 'Incorrect Language'; return; } else { for (var k in Import) { if (Import[k] != "") { LanguageArray[k] = Import[k]; if (NoTranslation.hasOwnProperty(k)) delete NoTranslation[k]; } } } t.editTranslations(); }; reader.readAsText(file); },false); }, togGlobalOpt : function (checkboxId, optionName, callOnChange) { var t = Tabs.Options; var checkbox = ById(checkboxId); checkbox.checked = GlobalOptions[optionName]; checkbox.addEventListener ('change', eventHandler, false); function eventHandler (){ GlobalOptions[optionName] = this.checked; saveGlobalOptions(); if (callOnChange) { callOnChange (this.checked); } } }, changeGlobalOpt : function (valueId, optionName, callOnChange) { var t = Tabs.Options; var e = ById(valueId); e.value = GlobalOptions[optionName]; e.addEventListener ('change', eventHandler, false); function eventHandler (){ GlobalOptions[optionName] = this.value; saveGlobalOptions(); if (callOnChange) { callOnChange (this.value); } } }, togUserOpt : function (checkboxId, optionName, callOnChange, callIsAvailable) { var t = Tabs.Options; var checkbox = ById(checkboxId); if (callIsAvailable && callIsAvailable() == false) { checkbox.disabled = true; return; }; checkbox.checked = UserOptions[optionName]; checkbox.addEventListener ('change', eventHandler, false); function eventHandler (){ UserOptions[optionName] = this.checked; saveUserOptions(uW.user_id); // facebook user id if (callOnChange) { callOnChange (this.checked); } } }, changeUserOpt : function (valueId, optionName, callOnChange) { var t = Tabs.Options; var e = ById(valueId); e.value = UserOptions[optionName]; e.addEventListener ('change', eventHandler, false); function eventHandler (){ UserOptions[optionName] = this.value; saveUserOptions(uW.user_id); // facebook user id if (callOnChange) { callOnChange (this.value); } } }, ResetDash : function () { var t = Tabs.Options; for (var p in Dashboard.DefaultDashboard) { ById('dashSeq'+p).value = Dashboard.DefaultDashboard[p].Sequence; ById('dashDisp'+p).checked = Dashboard.DefaultDashboard[p].Display; } Options.DashboardOptions.OverrideDashboard = {}; saveOptions(); WideScreen.RestartDashboard(); }, OverrideDash : function (sect) { var NewObj = {}; if (Options.DashboardOptions.OverrideDashboard[sect]) { NewObj.Display = Options.DashboardOptions.OverrideDashboard[sect].Display; NewObj.Sequence = Options.DashboardOptions.OverrideDashboard[sect].Sequence; } else { NewObj.Display = Dashboard.DefaultDashboard[sect].Display; NewObj.Sequence = Dashboard.DefaultDashboard[sect].Sequence; } if (isNaN(ById('dashSeq'+sect).value)) { ById('dashSeq'+sect).value = 0; } NewObj.Sequence = ById('dashSeq'+sect).value; NewObj.Display = ById('dashDisp'+sect).checked; Options.DashboardOptions.OverrideDashboard[sect] = NewObj; saveOptions(); WideScreen.RestartDashboard(); }, SacToggle : function () { var dc = jQuery('#btSacOpts').attr('class'); if (Options.DashboardOptions.DefaultSacrifice) {if (dc.indexOf('divHide') >= 0) jQuery('#btSacOpts').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#btSacOpts').attr('class','divHide');} ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, DefToggle : function () { var dc = jQuery('#btDefOpts').attr('class'); if (Options.DashboardOptions.DefAddTroopShow) {if (dc.indexOf('divHide') >= 0) jQuery('#btDefOpts').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#btDefOpts').attr('class','divHide');} ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, PresetToggle : function () { var dc = jQuery('#btPresetByNameOpts').attr('class'); if (Options.DashboardOptions.TRPresetChange) {if (dc.indexOf('divHide') >= 0) jQuery('#btPresetByNameOpts').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#btPresetByNameOpts').attr('class','divHide');} ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); Dashboard.PaintTRPresets(); }, EnhCBtnsToggle: function () { var dc1 = jQuery('#ptcvoptions1').attr('class'); var dc2 = jQuery('#ptcvoptions2').attr('class'); var dc3 = jQuery('#ptcvoptions3').attr('class'); if (Options.EnhCBtns) { if (dc1.indexOf('divHide') >= 0) jQuery('#ptcvoptions1').attr('class',''); if (dc2.indexOf('divHide') >= 0) jQuery('#ptcvoptions2').attr('class',''); if (dc3.indexOf('divHide') >= 0) jQuery('#ptcvoptions3').attr('class',''); } else { if (dc1.indexOf('divHide') < 0) jQuery('#ptcvoptions1').attr('class','divHide'); if (dc2.indexOf('divHide') < 0) jQuery('#ptcvoptions2').attr('class','divHide'); if (dc3.indexOf('divHide') < 0) jQuery('#ptcvoptions3').attr('class','divHide'); } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); Options.WarnAscension = ById('ptWarnAscension').checked; saveOptions(); clearInterval(t.WarnAscensionTimer); if (Options.EnhCBtns && Options.WarnAscension) { t.WarnAscensionTimer = setInterval(function () { Tabs.Options.checkAscension(); }, 60 * 1000); // every min? } Tabs.Options.checkAscension(); }, checkAscension: function () { var t = Tabs.Options; for (var i = 0; i < uW.seed.cities.length; i++) { var cityidx = i + 1; var city = ById('citysel_' + cityidx); if (!city) { setTimeout(t.checkAscension, 2000); return; } if (!Options.WarnAscension || !Options.EnhCBtns) { jQuery('#citysel_' + cityidx).removeClass('city_warning'); } else { var cityExpTime = uW.seed.cityData.city[uW.seed.cities[i][0]].prestigeInfo.prestigeBuffExpire; if (!isNaN(cityExpTime) && (cityExpTime >= unixTime()) && ((cityExpTime - unixTime()) <= (Options.WarnAscensionInterval * 3600))) { if (jQuery('#citysel_' + cityidx).hasClass('city_unselected')) { jQuery('#citysel_' + cityidx).addClass('city_warning'); } } else { jQuery('#citysel_' + cityidx).removeClass('city_warning'); } } } }, MiniRefreshChanged: function () { var t = Tabs.Options; Options.MiniRefresh = ById('ptEnableMiniRefresh').checked; saveOptions(); t.MiniRefresh(); }, MiniRefresh: function () { var t = Tabs.Options; clearTimeout(t.MiniRefreshTimer); if (Options.MiniRefresh) { if (!Options.DashboardOptions.RefreshSeed && !RefreshingSeed) { RefreshSeed(); } t.MiniRefreshTimer = setTimeout(t.MiniRefresh, Options.MiniRefreshInterval*60*1000); } }, AddUserLists : function () { // obsolete code. Kept for posterity var t = Tabs.Options; uW.FB.getLoginStatus(function(response) { if (response.status != 'connected') { return; } }); uW.FB.login(function (o) { if (o.authResponse) { var p = { access_token : o.authResponse.accessToken }; uW.FB.api('/me/friendlists', p, function(result) { UserOptions.CustomPublish = {}; var markup = ''; for (var l in t.PublishLists) { var selected = ""; if (UserOptions.autoPublishPrivacySetting == l) selected = "selected"; markup += ''; } var lists = result.data; for(var i in lists){ if (lists[i].list_type == 'user_created') { UserOptions.CustomPublish[lists[i].id] = lists[i].name; var selected = ""; if (UserOptions.autoPublishPrivacySetting == lists[i].id) selected = "selected"; markup += ''; } } saveUserOptions (uW.user_id); // facebook user id ById('selectprivacymode').innerHTML = markup; }); } },{ scope : "read_friendlists" }); }, ResetAllWindows: function () { DefaultWindowPos('btWinPos','main_engagement_tabs',true); mouseMainTab ({button:2}); DefaultWindowPos('btDashPos','main_engagement_tabs',true); if (Options.btFloatingDashboard) ResetWindowPos({button:2},'main_engagement_tabs',popDash); DefaultWindowPos('btIncPos','main_engagement_tabs',true); ResetWindowPos({button:2},'main_engagement_tabs',popInc); DefaultWindowPos('btOutPos','main_engagement_tabs',true); ResetWindowPos({button:2},'main_engagement_tabs',popOut); DefaultWindowPos('btMarchPos','main_engagement_tabs',true); ResetWindowPos({button:2},'main_engagement_tabs',popMarch); DefaultWindowPos('btMonPos','main_engagement_tabs',true); ResetWindowPos({button:2},'main_engagement_tabs',popMon); if (uW.btGuardWidget) { uW.btGuardWidget.resetGuardWidget(); } actionLog('All window positions reset','OPTIONS'); }, ResetAll : function () { hideMe(); ModalMultiButton({ buttons: [ { txt: "Reset ALL Options!", exe: function () { uW.Modal.hideModal(); setTimeout( function () { var RemoveList = (GM_listValues()); for (i=0;i Please confirm you want to return PowerBot+ Lite to Factory Settings?
    Note this affects all domains...", title: "Reset ALL PowerBot+ Lite Options" }); }, ResetSettings : function () { hideMe(); ModalMultiButton({ buttons: [ { txt: "Reset Settings", exe: function () { uW.Modal.hideModal(); setTimeout( function () { var serverID = getServerId(); GM_deleteValue ('Options_??'); GM_deleteValue ('Options_'+serverID+'_'+uW.tvuid); ResetAll = true; actionLog('PowerBot+ Lite configuration reset'); Tabs.ActionLog.save(); ReloadKOC(); },0); }}, { txt: "Cancel Request", exe: function () { uW.Modal.hideModal(); }} ], body: "
    Please confirm you want to reset PowerBot+ Lite settings to default values?
    ", title: "Reset Settings" }); }, RestartReminder : function () { var t = Tabs.Options; var div = ById('ptRestart'); if (!div) { var div = document.createElement('div'); div.id = 'ptRestart'; uWExportFunction('ReloadKOC',ReloadKOC); var msg = tx('Changes to Power Bot Plus Lite Settings require Kingdoms of Camelot to be reloaded')+'... ['+tx('Reload')+'] ['+uW.g_js_strings.commonstr.close+']'; div.innerHTML = '
    '+msg+'
    '; document.body.insertBefore (div, document.body.firstChild); } }, ToggleSpamActive : function () { var t = Tabs.Options; if (Options.ChatOptions.SpamActive) { // reset last sent time... Options.ChatOptions.LastSpamSent = 0; saveOptions(); } }, ToggleRaidActive : function () { var t = Tabs.Options; if (Options.RaidRunning) { // reset last sent time... Options.RaidLastReset = 0; saveOptions(); } SetToggleButtonState('Raids',Options.RaidRunning,'Raids'); }, resetRaids : function(cityId,cityName){ var t = Tabs.Options; var params = uW.Object.clone(uW.g_ajaxparams); params.pf = 0; params.ctrl = 'BotManager'; params.action = 'resetRaidTimer'; params.settings = {}; params.settings.cityId = cityId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function(rslt){ if (rslt.ok) { uW.cityinfo_army(); setTimeout(uW.update_seed_ajax, 250); } }, }); }, CheckWatchTower : function () { var t = Tabs.Options; var now = unixTime(); var incoming = false; for (var k in local_atkinc) { // check each incoming march var m = local_atkinc[k]; if (m.marchType==3 || m.marchType==4) { if(Options.TowerOptions.HandledMarches.indexOf(String(m.mid)+String(m.departureTime))==-1) { // new attack!! Options.TowerOptions.HandledMarches.push(String(m.mid)+String(m.departureTime)); if (Cities.byID[m.toCityId] && Cities.byID[m.toCityId].tileId == m.toTileId) { // only save times on city attacks if (!Options.TowerOptions.LatestAttackTimes[m.toCityId] || (Number(m.arrivalTime) > Options.TowerOptions.LatestAttackTimes[m.toCityId])) { Options.TowerOptions.LatestAttackTimes[m.toCityId] = Number(m.arrivalTime); // arrival times by city. if (Number(m.arrivalTime) > Options.TowerOptions.LastAttack) { Options.TowerOptions.LastAttack = Number(m.arrivalTime); // global last attack time var. } } } saveOptions(); t.newIncoming (m); }; incoming = true; } } if(!incoming) { // all clear! if (Options.TowerOptions.RecentActivity) { // belt and braces - reset last attack values if they are later than now... if (parseInt(Options.TowerOptions.LastAttack) > now) { Options.TowerOptions.LastAttack = now; } for (var cid in Options.TowerOptions.LatestAttackTimes) { if (parseInt(Options.TowerOptions.LatestAttackTimes[cid]) > now) { Options.TowerOptions.LatestAttackTimes[cid] = now; } } } Options.TowerOptions.HandledMarches = new Array(); // cleanup } // Start or Stop Sound Alert! if (incoming && Options.TowerOptions.alertSound.alarmActive){ if (ById('btDashAlarmOff')) { if (!ById('btDashAlarmOffButton')) { ById('btDashAlarmOff').innerHTML = strButton14(tx('Silence Alarm')+'!','id=btDashAlarmOffButton','red14'); ById('btDashAlarmOffButton').addEventListener ('click', t.stopSoundAlerts, false); } } else { if (!ById("towersirentab")) { AddSubTabLink(tx('Silence Alarm')+'!',t.stopSoundAlerts, 'towersirentab', 'red20'); } } } if (Options.TowerOptions.alertSound.alarmActive && ((now > Options.TowerOptions.alertSound.expireTime) || !incoming)){ var element = ById('towersirentab'); if(element) { element.parentNode.removeChild(element); } if (ById('btDashAlarmOff')) { ById('btDashAlarmOff').innerHTML = ''; } t.stopSoundAlerts(); } // Check Action Reverts if (Options.TowerOptions.RecentActivity) { for (var cid in Options.TowerOptions.RecentCityActivity) { // check each city action.. if (Options.TowerOptions.RecentCityActivity[cid]===true) { var switchtime = parseInt(Options.TowerOptions.LatestAttackTimes[cid]); if (Options.TowerOptions.Revert) switchtime += Options.TowerOptions.RevertMinutes*60; if (switchtime < now) { actionLog(Cities.byID[cid].name+': All Clear','TOWER'); if (Options.TowerOptions.Revert && (afkdetector.isAFK || !Options.TowerOptions.AFKEvents)) { // change guardian back if (Options.TowerOptions.ChangeGuardian) { if (Options.TowerOptions.SaveCityState[cid].Guardian != Seed.guardian[Cities.byID[cid].idx].type) { actionLog(Cities.byID[cid].name+': Resetting Guardian','TOWER'); SwitchGuardian(cid,Options.TowerOptions.SaveCityState[cid].Guardian); } } // change champion back... if (Options.TowerOptions.ChangeChamp) { if (Options.TowerOptions.SaveCityState[cid].Champion != getCityChampion(cid).championId && getChampionCity(Options.TowerOptions.SaveCityState[cid].Champion)==0) { actionLog(Cities.byID[cid].name+': Resetting City Champion','TOWER'); setTimeout(SwitchChampion,3000,cid,Options.TowerOptions.SaveCityState[cid].Champion); // delay 3 seconds } } // restart raids in city... if (Options.TowerOptions.StopRaids) { actionLog(Cities.byID[cid].name+': Restarting Raids','TOWER'); ToggleCityRaids (cid,'resumeAll'); } } Options.TowerOptions.RecentCityActivity[cid] = false; // switch off if (Options.TowerOptions.SaveCityState[cid]) { setTimeout(function() { if (!Options.TowerOptions.RecentCityActivity[cid] === true) { // double check! delete Options.TowerOptions.SaveCityState[cid]; if (Options.TowerOptions.StopMarches) { actionLog(Cities.byID[cid].name+': Automatic march functions resumed','TOWER'); } } },10000); // cleanup (which will allow marches again) 10 sec delay so raids get going first... } } } } var switchtime = parseInt(Options.TowerOptions.LastAttack); if (Options.TowerOptions.Revert) switchtime += Options.TowerOptions.RevertMinutes*60; if (switchtime < now) { if (Options.TowerOptions.Revert && (afkdetector.isAFK || !Options.TowerOptions.AFKEvents)) { // Switch TR back if required if (Options.TowerOptions.ChangeTR) { if (Options.TowerOptions.SaveTR != Seed.throne.activeSlot) { actionLog('Resetting Throne Room','TOWER'); SwitchThroneRoom(Options.TowerOptions.SaveTR); } } // Switch Champ back if required if (Options.TowerOptions.ChangeChamp) { if (Options.TowerOptions.ChampId && Options.TowerOptions.ChampOriginalCity != getChampionCity(Options.TowerOptions.ChampId)) { if (getChampionStatus(Options.TowerOptions.ChampId)=="10") { actionLog('Champion is marching - Cannot revert to original city','TOWER'); } else { actionLog('Reverting champion to original city','TOWER'); SwitchChampion(Options.TowerOptions.ChampOriginalCity,Options.TowerOptions.ChampId); } } } } Options.TowerOptions.RecentActivity = false; // switch off } } }, e_volChanged : function (val) { var t = Tabs.Options; ById('pbVolOut').innerHTML = parseInt(val*100); Options.TowerOptions.alertSound.volume = parseInt(val*100); }, playSound : function (soundfile,doRepeats,btnid) { var t = Tabs.Options; if (!t.mss) return; var stopbtn = ById(btnid); if (stopbtn) { stopbtn.disabled = false; } clearTimeout (t.soundStopTimer); clearTimeout (t.soundRepeatTimer); t.mss.setVolume(Options.TowerOptions.alertSound.volume); t.mss.setSource(soundfile); t.mss.play(); t.soundStopTimer = setTimeout (function(){t.mss.stop(); var stopbtn = ById(btnid); if (stopbtn) { stopbtn.disabled = true; };}, Options.TowerOptions.alertSound.playLength*1000); if (doRepeats && Options.TowerOptions.alertSound.repeat) { t.soundRepeatTimer = setTimeout (t.playSound, Options.TowerOptions.alertSound.repeatDelay*60000, soundfile, true, btnid); } else { Options.TowerOptions.alertSound.alarmActive = false; } }, soundTheAlert : function (marchtype) { var t = Tabs.Options; Options.TowerOptions.alertSound.alarmActive = true; if (marchtype==3) { new t.playSound(Options.TowerOptions.alertSound.scoutUrl,true,'pbScoutStop'); } else { new t.playSound(Options.TowerOptions.alertSound.soundUrl,true,'pbSoundStop'); } }, stopSoundAlerts : function () { var t = Tabs.Options; if (t.mss) { t.mss.stop(); } var element = ById('towersirentab'); if(element) { element.parentNode.removeChild(element); } if (ById('btDashAlarmOff')) { ById('btDashAlarmOff').innerHTML = ''; } clearTimeout (t.soundStopTimer); clearTimeout (t.soundRepeatTimer); var stopbtn = ById('pbSoundStop'); if (stopbtn) { stopbtn.disabled = true; } var stopbtn = ById('pbScoutStop'); if (stopbtn) { stopbtn.disabled = true; } Options.TowerOptions.alertSound.alarmActive = false; Options.TowerOptions.alertSound.expireTime = 0; }, newIncoming : function (m) { var t = Tabs.Options; if (m.marchType == null) return; // bogus march (returning scouts) if (m.arrivalTime && m.arrivalTime < uW.unixtime()+30) return; // don't show expired marches, well unless within 30 seconds for lag... var totTroops = 0; if (m.unts) { // if watchtower not high enough, display anyway for (var k in m.unts) { totTroops += Number(m.unts[k]); } if (!isNaN(totTroops) && totTroops < Options.TowerOptions.minTroops) { return; } } if (!Options.TowerOptions.towercityactive[m.toCityId]) { return; } var city = Cities.byID[m.toCityId]; if (city.tileId != m.toTileId && !Options.TowerOptions.wilds) { return; } if (m.marchType == 3 && !Options.TowerOptions.scouting) { return;} t.BuildMessage(m); if (m.marchStatus == 9) { // recalled marches // Need to recheck arrival times to this city to take into account recalled march... var now = unixTime(); Options.TowerOptions.LatestAttackTimes[m.toCityId] = now; for (var k in local_atkinc) { var n = local_atkinc[k]; if ((n.marchType==3 || n.marchType==4) && (n.marchId != m.mid)) { // weird, cos it comes from the game! if (n.toCityId==m.toCityId && n.toTileId==Cities.byID[m.toCityId].tileId) { if (Number(n.arrivalTime) > Options.TowerOptions.LatestAttackTimes[m.toCityId]) { Options.TowerOptions.LatestAttackTimes[m.toCityId] = Number(n.arrivalTime); } } } } // now recheck the global var Options.TowerOptions.LastAttack = now; for (var cid in Options.TowerOptions.LatestAttackTimes) { if (Number(Options.TowerOptions.LatestAttackTimes[cid]) > Options.TowerOptions.LastAttack) { Options.TowerOptions.LastAttack = Number(Options.TowerOptions.LatestAttackTimes[cid]); } } saveOptions(); return; // recalled marches leave here.. } // alert sound! if (Options.TowerOptions.alertSound.enabled){ t.soundTheAlert(m.marchType); if (m.arrivalTime > Options.TowerOptions.alertSound.expireTime) { Options.TowerOptions.alertSound.expireTime = m.arrivalTime; } } // Perform Automatic Events if (city.tileId == m.toTileId) { if (!Options.TowerOptions.SaveCityState[m.toCityId]) { actionLog(Cities.byID[m.toCityId].name+': Under Attack!','TOWER'); var CityState = new Object(); CityState.cityId = m.toCityId; CityState.tileId = city.tileId; CityState.Guardian = Seed.guardian[Cities.byID[m.toCityId].idx].type; CityState.Champion = getCityChampion(m.toCityId).championId; CityState.ChangeChampion = true; CityState.AllowMarches = true; CityState.AllowRaids = true; Options.TowerOptions.SaveCityState[m.toCityId] = CityState; if (afkdetector.isAFK || !Options.TowerOptions.AFKEvents) { Options.TowerOptions.SaveCityState[m.toCityId].AllowMarches = (!Options.TowerOptions.StopMarches); Options.TowerOptions.SaveCityState[m.toCityId].AllowRaids = (!Options.TowerOptions.StopRaids); if (Options.TowerOptions.StopMarches) { actionLog(Cities.byID[m.toCityId].name+': Automatic march functions suspended','TOWER'); } // change guardian if (Options.TowerOptions.ChangeGuardian) { if (Seed.guardian[Cities.byID[m.toCityId].idx].type != "wood") { actionLog(Cities.byID[m.toCityId].name+': Switching to Wood Guardian','TOWER'); SwitchGuardian(m.toCityId,"wood"); } } // stop raids in city... if (Options.TowerOptions.StopRaids) { actionLog(Cities.byID[m.toCityId].name+': Stopping Raids','TOWER'); ToggleCityRaids (m.toCityId,'stopAll'); } } } Options.TowerOptions.RecentCityActivity[m.toCityId] = true; if (!Options.TowerOptions.RecentActivity) { // save current TR and location of champ Options.TowerOptions.SaveTR = Seed.throne.activeSlot; if (afkdetector.isAFK || !Options.TowerOptions.AFKEvents) { if (Options.TowerOptions.ChangeTR) { if (parseIntNan(Options.TowerOptions.ChangeTRPreset) != 0 && Options.TowerOptions.ChangeTRPreset != Seed.throne.activeSlot) { actionLog('Changing Throne Room','TOWER'); SwitchThroneRoom(Options.TowerOptions.ChangeTRPreset); } } } if (Options.TowerOptions.ChangeChamp && Options.TowerOptions.ChampId) { Options.TowerOptions.ChampOriginalCity = getChampionCity(Options.TowerOptions.ChampId); } } Options.TowerOptions.RecentActivity = true; } saveOptions(); // do once! }, BuildMessage : function (m) { var t = Tabs.Options; var target, atkType, who; var scoutingat = ''; var atkType; if (m.marchType == 3){ if (!Options.TowerOptions.scouting) { return;} var scoutingat = uW.g_js_strings.modal_messages_viewreports_view.scoutingat; atkType = tx('SCOUT'); } else if (m.marchType == 4){ atkType = tx("ATTACK"); } else { return; } var city = Cities.byID[m.toCityId]; if (city.tileId == m.toTileId) { target = uW.g_js_strings.commonstr.city+ ' '+city.name+' ('+ city.x +','+ city.y + ')'; if(Options.TowerOptions.towercitytext[m.toCityId] && Options.TowerOptions.towercitytext[m.toCityId] != "") { target += '|'+Options.TowerOptions.towercitytext[m.toCityId]; } } else { if (!Options.TowerOptions.wilds) { return; } target = uW.g_js_strings.commonstr.wilderness; for (var k in Seed.wilderness['city'+m.toCityId]) { if (Seed.wilderness['city'+m.toCityId][k].tileId == m.toTileId) { target += '('+ Seed.wilderness['city'+m.toCityId][k].xCoord +','+ Seed.wilderness['city'+m.toCityId][k].yCoord + ')'; break; } } } if (Seed.players['u'+m.pid]) { who = Seed.players['u'+m.pid].n; } else { if (m.players && m.players['u'+m.pid]) { who = m.players['u'+m.pid].n; } else { who = tx('Unknown'); } } if (m.fromXCoord) { who += '('+ m.fromXCoord +','+ m.fromYCoord + ')'; } if (m.aid && m.aid!=0) {who += ' ('+getDiplomacy(m.aid)+')'; } if(m.marchStatus == 9) { msg = '.::.|'+scoutingat+' '+target+' || '+uW.g_js_strings.commonstr.attacker+' '+ who +' || '+uW.g_js_strings.incomingattack.attackrecalled; } else { var ArrTime = uW.g_js_strings.incomingattack.unknown; if (m.arrivalTime) ArrTime = uW.timestr(parseInt(m.arrivalTime - unixTime())); if (m.marchType == 3){ msg = '.:..'; } else { msg = '..:.'; } msg += '|'+Options.TowerOptions.aPrefix +' || '+scoutingat+' '+target+' || '+uW.g_js_strings.commonstr.attacker+' '+ who +' || '+uW.g_js_strings.attack_generateincoming.estimatedarrival+': '+ ArrTime; } if (m.pid) { msg+= ' || UID: ' + enFilter(m.pid); } msg+= ' || '+uW.g_js_strings.commonstr.troops+': '; if (m.unts) { for (var k in m.unts) { var uid = parseInt(k.substr(1)); var UNTCOUNT = enFilter(m.unts[k]); msg += '|'+UNTCOUNT +' '+ uW.unitcost['unt'+uid][0] +', '; } } else { if (m.cnt) { msg += ' '+m.cnt; } else { msg += ' Unknown'; } } if (m.marchStatus != 9) { // pointless showing following info for recalls if ((safecall.indexOf(m.pid) < 0 || trusted) && m.championInfo) { msg += ' || '+uW.g_js_strings.report_view.champion_stats+':'; var got202 = false; for (var cy in m["championInfo"].effects[1]) { if (cy<300) { // missing bonus damage? if (cy == '202') { got202 = true; } if ((cy == '203') && !got202) { msg += '|'+uW.g_js_strings.effects.name_202+': 0,'; } str = uW.g_js_strings.effects['name_'+cy]; if (str && str!= "") { msg += '|'+str+': '+m["championInfo"].effects[1][cy]+', '; } else { break; } } } msg += ' | '+uW.g_js_strings.report_view.troop_stats+':'; for (var ty in m.championInfo.effects[2]) { str = uW.g_js_strings.effects['name_'+ty]; if (str && str!= "") { msg += '|' +str+ ': ' +m.championInfo.effects[2][ty]+', '; } else { break; } } } if (city.tileId == m.toTileId) { var baseProtection =0; var totalSthPrt = 0; var SthPrtResearch = parseIntNan(Seed.tech.tch14); var TRStHsBoost = Math.min(equippedthronestats(89)+equippedthronestats(167), uW.cm.thronestats.boosts.Storehouse.Max); if (TRStHsBoost == 0) TRStHsBoost = 1 var researchToApply = ((SthPrtResearch / 10) + 1); var TRBoostToApply = ((TRStHsBoost / 100) + 1); baseProtection = StorehouseLevels[parseIntNan(getUniqueCityBuilding(city.id, 9).maxLevel)]; totalSthPrt = addCommas(parseInt((baseProtection * researchToApply) * TRBoostToApply)) msg += '|| '+tx('Storehouse Protection')+':|' + totalSthPrt + ' (TR ' + TRStHsBoost + '%)'; if (Options.TowerOptions.upkeep==true) { var trupkeepreduce = 0; trupkeepreduce = Math.min(equippedthronestats(79), uW.cm.thronestats.boosts.Upkeep.Max); var trprodres = Math.min(equippedthronestats(82), uW.cm.thronestats.boosts.ResourceProduction.Max); var trprod = [0, 0, 0, 0, 0]; trprod[1] = Math.min(equippedthronestats(83), uW.cm.thronestats.boosts.ResourceProduction.Max)+trprodres; var rp = getResourceProduction(m.toCityId); var usage = parseIntNan(Seed.resources['city'+m.toCityId]['rec1'][3]); var bp = CM.Resources.getProductionBase(1,m.toCityId); usage = (parseIntNan(rp[1] - usage + bp * trprod[1] / 100)); if (usage < 0) { var timeLeft = parseInt(Seed.resources["city"+m.toCityId]['rec1'][0]) / 3600 / (0 - usage) * 3600; if (timeLeft < 86313600) { msg+= '|| '+tx('Food Remaining')+': ' + timestrShort(timeLeft); } } } var emb = getUniqueCityBuilding(m.toCityId, 8); if (emb.count == 0) { msg += '||'+tx("No Embassy!"); msg += '| '+tx("Do not try and reinforce"); } else { var availSlots = emb.maxLevel; for (var k in Seed.queue_atkinc){ if ((Seed.queue_atkinc[k].toCityId == m.toCityId) && (Seed.queue_atkinc[k].marchStatus == 2) && (Seed.queue_atkinc[k].fromCityId != m.toCityId) && (Cities.byID[Seed.queue_atkinc[k].fromCityId]==null)) { --availSlots; } } msg += ' || '+uW.g_js_strings.openEmbassy.encampall+' '+ (emb.maxLevel-availSlots) +'/'+ emb.maxLevel +' '; if (Options.TowerOptions.defend==true) { if (parseInt(Seed.citystats["city" + m.toCityId].gate)==1) { msg+= '||'+tx('Troops are Defending!'); } else { msg+= '||'+tx('Troops are Hiding!'); } } if (Options.TowerOptions.champ==true) { var citychamp = getCityChampion(m.toCityId); if (citychamp.championId) { msg+= '||'+tx('Defending Champ')+': '+citychamp.name; } else { msg+= '||'+tx('No Defending Champ'); } } if (Options.TowerOptions.tech==true) { msg+= '||'+uW.g_js_strings.commonstr.technology+':|Fletching '+parseInt(Seed.tech.tch13)+', |Healing Potions '+parseInt(Seed.tech.tch15)+', |Poisoned Edge '+parseInt(Seed.tech.tch8)+', |Metal Alloys '+parseInt(Seed.tech.tch9)+', |Magical Mapping '+parseInt(Seed.tech.tch11)+', |Alloy Horseshoes '+parseInt(Seed.tech.tch12)+', '; } } } if (Options.TowerOptions.afk==true) { if (afkdetector.isAFK) { msg+= '||'+tx('Activity Status')+': '+tx('AFK'); } else { msg+= '||'+tx('Activity Status')+': '+tx('ONLINE'); } } if (Options.TowerOptions.DefendMonitor==true) { msg+= ' || '+tx('My UID')+': ' + enFilter(uW.tvuid); } msg+= ' || '+tx('March id')+': ' + enFilter(m.mid); } var totTroops = 0; if (!m.unts) { // no unit info, watchtower not high enough? Force to alliance chat not whisper. totTroops = 99999999; } else { for (var k in m.unts){ totTroops += Number(m.unts[k]); } } if (Options.TowerOptions.aChat) { if (Options.TowerOptions.whisper && !isNaN(totTroops) && totTroops < Options.TowerOptions.whisperTroops) { sendChat("/" + Seed.player.name + ' ' + msg); // whisper } else { sendChat ("/a "+msg); // Alliance chat } } }, sendDFReport : function (force) { var t = Tabs.Options; if (!Options.DFReport && !force) { return; } var now = unixTime(); if (!force) { if (now < (parseInt(Options.LastDFReport)+(Options.DFReportInterval*60*60))) { return; } var message = tx('Dark Forest Report for')+' '+Options.DFReportInterval+' '+tx('hours (or since last report)')+' %0A'; } else { var message = tx('Dark Forest Report (since last report)')+' %0A'; } if (Options.ReportOptions.DeleteRptdf) { var total = DeleteReports.ReportLog.DFCount; if (total==0) { // don't report if no DF's attacked in timeframe. actionLog('No report generated as no dark forests attacked in timeframe','REPORTS'); Options.LastDFReport = now; saveOptions(); return; } message +='%0A'; message += tx('Number of Dark Forests Attacked')+': '+total+'%0A'; message +='%0A'; message += tx('Miscellaneous items')+': %0A'; for (var z in DeleteReports.ReportLog.ItemsFoundDF) { message += uW.g_js_strings.commonstr.found+' '+uW.ksoItems[z].name+' x '+DeleteReports.ReportLog.ItemsFoundDF[z]+'%0A'; } message +='%0A'; message += tx('Jewel Stats')+': %0A'; var itemcount = 0; for (var z in DeleteReports.ReportLog.JewelItemsFoundDF){ itemcount += DeleteReports.ReportLog.JewelItemsFoundDF[z]; message += uW.g_js_strings.jewel['quality_'+Number(z-1)]+' Jewel x '+DeleteReports.ReportLog.JewelItemsFoundDF[z]+'%0A'; } message += tx('Total Jewels Found')+': '+itemcount+'%0A'; message +='%0A'; message += tx('Throne Stats')+': %0A'; var itemcount = 0; for (var z in DeleteReports.ReportLog.ThroneItemsFoundDF){ itemcount += DeleteReports.ReportLog.ThroneItemsFoundDF[z].amount; message += strQuality(DeleteReports.ReportLog.ThroneItemsFoundDF[z].quality)+' '+DeleteReports.ReportLog.ThroneItemsFoundDF[z].type+' x '+DeleteReports.ReportLog.ThroneItemsFoundDF[z].amount+'%0A'; } message += tx('Total Throne Room Items Found')+': '+itemcount+'%0A'; message +='%0A'; message += uW.g_js_strings.report_view.champion_stats+': %0A'; var itemcount = 0; for (var z in DeleteReports.ReportLog.ChampItemsFoundDF){ itemcount += DeleteReports.ReportLog.ChampItemsFoundDF[z].amount; message += strQuality(DeleteReports.ReportLog.ChampItemsFoundDF[z].quality)+' '+DeleteReports.ReportLog.ChampItemsFoundDF[z].type+' x '+DeleteReports.ReportLog.ChampItemsFoundDF[z].amount+'%0A'; } message += tx('Total Champion Equipment Found')+': '+itemcount+'%0A'; } else { message += tx('Found item details only available if the option "Delete dark forest reports" is ticked')+'%0A'; } var params = uW.Object.clone(uW.g_ajaxparams); params.emailTo = Seed.player['name']; params.subject = tx("Dark Forest Overview"); params.message = message; params.requestType = "COMPOSED_MAIL"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { DeleteLastMessage(); if (Options.ReportOptions.DeleteRptdf) { DeleteReports.ReportLog.ItemsFoundDF = {}; DeleteReports.ReportLog.ThroneItemsFoundDF = {}; DeleteReports.ReportLog.ChampItemsFoundDF = {}; DeleteReports.ReportLog.JewelItemsFoundDF = {}; DeleteReports.ReportLog.DFCount = 0; DeleteReports.saveLog(); } } }, }); Options.LastDFReport = now; saveOptions(); }, } /** Log Tab **/ Tabs.ActionLog = { tabOrder: 9998, tabColor : 'purple', tabLabel : 'Log', myDiv : null, maxEntries: 500, EventLog : [], arealist : {}, logfilter: 'ALL', LoopCounter: 1, init : function (div){ var t = Tabs.ActionLog; t.myDiv = div; var a = JSON2.parse(GM_getValue ('log_'+getServerId()+'_'+uW.tvuid, '[]')); if (matTypeof(a) == 'array'){ t.EventLog = a; } window.addEventListener('unload', t.onUnload, false); }, onUnload : function (){ var t = Tabs.ActionLog; if (uW.btLoaded) { if (!ResetAll) t.save(); } }, EverySecond : function () { var t = Tabs.ActionLog; t.LoopCounter = t.LoopCounter + 1; if (FFVersion.Browser=="Chrome" && (t.LoopCounter%15==0)) { t.save(); } }, save : function () { var t = Tabs.ActionLog; GM_setValue ('log_'+getServerId()+'_'+uW.tvuid, JSON2.stringify(t.EventLog)); }, log : function (msg,area){ var t = Tabs.ActionLog; if (!area) area = 'GENERAL'; var ts = unixTime(); while (t.EventLog.length >= t.maxEntries) { t.EventLog.shift(); } t.EventLog.push ({msg:msg, ts:ts, area:area}); if (GlobalOptions.ExtendedDebugMode) { logit(msg); // also send to browser log } if (tabManager.currentTab && tabManager.currentTab.name == 'ActionLog' && Options.btWinIsOpen) { t.PaintLog(); } }, PaintLog : function () { var t = Tabs.ActionLog; t.arealist = {ALL:'ALL'}; for (var i=0; i('+t.EventLog.length+'/'+t.maxEntries+')'; z += '
    Date/TimeAreaLog Message
    '; z += '
    '; var n = t.EventLog.length; while (n--) { var a = t.EventLog[n]; logfiltered = true; if ((t.logfilter != "ALL") && (a.area != t.logfilter)) continue; logshow = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ''; z += ''; z += ''; z += ''; } if (!logshow) { if (!logfiltered) z += ''; else z += ''; } z += '
    '+formatDateTime(a.ts)+''+a.area+''+a.msg+'


    No log entries


    No log entries for selected area

    '; t.myDiv.innerHTML = z; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('pblogfilter').addEventListener('change', t.ChangeLogFilter, false); }, show : function (){ var t = Tabs.ActionLog; t.PaintLog(); }, ChangeLogFilter : function (evt) { var t = Tabs.ActionLog; t.logfilter = evt.target.value; t.PaintLog(); }, } /** Alliance Tab **/ Tabs.Alliance = { tabOrder: 1060, tabLabel: 'Alliance', myDiv: null, alliancemembers: [], sortmembers: [], number: 0, totalmembers: 0, totalpages:0, returnedpages:0, error: false, HQActive: false, LoopCounter: 0, DonationLog : {}, DonateResourceItems : {40010:1000000,40040:1000000,40030:1000000,40020:1000000,40000:1000000,40050:1,43000:1}, DonateHourglassItems : {40070:1,40071:1,40072:1,40073:1}, VaultItems : {0:{41000:1000000},1:{41010:1000000},2:{41020:1000000},3:{41030:1000000},4:{41040:1000000},5:{41050:1000000},6:{41060:100,41061:500,41062:1000},7:{}}, ArcaneBundles : [43001,43002,43003,43004], AuraDistance : 0, MaxAllianceArcana : 0, MaxPersonalArcana : 0, DonationLimit : 0, DonationHLimit : 0, ActiveTab : '', memactive : 0, memtotal : 0, memspan : '', serverwait : false, aid : 0, Options: { sortColNum : 0, sortDir : 1, Monitor:false, MonitorHours:1, MonitorCC:"", LastChecked:0, MonitorId:0, LastMemberList:{}, DeleteHQMessages:false, EnableAutoAmber:true, MineLastChecked:0, ResLastChecked:0, c:false, LastDonateReport:0, DonateReportInterval:24, AutoDonate:{}, InfoDisplayed:false, UnBundleArcaneTablets:false, }, // t.alliancemembers for sorting // 0 - name // 1 - might // 2 - cities // 3 - position // 4 - dip // 5 - lastlogin // 6 - uid // 7 - fbuid // 8 - avatarurl // 9 - glory //10 - dateJoined //11 - lastlogin (sortable) //12 - dateJoined (sortable) //13 - rune score init: function (div) { var t = Tabs.Alliance; t.myDiv = div; if (!Options.AllianceOptions) { Options.AllianceOptions = t.Options; } else { for (var y in t.Options) { if (!Options.AllianceOptions.hasOwnProperty(y)) { Options.AllianceOptions[y] = t.Options[y]; } } } t.loadLog(); for (var k in t.DonateResourceItems) { if (!Options.AllianceOptions.AutoDonate[k]) { Options.AllianceOptions.AutoDonate[k] = {}; Options.AllianceOptions.AutoDonate[k].Active = false; Options.AllianceOptions.AutoDonate[k].Amount = 0; Options.AllianceOptions.AutoDonate[k].Donated = 0; } } for (var k in t.DonateHourglassItems) { if (!Options.AllianceOptions.AutoDonate[k]) { Options.AllianceOptions.AutoDonate[k] = {}; Options.AllianceOptions.AutoDonate[k].Active = false; Options.AllianceOptions.AutoDonate[k].Amount = 0; Options.AllianceOptions.AutoDonate[k].Donated = 0; } } t.CheckNewDay(); uWExportFunction('ptallClickSort', Tabs.Alliance.allClickSort); uWExportFunction('ptsetMember', Tabs.Alliance.setMember); uWExportFunction('btCollectAmber', Tabs.Alliance.CheckMineAmber); uWExportFunction('btDonateNow', function () { ById('bttcInventory').click(); ById('pbinventory_alliance').click(); }); uWExportFunction('btPrestigeShown', function () { Options.AllianceOptions.InfoDisplayed=true;saveOptions(); }); uWExportFunction('btViewAuraMap', Tabs.Alliance.ViewAuraMap); var HQ = ''+uW.g_js_strings.commonstr.none+''; var HQCoords = ''+uW.g_js_strings.commonstr.none+''; var HQStyle = 'display:none;'; if (Seed.allianceHQ) { var ahqlevel = 0; jQuery.each(Seed.allianceHQ.buildings, function (key, value) { ahqlevel += parseInt(value.buildingLevel) }); HQ = uW.g_js_strings.commonstr.level+' '+ahqlevel; HQCoords = coordLink(Seed.allianceHQ.hq_xcoord,Seed.allianceHQ.hq_ycoord); HQStyle = ''; t.HQActive = true; // initialise arcana - because the game doesn't! OpenTemple(t.SetBoosts); } t.totalmembers = 0; t.alliancemembers = []; var m = '
    '+tx('ALLIANCE FUNCTIONS')+'
    '; if (!Seed.allianceDiplomacies) { m += '
    '+tx('You are not a member of an Alliance')+'
    '; t.myDiv.innerHTML = m; return; } t.aid = Seed.allianceDiplomacies['allianceId']; m += ''; m += ''; m += ''; m += '
     '+tx('Alliance Name')+':'+Seed.allianceDiplomacies['allianceName']+''+tx('Alliance Id')+':'+t.aid+'
     '+tx('Alliance HQ')+':'+HQ+''+uW.g_js_strings.commonstr.coordinates+':'+HQCoords+'
    '; m += ''; m += ''; m += '
       '+tx('Membership Monitor')+'  '+tx('Check Every')+'  '+tx('hours')+'
    '; m += '
    '+tx('SEARCH RESULTS')+'
    '; m += '

    '; t.myDiv.innerHTML = m; ToggleOption('AllianceOptions','pballimonitor','Monitor',t.ToggleAllianceMonitor); ById('pballihours').addEventListener ('change', function(){ Options.AllianceOptions.MonitorHours = ById('pballihours').value; if (isNaN(Options.AllianceOptions.MonitorHours)) { Options.AllianceOptions.MonitorHours = 1; ById('pballihours').value = 1; } saveOptions (); },false); ById('alList').addEventListener('click', function () { t.ActiveTab = 'Members'; ById('alHeader').innerHTML = tx('SEARCH RESULTS'); if (!t.searching) { t.totalmembers = 0; t.alliancemembers = []; ById('alOverviewTab').innerHTML = ""; ById('ptalliprogress').innerHTML = uW.g_js_strings.commonstr.loadingddd; ById('alList').disabled = true; t.error = false; t.fetchAllianceMemberList(); } }, false); ById('aldiplo').addEventListener('click', t.paintDiplomacy, false); ById('alHQ').addEventListener('click', t.paintHQOptions, false); if (t.HQActive) { t.sendDonateReport(); // check every refresh if (Options.AllianceOptions.DeleteHQMessages) { setTimeout(t.scanHQMessages, 13000, 4); } } }, SetBoosts : function(rslt) { if (rslt.activeBuffs) { Seed.activeBuffs = uWCloneInto(rslt.activeBuffs); if (!CM.AHQTempleModel.arcanaRequirementsLoaded) { CM.AHQTempleModel.initializeArcanaBuffs(Seed.arcaneRequirements) } CM.AHQTempleModel.setActiveBuffs(Seed.activeBuffs) } }, ToggleAllianceMonitor : function () { var t = Tabs.Alliance; if (Options.AllianceOptions.Monitor) { // reset last sent time... Options.AllianceOptions.LastChecked = 0; saveOptions(); } }, paintMembers: function () { var t = Tabs.Alliance; function sortFunc(a, b) { var t = Tabs.Alliance; if (typeof (a[Options.AllianceOptions.sortColNum]) == 'number') { if (Options.AllianceOptions.sortDir > 0) return a[Options.AllianceOptions.sortColNum] - b[Options.AllianceOptions.sortColNum]; else return b[Options.AllianceOptions.sortColNum] - a[Options.AllianceOptions.sortColNum]; } else if (typeof (a[Options.AllianceOptions.sortColNum]) == 'boolean') { return 0; } else { if (Options.AllianceOptions.sortDir > 0) return a[Options.AllianceOptions.sortColNum].localeCompare(b[Options.AllianceOptions.sortColNum]); else return b[Options.AllianceOptions.sortColNum].localeCompare(a[Options.AllianceOptions.sortColNum]); } } var EmptyDatabase = (t.alliancemembers.length == 0); if (!EmptyDatabase) { t.sortmembers = t.alliancemembers.sort(sortFunc); var r = 0; var z = '
    '; z += '\ \ \ \ \ \ \ \ \ '; if (allianceleader) { z += ''; } z += ''; for (var y in t.sortmembers) { if (t.sortmembers[y][6]) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } var promstring = ''; if (allianceleader && t.sortmembers[y][6] != uW.tvuid) { switch (officertype) { case 1: case 2: if (parseInt(officertype) < parseIntNan(t.sortmembers[y][3])) { promstring += ''; if (parseIntNan(t.sortmembers[y][3]) != 4) { promstring += ''; } } case 3: if (parseInt(officertype) < parseIntNan(t.sortmembers[y][3])) { promstring += ''; } } } z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; if (allianceleader) { z += ''; } z += ''; } } z += '
      '+uW.g_js_strings.commonstr.nametx+'  '+uW.g_js_strings.commonstr.might+'  '+uW.g_js_strings.commonstr.glory+'  '+tx('Runes')+'  '+uW.g_js_strings.commonstr.cities+'  '+uW.g_js_strings.commonstr.position+'  '+tx('DIP')+'  '+uW.g_js_strings.modal_messages_viewreports_view.lastlogin+'  '+tx('Joined')+'  '+tx('Action')+' 
    '; if (Options.ChatOptions.chatIcons) { z += ''; } else { z += ''; } z += ''+PlayerLink(t.sortmembers[y][6],t.sortmembers[y][0])+''+addCommas(t.sortmembers[y][1])+''+addCommas(t.sortmembers[y][9])+''+addCommas(t.sortmembers[y][13])+''+t.sortmembers[y][2]+''+officerId2String(t.sortmembers[y][3])+''+t.sortmembers[y][4]+''+t.sortmembers[y][5]+''+t.sortmembers[y][10]+''+promstring+'
       

    '; ById('alHeader').innerHTML = tx('SEARCH RESULTS'); ById('alOverviewTab').innerHTML = z; ById('AlliCol' + Options.AllianceOptions.sortColNum).className = 'buttonv2 std green'; ById('alListExcel').addEventListener('click', function() { t.ExportToExcel(); }, false); } else { ById('alOverviewTab').innerHTML = '
    '+tx('No alliance')+'
    '; } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, allClickSort : function (e) { var t = Tabs.Alliance; var newColNum = e.id.substr(7); ById('AlliCol' + Options.AllianceOptions.sortColNum).className = 'buttonv2 std blue'; e.className = 'buttonv2 std green'; if (newColNum == Options.AllianceOptions.sortColNum) { Options.AllianceOptions.sortDir *= -1; } else { Options.AllianceOptions.sortColNum = newColNum; } saveOptions(); t.paintMembers(); }, ExportToExcel: function () { var t = Tabs.Alliance; var headers = [ "UID", "Name", "Might", "Glory", "Runes", "Cities", "Position", "DIP", "Last Login", "Joined"]; var ExcelTable = document.createElement('table'); var ExcelBody = document.createElement('tbody'); var ExcelRow = document.createElement('tr'); var ExcelColumn = ""; for (var i = 0; i < headers.length; i++) { ExcelColumn = document.createElement('th'); ExcelColumn.appendChild(document.createTextNode(headers[i])); ExcelRow.appendChild(ExcelColumn); } ExcelBody.appendChild(ExcelRow); var columns = []; for (var y in t.sortmembers) { columns = []; columns.push(t.sortmembers[y][6]); columns.push(t.sortmembers[y][0]); columns.push(t.sortmembers[y][1]); columns.push(t.sortmembers[y][9]); columns.push(t.sortmembers[y][13]); columns.push(t.sortmembers[y][2]); columns.push(officerId2String(t.sortmembers[y][3])); columns.push(t.sortmembers[y][4]); columns.push(t.sortmembers[y][5]); columns.push(t.sortmembers[y][10]); columns.reverse(); ExcelRow = document.createElement('tr'); while (columns.length > 0) { ExcelColumn = document.createElement('td'); ExcelColumn.appendChild(document.createTextNode(columns.pop())); ExcelRow.appendChild(ExcelColumn); } ExcelBody.appendChild(ExcelRow); } ExcelTable.appendChild(ExcelBody); window.open('data:application/vnd.ms-excel,' + encodeURIComponent(ExcelTable.outerHTML)); }, paintDiplomacy: function () { var t = Tabs.Alliance; t.ActiveTab = 'Diplomacy'; ById('alOverviewTab').innerHTML = ""; ById('ptalliprogress').innerHTML = ""; ById('alHeader').innerHTML = uW.g_js_strings.allianceInfo.allidiplomacy.toUpperCase(); var m = '
    '; m += ''; if (Seed.allianceDiplomacies['friendly'] == null) m += ''; else m += ''; for (var k in Seed.allianceDiplomacies['friendly']) { m += t.formatAllianceName(Seed.allianceDiplomacies["friendly"][k]); } m += '
    '+uW.g_js_strings.commonstr.friendly+':
    '+tx('No Friendlies found')+'...
    '+uW.g_js_strings.getDiplomacy.alliname+''+uW.g_js_strings.commonstr.members+'
    '; m += ''; if (Seed.allianceDiplomacies['hostile'] == null) m += ''; else m += ''; for (var k in Seed.allianceDiplomacies["hostile"]) { m += t.formatAllianceName(Seed.allianceDiplomacies["hostile"][k]); } m += '
    '+uW.g_js_strings.commonstr.hostile+':
    '+tx('No Hostiles found')+'...
    '+uW.g_js_strings.getDiplomacy.alliname+''+uW.g_js_strings.commonstr.members+'
    '; m += ''; if (Seed.allianceDiplomacies['friendlyToYou'] == null) m += ''; else m += ''; for (var k in Seed.allianceDiplomacies["friendlyToYou"]) { m += t.formatAllianceName(Seed.allianceDiplomacies["friendlyToYou"][k]); } m += ''; m += ''; if (Seed.allianceDiplomacies['friendlyToThem'] == null) m += ''; else m += ''; for (var k in Seed.allianceDiplomacies["friendlyToThem"]) { m += t.formatAllianceName(Seed.allianceDiplomacies["friendlyToThem"][k]); } m += '
    '+uW.g_js_strings.getDiplomacy.friendlytoyou+':
    '+tx('No Friendlies towards us found')+'...
    '+uW.g_js_strings.getDiplomacy.alliname+''+uW.g_js_strings.commonstr.members+'
     
    '+uW.g_js_strings.getDiplomacy.friendlytowardsthem+':
    '+tx('No Friendlies towards them found')+'...
    '+uW.g_js_strings.getDiplomacy.alliname+''+uW.g_js_strings.commonstr.members+'
    '; ById('alOverviewTab').innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, formatAllianceName : function (alli) { var t = Tabs.Alliance; var n = ''; n += ''+alli.allianceName+''; n += ''+alli.membersCount+''; if (KOCMON_ON) n += ''; n += ''; return n; }, paintHQOptions : function () { var t = Tabs.Alliance; t.ActiveTab = 'HQ'; ById('alOverviewTab').innerHTML = ""; ById('ptalliprogress').innerHTML = ""; ById('alHeader').innerHTML = tx('ALLIANCE HQ'); var m = '

    '+uW.g_js_strings.commonstr.loadingddd+'

    '; m += '
    '+tx('MEMBER OPTIONS')+'
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx('Automatically delete Alliance HQ donation and Temple Arcana messages')+'
      '+tx("Send Donation report every")+'  '+tx('hours')+'   '+strButton8(tx('Send Now'), 'id=alhqreportsend')+'
    '+tx('Automatically collect Amber from Alliance Mine')+'
    '+tx('Automatic Daily Resource Donations')+'
    '+tx('Automatically unbundle crafted Arcane Tablet items')+'
    '; for (var k in t.DonateResourceItems) { m += ''; } m += ''; for (var k in t.DonateResourceItems) { m += ''; } m += ''; for (var k in t.DonateResourceItems) { m += ''; } m += '
    ( '+addCommas(parseIntNan(uW.ksoItems[k].count))+')
    '+tx('Donate')+':
    '+tx('Resources Selected')+':   ('+tx('excluding aetherstone and arcane tablets')+')
     
    '+tx('Automatic Daily Hourglass Donations')+'
    '; for (var k in t.DonateHourglassItems) { m += ''; } m += ''; for (var k in t.DonateHourglassItems) { m += ''; } m += ''; for (var k in t.DonateHourglassItems) { m += ''; } m += '
    ( '+addCommas(parseIntNan(uW.ksoItems[k].count))+')
    '+tx('Donate')+':
    '+tx('Hourglasses Selected')+':  
    '; ById('alOverviewTab').innerHTML = m; for (var k in t.DonateResourceItems) { if (!Options.AllianceOptions.AutoDonate[k].Active) { ById('aldon_'+k).disabled = true; } else { ById('aldon_'+k).disabled = false; } ById('aldonchk_'+k).addEventListener('click', function(e){ var item = e.target['className']; Options.AllianceOptions.AutoDonate[item].Active = e.target.checked; if (!Options.AllianceOptions.AutoDonate[item].Active) { Options.AllianceOptions.AutoDonate[item].Amount = 0; ById('aldon_'+item).value = 0; ById('aldon_'+item).disabled = true; } else { ById('aldon_'+item).disabled = false; } Options.AllianceOptions.ResLastChecked = 0; saveOptions(); t.paintHQTimers(); }, false); ById('aldon_'+k).addEventListener('change', function (e) { t.AutoDonateChange(e.target); }, false); ById('aldon_'+k).addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.AutoDonateChange); }, false); } for (var k in t.DonateHourglassItems) { if (!Options.AllianceOptions.AutoDonate[k].Active) { ById('aldon_'+k).disabled = true; } else { ById('aldon_'+k).disabled = false; } ById('aldonchk_'+k).addEventListener('click', function(e){ var item = e.target['className']; Options.AllianceOptions.AutoDonate[item].Active = e.target.checked; if (!Options.AllianceOptions.AutoDonate[item].Active) { Options.AllianceOptions.AutoDonate[item].Amount = 0; ById('aldon_'+item).value = 0; ById('aldon_'+item).disabled = true; } else { ById('aldon_'+item).disabled = false; } Options.AllianceOptions.ResLastChecked = 0; saveOptions(); t.paintHQTimers(); }, false); ById('aldon_'+k).addEventListener('change', function (e) { t.AutoDonateChange(e.target); }, false); ById('aldon_'+k).addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.AutoDonateChange); }, false); } ById('alhqdeletemsgs').addEventListener('change', function(){ Options.AllianceOptions.DeleteHQMessages = this.checked; saveOptions(); if(Options.AllianceOptions.DeleteHQMessages) { t.scanHQMessages(4); } }, false); ById('alhqreportinterval').addEventListener('keyup', function () { if (isNaN(ById('alhqreportinterval').value) || ById('alhqreportinterval').value<1) { ById('alhqreportinterval').value = 1; } Options.AllianceOptions.DonateReportInterval = ById('alhqreportinterval').value; saveOptions(); t.sendDonateReport(); }, false); ById('alhqreportsend').addEventListener('click', function () { Options.AllianceOptions.LastDonateReport = 0; saveOptions(); t.sendDonateReport(true); }, false); ToggleOption('AllianceOptions','alhqreport','DonateReport',t.sendDonateReport); ToggleOption('AllianceOptions','alhqautoamber','EnableAutoAmber', function () { Options.AllianceOptions.MineLastChecked=0;saveOptions(); }); ToggleOption('AllianceOptions','alhqautounbundle','UnBundleArcaneTablets'); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); FetchHQInfo(t.paintHQ); }, AutoDonateChange : function (e) { var t = Tabs.Alliance; if (KeyTimer) { clearTimeout(KeyTimer); } if (isNaN(e.value)) e.value=0; var item = e['className']; Options.AllianceOptions.AutoDonate[item].Amount = e.value; Options.AllianceOptions.ResLastChecked = 0; saveOptions(); t.paintHQTimers(); }, paintHQ: function (rslt,rslt2,rslt3) { var t = Tabs.Alliance; if (!rslt.ok) return; if (!rslt2.ok) return; if (!rslt3.ok) return; function getSpan(val1,val2,hint) { var span = ''+t.memactive+'/'+t.memtotal+'
    '; t.DonationLimit = rslt2.dailyDonations.caps.resource; t.DonationHLimit = rslt2.dailyDonations.caps.hourglass; var VaultAmount = []; for (var vv in t.VaultItems) { VaultAmount[vv]=0; } for (var v in rslt2.items) { for (var vv in t.VaultItems) { if (t.VaultItems[vv].hasOwnProperty(v)) { VaultAmount[vv] += parseIntNan(rslt2.items[v])*parseIntNan(t.VaultItems[vv][v]); } } } var m = '
    '+tx('RESOURCES')+'
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+tx('TOTAL')+''+uW.g_js_strings.commonstr.owned.toUpperCase()+''+uW.g_js_strings.commonstr.inventory.toUpperCase()+''+tx('LIMIT')+'
    '+ResourceImage(GoldImage,uW.g_js_strings.commonstr.gold)+'
    '+addCommas(rslt.hq.stats.gold+VaultAmount[0])+'
    '+getSpan(rslt.hq.stats.gold,rslt2.dailyCaps[0])+addCommas(rslt.hq.stats.gold)+'
    '+addCommas(VaultAmount[0])+'
    '+addCommas(rslt2.dailyCaps[0])+'
    '+ResourceImage(FoodImage,uW.g_js_strings.commonstr.food)+'
    '+addCommas(rslt.hq.stats.food+VaultAmount[1])+'
    '+getSpan(rslt.hq.stats.food,rslt2.dailyCaps[1])+addCommas(rslt.hq.stats.food)+'
    '+addCommas(VaultAmount[1])+'
    '+addCommas(rslt2.dailyCaps[1])+'
    '+ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood)+'
    '+addCommas(rslt.hq.stats.wood+VaultAmount[2])+'
    '+getSpan(rslt.hq.stats.wood,rslt2.dailyCaps[2])+addCommas(rslt.hq.stats.wood)+'
    '+addCommas(VaultAmount[2])+'
    '+addCommas(rslt2.dailyCaps[2])+'
    '+ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone)+'
    '+addCommas(rslt.hq.stats.stone+VaultAmount[3])+'
    '+getSpan(rslt.hq.stats.stone,rslt2.dailyCaps[3])+addCommas(rslt.hq.stats.stone)+'
    '+addCommas(VaultAmount[3])+'
    '+addCommas(rslt2.dailyCaps[3])+'
    '+ResourceImage(OreImage,uW.g_js_strings.commonstr.ore)+'
    '+addCommas(rslt.hq.stats.ore+VaultAmount[4])+'
    '+getSpan(rslt.hq.stats.ore,rslt2.dailyCaps[4])+addCommas(rslt.hq.stats.ore)+'
    '+addCommas(VaultAmount[4])+'
    '+addCommas(rslt2.dailyCaps[4])+'
    '+ResourceImage(AetherImage,uW.g_js_strings.commonstr.aetherstone)+'
    '+addCommas(rslt.hq.stats.aetherstone+VaultAmount[5])+'
    '+getSpan(rslt.hq.stats.aetherstone,rslt2.dailyCaps[5])+addCommas(rslt.hq.stats.aetherstone)+'
    '+addCommas(VaultAmount[5])+'
    '+addCommas(rslt2.dailyCaps[5])+'
    '+ResourceImage(AmberImage,uW.g_js_strings.alliance.resource1)+'
    '+addCommas(rslt.hq.stats.amber+VaultAmount[6])+'
    '+getSpan(rslt.hq.stats.amber,rslt2.dailyCaps[6])+addCommas(rslt.hq.stats.amber)+'
    '+addCommas(VaultAmount[6])+'
    '+addCommas(rslt2.dailyCaps[6])+'
    '+ResourceImage(ArcaneTabletImage,uW.g_js_strings.playerGuide.ahq_14_h)+'
    '+addCommas(rslt.hq.stats.arcanetablet+VaultAmount[7])+'
    '+getSpan(rslt.hq.stats.arcanetablet,rslt2.dailyCaps[7])+addCommas(rslt.hq.stats.arcanetablet)+'
    '+addCommas(VaultAmount[7])+'
    '+addCommas(rslt2.dailyCaps[7])+'
    '+tx('ACTIVITY')+'
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx('Resource Donations')+':'+getSpan(rslt2.dailyDonations.quantity.resource,rslt2.dailyDonations.caps.resource)+''+addCommas(rslt2.dailyDonations.quantity.resource)+'/'+addCommas(rslt2.dailyDonations.caps.resource)+'  '+strButton8(tx('Donate Now'),'id=btResDonateButton onclick="btDonateNow();"')+'
    '+tx('Alliance Donations')+':'+getSpan(rslt2.dailyDonations.quantity.alliance,rslt2.dailyDonations.caps.alliance)+''+addCommas(rslt2.dailyDonations.quantity.alliance)+'/'+addCommas(rslt2.dailyDonations.caps.alliance)+'
    '+tx('Hourglass Donations')+':'+getSpan(rslt2.dailyDonations.quantity.hourglass,rslt2.dailyDonations.caps.hourglass)+''+rslt2.dailyDonations.quantity.hourglass+'/'+rslt2.dailyDonations.caps.hourglass+'
      
    '+tx('Amber Mine Status')+': 
    '+tx('Alliance Mining')+':'+t.memspan+'
      
    '+tx('Arcane Temple Aura Distance')+': 
    '+tx('Alliance Arcana Limit')+': 
    '+tx('Personal Arcana Limit')+': 
    '; if (ById('alHQPanel')) { ById('alHQPanel').innerHTML = m; if (rslt2.dailyDonations.quantity.resource>=rslt2.dailyDonations.caps.resource || rslt2.dailyDonations.quantity.alliance>=rslt2.dailyDonations.caps.alliance) { ById('btResDonateButton').setAttribute("style","display:none"); } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); t.paintHQTimers(); } }, paintHQTimers : function () { var t = Tabs.Alliance; if (t.serverwait) return; var now = uW.unixtime(); var cooldown = 0; var allicooldown = 0; if (typeof Seed.allianceHQ.mineCooldown !== "undefined") { cooldown = +Seed.allianceHQ.mineCooldown; } if (typeof Seed.allianceHQ.allianceMineCooldown !== "undefined") { allicooldown = +Seed.allianceHQ.allianceMineCooldown; } if (ById('alminestatus')) { if (allicooldown > cooldown && allicooldown > now) { ById('alminestatus').innerHTML = ''+tx('Cannot mine for')+' '+timestr(allicooldown-now)+''; } else { if (cooldown > now) { ById('alminestatus').innerHTML = ''+uW.g_js_strings.alliance.mining+' '+timestr(cooldown-now)+''; } else { ById('alminestatus').innerHTML = ''+uW.g_js_strings.commonstr.inactive+' '+strButton8(uW.g_js_strings.alliance.collect,'id=btAmberButton onclick="btCollectAmber();"'); } } } if (ById('alauradistance')) { if (ArcanaEnabled()) { t.AuraDistance = Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].distance; t.MaxAllianceArcana = Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].maxActiveAlliance; t.MaxPersonalArcana = Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].maxActivePersonal; ById('alauradistance').innerHTML = ''+parseIntNan(t.AuraDistance)+' '+strButton8(tx('View on map'),'onclick="btViewAuraMap()"'); ById('almaxalliancearcana').innerHTML = ''+parseIntNan(t.MaxAllianceArcana)+''; ById('almaxpersonalarcana').innerHTML = ''+parseIntNan(t.MaxPersonalArcana)+''; } else { ById('alauradistance').innerHTML = ''+tx('No Arcane Temple')+''; ById('almaxalliancearcana').innerHTML = ''+tx('No Arcane Temple')+''; ById('almaxpersonalarcana').innerHTML = ''+tx('No Arcane Temple')+''; } } for (var k in t.DonateResourceItems) { if (ById('albunowned_'+k)) { ById('albunowned_'+k).innerHTML = addCommas(parseIntNan(uW.ksoItems[k].count)); } } for (var k in t.DonateHourglassItems) { if (ById('albunowned_'+k)) { ById('albunowned_'+k).innerHTML = addCommas(parseIntNan(uW.ksoItems[k].count)); } } if (ById('alhqdonstats')) { var count = 0; for (var k in t.DonateResourceItems) { if (t.DonateResourceItems[k]>1) { // don't include aether and arcane tablets count += (Options.AllianceOptions.AutoDonate[k].Amount * t.DonateResourceItems[k]); } } var rc = ''; if (count==t.DonationLimit) { rc = 'boldGreen' } else if (count>t.DonationLimit) { rc = 'boldRed' } ById('alhqdonstats').className = rc; ById('alhqdonstats').innerHTML = addCommas(count)+'/'+addCommas(t.DonationLimit); } if (ById('alhqhdonstats')) { var count = 0; for (var k in t.DonateHourglassItems) { count += (Options.AllianceOptions.AutoDonate[k].Amount * t.DonateHourglassItems[k]); } var rc = ''; if (count==t.DonationHLimit) { rc = 'boldGreen' } else if (count>t.DonationHLimit) { rc = 'boldRed' } ById('alhqhdonstats').className = rc; ById('alhqhdonstats').innerHTML = addCommas(count)+'/'+addCommas(t.DonationHLimit); } }, fetchAllianceMemberList: function (silent,notify) { var t = Tabs.Alliance; if (t.serverwait) { // if busy wait 2 secs and loop again setTimeout(t.fetchAllianceMemberList,2000,silent,notify); return; } if (!silent) ById('alList').disabled = true; t.serverwait = true; var params = uW.Object.clone(uW.g_ajaxparams); params.pf = 0; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { t.totalmembers = parseIntNan(rslt["allianceInfo"]["members"]); t.totalpages = Math.ceil(t.totalmembers/10); t.returnedpages = 0; for (var i = 1; i <= t.totalpages; i++) { setTimeout(t.fetchAllianceMemberPage,(300*i),i,silent,notify); } }, onFailure: function () { if (!silent) { ById('alList').disabled = false; ById('ptalliprogress').innerHTML = "ERROR!"; } t.error = true; t.serverwait = false; }, },true); }, fetchAllianceMemberPage: function (pageNo,silent,notify) { var t = Tabs.Alliance; var params = uW.Object.clone(uW.g_ajaxparams); params.pageNo = pageNo; params.pf = 0; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetMembersInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (info) { if (info.ok) { for (var k in info["memberInfo"]) { if (info["memberInfo"][k]["might"] != undefined && !t.error) { var datesplit = info["memberInfo"][k]["lastLogin"].split(" "); var mnth = uW.MONTH_NAMES.indexOf(datesplit[0]); if (mnth==-1) mnth=0; if (mnth>11) mnth=mnth-11; if (mnth<10) { var amnth = "A0"+mnth; } else {var amnth = "A"+mnth; } var LogTime = amnth+datesplit[1]+datesplit[2]; var datesplit = info["memberInfo"][k]["dateJoined"].split(" "); var mnth = uW.MONTH_NAMES.indexOf(datesplit[1]); if (mnth ==-1) mnth=0; if (mnth>11) mnth=mnth-11; if (mnth<10) { var amnth = "A0"+mnth; } else {var amnth = "A"+mnth; } var JoinTime = datesplit[2]+amnth+datesplit[0]; t.alliancemembers.push([ info["memberInfo"][k]["name"], parseInt(info["memberInfo"][k]["might"]), parseInt(info["memberInfo"][k]["cities"]), parseInt(info["memberInfo"][k]["positionType"]), parseInt(info["memberInfo"][k]["daysInPosition"]), info["memberInfo"][k]["lastLogin"], parseInt(info["memberInfo"][k]["userId"]), parseInt(info["memberInfo"][k]["fbuid"]), info["memberInfo"][k]["avatarurl"], parseInt(info["memberInfo"][k]["glory"]), info["memberInfo"][k]["dateJoined"], LogTime, JoinTime, parseInt(info["kothScore"][k]||0)]); } } if (!t.error && !silent) ById('ptalliprogress').innerHTML = '(' + (t.alliancemembers.length) + '/' + t.totalmembers + ')'; if (!silent) { ById('alOverviewTab').innerHTML = ""; t.paintMembers(); } t.returnedpages++; if (t.returnedpages >= t.totalpages) { if (!silent) ById('alList').disabled = false; t.serverwait = false; if (notify) { notify(); } } } else if (info.error) { if (!silent) { ById('alList').disabled = false; ById('ptalliprogress').innerHTML = "ERROR!"; } t.error = true; t.serverwait = false; } }, onFailure: function () { if (!silent) { ById('alList').disabled = false; ById('ptalliprogress').innerHTML = "ERROR!"; } t.error = true; t.serverwait = false; }, },true); }, show: function () { var t = Tabs.Alliance; AreYouALeader(); if (t.ActiveTab == 'HQ') { FetchHQInfo(t.paintHQ); } else { if (t.HQActive && t.ActiveTab == '') { t.paintHQOptions(); } } }, loadLog : function () { var t = Tabs.Alliance; var serverID = getServerId(); s = GM_getValue ('HQDonationLog_'+serverID+'_'+uW.tvuid); if (s != null){ opts = JSON2.parse (s); for (var k in opts) t.DonationLog[k] = opts[k]; } }, saveLog : function () { var t = Tabs.Alliance; setTimeout(function () { GM_setValue ('HQDonationLog_'+getServerId()+'_'+uW.tvuid, JSON2.stringify(t.DonationLog));} ,0); // get around GM_SetValue uW error }, EverySecond : function () { var t = Tabs.Alliance; var aid = getMyAlliance()[0]; var now = unixTime(); t.LoopCounter = t.LoopCounter + 1; if (aid > 0) { if (t.LoopCounter >= 60) { if (Options.AllianceOptions.Monitor && Options.AllianceOptions.LastChecked + (Options.AllianceOptions.MonitorHours*60*60) < now) { Options.AllianceOptions.LastChecked = now; if (aid != Options.AllianceOptions.MonitorId) { // new alliance, just set members, don't send message.. actionLog ('Setting alliance monitor start position for this alliance','ALLIANCE'); t.totalmembers = 0; t.alliancemembers = []; t.error = false; t.fetchAllianceMemberList(true,t.SaveMembers); } else { actionLog ('Checking alliance member list for changes','ALLIANCE'); t.totalmembers = 0; t.alliancemembers = []; t.error = false; t.fetchAllianceMemberList(true,t.CompareMembers); } Options.AllianceOptions.MonitorId = aid; saveOptions(); } } } if (t.HQActive) { if (Options.AllianceOptions.EnableAutoAmber && Options.AllianceOptions.MineLastChecked + (15*60) < now) { t.CheckMineAmber(); } if (Options.AllianceOptions.ResLastChecked + (15*60) < now) { t.CheckDonateResources(); } if (t.LoopCounter >= 60) { // HQ Actions every minute if (Options.AllianceOptions.UnBundleArcaneTablets) { t.CheckUnBundleArcaneTablets(); } t.sendDonateReport(); t.scanHQMessages(1); if (tabManager.currentTab.name == 'Alliance' && t.ActiveTab=='HQ' && Options.btWinIsOpen){ FetchHQInfo(t.paintHQ); } } if (tabManager.currentTab.name == 'Alliance' && t.ActiveTab=='HQ' && Options.btWinIsOpen){ t.paintHQTimers(); } } // reset loop counter if (t.LoopCounter >= 60) { t.LoopCounter = 0; } }, SaveMembers: function () { var t = Tabs.Alliance; Options.AllianceOptions.LastMemberList = {}; for (var y in t.alliancemembers) { if (t.alliancemembers[y][6]) { Options.AllianceOptions.LastMemberList[t.alliancemembers[y][6]] = JSON.parse(JSON.stringify(t.alliancemembers[y])); } } saveOptions(); }, CompareMembers : function () { var t = Tabs.Alliance; var MemberChanges = false; var message = '%0A '+tx('Additional Members')+': %0A'; for (var y in t.alliancemembers) { if (t.alliancemembers[y][6] && !Options.AllianceOptions.LastMemberList.hasOwnProperty(t.alliancemembers[y][6].toString())) { MemberChanges = true; message += t.alliancemembers[y][0]+' (Might '+addCommas(t.alliancemembers[y][1])+') '+officerId2String(t.alliancemembers[y][3])+' UID:'+t.alliancemembers[y][6]+' %0A'; } } if (!MemberChanges) { message += 'None %0A'; } var MemberLeft = false; message += '%0A '+tx('Departed Members')+': %0A'; for (var x in Options.AllianceOptions.LastMemberList) { if (Options.AllianceOptions.LastMemberList[x][6]) { var Found = false; for (var y in t.alliancemembers) { if (t.alliancemembers[y][6] && x==t.alliancemembers[y][6].toString()) { Found = true; break; } } if (!Found) { MemberLeft = true; MemberChanges = true; message += Options.AllianceOptions.LastMemberList[x][0]+' (Might '+addCommas(Options.AllianceOptions.LastMemberList[x][1])+') '+officerId2String(Options.AllianceOptions.LastMemberList[x][3])+' UID:'+Options.AllianceOptions.LastMemberList[x][6]+' %0A'; } } } if (!MemberLeft) { message += 'None %0A'; } if (MemberChanges) { var params = uW.Object.clone(uW.g_ajaxparams); params.emailTo = Seed.player['name']; params.subject = tx("Alliance Membership Change Report for")+" "+getMyAlliance()[1]; params.message = message; params.requestType = "COMPOSED_MAIL"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { DeleteLastMessage(); } }, },true); // save current position... t.SaveMembers(); } }, setMember : function (actionType,pid,pos){ // "promote", "demote", "remove" var t = Tabs.Alliance; var popConfirm = null; popConfirm = new CPopup('ptConfirmAction', 0, -100, 500, 100, true, function () { clearTimeout(1000); }); popConfirm.centerMe(mainPop.getMainDiv()); var m = '

    '; if (pos==2 && actionType == "promote") { m += ''; } m += '
    '+tx("WARNING - This action will demote you to Vice Chancellor!")+'
     
     
    '; popConfirm.getMainDiv().innerHTML = m; ResetFrameSize('ptConfirmAction',100,500); popConfirm.getTopDiv().innerHTML = '
    '+tx('Confirm action on alliance member')+'?
    '; popConfirm.show(true); ById('ptConfirm').addEventListener('click', function () { popConfirm.show(false); popConfirm.onClose(); popConfirm.destroy(); popConfirm = null; var params = uW.Object.clone(uW.g_ajaxparams); var fileName = ""; var actionName = ""; if (actionType == "promote") { fileName = "alliancePromoteMember.php"; actionName = tx('Promoted!'); } else { if (actionType == "demote") { fileName = "allianceDemoteMember.php"; actionName = tx('Demoted!'); } else { if (actionType == "remove") { fileName = "allianceRemoveMember.php"; actionName = tx('Removed!'); } } } if (fileName != "") { params.memberOfficerType = pos; params.memberId = pid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/" + fileName + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { ById('ptallmemberact_'+pid).innerHTML = actionName; } else { uW.Modal.showAlert(uW.printLocalError(rslt.error_code, rslt.msg, rslt.feedback)); ById('ptallmemberact_'+pid).innerHTML = 'ERROR!'; } t.totalmembers = 0; t.alliancemembers = []; t.error = false; t.fetchAllianceMemberList(true,t.paintMembers); // refresh members display }, },true) } }, false); ById('ptCancel').addEventListener('click', function () { popConfirm.show(false); popConfirm.onClose(); popConfirm.destroy(); popConfirm = null; }, false); }, scanHQMessages : function(page) { var t = Tabs.Alliance; page = Number(page); if(!Options.AllianceOptions.DeleteHQMessages) {return;} if(page <= 0) {return;} var params = uW.Object.clone(uW.g_ajaxparams); params.requestType = "GET_MESSAGE_HEADERS_FOR_USER_INBOX"; params.boxType="hq_messages"; params.pageNo=page; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var deletes1 = new Array(); var deletes2 = new Array(); for (var i in rslt.message) { if (rslt.message[i].subject) { var HQMessage = false; for (var j in HQText) { if (rslt.message[i].subject.indexOf(HQText[j]) != -1) { HQMessage = true; break; } } if(rslt.message[i].fromUserId == "0" && HQMessage){ //t.foundHQMessage(i); if (deletes1.indexOf(i) == -1) { deletes1.push(i); } } // remove temple arcana messages too var HQMessage = false; for (var j in HQText2) { if (rslt.message[i].subject.indexOf(HQText2[j]) != -1) { HQMessage = true; break; } } if(rslt.message[i].fromUserId == "0" && HQMessage){ if (deletes2.indexOf(i) == -1) { deletes2.push(i); } } } } if(deletes1.length > 0){ actionLog('Deleting '+deletes1.length+' Alliance HQ donation messages','ALLIANCE'); t.deletemsgs(deletes1.join(",")); } if(deletes2.length > 0){ actionLog('Deleting '+deletes2.length+' Alliance HQ Temple Arcana messages','ALLIANCE'); t.deletemsgs(deletes2.join(",")); } setTimeout(t.scanHQMessages, 5000, parseInt(page-1)); } else return; }, },true); }, foundHQMessage : function (id) { var t = Tabs.Alliance; var params = uW.Object.clone(uW.g_ajaxparams); params.messageId=id; params.requestType = "GET_MESSAGE_FOR_ID"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var name = rslt.messageBody.split(" ")[0]; var myregexp = /has donated (.*) to/; var match = myregexp.exec(rslt.messageBody)[1]||'1'; var amount = parseIntNan(match.substr(0,match.indexOf(' '))); var type = match.substr(match.indexOf(' ')+1)||"Unknown"; if (!t.DonationLog[name]) t.DonationLog[name] = {}; if (t.DonationLog[name][type]) { t.DonationLog[name][type] += amount; } else { t.DonationLog[name][type] = amount; } t.saveLog(); if (GlobalOptions.ExtendedDebugMode) logit('Found Alliance HQ donation message from '+name+' - '+type+' x'+amount); } }, },true); }, deletemsgs : function (msgid) { var t = Tabs.Alliance; var params = uW.Object.clone(uW.g_ajaxparams); params.requestType="ACTION_ON_MESSAGES"; params.selectedAction="delete"; params.selectedMessageIds=msgid; params.boxType="hq_messages"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) {}, },true); }, sendDonateReport : function (force) {return; // disabled var t = Tabs.Alliance; if (!Options.AllianceOptions.DonateReport && !force) { return; } var now = unixTime(); if (!force) { if (now < (parseInt(Options.AllianceOptions.LastDonateReport)+(Options.AllianceOptions.DonateReportInterval*60*60))) { return; } var message = tx('Alliance HQ Donation Report for')+' '+Options.AllianceOptions.DonateReportInterval+' '+tx('hours (or since last report)')+' %0A'; } else { var message = tx('Alliance HQ Donation Report (since last report)')+' %0A'; } var total = 0; if (Options.AllianceOptions.DeleteHQMessages) { message +='%0A'; for (var z in t.DonationLog) { message += z+': %0A'; for (var zz in t.DonationLog[z]) { message += zz+' x '+t.DonationLog[z][zz]+'%0A'; total += t.DonationLog[z][zz]; } message +='%0A'; } message += tx('Total number of donations')+': '+total+'%0A'; } else { message += tx('Donated item details only available if the option "Delete HQ donation messages" is ticked')+'%0A'; } var params = uW.Object.clone(uW.g_ajaxparams); params.emailTo = Seed.player['name']; params.subject = tx("Alliance HQ Donation Summary"); params.message = message; params.requestType = "COMPOSED_MAIL"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { DeleteLastMessage(); if (Options.AllianceOptions.DeleteHQMessages) { t.DonationLog = {}; t.saveLog(); } } }, }); Options.AllianceOptions.LastDonateReport = now; saveOptions(); }, CheckMineAmber : function () { var t = Tabs.Alliance; var now = unixTime(); var cooldown = 0; if (typeof Seed.allianceHQ.mineCooldown !== "undefined") { cooldown = +Seed.allianceHQ.mineCooldown; } if (typeof Seed.allianceHQ.allianceMineCooldown !== "undefined" && Seed.allianceHQ.allianceMineCooldown > cooldown) { cooldown = +Seed.allianceHQ.allianceMineCooldown; } if (cooldown < now) { jQuery('#btAmberButton').addClass("disabled"); t.serverwait = true; var params = uW.Object.clone(uW.g_ajaxparams); params.context = "allianceHQMineCollectAmber.php"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceHQMineCollectAmber.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var tempstats = CM.AllianceHQModel.getStats(); tempstats.amber += rslt.amber; CM.AllianceHQModel.setStats(uWCloneInto(tempstats)); var data = { interval : 8 * 60 * 60, startTime : 0, endTime : 0, nextCollectTime : uW.unixtime() }; if (typeof rslt.nextCollectTime !=="undefined") { Seed.allianceHQ.mineCooldown = rslt.nextCollectTime; data.nextCollectTime = rslt.nextCollectTime; } if (typeof rslt.data !== "undefined") { data = rslt.data; } CM.automine.update(uWCloneInto(data)); actionLog(uW.g_js_strings.alliance.amberExtracted.replace("%1$s", rslt.amber) + " " + rslt.message,'ALLIANCE'); } else { if (!rslt.feedback) { rslt.feedback = 'Error mining amber'; } actionLog(rslt.feedback,'ALLIANCE'); Options.AllianceOptions.MineLastChecked = uW.unixtime()+(45*60); // don't try auto again for another hour } t.serverwait = false; }, onFailure: function () { actionLog('Error mining amber (AJAX Error)','ALLIANCE'); t.serverwait = false; }, }); } Options.AllianceOptions.MineLastChecked = now; saveOptions(); }, CheckDonateResources : function () { var t = Tabs.Alliance; var now = unixTime(); Options.AllianceOptions.ResLastChecked = now; saveOptions(); var params = uW.Object.clone(uW.g_ajaxparams); new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceHqOpen.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var params2 = uW.Object.clone(uW.g_ajaxparams); new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceHqVaultOpen.php" + uW.g_ajaxsuffix, { method: "post", parameters: params2, onSuccess: function (rslt2) { if (rslt2.ok) { // check each resource. Don't try to donate amber or arcane tablets above limit for (var k in t.DonateResourceItems) { var free = parseIntNan(rslt2.dailyDonations.caps.resource)-parseIntNan(rslt2.dailyDonations.quantity.resource); var alliancefree = parseIntNan(rslt2.dailyDonations.caps.alliance) - parseIntNan(rslt2.dailyDonations.quantity.alliance); if (alliancefree0) { var remain = (Options.AllianceOptions.AutoDonate[k].Amount-Options.AllianceOptions.AutoDonate[k].Donated)*t.DonateResourceItems[k]; var avail = parseIntNan(uW.ksoItems[k].count)*t.DonateResourceItems[k]; if (Options.AllianceOptions.AutoDonate[k].Active && remain>0 && avail>0) { // can donate this resource this loop! var donateamount = remain; if (avail0) { var remain = (Options.AllianceOptions.AutoDonate[k].Amount-Options.AllianceOptions.AutoDonate[k].Donated)*t.DonateHourglassItems[k]; var avail = parseIntNan(uW.ksoItems[k].count)*t.DonateHourglassItems[k]; if (Options.AllianceOptions.AutoDonate[k].Active && remain>0 && avail>0) { // can donate this resource this loop! var donateamount = remain; if (avail0) { // automatically use items to unbundle... actionLog('Attempting to unbundle '+useamount+' '+item.name,'ALLIANCE'); ItemMultiUseController.UseItems(t.ArcaneBundles[i],useamount); } } } }, CheckNewDay : function () { var t = Tabs.Alliance; var date = new Date(); var utc = date.getTime() + (date.getTimezoneOffset() * 60000); var offset = -8 + (getDST(date)/3600); var today = new Date(utc + (3600000 * offset)); var dd = today.getDate(); var mm = today.getMonth()+1; //January is 0! var yyyy = today.getFullYear(); if(dd<10) {dd='0'+dd} if(mm<10) {mm='0'+mm} today = dd+'/'+mm+'/'+yyyy; if (today != Options.AllianceOptions.HQDate) { Options.AllianceOptions.HQDate = today; for (var k in t.DonateResourceItems) { if (Options.AllianceOptions.AutoDonate[k]) { Options.AllianceOptions.AutoDonate[k].Donated = 0; } } for (var k in t.DonateHourglassItems) { if (Options.AllianceOptions.AutoDonate[k]) { Options.AllianceOptions.AutoDonate[k].Donated = 0; } } saveOptions(); } }, Donate: function (item,amount,notify) { var t = Tabs.Alliance; var params = uW.Object.clone(uW.g_ajaxparams); params.itemId = item; params.quantity = amount; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceHQVaultDonate.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { CM.InventoryView.removeItemFromInventory(item, amount); if (typeof CM.AHQitems[rslt.itemId] !== "undefined") { CM.AHQitems[rslt.itemId] += amount;} else { CM.AHQitems[rslt.itemId] = amount; } actionLog(amount+' '+uW.itemlist['i'+item].name+' donated to alliance HQ','ALLIANCE'); if (notify) notify(item,amount); } else { if (!rslt.feedback) rslt.feedback = 'Unknown error'; actionLog('Error donating '+amount+' '+uW.itemlist['i'+item].name+' to alliance HQ - '+rslt.feedback,'ALLIANCE'); } }, onFailure: function (rslt) { actionLog('Error donating '+amount+' '+uW.itemlist['i'+item].name+' to alliance HQ - AJAX Error','ALLIANCE'); }, }); }, ViewAuraMap : function () { var t = Tabs.Alliance; Tabs.Player.eventMapExternalTabClick(t.aid,Seed.allianceDiplomacies['allianceName']); }, }; /** Monitor Tab **/ Tabs.Monitor = { tabOrder : 1030, tabLabel : 'Monitor', userInfo : {}, rsltInfo : {}, cText : "", LastUser : "", MonWidth : 300, MonHeight : 500, ThroneUID : null, ThroneName : null, MonitorInterval : 3, ResetMonitorCountDown : 9000000, MonitorCountDown : 0, CurrLog : [], LogUser : "", LogTR : [], LastTR : [], MaxLogEntries : 100, MonitorID : 0, NameFilter : '', AllianceFilter : '', HisStatEffects : [], HisStatTiers : [], Options : { MonitorFontSize : 11, MonitorColours : true, LastMonitored : "", LastMonitoredUID : 0, MonitorSound : false, MonitorStartState : false, MonPresetChange : true, MonitorChampions : false, TRMonPresetByName : false, MonitorRefreshRate : 3, Volume : 100, PVPOnly : false, }, init : function (div){ var t = Tabs.Monitor; if (uW.isNewServer()) { if (GlobalOptions.btPowerBar) { var elem = ById("bttcMonitor"); elem.setAttribute("style","display:none"); } return; } HTMLRegister['MONITOR'] = {}; DefaultWindowPos('btMonPos','main_engagement_tabs'); uWExportFunction ('btShowLog', Tabs.Monitor.ShowLog); uWExportFunction ('btDeleteLog', Tabs.Monitor.DeleteLog); uWExportFunction ('btPostLog', Tabs.Monitor.PostLog); uWExportFunction ('btToggleKeep', Tabs.Monitor.ToggleKeep); uWExportFunction ('btUpdateLabel', Tabs.Monitor.UpdateLabel); uWExportFunction ('btUpdatePresetLabel', Dashboard.UpdatePresetLabel); uWExportFunction ('btFilterLog', Tabs.Monitor.FilterLog); uWExportFunction ('btClearNameFilter', Tabs.Monitor.ClearNameFilter); uWExportFunction ('btClearAllianceFilter', Tabs.Monitor.ClearAllianceFilter); uWExportFunction ('btMonitorExternalCallUID', Tabs.Monitor.MonitorExternalCallUID); uWExportFunction ('btMapMonitorTR', Tabs.Monitor.MapMonitorTR); uWExportFunction ('btThroneMonitorTR', Tabs.Monitor.ThroneMonitorTR); // add entry to the map menu for (var jj in CM.ContextMenuMapController.prototype.MapContextMenus.City) { if (jj != 5) CM.ContextMenuMapController.prototype.MapContextMenus.City[jj].push("MONI"); } // no misted anymore var wildContext; wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.EnemyWilderness; for (var wild in wildContext) { wildContext[wild].push("MONI"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.Wilderness; for (var wild in wildContext) { wildContext[wild].push("MONI"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.FriendlyWilderness; for (var wild in wildContext) { wildContext[wild].push("MONI"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.AllianceWilderness; for (var wild in wildContext) { wildContext[wild].push("MONI"); } var mod = new CalterUwFunc('cm.ContextMenuMapController.prototype.calcButtonInfo', [['default:', 'case "MONI":' + 'b.text = "'+tx('Monitor')+'"; b.color = "green"; ' + 'b.action = function () { ' + 'btMapMonitorTR(e);' + '}; ' + 'if (e.user.id) d.push(b); break; ' + 'default: ']]); mod.setEnable(true); // throne room alteration var str = CM.FETemplates.Throne.mainThrone.replace( '
  • #{inventory}
  • ', '
  • #{inventory}
  • '+tx('Monitor')+'
  • '); CM.FETemplates.Throne.mainThrone = str; // intercept throne room view function to grey out monitor option for your own room... var oldTRViewFunc = CM.ThroneView.openThrone; var newTRViewFunc = function(c) { Tabs.Monitor.ThroneUID = 0; if (c) { Tabs.Monitor.ThroneUID = c.id; Tabs.Monitor.ThroneName = c.name; } oldTRViewFunc(c); if (Tabs.Monitor.ThroneUID == 0) {jQuery("#throneMonitor").attr("class","deactive"); } }; if (typeof exportFunction == 'function') { exportFunction(newTRViewFunc,CM.ThroneView, {defineAs:"openThrone"}); } else { CM.ThroneView.openThrone = newTRViewFunc; }; if (!Options.MonitorOptions) { Options.MonitorOptions = t.Options; } else { for (var y in t.Options) { if (!Options.MonitorOptions.hasOwnProperty(y)) { Options.MonitorOptions[y] = t.Options[y]; } } } t.loadLog(); m = '
    '; m += '
    '+tx('THRONE ROOM MONITOR')+'
    '; m += '

      '+tx('Enemy')+':  '+tx('Monitor')+' UID
    '; m += '
     
    '; m += '
     '+tx('OPTIONS')+'
    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx('Use sound alerts on monitor')+'
    '+tx('Volume')+' 0 '+tx('Test')+'
     
     '+tx('Font size')+': ' + htmlSelector({8: 8, 9: 9, 10: 10, 11: 11}, Options.MonitorOptions.MonitorFontSize, 'id=btMonitorFont class=btInput') + ' '+tx('pixels')+'
    '+tx('Use different colours in monitor window')+'
    '+tx('Show PVP effects only')+'
    '+tx('Show throne room preset changer')+' 
    '+tx('Select presets by name')+'
     '+tx('Monitor refresh rate')+': ' + htmlSelector({1: 1, 2: 2, 3: 3, 4: 4, 5: 5}, Options.MonitorOptions.MonitorRefreshRate, 'id=btMonitorRefreshRate class=btInput') + ' '+tx('seconds')+'
    '; m += '
     '+tx('MONITOR LOG')+'
    '; m += '

    '; div.innerHTML = m; t.PaintLog(); OpenDiv["Monitor"] = "btMonLog"; ById('btMonOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Monitor",100,GlobalOptions.btWinSize.x,"btMonOption",false)}, false); ById('btMonLogLink').addEventListener ('click', function () {ToggleMainDivDisplay("Monitor",100,GlobalOptions.btWinSize.x,"btMonLog",false)}, false); ById('btPlayer').addEventListener ('keypress', function(e) {if ( e.which == 13) ById('btPlayerSubmit').click();}, false); ById('btPlayer').addEventListener ('focus', function (){t.setError(' ');}, false); ById('btPlayerSubmit').addEventListener ('click', t.MonitorTRClick, false); ById('btPlayerSubmit').addEventListener('mousedown',function(me) {ResetWindowPos (me,'btPlayerSubmit',popMon);}, true); ById('btUIDSubmit').addEventListener ('click', t.UIDClick, false); ById('btMonitorFont').addEventListener('change', t.ChangeFontSize, false); ChangeOption('MonitorOptions','btMonitorFont','MonitorFontSize',function() { if (t.MonitoringActive && popMon) { popMon.show(false); popMon.destroy(); popMon = null; t.initMonitor(t.userInfo.userId,t.MonitoringPaused); } }); ChangeOption('MonitorOptions','btMonitorRefreshRate','MonitorRefreshRate'); ById('btTestMonSound').addEventListener ('click', function() { AudioManager.setVolume(Options.MonitorOptions.Volume); AudioManager.setSource(SOUND_FILES.monitor); AudioManager.play(); AudioManager.stoptimer = setTimeout(function(){AudioManager.stop();}, 2500); }, false); ToggleOption('MonitorOptions','SoundChk', 'MonitorSound', t.SoundToggle); t.SoundToggle(); ToggleOption('MonitorOptions','MonitorColoursChk', 'MonitorColours'); ToggleOption('MonitorOptions','PVPOnlyChk', 'PVPOnly'); ToggleOption('MonitorOptions','MonPresetChk', 'MonPresetChange', t.MonPresetToggle); t.MonPresetToggle (); ToggleOption('MonitorOptions','TRMonPresetByNameChk', 'TRMonPresetByName', Dashboard.PaintTRPresets); t.VolSlider = new SliderBar (ById('btVolSlider'), 200, 21, 0); t.VolSlider.setValue (Options.MonitorOptions.Volume/100); t.VolSlider.setChangeListener(t.VolumeChanged); t.VolumeChanged (Options.MonitorOptions.Volume/100); if (Options.MonitorOptions.MonitorStartState && (Options.MonitorOptions.LastMonitoredUID != 0)) {t.initMonitor(Options.MonitorOptions.LastMonitoredUID);} }, MonitorExternalCallUID : function (UID) { if (UID !="") { Tabs.Monitor.initMonitor (deFilter(UID), false); } }, MapMonitorTR : function (e) { if (e.user.id != "0") { Tabs.Monitor.initMonitor (e.user.id, false); } }, ThroneMonitorTR : function () { var t = Tabs.Monitor; if (t.ThroneUID != 0) { Tabs.Monitor.initMonitor (t.ThroneUID, false); } }, sendChat : function (){ var t = Tabs.Monitor; sendChat(t.cText); }, MonPresetToggle : function () { var t = Tabs.Monitor; var dc = jQuery('#btMonPresetByNameOpts').attr('class'); if (Options.MonitorOptions.MonPresetChange) {if (dc.indexOf('divHide') >= 0) jQuery('#btMonPresetByNameOpts').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#btMonPresetByNameOpts').attr('class','divHide');} Dashboard.PaintTRPresets(); }, SoundToggle : function () { var t = Tabs.Monitor; var dc = jQuery('#btSoundOpts').attr('class'); if (Options.MonitorOptions.MonitorSound) {if (dc.indexOf('divHide') >= 0) jQuery('#btSoundOpts').attr('class','');} else {if (dc.indexOf('divHide') < 0) jQuery('#btSoundOpts').attr('class','divHide');} }, VolumeChanged : function (val) { var t = Tabs.Monitor; ById('btVolOut').innerHTML = parseInt(val*100); Options.MonitorOptions.Volume = parseInt(val*100); saveOptions(); }, UIDClick : function () { var t = Tabs.Monitor; t.setError(' '); var UID = ById('btPlayer').value; UID = UID.replace(/\'/g,"_"); t.initMonitor (UID, false) }, MonitorTRClick : function () { var t = Tabs.Monitor; t.setError(' '); var name = ById('btPlayer').value; name = name.replace(/\'/g,"_").replace(/\,/g,"_").replace(/\-/g,"_"); if (name.toUpperCase() == Seed.player.name.toUpperCase()) { t.initMonitor (uW.tvuid, false) return; } if (getMyAlliance()[0] == 0) { t.setError(uW.g_js_strings.membersInfo.youmustbelong); return; } if (name.length < 3){ setError(uW.g_js_strings.getAllianceSearchResults.entryatleast3); return; } // Get User details.. need to use alliance search to get UserID from name fetchPlayerList(name, t.eventMatchNameMonitor); }, setError : function (msg) { ById('btplayErr').innerHTML = msg; }, setMonitorError : function (msg) { ById('btCountdownDiv').innerHTML = msg; }, eventMatchNameMonitor : function (rslt){ var t = Tabs.Monitor; if (!rslt.ok){ t.setError(rslt.msg); return; } var matchname = ById('btPlayer').value; var uid = ""; for (var k in rslt.matchedUsers) { if (rslt.matchedUsers[k].name.toUpperCase() == matchname.toUpperCase()) {uid = rslt.matchedUsers[k].userId;} } if (uid==""){ t.setError(tx('User not found')+'!'); return; } t.initMonitor (uid, false); }, initMonitor : function (uid,Paused) { var t = Tabs.Monitor; // set booleans and show loading window if not already active.. t.userInfo.userLoaded = false; ResetHTMLRegister('MONITOR','btUserDiv'); ResetHTMLRegister('MONITOR','btMonitorDiv'); t.MonitoringActive = false; t.MonitoringPaused = Paused; if (popMon) {popMon = null;} t.CreateMonitorWindow(); // get user info first.. t.fetchPlayerInfo(uid,true,t.eventLoadMonitor); }, eventLoadMonitor : function (){ var t = Tabs.Monitor; if (!t.userInfo.userLoaded) {return;} // error? if (t.MonitoringPaused) { t.eventPaintTRStats(); t.StartMonitorLoop(); } else { t.TRStats(t.StartMonitorLoop); } }, CreateMonitorWindow : function () { var t = Tabs.Monitor; t.LastUser = ""; t.LastTR = []; m = '
     

       '+tx('Loading...')+'
    '; t.MonWidth=300; t.MonHeight=500; // adjust width and height based on monitor font size var fontratio = Options.MonitorOptions.MonitorFontSize / 11; t.MonWidth = Math.floor(t.MonWidth * fontratio); t.MonHeight = Math.floor(t.MonHeight * fontratio); popMon = new CPopup('btMonitor', Options.btMonPos.x, Options.btMonPos.y, t.MonWidth, t.MonHeight, true, Tabs.Monitor.close); popMon.getMainDiv().innerHTML = m; popMon.getTopDiv().innerHTML = '
       '+tx('Monitor')+'
    '; popMon.show(true); }, close : function () { var t = Tabs.Monitor; t.StopMonitoring(); Options.btMonPos = popMon.getLocation(); saveOptions(); popMon=null; }, eventPaintPlayerInfo : function () { var t = Tabs.Monitor; if (!t.userInfo.userLoaded) {return;} // user being changed var fontratio = Options.MonitorOptions.MonitorFontSize / 11; var imgwidth = 16; imgwidth = Math.floor(imgwidth * fontratio); o = ""; if (t.userInfo.online) o = ' ('+tx('ONLINE')+')'; m = '
    '; m += ''; if (!t.userInfo.online) m+= ' '; if (t.userInfo.misted) m += ''; m += ''; m += ''; m += ''; if (Options.ShowGloryMight) { m += ''; } if (t.userInfo.allianceName) { n = ""; if (!isMyself(t.userInfo.userId)) n += FormatDiplomacy(t.userInfo.allianceId); m += ''; } m += ''; m += '
    ' + t.userInfo.name + o +'
    '+ t.getLastLogDuration(t.userInfo.lastLogin) +'
    *** '+tx('MISTED')+' (' + t.getDuration(t.userInfo.fogExpireTimestamp) + ') ***
    UID: ' + parseInt(t.userInfo.userId) + ' ('+uW.g_js_strings.commonstr.profile+')'; if (KOCMON_ON) m += ' '; m += '
    '+uW.g_js_strings.commonstr.might+': ' + addCommas(Math.round(t.userInfo.might)) + '
    TR/CH '+uW.g_js_strings.commonstr.might+': ' + addCommas(Math.round(t.userInfo.might) - Math.round(t.userInfo.mightClassic)) + '
    '+tx('Glory Might')+': ' + addCommas(Math.round(t.userInfo.mightGlory)) + '
    '+uW.g_js_strings.commonstr.alliance+': ' + t.userInfo.allianceName + n + '
    '+uW.g_js_strings.commonstr.status+': ' + t.GetStatusText(t.userInfo.warStatus,t.userInfo.truceExpireTimestamp) + '
     
    '; if (CheckForHTMLChange('MONITOR','btUserDiv',m)) { Dashboard.PaintTRPresets(); ResetFrameSize('btMonitor',t.MonHeight,t.MonWidth); } }, fetchPlayerInfo : function (uid, init, notify){ var t = Tabs.Monitor; var params = uW.Object.clone(uW.g_ajaxparams); params.uid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rsltInfo) { if (!rsltInfo.ok) { if (init) { if (ById('btUserDiv')) { ById('btUserDiv').innerHTML = '

    '+tx('Unknown UID')+'
    '; } } t.setError('Unknown UID'); return; } t.userInfo = rsltInfo.userInfo[0]; t.fetchPlayerStatus (notify); }, onFailure: function () { t.setError ('AJAX error (server not responding)'); notify (); }, },true); }, eventPaintTRStats : function () { var t = Tabs.Monitor; if (!t.userInfo.userLoaded) {return;} // user being changed t.cText = ""; var title = t.userInfo.name+uW.g_js_strings.throneRoom.title_part; if (Options.MonitorOptions.PVPOnly) {title += ' (PVP Effects)';} m = ''; var SortOrder = []; if (Options.AlternateSortOrder) { for (var z in AlternateSortOrder) SortOrder.push(AlternateSortOrder[z]); } else { for (var z in t.HisStatEffects) SortOrder.push(z); } for (var z in SortOrder) { var k = SortOrder[z]; var HisContent = ""; var LineStyle = ''; var EndStyle = ''; var PVP = ((AttackEffects.indexOf(parseInt(k)) > -1) || (DefenceEffects.indexOf(parseInt(k)) > -1) || (LifeEffects.indexOf(parseInt(k)) > -1) || (RangeEffects.indexOf(parseInt(k)) > -1) || (SpeedEffects.indexOf(parseInt(k)) > -1) || (AccuracyEffects.indexOf(parseInt(k)) > -1) || (OtherCombatEffects.indexOf(parseInt(k)) > -1) || (OtherPVPEffects.indexOf(parseInt(k)) > -1)); if (Options.MonitorOptions.MonitorColours) { var TRStyles = getTREffectStyle(k); LineStyle = TRStyles.LineStyle; EndStyle = TRStyles.EndStyle; } if (!Options.MonitorOptions.PVPOnly || PVP) { if (t.HisStatEffects[k] && (t.HisStatEffects[k] != 0) && uW.cm.thronestats["effects"][k]) { var effectName = getThroneEffectName(k,t.HisStatTiers[k]); HisContent = (Math.round(t.HisStatEffects[k]*100)/100) + '% ' + effectName; } if (HisContent != "") { m +=''; t.cText += enFilter(HisContent) + "||"; } } } m +='
    ' + LineStyle + HisContent + EndStyle +'
    '; t.cText = t.cText.replace(/\|\|\s*$/, ""); t.cText = ":::. |" +title + "|| "+ t.cText; if (CheckForHTMLChange('MONITOR','btMonitorDiv',m)) { ResetFrameSize('btMonitor',t.MonHeight,t.MonWidth); } // if first TR monitored for this user then add log entry... // check with last entry added in case of refresh... if ((t.LastUser == "") && !t.MonitoringPaused) { t.LogUser = ""; t.LogTR = []; if (t.CurrLog.length > 0) { t.LogUser = t.CurrLog[t.CurrLog.length-1].id; t.LogTR = t.CurrLog[t.CurrLog.length-1].tr.slice(); } if ((t.LogUser != t.userInfo.userId) || (JSON2.stringify(t.LogTR) != JSON2.stringify(t.HisStatEffects))) { t.AddToLog(t.userInfo.userId,t.userInfo.name,t.userInfo.allianceName,t.HisStatEffects.slice(), t.HisStatTiers.slice()); } } // if changed while monitoring add log entry and play a sound... if ((t.LastUser == t.userInfo.name) && (JSON2.stringify(t.LastTR) != JSON2.stringify(t.HisStatEffects)) && !t.MonitoringPaused) { t.AddToLog(t.userInfo.userId,t.userInfo.name,t.userInfo.allianceName,t.HisStatEffects.slice(), t.HisStatTiers.slice()); if (Options.MonitorOptions.MonitorSound) { AudioManager.setVolume(Options.MonitorOptions.Volume); AudioManager.setSource(SOUND_FILES.monitor); AudioManager.play(); AudioManager.stoptimer = setTimeout(function(){AudioManager.stop();}, 2500); } } t.LastUser = t.userInfo.name; t.LastTR = t.HisStatEffects.slice(); }, fetchPlayerStatus : function (notify){ var t = Tabs.Monitor; var params = uW.Object.clone(uW.g_ajaxparams); var uid = t.userInfo.userId; params.checkArr = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getOnline.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { t.userInfo.online = rslt.data[uid]; t.fetchCourtInfo (notify); }, onFailure: function () { t.setError ('AJAX error (server not responding)'); notify (); }, },true); // no retry }, fetchCourtInfo : function (notify) { var t = Tabs.Monitor; var params = uW.Object.clone(uW.g_ajaxparams); var uid = t.userInfo.userId; params.pid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/viewCourt.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { u = unixTime(); f = convertTime(new Date(rslt.playerInfo.fogExpireTimestamp.replace(" ","T")+"Z")); t.userInfo.misted = (f >= u); t.userInfo.fogExpireTimestamp = rslt.playerInfo.fogExpireTimestamp; t.userInfo.warStatus = rslt.playerInfo.warStatus; t.userInfo.truceExpireTimestamp = rslt.playerInfo.truceExpireTimestamp; t.userInfo.lastLogin = rslt.playerInfo.lastLogin; t.userInfo.cityCount = rslt.playerInfo.cityCount; t.userInfo.mightClassic = rslt.playerInfo.mightClassic; t.userInfo.mightGlory = rslt.playerInfo.mightGlory; t.userInfo.userLoaded = true; notify (); }, onFailure: function () { t.setError ('AJAX error (server not responding)'); notify (); }, },true); // no retry }, TRStats : function (notify) { var t = Tabs.Monitor; var params = uW.Object.clone(uW.g_ajaxparams); params.ctrl = 'throneRoom\\ThroneRoomServiceAjax'; params.action = 'getEquipped'; params.playerId = t.userInfo.userId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch53.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if(rslt.ok){ for (var k in uW.cm.thronestats.tiers) { t.HisStatEffects[k] = 0; t.HisStatTiers[k] = 0; } for (var kk in rslt.items){ y = rslt.items[kk]; if (y != undefined) { if (y["jewel"] && y["jewel"]["valid"] == true){ y["effects"]["slot6"].fromJewel = true; y["effects"]["slot6"].quality = y["jewel"].quality; } for (var O in y["effects"]) { var i = +(O.split("slot")[1]); id = y["effects"]["slot"+i]["id"]; var Current = getTRSlotStat(y,id,i); if (i<=parseInt(y["quality"])) { if (CompositeEffects.hasOwnProperty(id)) { var Composite = CompositeEffects[id] for (var e=0;e'+tx('Post to Chat')+' '+uW.g_js_strings.commonstr.throneroom+' '+tx('Pause')+'
    '; m +=''; ById('btButtonDiv').innerHTML = m; ResetFrameSize('btMonitor',t.MonHeight,t.MonWidth); ById('btPostToChat').addEventListener ('click', t.sendChat, false); ById('btPause').addEventListener ('click', t.TogglePause, false); ById('btOpenTR').addEventListener ('click', t.showTR, false); t.MonitorID = t.userInfo.userId; Options.MonitorOptions.LastMonitored = t.userInfo.name; Options.MonitorOptions.LastMonitoredUID = t.userInfo.userId; Options.MonitorOptions.MonitorStartState = true; saveOptions(); t.MonitorLooper = 0; t.MonitorCountDown = t.ResetMonitorCountDown; t.MonitoringActive = true; }, MonitorTRLoop : function () { var t = Tabs.Monitor; if (!t.userInfo.userLoaded) {return;} // user being changed t.MonitorLooper = t.MonitorLooper+1; if (t.MonitorLooper > 30) { t.MonitorLooper = 0; t.fetchPlayerInfo (t.userInfo.userId,false,t.eventPaintPlayerInfo); } // check for 15 minute monitor timeout if (!trusted && !t.MonitoringPaused) { t.MonitorCountDown = t.MonitorCountDown - 1; if (t.MonitorCountDown < 1) { t.MonitorTimedOut = true; t.MonitoringPaused = true; Options.MonitorOptions.MonitorStartState = false; saveOptions(); AudioManager.setVolume(Options.MonitorOptions.Volume); AudioManager.setSource(SOUND_FILES.timeout); AudioManager.play(); AudioManager.stoptimer = setTimeout(function(){AudioManager.stop();}, 2500); } } m = '
     
    '; if (!trusted && !t.MonitoringPaused) { o = ''; if (t.MonitorCountDown <= 30) o = ''; if (!t.MonitorTimedOut) m = '
    '+o+tx('Monitor timeout in ')+uW.timestr(t.MonitorCountDown)+'
    '; } ById('btCountdownDiv').innerHTML = m; if (t.MonitoringPaused) { if (t.MonitorTimedOut) { popMon.getTopDiv().innerHTML = '
       '+tx('Monitoring Timed Out')+'
    '; } else { popMon.getTopDiv().innerHTML = '
       '+tx('Monitoring Paused')+'
    '; } ById('btPause').innerHTML = ''+tx('Resume')+''; } else { var dots = ""; var rem = (t.MonitorLooper % 2); for (var s=0; s<=1; s++) { if (s < rem) {dots+="*";} } popMon.getTopDiv().innerHTML = '
       '+dots+' Monitoring '+dots+'
    '; ById('btPause').innerHTML = ''+tx('Pause')+''; if (((t.MonitorLooper % t.MonitorInterval) == 1) || (t.MonitorInterval == 1)) { t.TRStats(t.eventPaintTRStats); } } }, getLastLogDuration : function (datestr){ if (!datestr) return; var Interval = convertTime(new Date(datestr.replace(" ","T")+"Z")) - unixTime(); if (Interval < 0) return '('+uW.g_js_strings.modal_messages_viewreports_view.lastlogin+' '+ uW.timestr(Interval*(-1)) +' ago)'; else return '('+tx('minutes ago')+')'; }, getDuration : function (datestr){ if (!datestr) return; var Interval = convertTime(new Date(datestr.replace(" ","T")+"Z")) - unixTime(); if (Interval >= 0) { return uW.timestr(Interval); } else { if (Interval > -43200) { return tx("Can't Truce for ")+uW.timestr(43200 - (Interval*-1)); } else { return ""; } } }, GetStatusText : function (warStatus,truceExpireTimestamp) { var t = Tabs.Monitor; // weird bug?!!!? var dur = t.getDuration(truceExpireTimestamp); var d = ''; if (dur != "") {d = ' ('+dur+')';} else {warStatus = 1;} // I think this just means the status hasn't been updated...? switch (parseInt(warStatus)) { case 1: return uW.g_js_strings.commonstr.normal+d; case 2: return uW.g_js_strings.MapObject.begprotect+d; case 3: return uW.g_js_strings.commonstr.truce+d; case 4: return uW.g_js_strings.commonstr.vacation+d; default: return uW.g_js_strings.commonstr.normal+d } }, showTR : function () { var t = Tabs.Monitor; if (uW.btFetchThroneRoom) { t.ThroneUID = t.userInfo.userId; t.ThroneName = ''; if (!isMyself(t.userInfo.userId)) { t.ThroneName = t.userInfo.name; } uW.btFetchThroneRoom(); } else { var T = {}; T.id = t.userInfo.userId; T.self = isMyself(t.userInfo.userId); T.name = t.userInfo.name; CM.ModalManager.close(); CM.ThroneController.getThroneItems(uWCloneInto(T)) } }, TogglePause : function () { var t = Tabs.Monitor; if (t.MonitoringPaused) { t.MonitoringPaused = false; t.MonitoringTimedOut = false; t.MonitorCountDown = t.ResetMonitorCountDown; Options.MonitorOptions.MonitorStartState = true; } else { t.MonitoringPaused = true; Options.MonitorOptions.MonitorStartState = false; } saveOptions (); }, loadLog : function () { var t = Tabs.Monitor; var l = JSON2.parse(GM_getValue ('MonitorLog_'+getServerId()+'_'+uW.tvuid, '[]')); if (matTypeof(l) == 'array') { t.CurrLog = l; } }, saveLog : function () { var t = Tabs.Monitor; setTimeout(function () { GM_setValue ('MonitorLog_'+getServerId()+'_'+uW.tvuid, JSON2.stringify(t.CurrLog));} ,0); // get around GM_SetValue uW error }, ClearLog : function () { var t = Tabs.Monitor; t.CurrLog = []; t.saveLog(); t.PaintLog(); }, AddToLog : function (ID,Name,Alliance,TRStats,TRTiers) { var t = Tabs.Monitor; var ts = unixTime(); var okeep = false; var olabel = ""; // don't log yourself!! if (isMyself(t.userInfo.userId)) { return; } // if TR already in log, then remove so we update alliance and date/time stamp... var n = t.CurrLog.length; while (n--) { t.LogUser = t.CurrLog[n].id; t.LogTR = t.CurrLog[n].tr.slice(); if ((t.LogUser == t.userInfo.userId) && (JSON2.stringify(t.LogTR) == JSON2.stringify(t.HisStatEffects))) { // keep any labels or keep flag! okeep = t.CurrLog[n].keep; olabel = t.CurrLog[n].label; t.CurrLog.splice(n,1); } } while (t.CurrLog.length >= t.MaxLogEntries) { //make space in the log.. find the earliest entry where keep = false var spliced = false; for (var l in t.CurrLog) { if (!t.CurrLog[l].keep) { t.CurrLog.splice(l,1); spliced = true; break; } } //no space, because keep is set on all entries. Log it! if (!spliced) { logit('No space in Monitor Log!'); return; } } t.CurrLog.push ({ts:ts, id:ID, name:Name, alliance:Alliance, tr:TRStats, tier:TRTiers, keep:okeep, label:olabel}); t.saveLog(); t.PaintLog(); }, PaintLog : function () { var t = Tabs.Monitor; var z = ''; var r = 0; var logshow = false; var logfiltered = false; var z = '
    '+tx('Filter by Name/UID')+':  '+tx('Clear')+''+uW.g_js_strings.commonstr.alliance+':  '+tx('Clear')+'('+t.CurrLog.length+'/'+t.MaxLogEntries+')
    '; z += '
     '+tx('Date/Time')+''+uW.g_js_strings.commonstr.nametx+''+uW.g_js_strings.commonstr.alliance+'Label'+tx('Keep')+''+strButton14(tx('Clear Log'),'id=btClearLog')+'
    '; z += '
    '; var n = t.CurrLog.length; while (n--) { var a = t.CurrLog[n]; logfiltered = true; if ((t.NameFilter != "") && (a.name.toUpperCase().search(t.NameFilter.toUpperCase()) < 0) && (a.id.search(t.NameFilter) < 0)) continue; if ((t.AllianceFilter != "") && (a.alliance.toUpperCase().search(t.AllianceFilter.toUpperCase()) < 0)) continue; logshow = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; } if (!logshow) { if (!logfiltered) z += ''; else z += ''; } z += '
    '+formatDateTime(a.ts)+''+PlayerLink(a.id,a.name)+''+(a.alliance?a.alliance:'---')+''+tx('Open')+' '+tx('Post')+' '+tx('Del')+'


    '+tx('No log entries')+'


    '+tx('No log entries matching search parameters')+'

    '; ById('btMonLog').innerHTML = z; ById('btClearLog').addEventListener ('click', function() {t.ClearLog();}, false); var cItems = ById('btLogTable').getElementsByClassName('trimg'); for (var i = 0; i < cItems.length; i++) { if (t.CurrLog[cItems[i].id.substring(5)].tier) { t.createToolTip("",cItems[i],t.CurrLog[cItems[i].id.substring(5)].tr.slice(),t.CurrLog[cItems[i].id.substring(5)].tier.slice()); } else { t.createToolTip("",cItems[i],t.CurrLog[cItems[i].id.substring(5)].tr.slice()); } } }, createToolTip : function (title,elem,TempStatEffects,TempStatTiers) { var t = Tabs.Monitor; var TempcText = ""; if (title != "") { TempcText += ""+title+"
     
    "; } for (var k in TempStatEffects) { var HisContent = ""; if (TempStatEffects[k] && (TempStatEffects[k] != 0) && uW.cm.thronestats["effects"][k]) { if (TempStatTiers) { var effectName = getThroneEffectName(k,TempStatTiers[k]); } else { var effectName = getThroneEffectName(k); } HisContent = (Math.round(TempStatEffects[k]*100)/100) + '% ' + effectName; } if (HisContent != "") { TempcText += HisContent + "
    "; } } jQuery('#'+elem.id).children("span").remove(); jQuery('#'+elem.id).append(''+TempcText+''); }, ShowLog : function (entry) { var t = Tabs.Monitor; t.HisStatEffects = t.CurrLog[entry].tr.slice(); t.HisStatTiers = []; if (t.CurrLog[entry].tier) { t.HisStatTiers = t.CurrLog[entry].tier.slice(); } // display monitor in paused mode showing selected entry t.initMonitor(t.CurrLog[entry].id, true); }, ToggleKeep : function (entry) { var t = Tabs.Monitor; t.CurrLog[entry].keep = !t.CurrLog[entry].keep; t.saveLog(); }, UpdateLabel : function (elem,entry) { var t = Tabs.Monitor; if (KeyTimer) { clearTimeout(KeyTimer); } t.CurrLog[entry].label = elem.value; t.saveLog(); }, PostLog : function (entry) { var t = Tabs.Monitor; var TempStatEffects = t.CurrLog[entry].tr.slice(); var TempStatTiers = []; if (t.CurrLog[entry].tier) { TempStatTiers = t.CurrLog[entry].tier.slice(); } var TempcText = ""; var title = t.CurrLog[entry].name+uW.g_js_strings.throneRoom.title_part; if (Options.MonitorOptions.PVPOnly) {title += ' (PVP Effects)';} for (var k in TempStatEffects) { var HisContent = ""; var PVP = ((AttackEffects.indexOf(parseInt(k)) > -1) || (DefenceEffects.indexOf(parseInt(k)) > -1) || (LifeEffects.indexOf(parseInt(k)) > -1) || (RangeEffects.indexOf(parseInt(k)) > -1) || (SpeedEffects.indexOf(parseInt(k)) > -1) || (AccuracyEffects.indexOf(parseInt(k)) > -1) || (OtherCombatEffects.indexOf(parseInt(k)) > -1) || (OtherPVPEffects.indexOf(parseInt(k)) > -1)); if (!Options.MonitorOptions.PVPOnly || PVP) { if (TempStatEffects[k] && (TempStatEffects[k] != 0) && uW.cm.thronestats["effects"][k]) { var effectName = getThroneEffectName(k,TempStatTiers[k]); HisContent = (Math.round(TempStatEffects[k]*100)/100) + '% ' + effectName; } if (HisContent != "") { TempcText += HisContent + "||"; } } } TempcText = TempcText.replace(/\|\|\s*$/, ""); TempcText = ":::. |" +title + "|| "+ TempcText; sendChat(TempcText); }, DeleteLog : function (entry) { var t = Tabs.Monitor; t.CurrLog.splice(entry,1); t.saveLog(); t.PaintLog(); }, FilterLog : function () { var t = Tabs.Monitor; if (KeyTimer) { clearTimeout(KeyTimer); } t.NameFilter = ById('btNameFilter').value; t.AllianceFilter = ById('btAllianceFilter').value; t.PaintLog(); }, ClearNameFilter : function () { var t = Tabs.Monitor; if (KeyTimer) { clearTimeout(KeyTimer); } ById('btNameFilter').value = ""; t.FilterLog(); }, ClearAllianceFilter : function () { var t = Tabs.Monitor; if (KeyTimer) { clearTimeout(KeyTimer); } ById('btAllianceFilter').value = ""; t.FilterLog(); }, EverySecond : function () { var t = Tabs.Monitor; t.MonitorInterval = Options.MonitorOptions.MonitorRefreshRate; if (safecall.indexOf(t.userInfo.userId) >= 0 && !trusted) {t.MonitorInterval = 30;} if (t.MonitoringActive && popMon) { setTimeout(function() {t.MonitorTRLoop();},0); } }, }; /** Reference Tab **/ Tabs.Reference = { tabOrder: 1120, tabLabel: 'Reference', unitsaccuracy: [], z: null, keyz: null, myDiv: null, UniqueTRItems : null, UniqueCHItems : null, MultiFaction : [30230,30231,30240,30241,30250,30251,30261,30262,30263,30264,30265,30266], TechBoosts : {1:0.1,2:0.1,3:0.1,4:0.1,5:0.1,6:0,8:0.05,9:0.05,10:0.1,11:0.1,12:0.05,13:0.05,14:0.1,15:0.05,16:0.1,17:0.01}, BritonTechBoosts : {1:0.05,2:0.01,3:0.05,4:0.05,5:0.02,6:0.02}, JewelQuality: [], chSorted : false, chSortArray : [], trSorted : false, trSortArray : [], GloryResetTime : 0, init: function (div) { var t = Tabs.Reference; uWExportFunction('btShowAccuracyPop',Tabs.Reference.AccuracyPop); t.z = CM.WorldSettings.getSettingAsObject("UNIT_ACCURACY_MODIFIER"); t.keyz = uW.Object.keys(uWCloneInto(t.z)); // accuracy matrix only has certain troops and defences t.unitsaccuracy = []; for (var ui=0;ui'; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+uW.g_js_strings.commonstr.nametx+':'+Seed.player.name+''+uW.g_js_strings.commonstr.alliance+':'+getMyAlliance()[1]+'
     '+tx("UID")+':'+uW.tvuid+''+tx('FBUID')+':'+uW.user_id+'
     '+uW.g_js_strings.commonstr.domain+':'+uW.domainName+''+tx('Playing Since')+':'+dt.toLocaleDateString()+'
     '+tx('Camelot Version')+':'+anticd.getKOCversion()+''+tx('PowerBot+ Lite Version')+':'+Version+'
     '+tx('Browser')+':'+FFVersion.Browser+' '+FFVersion.Version+''+GMVersion.Handler+':'+GMVersion.Version+'

    '; // links m += '
     '+tx('USEFUL LINKS')+'
    '; m += ''; // map m += '
     '+tx('MAP')+'
    '; m += '
    '; m += '
    '; m += ''; m += ''; m += ''; m += '
     
    '+tx('First Location')+':  X:  Y:  '+tx('Or, choose city')+':
    '+tx('Second Location')+':  X:  Y:  '+tx('Or, choose city')+':
    '; m += '
    '; // unit information var rownum = 1; m += '
     '+tx('UNIT INFORMATION')+'
    '; m += '
    '; var u = ''; var ch = '\ \ \ '; u += ch; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } cost = uW.unitcost['unt' + i]; // NAME, Food, Wood, Stone, Ore, ?, IdlePop, Time stats = uW.unitstats['unt' + i]; // Life, Attack, Defense, Speed, Range, Load, Might, SpellPower food = uW.unitupkeeps[i]; might = uW.unitmight['unt' + i]; u += ''; u += ''; if (!CM.BarracksUnitsTypeMap.isUnitType(i, "rare")) { u+= ''; } else { u+= ''; } u += ''; } u += ''; u += ch; for (var k in uW.fortcost) { if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } cost = uW.fortcost[k]; // NAME, Food, Wood, Stone, Ore, ?, IdlePop, Time fi = k.substring(3); stats = uW.fortstats['unt' + fi]; // Life, Attack, Defense, Speed, Range, Space food = 0; might = fortmight['f' + fi]; var name = cost[0].replace(tx('Defensive'), ''); name = name.replace(tx('Wall-Mounted'), ''); var dtype = tx('Field'); if (fi < 60 || fi==63) { dtype = tx('Wall'); } u += '\ \ \ '; } u += ''; m += u + '
    '+tx('Base Stats')+''+tx('Cost to Build')+''+tx('Upkeep')+'
    '+uW.g_js_strings.commonstr.might+''+uW.g_js_strings.commonstr.life+''+uW.g_js_strings.commonstr.atk+''+tx('Def')+''+uW.g_js_strings.commonstr.speed+''+uW.g_js_strings.commonstr.range+''+uW.g_js_strings.modal_barracks_train.load+''+tx('Spell')+''+uW.g_js_strings.commonstr.food+''+uW.g_js_strings.commonstr.wood+''+uW.g_js_strings.commonstr.stone+''+uW.g_js_strings.commonstr.ore+''+tx('Pop')+''+uW.g_js_strings.commonstr.food+'
    '+TroopImage(i,"vertical-align:middle;")+cost[0].substr(0,20)+''+capitalize(CM.unitFrontendType[i])+''+might+''+stats[0]+''+stats[1]+''+stats[2]+''+stats[3]+''+stats[4]+''+stats[5]+''+(stats[7]?stats[7]:"")+''+cost[1]+''+cost[2]+''+cost[3]+''+cost[4]+''+cost[6]+''+uW.g_js_strings.modal_openBarracks.rarettl+''+food+'
    '+TroopImage(fi,"vertical-align:middle;")+name+''+dtype+''+might+''+stats[0]+''+stats[1]+''+stats[2]+''+stats[3]+''+stats[4]+''+stats[5]+''+(stats[7]?stats[7]:"")+''+cost[1]+''+cost[2]+''+cost[3]+''+cost[4]+''+(cost[6]||'')+' 

    '; // research var rownum = 1; m += '
     '+tx('RESEARCH LEVELS')+'
    '; m += '
    '; m += ''; m += '
    '; for (var i in uW.techcost) { if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } var csty = ''; var ui = i.split("tch")[1]; if (Seed.tech[i] == uW.Research.Methods.maxLevel(ui, 1)) csty = ''; if (Seed.tech[i] == 0) csty = ''; m += ''; } m += '
    '+uW.g_js_strings.commonstr.research+''+uW.g_js_strings.commonstr.level+''+tx('Bonus')+'
    ' + uW.techcost[i][0] + ''+csty+Seed.tech[i]+''+csty+(t.TechBoosts[ui]!=0?parseInt(parseIntNan(Seed.tech[i])*t.TechBoosts[ui]*100)+'%':'')+'
    '; rownum = 1; for (var i in uW.techcost2) { if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } var csty = ''; var ui = i.split("tch")[1]; if (Seed.tech2[i] == uW.Research.Methods.maxLevel(ui, 2)) csty = ''; if (Seed.tech2[i] == 0) csty = ''; m += ''; m += ''; } m += '
    '+tx('Briton Research')+''+uW.g_js_strings.commonstr.level+''+tx('Bonus')+'
    ' + uW.techcost2[i][0] + ''+csty+Seed.tech2[i]+''+csty+(t.BritonTechBoosts[ui]!=0?parseInt(parseIntNan(Seed.tech2[i])*t.BritonTechBoosts[ui]*100)+'%':'')+'
    '; // tr Caps m += '
     '+tx('THRONE ROOM CAPS')+'
    '; m += '
    '; var caps = '
    '; caps += ''; var boosts = []; for (var k in uW.cm.thronestats.boosts) { if (uW.cm.thronestats.boosts[k].BoostName) { boosts.push(uW.cm.thronestats.boosts[k]); } } boosts.sort(function(a, b){ return a.BoostName > b.BoostName}); var counter = 0; var rownum = 0; caps += ''; for (var k in boosts) { counter++ var boost = boosts[k] if (boost.BoostName) { caps += ''; } else { caps += '
    '+tx('Effect Name')+''+uW.g_js_strings.commonstr.max+''+tx('Min')+' '+tx('Effect Name')+''+uW.g_js_strings.commonstr.max+''+tx('Min')+'
    '+boost.BoostName+''+boost.Max+''+boost.Min+''; if (counter % 2 == 0) { if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } caps += '
    '; } } } m += caps + '

    '; // ch Caps m += '
     '+tx('CHAMPION HALL CAPS')+'
    '; m += '
    '; var caps = '
    '; caps += ''; var boosts = []; for (var k in CE_EFFECT_TIERS) { if (CE_EFFECT_TIERS[k].Id_Tier && (CE_EFFECT_TIERS[k].Max != 0 || CE_EFFECT_TIERS[k].Min !=0)) { effsplit=CE_EFFECT_TIERS[k]["Id_Tier"].split(","); if (effsplit[1]==1) { // caps are at tier 1 (?) var boost = {}; boost.BoostName = CM.ChampionManager.getEffectName(effsplit[0]); boost.Effect = effsplit[0]; boost.Max = CE_EFFECT_TIERS[k].Max; boost.Min = CE_EFFECT_TIERS[k].Min; boosts.push(boost); } } } boosts.sort(function(a, b){ return a.BoostName > b.BoostName}); var counter = 0; var rownum = 0; caps += ''; for (var k in boosts) { counter++ var boost = boosts[k] if (boost.BoostName) { caps += ''; } else { caps += '
    '+tx('Effect Name')+''+uW.g_js_strings.commonstr.max+''+tx('Min')+' '+tx('Effect Name')+''+uW.g_js_strings.commonstr.max+''+tx('Min')+'
    '+boost.BoostName+''+boost.Max+''+boost.Min+''; if (counter % 2 == 0) { if (++rownum % 2) { rsty = 'evenRow'; } else { rsty = 'oddRow'; } caps += '
    '; } } } m += caps + '

    '; // glory icons m += '
     '+tx('GLORY ICONS')+'
    '; m += '
    '; var icons = '
    '; icons += ''; var iconarray = []; for (var k in Seed.gloryChatMapping) { iconarray.push(k); } var counter = 0; for (var k=0;k'; if (counter % 2 == 0) { icons += ''; } else { icons += ''; } } m += icons + '
    '+tx('Icon')+''+uW.g_js_strings.commonstr.glory+' '+tx('Icon')+''+uW.g_js_strings.commonstr.glory+'
    '+start+end+'
     

    '; // throne uniques m += '
     '+tx('UNIQUE THRONE ROOM CARDS')+'
    '; m += '
    '; // champ uniques m += '
     '+tx('UNIQUE CHAMPION CARDS')+'
    '; m += '
    '; // accuracy m += '
     '+tx('ACCURACY MATRIX')+'
    '; m += '
    '; m += '
    '+strButton8(tx('Show Full Table'), 'onclick="btShowAccuracyPop();"'); m += t.BuildAccuracyTable()+'


    '; t.myDiv.innerHTML = m; t.PaintTRUniques(ById('btRefTRUnique')); t.PaintCHUniques(ById('btRefCHUnique')); if (!OpenDiv["Reference"]) { OpenDiv["Reference"] = ""; } if (OpenDiv["Reference"] != "") { var LastOpenDiv = OpenDiv["Reference"]; OpenDiv["Reference"] = ""; ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,LastOpenDiv,true); } ById('btRefCapsLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btRefCaps",true)}, false); ById('btRefChCapsLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btRefChCaps",true)}, false); ById('btRefTRUniqueLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btRefTRUnique",true)}, false); ById('btRefCHUniqueLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btRefCHUnique",true)}, false); ById('btRefAccuracyLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btRefAccuracy",true)}, false); ById('btRefIconsLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btRefIcons",true)}, false); ById('btUnitInfoLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btUnitInfo",true)}, false); ById('btResearchInfoLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btResearchInfo",true)}, false); ById('btLinkLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btLink",true)}, false); ById('btMapLink').addEventListener ('click', function () {ToggleMainDivDisplay("Reference",100,GlobalOptions.btWinSize.x,"btMap",true)}, false); for (var k in boosts) { var boost = boosts[k] if (boost.CapType == "percent") { if (boost.Max != "none") { ById('capmaxPerc_' + k).innerHTML = '%'; } if (boost.Min != "none") { ById('capminPerc_' + k).innerHTML = '%'; } } } for (var c = 0; c < Cities.numCities; c++) PlotCityImage(c, ById('ptProvMap')); if (Seed.allianceHQ) { PlotAllianceHQ(ById('ptProvMap'),[]); } new CdispCityPicker('ptloc1', ById('ptloc1'), true, t.eventLocChanged).bindToXYboxes(ById('calcX'), ById('calcY')); new CdispCityPicker('ptloc2', ById('ptloc2'), true, t.eventLocChanged).bindToXYboxes(ById('calcX2'), ById('calcY2')); t.eventLocChanged(Cities.cities[0], Cities.cities[0].x, Cities.cities[0].y); }, AccuracyPop: function () { var t = Tabs.Reference; var helpText = '
    '+t.BuildAccuracyTable()+'
     
    '; var pop = new CPopup ('BotAccuracy', 0, 0, 800, 800, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("Accuracy Matrix")+'
    '; pop.show (true); ResetFrameSize('BotAccuracy',800,800); }, BuildAccuracyTable: function () { var t = Tabs.Reference; var main = ''; main += ''; main += ''; for (var iu=0;iu'; else if (u==100) main += ''; else { main += ''; } } } main += ''; var r = 0; for (var ui=0;ui'; if (u<53) { main += ''; } else { if (u==99) rowtext = uW.g_js_strings.redoubt.redoubt else if (u==100) rowtext = uW.g_js_strings.tower.towerName else { var rowtext = uW.fortcost['frt'+u][0]; if (u==53) { rowtext = tx('Crossbows'); } // "Wall Mounted Crossbows" is pointlessly long! } main += ''; } troopa = t.keyz[ui]; for (var uj=0;uj??'; else main += ''; } main += ''; } } main += '
    '+uW.g_js_strings.commonstr.target+'
     ' + TroopImageBig(u) + '
    ' + uW.unitcost['unt'+u][0] + '' + rowtext + '' + t.z[troopa][troopb] + '
    '; return main; }, plotMapImg: function (markNum, eMap, x, y) { var t = Tabs.Reference; var xplot = parseInt((provMapCoords.mapWidth * x) / 750); var yplot = parseInt((provMapCoords.mapHeight * y) / 750); if (ById('plotmap_' + markNum) == null) { var ce = document.createElement('div'); ce.style.background = 'black'; ce.id = 'plotmap_' + markNum; ce.style.opacity = '1.0'; ce.style.position = 'relative'; ce.style.display = 'block'; ce.style.width = '16px'; ce.style.height = '16px'; ce.style.border = '1px solid #fff'; ce.style.color = 'white'; ce.style.textAlign = 'center'; } else { ce = ById('plotmap_' + markNum); } ce.style.top = (yplot + provMapCoords.topMargin - ((Cities.numCities + markNum) * 16) - 8) + 'px'; ce.style.left = (xplot + provMapCoords.leftMargin - 8) + 'px'; ce.title = "("+x+','+y+')'; eMap.appendChild(ce); ce.innerHTML = (markNum + 1) + ''; }, eventLocChanged: function (city, x, y) { var t = Tabs.Reference; var x1 = parseInt(ById('calcX').value); var y1 = parseInt(ById('calcY').value); if (!isNaN(x1) && !isNaN(y1)) { t.plotMapImg(0, ById('ptProvMap'), x1, y1); } var x2 = parseInt(ById('calcX2').value); var y2 = parseInt(ById('calcY2').value); if (!isNaN(x2) && !isNaN(y2)) { t.plotMapImg(1, ById('ptProvMap'), x2, y2); } if (!isNaN(x1) && !isNaN(y1) && !isNaN(x2) && !isNaN(y2)) { var m = tx('The distance from')+' ' + x1 + ',' + y1 + ' '+tx('to')+' ' + x2 + ',' + y2 + ' '+tx('is')+':  ' + distance(x1, y1, x2, y2).toFixed(2) + ''; ById('ptdistout').innerHTML = m; } }, PaintTRUniques: function (div) { var t = Tabs.Reference; var maxlevel = CM.MAX_MASTERS_TOKEN_LEVEL; var selectedCard1 = 0; var selectedCard2 = 0; var selectedType1 = 0; var selectedType2 = 0; uWExportFunction('pbrefreshuniques', Tabs.Reference.GetInventory); t.trSortArray = []; for (var k in t.UniqueTRItems) { t.trSortArray.push(t.UniqueTRItems[k]); } if (t.trSorted) { t.trSortArray.sort(function(a, b){ if (a.Nameb.Name) return 1; return 0; }); } var m = '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+tx("Sort Alphabetically")+'
    '+uW.g_js_strings.commonstr.type+': 
    '+uW.g_js_strings.commonstr.type+': 
    '+uW.g_js_strings.commonstr.item+': 
    '+uW.g_js_strings.commonstr.item+': 
    '+uW.g_js_strings.commonstr.level+': 
    '+uW.g_js_strings.commonstr.level+': 
    '; m += ''; m += '
    '; m += ''; m += '
    '; m += '
    '; div.innerHTML = m; ById('bttrUniqueSort').addEventListener('click', function (e) { t.trSorted = e.target.checked; t.PaintTRUniques(div); },false) jQuery("#bttrUniqueType1").change(function () { var trType = ById('bttrUniqueType1').value; var trList = ById('bttrUnique1'); if (selectedType1 != trType && trType != 0) { selectedCard1 = 0; } jQuery("#bttrUnique1").empty(); var trOption = document.createElement('option'); trOption.text = '-- '+uW.g_js_strings.commonstr.items+' --'; trOption.value = 0; trList.add(trOption); for (var k=0;k
    '; var tritem = {}; for (var k in uW.kocThroneItems) { var throne_item = uW.kocThroneItems[k]; if (throne_item.unique == trID) { if (tritem[throne_item.level]) {tritem[throne_item.level]++} else {tritem[throne_item.level] = 1;} } } var gotitem = false; for (var l in tritem) { gotitem = true; m += tx('You have')+' '+tritem[l]+' '+tx('at level')+' '+l+'
    '; } if (!gotitem) m += tx('You have none in your throne room')+'.
    '; else { //if (t.UniqueTRItems[trID].Faction == 0) { m += 'Generate Stats
    '; //} } m += '
    '+uW.g_js_strings.commonstr.inventory+'
    '; var inv = uW.seed.items['i'+trID]; m += tx('You have')+' '+(inv?inv:uW.g_js_strings.commonstr.none)+' '+tx('in your inventory')+'.'; if ((inv?inv:0) != 0 && !gotitem) { m += '
    '+tx('Add to Throne Room')+''; } ById(div).innerHTML = m; if (ById('pbgenstats'+trID)) { ById('pbgenstats'+trID).addEventListener('click',function () { window.prompt(tx("Copy to clipboard: Ctrl+C"), GenerateStats(trID)); } , false); } function GenerateStats(trID) { for (var k in uW.kocThroneItems) { var throne_item = uW.kocThroneItems[k]; if (throne_item.unique == trID) { var Results = 'UniqueItems["'+trID+'"] = {Id:'+trID+',Name:"'+throne_item.name+'", Effects:['; var firsteffect = true; for (var e in throne_item.effects) { if (!firsteffect) Results += ','; Results += '{type:'+throne_item.effects[e].id+',tier:'+throne_item.effects[e].tier+'}'; firsteffect = false; } Results += '],Faction:'+(cardFaction.indexOf(throne_item.faction)+1)+',Type:'+(trTypes.indexOf(throne_item.type)+1)+'};'; break; } } return Results; } }, DisplayTRCard : function (throne_item,Links,ScaleFactor) { var t = Tabs.Reference; var D = []; if (throne_item == null) { D.push("
    "); D.push("
    "); return D.join(""); } if (!ScaleFactor) { ScaleFactor = 1; } var CardWidth = Math.floor(200*ScaleFactor); var BigFont = Math.floor(14*ScaleFactor); var ImageSize = Math.floor(70*ScaleFactor); var SmallFont = Math.floor(11*ScaleFactor); var E = []; // copy to clip/post to chat array D.push("
    "); D.push("
    "); D.push("
    "); D.push("
    "); D.push(throne_item.name + (throne_item.unique ? " +" + throne_item.level : "")); D.push("
    "); D.push("
    "); var uniquestyle = ""; if (throne_item.isBroken) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+BrokenIcon+'); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } else { if (throne_item.unique > 29000) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'throne/icons/70/'+throne_item.faction+'_'+throne_item.type+'_unique_'+throne_item.unique + '.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; if (throne_item.unique == 30262 || throne_item.unique == 30264 || throne_item.unique == 30266) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'throne/icons/70/christmas_advisor_normal_1.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } if (throne_item.unique == 30261 || throne_item.unique == 30263 || throne_item.unique == 30265) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'throne/icons/70/christmas_candelabrum_normal_1.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } if (throne_item.unique == 30230 || throne_item.unique == 30240 || throne_item.unique == 30250) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'throne/icons/70/halloween_table_normal_1.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } if (throne_item.unique == 30231 || throne_item.unique == 30241 || throne_item.unique == 30251) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'throne/icons/70/halloween_chair_normal_1.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } } else { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'throne/icons/70/'+throne_item.faction+'_'+throne_item.type+'_normal_1_'+throne_item.quality+'.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } } D.push("
    "); D.push("
      "); D.push("
    • " + uW.g_js_strings.commonstr.faction + ": " + uW.g_js_strings.commonstr[throne_item.faction] + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.quality + ": " + CardQuality(throne_item.quality,throne_item.unique) + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.type + ": " + uW.g_js_strings.throneRoom[throne_item.type] + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.level + ": " + throne_item.level + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.might + ": " + CardMight(throne_item) + "
    • "); if (throne_item.jewel && throne_item.jewel.valid) { D.push("
    • " + uW.g_js_strings.commonstr.jewel + ": " + t.JewelQuality[throne_item.jewel.quality-1] + "
    • "); } D.push("
    "); D.push("
    "); D.push("
      "); E.push(throne_item.name.replace(/\'/g, "") + (throne_item.unique ? " +" + throne_item.level : "")); E.push(uW.g_js_strings.commonstr.faction + ": " + uW.g_js_strings.commonstr[throne_item.faction]); E.push(uW.g_js_strings.commonstr.quality + ": " + CardQuality(throne_item.quality,throne_item.unique)); E.push(uW.g_js_strings.commonstr.type + ": " + uW.g_js_strings.throneRoom[throne_item.type]); // E.push(uW.g_js_strings.commonstr.level + ": " + throne_item.level); E.push(uW.g_js_strings.commonstr.might + ": " + CardMight(throne_item)); if (throne_item.jewel && throne_item.jewel.valid) { E.push(uW.g_js_strings.commonstr.jewel + ": " + t.JewelQuality[throne_item.jewel.quality-1]); } if (throne_item.unknown) { if (Links) { D.push("
    • "+tx("Unknown")+"
    • "); D.push("
    • "+tx("If you have one in your Throne Room please click the 'Generate Stats' link below and send the results to the script developer")+".
    • "); } } else { for (var slot in throne_item.effects) { try { var N = throne_item.effects[slot]; tier = parseInt(N.tier); effect = getThroneEffectName(N.id,tier); p = uW.cm.thronestats.tiers[N.id][tier]; while (!p && (tier > 0)) { tier--; p = uW.cm.thronestats.tiers[N.id][tier]; } if (!p) continue; // can't find stats for tier var base = +p.base || 0; var level = +throne_item.level || 0; var growth = +p.growth || 0; if (slot == 'slot6') { //if it has a slot 6, it automatically has a jewel JewelQuality = throne_item["effects"]['slot6'].quality; GrowthLimit = uW.cm.thronestats.jewelGrowthLimit[JewelQuality]; if (GrowthLimit <= level) level = GrowthLimit } percent = Number(base + ((level * level + level) * growth * 0.5)); var wholeNumber = false; if (Math.round(parseFloat(percent)) == parseFloat(percent)) wholeNumber = true; percent = (percent > 0) ? "+" + percent : +percent; if (wholeNumber) percent = parseFloat(percent).toFixed(0); else percent = parseFloat(percent).toFixed(2); css = (slot % 2 === 0) ? "even" : "odd"; B = +(slot.split("slot")[1]); percent = (percent > 0) ? "+" + percent : percent; if (B <= throne_item.quality) { D.push("
    • " + percent + "% " + effect + "
    • "); } else { D.push("
    • " + percent + "% " + effect + "
    • "); } E.push("Row " + B + ": " + percent + "% " + effect); } catch (e) { } } } D.push("
    "); D.push("
    "); D.push(" "); D.push("
    "); D.push("
    "); var cText = ":::. |" + E.join('||'); var clipText = E.join(' '); if (Links) { D.push('
    '+tx("Copy to Clipboard")+''+tx("Post to Chat")+'
    '); } return D.join(""); }, PaintCHUniques: function (div) { var t = Tabs.Reference; var maxlevel = CM.CHAMPION.MAX_LEVELS; var itemTypes = { weapon: 0, chest: 1, helm: 2, boots: 3, shield: 4, ring: 5, pendant: 7, cloak: 8 }; var selectedCard1 = 0; var selectedCard2 = 0; var selectedType1 = 0; var selectedType2 = 0; uWExportFunction('pbrefreshchuniques', Tabs.Reference.GetCHInventory); t.chSortArray = []; for (var k in t.UniqueCHItems) { t.chSortArray.push(t.UniqueCHItems[k]); } if (t.chSorted) { t.chSortArray.sort(function(a, b){ var x=a.Set-b.Set; var y=0; if (a.nameb.name) y=1; return (x==0)?y:x; }); } var m = '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+tx("Sort by Champion Set")+'
    '+uW.g_js_strings.commonstr.type+': 
    '+uW.g_js_strings.commonstr.type+': 
    '+uW.g_js_strings.commonstr.item+': 
    '+uW.g_js_strings.commonstr.item+': 
    '+uW.g_js_strings.commonstr.level+': 
    '+uW.g_js_strings.commonstr.level+': 
    '; m += ''; m += '
    '; m += ''; m += '
    '; m += '
    '; div.innerHTML = m; ById('btchUniqueSort').addEventListener('click', function (e) { t.chSorted = e.target.checked; t.PaintCHUniques(div); },false) jQuery("#btchUniqueType1").change(function () { var chType = ById('btchUniqueType1').value; var chList = ById('btchUnique1'); if (selectedType1 != chType && chType != 0) { selectedCard1 = 0; } jQuery("#btchUnique1").empty(); var chOption = document.createElement('option'); chOption.text = '-- '+uW.g_js_strings.commonstr.items+' --'; chOption.value = 0; chList.add(chOption); for (var k=0;k
    '; var chitem = {}; for (var k in uW.kocChampionItems) { var champ_item = uW.kocChampionItems[k]; if (champ_item.unique == chID) { if (chitem[champ_item.level]) {chitem[champ_item.level]++} else {chitem[champ_item.level] = 1;} } } var gotitem = false; for (var l in chitem) { gotitem = true; m += tx('You have')+' '+chitem[l]+' '+tx('at level')+' '+l+'
    '; } if (!gotitem) m += tx('You have none in your champion hall')+'.
    '; else { if (t.UniqueCHItems[chID].Faction == 0) { m += 'Generate Stats
    '; } } m += '
    '+uW.g_js_strings.commonstr.inventory+'
    '; var inv = uW.seed.items['i'+chID]; m += tx('You have')+' '+(inv?inv:uW.g_js_strings.commonstr.none)+' '+tx('in your inventory')+'.'; if ((inv?inv:0) != 0) { m += '
    '+tx('Add to Champion Hall')+''; } ById(div).innerHTML = m; if (ById('pbgenchstats'+chID)) { ById('pbgenchstats'+chID).addEventListener('click',function () { window.prompt(tx("Copy to clipboard: Ctrl+C"), GenerateStats(chID)); } , false); } function GenerateStats(chID) { for (var k in uW.kocChampionItems) { var champ_item = uW.kocChampionItems[k]; if (champ_item.unique == chID) { var Results = 'UniqueItems["'+chID+'"] = {Id:'+chID+',Name:"'+champ_item.subtype+'", Effects:['; var firsteffect = true; for (var e in champ_item.effects) { if (!firsteffect) Results += ','; Results += '{type:'+champ_item.effects[e].id+',tier:'+champ_item.effects[e].tier+'}'; firsteffect = false; } Results += '],Faction:'+champ_item.faction+',Type:'+champ_item.type+',Set:'+champ_item.set+'};'; break; } } return Results; } }, DisplayCHCard : function (champ_item,Links,ScaleFactor,showChamp) { var t = Tabs.Reference; var D = []; if (champ_item == null) { D.push("
    "); D.push("
    "); return D.join(""); } if (!ScaleFactor) { ScaleFactor = 1; } var CardWidth = Math.floor(220*ScaleFactor); var BigFont = Math.floor(14*ScaleFactor); var ImageSize = Math.floor(70*ScaleFactor); var SmallFont = Math.floor(12*ScaleFactor); if (champ_item.rarity) champ_item.quality = parseIntNan(champ_item.rarity); if (!champ_item.Type) champ_item.Type = parseIntNan(champ_item.type); var E = []; // copy to clip/post to chat array D.push("
    "); D.push("
    "); D.push("
    "); D.push("
    "); D.push(champ_item.name + (champ_item.uniqueCompare ? " +" + champ_item.level : "")); D.push("
    "); D.push("
    "); var uniquestyle = ""; if (t.isBroken(champ_item)) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+BrokenIcon+'); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } else { if (champ_item.unique != 0) { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'champion_hall/unique_'+champUniqueImageTypes[champ_item.Type-1]+'_'+cardFaction[champ_item.faction-1]+'_70x70_'+champ_item.unique + '.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } else { uniquestyle = 'width:'+ImageSize+'px;height:'+ImageSize+'px;background:transparent url('+IMGURL+'champion_hall/'+cardQuality[champ_item.rarity].toLowerCase()+'_'+champImageTypes[champ_item.Type-1]+'_'+cardFaction[champ_item.faction-1]+'_70x70.png); top left no-repeat; background-size:'+ImageSize+'px '+ImageSize+'px;'; } } D.push("
    "); D.push("
      "); D.push("
    • " + uW.g_js_strings.commonstr.faction + ": " + (champ_item.unknown?"Unknown":uW.g_js_strings.commonstr[cardFaction[champ_item.faction-1]]) + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.quality + ": " + CardQuality(champ_item.rarity,champ_item.unique) + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.type + ": " + (champ_item.unknown?"Unknown":uW.g_js_strings.champ[chTypeStrings[champ_item.type-1]]) + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.level + ": " + champ_item.level + "
    • "); D.push("
    • " + uW.g_js_strings.commonstr.might + ": " + CardMight(champ_item,true) + "
    • "); if (showChamp && champ_item.equippedTo) { for (var y in Seed.champion.champions) { var chkchamp = Seed.champion.champions[y]; if (chkchamp.championId && chkchamp.championId==champ_item.equippedTo) { D.push("
    • " + tx('Equipped') + ": " + chkchamp.name + "
    • "); break; } } } D.push("
    "); D.push("
    "); D.push("
      "); E.push(champ_item.name.replace(/\'/g, "") + (champ_item.uniqueCompare ? " +" + champ_item.level : "")); E.push(uW.g_js_strings.commonstr.faction + ": " + (champ_item.unknown?"Unknown":uW.g_js_strings.commonstr[cardFaction[champ_item.faction-1]])); E.push(uW.g_js_strings.commonstr.quality + ": " + CardQuality(champ_item.rarity,champ_item.unique)); E.push(uW.g_js_strings.commonstr.type + ": " + (champ_item.unknown?"Unknown":uW.g_js_strings.commonstr[cardFaction[champ_item.faction-1]])); // E.push(uW.g_js_strings.commonstr.level + ": " + champ_item.level); E.push(uW.g_js_strings.commonstr.might + ": " + CardMight(champ_item,true)); if (champ_item.unknown) { if (Links) { D.push("
    • "+tx("Unknown")+"
    • "); D.push("
    • "+tx("If you have one in your Champions Hall please click the 'Generate Stats' link below and send the results to the script developer")+".
    • "); } } else { for (var slot in champ_item.effects) { try { var N = champ_item.effects[slot]; effect = uW.g_js_strings.effects["name_"+N.id]; tier = parseInt(N.tier); p = ChampionStatTiers[N.id][tier]; while (!p && (tier > 0)) { tier--; p = ChampionStatTiers[N.id][tier]; } if (!p) continue; // can't find stats for tier var base = +p.base || 0; var level = +champ_item.level || 0; var growth = +p.growth || 0; percent = Number(base + ((level * level + level) * growth * 0.5)); if (N.id>=300) { percent = Number(base + (level * growth)); if (N.id<400) percent = percent*100; } var wholeNumber = false; if (Math.round(parseFloat(percent)) == parseFloat(percent)) wholeNumber = true; percent = (percent > 0) ? percent : +percent; if (wholeNumber) percent = parseFloat(percent).toFixed(0); else percent = parseFloat(percent).toFixed(2); css = (slot % 2 === 0) ? "even" : "odd"; B = +(slot.split("slot")[1]); if (!B) B = slot; percent = (N.id>=300)?percent+'%':percent; if (B <= champ_item.rarity) { if (N.id < 200) { D.push("
    • " + percent + " " + effect + "
    • "); } else { if (N.id >= 400) { D.push("
    • " + percent + " " + effect + "
    • "); } else { if (N.id >= 300) { D.push("
    • " + percent + " " + effect + "
    • "); } else { D.push("
    • " + percent + " " + effect + "
    • "); } } } } else { D.push("
    • " + percent + " " + effect + "
    • "); } E.push("Row " + B + ": " + percent + " " + effect); } catch (e) { } } } D.push("
    "); D.push("
    "); D.push(" "); D.push("
    "); D.push("
    "); var cText = ":::. |" + E.join('||'); var clipText = E.join(' '); if (Links) { D.push('
    '+tx("Copy to Clipboard")+''+tx("Post to Chat")+'
    '); } return D.join(""); }, } /** Player Tab **/ Tabs.Player = { tabOrder : 1010, tabLabel : 'Players', myDiv : null, MemberListRslt : {}, userobj : {}, dat : [], friendEta : false, hidePlayerInfo : false, ModelCity : null, unitId : 0, ModelCityId : 0, curPage :0, maxPage :-1, friendbtn : '', neutralbtn : '', hostilebtn : '', aName : '', ReqSent : {}, Options : { sortColNum: 8, sortDir: 1, }, champpos : {x: -999, y: -999}, // t.dat // 0 - p.displayName // 1 - p.might // 2 - p.officerType // 3 - p.numCities // 4 - p.cities[c].tileLevel // 5 - p.cities[c].xCoord // 6 - p.cities[c].yCoord // 7 - p.cities[c].cityName // 8 - distance // 9 - Online // 10 - ETA // 11 - p.cities[c].cityId // 12 - prestige // 13 - p.userId // 14 - prestigelvl // 15 - prestigeexp // 16 - p.cities[c].prestigeBuffExpire (for sorting) // 17 - prestige + prestigelvl (for sorting) // 18 - p.cities[c].blessing // 19 - Defending init : function (div){ var t = Tabs.Player; t.myDiv = div; if (!Options.PlayerOptions) { Options.PlayerOptions = t.Options; } else { for (var y in t.Options) { if (!Options.PlayerOptions.hasOwnProperty(y)) { Options.PlayerOptions[y] = t.Options[y]; } } } uWExportFunction('ptPlayClick', Tabs.Player.clickedPlayerDetails); uWExportFunction('ptSetDiplomacy', Tabs.Player.setDiplomacy); uWExportFunction('ptInvite', Tabs.Player.clickedSendInvite); uWExportFunction('ptViewChamps', Tabs.Player.ViewChamps); uWExportFunction('ptGetMembers', Tabs.Player.eventGetMembers); uWExportFunction('ptPaintMembers', Tabs.Player.GetDataForMap); uWExportFunction('ptAllClickPrev', Tabs.Player.eventListPrev); uWExportFunction('ptAllClickNext', Tabs.Player.eventListNext); uWExportFunction('ptPlayerDetails', Tabs.Player.eventPlayerExternalTabClick); uWExportFunction('ptAllianceDetails', Tabs.Player.eventAllianceExternalTabClick); uWExportFunction('ptplayClickSort', Tabs.Player.playClickSort); m = '
    '+tx('PLAYER AND ALLIANCE SEARCH')+'
    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; if (Seed.allianceDiplomacies) { m += ''; m += ''; } m += '
     '+uW.g_js_strings.modal_fow_leaderboard.searchuser+':  '+uW.g_js_strings.modal_fow_leaderboard.searchuser+' UID 
     '+uW.g_js_strings.setDiplomacyWindow.srchalli+':  '+uW.g_js_strings.modal_fow_leaderboard.findalli+' 
     '+tx('Show Friendly Alliances')+'    '+tx('Show Hostile Alliances')+'
    '; m += ''; m += ''; m += '
    '; m += ''; m += '
     

    '; div.innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); t.ModelCity = new CdispCityPicker('plyrdcp', ById('dmcoords'), true, t.eventCoords, null); t.ModelCity.bindToXYboxes(ById('plyrX'), ById('plyrY')); if (ById('ptScoutExport')) ById('ptScoutExport').addEventListener('click', t.ExportScoutList, false); if (ById('ptBulkAttackExport')) ById('ptBulkAttackExport').addEventListener('click', t.ExportAttackList, false); ById('ptHighDefenders').addEventListener('click', t.HighlightDefenders, false); ById('idFindETASelect').addEventListener('click', t.handleEtaSelect, false); ById('allplayname').addEventListener('keypress', function (e) { if (e.which == 13) ById('allplaysubmit').click(); }, false); ById('allalliname').addEventListener('keypress', function (e) { if (e.which == 13) ById('allallisubmit').click(); }, false); if (Seed.allianceDiplomacies) { ById('allmyallisubmit').addEventListener('click', t.showMyAlliance, false); ById('pbshowfriendlies').addEventListener('change', function () { if (this.checked) { t.paintFriendlyDiv(); } else { ById('pbfriendlydiv').style.display = 'none'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } }); ById('pbshowhostiles').addEventListener('change', function () { if (this.checked) { t.paintHostilesDiv(); } else { ById('pbhostilediv').style.display = 'none'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } }); } ById('allallisubmit').addEventListener('click', t.eventSubmit, false); ById('allplaysubmit').addEventListener('click', t.eventPlayerSubmit, false); ById('alluidsubmit').addEventListener('click', t.eventPlayerUIDSubmit, false); ById('allalliname').addEventListener('focus', function () { ById('allallierr').innerHTML = ''; }, false); ById('allplayname').addEventListener('focus', function () { ById('allplayerr').innerHTML = ''; }, false); ById('alllistsubmit').addEventListener('click', t.eventListSubmit, false); }, playClickSort : function (e) { var t = Tabs.Player; var newColNum = e.id.substr(8); ById('clickCol' + Options.PlayerOptions.sortColNum).className = 'buttonv2 std blue'; e.className = 'buttonv2 std green'; if (newColNum == Options.PlayerOptions.sortColNum) { Options.PlayerOptions.sortDir *= -1; } else { Options.PlayerOptions.sortColNum = newColNum; } saveOptions(); t.RepaintList(); }, paintFriendlyDiv : function () { var t = Tabs.Player; var mess = '
    '+tx('FRIENDLY ALLIANCES')+'
    '; for (var k in Seed.allianceDiplomacies.friendly) { mess += ' '; } ById('pbfriendlydiv').innerHTML = mess; ById('pbfriendlydiv').style.display = 'block'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); for (var q in Seed.allianceDiplomacies.friendly) { ById('pbFriendly_' + q).addEventListener('click', function () { t.eventGetMembers(this.id.substr(12)) }); } }, paintHostilesDiv : function () { var t = Tabs.Player; var mess = '
    '+tx('HOSTILE ALLIANCES')+'
    '; for (var k in Seed.allianceDiplomacies.hostile) { mess += ' '; } ById('pbhostilediv').innerHTML = mess; ById('pbhostilediv').style.display = 'block'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); for (var q in Seed.allianceDiplomacies.hostile) { ById('pbHostile_' + q).addEventListener('click', function () { t.eventGetMembers(this.id.substr(11)) }); } }, eventSubmit : function () { var t = Tabs.Player; ById('allallierr').innerHTML = ''; t.aName = ById('allalliname').value; if (t.aName.length < 3) { ById('allallierr').innerHTML = uW.g_js_strings.getAllianceSearchResults.entryatleast3; return; } var myA = getMyAlliance(); if (myA[0] == 0) { ById('allallierr').innerHTML = tx('You need to belong to an alliance to search alliances by name'); return; } ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); if (myA[0] != 0 && myA[1].toUpperCase().indexOf(t.aName.toUpperCase()) >= 0) // need to merge own alliance details into results... t.fetchAllianceList(t.aName, myA[0], t.eventGotAllianceList); else t.fetchAllianceList(t.aName, null, t.eventGotAllianceList); }, eventPlayerSubmit : function () { var t = Tabs.Player; ById('allplayerr').innerHTML = ''; var name = ById('allplayname').value; name = name.replace(/\'/g, "_").replace(/\,/g, "_").replace(/\-/g, "_"); t.pName = name; if (name.length < 3) { ById('allplayerr').innerHTML = uW.g_js_strings.getAllianceSearchResults.entryatleast3; return; } var myA = getMyAlliance(); if (myA[0] == 0) { ById('allplayerr').innerHTML = tx('You need to belong to an alliance to search players by name'); return; } ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); fetchPlayerList(name, t.eventGotPlayerList); }, eventPlayerExternalTabClick : function (uid) { var t = Tabs.Player; ById('bttcPlayer').click(); ById('allplayerr').innerHTML = ''; ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); var uList = []; uList.push(uid); getOnline(uList, function (r) { if (!r.ok) { t.DisplayMessage(rslt.errorMsg);return; } else { t.clickedPlayerDetails(uid,r.data[uid]);} }); }, eventMapExternalTabClick : function (aid,aname) { var t = Tabs.Player; ById('bttcPlayer').click(); ById('allplayerr').innerHTML = ''; ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); t.GetDataForMap(aid,aname); }, eventAllianceExternalTabClick: function (aid) { var t = Tabs.Player; ById('bttcPlayer').click(); ById('allplayerr').innerHTML = ''; ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); t.fetchAllianceMemberList(aid, null, t.eventGotMemberList); }, eventPlayerUIDSubmit : function () { var t = Tabs.Player; ById('allplayerr').innerHTML = ''; var uid = ById('allplayname').value; ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); var uList = []; uList.push(uid); getOnline(uList, function (r) { if (!r.ok) { t.DisplayMessage(rslt.errorMsg);return; } else { t.clickedPlayerDetails(uid,r.data[uid]);} }); }, eventListSubmit : function () { var t = Tabs.Player; var myA = getMyAlliance(); ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); t.curPage = 1; t.fetchOtherAllianceInfo(1, t.eventGotOtherAlliancePage); }, eventGotPlayerList: function (rslt) { var t = Tabs.Player; if (!rslt.ok) { t.DisplayMessage(rslt.msg); return; } t.playerList = rslt.matchedUsers; var uList = []; for (var k in rslt.matchedUsers) uList.push(rslt.matchedUsers[k].userId); getOnline(uList, function (r) { t.eventGotPlayerOnlineList(r);}); }, eventGotPlayerOnlineList: function (rslt) { var t = Tabs.Player; if (!rslt.ok) { t.DisplayMessage(rslt.errorMsg); return; } var m = '
    ' + uW.g_js_strings.recommendSelectedFriends.playersrch + ': "' + t.pName + '"

    '; m += '
    '; m += ''; var numlinks = 5; if (Options.ChatOptions.chatIcons) { m += ''; numlinks = 4; } else { m += ''; } m += ''; var r = 0; for (var k in t.playerList) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } var u = t.playerList[k]; var status = ''; if (rslt.data[u.userId]) status = ''; m += ''; m += ''; if (Options.ChatOptions.chatIcons) { m += ''; m += ''; m += ''; m += ''; m += ''; } m += '
    ' + uW.g_js_strings.commonstr.nametx + 'UID'+uW.g_js_strings.commonstr.might+'Facebook ' + tx('Player Links')+'
    '+status+''+u.genderAndName+''; if (KOCMON_ON) m += '' + u.userId + ''; else m += u.userId; m += '' + addCommasInt(u.might) + ''; } else { m += ' '+tx('Facebook'); } m += ''+tx('Details')+''+MonitorLink(u.userId,'Monitor')+''+tx('Champions')+''+uW.g_js_strings.commonstr.profile+'<\TD>
    '; ById('allListOut').innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, fetchAllianceList: function (allianceName, myAid, notify) { var t = Tabs.Player; function combineResults(rsltA, rsltM, notify) { if (!rsltA.ok) { if (rsltA.msg.indexOf(tx("No alliance found under")) != 0 || !rsltM.ok) { notify(rsltA); return; } rsltA.ok = true; rsltA.count = 0; rsltA.alliancesMatched = {}; } if (rsltM.ok) { rsltA.alliancesMatched['a' + rsltM.allianceInfo.allianceId] = { allianceId: rsltM.allianceInfo.allianceId, allianceName: rsltM.allianceInfo.allianceName, membersCount: rsltM.allianceInfo.members, relation: null, might: rsltM.allianceInfo.might, ranking: rsltM.allianceInfo.ranking }; ++rsltA.count; } notify(rsltA); } var params = uW.Object.clone(uW.g_ajaxparams); params.allianceName = allianceName.replace(/\ /g,"_"); new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetSearchResults.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (myAid != null && myAid > 0) { t.fetchMyAllianceInfo(function (r) { combineResults(rslt, r, notify);}); } else { notify(rslt); } }, onFailure: function () { notify({errorMsg: 'AJAX error'}); }, }); }, eventGotAllianceList: function (rslt) { var t = Tabs.Player; if (!rslt.ok) { t.DisplayMessage(rslt.errorMsg); return; } var m = '
    '+uW.g_js_strings.commonstr.alliances+' "' + t.aName + '"

    '; m += ''; m += ''; var r = 0; for (var k in rslt.alliancesMatched) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } var all = rslt.alliancesMatched[k]; m += ''; m += ''; m += ''; m += ''; if (KOCMON_ON) m += ''; m += ''; } m += '
    ' + uW.g_js_strings.commonstr.alliance + '' + uW.g_js_strings.commonstr.rank + '' + uW.g_js_strings.commonstr.members + ''+tx('Total Might')+'' + uW.g_js_strings.getAllianceSearchResults.currdiplo + '' + tx('Alliance Links')+'
    '+all.allianceName+''+all.ranking+''+all.membersCount+'' + addCommasInt(all.might) + ' '+uW.g_js_strings.commonstr.members+''+uW.g_js_strings.commonstr.viewmap+''+tx('kocmon')+'
    '; ById('allListOut').innerHTML = m; for (var k in rslt.alliancesMatched) { var all = rslt.alliancesMatched[k]; var dip = getDiplomacy(all.allianceId); if (dip == uW.g_js_strings.commonstr.friendly) { dip = 1; } else { if (dip == uW.g_js_strings.commonstr.hostile) { dip = 2; } else { dip = 0; } } t.PaintDiplomacy(all.allianceId,dip,'adiplo'); } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, eventGotOtherAlliancePage: function (rslt) { var t = Tabs.Player; if (!rslt.ok) { t.DisplayMessage(rslt.errorMsg); return; } t.MaxPage = rslt.noOfPages; var m = '
    '+uW.g_js_strings.modal_alliance.allilist + '

    '; m += ''; m += ''; var r = 0; for (var k in rslt.otherAlliances) { var all = rslt.otherAlliances[k]; if (all.allianceId) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } var rowcol = ""; if (getMyAlliance()[0] == all.allianceId) { rowcol = "whiteOnGreen"; } m += ''; m += ''; m += ''; m += ''; if (KOCMON_ON) m += ''; m += ''; r++; } } m += '
    ' + uW.g_js_strings.commonstr.alliance + '' + uW.g_js_strings.commonstr.rank + '' + uW.g_js_strings.commonstr.members + ''+tx('Total Might')+''+tx('Total Glory')+'' + uW.g_js_strings.getAllianceSearchResults.currdiplo + '' + tx('Alliance Links')+'
    '+all.name+''+all.ranking+''+all.membersCount+'' + addCommasInt(all.might) + '' + addCommasInt(all.glory) + ' '+uW.g_js_strings.commonstr.members+''+uW.g_js_strings.commonstr.viewmap+''+tx('kocmon')+'
    '; m += '
    '; m += '|<'; m += '<10'; m += '<5'; m += '<'; m += '>'; m += '>5'; m += '>10'; m += '>|'; m += '  '+tx('Page')+'  '+uW.g_js_strings.commonstr.of+' '+t.MaxPage+'. '+tx('Find My Alliance')+''; m += '
    '; ById('allListOut').innerHTML = m; ById('idPageNum').addEventListener ('change', t.PageNumChange, false); ById('idPageNum').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.PageNumChange); }, false); ById('idFindMyAlliance').addEventListener ('click', t.FindMyAlliance, false); for (var k in rslt.otherAlliances) { var all = rslt.otherAlliances[k]; var dip = getDiplomacy(all.allianceId); if (dip == uW.g_js_strings.commonstr.friendly) { dip = 1; } else { if (dip == uW.g_js_strings.commonstr.hostile) { dip = 2; } else { dip = 0; } } t.PaintDiplomacy(all.allianceId,dip,'odiplo'); } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, eventListNext: function (amt) { var t = Tabs.Player; if (parseInt(amt) >= 9999) { t.curPage = t.MaxPage; } else { t.curPage = parseInt(t.curPage) + parseInt(amt); if (t.curPage > t.MaxPage) { t.curPage = t.MaxPage; } } t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); t.fetchOtherAllianceInfo(t.curPage, t.eventGotOtherAlliancePage); }, eventListPrev: function (amt) { var t = Tabs.Player; if (amt <= -1) { t.curPage = 1; } else { t.curPage = parseInt(t.curPage) - parseInt(amt); if (t.curPage < 1) { t.curPage = 1; } } t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); t.fetchOtherAllianceInfo(t.curPage, t.eventGotOtherAlliancePage); }, FindMyAlliance : function () { var t = Tabs.Player; if (getMyAlliance()[0] == 0) { return; } t.fetchMyAllianceInfo(function (rslt) { if (rslt.ok) { t.gotoPage(Math.ceil(parseIntNan(rslt.allianceInfo.ranking)/10)); } }); }, PageNumChange : function () { var t = Tabs.Player; if (KeyTimer) { clearTimeout(KeyTimer); } t.gotoPage(parseIntNan(ById('idPageNum').value)); }, gotoPage : function (val) { var t = Tabs.Player; if (t.MaxPage < 0 ) { return; } if (val > t.MaxPage) { val = t.MaxPage; } if (val < 1) { val = 1; } t.curPage = val; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); t.fetchOtherAllianceInfo(t.curPage, t.eventGotOtherAlliancePage); }, fetchOtherAllianceInfo: function (pageNum, notify) { var params = uW.Object.clone(uW.g_ajaxparams); params.pageNo = pageNum; params.cityId = uW.currentcityid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetOtherInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({errorMsg: 'AJAX error'});}, }); }, fetchMyAllianceInfo: function (notify) { var params = uW.Object.clone(uW.g_ajaxparams); new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({errorMsg: 'AJAX error'}); }, }); }, showMyAlliance : function () { var t = Tabs.Player; var aid = getMyAlliance()[0]; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); if (aid != 0) { t.eventGetMembers(aid); } else { t.DisplayMessage(uW.g_js_strings.membersInfo.youmustbelong); } }, eventGetMembers: function (aid) { var t = Tabs.Player; ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); t.fetchAllianceMemberList(aid, null, t.eventGotMemberList); }, fetchAllianceMemberList: function (allianceId, allianceName, notify) { var t = Tabs.Player; var params = uW.Object.clone(uW.g_ajaxparams); params.type = "might"; params.page = 1; params.perPage = 100; if (allianceName) { params.allianceName = allianceName; } if (allianceId && allianceId != 0) { params.allianceId = allianceId; } new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserLeaderboard.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({errorMsg: 'AJAX error'}); }, }); }, eventGotMemberList: function (rslt) { var t = Tabs.Player; if (!rslt.ok) { t.DisplayMessage(rslt.errorMsg); return; } t.MemberListRslt = rslt; var uList = []; for (var k in rslt.results) { uList.push(rslt.results[k].userId); } getOnline(uList, function (r) { t.eventGotMemberOnlineList(r);}); }, eventGotMemberOnlineList: function (rslt) { var t = Tabs.Player; var numInvalid = 0; var numPlayers = 0; var aid = getMyAlliance()[0]; var prestige = ""; t.dat = []; for (var i = 0; i < t.MemberListRslt.results.length; i++) { p = t.MemberListRslt.results[i]; if (p.userId == 0) { ++numInvalid; } else { ++numPlayers; if (aid == p.allianceId) { t.friendEta = true; } else { t.friendEta = false; } for (var c = 0; c < p.cities.length; c++) { var pt = p.cities[c].prestigeType; var prestige = getFactionName(pt); if (prestige == "") { prestigelvl = ""; } else { prestigelvl = " (" + p.cities[c].prestigeLevel + ")"; } ExpTime = convertTime(new Date(p.cities[c].prestigeBuffExpire.replace(" ", "T")+"Z")); if ((ExpTime + (3600 * 24) < unixTime()) || isNaN(ExpTime)) { prestigeexp = ""; } else { prestigeexp = t.getDuration(p.cities[c].prestigeBuffExpire); } t.dat.push([p.displayName, parseInt(p.might), p.officerType, parseInt(p.numCities), parseInt(p.cities[c].tileLevel), parseInt(p.cities[c].xCoord), parseInt(p.cities[c].yCoord), p.cities[c].cityName, 0, rslt.data[p.userId]?1:0, '--', p.cities[c].cityId, prestige, p.userId, prestigelvl, prestigeexp, p.cities[c].prestigeBuffExpire, prestige + prestigelvl, p.cities[c].blessing,false]); } } } t.setDistances(Cities.byID[t.ModelCityId].x, Cities.byID[t.ModelCityId].y); t.setEta(); t.displayMembers(t.MemberListRslt.allianceName, numPlayers); }, handleEtaSelect: function () { var t = Tabs.Player; t.unitId = ById('idFindETASelect').value; t.setEta(); t.RepaintList(); }, setDistances: function (x, y) { var t = Tabs.Player; for (var i = 0; i < t.dat.length; i++) { t.dat[i][8] = distance(x, y, t.dat[i][5], t.dat[i][6]); } }, setEta: function () { var t = Tabs.Player; var speed = 0; var speedfriend = 0; if (t.unitId!=0) { var MarchTime = March.getMarchTime(t.ModelCityId,{unit:t.unitId},0,'',false,false,false,false); speed = MarchTime.speed; speedfriend = MarchTime.speedfriend; } var delay = CM.WorldSettings.isOn("MARCH_SINGLE_TRIP_DELAY") ? parseInt(uW.g_marchSingleTripDelay) : 0; for (var i = 0; i < t.dat.length; i++) { var distance = t.dat[i][8]; if (distance) { if (speed == 0 || distance == 0) { t.dat[i][10] = 0; } else { var time = 0; var timefriend = 0; if (speed > 0) { time = Math.ceil(parseFloat(distance) * 6000 / speed); } if (speedfriend > 0) { timefriend = Math.ceil(parseFloat(distance) * 6000 / speedfriend); } time += delay; timefriend += delay; if (Seed.playerEffects.returnExpire > uW.unixtime()) { time = parseInt(time * 0.75); timefriend = parseInt(timefriend * 0.75); } time = Math.ceil(time < 30 ? 30 : time); timefriend = Math.ceil(timefriend < 30 ? 30 : timefriend); if (t.friendEta) { t.dat[i][10] = timefriend; } else { t.dat[i][10] = time; } } } } }, displayPlayer: function (uid,locations) { var t = Tabs.Player; t.hidePlayerInfo = false; var u = t.userobj[uid]; var n = '
     '+u.name+' ('+parseInt(u.userId)+')'+tx('Hide Details')+'
    '; n += '
    '; if (u.allianceId && u.allianceId != 0) { n += ''; n += ''; } else { n += ''; } if (!u.online) { n += ' '; } else { n += ' '; } if (u.misted) n += ''; n += ''; n += ''; n += ''; if (Options.ShowGloryMight) { n += ''; } n += ''; n += ''; n += ''; var pids = u.provinceIds.split(','); var p = []; for (var i = 0; i < pids.length; i++) { p.push(uW.provincenames['p' + pids[i]]); } n += ''; // create notes link var notes = ""; if (Tabs.Notes && Tabs.Notes.noteValues[uid]) { notes = Tabs.Notes.noteValues[uid]; notes = notes.text; } var dip = getDiplomacy(u.allianceId); if (dip == uW.g_js_strings.commonstr.friendly) { dip = 1; } else { if (dip == uW.g_js_strings.commonstr.hostile) { dip = 2; } else { dip = 0; } } n += ''; n += '
    '+uW.g_js_strings.commonstr.alliance+': ' + u.allianceName + '
    '+tx('Diplomacy')+':  
    '+uW.g_js_strings.commonstr.alliance+': '+uW.g_js_strings.commonstr.none+'!
    '+uW.g_js_strings.modal_messages_viewreports_view.lastlogin+': '+ t.getLastLogDuration(u.lastLogin) +'
    '+tx('Last login')+': '+tx('ONLINE')+'
    '+tx('Misted')+': ' + Tabs.Monitor.getDuration(u.fogExpireTimestamp) + '
    '+uW.g_js_strings.commonstr.status+': ' + Tabs.Monitor.GetStatusText(u.warStatus,u.truceExpireTimestamp) + '
    '+uW.g_js_strings.commonstr.might+': ' + addCommas(Math.round(u.might)) + '
    '+tx('Classic Might')+': ' + addCommas(Math.round(u.mightClassic)) + '
    '+tx('Glory Might')+': ' + addCommas(Math.round(u.mightGlory)) + '
    '+uW.g_js_strings.commonstr.glory+': 
     
    '+tx('Maximum Glory')+': 
    '+tx('Lifetime Glory')+': 
    '+tx('Provinces')+': 
    '+p.join(', ')+'
    '+tx('Player Notes')+':
    ' + notes + '
    '; /* * KOC-425 - Remove FB Profile Link n += ''; n += ''; */ if (KOCMON_ON) n += ''; if (!uW.isNewServer()) { n += ''; n += ''; } if ((allianceleader||trusted) && dip!=2) { // no invite option for hostiles n += ''; } n += '
    '; if (Options.ChatOptions.chatIcons) { n += ''; } else { n += ''; } n += '
    '+tx('Profile')+'
    '+tx('kocmon')+'
    '+MonitorLink(u.userId,tx('Throne Monitor'))+'
    '+tx('Champions Hall')+'
    '+uW.g_js_strings.membersInfo.invitealli+'
    '; ById('allPlayerInfo').innerHTML = n; if (Tabs.Notes) { ById('ptplayernoteslink').addEventListener('click',function() {Tabs.Notes.createPopup({id:uid,username:u.name});},false); } ById('ptplayershowhide').addEventListener('click',t.PlayerShowHide,false); t.PaintDiplomacy(u.allianceId,dip,'diplo'); var m = '
    '; if (!locations) { m += ''; } else { m += ''; } m += '
     '+tx('City locations unavailable')+''+uW.g_js_strings.commonstr.distance+' '+uW.g_js_strings.commonstr.from+' '+Cities.byID[t.ModelCityId].name+' ('+Cities.byID[t.ModelCityId].x+','+Cities.byID[t.ModelCityId].y+') 
    '; if (locations) { m += ''; } ById('allListOut').innerHTML = m; t.PaintGlory(uid); ById('allPlayerInfo').style.display = 'block'; if (locations) { ById('allCitySelect').style.display = 'block'; } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); if (locations) { ById('clickCol' + Options.PlayerOptions.sortColNum).className = 'buttonv2 std green'; ById('ToggleScoutCheckbox').addEventListener('change', t.doSelectall, false); t.RepaintList(); } }, PlayerShowHide : function() { var t = Tabs.Player; var a = ById('ptplayershowhide'); t.hidePlayerInfo = !t.hidePlayerInfo; if (t.hidePlayerInfo) { disp = 'none'; if (a) a.innerHTML = tx('Show Details'); }else{ disp = 'block'; if (a) a.innerHTML = tx('Hide Details'); } ById('ptplayerinfo').style.display = disp; }, displayMembers: function (allName, numPlayers) { var t = Tabs.Player; var m = '
    '; m += ''; m += '
     '+allName+' ('+t.MemberListRslt.allianceId+')'+uW.g_js_strings.commonstr.distance+' '+uW.g_js_strings.commonstr.from+' '+Cities.byID[t.ModelCityId].name+' ('+Cities.byID[t.ModelCityId].x+','+Cities.byID[t.ModelCityId].y+')'+numPlayers+' '+uW.g_js_strings.commonstr.members+'  '+uW.g_js_strings.commonstr.viewmap+''; if (KOCMON_ON) m += '  '; m += '
    '; m += ''; ById('allListOut').innerHTML = m; ById('allCitySelect').style.display = 'block'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('clickCol' + Options.PlayerOptions.sortColNum).className = 'buttonv2 std green'; ById('ToggleScoutCheckbox').addEventListener('change', t.doSelectall, false); t.RepaintList(); }, clickedPlayerDetails : function (uid,online) { var t = Tabs.Player; ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; t.DisplayMessage(uW.g_js_strings.commonstr.loadingddd); var params = uW.Object.clone(uW.g_ajaxparams); params.uid = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserGeneralInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { t.userobj = {}; t.userobj[uid] = rslt.userInfo[0]; t.userobj[uid].might = Math.round(t.userobj[uid].might); t.userobj[uid].online = (online?true:false); fetchPlayerCourt(uid, function (rslt2) { if (rslt2.ok) { u = unixTime(); f = convertTime(new Date(rslt2.playerInfo.fogExpireTimestamp.replace(" ","T")+"Z")); t.userobj[uid].misted = (f >= u); t.userobj[uid].fogExpireTimestamp = rslt2.playerInfo.fogExpireTimestamp; t.userobj[uid].warStatus = rslt2.playerInfo.warStatus; t.userobj[uid].truceExpireTimestamp = rslt2.playerInfo.truceExpireTimestamp; t.userobj[uid].cityCount = rslt2.playerInfo.cityCount; t.userobj[uid].mightClassic = rslt2.playerInfo.mightClassic; t.userobj[uid].mightGlory = rslt2.playerInfo.mightGlory; t.userobj[uid].fbuid = parseInt(rslt2.playerInfo.fbuid); t.userobj[uid].lastLogin = rslt2.playerInfo.lastLogin; t.fetchPlayerLeaderboard(uid, function (r) { t.gotPlayerLeaderboard(r, uid) }); } else { t.DisplayMessage(uW.g_js_strings.barbarian.erroroccured); } }); } else { t.DisplayMessage(uW.g_js_strings.barbarian.erroroccured); } }, onFailure: function () {t.DisplayMessage(uW.g_js_strings.errorcode.err_602);}, }); }, fetchPlayerLeaderboard: function (uid, notify) { var t = Tabs.Player; var params = uW.Object.clone(uW.g_ajaxparams); params.userId = uid; params.type = "might"; params.page = 1; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserLeaderboard.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify(rslt); }, onFailure: function () { notify({errorMsg: 'AJAX error'});}, }); }, gotPlayerLeaderboard : function (rslt,uid) { var t = Tabs.Player; if (!rslt.ok) { t.DisplayMessage(rslt.errorMsg); return; } t.dat = []; var prestige = ""; var aid = getMyAlliance()[0]; if (rslt.totalResults == 0) { t.displayPlayer(uid,false); return; } var p = rslt.results[0]; if (aid == p.allianceId) { t.friendEta = true; } else { t.friendEta = false; } for (var c = 0; c < p.cities.length; c++) { var pt = p.cities[c].prestigeType; var prestige = getFactionName(pt); if (prestige == "") { prestigelvl = ""; } else { prestigelvl = " (" + p.cities[c].prestigeLevel + ")"; } ExpTime = convertTime(new Date(p.cities[c].prestigeBuffExpire.replace(" ", "T")+"Z")); if ((ExpTime + (3600 * 24) < unixTime()) || isNaN(ExpTime)) { prestigeexp = ""; } else { prestigeexp = t.getDuration(p.cities[c].prestigeBuffExpire); } t.dat.push([p.displayName, parseInt(p.might), p.officerType, parseInt(p.numCities), parseInt(p.cities[c].tileLevel), parseInt(p.cities[c].xCoord), parseInt(p.cities[c].yCoord), p.cities[c].cityName, 0, t.userobj[uid].online, '--', p.cities[c].cityId, prestige, p.userId, prestigelvl, prestigeexp, p.cities[c].prestigeBuffExpire, prestige + prestigelvl, p.cities[c].blessing,false]); } t.setDistances(Cities.byID[t.ModelCityId].x, Cities.byID[t.ModelCityId].y); t.setEta(); t.displayPlayer(uid,true); }, RepaintList: function () { var t = Tabs.Player; function sortFunc(a, b) { var t = Tabs.Player; if (typeof (a[Options.PlayerOptions.sortColNum]) == 'number') { if (Options.PlayerOptions.sortDir > 0) return a[Options.PlayerOptions.sortColNum] - b[Options.PlayerOptions.sortColNum]; else return b[Options.PlayerOptions.sortColNum] - a[Options.PlayerOptions.sortColNum]; } else if (typeof (a[Options.PlayerOptions.sortColNum]) == 'boolean') { return 0; } else { if (Options.PlayerOptions.sortDir > 0) return a[Options.PlayerOptions.sortColNum].localeCompare(b[Options.PlayerOptions.sortColNum]); else return b[Options.PlayerOptions.sortColNum].localeCompare(a[Options.PlayerOptions.sortColNum]); } } t.dat.sort(sortFunc); var m = ''; var RowId = ""; var r = 0; for (var i = 0; i < t.dat.length; i++) { RowId = 'ptplay_'+t.dat[i][5].toString()+'_'+t.dat[i][6].toString(); var bless = showBlessings(t.dat[i][18]); if (bless != "") { var bless = ''+bless+'
    '; } var status = ''; if (t.dat[i][9] == 1) status = ''; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } if (t.dat[i][19]) rowClass += ' highRow'; m += ''+status+''+t.dat[i][0]+''; m += ''+(t.dat[i][1]==4294967295?'4 BILLION +':addCommasInt(t.dat[i][1]))+''; m += ''+officerId2String(t.dat[i][2])+''; m += ''+t.dat[i][7]+''; m += ''+t.dat[i][4]+''; m += ''+bless+t.dat[i][12]+t.dat[i][14]+''; m += ''+t.dat[i][15]+''; m += ''; m += ''+t.dat[i][5]+','+t.dat[i][6]+''; m += ''+t.dat[i][8].toFixed(2)+''; m += ''+(t.dat[i][10]?''+(t.dat[i][10]>0?timestr(t.dat[i][10],1):'--')+'':'--')+''; } if (ById('allBody')) { ById('allBody').innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } }, doSelectall: function () { var t = Tabs.Player; var city = ""; for (var k = 0; k < t.dat.length; k++) { city = t.dat[k][11].toString(); if (ById('ToggleScoutCheckbox').checked) ById('ptScout_' + city).checked = true; else ById('ptScout_' + city).checked = false; } }, eventCoords: function (city, x, y) { var t = Tabs.Player; var m = ''; if (city != null) { m = city.name + ' (' + city.x + ',' + city.y + ')'; t.ModelCityId = city.id; } else { m = x + ',' + y; } var distFrom = ById('distFrom'); if (distFrom) distFrom.innerHTML = m; t.setDistances(x, y); t.setEta(); t.RepaintList(); }, getLastLogDuration : function (datestr){ if (!datestr) return; var Interval = convertTime(new Date(datestr.replace(" ","T")+"Z")) - unixTime(); if (Interval < 0) return uW.timestr(Interval*(-1)) +' ago'; else return 'minutes ago'; }, ExportScoutList : function () { var t = Tabs.Player; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkScout.ImportCoords(coordlist.split(" ")); } }, ExportAttackList : function () { var t = Tabs.Player; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkAttack.ImportCoords(coordlist.split(" ")); } }, getSelected : function () { var t = Tabs.Player; var coordlist = ""; var city = ""; for (var k = 0; k < t.dat.length; k++) { city = t.dat[k][11].toString(); if (ById('ptScout_' + city).checked) { coordlist += t.dat[k][5].toString()+','+t.dat[k][6].toString()+' '; ById('ptScout_' + city).checked = false; } } return coordlist; }, HighlightDefenders : function () { var t = Tabs.Player; var delayer = 0; ById('ptHighDefenders').outerHTML = ' '; for (var k = 0; k < t.dat.length; k++) { if (!t.ReqSent[t.dat[k][5]+'_'+t.dat[k][6]] || t.ReqSent[t.dat[k][5]+'_'+t.dat[k][6]]==0) { t.ReqSent[t.dat[k][5]+'_'+t.dat[k][6]]=1; setTimeout(getDefendStatus,(250*delayer),t.dat[k][5],t.dat[k][6],false,false,t.UpdateDefendStatus,k,t.dat.length,'ptHighDefendersProg'); delayer = delayer + 1; } } function ClearAtEnd () { if (ById('ptHighDefendersProg')) { ById('ptHighDefendersProg').outerHTML = strButton20(tx('Highlight Defending Cities'),'id=ptHighDefenders'); ById('ptHighDefenders').addEventListener('click', t.HighlightDefenders, false); } }; setTimeout (ClearAtEnd,(250*delayer)); }, UpdateDefendStatus : function (rslt,x,y,k) { var t = Tabs.Player; t.ReqSent[x+'_'+y]=0; var div = ById('ptplay_'+x+'_'+y); var city = t.dat[k][11].toString(); if (rslt.ok && rslt.ok=="true") { t.dat[k][19] = true; if (div) jQuery(div).addClass("highRow"); if (ById('ptScout_' + city)) ById('ptScout_' + city).checked = true; } else { t.dat[k][19] = false; if (div) jQuery(div).removeClass("highRow"); if (ById('ptScout_' + city)) ById('ptScout_' + city).checked = false; } }, PaintGlory: function (uid) { var t = Tabs.Player; var params = uW.Object.clone(uW.g_ajaxparams); params.userId = uid; params.ctrl = 'PlayerProfile'; params.action = 'get'; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { ById('ptPaintGlory').innerHTML = addCommas(rslt.profile.glory); ById('ptPaintMaxGlory').innerHTML = addCommas(rslt.profile.maxGlory); ById('ptPaintLifetimeGlory').innerHTML = addCommas(parseIntNan(rslt.profile.lifetimeGlory)); ById('ptGloryIcon').innerHTML = ''; } else { ById('ptPaintGlory').innerHTML = '(error)'; ById('ptPaintMaxGlory').innerHTML = '(error)'; ById('ptPaintLifetimeGlory').innerHTML = '(error)'; ById('ptGloryIcon').innerHTML = ' '; } }, },true); }, getDuration: function (datestr) { var t = Tabs.Player; var Interval = convertTime(new Date(datestr.replace(" ", "T")+"Z")) - unixTime(); if (Interval >= 0) { return uW.timestr(Interval); } else return ''+tx('Expired')+' ' + uW.timestr(Interval * (-1)) + ' '+tx('Ago')+''; }, clickedSendInvite : function (span, uid){ var t = Tabs.Player; var popConfirm = null; popConfirm = new CPopup('ptConfirmAction', 0, -100, 500, 70, true, function () { clearTimeout(1000); }); popConfirm.centerMe(mainPop.getMainDiv()); var m = '

    '; m += '
     
    '; popConfirm.getMainDiv().innerHTML = m; ResetFrameSize('ptConfirmAction',70,500); popConfirm.getTopDiv().innerHTML = '
    '+tx('Confirm Alliance Invite')+'?
    '; popConfirm.show(true); ById('ptConfirm').addEventListener('click', function () { popConfirm.show(false); popConfirm.onClose(); popConfirm.destroy(); popConfirm = null; span.onclick = ''; span.innerHTML = "Sending ..."; t.invitePlayer (uid, function (r) {t.gotInviteResult(r, span)}); }, false); ById('ptCancel').addEventListener('click', function () { popConfirm.show(false); popConfirm.onClose(); popConfirm.destroy(); popConfirm = null; }, false); }, invitePlayer : function (uid, notify){ var params = uW.Object.clone(uW.g_ajaxparams); params.type = 'userId'; params.friendId = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceSendInviteToFriends.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify (rslt); }, onFailure: function () { notify ({errorMsg:'AJAX error'}); }, }); }, gotInviteResult : function (rslt, span){ var t = Tabs.Player; if (rslt.ok) { m = 'Invite Sent!'; } else { m = 'Send Invite Failed!'; } span.innerHTML = m; }, setDiplomacy : function (aid,dip,elem){ // 1 - friendly, 0 - neutral, 2 - hostile var t = Tabs.Player; var popConfirm = null; popConfirm = new CPopup('ptConfirmAction', 0, -100, 500, 70, true, function () { clearTimeout(1000); }); var DiploText = uW.g_js_strings.commonstr.neutral.toUpperCase(); if (dip==1) DiploText = uW.g_js_strings.commonstr.friendly.toUpperCase(); if (dip==2) DiploText = uW.g_js_strings.commonstr.hostile.toUpperCase(); popConfirm.centerMe(mainPop.getMainDiv()); var m = '

    '; m += '
     
    '; popConfirm.getMainDiv().innerHTML = m; ResetFrameSize('ptConfirmAction',70,500); popConfirm.getTopDiv().innerHTML = '
    '+tx('Confirm Set Diplomacy')+'?
    '; popConfirm.show(true); ById('ptConfirm').addEventListener('click', function () { popConfirm.show(false); popConfirm.onClose(); popConfirm.destroy(); popConfirm = null; var params = uW.Object.clone(uW.g_ajaxparams); params.allianceSelected = aid; params.diplomacyStatus = dip; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceSetDiplomacies.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function(rslt) { if (rslt.ok) { t.PaintDiplomacy(aid,dip,elem); } } },true); // noretry }, false); ById('ptCancel').addEventListener('click', function () { popConfirm.show(false); popConfirm.onClose(); popConfirm.destroy(); popConfirm = null; }, false); }, PaintDiplomacy : function (aid,dip,elem) { var t = Tabs.Player; if (ById(elem+aid)) { if (allianceleader) { t.friendbtn = ''; t.neutralbtn = ''; t.hostilebtn = ''; } if (dip == 1) { dip = ''+uW.g_js_strings.commonstr.friendly+' '+t.neutralbtn+' '+t.hostilebtn; } else { if (dip == 2) { dip = ''+uW.g_js_strings.commonstr.hostile+' '+t.friendbtn+' '+t.neutralbtn; } else { if (getMyAlliance()[0]!=aid) { dip = 'Neutral '+t.friendbtn+' '+t.hostilebtn; } else { dip = ''+uW.g_js_strings.commonstr.yours+' '; } } } ById(elem+aid).innerHTML = dip; } }, GetDataForMap: function (allianceId,allianceName) { var t = Tabs.Player; var params = uW.Object.clone(uW.g_ajaxparams); var Data = []; params.perPage = 100; params.allianceId = allianceId; params.type = "might"; params.page = 1; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getUserLeaderboard.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { var city = ''; for (var i = 0; i < rslt.results.length; i++) { if (rslt.results[i]['userId'] != 0) { player = rslt.results[i]['cities']; if (player) { for (var ii = 0; ii < player.length; ii++) { Data.push({ name: rslt.results[i]['displayName'], city: player[ii]['cityName'], X: player[ii]['xCoord'], Y: player[ii]['yCoord'] }); } } } } if (Data != []) t.PaintDataOnMap(Data,allianceId,allianceName); }, onFailure: function () { notify({ errorMsg: 'AJAX error' }); }, }); }, PaintDataOnMap: function (Data,allianceId,allianceName) { var t = Tabs.Player; var map = '
    '; ById('allListOut').innerHTML = map; ById('allCitySelect').style.display = 'none'; ById('allPlayerInfo').style.display = 'none'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); var eMap = ById('ptAlliProvMap'); for (var cc = 0; cc < Seed.cities.length; cc++) { var city = Cities.cities[cc]; var Xplot = parseInt((provMapCoords.mapWidth * city.x) / 750); var Yplot = parseInt((provMapCoords.mapHeight * city.y) / 750); var cf = document.createElement('div'); cf.style.backgroundImage = "url('"+URL_CASTLE_BUT+"')"; cf.style.backgroundSize = "16px 16px" cf.style.opacity = '1.0'; cf.style.position = 'relative'; cf.style.display = 'block'; cf.style.width = '16px'; cf.style.height = '16px'; cf.style.border = '1px solid #000'; cf.style.color = 'black'; cf.style.fontWeight = 'bold'; cf.style.fontSize = '10px'; cf.style.textAlign = 'center'; cf.style.top = (Yplot + provMapCoords.topMargin - (cc * 16) - 8) + 'px'; cf.style.left = (Xplot + provMapCoords.leftMargin - 8) + 'px'; cf.title = city.name+' ('+city.x+','+city.y+')'; eMap.appendChild(cf); cf.innerHTML = (cc + 1) + ''; } for (var i = 0; i < Data.length; i++) { var x = parseInt(Data[i]['X']); var y = parseInt(Data[i]['Y']); var name = Data[i]['name']; var city = Data[i]['city']; var xplot = parseInt((provMapCoords.mapWidth * x) / 750); var yplot = parseInt((provMapCoords.mapHeight * y) / 750); var ce = document.createElement('div'); ce.style.background = 'red'; ce.style.opacity = '1.0'; ce.style.position = 'relative'; ce.style.display = 'block'; ce.style.width = '4px'; ce.style.height = '4px'; ce.style.top = (yplot + provMapCoords.topMargin - (4 * i) - ((Seed.cities.length) * 18)) + 'px'; ce.style.left = (xplot + provMapCoords.leftMargin - 2) + 'px'; ce.title = name+ '\n'+city+' ('+x+','+y+')'; ce.innerHTML = ' '; eMap.appendChild(ce); } if (Seed.allianceHQ && allianceId==getMyAlliance()[0]) { PlotAllianceHQ(eMap,Data); } }, ViewChamps: function (uid,name,calledfrom) { if (uW.isNewServer()) { return; } var t = Tabs.Player; var params = uW.Object.clone(uW.g_ajaxparams); params.action = 'getEquipped'; params.playerId = uid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/otherChampionHall.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if (t.popChamp) { t.popChamp.show(false); if (t.popChamp.onClose) t.popChamp.onClose(); t.popChamp.destroy(); t.popChamp = null; } t.popChamp = new CPopup('btChamp', t.champpos.x, t.champpos.y, 100, 100, true, function () { t.champpos = t.popChamp.getLocation(); clearTimeout(1000); }); if ((t.champpos.x == -999) && (t.champpos.y == -999)) { if (calledfrom) { t.popChamp.centerMe(calledfrom); } else { t.popChamp.centerMe(mainPop.getMainDiv()); } } var m = '
    '; if (rslt.ok) { m += '
    '; for (var c in rslt.champion.champions) { var champ = rslt.champion.champions[c]; if (champ.name && champ.status) { if (champ.status != '10') {champstat = ''+uW.g_js_strings.commonstr.status+': '+uW.g_js_strings.commonstr.defending+'';} else { champstat = ''+uW.g_js_strings.commonstr.status+': '+uW.g_js_strings.commonstr.marching+'';} if (champ.assignedCity && champ.assignedCity!=0) { for (var cities in rslt.cities) { if (champ.assignedCity==rslt.cities[cities][0]) { champcity = uW.g_js_strings.commonstr.city+': '+rslt.cities[cities][1]; break; } } } else { champcity = ''+tx('No City Assigned')+''; champstat = ' '; }; m += ''; } } m += '
    '; if (uW.btFetchChampion) { m += ''; } // equipped items var CHAMP_DATA = BuildChampData (rslt.champion.equipment,champ.championId); var equippedchampstats = CHAMP_DATA.equippedchampstats; var equippedtroopstats = CHAMP_DATA.equippedtroopstats; var equippedbossstats = CHAMP_DATA.equippedbosstats; var SteelHoofCount = CHAMP_DATA.SteelHoofCount; var LightBringerCount = CHAMP_DATA.LightBringerCount; var DragonScaleCount = CHAMP_DATA.DragonScaleCount; var TestCount = CHAMP_DATA.TestCount; var WildHideCount = CHAMP_DATA.WildHideCount; var VespersCount = CHAMP_DATA.VespersCount; var SilverCount = CHAMP_DATA.SilverCount; var might = CHAMP_DATA.might; var TroopBonus = 0; m += ''; m += ''; for (var k in equippedchampstats) { str = uW.g_js_strings.effects['name_'+k]; var chEffect = getChampCappedValue(k,equippedchampstats[k]); if (k>= 300) { if (k==314) { str = ''+tx('Add. Defend Bonus')+''; } else { str = ''+tx('Inc. Bonus')+' '+str.split(" "+tx("equipment"))[0]+''; // TroopBonus += chEffect; } var champvalue = ''+((chEffect*100).toFixed(2))+"%"; } else { var champvalue = +(chEffect.toFixed(2)); } if (str && str!= "") { m += ''; } } if (VespersCount >= 4) { m+=""; } m += ''; var gottroops = false; if ((SteelHoofCount >= 4 && LightBringerCount >= 5) || (DragonScaleCount >= 6 && LightBringerCount >= 5)) { gottroops = true; if (SteelHoofCount >= 4 && LightBringerCount >= 5) { m+=''; } else { m+=''; } } else { if (SteelHoofCount >= 4 || DragonScaleCount >= 6) { gottroops = true; if (SteelHoofCount >= 4) { m+=''; } else { m+=''; } } else { if (LightBringerCount >= 5) { gottroops = true; m+=''; } else { if (WildHideCount >= 5) { gottroops = true; m+=''; } else { if (SilverCount >= 5) { gottroops = true; m+=''; } } } } } for (var k in equippedtroopstats) { var TRStyles = getTREffectStyle(k); gottroops=true; if (str && str!= "") { str = uW.g_js_strings.effects['name_'+k]; var chEffect = getChampCappedValue(k,equippedtroopstats[k]); m += ''; } } if (!gottroops) { m += ''; } for (var k in equippedbossstats) { var gotboss = false; var bosseffects = ''; for (var kk in equippedbossstats[k]) { gotboss = true; str = uW.g_js_strings.effects['name_'+kk]; if (str && str!= "") { var chEffect = getChampCappedValue(kk,equippedbossstats[k][kk]); var champvalue = ''+(chEffect.toFixed(2))+"%"; bosseffects+=""; } } if (gotboss) { m += ""+bosseffects; } } m += '
    Name: '+champ.name+'
    '+champcity+'
    '+champstat+'
    '+strButton8(tx('View Cards'),'onClick=btFetchChampion('+uid+',"'+name+'",'+champ.championId+',"'+champ.name+'")')+'
    Might: '+addCommas(might)+'
    '+uW.g_js_strings.report_view.champion_stats+'
    '+str+':'+champvalue+'
    "+uW.g_js_strings.champ.vespers+": "+uW.g_js_strings.champ.damage+""+CM.CHAMPION.getVespersDamageSetBonus().replace('+','')+"
    '+uW.g_js_strings.report_view.troop_stats+'
    '+uW.g_js_strings.champ.doubleBonus+': '+uW.g_js_strings.champ.attackRange+''+CM.CHAMPION.getSteelhoofsRangeSetBonus().replace('+','')+'
    '+uW.g_js_strings.champ.doubleBonus+': '+uW.g_js_strings.champ.attackLife+''+CM.CHAMPION.getSteelhoofsRangeSetBonus().replace('+','')+'
    '+uW.g_js_strings.champ.steelhoofsBonus+': '+uW.g_js_strings.champ.range+''+CM.CHAMPION.getSteelhoofsRangeSetBonus().replace('+','')+'
    '+uW.g_js_strings.champ.dragonscalesBonus+': '+uW.g_js_strings.champ.life+''+CM.CHAMPION.getDragonscaleLifeSetBonus().replace('+','')+'
    '+uW.g_js_strings.champ.lightbringersBonus+': '+uW.g_js_strings.champ.attack+''+CM.CHAMPION.getLightbringersRangeSetBonus().replace('+','')+'
    '+uW.g_js_strings.champ.wildhideBonus+': '+uW.g_js_strings.champ.attack+''+CM.CHAMPION.getWildhideAttackSetBonus().replace('+','')+'
    '+uW.g_js_strings.champ.silver+': '+uW.g_js_strings.champ.silverKnightBonus+''+CM.CHAMPION.getSilverknightSpeedDefenceSetBonus().replace('+','')+'
    '+TRStyles.LineStyle+str+':'+TRStyles.EndStyle+''+TRStyles.LineStyle+(Math.round((chEffect+(chEffect*TroopBonus))*100)/100)+TRStyles.EndStyle+'
    '+tx('No Troop Stats')+'
    "+str+""+champvalue+"
    "+uW.itemlist['i'+k].name+' '+uW.g_js_strings.commonstr.stats+"
    '+strButton20(tx('Refresh'), 'id=ptchamprefresh')+'
    '; } else { if (rslt.msg) { m += '

    '+rslt.msg+'
    '; } else { m += '

    '+tx('Unknown error trying to display champion hall')+'
    '; } m += '

    '+strButton20(tx('Refresh'), 'id=ptchamprefresh')+'
    '; } m += '
    '; t.popChamp.getMainDiv().innerHTML = m; ById('ptchamprefresh').addEventListener('click',function() {t.ViewChamps(uid,name);}, false); t.popChamp.getTopDiv().innerHTML = '
      '+uW.g_js_strings.champ.title_pos.replace("%1$s", name)+'  
    '; t.popChamp.show(true); ResetFrameSize('btChamp',100,100); }, },true); }, DisplayMessage : function(msg) { ById('allListOut').innerHTML = '

    '+msg+'
    '; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, show : function (init){ var t = Tabs.Player; var DispCityId = uW.currentcityid; if (init) { DispCityId = InitialCityId; } if (t.ModelCityId!=DispCityId) { t.ModelCity.selectBut(Cities.byID[DispCityId].idx); } AreYouALeader(); }, } /** Overview Tab **/ Tabs.OverView = { tabOrder: 1000, tabLabel: 'Overview', unitsarr: [], rownum: 0, myDiv: null, LoopCounter:0, resTotal: {}, troopTotal: {}, aethercap:0, Options : { OverviewFontSize : 9, AllowOverflow : false, includeDefending : false, includeMarching : true, includeTraining : false, includeTrainingExt : true, enableFoodWarn : true, FoodWarnHours : 1, Report : false, ReportInterval : 12, LastReport : 0, LastReportStatus : {1:[0,0,0,0,0,0],2:[0,0,0,0,0,0],3:[0,0,0,0,0,0],4:[0,0,0,0,0,0],5:[0,0,0,0,0,0],6:[0,0,0,0,0,0],7:[0,0,0,0,0,0],8:[0,0,0,0,0,0]}, // food,wood,stone,ore,aether,gold }, init: function (div) { var t = Tabs.OverView; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; t.unitsarr.push(i); } t.myDiv = div; t.aethercap = CM.WorldSettings.getSetting("DARK_FOREST_AETHERSTONE_CAP")||5000000; if (!Options.OverviewOptions) { Options.OverviewOptions = t.Options; } else { for (var y in t.Options) { if (!Options.OverviewOptions.hasOwnProperty(y)) { Options.OverviewOptions[y] = t.Options[y]; } } } t.sendReport(); // check every refresh }, show: function () { var t = Tabs.OverView; m = '
    '; m += '
    OVERVIEW
    '; m += '
    '; m += '
    '; m += '
     '+tx('OVERVIEW OPTIONS')+'
    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+tx('Font size')+': ' + htmlSelector({8: 8, 9: 9, 10: 10, 11: 11}, Options.OverviewOptions.OverviewFontSize, 'id=ptOverviewFont class=btInput') + ' '+tx('pixels')+'
    '+tx('Expand window width to fit')+'
    '+tx('Include Defending Troops')+'
    '+tx('Include Marching Troops/Resources')+'
    '+tx('Include Troops in Training (in Cities)')+'
    '+tx('Include Troops in Training (Total)')+'
    '+tx('Show \'Food left\' in RED if food will run out in less than')+' '; m += ' '+tx('hours')+'
    '+tx("Send resource report every")+'  '+tx('hours')+'   '+strButton8(tx('Send Now'), 'id=ptOverReportSend')+'

    '; t.myDiv.innerHTML = m; if (Options.OverviewOptions.AllowOverflow) { ById('ptOverviewDiv').style.width = 'auto'; } ById('ptOverOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Overview",100,GlobalOptions.btWinSize.x,"ptOverOption",false)}, false); ById('ptOverOver').addEventListener('click', function (evt) { var t = Tabs.OverView; var tf = ById('ptOverOver').checked; Options.OverviewOptions.AllowOverflow = tf; saveOptions(); if (tf) ById('ptOverviewDiv').style.width = 'auto'; else ById('ptOverviewDiv').style.width = GlobalOptions.btWinSize.x; t.PaintOverview(); } , false); ToggleOption('OverviewOptions','ptOverDefend','includeDefending',t.PaintOverview); ToggleOption('OverviewOptions','ptOverMarch','includeMarching',t.PaintOverview); ToggleOption('OverviewOptions','ptOverIncTrain','includeTraining',t.PaintOverview); ToggleOption('OverviewOptions','ptOverIncTrainExt','includeTrainingExt',t.PaintOverview); ToggleOption('OverviewOptions','ptEnableFoodWarn','enableFoodWarn',t.PaintOverview); ToggleOption('OverviewOptions','ptOverReport','Report',t.sendReport); ChangeIntegerOption('OverviewOptions','ptFoodHours','FoodWarnHours',1,t.PaintOverview); ChangeIntegerOption('OverviewOptions','ptOverviewFont','OverviewFontSize',9,t.PaintOverview); ChangeIntegerOption('OverviewOptions','ptOverReportInterval','ReportInterval',12,t.PaintOverview); ById('ptOverReportSend').addEventListener('click', function () { Options.OverviewOptions.LastReport = 0; saveOptions(); t.sendReport(true); }, false); t.PaintOverview(); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, postRes : function () { var t = Tabs.OverView; var msg = ':::. '+tx('Total Resources')+' |' for (var key in t.resTotal) { msg += '||' + key + ': ' + enFilter(addCommas(t.resTotal[key])); } msg += '|'; var automsg = sendChat(msg); }, postTroop : function () { var t = Tabs.OverView; var msg = ':::. '+tx('Total Troops')+' |' for (var key in t.troopTotal) { msg += '||' + key + ': ' + enFilter(addCommas(t.troopTotal[key])); } msg += '|'; var automsg = sendChat(msg); }, addListener : function (but, i){ var t = Tabs.OverView; if (!SelectiveDefending) return; but.addEventListener ('click', function (){t.ToggleDefenceMode(i)}, false); }, ToggleDefenceMode : function (cityId) { var t = Tabs.OverView; var state = 1; if (Seed.citystats["city" + cityId].gate != 0) state = 0; var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.state = state; new MyAjaxRequest(uW.g_ajaxpath + "ajax/gate.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { Seed.citystats["city" + cityId].gate = state; t.DisplayDefenceMode(cityId); } }, }); }, DisplayDefenceMode : function (cityId) { var t = Tabs.OverView; DefState = parseInt(Seed.citystats["city" + cityId].gate); if (DefState) DefButtonText = '
    '+tx('Defending')+'!
    '; else DefButtonText = '
    '+tx('Hiding')+'!
    '; var DefButton = ById('ptCityStatus_'+ cityId); DefButton.outerHTML = DefButtonText; DefButton = ById('ptCityStatus_'+ cityId); // do again because of outerHTML t.addListener(DefButton,cityId); }, getMarchInfo : function () { var t = Tabs.OverView; var ret = {}; ret.marchUnits = []; ret.returnUnits = []; ret.resources = []; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; ret.marchUnits[i] = 0; ret.returnUnits[i] = 0; } for (var i = 0; i <= 5; i++) { ret.resources[i] = 0; } var now = unixTime(); for (var i = 0; i < Cities.numCities; i++) { // each city cityId = Cities.cities[i].id; for (var k in Seed.queue_atkp['city'+cityId]) { // each march march = local_atkp[k]; if (typeof (march) == 'object') { for (var ui in CM.UNIT_TYPES) { ii = CM.UNIT_TYPES[ui]; ret.marchUnits[ii] += parseIntNan(march['unit' + ii + 'Count']); ret.returnUnits[ii] += parseIntNan(march['unit' + ii + 'Return']); } for (var ii = 1; ii <= 5; ii++) { ret.resources[ii] += parseIntNan(march['resource' + ii]); } ret.resources[0] += parseIntNan(march['gold']); } } } return ret; }, getTrainInfo : function () { var t = Tabs.OverView; var ret = {}; ret.trainUnts = []; for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; ret.trainUnts[i] = 0; } var q = Seed.queue_unt; for (var i = 0; i < Cities.numCities; i++) { // each city cityId = Cities.cities[i].id; q = Seed.queue_unt['city'+cityId]; if (q && q.length > 0) { for (var qi = 0; qi < q.length; qi++) ret.trainUnts[q[qi][0]] += parseInt(q[qi][1]); } } return ret; }, EverySecond : function () { var t = Tabs.OverView; t.LoopCounter = t.LoopCounter + 1; if (tabManager.currentTab.name == 'OverView' && Options.btWinIsOpen){ if (t.LoopCounter % 5 == 1) { // refresh display every 5 seconds t.PaintOverview(); } } if (t.LoopCounter >= 60) { // functions for every minute t.LoopCounter = 0; t.sendReport(); } }, PaintOverview : function () { var t = Tabs.OverView; var rownum = 0; function _row(name, row, noTotal, icon) { var t = Tabs.OverView; if (rownum++ % 2) style = ' class="evenRow"'; else style = ' class="oddRow"'; var tot = 0; var m = []; m.push(''); if (icon) { m.push(icon); } else { m.push(''+name+' '); } m.push(''); if (!noTotal) { for (var i = 0; i < row.length; i++) tot += row[i]; m.push('
    '); if (name == uW.g_js_strings.commonstr.gold || name == uW.g_js_strings.commonstr.food || name == uW.g_js_strings.commonstr.wood || name == uW.g_js_strings.commonstr.stone || name == uW.g_js_strings.commonstr.ore || name == uW.g_js_strings.commonstr.aetherstone) t.resTotal[name] = tot; else { if (Options.OverviewOptions.includeTrainingExt && Options.OverviewOptions.includeTraining) { tot -= row[row.length-1]; } t.troopTotal[name] = tot; } m.push(addCommas(tot)); m.push('
    '); } for (var i = 0; i < row.length; i++) { m.push('
    '); m.push(addCommas(row[i])); m.push('
    '); } m.push(''); return m.join(''); } m = ''; for (var i = 0; i < Cities.numCities; i++) { var cityId = Cities.cities[i].id; var ascended = getAscensionValues(cityId); var CityFaction = ''; if (ascended.isPrestigeCity) { CityFaction = getFactionName(ascended.prestigeType) + ' ('+ascended.prestigeLevel+')'; } m += ''; } if (Options.OverviewOptions.includeMarching) { m += ''; march = t.getMarchInfo(); } if (Options.OverviewOptions.includeTrainingExt) { m += ''; train = t.getTrainInfo(); } m += ""; // spacer rows = []; rows[0] = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; rows[0][i] = parseInt(Seed.citystats['city'+cityId].gold[0]); } for (var r = 1; r < 5; r++) { rows[r] = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; rows[r][i] = parseInt(Seed.resources['city'+cityId]['rec' + r][0] / 3600); } } rows[5] = []; for (var i = 0; i < Cities.numCities; i++) { //Aetherstone cityId = Cities.cities[i].id; rows[5][i] = parseInt(Seed.resources['city'+cityId]['rec5'][0]); } if (Options.OverviewOptions.includeMarching) { for (var i = 0; i <= 5; i++) { rows[i][Cities.numCities] = march.resources[i]; } } m += _row(uW.g_js_strings.commonstr.gold, rows[0], false, ResourceImage(GoldImage,uW.g_js_strings.commonstr.gold)); m += _row(uW.g_js_strings.commonstr.food, rows[1], false, ResourceImage(FoodImage,uW.g_js_strings.commonstr.food)); m += _row(uW.g_js_strings.commonstr.wood, rows[2], false, ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood)); m += _row(uW.g_js_strings.commonstr.stone, rows[3], false, ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone)); m += _row(uW.g_js_strings.commonstr.ore, rows[4], false, ResourceImage(OreImage,uW.g_js_strings.commonstr.ore)); m += _row(uW.g_js_strings.commonstr.aetherstone, rows[5], false, ResourceImage(AetherImage,uW.g_js_strings.commonstr.aetherstone)); m += ""; m += ''; row = []; var trupkeepreduce = 0; trupkeepreduce = Math.min(equippedthronestats(79), uW.cm.thronestats.boosts.Upkeep.Max); var trprodres = Math.min(equippedthronestats(82), uW.cm.thronestats.boosts.ResourceProduction.Max); var trprod = [0, 0, 0, 0, 0]; trprod[1] = Math.min(equippedthronestats(83), uW.cm.thronestats.boosts.ResourceProduction.Max)+trprodres; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var rp = getResourceProduction(cityId); var usage = parseIntNan(Seed.resources['city'+cityId]['rec1'][3]); var bp = CM.Resources.getProductionBase(1,cityId); row[i] = parseIntNan(rp[1] - usage + bp * trprod[1] / 100); } m += _row(uW.g_js_strings.commonstr.food+' +/-', row, true); for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; if (row[i] >= 0) row[i] = '----'; else { var timeLeft = parseInt(Seed.resources["city"+cityId]['rec1'][0]) / 3600 / (0 - row[i]) * 3600; if (timeLeft > 86313600) row[i] = '----'; else { if (Options.OverviewOptions.enableFoodWarn && timeLeft < (Options.OverviewOptions.FoodWarnHours * 3600)) row[i] = '' + timestrShort(timeLeft) + ''; else row[i] = timestrShort(timeLeft); } } } m += _row(tx('Food left'), row, true); var bonus = 1 + (CM.ThroneController.getBoundedEffect(111)/100); for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var raid = 0; for (var mid in Seed.queue_atkp["city"+cityId]) { var citymarch = Seed.queue_atkp["city"+cityId][mid]; if (citymarch.marchType == 9 && (citymarch.botMarchStatus < 3 || citymarch.botMarchStatus == 7)) { // running or resting... var foodres = citymarch.toTileLevel * 115000; if (citymarch.toTileLevel==12) foodres = 1400000; if (citymarch.toTileLevel==13) foodres = 1540000; if (citymarch.toTileLevel==14) foodres = 1700000; if (citymarch.toTileLevel==15) foodres = 2000000; var retUT = citymarch.returnUnixTime; if (isNaN(retUT)) { retUT = citymarch.returnEta; } var roundtrip = parseIntNan(retUT - citymarch.marchUnixTime); var raidres = 0; if (roundtrip != 0) { raidres = 3600/(roundtrip) * foodres * bonus; } raid += raidres; } } row[i] = parseInt(raid); } m += _row(tx('Raids (hr)'), row, true); row = []; var baseSthProt = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; baseSthProt[i] = StorehouseLevels[parseIntNan(getUniqueCityBuilding(cityId, 9).maxLevel)]; //tch14 = shrinking powder.. var SthPrtResearch = parseIntNan(Seed.tech.tch14) var TRStHsBoost = Math.min(equippedthronestats(89)+equippedthronestats(167), uW.cm.thronestats.boosts.Storehouse.Max); var totalSthPrt = [] var researchToApply = ((SthPrtResearch / 10) + 1) var TRBoostToApply = ((TRStHsBoost / 100) + 1) if (TRStHsBoost == 0) TRStHsBoost = 1 totalSthPrt[i] = addCommas(parseInt((baseSthProt[i] * researchToApply) * TRBoostToApply)) row[i] = totalSthPrt[i] } m += _row(uW.buildingcost.bdg9[0], row, true) row = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var aethcapinc = 0; aethcapinc += equippedthronestats(88); var currSet = getFactionBonus(Seed.throne.activeSlot); if (currSet.hazBonus && currSet.faction === "fey") { aethcapinc += CM.ThroneController.effectBonus(95); } var aethercap = Math.round(t.aethercap * (1 + Math.min(aethcapinc, uW.cm.thronestats.boosts["ResourceCap"].Max) / 100)); aethercap = aethercap + Math.round(aethercap*Dashboard.GetArcanaEffect(42008,i)/100); row[i] = addCommas(aethercap); } m += _row(tx('Aether Limit'), row, true) m += ''; for (var i = 0; i < Cities.numCities; i++) { m += ''; } if (Options.OverviewOptions.includeMarching) { m += ''; } if (Options.OverviewOptions.includeTrainingExt) { m += ''; } m += ""; for (var r = 1; r < t.unitsarr.length + 1; r++) { rows[r] = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; rows[r][i] = parseIntNan(Seed.units['city'+cityId]['unt'+t.unitsarr[r-1]]); if (SelectiveDefending && Options.OverviewOptions.includeDefending) rows[r][i] += parseIntNan(Seed.defunits['city'+cityId]['unt'+t.unitsarr[r-1]]); } } var colnum = Cities.numCities; if (Options.OverviewOptions.includeMarching) { for (var i = 1; i < t.unitsarr.length + 1; i++) { rows[i][colnum] = parseIntNan(march.marchUnits[t.unitsarr[i-1]]); } colnum++; } if (Options.OverviewOptions.includeTrainingExt) { for (var i = 1; i < t.unitsarr.length + 1; i++) { rows[i][colnum] = parseIntNan(train.trainUnts[t.unitsarr[i-1]]); } } if (Options.OverviewOptions.includeTraining) { var q = Seed.queue_unt; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; q = Seed.queue_unt['city'+cityId]; if (q && q.length > 0) { for (var qi = 0; qi < q.length; qi++) { qr = q[qi][0]; if (qr >= 19) qr=qr-2; rows[qr][i] += parseIntNan(q[qi][1]); } } } } rownum = 0; for (var j = 1; j < t.unitsarr.length+1; j++) { m += _row(uW.unitcost['unt'+t.unitsarr[j-1]][0], rows[j], false, TroopImage(t.unitsarr[j-1])); } m += ''; for (var i = 0; i < Cities.numCities; i++) { m += ''; } m += ''; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var tower = Seed.buildings['city'+cityId].pos99; if (tower) tower = parseInt(Seed.buildings['city'+cityId].pos99[1]) if (!tower) row[i] = ''+uW.g_js_strings.commonstr.none+'!'; else row[i] = 'Level '+tower; } m += _row(tx('Def. Tower'), row, true); for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var tower = Seed.buildings['city'+cityId].pos98; if (tower) tower = parseInt(Seed.buildings['city'+cityId].pos98[1]) if (!tower) row[i] = ''+uW.g_js_strings.commonstr.none+'!'; else row[i] = 'Level '+tower; } m += _row(tx('Redoubt Tower'), row, true); for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var marches = March.getMarchSlots(cityId); var maxmarches = March.getTotalSlots(cityId); if (marches >= maxmarches) row[i] = '' + marches + '/' + maxmarches + ''; else row[i] = marches + '/' + maxmarches; } m += _row(uW.buildingcost.bdg12[0], row, true); for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var totWilds = 0; dat = Seed.wilderness['city'+cityId]; if (dat != null && matTypeof(dat) == 'object') for (var k in dat) ++totWilds; var castle = getMaxWilds(cityId); if (totWilds < castle) row[i] = '' + totWilds + '/' + castle + ''; else row[i] = totWilds + '/' + castle; } m += _row(tx('Wilds'), row, true); row = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; totKnights = 0; dat = Seed.knights['city'+cityId]; for (var k in dat) ++totKnights; row[i] = totKnights; } m += _row(uW.g_js_strings.report_view.knights, row, true); var AuraDist = ''; if (ArcanaEnabled()) { AuraDist = parseIntNan(Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].distance); } row = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var ArcaneAura = ''+tx('None')+'!' if (Seed.allianceHQ) { var HQDist = distance(Seed.cities[i][2], Seed.cities[i][3], Seed.allianceHQ.hq_xcoord, Seed.allianceHQ.hq_ycoord); if (HQDist<=AuraDist) { ArcaneAura = ''+HQDist+''; } else { ArcaneAura = ''+HQDist+''; } } row[i] = ArcaneAura; } m += _row(tx('HQ Distance'), row, true); m += ''; var now = unixTime(); var row = []; var rowsp = []; var rowrev = []; var rowres = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var totTime = 0; var totTime2 = 0; var q = Seed.queue_unt['city'+cityId]; if (q != null && q.length > 0) { for (var j = 0; j < q.length; j++) { if (q[j][7]) totTime2 = q[j][3] - now; else totTime = q[j][3] - now; } } if (totTime < 0) totTime = 0; if (totTime < 3600) row[i] = '' + timestr(totTime) + ''; else row[i] = timestr(totTime); if (totTime2 < 0) totTime2 = 0; if (totTime2 < 3600) rowsp[i] = '' + timestr(totTime2) + ''; else rowsp[i] = timestr(totTime2); var totTime = 0; var qr = Seed.queue_revive['city'+cityId]; rowrev[i] = 0; if (qr != null && qr.length > 0) { totTime = qr[qr.length - 1][3] - now; if (totTime < 0) rowrev[i] = 0; else if (totTime < 3600) rowrev[i] = '' + timestr(totTime) + ''; else rowrev[i] = timestr(totTime); } var totTime = 0; var qr2 = Seed.queue_revive2['city'+cityId]; if (qr2 != null && qr2.length > 0) { totTime = qr2[qr2.length - 1][3] - now; if (totTime >= 0) { if (totTime < 3600) rowrev[i] += '
    ' + timestr(totTime) + ''; else rowrev[i] += '
    '+timestr(totTime); } } var totTime = 0; var qres = Seed.queue_tch['city'+cityId]; rowres[i] = 0; if (qres != null && qres.length > 0) { totTime = qres[qres.length - 1][3] - now; if (totTime < 0) rowres[i] = 0; else if (totTime < 3600) rowres[i] = '' + timestr(totTime) + ''; else rowres[i] = timestr(totTime); } var totTime = 0; var qres2 = Seed.queue_tch2['city'+cityId]; if (qres2 != null && qres2.length > 0) { totTime = qres2[qres2.length - 1][3] - now; if (totTime >= 0) { if (totTime < 3600) rowres[i] += '
    ' + timestr(totTime) + ''; else rowres[i] += '
    '+timestr(totTime); } } } m += _row(tx('Training'), row, true); m += _row(tx('Asc. Training'), rowsp, true); m += _row(tx('Reviving'), rowrev, true); m += _row(tx('Researching'), rowres, true); var row = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var wall = {}; getWallInfo(cityId,wall); var totTime = 0; var q = Seed.queue_fort['city'+cityId]; if (q != null && q.length > 0) totTime = q[q.length - 1][3] - now; if (totTime < 0) totTime = 0; if (totTime < 1 && (wall.wallSpaceUsed < wall.wallSpace - 4 || wall.fieldSpaceUsed < wall.fieldSpace - 4)) row[i] = '' + timestr(totTime) + ''; else row[i] = timestr(totTime); } m += _row(uW.g_js_strings.report_view.defenses, row, true); ById('ptOverviewDiv').innerHTML = m; ById('ptpostres').addEventListener('click', t.postRes, false); ById('ptposttroop').addEventListener('click', t.postTroop, false); for (var cityId in Cities.byID){ var DefButton = ById('ptCityStatus_'+ cityId); t.addListener(DefButton,cityId); } }, sendReport: function(force){ var t = Tabs.Overview; if(!Options.OverviewOptions.Report && !force) { return; } var now = unixTime(); if (!force) { if (now < (parseInt(Options.OverviewOptions.LastReport)+(Options.OverviewOptions.ReportInterval*60*60))) { return; } var message = tx('Resource Report for')+' '+Options.OverviewOptions.ReportInterval+' '+tx('hours (or since last report)')+' %0A'; } else { var message = tx('Resource Report (since last report)')+' %0A'; } var total = 0; var totalgain = 0; message += '%0A ---------- '+uW.g_js_strings.commonstr.food+' ---------- %0A'; for (q=1;q<=Seed.cities.length;q++){ var cityId = Seed.cities[q-1][0]; var oldval = Options.OverviewOptions.LastReportStatus[q][0]; var newval = parseInt(Seed.resources['city'+cityId]['rec1'][0] / 3600); var gain = newval-oldval; message += Seed.cities[q-1][1]+': '+tx('Start')+': '+addCommas(oldval)+' '+tx('End')+': '+addCommas(newval)+' '+tx('Gain')+': '+addCommas(gain)+'%0A'; total += newval; totalgain += gain; Options.OverviewOptions.LastReportStatus[q][0] = newval; } message += '%0A '+tx('Total Food')+' : '+addCommas(total); message += '%0A '+tx('Total Gain')+' : '+addCommas(totalgain)+' %0A'; total = 0; totalgain = 0; message += '%0A ---------- '+uW.g_js_strings.commonstr.aetherstone+' ---------- %0A'; for (q=1;q<=Seed.cities.length;q++){ var cityId = Seed.cities[q-1][0]; var oldval = Options.OverviewOptions.LastReportStatus[q][4]; var newval = parseInt(Seed.resources['city'+cityId]['rec5'][0]); var gain = newval-oldval; message+= Seed.cities[q-1][1]+': '+tx('Start')+': '+addCommas(oldval)+' '+tx('End')+': '+addCommas(newval)+' '+tx('Gain')+': '+addCommas(gain)+'%0A'; total += newval; totalgain += gain; Options.OverviewOptions.LastReportStatus[q][4] = newval; } message += '%0A '+tx('Total Aetherstone')+' : '+addCommas(total); message += '%0A '+tx('Total Gain')+' : '+addCommas(totalgain)+' %0A'; total = 0; totalgain = 0; message += '%0A ---------- '+uW.g_js_strings.commonstr.ore+' ---------- %0A'; for (q=1;q<=Seed.cities.length;q++){ var cityId = Seed.cities[q-1][0]; var oldval = Options.OverviewOptions.LastReportStatus[q][3]; var newval = parseInt(Seed.resources['city'+cityId]['rec4'][0] / 3600); var gain = newval-oldval; message+= Seed.cities[q-1][1]+': '+tx('Start')+': '+addCommas(oldval)+' '+tx('End')+': '+addCommas(newval)+' '+tx('Gain')+': '+addCommas(gain)+'%0A'; total += newval; totalgain += gain; Options.OverviewOptions.LastReportStatus[q][3] = newval; } message += '%0A '+tx('Total Ore')+' : '+addCommas(total); message += '%0A '+tx('Total Gain')+' : '+addCommas(totalgain)+' %0A'; total = 0; totalgain = 0; message += '%0A ---------- '+uW.g_js_strings.commonstr.wood+' ---------- %0A'; for (q=1;q<=Seed.cities.length;q++){ var cityId = Seed.cities[q-1][0]; var oldval = Options.OverviewOptions.LastReportStatus[q][1]; var newval = parseInt(Seed.resources['city'+cityId]['rec2'][0] / 3600); var gain = newval-oldval; message+= Seed.cities[q-1][1]+': '+tx('Start')+': '+addCommas(oldval)+' '+tx('End')+': '+addCommas(newval)+' '+tx('Gain')+': '+addCommas(gain)+'%0A'; total += newval; totalgain += gain; Options.OverviewOptions.LastReportStatus[q][1] = newval; } message += '%0A '+tx('Total Wood')+' : '+addCommas(total); message += '%0A '+tx('Total Gain')+' : '+addCommas(totalgain)+' %0A'; total = 0; totalgain = 0; message += '%0A ---------- '+uW.g_js_strings.commonstr.stone+' ---------- %0A'; for (q=1;q<=Seed.cities.length;q++){ var cityId = Seed.cities[q-1][0]; var oldval = Options.OverviewOptions.LastReportStatus[q][2]; var newval = parseInt(Seed.resources['city'+cityId]['rec3'][0] / 3600); var gain = newval-oldval; message+= Seed.cities[q-1][1]+': '+tx('Start')+': '+addCommas(oldval)+' '+tx('End')+': '+addCommas(newval)+' '+tx('Gain')+': '+addCommas(gain)+'%0A'; total += newval; totalgain += gain; Options.OverviewOptions.LastReportStatus[q][2] = newval; } message += '%0A '+tx('Total Stone')+' : '+addCommas(total); message += '%0A '+tx('Total Gain')+' : '+addCommas(totalgain)+' %0A'; total = 0; totalgain = 0; message += '%0A ---------- '+uW.g_js_strings.commonstr.gold+' ---------- %0A'; for (q=1;q<=Seed.cities.length;q++){ var cityId = Seed.cities[q-1][0]; var oldval = Options.OverviewOptions.LastReportStatus[q][5]; var newval = parseInt(Seed.citystats["city"+cityId]['gold'][0]); var gain = newval-oldval; message+= Seed.cities[q-1][1]+': '+tx('Start')+': '+addCommas(oldval)+' '+tx('End')+': '+addCommas(newval)+' '+tx('Gain')+': '+addCommas(gain)+'%0A'; total += newval; totalgain += gain; Options.OverviewOptions.LastReportStatus[q][5] = newval; } message += '%0A '+tx('Total Gold')+' : '+addCommas(total); message += '%0A '+tx('Total Gain')+' : '+addCommas(totalgain)+' %0A'; message += '%0A '; var params = uW.Object.clone(uW.g_ajaxparams); params.emailTo = Seed.player['name']; params.subject = tx("Resource Overview"); params.message = message; params.requestType = "COMPOSED_MAIL"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { DeleteLastMessage(); } }, }); Options.OverviewOptions.LastReport = now; saveOptions(); }, } /** Search Tab **/ Tabs.Search = { tabOrder: 1020, tabLabel: 'Search', myDiv: null, MapAjax : new CMapAjax(), MAX_SHOW_WHILE_RUNNING : 500, PANEL_HEIGHT : 500, FilterShow : true, BlockList : [], Blocks : [], SearchList : [], Rankings : [], mapDat : [], dat : [], KMData : [], OldMists : [], opt : {}, ModelCity: null, ModelCityId: 0, searchRunning : false, blocksTotal : 0, blocksSearched : 0, tilesFound : 0, firstX : 0, firstY : 0, lastX : 0, lastY : 0, LastSearch : {}, QSMarching : {}, ReqSent : {}, mists : 0, scouted : 0, SearchTimer : null, LoopCounter : 1, Options: { SearchType : 0, // 0 - city, 1 - barb camp, 2 - wild, 3 - dark forest, 4 - merc camp, 5 - nomad camp, 6 - alliance HQ - anything greater than 1, treat like wild! SearchShape : 0, // 0 - square, 1 - circle MinLevel : 1, MaxLevel : 10, WildType : 1, // 0 - bog, 1 - grassland/lake, 2 - forest, 3 - hill, 4 - mountain, 5 - plain, 99 - all Unowned : true, Misted : true, OldMists : true, NewMists : true, Hostile : true, Friendly : true, // and own alliance Neutral : true, Unallied : true, MinMight : '', MaxMight : '', Rank : '', RankType : '', AllianceName : '', PlayerName : '', sortColNum : 2, sortDir : 1, }, // t.mapDat // 0 - map[k].xCoord // 1 - map[k].yCoord // 2 - distance // 3 - map[k].tileType // 4 - map[k].tileLevel // 5 - map[k].tileCityId // 6 - uid // 7 - map[k].cityName // 8 - name // 9 - might // 10 - alliance // 11 - aid // 12 - Online // 13 - misted // 14 - map[k].isPrestige // 15 - map[k].prestigeLevel // 16 - map[k].prestigeType // 17 - map[k].tileId // 18 - map[k].tileProvinceId // 19 - Defending // 20 - map[k].premiumTile // 21 - map[k].allianceHq.hqId // // t.dat = filtered subset of above init: function (div) { var t = Tabs.Search; t.myDiv = div; if (!Options.SearchOptions) { Options.SearchOptions = t.Options; } else { for (var y in t.Options) { if (!Options.SearchOptions.hasOwnProperty(y)) { Options.SearchOptions[y] = t.Options[y]; } } } uWExportFunction('ptsearchClickSort', Tabs.Search.searchClickSort); uWExportFunction('searchquickmarch', Tabs.Search.searchquickmarch); uWExportFunction('btShowHQMembers', Tabs.Search.ShowHQMembers); var m = '
    '+tx('MAP SEARCH')+'
    '; m += '
     '+tx('TOTALS')+''+Cities.cities[i].name.substring(0, 12)+'
    '+coordLink(Cities.cities[i].x, Cities.cities[i].y)+'
    '+uW.provincenames['p' + Cities.cities[i].provId]+'
    '+CityFaction+'
    '; DefState = parseInt(Seed.citystats["city" + cityId].gate); if (DefState) DefButtonText = '
    '+tx('Defending')+'!
    '; else DefButtonText = '
    '+tx('Hiding')+'!
    '; m += DefButtonText+'
    '+tx('Marching')+'  
     
      '+Cities.cities[i].name.substring(0, 12)+''+tx('Marching')+''+tx('Training')+' 
     '+Cities.cities[i].name.substring(0, 12)+'
    '+tx('Queues')+' 
    '; m += ''; m += ''; m += '
    '; if (ArcanaEnabled()) { m += ' '+tx('Search HQ Arcane Aura')+''; } m += ' 
    '+tx('Search Coords')+': X:   Y: '; m += '  '+tx("Radius")+': '; m += '  
    '+tx('Or Search')+':  ' + tx('Divide into')+': '+ htmlSelector ({1:'1', 4:'4', 9:'9', 16:'16', 25:'25', 36:'36', 49:'49', 64:'64'}, 1, 'id=pbProvinceSlices')+' '+tx('squares')+'.   '+tx('Your Square')+':  '+tx('Detect new mists')+''; m += ' '; m += ''+tx('Start Search')+'
    '; m += '
     
     
    '; div.innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); t.ModelCity = new CdispCityPicker ('pbSearchCity', ById ('pbSearchCitySpan'), true, t.citySelNotify, null); t.ModelCity.bindToXYboxes(ById ('pbSearchX'), ById ('pbSearchY')); ById ('pbSearchProvince').addEventListener ('click', function() { if (this.value != 0) { ById ('pbSearchX').value = Provinces[this.value].x+75; ById ('pbSearchY').value = Provinces[this.value].y+75; ById ('pbSearchDist').value = '75'; t.setSlice(); Options.SearchOptions.SearchShape = 0; // square saveOptions(); } }, false); ById ('pbProvinceSlice').addEventListener ('change', function() { t.setSlice(); }, false); ById ('pbautoKM').addEventListener ('change', function() { if (t.mapDat.length!=0) { t.setupFilterDisplay(); if (t.opt.province != 0 && ById('pbautoKM').checked) { t.LookupMists(t.opt.province,t.dispMapTable); } else { t.KMData = []; t.dispMapTable(); } } }, false); ById ('pbClearMistData').addEventListener ('click', function() { t.clearoldmists(); }, false); jQuery("#pbProvinceSlices").change(function () { var numslices = ById('pbProvinceSlices').value; var yourslice = ById('pbProvinceSlice'); jQuery("#pbProvinceSlice").empty(); for (var i=1;i<=numslices;i++) { var slOption = document.createElement('option'); slOption.text = i; slOption.value = i; yourslice.add(slOption); } jQuery("#pbProvinceSlice").val(1); t.setSlice(); }); ById('pbSearchDist').addEventListener ('keydown', t.e_coordChange, false); ById('pbSearchX').addEventListener ('keydown', t.e_coordChange, false); ById('pbSearchY').addEventListener ('keydown', t.e_coordChange, false); ById('pbSearchY').addEventListener ('change', t.e_coordChange, false); ById('pbSearchY').addEventListener ('change', t.e_coordChange, false); ById('pbSearchSubmit').addEventListener ('click', t.clickedSearch, false); if (ById('pbSearchAura')) { ById('pbSearchAura').addEventListener ('click', t.clickedSearchAura, false); } setTimeout (function () { t.readlastsearch( function () { if (t.LastSearch.mapDat && t.LastSearch.mapDat != []) { t.displaylastsearch(); } }); }, 0); // window.addEventListener('unload', t.onUnload, false); // setTimeout (t.readoldmists, 0); }, onUnload : function () { var t = Tabs.Search; var numRows = t.mapDat.length; if (numRows > 0){ for (var i=0; i limitx) { nextx = originx+distance; nexty = nexty+(distance*2); if (nexty > limity) return; // ffs I dunno } } } }, citySelNotify : function (city,x,y){ var t = Tabs.Search; if (city) { t.ModelCityId = city.id; } }, saveoldmists : function (){ var t = Tabs.Search; var serverID = getServerId(); setTimeout(function () { GM_setValue ('OldMists_'+serverID+'_'+uW.tvuid, JSON2.stringify(t.OldMists)); },0); // get around GM_SetValue uW error }, readoldmists : function (notify) { var t = Tabs.Search; var serverID = getServerId(); var l = JSON2.parse(GM_getValue ('OldMists_'+getServerId()+'_'+uW.tvuid, '[]')); if (matTypeof(l) == 'array') { t.OldMists = l; } if (notify) { notify(); } }, clearoldmists : function () { var t = Tabs.Search; t.OldMists = []; t.saveoldmists(); }, savelastsearch : function (){ var t = Tabs.Search; var serverID = getServerId(); setTimeout(function () { GM_setValue ('LastSearch_'+serverID+'_'+uW.tvuid, JSON2.stringify(t.LastSearch)); },0); // get around GM_SetValue uW error }, readlastsearch : function (notify) { var t = Tabs.Search; var serverID = getServerId(); s = GM_getValue ('LastSearch_'+serverID+'_'+uW.tvuid); if (s != null){ opts = JSON2.parse (s); for (var k in opts) t.LastSearch[k] = opts[k]; } if (notify) { notify(); } }, clearlastsearch : function () { var t = Tabs.Search; ById('pbsavedsearch').innerHTML = " "; t.LastSearch = {}; t.savelastsearch(); }, showlastsearch : function () { var t = Tabs.Search; if (t.searchRunning){ t.stopSearch (tx('Search Cancelled!')); } ById ('pbSearchX').value = t.LastSearch.opt.startX; ById ('pbSearchY').value = t.LastSearch.opt.startY; ById ('pbSearchDist').value = t.LastSearch.opt.maxDistance; ById('pbSearchProvince').value = t.LastSearch.opt.province; ById('pbProvinceSlice').value = t.LastSearch.opt.provinceSlice; ById('pbProvinceSlices').value = t.LastSearch.opt.provinceSlices; t.mapDat = t.LastSearch.mapDat.slice(); t.opt.startX = parseInt(t.LastSearch.opt.startX); t.opt.startY = parseInt(t.LastSearch.opt.startY); t.opt.maxDistance = parseInt(t.LastSearch.opt.maxDistance); t.opt.province = ById('pbSearchProvince').value; t.opt.provinceSlice = ById('pbProvinceSlice').value; t.opt.provinceSlices = ById('pbProvinceSlices').value; t.setupResultsPanel(true); t.stopSearch('Previous Search'); }, displaylastsearch : function () { var t = Tabs.Search; n = tx("Previous Search")+' ('+uW.formatDate(uWCloneInto(new Date(t.LastSearch.time * 1000)), "NNN dd, HH:mm")+')  '; ById('pbsavedsearch').innerHTML = n; ById('pbclearlastsearch').addEventListener('click', t.clearlastsearch, false); ById('pbshowlastsearch').addEventListener('click', t.showlastsearch, false); }, clickedSearchAura : function () { var t = Tabs.Search; if (t.searchRunning){ t.stopSearch (''); } ById('pbSearchX').value = Seed.allianceHQ.hq_xcoord; ById('pbSearchY').value = Seed.allianceHQ.hq_ycoord; ById('pbSearchDist').value = Math.min(parseIntNan(Seed.allianceHQ.arcana[Seed.allianceHQ.buildings[3].buildingLevel].distance),75); saveOptions(); t.clickedSearch(); }, clickedSearch : function (){ var t = Tabs.Search; if (t.searchRunning){ t.stopSearch (tx('Search Cancelled!'),true); return; } t.opt.startX = parseInt(ById('pbSearchX').value); t.opt.startY = parseInt(ById('pbSearchY').value); t.opt.maxDistance = parseInt(ById('pbSearchDist').value); t.opt.province = ById('pbSearchProvince').value; t.opt.provinceSlice = ById('pbProvinceSlice').value; t.opt.provinceSlices = ById('pbProvinceSlices').value; errMsg = ''; if (isNaN (t.opt.startX) ||t.opt.startX<0 || t.opt.startX>749) errMsg = "X "+tx("co-ordinate must be between 0 and 749")+"
    "; if (isNaN (t.opt.startY) ||t.opt.startY<0 || t.opt.startY>749) errMsg += "Y "+tx("co-ordinate must be between 0 and 749")+"
    "; if (isNaN (t.opt.maxDistance) ||t.opt.maxDistance<1 || t.opt.maxDistance>75) errMsg += tx("Radius (distance) must be between")+" 1 "+tx("and")+" 75
    "; if (errMsg != ''){ ById('pbSearchResults').innerHTML = '
    '+tx("ERROR")+':

    '+errMsg+'
    '; return; } t.searchRunning = true; ById('pbSearchSubmit').innerHTML = ''+tx('Stop Search')+''; t.setupResultsPanel(false); if (t.opt.province != 0 && ById('pbautoKM').checked) { t.LookupMists(t.opt.province); } // save any mists in current map array to old mists array, before clearing... var numRows = t.mapDat.length; if (numRows > 0){ for (var i=0; i=750) { t.lastX-=750; } if (t.lastY>=750) { t.lastY-=750; } t.BlockList = t.MapAjax.generateBlockList(t.firstX,t.firstY,t.opt.maxDistance); t.blocksTotal = t.BlockList.length; t.blocksSearched = 0; t.tilesFound = 0; var counter = t.BlockList.length; if (counter > MAX_BLOCKS) { counter = MAX_BLOCKS; } var curX = t.firstX; var curY = t.firstY; ById ('pbStatStatus').innerHTML = tx('Searching at ')+curX+','+curY; t.Blocks = []; for (var i=1;i<=counter;i++) { t.Blocks.push(t.BlockList.shift()); t.blocksSearched++; } var blockString = t.Blocks.join("%2C"); t.MapAjax.LookupMap (blockString, function(rslt) { t.eventGetPlayerOnline(blockString,rslt);}); }, setupResultsPanel : function (Previous) { var t = Tabs.Search; if (t.FilterShow) { var FilterDisp = ''; var ResultWidth = GlobalOptions.btWinSize.x-155; var FilterArrow = WhiteLeftArrow; } else { var ResultWidth = GlobalOptions.btWinSize.x-25; var FilterDisp = 'none'; var FilterArrow = WhiteRightArrow; } var HEIGHT1 = t.PANEL_HEIGHT-35; var HEIGHT2 = t.PANEL_HEIGHT-25; var HEIGHT3 = t.PANEL_HEIGHT-20; m = '
    '; m += ''; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += '
     
    '; ById('pbSearchResults').innerHTML = m; ById('pbSearchOpener').addEventListener ('click', t.ToggleSearchFilters, false); /* paint filter panel */ m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx('Filters')+'
    '; m += '
    '+tx('Search Type')+':
    '+ htmlSelector ({0:tx("Cities"), 1:tx("Barb Camps"), 2:tx("Wilds"), 3:tx("Dark Forests"), 6:tx("Alliance HQ"), 4:tx("Mercenary Camps"), 5:tx("Nomad Camps"), 7:tx("Runic Megaliths")}, Options.SearchOptions.SearchType, 'id=pbSearchType class=btInput')+'
    '+tx('Wild Type')+':
    '+ htmlSelector ({0:tx("Bogs"),1:tx("Grassland/Lakes"),2:tx("Woods"),3:tx("Hills"),4:tx("Mountains"),5:tx("Plains"),99:tx("ALL")}, Options.SearchOptions.WildType, 'id=pbSearchWildType class=btInput')+'
    '+tx('Tile Levels')+':
     - 
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx('Unowned')+'
    '+tx('Misted')+'
          '+tx('Old')+'
          '+tx('New')+'
    '+tx('Friendly')+'
    '+tx('Hostile')+'
    '+tx('Neutral')+'
    '+tx('Unallied')+'
    '+tx('Might (Billion)')+':
     - 
    '+tx('Alliance Rank')+':
     '+ htmlSelector ({0:tx("and Above"), 1:tx("and Below")}, Options.SearchOptions.RankType, 'id=pbSearchRankType class=btInput')+'
    '+tx('Alliance Name')+':
    '+tx('Player Name')+':
    '+tx('Search Shape')+':
    '+ htmlSelector ({0:tx("Square"), 1:tx("Circle")}, Options.SearchOptions.SearchShape, 'id=pbSearchShape class=btInput')+'
    '; ById('pbSearchFilters').innerHTML = m; m = '
    '+tx("Auto-QuickScout Mists")+'
     
    '; ById('pbSearchBottom').innerHTML = m; ById('pbAutoQS').addEventListener ('change', function (){ t.dispMapTable (); }, false); // triggers autoQS t.setupFilterDisplay(); ById('pbSearchType').addEventListener ('change', function (e){ Options.SearchOptions.SearchType = e.target.value; saveOptions(); t.setupFilterDisplay(); t.dispMapTable(); }, false); ChangeOption('SearchOptions','pbSearchWildType','WildType',t.dispMapTable); ChangeOption('SearchOptions','pbSearchShape','SearchShape',t.dispMapTable); ById('pbSearchMinLevel').addEventListener ('change', t.MinLevelChange, false); ById('pbSearchMinLevel').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.MinLevelChange); }, false); ById('pbSearchMaxLevel').addEventListener ('change', t.MaxLevelChange, false); ById('pbSearchMaxLevel').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.MaxLevelChange); }, false); ById('pbSearchMinMight').addEventListener ('change', t.MinMightChange, false); ById('pbSearchMinMight').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.MinMightChange); }, false); ById('pbSearchMaxMight').addEventListener ('change', t.MaxMightChange, false); ById('pbSearchMaxMight').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.MaxMightChange); }, false); ById('pbSearchRank').addEventListener ('change', t.SearchRankChange, false); ById('pbSearchRank').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.SearchRankChange); }, false); ById('pbSearchRankType').addEventListener ('change', function (e){ Options.SearchOptions.RankType = e.target.value; saveOptions(); t.AllianceRankings(Options.SearchOptions.Rank,Options.SearchOptions.RankType,function (e) { t.Rankings = e; t.dispMapTable(); }); }, false); ById('pbSearchAllName').addEventListener ('change', t.SearchAllNameChange, false); ById('pbSearchAllName').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.SearchAllNameChange); }, false); ById('pbSearchPlayerName').addEventListener ('change', t.SearchPlayerNameChange, false); ById('pbSearchPlayerName').addEventListener ('keyup', function (e){ StartKeyTimer(e.target, t.SearchPlayerNameChange); }, false); ToggleOption('SearchOptions','pbSearchUnowned','Unowned',t.dispMapTable); ToggleOption('SearchOptions','pbSearchMisted','Misted',function() { t.setupFilterDisplay();t.dispMapTable();}); ToggleOption('SearchOptions','pbSearchOldMists','OldMists',t.dispMapTable); ToggleOption('SearchOptions','pbSearchNewMists','NewMists',t.dispMapTable); ToggleOption('SearchOptions','pbSearchFriendly','Friendly',t.dispMapTable); ToggleOption('SearchOptions','pbSearchHostile','Hostile',t.dispMapTable); ToggleOption('SearchOptions','pbSearchNeutral','Neutral',t.dispMapTable); ToggleOption('SearchOptions','pbSearchUnallied','Unallied',t.dispMapTable); if (parseIntNan(Options.SearchOptions.Rank)!=0) { t.AllianceRankings(Options.SearchOptions.Rank,Options.SearchOptions.RankType,function (e) { t.Rankings = e; if (!t.searchRunning) { t.dispMapTable(); } }); } }, MinLevelChange : function () { var t = Tabs.Search; if (KeyTimer) { clearTimeout(KeyTimer); } var e = ById('pbSearchMinLevel'); if (isNaN(e.value)) { e.value = ''; } Options.SearchOptions.MinLevel = e.value; saveOptions(); t.dispMapTable(); }, MaxLevelChange : function () { var t = Tabs.Search; if (KeyTimer) { clearTimeout(KeyTimer); } var e = ById('pbSearchMaxLevel'); if (isNaN(e.value)) { e.value = ''; } Options.SearchOptions.MaxLevel = e.value; saveOptions(); t.dispMapTable(); }, MinMightChange : function () { var t = Tabs.Search; if (KeyTimer) { clearTimeout(KeyTimer); } var e = ById('pbSearchMinMight'); if (isNaN(e.value)) { e.value = ''; } Options.SearchOptions.MinMight = e.value; saveOptions(); t.dispMapTable(); }, MaxMightChange : function () { var t = Tabs.Search; if (KeyTimer) { clearTimeout(KeyTimer); } var e = ById('pbSearchMaxMight'); if (isNaN(e.value)) { e.value = ''; } Options.SearchOptions.MaxMight = e.value; saveOptions(); t.dispMapTable(); }, SearchRankChange : function () { var t = Tabs.Search; if (KeyTimer) { clearTimeout(KeyTimer); } var e = ById('pbSearchRank'); if (isNaN(e.value)) { e.value = ''; } if (e.value>50) { e.value = 50; } Options.SearchOptions.Rank = e.value; saveOptions(); t.AllianceRankings(Options.SearchOptions.Rank,Options.SearchOptions.RankType,function (e) { t.Rankings = e; t.dispMapTable(); }); }, SearchAllNameChange : function () { var t = Tabs.Search; if (KeyTimer) { clearTimeout(KeyTimer); } var e = ById('pbSearchAllName'); Options.SearchOptions.AllianceName = e.value; saveOptions(); t.dispMapTable(); }, SearchPlayerNameChange : function () { var t = Tabs.Search; if (KeyTimer) { clearTimeout(KeyTimer); } var e = ById('pbSearchPlayerName'); Options.SearchOptions.PlayerName = e.value; saveOptions(); t.dispMapTable(); }, setupFilterDisplay : function () { var t = Tabs.Search; var stype = Options.SearchOptions.SearchType; if (stype == 2) { jQuery('#pbswild1').removeClass('divHide'); jQuery('#pbswild2').removeClass('divHide'); jQuery('#pbsunowned').removeClass('divHide'); } else { jQuery('#pbswild1').addClass('divHide'); jQuery('#pbswild2').addClass('divHide'); jQuery('#pbsunowned').addClass('divHide'); } if (stype != 0 && stype != 6) { jQuery('#pbslevel1').removeClass('divHide'); jQuery('#pbslevel2').removeClass('divHide'); } else { jQuery('#pbslevel1').addClass('divHide'); jQuery('#pbslevel2').addClass('divHide'); } if (stype != 0) { if (ById('pbHighDefenders')) ById('pbHighDefenders').style.display = 'none'; } else { if (ById('pbHighDefenders')) ById('pbHighDefenders').style.display = ''; } if (stype == 0 || stype == 2 || stype==6) { jQuery('#pbsplayerchecks').removeClass('divHide'); jQuery('#pbsrank1').removeClass('divHide'); jQuery('#pbsrank2').removeClass('divHide'); jQuery('#pbsaname1').removeClass('divHide'); jQuery('#pbsaname2').removeClass('divHide'); if (stype == 6) { jQuery('#pbsmight1').addClass('divHide'); jQuery('#pbsmight2').addClass('divHide'); jQuery('#pbspname1').addClass('divHide'); jQuery('#pbspname2').addClass('divHide'); jQuery('#pbautoqsdiv').addClass('divHide'); } else { jQuery('#pbspname1').removeClass('divHide'); jQuery('#pbspname2').removeClass('divHide'); jQuery('#pbsmight1').removeClass('divHide'); jQuery('#pbsmight2').removeClass('divHide'); jQuery('#pbautoqsdiv').removeClass('divHide'); } } else { jQuery('#pbsplayerchecks').addClass('divHide'); jQuery('#pbsrank1').addClass('divHide'); jQuery('#pbsrank2').addClass('divHide'); jQuery('#pbsaname1').addClass('divHide'); jQuery('#pbsaname2').addClass('divHide'); jQuery('#pbsmight1').addClass('divHide'); jQuery('#pbsmight2').addClass('divHide'); jQuery('#pbspname1').addClass('divHide'); jQuery('#pbspname2').addClass('divHide'); jQuery('#pbautoqsdiv').addClass('divHide'); } if ((stype == 0) && Options.SearchOptions.Misted && ById('pbautoKM').checked) { jQuery('#pbsmisted1').removeClass('divHide'); jQuery('#pbsmisted2').removeClass('divHide'); } else { jQuery('#pbsmisted1').addClass('divHide'); jQuery('#pbsmisted2').addClass('divHide'); } if (stype == 6) { jQuery('#pbsmisted').addClass('divHide'); jQuery('#pbsunallied').addClass('divHide'); } else { jQuery('#pbsmisted').removeClass('divHide'); jQuery('#pbsunallied').removeClass('divHide'); } }, ToggleSearchFilters : function (){ var t = Tabs.Search; t.FilterShow = !t.FilterShow; var div = ById('pbSearchFilterContainer'); if (div.style.display == 'none'){ div.style.display = ''; var ResultWidth = GlobalOptions.btWinSize.x-155; ById('pbSearchOpenerImage').src = WhiteLeftArrow; } else { div.style.display = 'none'; var ResultWidth = GlobalOptions.btWinSize.x-25; ById('pbSearchOpenerImage').src = WhiteRightArrow; } ById('pbResultsPanel').style.maxWidth = ResultWidth+'px'; }, AllianceRankings : function (rank, type, callback, page, prop) { var t = Tabs.Search; if(parseIntNan(rank)==0) return; var limit = rank-1; if (type==0) { // above, so include passed rank limit=rank; } if(matTypeof(page) == 'undefined') page = 1; if(matTypeof(prop) == 'undefined') prop = []; var params = uW.Object.clone(uW.g_ajaxparams); params.pageNo = page; params.cityId = uW.currentcityid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceGetOtherInfo.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { var oa = rslt.otherAlliances; for (var i=0;i'+tx('Server returning "green map". You should stop searching for about 20 minutes - Aborting search :(')+'',true); return; } if (rslt.msg && rslt.msg=="invalid parameters") { t.stopSearch (''+tx('Invalid Parameters - Aborting search :(')+'',true); return; } t.SearchTimer = setTimeout ( function() {t.MapAjax.LookupMap (blockString, function(rslt) { t.eventGetPlayerOnline(blockString,rslt);})}, MAP_DELAY); //we need to retry if bad ajax request. return; } var map = rslt.data; t.SearchList = rslt; var uList = []; for(k in map){ if(map[k].tileUserId != null) { uList.push(map[k].tileUserId); } } getOnline(uList, function (r) { t.mapCallback(r) }); }, mapCallback : function (uList){ var t = Tabs.Search; var rslt = t.SearchList; var map = rslt.data; var userInfo = rslt.userInfo; var alliance = rslt.allianceNames; for (var k in map){ var xOK = false; var yOK = false; if (t.firstX=t.firstX && map[k].xCoord<=t.lastX); } else { xOK = (map[k].xCoord>=t.firstX || map[k].xCoord<=t.lastX); } // search over x boundary if (t.firstY=t.firstY && map[k].yCoord<=t.lastY); } else { yOK = (map[k].yCoord>=t.firstY || map[k].yCoord<=t.lastY); } // search over y boundary var pOK = true; if (t.opt.province != 0) { pOK = (map[k].tileProvinceId == t.opt.province.split("p")[1]); } if (xOK && yOK && pOK) { var name = ''; var might = 0; var city = '' var alli = ''; var aID = 0; var dist = distance (t.opt.startX, t.opt.startY, map[k].xCoord, map[k].yCoord); var u = map[k].tileUserId || 0; if (u!=0) { if (userInfo['u'+u]) { name = userInfo['u'+u].n; might = parseIntNan(userInfo['u'+u].m); city = map[k].cityName || ''; if (alliance['a'+userInfo['u'+u].a]) { alli = alliance['a'+userInfo['u'+u].a]; aID = userInfo['u'+u].a } else { alli = '---'; aID = 0; } } else { u=0; if (map[k].tileType==51) { map[k].tileType=53; } // assume misted city or plain! else { map[k].misted = true; } } } var misted = map[k].misted; if (map[k].tileType==53) { // misted city (or plain) misted = true; } if (map[k].tileType!=51) { if (map[k].tileType!=50 || map[k].premiumTile!=1) { city = tileTypes[map[k].tileType]; } } else { if (u==0 && !misted) { city = tx('Barb Camp'); } } var hqId = 0; if (map[k].allianceHq) { if (misted) { // fill in alliance info from HQ fields alli = map[k].allianceHq.allianceName; aID = map[k].allianceHq.allianceId; } city = map[k].allianceHq.hqName; hqId = map[k].allianceHq.hqId; } t.mapDat.push ([map[k].xCoord, map[k].yCoord, dist, map[k].tileType, parseIntNan(map[k].tileLevel), map[k].tileCityId, u, city, name, might, alli, aID, uList.data[u]?1:0, misted, map[k].isPrestige, map[k].prestigeLevel, map[k].prestigeType, map[k].tileId, map[k].tileProvinceId,false,map[k].premiumTile, hqId]); ++t.tilesFound; } } ById('pbStatSearched').innerHTML = tx('Searched: ')+ Math.round((t.blocksSearched/t.blocksTotal)*100)+'%'; t.dispMapTable(); var counter = t.BlockList.length; if (counter==0) { t.stopSearch (tx('Completed!'),true); return; } if (counter > MAX_BLOCKS) { counter = MAX_BLOCKS; } var nextblock = t.BlockList[0]; var curX = nextblock.split("_")[1]; var curY = nextblock.split("_")[3]; ById ('pbStatStatus').innerHTML = tx('Searching at ')+ curX +','+ curY; t.Blocks = []; for (var i=1;i<=counter;i++) { t.Blocks.push(t.BlockList.shift()); t.blocksSearched++; } var blockString = t.Blocks.join("%2C"); t.SearchTimer = setTimeout (function(){t.MapAjax.LookupMap (blockString, function(rslt) { t.eventGetPlayerOnline(blockString,rslt);})}, MAP_DELAY); }, LookupMists : function (prov,notify) { var t = Tabs.Search; t.KMData = []; if (!KOCMON_ON) return; // look up kocmon mists page for province, and build array var URL = 'http://www.rycamelot.com/misted/'+getServerId()+'/'+t.opt.province.split("p")[1]; try { GM_xmlhttpRequest({ method: 'GET', url: URL, onload: function(xpr) { var rslt = null; try { rslt = xpr.responseText; } catch (e){ logerr(e); if (notify) {notify();} return; } RegExp.prototype.execAll = function(string) { var match = null; var matches = new Array(); while (match = this.exec(string)) { var matchArray = []; for (var i in match) { if (parseInt(i) == i) { matchArray.push(match[i]); } } matches.push(matchArray); } return matches; } var myregexp = /([1-9]*\,[1-9]*)/g; var match = myregexp.execAll(rslt); for (var m in match) { t.KMData.push(match[m][1].split(",")[0]+'_'+match[m][1].split(",")[1]); } if (notify) {notify();} }, onerror: function() { if (notify) {notify();} } }); } catch (e){ logerr(e); } }, dispMapTable : function (){ var t = Tabs.Search; function sortFunc(a, b) { var t = Tabs.Search; if (typeof (a[Options.SearchOptions.sortColNum]) == 'number') { if (Options.SearchOptions.sortDir > 0) return a[Options.SearchOptions.sortColNum] - b[Options.SearchOptions.sortColNum]; else return b[Options.SearchOptions.sortColNum] - a[Options.SearchOptions.sortColNum]; } else if (typeof (a[Options.SearchOptions.sortColNum]) == 'boolean') { return 0; } else { if (Options.SearchOptions.sortDir > 0) return a[Options.SearchOptions.sortColNum].localeCompare(b[Options.SearchOptions.sortColNum]); else return b[Options.SearchOptions.sortColNum].localeCompare(a[Options.SearchOptions.sortColNum]); } } t.dat = []; for (var i=0; i=parseIntNan(Options.SearchOptions.MinLevel) && (Level<=parseIntNan(Options.SearchOptions.MaxLevel) || parseIntNan(Options.SearchOptions.MaxLevel)==0)); } if (TileOK && Options.SearchOptions.SearchType==2) { var WType = Math.floor(t.mapDat[i][3]/10); TileOK = (WType==Options.SearchOptions.WildType || Options.SearchOptions.WildType==99); // wild type if (TileOK) { if (parseIntNan(t.mapDat[i][5])==0 && !t.mapDat[i][13]) { // unowned wilds TileOK = (Options.SearchOptions.Unowned); } } } if (TileOK && (Options.SearchOptions.SearchType==2 || Options.SearchOptions.SearchType==0 || Options.SearchOptions.SearchType==6)) { if (t.mapDat[i][13] && Options.SearchOptions.SearchType!=6) { TileOK = (Options.SearchOptions.Misted); // misted if (TileOK && Options.SearchOptions.SearchType==0 && ById('pbautoKM').checked) { var newmist = true; if (newmist && t.KMData.length != 0) { newmist = (t.KMData.indexOf(t.mapDat[i][0]+'_'+t.mapDat[i][1]) == -1); } if (newmist) { newmist = (t.OldMists.indexOf(t.mapDat[i][0]+'_'+t.mapDat[i][1]) == -1); } if (newmist) { TileOK = (Options.SearchOptions.NewMists); } else { TileOK = (Options.SearchOptions.OldMists); } } } else { if ((parseIntNan(t.mapDat[i][5])!=0)) { // owned filters if (parseIntNan(t.mapDat[i][11])==0 && Options.SearchOptions.SearchType!=6) { // unallied TileOK = (Options.SearchOptions.Unallied); } else { var dip = getDiplomacy(parseIntNan(t.mapDat[i][11])); if (dip==uW.g_js_strings.commonstr.friendly || dip==uW.g_js_strings.commonstr.yours) { // friendly and yours TileOK = (Options.SearchOptions.Friendly); } else { if (dip==uW.g_js_strings.commonstr.hostile) { // hostile TileOK = (Options.SearchOptions.Hostile); } else { TileOK = (Options.SearchOptions.Neutral); // neutral } } if (TileOK) { // min or max alliance rank if (parseIntNan(Options.SearchOptions.Rank)!=0) { if (Options.SearchOptions.RankType==0) { TileOK = (t.Rankings.indexOf(parseIntNan(t.mapDat[i][11])) != -1); } else { TileOK = (t.Rankings.indexOf(parseIntNan(t.mapDat[i][11])) == -1); } } } if (TileOK) { // include alliance name if (Options.SearchOptions.AllianceName && Options.SearchOptions.AllianceName.trim() != '') { TileOK = (t.mapDat[i][10].toUpperCase().search(Options.SearchOptions.AllianceName.trim().toUpperCase()) >= 0); } } } if (TileOK && Options.SearchOptions.SearchType!=6) { // min/max player might var Might = parseIntNan(t.mapDat[i][9]); var MinMight = parseIntNan(Options.SearchOptions.MinMight)*1000000000; var MaxMight = parseIntNan(Options.SearchOptions.MaxMight)*1000000000; TileOK = (Might>=MinMight && (Might<=MaxMight || MaxMight==0)); } if (TileOK && Options.SearchOptions.SearchType!=6) { // include player name if (Options.SearchOptions.PlayerName && Options.SearchOptions.PlayerName.trim() != '') { TileOK = (t.mapDat[i][8].toUpperCase().search(Options.SearchOptions.PlayerName.trim().toUpperCase()) >= 0); } } } } } if (TileOK) { t.dat.push(t.mapDat[i]); } } t.mists = 0; t.scouted = 0; ById('pbStatFound').innerHTML = tx('Found')+': '+t.dat.length; var m = '


    '+tx('No tiles found matching search criteria')+'
    '; if (t.dat.length!=0) { t.dat.sort(sortFunc); var dis = ''; if (t.searchRunning) { dis = 'disabled'; } var m = ''; m += '\ \ \ \ \ \ \ \ '; var numRows = t.dat.length; if (numRows > t.MAX_SHOW_WHILE_RUNNING && t.searchRunning){ numRows = t.MAX_SHOW_WHILE_RUNNING; ById('pbSearchMessages').innerHTML = ''+tx('NOTE: Table only shows ')+ t.MAX_SHOW_WHILE_RUNNING +' of '+ t.dat.length +tx(' results until search is completed')+'.'; } var qsdelay = 0; var r = 0; var RowId = ""; for (var i=0; i'; if (t.dat[i][12] == 1) { status = ''; } var rowStyle = ''; var cityname = ''; var playername = ''; var might = ''; var HQ = (t.dat[i][3]==50 && t.dat[i][20]==1); if (t.dat[i][7]) { cityname = t.dat[i][7]; } if (t.dat[i][8]) { playername = t.dat[i][8]; } if (cityname == "" && HQ) { cityname = tx("Alliance HQ"); if (trusted) cityname += ' '+strButton8(uW.g_js_strings.commonstr.members,'onclick="btShowHQMembers(this,'+t.dat[i][21]+')"'); } if (playername == "" && HQ) playername = "???"; if (parseIntNan(t.dat[i][9])!=0) { might = addCommas(t.dat[i][9]); } if (t.dat[i][13] && !HQ) { t.mists++; if (parseIntNan(t.dat[i][6])!=0 || playername != '') t.scouted++; var newmist = (Options.SearchOptions.SearchType==0); // cities only! if (newmist && t.KMData.length != 0) { newmist = (t.KMData.indexOf(t.dat[i][0]+'_'+t.dat[i][1]) == -1); } if (newmist) { newmist = (t.OldMists.indexOf(t.dat[i][0]+'_'+t.dat[i][1]) == -1); } if (newmist && ById('pbautoKM').checked) { rowStyle = 'style="color:#f00;"'; // highlighted mistedtext = tx("NEW MIST"); } else { rowStyle = 'style="opacity:0.5;"'; // misted mistedtext = tx("MISTED"); } } if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } if (t.dat[i][19]) rowClass += ' highRow'; m += ''; m += ''; m += ''; m += ''; m += ''; if (t.dat[i][13] && !HQ && parseIntNan(t.dat[i][6])==0) { // still misted if (playername == '') { m += ''; if (ById('pbAutoQS')) { if (ById('pbAutoQS').checked) { if (!Tabs.Search.QSMarching[t.dat[i][0]+'_'+t.dat[i][1]] || Tabs.Search.QSMarching[t.dat[i][0]+'_'+t.dat[i][1]]==0) { Tabs.Search.QSMarching[t.dat[i][0]+'_'+t.dat[i][1]] = 1; setTimeout(uW.quickscoutsearch,(5000*qsdelay),t.dat[i][0],t.dat[i][1],t.ModelCityId,true); qsdelay = qsdelay + 1; } } } } else { m += ''; // messages from quickscout stored in playername } } else { m += ''; m += ''; m += ''; m += ''; } m += ''; } m += '
      '+tx('Lvl')+'  '+tx('Co-ords')+'  '+tx('Distance')+'  '+tx('Player')+'  '+tx('City')+'  '+tx('Might')+'  '+uW.g_js_strings.commonstr.alliance+' 
    '+TileImage(t.dat[i][3],t.dat[i][4],t.dat[i][5],t.dat[i][16],t.dat[i][15],t.dat[i][20])+''+((t.dat[i][4]!=0)?t.dat[i][4]:'??')+''+t.dat[i][2]+'
    *** '+mistedtext+' ***  '+tx("QuickScout")+'
    '+playername+''+((parseIntNan(t.dat[i][6])!=0)?status+PlayerLink(t.dat[i][6],playername):playername)+''+cityname+''+might+''+t.dat[i][10]+'
    '; } ById('pbResultsPanel').innerHTML = m; if (t.dat.length!=0) { ById('SearchCol' + Options.SearchOptions.sortColNum).className = 'buttonv2 std green'; ById('ToggleSearchScoutCheckbox').addEventListener('change', t.doSelectall, false); } t.updateMistProgress(); }, ShowHQMembers : function (elem,hqId) { var t = Tabs.Search; var params = uW.Object.clone(uW.g_ajaxparams); params.hqId = hqId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/allianceHqMineOpen.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var helpText = '
    '; helpText += '
    '; for (var mem in rslt.collect_status) { helpText += MonitorLink(rslt.collect_status[mem].userId,rslt.collect_status[mem].displayName)+'
    '; } helpText += '

    '; var off = getOffset(elem); var pop = new CPopup ('BotHelp', off.left, off.top+20, 150, 400, true); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+uW.g_js_strings.commonstr.members+'
    '; pop.show (true); ResetFrameSize('BotHelp',400,150); } }, }, false); }, updateMistProgress : function () { var t = Tabs.Search; if (!t.searchRunning) { if (t.mists!=0) { ById('pbStatSearched').innerHTML = tx('Mists Scouted: ')+ t.scouted+'/'+t.mists; } else { ById('pbStatSearched').innerHTML = ""; } } }, doSelectall: function () { var t = Tabs.Search; var coords = ""; for (var k = 0; k < t.dat.length; k++) { coords = t.dat[k][0]+'_'+t.dat[k][1]; if (ById('ToggleSearchScoutCheckbox').checked) ById('pbSearchScout_' + coords).checked = true; else ById('pbSearchScout_' + coords).checked = false; } }, stopSearch : function (msg,savelast){ var t = Tabs.Search; MAP_DELAY_WATCH = 0; clearTimeout (t.SearchTimer); t.searchRunning = false; ById ('pbStatStatus').innerHTML = msg; ById ('pbSearchSubmit').innerHTML = ''+tx('Start Search')+''; if (savelast) { t.clearlastsearch(); t.LastSearch.opt = t.opt; t.LastSearch.time = unixTime(); t.LastSearch.mapDat = t.mapDat.slice(); t.savelastsearch(); t.displaylastsearch(); } var m = '
    '; m += strButton20(tx('Highlight Defenders'), 'id=pbHighDefenders')+' '; m += strButton20(tx('Copy Co-ordinates'), 'id=pbCoordCopy')+' '; if (Tabs.BulkScout) m += strButton20(tx('Add to Scout List'), 'id=pbScoutExport')+' '; if (Tabs.BulkAttack) m += strButton20(tx('Add to Attack List'), 'id=pbBulkAttackExport')+' '; if (Tabs.Attack) m += strButton20(tx('Add to Auto-Attack'), 'id=pbAttackExport')+' '; m += ' 
     '; ById ('pbSearchMessages').innerHTML = m; if (ById('pbScoutExport')) ById('pbScoutExport').addEventListener('click', t.ExportScoutList, false); if (ById('pbBulkAttackExport')) ById('pbBulkAttackExport').addEventListener('click', t.ExportAttackList, false); if (ById('pbAttackExport')) ById('pbAttackExport').addEventListener('click', t.ExportAttack, false); ById('pbCoordCopy').addEventListener('click', t.CopyCoords, false); if (ById('pbHighDefenders')) ById('pbHighDefenders').addEventListener('click', t.HighlightDefenders, false); if (Options.SearchOptions.SearchType != 0) { if (ById('pbHighDefenders')) ById('pbHighDefenders').style.display = 'none'; } t.dispMapTable(); }, ExportScoutList : function () { var t = Tabs.Search; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkScout.ImportCoords(coordlist.split(" ")); } }, ExportAttackList : function () { var t = Tabs.Search; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkAttack.ImportCoords(coordlist.split(" ")); } }, getSelected : function () { var t = Tabs.Search; var coordlist = ""; var coords = ""; for (var k = 0; k < t.dat.length; k++) { coords = t.dat[k][0]+'_'+t.dat[k][1]; if (ById('pbSearchScout_' + coords).checked) { coordlist += t.dat[k][0].toString()+','+t.dat[k][1].toString()+' '; ById('pbSearchScout_' + coords).checked = false; } } return coordlist; }, ExportAttack : function () { var t = Tabs.Search; var sel = false; for (var k = 0; k < t.dat.length; k++) { coords = t.dat[k][0]+'_'+t.dat[k][1]; if (ById('pbSearchScout_' + coords).checked) { sel = true; break; } } if (sel) { Tabs.Attack.NewRoute(); ById('bttcAttack').click(); } }, CopyCoords : function () { var t = Tabs.Search; var CoordList = []; var coords = ""; for (var k = 0; k < t.dat.length; k++) { coords = t.dat[k][0]+'_'+t.dat[k][1]; if (ById('pbSearchScout_' + coords).checked) { CoordList.push('('+t.dat[k][0].toString()+','+t.dat[k][1].toString()+')'); } } if (CoordList.length>0) { window.prompt(tx('Copy to clipboard: Ctrl+C'), CoordList.join(" ")); } }, HighlightDefenders : function () { var t = Tabs.Search; var delayer = 0; ById('pbHighDefenders').outerHTML = ' '; for (var k = 0; k < t.dat.length; k++) { if ((t.dat[k][3]==51 && t.dat[k][5] && t.dat[k][5]!=0) || (t.dat[k][3]==53)) { if (!t.ReqSent[t.dat[k][0]+'_'+t.dat[k][1]] || t.ReqSent[t.dat[k][0]+'_'+t.dat[k][1]]==0) { t.ReqSent[t.dat[k][0]+'_'+t.dat[k][1]]=1; setTimeout(getDefendStatus,(250*delayer),t.dat[k][0],t.dat[k][1],false,false,t.UpdateDefendStatus,k,t.dat.length,'pbHighDefendersProg'); delayer = delayer + 1; } } } function ClearAtEnd () { if (ById('pbHighDefendersProg')) { ById('pbHighDefendersProg').outerHTML = strButton20(tx('Highlight Defenders'),'id=pbHighDefenders'); ById('pbHighDefenders').addEventListener('click', t.HighlightDefenders, false); } }; setTimeout (ClearAtEnd,(250*delayer)); }, UpdateDefendStatus : function (rslt,x,y,k) { var t = Tabs.Search; t.ReqSent[x+'_'+y]=0; var div = ById('search_'+x+'_'+y); var coords = t.dat[k][0]+'_'+t.dat[k][1]; if (rslt.ok && rslt.ok=="true") { t.dat[k][19] = true; if (div) jQuery(div).addClass("highRow"); if (ById('pbSearchScout_' + coords)) ById('pbSearchScout_' + coords).checked = true; } else { t.dat[k][19] = false; if (div) jQuery(div).removeClass("highRow"); if (ById('pbSearchScout_' + coords)) ById('pbSearchScout_' + coords).checked = false; } var numRows = t.mapDat.length; for (var i=0; i(\\w*)"); // add a new option to the context menus var cityType = CM.CITY_STATUS.ANOTHER_PLAYER_CITY_AND_NOT_IN_YOUR_ALLIANCE; CM.ContextMenuMapController.prototype.MapContextMenus.City[cityType].push("ttMod"); cityType = CM.CITY_STATUS.ANOTHER_PLAYER_CITY_AND_IN_YOUR_ALLIANCE; CM.ContextMenuMapController.prototype.MapContextMenus.City[cityType].push("ttMod"); var wildContext; wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.EnemyWilderness; for (var wild in wildContext) { wildContext[wild].push("ttMod"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.Wilderness; for (var wild in wildContext) { wildContext[wild].push("ttMod"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.FriendlyWilderness; for (var wild in wildContext) { wildContext[wild].push("ttMod"); } wildContext = CM.ContextMenuMapController.prototype.MapContextMenus.AllianceWilderness; for (var wild in wildContext) { wildContext[wild].push("ttMod"); } // add actions to the menu item var mod = new CalterUwFunc('cm.ContextMenuMapController.prototype.calcButtonInfo', [ ['default:', 'case "ttMod":' + 'b.text = "'+tx('Player Notes')+'"; b.color = "brown"; ' + 'b.action = function () { ' + 'edit_notes(e.user); ' + '}; ' + 'if (e.user.id) d.push(b); break; ' + 'default: ' ] ]); mod.setEnable(true); // load saved values t.load(); window.addEventListener('unload', t.onUnload, false); }, onUnload : function (){ var t = Tabs.Notes; if (uW.btLoaded) { if (!ResetAll) t.save(); } }, EverySecond : function () { var t = Tabs.Notes; t.LoopCounter = t.LoopCounter + 1; if (FFVersion.Browser=="Chrome" && (t.LoopCounter%15==0)) { t.save(); } }, load: function () { var t = Tabs.Notes; var serverID = getServerId(); try { var s = JSON2.parse(GM_getValue('PlayerNotes_' + serverID+'_'+uW.tvuid,'{}')); if (s) t.noteValues = s; } catch (e) { logerr(e); } }, save: function () { var t = Tabs.Notes; var serverID = getServerId(); var s = JSON2.stringify(t.noteValues); setTimeout(function () { GM_setValue('PlayerNotes_'+serverID+'_'+uW.tvuid, s); }, 0); // get around GM_SetValue uW error }, editNoteLink: function (name, id) { uW.edit_notes({id:id,username:name}); }, createPopup: function (user) { var t = Tabs.Notes; t.ToolsOpen = false; if (Options.btWinIsOpen == true) { t.ToolsOpen = true; eventHideShow(); } // get the current note var notes = ""; if (t.noteValues[user.id]) { notes = t.noteValues[user.id]; notes = notes.text.replace(//g, "\n"); } // popup ModalMultiButton({ buttons: [{ txt: uW.g_js_strings.commonstr.save, exe: function () { t.saveNote(user); uW.Modal.hideModal(); if (t.ToolsOpen == true) { eventHideShow(); } } }, { txt: uW.g_js_strings.commonstr.deletetx, exe: function () { t.removeNote(user.id); uW.Modal.hideModal() if (t.ToolsOpen == true) { eventHideShow(); } } }, { txt: uW.g_js_strings.commonstr.cancel, exe: function () { uW.Modal.hideModal() if (t.ToolsOpen == true) { eventHideShow(); } } }], body: ' '+tx('Enter notes for player')+': ' + user.username + '

    ', title: "Player Notes" }); }, // callback for the save button saveNote: function (user) { var t = Tabs.Notes; var player = user.id; if (player) { var noteData = {}; var notes = ById('notes_text').value; noteData.text = notes.replace(/\n/g, "
    "); noteData.id = user.id; noteData.name = user.username; t.noteValues[player] = noteData; t.save(); t.show(); var nl = ById('ptplayernotes'); if (nl && Tabs.Player.userobj[user.id]) { nl.innerHTML = noteData.text; } var nl = ById('ptBatplayernotes'); if (nl && Battle.userobj[user.id]) { nl.innerHTML = noteData.text; ResetFrameSize('btPlayerPop',100,400); } } }, // callback for the delete button removeNote: function (player) { var t = Tabs.Notes; if (player && t.noteValues[player]) { delete t.noteValues[player]; t.save(); t.show(); var nl = ById('ptplayernotes'); if (nl && Tabs.Player.userobj[player]) { nl.innerHTML = ""; } var nl = ById('ptBatplayernotes'); if (nl && Battle.userobj[player]) { nl.innerHTML = ""; ResetFrameSize('btPlayerPop',100,400); } } }, // add the notes to the map tooltip updateTooltip: function (ttHtml) { var t = Tabs.Notes; var newTT = null; var result = t.re.exec(ttHtml); if (result && result[1]) { var note; if (note = t.noteValues[result[1]]) { newTT = ttHtml.replace("
    ","

    "+tx('Notes')+":
    " + note.text + "
    "); } } return newTT; }, show: function () { var t = Tabs.Notes; var h = '
    '+tx('PLAYER NOTES')+'
    '; h += '

    '; h += ''; h += ''; var r = 0; var logshow = false; for (var player in t.noteValues) { var note = t.noteValues[player]; if (note && note.text) { logshow = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } h += ''; h += ''; h += ''; h += ''; h += ""; } } if (!logshow) { h += ''; } h += "
    '+uW.g_js_strings.commonstr.player+''+tx('Notes')+''+tx('Action')+'
    '+note.name+'
    ' + note.text + '
    '+uW.g_js_strings.commonstr.edit+' '+tx('Del')+'


    '+tx('No saved notes')+'
    "; h += '
     
    '; h += '
      
    '; h += "
    "; myDiv.innerHTML = h; ById('ptnotesSave').addEventListener ('click',function() { var Export = {}; Export = t.noteValues; uriContent = 'data:application/octet-stream;content-disposition:attachment;filename=file.txt,' + encodeURIComponent(JSON2.stringify(Export)); Tabs.Options.saveConfig(uriContent,'PlayerNotes_'+getServerId()+'_'+uW.tvuid+'.txt'); },false); ById('ptnotesLoad').addEventListener ('click',function() { ById('ptnotesMessages').innerHTML = ' ' var fileInput = ById("ptnotesLoadFile"); var files = fileInput.files; if (files.length == 0) { ById('ptnotesMessages').innerHTML = ''+tx('Please select a saved notes file')+''; return; } var file = files[0]; var reader = new FileReader(); reader.onload = function (e) { var Import = JSON2.parse(e.target.result); if (matTypeof(Import) == 'object') { for (var k in Import) { var newNote = {}; newNote.text = Import[k].text||''; newNote.name = Import[k].name||''; newNote.id = Import[k].id||0; if (newNote.id) { t.noteValues[k] = newNote; } } t.save(); ById('ptnotesMessages').innerHTML = tx('New notes loaded'); t.show(); } else { ById('ptnotesMessages').innerHTML = tx('Invalid File')+'!'; } }; reader.readAsText(file); },false); }, }; /** Messages Tab **/ Tabs.Messages = { tabOrder: 1080, tabLabel: 'Rpt Search', myDiv: null, minPages: 0, maxPages: 0, data: [], report: {}, DisplayIdArray: [], DisplayArray: [], ScoutIdArray: [], ScoutArray: [], ScoutResults: [], totalPages: 0, what: '', whatNot: '', content: '', FromUnixTime: 0, ToUnixTime: 0, ItemsFound : {}, ThroneItemsFound : {}, ChampItemsFound : {}, JewelItemsFound : {}, PlayerData : {}, gold: 0, food: 0, wood: 0, stone: 0, ore: 0, Options: { rptType: 'alliance', arAttacker: 'Both', arTarget: 'Both', arPageFrom: 1, arPageTo: 10, arAttack: true, arScout: true, }, init: function (div) { var t = Tabs.Messages; t.myDiv = div; var link = window.document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = http+'code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css'; document.getElementsByTagName("HEAD")[0].appendChild(link); // set up regional datepicker text strings if (Options.Language != 'en') { jQuery.datepicker.regional[Options.Language] = {}; jQuery.datepicker.regional[Options.Language].closeText = uW.g_js_strings.commonstr.close; jQuery.datepicker.regional[Options.Language].prevText = uW.g_js_strings.commonstr.prev; jQuery.datepicker.regional[Options.Language].nextText = uW.g_js_strings.commonstr.next; jQuery.datepicker.regional[Options.Language].currentText = tx("Today"); jQuery.datepicker.regional[Options.Language].monthNames = []; jQuery.datepicker.regional[Options.Language].monthNamesShort = []; jQuery.datepicker.regional[Options.Language].dayNames = []; jQuery.datepicker.regional[Options.Language].dayNamesShort = []; jQuery.datepicker.regional[Options.Language].dayNamesMin = []; jQuery.datepicker.regional[Options.Language].weekHeader = tx("WK"); jQuery.datepicker.regional[Options.Language].dateFormat = "dd/mm/yy"; jQuery.datepicker.regional[Options.Language].firstDay = 1; jQuery.datepicker.regional[Options.Language].isRTL = false; jQuery.datepicker.regional[Options.Language].showMonthAfterYear = false; jQuery.datepicker.regional[Options.Language].yearSuffix = ""; for (var i=0;i<12;i++) jQuery.datepicker.regional[Options.Language].monthNames.push(tx(uW.MONTH_NAMES[i])); for (var i=12;i<24;i++) jQuery.datepicker.regional[Options.Language].monthNamesShort.push(tx(uW.MONTH_NAMES[i])); for (var i=0;i<7;i++) jQuery.datepicker.regional[Options.Language].dayNames.push(tx(uW.DAY_NAMES[i])); for (var i=7;i<14;i++) jQuery.datepicker.regional[Options.Language].dayNamesShort.push(tx(uW.DAY_NAMES[i])); for (var i=0;i<7;i++) jQuery.datepicker.regional[Options.Language].dayNamesMin.push(tx(uW.DAY_NAMES[i])[0].toUpperCase()+tx(uW.DAY_NAMES[i])[1]); } if (!Options.MessagesOptions) { Options.MessagesOptions = t.Options; } else { for (var y in t.Options) { if (!Options.MessagesOptions.hasOwnProperty(y)) { Options.MessagesOptions[y] = t.Options[y]; } } } t.minPages = Options.MessagesOptions.arPageFrom; t.maxPages = Options.MessagesOptions.arPageTo; t.totalPages = Options.MessagesOptions.arPageTo; uWExportFunction('getmsg',Tabs.Messages.getMailBody); uWExportFunction('ptMsgDelete', Tabs.Messages.DeleteMessage); uWExportFunction('ptMsgDeleteAll', Tabs.Messages.DeleteAllMessages); uWExportFunction('ptRptPVPSummary',Tabs.Messages.BuildPVPSummary); uWExportFunction('ptRptItemSummary',Tabs.Messages.BuildItemSummary); uWExportFunction('ptRptScoutSummary',Tabs.Messages.BuildScoutSummary); var tc = '
    '+tx('REPORT AND MESSAGE SEARCH')+'
    '; tc += ''; tc += ''; tc += ''; tc += ''; tc += ''; tc += ''; tc += '
    '+uW.g_js_strings.commonstr.type+': '; tc += '
    '+tx('Page')+':  – 
    '+tx('Contains')+': 
    '; tc += tx('But not')+': 
    '+uW.g_js_strings.commonstr.attacker+': '; tc += '
    '+uW.g_js_strings.commonstr.target+': 
     '+uW.g_js_strings.commonstr.attack+'
    '; tc += ' '+uW.g_js_strings.commonstr.scout+'
     '+uW.g_js_strings.commonstr.reinforce+'
    '; tc += ' '+uW.g_js_strings.commonstr.transport+'
    '; tc += '

    '; tc += ''; tc += '
    '+uW.g_js_strings.commonstr.from+': '+uW.g_js_strings.commonstr.totx+':  '+strButton8(tx('Clear'),'id=idRptClearDates')+'
    '; tc += '
    '; tc += ''; tc += '
     
    '; tc += '

    '; t.myDiv.innerHTML = tc; jQuery(function() { jQuery.datepicker.setDefaults(jQuery.datepicker.regional[Options.Language]); jQuery("#idRptFrom").datepicker({dateFormat: "yy-mm-dd 00:00:00", onSelect:t.handleRptFrom}); jQuery("#idRptTo").datepicker({dateFormat: "yy-mm-dd 23:59:59", onSelect:t.handleRptTo}); }); ById('idRptType').addEventListener('change', t.handleRptType, false); ById('idRptPageFrom').addEventListener('change', t.handleRptPages, false); ById('idRptPageTo').addEventListener('change', t.handleRptPages, false); ById('idRptAttacker').addEventListener('change', t.handleRptAttacker, false); ById('idRptTarget').addEventListener('change', t.handleRptTarget, false); ById('idRptWhat').addEventListener('keyup', t.handleRptWhat, false); ById('idRptWhatNot').addEventListener('keyup', t.handleRptWhatNot, false); ById('idRptSearch').addEventListener('click', t.handleRptSearch, false); ById('idRptFrom').addEventListener('change', t.handleRptFrom, false); ById('idRptTo').addEventListener('change', t.handleRptTo, false); ById('idRptClearDates').addEventListener('click', t.clearRptDates, false); ToggleOption('MessagesOptions', 'idRptAttack', 'arAttack', t.RefreshCurrentDisplay); ToggleOption('MessagesOptions', 'idRptScout', 'arScout', t.RefreshCurrentDisplay); ToggleOption('MessagesOptions', 'idRptReinforce', 'arReinforce', t.RefreshCurrentDisplay); ToggleOption('MessagesOptions', 'idRptTransport', 'arTransport', t.RefreshCurrentDisplay); t.enableFields(); }, handleRptType: function () { var t = Tabs.Messages; Options.MessagesOptions.rptType = ById("idRptType").value; saveOptions(); // clear data t.data = []; t.report = {}; ById("idRptSearched").innerHTML = ''; ById("idRptStatus").innerHTML = ' '; ById("idRptFound").innerHTML = ''; ById("idRptResultsDiv").innerHTML = ''; t.enableFields(); }, enableFields : function () { var t = Tabs.Messages; var disable = (Options.MessagesOptions.rptType=='inbox' || Options.MessagesOptions.rptType=='outbox' || Options.MessagesOptions.rptType=='hq_messages'); ById('idRptAttacker').disabled = disable; ById('idRptTarget').disabled = disable; ById('idRptAttack').disabled = disable; ById('idRptScout').disabled = disable; ById('idRptReinforce').disabled = disable; ById('idRptTransport').disabled = disable; if (disable) { jQuery('#idRptDateFilter').addClass("divHide"); } else { jQuery('#idRptDateFilter').removeClass("divHide"); } ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, handleRptPages: function () { var t = Tabs.Messages; t.minPages = parseInt(ById("idRptPageFrom").value); t.maxPages = parseInt(ById("idRptPageTo").value); if (t.maxPages < t.minPages) { t.maxPages = t.minPages; ById("idRptPageTo").value = t.maxPages; } Options.MessagesOptions.arPageFrom = t.minPages; Options.MessagesOptions.arPageTo = t.maxPages; saveOptions(); t.totalPages = t.maxPages; }, handleRptAttacker: function () { var t = Tabs.Messages; Options.MessagesOptions.arAttacker = ById("idRptAttacker").value; saveOptions(); if ((Options.MessagesOptions.rptType == 'alliance' || Options.MessagesOptions.rptType == 'player') && t.data.length > 0) t.DisplayRpt(); }, handleRptTarget: function () { var t = Tabs.Messages; Options.MessagesOptions.arTarget = ById("idRptTarget").value; saveOptions(); if ((Options.MessagesOptions.rptType == 'alliance' || Options.MessagesOptions.rptType == 'player') && t.data.length > 0) t.DisplayRpt(); }, handleRptWhat: function () { var t = Tabs.Messages; t.what = ById("idRptWhat").value.trim(); ById("idRptWhat").value = t.what; t.RefreshCurrentDisplay(); }, handleRptWhatNot: function () { var t = Tabs.Messages; t.whatNot = ById("idRptWhatNot").value.trim(); ById("idRptWhatNot").value = t.whatNot; t.RefreshCurrentDisplay(); }, handleRptFrom: function () { var t = Tabs.Messages; try { var datestr = new Date(ById("idRptFrom").value.replace(" ","T")+"Z"); t.FromUnixTime = parseIntNan(datestr.getTime()/1000) + (datestr.getTimezoneOffset() * 60); ById("idRptFrom").style.color = 'black'; if (t.FromUnixTime==0 && ById("idRptFrom").value != "") { ById("idRptFrom").style.color = 'red'; } } catch (err) { t.FromUnixTime = 0; ById("idRptFrom").style.color = 'red'; } t.RefreshCurrentDisplay(); }, handleRptTo: function () { var t = Tabs.Messages; try { var datestr = new Date(ById("idRptTo").value.replace(" ","T")+"Z"); t.ToUnixTime = parseIntNan(datestr.getTime()/1000) + (datestr.getTimezoneOffset() * 60); ById("idRptTo").style.color = 'black'; if (t.ToUnixTime==0 && ById("idRptTo").value != "") { ById("idRptTo").style.color = 'red'; } } catch (err) { t.ToUnixTime = 0; ById("idRptTo").style.color = 'red'; } t.RefreshCurrentDisplay(); }, clearRptDates: function () { var t = Tabs.Messages; ById("idRptFrom").value = ''; ById("idRptTo").value = ''; t.FromUnixTime = 0; t.ToUnixTime = 0; t.RefreshCurrentDisplay(); }, RefreshCurrentDisplay : function () { var t = Tabs.Messages; if (t.data.length > 0) if (Options.MessagesOptions.rptType == 'alliance' || Options.MessagesOptions.rptType == 'player') t.DisplayRpt(); else t.DisplayMail(); }, handleRptSearch: function () { var t = Tabs.Messages; if (t.searchRunning) { t.searchRunning = false; t.stopSearch('SEARCH CANCELLED!'); return; } t.handleRptPages(); ById('idRptSearch').value = tx('Stop Search'); ById('idRptStatus').innerHTML = tx('Searching page')+' ' + t.minPages + ' '+uW.g_js_strings.commonstr.of+' ' + t.maxPages; t.searchRunning = true; t.data = []; t.report = {}; if (Options.MessagesOptions.rptType == 'alliance' || Options.MessagesOptions.rptType == 'player') t.getRpt(t.minPages); else t.getMail(t.minPages); }, stopSearch: function (msg) { var t = Tabs.Messages; if (t.searchRunning || msg == 'SEARCH CANCELLED!') ById('idRptStatus').innerHTML = msg; ById('idRptSearch').value = tx('Start Search'); t.searchRunning = false; t.RefreshCurrentDisplay(); }, getMail: function (pageNum) { var t = Tabs.Messages; var params = uW.Object.clone(uW.g_ajaxparams); params.pf = 0; params.requestType = "GET_MESSAGE_HEADERS_FOR_USER_INBOX"; params.boxType = ById('idRptType').value; params.pageNo = pageNum; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { t.getMailCallback(rslt, pageNum); }, onFailure: function () { t.getMailCallback({errorMsg:'AJAX error'}); }, }, false); }, getMailCallback: function (rslt, page) { var t = Tabs.Messages; if (rslt) { if (!rslt.ok) { ById("idRptStatus").innerHTML = rslt.errorMsg; return; } t.totalPages = parseInt(rslt.noOfPages); if (t.totalPages < t.maxPages) t.maxPages = t.totalPages; if (rslt.message && page) { var ml = rslt.message; if (rslt.messageCount > 0) { var rptkeys = uW.Object.keys(uWCloneInto(ml)); for (var i = 0; i < rptkeys.length; i++) { var rpt = ml[rptkeys[i]]; rpt.page = page; t.data.push(rpt); } } } if (parseInt(page) + 1 <= t.maxPages && t.searchRunning) { ById("idRptStatus").innerHTML = tx('Searching page')+' ' + (parseInt(page) + 1) + ' '+uW.g_js_strings.commonstr.of+' ' + t.maxPages; t.getMail(parseInt(page) + 1); if (t.data.length > 0) t.DisplayMail(); } else if (page) t.stopSearch('Done!'); } }, getRpt: function (pageNum) { var t = Tabs.Messages; var params = uW.Object.clone(uW.g_ajaxparams); params.pageNo = pageNum; if (Options.MessagesOptions.rptType == 'alliance') params.group = "a"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/listReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { t.getRptCallback(rslt, pageNum); }, onFailure: function () { t.getRptCallback({errorMsg:'AJAX error'}); }, }, false); }, getRptCallback: function (rslt, page) { var t = Tabs.Messages; if (rslt) { if (!rslt.ok) { ById("idRptStatus").innerHTML = rslt.errorMsg; return; } t.totalPages = parseInt(rslt.totalPages); if (t.totalPages < t.maxPages) t.maxPages = t.totalPages; if (rslt.arReports && page) { var ar = rslt.arReports; if (ar.length == 0) t.stopSearch(tx('Empty pages found from page')+' ' + page + ' '+tx('onwards')); var rptkeys = uW.Object.keys(uWCloneInto(ar)); for (var i = 0; i < rptkeys.length; i++) { var rpt = ar[rptkeys[i]]; var reportId = parseInt(rpt.reportId); if (rpt.marchType == 3 && (rpt.side1AllianceId == parseInt(getMyAlliance()[0]) || rpt.side1PlayerId == uW.tvuid)) { setTimeout(FetchReportDetail,(250*i),rpt.reportId,1); // load scout report into detail cache for speed } else { setTimeout(FetchReport,(250*i),rpt.reportId); // load report into cache for speed } t.report[reportId] = {}; // Attacker t.report[reportId].side1Name = rslt.arPlayerNames['p' + rpt.side1PlayerId]; t.report[reportId].side1PlayerId = parseInt(rpt.side1PlayerId); t.report[reportId].side1AllianceId = parseInt(rpt.side1AllianceId); if (rpt.side1AllianceId > 0) t.report[reportId].side1AllianceName = rslt.arAllianceNames['a' + rpt.side1AllianceId]; else t.report[reportId].side1AllianceName = tx('unallied'); if (rpt.side1CityId > 0) t.report[reportId].side1CityName = rslt.arCityNames['c' + rpt.side1CityId]; else t.report[reportId].side1CityName = uW.g_js_strings.commonstr.none; t.report[reportId].side1XCoord = rpt.side1XCoord; t.report[reportId].side1YCoord = rpt.side1YCoord; // Target t.report[reportId].side0PlayerId = parseInt(rpt.side0PlayerId); if (parseInt(rpt.side0PlayerId) == 0) { // Game t.report[reportId].side0Name = uW.g_js_strings.commonstr.enemy; t.report[reportId].side0AllianceName = ''; t.report[reportId].side0CityName = ''; } else { // Player t.report[reportId].side0Name = rslt.arPlayerNames['p' + rpt.side0PlayerId]; if (rpt.side0AllianceId > 0) t.report[reportId].side0AllianceName = rslt.arAllianceNames['a' + rpt.side0AllianceId]; else t.report[reportId].side0AllianceName = tx('unallied'); if (rpt.side0CityId > 0) t.report[reportId].side0CityName = rslt.arCityNames['c' + rpt.side0CityId]; else t.report[reportId].side0CityName = uW.g_js_strings.commonstr.none; } t.report[reportId].side0AllianceId = parseInt(rpt.side0AllianceId); t.report[reportId].side0XCoord = rpt.side0XCoord; t.report[reportId].side0YCoord = rpt.side0YCoord; totile = tileTypes[parseInt(rpt.side0TileType)]; if (rpt.side0TileType == 51) { if (parseInt(rpt.side0CityId) == 0) { totile = tx('Barb Camp'); } } t.report[reportId].side0TileTypeText = totile; totile = 'Lvl '+rpt.side0TileLevel+' '+totile; t.report[reportId].side0TileTypeLevel = totile; t.report[reportId].side0TileType = rpt.side0TileType; t.report[reportId].side0TileLevel = rpt.side0TileLevel; // Miscellaneous t.report[reportId].page = page; t.report[reportId].reportUnixTime = rpt.reportUnixTime; if (rpt.side0AllianceId == parseInt(getMyAlliance()[0])) t.report[reportId].sideId = 0; else if (rpt.side1AllianceId == parseInt(getMyAlliance()[0])) { t.report[reportId].sideId = 1; } else { // if we're here then this is a player report from when they were in another alliance if (rpt.side0PlayerId == uW.tvuid) t.report[reportId].sideId = 0; else if (rpt.side1PlayerId == uW.tvuid) t.report[reportId].sideId = 1; else // shouldn't get here but we'll catch it if the report body is requested t.report[reportId].sideId = -1; } if (rpt.marchType == 0) t.report[reportId].marchName = tx('Desertion'); else if (rpt.marchType == 1) t.report[reportId].marchName = uW.g_js_strings.commonstr.transport; else if (rpt.marchType == 2) t.report[reportId].marchName = uW.g_js_strings.commonstr.reinforce; else if (rpt.marchType == 3) { if (t.report[reportId].sideId == 0) t.report[reportId].marchName = tx('Anti-Scout'); else t.report[reportId].marchName = uW.g_js_strings.commonstr.scout; } else if (rpt.marchType == 4 || rpt.marchType == 10) { if (t.report[reportId].sideId == 0) t.report[reportId].marchName = uW.g_js_strings.commonstr.defend; else t.report[reportId].marchName = uW.g_js_strings.commonstr.attack; } else t.report[reportId].marchName = '?'; t.data.push({ reportId: reportId }); } } if (parseInt(page) + 1 <= t.maxPages && t.searchRunning) { ById("idRptStatus").innerHTML = tx('Searching page')+' ' + (parseInt(page) + 1) + ' '+uW.g_js_strings.commonstr.of+' ' + t.maxPages; t.getRpt(parseInt(page) + 1); if (t.data.length > 0) t.DisplayRpt(); } else if (page) t.stopSearch(uW.g_js_strings.commonstr.completedexc); } }, DisplayMail: function () { var t = Tabs.Messages; var results = ById("idRptResultsDiv"); if (!t.data.length) { results.innerHTML = '
    '+tx('None found')+'
    '; return; } reportsSearched = t.data.length; reportsFound = 0; t.DisplayIdArray = []; t.DisplayArray = []; t.content = '
    '; var NameType = uW.g_js_strings.commonstr.from; if (Options.MessagesOptions.rptType == 'outbox') { NameType = uW.g_js_strings.commonstr.totx; } for (var i = 0; i < reportsSearched; i++) { var rpt = t.data[i]; if (Options.MessagesOptions.rptType == 'outbox') { var rptuserid = rpt.toUserId; } else { var rptuserid = rpt.fromUserId; } var subject = uW.g_js_strings.modal_messages_listshow.nosubject; if (rpt.subject && rpt.subject.length > 0) { subject = rpt.subject; } var datesok = true; // future development - date filter on messages if (datesok && ((t.what == '' || (rpt.subject.search(t.what, "i") != -1) || (rpt.displayName.search(t.what, "i") != -1)) && (t.whatNot == '' || ((rpt.subject.search(t.whatNot, "i") == -1) && (rpt.displayName.search(t.whatNot, "i") == -1))))) { reportsFound++; if (reportsFound == 1) t.content += '
    '; rowClass = 'evenRow'; if (reportsFound % 2 == 1) rowClass = 'oddRow'; t.content += ''; if (rptuserid==0) { t.content += ''; } else { t.content += ''; } t.content += ''; t.content += ''; t.DisplayIdArray.push(rpt.messageId); t.DisplayArray.push(i); } } if (reportsFound > 1) t.content += '
    '+uW.g_js_strings.commonstr.date+''+NameType+''+uW.g_js_strings.commonstr.subject+''+tx('Delete All')+'
    ' + rpt.dateSent + '' + rpt.displayName + '' + PlayerLink(rptuserid,rpt.displayName) + '' + subject + ''+strButton8(uW.g_js_strings.commonstr.deletetx,'onclick="ptMsgDelete('+i+')"')+'
    '; if (reportsFound == 0 && reportsSearched > 0) t.content = '
    '+tx('No messages found matching search criteria')+'
    '; results.innerHTML = t.content; ById("idRptSearched").innerHTML = ' '+tx('Searched')+': ' + reportsSearched; ById("idRptFound").innerHTML = tx('Matched')+': ' + reportsFound; }, getMailBody: function (ID, dataI) { var t = Tabs.Messages; var params = uW.Object.clone(uW.g_ajaxparams); params.messageId = ID; params.requestType = "GET_MESSAGE_FOR_ID"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) t.displayMailBody(rslt.messageBody,tx('Message Text')); }, }, false); }, displayMailBody: function (messageBody,messageHeader) { var t = Tabs.Messages; t.popMsg = new CPopup('pbMailBody', 0, 0, 670, 600, true, function () { clearTimeout(1000); }); t.popMsg.centerMe(mainPop.getMainDiv()); var m = '
    '; messageBody = messageBody.replace(/custom-line-break/g,"
    "); m += messageBody + '
    '; t.popMsg.getMainDiv().innerHTML = m; t.popMsg.getTopDiv().innerHTML = '
    '+messageHeader+'
    '; t.popMsg.show(true); }, DeleteMessage : function(i) { var t = Tabs.Messages; var params = uW.Object.clone(uW.g_ajaxparams); params.requestType = 'ACTION_ON_MESSAGES'; params.boxType = Options.MessagesOptions.rptType; params.selectedAction = 'delete'; params.selectedMessageIds = t.data[i].messageId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { t.data.splice(i,1); t.DisplayMail(); }, },true); }, DeleteAllMessages : function() { var t = Tabs.Messages; if (t.DisplayArray.length==0) return; var params = uW.Object.clone(uW.g_ajaxparams); params.requestType = 'ACTION_ON_MESSAGES'; params.boxType = Options.MessagesOptions.rptType; params.selectedAction = 'delete'; params.selectedMessageIds = t.DisplayIdArray.toString(); new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { for (var j = t.DisplayArray.length-1; j>=0;j--) { t.data.splice(t.DisplayArray[j],1); } t.DisplayMail(); }, },true); }, DisplayRpt: function () { var t = Tabs.Messages; var results = ById("idRptResultsDiv"); if (!t.data.length) { results.innerHTML = '
    '+tx('None found')+'
    '; return; } var myAllianceId = parseInt(getMyAlliance()[0]); reportsSearched = t.data.length; reportsFound = 0; t.DisplayIdArray = []; t.DisplayArray = []; t.ScoutIdArray = []; t.ScoutArray = []; t.content = ''; for (var i = 0; i < reportsSearched; i++) { var reportId = t.data[i].reportId; var rpt = t.report[reportId]; if ((rpt.side0Name == 'undefined') || (rpt.marchName == tx('Desertion'))) continue; if ((((myAllianceId == parseInt(rpt.side1AllianceId) && Options.MessagesOptions.arAttacker != 'Them') || (myAllianceId != parseInt(rpt.side1AllianceId) && Options.MessagesOptions.arAttacker != 'Us') || Options.MessagesOptions.arAttacker == 'Both') && ((myAllianceId == parseInt(rpt.side0AllianceId) && Options.MessagesOptions.arTarget != 'Them') || (myAllianceId != parseInt(rpt.side0AllianceId) && Options.MessagesOptions.arTarget != 'Us') || Options.MessagesOptions.arTarget == 'Both') && ((Options.MessagesOptions.arAttack && (rpt.marchName == uW.g_js_strings.commonstr.attack || rpt.marchName == uW.g_js_strings.commonstr.defend)) || (Options.MessagesOptions.arScout && (rpt.marchName == uW.g_js_strings.commonstr.scout || rpt.marchName == tx('Anti-Scout'))) || (Options.MessagesOptions.arReinforce && rpt.marchName == uW.g_js_strings.commonstr.reinforce) || (Options.MessagesOptions.arTransport && rpt.marchName == uW.g_js_strings.commonstr.transport))) || (rpt.marchName == tx('Desertion'))) { var datesok = false; var unixtime = rpt.reportUnixTime; if ((unixtime>=t.FromUnixTime || t.FromUnixTime==0) && (unixtime<=t.ToUnixTime || t.ToUnixTime==0)) { datesok = true; } if (datesok && (((t.what == '' || (rpt.side1Name.search(t.what, "i") != -1) || (rpt.side1AllianceName.search(t.what, "i") != -1) || (rpt.side0Name.search(t.what, "i") != -1) || (rpt.side0AllianceName.search(t.what, "i") != -1) || (rpt.side0TileTypeText.search(t.what, "i") != -1)) && (t.whatNot == '' || ((rpt.side1Name.search(t.whatNot, "i") == -1) && (rpt.side1AllianceName.search(t.whatNot, "i") == -1) && (rpt.side0Name.search(t.whatNot, "i") == -1) && (rpt.side0AllianceName.search(t.whatNot, "i") == -1) && (rpt.side0TileTypeText.search(t.whatNot, "i") == -1)))) || (rpt.marchName == tx('Desertion')))) { reportsFound++; if (reportsFound == 1) { t.content += '

    '; t.content += strButton20(tx('PVP Summary'),'onclick="ptRptPVPSummary()"'); if (Options.MessagesOptions.rptType == 'player') { t.content += ' '+strButton20(tx('Item Summary'),'onclick="ptRptItemSummary()"'); } if (Options.MessagesOptions.arScout) { t.content += ' '+strButton20(tx('Scouting Summary'),'onclick="ptRptScoutSummary()"'); } t.content += '
    '; t.content += '
    '; if (Options.MessagesOptions.arAttacker != 'Us') t.content += ''; t.content += ''; if (Options.MessagesOptions.arTarget != 'Us') t.content += ''; t.content += ''; } rowClass = 'evenRow'; if (reportsFound % 2 == 1) rowClass = 'oddRow'; var closestDist = 999999; var closestLoc = null; var closestNum = 1; for (var c = 0; c < Cities.numCities; c++) { var city = Cities.cities[c]; city.x + ',' + city.y var dist = distance(city.x, city.y, rpt.side0XCoord, rpt.side0YCoord); if (dist < closestDist) { closestDist = dist; closestLoc = city.x + ',' + city.y; closestNum = c + 1; } } if (rpt.marchName == tx('Anti-Scout') || rpt.marchName == uW.g_js_strings.commonstr.defend) style = ' style="color:#800;"'; else if (rpt.marchName == uW.g_js_strings.commonstr.reinforce) style = ' style="color:#080;"'; else style = ""; t.content += ''; t.content += ''; if (rpt.marchName == tx('Desertion')) { t.content += ''; if (Options.MessagesOptions.arAttacker != 'Us') t.content += ''; t.content += ''; if (Options.MessagesOptions.arAttacker != 'Us') t.content += ''; t.content += ''; t.content += ''; t.content += ''; } else { t.content += ''; t.content += ''; if (Options.MessagesOptions.arAttacker != 'Us') t.content += ''; if (rpt.side0PlayerId && (rpt.side0PlayerId != 0)) { t.content += ''; } else { t.content += ''; } if (Options.MessagesOptions.arTarget != 'Us') t.content += ''; t.content += ''; t.content += ''; t.content += ''; t.content += ''; } t.DisplayIdArray.push(reportId); t.DisplayArray.push(i); if (rpt.marchName == uW.g_js_strings.commonstr.scout) { t.ScoutIdArray.push(reportId); t.ScoutArray.push(i); } } } } if (reportsFound >= 1) t.content += '
    '+uW.g_js_strings.commonstr.date+''+tx('Report Id')+''+uW.g_js_strings.commonstr.type+''+uW.g_js_strings.commonstr.from+''+uW.g_js_strings.commonstr.attacker+''+uW.g_js_strings.commonstr.alliance+''+uW.g_js_strings.commonstr.target+''+uW.g_js_strings.commonstr.alliance+''+tx('View')+''+uW.g_js_strings.commonstr.type+''+tx('At')+''+tx('Nearest')+''+tx('Dist')+'
    ' + formatUnixTime(rpt.reportUnixTime, '24hour') + '' + reportId + '     '+strButton8(uW.g_js_strings.commonstr.view,'onclick="ptChatReportClicked('+reportId + ',0)"')+'    ' + rpt.marchName + '' + rpt.side1XCoord + ',' + rpt.side1YCoord + '' + PlayerLink(rpt.side1PlayerId,rpt.side1Name) + '' + rpt.side1AllianceName + '' + PlayerLink(rpt.side0PlayerId,rpt.side0Name) + '' + rpt.side0Name + '' + rpt.side0AllianceName + ''+strButton8(uW.g_js_strings.commonstr.view,'onclick="ptChatReportClicked('+reportId + ',0)"')+'' + rpt.side0TileTypeLevel + '' + rpt.side0XCoord + ',' + rpt.side0YCoord + ''+closestLoc+'' + Math.floor(closestDist) + '
    '; if (reportsFound == 0 && reportsSearched > 0) t.content = '
    '+tx('No reports found matching search criteria')+'
    '; results.innerHTML = t.content; ById("idRptSearched").innerHTML = ' '+tx('Searched')+': ' + reportsSearched; ById("idRptFound").innerHTML = tx('Matched')+': ' + reportsFound; if (!t.searchRunning) { jQuery('#ptRptSummaryDiv').removeClass('divHide'); } }, BuildPVPSummary : function () { var t = Tabs.Messages; t.FetchReportArray = []; for (var j = 0; j rslt.detail.fght.s1['u'+i][1]) { var losses = parseInt(rslt.detail.fght.s1['u'+i][0]) - parseInt(rslt.detail.fght.s1['u'+i][1]); t.PlayerData[uid].losses['u'+i] -= losses; t.PlayerData[tid].losses['u'+i] -= losses; might -= parseInt(uW.unitmight['unt'+i] * losses); } } } t.PlayerData[uid].might += might; t.PlayerData[tid].might += might; } // glory for our side only if (rslt.detail['glory'] && t.PlayerData[uid].side=='us') { t.PlayerData[uid].glory += parseInt(rslt.detail['glory']); t.PlayerData[tid].glory += parseInt(rslt.detail['glory']); } // defender stats var uid = rpt.side0PlayerId; t.initPlayerInfo(uid,rpt.side0Name,rpt.side0AllianceId,rpt.side0AllianceName); var tid = t.PlayerData[uid].side; if (rslt.detail.loot) { if (rslt.detail['loot'][0] !== undefined) { t.PlayerData[uid].lost.gold += parseIntNan(rslt.detail['loot'][0]); t.PlayerData[tid].lost.gold += parseIntNan(rslt.detail['loot'][0]); } if (rslt.detail['loot'][1] !== undefined) { t.PlayerData[uid].lost.food += parseIntNan(rslt.detail['loot'][1]); t.PlayerData[tid].lost.food += parseIntNan(rslt.detail['loot'][1]); } if (rslt.detail['loot'][2] !== undefined) { t.PlayerData[uid].lost.wood += parseIntNan(rslt.detail['loot'][2]); t.PlayerData[tid].lost.wood += parseIntNan(rslt.detail['loot'][2]); } if (rslt.detail['loot'][3] !== undefined) { t.PlayerData[uid].lost.stone += parseIntNan(rslt.detail['loot'][3]); t.PlayerData[tid].lost.stone += parseIntNan(rslt.detail['loot'][3]); } if (rslt.detail['loot'][4] !== undefined) { t.PlayerData[uid].lost.ore += parseIntNan(rslt.detail['loot'][4]); t.PlayerData[tid].lost.ore += parseIntNan(rslt.detail['loot'][4]); } if (rslt.detail['loot'][6] !== undefined) { t.PlayerData[uid].lost.aether += parseIntNan(rslt.detail['loot'][6]); t.PlayerData[tid].lost.aether += parseIntNan(rslt.detail['loot'][6]); } } if (rslt.detail.fght && rslt.detail.fght.s0) { var might = 0; if (rslt.detail.overwhelmed) { for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (rslt.detail.fght.s0['u'+i]) { if (rslt.detail.fght.s0['u'+i][0] > rslt.detail.fght.s0['u'+i][1]) { var losses = parseInt(rslt.detail.fght.s0['u'+i][0]); t.PlayerData[uid].losses['u'+i] -= losses; t.PlayerData[tid].losses['u'+i] -= losses; might -= parseInt(uW.unitmight['unt'+i] * losses); } } } for (var i = 53; i <= 55; i++) { if (rslt.detail.fght.s0['f'+i]) { if (rslt.detail.fght.s0['f'+i][0] > rslt.detail.fght.s0['f'+i][1]) { var losses = parseInt(rslt.detail.fght.s0['f'+i][0]); t.PlayerData[uid].losses['f'+i] -= losses; t.PlayerData[tid].losses['f'+i] -= losses; var fm = parseIntNan(fortmight['f'+i]); might -= fm * losses; } } } for (var i = 60; i < 64; i++) { if (rslt.detail.fght.s0['f'+i]) { if (rslt.detail.fght.s0['f'+i][0] > rslt.detail.fght.s0['f'+i][1]) { var losses = parseInt(rslt.detail.fght.s0['f'+i][0]); t.PlayerData[uid].losses['f'+i] -= losses; t.PlayerData[tid].losses['f'+i] -= losses; var fm = parseIntNan(fortmight['f'+i]); might -= fm * losses; } } } } else { for (var ui in CM.UNIT_TYPES) { i = CM.UNIT_TYPES[ui]; if (rslt.detail.fght.s0['u'+i]) { if (rslt.detail.fght.s0['u'+i][0] > rslt.detail.fght.s0['u'+i][1]) { var losses = parseInt(rslt.detail.fght.s0['u'+i][0]) - parseInt(rslt.detail.fght.s0['u'+i][1]); t.PlayerData[uid].losses['u'+i] -= losses; t.PlayerData[tid].losses['u'+i] -= losses; might -= parseInt(uW.unitmight['unt'+i] * losses); } } } for (var i = 53; i <= 55; i++) { if (rslt.detail.fght.s0['f'+i]) { if (rslt.detail.fght.s0['f'+i][0] > rslt.detail.fght.s0['f'+i][1]) { var losses = parseInt(rslt.detail.fght.s0['f'+i][0]) - parseInt(rslt.detail.fght.s0['f'+i][1]); t.PlayerData[uid].losses['f'+i] -= losses; t.PlayerData[tid].losses['f'+i] -= losses; var fm = parseIntNan(fortmight['f'+i]); might -= fm * losses; } } } for (var i = 60; i < 64; i++) { if (rslt.detail.fght.s0['f'+i]) { if (rslt.detail.fght.s0['f'+i][0] > rslt.detail.fght.s0['f'+i][1]) { var losses = parseInt(rslt.detail.fght.s0['f'+i][0]) - parseInt(rslt.detail.fght.s0['f'+i][1]); t.PlayerData[uid].losses['f'+i] -= losses; t.PlayerData[tid].losses['f'+i] -= losses; var fm = parseIntNan(fortmight['f'+i]); might -= fm * losses; } } } } t.PlayerData[uid].might += might; t.PlayerData[tid].might += might; } // glory for our side only if (rslt.detail['glory'] && t.PlayerData[uid].side=='us') { t.PlayerData[uid].glory += parseInt(rslt.detail['glory']); t.PlayerData[tid].glory += parseInt(rslt.detail['glory']); } } } } var message = '
    '+tx('Number of Reports Searched')+': '+RepCount+'

    '; message += '
    '+tx('Resources Taken')+'
    '; var r = 0; message += ''; for (var uid in t.PlayerData) { var rslt = t.PlayerData[uid]; if (rslt.side == "us" && uid != "us") { if (rslt.loot.gold || rslt.lost.gold || rslt.loot.food || rslt.lost.food || rslt.loot.wood || rslt.lost.wood || rslt.loot.stone || rslt.lost.stone || rslt.loot.ore || rslt.lost.ore || rslt.loot.aether || rslt.lost.aether) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; message += ''; message += ''; message += ''; } } } var rslt = t.PlayerData["us"]; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; message += ''; message += ''; message += ''; var r = 0; message += ''; for (var uid in t.PlayerData) { var rslt = t.PlayerData[uid]; if (rslt.side == "them" && uid != "them") { if (rslt.loot.gold || rslt.lost.gold || rslt.loot.food || rslt.lost.food || rslt.loot.wood || rslt.lost.wood || rslt.loot.stone || rslt.lost.stone || rslt.loot.ore || rslt.lost.ore || rslt.loot.aether || rslt.lost.aether) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; message += ''; message += ''; message += ''; } } } var rslt = t.PlayerData["them"]; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; message += ''; message += ''; message += ''; message += '
    '+tx('Player')+''+uW.g_js_strings.commonstr.alliance+' 
    '+MonitorLink(rslt.uid,rslt.name)+''+rslt.aname+''+tx('Lost')+''+addCommas(0-rslt.lost.gold)+''+addCommas(0-rslt.lost.food)+''+addCommas(0-rslt.lost.wood)+''+addCommas(0-rslt.lost.stone)+''+addCommas(0-rslt.lost.ore)+''+addCommas(0-rslt.lost.aether)+'
    '+tx('Gained')+''+addCommas(rslt.loot.gold)+''+addCommas(rslt.loot.food)+''+addCommas(rslt.loot.wood)+''+addCommas(rslt.loot.stone)+''+addCommas(rslt.loot.ore)+''+addCommas(rslt.loot.aether)+'
    '+tx('Total')+''+t.FormatTotal(rslt.loot.gold-rslt.lost.gold)+''+t.FormatTotal(rslt.loot.food-rslt.lost.food)+''+t.FormatTotal(rslt.loot.wood-rslt.lost.wood)+''+t.FormatTotal(rslt.loot.stone-rslt.lost.stone)+''+t.FormatTotal(rslt.loot.ore-rslt.lost.ore)+''+t.FormatTotal(rslt.loot.aether-rslt.lost.aether)+'
    '+tx('Total Gained')+' ('+tx('Us')+')'+tx('Lost')+''+addCommas(0-rslt.lost.gold)+''+addCommas(0-rslt.lost.food)+''+addCommas(0-rslt.lost.wood)+''+addCommas(0-rslt.lost.stone)+''+addCommas(0-rslt.lost.ore)+''+addCommas(0-rslt.lost.aether)+'
    '+tx('Gained')+''+addCommas(rslt.loot.gold)+''+addCommas(rslt.loot.food)+''+addCommas(rslt.loot.wood)+''+addCommas(rslt.loot.stone)+''+addCommas(rslt.loot.ore)+''+addCommas(rslt.loot.aether)+'
    '+tx('Total')+''+t.FormatTotal(rslt.loot.gold-rslt.lost.gold)+''+t.FormatTotal(rslt.loot.food-rslt.lost.food)+''+t.FormatTotal(rslt.loot.wood-rslt.lost.wood)+''+t.FormatTotal(rslt.loot.stone-rslt.lost.stone)+''+t.FormatTotal(rslt.loot.ore-rslt.lost.ore)+''+t.FormatTotal(rslt.loot.aether-rslt.lost.aether)+'
    '+tx('Player')+''+uW.g_js_strings.commonstr.alliance+' 
    '+MonitorLink(rslt.uid,rslt.name)+''+rslt.aname+''+tx('Lost')+''+addCommas(0-rslt.lost.gold)+''+addCommas(0-rslt.lost.food)+''+addCommas(0-rslt.lost.wood)+''+addCommas(0-rslt.lost.stone)+''+addCommas(0-rslt.lost.ore)+''+addCommas(0-rslt.lost.aether)+'
    '+tx('Gained')+''+addCommas(rslt.loot.gold)+''+addCommas(rslt.loot.food)+''+addCommas(rslt.loot.wood)+''+addCommas(rslt.loot.stone)+''+addCommas(rslt.loot.ore)+''+addCommas(rslt.loot.aether)+'
    '+tx('Total')+''+t.FormatTotal(rslt.loot.gold-rslt.lost.gold)+''+t.FormatTotal(rslt.loot.food-rslt.lost.food)+''+t.FormatTotal(rslt.loot.wood-rslt.lost.wood)+''+t.FormatTotal(rslt.loot.stone-rslt.lost.stone)+''+t.FormatTotal(rslt.loot.ore-rslt.lost.ore)+''+t.FormatTotal(rslt.loot.aether-rslt.lost.aether)+'
    '+tx('Total Gained')+' ('+tx('Them')+')'+tx('Lost')+''+addCommas(0-rslt.lost.gold)+''+addCommas(0-rslt.lost.food)+''+addCommas(0-rslt.lost.wood)+''+addCommas(0-rslt.lost.stone)+''+addCommas(0-rslt.lost.ore)+''+addCommas(0-rslt.lost.aether)+'
    '+tx('Gained')+''+addCommas(rslt.loot.gold)+''+addCommas(rslt.loot.food)+''+addCommas(rslt.loot.wood)+''+addCommas(rslt.loot.stone)+''+addCommas(rslt.loot.ore)+''+addCommas(rslt.loot.aether)+'
    '+tx('Total')+''+t.FormatTotal(rslt.loot.gold-rslt.lost.gold)+''+t.FormatTotal(rslt.loot.food-rslt.lost.food)+''+t.FormatTotal(rslt.loot.wood-rslt.lost.wood)+''+t.FormatTotal(rslt.loot.stone-rslt.lost.stone)+''+t.FormatTotal(rslt.loot.ore-rslt.lost.ore)+''+t.FormatTotal(rslt.loot.aether-rslt.lost.aether)+'

    '; message += '
    '+tx('Troop Losses')+'
    '; message += '
    '; var r = 0; message += ''; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (t.PlayerData["us"].losses['u'+i] || t.PlayerData["them"].losses['u'+i]) { message += ''; } } for (var fi in fortmight){ if (t.PlayerData["us"].losses[fi] || t.PlayerData["them"].losses[fi]) { message += ''; } } message += ''; for (var uid in t.PlayerData) { var rslt = t.PlayerData[uid]; if (rslt.side == "us" && uid != "us") { gotdata = false; for (var i in rslt.losses) { if (rslt.losses[i]) { gotdata = true; break; } } if (gotdata) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (t.PlayerData["us"].losses['u'+i] || t.PlayerData["them"].losses['u'+i]) { message += ''; } } for (var fi in fortmight){ if (t.PlayerData["us"].losses[fi] || t.PlayerData["them"].losses[fi]) { message += ''; } } message += ''; } } } var rslt = t.PlayerData["us"]; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (t.PlayerData["us"].losses['u'+i] || t.PlayerData["them"].losses['u'+i]) { message += ''; } } for (var fi in fortmight){ if (t.PlayerData["us"].losses[fi] || t.PlayerData["them"].losses[fi]) { message += ''; } } message += ''; var r = 0; message += ''; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (t.PlayerData["us"].losses['u'+i] || t.PlayerData["them"].losses['u'+i]) { message += ''; } } for (var fi in fortmight){ if (t.PlayerData["us"].losses[fi] || t.PlayerData["them"].losses[fi]) { message += ''; } } message += ''; for (var uid in t.PlayerData) { var rslt = t.PlayerData[uid]; if (rslt.side == "them" && uid != "them") { gotdata = false; for (var i in rslt.losses) { if (rslt.losses[i]) { gotdata = true; break; } } if (gotdata) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (t.PlayerData["us"].losses['u'+i] || t.PlayerData["them"].losses['u'+i]) { message += ''; } } for (var fi in fortmight){ if (t.PlayerData["us"].losses[fi] || t.PlayerData["them"].losses[fi]) { message += ''; } } message += ''; } } } var rslt = t.PlayerData["them"]; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } message += ''; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (t.PlayerData["us"].losses['u'+i] || t.PlayerData["them"].losses['u'+i]) { message += ''; } } for (var fi in fortmight){ if (t.PlayerData["us"].losses[fi] || t.PlayerData["them"].losses[fi]) { message += ''; } } message += ''; message += ''; message += ''; message += '
    '+tx('Player')+''+uW.g_js_strings.commonstr.alliance+''+uW.g_js_strings.commonstr.glory+''+tx('Might Loss')+''+TroopImageBigHeader(i)+''+TroopImageBigHeader(fi.split("f")[1])+'
    '+MonitorLink(rslt.uid,rslt.name)+''+rslt.aname+''+addCommas(rslt.glory)+''+addCommas(rslt.might)+''+addCommas(rslt.losses['u'+i])+''+addCommas(rslt.losses[fi])+'
    '+tx('Total Losses')+' ('+tx('Us')+')'+t.FormatTotal(rslt.glory)+''+t.FormatTotal(rslt.might)+''+t.FormatTotal(rslt.losses['u'+i])+''+t.FormatTotal(rslt.losses[fi])+'
    '+tx('Player')+''+uW.g_js_strings.commonstr.alliance+' '+tx('Might Loss')+''+TroopImageBigHeader(i)+''+TroopImageBigHeader(fi.split("f")[1])+'
    '+MonitorLink(rslt.uid,rslt.name)+''+rslt.aname+' '+addCommas(rslt.might)+''+addCommas(rslt.losses['u'+i])+''+addCommas(rslt.losses[fi])+'
    '+tx('Total Losses')+' ('+tx('Them')+') '+t.FormatTotal(rslt.might)+''+t.FormatTotal(rslt.losses['u'+i])+''+t.FormatTotal(rslt.losses[fi])+'
     
    '+tx('Total Might Loss Difference')+' '+t.FormatTotal(t.PlayerData["us"].might-t.PlayerData["them"].might)+'


    '; t.displayMailBody(message,tx('PVP Summary')); ResetFrameSize('pbMailBody',600,GlobalOptions.btWinSize.x); t.popMsg.centerMe(mainPop.getMainDiv()); }, FormatTotal : function (amt) { var t = Tabs.Messages; if (amt<0) { return ''+addCommas(amt)+'' } else { return addCommas(amt); } }, initPlayerInfo : function(uid,name,aid,aname) { var t = Tabs.Messages; var myAllianceId = parseInt(getMyAlliance()[0]); var side = 'them'; if (uid == "us" || uid == "them") { side = uid; } else { if ((myAllianceId==0 && uid==uW.tvuid) || (myAllianceId!=0 && myAllianceId==parseInt(aid))) { side = 'us'; } } if (!t.PlayerData[uid]) { t.PlayerData[uid] = {}; t.PlayerData[uid].uid = uid; t.PlayerData[uid].name = name; t.PlayerData[uid].aid = aid; t.PlayerData[uid].aname = aname; t.PlayerData[uid].side = side; t.PlayerData[uid].glory = 0; t.PlayerData[uid].might = 0; t.PlayerData[uid].loot = {}; t.PlayerData[uid].loot.gold = 0; t.PlayerData[uid].loot.food = 0; t.PlayerData[uid].loot.wood = 0; t.PlayerData[uid].loot.stone = 0; t.PlayerData[uid].loot.ore = 0; t.PlayerData[uid].loot.aether = 0; t.PlayerData[uid].lost = {}; t.PlayerData[uid].lost.gold = 0; t.PlayerData[uid].lost.food = 0; t.PlayerData[uid].lost.wood = 0; t.PlayerData[uid].lost.stone = 0; t.PlayerData[uid].lost.ore = 0; t.PlayerData[uid].lost.aether = 0; t.PlayerData[uid].losses = {}; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; t.PlayerData[uid].losses['u'+i] = 0; } for (var fi in fortmight){ t.PlayerData[uid].losses[fi] = 0; } } }, FetchReports : function (notify) { var t = Tabs.Messages; if (t.FetchReportArray.length == 0) { if (notify) { notify(); } return; } else { var rpId = t.FetchReportArray.splice(0,1); t.popMsg.getMainDiv().innerHTML = '


    '+tx('Reading in report details')+': '+rpId+'
    '; FetchReport(rpId, function() { t.FetchReports(notify); }); } }, BuildItemSummary : function () { var t = Tabs.Messages; t.FetchReportArray = []; for (var j = 0; j %0A%0A'; message += ''+tx('Miscellaneous items')+': %0A'; var Crests = {}; var total = 0; for (var z in Tabs.Attack.CrestList) { Crests[Tabs.Attack.CrestList[z]] = 0; } for (var z in t.ItemsFound) { if (!isNaN(Crests[z])) // if item is a crest or seal... Crests[z] = t.ItemsFound[z]; else { message += " "+uW.ksoItems[z].name+' x '+t.ItemsFound[z]+'%0A'; } } message +='%0A'; message += ''+tx('Crest Stats')+': %0A'; for (crest in Crests) { if (Crests[crest] > 0) { message += " "+uW.itemlist['i'+crest]['name'] +' x '+ Crests[crest] +'%0A'; total += (Crests[crest]); } } message += ''+tx('Total Crests Found')+': '+ total +' %0A'; message +='%0A'; message += ''+tx('Jewel Stats')+': %0A'; var itemcount = 0; for (z in t.JewelItemsFound){ itemcount += t.JewelItemsFound[z]; message += uW.g_js_strings.jewel['quality_'+Number(z-1)]+' Jewel x '+t.JewelItemsFound[z]+'%0A'; } message += ''+tx('Total Jewels Found')+': '+itemcount+' %0A'; message +='%0A'; message += ''+tx('Throne Stats')+': %0A'; var itemcount = 0; for (z in t.ThroneItemsFound){ itemcount += t.ThroneItemsFound[z].amount; message += strQuality(t.ThroneItemsFound[z].quality)+' '+t.ThroneItemsFound[z].type+' x '+t.ThroneItemsFound[z].amount+'%0A'; } message += ''+tx('Total Throne Room Items Found')+': '+itemcount+' %0A'; message +='%0A'; message += ''+uW.g_js_strings.report_view.champion_stats+': %0A'; var itemcount = 0; for (z in t.ChampItemsFound){ itemcount += t.ChampItemsFound[z].amount; message += strQuality(t.ChampItemsFound[z].quality)+' '+t.ChampItemsFound[z].type+' x '+t.ChampItemsFound[z].amount+'%0A'; } message += ''+tx('Total Champion Equipment Found')+': '+itemcount+' %0A'; t.displayMailBody(message.replace(/%0A/g,"
    "),tx('Items Found Summary')); }, FetchReportDetails : function (notify) { var t = Tabs.Messages; if (t.FetchReportArray.length == 0) { if (notify) { notify(); } return; } else { var rpId = t.FetchReportArray.splice(0,1); t.popMsg.getMainDiv().innerHTML = '


    '+tx('Reading in scout report details')+': '+rpId+'
    '; FetchReportDetail(rpId, 1, function() { t.FetchReportDetails(notify); }); } }, BuildScoutSummary : function () { var t = Tabs.Messages; t.FetchReportArray = []; for (var j = 0; j=t.gold && parseIntNan(rslt.rsc.r1)>=t.food && parseIntNan(rslt.rsc.r2)>=t.wood && parseIntNan(rslt.rsc.r3)>=t.stone && parseIntNan(rslt.rsc.r4)>=t.ore) { FilterCount++; var newobj = {}; newobj.reportId = reportId; newobj.gold = parseIntNan(rslt.gld); newobj.food = parseIntNan(rslt.rsc.r1); newobj.wood = parseIntNan(rslt.rsc.r2); newobj.stone = parseIntNan(rslt.rsc.r3); newobj.ore = parseIntNan(rslt.rsc.r4); t.ScoutResults.push(newobj); } } } } var message = ''+tx('Number of Successful Scout Reports')+': '+WinCount+'

    '; message += '
    '+tx('Minimum Resources')+': '+GameIcons.goldImgTiny+' '+' '+GameIcons.foodImgTiny+' '+' '+GameIcons.woodImgTiny+' '+' '+GameIcons.stoneImgTiny+' '+' '+GameIcons.oreImgTiny+' '+'

    '; message += ''; var r = 0; for (var i=0;i'; message += ''; } message += '
    '+tx('Report Id')+''+tx('Player')+''+uW.g_js_strings.commonstr.alliance+''+uW.g_js_strings.commonstr.city+''+tx('Co-ords')+'
    '+reportId+''+MonitorLink(rpt.side0PlayerId,rpt.side0Name)+''+rpt.side0AllianceName+''+rpt.side0CityName+'' + rpt.side0XCoord + ',' + rpt.side0YCoord + ''+addCommas(t.ScoutResults[i].gold)+''+addCommas(t.ScoutResults[i].food)+''+addCommas(t.ScoutResults[i].wood)+''+addCommas(t.ScoutResults[i].stone)+''+addCommas(t.ScoutResults[i].ore)+'

    '; if (FilterCount>0) { if (Tabs.BulkScout) message += strButton20(tx('Add to Scout List'), 'id=btRptScoutExport')+' '; if (Tabs.BulkAttack) message += strButton20(tx('Add to Attack List'), 'id=btRptBulkAttackExport')+' '; } else { message += '
    '+tx('No scout reports found matching search criteria')+'
    '; } t.displayMailBody(message,tx('Scouting Summary')); ResetFrameSize('pbMailBody',600,GlobalOptions.btWinSize.x); t.popMsg.centerMe(mainPop.getMainDiv()); ById('ToggleRptScoutCheckbox').addEventListener('change', t.doSelectall, false); if (ById('btRptScoutExport')) ById('btRptScoutExport').addEventListener('click', t.ExportScoutList, false); if (ById('btRptBulkAttackExport')) ById('btRptBulkAttackExport').addEventListener('click', t.ExportAttackList, false); ById('btRptGold').addEventListener('change', t.changeResources, false); ById('btRptFood').addEventListener('change', t.changeResources, false); ById('btRptWood').addEventListener('change', t.changeResources, false); ById('btRptStone').addEventListener('change', t.changeResources, false); ById('btRptOre').addEventListener('change', t.changeResources, false); }, changeResources : function () { var t = Tabs.Messages; t.gold = parseIntNan(ById('btRptGold').value); t.food = parseIntNan(ById('btRptFood').value); t.wood = parseIntNan(ById('btRptWood').value); t.stone = parseIntNan(ById('btRptStone').value); t.ore = parseIntNan(ById('btRptOre').value); t.ScoutSummary(); }, doSelectall : function () { var t = Tabs.Messages; var coords = ""; for (var k = 0; k < t.ScoutResults.length; k++) { RptId = t.ScoutResults[k].reportId; if (ById('ToggleRptScoutCheckbox').checked) ById('btRptScout_' + RptId).checked = true; else ById('btRptScout_' + RptId).checked = false; } }, ExportScoutList : function () { var t = Tabs.Messages; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkScout.ImportCoords(coordlist.split(" ")); mainPop.focusMe(); } }, ExportAttackList : function () { var t = Tabs.Messages; var coordlist = t.getSelected(); if (coordlist != "") { Tabs.BulkAttack.ImportCoords(coordlist.split(" ")); mainPop.focusMe(); } }, getSelected : function () { var t = Tabs.Messages; var coordlist = ''; for (var k = 0; k < t.ScoutResults.length; k++) { RptId = t.ScoutResults[k].reportId; var rpt = t.report[RptId]; if (ById('btRptScout_' + RptId).checked) { coordlist += rpt.side0XCoord.toString()+','+rpt.side0YCoord.toString()+' '; ById('btRptScout_' + RptId).checked = false; } } return coordlist; }, }; /** Nomad Tab **/ Tabs.Nomad = { tabOrder: 2120, tabLabel : 'Nomads', tabColor : 'brown', myDiv : null, timer : null, LoopCounter : 0, ValidNomad: false, tradeItem: 0, tradeItemQuantity: 0, prizes: [], eventId :0, isBusy: false, NomadMessage: tx('Fetching details from server')+'...', Options: { x: 0, y: 0, TradeAmount: 0, TradeInterval: 1, TradeInProgress: false, KeepAmount: 0, NomadRunning: false, ItemsWon: {}, NumTrades : 0, LastNomadReport : 0, }, init : function (div) { var t = Tabs.Nomad; t.myDiv = div; if (!Options.NomadOptions) { Options.NomadOptions = t.Options; } else { for (var y in t.Options) { if (!Options.NomadOptions.hasOwnProperty(y)) { Options.NomadOptions[y] = t.Options[y]; } } } t.eventFetchNomadDetails(t.checkAutoTrade); }, checkAutoTrade: function () { var t = Tabs.Nomad; if (Options.NomadOptions.TradeInProgress) { t.start(); }; }, eventFetchNomadDetails: function (notify) { var t = Tabs.Nomad; NomadMessage = tx('Fetching Nomad details from server')+'...'; t.ValidNomad = false; t.tradeItem = 0; t.tradeItemQuantity = 0; t.eventId = 0; t.prizes = []; t.show(); var params = uW.Object.clone(uW.g_ajaxparams); params.xCoord = Options.NomadOptions.x; params.yCoord = Options.NomadOptions.y; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getNomadCamp.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (!rslt.ok){ if (GlobalOptions.btPowerBar) { var elem = ById("bttcNomad"); elem.setAttribute("style","display:none"); } if (rslt.msg) { t.NomadMessage = rslt.msg; } else { t.NomadMessage = tx('No Nomad Camp Details Available'); } Options.NomadOptions.TradeInProgress = false; Options.NomadOptions.NomadRunning = false; t.GenerateReport(); saveOptions(); t.show(); return; } var elem = ById("bttcNomad"); elem.setAttribute("style","color:#f00"); t.ValidNomad = (rslt.tradeItem && rslt.tradeItem!=0); if (!t.ValidNomad) { t.NomadMessage = tx('Invalid Trade Item'); } t.tradeItem = rslt.tradeItem; t.tradeItemQuantity = rslt.tradeItemQuantity; t.eventId = rslt.eventId; t.prizes = rslt.prizes["2"]; t.show(); if (notify) { notify();} }, onFailure: function () { t.NomadMessage = 'AJAX Error'; Options.NomadOptions.TradeInProgress = false; Options.NomadOptions.NomadRunning = false; t.GenerateReport(); saveOptions(); t.show(); }, },true); }, eventDoTrade: function () { var t = Tabs.Nomad; var div = $("pbnomad_info"); var params = uW.Object.clone(uW.g_ajaxparams); params.eventId = t.eventId; params.lootType = 2; new MyAjaxRequest(uW.g_ajaxpath + "ajax/nomadTrade.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt && rslt.ok){ CM.NomadModel.removeItems(t.tradeItem, t.tradeItemQuantity); uW.update_inventory(uWCloneInto(rslt.bonusItems)); for (var lootId in rslt.bonusItems) { if (lootId) { if (div) { div.innerHTML = ''+tx('You received')+' '+rslt.bonusItems[lootId]+' '+uW.itemlist["i"+lootId].name+'
    '+div.innerHTML; } else { actionLog('Auto-Trade: '+rslt.bonusItems[lootId]+' '+uW.itemlist["i"+lootId].name,'NOMAD'); Options.NomadOptions.NumTrades++; if(Options.NomadOptions.ItemsWon[lootId]) { Options.NomadOptions.ItemsWon[lootId] += parseInt(rslt.bonusItems[lootId]); } else { Options.NomadOptions.ItemsWon[lootId] = parseInt(rslt.bonusItems[lootId]); } saveOptions(); } } } Options.NomadOptions.TradeAmount = Options.NomadOptions.TradeAmount-t.tradeItemQuantity; setTimeout(t.nextqueue, 500); } else { if (div) { div.innerHTML = ''+rslt.msg+'
    '+div.innerHTML; ById('pbNomadCancel').firstChild.innerHTML = uW.g_js_strings.commonstr.close; } else { actionLog('Auto-Trade Error: '+rslt.msg,'NOMAD'); } Options.NomadOptions.TradeInProgress = false; saveOptions(); t.isBusy = false; } }, onFailure: function () { if (div) { div.innerHTML = ''+tx('Server Error')+'!
    '+div.innerHTML; ById('pbNomadCancel').firstChild.innerHTML = uW.g_js_strings.commonstr.close; } else { actionLog('AJAX Error!','NOMAD'); } Options.NomadOptions.TradeInProgress = false; saveOptions(); t.isBusy = false; }, },true); }, show : function (){ var t = Tabs.Nomad; if (!t.isBusy || Options.NomadOptions.NomadRunning) { var m = '
    '+tx('NOMAD CAMP AUTO TRADE')+'

    '; m += '
    '; m += ''; m += ''; if (t.ValidNomad) { m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; for (var p in t.prizes) { if (t.prizes[p].itemId) { m += ''; } } } else { m += ''; } m += '
    X:    Y:     ('+tx('Co-ordinates currently not required, but added to the tab in case they are in the future')+')
     
    '+tx('Trade Item')+': '+uW.itemlist["i"+t.tradeItem].name+'
    '+tx('Quantity per Trade')+': '+t.tradeItemQuantity+'
    '+tx('You Own')+': '+(Seed.items["i"+t.tradeItem]?Seed.items["i"+t.tradeItem]:0)+''+tx('Amount to Keep')+':  '+(Options.NomadOptions.NomadRunning?tx('Off'):tx('Auto'))+'
     '+tx('Amount to Trade')+': 
     
     '+tx('Possible Prizes from Trade')+':-
     '+t.prizes[p].quantity + ' ' +uW.itemlist["i"+t.prizes[p].itemId].name+'
    '+t.NomadMessage+'

    '; t.myDiv.innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('btNomadRefresh').addEventListener('click', function() {t.eventFetchNomadDetails();},false); ById('btNomadX').addEventListener('keyup', function(){ if (isNaN(ById('btNomadX').value)) ById('btNomadX').value='';}, false); ById('btNomadY').addEventListener('keyup', function(){ if (isNaN(ById('btNomadY').value)) ById('btNomadY').value='';}, false); ById('btNomadX').addEventListener('change', function(){Options.NomadOptions.x = ById('btNomadX').value;} , false); ById('btNomadY').addEventListener('change', function(){Options.NomadOptions.y = ById('btNomadY').value;} , false); if (t.ValidNomad) { ById('btNomadTrade').addEventListener('click', function() {t.start();},false); ChangeIntegerOption('NomadOptions','btNomadItemAmount','TradeAmount'); ChangeIntegerOption('NomadOptions','btNomadItemKeep','KeepAmount'); ById('pbautonomadstate').addEventListener('click', function(){ t.toggleAutoNomadState(this); }, false); if (Options.NomadOptions.NomadRunning) { ById('btNomadItemAmount').disabled = true; ById('btNomadTrade').disabled = true; } } } else { // reset curtain position.. t.setCurtain(true); } }, toggleAutoNomadState: function(obj){ var t = Tabs.Nomad; obj = ById('pbautonomadlabel'); if (Options.NomadOptions.NomadRunning == true) { Options.NomadOptions.NomadRunning = false; t.GenerateReport(); obj.innerHTML = tx("Auto"); jQuery('#pbautonomadstate').removeClass("red14"); jQuery('#pbautonomadstate').addClass("blue14"); ById('btNomadItemAmount').disabled = false; ById('btNomadTrade').disabled = false; } else { Options.NomadOptions.NomadRunning = true; Options.NomadOptions.ItemsWon = {}; Options.NomadOptions.NumTrades = 0; obj.innerHTML = tx("Off"); jQuery('#pbautonomadstate').addClass("red14"); jQuery('#pbautonomadstate').removeClass("blue14"); ById('btNomadItemAmount').disabled = true; ById('btNomadTrade').disabled = true; Options.NomadOptions.LastNomadChecked = 0; } saveOptions(); }, setPopup: function (onoff) { var t = Tabs.Nomad; if (onoff) { var div = document.createElement('div'); div.id = 'ptNomadPop'; div.style.backgroundColor = '#fff'; div.style.zindex = mainPop.div.zIndex + 2; div.style.opacity = '1'; div.style.border = '3px outset black'; div.style.width = (GlobalOptions.btWinSize.x-200)+'px'; div.style.height = '300px'; div.style.display = 'block'; div.style.position = 'absolute'; div.style.top = '100px'; div.style.left = '100px'; t.myDiv.appendChild(div); return div; } else { t.myDiv.removeChild(ById('ptNomadPop')); } }, setCurtain: function (onoff) { var t = Tabs.Nomad; if (onoff) { var off = getAbsoluteOffsets(t.myDiv); var curtain = ById('ptNomadCurtain'); if (!curtain) { curtain = document.createElement('div'); curtain.id = 'ptNomadCurtain'; curtain.style.zindex = mainPop.div.zIndex + 1; curtain.style.backgroundColor = "#000000"; curtain.style.opacity = '0.5'; curtain.style.display = 'block'; curtain.style.position = 'absolute'; t.myDiv.appendChild(curtain); } curtain.style.width = (t.myDiv.clientWidth+4) + 'px'; curtain.style.height = (t.myDiv.clientHeight+4) + 'px'; curtain.style.top = off.top + 'px'; curtain.style.left = off.left + 'px'; } else { t.myDiv.removeChild(ById('ptNomadCurtain')); } }, e_Cancel: function () { var t = Tabs.Nomad; if (t.isBusy) { t.isBusy = false; var div = $("pbnomad_info"); div.innerHTML += "
    "+tx('Cancelled')+"!"; ById('pbNomadCancel').firstChild.innerHTML = uW.g_js_strings.commonstr.close; return; } t.setCurtain(false); t.setPopup(false); t.show(); }, start : function (){ var t = Tabs.Nomad; Options.NomadOptions.TradeAmount = parseIntNan(Options.NomadOptions.TradeAmount); if(Options.NomadOptions.TradeAmount >= t.tradeItemQuantity) { Options.NomadOptions.TradeInProgress = true; saveOptions(); t.isBusy = true; t.setCurtain(true); var popDiv = t.setPopup(true); popDiv.innerHTML = '
    \
    '+tx('Trading with the Nomads')+'...
    \
    \
    ' + strButton20(uW.g_js_strings.commonstr.cancel, 'id=pbNomadCancel') + '
    '; ById('pbNomadCancel').addEventListener('click', t.e_Cancel, false); t.nextqueue(); } else { Options.NomadOptions.TradeInProgress = false; saveOptions(); } }, nextqueue : function (){ var t = Tabs.Nomad; if(!t.isBusy) return; var div = $("pbnomad_info"); if(Options.NomadOptions.TradeAmount < t.tradeItemQuantity){ if (div) { div.innerHTML = ""+tx('Completed')+"!
    "+div.innerHTML; ById('pbNomadCancel').firstChild.innerHTML = 'Close'; } Options.NomadOptions.TradeInProgress = false; saveOptions(); t.isBusy = false; return; } t.eventDoTrade(); }, EverySecond : function () { var t = Tabs.Nomad; var now = unixTime(); t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // Check Nomad Item Limit and refresh display every 2 seconds if (Options.NomadOptions.NomadRunning) { if ((!Options.NomadOptions.TradeInProgress) && (Options.NomadOptions.LastNomadChecked+60) < now) { // check once a minute, but not if already trading! t.checkNomadItemLimit(); } if (tabManager.currentTab.name == 'Nomad' && Options.btWinIsOpen){ t.show(); } } } }, checkNomadItemLimit : function () { var t = Tabs.Nomad; if (!Options.NomadOptions.NomadRunning) return; if (!t.ValidNomad) return; var item = uW.ksoItems[t.tradeItem]; if (item) { var useamount = parseIntNan(item.count - parseIntNan(Options.NomadOptions.KeepAmount)); if (useamount>=parseIntNan(t.tradeItemQuantity)) { // automatically set trade amount to excess amount... Options.NomadOptions.TradeAmount = useamount; Options.NomadOptions.TradeInProgress = true; saveOptions(); t.isBusy = true; t.nextqueue(); } } var now = unixTime(); Options.NomadOptions.LastNomadChecked = now; saveOptions(); }, GenerateReport : function () { var t = Tabs.Nomad; var now = unixTime(); var total = Options.NomadOptions.NumTrades; if (total > 0) { var message = tx('Nomad Camp Trade Report')+' %0A'; message +='%0A'; message += tx('Items received from trading since previous report')+': %0A'; for (var z in Options.NomadOptions.ItemsWon) { message += uW.ksoItems[z].name+' x '+Options.NomadOptions.ItemsWon[z]+'%0A'; } message +='%0A'; message += tx('Total Number of Trades')+': '+total+'%0A'; var params = uW.Object.clone(uW.g_ajaxparams); params.emailTo = Seed.player['name']; params.subject = tx("Nomad Camp Trade Report"); params.message = message; params.requestType = "COMPOSED_MAIL"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { DeleteLastMessage(); Options.NomadOptions.ItemsWon = {}; Options.NomadOptions.NumTrades = 0; saveOptions(); } }, }); Options.NomadOptions.LastNomadReport = now; saveOptions(); } }, } /** Inventory Tab **/ Tabs.Inventory = { tabOrder: 1110, tabLabel: 'Inventory', myDiv: null, general: [], throne: [], champ: [], speedup: [], combat: [], resources: [], chest: [], court: [], jewels: [], alliance: [], type: null, queue:[], isBusy:false, counter:0, max:0, ModelCity: null, ModelCityId: 0, city_holder : 0, init: function(div){ var t = Tabs.Inventory; t.myDiv = div; var RJcallback = new CalterUwFunc("cm.ThroneController.useRandomJewel",[['ai,','function(rslt) {btShowRandomJewelPrize(rslt);ai(rslt);},'], ['w(','cm.ThroneController.updateJewelCount('], ['q(','cm.ThroneController.jewelName(']]); RJcallback.setEnable(true); uWExportFunction ('btShowRandomJewelPrize', Tabs.Inventory.ShowRandomJewelPrize); var m = '
    '+tx('INVENTORY')+'
    '; m += ''; m += ''; m += '
    '+tx('Target City')+': '+tx('Default to Use All items')+'
    '+tx('Show only items you can use directly')+'
    ' + strButton20(tx('Use Selected Items'), 'id=pbinventory_start') + '
    '; m += ''; t.myDiv.innerHTML = m; jQuery("#btInventoryList").tabs({ activate: function (event, ui) { ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } }); t.sort_Items(); t.ModelCity = new CdispCityPicker ('pbinventory_city', ById('pbinventory_cityselect'), true, null, null); $("pbinventory_general").addEventListener('click', t.display_general, false); $("pbinventory_throne").addEventListener('click', t.display_throne, false); $("pbinventory_champ").addEventListener('click', t.display_champ, false); $("pbinventory_speedup").addEventListener('click', t.display_speedup, false); $("pbinventory_combat").addEventListener('click', t.display_combat, false); $("pbinventory_resources").addEventListener('click', t.display_resources, false); $("pbinventory_chest").addEventListener('click', t.display_chest, false); $("pbinventory_court").addEventListener('click', t.display_court, false); $("pbinventory_jewels").addEventListener('click', t.display_jewels, false); $("pbinventory_alliance").addEventListener('click', t.display_alliance, false); $("pbinventory_start").addEventListener('click', t.start, false); $("pbinventory_useable").addEventListener('click', t.show, false); $("pbinventory_general").click(); }, sort_Items : function (){ var t = Tabs.Inventory; t.general = []; t.throne = []; t.champ = []; t.speedup = []; t.combat = []; t.resources = []; t.chest = []; t.court = []; t.jewels = []; t.alliance = []; for(var k in uW.ksoItems){ var item = uW.ksoItems[k]; if(item.count > 0){ if((item.category == 0 || item.category == 1) && item.subCategory == 2){ t.throne.push(item); } if((item.category == 0 || item.category == 1) && item.subCategory == 28){ t.champ.push(item); } if((item.category == 1) && item.subCategory != 28 && item.subCategory != 2){ t.general.push(item); } if(item.category == 2){ t.speedup.push(item); } if(item.category == 3){ t.combat.push(item); } if(item.category == 4){ t.resources.push(item); } if(item.category == 5){ t.chest.push(item); } if(item.category == 6){ t.court.push(item); } if(item.category == 7){ t.jewels.push(item); } if(item.category == 8){ t.alliance.push(item); } } } }, display_general : function (){ var t = Tabs.Inventory; t.type = "general"; var div = ById("pbinventory"); var count = 0; var m = ""; m += ""; for (var k=0;k":""; m += ""; if (item.usable) { m += ""; m += ""; } else { m += ""; } m += ""; m += (count%3 == 2)?"":""; count++; } m += "
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); }, display_throne : function (){ var t = Tabs.Inventory; t.type = "throne"; var div = ById("pbinventory"); var count = 0; var m = ""; m += ""; for (var k=0;k":""; var spanclass = ''; if (t.GetInventory(item.id)==0) { spanclass = 'boldRed'; } m += ""; if (item.usable) { m += ""; m += ""; } else { m += ""; } m += ""; m += (count%3 == 2)?"":""; count++; } m += "
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); }, display_champ : function (){ var t = Tabs.Inventory; t.type = "champ"; var div = ById("pbinventory"); var count = 0; var m = ""; m += ""; t.champ.sort(function(a, b){ return Tabs.Reference.UniqueCHItems[a.id].Set-Tabs.Reference.UniqueCHItems[b.id].Set }); for (var k=0;k":""; var spanclass = ''; if (t.GetCHInventory(item.id)==0) { spanclass = 'boldRed'; } m += ""; if (item.usable) { m += ""; m += ""; } else { m += ""; } m += ""; m += (count%3 == 2)?"":""; count++; } m += "
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); }, display_speedup : function (){ var t = Tabs.Inventory; t.type = "speedup"; var div = ById("pbinventory"); var count = 0; var totaltime = 0; var m = ""; m += ""; m += ""; for (var k=0;k":""; m += ""; if (item.usable) { m += ""; m += ""; } else { m += ""; } m += ""; m += ""; m += (count%2 == 1)?"":""; count++; totaltime = totaltime+itemtime; } m += "
    "+tx('Total Speedup Time')+":  
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+""+uW.g_js_strings.commonstr.time+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+""+uW.g_js_strings.commonstr.time+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+""+((itemtime!=0)?uW.timestr(itemtime):'')+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; var tm = ById('pbinvspeedtime') if (tm) tm.innerHTML = uW.timestr(totaltime); t.setEventHandlers(); }, display_combat : function (){ var t = Tabs.Inventory; t.type = "combat"; var div = ById("pbinventory"); var count = 0; var totalmight = 0; var m = ""; m += ""; m += ""; for (var k=0;k":""; m += ""; if (item.usable) { m += ""; m += ""; } else { m += ""; } m += ""; m += ""; m += (count%2 == 1)?"":""; count++; totalmight = totalmight+might; } m += "
    "+tx('Total Troop Might')+":   
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+""+tx('Might')+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+""+tx('Might')+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+""+((might!=0)?addCommas(might):'')+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; var tm = ById('pbinvcombatmight') if (tm) tm.innerHTML = addCommas(totalmight); t.setEventHandlers(); t.setCombatEventHandlers(); }, display_resources : function (){ var t = Tabs.Inventory; t.type = "resources"; var div = ById("pbinventory"); var count = 0; var m = ""; m += ""; for (var k=0;k":""; m += ""; if (item.usable) { m += ""; m += ""; } else { m += ""; } m += ""; m += (count%3 == 2)?"":""; count++; } m += "
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); }, display_chest : function (){ var t = Tabs.Inventory; t.type = "chest"; var div = ById("pbinventory"); var count = 0; var m = ""; m += ""; for (var k=0;k":""; m += ""; if (item.usable) { m += ""; m += ""; } else { m += ""; } m += ""; m += (count%3 == 2)?"":""; count++; } m += "
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); }, display_court : function (){ var t = Tabs.Inventory; t.type = "court"; var div = ById("pbinventory"); var count = 0; var m = ""; m += ""; for (var k=0;k":""; m += ""; if (item.usable) { m += ""; m += ""; } else { if (item.equippable) { m += ""; } else { m += ""; } } m += ""; m += (count%3 == 2)?"":""; count++; } m += "
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); var nodes = ByCl("pbinv_equip"); if(nodes.length > 0){ for(var i=0; i "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+""; for (var k=0;k":" "; m += " "+item.name.substr(0,40)+""; if (item.usable) { m += ""; m += ""; } else { m += "  "; } m += ""+addCommas(item.count)+""; m += (count%2 == 1)?"":""; count++; } m += ""; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); }, display_alliance : function (){ var t = Tabs.Inventory; t.type = "alliance"; var div = ById("pbinventory"); var count = 0; var m = ""; m += ""; for (var k=0;k":""; m += ""; // if (item.usable) { m += ""; m += ""; // } // else { // m += ""; // } m += ""; m += (count%3 == 2)?"":""; count++; } m += "
    "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+" "+uW.g_js_strings.commonstr.nametx+" "+uW.g_js_strings.commonstr.use+""+uW.g_js_strings.commonstr.count+"
      "+item.name.substr(0,30)+"  "+addCommas(item.count)+"
    "; div.innerHTML = (count!=0)?m:'
    '+tx('No useable items in this category')+'

    '; t.setEventHandlers(); }, setCombatEventHandlers : function () { var t = Tabs.Inventory; var nodes = ByCl("pb_inv_"+t.type); if(nodes.length > 0){ for(var i=0; i 0){ for(var i=0; i 0){ for(var i=0; i'+TT+''); } }, CalculateSelectedMight : function () { var t = Tabs.Inventory; var selectedmight = 0; var nodes = ByCl("pb_inv_"+t.type); if(nodes.length > 0){ for(var i=0; i 0) { t.isBusy = true; t.setCurtain(true); var popDiv = t.setPopup(true); popDiv.innerHTML = '
    \
    Using Selected Inventory Items
    \
    \
    ' + strButton20(uW.g_js_strings.commonstr.cancel, 'id=pbInvCancel') + '
    '; ById('pbInvCancel').addEventListener('click', t.e_Cancel, false); t.nextqueue(); } }, nextqueue : function (){ var t = Tabs.Inventory; if(!t.isBusy) return; var div = $("pbinventory_info"); if(t.queue.length > 0){ var item = t.queue[0]; t.counter = 0; t.max = parseIntNan($("pb_inv_"+t.type+"_"+item.id).value); div.innerHTML = ""+tx('Using item')+" "+item.name+" 1 "+uW.g_js_strings.commonstr.of+" "+t.max+".
    "+div.innerHTML; } else { div.innerHTML = ""+uW.g_js_strings.commonstr.completedexc+"
    "+div.innerHTML; ById('pbInvCancel').firstChild.innerHTML = uW.g_js_strings.commonstr.close; t.isBusy = false; return; } // special use items - e.g. Merlins Tokens... if (uW.itemlist["i"+item.id].subCategory == 100) { $("pb_inv_info_count_"+item.id).innerHTML = t.max; t.useMysteryChest(item.id,t.max); } else { if (item.id==599) { t.useMerlin(); } else { var MultiUse = CM.ItemIdentifier.canUseMultiple(uWCloneInto(item)); if (item.category==7) MultiUse = true; // jewels you can multi-use! if (item.id==30130 || item.id==30131 || item.id==30132 || item.id==30133 || item.id==30134) { // random jewels don't multi-use - do it the old way... MultiUse = false; } if (ItemMultiUseController.ItemController.isAvailable && MultiUse) t.useitem_multi(); else t.useitem(); } } }, useitem_multi : function (){ var t = Tabs.Inventory; if(!t.isBusy) return; var item = t.queue[0]; $("pb_inv_info_count_"+item.id).innerHTML = t.max; ItemMultiUseController.UseItems(item.id,t.max,t.ModelCity.city.id); setTimeout(t.wait_new, 250, 0); }, wait_new : function (){ var t = Tabs.Inventory; if(!t.isBusy) return; var item = t.queue[0]; item = uW.ksoItems[item.id]; t.queue[0] = item; $("pb_inv_info_extra_"+item.id).innerHTML = tx("Done")+"."; t.queue.shift(); setTimeout(t.nextqueue, 500); }, useitem : function (){ var t = Tabs.Inventory; if(!t.isBusy) { return; } var item = t.queue[0]; if(t.ModelCity.city.id){ //Set to use city specified t.city_holder = uW.currentcityid; uW.currentcityid = t.ModelCity.city.id; } CM.ItemController.use(item.id); if(t.ModelCity.city.id){ //Set currentcity to old value uW.currentcityid = t.city_holder; } setTimeout(t.wait, 500, 0); }, wait : function (retries){ var t = Tabs.Inventory; if(!t.isBusy) return; var item = t.queue[0]; item = uW.ksoItems[item.id]; t.queue[0] = item; t.counter++; $("pb_inv_info_count_"+item.id).innerHTML = t.counter; $("pb_inv_info_extra_"+item.id).innerHTML = '('+(t.max-t.counter)+' Left)'; if(t.counter >= t.max){ $("pb_inv_info_extra_"+item.id).innerHTML = tx("Done")+"."; t.queue.shift(); setTimeout(t.nextqueue, 1000); return; } $("pb_inv_info_extra_"+item.id).innerHTML = tx("Done")+". "+tx("Wait for 1 second")+".."; if (item.id==599) { setTimeout(t.useMerlin, 500); } else { setTimeout(t.useitem, 500); } }, show: function (init) { var t = Tabs.Inventory; var DispCityId = uW.currentcityid; if (init) { DispCityId = InitialCityId; } if (t.ModelCityId!=DispCityId) { t.ModelCity.selectBut(Cities.byID[DispCityId].idx); t.ModelCityId = DispCityId; } t.sort_Items(); if (t.type=='general') { t.display_general(); } if (t.type=='throne') { t.display_throne(); } if (t.type=='champ') { t.display_champ(); } if (t.type=='speedup') { t.display_speedup(); } if (t.type=='combat') { t.display_combat(); } if (t.type=='resources') { t.display_resources(); } if (t.type=='chest') { t.display_chest(); } if (t.type=='court') { t.display_court(); } if (t.type=='jewel') { t.display_jewels(); } if (t.type=='alliance') { t.display_alliance(); } }, setPopup: function (onoff) { var t = Tabs.Inventory; if (onoff) { var div = document.createElement('div'); div.id = 'ptInvPop'; div.style.backgroundColor = Options.Colors.Panel; div.style.zindex = mainPop.div.zIndex + 2; div.style.opacity = '1'; div.style.border = '3px outset black'; div.style.width = (GlobalOptions.btWinSize.x-200)+'px'; div.style.height = '300px'; div.style.display = 'block'; div.style.position = 'absolute'; div.style.top = '100px'; div.style.left = '100px'; t.myDiv.appendChild(div); return div; } else { t.myDiv.removeChild(ById('ptInvPop')); } }, setCurtain: function (onoff) { var t = Tabs.Inventory; if (onoff) { var off = getAbsoluteOffsets(t.myDiv); var curtain = document.createElement('div'); curtain.id = 'ptInvCurtain'; curtain.style.zindex = mainPop.div.zIndex + 1; curtain.style.backgroundColor = "#000000"; curtain.style.opacity = '0.5'; curtain.style.width = (t.myDiv.clientWidth+4) + 'px'; curtain.style.height = (t.myDiv.clientHeight+4) + 'px'; curtain.style.display = 'block'; curtain.style.position = 'absolute'; curtain.style.top = off.top + 'px'; curtain.style.left = off.left + 'px'; t.myDiv.appendChild(curtain); } else { t.myDiv.removeChild(ById('ptInvCurtain')); } }, e_Cancel: function () { var t = Tabs.Inventory; t.isBusy = false; t.setCurtain(false); t.setPopup(false); t.show(); }, useMerlin : function () { var t = Tabs.Inventory; if(!t.isBusy) { return; } var div = $("pbinventory_info"); var params=uW.Object.clone(uW.g_ajaxparams); params.ftflag=0; new MyAjaxRequest(uW.g_ajaxpath+"ajax/magicalboxPreview.php"+uW.g_ajaxsuffix,{ method:"post", parameters:params, onSuccess:function(rslt){ if(rslt.ok){ var params=uW.Object.clone(uW.g_ajaxparams); new MyAjaxRequest(uW.g_ajaxpath+"ajax/magicalboxPick.php"+uW.g_ajaxsuffix,{ method:"post", parameters:params, onSuccess:function(rslt){ if(rslt.ok){ var itemId=rslt.prize; if (Seed.items["i"+itemId]) { Seed.items["i"+itemId] = parseInt(Seed.items["i"+itemId])+1; uW.ksoItems[itemId].add(); } else { Seed.items["i"+itemId] = 1; uW.ksoItems[itemId].add(); } var NumTokens = parseInt(Seed.items.i599); if (NumTokens > 0) { NumTokens = NumTokens - 1; Seed.items.i599 = (NumTokens).toString(); uW.ksoItems[599].subtract(); } div.innerHTML = ""+tx('You won')+" "+uW.itemlist["i"+rslt.prize].name+"!
    "+div.innerHTML; } else { div.innerHTML = ""+rslt.msg+"
    "+div.innerHTML; } } },true); } else { div.innerHTML = ""+rslt.msg+"
    "+div.innerHTML; } } },true); setTimeout(t.wait, 500, 0); }, useMysteryChest : function (itemId,quantity) { var t = Tabs.Inventory; if(!t.isBusy) { return; } var div = $("pbinventory_info"); function addItemsToSeed(items) { jQuery.each(items, function (key, value) { if (Seed.items["i" + key]) { Seed.items["i" + key] = (parseInt(Seed.items["i" + key]) + parseInt(value)).toString(); uW.ksoItems[key].add(Number(value)) } else { Seed.items["i" + key] = value.toString(); uW.ksoItems[key].add(Number(value)) } div.innerHTML = ""+tx('You won')+" "+value+" "+uW.itemlist["i"+key].name+"!
    "+div.innerHTML; }) } params = uW.Object.clone(uW.g_ajaxparams); params.chestId = itemId; params.cid = t.ModelCity.city.id; params.quantity = quantity; new MyAjaxRequest(uW.g_ajaxpath + "ajax/useMysteryChest.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { CM.InventoryView.removeItemFromInventory(itemId, params.quantity); addItemsToSeed(uWCloneInto(rslt.items)); } else { div.innerHTML = ""+rslt.feedback+"
    "+div.innerHTML; } }, },true); setTimeout(t.wait_new, 250, 0); }, useCourtItem : function (itemId) { var t = Tabs.Inventory; var isEquippedFlag = (uW.ksoItems[itemId].isEquipped) ? 2 : 1; var params = uW.Object.clone(uW.g_ajaxparams); params.item = itemId; params.setflag = isEquippedFlag; new MyAjaxRequest(uW.g_ajaxpath + "ajax/courtSelectItem.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { CM.Court.unequipOtherCourtItems(itemId); if (uW.ksoItems[itemId].isEquipped) { uW.ksoItems[itemId].isEquipped = false; jQuery.each(Seed.courtItems, function (index, courtItem) { if (Number(courtItem) == itemId) { Seed.courtItems.splice(index, 1) } }) } else { uW.ksoItems[itemId].isEquipped = true; Seed.courtItems.push(itemId.toString()) } CM.InventoryView.toggleCourtItem(itemId); if (jQuery("#courtView")) { uW.changeview_court_content(); } uW.update_bdg(); t.show(); } }, },true); }, ShowRandomJewelPrize : function (rslt) { var t = Tabs.Inventory; var div = $("pbinventory_info"); if (!div) return; if (rslt.ok) { var prize = { quality : rslt.q, id : rslt.e, count : rslt.count }; var JName = CM.ThroneController.jewelName(uWCloneInto(prize)); if (prize.count>1) JName = prize.count+' '+JName; div.innerHTML = ""+tx('You won')+" "+JName+"!
    "+div.innerHTML; } else { if (rslt.msg) { div.innerHTML = ""+rslt.msg+"
    "+div.innerHTML; } } }, GetInventory : function (trID) { var t = Tabs.Inventory; var count = 0; for (var k in uW.kocThroneItems) { var throne_item = uW.kocThroneItems[k]; if (throne_item.unique == trID) { count++; } } return count; }, GetCHInventory : function (chID) { var t = Tabs.Inventory; var count = 0; for (var k in uW.kocChampionItems) { var champ_item = uW.kocChampionItems[k]; if (champ_item.unique == chID) { count++; } } return count; }, } /** Scout Reports Tab **/ Tabs.ScoutReports = { tabLabel: 'Scout Rpts', tabOrder: 2090, tabColor : 'brown', Options: { gold: 0, r1: 0, r2: 0, r3: 0, r4: 0, On: false, lost: false, friendly: true, hostile: true, }, LoopCounter : 0, lrpts: null, myDiv: null, deleting: false, pageNo: 1, maxpages : 10, scandelay : 30, // 30 seconds between scans tocheck: new Array(), init: function(div) { var t = Tabs.ScoutReports; t.myDiv = div; if (!Options.ScoutOptions) { Options.ScoutOptions = t.Options; } else { for (var y in t.Options) { if (!Options.ScoutOptions.hasOwnProperty(y)) { Options.ScoutOptions[y] = t.Options[y]; } } } setTimeout(t.startdeletereports, 10*1000); }, e_toggleswitch: function(obj) { var t = Tabs.ScoutReports; if (Options.ScoutOptions.On) { obj.value = tx("Delete = OFF"); Options.ScoutOptions.On = false; } else { obj.value = tx("Delete = ON"); Options.ScoutOptions.On = true; } saveOptions(); }, startdeletereports: function() { var t = Tabs.ScoutReports; if (!t.deleting) { if (Options.ScoutOptions.On) { t.deleting = true; t.listreports(t.pageNo, t.checkreports); } else { t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); } } }, listreports: function(pageNo, callback) { var t = Tabs.ScoutReports; t.pageNo = pageNo; if (!Options.ScoutOptions.On) { t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); return; } var params = uW.Object.clone(uW.g_ajaxparams); if (t.pageNo >= 1) params.pageNo = t.pageNo; new MyAjaxRequest(uW.g_ajaxpath + "ajax/listReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function(rslt) { callback(rslt); }, onFailure: function() { callback(); }, }); }, checkreports: function(rslt) { var t = Tabs.ScoutReports; if (!rslt.ok || (rslt.arReports.length < 1)) { t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); return; } var reports = rslt.arReports; var totalPages = rslt.totalPages; if (rslt.totalPages > t.maxpages) var totalPages = t.maxpages; var deletes1 = new Array(); for (var k in reports) { if (Options.ScoutOptions.On) { if (reports[k].marchType == 3) { if (reports[k].side1PlayerId == uW.tvuid) { var rptdel = false; if (reports[k].side0AllianceId && Options.ScoutOptions.friendly == true) { if (Seed.allianceDiplomacies.friendlyToThem) { for (var l in Seed.allianceDiplomacies.friendlyToThem) { if(reports[k].side0AllianceId == Seed.allianceDiplomacies.friendlyToThem[l].allianceId) { if (GlobalOptions.ExtendedDebugMode) actionLog('deleting friendly scout' + k.substr(2),'SCOUT'); deletes1.push(k.substr(2)); rptdel = true; } } } if (Seed.allianceDiplomacies.friendly) { for (var l in Seed.allianceDiplomacies.friendly) { if(reports[k].side0AllianceId == Seed.allianceDiplomacies.friendly[l].allianceId) { if (GlobalOptions.ExtendedDebugMode) actionLog('deleting friendly scout ' + k.substr(2),'SCOUT'); deletes1.push(k.substr(2)); rptdel = true; } } } }; if (reports[k].side0AllianceId && Options.ScoutOptions.hostile == true) { if (Seed.allianceDiplomacies.hostile) { for (var l in Seed.allianceDiplomacies.hostile) { if(reports[k].side0AllianceId == Seed.allianceDiplomacies.hostile[l].allianceId) { if (GlobalOptions.ExtendedDebugMode) actionLog('not deleting hostile scout ' + k.substr(2),'SCOUT'); rptdel = true; } } } }; }; if (rptdel == false) { t.tocheck.push(k.substr(2)); } }; } }; if(deletes1.length > 0){ t.deleteCheckedReports(deletes1); } else { if (t.pageNo <= totalPages) { t.deleting = false; t.pageNo++; setTimeout(t.startdeletereports, 5*1000); // next page in 5 seconds return; } else { t.deleting = false; t.pageNo = 1; setTimeout(t.startdeletereports, t.scandelay*1000); return; } } }, deleteCheckedReports : function(deletes1){ var t = Tabs.ScoutReports; var params = uW.Object.clone(uW.g_ajaxparams); params.s0rids = ''; params.s1rids = deletes1.join(","); params.cityrids = ''; new MyAjaxRequest(uW.g_ajaxpath + "ajax/deleteCheckedReports.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if(rslt.ok){ if (deletes1.length>0) { for (var j=0;j 0) { rpId = t.tocheck.shift(); FetchReportDetail(rpId,1,function(rslt) { if (rslt) { if (rslt.hasOwnProperty("winner") && rslt.winner == 0) { if (!Options.ScoutOptions.lost) { if (GlobalOptions.ExtendedDebugMode) actionLog('deleting defeated scout report ' + rpId,'SCOUT'); deleteCheckedReport(rpId); } } else { if (rslt.rsc) { var rsc = rslt.rsc; var topush = true; if (Number(Options.ScoutOptions.gold) > 0) { if (rslt.gld && Number(rslt.gld) > Number(Options.ScoutOptions.gold)) { topush = false; } } if (Number(Options.ScoutOptions.r1) > 0) { if (Number(rsc.r1) > Number(Options.ScoutOptions.r1)) { topush = false; } } if (Number(Options.ScoutOptions.r2) > 0) { if (Number(rsc.r2) > Number(Options.ScoutOptions.r2)) { topush = false; } } if (Number(Options.ScoutOptions.r3) > 0) { if (Number(rsc.r3) > Number(Options.ScoutOptions.r3)) { topush = false; } } if (Number(Options.ScoutOptions.r4) > 0) { if (Number(rsc.r4) > Number(Options.ScoutOptions.r4)) { topush = false; } } if (topush == true) { deleteCheckedReport(rpId); } } } } }); } }, show: function() { var t = Tabs.ScoutReports; var m = '
    '+tx('AUTO-DELETE OWN SCOUT REPORTS')+'

    '; if (Options.ScoutOptions.On) { m += ''; } else { m += ''; } m += '
     
    '+tx('DELETE OPTIONS')+'

    '; m += '   '+tx("DON'T")+' '+tx('Delete Scout Reports if')+'...'; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
      '+tx('Your scouts were defeated in battle')+'
      '+tx('OR')+''+tx('Gold is more than')+' : 
      '+tx('OR')+''+tx('Food is more than')+' : 
      '+tx('OR')+''+tx('Wood is more than')+' : 
      '+tx('OR')+''+tx('Stone is more than')+' : 
      '+tx('OR')+''+tx('Ore is more than')+' : 
     ('+tx('NB - Set amount to zero to disable the check for that resource')+')
    '; m += '
        '+tx('ALWAYS')+' '+tx('Delete Scout Reports of Friendly Alliances'); m += '
        '+tx('NEVER')+' '+tx('Delete Scout Reports of Hostile Alliances'); m += '
     '; t.myDiv.innerHTML = m; ChangeOption('ScoutOptions','frGold','gold'); ChangeOption('ScoutOptions','frR1','r1'); ChangeOption('ScoutOptions','frR2','r2'); ChangeOption('ScoutOptions','frR3','r3'); ChangeOption('ScoutOptions','frR4','r4'); ToggleOption('ScoutOptions','frlost','lost'); ToggleOption('ScoutOptions','frfriendly','friendly'); ToggleOption('ScoutOptions','frhostile','hostile'); ById('FSrpts').addEventListener('click', function() { t.e_toggleswitch(this) }, false); }, EverySecond : function () { var t = Tabs.ScoutReports; if (!t.deleting && Options.ScoutOptions.On) { t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter >= 2) { t.LoopCounter = 0; // check next report and delete if required.. t.fetchreport(); } } else { t.LoopCounter = 0; } }, }; /** Bulk Scout **/ Tabs.BulkScout = { tabLabel: 'Scout List', tabOrder: 2080, tabColor : 'brown', timer: null, cityreason : '', Options: { NumScouts: 1, ScoutCity: 0, SkipErrors: true, Attack:false, AttackPreset:false, AllCities:false, ClosestCity:false, QuickScout:false, CoordList:[], On:false, Toggle : false, KnightPriority : 0, // 0 - highest combat (default), 1 - lowest combat, 2 - highest experience, 3 - lowest experience, 4 - no knight! SendChamp : 0, // 0 - never (default), 1 - always, 2 - if available FreeRallySlots : 2, ClearOnRefresh : true, intervalSecs : 5, OverrideAP : false, ScoutType : 3, }, myDiv: null, init: function(div) { var t = Tabs.BulkScout; t.myDiv = div; if (!Options.BulkScoutOptions) { Options.BulkScoutOptions = t.Options; } else { for (var y in t.Options) { if (!Options.BulkScoutOptions.hasOwnProperty(y)) { Options.BulkScoutOptions[y] = t.Options[y]; } } } if (Options.BulkScoutOptions.Toggle) AddSubTabLink('AutoScout',t.e_toggleswitch, 'ScoutToggleTab'); SetToggleButtonState('Scout',Options.BulkScoutOptions.On,'Scout'); // strip out any co-ords not ticked - this will be unpopular, but it will avoid the list endlessly growing! var b = Options.BulkScoutOptions.CoordList.length; while (b--) { if (!Options.BulkScoutOptions.CoordList[b].chk && Options.BulkScoutOptions.ClearOnRefresh) { Options.BulkScoutOptions.CoordList.splice(b,1); } } uWExportFunction('btRemoveScoutList', Tabs.BulkScout.RemoveEntry); uWExportFunction('pbscoutclick', Tabs.BulkScout.ToggleEntry); // start autoscout loop timer to start in 10 seconds... if (Options.BulkScoutOptions.On) { t.timer = setTimeout(function () { t.doAutoLoop(Options.BulkScoutOptions.ScoutCity);}, (10 * 1000)); } }, show: function (init) { var t = Tabs.BulkScout; if (!Options.BulkScoutOptions.On) { // reset to current city on show if not already scouting if (init) { Options.BulkScoutOptions.ScoutCity = Cities.byID[InitialCityId].idx; } else { Options.BulkScoutOptions.ScoutCity = Cities.byID[uW.currentcityid].idx; } } var m = '
    '+tx('SCOUT/ATTACK LIST')+'
    '; m += '
     '+tx("Add toggle button to main screen header")+' 
    '; m += '
    '+tx('OPTIONS')+'

    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Number of")+' '+htmlSelector(ScoutTroops,Options.BulkScoutOptions.ScoutType,' id=pbsscouttype class=btInput')+' '+tx("to send")+': 
    '+tx("Keep")+' '+tx("free rally point slots")+'
    '+translate("March Interval")+': '+translate("seconds")+'
    '+tx("Remove unchecked co-ords from list on refresh")+'
    '+tx("March from")+':
    '+tx("or select the closest city")+'
    '+tx("Skip targets when errors occur")+'
    '+tx("Use all cities (not under Ascension Protection!)")+'
    '+tx("Allow marches from cities under Ascension Protection")+' ('+tx('BEWARE!')+')
    '+tx("Fetch march target details (QuickScout)")+'
    '+tx("Send ATTACK!")+'    '; var MarchPresets = {0:"-- "+tx('Use Scouts')+" --"}; for (var PN in Options.QuickMarchOptions.MarchPresets) { MarchPresets[PN] = Options.QuickMarchOptions.MarchPresets[PN][0]; } m += htmlSelector(MarchPresets, Options.BulkScoutOptions.AttackPreset, ' id=pbsattackpreset class=btInput'); m += '
     '+tx('Knight priority')+': '+htmlSelector({0:tx('Highest Combat Skill'), 1:tx('Lowest Combat Skill'), 2:tx('Highest Experience'), 3:tx('Lowest Experience'), 4:tx('No Knight! (Megaliths)')}, Options.BulkScoutOptions.KnightPriority, ' class=btInput id=pbsknight')+'
     '+tx('Send Champion')+': '+htmlSelector({0:tx('Never'), 1:tx('Always'), 2:tx('If Available')}, Options.BulkScoutOptions.SendChamp, ' class=btInput id=pbschamp')+'
    '; m += '
    '; m += '
    '+tx("Co-ordinates")+':
    '; m += '
    '; m += '
    '+strButton20(tx('Add to Scout List'), 'id=pbAddBulkScout')+'
    '; m += '
     
    '; m += '
    '+tx('SCOUT QUEUE')+'

    '; m += '

    '; t.myDiv.innerHTML = m; t.PaintList(''); new CdispCityPicker ('pbScoutPick', ById('pbsrcScoutcitypick'), true, function(c,x,y){ Options.BulkScoutOptions.ScoutCity = c.idx; }, Options.BulkScoutOptions.ScoutCity); ById('BulkScoutButton').addEventListener('click', function() { t.e_toggleswitch(this) }, false); ChangeIntegerOption('BulkScoutOptions','btbsfreerallyslots','FreeRallySlots'); ById('btbsmarchinterval').addEventListener('keyup', function () { if (parseIntNan(ById('btbsmarchinterval').value)<1) { ById('btbsmarchinterval').value = 5; } if (parseIntNan(ById('btbsmarchinterval').value)<2) { ById('btbsmarchinterval').value = 2; } Options.BulkScoutOptions.intervalSecs = parseIntNan(ById('btbsmarchinterval').value); saveOptions(); }, false); ToggleOption('BulkScoutOptions','btScoutToggle','Toggle'); ToggleOption('BulkScoutOptions','pbsclosest','ClosestCity'); ToggleOption('BulkScoutOptions','pbskip','SkipErrors'); ToggleOption('BulkScoutOptions','pbattack','Attack',t.ShowHidePreset); t.ShowHidePreset(); ToggleOption('BulkScoutOptions','pbsallcities','AllCities'); ToggleOption('BulkScoutOptions','pbsoverrideap','OverrideAP'); ToggleOption('BulkScoutOptions','pbsquick','QuickScout'); ToggleOption('BulkScoutOptions','pbsclear','ClearOnRefresh'); ById('pbAddBulkScout').addEventListener('click', t.AddCoords, false); ById('pbsattackpreset').addEventListener('change', function() { Options.BulkScoutOptions.AttackPreset = ById('pbsattackpreset').value; saveOptions(); }, false); ById('pbsscouttype').addEventListener('change', function() { Options.BulkScoutOptions.ScoutType = ById('pbsscouttype').value; saveOptions(); }, false); ById('pbsrcScoutAmt').addEventListener('change', function(){ Options.BulkScoutOptions.NumScouts = parseIntNan(ById('pbsrcScoutAmt').value); if (Options.BulkScoutOptions.NumScouts==0) Options.BulkScoutOptions.NumScouts = 1; saveOptions(); }, false); ById('pbsknight').addEventListener('change', function(){ Options.BulkScoutOptions.KnightPriority = ById('pbsknight').value; saveOptions(); }, false); ById('pbschamp').addEventListener('change', function(){ Options.BulkScoutOptions.SendChamp = ById('pbschamp').value; saveOptions(); }, false); }, ShowHidePreset : function () { var t = Tabs.BulkScout; if (Options.BulkScoutOptions.Attack) { jQuery('#pbspresetspan').removeClass("divHide"); jQuery('#pbsknightcell').removeClass("divHide"); jQuery('#pbschampcell').removeClass("divHide"); } else { jQuery('#pbspresetspan').addClass("divHide"); jQuery('#pbsknightcell').addClass("divHide"); jQuery('#pbschampcell').addClass("divHide"); } }, e_toggleswitch: function(obj) { var t = Tabs.BulkScout; obj = ById('BulkScoutButton'); if (Options.BulkScoutOptions.On) { if (obj) obj.value = tx("AutoScout = OFF"); Options.BulkScoutOptions.On = false; } else { if (obj) obj.value = tx("AutoScout = ON"); Options.BulkScoutOptions.On = true; t.timer = setTimeout(function () { t.doAutoLoop(Options.BulkScoutOptions.ScoutCity);}, 0); } saveOptions(); SetToggleButtonState('Scout',Options.BulkScoutOptions.On,'Scout'); }, PaintList : function (msg) { var t = Tabs.BulkScout; var z = ''; var r = 0; var logshow = false; var sel = 0; var z = '
    '; z += ''; for(i = 0; i < Options.BulkScoutOptions.CoordList.length; i++){ logshow = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; if (Options.BulkScoutOptions.CoordList[i].chk) sel++; } if (!logshow) { z += ''; } z += '
     
    '+tx('Co-ords')+''+tx('Details')+''+strButton14(tx('Export'),'id=btExportScoutList')+' '+strButton14(tx('Clear List'),'id=btClearScoutList')+'
    '+coordLink(Options.BulkScoutOptions.CoordList[i].x,Options.BulkScoutOptions.CoordList[i].y)+''+(Options.BulkScoutOptions.CoordList[i].Details?Options.BulkScoutOptions.CoordList[i].Details:'')+''+tx('Remove')+'


    '+tx('No list entries')+'
    '; ById('btScoutList').innerHTML = z; ById('pbbulkscoutmsg').innerHTML = msg; ById('pbscoutinfo').innerHTML = '('+sel+'/'+Options.BulkScoutOptions.CoordList.length+')'; ById('btClearScoutList').addEventListener ('click', function() {t.ClearList();}, false); ById('btExportScoutList').addEventListener ('click', function() {t.ExportList();}, false); ById('pbscout_All').addEventListener('change', function(){ var sel = 0; for(k in document.getElementsByName('pbscoutchk')) document.getElementsByName('pbscoutchk')[k].checked = ById('pbscout_All').checked; for (var b in Options.BulkScoutOptions.CoordList) { Options.BulkScoutOptions.CoordList[b].chk = ById('pbscout_All').checked; if (Options.BulkScoutOptions.CoordList[b].chk) sel++; } saveOptions(); ById('pbscoutinfo').innerHTML = '('+sel+'/'+Options.BulkScoutOptions.CoordList.length+')'; }, false); }, ClearList : function () { var t = Tabs.BulkScout; Options.BulkScoutOptions.CoordList = []; saveOptions(); t.PaintList(tx('Scout List Cleared')); }, ExportList : function () { var t = Tabs.BulkScout; var CoordList = []; for(i = 0; i < Options.BulkScoutOptions.CoordList.length; i++){ CoordList.push('('+Options.BulkScoutOptions.CoordList[i].x+','+Options.BulkScoutOptions.CoordList[i].y+')'); } if (CoordList.length>0) { window.prompt(tx("Copy to clipboard: Ctrl+C"), CoordList.join(" ")); } }, RemoveEntry : function (c) { var t = Tabs.BulkScout; var Coord = []; Coord = c.split("_"); for (var b in Options.BulkScoutOptions.CoordList) { if (Options.BulkScoutOptions.CoordList[b].x==Coord[0] && Options.BulkScoutOptions.CoordList[b].y==Coord[1]) { Options.BulkScoutOptions.CoordList.splice(b,1); break; } } saveOptions(); t.PaintList('Entry deleted'); }, ToggleEntry : function (c) { var t = Tabs.BulkScout; var Coord = []; Coord = c.split("_"); var sel = 0; for (var b in Options.BulkScoutOptions.CoordList) { if (Options.BulkScoutOptions.CoordList[b].x==Coord[0] && Options.BulkScoutOptions.CoordList[b].y==Coord[1]) { Options.BulkScoutOptions.CoordList[b].chk = !Options.BulkScoutOptions.CoordList[b].chk; saveOptions(); } if (Options.BulkScoutOptions.CoordList[b].chk) sel++; } ById('pbscoutinfo').innerHTML = '('+sel+'/'+Options.BulkScoutOptions.CoordList.length+')'; }, UnselectEntry : function (x,y) { var t = Tabs.BulkScout; for (var b in Options.BulkScoutOptions.CoordList) { if (Options.BulkScoutOptions.CoordList[b].x==x && Options.BulkScoutOptions.CoordList[b].y==y) { Options.BulkScoutOptions.CoordList[b].chk = false; saveOptions(); } } if (ById('pbscoutchk_'+x+'_'+y)) { ById('pbscoutchk_'+x+'_'+y).checked = false; } }, AddCoords : function () { var t = Tabs.BulkScout; var NewCoords = ById('pbbulkscoutcoords').value; NewCoords = replaceAll(NewCoords,"(", " "); NewCoords = replaceAll(NewCoords,")", " "); NewCoords = replaceAll(NewCoords,"[", " "); NewCoords = replaceAll(NewCoords,"]", " "); NewCoords = replaceAll(NewCoords,"_", ","); NewCoords = replaceAll(NewCoords,".", ","); var NewCoordList = []; var CleanedCoordList = []; var Coord = []; var ListEntry = new Object(); var msg = ''; if (NewCoords.trim() != "") { NewCoordList = NewCoords.split(" "); } CoordError = false; CoordsAdded = false; for (var a=0;a'; } else { for (var a=0;a= Number(Cities.numCities)) idx = 0; cityId = Cities.cities[idx].id; } while (!t.CheckCitySuitable(cityId) && (idx != oldidx)) return idx; }, CheckCitySuitable : function (cityId,reason) { var t = Tabs.BulkScout; var troopsok = true; var CheckArray = []; if (Options.BulkScoutOptions.Attack && Options.BulkScoutOptions.AttackPreset!=0){ for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; if (Options.QuickMarchOptions.MarchPresets[Options.BulkScoutOptions.AttackPreset][i]) { CheckArray[i] = parseIntNan(Options.QuickMarchOptions.MarchPresets[Options.BulkScoutOptions.AttackPreset][i]); } } } else { CheckArray[Options.BulkScoutOptions.ScoutType] = Options.BulkScoutOptions.NumScouts; } for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; if (CheckArray[i] && CheckArray[i] > parseIntNan(Seed.units['city' + cityId]['unt'+i])) { troopsok = false; break; } } var knightok = true; if (Options.BulkScoutOptions.Attack) { var knt = getAvailableKnights(cityId); if (!knt[0]) { knightok = false; } } var marches = parseIntNan(March.getMarchSlots(cityId)); var maxmarches = parseIntNan(March.getTotalSlots(cityId)); var keepfree = Number(Options.BulkScoutOptions.FreeRallySlots); // use highest of bulk scout keep rally free or general keep rally free if (keepfree < Number(Options.FreeRallySlots)) { keepfree = Number(Options.FreeRallySlots); } var rallyok = ((marches+keepfree) < maxmarches); var towerok = (!Options.TowerOptions || !Options.TowerOptions.SaveCityState[cityId] || Options.TowerOptions.SaveCityState[cityId].AllowMarches); var ascensionok = (!CM.PrestigeCityPlayerProtectionController.isActive(cityId) || Options.BulkScoutOptions.OverrideAP); var champok = true; if (Options.BulkScoutOptions.Attack && parseIntNan(Options.BulkScoutOptions.SendChamp)==1) { citychamp = getCityChampion(cityId); champok = (citychamp.championId && citychamp.status!="10"); } if (reason) { t.cityreason = tx('Waiting for rally point to clear!'); if (rallyok) { if (!knightok) t.cityreason = tx('Waiting for an available knight!'); else if (!champok) t.cityreason = tx('No Champion available!'); else if (!troopsok) t.cityreason = tx('Waiting for available troops!'); else if (!towerok) t.cityreason = tx('Source city is under attack - waiting for all clear!'); else if (!ascensionok) t.cityreason = tx('Source city is under ascension protection - cannot march from here!'); } } return (troopsok && knightok && rallyok && towerok && ascensionok && champok); }, UpdateDetails : function(x,y,msg,perm) { var t = Tabs.BulkScout; var el = 'pbscoutdetails_'+x+'_'+y; var elem = ById(el); if (elem) { elem.innerHTML = msg; } if (perm) { for (var b in Options.BulkScoutOptions.CoordList) { if (Options.BulkScoutOptions.CoordList[b].x==x && Options.BulkScoutOptions.CoordList[b].y==y) { Options.BulkScoutOptions.CoordList[b].Details = msg; saveOptions(); } } } }, sendScout : function(x, y, cid, notify){ var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cid; params.kid = 0; params.type = 3; params.xcoord = x; params.ycoord = y; if (Options.BulkScoutOptions.Attack){ var knt = getAvailableKnights(cid); if (knt[0]) { if (Options.BulkScoutOptions.KnightPriority==1) { // lowest combat skill knt = knt.sort(function sort(a,b) {a = a['Combat'];b = b['Combat'];return a == b ? 0 : (a < b ? -1 : 1);}); }; if (Options.BulkScoutOptions.KnightPriority==2) { // highest experience knt = knt.sort(function sort(a,b) {a = a['Experience'];b = b['Experience'];return a == b ? 0 : (a > b ? -1 : 1);}); }; if (Options.BulkScoutOptions.KnightPriority==3) { // lowest experience knt = knt.sort(function sort(a,b) {a = a['Experience'];b = b['Experience'];return a == b ? 0 : (a < b ? -1 : 1);}); }; if (Options.BulkScoutOptions.KnightPriority!=4) { // no knight - megaliths! params.kid=knt[0].ID; // will fail if no knights } } params.type = 4; } if (Options.BulkScoutOptions.Attack && Options.BulkScoutOptions.AttackPreset!=0){ for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; params["u"+i] = 0; if (Options.QuickMarchOptions.MarchPresets[Options.BulkScoutOptions.AttackPreset][i]) { params["u"+i] = parseIntNan(Options.QuickMarchOptions.MarchPresets[Options.BulkScoutOptions.AttackPreset][i]); } } var iused = new Array(); for (var i = 0; i < QuickMarch.ItemList.length; i++) { if (Options.QuickMarchOptions.MarchPresets[Options.BulkScoutOptions.AttackPreset]["item"+QuickMarch.ItemList[i]] == true && Seed.items["i"+QuickMarch.ItemList[i]]) { iused.push(QuickMarch.ItemList[i]); } } params.items = iused.join(","); } else { params["u"+Options.BulkScoutOptions.ScoutType] = Options.BulkScoutOptions.NumScouts; } params.gold = 0; params.r1 = 0; params.r2 = 0; params.r3 = 0; params.r4 = 0; params.r5 = 0; params.champid = 0; if (Options.BulkScoutOptions.Attack && parseIntNan(Options.BulkScoutOptions.SendChamp)!=0) { citychamp = getCityChampion(cid); if (citychamp.championId && citychamp.status!="10") { params.champid = citychamp.championId; } } March.addMarch(params, function(rslt){ var t = Tabs.BulkScout; if (rslt.ok) { var extrainfo = ''; if (cid!=Cities.cities[Options.BulkScoutOptions.ScoutCity].id || Options.BulkScoutOptions.ClosestCity) { extrainfo += ' from '+Cities.byID[cid].name; } if (Options.BulkScoutOptions.Attack) { t.UpdateDetails(x,y,tx('Attack sent')+extrainfo+'!',true); } else { t.UpdateDetails(x,y,tx('Scout sent')+extrainfo+'!',true); } t.UnselectEntry(x,y); if (Options.BulkScoutOptions.QuickScout) { ChatStuff.fetchmarch(rslt.marchId,t.QuickScoutResults); } } else { var msg = tx('March failed to send!'); if (rslt.msg) msg = rslt.msg; if (rslt.error_code == 208 || rslt.error_code == 207 || rslt.error_code == 104) { // will never be able to send t.UpdateDetails(x,y,msg); t.UnselectEntry(x,y); // update search tab if coords exist and it's misted and target it truced.. if(rslt.error_code == 208) { if (Tabs.Search && Tabs.Search.mapDat) { var numRows = Tabs.Search.mapDat.length; for (var i=0; i'; Tabs.Search.scouted++; Tabs.Search.updateMistProgress(); } break; } } } } } else { if (Options.BulkScoutOptions.SkipErrors) { t.UpdateDetails(x,y,msg,true); t.UnselectEntry(x,y); } else { t.UpdateDetails(x,y,msg+' '+tx('Retrying')+'...',true); } } } if (notify) {notify();} }); }, QuickScoutResults : function (rslt,rslt2,march) { var t = Tabs.BulkScout; var a = march; var totile = tileTypes[parseInt(a["toTileType"])]; if (a["toTileType"] == 51) { if (!a["toPlayerId"]) { totile = "???"; } else { if (a["toPlayerId"] == 0) totile = 'Barb Camp'; } } totile = 'Lvl '+a["toTileLevel"]+' '+totile; if (rslt2 && rslt2.userInfo) { u2 = rslt2.userInfo[0]; var alli2 = 'None'; if (u2.allianceName) alli2 = u2.allianceName + FormatDiplomacy(u2.allianceId); t.UpdateDetails(march.toXCoord,march.toYCoord,totile+' - '+uW.g_js_strings.commonstr.nametx+': '+PlayerLink(a.toPlayerId,u2.genderAndName)+', '+uW.g_js_strings.commonstr.alliance+': '+alli2,true); } else { t.UpdateDetails(march.toXCoord,march.toYCoord,totile,true); } // update misted search if it exists if (Tabs.Search && Tabs.Search.mapDat) { var numRows = Tabs.Search.mapDat.length; for (var i=0; i'; m += '
    '; m += '
     '+tx("Add toggle button")+' 
    '; m += '
     

    '; m += '
    '+uW.g_js_strings.commonstr.city+': 
    '; m += '
     '+tx('SET DEFENCES')+'
    '; m += '
    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     
    '+tx('Defence Type')+': '; m += '
     ( )
    '+tx('Number to build')+': Max ('+uW.g_js_strings.commonstr.max; m += ': 0)
    '+tx('Number of slots to use')+': Max ('+uW.g_js_strings.commonstr.max; m += ': 0)
    '+tx('Speedup')+': 
     
    '; m += '
    '; m += ''; m += '
    '+uW.g_js_strings.commonstr.requirements+':-
     
    '; m += '
     
    '; m += '
     '+tx('AUTO BUILD')+'
    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx('Traps')+''+tx('Caltrops')+''+tx('Spikes')+''+tx('Crossbows')+''+tx('Trebuchet')+''+tx('Greek Fire')+'
    ('+tx('Will queue')+'  '+tx('units at a time until all available wall/field space used')+')'+tx('Copy settings to all cities')+'  
    '; m += '
     '+tx('DEFENCE QUEUE')+' 
    '; m += '

    '; div.innerHTML = m; t.ModelCity = new CdispCityPicker('ptdef', ById('ptdefcity'), true, t.clickCitySelect, null); ById('btAutoFortState').addEventListener('click', function(){ t.toggleAutoFortState(this); }, false); ToggleOption('FortOptions','btFortToggle','Toggle'); ById('btDefAutoCopy').addEventListener('click', function(e){ var citynum = Cities.byID[t.ModelCityId].idx+1; t.CopyAutoFortSettings(citynum); saveOptions(); ById('btDefMessages').innerHTML = 'Auto-fortify settings copied to all cities'; }, false); ById('btDefOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Defence",100,GlobalOptions.btWinSize.x,"btDefOption",false)}, false); ById('btDefAutoLink').addEventListener ('click', function () {ToggleMainDivDisplay("Defence",100,GlobalOptions.btWinSize.x,"btDefAuto",false)}, false); ById('btDefQueueLink').addEventListener ('click', function () {ToggleMainDivDisplay("Defence",100,GlobalOptions.btWinSize.x,"btDefQueue",false)}, false); ById('btDefType').addEventListener('change', t.PaintCityInfo, false); ById('btDefMaxPerSlotButton').addEventListener('click', function () { var slots = Math.max(parseIntNan(ById('btDefNumSlots').value),0); ById('btDefNumPerSlot').value = parseIntNan(t.MaxDefTrain / slots); t.paintRequirements(ById('btDefType').value); } ,false); ById('btDefNumPerSlot').addEventListener('change', function () { t.paintRequirements(ById('btDefType').value); }, false); ById('btDefNumSlots').addEventListener('change', function () { var slots = Math.max(parseIntNan(ById('btDefNumSlots').value),0); if (slots < 1) { slots = 1; } if (slots > t.wall.wallLevel-t.wall.Queued) { slots = t.wall.wallLevel-t.wall.Queued; } ById('btDefNumSlots').value = slots; ById('btDefMaxPerSlot').innerHTML = parseIntNan(t.MaxDefTrain / slots); } ,false); ById('btDefMaxSlotsButton').addEventListener('click', function () { ById('btDefNumSlots').value = Math.max(t.wall.wallLevel-t.wall.Queued,0); var slots = Math.max(parseIntNan(ById('btDefNumSlots').value),0); ById('btDefMaxPerSlot').innerHTML = parseIntNan(t.MaxDefTrain / slots); } ,false); ChangeIntegerOption('FortOptions','btDefPacket','packetAmount',50); ById('btDefButton').addEventListener ('click', t.setDefences, false); ById('chkDoTraps').addEventListener('change', t.clickCheckDoTraps, false); ById('chkDoCaltrops').addEventListener('change', t.clickCheckDoCaltrops, false); ById('chkDoSpikes').addEventListener('change', t.clickCheckDoSpikes, false); ById('chkDoXbows').addEventListener('change', t.clickCheckDoXbows, false); ById('chkDoTrebs').addEventListener('change', t.clickCheckDoTrebs, false); ById('chkDoGreek').addEventListener('change', t.clickCheckDoGreek, false); // start autotrain loop timer to start in 30 seconds... if (Options.FortOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(1,0);}, (30 * 1000)); } }, toggleAutoFortState: function(obj){ var t = Tabs.Fort; obj = ById('btAutoFortState'); if (Options.FortOptions.Running == true) { Options.FortOptions.Running = false; obj.value = tx("AutoBuild = OFF"); } else { Options.FortOptions.Running = true; obj.value = tx("AutoBuild = ON"); t.timer = setTimeout(function () { t.doAutoLoop(1,0);}, 0); } saveOptions(); SetToggleButtonState('Fortify',Options.FortOptions.Running,'Fortify'); t.PaintOverview(); }, show: function (init) { var t = Tabs.Fort; var DispCityId = uW.currentcityid; if (init) { DispCityId = InitialCityId; } if (t.ModelCityId!=DispCityId) { t.ModelCity.selectBut(Cities.byID[DispCityId].idx); } t.PaintOverview(); t.UpdateDefenceOptions(); t.PaintCityInfo(); }, EverySecond : function () { var t = Tabs.Fort; if (tabManager.currentTab.name == 'Fort' && Options.btWinIsOpen){ t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh queue display every 2 seconds t.PaintCityInfo(); } if (t.LoopCounter >= 6) { // refresh overview display every 6 seconds t.LoopCounter = 0; t.PaintOverview(); } } }, clickCitySelect: function (city) { var t = Tabs.Fort; t.ModelCityId = city.id; t.LastQueue = 'x'; t.UpdateDefenceOptions(); t.PaintCityInfo(); }, CopyAutoFortSettings : function (citynum) { var t = Tabs.Fort; for (var i = 1; i <= Cities.numCities; i++) { if (i!=citynum) { Options.FortOptions.doTraps[i] = Options.FortOptions.doTraps[citynum]; Options.FortOptions.doCaltrops[i] = Options.FortOptions.doCaltrops[citynum]; Options.FortOptions.doSpikes[i] = Options.FortOptions.doSpikes[citynum]; Options.FortOptions.doXbows[i] = Options.FortOptions.doXbows[citynum]; Options.FortOptions.doTrebs[i] = Options.FortOptions.doTrebs[citynum]; Options.FortOptions.doGreek[i] = Options.FortOptions.doGreek[citynum]; } } }, setDefences: function () { var t = Tabs.Fort; if (t.isBusy) { t.isBusy = false; ById('btDefMessages').innerHTML = ''+tx('Cancelled')+'!'; ById('btDefButton').value = uW.g_js_strings.modal_openWalls.builddefenses; return; } var cityId = t.ModelCityId; var unitId = ById('btDefType').value; var perSlot = parseIntNan(ById('btDefNumPerSlot').value); var numSlots = parseIntNan(ById('btDefNumSlots').value); var siege = ById('btDefBoost').value; if (perSlot < 1) { return; } if (numSlots < 1) { return; } if (perSlot * numSlots > t.MaxDefTrain) { ById('btDefMessages').innerHTML = ''+uW.g_js_strings.modal_attack.maxtroops+': '+t.MaxDefTrain + ''; return; } if (numSlots > t.wall.wallLevel-t.wall.Queued) { ById('btDefMessages').innerHTML = ''+tx('Maximum number of slots exceeded')+'!'; return; } var que = []; for (var i = 0; i < numSlots; i++) { que.push(['T', unitId, perSlot, siege]); } t.QueLength = que.length; t.isBusy = true; ById('btDefButton').value = uW.g_js_strings.commonstr.cancel; t.nextqueue(que); }, nextqueue : function (que){ var t = Tabs.Fort; if(!t.isBusy) { return; } var cmd = que.shift(); if (cmd[0] == 'T') { if (t.QueLength == 1) { ById('btDefMessages').innerHTML = 'Building '+cmd[2]+' '+uW.fortcost['frt'+cmd[1]][0]+' at '+Cities.byID[t.ModelCityId].name; } else { ById('btDefMessages').innerHTML = 'Building '+cmd[2]+' '+uW.fortcost['frt'+cmd[1]][0]+' at '+Cities.byID[t.ModelCityId].name + ' (Slot '+parseIntNan(t.QueLength-que.length)+' of '+t.QueLength+')'; } t.Fortify (t.ModelCityId, cmd[3], cmd[1], cmd[2], function (rslt) { if (rslt.ok) { if (parseIntNan(que.length)==0) { ById('btDefMessages').innerHTML = 'Completed!'; ById('btDefButton').value = uW.g_js_strings.modal_openWalls.builddefenses; t.isBusy = false; return; } setTimeout(function () { t.nextqueue(que) }, 2000); } else { if (rslt.msg) { ById('btDefMessages').innerHTML = ''+rslt.msg+''; } else { ById('btDefMessages').innerHTML = 'Error setting defences ('+rslt.error_code+')'; } ById('btDefButton').value = uW.g_js_strings.modal_openWalls.builddefenses; t.isBusy = false; return; } }); } }, clickCheckDoTraps: function () { var t = Tabs.Fort; var cityNo = Cities.byID[t.ModelCityId].idx + 1; Options.FortOptions.doTraps[cityNo] = (ById('chkDoTraps').checked); saveOptions(); if (Options.FortOptions.doTraps[cityNo]) { t.doAutoLoop(cityNo,0); } }, clickCheckDoCaltrops: function () { var t = Tabs.Fort; var cityNo = Cities.byID[t.ModelCityId].idx + 1; Options.FortOptions.doCaltrops[cityNo] = (ById('chkDoCaltrops').checked); saveOptions(); if (Options.FortOptions.doCaltrops[cityNo]) { t.doAutoLoop(cityNo,1); } }, clickCheckDoSpikes: function () { var t = Tabs.Fort; var cityNo = Cities.byID[t.ModelCityId].idx + 1; Options.FortOptions.doSpikes[cityNo] = (ById('chkDoSpikes').checked); saveOptions(); if (Options.FortOptions.doSpikes[cityNo]) { t.doAutoLoop(cityNo,2); } }, clickCheckDoXbows: function () { var t = Tabs.Fort; var cityNo = Cities.byID[t.ModelCityId].idx + 1; Options.FortOptions.doXbows[cityNo] = (ById('chkDoXbows').checked); saveOptions(); if (Options.FortOptions.doXbows[cityNo]) { t.doAutoLoop(cityNo,3); } }, clickCheckDoTrebs: function () { var t = Tabs.Fort; var cityNo = Cities.byID[t.ModelCityId].idx + 1; Options.FortOptions.doTrebs[cityNo] = (ById('chkDoTrebs').checked); saveOptions(); if (Options.FortOptions.doTrebs[cityNo]) { t.doAutoLoop(cityNo,4); } }, clickCheckDoGreek: function () { var t = Tabs.Fort; var cityNo = Cities.byID[t.ModelCityId].idx + 1; Options.FortOptions.doGreek[cityNo] = (ById('chkDoGreek').checked); saveOptions(); if (Options.FortOptions.doGreek[cityNo]) { t.doAutoLoop(cityNo,5); } }, doAutoLoop : function (idx,typ) { var t = Tabs.Fort; clearTimeout(t.timer); if (!Options.FortOptions.Running) return; var cityId = Cities.cities[idx - 1].id; t.autodelay = 0; var ascensionok = (!Options.BuildOptions || !Options.BuildOptions.AscensionReady[idx]); if (t.typearray[idx][typ]==0) { if (Options.FortOptions.doTraps[idx] && t.CheckCanBuild(60,cityId) && ascensionok) { t.doAutoDefence(60,cityId,typ); } } if (t.typearray[idx][typ]==1) { if (Options.FortOptions.doCaltrops[idx] && t.CheckCanBuild(61,cityId) && ascensionok) { t.doAutoDefence(61,cityId,typ); } } if (t.typearray[idx][typ]==2) { if (Options.FortOptions.doSpikes[idx] && t.CheckCanBuild(62,cityId) && ascensionok) { t.doAutoDefence(62,cityId,typ); } } if (t.typearray[idx][typ]==3) { if (Options.FortOptions.doXbows[idx] && t.CheckCanBuild(53,cityId) && ascensionok) { t.doAutoDefence(53,cityId,typ); } } if (t.typearray[idx][typ]==4) { if (Options.FortOptions.doTrebs[idx] && t.CheckCanBuild(55,cityId) && ascensionok) { t.doAutoDefence(55,cityId,typ); } } if (t.typearray[idx][typ]==5) { if (Options.FortOptions.doGreek[idx] && t.CheckCanBuild(63,cityId) && ascensionok) { t.doAutoDefence(63,cityId,typ); } } if (typ<5) { t.timer = setTimeout(function () { t.doAutoLoop(idx,typ+1); }, (t.autodelay * 1000)); } else { // if training happened in this city during this loop, change type order of this city for next time so every type gets a fair go.. if (t.LastAuto != -1) { for (var v=0; v<=6; v++) { t.LastAuto++; if (t.LastAuto > 5) { t.LastAuto = 0; } t.typearray[idx][v] = t.LastAuto; } t.LastAuto = -1; } if (idx == Cities.numCities) { t.timer = setTimeout(function () { t.doAutoLoop(1,0); }, (t.intervalSecs * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1,0); }, (t.autodelay * 1000)); } } }, doAutoDefence: function (defType,cityId,typ) { var t = Tabs.Fort; var numberToTrain = t.getMaxDefence(defType,cityId,true); if (numberToTrain > 0) { if (numberToTrain > Options.FortOptions.packetAmount) { numberToTrain = Options.FortOptions.packetAmount; } t.Fortify(cityId, 0, defType, numberToTrain); t.autodelay = t.typeDelay; t.LastAuto = typ; } }, getMaxDefence: function (defType,cityId,auto) { var t = Tabs.Fort; var numberToTrain = 0; t.limitingFactor = null; var wall = {}; getWallInfo(cityId, wall); if (defType<60 || defType==63) { var availableSpace = wall.wallSpace - wall.wallSpaceUsed - wall.wallSpaceQueued; } else { var availableSpace = wall.fieldSpace - wall.fieldSpaceUsed - wall.fieldSpaceQueued; } var MaxSlots = wall.wallLevel; if (auto && MaxSlots > 5) MaxSlots = 5; // only allow auto build to occupy 5 slots if (availableSpace > 0 && wall.slotsBusy < MaxSlots) { var availableSlots = MaxSlots - wall.slotsBusy; var unitSpace = parseInt(uW.fortstats["unt" + defType][5]); var food = parseIntNan(Seed.resources['city' + cityId].rec1[0] / 3600); var wood = parseIntNan(Seed.resources['city' + cityId].rec2[0] / 3600); var stone = parseIntNan(Seed.resources['city' + cityId].rec3[0] / 3600); var ore = parseIntNan(Seed.resources['city' + cityId].rec4[0] / 3600); // change these numbers for auto if in the future you want KEEP resource values in city. var foodRes = 0; var woodRes = 0; var stoneRes = 0; var oreRes = 0; var availFood = food - foodRes; var availWood = wood - woodRes; var availStone = stone - stoneRes; var availOre = ore - oreRes; var unitFood = parseInt(uW.fortcost['frt'+defType][1]); var unitWood = parseInt(uW.fortcost['frt'+defType][2]); var unitStone = parseInt(uW.fortcost['frt'+defType][3]); var unitOre = parseInt(uW.fortcost['frt'+defType][4]); if (defType == 63) var unitMedian = uW.fortcost['frt'+defType][11]["34002"]; var median = parseIntNan(Seed.items.i34002); // greek fire requires median oil numberToTrain = 9999999999; if ((availFood / unitFood) < numberToTrain) { t.limitingFactor = uW.resourceinfo['rec1']; numberToTrain = parseInt(availFood / unitFood); } if ((availWood / unitWood) < numberToTrain) { t.limitingFactor = uW.resourceinfo['rec2']; numberToTrain = parseInt(availWood / unitWood); } if ((availStone / unitStone) < numberToTrain) { t.limitingFactor = uW.resourceinfo['rec3']; numberToTrain = parseInt(availStone / unitStone); } if ((availOre / unitOre) < numberToTrain) { t.limitingFactor = uW.resourceinfo['rec4']; numberToTrain = parseInt(availOre / unitOre); } if (defType == 63) { if ((median / unitMedian) < numberToTrain) { t.limitingFactor = 'median'; numberToTrain = parseInt(median / unitMedian); } } if (availableSpace >= unitSpace && availableSlots > 0) { if (availFood > unitFood && availWood > unitWood & availStone > unitStone & availOre > unitOre) { if ((availableSpace / unitSpace) < numberToTrain) { numberToTrain = parseInt(availableSpace / unitSpace); } } else { numberToTrain = 0; } } else { numberToTrain = 0; } } return numberToTrain; }, CheckCanBuild : function (defType,cityId) { var t = Tabs.Fort; var Result = true; var Buildings = getCityBuildings(cityId); var fc = uW.fortcost['frt'+defType]; if (matTypeof(fc[8]) == 'object'){ for (var k in fc[8]){ var b = Buildings[k.substr(1)]; if (b.maxLevel < fc[8][k][1]){ Result = false; break; } } } if (matTypeof(fc[9]) == 'object'){ for (var k in fc[9]){ if (parseInt(Seed.tech['tch'+k.substr(1)]) < fc[9][k][1]){ Result = false; break; } } } return Result; }, PaintOverview : function () { var t = Tabs.Fort; var rownum = 0; var irows = []; var rows = []; function _row(name, row, noTotal, icon) { var t = Tabs.Fort; if (rownum++ % 2) { style = ' class="evenRow"'; } else { style = ' class="oddRow"'; } var tot = 0; var m = []; m.push(''); if (icon) { m.push(icon); } else { m.push(''+name+' '); } m.push(''); if (!noTotal) { for (var i = 0; i < row.length; i++) tot += row[i]; m.push('
    '); t.DefTotal[name] = tot; m.push(addCommas(tot)); m.push('
    '); } for (var i = 0; i < row.length; i++) { m.push('
    '); m.push(addCommas(row[i])); m.push('
    '); } m.push(''); return m.join(''); } var m = ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ""; // spacer irows = []; irows[0] = []; // wall level irows[1] = []; // Defensive Tower Level irows[2] = []; // Wall Space irows[3] = []; // Field Space irows[4] = []; // Defence Queue irows[5] = []; // Redoubt Tower Level for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; var wall = {}; getWallInfo(cityId,wall); irows[0][i] = uW.g_js_strings.commonstr.level+' '+wall.wallLevel; if (wall.wallLevel==0) { irows[0][i] = ''+tx('None')+'!'; } var tower = Seed.buildings['city'+cityId].pos99; if (tower) tower = parseInt(Seed.buildings['city'+cityId].pos99[1]) if (!tower) irows[1][i] = ''+tx('None')+'!'; else irows[1][i] = uW.g_js_strings.commonstr.level+' '+tower; var tower = Seed.buildings['city'+cityId].pos98; if (tower) tower = parseInt(Seed.buildings['city'+cityId].pos98[1]) if (!tower) irows[5][i] = ''+tx('None')+'!'; else irows[5][i] = uW.g_js_strings.commonstr.level+' '+tower; irows[2][i] = wall.wallSpaceUsed+' / '+wall.wallSpace; if (wall.wallSpaceUsed < wall.wallSpace) { irows[2][i] = ''+irows[2][i]+''; } irows[3][i] = wall.fieldSpaceUsed+' / '+wall.fieldSpace; if (wall.fieldSpaceUsed < wall.fieldSpace) { irows[3][i] = ''+irows[3][i]+''; } var totTime = 0; var now = unixTime(); var q = Seed.queue_fort['city'+cityId]; if (q != null && q.length > 0) totTime = q[q.length - 1][3] - now; if (totTime < 0) totTime = 0; if (totTime < 1 && (wall.wallSpaceUsed < wall.wallSpace - 4 || wall.fieldSpaceUsed < wall.fieldSpace - 4)) irows[4][i] = '' + timestr(totTime) + ''; else irows[4][i] = timestr(totTime); } m += _row(tx('Wall Space'), irows[2], true); rows = []; var r = 0; for (var a in uW.fortcost) { var f = parseInt(a.split("frt")[1]); if (f<60 || f==63) { rows[r] = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; rows[r][i] = parseIntNan(Seed.fortifications["city" + cityId]["fort"+f]); } m += _row(uW.fortcost[a],rows[r],false,TroopImage(f)); r++; } } m += _row(tx('Field Space'), irows[3], true); for (var a in uW.fortcost) { var f = parseInt(a.split("frt")[1]); if (f>=60 && f!=63) { rows[r] = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; rows[r][i] = parseIntNan(Seed.fortifications["city" + cityId]["fort"+f]); } m += _row(uW.fortcost[a],rows[r],false,TroopImage(f)); r++; } } m += ''; m += _row(tx('Walls'), irows[0], true); m += _row(tx('Def. Tower'), irows[1], true); m += _row(tx('Redoubt Tower'), irows[5], true); m += _row(tx('Defence Queue'), irows[4], true); m += '
      '+Cities.cities[i-1].name.substring(0, 12)+' 
     
    '; ById('btDefOverviewDiv').innerHTML = m; }, fixQueTimes: function (q) { // fix KofC bugs .... // if first start time > now, make it now // if any end time != next start time then fix it var now = unixTime(); if (q[0][2] > now) { q[0][2] = now; } for (var i = 0; i < q.length; i++) { if (q[i + 1] != null && q[i + 1][2] != q[i][3]) { q[i][3] = q[i + 1][2]; } } }, expireTheQueue: function (q) { if (q == null) return; var now = unixTime(); while (q.length > 0 && (q[0][3] - now) < 1) q.shift(); }, UpdateDefenceOptions : function () { var t = Tabs.Fort; ById('chkDoTraps').checked = Options.FortOptions.doTraps[Cities.byID[t.ModelCityId].idx + 1]; ById('chkDoCaltrops').checked = Options.FortOptions.doCaltrops[Cities.byID[t.ModelCityId].idx + 1]; ById('chkDoSpikes').checked = Options.FortOptions.doSpikes[Cities.byID[t.ModelCityId].idx + 1]; ById('chkDoXbows').checked = Options.FortOptions.doXbows[Cities.byID[t.ModelCityId].idx + 1]; ById('chkDoTrebs').checked = Options.FortOptions.doTrebs[Cities.byID[t.ModelCityId].idx + 1]; ById('chkDoGreek').checked = Options.FortOptions.doGreek[Cities.byID[t.ModelCityId].idx + 1]; }, PaintCityInfo : function () { var t = Tabs.Fort; var cityId = t.ModelCityId; if (cityId==0) { return; } if (t.serverwait) { return; } // paint the Queue... var now = unixTime(); t.wall = {}; getWallInfo(cityId, t.wall); t.wall.Queued = 0; var totTime = 0; var q = Seed.queue_fort['city' + cityId]; t.expireTheQueue(q); var qs = q.toString(); if (q != null && q.length > 0) { totTime = q[q.length - 1][3] - now; t.wall.Queued = q.length; } if (qs == t.LastQueue) { // queue hasn't changed, just update the time of the current item if (q != null && q.length > 0) { var cur = q[0][3] - now; ById('btDefQueueRemaining').innerHTML = timestr(cur, true); } else { m = '
    '+tx('No Defence Units Under Construction')+'
    '; ById('btDefQueue').innerHTML = m; } } else { t.LastQueue = qs; if (q != null && q.length > 0) { m = ''; t.fixQueTimes(q); first = true; var lastEnd = now; var r = 0; for (var i = 0; i < q.length; i++) { start = q[i][2]; end = q[i][3]; actual = end - lastEnd; if (actual < 0) { actual = 0; } rowClass = 'evenRow'; if (r % 2 == 1) rowClass = 'oddRow'; if (first) rowClass += ' highRow'; m += ''; } else { m += timestr(actual, true) + ''; } m += '' lastEnd = end; first = false; r++; } m += '
    '+uW.g_js_strings.commonstr.type+''+uW.g_js_strings.commonstr.amount+''+tx('Total Time')+''+tx('Remaining')+''+tx('Cancel All')+'
    '+TroopImage(q[i][0])+uW.fortcost["frt"+q[i][0]][0]+''+addCommas(q[i][1])+''; if (first) { m += timestr(end - start, true) + '' + timestr(actual, true) + ' '+uW.g_js_strings.commonstr.cancel+'
     
    '; } else { m = '
    '+tx('No Defence Units Under Construction')+'
    '; } ById('btDefQueue').innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } m = t.wall.Queued+' '+uW.g_js_strings.commonstr.of+' '+t.wall.wallLevel; if (totTime > 0) m += ', ' + uW.timestr(totTime); ById('btDefQueueStats').innerHTML = m; // paint info into the city panel... var unitId = ById('btDefType').value; var defOwned = parseInt(Seed.fortifications['city' + cityId]['fort' + unitId]); t.MaxDefTrain = 0; if (t.CheckCanBuild(unitId,cityId)) { t.MaxDefTrain = t.getMaxDefence(unitId,cityId); } ById('btDefMax').innerHTML = uW.g_js_strings.commonstr.max + ': ' + t.MaxDefTrain + ', ' + uW.g_js_strings.commonstr.owned + ': ' + defOwned; ById('btDefMaxSlots').innerHTML = t.wall.wallLevel-t.wall.Queued; var slots = Math.max(parseIntNan(ById('btDefNumSlots').value),0); ById('btDefMaxPerSlot').innerHTML = parseIntNan(t.MaxDefTrain / slots); // paint the requirements... t.paintRequirements(unitId); }, paintRequirements : function (unitId) { var t = Tabs.Fort; var cityId = t.ModelCityId; var Buildings = getCityBuildings(cityId); var m = ''; if (uW.fortcost['frt'+unitId][8] && matTypeof(uW.fortcost['frt'+unitId][8]) === "object") { for (var b in uW.fortcost['frt'+unitId][8]) { var bid = b.split("b")[1]; var reqlevel = uW.fortcost['frt'+unitId][8][b][1]; var blvl = Buildings[bid].maxLevel; var linestyle = ''; if (blvl < reqlevel) { linestyle = ''; m += linestyle+'Level '+reqlevel+' '+uW.buildingcost['bdg'+bid][0]+'
    '; } } } if (uW.fortcost['frt'+unitId][9] && matTypeof(uW.fortcost['frt'+unitId][9]) === "object") { for (var r in uW.fortcost['frt'+unitId][9]) { var rid = r.split("t")[1]; var reqlevel = uW.fortcost['frt'+unitId][9][r][1]; var rlvl = Seed.tech['tch'+rid]; var linestyle = ''; if (rlvl < reqlevel) { linestyle = ''; m += linestyle+'Level '+reqlevel+' '+uW.techcost['tch'+rid][0]+'
    '; } } } m += ''; for (var r = 1; r < 5; r++) { if (uW.fortcost['frt'+unitId][r] != 0) { m += ''; } } if (uW.fortcost['frt'+unitId][11] && matTypeof(uW.fortcost['frt'+unitId][11]) === "object") { for (var r in uW.fortcost['frt'+unitId][11]) { var iid = r; var reqlevel = uW.fortcost['frt'+unitId][11][r]*parseIntNan(ById('btDefNumPerSlot').value); var ilvl = parseIntNan(Seed.items['i'+iid]); var linestyle = ''; if ((ilvl <= reqlevel) || (iid==34002 && t.limitingFactor=="median")) { linestyle = ''; } m += ''; } } m += '
    '; if (r==1) { m += ResourceImage(FoodImage,uW.g_js_strings.commonstr.food); } else { if (r==2) { m += ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood); } else { if (r==3) { m += ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone); } else { if (r==4) { m += ResourceImage(OreImage,uW.g_js_strings.commonstr.ore); } } } } var reqlevel = uW.fortcost['frt'+unitId][r]*parseIntNan(ById('btDefNumPerSlot').value); var rlvl = parseIntNan(Seed.resources['city'+cityId]['rec'+r][0]/3600); var linestyle = ''; if ((rlvl <= reqlevel) || (t.limitingFactor==uW.resourceinfo['rec'+r])) { linestyle = ''; } m += ''+linestyle+addCommas(reqlevel)+' / '+addCommas(rlvl)+'
    '+ResourceImage(getItemImageURL(iid),uW.itemlist['i'+iid].name)+''; m += linestyle+reqlevel+' / '+ilvl+'
    '; var perSlot = parseIntNan(ById('btDefNumPerSlot').value); if (perSlot!=0) { var time = t.getFortifyTime(cityId,unitId,perSlot); if (ById('btDefBoost').value==26) { time=parseInt(time*0.7); } m += '
    '+tx('Estimated Time')+': '+timestr(time); } ById('btDefRequirements').innerHTML = m; }, cancelAll: function (cityId,silent) { var t = Tabs.Fort; jQuery('#btDefCancelAllButton').addClass("disabled"); var delayer = 0; var q = Seed.queue_fort['city' + cityId]; for (var i = q.length-1; i >= 0; i--) { delayer = delayer + 1; setTimeout (t.cancelFort,(1000*delayer),q[i][0],q[i][1],q[i][2],q[i][3],q[i][5],q[i][6],cityId,i,silent); // spread them out ... } delayer = delayer + 1; setTimeout (function () { jQuery('#btDefCancelAllButton').removeClass("disabled"); },(1000*delayer)); }, cancelFort: function (typefrt, numtrpfrt, frtTmp, frtETA, frtNeeded, frtid, cityId, queueId, silent) { var t = Tabs.Fort; t.serverwait = true; if (!silent) ById('btDefQueueMessage').innerHTML = 'Cancelling Queued Item...'; var params = uW.Object.clone(uW.g_ajaxparams); params.pf = 0; params.requestType = "CANCEL_FORTIFICATIONS"; params.cityId = cityId; params.typefrt = typefrt; params.numtrpfrt = numtrpfrt; params.frtETA = frtETA; params.frtTmp = frtTmp; params.frtNeeded = frtNeeded; params.frtid = frtid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/cancelFortifications.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var k = 0; for (var j = 0; j < Seed.queue_fort["city" + cityId].length; j++) { if (j > queueId) { Seed.queue_fort["city" + cityId][j][2] = parseInt(rslt.dateFortifications[k]["start"]); Seed.queue_fort["city" + cityId][j][3] = parseInt(rslt.dateFortifications[k]["end"]); k++; } } Seed.queue_fort["city" + cityId].splice(queueId, 1); for (var i = 1; i < 5; i++) { var totalReturn = parseInt(uW.fortcost["frt" + typefrt][i]) * parseInt(numtrpfrt) * 3600 / 2; Seed.resources["city" + cityId]["rec" + i][0] = parseInt(Seed.resources["city" + cityId]["rec" + i][0]) + totalReturn; } t.PaintCityInfo(); } else { if (rslt.msg) { if (!silent) { ById('btDefQueueMessage').innerHTML = ''+rslt.msg+''; }} else { if (!silent) { ById('btDefQueueMessage').innerHTML = 'Error cancelling defence queue item'; }} } t.serverwait = false; }, onFailure: function () { if (!silent) { ById('btDefQueueMessage').innerHTML = 'AJAX Error!'; } t.serverwait = false; }, },true); }, getFortifyTime : function (cityId,unitId,num) { var b=parseInt(parseInt(uW.fortcost["frt"+unitId][7])); var f=1; f+=0.1*parseInt(Seed.tech.tch16); var a=0; var c=Seed.knights["city"+cityId]; if(c){ c=c["knt"+Seed.leaders["city"+cityId].politicsKnightId]; if(c){ a=parseInt(c.combat); newkntlv=((parseInt(c.politicsBoostExpireUnixtime)-uW.unixtime())>0)?(a*1.25):a; // removed because this is not in server calculation // f=f+(0.005*newkntlv) } } if(Seed.tech2 && Seed.tech2.tch3){ f+=parseFloat(Seed.tech2.tch3)*0.05 } b=Math.max(1,(b/f)); return b*num; }, Fortify : function (cityId, siege, unitId, num, notify) { var t = Tabs.Fort; var citynum = Cities.byID[cityId].idx+1; jQuery('#btDefCity_'+citynum).css('color', 'green'); var time = t.getFortifyTime(cityId,unitId,num); if (siege==26) { time=parseInt(time*0.7); } var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.type = unitId; params.quant = num; params.items = siege; new MyAjaxRequest(uW.g_ajaxpath + "ajax/fortify.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { uW.seed.queue_fort["city" + cityId].push(uWCloneInto([unitId, num, rslt.initTS, parseInt(rslt.initTS) + rslt.timeNeeded, 0, rslt.timeNeeded, rslt.fortifyId])); if (siege==26) { Seed.items.i26 = parseInt(Seed.items.i26)-1; uW.ksoItems[26].subtract(); } if (unitId==63) { Seed.items.i34002 = parseInt(Seed.items.i34002)-num; uW.ksoItems[34002].subtract(num); } actionLog(Cities.byID[cityId].name+': Building '+num+' '+uW.fortcost['frt'+unitId][0],'DEFENCE'); t.PaintCityInfo(); } else { if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Failed to build '+num+' '+uW.fortcost['frt'+unitId][0]+' ('+rslt.msg+')','DEFENCE'); } else { actionLog(Cities.byID[cityId].name+': Failed to build '+num+' '+uW.fortcost['frt'+unitId][0]+' ('+rslt.error_code+')','DEFENCE'); } } jQuery('#btDefCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); if (notify) { notify(rslt); } }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Failed to build '+num+' '+uW.fortcost['frt'+unitId][0]+' (Ajax Error)','DEFENCE'); jQuery('#btDefCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); if (notify) { notify({msg: 'AJAX error'}); } }, },true); // noretry }, } /** Training Tab **/ Tabs.Train = { tabLabel: 'Train', tabOrder: 2000, tabColor : 'brown', myDiv: null, timer: null, LoopCounter: 0, TroopTotal: 0, ModelCity: null, ModelCityId: 0, serverwait: false, MaxTroopTrain: 0, isBusy: false, TrainCityId: 0, QueLength: 0, Lancelots:0, Arthurs:0, Merlins:0, Squire:0, Knight:0, Guinevere:0, Morgana:0, Arthur:0, Merlin:0, Divine:0, Epic:0, Legendary:0, ItemList : [1, 2, 3, 4, 5, 6, 7, 8, 10], ItemTrans : ["SH","KH","GH","MH","AH","RH","DH","EH","LH"], TuteList : [36, 37, 38], TuteTrans : ["LT","AT","MT"], gamble: { "1": { "min": "5", "max": "15", "cost": "2", "factor1": 0.85, "factor2": 0.95, }, "2": { "min": "10", "max": "25", "cost": "4", "factor1": 0.75, "factor2": 0.9, } }, limitingFactor: null, Queued: 0, QueuedAscension: 0, TotalSlots: 0, TotalSlotsAscension: 0, intervalSecs: 5, autodelay : 0, speedupused : false, Options: { ManualWorkers: true, Running: false, ThroneCheck: false, TrainingSpeed: 0, StoneGuardian: false, Enabled: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, PrimaryTroops: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, PrimaryMin: {1:500,2:500,3:500,4:500,5:500,6:500,7:500,8:500}, PrimarySelectMax: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, PrimaryMax: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, PrimaryLimit: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, ReduceLimit: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, SecondaryEnabled: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, SecondaryTroops: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, SecondaryMin: {1:500,2:500,3:500,4:500,5:500,6:500,7:500,8:500}, SecondarySelectMax: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, SecondaryMax: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, AscensionEnabled: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, AscensionTroops: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, AscensionMin: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, AscensionSelectMax: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, AscensionMax: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, Gamble: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, Workers: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, Keep : {1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true}, Resources: { 1:{Food:0,Wood:0,Stone:0,Ore:0}, 2:{Food:0,Wood:0,Stone:0,Ore:0}, 3:{Food:0,Wood:0,Stone:0,Ore:0}, 4:{Food:0,Wood:0,Stone:0,Ore:0}, 5:{Food:0,Wood:0,Stone:0,Ore:0}, 6:{Food:0,Wood:0,Stone:0,Ore:0}, 7:{Food:0,Wood:0,Stone:0,Ore:0}, 8:{Food:0,Wood:0,Stone:0,Ore:0}, }, DismissRunning: false, AutoDismiss: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, AutoFertileWinds: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissMM: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissST: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissSC: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissPK: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissSW: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissAR: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissOther: {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, DismissOtherType: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, KeepOther: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, KeepMM: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, KeepST: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, KeepSC: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, KeepPK: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, KeepSW: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, KeepAR: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, Toggle: false, UseLT: false, UseAT: false, UseMT: false, LTLimitHours: 3, ATLimitHours: 5, MTLimitHours: 7, LTLimitMinutes: 0, ATLimitMinutes: 0, MTLimitMinutes: 0, UseLH: false, UseEH: false, UseDH: false, UseRH: false, UseAH: false, UseMH: false, UseGH: false, UseKH: false, UseSH: false, UseOverride: false, OverrideItem: 0, OverrideHours: 0, OverrideMinutes: 1, }, init: function (div) { var t = Tabs.Train; t.myDiv = div; if (!Options.TrainOptions) { Options.TrainOptions = t.Options; } else { for (var y in t.Options) { if (!Options.TrainOptions.hasOwnProperty(y)) { Options.TrainOptions[y] = t.Options[y]; } } } uWExportFunction('cancelTrain',Tabs.Train.cancelTrain); uWExportFunction('btTrnCancelAll',Tabs.Train.cancelAll); uWExportFunction('speedupTraining',Tabs.Train.speedupTraining); if (Options.TrainOptions.Toggle) AddSubTabLink('AutoTrain',t.toggleAutoTrainState, 'TrainToggleTab'); SetToggleButtonState('Train',Options.TrainOptions.Running,'Train'); var m = '
    '+tx('TROOP TRAINING AND POPULATION CONTROL')+'
    '; m += '
    '; m += '' m += ''; m += '
     '+tx("Add toggle button")+' '+tx('Current Training Speed')+':   
    '+tx('Only train when training speed is at least')+'  % '+tx('Only train when Stone Guardian active')+'  
    '; m += '
    '; m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ""; // spacer m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += '
      '+Cities.cities[i-1].name.substring(0, 12)+' 
    '+tx('Auto-Train')+' 
    '+tx('Training Queue')+' 
     
    '+tx('Asc. Training Queue')+' 
     
    '+tx('Available Population')+' 
     
    '+tx('Auto-Fertilize')+' 
    '+tx('Auto-Dismiss')+' 
    '; m += '
     '+tx('AUTO-SPEEDUP SETTINGS')+'
    '; m += '
    '; Boosts += ''; m += Boosts+'
    '; var Boosts = ''; for (var i = 0; i < t.TuteList.length; i++) { Boosts += ''; } Boosts += ''; Boosts += ''; for (var i = 0; i < t.TuteList.length; i++) { Boosts += ''; } Boosts += ''; for (var i = 0; i < t.TuteList.length; i++) { Boosts += ''; } Boosts += '
    '+tx('Tuteleges')+':
    (' + parseIntNan(uW.ksoItems[t.TuteList[i]].count) + ')
    '+uW.g_js_strings.commonstr.time+': '+uW.g_js_strings.timestr.timehr+'  '+uW.g_js_strings.timestr.timemin+'

    '; Boosts += ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += '
    '+tx('Hourglasses')+':
    (' + parseIntNan(uW.ksoItems[t.ItemList[i]].count) + ')
    '+tx('Override hourglass rules by always using')+' '+htmlSelector(HourGlassName,Options.TrainOptions.OverrideItem, 'id=pbtrainOVItem') + ' '+tx('when more than')+' '; Boosts += ' '+uW.g_js_strings.timestr.timehr+'  '+uW.g_js_strings.timestr.timemin+' '+tx('remaining')+'.
    '; m += '

    '+uW.g_js_strings.commonstr.city+': 
    '; m += '
     '+tx('TRAIN TROOPS')+'
    '; m += '
    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     
    '+tx(uW.g_js_strings.openCastle.trooptype)+': '; m += '
     ( )
    '+tx('Number to train')+': Max ('+uW.g_js_strings.commonstr.max; m += ': 0)
    '+tx('Number of slots to use')+': Max ('+uW.g_js_strings.commonstr.max; m += ': 0)
    '+tx('Use Workforce')+': 
    '+tx('Gamble')+': 
     '+uW.g_js_strings.modal_openBarracks.trainttl+'
    '; m += '
    '; m += ''; m += '
    '+uW.g_js_strings.commonstr.requirements+':-
     
    '; m += '
     
    '; m += '
     '+tx('AUTO-TRAIN SETTINGS')+'
    '; m += '
    '; m += '
     '+tx('AUTO-DISMISS SETTINGS')+'
    '; m += '
    '; m += '
     '+tx('TRAINING QUEUES')+' 
    '; m += '

    '; div.innerHTML = m; t.ModelCity = new CdispCityPicker('pttrain', ById('pttraincity'), true, t.clickCitySelect, null); ToggleOption('TrainOptions','btTrainToggle','Toggle'); ById('btTrnOptionLink').addEventListener ('click', function () {ToggleMainDivDisplay("Training",100,GlobalOptions.btWinSize.x,"btTrnOption",false)}, false); ById('btTrnAutoLink').addEventListener ('click', function () {ToggleMainDivDisplay("Training",100,GlobalOptions.btWinSize.x,"btTrnAuto",false)}, false); ById('btDisAutoLink').addEventListener ('click', function () {ToggleMainDivDisplay("Training",100,GlobalOptions.btWinSize.x,"btDisAuto",false)}, false); ById('btTrnQueueLink').addEventListener ('click', function () {ToggleMainDivDisplay("Training",100,GlobalOptions.btWinSize.x,"btTrnQueue",false)}, false); ById('btTrnSpeedupLink').addEventListener ('click', function () {ToggleMainDivDisplay("Training",100,GlobalOptions.btWinSize.x,"btTrnSpeedup",false)}, false); ById('btTrnType').addEventListener('change', t.PaintCityInfo, false); ById('btTrnGamble').addEventListener('change', t.PaintCityInfo, false); ById('btTrnMaxPerSlotButton').addEventListener('click', function () { var slots = Math.max(parseIntNan(ById('btTrnNumSlots').value),0); ById('btTrnNumPerSlot').value = parseIntNan(t.MaxTroopTrain / slots); t.paintRequirements(ById('btTrnType').value); } ,false); ById('btTrnNumPerSlot').addEventListener('change', function () { t.paintRequirements(ById('btTrnType').value); }, false); ById('btTrnNumSlots').addEventListener('change', function () { var slots = Math.max(parseIntNan(ById('btTrnNumSlots').value),0); if (slots < 1) { slots = 1; } var MaxSlots = t.TotalSlots-t.Queued; if (!CM.BarracksUnitsTypeMap.isUnitType(ById('btTrnType').value, "normal")) { MaxSlots = t.TotalSlotsAscension-t.QueuedAscension; } if (slots > MaxSlots) { slots = MaxSlots; } ById('btTrnNumSlots').value = slots; ById('btTrnMaxPerSlot').innerHTML = parseIntNan(t.MaxTroopTrain / slots); } ,false); ById('btTrnMaxSlotsButton').addEventListener('click', function () { var MaxSlots = t.TotalSlots-t.Queued; if (!CM.BarracksUnitsTypeMap.isUnitType(ById('btTrnType').value, "normal")) { MaxSlots = t.TotalSlotsAscension-t.QueuedAscension; } ById('btTrnNumSlots').value = Math.max(MaxSlots,0); var slots = Math.max(parseIntNan(ById('btTrnNumSlots').value),0); ById('btTrnMaxPerSlot').innerHTML = parseIntNan(t.MaxTroopTrain / slots); } ,false); ById('btTrnUseWorkers').addEventListener('click', t.clickCheckUseWorkers, false); ById('btTrnButton').addEventListener ('click', t.setTraining, false); for (var i = 1; i <= Cities.numCities; i++) { ById('btTrnAutoCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.TrainOptions.Enabled[citynum] = e.target.checked; if (Options.TrainOptions.Enabled[citynum]) { t.timer = setTimeout(function () { t.doAutoLoop(Number(citynum));}, 0); } saveOptions(); }, false); ById('btDisAutoCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.TrainOptions.AutoDismiss[citynum] = e.target.checked; if (Options.TrainOptions.AutoDismiss[citynum]) { t.timer = setTimeout(function () { t.doAutoLoop(Number(citynum));}, 0); } saveOptions(); }, false); ById('btFerAutoCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.TrainOptions.AutoFertileWinds[citynum] = e.target.checked; if (Options.TrainOptions.AutoFertileWinds[citynum]) { t.timer = setTimeout(function () { t.doAutoLoop(Number(citynum));}, 0); } saveOptions(); }, false); ById('btTrnWindsCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; t.Fertilize(Cities.cities[citynum-1].id); }, false); } ById('btAutoTrainState').addEventListener('click', function(){ t.toggleAutoTrainState(this); }, false); ById('btAutoDismissState').addEventListener('click', function(){ t.toggleAutoDismissState(this); }, false); ToggleOption('TrainOptions','btTrnTR','ThroneCheck'); ChangeIntegerOption('TrainOptions','btTrnTRSpeed','TrainingSpeed'); ToggleOption('TrainOptions','btTrnGuard','StoneGuardian'); ToggleOption('TrainOptions','pbtrainSH','UseSH'); ToggleOption('TrainOptions','pbtrainKH','UseKH'); ToggleOption('TrainOptions','pbtrainGH','UseGH'); ToggleOption('TrainOptions','pbtrainMH','UseMH'); ToggleOption('TrainOptions','pbtrainAH','UseAH'); ToggleOption('TrainOptions','pbtrainRH','UseRH'); ToggleOption('TrainOptions','pbtrainDH','UseDH'); ToggleOption('TrainOptions','pbtrainEH','UseEH'); ToggleOption('TrainOptions','pbtrainLH','UseLH'); ToggleOption('TrainOptions','pbtrainOV','UseOverride'); ChangeIntegerOption('TrainOptions','pbtrainOVItem','OverrideItem'); ChangeIntegerOption('TrainOptions','pbtrainOVHours','OverrideHours'); ChangeIntegerOption('TrainOptions','pbtrainOVMinutes','OverrideMinutes'); ToggleOption('TrainOptions','pbtrainLT','UseLT'); ToggleOption('TrainOptions','pbtrainAT','UseAT'); ToggleOption('TrainOptions','pbtrainMT','UseMT'); ChangeIntegerOption('TrainOptions','pbminhrLT','LTLimitHours'); ChangeIntegerOption('TrainOptions','pbminmnLT','LTLimitMinutes'); ChangeIntegerOption('TrainOptions','pbminhrAT','ATLimitHours'); ChangeIntegerOption('TrainOptions','pbminmnAT','ATLimitMinutes'); ChangeIntegerOption('TrainOptions','pbminhrMT','MTLimitHours'); ChangeIntegerOption('TrainOptions','pbminmnMT','MTLimitMinutes'); ById('pbTrainHelp').addEventListener ('click', t.helpPop, false); // start autotrain loop timer to start in 20 seconds... if (Options.TrainOptions.Running || Options.TrainOptions.DismissRunning) { t.timer = setTimeout(function () { t.doAutoLoop(1);}, (20 * 1000)); } }, helpPop : function (){ var t = Tabs.Train; var helpText = '
    '+tx("Using Speedups for Troop Training"); helpText += '

    '+tx('Tuteleges will take priority over hourglasses if selected, and the training time remaining is greater than the specified minimum time for the tutelege')+'.

    '; helpText += '

    '+tx("The priority order for tuteleges is Merlin's (70% reduction), Arthur's (50% reduction), and then Lancelot's (30% reduction)")+'.

    '; helpText += '

    '+tx('If no tuteleges can be used, hourglasses will be used in the following order if they are selected, and the required criteria is met')+' :-

    '; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += '
    '+uW.g_js_strings.commonstr.item+''+uW.g_js_strings.commonstr.time+''+tx('Criteria')+'
    '+uW.itemlist.i10.name+'4 days'+tx('More than 3 days and 12 hours remaining')+'
    '+uW.itemlist.i8.name+'2.5 days'+tx('More than 48 hours remaining')+'
    '+uW.itemlist.i7.name+'24 hrs'+tx('More than 23 hours 30 minutes remaining')+'
    '+uW.itemlist.i6.name+'15 hrs'+tx('More than 14 hours 30 minutes remaining')+'
    '+uW.itemlist.i5.name+'8 hrs'+tx('More than 7 hours 30 minutes remaining')+'
    '+uW.itemlist.i4.name+'2.5 hrs'+tx('More than 2 hours remaining')+'
    '+uW.itemlist.i3.name+'1 hr'+tx('More than 45 minutes remaining')+'
    '+uW.itemlist.i2.name+'15 mins'+tx('More than 5 minutes remaining')+'
    '+uW.itemlist.i1.name+'1 min'+tx('More than 30 seconds remaining')+'
    '; helpText += '

    '+tx('If the override box is ticked, then the override rule specified will take priority')+'.


    '; var pop = new CPopup ('BotHelp', 0, 0, 460, 420, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Speedups")+'
    '; pop.show (true); }, toggleAutoTrainState: function(obj){ var t = Tabs.Train; obj = ById('btAutoTrainState'); if (Options.TrainOptions.Running == true) { Options.TrainOptions.Running = false; obj.value = tx("AutoTrain = OFF"); } else { Options.TrainOptions.Running = true; obj.value = tx("AutoTrain = ON"); t.timer = setTimeout(function () { t.doAutoLoop(1);}, 0); } saveOptions(); SetToggleButtonState('Train',Options.TrainOptions.Running,'Train'); t.PaintOverview(); }, toggleAutoDismissState: function(obj){ var t = Tabs.Train; if (Options.TrainOptions.DismissRunning == true) { Options.TrainOptions.DismissRunning = false; obj.value = tx("AutoPopulate = OFF"); } else { Options.TrainOptions.DismissRunning = true; obj.value = tx("AutoPopulate = ON"); t.timer = setTimeout(function () { t.doAutoLoop(1);}, 0); } saveOptions(); t.PaintOverview(); }, show: function (init) { var t = Tabs.Train; var DispCityId = uW.currentcityid; if (init) { DispCityId = InitialCityId; } if (t.ModelCityId!=DispCityId) { t.ModelCity.selectBut(Cities.byID[DispCityId].idx); } t.PaintOverview(); t.UpdateTrainingOptions(); t.PaintCityInfo(); }, EverySecond : function () { var t = Tabs.Train; if (tabManager.currentTab.name == 'Train' && Options.btWinIsOpen){ t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh queue display every 2 seconds t.PaintCityInfo(); } if (t.LoopCounter >= 6) { // refresh overview display every 6 seconds t.LoopCounter = 0; t.PaintOverview(); } } }, clickCheckUseWorkers: function () { var t = Tabs.Train; Options.TrainOptions.ManualWorkers = (ById('btTrnUseWorkers').checked); saveOptions(); t.PaintCityInfo(); }, clickCitySelect: function (city) { var t = Tabs.Train; t.ModelCityId = city.id; t.LastQueue = 'x'; t.UpdateTrainingOptions(); t.PaintCityInfo(); }, setTraining: function () { var t = Tabs.Train; if (t.isBusy) { t.isBusy = false; ById('btTrnMessages').innerHTML = ''+tx('Cancelled')+'!'; ById('btTrnButtonLabel').innerHTML = uW.g_js_strings.modal_openBarracks.trainttl; jQuery('#btTrnButton').removeClass("red14"); jQuery('#btTrnButton').addClass("blue14"); return; } t.TrainCityId = t.ModelCityId; var unitId = ById('btTrnType').value; var perSlot = parseIntNan(ById('btTrnNumPerSlot').value); var numSlots = parseIntNan(ById('btTrnNumSlots').value); var gamble = ById('btTrnGamble').value; var tut = 0; if (perSlot < 1) { return; } if (numSlots < 1) { return; } if (perSlot * numSlots > t.MaxTroopTrain) { ById('btTrnMessages').innerHTML = ''+uW.g_js_strings.modal_attack.maxtroops+': '+t.MaxTroopTrain + ''; return; } var MaxSlots = t.TotalSlots-t.Queued; if (!CM.BarracksUnitsTypeMap.isUnitType(ById('btTrnType').value, "normal")) { MaxSlots = t.TotalSlotsAscension-t.QueuedAscension; } if (numSlots > MaxSlots) { ById('btTrnMessages').innerHTML = ''+tx('Maximum number of slots exceeded')+'!'; return; } var que = []; for (var i = 0; i < numSlots; i++) { que.push(['T', unitId, perSlot, gamble, tut]); } t.QueLength = que.length; t.isBusy = true; ById('btTrnButtonLabel').innerHTML = uW.g_js_strings.commonstr.cancel; jQuery('#btTrnButton').addClass("red14"); jQuery('#btTrnButton').removeClass("blue14"); t.nextqueue(que); }, nextqueue : function (que){ var t = Tabs.Train; if(!t.isBusy) { return; } var cmd = que.shift(); if (cmd[0] == 'T') { if (t.QueLength == 1) { ById('btTrnMessages').innerHTML = tx('Training')+' '+cmd[2]+' '+uW.unitcost['unt'+cmd[1]][0]+' '+tx('at')+' '+Cities.byID[t.TrainCityId].name; } else { ById('btTrnMessages').innerHTML = tx('Training')+' '+cmd[2]+' '+uW.unitcost['unt'+cmd[1]][0]+' '+tx('at')+' '+Cities.byID[t.TrainCityId].name + ' ('+tx('Slot')+' '+parseIntNan(t.QueLength-que.length)+' '+uW.g_js_strings.commonstr.of+' '+t.QueLength+')'; } t.Train (t.TrainCityId, cmd[4], cmd[3], cmd[1], cmd[2], function (rslt) { if (rslt.ok) { if (parseIntNan(que.length)==0) { ById('btTrnMessages').innerHTML = tx('Completed')+'!'; ById('btTrnButtonLabel').innerHTML = uW.g_js_strings.modal_openBarracks.trainttl; jQuery('#btTrnButton').removeClass("red14"); jQuery('#btTrnButton').addClass("blue14"); t.isBusy = false; return; } setTimeout(function () { t.nextqueue(que) }, 2000); } else { if (rslt.msg) { ById('btTrnMessages').innerHTML = ''+rslt.msg+''; } else { ById('btTrnMessages').innerHTML = ''+tx('Error training troops')+' ('+rslt.error_code+')'; } ById('btTrnButtonLabel').innerHTML = uW.g_js_strings.modal_openBarracks.trainttl; jQuery('#btTrnButton').removeClass("red14"); jQuery('#btTrnButton').addClass("blue14"); t.isBusy = false; return; } }); } }, getMaxTrain: function (unitId,cityId,ignoreRes,workforce,gamble,auto) { var t = Tabs.Train; var numberToTrain = 0; t.limitingFactor = null; var citynum = Cities.byID[cityId].idx+1; if (unitId==0) { return numberToTrain; } var food = parseIntNan(Seed.resources['city' + cityId].rec1[0] / 3600); var wood = parseIntNan(Seed.resources['city' + cityId].rec2[0] / 3600); var stone = parseIntNan(Seed.resources['city' + cityId].rec3[0] / 3600); var ore = parseIntNan(Seed.resources['city' + cityId].rec4[0] / 3600); // change these numbers for auto... var foodRes = 0; var woodRes = 0; var stoneRes = 0; var oreRes = 0; if (auto && Options.TrainOptions.Keep[citynum]) { foodRes = parseIntNan(Options.TrainOptions.Resources[citynum]["Food"]); woodRes = parseIntNan(Options.TrainOptions.Resources[citynum]["Wood"]); stoneRes = parseIntNan(Options.TrainOptions.Resources[citynum]["Stone"]); oreRes = parseIntNan(Options.TrainOptions.Resources[citynum]["Ore"]); } var availFood = food - foodRes; var availWood = wood - woodRes; var availStone = stone - stoneRes; var availOre = ore - oreRes; if (auto && !Options.TrainOptions.Keep[citynum]) { if (parseIntNan(Options.TrainOptions.Resources[citynum]["Food"])!=0) { availFood = parseIntNan(Options.TrainOptions.Resources[citynum]["Food"]) } if (parseIntNan(Options.TrainOptions.Resources[citynum]["Wood"])!=0) { availWood = parseIntNan(Options.TrainOptions.Resources[citynum]["Wood"]) } if (parseIntNan(Options.TrainOptions.Resources[citynum]["Stone"])!=0) { availStone = parseIntNan(Options.TrainOptions.Resources[citynum]["Stone"]) } if (parseIntNan(Options.TrainOptions.Resources[citynum]["Ore"])!=0) { availOre = parseIntNan(Options.TrainOptions.Resources[citynum]["Ore"]) } } var gambleFactor = 1; if (gamble > 0) { gambleFactor = t.gamble[gamble].cost; } var unitFood = parseInt(uW.unitcost['unt'+unitId][1])*gambleFactor; var unitWood = parseInt(uW.unitcost['unt'+unitId][2])*gambleFactor; var unitStone = parseInt(uW.unitcost['unt'+unitId][3])*gambleFactor; var unitOre = parseInt(uW.unitcost['unt'+unitId][4])*gambleFactor; var unitPop = parseInt(uW.unitcost['unt'+unitId][6]); if (unitId == 16) var unitYew = uW.unitcost['unt'+unitId][11]["34001"]; if (unitId == 27) var unitCorrupter = uW.unitcost['unt'+unitId][11]["34003"]; var idlePop = parseInt(Seed.citystats['city' + cityId].pop[0]) - parseInt(Seed.citystats['city' + cityId].pop[3]); if (ignoreRes) { idlePop = parseInt(Seed.citystats['city' + cityId].pop[1]) - parseInt(Seed.citystats['city' + cityId].pop[3]); // base on max population } var workers = Math.floor(parseIntNan(Seed.citystats['city' + cityId].pop[3])*(workforce/100)); idlePop = idlePop+workers; var yew = parseIntNan(Seed.items.i34001); // flame archers require yew branches var corrupter = parseIntNan(Seed.items.i34003); // duellists require corrupter seeds var max = 9999999999; if (!ignoreRes) { if ((food / unitFood) < max) { max = food / unitFood; t.limitingFactor = uW.resourceinfo['rec1']; } if ((wood / unitWood) < max) { max = wood / unitWood; t.limitingFactor = uW.resourceinfo['rec2']; } if ((stone / unitStone) < max) { max = stone / unitStone; t.limitingFactor = uW.resourceinfo['rec3']; } if ((ore / unitOre) < max) { max = ore / unitOre; t.limitingFactor = uW.resourceinfo['rec4']; } if (unitId == 16) { if ((yew / unitYew) < max) { max = yew / unitYew; t.limitingFactor = 'yew'; } } if (unitId == 27) { if ((corrupter / unitCorrupter) < max) { max = corrupter / unitCorrupter; t.limitingFactor = 'corrupter'; } } } if ((idlePop / unitPop) < max) { max = idlePop / unitPop; t.limitingFactor = 'pop'; } numberToTrain = parseInt(max); if (numberToTrain < 0) { numberToTrain = 0; } return numberToTrain; }, CheckCanTrain : function (unitId,cityId) { var t = Tabs.Train; if (unitId==0) return false; var Result = true; // check rare troops if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "rare")) { return false; } // check ascension city types here.. var ascended = getAscensionValues(cityId); if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "druid") && ascended.prestigeType!=1) { return false; } if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "fey") && ascended.prestigeType!=2) { return false; } if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "briton") && ascended.prestigeType!=3) { return false; } // troop requirements var Buildings = getCityBuildings(cityId); var fc = uW.unitcost['unt'+unitId]; if (matTypeof(fc[8]) == 'object'){ for (var k in fc[8]){ var b = Buildings[k.substr(1)]; if (b.maxLevel < fc[8][k][1]){ Result = false; break; } } } if (matTypeof(fc[9]) == 'object'){ for (var k in fc[9]){ if (parseInt(Seed.tech['tch'+k.substr(1)]) < fc[9][k][1]){ Result = false; break; } } } return Result; }, PaintOverview : function () { var t = Tabs.Train; for (var i = 0; i < Cities.numCities; i++) { citynum = i+1; cityId = Cities.cities[i].id; var totTime = 0; var totTime2 = 0; var now = unixTime(); var q = Seed.queue_unt['city'+cityId]; if (q != null && q.length > 0) { for (var j = 0; j < q.length; j++) { if (q[j][7]) totTime2 = q[j][3] - now; else totTime = q[j][3] - now; } } if (totTime < 0) totTime = 0; if (totTime < 3600) ById('btTrnQueueCity_'+citynum).innerHTML = '' + timestr(totTime) + ''; else ById('btTrnQueueCity_'+citynum).innerHTML = timestr(totTime); if (totTime2 < 0) totTime2 = 0; if (totTime2 < 3600) ById('btTrnAscQueueCity_'+citynum).innerHTML = '' + timestr(totTime2) + ''; else ById('btTrnAscQueueCity_'+citynum).innerHTML = timestr(totTime2); var idlePop = parseInt(Seed.citystats['city' + cityId].pop[0]) - parseInt(Seed.citystats['city' + cityId].pop[3]); var workers = Math.floor(parseIntNan(Seed.citystats['city' + cityId].pop[3])*(Options.TrainOptions.Workers[citynum]/100)); var autoidlePop = idlePop+workers; if (idlePop<=0) ById('btTrnIdlePopCity_'+citynum).innerHTML = '' + addCommas(idlePop) + ''; else ById('btTrnIdlePopCity_'+citynum).innerHTML = ''+addCommas(idlePop)+''; var WindAvailable = (parseInt(Seed.citystats['city' + cityId].pop[0]) < parseInt(Seed.citystats['city' + cityId].pop[1])); if (WindAvailable) { jQuery('#btTrnWindsLinkCity_'+citynum).removeClass("divHide"); } else { jQuery('#btTrnWindsLinkCity_'+citynum).addClass("divHide"); } ById('btTrnWindsCity_'+citynum).title = itemTitle(351); } var ts = Math.floor(equippedthronestats(77)); if (Options.TrainOptions.ThroneCheck && (ts < Number(Options.TrainOptions.TrainingSpeed))) { ts = ''+ts+'%'; } else { ts+='%'; } ById("btTrnCurrTR").innerHTML = ts; }, fixQueTimes: function (q) { // fix KofC bugs .... // if first start time > now, make it now // if any end time != next start time then fix it var now = unixTime(); if (q[0][2] > now) { q[0][2] = now; } for (var i = 0; i < q.length; i++) { if (q[i + 1] != null && q[i + 1][2] != q[i][3]) { q[i][3] = q[i + 1][2]; } } }, expireTheQueue: function (q) { if (q == null) return; var now = unixTime(); for (var i = 0; i < q.length; i++) { if ((q[i][3] - now) < 1) q.splice(i,1); } }, UpdateTrainingOptions : function () { var t = Tabs.Train; var citynum = Cities.byID[t.ModelCityId].idx+1; var m = ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; if(Seed.cityData.city[t.ModelCityId].prestigeInfo.blessings) { var AscensionType = '(unknown)'; if(Seed.cityData.city[t.ModelCityId].prestigeInfo.blessings.indexOf(11) != -1) { Options.TrainOptions.AscensionTroops[citynum] = 13; var AscensionType = uW.unitcost['unt13'][0]; } if(Seed.cityData.city[t.ModelCityId].prestigeInfo.blessings.indexOf(21) != -1) { Options.TrainOptions.AscensionTroops[citynum] = 14; var AscensionType = uW.unitcost['unt14'][0]; } if(Seed.cityData.city[t.ModelCityId].prestigeInfo.blessings.indexOf(31) != -1) { Options.TrainOptions.AscensionTroops[citynum] = 15; var AscensionType = uW.unitcost['unt15'][0]; } m += ''; m += ''; m += ''; } m += ''; m += ''; m += ''; m +=''; m += '
      '+tx('Primary')+': '; m += ''+tx('Min')+':  '+tx("Max")+': '+tx('City Limit')+':  '+tx("Reduce")+'
     '+tx('Secondary')+': '; m += ''+tx('Min')+':  '+tx("Max")+':  
     '+tx('Ascension')+': '+AscensionType+''+tx("Min")+':  '+tx("Max")+': 
      '; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
      '+tx("Use Workforce")+': '+tx("Gamble")+': '+tx('Copy settings to all cities')+'  
    '; // dismiss here!! var n = ''; n += '
    '; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += ''; n += '
    '+uW.unitnamedesctranslated['unt1'][0]+''+uW.unitnamedesctranslated['unt2'][0]+''+uW.unitnamedesctranslated['unt3'][0]+''+uW.unitnamedesctranslated['unt4'][0]+''+uW.unitnamedesctranslated['unt5'][0]+''+uW.unitnamedesctranslated['unt6'][0]+'
    '+tx('Keep')+':'+tx('Keep')+':'+tx('Keep')+':'+tx('Keep')+':'+tx('Keep')+':'+tx('Keep')+':

    '+tx('Override above rules by always dismissing')+' '; n += ' '+tx('when more than')+'  '+tx('troops owned')+'.
    '+tx('Copy settings to all cities')+'  
    '; ById('btTrnAuto').innerHTML = m; ById('btDisAuto').innerHTML = n; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('btTrnAutoPrimaryType').value = Options.TrainOptions.PrimaryTroops[citynum]; ById('btTrnAutoPrimarySelMax').checked = Options.TrainOptions.PrimarySelectMax[citynum]; if (!Options.TrainOptions.PrimarySelectMax[citynum]) { ById('btTrnAutoPrimaryMax').disabled=true; Options.TrainOptions.PrimaryMax[citynum] = t.getMaxTrain(Options.TrainOptions.PrimaryTroops[citynum],t.ModelCityId,true,Options.TrainOptions.Workers[citynum]); ById('btTrnAutoPrimaryMax').value = Options.TrainOptions.PrimaryMax[citynum]; } ById('btTrnAutoSecondaryType').value = Options.TrainOptions.SecondaryTroops[citynum]; ById('btTrnAutoSecondarySelMax').checked = Options.TrainOptions.SecondarySelectMax[citynum]; if (!Options.TrainOptions.SecondarySelectMax[citynum]) { ById('btTrnAutoSecondaryMax').disabled=true; Options.TrainOptions.SecondaryMax[citynum] = t.getMaxTrain(Options.TrainOptions.SecondaryTroops[citynum],t.ModelCityId,true,Options.TrainOptions.Workers[citynum]); ById('btTrnAutoSecondaryMax').value = Options.TrainOptions.SecondaryMax[citynum]; } if (!Options.TrainOptions.SecondaryEnabled[citynum]) { ById('btTrnAutoSecondaryType').disabled=true; ById('btTrnAutoSecondaryMin').disabled=true; ById('btTrnAutoSecondarySelMax').disabled=true; ById('btTrnAutoSecondaryMax').disabled=true; } if(ById('btTrnAutoAscensionEnabled')) { ById('btTrnAutoAscensionSelMax').checked = Options.TrainOptions.AscensionSelectMax[citynum]; if (!Options.TrainOptions.AscensionSelectMax[citynum]) { ById('btTrnAutoAscensionMax').disabled=true; Options.TrainOptions.AscensionMax[citynum] = t.getMaxTrain(Options.TrainOptions.AscensionTroops[citynum],t.ModelCityId,true,Options.TrainOptions.Workers[citynum]); ById('btTrnAutoAscensionMax').value = Options.TrainOptions.AscensionMax[citynum]; } if (!Options.TrainOptions.AscensionEnabled[citynum]) { ById('btTrnAutoAscensionMin').disabled=true; ById('btTrnAutoAscensionSelMax').disabled=true; ById('btTrnAutoAscensionMax').disabled=true; } } ById('btTrnAutoKeep').value = Options.TrainOptions.Keep[citynum]; ById('btTrnAutoWorkers').value = Options.TrainOptions.Workers[citynum]; ById('btTrnAutoGamble').value = Options.TrainOptions.Gamble[citynum]; ById('btTrnAutoPrimaryType').addEventListener('change', function(e){ Options.TrainOptions.PrimaryTroops[citynum] = e.target.value; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoPrimaryMin').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.PrimaryMin[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoPrimaryMax').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=t.getMaxTrain(Options.TrainOptions.PrimaryTroops[citynum],t.ModelCityId,true,Options.TrainOptions.Workers[citynum]); Options.TrainOptions.PrimaryMax[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoPrimarySelMax').addEventListener('change', function(e){ Options.TrainOptions.PrimarySelectMax[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoPrimaryLimit').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.PrimaryLimit[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoReduceLimit').addEventListener('change', function(e){ Options.TrainOptions.ReduceLimit[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoSecondaryEnabled').addEventListener('change', function(e){ Options.TrainOptions.SecondaryEnabled[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoSecondaryType').addEventListener('change', function(e){ Options.TrainOptions.SecondaryTroops[citynum] = e.target.value; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoSecondaryMin').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.SecondaryMin[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoSecondaryMax').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=t.getMaxTrain(Options.TrainOptions.SecondaryTroops[citynum],t.ModelCityId,true,Options.TrainOptions.Workers[citynum]); Options.TrainOptions.SecondaryMax[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoSecondarySelMax').addEventListener('change', function(e){ Options.TrainOptions.SecondarySelectMax[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoWorkers').addEventListener('change', function(e){ Options.TrainOptions.Workers[citynum] = e.target.value; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoGamble').addEventListener('change', function(e){ Options.TrainOptions.Gamble[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoKeep').addEventListener('change', function(e){ Options.TrainOptions.Keep[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoFood').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.Resources[citynum]['Food'] = e.target.value; saveOptions(); }, false); ById('btTrnAutoWood').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.Resources[citynum]['Wood'] = e.target.value; saveOptions(); }, false); ById('btTrnAutoStone').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.Resources[citynum]['Stone'] = e.target.value; saveOptions(); }, false); ById('btTrnAutoOre').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.Resources[citynum]['Ore'] = e.target.value; saveOptions(); }, false); if(ById('btTrnAutoAscensionEnabled')) { ById('btTrnAutoAscensionEnabled').addEventListener('change', function(e){ Options.TrainOptions.AscensionEnabled[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btTrnAutoAscensionMin').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.AscensionMin[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoAscensionMax').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=t.getMaxTroops(t.ModelCityId,Options.TrainOptions.AscensionTroops[citynum],true,Options.TrainOptions.Workers[citynum]); Options.TrainOptions.AscensionMax[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoAscensionSelMax').addEventListener('change', function(e){ Options.TrainOptions.AscensionSelectMax[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); }; ById('chkDoST').checked = Options.TrainOptions.DismissST[citynum]; ById('chkDoMM').checked = Options.TrainOptions.DismissMM[citynum]; ById('chkDoSC').checked = Options.TrainOptions.DismissSC[citynum]; ById('chkDoPK').checked = Options.TrainOptions.DismissPK[citynum]; ById('chkDoSW').checked = Options.TrainOptions.DismissSW[citynum]; ById('chkDoAR').checked = Options.TrainOptions.DismissAR[citynum]; ById('chkDoOther').checked = Options.TrainOptions.DismissOther[citynum]; ById('btDisOtherType').value = Options.TrainOptions.DismissOtherType[citynum]; if (!Options.TrainOptions.DismissST[citynum]) { ById('btDisKeepST').disabled=true; } if (!Options.TrainOptions.DismissMM[citynum]) { ById('btDisKeepMM').disabled=true; } if (!Options.TrainOptions.DismissSC[citynum]) { ById('btDisKeepSC').disabled=true; } if (!Options.TrainOptions.DismissPK[citynum]) { ById('btDisKeepPK').disabled=true; } if (!Options.TrainOptions.DismissSW[citynum]) { ById('btDisKeepSW').disabled=true; } if (!Options.TrainOptions.DismissAR[citynum]) { ById('btDisKeepAR').disabled=true; } if (!Options.TrainOptions.DismissOther[citynum]) { ById('btDisKeepOther').disabled=true; ById('btDisOtherType').disabled=true; } ById('chkDoST').addEventListener('change', function(e){ Options.TrainOptions.DismissST[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('chkDoMM').addEventListener('change', function(e){ Options.TrainOptions.DismissMM[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('chkDoSC').addEventListener('change', function(e){ Options.TrainOptions.DismissSC[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('chkDoPK').addEventListener('change', function(e){ Options.TrainOptions.DismissPK[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('chkDoSW').addEventListener('change', function(e){ Options.TrainOptions.DismissSW[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('chkDoAR').addEventListener('change', function(e){ Options.TrainOptions.DismissAR[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('chkDoOther').addEventListener('change', function(e){ Options.TrainOptions.DismissOther[citynum] = e.target.checked; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btDisOtherType').addEventListener('change', function(e){ Options.TrainOptions.DismissOtherType[citynum] = e.target.value; saveOptions(); t.UpdateTrainingOptions(); }, false); ById('btDisKeepST').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.KeepST[citynum] = e.target.value; saveOptions(); }, false); ById('btDisKeepMM').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.KeepMM[citynum] = e.target.value; saveOptions(); }, false); ById('btDisKeepSC').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.KeepSC[citynum] = e.target.value; saveOptions(); }, false); ById('btDisKeepPK').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.KeepPK[citynum] = e.target.value; saveOptions(); }, false); ById('btDisKeepSW').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.KeepSW[citynum] = e.target.value; saveOptions(); }, false); ById('btDisKeepAR').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.KeepAR[citynum] = e.target.value; saveOptions(); }, false); ById('btDisKeepOther').addEventListener('change', function(e){ if (isNaN(e.target.value)) e.target.value=0; Options.TrainOptions.KeepOther[citynum] = e.target.value; saveOptions(); }, false); ById('btTrnAutoCopy').addEventListener('click', function(e){ t.CopyAutoTrainSettings(citynum); saveOptions(); ById('btTrnMessages').innerHTML = 'Auto-train settings copied to all cities'; }, false); ById('btDisAutoCopy').addEventListener('click', function(e){ t.CopyAutoDismissSettings(citynum); saveOptions(); ById('btTrnMessages').innerHTML = 'Auto-dismiss settings copied to all cities'; }, false); }, CopyAutoTrainSettings : function (citynum) { var t = Tabs.Train; for (var i = 1; i <= Cities.numCities; i++) { if (i!=citynum) { // Options.TrainOptions.Enabled[i] = Options.TrainOptions.Enabled[citynum]; if (Options.TrainOptions.PrimaryTroops[citynum]==0 || t.CheckCanTrain(Options.TrainOptions.PrimaryTroops[citynum],Cities.cities[i-1].id)) { Options.TrainOptions.PrimaryTroops[i] = Options.TrainOptions.PrimaryTroops[citynum]; Options.TrainOptions.PrimaryMin[i] = Options.TrainOptions.PrimaryMin[citynum]; Options.TrainOptions.PrimarySelectMax[i] = Options.TrainOptions.PrimarySelectMax[citynum]; Options.TrainOptions.PrimaryMax[i] = Options.TrainOptions.PrimaryMax[citynum]; Options.TrainOptions.PrimaryLimit[i] = Options.TrainOptions.PrimaryLimit[citynum]; Options.TrainOptions.ReduceLimit[i] = Options.TrainOptions.ReduceLimit[citynum]; } if (Options.TrainOptions.SecondaryTroops[citynum]==0 || t.CheckCanTrain(Options.TrainOptions.SecondaryTroops[citynum],Cities.cities[i-1].id)) { Options.TrainOptions.SecondaryEnabled[i] = Options.TrainOptions.SecondaryEnabled[citynum]; Options.TrainOptions.SecondaryTroops[i] = Options.TrainOptions.SecondaryTroops[citynum]; Options.TrainOptions.SecondaryMin[i] = Options.TrainOptions.SecondaryMin[citynum]; Options.TrainOptions.SecondarySelectMax[i] = Options.TrainOptions.SecondarySelectMax[citynum]; Options.TrainOptions.SecondaryMax[i] = Options.TrainOptions.SecondaryMax[citynum]; } if (Seed.cityData.city[Cities.cities[i-1].id].prestigeInfo.blessings) { Options.TrainOptions.AscensionEnabled[i] = Options.TrainOptions.AscensionEnabled[citynum]; // Options.TrainOptions.AscensionTroops[i] = Options.TrainOptions.AscensionTroops[citynum]; Options.TrainOptions.AscensionMin[i] = Options.TrainOptions.AscensionMin[citynum]; Options.TrainOptions.AscensionSelectMax[i] = Options.TrainOptions.AscensionSelectMax[citynum]; Options.TrainOptions.AscensionMax[i] = Options.TrainOptions.AscensionMax[citynum]; } Options.TrainOptions.Gamble[i] = Options.TrainOptions.Gamble[citynum]; Options.TrainOptions.Workers[i] = Options.TrainOptions.Workers[citynum]; Options.TrainOptions.Keep[i] = Options.TrainOptions.Keep[citynum]; Options.TrainOptions.Resources[i].Food = Options.TrainOptions.Resources[citynum].Food; Options.TrainOptions.Resources[i].Wood = Options.TrainOptions.Resources[citynum].Wood; Options.TrainOptions.Resources[i].Stone = Options.TrainOptions.Resources[citynum].Stone; Options.TrainOptions.Resources[i].Ore = Options.TrainOptions.Resources[citynum].Ore; } } }, CopyAutoDismissSettings : function (citynum) { var t = Tabs.Train; for (var i = 1; i <= Cities.numCities; i++) { if (i!=citynum) { // Options.TrainOptions.AutoDismiss[i] = Options.TrainOptions.AutoDismiss[citynum]; Options.TrainOptions.DismissST[i] = Options.TrainOptions.DismissST[citynum]; Options.TrainOptions.DismissMM[i] = Options.TrainOptions.DismissMM[citynum]; Options.TrainOptions.DismissSC[i] = Options.TrainOptions.DismissSC[citynum]; Options.TrainOptions.DismissPK[i] = Options.TrainOptions.DismissPK[citynum]; Options.TrainOptions.DismissSW[i] = Options.TrainOptions.DismissSW[citynum]; Options.TrainOptions.DismissAR[i] = Options.TrainOptions.DismissAR[citynum]; Options.TrainOptions.DismissOther[i] = Options.TrainOptions.DismissOther[citynum]; Options.TrainOptions.DismissOtherType[i] = Options.TrainOptions.DismissOtherType[citynum]; Options.TrainOptions.KeepST[i] = Options.TrainOptions.KeepST[citynum]; Options.TrainOptions.KeepMM[i] = Options.TrainOptions.KeepMM[citynum]; Options.TrainOptions.KeepSC[i] = Options.TrainOptions.KeepSC[citynum]; Options.TrainOptions.KeepPK[i] = Options.TrainOptions.KeepPK[citynum]; Options.TrainOptions.KeepSW[i] = Options.TrainOptions.KeepSW[citynum]; Options.TrainOptions.KeepAR[i] = Options.TrainOptions.KeepAR[citynum]; Options.TrainOptions.KeepOther[i] = Options.TrainOptions.KeepOther[citynum]; } } }, doAutoLoop : function (idx) { var t = Tabs.Train; clearTimeout(t.timer); if (!Options.TrainOptions.Running && !Options.TrainOptions.DismissRunning) return; var cityId = Cities.cities[idx-1].id; t.autodelay = 0; // no delay if no action taken! if (Options.TrainOptions.Running) { var TroopsQueued = false; var ts = Math.floor(equippedthronestats(77)); if (!Options.TrainOptions.ThroneCheck || (Options.TrainOptions.TrainingSpeed == 0) || (Options.TrainOptions.TrainingSpeed <= ts)) { var ascensionok = (!Options.BuildOptions || !Options.BuildOptions.AscensionReady[idx]); if (Options.TrainOptions.Enabled[idx] && ascensionok) { var stonelevel = (Seed.guardian[idx-1].cityGuardianLevels["stone"]?Seed.guardian[idx-1].cityGuardianLevels["stone"]:0); if (!Options.TrainOptions.StoneGuardian[idx] || (stonelevel == 0) || (Seed.guardian[idx-1].type == "stone")) { // check ascension first... if (Seed.cityData.city[cityId].isPrestigeCity && Options.TrainOptions.AscensionEnabled[idx]) { var NumTrain = t.getMaxTrain(Options.TrainOptions.AscensionTroops[idx],cityId,false,Options.TrainOptions.Workers[idx],Options.TrainOptions.Gamble[idx],true); if (NumTrain > 0 && NumTrain >= parseIntNan(Options.TrainOptions.AscensionMin[idx])) { if (Options.TrainOptions.AscensionSelectMax[idx] && NumTrain > parseIntNan(Options.TrainOptions.AscensionMax[idx])) { NumTrain = parseIntNan(Options.TrainOptions.AscensionMax[idx]); } if (t.CheckTrainSlots(cityId,true)) { t.Train(cityId, 0, Options.TrainOptions.Gamble[idx], Options.TrainOptions.AscensionTroops[idx], NumTrain); t.autodelay = t.intervalSecs; TroopsQueued = true; } } } if (!TroopsQueued) { // check primary troop conditions... var PrimaryLimit = parseIntNan(Options.TrainOptions.PrimaryLimit[idx]); var TroopsOwned = parseIntNan(getCityTroops(Options.TrainOptions.PrimaryTroops[idx],cityId,true)); var NumTrain = t.getMaxTrain(Options.TrainOptions.PrimaryTroops[idx],cityId,false,Options.TrainOptions.Workers[idx],Options.TrainOptions.Gamble[idx],true); if (NumTrain>0) { if (Options.TrainOptions.ReduceLimit[idx]) { if (NumTrain > PrimaryLimit) { NumTrain = PrimaryLimit; } } else { if (PrimaryLimit > 0 && NumTrain > (PrimaryLimit-TroopsOwned)) { NumTrain = PrimaryLimit-TroopsOwned; } } } if (NumTrain>0) { if (NumTrain >= parseIntNan(Options.TrainOptions.PrimaryMin[idx])) { if (Options.TrainOptions.PrimarySelectMax[idx] && NumTrain > parseIntNan(Options.TrainOptions.PrimaryMax[idx])) { NumTrain = parseIntNan(Options.TrainOptions.PrimaryMax[idx]); } if (t.CheckTrainSlots(cityId,false)) { t.Train(cityId, 0, Options.TrainOptions.Gamble[idx], Options.TrainOptions.PrimaryTroops[idx], NumTrain, function(rslt) { if (rslt.ok) { if (Options.TrainOptions.ReduceLimit[idx]) { Options.TrainOptions.PrimaryLimit[idx] = Options.TrainOptions.PrimaryLimit[idx] - NumTrain; if (Options.TrainOptions.PrimaryLimit[idx]<0) Options.TrainOptions.PrimaryLimit[idx]=0; saveOptions(); if (ById('btTrnAutoPrimaryLimit') && cityId==t.ModelCityId) { ById('btTrnAutoPrimaryLimit').value = Options.TrainOptions.PrimaryLimit[idx]; } } } }); t.autodelay = t.intervalSecs; TroopsQueued = true; } } else { TroopsQueued = true; // don't allow secondary if primary valid but we're waiting for population.. HOPEFULLY this will still allow us to move to secondary if no yew branches when flame archers are primary (?) } } } if (!TroopsQueued) { // check secondary troops... if (Options.TrainOptions.SecondaryEnabled[idx]) { var NumTrain = t.getMaxTrain(Options.TrainOptions.SecondaryTroops[idx],cityId,false,Options.TrainOptions.Workers[idx],Options.TrainOptions.Gamble[idx],true); if (NumTrain >= parseIntNan(Options.TrainOptions.SecondaryMin[idx])) { if (Options.TrainOptions.SecondarySelectMax[idx] && NumTrain > parseIntNan(Options.TrainOptions.SecondaryMax[idx])) { NumTrain = parseIntNan(Options.TrainOptions.SecondaryMax[idx]); } if (t.CheckTrainSlots(cityId,false)) { t.Train(cityId, 0, Options.TrainOptions.Gamble[idx], Options.TrainOptions.SecondaryTroops[idx], NumTrain); t.autodelay = t.intervalSecs; TroopsQueued = true; } } } } } } } if (!TroopsQueued) { t.speedupused = false; var q = Seed.queue_unt['city' + cityId]; t.expireTheQueue(q); var q1 = []; var q2 = []; for (var u in q) { if (q[u][0]) { if (q[u][7]) { q2.push(q[u]); } else { q1.push(q[u]); } } } var speedup = false; var speedupascension = false; if (q2 != null && q2.length > 0) { speedupascension = true; } else { if (q1 != null && q1.length > 0) { speedup = true; } } if (speedupascension && !t.speedupused) { for (var i = 0; i < q.length; i++) { if (!CM.BarracksUnitsTypeMap.isUnitType(q[i][0], "normal")) { t.autoSpeedup(cityId,q[i],i); break; } } } if (speedup && !t.speedupused) { for (var i = 0; i < q.length; i++) { if (CM.BarracksUnitsTypeMap.isUnitType(q[i][0], "normal")) { t.autoSpeedup(cityId,q[i],i); break; } } } } } if (Options.TrainOptions.DismissRunning) { t.GetMorePopulation(idx-1); } if (idx == Cities.numCities) { t.timer = setTimeout(function () { t.doAutoLoop(1); }, (t.intervalSecs * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1); }, (t.autodelay * 1000)); } }, autoSpeedup: function (cityId,q,slot) { var t = Tabs.Train; var now = unixTime(); var item = 0; totTime = q[3] - now; if (totTime > 0) { if (item==0) { var THRESHOLD_SECONDS = (parseIntNan(Options.TrainOptions.MTLimitMinutes)*60)+(parseIntNan(Options.TrainOptions.MTLimitHours)*60*60); if (totTime >= THRESHOLD_SECONDS && Options.TrainOptions.UseMT && uW.ksoItems[38].count > 0) { item = 38; } } if (item==0) { var THRESHOLD_SECONDS = (parseIntNan(Options.TrainOptions.ATLimitMinutes)*60)+(parseIntNan(Options.TrainOptions.ATLimitHours)*60*60); if (totTime >= THRESHOLD_SECONDS && Options.TrainOptions.UseAT && uW.ksoItems[37].count > 0) { item = 37; } } if (item==0) { var THRESHOLD_SECONDS = (parseIntNan(Options.TrainOptions.LTLimitMinutes)*60)+(parseIntNan(Options.TrainOptions.LTLimitHours)*60*60); if (totTime >= THRESHOLD_SECONDS && Options.TrainOptions.UseLT && uW.ksoItems[36].count > 0) { item = 36; } } if (item==0) { if (Options.TrainOptions.UseOverride && Options.TrainOptions.OverrideItem != 0) { var THRESHOLD_SECONDS = (parseIntNan(Options.TrainOptions.OverrideMinutes)*60)+(parseIntNan(Options.TrainOptions.OverrideHours)*60*60); if (totTime >= THRESHOLD_SECONDS && uW.ksoItems[Options.TrainOptions.OverrideItem].count > 0) { item = Options.TrainOptions.OverrideItem; } } if (item==0 && totTime >= HGLimit[8] && Options.TrainOptions.UseLH && uW.ksoItems[10].count > 0) { item = 10; } if (item==0 && totTime >= HGLimit[7] && Options.TrainOptions.UseEH && uW.ksoItems[8].count > 0) { item = 8; } if (item==0 && totTime >= HGLimit[6] && Options.TrainOptions.UseDH && uW.ksoItems[7].count > 0) { item = 7; } if (item==0 && totTime >= HGLimit[5] && Options.TrainOptions.UseRH && uW.ksoItems[6].count > 0) { item = 6; } if (item==0 && totTime >= HGLimit[4] && Options.TrainOptions.UseAH && uW.ksoItems[5].count > 0) { item = 5; } if (item==0 && totTime >= HGLimit[3] && Options.TrainOptions.UseMH && uW.ksoItems[4].count > 0) { item = 4; } if (item==0 && totTime >= HGLimit[2] && Options.TrainOptions.UseGH && uW.ksoItems[3].count > 0) { item = 3; } if (item==0 && totTime >= HGLimit[1] && Options.TrainOptions.UseKH && uW.ksoItems[2].count > 0) { item = 2; } if (item==0 && totTime >= HGLimit[0] && Options.TrainOptions.UseSH && uW.ksoItems[1].count > 0) { item = 1; } } } if (item != 0) { t.autodelay = t.intervalSecs; t.speedupused = true; t.speedupTraining(cityId,q[0],item,slot,true); } }, CheckTrainSlots : function(cityId,prestige){ var t = Tabs.Train; var Buildings = getCityBuildings(cityId); if (!prestige) { var barracks = Number(Buildings[13].count); var slots = 0; for (var k in Seed.queue_unt['city'+cityId]) { if(Seed.queue_unt['city'+cityId][k][7] == false) { slots += 1; } } } else { var barracks = Number(Buildings[22].count + Buildings[24].count + Buildings[26].count); //22 druid barracks, 24 fey barracks, 26 briton barracks var slots = 0; for (var k in Seed.queue_unt['city'+cityId]) { if(Seed.queue_unt['city'+cityId][k][7] == true) { slots += 1; } } } return (barracks>slots)?true:false; }, GetMorePopulation: function (idx) { var t = Tabs.Train; // This works one city behind, so if idx < 1, then it must be the end city if (idx<1) {idx=Cities.numCities; } var cityId = Seed.cities[idx-1][0]; var Buildings = getCityBuildings(cityId); var max_idle_pop = (parseInt(Seed.citystats['city'+cityId].pop[1])).toFixed(0); var cur_idle_pop = (parseInt(Seed.citystats['city'+cityId].pop[0])).toFixed(0); var barracks = parseInt(Buildings[13].count); var slots_used = 0; for (var k in Seed.queue_unt['city'+cityId]) { if(Seed.queue_unt['city'+cityId][k][7] == false) { slots_used += 1; } } var slots_free = parseInt(barracks-slots_used); var num = parseInt(max_idle_pop) - parseInt(cur_idle_pop); if (num == 0) return; // max pop // if no slots free, check if less than a min to go in current training queue... NearlyDone = false; var now = unixTime(); if ((slots_free <= 0) && (barracks != 0)) { var q = Seed.queue_unt['city'+cityId]; for(var i = 0; i0) { if ((slots_free > 0) || NearlyDone) { t.Fertilize(cityId); t.autodelay = t.intervalSecs; } return; } // auto dismiss... if (!Options.TrainOptions.AutoDismiss[idx]) { return; } var trooptype = 0; var to_dismiss = 0; if (Options.TrainOptions.DismissOther[idx] && (parseIntNan(Seed.units['city'+cityId]['unt'+Options.TrainOptions.DismissOtherType[idx]]) > parseIntNan(Options.TrainOptions.KeepOther[idx])) && (Options.TrainOptions.DismissOtherType[idx]!=0)) { trooptype = Options.TrainOptions.DismissOtherType[idx]; to_dismiss = parseIntNan(Seed.units['city'+cityId]['unt'+Options.TrainOptions.DismissOtherType[idx]]) - parseIntNan(Options.TrainOptions.KeepOther[idx]); } // Other else { if (Options.TrainOptions.DismissST[idx] && (parseIntNan(Seed.units['city'+cityId]['unt1']) > parseIntNan(Options.TrainOptions.KeepST[idx]))) { trooptype = 1; to_dismiss = parseIntNan(Seed.units['city'+cityId]['unt1']) - parseIntNan(Options.TrainOptions.KeepST[idx]); } // ST else { if (Options.TrainOptions.DismissMM[idx] && (parseIntNan(Seed.units['city'+cityId]['unt2']) > parseIntNan(Options.TrainOptions.KeepMM[idx]))) { trooptype = 2; to_dismiss = parseIntNan(Seed.units['city'+cityId]['unt2']) - parseIntNan(Options.TrainOptions.KeepMM[idx]); } // MM else { if (Options.TrainOptions.DismissSC[idx] && (parseIntNan(Seed.units['city'+cityId]['unt3']) > parseIntNan(Options.TrainOptions.KeepSC[idx]))) { trooptype = 3; to_dismiss = parseIntNan(Seed.units['city'+cityId]['unt3']) - parseIntNan(Options.TrainOptions.KeepSC[idx]); } // SC else { if (Options.TrainOptions.DismissPK[idx] && (parseIntNan(Seed.units['city'+cityId]['unt4']) > parseIntNan(Options.TrainOptions.KeepPK[idx]))) { trooptype = 4; to_dismiss = parseIntNan(Seed.units['city'+cityId]['unt4']) - parseIntNan(Options.TrainOptions.KeepPK[idx]); } // PK else { if (Options.TrainOptions.DismissSW[idx] && (parseIntNan(Seed.units['city'+cityId]['unt5']) > parseIntNan(Options.TrainOptions.KeepSW[idx]))) { trooptype = 5; to_dismiss = parseIntNan(Seed.units['city'+cityId]['unt5']) - parseIntNan(Options.TrainOptions.KeepSW[idx]); } // SW else { if (Options.TrainOptions.DismissAR[idx] && (parseIntNan(Seed.units['city'+cityId]['unt6']) > parseIntNan(Options.TrainOptions.KeepAR[idx]))) { trooptype = 6; to_dismiss = parseIntNan(Seed.units['city'+cityId]['unt6']) - parseIntNan(Options.TrainOptions.KeepAR[idx]); } // AR } } } } } } if (trooptype == 0) return; // none selected if (num > to_dismiss) { num = to_dismiss; } if (((slots_free > 0) || NearlyDone) && (num > 0) ) { t.Dismiss(cityId,trooptype,num); t.autodelay = t.intervalSecs; } }, PaintCityInfo : function () { var t = Tabs.Train; var cityId = t.ModelCityId; t.Squire = parseIntNan(Seed.items.i1); t.Knight = parseIntNan(Seed.items.i2); t.Guinevere = parseIntNan(Seed.items.i3); t.Morgana = parseIntNan(Seed.items.i4); t.Arthur = parseIntNan(Seed.items.i5); t.Merlin = parseIntNan(Seed.items.i6); t.Divine = parseIntNan(Seed.items.i7); t.Epic = parseIntNan(Seed.items.i8); t.Legendary = parseIntNan(Seed.items.i10); t.Lancelots = parseIntNan(Seed.items.i36); t.Arthurs = parseIntNan(Seed.items.i37); t.Merlins = parseIntNan(Seed.items.i38); ById('pbtrainUseSHLabel').innerHTML = t.Squire; ById('pbtrainUseKHLabel').innerHTML = t.Knight; ById('pbtrainUseGHLabel').innerHTML = t.Guinevere; ById('pbtrainUseMHLabel').innerHTML = t.Morgana; ById('pbtrainUseAHLabel').innerHTML = t.Arthur; ById('pbtrainUseRHLabel').innerHTML = t.Merlin; ById('pbtrainUseDHLabel').innerHTML = t.Divine; ById('pbtrainUseEHLabel').innerHTML = t.Epic; ById('pbtrainUseLHLabel').innerHTML = t.Legendary; ById('pbtrainUseLTLabel').innerHTML = t.Lancelots; ById('pbtrainUseATLabel').innerHTML = t.Arthurs; ById('pbtrainUseMTLabel').innerHTML = t.Merlins; if (cityId==0) { return; } if (t.serverwait) { return; } // paint the Queue... // training queue is combined - normal and prestige. That's insane. Let's split them! var Buildings = getCityBuildings(cityId); var now = unixTime(); var totTime = 0; var totTimeAscension = 0; t.Queued = 0; t.QueuedAscension = 0; t.TotalSlots = Buildings[13].count; t.TotalSlotsAscension = Buildings[22].count+Buildings[24].count+Buildings[26].count; var q = Seed.queue_unt['city' + cityId]; t.expireTheQueue(q); var q1 = []; var q2 = []; for (var u in q) { if (q[u][0]) { if (q[u][7]) { q2.push(q[u]); } else { q1.push(q[u]); } } } if (q1 != null && q1.length > 0) { totTime = q1[q1.length - 1][3] - now; t.Queued = q1.length; } if (q2 != null && q2.length > 0) { totTimeAscension = q2[q2.length - 1][3] - now; t.QueuedAscension = q2.length; } var qs = q.toString(); if (qs == t.LastQueue) { // queue hasn't changed, just update the time of the current item(s) if (q1 != null && q1.length > 0) { var cur = q1[0][3] - now; ById('btTrnQueueRemaining').innerHTML = timestr(cur, true); } if (q2 != null && q2.length > 0) { var cur = q2[0][3] - now; ById('btAscTrnQueueRemaining').innerHTML = timestr(cur, true); } if ((!q1 || q1.length==0) && (!q2 || q2.length==0)) { m = '
    '+tx('No Troops Currently Being Trained')+'
    '; ById('btTrnQueue').innerHTML = m; } } else { t.LastQueue = qs; m = ''; if (q1 != null && q1.length > 0) { m += ''; t.fixQueTimes(q1); first = true; var lastEnd = now; var r = 0; for (var i = 0; i < q.length; i++) { if (CM.BarracksUnitsTypeMap.isUnitType(q[i][0], "normal")) { start = q[i][2]; end = q[i][3]; actual = end - lastEnd; if (actual < 0) { actual = 0; } rowClass = 'evenRow'; if (r % 2 == 1) rowClass = 'oddRow'; if (first) rowClass += ' highRow'; m += ''; } else { m += timestr(actual, true) + ''; } m += '' lastEnd = end; first = false; r++; } } } if (q2 != null && q2.length > 0) { if (!q1 || q1.length==0) { m += '
    '+uW.g_js_strings.openCastle.trooptype+''+tx('Amount')+''+tx('Total Time')+''+tx('Remaining')+''+tx('Tuteleges')+''+tx('Hourglasses')+''+tx('Cancel All')+'
    '+TroopImage(q[i][0])+uW.unitcost["unt"+q[i][0]][0]+''+addCommas(q[i][1])+''; if (first) { var tutes = ''; tutes += t.dspHG(cityId,q[i][0],i,36,t.Lancelots); tutes += t.dspHG(cityId,q[i][0],i,37,t.Arthurs); tutes += t.dspHG(cityId,q[i][0],i,38,t.Merlins); tutes += '
    ' var Speedups = ''; Speedups += t.dspHG(cityId,q[i][0],i,1,t.Squire); Speedups += t.dspHG(cityId,q[i][0],i,2,t.Knight); Speedups += t.dspHG(cityId,q[i][0],i,3,t.Guinevere); Speedups += t.dspHG(cityId,q[i][0],i,4,t.Morgana); Speedups += t.dspHG(cityId,q[i][0],i,5,t.Arthur); Speedups += ''; Speedups += t.dspHG(cityId,q[i][0],i,6,t.Merlin); Speedups += t.dspHG(cityId,q[i][0],i,7,t.Divine); Speedups += t.dspHG(cityId,q[i][0],i,8,t.Epic); Speedups += t.dspHG(cityId,q[i][0],i,10,t.Legendary); Speedups += '
    ' m += timestr(end - start, true) + '
    ' + timestr(actual, true) + ''+tutes+''+Speedups+'   '+uW.g_js_strings.commonstr.cancel+'
    '; } else { m += ''; } t.fixQueTimes(q2); first = true; var lastEnd = now; var r = 0; for (var i = 0; i < q.length; i++) { if (!CM.BarracksUnitsTypeMap.isUnitType(q[i][0], "normal")) { start = q[i][2]; end = q[i][3]; actual = end - lastEnd; if (actual < 0) { actual = 0; } rowClass = 'evenRow'; if (r % 2 == 1) rowClass = 'oddRow'; if (first) rowClass += ' highRow'; m += ''; } else { m += timestr(actual, true) + ''; } m += '' lastEnd = end; first = false; r++; } } } if ((!q1 || q1.length==0) && (!q2 || q2.length==0)) { m = '
    '+tx('No Troops Currently Being Trained')+'
    '; } else { m += '
    '+tx('Ascension')+''+uW.g_js_strings.commonstr.amount+''+tx('Total Time')+''+tx('Remaining')+''+tx('Tuteleges')+''+tx('Hourglasses')+''+tx('Cancel All')+'
    '+tx('Ascension')+''+uW.g_js_strings.commonstr.amount+''+tx('Total Time')+''+tx('Remaining')+''+tx('Tuteleges')+''+tx('Hourglasses')+' 
    '+TroopImage(q[i][0])+uW.unitcost["unt"+q[i][0]][0]+''+addCommas(q[i][1])+''; if (first) { var tutes = ''; tutes += t.dspHG(cityId,q[i][0],i,36,t.Lancelots); tutes += t.dspHG(cityId,q[i][0],i,37,t.Arthurs); tutes += t.dspHG(cityId,q[i][0],i,38,t.Merlins); tutes += '
    ' var Speedups = ''; Speedups += t.dspHG(cityId,q[i][0],i,1,t.Squire); Speedups += t.dspHG(cityId,q[i][0],i,2,t.Knight); Speedups += t.dspHG(cityId,q[i][0],i,3,t.Guinevere); Speedups += t.dspHG(cityId,q[i][0],i,4,t.Morgana); Speedups += t.dspHG(cityId,q[i][0],i,5,t.Arthur); Speedups += ''; Speedups += t.dspHG(cityId,q[i][0],i,6,t.Merlin); Speedups += t.dspHG(cityId,q[i][0],i,7,t.Divine); Speedups += t.dspHG(cityId,q[i][0],i,8,t.Epic); Speedups += t.dspHG(cityId,q[i][0],i,10,t.Legendary); Speedups += '
    ' m += timestr(end - start, true) + '
    ' + timestr(actual, true) + ''+tutes+''+Speedups+'   '+uW.g_js_strings.commonstr.cancel+'
     
    '; } ById('btTrnQueue').innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } m = t.Queued+' '+uW.g_js_strings.commonstr.of+' '+t.TotalSlots; if (totTime > 0) m += ', ' + uW.timestr(totTime); ById('btTrnQueueStats').innerHTML = m; // paint info into the city panel... var unitId = ById('btTrnType').value; var unitOwned = getCityTroops(unitId,cityId,true); t.MaxTroopTrain = 0; if (t.CheckCanTrain(unitId,cityId)) { var workers = 0; if (Options.TrainOptions.ManualWorkers) workers = 100; t.MaxTroopTrain = t.getMaxTrain(unitId,cityId,false,workers,ById('btTrnGamble').value); } ById('btTrnMax').innerHTML = uW.g_js_strings.commonstr.max + ': ' + t.MaxTroopTrain + ', ' + uW.g_js_strings.commonstr.owned + ': ' + unitOwned; if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "normal")) { ById('btTrnMaxSlots').innerHTML = t.TotalSlots - t.Queued; } else { ById('btTrnMaxSlots').innerHTML = t.TotalSlotsAscension - t.QueuedAscension; } var slots = Math.max(parseIntNan(ById('btTrnNumSlots').value),0); ById('btTrnMaxPerSlot').innerHTML = parseIntNan(t.MaxTroopTrain / slots); // paint the requirements... t.paintRequirements(unitId); }, dspHG : function (cityId, qitem, i, item, count) { var t = Tabs.Train; var n = ''; if (count>0) { n += ''; } return n; }, paintRequirements : function (unitId) { var t = Tabs.Train; var cityId = t.ModelCityId; var m = ''; if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "rare")) { m += tx('Troop type cannot be trained'); ById('btTrnRequirements').innerHTML = m; return; } var ascended = getAscensionValues(cityId); if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "druid") && ascended.prestigeType!=1) { m += tx('Troop type can only be trained in Druid cities'); ById('btTrnRequirements').innerHTML = m; return; } if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "fey") && ascended.prestigeType!=2) { m += tx('Troop type can only be trained in Fey cities'); ById('btTrnRequirements').innerHTML = m; return; } if (CM.BarracksUnitsTypeMap.isUnitType(unitId, "briton") && ascended.prestigeType!=3) { m += tx('Troop type can only be trained in Briton cities'); ById('btTrnRequirements').innerHTML = m; return; } if (uW.unitcost['unt'+unitId][8] && matTypeof(uW.unitcost['unt'+unitId][8]) === "object") { var Buildings = getCityBuildings(cityId); for (var b in uW.unitcost['unt'+unitId][8]) { var bid = b.split("b")[1]; var reqlevel = uW.unitcost['unt'+unitId][8][b][1]; var blvl = Buildings[bid].maxLevel; var linestyle = ''; if (blvl < reqlevel) { linestyle = ''; m += linestyle+'Level '+reqlevel+' '+uW.buildingcost['bdg'+bid][0]+'
    '; } } } if (uW.unitcost['unt'+unitId][9] && matTypeof(uW.unitcost['unt'+unitId][9]) === "object") { for (var r in uW.unitcost['unt'+unitId][9]) { var rid = r.split("t")[1]; var reqlevel = uW.unitcost['unt'+unitId][9][r][1]; var rlvl = Seed.tech['tch'+rid]; var linestyle = ''; if (rlvl < reqlevel) { linestyle = ''; m += linestyle+'Level '+reqlevel+' '+uW.techcost['tch'+rid][0]+'
    '; } } } m += ''; if (uW.unitcost['unt'+unitId][6] != 0) { m += ''; } var gambleFactor = 1; if (ById('btTrnGamble').value > 0) gambleFactor = t.gamble[ById('btTrnGamble').value].cost; for (var r = 1; r < 5; r++) { if (uW.unitcost['unt'+unitId][r] != 0) { m += ''; } } if (uW.unitcost['unt'+unitId][11] && matTypeof(uW.unitcost['unt'+unitId][11]) === "object") { for (var r in uW.unitcost['unt'+unitId][11]) { var iid = r; var reqlevel = uW.unitcost['unt'+unitId][11][r]*parseIntNan(ById('btTrnNumPerSlot').value); var ilvl = parseIntNan(Seed.items['i'+iid]); var linestyle = ''; if ((ilvl <= reqlevel) || (iid==34001 && t.limitingFactor=="yew") || (iid==34003 && t.limitingFactor=="corrupter")) { linestyle = ''; } m += ''; } } m += '
    '; m += ResourceImage(PopulationImage,uW.g_js_strings.commonstr.population); var reqlevel = uW.unitcost['unt'+unitId][6]*parseIntNan(ById('btTrnNumPerSlot').value); if (Options.TrainOptions.ManualWorkers) { var plvl = parseIntNan(Seed.citystats["city" + cityId]["pop"][0]); } else { var plvl = parseIntNan(Seed.citystats["city" + cityId]["pop"][0]) - parseIntNan(Seed.citystats["city" + cityId]["pop"][3]); } var linestyle = ''; if ((plvl <= reqlevel) || (t.limitingFactor=="pop")) { linestyle = ''; } m += ''+linestyle+addCommas(reqlevel)+' / '+addCommas(plvl)+'
    '; if (r==1) { m += ResourceImage(FoodImage,uW.g_js_strings.commonstr.food); } else { if (r==2) { m += ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood); } else { if (r==3) { m += ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone); } else { if (r==4) { m += ResourceImage(OreImage,uW.g_js_strings.commonstr.ore); } } } } var reqlevel = uW.unitcost['unt'+unitId][r]*parseIntNan(ById('btTrnNumPerSlot').value)*gambleFactor; var rlvl = parseIntNan(Seed.resources['city'+cityId]['rec'+r][0]/3600); var linestyle = ''; if ((rlvl <= reqlevel) || (t.limitingFactor==uW.resourceinfo['rec'+r])) { linestyle = ''; } m += ''+linestyle+addCommas(reqlevel)+' / '+addCommas(rlvl)+'
    '+ResourceImage(getItemImageURL(iid),uW.itemlist['i'+iid].name)+''; m += linestyle+addCommas(reqlevel)+' / '+addCommas(ilvl)+'
    '; var perSlot = parseIntNan(ById('btTrnNumPerSlot').value); if (perSlot!=0) { var time = t.getTrainTime(cityId,unitId,perSlot); if (ById('btTrnGamble').value > 0) { var timemin = time * t.gamble[ById('btTrnGamble').value].factor1; var timemax = time * t.gamble[ById('btTrnGamble').value].factor2; m += '
    '+tx('Estimated Time')+': '+timestr(timemin)+' - '+timestr(timemax); } else { m += '
    '+tx('Estimated Time')+': '+timestr(time); } } ById('btTrnRequirements').innerHTML = m; }, cancelAll: function (cityId,silent) { var t = Tabs.Train; jQuery('#btTrnCancelAllButton').addClass("disabled"); var delayer = 0; var q = Seed.queue_unt['city' + cityId]; for (var i = q.length-1; i >= 0; i--) { delayer = delayer + 1; setTimeout (t.cancelTrain,(1000*delayer),q[i][0],q[i][1],q[i][2],q[i][3],q[i][5],cityId,i,silent); // spread them out ... } delayer = delayer + 1; setTimeout (function () { jQuery('#btTrnCancelAllButton').removeClass("disabled"); },(1000*delayer)); }, cancelTrain: function (typetrn, numtrptrn, trnTmp, trnETA, trnNeeded, cityId, trainingId,silent) { var t = Tabs.Train; t.serverwait = true; if (!silent) ById('btTrnQueueMessage').innerHTML = 'Cancelling Queued Item...'; var params = uW.Object.clone(uW.g_ajaxparams); params.pf = 0; params.requestType = "CANCEL_TRAINING"; params.cityId = cityId; params.typetrn = typetrn; params.numtrptrn = numtrptrn; params.trnETA = trnETA; params.trnTmp = trnTmp; params.trnNeeded = trnNeeded; new MyAjaxRequest(uW.g_ajaxpath + "ajax/cancelTraining.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var isPrestigeQueue = Seed.queue_unt["city" + cityId][trainingId][7]; var k = 0; for (var j = 0; j < Seed.queue_unt["city" + cityId].length; j++) { if (j > trainingId && (Seed.queue_unt["city" + cityId][j][7] === isPrestigeQueue)) { Seed.queue_unt["city" + cityId][j][2] = parseInt(rslt.dateTraining[k]["start"]); Seed.queue_unt["city" + cityId][j][3] = parseInt(rslt.dateTraining[k]["end"]); k++; } } Seed.queue_unt["city" + cityId].splice(trainingId, 1); for (var i = 1; i < 5; i++) { var totalReturn = parseInt(uW.unitcost["unt" + typetrn][i]) * parseInt(numtrptrn) * 3600 / 2; Seed.resources["city" + cityId]["rec" + i][0] = parseInt(Seed.resources["city" + cityId]["rec" + i][0]) + totalReturn; } t.PaintCityInfo(); } else { if (rslt.msg) { if (!silent) { ById('btTrnQueueMessage').innerHTML = ''+rslt.msg+''; }} else { if (!silent) { ById('btTrnQueueMessage').innerHTML = 'Error cancelling training queue item'; }} } t.serverwait = false; }, onFailure: function () { if (!silent) { ById('btTrnQueueMessage').innerHTML = 'AJAX Error!'; } t.serverwait = false; }, },true); }, getTrainTime : function (cityId,unitId,num) { return getTrainTime(unitId,num,cityId); }, Train : function (cityId, tut, gamble, unitId, num, notify) { var t = Tabs.Train; var citynum = Cities.byID[cityId].idx+1; jQuery('#btTrnCity_'+citynum).css('color', 'green'); var time = t.getTrainTime(cityId,unitId, num); var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.type = unitId; params.quant = num; params.items = tut; params.gambleId = gamble; new MyAjaxRequest(uW.g_ajaxpath + "ajax/train.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { actionLog(Cities.byID[cityId].name+': Training '+num+' '+uW.unitcost['unt'+unitId][0],'TRAINING'); var Prestige = (!CM.BarracksUnitsTypeMap.isUnitType(unitId, "normal")); var MORE_WITH_LESS_FACTOR = CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().MORE_WITH_LESS, cityId, uWCloneInto({ unitid : unitId })); var resourceFactors = []; var resourceLost; time = rslt.timeNeeded; for (var i = 1; i < 5; i++) { if (rslt.gamble) { resourceFactors.push(rslt.gamble[i.toString()]) } else { resourceFactors.push(1) } resourceLost = Math.ceil(parseInt(uW.unitcost["unt" + unitId][i]) * MORE_WITH_LESS_FACTOR) * 3600 * parseInt(num); resourceLost = resourceLost * parseIntNan(resourceFactors[i - 1]); Seed.resources["city" + cityId]["rec" + i][0] = parseInt(Seed.resources["city" + cityId]["rec" + i][0]) - resourceLost; } jQuery.each(uW.unitcost["unt" + unitId][11], function (itemId, itemQuantity) { uW.ksoItems[+itemId].subtract(+itemQuantity * num); uW.seed.items['i'+itemId] = parseInt(uW.seed.items['i'+itemId])-(itemQuantity*num); }); Seed.citystats["city" + cityId].gold[0] = parseInt(Seed.citystats["city" + cityId].gold[0]) - parseInt(uW.unitcost["unt" + unitId][5]) * parseInt(num); Seed.citystats["city" + cityId].pop[0] = Seed.citystats["city" + cityId].pop[0] - Math.ceil(parseInt(uW.unitcost["unt" + unitId][6]) * MORE_WITH_LESS_FACTOR) * parseInt(num); Seed.queue_unt["city" + cityId].push(uWCloneInto([unitId, num, rslt.initTS, parseInt(rslt.initTS) + rslt.timeNeeded, 0, rslt.timeNeeded, null,Prestige])); } else { if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Failed to train '+num+' '+uW.unitcost['unt'+unitId][0]+' ('+rslt.msg+')','TRAINING'); } else { actionLog(Cities.byID[cityId].name+': Failed to train '+num+' '+uW.unitcost['unt'+unitId][0]+' ('+rslt.error_code+')','TRAINING'); } } jQuery('#btTrnCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); if (notify) { notify(rslt); } }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Failed to train '+num+' '+uW.unitcost['unt'+unitId][0]+' (Ajax Error)','TRAINING'); jQuery('#btTrnCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); if (notify) { notify({msg: 'AJAX error'}); } }, },true); // noretry }, Dismiss : function (cityId,unitId,num) { var t = Tabs.Train; var citynum = Cities.byID[cityId].idx+1; jQuery('#btTrnCity_'+citynum).css('color', 'red'); var cur_idle_pop = (parseInt(Seed.citystats['city'+cityId].pop[0])).toFixed(0); // manually keep track of pop, because the server can't seem to do it var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.type = unitId; params.quant = num; new MyAjaxRequest(uW.g_ajaxpath + "ajax/dismissUnits.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function(rslt) { if (rslt.ok) { actionLog(Cities.byID[cityId].name+': Dismissed '+addCommas(num)+' '+uW.unitcost['unt'+unitId][0],'TRAINING'); Seed.units['city'+cityId]['unt'+unitId] -= parseInt(num); Seed.citystats['city'+cityId].pop[0] = parseInt(cur_idle_pop)+parseInt(num); // manually add pop because server doesn't always return pop correctly } else { if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Failed to dismiss '+num+' '+uW.unitcost['unt'+unitId][0]+' ('+rslt.msg+')','TRAINING'); } else { actionLog(Cities.byID[cityId].name+': Failed to dismiss '+num+' '+uW.unitcost['unt'+unitId][0]+' ('+rslt.error_code+')','TRAINING'); } } jQuery('#btTrnCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Failed to dismiss '+num+' '+uW.unitcost['unt'+unitId][0]+' (Ajax Error)','TRAINING'); jQuery('#btTrnCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, },true); }, Fertilize : function (cityId) { var t = Tabs.Train; var citynum = Cities.byID[cityId].idx+1; jQuery('#btTrnCity_'+citynum).css('color', 'magenta'); var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; new MyAjaxRequest(uW.g_ajaxpath + "ajax/fertilizePeople.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { actionLog(Cities.byID[cityId].name+': Fertile Winds used','TRAINING'); uW.ksoItems[351].subtract(); Seed.items.i351 = (parseInt(Seed.items.i351) - 1).toString(); t.PaintOverview(); t.PaintCityInfo(); } else { if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Failed to use Fertile Winds ('+rslt.msg+')','TRAINING'); } else { actionLog(Cities.byID[cityId].name+': Failed to use Fertile Winds ('+rslt.error_code+')','TRAINING'); } } jQuery('#btTrnCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Failed to use Fertile Winds (Ajax Error)','TRAINING'); jQuery('#btTrnCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); } },true); }, speedupTraining: function (cityId, unitId, itemId, trainingId, auto) { var t = Tabs.Train; t.serverwait = true; if (!auto && ById('btTrnQueueMessage')) ById('btTrnQueueMessage').innerHTML = 'Speeding up Training...'; var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.iid = itemId; params.uid = unitId; params.apothecary = false; new AjaxRequest(uW.g_ajaxpath + "ajax/speedupTraining.php" + uW.g_ajaxsuffix, { // don't use MyAjaxRequest here, for some reason it fails method: "post", parameters: params, onSuccess: function (transport) { var rslt = eval("(" + transport.responseText + ")"); if (rslt.ok) { Seed.queue_unt["city" + cityId][trainingId][2] = parseInt(rslt.dateTrainingStart); Seed.queue_unt["city" + cityId][trainingId][3] = parseInt(rslt.dateTraining); Seed.items["i" + itemId] = parseInt(Seed.items["i" + itemId]) - 1; uW.ksoItems[itemId].subtract(); if (rslt.updateCityUnits) { var a = rslt.updateCityUnits; var g = Object.keys(a); for (var c = 0; c < g.length; c++) { var f = Object.keys(a[g[c]]); var e = g[c].split("c")[1]; for (var b = 0; b < f.length; b++) { var d = f[b].split("u")[1]; Seed.units["city" + e]["unt" + d] = parseInt(a[g[c]][f[b]]) } } } if (!auto) t.PaintCityInfo(); } else { if (rslt.msg) { if (!auto && ById('btTrnQueueMessage')) { ById('btTrnQueueMessage').innerHTML = ''+rslt.msg+''; } else { actionLog(Cities.byID[cityId].name+": "+rslt.msg,'TRAINING'); } } else { if (!auto && ById('btTrnQueueMessage')) { ById('btTrnQueueMessage').innerHTML = 'Error speeding up training'; } else { actionLog(Cities.byID[cityId].name+": Error speeding up training",'TRAINING'); } } } t.serverwait = false; }, onFailure: function () { if (!auto && ById('btTrnQueueMessage')) { ById('btTrnQueueMessage').innerHTML = 'AJAX Error!'; } else { actionLog(Cities.byID[cityId].name+": AJAX Error!",'TRAINING'); } t.serverwait = false; }, },true); }, } /** Crafting Tab **/ Tabs.Craft = { tabLabel: 'Craft', tabOrder: 2020, tabColor : 'brown', myDiv: null, timer: null, LoopCounter: 0, citydelay: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, intervalSecs : 5, autodelay : 0, loopaction : false, craftinfo : {}, spires : [], InstantCrafts : {}, craftingspeed : 0, totaether : 0, Squire:0, Knight:0, Guinevere:0, Morgana:0, Arthur:0, ItemList : [1, 2, 3, 4, 5], ItemTrans : ["SH","KH","GH","MH","AH"], tableau : [], EliteRecipes : ['154','156','158','160','162','164','166','168','170','172','174'], TrainingRecipes : ['153','155','157','159','161','163','165','167','169','171','173'], Categories : [1,3,8,9,10], CategoryNames : {1:"General",3:"Combat",8:"Alliance",9:"Items",10:"Boxes"}, Options: { Running: false, ThroneCheck: false, BasicCheck: false, CraftingSpeed: 0, MinAether : 5000, Enabled : {1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true}, Preferred : {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, RecipeNumbers : {}, RecipeFixed : {}, RecipeStats : {}, UseAH : false, UseMH : false, UseGH : false, UseKH : false, UseSH : false, UseOverride : false, OverrideItem : 0, OverrideHours : 0, OverrideMinutes : 1, Toggle : false, }, init: function (div) { var t = Tabs.Craft; t.myDiv = div; if (!Options.CraftOptions) { Options.CraftOptions = t.Options; } else { for (var y in t.Options) { if (!Options.CraftOptions.hasOwnProperty(y)) { Options.CraftOptions[y] = t.Options[y]; } } } uWExportFunction('speedupCraft', Tabs.Craft.speedupCraft); if (Options.CraftOptions.Toggle) AddSubTabLink('AutoCraft',t.toggleAutoCraftState, 'CraftToggleTab'); SetToggleButtonState('Craft',Options.CraftOptions.Running,'Craft'); for(var i=t.Categories.length-1;i>=0;i--) { if (!uW.recipelist[t.Categories[i]]) t.Categories.splice(i,1); } for(var j in uW.recipelist) { for(var i=0; i < uW.recipelist[j].length; i++){ if (parseIntNan(uW.recipelist[j][i].craftable)==1) { var h = parseInt(uW.recipelist[j][i].recipe_id); t.craftinfo[h] = {}; t.craftinfo[h].recipe_id = uW.recipelist[j][i].recipe_id; t.craftinfo[h].name = uW.recipelist[j][i].name; t.craftinfo[h].category = uW.recipelist[j][i].category; t.craftinfo[h].input = uW.recipelist[j][i].input; t.craftinfo[h].requirements = uW.recipelist[j][i].requirements; t.craftinfo[h].inputItems = uW.recipelist[j][i].input.items; t.craftinfo[h].resources = uW.recipelist[j][i].input.resources; t.craftinfo[h].odds = uW.recipelist[j][i].failure_chance; t.craftinfo[h].dailylimit = uW.recipelist[j][i].daily_limit; t.craftinfo[h].lifetimelimit = uW.recipelist[j][i].life_time_limit; t.craftinfo[h].output_item_id = uW.recipelist[j][i].output_item_id; }; } } for (var h in t.craftinfo) { // fix resources array for pre-HQ (remove this later) if (t.craftinfo[h].resources[5]==null) { t.craftinfo[h].resources[5] = t.craftinfo[h].resources[6]; t.craftinfo[h].resources[1] = 0; t.craftinfo[h].resources[2] = 0; t.craftinfo[h].resources[3] = 0; t.craftinfo[h].resources[4] = 0; t.craftinfo[h].resources[6] = 0; } } for (var h in Options.CraftOptions.RecipeNumbers) { if (t.craftinfo[h]==null) { delete Options.CraftOptions.RecipeNumbers[h]; delete Options.CraftOptions.RecipeFixed[h]; delete Options.CraftOptions.RecipeStats[h]; } } for(i=0; i'; m += '
    '; m += '
     '+tx("Add toggle button to main screen header")+''+tx('Current Crafting Speed')+':   
    '; m += ''; m += ''; m += '
    '+tx('Only craft when crafting speed is at least')+'  %'+tx('Minimum Aetherstone')+':   
    '+tx('Ignore above setting for basic crafts (e.g. bloodstones)')+'
    '; m += '
    '; m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ""; // spacer m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; var recipes = {0:'-- '+tx('Random')+' --'}; for (var h in t.craftinfo) { var o = t.craftinfo[h].output_item_id; recipes[h] = uW.itemlist["i"+o].name; if (h==179) recipes[h] = recipes[h]+' ('+tx('Lower')+')'; if (h==180) recipes[h] = recipes[h]+' ('+tx('Higher')+')'; if (o==30800) recipes[h] = recipes[h]+' ('+t.craftinfo[h].name+')'; if (t.EliteRecipes.indexOf(h)!=-1) recipes[h] = recipes[h]+' ('+tx('Elite')+')'; if (t.TrainingRecipes.indexOf(h)!=-1) recipes[h] = recipes[h]+' ('+tx('Train')+')'; } for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += '
      '+Cities.cities[i-1].name.substring(0, 12)+' 
    '+tx('Active')+' 
    '+tx('Preferred Recipe')+' '+htmlSelector(recipes,Options.CraftOptions.Preferred[i],'class='+i+' id=btCraftPrefCity_'+i+' style="width:100px;font-size:9px;"')+'
    '+tx('Activity')+' 
     
     
     
    '; m += '
    '+tx('USE AUTO-SPEEDUPS')+'
    '; m += ''; Boosts += ''; m += Boosts+'
    '; var Boosts = ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += ''; Boosts += ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += '
    (' + parseIntNan(uW.ksoItems[t.ItemList[i]].count) + ')
    '+tx('Override above by always using')+' '+htmlSelector(HourGlassName,Options.CraftOptions.OverrideItem, 'id=pbcraftOVItem') + ' '+tx('when more than')+' '; Boosts += ' '+uW.g_js_strings.timestr.timehr+'  '+uW.g_js_strings.timestr.timemin+' '+tx('remaining')+'.

    '; m += '
    '+tx('RECIPE LIST')+'
    '; m += '
      '; for (var i=0;i'+tx(t.CategoryNames[CAT])+''; } m += '
    '; for (var i=0;i
    '; m += ''; m += ''; m += ''; m += ''; var r = 0; var count = 0; for (var h in t.craftinfo) { if (t.craftinfo[h].category==CAT) { var o = t.craftinfo[h].output_item_id; var itemname = uW.itemlist['i'+o].name; if (h==179) itemname = itemname+' ('+tx('Lower')+')'; if (h==180) itemname = itemname+' ('+tx('Higher')+')'; if (o==30800) itemname = itemname+' ('+t.craftinfo[h].name+')'; if (t.EliteRecipes.indexOf(h)!=-1) itemname = itemname+' ('+tx('Elite')+')'; if (t.TrainingRecipes.indexOf(h)!=-1) itemname = itemname+' ('+tx('Train')+')'; m += ''; m += ''; if ((count+1)%2 == 0) { if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } m += ''; } count++; } } m += '
     '+uW.g_js_strings.commonstr.item+''+uW.g_js_strings.commonstr.inventory+''+uW.g_js_strings.commonstr.amount+''+tx('Lock')+''+tx('Success')+' '+uW.g_js_strings.commonstr.item+''+uW.g_js_strings.commonstr.inventory+''+uW.g_js_strings.commonstr.amount+''+tx('Lock')+''+tx('Success')+'
    '+itemname+'  
    '; } m += '

    ' div.innerHTML = m; jQuery("#btRecipeList").tabs({ activate: function (event, ui) { ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); } }); for (var i = 1; i <= Cities.numCities; i++) { ById('btCraftAutoCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.CraftOptions.Enabled[citynum] = e.target.checked; if (Options.CraftOptions.Enabled[citynum]) { t.citydelay[i] = 0; t.timer = setTimeout(function () { t.doAutoLoop(Number(citynum));}, 0); } saveOptions(); }, false); ById('btCraftPrefCity_'+i).addEventListener('change', function(e){ Options.CraftOptions.Preferred[e.target['className']] = e.target.value; saveOptions(); }, false); } ToggleOption('CraftOptions','btCraftToggle','Toggle'); ToggleOption('CraftOptions','pbcraftSH','UseSH'); ToggleOption('CraftOptions','pbcraftKH','UseKH'); ToggleOption('CraftOptions','pbcraftGH','UseGH'); ToggleOption('CraftOptions','pbcraftMH','UseMH'); ToggleOption('CraftOptions','pbcraftAH','UseAH'); ToggleOption('CraftOptions','pbcraftOV','UseOverride'); ChangeIntegerOption('CraftOptions','pbcraftOVItem','OverrideItem'); ChangeIntegerOption('CraftOptions','pbcraftOVHours','OverrideHours'); ChangeIntegerOption('CraftOptions','pbcraftOVMinutes','OverrideMinutes'); ById ('pbCraftHelp').addEventListener ('click', t.helpPop, false); ById('btAutoCraftState').addEventListener('click', function(){ t.toggleAutoCraftState(this); }, false); ToggleOption('CraftOptions','btCraftTR','ThroneCheck'); ToggleOption('CraftOptions','btCraftBasic','BasicCheck'); ChangeIntegerOption('CraftOptions','btCraftTRSpeed','CraftingSpeed'); ChangeIntegerOption('CraftOptions','btCraftMinAether','MinAether'); for (var h in t.craftinfo) { ById('btCraftNum_'+h).addEventListener('change', function(e){ var craftnum = e.target['className']; if (isNaN(e.target.value)) e.target.value = ''; Options.CraftOptions.RecipeNumbers[craftnum] = e.target.value; saveOptions(); }, false); ById('btCraftFixed_'+h).addEventListener('change', function(e){ var craftnum = e.target['className']; Options.CraftOptions.RecipeFixed[craftnum] = e.target.checked; saveOptions(); }, false); } // start autocraft loop timer to start in 20 seconds... if (Options.CraftOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(1);}, (20 * 1000)); } }, toggleAutoCraftState: function(obj){ var t = Tabs.Craft; obj = ById('btAutoCraftState'); if (Options.CraftOptions.Running == true) { Options.CraftOptions.Running = false; obj.value = tx("AutoCraft = OFF"); } else { Options.CraftOptions.Running = true; obj.value = tx("AutoCraft = ON"); t.timer = setTimeout(function () { t.doAutoLoop(1);}, 0); } saveOptions(); SetToggleButtonState('Craft',Options.CraftOptions.Running,'Craft'); t.citydelay = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}; t.PaintOverview(); }, show: function (init) { var t = Tabs.Craft; t.PaintOverview(); t.PaintRecipeList(); }, createToolTip : function (elem) { var t = Tabs.Craft; var h = elem.id.substring(12); var recipeId = t.craftinfo[h].recipe_id; var name = t.craftinfo[h].name; var category = t.craftinfo[h].category; var input = t.craftinfo[h].input; var requirements = t.craftinfo[h].requirements.building; var inputitems = t.craftinfo[h].inputItems; var astone = t.craftinfo[h].resources[5]; var food = t.craftinfo[h].resources[1]; var wood = t.craftinfo[h].resources[2]; var stone = t.craftinfo[h].resources[3]; var ore = t.craftinfo[h].resources[4]; var gold = t.craftinfo[h].resources[6]; var odds = t.craftinfo[h].odds; var ingredients = ''; for (var i in inputitems) { if (i>0) { span = ''; if (parseIntNan(Seed.items['i'+i]) < inputitems[i]) span = ''; ingredients += span + uW.itemlist['i'+i].name +' : '+inputitems[i]+'
    '; } } if (food!=0) { ingredients += '' + uW.g_js_strings.commonstr.food +' : '+addCommas(food)+'
    '; } if (wood!=0) { ingredients += '' + uW.g_js_strings.commonstr.wood +' : '+addCommas(wood)+'
    '; } if (stone!=0) { ingredients += '' + uW.g_js_strings.commonstr.stone +' : '+addCommas(stone)+'
    '; } if (ore!=0) { ingredients += '' + uW.g_js_strings.commonstr.ore +' : '+addCommas(ore)+'
    '; } if (gold!=0) { ingredients += '' + uW.g_js_strings.commonstr.gold +' : '+addCommas(gold)+'
    '; } if (ingredients != '') ingredients = ''+tx('Ingredients')+'
    ' + ingredients; var limits = ''; if (parseIntNan(t.craftinfo[h].dailylimit) != 0) { span = ''; if (uW.recipeUsageList[category] && uW.recipeUsageList[category][recipeId]) { if (parseIntNan(uW.recipeUsageList[category][recipeId].dailyUsage)>=parseIntNan(t.craftinfo[h].dailylimit)) span = ''; } limits += span + ''+tx('Daily Limit')+' : '+parseIntNan(t.craftinfo[h].dailylimit)+'
    '; } if (parseIntNan(t.craftinfo[h].lifetimelimit) != 0) { span = ''; if (uW.recipeUsageList[category] && uW.recipeUsageList[category][recipeId]) { if (parseIntNan(uW.recipeUsageList[category][recipeId].lifeTimeUsage)>=parseIntNan(t.craftinfo[h].lifetimelimit)) span = ''; } limits += span + ''+tx('Lifetime Limit')+' : '+parseIntNan(t.craftinfo[h].lifetimelimit)+'
    '; } jQuery('#'+elem.id).children("span").remove(); jQuery('#'+elem.id).append(''+tx('Recipe Name')+'
    ' +name+' ('+odds+')
    '+uW.g_js_strings.commonstr.requirements+'
    Spire Lv.'+requirements+'
    '+uW.g_js_strings.commonstr.aetherstone+' : '+addCommas(astone)+'
    '+ingredients+'
    '+limits+'
    '); }, helpPop : function (){ var t = Tabs.Craft; var helpText = '
    '+tx("Using Speedups for Crafting"); helpText += '

    '+tx('Speedups will be used in the following order if they are selected, and the required criteria is met')+' :-

    '; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += '
    '+uW.g_js_strings.commonstr.item+''+uW.g_js_strings.commonstr.time+''+tx('Criteria')+'
    '+uW.itemlist.i5.name+'8 hrs'+tx('More than 7 hours 30 minutes remaining')+'
    '+uW.itemlist.i4.name+'2.5 hrs'+tx('More than 2 hours remaining')+'
    '+uW.itemlist.i3.name+'1 hr'+tx('More than 45 minutes remaining')+'
    '+uW.itemlist.i2.name+'15 mins'+tx('More than 5 minutes remaining')+'
    '+uW.itemlist.i1.name+'1 min'+tx('More than 30 seconds remaining')+'
    '; helpText += '

    '+tx('If the override box is ticked, then the override rule specified will take priority')+'.


    '; var pop = new CPopup ('BotHelp', 0, 0, 460, 280, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Speedups")+'
    '; pop.show (true); }, EverySecond : function () { var t = Tabs.Craft; t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh crafting speed and overview display every 2 seconds t.craftingspeed = Math.floor(equippedthronestats(81)+equippedthronestats(165)); if (tabManager.currentTab.name == 'Craft' && Options.btWinIsOpen){ t.PaintOverview(); } } if (t.LoopCounter >= 5) { // refresh recipe and spires display every 5 seconds t.LoopCounter = 0; for(i=0; i'; var str = ''; var SpireLevel = t.spires[i].maxLevel; if (SpireLevel > 0) { str = ''+uW.g_js_strings.prestige.spire+' ('+uW.g_js_strings.commonstr.level+' '+SpireLevel+')
    '; var totTime = 0; // the last item in the queue should be the item in progress var len = Seed.queue_craft["city" + Cities.cities[i].id].length; if ( len > 0) { q = Seed.queue_craft["city" + Cities.cities[i].id][len-1]; totTime = q.craftingEtaUnixTime - now; if (totTime < 0) totTime = 0; } if (totTime > 0) { var Speedups = ''; Speedups += t.dspHG(Cities.cities[i].id,q.craftingId,1,t.Squire); Speedups += t.dspHG(Cities.cities[i].id,q.craftingId,2,t.Knight); Speedups += t.dspHG(Cities.cities[i].id,q.craftingId,3,t.Guinevere); Speedups += t.dspHG(Cities.cities[i].id,q.craftingId,4,t.Morgana); Speedups += t.dspHG(Cities.cities[i].id,q.craftingId,5,t.Arthur); if (Speedups != "") Speedups = "" + Speedups + "
    "; str += ''+t.getRecipeName(q.recipeId)+'
    '+timestr(totTime)+''+Speedups; } else { if (t.citydelay[citynum] > 0) { str += ' 
    '+tx('Busy')+'!'; } else { if (Options.BuildOptions && Options.BuildOptions.AscensionReady[citynum]) { str += ' 
    '+tx('Ascension')+'!'; } else { str += ' 
    '+tx('Idle')+''; } } } } else { str = ''+tx('No Spire')+'
    '; } ById("btCraftSpireCity_"+citynum).innerHTML = str; } ById('btTotAether').innerHTML = addCommas(t.totaether); if (Options.CraftOptions.ThroneCheck && (t.craftingspeed < Number(Options.CraftOptions.CraftingSpeed))) { ts = ''+t.craftingspeed+'%'; } else { ts = t.craftingspeed+'%'; } ById("btCraftCurrTR").innerHTML = ts; }, dspHG : function (cityId, qitem, item, count) { var t = Tabs.Craft; var n = ''; if (count>0) { n += ''; } return n; }, PaintRecipeList : function () { var t = Tabs.Craft; for(var h in t.craftinfo) { var o = t.craftinfo[h].output_item_id; var craftingstr = ""; var crafting = t.checkCraftQueues(h); if (crafting != 0) craftingstr = " ("+crafting+")"; ById('btCraftStats_'+h).innerHTML=t.getCraftPercent(Options.CraftOptions.RecipeStats[h]); var invamount = parseIntNan(Seed.items["i"+o]); var span = '' if (Options.CraftOptions.RecipeFixed[h] && parseIntNan(Options.CraftOptions.RecipeNumbers[h])>0 && parseIntNan(Options.CraftOptions.RecipeNumbers[h])<=invamount+crafting) { span = ''; } ById('btCraftInv_'+h).innerHTML=span+invamount+craftingstr+''; } var cItems = ById('btRecipeList').getElementsByClassName('tooldesc'); for (var i = 0; i < cItems.length; i++) { t.createToolTip(cItems[i]); } }, getCraftPercent : function (item) { var t = Tabs.Craft; if (item) { var succ = item[0]; var tot = item[1]; if (parseIntNan(tot) != 0) { return parseInt((parseIntNan(succ)/parseIntNan(tot))*10000)/100+'%'; } else { return " "; } } else {return " "; } }, checkCraftQueues : function (h,expired) { var t = Tabs.Craft; var result = 0; var now = unixTime(); for (var i=0;i0 && ((Seed.queue_craft["city" + Seed.cities[i][0]][len-1].craftingEtaUnixTime - now) > 0)) { // don't display completed crafts here! var q=Seed.queue_craft["city" + Seed.cities[i][0]][len-1]; if (parseInt(q.recipeId) == parseInt(t.craftinfo[h].recipe_id)) {result++;} } } return result; }, checkCraftQueuesByItem : function (o) { var t = Tabs.Craft; var result = 0; for (var i=0;i0) { var q=Seed.queue_craft["city" + Seed.cities[i][0]][len-1]; if (t.craftinfo[q.recipeId] && parseInt(t.craftinfo[q.recipeId].output_item_id) == parseInt(o)) {result++;} } } if (t.InstantCrafts[o]) { result += t.InstantCrafts[o][1]; } // completed instant crafts return result; }, getRecipeName : function(recipeId) { var t = Tabs.Craft; var name = ""; for(var h in t.craftinfo) { if (parseInt(t.craftinfo[h].recipe_id) == parseInt(recipeId)) { name = t.craftinfo[h].name; break; } } if (name.length>16) { return name.substring(0,16)+'...'; } else { return name; } }, doAutoLoop : function (idx) { var t = Tabs.Craft; clearTimeout(t.timer); if (!Options.CraftOptions.Running) return; var cityId = Cities.cities[idx-1].id; if (idx==1) { t.loopaction = false; } // reset loop action indicator for first city t.autodelay = 0; // no delay if no action taken! // first check if city is idle (or busy) var now = unixTime(); var len = Seed.queue_craft["city" + cityId].length; if ((len==0 || (Seed.queue_craft["city" + cityId][len-1].craftingEtaUnixTime - now) < 0)) { if (!Options.CraftOptions.ThroneCheck || Options.CraftOptions.BasicCheck || (t.craftingspeed >= Options.CraftOptions.CraftingSpeed)) { // if no craft speed restriction or enough crafting speed or ignore speed for basic crafts var ascensionok = (!Options.BuildOptions || !Options.BuildOptions.AscensionReady[idx]); if (Options.CraftOptions.Enabled[idx] && ascensionok) { if (t.citydelay[idx] > 0) { t.citydelay[idx]--; } // city being delayed due to error, reduce delay number and skip city else { var SpireLevel = t.spires[idx-1].maxLevel; if (SpireLevel > 0) { if (parseIntNan(Seed.resources["city" + cityId]['rec5'][0])>=Options.CraftOptions.MinAether) { t.eventSelectRecipe(cityId,idx); } } } } } } else { if (len!=0) { t.autoSpeedup (cityId,Seed.queue_craft["city" + cityId][len-1]); } } if (idx == Cities.numCities) { if (!t.loopaction) { t.autodelay = t.intervalSecs; } // if no action this loop, apply delay anyway... t.timer = setTimeout(function () { t.doAutoLoop(1); }, (t.autodelay * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1); }, (t.autodelay * 1000)); } }, eventSelectRecipe : function (cityId,idx) { var t = Tabs.Craft; t.tableau = []; if (Options.CraftOptions.Preferred[idx] != 0) { // attempt to craft preferred recipe t.checkRequirements(Options.CraftOptions.Preferred[idx],cityId,idx); } if (t.tableau.length == 0) { // preferred not available for(var d in Options.CraftOptions.RecipeNumbers) { t.checkRequirements(d,cityId,idx); } } if (t.tableau.length == 0) return ; // nothing to craft // do craft! var h = t.tableau[Math.floor(Math.random()*t.tableau.length)]; var itemId = t.craftinfo[h].output_item_id; var recipeId = t.craftinfo[h].recipe_id; var category = t.craftinfo[h].category; t.autodelay = t.intervalSecs; t.loopaction = true; t.Craft(idx, cityId, itemId, recipeId, category, h); }, checkRequirements : function(d,cityId,idx) { var t = Tabs.Craft; if (t.craftinfo[d]) { // recipe may have been taken away! // first check daily/lifetime limits var recipeId = t.craftinfo[d].recipe_id; var category = t.craftinfo[d].category; var o = t.craftinfo[d].output_item_id; if (uW.recipeUsageList[category] && uW.recipeUsageList[category][recipeId]) { if (parseIntNan(t.craftinfo[d].dailylimit) != 0 && parseIntNan(uW.recipeUsageList[category][recipeId].dailyUsage)>=parseIntNan(t.craftinfo[d].dailylimit)) { return; } if (parseIntNan(t.craftinfo[d].lifetimelimit) != 0 && parseIntNan(uW.recipeUsageList[category][recipeId].lifeTimeUsage)>=parseIntNan(t.craftinfo[d].lifetimelimit)) { return; } } if ((!Options.CraftOptions.RecipeFixed[d] && (parseIntNan(Options.CraftOptions.RecipeNumbers[d])>0)) || (Options.CraftOptions.RecipeFixed[d] && (parseIntNan(Options.CraftOptions.RecipeNumbers[d])>parseIntNan(Seed.items["i"+o])+t.checkCraftQueuesByItem(o)))) { var ResourceOK = true; if (parseIntNan(t.craftinfo[d].resources[1]) > parseIntNan(Seed.resources["city" + cityId]['rec1'][0])) ResourceOK = false; if (parseIntNan(t.craftinfo[d].resources[2]) > parseIntNan(Seed.resources["city" + cityId]['rec2'][0])) ResourceOK = false; if (parseIntNan(t.craftinfo[d].resources[3]) > parseIntNan(Seed.resources["city" + cityId]['rec3'][0])) ResourceOK = false; if (parseIntNan(t.craftinfo[d].resources[4]) > parseIntNan(Seed.resources["city" + cityId]['rec4'][0])) ResourceOK = false; if (parseIntNan(t.craftinfo[d].resources[6]) > parseIntNan(Seed.citystats["city" + cityId]['gold'][0])) ResourceOK = false; if (ResourceOK && parseIntNan(Seed.resources["city" + cityId]['rec5'][0]) >= parseIntNan(t.craftinfo[d].resources[6])) { if (parseInt(t.craftinfo[d].requirements.building) <= parseInt(t.spires[idx-1].maxLevel)) { if (t.craftinfo[d].inputItems == "") { // "base items" t.tableau.push (d); } else { if (!Options.CraftOptions.ThroneCheck || (t.craftingspeed >= Options.CraftOptions.CraftingSpeed)) { // if no craft speed restriction or enough crafting speed for (var i in t.craftinfo[d].inputItems) { if (parseIntNan(Seed.items["i"+i]) < parseInt(t.craftinfo[d].inputItems[i])) { break; } } if (parseIntNan(Seed.items["i"+i]) >= parseInt(t.craftinfo[d].inputItems[i])) { t.tableau.push (d); } } } } } } } }, autoSpeedup: function (cityId,q) { var t = Tabs.Craft; var now = unixTime(); var item = 0; totTime = q.craftingEtaUnixTime - now; if (totTime > 0) { if (Options.CraftOptions.UseOverride && Options.CraftOptions.OverrideItem != 0) { var THRESHOLD_SECONDS = (parseIntNan(Options.CraftOptions.OverrideMinutes)*60)+(parseIntNan(Options.CraftOptions.OverrideHours)*60*60); if (totTime >= THRESHOLD_SECONDS && uW.ksoItems[Options.CraftOptions.OverrideItem].count > 0) { item = Options.CraftOptions.OverrideItem; } } if (item==0 && totTime >= HGLimit[4] && Options.CraftOptions.UseAH && uW.ksoItems[5].count > 0) { item = 5; } if (item==0 && totTime >= HGLimit[3] && Options.CraftOptions.UseMH && uW.ksoItems[4].count > 0) { item = 4; } if (item==0 && totTime >= HGLimit[2] && Options.CraftOptions.UseGH && uW.ksoItems[3].count > 0) { item = 3; } if (item==0 && totTime >= HGLimit[1] && Options.CraftOptions.UseKH && uW.ksoItems[2].count > 0) { item = 2; } if (item==0 && totTime >= HGLimit[0] && Options.CraftOptions.UseSH && uW.ksoItems[1].count > 0) { item = 1; } } if (item != 0) { t.autodelay = t.intervalSecs; t.speedupCraft(cityId,item,q.craftingId); } }, Craft: function (citynum, cityId, itemId, recipeId, category, h) { var t = Tabs.Craft; jQuery('#btCraftCity_'+citynum).css('color', 'green'); // set up success stats if first time crafted this item.. if (!Options.CraftOptions.RecipeStats[h]) { Options.CraftOptions.RecipeStats[h] = [0,0]; saveOptions(); } var params = uW.Object.clone(uW.g_ajaxparams); params.action="craft"; params.ctrl="Crafting"; params.cityId=cityId; params.insurance=false; params.itemId=itemId; params.recipeId=recipeId; params.categoryId=category; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, loading: true, onSuccess: function (rslt) { if (rslt.ok===true) { if (rslt.status=="error") { // crafting error actionLog (Cities.byID[cityId].name+': Error ('+rslt.errorCode+') when attempting to craft '+uW.itemlist["i"+itemId].name,'CRAFTING'); if (rslt.errorCode == 2) { // server busy? delay 2 loops t.citydelay[citynum] = 2; } if (rslt.errorCode == 6) { // city already crafting? delay 10 loops t.citydelay[citynum] = 10; } } else { if (rslt.status=="hitlimit") { //hit daily/lifetime limit actionLog (Cities.byID[cityId].name+': Crafting Limit reached for '+uW.itemlist["i"+itemId].name,'CRAFTING'); uW.recipeUsageList[category][recipeId].dailyUsage = parseIntNan(t.craftinfo[h].dailylimit); // fix! } else { Seed.resources['city'+cityId].rec1[0]=parseInt(Seed.resources['city'+cityId].rec1[0] - parseIntNan(t.craftinfo[h].resources[1])); Seed.resources['city'+cityId].rec2[0]=parseInt(Seed.resources['city'+cityId].rec2[0] - parseIntNan(t.craftinfo[h].resources[2])); Seed.resources['city'+cityId].rec3[0]=parseInt(Seed.resources['city'+cityId].rec3[0] - parseIntNan(t.craftinfo[h].resources[3])); Seed.resources['city'+cityId].rec4[0]=parseInt(Seed.resources['city'+cityId].rec4[0] - parseIntNan(t.craftinfo[h].resources[4])); Seed.resources['city'+cityId].rec5[0]=parseInt(Seed.resources['city'+cityId].rec5[0] - parseIntNan(t.craftinfo[h].resources[5])); Seed.citystats['city'+cityId]['gold'][0]=parseInt(Seed.citystats['city'+cityId]['gold'][0] - parseIntNan(t.craftinfo[h].resources[6])); if (rslt.status=="failure") { //craft failed actionLog (Cities.byID[cityId].name+': Failed to craft '+uW.itemlist["i"+itemId].name,'CRAFTING'); // increment total craft attempts Options.CraftOptions.RecipeStats[h][1] = Options.CraftOptions.RecipeStats[h][1] + 1; saveOptions(); for (var k in t.craftinfo[h].inputItems) { if (t.craftinfo[h].inputItems[k] > 0) { if (k == t.craftinfo[h].consolation) { CM.InventoryView.removeItemFromInventory(k,(t.craftinfo[h].inputItems[k]-1).toFixed(0)); } else { CM.InventoryView.removeItemFromInventory(k,parseInt(t.craftinfo[h].inputItems[k])); } } } } else { if (rslt.status=="success") { // craft successful actionLog (Cities.byID[cityId].name+': Successfully crafting '+uW.itemlist["i"+itemId].name,'CRAFTING'); // increment total craft attempts and successful craft attempts Options.CraftOptions.RecipeStats[h][1] = Options.CraftOptions.RecipeStats[h][1] + 1; Options.CraftOptions.RecipeStats[h][0] = Options.CraftOptions.RecipeStats[h][0] + 1; if (!Options.CraftOptions.RecipeFixed[h] && Options.CraftOptions.RecipeNumbers[h] > 0) { Options.CraftOptions.RecipeNumbers[h] = Options.CraftOptions.RecipeNumbers[h] -1; saveOptions(); if (ById('btCraftNum_'+h)) { ById('btCraftNum_'+h).value = Options.CraftOptions.RecipeNumbers[h]; } } Seed.queue_craft["city"+cityId]= uWCloneInto([]); // Always reset the crafting queue for the city!! if (rslt.time.duration==0) { // add to instant craft array, not to craft queue! if (t.InstantCrafts[params.itemId]) { ++t.InstantCrafts[params.itemId][1]; } else { t.InstantCrafts[params.itemId] = []; t.InstantCrafts[params.itemId].push(parseIntNan(Seed.items["i"+params.itemId])); t.InstantCrafts[params.itemId].push(1); } } else { var n={}; n.recipeId=recipeId; n.craftingUnixTime=rslt.time.startTime; n.craftingEtaUnixTime=rslt.time.endTime; n.craftingId=rslt.craftingId; n.categoryId=null; n.recipeIndex=null; uW.seed.queue_craft["city"+cityId].push(uWCloneInto(n)); } for (var k in t.craftinfo[h].inputItems) { if (t.craftinfo[h].inputItems[k] > 0) { CM.InventoryView.removeItemFromInventory(k,parseInt(t.craftinfo[h].inputItems[k])); } } if (typeof uW.recipeUsageList[category] !== "undefined" && typeof uW.recipeUsageList[category][recipeId] !== "undefined") { uW.recipeUsageList[category][recipeId].dailyUsage += 1; uW.recipeUsageList[category][recipeId].lifeTimeUsage += 1; } if (uW.currentcityid == cityId) { if (jQuery("#queue_head_building").hasClass("sel") ) { uW.queue_changetab_building(); } uW.update_queue(); } } } } } } t.PaintOverview(); jQuery('#btCraftCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); return; }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Crafting Failed (AJAX Error)','CRAFTING'); jQuery('#btCraftCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); } },true); }, speedupCraft : function (cityId,item,cid) { var t = Tabs.Craft; var citynum = Cities.byID[cityId].idx+1; jQuery('#btCraftCity_'+citynum).css('color', 'magenta'); var params = uW.Object.clone(uW.g_ajaxparams); params.ctrl = 'Crafting'; params.action = 'speedup'; params.cityId = cityId; params.itemId = item; params.craftingId = cid; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.error_code || rslt.error_code == 0) { // no OK status on this call, but if there's an error_code assume speedup failed... actionLog(Cities.byID[cityId].name+': Crafting Speedup Failed ('+rslt.error_code+')','CRAFTING'); } else { Seed.items["i"+item] = Number(parseInt(Seed.items["i"+item])-1); uW.ksoItems[item].subtract(); var qloc = Seed.queue_craft["city" + cityId].length-1; // last queued item is the one in progress... var timered = 0; var utstart = parseInt(Seed.queue_craft["city" + cityId][qloc].craftingUnixTime); var uteta = parseInt(Seed.queue_craft["city" + cityId][qloc].craftingEtaUnixTime); timered = SpeedupArray[parseInt(item) - 1]; Seed.queue_craft["city" + cityId][qloc].craftingUnixTime = utstart - timered; Seed.queue_craft["city" + cityId][qloc].craftingEtaUnixTime = uteta - timered; if (cityId == uW.currentcityid) uW.update_queue(); } jQuery('#btCraftCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Crafting Speedup Failed (AJAX Error)','CRAFTING'); jQuery('#btCraftCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); } },true); }, } /** Spells Tab **/ Tabs.Spells = { tabLabel: 'Spells', tabOrder: 2100, tabColor : 'brown', myDiv: null, timer: null, LoopCounter: 0, intervalSecs : 2, autodelay : 0, Squire:0, Knight:0, Guinevere:0, Morgana:0, Arthur:0, Merlin:0, Divine:0, Epic:0, Legendary:0, ItemList : [1, 2, 3, 4, 5, 6, 7, 8, 10], ItemTrans : ["SH","KH","GH","MH","AH","RH","DH","EH","LH"], Options: { Running: false, Enabled : {1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true}, UseLH : false, UseEH : false, UseDH : false, UseRH : false, UseAH : false, UseMH : false, UseGH : false, UseKH : false, UseSH : false, UseOverride : false, OverrideItem : 0, OverrideHours : 0, OverrideMinutes : 1, Toggle : false, }, init: function (div) { var t = Tabs.Spells; t.myDiv = div; if (!Options.SpellOptions) { Options.SpellOptions = t.Options; } else { for (var y in t.Options) { if (!Options.SpellOptions.hasOwnProperty(y)) { Options.SpellOptions[y] = t.Options[y]; } } } uWExportFunction('speedupSpell', Tabs.Spells.speedupSpell); if (Options.SpellOptions.Toggle) AddSubTabLink('AutoSpell',t.toggleAutoSpellState, 'SpellToggleTab'); SetToggleButtonState('Spell',Options.SpellOptions.Running,'Spell'); var m = '
    '+tx('BATTLE SPELLS')+'
    '; m += '
    '; m += '
     '+tx("Add toggle button to main screen header")+' 
    '; m += '
    '; m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ""; // spacer m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += '
      '+Cities.cities[i-1].name.substring(0, 12)+' 
    '+tx('Active')+' 
    '+uW.g_js_strings.commonstr.faction+' 
     
    '+tx('Battle Spell')+' 
     
    '+uW.g_js_strings.commonstr.status+' 
     
    '; m += '
    '+tx('USE AUTO-SPEEDUPS')+'
    '; m += ''; Boosts += ''; m += Boosts+'
    '; var Boosts = ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += ''; Boosts += ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += '
    (' + parseIntNan(uW.ksoItems[t.ItemList[i]].count) + ')
    '+tx('Override above by always using')+' '+htmlSelector(HourGlassName,Options.SpellOptions.OverrideItem, 'id=pbspellOVItem') + ' '+tx('when more than')+' '; Boosts += ' '+uW.g_js_strings.timestr.timehr+'  '+uW.g_js_strings.timestr.timemin+' '+tx('remaining')+'.

    '; div.innerHTML = m; for (var i = 1; i <= Cities.numCities; i++) { ById('btSpellAutoCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.SpellOptions.Enabled[citynum] = e.target.checked; if (Options.SpellOptions.Enabled[citynum]) { t.timer = setTimeout(function () { t.doAutoLoop(Number(citynum));}, 0); } saveOptions(); }, false); } ToggleOption('SpellOptions','btSpellToggle','Toggle'); ToggleOption('SpellOptions','pbspellSH','UseSH'); ToggleOption('SpellOptions','pbspellKH','UseKH'); ToggleOption('SpellOptions','pbspellGH','UseGH'); ToggleOption('SpellOptions','pbspellMH','UseMH'); ToggleOption('SpellOptions','pbspellAH','UseAH'); ToggleOption('SpellOptions','pbspellRH','UseRH'); ToggleOption('SpellOptions','pbspellDH','UseDH'); ToggleOption('SpellOptions','pbspellEH','UseEH'); ToggleOption('SpellOptions','pbspellLH','UseLH'); ToggleOption('SpellOptions','pbspellOV','UseOverride'); ChangeIntegerOption('SpellOptions','pbspellOVItem','OverrideItem'); ChangeIntegerOption('SpellOptions','pbspellOVHours','OverrideHours'); ChangeIntegerOption('SpellOptions','pbspellOVMinutes','OverrideMinutes'); ById ('pbSpellHelp').addEventListener ('click', t.helpPop, false); ById('btAutoSpellState').addEventListener('click', function(){ t.toggleAutoSpellState(this); }, false); // start autocraft loop timer to start in 15 seconds... if (Options.SpellOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(1);}, (15 * 1000)); } }, toggleAutoSpellState: function(obj){ var t = Tabs.Spells; obj = ById('btAutoSpellState'); if (Options.SpellOptions.Running == true) { Options.SpellOptions.Running = false; obj.value = tx("AutoSpell = OFF"); } else { Options.SpellOptions.Running = true; obj.value = tx("AutoSpell = ON"); t.timer = setTimeout(function () { t.doAutoLoop(1);}, 0); } saveOptions(); SetToggleButtonState('Spell',Options.SpellOptions.Running,'Spell'); t.PaintOverview(); }, show: function (init) { var t = Tabs.Spells; t.PaintOverview(); }, helpPop : function (){ var t = Tabs.Spells; var helpText = '
    '+tx("Using Speedups for Spells"); helpText += '

    '+tx('Speedups will be used in the following order if they are selected, and the required criteria is met')+' :-

    '; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += '
    '+uW.g_js_strings.commonstr.item+''+uW.g_js_strings.commonstr.time+''+tx('Criteria')+'
    '+uW.itemlist.i10.name+'4 days'+tx('More than 3 days and 12 hours remaining')+'
    '+uW.itemlist.i8.name+'2.5 days'+tx('More than 48 hours remaining')+'
    '+uW.itemlist.i7.name+'24 hrs'+tx('More than 23 hours 30 minutes remaining')+'
    '+uW.itemlist.i6.name+'15 hrs'+tx('More than 14 hours 30 minutes remaining')+'
    '+uW.itemlist.i5.name+'8 hrs'+tx('More than 7 hours 30 minutes remaining')+'
    '+uW.itemlist.i4.name+'2.5 hrs'+tx('More than 2 hours remaining')+'
    '+uW.itemlist.i3.name+'1 hr'+tx('More than 45 minutes remaining')+'
    '+uW.itemlist.i2.name+'15 mins'+tx('More than 5 minutes remaining')+'
    '+uW.itemlist.i1.name+'1 min'+tx('More than 30 seconds remaining')+'
    '; helpText += '

    '+tx('If the override box is ticked, then the override rule specified will take priority')+'.


    '; var pop = new CPopup ('BotHelp', 0, 0, 460, 360, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Speedups")+'
    '; pop.show (true); }, EverySecond : function () { var t = Tabs.Spells; t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh overview display every 2 seconds if (tabManager.currentTab.name == 'Spells' && Options.btWinIsOpen){ t.PaintOverview(); } } }, PaintOverview : function () { var t = Tabs.Spells; t.Squire = parseIntNan(Seed.items.i1); t.Knight = parseIntNan(Seed.items.i2); t.Guinevere = parseIntNan(Seed.items.i3); t.Morgana = parseIntNan(Seed.items.i4); t.Arthur = parseIntNan(Seed.items.i5); t.Merlin = parseIntNan(Seed.items.i6); t.Divine = parseIntNan(Seed.items.i7); t.Epic = parseIntNan(Seed.items.i8); t.Legendary = parseIntNan(Seed.items.i10); ById('pbspellUseSHLabel').innerHTML = t.Squire; ById('pbspellUseKHLabel').innerHTML = t.Knight; ById('pbspellUseGHLabel').innerHTML = t.Guinevere; ById('pbspellUseMHLabel').innerHTML = t.Morgana; ById('pbspellUseAHLabel').innerHTML = t.Arthur; ById('pbspellUseRHLabel').innerHTML = t.Merlin; ById('pbspellUseDHLabel').innerHTML = t.Divine; ById('pbspellUseEHLabel').innerHTML = t.Epic; ById('pbspellUseLHLabel').innerHTML = t.Legendary; var now = unixTime(); var q; for (var i = 0; i < Cities.numCities; i++) { citynum = i+1; cityId = Cities.cities[i].id; var spells = getSpellData(cityId); var faction = spells.faction; var SpellName = 'none'; var SpellActivity = 'n/a'; if (spells.spellavailable) { SpellName = ''+uW.g_js_strings.spells["name_"+SpellTypes[faction]]+''; var spellstyle = 'color:#080;'; SpellActivity = ''+tx('Ready')+'!'; if (spells.cooldownactive) { spellstyle = 'color:#800;'; SpellActivity = ''+spells.cooldown+''; var Speedups = ''; Speedups += t.dspHG(cityId, faction, 1, t.Squire); Speedups += t.dspHG(cityId, faction, 2, t.Knight); Speedups += t.dspHG(cityId, faction, 3, t.Guinevere); Speedups += t.dspHG(cityId, faction, 4, t.Morgana); Speedups += t.dspHG(cityId, faction, 5, t.Arthur); Speedups += ''; Speedups += t.dspHG(cityId, faction, 6, t.Merlin); if (Speedups != "") Speedups = "" + Speedups + "
    "; SpellActivity = SpellActivity+'
    '+Speedups+'
    '; } } var CityFaction = tx('Not ascended'); var ascended = getAscensionValues(cityId); if (faction != 0) { CityFaction = getFactionName(faction) + ' ('+ascended.prestigeLevel+')'; } ById("btSpellFactionCity_"+citynum).innerHTML = CityFaction; ById("btSpellNameCity_"+citynum).innerHTML = SpellName; ById("btSpellStatusCity_"+citynum).innerHTML = SpellActivity; } }, dspHG : function (cityId, faction, item, count) { var t = Tabs.Spells; var n = ''; if (count>0) { n += ''; } return n; }, doAutoLoop : function (idx) { var t = Tabs.Spells; clearTimeout(t.timer); if (!Options.SpellOptions.Running) return; var cityId = Cities.cities[idx-1].id; if (idx==1) { t.loopaction = false; } // reset loop action indicator for first city t.autodelay = 0; // no delay if no action taken! // check spell status and speedup if on cooldown var spells = getSpellData(cityId); var faction = spells.faction; if (spells.spellavailable && spells.cooldownactive) { t.autoSpeedup (cityId,SpellTypes[faction]); } if (idx == Cities.numCities) { if (!t.loopaction) { t.autodelay = t.intervalSecs; } // if no action this loop, apply delay anyway... t.timer = setTimeout(function () { t.doAutoLoop(1); }, (t.autodelay * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1); }, (t.autodelay * 1000)); } }, autoSpeedup: function (cityId,spell) { var t = Tabs.Spells; var now = unixTime(); var item = 0; totTime = parseInt(Seed.cityData.city[cityId].spells[spell].endDate) - now; if (totTime > 0) { if (Options.SpellOptions.UseOverride && Options.SpellOptions.OverrideItem != 0) { var THRESHOLD_SECONDS = (parseIntNan(Options.SpellOptions.OverrideMinutes)*60)+(parseIntNan(Options.SpellOptions.OverrideHours)*60*60); if (totTime >= THRESHOLD_SECONDS && uW.ksoItems[Options.SpellOptions.OverrideItem].count > 0) { item = Options.SpellOptions.OverrideItem; } } if (item==0 && totTime >= HGLimit[8] && Options.SpellOptions.UseLH && uW.ksoItems[10].count > 0) { item = 10; } if (item==0 && totTime >= HGLimit[7] && Options.SpellOptions.UseEH && uW.ksoItems[8].count > 0) { item = 8; } if (item==0 && totTime >= HGLimit[6] && Options.SpellOptions.UseDH && uW.ksoItems[7].count > 0) { item = 7; } if (item==0 && totTime >= HGLimit[5] && Options.SpellOptions.UseRH && uW.ksoItems[6].count > 0) { item = 6; } if (item==0 && totTime >= HGLimit[4] && Options.SpellOptions.UseAH && uW.ksoItems[5].count > 0) { item = 5; } if (item==0 && totTime >= HGLimit[3] && Options.SpellOptions.UseMH && uW.ksoItems[4].count > 0) { item = 4; } if (item==0 && totTime >= HGLimit[2] && Options.SpellOptions.UseGH && uW.ksoItems[3].count > 0) { item = 3; } if (item==0 && totTime >= HGLimit[1] && Options.SpellOptions.UseKH && uW.ksoItems[2].count > 0) { item = 2; } if (item==0 && totTime >= HGLimit[0] && Options.SpellOptions.UseSH && uW.ksoItems[1].count > 0) { item = 1; } } if (item != 0) { t.autodelay = t.intervalSecs; t.loopaction = true; t.speedupSpell(cityId,item,spell); } }, speedupSpell : function (cityId,item,spell) { var t = Tabs.Spells; var citynum = Cities.byID[cityId].idx+1; jQuery('#btSpellCity_'+citynum).css('color', 'magenta'); var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.iid = item; params.sid = spell; params.apothecary = false; new MyAjaxRequest(uW.g_ajaxpath + "ajax/speedupBattleSpellCooldown.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { if (rslt.endDate) { Seed.cityData.city[cityId].spells = uWCloneInto({}); Seed.cityData.city[cityId].spells[spell] = uWCloneInto({ endDate : rslt.endDate }); } Seed.items["i"+item] = Number(parseInt(Seed.items["i"+item])-1); uW.ksoItems[item].subtract(); if (cityId == uW.currentcityid) uW.update_queue(); if (ById('QMSpell')) QuickMarch.BuildSpellSelect(); actionLog(Cities.byID[cityId].name+': Spell cooldown speedup applied','SPELLS'); } else { if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Spell cooldown speedup failed ('+rslt.msg+')','SPELLS'); } else { actionLog(Cities.byID[cityId].name+': Spell cooldown speedup failed ('+rslt.error_code+')','SPELLS'); } } jQuery('#btSpellCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Spell cooldown speedup failed (AJAX Error)','SPELLS'); jQuery('#btSpellCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, },true); }, } /** Transport Tab **/ Tabs.Transport = { tabOrder: 2030, tabLabel : 'Transport', tabColor : 'brown', myDiv : null, dcp0 : null, dcp1 : null, timer : null, autodelay : 0, loopaction : false, marchspeed : 0, LoopCounter : 0, EditRouteNumber : -1, EditMode : false, LoadSac : '', Gold_Capacity : 12000000000, Options : { Running: false, Toggle : false, Routes : [], TransportInterval : 10, intervalSecs : 5, MinWagons : 100, ReverseTransport : false, ReverseTransportPercent : 90, ThroneCheck: false, MarchSpeed: 0, Priority: "1,4,5,3,2", // food, ore, aether, stone, wood LastTroopType: 9, GoldCap:true, }, NewRouteObject : { cityId: null, target_x: '', target_y: '', target_cityId: null, TroopType: 9, ship_Gold: false, ship_Food: false, ship_Wood: false, ship_Stone: false, ship_Ore: false, ship_Aether: false, keep_Gold: 0, keep_Food: 0, keep_Wood: 0, keep_Stone: 0, keep_Ore: 0, keep_Aether: 0, trade_Gold: 0, trade_Food: 0, trade_Wood: 0, trade_Stone: 0, trade_Ore: 0, trade_Aether: 0, Active: true, OverrideTime: false, Interval : 10, LastChecked : 0, }, RouteObject : null, init : function (div) { var t = Tabs.Transport; t.myDiv = div; if (!Options.TransportOptions) { Options.TransportOptions = t.Options; } else { for (var y in t.Options) { if (!Options.TransportOptions.hasOwnProperty(y)) { Options.TransportOptions[y] = t.Options[y]; } } } t.checkcitymoved(); uWExportFunction ('pbtrDeleteRoute', Tabs.Transport.DeleteRoute); uWExportFunction ('pbtrEditRoute', Tabs.Transport.EditRoute); uWExportFunction ('pbtrSendRoute', Tabs.Transport.SendRoute); uWExportFunction ('pbtrToggleActive', Tabs.Transport.ToggleActive); if (Options.TransportOptions.Toggle) AddSubTabLink('Transport',t.toggleAutoTransportState, 'TransportToggleTab'); SetToggleButtonState('Transport',Options.TransportOptions.Running,'Transport'); var m = '
    '+tx('AUTOMATED TRANSPORT')+'
    '; m += '
    '; m += '
     '+tx("Add toggle button to main screen header")+''+tx('Current Transport Speed')+':   
    '; m += ''; m += ''; m += ''; m += '
    '+tx('Only transport when march speed for transports is at least')+'  % '+tx("Check routes every:")+'  '+tx("minutes")+'
     '+tx("Do not march if less than")+' '+tx("troops are needed. (Avoids needless transports)")+' '+tx("March Interval:")+'  '+tx("seconds")+'
    '+tx('Reverse transport if resource amount falls below')+' % '+tx('of the Keep value')+'. '+tx("Transport Priority:")+' '+htmlSelector({"1,4,5,3,2": uW.g_js_strings.commonstr.food, "4,1,5,3,2": uW.g_js_strings.commonstr.ore}, Options.TransportOptions.Priority, 'id=pbtPriority')+'
    '+tx('Do not transport gold above target city capacity')+' 
    '; m += '
     
    '; m += '
     

    '; div.innerHTML = m; ToggleOption('TransportOptions','btTransportToggle','Toggle'); ById('btAutoTransportState').addEventListener('click', function(){ t.toggleAutoTransportState(this); }, false); ById('pbtransportinterval').addEventListener('keyup', function () { if (isNaN(ById('pbtransportinterval').value)) { ById('pbtransportinterval').value = 60; } Options.TransportOptions.TransportInterval = ById('pbtransportinterval').value; saveOptions(); }, false); ById('pbtmarchinterval').addEventListener('keyup', function () { if (parseIntNan(ById('pbtmarchinterval').value)<1) { ById('pbtmarchinterval').value = 5; } if (parseIntNan(ById('pbtmarchinterval').value)<2) { ById('pbtmarchinterval').value = 2; } Options.TransportOptions.intervalSecs = parseIntNan(ById('pbtmarchinterval').value); saveOptions(); }, false); ById('pbtPriority').addEventListener('change', function() { Options.TransportOptions.Priority = ById('pbtPriority').value; saveOptions(); }, false); ById('pbrevtrans').addEventListener('change', function(){ Options.TransportOptions.ReverseTransport = ById('pbrevtrans').checked; saveOptions(); }, false); ById('pbrevtranspc').addEventListener('keyup', function () { if (isNaN(ById('pbrevtranspc').value)) { ById('pbrevtranspc').value = 0; } Options.TransportOptions.ReverseTransportPercent = ById('pbrevtranspc').value; saveOptions(); }, false); ById('pbminwagons').addEventListener('keyup', function () { if (isNaN(ById('pbminwagons').value)) { ById('pbminwagons').value = 100; } Options.TransportOptions.MinWagons = ById('pbminwagons').value; saveOptions(); }, false) ById('bttrMarchTR').addEventListener ('change', function() { Options.TransportOptions.ThroneCheck = this.checked; saveOptions(); }, false); ById('bttrMarchTRSpeed').addEventListener ('change', function() { Options.TransportOptions.MarchSpeed = parseIntNan(this.value); saveOptions(); }, false); ById('pbgoldcap').addEventListener('change', function(){ Options.TransportOptions.GoldCap = ById('pbgoldcap').checked; saveOptions(); }, false); t.PaintRoutes(); // start autotransport loop timer to start in 10 seconds... if (Options.TransportOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(0,false);}, (10 * 1000)); } }, toggleAutoTransportState: function(obj){ var t = Tabs.Transport; obj = ById('btAutoTransportState'); if (Options.TransportOptions.Running == true) { Options.TransportOptions.Running = false; obj.value = tx("Transport = OFF"); clearTimeout(t.timer); } else { Options.TransportOptions.Running = true; obj.value = tx("Transport = ON"); // clear the last checked field on all routes var n = Options.TransportOptions.Routes.length; while (n--) { Options.TransportOptions.Routes[n].LastChecked = 0; } t.timer = setTimeout(function () { t.doAutoLoop(0,false);}, 0); } saveOptions(); SetToggleButtonState('Transport',Options.TransportOptions.Running,'Transport'); }, checkcitymoved: function () { var t = Tabs.Transport; for (var i = 0; i < Options.TransportOptions.Routes.length; i++) { if (parseIntNan(Options.TransportOptions.Routes[i].target_cityId) != 0 && Cities.byID[Options.TransportOptions.Routes[i].target_cityId]) { Options.TransportOptions.Routes[i].target_x = Cities.byID[Options.TransportOptions.Routes[i].target_cityId].x; Options.TransportOptions.Routes[i].target_y = Cities.byID[Options.TransportOptions.Routes[i].target_cityId].y; } } saveOptions(); }, ClearRoutes : function() { var t = Tabs.Transport; Options.TransportOptions.Routes = []; saveOptions(); ById('pbtrMessages').innerHTML = tx("All transport routes deleted")+"!"; t.PaintRoutes(); }, PaintRoutes : function () { var t = Tabs.Transport; t.EditMode = false; var z = ''; var r = 0; var Routes = false; var z= '
    '+tx('TRANSPORT ROUTES')+'

    '; z += '
    '; z += ''; z += '
    '+strButton20(tx('New Route'), 'id=pbtrNewRoute')+' '+strButton20(tx('Delete ALL Routes'), 'id=pbtrClearRoutes')+' 
    '; z += '
    '; var FromList = {0:"-- "+tx('Select City')+" --"}; var BulkAction = {0:"-- "+tx('Select Action')+" --",1:tx("Delete ALL Marches From"),2:tx("Delete ALL Marches To"),3:tx("Transfer ALL Marches From"),4:tx("Transfer ALL Marches To"),5:tx("Disable ALL Marches From"),6:tx("Disable ALL Marches To"),7:tx("Enable ALL Marches From"),8:tx("Enable ALL Marches To")}; var CityList = {0:"-- "+tx('Select City')+" --"}; for (g in Cities.byID) { CityList[Cities.byID[g].id] = Cities.byID[g].name; } var n = Options.TransportOptions.Routes.length; while (n--) { var a = Options.TransportOptions.Routes[n]; var fid = -1; var fromname = ''+tx('No City')+'!'; if (Cities.byID[a.cityId]) { fromname = Cities.byID[a.cityId].name; fid = a.cityId; } FromList[fid] = fromname; var toname = ''+tx('No City')+'!'; if (a.target_cityId != 0) { var fid = -1; if (Cities.byID[a.target_cityId]) { toname = Cities.byID[a.target_cityId].name; fid = a.target_cityId; } FromList[fid] = toname; } else { toname = coordLink(a.target_x,a.target_y); } Routes = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ''; z += ''; z += ''; var zz = '
    '+tx('Source')+''+tx('Destination')+''+uW.g_js_strings.commonstr.troops+''+uW.g_js_strings.commonstr.resources+''+tx('Active')+''+Options.TransportOptions.Routes.length+' '+tx('Routes')+'
    '+fromname+''+toname+''+uW.unitcost['unt'+a.TroopType][0]+'
    '; if (a.ship_Food) { zz += ''; if (parseIntNan(a.keep_Food)!=0 || parseIntNan(a.trade_Food)==0) { zz += ''; } if (parseIntNan(a.trade_Food)!=0) { zz += ''; } zz += ''; } if (a.ship_Wood) { zz += ''; if (parseIntNan(a.keep_Wood)!=0 || parseIntNan(a.trade_Wood)==0) { zz += ''; } if (parseIntNan(a.trade_Wood)!=0) { zz += ''; } zz += ''; } if (a.ship_Stone) { zz += ''; if (parseIntNan(a.keep_Stone)!=0 || parseIntNan(a.trade_Stone)==0) { zz += ''; } if (parseIntNan(a.trade_Stone)!=0) { zz += ''; } zz += ''; } if (a.ship_Ore) { zz += ''; if (parseIntNan(a.keep_Ore)!=0 || parseIntNan(a.trade_Ore)==0) { zz += ''; } if (parseIntNan(a.trade_Ore)!=0) { zz += ''; } zz += ''; } if (a.ship_Aether) { zz += ''; if (parseIntNan(a.keep_Aether)!=0 || parseIntNan(a.trade_Aether)==0) { zz += ''; } if (parseIntNan(a.trade_Aether)!=0) { zz += ''; } zz += ''; } if (a.ship_Gold) { zz += ''; if (parseIntNan(a.keep_Gold)!=0 || parseIntNan(a.trade_Gold)==0) { zz += ''; } if (parseIntNan(a.trade_Gold)!=0) { zz += ''; } zz += ''; } zz += '
    '+ResourceImage(FoodImage,uW.g_js_strings.commonstr.food)+''+tx("Keep")+': '+addCommas(a.keep_Food)+''+tx("Trade")+': '+addCommas(a.trade_Food)+'
    '+ResourceImage(WoodImage,uW.g_js_strings.commonstr.wood)+''+tx("Keep")+': '+addCommas(a.keep_Wood)+''+tx("Trade")+': '+addCommas(a.trade_Wood)+'
    '+ResourceImage(StoneImage,uW.g_js_strings.commonstr.stone)+''+tx("Keep")+': '+addCommas(a.keep_Stone)+''+tx("Trade")+': '+addCommas(a.trade_Stone)+'
    '+ResourceImage(OreImage,uW.g_js_strings.commonstr.ore)+''+tx("Keep")+': '+addCommas(a.keep_Ore)+''+tx("Trade")+': '+addCommas(a.trade_Ore)+'
    '+ResourceImage(AetherImage,uW.g_js_strings.commonstr.aetherstone)+''+tx("Keep")+': '+addCommas(a.keep_Aether)+''+tx("Trade")+': '+addCommas(a.trade_Aether)+'
    '+ResourceImage(GoldImage,uW.g_js_strings.commonstr.gold)+''+tx("Keep")+': '+addCommas(a.keep_Gold)+''+tx("Trade")+': '+addCommas(a.trade_Gold)+'

    ' z += ''+zz+''; z += '


    '; z += 'Edit Del'; z += ''; } if (!Routes) { z += '


    '+tx('No transport routes')+'
    '; } z += '

    '; ById('pbtrRouteDetail').innerHTML = z; ById('pbtrbulkactions').innerHTML = tx("Bulk Action")+": "+htmlSelector(BulkAction,0,'class=btInput id=pbtrbulkaction')+' '+htmlSelector(FromList,0,'class=btInput id=pbtrbulkfrom')+' To '+htmlSelector(CityList,0,'class=btInput id=pbtrbulkto')+' '+strButton8(tx('Go'),'id=pbtrbulkgo'); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('pbtrbulkgo').addEventListener('click', function(){t.DoBulkAction(ById('pbtrbulkaction').value,ById('pbtrbulkfrom').value,ById('pbtrbulkto').value);}, false); ById('pbtrbulkaction').addEventListener('change', function(e){ if (e.target.value==3 || e.target.value==4) { jQuery('#pbtrbulknew').removeClass("divHide"); } else { jQuery('#pbtrbulknew').addClass("divHide"); } }, false); ById('pbtrClearRoutes').addEventListener ('click', function() {t.ClearRoutes();}, false); ById('pbtrNewRoute').addEventListener ('click', function() {t.NewRoute();}, false); t.updateRoutes(); }, DoBulkAction : function (Action,From,To) { var t = Tabs.Transport; ById('pbtrMessages').innerHTML = " "; if (Action==0 || From==0) return; if ((Action==3 || Action==4) && To==0) return; for (var i=Number(Options.TransportOptions.Routes.length-1); i>-1 ;i--) { if (Action==1 || Action==3 || Action==5 || Action==7) { if ((Options.TransportOptions.Routes[i].cityId == From) || (From==-1 && !Cities.byID[Options.TransportOptions.Routes[i].cityId])) { if (Action==1) { Options.TransportOptions.Routes.splice(i,1); } else { if (Action==3) { Options.TransportOptions.Routes[i].cityId = To; } else { if (Action==5) { Options.TransportOptions.Routes[i].Active = false; } else { if (Action==7) { Options.TransportOptions.Routes[i].Active = true; } } } } } } if (Action==2 || Action==4 || Action==6 || Action==8) { if (parseIntNan(Options.TransportOptions.Routes[i].target_cityId) != 0) { if ((Options.TransportOptions.Routes[i].target_cityId == From) || (From==-1 && !Cities.byID[Options.TransportOptions.Routes[i].target_cityId])) { if (Action==2) { Options.TransportOptions.Routes.splice(i,1); } else { if (Action==4) { Options.TransportOptions.Routes[i].target_cityId = To; Options.TransportOptions.Routes[i].target_x = Cities.byID[To].x; Options.TransportOptions.Routes[i].target_y = Cities.byID[To].y; } else { if (Action==6) { Options.TransportOptions.Routes[i].Active = false; } else { if (Action==8) { Options.TransportOptions.Routes[i].Active = true; } } } } } } } } saveOptions(); if (Action==1 || Action==2) { ById('pbtrMessages').innerHTML = "Transport routes deleted!"; } else { if (Action==3 || Action==4) { ById('pbtrMessages').innerHTML = "Transport routes relocated!"; } } t.PaintRoutes(); }, DeleteRoute : function (entry) { var t = Tabs.Transport; Options.TransportOptions.Routes.splice(entry,1); saveOptions(); ById('pbtrMessages').innerHTML = "Transport route deleted!"; t.PaintRoutes(); }, ToggleActive : function (entry) { var t = Tabs.Transport; Options.TransportOptions.Routes[entry].Active = !Options.TransportOptions.Routes[entry].Active; saveOptions(); t.updateRoutes(); }, SendRoute : function (entry) { var t = Tabs.Transport; Options.TransportOptions.Routes[entry].LastChecked = 0; saveOptions(); t.updateRoutes(); }, EditRoute : function (entry) { var t = Tabs.Transport; t.EditRouteNumber = entry; t.EditMode = true; ById('pbtrMessages').innerHTML = " "; t.RouteObject = {}; for (var y in Options.TransportOptions.Routes[t.EditRouteNumber]) { t.RouteObject[y] = Options.TransportOptions.Routes[t.EditRouteNumber][y]; } if (!t.RouteObject.OverrideTime) { t.RouteObject.Interval = Options.TransportOptions.TransportInterval; } t.PaintNewRoutePanel(); }, NewRoute : function () { var t = Tabs.Transport; t.EditRouteNumber = -1; t.EditMode = true; ById('pbtrMessages').innerHTML = " "; if (!t.RouteObject) { t.RouteObject = {}; for (var y in t.NewRouteObject) { t.RouteObject[y] = t.NewRouteObject[y]; } t.RouteObject.Interval = Options.TransportOptions.TransportInterval; t.RouteObject.TroopType = Options.TransportOptions.LastTroopType; } t.PaintNewRoutePanel(); }, show : function (){ var t = Tabs.Transport; t.PaintOverview(); if (t.EditMode) { t.updateResources(); } else { t.updateRoutes(); } }, EverySecond : function () { var t = Tabs.Transport; t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh transport march speed and overview display every 2 seconds t.marchspeed = Math.floor(equippedthronestats(67))+Math.floor(equippedthronestats(70))+Math.floor(equippedthronestats(163)); // march speed is transport and general march speed added together if (tabManager.currentTab.name == 'Transport' && Options.btWinIsOpen){ t.PaintOverview(); if (t.EditMode) { // paint from and to city resources t.updateResources(); } else { // paint time on each route? t.updateRoutes(); } } } }, PaintOverview : function () { var t = Tabs.Transport; if (Options.TransportOptions.ThroneCheck && (t.marchspeed < Number(Options.TransportOptions.MarchSpeed))) { ts = ''+t.marchspeed+'%'; } else { ts = t.marchspeed+'%'; } ById("bttrMarchCurrTR").innerHTML = ts; }, PaintNewRoutePanel : function () { var t = Tabs.Transport; var fromidx = null; var toidx = null; if (t.EditRouteNumber<0) { var z= '
    '+tx('NEW TRANSPORT ROUTE')+'

    '; fromidx = Cities.byID[uW.currentcityid].idx; // default new route from current city } else { var z= '
    '+tx('EDIT TRANSPORT ROUTE')+'

    '; } // remember last route details.... (or saved route details) if (Cities.byID[t.RouteObject.cityId]) { fromidx = Cities.byID[t.RouteObject.cityId].idx; } if (t.RouteObject.target_cityId != 0 && Cities.byID[t.RouteObject.target_cityId]) { toidx = Cities.byID[t.RouteObject.target_cityId].idx; t.RouteObject.target_x = Cities.byID[t.RouteObject.target_cityId].x; t.RouteObject.target_y = Cities.byID[t.RouteObject.target_cityId].y; } z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += '
     '+tx("From City")+': 
     '+tx("To City")+':  '+tx("or")+'   X:  Y:    '+tx('Select Bookmark')+':
     '+uW.g_js_strings.openCastle.trooptype+': '+tx("Maximum March Size")+':  
     '+tx("Troop Count")+':  '+tx("Maximum Load")+':  
      '+tx('Override transport interval')+''+tx("Transport Interval")+':  '+tx("minutes")+'

    '; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += '
    '+tx('Resource')+''+tx('Source')+''+tx('Destination')+''+tx('Send')+''+tx('Keep')+''+tx('Trade')+' 

    '; z += '
     '+strButton20(tx('Save Route'), 'id=pbtrSaveRoute')+' '; if (t.EditRouteNumber>=0) { z += strButton20(tx('Save a Copy'), 'id=pbtrCopyRoute')+' '; } z += strButton20(tx('Manual Transport'), 'id=pbtrManualTransport')+' '+strButton20(uW.g_js_strings.commonstr.cancel, 'id=pbtrCancelRoute')+' 
    '; ById('pbtrRouteDetail').innerHTML = z; ById('pbttroops').value = t.RouteObject.TroopType; t.dcp0 = new CdispCityPicker('pbttradefrom', ById('pbtfromcity'), true, t.updateResources, fromidx); t.dcp1 = new CdispCityPicker('pbttradeto', ById('pbttocity'), true, t.updateResources, toidx); t.dcp1.bindToXYboxes(ById('pbtcityX'), ById('pbtcityY')); ById('pbtFetchBookmarks').addEventListener('click', function () { FillBookmarkList('pbtBookmarks'); },false); ById('pbtBookmarks').addEventListener('change', function () { if (this.value != '') { var val = this.value; var x = val.substr(0, val.lastIndexOf(',')); var y = val.substr(val.lastIndexOf(',') + 1, val.length); ById('pbtcityX').value = x; ById('pbtcityY').value = y; } }, false); ById('pbttroops').addEventListener('change', function () { t.updateResources(); }, false); ById('pbtoverrideintervalchk').addEventListener('click', function () { var disablerow = (!ById('pbtoverrideintervalchk').checked); ById('pbtoverrideinterval').disabled = disablerow; if (disablerow) { ById('pbtoverrideinterval').value = Options.TransportOptions.TransportInterval; } }, false); ById('pbtargetamountFood').addEventListener('change', function () { if (isNaNCommas(ById('pbtargetamountFood').value)) ById('pbtargetamountFood').value = 0; }, false); ById('pbtargetamountWood').addEventListener('change', function () { if (isNaNCommas(ById('pbtargetamountWood').value)) ById('pbtargetamountWood').value = 0; }, false); ById('pbtargetamountStone').addEventListener('change', function () { if (isNaNCommas(ById('pbtargetamountStone').value)) ById('pbtargetamountStone').value = 0; }, false); ById('pbtargetamountOre').addEventListener('change', function () { if (isNaNCommas(ById('pbtargetamountOre').value)) ById('pbtargetamountOre').value = 0; }, false); ById('pbtargetamountAether').addEventListener('change', function () { if (isNaNCommas(ById('pbtargetamountAether').value)) ById('pbtargetamountAether').value = 0; }, false); ById('pbtargetamountGold').addEventListener('change', function () { if (isNaNCommas(ById('pbtargetamountGold').value)) ById('pbtargetamountGold').value = 0; }, false); ById('pbtradeamountFood').addEventListener('change', function () { if (isNaNCommas(ById('pbtradeamountFood').value)) ById('pbtradeamountFood').value = 0; }, false); ById('pbtradeamountWood').addEventListener('change', function () { if (isNaNCommas(ById('pbtradeamountWood').value)) ById('pbtradeamountWood').value = 0; }, false); ById('pbtradeamountStone').addEventListener('change', function () { if (isNaNCommas(ById('pbtradeamountStone').value)) ById('pbtradeamountStone').value = 0; }, false); ById('pbtradeamountOre').addEventListener('change', function () { if (isNaNCommas(ById('pbtradeamountOre').value)) ById('pbtradeamountOre').value = 0; }, false); ById('pbtradeamountAether').addEventListener('change', function () { if (isNaNCommas(ById('pbtradeamountAether').value)) ById('pbtradeamountAether').value = 0; }, false); ById('pbtradeamountGold').addEventListener('change', function () { if (isNaNCommas(ById('pbtradeamountGold').value)) ById('pbtradeamountGold').value = 0; }, false); ById('pbshipFood').addEventListener('click', function () { var disablerow = (!ById('pbshipFood').checked); ById('pbtargetamountFood').disabled = disablerow; ById('pbtradeamountFood').disabled = disablerow; ById('pbMaxFood').disabled = disablerow; if (disablerow) { ById('pbtargetamountFood').value = 0; ById('pbtradeamountFood').value = 0; } }, false); ById('pbshipWood').addEventListener('click', function () { var disablerow = (!ById('pbshipWood').checked); ById('pbtargetamountWood').disabled = disablerow; ById('pbtradeamountWood').disabled = disablerow; ById('pbMaxWood').disabled = disablerow; if (disablerow) { ById('pbtargetamountWood').value = 0; ById('pbtradeamountWood').value = 0; } }, false); ById('pbshipStone').addEventListener('click', function () { var disablerow = (!ById('pbshipStone').checked); ById('pbtargetamountStone').disabled = disablerow; ById('pbtradeamountStone').disabled = disablerow; ById('pbMaxStone').disabled = disablerow; if (disablerow) { ById('pbtargetamountStone').value = 0; ById('pbtradeamountStone').value = 0; } }, false); ById('pbshipOre').addEventListener('click', function () { var disablerow = (!ById('pbshipOre').checked); ById('pbtargetamountOre').disabled = disablerow; ById('pbtradeamountOre').disabled = disablerow; ById('pbMaxOre').disabled = disablerow; if (disablerow) { ById('pbtargetamountOre').value = 0; ById('pbtradeamountOre').value = 0; } }, false); ById('pbshipAether').addEventListener('click', function () { var disablerow = (!ById('pbshipAether').checked); ById('pbtargetamountAether').disabled = disablerow; ById('pbtradeamountAether').disabled = disablerow; ById('pbMaxAether').disabled = disablerow; if (disablerow) { ById('pbtargetamountAether').value = 0; ById('pbtradeamountAether').value = 0; } }, false); ById('pbshipGold').addEventListener('click', function () { var disablerow = (!ById('pbshipGold').checked); ById('pbtargetamountGold').disabled = disablerow; ById('pbtradeamountGold').disabled = disablerow; ById('pbMaxGold').disabled = disablerow; if (disablerow) { ById('pbtargetamountGold').value = 0; ById('pbtradeamountGold').value = 0; } }, false); ById('pbMaxFood').addEventListener('click', function () { ById('pbtradeamountFood').value = t.CalcMaxResource('Food'); }, false); ById('pbMaxWood').addEventListener('click', function () { ById('pbtradeamountWood').value = t.CalcMaxResource('Wood'); }, false); ById('pbMaxStone').addEventListener('click', function () { ById('pbtradeamountStone').value = t.CalcMaxResource('Stone'); }, false); ById('pbMaxOre').addEventListener('click', function () { ById('pbtradeamountOre').value = t.CalcMaxResource('Ore'); }, false); ById('pbMaxAether').addEventListener('click', function () { ById('pbtradeamountAether').value = t.CalcMaxResource('Aether'); }, false); ById('pbMaxGold').addEventListener('click', function () { ById('pbtradeamountGold').value = t.CalcMaxResource('Gold'); }, false); ById('pbtrSaveRoute').addEventListener ('click', function() {t.SaveRoute(false);}, false); if (ById('pbtrCopyRoute')) { ById('pbtrCopyRoute').addEventListener ('click', function() {t.SaveRoute(true);}, false); } ById('pbtrCancelRoute').addEventListener ('click', function() {t.RouteObject = null; t.PaintRoutes();}, false); ById('pbtrManualTransport').addEventListener ('click', function() {t.ManualTransport();}, false); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); t.updateResources(); }, SaveRoute : function (CopyRoute) { var t = Tabs.Transport; if (!t.validateScreenFields('save')) { return; } Options.TransportOptions.LastTroopType = t.RouteObject.TroopType; saveOptions(); if (t.EditRouteNumber<0 || CopyRoute) { Options.TransportOptions.Routes.push(JSON2.parse(JSON2.stringify(t.RouteObject))); // create new object in array if (CopyRoute) { t.RouteObject = null; } // clear route object } else { t.RouteObject.LastChecked = 0; Options.TransportOptions.Routes[t.EditRouteNumber] = t.RouteObject; t.RouteObject = null; // clear route object } ById('pbtrMessages').innerHTML = "Transport route saved!"; t.PaintRoutes(); }, validateScreenFields : function (action) { var t = Tabs.Transport; ById('pbtrMessages').innerHTML = " "; if (!t.dcp0.city) { ById('pbtrMessages').innerHTML = "No source city selected"; return false; } // copy screen fields to routeobject t.RouteObject.cityId = t.dcp0.city.id; var x = ById("pbtcityX").value; var y = ById("pbtcityY").value; if (x=="" || y=="" || isNaN(x) || isNaN(y) || x < 0 || x > 749 || y < 0 || y > 749) { ById('pbtrMessages').innerHTML = tx("Map co-ordinates must be between 0 and 749!"); return false; } t.RouteObject.target_x = x; t.RouteObject.target_y = y; t.RouteObject.target_cityId = 0 for (ii in Seed.cities) { if (Seed.cities[ii][2] == t.RouteObject.target_x && Seed.cities[ii][3] == t.RouteObject.target_y) { t.RouteObject.target_cityId = Seed.cities[ii][0]; } } t.RouteObject.TroopType = ById('pbttroops').value; t.RouteObject.ship_Gold = ById('pbshipGold').checked; t.RouteObject.ship_Food = ById('pbshipFood').checked; t.RouteObject.ship_Wood = ById('pbshipWood').checked; t.RouteObject.ship_Stone = ById('pbshipStone').checked; t.RouteObject.ship_Ore = ById('pbshipOre').checked; t.RouteObject.ship_Aether = ById('pbshipAether').checked; t.RouteObject.keep_Gold = ById('pbtargetamountGold').value; t.RouteObject.keep_Food = ById('pbtargetamountFood').value; t.RouteObject.keep_Wood = ById('pbtargetamountWood').value; t.RouteObject.keep_Stone = ById('pbtargetamountStone').value; t.RouteObject.keep_Ore = ById('pbtargetamountOre').value; t.RouteObject.keep_Aether = ById('pbtargetamountAether').value; t.RouteObject.trade_Gold = ById('pbtradeamountGold').value; t.RouteObject.trade_Food = ById('pbtradeamountFood').value; t.RouteObject.trade_Wood = ById('pbtradeamountWood').value; t.RouteObject.trade_Stone = ById('pbtradeamountStone').value; t.RouteObject.trade_Ore = ById('pbtradeamountOre').value; t.RouteObject.trade_Aether = ById('pbtradeamountAether').value; t.RouteObject.OverrideTime = ById('pbtoverrideintervalchk').checked; if (isNaN(ById('pbtoverrideinterval').value)) { t.RouteObject.Interval = 0; } else { t.RouteObject.Interval = ById('pbtoverrideinterval').value; } if (t.RouteObject.target_x=="" || t.RouteObject.target_y=="") { ById('pbtrMessages').innerHTML = tx("Destination coordinates invalid"); return false; } if(t.dcp0.city.id==t.RouteObject.target_cityId){ ById('pbtrMessages').innerHTML = tx("Cannot transport to the same city!"); return false; } if (parseIntNan(t.RouteObject.TroopType)==0) { ById('pbtrMessages').innerHTML = tx("No troop type selected"); return false; } if (!t.RouteObject.ship_Gold && !t.RouteObject.ship_Food && !t.RouteObject.ship_Wood && !t.RouteObject.ship_Stone && !t.RouteObject.ship_Ore && !t.RouteObject.ship_Aether) { ById('pbtrMessages').innerHTML = tx("You must transport something!"); return false; } if (action=="send") { if (!t.RouteObject.trade_Gold && !t.RouteObject.trade_Food && !t.RouteObject.trade_Wood && !t.RouteObject.trade_Stone && !t.RouteObject.trade_Ore && !t.RouteObject.trade_Aether) { ById('pbtrMessages').innerHTML = tx("For manual transports you must enter the Trade values."); return false; } } // validation OK! return true; }, updateResources : function () { var t = Tabs.Transport; if (!t.dcp0 || !t.dcp0.city) return; var ToCity = null; for (var i = 1; i <= 5; i++) { if (i==5) { ById('pbtfromRec'+i).innerHTML = addCommas(parseInt(Seed.resources["city" + t.dcp0.city.id]['rec' + i][0])); } else { ById('pbtfromRec'+i).innerHTML = addCommas(parseInt(Seed.resources["city" + t.dcp0.city.id]['rec' + i][0] / 3600)); } } ById('pbtfromGold').innerHTML = addCommas(parseInt(Seed.citystats["city" + t.dcp0.city.id]['gold'][0])); for (ii in Seed.cities) { if (Seed.cities[ii][2] == ById('pbtcityX').value && Seed.cities[ii][3] == ById('pbtcityY').value) { ToCity = Seed.cities[ii][0]; } } for (var i = 1; i <= 5; i++) { if (ToCity) { if (i==5) { ById('pbttoRec'+i).innerHTML = addCommas(parseInt(Seed.resources["city" + ToCity]['rec' + i][0])); } else { ById('pbttoRec'+i).innerHTML = addCommas(parseInt(Seed.resources["city" + ToCity]['rec' + i][0] / 3600)); } } else { ById('pbttoRec'+i).innerHTML = "----"; } } if (ToCity) { ById('pbttoGold').innerHTML = addCommas(parseInt(Seed.citystats["city" + ToCity]['gold'][0])); } else { ById('pbttoGold').innerHTML = "----"; } // update troop and rally point information var Food = parseIntCommas(ById('pbtradeamountFood').value); var Wood = parseIntCommas(ById('pbtradeamountWood').value); var Stone = parseIntCommas(ById('pbtradeamountStone').value); var Ore = parseIntCommas(ById('pbtradeamountOre').value); var Gold = parseIntCommas(ById('pbtradeamountGold').value); var Aether = parseIntCommas(ById('pbtradeamountAether').value)*5; var unit = ById('pbttroops').value; var Troops = parseInt(Seed.units['city' + t.dcp0.city.id]["unt"+unit]); var LoadUnit = t.getLoadUnit(unit,t.dcp0.city.id); var MaxMarchSize = March.RallyPoint(t.dcp0.city.id).maxSize; if (MaxMarchSize < Troops) { var GlobalMaxLoad = MaxMarchSize * LoadUnit; } else { var GlobalMaxLoad = Troops * LoadUnit; } if (GlobalMaxLoad>0) GlobalMaxLoad = GlobalMaxLoad-1; // avoid max load problems var LoadSelected = Food+Wood+Stone+Ore+Gold+Aether; var TroopsNeeded = Math.ceil(LoadSelected/LoadUnit); var troopcolor = Options.Colors.PanelText; if (TroopsNeeded >= Troops || Troops==0) { troopcolor = '#f00'; } var marchcolor = Options.Colors.PanelText; if (TroopsNeeded >= MaxMarchSize) { marchcolor = '#f00'; } var loadcolor = Options.Colors.PanelText; if (GlobalMaxLoad < LoadSelected) { loadcolor = '#f00'; } ById('pbttotaltroops').innerHTML = ''+addCommas(Troops)+''; ById('pbtmaxtroops').innerHTML = ''+addCommas(MaxMarchSize)+''; ById('pbtmaxload').innerHTML = ''+addCommas(GlobalMaxLoad)+''+t.LoadSac; }, getLoadUnit : function (unit,cityId) { var t = Tabs.Transport; var featherweight = parseInt(Seed.tech.tch10) * 0.1; var loadEffectBoost = 0; if (Seed.playerEffects.loadExpire > uW.unixtime()) { loadEffectBoost = 0.25; }; var loadBoostBase = (Math.floor(CM.ThroneController.effectBonus(6)) * 0.01) + loadEffectBoost; if (CM.unitFrontendType[unit] == "siege") { loadBoostBase += (CM.ThroneController.effectBonus(59) * 0.01) }; if (CM.unitFrontendType[unit] == "horsed") { loadBoostBase += (CM.ThroneController.effectBonus(48) * 0.01); }; var Load = parseInt(uW.unitstats["unt"+unit]['5']); t.LoadSac = ""; if (Seed.queue_sacr["city"+cityId]) { for(var sacIndex = 0; sacIndex < Seed.queue_sacr["city"+cityId].length; sacIndex ++ ) { if(Seed.queue_sacr["city"+cityId][sacIndex]["unitType"] == unit) { Load *= Seed.queue_sacr["city"+cityId][sacIndex]["multiplier"][0]; t.LoadSac = '   Ritual Boost '+Math.round((Seed.queue_sacr["city"+cityId][sacIndex]["multiplier"][0]-1)*100)+'%'; } } } if (loadBoostBase > Number(uW.cm.thronestats.boosts.Load.Max)/100) { loadBoostBase = Number(uW.cm.thronestats.boosts.Load.Max)/100; }; loadBoostBase += featherweight; //Should be done after throne room max check to get max boost? loadBoostBase += 1; return Math.floor(loadBoostBase*Load); }, CalcMaxResource : function (restype) { var t = Tabs.Transport; if (!t.dcp0 || !t.dcp0.city) return; var Food = (restype=="Food")?0:parseIntCommas(ById('pbtradeamountFood').value); var Wood = (restype=="Wood")?0:parseIntCommas(ById('pbtradeamountWood').value); var Stone = (restype=="Stone")?0:parseIntCommas(ById('pbtradeamountStone').value); var Ore = (restype=="Ore")?0:parseIntCommas(ById('pbtradeamountOre').value); var Gold = (restype=="Gold")?0:parseIntCommas(ById('pbtradeamountGold').value); var Aether = (restype=="Aether")?0:parseIntCommas(ById('pbtradeamountAether').value)*5; var unit = ById('pbttroops').value; var Troops = parseInt(Seed.units['city' + t.dcp0.city.id]["unt"+unit]); var LoadUnit = t.getLoadUnit(unit,t.dcp0.city.id); var MaxMarchSize = March.RallyPoint(t.dcp0.city.id).maxSize; if (MaxMarchSize < Troops) { var GlobalMaxLoad = MaxMarchSize * LoadUnit; } else { var GlobalMaxLoad = Troops * LoadUnit; } if (GlobalMaxLoad>0) GlobalMaxLoad = GlobalMaxLoad-1; // avoid max load problems var LoadSelected = Food+Wood+Stone+Ore+Gold+Aether; var Max = GlobalMaxLoad - LoadSelected; if (Max<0) Max = 0; if (restype=="Aether") Max = Math.floor(Max/5); // limit to source city values var citylimit = 0; if (restype=="Food") citylimit = parseIntNan(Seed.resources["city" + t.dcp0.city.id]['rec1'][0] / 3600); if (restype=="Wood") citylimit = parseIntNan(Seed.resources["city" + t.dcp0.city.id]['rec2'][0] / 3600); if (restype=="Stone") citylimit = parseIntNan(Seed.resources["city" + t.dcp0.city.id]['rec3'][0] / 3600); if (restype=="Ore") citylimit = parseIntNan(Seed.resources["city" + t.dcp0.city.id]['rec4'][0] / 3600); if (restype=="Gold") citylimit = parseIntNan(Seed.citystats["city" + t.dcp0.city.id]['gold'][0]); if (restype=="Aether") citylimit = parseIntNan(Seed.resources["city" + t.dcp0.city.id]['rec5'][0]); if (Max>citylimit) Max = citylimit; return Max; }, updateRoutes : function () { var t = Tabs.Transport; if (!tabManager.currentTab || tabManager.currentTab.name != 'Transport' || !Options.btWinIsOpen) { return; } var n = Options.TransportOptions.Routes.length; while (n--) { var a = Options.TransportOptions.Routes[n]; var elstat = ById('pbtrRouteStatus'+n); if (elstat) { elstat.innerHTML = '

    '; if (Options.TransportOptions.Running) { if (a.Active) { if (Options.TransportOptions.ThroneCheck && (t.marchspeed < Options.TransportOptions.MarchSpeed)) { elstat.innerHTML = 'March
    Speed!
    '; } else { var now = unixTime(); var interval = Options.TransportOptions.TransportInterval*60; if (a.OverrideTime) { interval = a.Interval*60; } var due = a.LastChecked+interval; if (due < now) { elstat.innerHTML = ''+tx('Checking')+'...

    '; } else { elstat.innerHTML = uW.timestr(due-now)+'
    '+tx('Check Now')+''; } } } } } } }, doAutoLoop : function (idx,rev) { var t = Tabs.Transport; clearTimeout(t.timer); if (!Options.TransportOptions.Running) return; if (idx>=Options.TransportOptions.Routes.length) { idx=0; } // safety, if route(s) have been deleted. if (idx==0 && !rev) { t.loopaction = false; } // reset loop march indicator for first march t.autodelay = 0; // no delay if no action taken... if (idx= Options.TransportOptions.Routes.length-1) { if (!t.loopaction) { t.autodelay = Options.TransportOptions.intervalSecs; } // if no action this loop, apply delay anyway... t.timer = setTimeout(function () { t.doAutoLoop(0,false); }, (t.autodelay * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1,false); }, (t.autodelay * 1000)); } }, doTrades: function(idx,rev){ var t = Tabs.Transport; var a = Options.TransportOptions.Routes[idx]; if (Options.TransportOptions.ThroneCheck && (t.marchspeed < Options.TransportOptions.MarchSpeed)) { return; } // if not enough march speed if (!rev) { var sourcecityId = parseIntNan(a["cityId"]); var destcityId = a["target_cityId"]; var xcoord = a["target_x"]; var ycoord = a["target_y"]; } else { if (a["rev_eta"] && parseInt(a["rev_eta"]) > uW.unixtime()) { return; } // only one reverse transport on each route at a time var sourcecityId = a["target_cityId"]; var destcityId = parseIntNan(a["cityId"]); if(!Cities.byID[destcityId]) { return; } // no reverse transport city! var xcoord = Cities.byID[destcityId].x; var ycoord = Cities.byID[destcityId].y; } if (!Cities.byID[sourcecityId]) { return; } // no source city! var towerok = (!Options.TowerOptions || !Options.TowerOptions.SaveCityState[sourcecityId] || Options.TowerOptions.SaveCityState[sourcecityId].AllowMarches); if (!towerok) { return; } // source city under attack! var ascensionok = (!Options.BuildOptions || !Options.BuildOptions.AscensionReady[Cities.byID[sourcecityId].idx]); if (!ascensionok) { return; } // source city waiting to ascend! var targetname = xcoord+','+ycoord; if (destcityId && destcityId != 0) { if (!Cities.byID[destcityId]) return; // no destination city! targetname = Cities.byID[destcityId].name; } var ship_Food = a["ship_Food"]; var ship_Wood = a["ship_Wood"]; var ship_Stone = a["ship_Stone"]; var ship_Ore = a["ship_Ore"]; var ship_Aether = a["ship_Aether"]; var ship_Gold = a["ship_Gold"]; var trade_Food = parseIntNan(a["trade_Food"]); var trade_Wood = parseIntNan(a["trade_Wood"]); var trade_Stone = parseIntNan(a["trade_Stone"]); var trade_Ore = parseIntNan(a["trade_Ore"]); var trade_Aether = parseIntNan(a["trade_Aether"]); var trade_Gold = parseIntNan(a["trade_Gold"]); var TotalTrade = trade_Food+trade_Wood+trade_Stone+trade_Ore+(trade_Aether*5)+trade_Gold; var target_Food = parseIntNan(a["keep_Food"]); var target_Wood = parseIntNan(a["keep_Wood"]); var target_Stone = parseIntNan(a["keep_Stone"]); var target_Ore = parseIntNan(a["keep_Ore"]); var target_Aether = parseIntNan(a["keep_Aether"]); var target_Gold = parseIntNan(a["keep_Gold"]); var minfactor = parseIntNan(Options.TransportOptions.ReverseTransportPercent)/100; var min_Food = target_Food * minfactor; var min_Wood = target_Wood * minfactor; var min_Stone = target_Stone * minfactor; var min_Ore = target_Ore * minfactor; var min_Aether = target_Aether * minfactor; var min_Gold = target_Gold * minfactor; var citymax_Food = parseIntNan(Seed.resources["city"+sourcecityId]['rec1'][0] / 3600); var citymax_Wood = parseIntNan(Seed.resources["city"+sourcecityId]['rec2'][0] / 3600); var citymax_Stone = parseIntNan(Seed.resources["city"+sourcecityId]['rec3'][0] / 3600); var citymax_Ore = parseIntNan(Seed.resources["city"+sourcecityId]['rec4'][0] / 3600); var citymax_Aether = parseIntNan(Seed.resources["city"+sourcecityId]['rec5'][0]); var citymax_Gold = parseIntNan(Seed.citystats["city"+sourcecityId]['gold']); if (!rev) { var carry_Food = parseIntNan(citymax_Food - target_Food); var carry_Wood = parseIntNan(citymax_Wood - target_Wood); var carry_Stone = parseIntNan(citymax_Stone - target_Stone); var carry_Ore = parseIntNan(citymax_Ore - target_Ore); var carry_Aether = parseIntNan(citymax_Aether - target_Aether); var carry_Gold = 0; } else { var tgtcitymax_Food = parseIntNan(Seed.resources["city"+destcityId]['rec1'][0] / 3600); var tgtcitymax_Wood = parseIntNan(Seed.resources["city"+destcityId]['rec2'][0] / 3600); var tgtcitymax_Stone = parseIntNan(Seed.resources["city"+destcityId]['rec3'][0] / 3600); var tgtcitymax_Ore = parseIntNan(Seed.resources["city"+destcityId]['rec4'][0] / 3600); var tgtcitymax_Aether = parseIntNan(Seed.resources["city"+destcityId]['rec5'][0]); var tgtcitymax_Gold = parseIntNan(Seed.citystats["city"+destcityId]['gold']); var carry_Food = parseIntNan(min_Food - tgtcitymax_Food); var carry_Wood = parseIntNan(min_Wood - tgtcitymax_Wood); var carry_Stone = parseIntNan(min_Stone - tgtcitymax_Stone); var carry_Ore = parseIntNan(min_Ore - tgtcitymax_Ore); var carry_Aether = parseIntNan(min_Aether - tgtcitymax_Aether); var carry_Gold = 0; } if (carry_Food < 0 || !ship_Food) carry_Food = 0; if (carry_Wood < 0 || !ship_Wood) carry_Wood = 0; if (carry_Stone < 0 || !ship_Stone) carry_Stone = 0; if (carry_Ore < 0 || !ship_Ore) carry_Ore = 0; if (carry_Aether < 0 || !ship_Aether) carry_Aether = 0; if (!rev) { if (trade_Food > 0 && (carry_Food > trade_Food)) carry_Food = parseIntNan(trade_Food); if (trade_Wood > 0 && (carry_Wood > trade_Wood)) carry_Wood = parseIntNan(trade_Wood); if (trade_Stone > 0 && (carry_Stone > trade_Stone)) carry_Stone = parseIntNan(trade_Stone); if (trade_Ore > 0 && (carry_Ore > trade_Ore)) carry_Ore = parseIntNan(trade_Ore); if (trade_Aether > 0 && (carry_Aether > trade_Aether)) carry_Aether = parseIntNan(trade_Aether); } else { // reverse trans up to keep value (not min value) if (carry_Food > 0 && (target_Food > min_Food)) carry_Food = parseIntNan(target_Food - tgtcitymax_Food); if (carry_Wood > 0 && (target_Wood > min_Wood)) carry_Wood = parseIntNan(target_Wood - tgtcitymax_Wood); if (carry_Stone > 0 && (target_Stone > min_Stone)) carry_Stone = parseIntNan(target_Stone - tgtcitymax_Stone); if (carry_Ore > 0 && (target_Ore > min_Ore)) carry_Ore = parseIntNan(target_Ore - tgtcitymax_Ore); if (carry_Aether > 0 && (target_Aether > min_Aether)) carry_Aether = parseIntNan(target_Aether - tgtcitymax_Aether); // don't attempt to reverse transport more than you actually have available... if (carry_Food > citymax_Food) carry_Food = parseIntNan(citymax_Food); if (carry_Wood > citymax_Wood) carry_Wood = parseIntNan(citymax_Wood); if (carry_Stone > citymax_Stone) carry_Stone = parseIntNan(citymax_Stone); if (carry_Ore > citymax_Ore) carry_Ore = parseIntNan(citymax_Ore); if (carry_Aether > citymax_Aether) carry_Aether = parseIntNan(citymax_Aether); } carry_Aether *= 5; // Multiply by 5 to account for 5 times less carrying capacity var unit = 9; if (a['TroopType'] && a['TroopType']!=0) { unit = a['TroopType']; } var Troops = parseInt(Seed.units['city' + sourcecityId]["unt"+unit]); if(Troops < Options.TransportOptions.MinWagons) { // insufficient troops! actionLog(Cities.byID[sourcecityId].name+": Insufficient troops available for transport",'TRANSPORT'); return; } var LoadUnit = t.getLoadUnit(unit,sourcecityId); var MaxMarchSize = March.RallyPoint(sourcecityId).maxSize; var maxload = MaxMarchSize * LoadUnit; if (Troops < MaxMarchSize) { maxload = Troops * LoadUnit; } if (maxload>0) maxload = maxload - 1; // avoid max load problems var slots = Number(March.getEmptySlots(sourcecityId)); if (parseInt(slots) <=Number(Options.FreeRallySlots)) { // no free slots - don't bother server! if (GlobalOptions.ExtendedDebugMode) {actionLog(Cities.byID[sourcecityId].name+": No available rally slots",'TRANSPORT');} return; } // apportion resources if too many to carry at once... var shift_Food = parseIntNan(maxload / 9); // Total of 9 portions var shift_Wood = parseIntNan(maxload / 9); var shift_Stone = parseIntNan(maxload / 9); var shift_Ore = parseIntNan(maxload / 9); var shift_Aether = parseIntNan(maxload / 9 * 5); // Aetherstone takes 5 of 9 portions - This gives us extra capacity if there's no aether if ((maxload - carry_Food - carry_Wood - carry_Stone - carry_Ore - carry_Aether) < 0){ var shift_spare=0; // Check: See if load/9 is to big for some resources... if (carry_Food < shift_Food) { shift_spare += (shift_Food - carry_Food); shift_Food = carry_Food; } if (carry_Wood < shift_Wood) { shift_spare += (shift_Wood - carry_Wood); shift_Wood = carry_Wood; } if (carry_Stone < shift_Stone) { shift_spare += (shift_Stone - carry_Stone); shift_Stone = carry_Stone; } if (carry_Ore < shift_Ore) { shift_spare += (shift_Ore - carry_Ore); shift_Ore = carry_Ore; } if (carry_Aether < shift_Aether) { shift_spare += (shift_Aether - carry_Aether); shift_Aether = carry_Aether; } while (shift_spare > 1) { var PriorityList = Options.TransportOptions.Priority.split(","); for (var p in PriorityList) { var res = PriorityList[p]; if (res==1) { // food if (carry_Food < (shift_Food + shift_spare)){ shift_Food = carry_Food; shift_spare = shift_spare - carry_Food; } else{ shift_Food = (shift_Food + shift_spare); shift_spare = 0; } } if (res==2) { // wood if (carry_Wood < (shift_Wood + shift_spare)){ shift_Wood = carry_Wood; shift_spare = shift_spare - carry_Wood; } else { shift_Wood = shift_Wood + shift_spare; shift_spare = 0; } } if (res==3) { // stone if (carry_Stone < (shift_Stone + shift_spare)){ shift_Stone = carry_Stone; shift_spare = shift_spare - carry_Stone; } else { shift_Stone = shift_Stone + shift_spare; shift_spare = 0; } } if (res==4) { // ore if (carry_Ore < (shift_Ore + shift_spare)) { shift_Ore = carry_Ore; shift_spare = shift_spare - carry_Ore; } else { shift_Ore = shift_Ore + shift_spare; shift_spare = 0; } } if (res==5) { // aether if (carry_Aether < (shift_Aether + shift_spare)) { shift_Aether = carry_Aether; shift_spare = shift_spare - carry_Aether; } else { shift_Aether = shift_Aether + shift_spare; shift_spare = 0; } } } } carry_Food = shift_Food; carry_Wood = shift_Wood; carry_Stone = shift_Stone; carry_Ore = shift_Ore; carry_Aether = shift_Aether; } // ship gold if any spare capacity left var spaceleft = maxload - (carry_Food + carry_Wood + carry_Stone + carry_Ore + carry_Aether); if ((spaceleft > 0) && ship_Gold) { if (!rev) { if (spaceleft > (citymax_Gold - target_Gold)) { carry_Gold = (citymax_Gold - target_Gold); if (carry_Gold < 0) carry_Gold = 0; } else { carry_Gold = spaceleft; } if (trade_Gold > 0 && (carry_Gold > trade_Gold)) carry_Gold = parseInt(trade_Gold); } else { carry_Gold = (min_Gold - tgtcitymax_Gold); if (carry_Gold < 0) carry_Gold = 0; if (carry_Gold > 0) { if (spaceleft > (target_Gold - tgtcitymax_Gold)) { carry_Gold = (target_Gold - tgtcitymax_Gold); if (carry_Gold < 0) carry_Gold = 0; } else { carry_Gold = spaceleft; } } if (carry_Gold > citymax_Gold) carry_Gold = parseIntNan(citymax_Gold); } if(Cities.byID[destcityId] && Options.TransportOptions.GoldCap) { var destcity_Gold = parseIntNan(Seed.citystats["city"+destcityId]['gold']); if (destcity_Gold + carry_Gold > t.Gold_Capacity) { carry_Gold = t.Gold_Capacity - destcity_Gold; if (carry_Gold<0) { carry_Gold = 0; } } } } var totalres = carry_Food + carry_Wood + carry_Stone + carry_Ore + carry_Aether + carry_Gold; var wagons_needed = Math.ceil((totalres) / LoadUnit); var IgnoreMinCheck = (!rev && (TotalTrade==totalres)); // don't check min troops if transporting the set amount of resources user has asked to be transported if (wagons_needed < Options.TransportOptions.MinWagons && !IgnoreMinCheck) { if (GlobalOptions.ExtendedDebugMode && !rev) { actionLog(Cities.byID[sourcecityId].name+": Small transport skipped : ("+wagons_needed+" for "+totalres+" load)",'TRANSPORT'); } return; } if (wagons_needed > MaxMarchSize) { // don't bother server with this either, we can trust my calculations I hope!! if (GlobalOptions.ExtendedDebugMode) { actionLog(Cities.byID[sourcecityId].name+": Maximum march size exceeded : ("+wagons_needed+"/"+MaxMarchSize+" for "+totalres+" load)",'TRANSPORT'); } return; } if (totalres > 0) { // final safety net t.autodelay = Options.TransportOptions.intervalSecs; // march is required, so delay subsequent loop t.loopaction = true; var params = uW.Object.clone(uW.g_ajaxparams); params.cid = sourcecityId; params.kid = 0; params.type = 1; params.xcoord = xcoord; params.ycoord = ycoord; params.r1 = carry_Food; params.r2 = carry_Wood; params.r3 = carry_Stone; params.r4 = carry_Ore; params.r5 = parseInt(carry_Aether/5); params.gold = carry_Gold; params["u"+unit] = wagons_needed; March.addMarch(params, function(rslt){ if (rslt.ok) { if (!rev) { actionLog(Cities.byID[sourcecityId].name+": "+wagons_needed+" "+uW.unitcost["unt"+unit][0]+" transported goods to "+targetname,'TRANSPORT'); } else { actionLog(Cities.byID[sourcecityId].name+": "+wagons_needed+" "+uW.unitcost["unt"+unit][0]+" reverse-transported goods back to "+targetname,'TRANSPORT'); Options.TransportOptions.Routes[idx]["rev_eta"] = parseInt(rslt.eta); saveOptions(); } } else { if (!rslt.msg) {rslt.msg = 'Error Code ('+rslt.error_code+')';} if (!rev) { actionLog(Cities.byID[sourcecityId].name+": Transport Error - "+rslt.msg,'TRANSPORT'); } else { actionLog(Cities.byID[sourcecityId].name+": Reverse Transport Error - "+rslt.msg,'TRANSPORT'); } } }); } }, ManualTransport : function () { var t = Tabs.Transport; if (!t.validateScreenFields('send')) { return; } ById('pbtrMessages').innerHTML = "Sending manual transport..."; var a = t.RouteObject; var sourcecityId = parseIntNan(a["cityId"]); var xcoord = a["target_x"]; var ycoord = a["target_y"]; var carry_Food = parseIntNan(a["trade_Food"]); var carry_Wood = parseIntNan(a["trade_Wood"]); var carry_Stone = parseIntNan(a["trade_Stone"]); var carry_Ore = parseIntNan(a["trade_Ore"]); var carry_Aether = parseIntNan(a["trade_Aether"]); var carry_Gold = parseIntNan(a["trade_Gold"]); var totalres = carry_Food+carry_Wood+carry_Stone+carry_Ore+(carry_Aether*5)+carry_Gold; var unit = 9; if (a['TroopType'] && a['TroopType']!=0) { unit = a['TroopType']; } var Troops = parseInt(Seed.units['city' + sourcecityId]["unt"+unit]); if(Troops <= 0) { Troops=0; } var LoadUnit = t.getLoadUnit(unit,sourcecityId); var MaxMarchSize = March.RallyPoint(sourcecityId).maxSize; var maxload = MaxMarchSize * LoadUnit; if (Troops < MaxMarchSize) { maxload = Troops * LoadUnit; } if (maxload>0) maxload = maxload - 1; // avoid max load problems if (totalres > maxload) { ById('pbtrMessages').innerHTML = "Too much to carry!"; return; } var slots = Number(March.getEmptySlots(sourcecityId)); if (parseInt(slots) <=0) { // no free slots - don't bother server! ById('pbtrMessages').innerHTML = tx("No free rally point slots"); return; } var wagons_needed = Math.ceil((totalres) / LoadUnit); if (wagons_needed > MaxMarchSize) { // don't bother server with this either, we can trust my calculations I hope!! ById('pbtrMessages').innerHTML = "Maximum march size exceeded : ("+wagons_needed+"/"+MaxMarchSize+" for "+totalres+" load)"; return; } if (totalres > 0) { // final safety net var params = uW.Object.clone(uW.g_ajaxparams); params.cid = sourcecityId; params.kid = 0; params.type = 1; params.xcoord = xcoord; params.ycoord = ycoord; params.r1 = carry_Food; params.r2 = carry_Wood; params.r3 = carry_Stone; params.r4 = carry_Ore; params.r5 = carry_Aether; params.gold = carry_Gold; params["u"+unit] = wagons_needed; March.addMarch(params, function(rslt){ if (rslt.ok) { ById('pbtrMessages').innerHTML = "Manual transport successful!"; } else { if (!rslt.msg) {rslt.msg = 'Error Code ('+rslt.error_code+')';} ById('pbtrMessages').innerHTML = rslt.msg; } }); } }, } /** Reassign Tab **/ Tabs.Reassign = { tabOrder: 2040, tabLabel : 'Reassign', tabColor : 'brown', myDiv : null, dcp0 : null, dcp1 : null, timer : null, autodelay : 0, loopaction : false, more : false, marchspeed : 0, LoopCounter : 0, EditRouteNumber : -1, EditMode : false, Options : { Running: false, Toggle : false, Routes : [], ReassignInterval : 60, intervalSecs : 5, ReverseReassign : false, ThroneCheck: false, MarchSpeed: 0, ReassignKnights: false, }, NewRouteObject : { cityId: null, target_cityId: null, troops: {}, //id{send,keep} keep: {}, Active: true, OverrideTime: false, Interval : 10, LastChecked : 0, }, RouteObject : null, init : function (div) { var t = Tabs.Reassign; t.myDiv = div; if (!Options.ReassignOptions) { Options.ReassignOptions = t.Options; } else { for (var y in t.Options) { if (!Options.ReassignOptions.hasOwnProperty(y)) { Options.ReassignOptions[y] = t.Options[y]; } } } uWExportFunction ('pbreDeleteRoute', Tabs.Reassign.DeleteRoute); uWExportFunction ('pbreEditRoute', Tabs.Reassign.EditRoute); uWExportFunction ('pbreSendRoute', Tabs.Reassign.SendRoute); uWExportFunction ('pbreToggleActive', Tabs.Reassign.ToggleActive); if (Options.ReassignOptions.Toggle) AddSubTabLink('Reassign',t.toggleAutoReassignState, 'ReassignToggleTab'); SetToggleButtonState('Reassign',Options.ReassignOptions.Running,'Reassign'); var m = '
    '+tx('AUTOMATED TROOP REASSIGN')+'
    '; m += '
    '; m += '
     '+tx("Add toggle button to main screen header")+''+tx('Current Reassign Speed')+':   
    '; m += ''; m += ''; m += '
    '+tx('Only reassign when march speed for reassign is at least')+'  % '+tx("Check routes every:")+'  '+tx("minutes")+'
    '+tx('Reassign with Knights')+' '+tx("March Interval:")+'  '+tx("seconds")+'
    '+tx('Reverse reassign if troop numbers fall below keep value')+'
    '; m += '
     
    '; m += '
     

    '; div.innerHTML = m; ToggleOption('ReassignOptions','btReassignToggle','Toggle'); ById('btAutoReassignState').addEventListener('click', function(){ t.toggleAutoReassignState(this); }, false); ById('pbreassigninterval').addEventListener('keyup', function () { if (isNaN(ById('pbreassigninterval').value)) { ById('pbreassigninterval').value = 60; } Options.ReassignOptions.ReassignInterval = ById('pbreassigninterval').value; saveOptions(); }, false); ById('pbrmarchinterval').addEventListener('keyup', function () { if (parseIntNan(ById('pbrmarchinterval').value)<1) { ById('pbrmarchinterval').value = 5; } if (parseIntNan(ById('pbrmarchinterval').value)<2) { ById('pbrmarchinterval').value = 2; } Options.ReassignOptions.intervalSecs = parseIntNan(ById('pbrmarchinterval').value); saveOptions(); }, false); ById('pbrevreassign').addEventListener('change', function(){ Options.ReassignOptions.ReverseReassign = ById('pbrevreassign').checked; saveOptions(); }, false); ById('pbreassignknights').addEventListener('change', function(){ Options.ReassignOptions.ReassignKnights = ById('pbreassignknights').checked; saveOptions(); }, false); ById('btreMarchTR').addEventListener ('change', function() { Options.ReassignOptions.ThroneCheck = this.checked; saveOptions(); }, false); ById('btreMarchTRSpeed').addEventListener ('change', function() { Options.ReassignOptions.MarchSpeed = parseIntNan(this.value); saveOptions(); }, false); t.PaintRoutes(); // start autoreassign loop timer to start in 12 seconds... if (Options.ReassignOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(0,false);}, (12 * 1000)); } }, toggleAutoReassignState: function(obj){ var t = Tabs.Reassign; obj = ById('btAutoReassignState'); if (Options.ReassignOptions.Running == true) { Options.ReassignOptions.Running = false; obj.value = tx("Reassign = OFF"); clearTimeout(t.timer); } else { Options.ReassignOptions.Running = true; obj.value = tx("Reassign = ON"); // clear the last checked field on all routes var n = Options.ReassignOptions.Routes.length; while (n--) { Options.ReassignOptions.Routes[n].LastChecked = 0; } t.timer = setTimeout(function () { t.doAutoLoop(0,false);}, 0); } saveOptions(); SetToggleButtonState('Reassign',Options.ReassignOptions.Running,'Reassign'); }, ClearRoutes : function() { var t = Tabs.Reassign; Options.ReassignOptions.Routes = []; saveOptions(); ById('pbreMessages').innerHTML = "All reassign routes deleted!"; t.PaintRoutes(); }, PaintRoutes : function () { var t = Tabs.Reassign; t.EditMode = false; var z = ''; var r = 0; var Routes = false; var z= '
    '+tx('REASSIGN ROUTES')+'

    '; z += '
    '; z += ''; z += '
    '+strButton20(tx('New Route'), 'id=pbreNewRoute')+' '+strButton20(tx('Delete ALL Routes'), 'id=pbreClearRoutes')+' 
    '; z += '
    '; var FromList = {0:"-- "+tx('Select City')+" --"}; var BulkAction = {0:"-- "+tx('Select Action')+" --",1:tx("Delete ALL Marches From"),2:tx("Delete ALL Marches To"),3:tx("Transfer ALL Marches From"),4:tx("Transfer ALL Marches To"),5:tx("Disable ALL Marches From"),6:tx("Disable ALL Marches To"),7:tx("Enable ALL Marches From"),8:tx("Enable ALL Marches To")}; var CityList = {0:"-- "+tx('Select City')+" --"}; for (g in Cities.byID) { CityList[Cities.byID[g].id] = Cities.byID[g].name; } var n = Options.ReassignOptions.Routes.length; while (n--) { var a = Options.ReassignOptions.Routes[n]; var fid = -1; var fromname = ''+tx('No City')+'!'; if (Cities.byID[a.cityId]) { fromname = Cities.byID[a.cityId].name; fid = a.cityId; } FromList[fid] = fromname; var fid = -1; var toname = ''+tx('No City')+'!'; if (Cities.byID[a.target_cityId]) { toname = Cities.byID[a.target_cityId].name; fid = a.target_cityId; } FromList[fid] = toname; Routes = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ''; z += ''; var zz = '
    '+tx('Source')+''+tx('Destination')+''+uW.g_js_strings.commonstr.troops+''+tx('Active')+''+Options.ReassignOptions.Routes.length+' '+tx('Routes')+'
    '+fromname+''+toname+'
    '; // loop troops var c = 0; var LineBreak = 3; if (GlobalOptions.btWinSize.x == 750) {LineBreak = 2;} if (GlobalOptions.btWinSize.x == 1250) {LineBreak = 4;} for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; if (a.troops[i]) { var nn = ''; nn += ''; if (c%LineBreak==0) zz+= ''; zz += nn; c++; } } zz += '
    '+TroopImage(i)+''+tx("Keep")+': '+addCommas(parseIntNan(a.keep[i]))+'

    ' z += ''+zz+''; z += '


    '; z += 'Edit Del'; z += ''; } if (!Routes) { z += '


    '+tx('No reassign routes')+'
    '; } z += '

    '; ById('pbreRouteDetail').innerHTML = z; ById('pbrebulkactions').innerHTML = tx("Bulk Action")+": "+htmlSelector(BulkAction,0,'class=btInput id=pbrebulkaction')+' '+htmlSelector(FromList,0,'class=btInput id=pbrebulkfrom')+' To '+htmlSelector(CityList,0,'class=btInput id=pbrebulkto')+' '+strButton8(tx('Go'),'id=pbrebulkgo'); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('pbrebulkgo').addEventListener('click', function(){t.DoBulkAction(ById('pbrebulkaction').value,ById('pbrebulkfrom').value,ById('pbrebulkto').value);}, false); ById('pbrebulkaction').addEventListener('change', function(e){ if (e.target.value==3 || e.target.value==4) { jQuery('#pbrebulknew').removeClass("divHide"); } else { jQuery('#pbrebulknew').addClass("divHide"); } }, false); ById('pbreClearRoutes').addEventListener ('click', function() {t.ClearRoutes();}, false); ById('pbreNewRoute').addEventListener ('click', function() {t.NewRoute();}, false); t.updateRoutes(); }, DoBulkAction : function (Action,From,To) { var t = Tabs.Reassign; ById('pbreMessages').innerHTML = " "; if (Action==0 || From==0) return; if ((Action==3 || Action==4) && To==0) return; for (var i=Number(Options.ReassignOptions.Routes.length-1); i>-1 ;i--) { if (Action==1 || Action==3 || Action==5 || Action==7) { if ((Options.ReassignOptions.Routes[i].cityId == From) || (From==-1 && !Cities.byID[Options.ReassignOptions.Routes[i].cityId])) { if (Action==1) { Options.ReassignOptions.Routes.splice(i,1); } else { if (Action==3) { Options.ReassignOptions.Routes[i].cityId = To; } else { if (Action==5) { Options.ReassignOptions.Routes[i].Active = false; } else { if (Action==7) { Options.ReassignOptions.Routes[i].Active = true; } } } } } } if (Action==2 || Action==4 || Action==6 || Action==8) { if (parseIntNan(Options.ReassignOptions.Routes[i].target_cityId) != 0) { if ((Options.ReassignOptions.Routes[i].target_cityId == From) || (From==-1 && !Cities.byID[Options.ReassignOptions.Routes[i].target_cityId])) { if (Action==2) { Options.ReassignOptions.Routes.splice(i,1); } else { if (Action==4) { Options.ReassignOptions.Routes[i].target_cityId = To; } else { if (Action==6) { Options.ReassignOptions.Routes[i].Active = false; } else { if (Action==8) { Options.ReassignOptions.Routes[i].Active = true; } } } } } } } } saveOptions(); if (Action==1 || Action==2) { ById('pbreMessages').innerHTML = "Reassign routes deleted!"; } else { if (Action==3 || Action==4) { ById('pbreMessages').innerHTML = "Reassign routes relocated!"; } } t.PaintRoutes(); }, DeleteRoute : function (entry) { var t = Tabs.Reassign; Options.ReassignOptions.Routes.splice(entry,1); saveOptions(); ById('pbreMessages').innerHTML = "Reassign route deleted!"; t.PaintRoutes(); }, ToggleActive : function (entry) { var t = Tabs.Reassign; Options.ReassignOptions.Routes[entry].Active = !Options.ReassignOptions.Routes[entry].Active; saveOptions(); t.updateRoutes(); }, SendRoute : function (entry) { var t = Tabs.Reassign; Options.ReassignOptions.Routes[entry].LastChecked = 0; saveOptions(); t.updateRoutes(); }, EditRoute : function (entry) { var t = Tabs.Reassign; t.EditRouteNumber = entry; t.EditMode = true; ById('pbreMessages').innerHTML = " "; t.RouteObject = {}; for (var y in Options.ReassignOptions.Routes[t.EditRouteNumber]) { t.RouteObject[y] = Options.ReassignOptions.Routes[t.EditRouteNumber][y]; } if (!t.RouteObject.OverrideTime) { t.RouteObject.Interval = Options.ReassignOptions.ReassignInterval; } t.PaintNewRoutePanel(); }, NewRoute : function () { var t = Tabs.Reassign; t.EditRouteNumber = -1; t.EditMode = true; ById('pbreMessages').innerHTML = " "; if (!t.RouteObject) { t.RouteObject = {}; for (var y in t.NewRouteObject) { t.RouteObject[y] = t.NewRouteObject[y]; } t.RouteObject.Interval = Options.ReassignOptions.ReassignInterval; } t.PaintNewRoutePanel(); }, show : function (){ var t = Tabs.Reassign; t.PaintOverview(); if (t.EditMode) { t.updateResources(); } else { t.updateRoutes(); } }, EverySecond : function () { var t = Tabs.Reassign; t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh reassign march speed and overview display every 2 seconds t.marchspeed = Math.floor(equippedthronestats(67))+Math.floor(equippedthronestats(71))+Math.floor(equippedthronestats(163)); // march speed is reassign and general march speed added together if (tabManager.currentTab.name == 'Reassign' && Options.btWinIsOpen){ t.PaintOverview(); if (t.EditMode) { // paint from and to city resources t.updateResources(); } else { // paint time on each route? t.updateRoutes(); } } } }, PaintOverview : function () { var t = Tabs.Reassign; if (Options.ReassignOptions.ThroneCheck && (t.marchspeed < Number(Options.ReassignOptions.MarchSpeed))) { ts = ''+t.marchspeed+'%'; } else { ts = t.marchspeed+'%'; } ById("btreMarchCurrTR").innerHTML = ts; }, PaintNewRoutePanel : function () { var t = Tabs.Reassign; var fromidx = null; var toidx = null; if (t.EditRouteNumber<0) { var z= '
    '+tx('NEW REASSIGN ROUTE')+'

    '; fromidx = Cities.byID[uW.currentcityid].idx; // default new route from current city } else { var z= '
    '+tx('EDIT REASSIGN ROUTE')+'

    '; } // remember last route details.... (or saved route details) if (Cities.byID[t.RouteObject.cityId]) { fromidx = Cities.byID[t.RouteObject.cityId].idx; } if (Cities.byID[t.RouteObject.target_cityId]) { toidx = Cities.byID[t.RouteObject.target_cityId].idx; } z += ''; z += ''; z += ''; z += ''; z += ''; z += '
     '+tx("From City")+': 
     '+tx("To City")+': 
      '+tx('Override reassign interval')+''+tx("Reassign Interval")+':  '+tx("minutes")+'
      '+tx('Select/Unselect ALL')+'  

    '; var c = 0; var LineBreak = 7; if (GlobalOptions.btWinSize.x == 750) {LineBreak = 5;} if (GlobalOptions.btWinSize.x == 1250) {LineBreak = 8;} z += ''; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; var n = ''; if (c%LineBreak==0) z+= ''; z+=n; c++; } z += '
    '; n += ''; n += '
    '+TroopImageBig(i)+''+uW.unitnamedesctranslated['unt'+i][0]+'
    '+tx('Keep')+':
    ' z += '
     '+strButton20(tx('Save Route'), 'id=pbreSaveRoute')+' '; if (t.EditRouteNumber>=0) { z += strButton20(tx('Save a Copy'), 'id=pbreCopyRoute')+' '; } z += strButton20(uW.g_js_strings.commonstr.cancel, 'id=pbreCancelRoute')+' 
    '; ById('pbreRouteDetail').innerHTML = z; t.dcp0 = new CdispCityPicker('pbreassignfrom', ById('pbrfromcity'), true, t.updateResources, fromidx); t.dcp1 = new CdispCityPicker('pbreassignto', ById('pbrtocity'), true, t.updateResources, toidx); ById('pbroverrideintervalchk').addEventListener('click', function () { var disablerow = (!ById('pbroverrideintervalchk').checked); ById('pbroverrideinterval').disabled = disablerow; if (disablerow) { ById('pbroverrideinterval').value = Options.ReassignOptions.ReassignInterval; } }, false); ById('pbrzeroise').addEventListener('click', function() { for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; ById('pbReinKeep'+i).value = 0; } }, false); ById('pbrdefault').addEventListener('click', function() { if (t.dcp0 && t.dcp0.city) { for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; ById('pbReinKeep'+i).value = getCityTroops(i,t.dcp0.city.id,true); } } }, false); ById('pbrselectall').addEventListener('click', function() { for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; ById('chkRein'+i).checked = ById('pbrselectall').checked; ById('pbReinKeep'+i).disabled = (!ById('pbrselectall').checked); } }, false); for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; t.addListeners(i); } ById('pbreSaveRoute').addEventListener ('click', function() {t.SaveRoute(false);}, false); if (ById('pbreCopyRoute')) { ById('pbreCopyRoute').addEventListener ('click', function() {t.SaveRoute(true);}, false); } ById('pbreCancelRoute').addEventListener ('click', function() {t.RouteObject = null; t.PaintRoutes();}, false); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); t.updateResources(); }, addListeners : function(Troop) { var T1 = 'pbReinKeep'+Troop; var T2 = 'chkRein'+Troop; ById(T1).addEventListener('keyup', function(){ if (isNaN(ById(T1).value)) ById(T1).value=0; }, false); ById(T2).addEventListener('click', function(){ ById(T1).disabled = (!ById(T2).checked); },false); }, SaveRoute : function (CopyRoute) { var t = Tabs.Reassign; if (!t.validateScreenFields('save')) { return; } if (t.EditRouteNumber<0 || CopyRoute) { Options.ReassignOptions.Routes.push(JSON2.parse(JSON2.stringify(t.RouteObject))); // create new object in array if (CopyRoute) { t.RouteObject = null; } // clear route object } else { t.RouteObject.LastChecked = 0; Options.ReassignOptions.Routes[t.EditRouteNumber] = t.RouteObject; t.RouteObject = null; // clear route object } ById('pbreMessages').innerHTML = tx("Reassign route saved")+"!"; t.PaintRoutes(); }, validateScreenFields : function (action) { var t = Tabs.Reassign; if (!t.dcp0.city) { ById('pbreMessages').innerHTML = tx("No source city selected"); return false; } if (!t.dcp1.city) { ById('pbreMessages').innerHTML = tx("No destination city selected"); return false; } if(t.dcp0.city.id==t.dcp1.city.id){ ById('pbreMessages').innerHTML = tx("Cannot reassign to the same city")+"!"; return false; } // copy screen fields to routeobject t.RouteObject.cityId = t.dcp0.city.id; t.RouteObject.target_cityId = t.dcp1.city.id; t.RouteObject.troops = {}; t.RouteObject.keep = {}; var gottroops = false; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; if (ById('chkRein'+i).checked) { gottroops = true; t.RouteObject.troops[i] = true; t.RouteObject.keep[i] = parseIntNan(ById('pbReinKeep'+i).value); } } if(!gottroops){ ById('pbreMessages').innerHTML = tx("You must reassign something")+"!"; return false; } t.RouteObject.OverrideTime = ById('pbroverrideintervalchk').checked; t.RouteObject.Interval = parseIntNan(ById('pbroverrideinterval').value); // validation OK! return true; }, updateResources : function () { var t = Tabs.Reassign; if (!t.dcp0 || !t.dcp0.city) return; // at the moment nothing to do! }, updateRoutes : function () { var t = Tabs.Reassign; if (!tabManager.currentTab || tabManager.currentTab.name != 'Reassign' || !Options.btWinIsOpen) { return; } var n = Options.ReassignOptions.Routes.length; while (n--) { var a = Options.ReassignOptions.Routes[n]; var elstat = ById('pbreRouteStatus'+n); if (elstat) { elstat.innerHTML = '

    '; if (Options.ReassignOptions.Running) { if (a.Active) { if (Options.ReassignOptions.ThroneCheck && (t.marchspeed < Options.ReassignOptions.MarchSpeed)) { elstat.innerHTML = ''+tx('March')+'
    '+tx('Speed')+'!
    '; } else { var now = unixTime(); var interval = Options.ReassignOptions.ReassignInterval*60; if (a.OverrideTime) { interval = a.Interval*60; } var due = a.LastChecked+interval; if (due < now) { elstat.innerHTML = ''+tx('Checking')+'...

    '; } else { elstat.innerHTML = uW.timestr(due-now)+'
    Check Now'; } } } } } } }, doAutoLoop : function (idx,rev) { var t = Tabs.Reassign; clearTimeout(t.timer); if (!Options.ReassignOptions.Running) return; if (idx>=Options.ReassignOptions.Routes.length) { idx=0; } // safety, if route(s) have been deleted. if (idx==0 && !rev) { t.loopaction = false; } // reset loop march indicator for first march t.autodelay = 0; // no delay if no action taken... if (idx= Options.ReassignOptions.Routes.length-1) { if (!t.loopaction) { t.autodelay = Options.ReassignOptions.intervalSecs; } // if no action this loop, apply delay anyway... t.timer = setTimeout(function () { t.doAutoLoop(0,false); }, (t.autodelay * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1,false); }, (t.autodelay * 1000)); } }, doReassigns: function(idx,rev){ var t = Tabs.Reassign; var a = Options.ReassignOptions.Routes[idx]; if (Options.ReassignOptions.ThroneCheck && (t.marchspeed < Options.ReassignOptions.MarchSpeed)) { return; } // if not enough march speed if (!rev) { var sourcecityId = parseIntNan(a["cityId"]); var destcityId = a["target_cityId"]; } else { if (a["rev_eta"] && parseInt(a["rev_eta"]) > uW.unixtime()) { return; } // only one reverse reassign on each route at a time var sourcecityId = a["target_cityId"]; var destcityId = parseIntNan(a["cityId"]); } if (!Cities.byID[sourcecityId]) { return; } // no source city! if (!Cities.byID[destcityId]) { return; } // no destination city! var towerok = (!Options.TowerOptions || !Options.TowerOptions.SaveCityState[sourcecityId] || Options.TowerOptions.SaveCityState[sourcecityId].AllowMarches); if (!towerok) { return; } // source city under attack! var ascensionok = (!Options.BuildOptions || !Options.BuildOptions.AscensionReady[Cities.byID[sourcecityId].idx]); if (!ascensionok) { return; } // source city waiting to ascend! var targetname = Cities.byID[destcityId].name; var xcoord = Cities.byID[destcityId].x; var ycoord = Cities.byID[destcityId].y; var params = uW.Object.clone(uW.g_ajaxparams); params.cid = sourcecityId; params.kid = 0; if (Options.ReassignOptions.ReassignKnights && !rev) { var knt = getAvailableKnights(sourcecityId); if (knt[0]) { knt = knt.sort(function sort(a,b) {a = a['ID'];b = b['ID'];return a == b ? 0 : (a < b ? -1 : 1);}); // sort by reverse id params.kid = knt[0].ID; } } params.type = 5; params.xcoord = xcoord; params.ycoord = ycoord; params.r1 = 0; params.r2 = 0; params.r3 = 0; params.r4 = 0; params.r5 = 0; params.gold = 0; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; params["u"+i] = 0; } var maxsend = March.getMaxSize(sourcecityId); var totalsend = 0; var slots = Number(March.getEmptySlots(sourcecityId)); if (parseInt(slots) <=Number(Options.FreeRallySlots)) { // no free slots - don't bother server! if (GlobalOptions.ExtendedDebugMode) {actionLog(Cities.byID[sourcecityId].name+": No available rally slots",'REASSIGN');} return; } var troopidx = []; for (var ui in CM.UNIT_TYPES){ troopidx.push(CM.UNIT_TYPES[ui]); } for (var j=troopidx.length-1; j>=0; j--) { // reverse order var i = troopidx[j]; if (!Options.ReassignOptions.Routes[idx].troops[i]) { continue; } if (!Seed.cityData.city[destcityId].isPrestigeCity && ((i==13) || (i==14) || (i==15))) {continue; } var keepvalue = parseIntNan(Options.ReassignOptions.Routes[idx].keep[i]); var availtroops = parseIntNan(Seed.units['city'+sourcecityId]['unt'+i]); if (!rev) { var citytotal = getCityTroops(i,sourcecityId,true); if (citytotal > keepvalue) { var sendtroops = parseIntNan(citytotal - keepvalue); if (sendtroops > availtroops) { sendtroops = availtroops; } if (sendtroops < 0) { sendtroops = 0; } params["u"+i] = sendtroops; totalsend += sendtroops; } } else { var citytotal = getCityTroops(i,destcityId,true); if (citytotal < keepvalue) { var sendtroops = parseIntNan(keepvalue - citytotal); if (sendtroops > availtroops) { sendtroops = availtroops; } if (sendtroops < 0) { sendtroops = 0; } params["u"+i] = sendtroops; totalsend += sendtroops; } } if(totalsend > maxsend){ totalsend -= sendtroops; params["u"+i] = parseInt(maxsend-totalsend); totalsend = maxsend; t.more = true; break; } } if (totalsend > 0) { // final safety net t.autodelay = Options.ReassignOptions.intervalSecs; // march is required, so delay subsequent loop t.loopaction = true; March.addMarch(params, function(rslt){ if (rslt.ok) { if (!rev) { actionLog(Cities.byID[sourcecityId].name+": "+totalsend+" troops reassigned to "+targetname,'REASSIGN'); } else { actionLog(Cities.byID[sourcecityId].name+": "+totalsend+" troops reverse-reassigned to "+targetname,'REASSIGN'); Options.ReassignOptions.Routes[idx]["rev_eta"] = parseInt(rslt.eta); saveOptions(); } } else { if (!rslt.msg) {rslt.msg = 'Error Code ('+rslt.error_code+')';} if (!rev) { actionLog(Cities.byID[sourcecityId].name+": Reassign Error - "+rslt.msg,'REASSIGN'); } else { actionLog(Cities.byID[sourcecityId].name+": Reverse Reassign Error - "+rslt.msg,'REASSIGN'); } } }); } }, } /** Attack Tab **/ Tabs.Attack = { tabOrder: 2050, tabLabel : 'Attack', tabColor : 'brown', myDiv : null, dcp0 : null, timer : null, autodelay : 0, loopaction : false, mercmode : 0, mercmatch : {}, searchval : '', LoopCounter : 0, EditRouteNumber : -1, EditMode : false, CrestList : [1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115], AttackOrder : [], // for randomising attack order Options : { Running: false, Toggle : false, intervalSecs : 5, Randomize : false, Routes : [], AttackReport : false, AttackReportInterval : 1, LastAttackReport : 0, MercRunning : false, MercItem : '31228', MercTarget : '', Wave1Count : 0, Wave2Count : 0, FreeRallySlots : 2, }, NewRouteObject : { cityId: null, target_x: '', target_y: '', isWild: false, isMegalith: false, ChampOnly: false, RoundOne: false, RoundOneTroops: {}, LastRoundOne: 0, RoundTwo:true, RoundTwoTroops: {}, LastRoundTwo: 0, Active: true, }, RouteObject : null, init : function (div) { var t = Tabs.Attack; t.myDiv = div; if (!Options.AttackOptions) { Options.AttackOptions = t.Options; } else { for (var y in t.Options) { if (!Options.AttackOptions.hasOwnProperty(y)) { Options.AttackOptions[y] = t.Options[y]; } } } uWExportFunction ('pbatDeleteRoute', Tabs.Attack.DeleteRoute); uWExportFunction ('pbatEditRoute', Tabs.Attack.EditRoute); uWExportFunction ('pbatToggleActive', Tabs.Attack.ToggleActive); if (Options.AttackOptions.Toggle) AddSubTabLink('Attack',t.toggleAutoAttackState, 'AttackToggleTab'); SetToggleButtonState('Attack',Options.AttackOptions.Running,'Attack'); var m = '
    '+tx('AUTOMATED ATTACKS')+'
    '; m += '
    '; m += '
     '+tx("Add toggle button to main screen header")+' 
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
    '+tx("Randomize attack order")+' '+tx("Attack Interval:")+'  '+tx("seconds")+'
    '+tx("Send attack report every")+'  '+tx('hours')+'   '+strButton8(tx('Send Now'), 'id=pbattackreportsend')+''+tx("Keep")+' '+tx("free rally point slots")+'
    '+tx('Mercenary Camp Prize Target')+'
    '; m += '
     
    '; m += '
     

    '; div.innerHTML = m; t.PaintMercDiv(); ToggleOption('AttackOptions','btAttackToggle','Toggle'); ById('btAutoAttackState').addEventListener('click', function(){ t.toggleAutoAttackState(this); }, false); ById('pbattackinterval').addEventListener('keyup', function () { if (parseIntNan(ById('pbattackinterval').value)<1) { ById('pbattackinterval').value = 6; } if (parseIntNan(ById('pbattackinterval').value)<2) { ById('pbattackinterval').value = 2; } Options.AttackOptions.intervalSecs = parseIntNan(ById('pbattackinterval').value); saveOptions(); }, false); ById('pbattackreportsend').addEventListener('click', function () { Options.AttackOptions.LastAttackReport = 0; saveOptions(); t.sendAttackReport(true); }, false); ChangeIntegerOption('AttackOptions','pbattackreportinterval','AttackReportInterval',1,t.sendAttackReport); ChangeIntegerOption('AttackOptions','btatfreerallyslots','FreeRallySlots'); ToggleOption('AttackOptions','pbattackrandom','Randomize'); ToggleOption('AttackOptions','pbattackreport','AttackReport',t.sendAttackReport); t.PaintRoutes(); t.sendAttackReport(); // check every refresh // start autoattack loop timer to start in 8 seconds... if (Options.AttackOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(0,false);}, (8 * 1000)); } }, PaintMercDiv : function () { var t = Tabs.Attack; var m = ''; } if (t.mercmode == 1) { m += tx('Chest Name')+':  '+strButton8('Search','id=pbmercsearchbutton')+' '+strButton8(uW.g_js_strings.commonstr.cancel,'id=pbmercsearchcancel')+''; } if (t.mercmode == 2) { m += tx('Chest Name')+': '+htmlSelector(t.mercmatch,0, 'id=pbmercselectlist style="width:180px;"')+' '+strButton8(uW.g_js_strings.commonstr.cancel,'id=pbmercsearchcancel')+''; } m += '
    '; if (t.mercmode == 0) { var itemname = ''+tx('Unknown Item')+'!'; if (uW.itemlist["i"+Options.AttackOptions.MercItem]) { itemname = uW.itemlist["i"+Options.AttackOptions.MercItem].name; } m += ''+tx('Chest ID')+':    '+itemname+''+uW.g_js_strings.commonstr.target+':   '+tx('Current')+':   '+(Options.AttackOptions.MercRunning?tx('Off'):tx('Auto'))+'
    '; ById('pbatmercdiv').innerHTML = m; t.UpdateMercTarget(); ById('pbautomercstate').addEventListener('click', function(){ t.toggleAutoMercState(this); }, false); ChangeIntegerOption('AttackOptions','pbmerctarget','MercTarget',0,t.UpdateMercTarget); if (t.mercmode == 0) { ById("pbmercitem").addEventListener('change', function(e){ Options.AttackOptions.MercItem = parseIntNan(e.target.value); if (Options.AttackOptions.MercRunning) { t.toggleAutoMercState(); } saveOptions(); t.UpdateMercTarget(); t.PaintMercDiv(); },false); ById("pbmercsearch").addEventListener('click', function(){ t.mercmode = 1; t.PaintMercDiv(); },false); } if (t.mercmode == 1) { ById("pbmercsearchcancel").addEventListener('click', function(){ ById('pbatMessages').innerHTML = " "; t.mercmode = 0; t.PaintMercDiv(); },false); ById("pbmercsearchbutton").addEventListener('click', function(){ t.mercmode = 0; t.searchval = ById('pbmercsearchname').value.toUpperCase(); if (t.searchval.length <3) { ById('pbatMessages').innerHTML = uW.g_js_strings.getAllianceSearchResults.entryatleast3; return; } ById('pbatMessages').innerHTML = tx("Searching..."); t.MercItemSearch(t.searchval); },false); } if (t.mercmode == 2) { ById("pbmercsearchcancel").addEventListener('click', function(){ ById('pbatMessages').innerHTML = " "; t.mercmode = 1; t.PaintMercDiv(); },false); ById("pbmercselectlist").addEventListener('change', function(e){ ById('pbatMessages').innerHTML = " "; Options.AttackOptions.MercItem = e.target.value; if (Options.AttackOptions.MercRunning) { t.toggleAutoMercState(); } saveOptions(); t.mercmode = 0; t.PaintMercDiv(); },false); } }, MercItemSearch : function (searchval) { var t = Tabs.Attack; t.mercmatch = {}; t.mercmatch[0] = "-- "+tx('Select Item')+" --"; for (var i in uW.itemlist) { var item = uW.itemlist[i]; var id = i.split('i')[1]; if (item.name.toUpperCase().indexOf(searchval) != -1) { t.mercmatch[id] = item.name+' ('+id+')'; } } var nummatches = Object.keys(t.mercmatch).length; if (nummatches==1) { ById('pbatMessages').innerHTML = tx("No matching items found"); return; } if (nummatches==2) { ById('pbatMessages').innerHTML = " "; Options.AttackOptions.MercItem = Object.keys(t.mercmatch)[1]; if (Options.AttackOptions.MercRunning) { t.toggleAutoMercState(); } saveOptions(); t.mercmode = 0; t.PaintMercDiv(); } else { ById('pbatMessages').innerHTML = tx("Please select an item"); t.mercmode = 2; t.PaintMercDiv(); } }, UpdateMercTarget : function() { var t = Tabs.Attack; ById("pbcurrmerc").innerHTML = parseIntNan(Seed.items["i"+Options.AttackOptions.MercItem]); if (parseIntNan(Seed.items["i"+Options.AttackOptions.MercItem]) >= parseIntNan(Options.AttackOptions.MercTarget)) { jQuery('#pbcurrmerc').css('color', 'green'); } else { jQuery('#pbcurrmerc').css('color', 'black'); } }, checkMercItemLimit : function () { var t = Tabs.Attack; if (!Options.AttackOptions.MercRunning) return; if (isNaN(Options.AttackOptions.MercItem) || Options.AttackOptions.MercItem == 0) return; if (isNaN(Options.AttackOptions.MercTarget) || Options.AttackOptions.MercTarget == 0) return; var item = uW.ksoItems[Options.AttackOptions.MercItem]; if (item) { var useamount = parseIntNan(item.count - parseIntNan(Options.AttackOptions.MercTarget)); if (useamount>0) { // automatically use items to bring amount down... if (!item.usable) { // can't use so log it! actionLog('Unable to use Mercenary Prize Chest Item','ATTACK'); } else { actionLog('Attempting to use '+useamount+' '+item.name,'ATTACK'); if (uW.itemlist['i'+Options.AttackOptions.MercItem] && uW.itemlist['i'+Options.AttackOptions.MercItem].subCategory==100) { t.useMysteryChest(Options.AttackOptions.MercItem,useamount); } else { ItemMultiUseController.UseItems(Options.AttackOptions.MercItem,useamount); } } } } var now = unixTime(); Options.AttackOptions.LastMercChecked = now; saveOptions(); }, useMysteryChest : function (itemId,quantity) { var t = Tabs.Attack; function addItemsToSeed(items) { jQuery.each(items, function (key, value) { if (Seed.items["i" + key]) { Seed.items["i" + key] = (parseInt(Seed.items["i" + key]) + parseInt(value)).toString(); uW.ksoItems[key].add(Number(value)) } else { Seed.items["i" + key] = value.toString(); uW.ksoItems[key].add(Number(value)) } }) } params = uW.Object.clone(uW.g_ajaxparams); params.chestId = itemId; params.cid = uW.currentcityid; params.quantity = quantity; new MyAjaxRequest(uW.g_ajaxpath + "ajax/useMysteryChest.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { CM.InventoryView.removeItemFromInventory(itemId, params.quantity); addItemsToSeed(rslt.items); } }, },true); }, toggleAutoAttackState: function(obj){ var t = Tabs.Attack; obj = ById('btAutoAttackState'); if (Options.AttackOptions.Running == true) { Options.AttackOptions.Running = false; obj.value = tx("Attack = OFF"); clearTimeout(t.timer); } else { Options.AttackOptions.Running = true; obj.value = tx("Attack = ON"); // clear the last round one field on all routes var n = Options.AttackOptions.Routes.length; while (n--) { Options.AttackOptions.Routes[n].LastRoundOne = 0; } t.timer = setTimeout(function () { t.doAutoLoop(0,false);}, 0); t.sendAttackReport(); // check } saveOptions(); SetToggleButtonState('Attack',Options.AttackOptions.Running,'Attack'); }, toggleAutoMercState: function(obj){ var t = Tabs.Attack; obj = ById('pbautomerclabel'); if (Options.AttackOptions.MercRunning == true) { Options.AttackOptions.MercRunning = false; obj.innerHTML = tx("Auto"); jQuery('#pbautomercstate').removeClass("red14"); jQuery('#pbautomercstate').addClass("blue14"); } else { Options.AttackOptions.MercRunning = true; obj.innerHTML = tx("Off"); jQuery('#pbautomercstate').addClass("red14"); jQuery('#pbautomercstate').removeClass("blue14"); Options.AttackOptions.LastMercChecked = 0; } saveOptions(); }, ClearRoutes : function() { var t = Tabs.Attack; Options.AttackOptions.Routes = []; saveOptions(); ById('pbatMessages').innerHTML = tx("All attack routes deleted!"); t.PaintRoutes(); }, PaintRoutes : function () { var t = Tabs.Attack; t.EditMode = false; var z = ''; var r = 0; var Routes = false; var z= '
    '+tx('ATTACK ROUTES')+'

    '; z += '
    '; z += ''; z += '
    '+strButton20(tx('New Route'), 'id=pbatNewRoute')+' '+strButton20(tx('Delete ALL Routes'), 'id=pbatClearRoutes')+' 
    '; z += '
    '; var FromList = {0:"-- "+tx('Select City')+" --"}; var BulkAction = {0:"-- "+tx('Select Action')+" --",1:tx("Delete ALL Attacks From"),2:tx("Transfer ALL Attacks From"),3:tx("Disable ALL Attacks From"),4:tx("Enable ALL Attacks From")}; var CityList = {0:"-- "+tx('Select City')+" --"}; for (g in Cities.byID) { CityList[Cities.byID[g].id] = Cities.byID[g].name; } var n = Options.AttackOptions.Routes.length; while (n--) { var a = Options.AttackOptions.Routes[n]; var fromname = ''+tx('No City')+'!'; var fid = -1; if (Cities.byID[a.cityId]) { fromname = Cities.byID[a.cityId].name; fid = a.cityId; } FromList[fid] = fromname; var toname = coordLink(a.target_x,a.target_y); Routes = true; if (++r % 2) { rowClass = 'evenRow'; } else { rowClass = 'oddRow'; } z += ''; z += ''; z += ''; var RouteOpts = ''; if (a.isWild) RouteOpts += tx('Is Wild')+'
    '; if (a.isMegalith) RouteOpts += tx('Is Megalith')+'
    '; if (a.ChampOnly) RouteOpts += tx('Champ Only'); z += ''; var zz = '
    '+tx('City')+''+uW.g_js_strings.commonstr.target+''+uW.g_js_strings.commonstr.options+''+uW.g_js_strings.commonstr.troops+''+tx('Active')+''+Options.AttackOptions.Routes.length+' '+tx('Routes')+'
    '+fromname+''+toname+''+RouteOpts+'
    '; var LineBreak = 4; if (GlobalOptions.btWinSize.x == 750) {LineBreak = 2;} if (GlobalOptions.btWinSize.x == 1250) {LineBreak = 5;} if (a.RoundOne) { zz += ''; } if (a.RoundTwo) { zz += ''; } zz += '
    '+tx('Wave')+' 1: '; var c = 0; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; if (a.RoundOneTroops[i]) { var nn = ''; nn += ''; if (c%LineBreak==0) zz+= ''; zz += nn; c++; } } zz += '
    '+TroopImage(i)+''+addCommas(parseIntNan(a.RoundOneTroops[i]))+'
    '+tx('Wave')+' 2: '; var c = 0; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; if (a.RoundTwoTroops[i]) { var nn = ''; nn += ''; if (c%LineBreak==0) zz+= ''; zz += nn; c++; } } zz += '
    '+TroopImage(i)+''+addCommas(parseIntNan(a.RoundTwoTroops[i]))+'

    ' z += ''+zz+''; z += ''; z += 'Edit Del'; z += ''; } if (!Routes) { z += '


    '+tx('No attack routes')+'
    '; } z += '

    '; ById('pbatRouteDetail').innerHTML = z; ById('pbatbulkactions').innerHTML = tx("Bulk Action")+": "+htmlSelector(BulkAction,0,'class=btInput id=pbatbulkaction')+' '+htmlSelector(FromList,0,'class=btInput id=pbatbulkfrom')+' To '+htmlSelector(CityList,0,'class=btInput id=pbatbulkto')+' '+strButton8(tx('Go'),'id=pbatbulkgo'); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); ById('pbatbulkgo').addEventListener('click', function(){t.DoBulkAction(ById('pbatbulkaction').value,ById('pbatbulkfrom').value,ById('pbatbulkto').value);}, false); ById('pbatbulkaction').addEventListener('change', function(e){ if (e.target.value==2) { jQuery('#pbatbulknew').removeClass("divHide"); } else { jQuery('#pbatbulknew').addClass("divHide"); } }, false); ById('pbatClearRoutes').addEventListener ('click', function() {t.ClearRoutes();}, false); ById('pbatNewRoute').addEventListener ('click', function() {t.NewRoute();}, false); }, DoBulkAction : function (Action,From,To) { var t = Tabs.Attack; ById('pbatMessages').innerHTML = " "; if (Action==0 || From==0) return; if (Action==2 && To==0) return; for(var i=Number(Options.AttackOptions.Routes.length-1); i>-1 ;i--) { if ((Options.AttackOptions.Routes[i].cityId == From) || (From==-1 && !Cities.byID[Options.AttackOptions.Routes[i].cityId])) { if (Action==1) { Options.AttackOptions.Routes.splice(i,1); } else { if (Action==2) { Options.AttackOptions.Routes[i].cityId = To; } else { if (Action==3) { Options.AttackOptions.Routes[i].Active = false; } else { if (Action==4) { Options.AttackOptions.Routes[i].Active = true; } } } } } } saveOptions(); if (Action==1) { ById('pbatMessages').innerHTML = tx("Attack routes deleted")+"!"; } else { if (Action==2) { ById('pbatMessages').innerHTML = tx("Attack routes relocated")+"!"; } } t.PaintRoutes(); }, DeleteRoute : function (entry) { var t = Tabs.Attack; Options.AttackOptions.Routes.splice(entry,1); saveOptions(); ById('pbatMessages').innerHTML = tx("Attack route deleted")+"!"; t.PaintRoutes(); }, ToggleActive : function (entry) { var t = Tabs.Attack; Options.AttackOptions.Routes[entry].Active = !Options.AttackOptions.Routes[entry].Active; saveOptions(); }, EditRoute : function (entry) { var t = Tabs.Attack; t.EditRouteNumber = entry; t.EditMode = true; ById('pbatMessages').innerHTML = " "; t.RouteObject = {}; for (var y in Options.AttackOptions.Routes[t.EditRouteNumber]) { t.RouteObject[y] = Options.AttackOptions.Routes[t.EditRouteNumber][y]; } t.PaintNewRoutePanel(); }, NewRoute : function (xcoord,ycoord) { var t = Tabs.Attack; t.EditRouteNumber = -1; t.EditMode = true; ById('pbatMessages').innerHTML = " "; if (!t.RouteObject) { t.RouteObject = {}; for (var y in t.NewRouteObject) { t.RouteObject[y] = t.NewRouteObject[y]; } } if (xcoord && ycoord) { t.RouteObject.target_x = xcoord; t.RouteObject.target_y = ycoord; } else { if (ById('maparea_map').style.display != "none") { t.RouteObject.target_x = ById('mapXCoor').value; t.RouteObject.target_y = ById('mapYCoor').value; } } t.PaintNewRoutePanel(); }, show : function (){ var t = Tabs.Attack; t.PaintOverview(); }, EverySecond : function () { var t = Tabs.Attack; var now = unixTime(); t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh overview display every 2 seconds if (tabManager.currentTab.name == 'Attack' && Options.btWinIsOpen){ t.PaintOverview(); } } if (t.LoopCounter%3==0 && Options.AttackOptions.Running) { // check abandon wilds every 3 seconds setTimeout(t.checkAbandonWild,0); // Check Merc Item Limit if (Options.AttackOptions.MercRunning && (Options.AttackOptions.LastMercChecked+60) < now) { // check once a minute, but on a timer! t.checkMercItemLimit(); } } if (t.LoopCounter%60==0) { // check attack report every minute t.sendAttackReport(); t.LoopCounter = 0; } }, PaintOverview : function () { var t = Tabs.Attack; // update merc items t.UpdateMercTarget(); }, PaintNewRoutePanel : function () { var t = Tabs.Attack; var fromidx = null; if (t.EditRouteNumber<0) { var z= '
    '+tx('NEW ATTACK ROUTE')+'

    '; fromidx = Cities.byID[uW.currentcityid].idx; // default new route from current city } else { var z= '
    '+tx('EDIT ATTACK ROUTE')+'

    '; } // remember last route details.... (or saved route details) if (Cities.byID[t.RouteObject.cityId]) { fromidx = Cities.byID[t.RouteObject.cityId].idx; } var MarchPresets = {0:"-- "+tx('Select Preset')+" --"}; for (var PN in Options.QuickMarchOptions.MarchPresets) { MarchPresets[PN] = Options.QuickMarchOptions.MarchPresets[PN][0]; } z += ''; z += ''; z += ''; z += ''; z += ''; z += ''; z += '
    '+tx("Attack From")+': 
    '+tx("Target Co-ords")+': X:  Y:    '+tx('Select Bookmark')+': 
     '+tx('Target is a Wilderness')+'('+tx('Auto-abandon wild and reduce some wave 1 troops to 10% of specified amount for subsequent attacks')+')
     '+tx('Target is a Megalith')+'('+tx('No knight will be sent on attacks')+')
     '+tx('Attack with Champion Only!')+'('+tx('Champions are only sent on Wave 2')+')

    '; z += ''; z += ''; z += '
    '+tx('Wave 1')+' ('+tx('initial')+'):
    '; z += htmlSelector(MarchPresets, 0, 'id=pbatPreset1 class=btInput'); z += '
    '; var LineBreak = 6; if (GlobalOptions.btWinSize.x == 750) {LineBreak = 5;} if (GlobalOptions.btWinSize.x == 1250) {LineBreak = 8;} var c = 0; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; var tmpstyle = ''; if (parseIntNan(i)<5) tmpstyle = 'background-color:'+Options.Colors.Highlight; zz = ''; if (c%LineBreak==0) z+= ''; z+=zz; c++; } z += '
    '+TroopImageBig(i)+'  
      
    '+tx('Wave 2')+' ('+tx('recurring')+'):
    '; z += htmlSelector(MarchPresets, 0, 'id=pbatPreset2 class=btInput'); z += '
    '; var c = 0; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; zz = ''; if (c%LineBreak==0) z+= ''; z+=zz; c++; } z += '
    '+TroopImageBig(i)+'  
    '; z += '
     '+strButton20(tx('Save Route'), 'id=pbatSaveRoute')+' '; if (t.EditRouteNumber>=0) { z += strButton20(tx('Save a Copy'), 'id=pbatCopyRoute')+' '; } if (Tabs.Search && Tabs.Search.dat) { for (var k = 0; k < Tabs.Search.dat.length; k++) { coords = Tabs.Search.dat[k][0]+'_'+Tabs.Search.dat[k][1]; elem = ById('pbSearchScout_' + coords); if (elem && elem.checked) { z += strButton20(tx('Bulk Add Co-ords from Search'), 'id=pbatImport')+' '; break; } } } z += strButton20(uW.g_js_strings.commonstr.cancel, 'id=pbatCancelRoute')+' 
    '; ById('pbatRouteDetail').innerHTML = z; t.dcp0 = new CdispCityPicker('pbattackfrom', ById('pbatfromcity'), true, null, fromidx); for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; t.addListeners(i); } ById('pbatRound1').addEventListener('click', function(){ var checked = (!this.checked); t.checkDisableRound('1',checked); },false); ById('pbatRound2').addEventListener('click', function(){ var checked = (!this.checked); t.checkDisableRound('2',checked); },false); t.checkDisableRound('1',!t.RouteObject.RoundOne); t.checkDisableRound('2',!t.RouteObject.RoundTwo); ById('pbatPreset1').addEventListener('change', function(e) { t.LoadPreset(e.target.value,1); }, false); ById('pbatPreset2').addEventListener('change', function(e) { t.LoadPreset(e.target.value,2); }, false); ById('pbatFetchBookmarks').addEventListener('click', function () { FillBookmarkList('pbatBookmarks'); },false); ById('pbatBookmarks').addEventListener('change', function () { if (this.value != '') { var val = this.value; var x = val.substr(0, val.lastIndexOf(',')); var y = val.substr(val.lastIndexOf(',') + 1, val.length); ById('pbatX').value = x; ById('pbatY').value = y; } }, false); ById('pbatSaveRoute').addEventListener ('click', function() {t.SaveRoute(false);}, false); if (ById('pbatCopyRoute')) { ById('pbatCopyRoute').addEventListener ('click', function() {t.SaveRoute(true);}, false); } if (ById('pbatImport')) { ById('pbatImport').addEventListener ('click', function() {t.ImportRoutes();}, false); } ById('pbatCancelRoute').addEventListener ('click', function() {t.RouteObject = null; t.PaintRoutes();}, false); ById('pbatX').addEventListener ('change', function () { var xValue=ById('pbatX').value.trim(); var xI=/^\s*([0-9]+)[\s|,|-|.]+([0-9]+)/.exec(xValue); if(xI) { ById('pbatX').value=xI[1] ById('pbatY').value=xI[2] } }); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, addListeners : function(Troop) { var t = Tabs.Attack; var T1 = 'pbatR1_'+Troop; var T2 = 'pbatR2_'+Troop; ById(T1).addEventListener('keyup', function(){ if (isNaN(ById(T1).value)) ById(T1).value=0; }, false); ById(T2).addEventListener('keyup', function(){ if (isNaN(ById(T2).value)) ById(T2).value=0; }, false); }, LoadPreset : function(PN,r) { var t = Tabs.Attack; for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; var elem = ById('pbatR'+r+'_'+i); if (elem) { elem.value = 0; if (Options.QuickMarchOptions.MarchPresets[PN][i]) { elem.value = parseIntNan(Options.QuickMarchOptions.MarchPresets[PN][i]); } } } }, checkDisableRound : function(r,disabled) { var t = Tabs.Attack; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; var elem = ById('pbatR'+r+'_'+i); if (elem) { elem.disabled = disabled; if (disabled) { elem.value = 0; } } } var elem = ById('pbatPreset'+r); if (elem) { elem.disabled = disabled; if (disabled) { elem.value = 0; } } }, SaveRoute : function (CopyRoute) { var t = Tabs.Attack; if (!t.validateScreenFields('save')) { return; } if (t.EditRouteNumber<0 || CopyRoute) { Options.AttackOptions.Routes.push(JSON2.parse(JSON2.stringify(t.RouteObject))); // create new object in array if (CopyRoute) { t.RouteObject = null; } // clear route object } else { Options.AttackOptions.Routes[t.EditRouteNumber] = t.RouteObject; t.RouteObject = null; // clear route object } ById('pbatMessages').innerHTML = tx("Attack route saved!"); t.PaintRoutes(); }, ImportRoutes : function () { var t = Tabs.Attack; if (!t.validateScreenFields('import')) { return; } if (Tabs.Search && Tabs.Search.dat) { for (var k = 0; k < Tabs.Search.dat.length; k++) { coords = Tabs.Search.dat[k][0]+'_'+Tabs.Search.dat[k][1]; elem = ById('pbSearchScout_' + coords); if (elem && elem.checked) { t.RouteObject.target_x = Tabs.Search.dat[k][0]; t.RouteObject.target_y = Tabs.Search.dat[k][1]; Options.AttackOptions.Routes.push(JSON2.parse(JSON2.stringify(t.RouteObject))); // create new object in array elem.checked = false; } } } t.RouteObject = null; // clear route object ById('pbatMessages').innerHTML = tx("Routes imported from Search Results!"); t.PaintRoutes(); }, validateScreenFields : function (action) { var t = Tabs.Attack; if (!t.dcp0.city) { ById('pbatMessages').innerHTML = tx("No source city selected"); return false; } if (action=="save") { var x = ById("pbatX").value; var y = ById("pbatY").value; if (x=="" || y=="" || isNaN(x) || isNaN(y) || x < 0 || x > 749 || y < 0 || y > 749) { ById('pbatMessages').innerHTML = tx("Map co-ordinates must be between 0 and 749!"); return false; } } // copy screen fields to routeobject t.RouteObject.cityId = t.dcp0.city.id; t.RouteObject.target_x = x; t.RouteObject.target_y = y; t.RouteObject.isWild = ById('pbatwild').checked; t.RouteObject.isMegalith = ById('pbatmegalith').checked; t.RouteObject.ChampOnly = ById('pbatchamponly').checked; t.RouteObject.RoundOne = ById('pbatRound1').checked; t.RouteObject.RoundTwo = ById('pbatRound2').checked; t.RouteObject.RoundOneTroops = {}; t.RouteObject.RoundTwoTroops = {}; var gotR1troops = false; var gotR2troops = false; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; var troopval = parseIntNan(ById('pbatR1_'+i).value); if (troopval != 0) { gotR1troops = true; t.RouteObject.RoundOneTroops[i] = troopval; } var troopval = parseIntNan(ById('pbatR2_'+i).value); if (troopval != 0) { gotR2troops = true; t.RouteObject.RoundTwoTroops[i] = troopval; } } if(!gotR1troops && !gotR2troops){ ById('pbatMessages').innerHTML = tx("You must select some attack troops!"); return false; } if (!gotR1troops && ById('pbatRound1').checked){ ById('pbatMessages').innerHTML = tx("No wave 1 troops selected!"); return false; } if (!gotR2troops && ById('pbatRound2').checked){ ById('pbatMessages').innerHTML = tx("No wave 2 troops selected!"); return false; } // validation OK! return true; }, sendAttackReport : function (force) { var t = Tabs.Attack; if ((!Options.AttackOptions.AttackReport || !Options.AttackOptions.Running) && !force) { return; } var now = unixTime(); if (!force) { if (now < (parseInt(Options.AttackOptions.LastAttackReport)+(Options.AttackOptions.AttackReportInterval*60*60))) { return; } var message = tx('Attack Report for')+' '+Options.AttackOptions.AttackReportInterval+' '+tx('hours of attacking (or since last report)')+' %0A'; } else { var message = tx('Attack Report (since last report)')+' %0A'; } var total = 0; message += tx('Numbers of 1st wave sent')+': '+ Options.AttackOptions.Wave1Count +'%0A'; message += tx('Numbers of 2nd wave sent')+': '+ Options.AttackOptions.Wave2Count +'%0A'; message +='%0A'; if (Options.ReportOptions.DeleteRptaa) { message += tx('Miscellaneous items')+': %0A'; var Crests = {}; for (var z in t.CrestList) { Crests[t.CrestList[z]] = 0; } for (var z in DeleteReports.ReportLog.ItemsFound) { if (!isNaN(Crests[z])) // if item is a crest or seal... Crests[z] = DeleteReports.ReportLog.ItemsFound[z]; else { if (z=="T") { message += uW.g_js_strings.commonstr.found+' '+tx('Treasure Chest')+' x '+DeleteReports.ReportLog.ItemsFound[z]+'%0A'; } else { message += uW.g_js_strings.commonstr.found+' '+uW.ksoItems[z].name+' x '+DeleteReports.ReportLog.ItemsFound[z]+'%0A'; } } } message +='%0A'; message += tx('Crest Stats')+': %0A'; for (crest in Crests) { if (Crests[crest] > 0) { message += uW.itemlist['i'+crest]['name'] +' x '+ Crests[crest] +'%0A'; total += (Crests[crest]); } } message += tx('Total Crests Found')+': '+ total +'%0A'; message +='%0A'; message += tx('Jewel Stats')+': %0A'; var itemcount = 0; for (z in DeleteReports.ReportLog.JewelItemsFound){ itemcount += DeleteReports.ReportLog.JewelItemsFound[z]; message += uW.g_js_strings.jewel['quality_'+Number(z-1)]+' Jewel x '+DeleteReports.ReportLog.JewelItemsFound[z]+'%0A'; } message += tx('Total Jewels Found')+': '+itemcount+'%0A'; message +='%0A'; message += tx('Throne Stats')+': %0A'; var itemcount = 0; for (z in DeleteReports.ReportLog.ThroneItemsFound){ itemcount += DeleteReports.ReportLog.ThroneItemsFound[z].amount; message += strQuality(DeleteReports.ReportLog.ThroneItemsFound[z].quality)+' '+DeleteReports.ReportLog.ThroneItemsFound[z].type+' x '+DeleteReports.ReportLog.ThroneItemsFound[z].amount+'%0A'; } message += tx('Total Throne Room Items Found')+': '+itemcount+'%0A'; message +='%0A'; message += uW.g_js_strings.report_view.champion_stats+': %0A'; var itemcount = 0; for (z in DeleteReports.ReportLog.ChampItemsFound){ itemcount += DeleteReports.ReportLog.ChampItemsFound[z].amount; message += strQuality(DeleteReports.ReportLog.ChampItemsFound[z].quality)+' '+DeleteReports.ReportLog.ChampItemsFound[z].type+' x '+DeleteReports.ReportLog.ChampItemsFound[z].amount+'%0A'; } message += tx('Total Champion Equipment Found')+': '+itemcount+'%0A'; } else { message += tx('Found item details only available if the option "Delete auto-attack reports" is ticked')+'%0A'; } var params = uW.Object.clone(uW.g_ajaxparams); params.emailTo = Seed.player['name']; params.subject = tx("Attack Overview"); params.message = message; params.requestType = "COMPOSED_MAIL"; new MyAjaxRequest(uW.g_ajaxpath + "ajax/getEmail.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { DeleteLastMessage(); Options.AttackOptions.Wave1Count = 0; Options.AttackOptions.Wave2Count = 0; saveOptions(); if (Options.ReportOptions.DeleteRptaa) { DeleteReports.ReportLog.ItemsFound = {}; DeleteReports.ReportLog.ThroneItemsFound = {}; DeleteReports.ReportLog.ChampItemsFound = {}; DeleteReports.ReportLog.JewelItemsFound = {}; DeleteReports.saveLog(); } } }, }); Options.AttackOptions.LastAttackReport = now; saveOptions(); }, doAutoLoop : function (idx,busted) { var t = Tabs.Attack; clearTimeout(t.timer); if (!Options.AttackOptions.Running) return; if (idx>=Options.AttackOptions.Routes.length) { idx=0; } // safety, if route(s) have been deleted. if (idx==0 && !busted) { t.loopaction = false; // reset loop action indicator for first city t.AttackOrder = []; for (var y=0;y (parseIntNan(a.LastRoundOne) + 90)) { if (t.doAttack(idx,1,true)) { return; } // march call initiated, loop handled from there... } } if (a.RoundTwo) { t.doAttack(idx,2,false); } else { t.doAttack(idx,1,false); } // if only round 1 just keep sending round 1... } } t.checkNextRoute(idx); }, checkNextRoute : function (idx) { var t = Tabs.Attack; if (idx >= Options.AttackOptions.Routes.length-1) { if (!t.loopaction) { t.autodelay = Options.AttackOptions.intervalSecs; } // if no action this loop, apply delay anyway... t.timer = setTimeout(function () { t.doAutoLoop(0,false); }, (t.autodelay * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1,false); }, (t.autodelay * 1000)); } }, doAttack: function(idx,r,buster){ var t = Tabs.Attack; var a = Options.AttackOptions.Routes[t.AttackOrder[idx]]; var champid = 0; citychamp = getCityChampion(a.cityId); if (citychamp.championId && citychamp.status!="10") { champid = citychamp.championId; } if (!Cities.byID[a.cityId]) { return false; } // no attack city! var towerok = (!Options.TowerOptions || !Options.TowerOptions.SaveCityState[a.cityId] || Options.TowerOptions.SaveCityState[a.cityId].AllowMarches); if (!towerok) { return false; } // attack city under attack! var ascensionok = (!Options.BuildOptions || !Options.BuildOptions.AscensionReady[Cities.byID[a.cityId].idx]); if (!ascensionok) { return; } // attack city waiting to ascend! if (a.ChampOnly && (champid==0) && (r==2 || (r==1 && a.RoundTwo))) { return false; } // no champ or champ not ready! if (!t.checkCityTroops(r,idx)) { return false; } // insufficient troops for one or both waves! var slotsneeded = 1; if (r==1 && a.RoundTwo) slotsneeded = 2; var keepfree = Number(Options.AttackOptions.FreeRallySlots); // use highest of attack keep rally free or general keep rally free if (keepfree < Number(Options.FreeRallySlots)) { keepfree = Number(Options.FreeRallySlots); } var availslots = Number(March.getEmptySlots(a.cityId))-keepfree; if (availslots < slotsneeded) { return false; } if (!a.isMegalith) { var knt = getAvailableKnights(a.cityId); if (!knt[0]) { return false; } // no knight for this wave if (r==1 && a.RoundTwo && !knt[1]) { return false; } // no knight for wave 2! } // from here, should be ok to attack.. var params = uW.Object.clone(uW.g_ajaxparams); params.cid = a.cityId; if (!a.isMegalith) { params.kid = knt[0].ID; } // will fail if no knights else { params.kid = 0; } params.type = 4; params.xcoord = a.target_x; params.ycoord = a.target_y; if (a.ChampOnly && (r==2)) { params.champid = champid; } var totalsend = 0; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; if (r==1) { params["u"+i] = parseIntNan(a.RoundOneTroops[i]); } else { params["u"+i] = parseIntNan(a.RoundTwoTroops[i]); } totalsend += params["u"+i]; } if (r==1) { var now = unixTime(); if (now < (parseInt(a.LastRoundOne) + 500) && a.isWild) { for (var ui in CM.UNIT_TYPES) { var i = CM.UNIT_TYPES[ui]; if (params["u"+i]!=0 && parseIntNan(i)<5) { // supply troops, militia, scouts and pikes only. params["u"+i] = Math.ceil(params["u"+i]/10); } } } } if (totalsend == 0) { // final safety net return false; } else { t.autodelay = Options.AttackOptions.intervalSecs; // march is required, so delay subsequent loop t.loopaction = true; March.addMarch(params, function(rslt){ if (rslt.ok) { var now = unixTime(); if (r==1) { Options.AttackOptions.Wave1Count++; Options.AttackOptions.Routes[t.AttackOrder[idx]].LastRoundOne = now; } else { Options.AttackOptions.Wave2Count++; } saveOptions(); if (buster) { // wave 1 success!.. reset loop on same route for wave 2... t.timer = setTimeout(function () { t.doAutoLoop(idx,true); }, (t.autodelay * 1000)); } } else { if (rslt.error_code==206) { // cannot do this to yourself! You still own the wild.... // if (a.isWild) { var tid = CalculateTileId(a.target_x, a.target_y); if (tid!=0) { AbandonWild (tid, a.target_x, a.target_y, a.cityId); } // } } else { if (!rslt.msg) {rslt.msg = 'Error Code ('+rslt.error_code+')';} if (GlobalOptions.ExtendedDebugMode) { actionLog(Cities.byID[a.cityId].name+": Attack Error - "+rslt.msg,'ATTACK'); } } if (buster) { // wave 1 failed.. reset loop and move on to next route t.checkNextRoute(idx); } } }); } return true; // march was requested... }, checkCityTroops : function (round,idx) { var t = Tabs.Attack; var a = Options.AttackOptions.Routes[t.AttackOrder[idx]]; var result = true; for (var ui in CM.UNIT_TYPES){ var i = CM.UNIT_TYPES[ui]; var needed = 0; for (var r=round;r<=2;r++) { // wave 1 checks both wave requirements if (r==1) { needed += parseIntNan(a.RoundOneTroops[i]); } else { needed += parseIntNan(a.RoundTwoTroops[i]); } result = (result && (parseIntNan(Seed.units['city'+a.cityId]['unt'+i]) >= needed)); if (!result) {return result;} } } return result; }, checkAbandonWild : function () { var t = Tabs.Attack; if (!Options.AttackOptions.Running) { return; } for (var m in Options.AttackOptions.Routes) { var a = Options.AttackOptions.Routes[m]; if(a.isWild) { for (var c = 0; c < Cities.numCities; c++) { var city = Cities.cities[c]; var cWilds = Seed.wilderness['city' + city.id]; if (matTypeof(cWilds) == 'object') { for (var k in Seed.wilderness['city' + city.id]) { var w = Seed.wilderness['city' + city.id][k]; if (w.xCoord==a.target_x && w.yCoord==a.target_y) { AbandonWild (w.tileId, w.xCoord, w.yCoord, city.id); return; // only abandon one per loop } } } } } } }, } /** Build Tab **/ Tabs.Build = { tabLabel: 'Build', tabOrder: 2060, tabColor : 'brown', tabDisabled: false, myDiv: null, timer: null, ModelCity: null, ModelCityId: 0, LoopCounter: 0, intervalSecs : 5, autodelay : 0, citydelay: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, loopaction : false, limitingFactor: null, buildspeed : 0, cityval : 0, Subscriber : false, BuildMode : false, BuildDiv : null, BuildList : {}, koc_buildslot: null, Squire:0, Knight:0, Guinevere:0, Morgana:0, Arthur:0, Merlin:0, Divine:0, Epic:0, Legendary:0, ItemList : [1, 2, 3, 4, 5, 6, 7, 8, 10], ItemTrans : ["SH","KH","GH","MH","AH","RH","DH","EH","LH"], SmartOrder : [12,7,8,14,16,20,19,0,9,15,17,18,21,11,6,10,23,25,27], // experiment! PresetTypes : {0:"Unascended City",1:"Druid City",2:"Fey City",3:"Briton City"}, CityBuildings : [5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,21], FieldBuildings : [1,2,3,4], DruidCityBuildings : [5,7,8,10,11,12,13,14,20], FeyCityBuildings : [5,7,8,10,11,12,13,14,20,21], BritonCityBuildings : [5,7,8,10,11,12,13,14,20,21], DruidFieldBuildings : [22,23], FeyFieldBuildings : [24,25], BritonFieldBuildings : [26,27], NextPresetNumber : 0, InitPresetNumber : 0, PresetNum : 0, PresetType : "", PresetName : "", Preset : {}, FieldView : false, Options: { Running: false, ThroneCheck: false, BuildSpeed: 0, Enabled : {1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true}, Toggle : false, maxbuildlevel : 9, help : false, bothqueues : false, EmptySlots : 5, BuildPriority : 1, // 0 - none, 1 - shortest time, 2 - position, 3 - building type, 4 - unique buildings KeepCompleted : false, UseLH : false, UseEH : false, UseDH : false, UseRH : false, UseAH : false, UseMH : false, UseGH : false, UseKH : false, UseSH : false, UseOverride : false, OverrideItem : 0, OverrideHours : 0, OverrideMinutes : 1, BuildPresetNames : {}, BuildPresetTypes : {}, BuildPresets : {}, AscendRunning : false, AscendEnabled : {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, AscendTime : 1, AscendFaction : 1, // 1 - druid, 2 - fey, 3 - briton AscendBlessings : {1:[0,0,0,0,0,0], 2:[0,0,0,0,0,0], 3:[0,0,0,0,0,0]}, // up to 6 minor blessings will be allowed eventually... AscendPresets : {1:0, 2:0, 3:0}, // which preset to queue after ascension AscendPresetLevel : 9, // building level to queue after ascension AscensionReady : {1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false}, UseLesserCrystals : false, UseGreaterCrystals : false, }, BuildQueue : {}, // cityId:{ pos0:{buildtype,maxlevel,status,ascendcomplete,errors}, }, init: function (div) { var t = Tabs.Build; t.myDiv = div; if (!Options.BuildOptions) { Options.BuildOptions = t.Options; } else { for (var y in t.Options) { if (!Options.BuildOptions.hasOwnProperty(y)) { Options.BuildOptions[y] = t.Options[y]; } } } // fix any broken build presets for (var y in Options.BuildOptions.BuildPresets) { if (!Options.BuildOptions.BuildPresets[y].pos0) { Options.BuildOptions.BuildPresets[y].pos0 = 'bdg0'; } if (!Options.BuildOptions.BuildPresets[y].pos1) { Options.BuildOptions.BuildPresets[y].pos1 = 'bdg19'; } } for (var b in uW.buildingcost) { var bid = Number(b.split('bdg')[1]); if (bid<30) { t.BuildList[bid] = uW.buildingcost[b][0]; } } for (var c=1;c<=8;c++) { if (!Cities.cities[c-1]) { Options.BuildOptions.AscendEnabled[c] = false; } else { var ascended = getAscensionValues(Cities.cities[c-1].id); if (ascended.isPrestigeCity) { var MaxLevel = CM.PrestigeModel.getLevelCapSoft(ascended.prestigeType); if (parseIntNan(ascended.prestigeLevel)==MaxLevel) { Options.BuildOptions.AscendEnabled[c] = false; } } } } t.ReadBuildQueue(); t.koc_buildslot = uW.buildslot; //save original koc function t.CreateBuildModeDiv(); t.Subscriber = CM.QueueModel.hasFreeQueue(); if (Options.BuildOptions.Toggle) AddSubTabLink('AutoBuild',t.toggleAutoBuildState, 'BuildToggleTab'); SetToggleButtonState('Build',Options.BuildOptions.Running,'Build'); uWExportFunction('speedupBuild', Tabs.Build.speedupBuild); uWExportFunction('btcancelConstruction', Tabs.Build.cancelConstruction); uWExportFunction('cancelBuild',Tabs.Build.cancelBuild); uWExportFunction('btBldCancelAll',Tabs.Build.cancelAll); uWExportFunction('btNewBldPreset', Tabs.Build.NewBldPreset); uWExportFunction('btSelectBldPreset', Tabs.Build.SelectBldPreset); uWExportFunction('btSetBldPreset', Tabs.Build.SetBldPreset); var m = '
    '+tx('AUTOMATIC BUILD FUNCTION')+'
    '; m += '
    '; m += '
     '+tx("Add toggle button")+' '+tx('Current Construction Speed')+':   
    '; m += ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+tx('Only build when construction speed is at least')+'  %'+tx('Current Increased City Value')+':   
     '+tx("Keep completed buildings in queues of ascended cities")+''+tx("Maximum Build Level") + ': '+htmlSelector({9:9, 10:10, 11:11, 12:12, 13:13, 14:14, 15:15}, Options.BuildOptions.maxbuildlevel, 'id=pbMaxBuildLevel')+'
     '+tx("Ask for help")+''+tx("Build Priority")+': '+ htmlSelector({0:tx('None'),1:tx('Shortest time'),2:tx('Position'),3:tx('Building Type'),4:tx('Unique Buildings')},Options.BuildOptions.BuildPriority, 'id=pbBuildPriority')+'
     '+tx("Use both build queues")+'
    '; m += '
    '; m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ""; // spacer m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; var actheight = 90; if (t.Subscriber) { actheight = 180; } for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += '
      '+Cities.cities[i-1].name.substring(0, 12)+' 
    '+tx('Auto-Build')+' 
    '+uW.g_js_strings.commonstr.faction+' 
     
    '+tx('Ascension')+'% 
     
    '+tx('Protection')+' 
     
    '+tx('Auto-Ascend')+' 
    '+tx('Queue Length')+' 
     
    '+tx('Queue Time')+' 
     
    '+tx('Activity')+' 
     
    '; m += '
    '+tx('USE AUTO-SPEEDUPS')+'
    '; m += ''; Boosts += ''; m += Boosts+'
    '; var Boosts = ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += ''; Boosts += ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += '
    (' + parseIntNan(uW.ksoItems[t.ItemList[i]].count) + ')
    '+tx('Override above by always using')+' '+htmlSelector(HourGlassName,Options.BuildOptions.OverrideItem, 'id=pbbuildOVItem') + ' '+tx('when more than')+' '; Boosts += ' '+uW.g_js_strings.timestr.timehr+'  '+uW.g_js_strings.timestr.timemin+' '+tx('remaining')+'.
    '; m += '
     '+tx('AUTO-ASCEND OPTIONS')+' 
    '; m += '
     

    '; m += '
    '+uW.g_js_strings.commonstr.city+': 
    '; m += '
    '+tx('ADD BUILDINGS')+'

    '; m += '
    '; m += ''; m += ''; m += '
    '+tx('Empty Slots')+': '+htmlSelector(t.BuildList,Options.BuildOptions.EmptySlots,'id=pbbuildempty')+''+tx('Queue ALL')+': '+htmlSelector({all:uW.g_js_strings.commonstr.buildings, barracks:uW.buildingcost.bdg13[0], cottages:uW.buildingcost.bdg5[0], farms:uW.buildingcost.bdg1[0], sawmills:uW.buildingcost.bdg2[0], quarries:uW.buildingcost.bdg3[0], mines:uW.buildingcost.bdg4[0], guardians:uW.g_js_strings.guardian.guardians, deftower:uW.g_js_strings.tower.towerName, redoubt:uW.g_js_strings.redoubt.redoubt, empty:tx("Empty Slots")},'all','id=pbquickadd')+' '+tx('to level')+'   

    '; m += '
     '+tx('LAYOUT DESIGNER')+'
    '; m += '
    '; m += '
    '; m +=''; m += '
    '; m +=' '+tx('New')+' '+tx('Add to Queue')+' '+tx('to level')+' 

     
    '; m += '
    '; m += '
     '+tx('BUILDING QUEUE')+' 
    '; m += '
     
    '; m += '

    '; div.innerHTML = m; t.PaintAscendOptions(); t.clearBuildPresetDiv(); t.LoadBuildPresets(); t.MaxLevelChanged(); OpenDiv["Building"] = "btBldQueue"; t.ModelCity = new CdispCityPicker('pbbuild', ById('pbbuildcity'), true, t.clickCitySelect, null); ById('btBldAscendLink').addEventListener ('click', function () {ToggleMainDivDisplay("Building",100,GlobalOptions.btWinSize.x,"btBldAscend",true)}, false); ById('btBldQueueLink').addEventListener ('click', function () {ToggleMainDivDisplay("Building",100,GlobalOptions.btWinSize.x,"btBldQueue",true)}, false); ById('btBldPresetLink').addEventListener ('click', function () {ToggleMainDivDisplay("Building",100,GlobalOptions.btWinSize.x,"btBldPreset",true)}, false); for (var i = 1; i <= Cities.numCities; i++) { ById('btBuildAutoCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.BuildOptions.Enabled[citynum] = e.target.checked; if (Options.BuildOptions.Enabled[citynum]) { t.citydelay[citynum] = 0; t.timer = setTimeout(function () { t.doAutoLoop(Number(citynum));}, 0); } saveOptions(); }, false); ById('btBuildAutoAscendCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.BuildOptions.AscendEnabled[citynum] = e.target.checked; saveOptions(); }, false); } ToggleOption('BuildOptions','btBuildToggle','Toggle'); ById('pbBuildMode').addEventListener('click', function () { t.toggleStateMode(); }, false); ById('btAutoBuildState').addEventListener('click', function(){ t.toggleAutoBuildState(this); }, false); ById('btAutoAscendState').addEventListener('click', function(){ t.toggleAutoAscendState(this); }, false); ToggleOption('BuildOptions','btBuildTR','ThroneCheck'); ChangeIntegerOption('BuildOptions','btBuildTRSpeed','BuildSpeed'); ChangeIntegerOption('BuildOptions','pbMaxBuildLevel','maxbuildlevel',0,t.MaxLevelChanged); ById('doXbuildingToX').addEventListener('click', function () { var cityId = t.ModelCityId; if (!cityId) return; var AddType = ById('pbquickadd').value; var toLevel = parseIntNan(ById('pbaddAllTo').value.substr(5)); t.allBuildsTo(cityId,AddType,toLevel); }, false); ToggleOption('BuildOptions','pbHelpRequest','help'); ToggleOption('BuildOptions','pbKeepCompleted','KeepCompleted',t.ValidateBuildQueue); ToggleOption('BuildOptions','pbbothqueues','bothqueues'); ChangeOption('BuildOptions','pbbuildempty','EmptySlots'); ChangeOption('BuildOptions','pbBuildPriority','BuildPriority',t.PaintCityInfo); ToggleOption('BuildOptions','pbbuildSH','UseSH'); ToggleOption('BuildOptions','pbbuildKH','UseKH'); ToggleOption('BuildOptions','pbbuildGH','UseGH'); ToggleOption('BuildOptions','pbbuildMH','UseMH'); ToggleOption('BuildOptions','pbbuildAH','UseAH'); ToggleOption('BuildOptions','pbbuildRH','UseRH'); ToggleOption('BuildOptions','pbbuildDH','UseDH'); ToggleOption('BuildOptions','pbbuildEH','UseEH'); ToggleOption('BuildOptions','pbbuildLH','UseLH'); ToggleOption('BuildOptions','pbbuildOV','UseOverride'); ChangeIntegerOption('BuildOptions','pbbuildOVItem','OverrideItem'); ChangeIntegerOption('BuildOptions','pbbuildOVHours','OverrideHours'); ChangeIntegerOption('BuildOptions','pbbuildOVMinutes','OverrideMinutes'); ById('pbBuildHelp').addEventListener ('click', t.helpPop, false); // start autobuild loop timer to start in 6 seconds... if (Options.BuildOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(1);}, (6 * 1000)); } // check auto ascend to clear the ascension ready flags if they are set incorrectly! t.checkAutoAscend(); }, helpPop : function (){ var t = Tabs.Build; var helpText = '
    '+tx("Using Speedups for Construction"); helpText += '

    '+tx('Speedups will be used in the following order if they are selected, and the required criteria is met')+' :-

    '; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += '
    '+uW.g_js_strings.commonstr.item+''+uW.g_js_strings.commonstr.time+''+tx('Criteria')+'
    '+uW.itemlist.i10.name+'4 days'+tx('More than 3 days and 12 hours remaining')+'
    '+uW.itemlist.i8.name+'2.5 days'+tx('More than 48 hours remaining')+'
    '+uW.itemlist.i7.name+'24 hrs'+tx('More than 23 hours 30 minutes remaining')+'
    '+uW.itemlist.i6.name+'15 hrs'+tx('More than 14 hours 30 minutes remaining')+'
    '+uW.itemlist.i5.name+'8 hrs'+tx('More than 7 hours 30 minutes remaining')+'
    '+uW.itemlist.i4.name+'2.5 hrs'+tx('More than 2 hours remaining')+'
    '+uW.itemlist.i3.name+'1 hr'+tx('More than 45 minutes remaining')+'
    '+uW.itemlist.i2.name+'15 mins'+tx('More than 5 minutes remaining')+'
    '+uW.itemlist.i1.name+'1 min'+tx('More than 30 seconds remaining')+'
    '; helpText += '

    '+tx('If the override box is ticked, then the override rule specified will take priority')+'.


    '; var pop = new CPopup ('BotHelp', 0, 0, 460, 360, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Speedups")+'
    '; pop.show (true); }, clearBuildPresetDiv : function() { var t = Tabs.Build; ById('btBldPresetDetails').innerHTML = '








    '+tx('Please select an existing layout or create a new one above...')+'
    '; }, toggleAutoBuildState: function(obj){ var t = Tabs.Build; obj = ById('btAutoBuildState'); if (Options.BuildOptions.Running == true) { Options.BuildOptions.Running = false; obj.value = tx("AutoBuild = OFF"); } else { Options.BuildOptions.Running = true; obj.value = tx("AutoBuild = ON"); t.timer = setTimeout(function () { t.doAutoLoop(1);}, 0); } saveOptions(); SetToggleButtonState('Build',Options.BuildOptions.Running,'Build'); t.citydelay = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}; t.PaintOverview(); }, toggleAutoAscendState: function(obj){ var t = Tabs.Build; if (Options.BuildOptions.AscendRunning == true) { Options.BuildOptions.AscendRunning = false; obj.value = tx("AutoAscend = OFF"); } else { Options.BuildOptions.AscendRunning = true; obj.value = tx("AutoAscend = ON"); } saveOptions(); t.checkAutoAscend(); t.PaintOverview(); }, MaxLevelChanged : function () { var t = Tabs.Build; var m = ''; for (a = 1; a <= Options.BuildOptions.maxbuildlevel ; a++) { var sel = ''; if (a==Options.BuildOptions.maxbuildlevel) sel=' selected'; m += ''; } ById('pbaddAllTo').innerHTML = m; ById('btBldPresetAllTo').innerHTML = m; ById('pbbuildmodeto').innerHTML = m; t.ResetAscendAllTo(); }, ResetAscendAllTo : function () { var t = Tabs.Build; var m = ''; if (Options.BuildOptions.AscendPresetLevel > Options.BuildOptions.maxbuildlevel) { Options.BuildOptions.AscendPresetLevel = Options.BuildOptions.maxbuildlevel; saveOptions(); } for (a = 1; a <= Options.BuildOptions.maxbuildlevel ; a++) { var sel = ''; if (a==Options.BuildOptions.AscendPresetLevel) sel=' selected'; m += ''; } ById('btBldAscendAllTo').innerHTML = m; }, SaveBuildQueue : function (){ var t = Tabs.Build; var serverID = getServerId(); setTimeout(function () { GM_setValue ('BuildQueue_'+serverID+'_'+uW.tvuid, JSON2.stringify(t.BuildQueue)); },0); // get around GM_SetValue uW error }, ReadBuildQueue : function (notify) { var t = Tabs.Build; var serverID = getServerId(); s = GM_getValue ('BuildQueue_'+serverID+'_'+uW.tvuid); if (s != null){ opts = JSON2.parse (s); for (var k in opts) { var validQ = false; var cid = 0; for (var i = 0; i < Cities.numCities; i++) { if (k==t.QueueKey(Cities.cities[i].id)) { validQ = true; cid = Cities.cities[i].id; break; } } if (validQ) { t.BuildQueue[k] = opts[k]; t.ValidateBuildQueue(cid,false); } } t.SaveBuildQueue(); // cleanup } if (notify) { notify(); } }, show: function (init) { var t = Tabs.Build; var DispCityId = uW.currentcityid; if (init) { DispCityId = InitialCityId; } if (t.ModelCityId!=DispCityId) { t.ModelCity.selectBut(Cities.byID[DispCityId].idx); } t.PaintOverview(); }, QueueKey : function (cid) { var t = Tabs.Build; var QKey = cid; if (Seed.cityData.city[cid].isPrestigeCity) { QKey += 'A'; } return QKey; }, EverySecond : function () { var t = Tabs.Build; t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh build speed and overview display every 2 seconds t.buildspeed = Math.floor(equippedthronestats(78)+equippedthronestats(165)); t.cityval = Math.floor(equippedthronestats(109)+equippedthronestats(166)); if (tabManager.currentTab.name == 'Build' && Options.btWinIsOpen){ t.PaintOverview(); t.PaintCityInfo(); } } if (t.LoopCounter >= 60) { // check for auto ascend every minute t.checkAutoAscend(); t.LoopCounter = 0; } }, toggleStateMode: function (obj) { var t = Tabs.Build; t.BuildMode = !t.BuildMode; obj = ById('pbBuildMode'); if (t.BuildMode) { // start build mode state uW.buildslot = t.bot_buildslot; // overwrite original koc function obj.value = tx("Build Mode = ON"); ById('pbbuildmodeempty').value = Options.BuildOptions.EmptySlots; t.BuildDiv.style.display = 'block'; hideMe(); } else { // stop build mode state uW.buildslot = t.koc_buildslot; // restore original koc function obj.value = tx("Build Mode = OFF"); ById('pbbuildempty').value = Options.BuildOptions.EmptySlots; t.BuildDiv.style.display = 'none'; showMe(); ById('bttcBuild').click(); t.PaintOverview(); t.PaintCityInfo(); } }, clickCitySelect: function (city) { var t = Tabs.Build; t.ModelCityId = city.id; t.LastQueue = 'x'; t.PaintCityInfo(); }, PaintOverview : function () { var t = Tabs.Build; var now = uW.unixtime(); t.Squire = parseIntNan(Seed.items.i1); t.Knight = parseIntNan(Seed.items.i2); t.Guinevere = parseIntNan(Seed.items.i3); t.Morgana = parseIntNan(Seed.items.i4); t.Arthur = parseIntNan(Seed.items.i5); t.Merlin = parseIntNan(Seed.items.i6); t.Divine = parseIntNan(Seed.items.i7); t.Epic = parseIntNan(Seed.items.i8); t.Legendary = parseIntNan(Seed.items.i10); ById('pbbuildUseSHLabel').innerHTML = t.Squire; ById('pbbuildUseKHLabel').innerHTML = t.Knight; ById('pbbuildUseGHLabel').innerHTML = t.Guinevere; ById('pbbuildUseMHLabel').innerHTML = t.Morgana; ById('pbbuildUseAHLabel').innerHTML = t.Arthur; ById('pbbuildUseRHLabel').innerHTML = t.Merlin; ById('pbbuildUseDHLabel').innerHTML = t.Divine; ById('pbbuildUseEHLabel').innerHTML = t.Epic; ById('pbbuildUseLHLabel').innerHTML = t.Legendary; for (var i = 0; i < Cities.numCities; i++) { citynum = i+1; cityId = Cities.cities[i].id; var str = ''; if (t.citydelay[citynum] > 0) { str = tx('Waiting')+'...'; } if (Options.BuildOptions.AscensionReady[citynum]) { str = tx('Ascension')+'...'; } var isBusy = false; var activeblds = []; var activetimes = []; var qcon = Seed.queue_con["city" + cityId]; if (matTypeof(qcon) == 'array' && qcon.length > 0) { if (parseInt(qcon[0][4]) > now) { isBusy = true; activeblds.push(parseIntNan(qcon[0][7])); activetimes.push(parseIntNan(qcon[0][4])); } } if (isBusy) { var timeLeft = qcon[0][4] - now; str = ''; var Speedups = ''; Speedups += t.dspHG(cityId,qcon[0][2],0,1,t.Squire); Speedups += t.dspHG(cityId,qcon[0][2],0,2,t.Knight); Speedups += t.dspHG(cityId,qcon[0][2],0,3,t.Guinevere); Speedups += t.dspHG(cityId,qcon[0][2],0,4,t.Morgana); Speedups += t.dspHG(cityId,qcon[0][2],0,5,t.Arthur); Speedups += ''; Speedups += t.dspHG(cityId,qcon[0][2],0,6,t.Merlin); Speedups += t.dspHG(cityId,qcon[0][2],0,7,t.Divine); Speedups += t.dspHG(cityId,qcon[0][2],0,8,t.Epic); Speedups += t.dspHG(cityId,qcon[0][2],0,10,t.Legendary); if (Speedups != "") Speedups = ''; str = str+Speedups+''; var Speedups = ''; Speedups += t.dspHG(cityId,qcon[0][2],1,1,t.Squire); Speedups += t.dspHG(cityId,qcon[0][2],1,2,t.Knight); Speedups += t.dspHG(cityId,qcon[0][2],1,3,t.Guinevere); Speedups += t.dspHG(cityId,qcon[0][2],1,4,t.Morgana); Speedups += t.dspHG(cityId,qcon[0][2],1,5,t.Arthur); Speedups += ''; Speedups += t.dspHG(cityId,qcon[0][2],1,6,t.Merlin); Speedups += t.dspHG(cityId,qcon[0][2],1,7,t.Divine); Speedups += t.dspHG(cityId,qcon[0][2],1,8,t.Epic); Speedups += t.dspHG(cityId,qcon[0][2],1,10,t.Legendary); if (Speedups != "") Speedups = ''; str = str+Speedups+'
    '; str += uW.buildingcost['bdg'+qcon[0][0]][0]; if (qcon[0][1] == 0) { str += '
    (Destroy)'; } else { str += '
    Lvl '+qcon[0][1]; } str += '
    '+timestr(timeLeft)+'
    ' + Speedups + '
    '+tx("Cancel")+'
    '; if (qcon.length > 1) { if (parseInt(qcon[1][4]) > now) { activeblds.push(parseIntNan(qcon[1][7])); activetimes.push(parseIntNan(qcon[1][4])); timeLeft = qcon[1][4] - now; str += '
    '; str += uW.buildingcost['bdg'+qcon[1][0]][0]; if (qcon[1][1] == 0) { str += '
    (Destroy)'; } else { str += '
    Lvl '+qcon[1][1]; } str += '
    '+timestr(timeLeft)+'
    ' + Speedups + '
    '+tx("Cancel")+'
    '; } } str += '
    '; } var ascended = getAscensionValues(cityId); var faction = ascended.prestigeType; var CityFaction = tx('Not ascended'); var CityValue = parseIntNan(Seed.cityData.city[cityId].cityValue); var cityPrestigeLevel = ascended.prestigeLevel; if (faction != 0) { CityFaction = getFactionName(faction) + ' ('+cityPrestigeLevel+')'; } var CityPercent = parseIntNan(CityValue*100/t.getAscensionRequirements('max',faction,(parseIntNan(cityPrestigeLevel)+1))); var CityMin = parseIntNan(t.getAscensionRequirements('min',faction,(parseIntNan(cityPrestigeLevel)+1))); if (parseIntNan(cityPrestigeLevel) >= CM.PrestigeModel.getLevelCapSoft(faction)) { CityPercent = 'max'; ById('btBuildAutoAscendCity_'+citynum).disabled = true; } else { ById('btBuildAutoAscendCity_'+citynum).disabled = false; if (CityPercent >= 100) { CityPercent = '100%'; } else { if (CityValue < CityMin) { CityPercent = ''+CityPercent+'%'; } else { CityPercent = CityPercent+'%'; } } } var prestigeexp = ' '; var cityExpTime = ascended.prestigeBuffExpire; if ((!isNaN(cityExpTime)) && (cityExpTime +(3600*24) >= unixTime())) { if (cityExpTime < unixTime()) { prestigeexp = ' '+tx('Expired!')+''; } else { prestigeexp = ' '+uW.timestr(cityExpTime-unixTime())+''; } } ById("btBuildFactionCity_"+citynum).innerHTML = CityFaction; ById("btBuildAscensionPercentCity_"+citynum).innerHTML = CityPercent; ById("btBuildAscensionProtectionCity_"+citynum).innerHTML = prestigeexp; var Completed = true; var QEntries = false; var BQ = t.BuildQueue[t.QueueKey(cityId)]; var QLen = 0; var QTime = 0; for (var b in BQ) { if (BQ[b].hasOwnProperty("buildtype")) { QEntries = true; var CurrLevel = 0; if (Seed.buildings['city'+cityId][b] && Seed.buildings['city'+cityId][b][0]==BQ[b].buildtype) { CurrLevel = parseIntNan(Seed.buildings['city'+cityId][b][1]); } var pos = Number(b.split("pos")[1]); var actindex = activeblds.indexOf(pos); var acttime = 0; var bbmax = BQ[b].maxlevel; if (actindex != -1) { acttime = activetimes[actindex]-now; bbmax--; } QTime += acttime; if (BQ[b].maxlevel==0) { Completed = false; QLen += 1; if (acttime==0) { QTime += t.getBuildTime(cityId, CurrLevel, BQ[b].buildtype, true); } } else { if (BQ[b].maxlevel>CurrLevel) { Completed = false; QLen += BQ[b].maxlevel-CurrLevel; for (var bb=CurrLevel;bb'; } else { ts = t.buildspeed+'%'; } ById("btBuildCurrTR").innerHTML = ts; cv = t.cityval+'%'; ById("btCityValCurrTR").innerHTML = cv; }, dspHG : function (cityId, qitem, i, item, count) { var t = Tabs.Build; var n = ''; if (count>0) { n += ''; } return n; }, cancelAll: function (cityId) { var t = Tabs.Build; delete t.BuildQueue[t.QueueKey(cityId)]; t.SaveBuildQueue(); t.PaintOverview(); t.PaintCityInfo(); }, cancelBuild: function (cityId,pos) { var t = Tabs.Build; delete t.BuildQueue[t.QueueKey(cityId)][pos]; t.SaveBuildQueue(); t.PaintOverview(); t.PaintCityInfo(); }, allBuildsTo : function (cityId,AddType,ToLevel) { var t = Tabs.Build; if (AddType != 'empty') { for (var b in Seed.buildings['city'+cityId]) { var building = Seed.buildings['city'+cityId][b]; if (building) { if (parseInt(building[2]) < 300 || parseInt(building[2]) > 309) { // no dummy ascension buildings if (building && building[1] != 0) { // ALL doesn't include guardians or defensive tower! if ((building[0]==5 && AddType=="cottages") || (building[0]==1 && AddType=="farms") || (building[0]==2 && AddType=="sawmills") || (building[0]==3 && AddType=="quarries") || (building[0]==4 && AddType=="mines") || (building[0]==13 && AddType=="barracks") || (building[0]>=50 && building[0]<=53 && AddType=="guardians") || (building[0]==30 && AddType=="deftower") || (building[0]==31 && AddType=="redoubt") || (AddType=="all" && building[0]<30)) { t.addToBuildQueue(cityId,b,building[0],ToLevel,parseIntNan(building[1])); } } } } // automatically add walls even if level 0 when "all" chosen. if (AddType=="all" && (!Seed.buildings['city'+cityId]['pos1'] || Seed.buildings['city'+cityId]['pos1'][1]==0)) { t.addToBuildQueue(cityId,"pos1",19,ToLevel,0); } } } else { for (var b = 1;b<=32;b++) { if (!Seed.buildings['city'+cityId]['pos'+b]) { if (b==1) { var buildingType = 19; } // wall in position 1! else { var buildingType = Options.BuildOptions.EmptySlots; } t.addToBuildQueue(cityId,"pos"+b,buildingType,ToLevel,0); } } } t.citydelay[Cities.byID[cityId].idx+1] = 0; t.SaveBuildQueue(); t.PaintOverview(); t.PaintCityInfo(); }, addToBuildQueue : function (cityId,pos,buildtype,maxlevel,currlevel) { var t = Tabs.Build; var Result = false; if (uW.buildingmaxlvl[buildtype]2 && wallLevel2) { buildingMult = Math.pow(2, buildingLevel-2); } } else { var buildingMult = Math.pow(2, buildingLevel); } var polValue = 0; var knt = Seed.knights["city" + cityId]; if (knt) { knt = knt["knt" + Seed.leaders["city" + cityId].politicsKnightId]; if (knt) { polValue = parseInt(knt.politics) if (!destroy) { var polBoost = parseInt(knt.politicsBoostExpireUnixtime); if (polBoost > now) { polValue = parseInt(polValue * 1.25); } } } } var buildingTime = uW.buildingcost["bdg" + buildingType][7] * buildingMult; if (parseInt(buildingType) == 30) { buildingTime = CM.defensiveTower.costs[buildingLevel+1][6]; } if (parseInt(buildingType) == 31) { buildingTime = CM.defensiveTowerRedoubt.costs[buildingLevel+1][6]; } if (parseInt(buildingType) < 6 && parseInt(buildingType) > 0 && buildingMult == 1) { buildingTime = 15; } if (destroy) { if (buildingTime % 1 > 0) { buildingTime = parseInt(buildingTime); } } else { buildingTime = parseInt(buildingTime / (1 + 0.005 * polValue + 0.1 * parseInt(Seed.tech.tch16))); if (constructionBoost > 0) buildingTime = Math.round(buildingTime / (1 + (constructionBoost / 100))); } return buildingTime; }, PaintCityInfo : function () { var t = Tabs.Build; var cityId = t.ModelCityId; if (cityId==0) { return; } t.ValidateBuildQueue(cityId,true); // clear completed if required // paint the Queue... var SortedQ = t.sortBuildQueue(cityId); var now = unixTime(); var BQ = t.BuildQueue[t.QueueKey(cityId)]; var QLen = SortedQ.length; if (QLen==0) { t.LastQueue = 'x'; m = '
    '+tx('No buildings queued')+'
    '; ById('btBldQueue').innerHTML = m; } else { var activeblds = []; var activetimes = []; var qcon = Seed.queue_con["city" + cityId]; if (matTypeof(qcon) == 'array' && qcon.length > 0) { if (parseInt(qcon[0][4]) > now) { activeblds.push(parseIntNan(qcon[0][7])); activetimes.push(parseIntNan(qcon[0][4])); } if (qcon.length > 1) { if (parseInt(qcon[1][4]) > now) { activeblds.push(parseIntNan(qcon[1][7])); activetimes.push(parseIntNan(qcon[1][4])); } } } var qs = JSON2.stringify(SortedQ); if (qs == t.LastQueue) { // queue hasn't changed, just update the current level, time, and status text for (var QObj in SortedQ) { var b = SortedQ[QObj].b; if (b) { var CurrLevel = 0; var pos = Number(b.split("pos")[1]); var StatusText = BQ[b].status; var actindex = activeblds.indexOf(pos); var acttime = 0; var bbmax = BQ[b].maxlevel; if (actindex != -1) { if (BQ[b].maxlevel>0) { StatusText = tx('Building')+'...'; } else { StatusText = tx('Destroying')+'...'; } if (BQ[b].status != "") { BQ[b].status = ""; t.SaveBuildQueue(); } acttime = activetimes[actindex]-now; bbmax--; } var QTime = acttime; if (Seed.buildings["city"+cityId][b]) { CurrLevel = parseIntNan(Seed.buildings["city"+cityId][b][1]); } if ((actindex == -1) && BQ[b].ascendcomplete && BQ[b].ascendcomplete == Seed.cityData.city[cityId].prestigeInfo.prestigeLevel) { StatusText = 'Complete!'; } if (BQ[b].maxlevel==0) { if (acttime==0) { QTime += t.getBuildTime(cityId, CurrLevel, BQ[b].buildtype, true); } } else { for (var bb=CurrLevel;bb'+uW.g_js_strings.commonstr.type+''+tx('Max Level')+''+tx('Current')+''+tx('Remaining')+''+uW.g_js_strings.commonstr.status+''+tx('Remove All')+''; var r = 0; for (var QObj in SortedQ) { var b = SortedQ[QObj].b; if (b) { rowClass = 'evenRow'; if (r % 2 == 1) rowClass = 'oddRow'; var CurrLevel = 0; var pos = Number(b.split("pos")[1]); var StatusText = BQ[b].status; var actindex = activeblds.indexOf(pos); var acttime = 0; var bbmax = BQ[b].maxlevel; if (actindex != -1) { if (BQ[b].maxlevel>0) { StatusText = tx('Building')+'...'; } else { StatusText = tx('Destroying')+'...'; } if (BQ[b].status != "") { BQ[b].status = ""; t.SaveBuildQueue(); } acttime = activetimes[actindex]-now; bbmax--; } var QTime = acttime; if (Seed.buildings["city"+cityId][b]) { CurrLevel = parseIntNan(Seed.buildings["city"+cityId][b][1]); } if ((actindex == -1) && BQ[b].ascendcomplete && BQ[b].ascendcomplete == Seed.cityData.city[cityId].prestigeInfo.prestigeLevel) { StatusText = 'Complete!'; } m += ''+pos+''+uW.buildingcost['bdg'+BQ[b].buildtype][0]+''+(BQ[b].maxlevel||"("+uW.g_js_strings.commonstr.decontruct+")")+''+(CurrLevel||"--")+''; if (BQ[b].maxlevel==0) { if (acttime==0) { QTime += t.getBuildTime(cityId, CurrLevel, BQ[b].buildtype, true); } } else { for (var bb=CurrLevel;bb'+timestr(QTime, true) + ''; m += ''+StatusText+''+tx('Remove')+''; r++; } } m += '
     
    '; ById('btBldQueue').innerHTML = m; } } ById('btBldQueueStats').innerHTML = QLen+ ' Buildings'; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, getAscensionRequirements : function (type,faction,level) { var t = Tabs.Build; var fac = 'DRUID'; switch (faction) { case "2": fac = 'FEY'; break; case "3": fac = 'BRITON'; break; } return CM.WorldSettings.getSettingAsObject("ASCENSION_REQS_"+fac)[level] ? parseIntNan(CM.WorldSettings.getSettingAsObject("ASCENSION_REQS_"+fac)[level][type]) : 9999999; }, CreateBuildModeDiv : function () { var t = Tabs.Build; t.BuildDiv = document.createElement('div'); t.BuildDiv.id = 'btBuildDiv'; t.BuildDiv.style.position = 'absolute'; t.BuildDiv.style.width = '750px'; t.BuildDiv.style.top = '20px'; t.BuildDiv.style.height = '25px'; t.BuildDiv.style.paddingLeft = '10px'; t.BuildDiv.style.paddingTop = '8px'; t.BuildDiv.style.zIndex = '20002'; // keep above nearly everything else... t.BuildDiv.style.display = 'none'; t.BuildDiv.style.opacity = '0.95'; t.BuildDiv.style.backgroundColor = '#fde073'; var m = ''; m += ''; m += ''; m += '
    '+tx('BUILD MODE')+': '+uW.g_js_strings.commonstr.type+': '+htmlSelector({build: tx('Next Level Only'), max: tx('Build to Level'), destroy: uW.g_js_strings.commonstr.decontruct, stomp: tx('Dragon Stomp')},'max','id=pbbuildmodetype')+' '+uW.g_js_strings.commonstr.level+' '+tx('Empty Slots')+': '+htmlSelector(t.BuildList,Options.BuildOptions.EmptySlots,'id=pbbuildmodeempty')+''+strButton14(uW.g_js_strings.commonstr.close,'id=pbbuildmodeclose')+'
    '; t.BuildDiv.innerHTML = m; ById('mod_maparea').appendChild(t.BuildDiv); ChangeOption('BuildOptions','pbbuildmodeempty','EmptySlots'); ById('pbbuildmodeclose').addEventListener('click', t.toggleStateMode, false); }, FlashBuildMode : function(color) { var t = Tabs.Build; jQuery('#pbbmlabel').css('color', color); setTimeout(function() { jQuery('#pbbmlabel').css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); },250); }, bot_buildslot: function (c, a) { var t = Tabs.Build; var buildingMode = ById('pbbuildmodetype').value; var toLevel = ById('pbbuildmodeto').value.substr(5); var cityId = uW.currentcityid; var buildingPos = c.id.split("_")[1]; if (!Seed.buildings['city' + cityId]["pos" + buildingPos]) { // new build! if (buildingMode != "stomp" && buildingMode != "destroy") { if (buildingPos==1) { var buildingType = 19; } // wall in position 1! else { var buildingType = parseIntNan(Options.BuildOptions.EmptySlots); } if (buildingMode == "build") { var buildingLevel = 0; if (t.BuildQueue[t.QueueKey(cityId)] && t.BuildQueue[t.QueueKey(cityId)]["pos"+buildingPos] && t.BuildQueue[t.QueueKey(cityId)]["pos"+buildingPos].buildtype==buildingType) { if (t.BuildQueue[t.QueueKey(cityId)]["pos"+buildingPos].maxlevel > buildingLevel) { buildingLevel = t.BuildQueue[t.QueueKey(cityId)]["pos"+buildingPos].maxlevel; } } buildingLevel += 1; } else { if (buildingMode == "max") { var buildingLevel = parseIntNan(toLevel); } } var maxlevel = buildingLevel; if (uW.buildingmaxlvl[buildingType] buildingLevel) { buildingLevel = t.BuildQueue[t.QueueKey(cityId)]["pos"+buildingPos].maxlevel; } } buildingLevel += 1; } else { if (buildingMode == "max") { buildingLevel = parseIntNan(toLevel); } } var maxlevel = buildingLevel; if (uW.buildingmaxlvl[buildingType]3) return; //dont want to get stuck in a loop of failures var params = uW.Object.clone(uW.g_ajaxparams); params.bid = f; params.ctrl = 'AskForHelp'; params.action = 'getHelpData'; new MyAjaxRequest(uW.g_ajaxpath + "ajax/_dispatch.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok && rslt.data) { uW.handleHelpCallback(uWCloneInto(rslt.data)); //only post build to FB if they take at least half an hour if (time > 1800) { var a = Seed.queue_con["city" + cid]; var e = 0; var d = 0; for (var c = 0; c < a.length; c++) { if (parseInt(a[c][2]) == parseInt(f)) { e = parseInt(a[c][0]); d = parseInt(a[c][1]); break } } var b = new Array(); b.push(["REPLACE_LeVeLbUiLdInG", d]); b.push(["REPLACE_BuIlDiNgNaMe", uW.buildingcost["bdg" + e][0]]); b.push(["REPLACE_LeVeLiD", d]); b.push(["REPLACE_AsSeTiD", f]); uW.common_postToProfile("95", uWCloneInto(b)); } } else { if (rslt.errorMsg) { actionLog(Cities.byID[cid].name+': '+rslt.errorMsg,'BUILD'); } else { actionLog(Cities.byID[cid].name+': Build help request failure','BUILD'); } } }, onFailure: function () { actionLog(Cities.byID[cid].name+': Build help request failure','BUILD'); t.bot_gethelp(f, cid, time, retry+1); return; }, },true); }, sortBuildQueue : function (cityId) { var t = Tabs.Build; var Sorted = []; var BQ = t.BuildQueue[t.QueueKey(cityId)]; if (BQ && BQ!={}) { BQ = JSON2.parse(JSON2.stringify(BQ)); // new object for (var b in BQ) { var BObj = BQ[b]; if (BObj.hasOwnProperty("buildtype")) { var CurrLevel = 0; if (Seed.buildings["city"+cityId][b]) { CurrLevel = parseIntNan(Seed.buildings["city"+cityId][b][1]); } var QTime = 0; if (BQ[b].maxlevel==0) { QTime = t.getBuildTime(cityId, CurrLevel, BQ[b].buildtype, true); } else { if (CurrLevel>=BQ[b].maxlevel) { QTime=99999999; } else { QTime = t.getBuildTime(cityId, CurrLevel, BQ[b].buildtype, false); } } var SmartOrder = t.SmartOrder.indexOf(Number(BQ[b].buildtype)); if (SmartOrder<0) { SmartOrder = 99999999; } BObj.QTime = QTime; BObj.b = b; BObj.pos = Number(b.split("pos")[1]); BObj.SmartOrder = SmartOrder; Sorted.push(BObj); } } // sort by next level time, then position... if (parseIntNan(Options.BuildOptions.BuildPriority)==1) { Sorted.sort(function(a, b){ var x = a.QTime - b.QTime; return (x==0) ? a.pos - b.pos : x; }); } // sort by position... if (parseIntNan(Options.BuildOptions.BuildPriority)==2) { Sorted.sort(function(a, b){ return a.pos - b.pos; }); } // sort by type, then position... if (parseIntNan(Options.BuildOptions.BuildPriority)==3) { Sorted.sort(function(a, b){ var x = Number(a.buildtype) - Number(b.buildtype); return (x==0) ? a.pos - b.pos : x; }); } // sort by smartorder, then position... if (parseIntNan(Options.BuildOptions.BuildPriority)==4) { Sorted.sort(function(a, b){ var x = a.SmartOrder - b.SmartOrder; var y = Number(b.buildtype) - Number(a.buildtype); return (x==0) ? ((y==0) ? a.pos - b.pos : y) : x; }); } return Sorted; } else { return Sorted; } }, ValidateBuildQueue : function (cityId,save) { var t = Tabs.Build; var BQ = t.BuildQueue[t.QueueKey(cityId)]; if (BQ && BQ!={}) { for (var b in BQ) { var BObj = BQ[b]; if (BObj.hasOwnProperty("buildtype")) { if (BObj.ascendcomplete && BObj.ascendcomplete != Seed.cityData.city[cityId].prestigeInfo.prestigeLevel) { // new ascension level t.BuildQueue[t.QueueKey(cityId)][b].ascendcomplete = ""; // clear completed flag t.BuildQueue[t.QueueKey(cityId)][b].status = ""; // clear status flag if (save) t.SaveBuildQueue(); } if (Seed.buildings["city"+cityId][b]) { // check building type and level var buildingType = parseIntNan(Seed.buildings['city' + cityId][b][0]); var buildingLevel = parseIntNan(Seed.buildings['city' + cityId][b][1]); } if (BObj.maxlevel > 0) { if (Seed.buildings["city"+cityId][b]) { // check building type and level var KeepCompleted = (Options.BuildOptions.KeepCompleted && Seed.cityData.city[cityId].isPrestigeCity); if (buildingType && BObj.buildtype!=buildingType || (BObj.maxlevel<=buildingLevel && !KeepCompleted)) { delete t.BuildQueue[t.QueueKey(cityId)][b]; if (save) t.SaveBuildQueue(); } } } else { // check if already destroyed if (!Seed.buildings["city"+cityId][b]) { delete t.BuildQueue[t.QueueKey(cityId)][b]; if (save) t.SaveBuildQueue(); } else { if (buildingType && BObj.buildtype!=buildingType) { delete t.BuildQueue[t.QueueKey(cityId)][b]; if (save) t.SaveBuildQueue(); } } } } } } }, doAutoLoop : function (idx) { var t = Tabs.Build; clearTimeout(t.timer); if (!Options.BuildOptions.Running) return; var cityId = Cities.cities[idx-1].id; if (idx==1) { t.loopaction = false; } // reset loop action indicator for first city t.autodelay = 0; // no delay if no action taken! // first check if city is idle (or busy) var now = unixTime(); var isBusy = false; var qcon = Seed.queue_con["city" + cityId]; if (qcon.length > 0) { if (parseInt(qcon[0][4]) > now) { isBusy = true; // try second queue if (CM.QueueModel.hasFreeQueue() && Options.BuildOptions.bothqueues) { isBusy = false; if (qcon.length > 1) { if (parseInt(qcon[1][4]) > now) { isBusy = true; } } else { t.FixQueue(cityId,1); } } } else { t.FixQueue(cityId,0); } } if (isBusy) { // queue busy, try speedup! t.autoSpeedup (cityId,qcon[0]); } else { // we can build! t.ValidateBuildQueue(cityId,true); if (!Options.BuildOptions.ThroneCheck || (t.buildspeed >= Options.BuildOptions.BuildSpeed)) { // if no build speed restriction or enough building speed var ascensionok = (!Options.BuildOptions.AscensionReady[idx]); if (Options.BuildOptions.Enabled[idx] && ascensionok) { if (t.citydelay[idx] > 0) { t.citydelay[idx]--; } // city being delayed due to error, reduce delay number and skip city else { var SortedQ = t.sortBuildQueue(cityId); if (SortedQ.length>0) { var activeblds = []; if (matTypeof(qcon) == 'array' && qcon.length > 0) { if (parseInt(qcon[0][4]) > now) { activeblds.push(parseIntNan(qcon[0][7])); } if (qcon.length > 1) { if (parseInt(qcon[1][4]) > now) { activeblds.push(parseIntNan(qcon[1][7])); } } } // select next building from sorted queue and check build requirements... var SomethingToBuild = false; for (var QObj in SortedQ) { var b = SortedQ[QObj].b; if (b) { if (activeblds.indexOf(parseIntNan(b.split("pos")[1])) == -1) { // check not already building var QEntry = t.BuildQueue[t.QueueKey(cityId)][b]; if (QEntry.maxlevel>0) { if (!QEntry.ascendcomplete || QEntry.ascendcomplete != Seed.cityData.city[cityId].prestigeInfo.prestigeLevel) { // check building not already completed for this ascension level var NextLevel = 1; if (Seed.buildings['city'+cityId][b]) { NextLevel = parseIntNan(Seed.buildings['city'+cityId][b][1])+1; } if (NextLevel <= QEntry.maxlevel) { var CanBuild = t.CheckCanBuild(QEntry.buildtype, NextLevel, cityId, b.split("pos")[1]); if (!CanBuild) { // update queue entry var statustext = tx('Missing Requirement'); if (t.limitingFactor) { statustext += ' ('+t.limitingFactor+')'; } t.BuildQueue[t.QueueKey(cityId)][b].status = statustext; t.SaveBuildQueue(); } else { SomethingToBuild = true; t.autodelay = t.intervalSecs; t.loopaction = true; t.Build(cityId,b,QEntry.buildtype,NextLevel); break; } } else { t.BuildQueue[t.QueueKey(cityId)][b].status = ""; t.BuildQueue[t.QueueKey(cityId)][b].ascendcomplete = Seed.cityData.city[cityId].prestigeInfo.prestigeLevel; t.SaveBuildQueue(); } } } else { // cannot destroy embassy while part of alliance... if (QEntry.buildtype==8 && getMyAlliance()[0] != 0) { var statustext = 'Cannot destroy when part of Alliance!'; t.BuildQueue[t.QueueKey(cityId)][b].status = statustext; t.SaveBuildQueue(); } else { // cannot destroy spire when craft queue is full if (QEntry.buildtype==20 && Seed.queue_craft["city"+cityId].length > 0) { var statustext = 'Cannot destroy when crafting!'; t.BuildQueue[t.QueueKey(cityId)][b].status = statustext; t.SaveBuildQueue(); } else { var NextLevel = parseIntNan(Seed.buildings['city'+cityId][b][1]); // need this for destroy? SomethingToBuild = true; t.autodelay = t.intervalSecs; t.loopaction = true; t.Destroy(cityId,b,QEntry.buildtype,NextLevel); break; } } } } } } if (!SomethingToBuild) { // nothing we can build in this city, delay the city by 10 loops... t.citydelay[idx] = 10; } } } } } } if (idx == Cities.numCities) { if (!t.loopaction) { t.autodelay = t.intervalSecs; } // if no action this loop, apply delay anyway... t.timer = setTimeout(function () { t.doAutoLoop(1); }, (t.autodelay * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1); }, (t.autodelay * 1000)); } }, autoSpeedup: function (cityId,q) { var t = Tabs.Build; var now = unixTime(); var item = 0; totTime = q[4] - now; if (totTime > 0) { if (Options.BuildOptions.UseOverride && Options.BuildOptions.OverrideItem != 0) { var THRESHOLD_SECONDS = (parseIntNan(Options.BuildOptions.OverrideMinutes)*60)+(parseIntNan(Options.BuildOptions.OverrideHours)*60*60); if (totTime >= THRESHOLD_SECONDS && uW.ksoItems[Options.BuildOptions.OverrideItem].count > 0) { item = Options.BuildOptions.OverrideItem; } } if (item==0 && totTime >= HGLimit[8] && Options.BuildOptions.UseLH && uW.ksoItems[10].count > 0) { item = 10; } if (item==0 && totTime >= HGLimit[7] && Options.BuildOptions.UseEH && uW.ksoItems[8].count > 0) { item = 8; } if (item==0 && totTime >= HGLimit[6] && Options.BuildOptions.UseDH && uW.ksoItems[7].count > 0) { item = 7; } if (item==0 && totTime >= HGLimit[5] && Options.BuildOptions.UseRH && uW.ksoItems[6].count > 0) { item = 6; } if (item==0 && totTime >= HGLimit[4] && Options.BuildOptions.UseAH && uW.ksoItems[5].count > 0) { item = 5; } if (item==0 && totTime >= HGLimit[3] && Options.BuildOptions.UseMH && uW.ksoItems[4].count > 0) { item = 4; } if (item==0 && totTime >= HGLimit[2] && Options.BuildOptions.UseGH && uW.ksoItems[3].count > 0) { item = 3; } if (item==0 && totTime >= HGLimit[1] && Options.BuildOptions.UseKH && uW.ksoItems[2].count > 0) { item = 2; } if (item==0 && totTime >= HGLimit[0] && Options.BuildOptions.UseSH && uW.ksoItems[1].count > 0) { item = 1; } } if (item != 0) { t.autodelay = t.intervalSecs; t.loopaction = true; t.speedupBuild(cityId,item,q[2],0,true); } }, FixQueue : function (cityId,qpos) { var t = Tabs.Build; var qcon = Seed.queue_con["city" + cityId]; if (qcon[qpos]) { // fix the seed... if (GlobalOptions.ExtendedDebugMode) { logit(Cities.byID[cityId].name+': Fixing seed.building array','BUILD'); } if (qcon[qpos][1] == 0) { delete Seed.buildings["city" + cityId]['pos'+qcon[qpos][7]]; } else { Seed.buildings["city" + cityId]['pos'+qcon[qpos][7]] = uWCloneInto([qcon[qpos][0],qcon[qpos][1],qcon[qpos][7],qcon[qpos][2]]); }; qcon.pop(); // remove expired build from queue if (cityId == uW.currentcityid) { uW.modal_build_show_state(); uW.update_bdg(); } } }, CheckCanBuild : function (BuildId,Level,cityId,pos) { var t = Tabs.Build; t.limitingFactor = null; if (parseIntNan(Level)==0) return false; var Result = true; if (BuildId >= 50 && BuildId <= 53) { return true; } // for field view in unascended, check slot unlocked by castle level var MaxFields = 109 + (3 * parseInt(Seed.buildings["city"+cityId]["pos0"][1])); if (pos>MaxFields) { t.limitingFactor = tx('Field still locked'); Result = false; return Result; } // if building above 10, check castle level if (Level>10) { if (BuildId!=0) { var B = parseInt(Seed.buildings["city"+cityId]["pos0"][1]); if (B < Level) { t.limitingFactor = tx('Castle'); Result = false; return Result; } } else { // castle requires wall one level below dammit! var B = parseInt(Seed.buildings["city"+cityId]["pos1"][1]); if (B < (Level-1)) { t.limitingFactor = tx('Wall'); Result = false; return Result; } } } // check resources if (BuildId == 30) { // defensive tower different var unitFood = parseInt(CM.defensiveTower.costs[Level][1]); var unitWood = parseInt(CM.defensiveTower.costs[Level][2]); var unitStone = parseInt(CM.defensiveTower.costs[Level][3]); var unitOre = parseInt(CM.defensiveTower.costs[Level][4]); } else { if (BuildId == 31) { // redoubt tower difference var unitFood = parseInt(CM.defensiveTowerRedoubt.costs[Level][1]); var unitWood = parseInt(CM.defensiveTowerRedoubt.costs[Level][2]); var unitStone = parseInt(CM.defensiveTowerRedoubt.costs[Level][3]); var unitOre = parseInt(CM.defensiveTowerRedoubt.costs[Level][4]); } else { var BuildMult = Math.pow(2, Level-1); var unitFood = parseInt(uW.buildingcost['bdg'+BuildId][1])*BuildMult; var unitWood = parseInt(uW.buildingcost['bdg'+BuildId][2])*BuildMult; var unitStone = parseInt(uW.buildingcost['bdg'+BuildId][3])*BuildMult; var unitOre = parseInt(uW.buildingcost['bdg'+BuildId][4])*BuildMult; } } var food = parseIntNan(Seed.resources['city' + cityId].rec1[0] / 3600); var wood = parseIntNan(Seed.resources['city' + cityId].rec2[0] / 3600); var stone = parseIntNan(Seed.resources['city' + cityId].rec3[0] / 3600); var ore = parseIntNan(Seed.resources['city' + cityId].rec4[0] / 3600); if (food < unitFood) { t.limitingFactor = uW.resourceinfo['rec1']; Result = false; } if (wood < unitWood) { t.limitingFactor = uW.resourceinfo['rec2']; Result = false; } if (stone < unitStone) { t.limitingFactor = uW.resourceinfo['rec3']; Result = false; } if (ore < unitOre) { t.limitingFactor = uW.resourceinfo['rec4']; Result = false; } if (!Result) return Result; // break out if already failed // building requirements var Buildings = getCityBuildings(cityId); if (BuildId == 30) { // defensive tower different var fc = CM.defensiveTower.buildReq[Level]; if (matTypeof(fc[0]) == 'object'){ for (var k in fc[0]){ var b = Buildings[k]; var req = fc[0][k]; if (req<0) { req=Level+req; } if (b.maxLevel < req){ t.limitingFactor = uW.buildingcost["bdg"+k.substr(1)][0]; Result = false; break; } } } var fc = CM.defensiveTower.itemsReq[Level]; if (matTypeof(fc) == 'object'){ for (var k in fc){ var b = parseIntNan(Seed.items["i"+k]); var req = fc[k]; if (b < req){ t.limitingFactor = uW.itemlist["i"+k].name; Result = false; break; } } } } else { if (BuildId == 31) { // redoubt tower different var fc = CM.defensiveTowerRedoubt.buildReq[Level]; if (matTypeof(fc[0]) == 'object'){ for (var k in fc[0]){ var b = Buildings[k]; var req = fc[0][k]; if (req<0) { req=Level+req; } if (b.maxLevel < req){ t.limitingFactor = uW.buildingcost["bdg"+k.substr(1)][0]; Result = false; break; } } } var fc = CM.defensiveTowerRedoubt.itemsReq[Level]; if (matTypeof(fc) == 'object'){ for (var k in fc){ var b = parseIntNan(Seed.items["i"+k]); var req = fc[k]; if (b < req){ t.limitingFactor = uW.itemlist["i"+k].name; Result = false; break; } } } } else { var fc = uW.buildingcost['bdg'+BuildId]; if (matTypeof(fc[8]) == 'object'){ for (var k in fc[8]){ var bType = k.substr(1); var b = Buildings[bType]; var req = fc[8][k][1]; if (req<0) { req=Level+req; } var maxlvl = uW.buildingmaxlvl[bType]||12; if (b.maxLevel < Math.min(maxlvl,req)){ t.limitingFactor = uW.buildingcost["bdg"+bType][0]; Result = false; break; } } } if (matTypeof(fc[9]) == 'object'){ for (var k in fc[9]){ if (parseInt(Seed.tech['tch'+k.substr(1)]) < (fc[9][k][1])+Level){ t.limitingFactor = uW.techcost["tch"+k.substr(1)][0]; Result = false; break; } } } } } // item requirements var V = 1; if (Level > 9) { var h = "i401"; if (BuildId == 0) { if (Level == 11) { h = "i402" } else { if (Level == 12) { h = "i404" } else { if (Level == 13) { h = "i409" } else { if (Level == 14) { h = "i415" } else { if (Level == 15) { h = "i416" } } } } } } else { if (Level > 11) { h = "i403" } } if (BuildId == 12) { if (Level == 13) { h = "i410" } else { if (Level == 14) { h = "i419"; V = 3; } else { if (Level == 15) { h = "i420" V = 5; } } } } if (BuildId == 19) { if (Level == 13) { h = "i408" } else { if (Level == 14) { h = "i417" } else { if (Level == 15) { h = "i418" } } } } if (BuildId == 5 && Level == 12) { h = "i407" } var c = CM.BuildingRequirements.get(BuildId, (Level-1)); h = c || h; var b = parseIntNan(Seed.items[h]); if (b 0) { if (CM.QueueModel.hasFreeQueue() && Options.BuildOptions.bothqueues) { // double check! additionalqueue = 1; } else { t.citydelay[citynum] = 10; // delay 10 loops actionLog(Cities.byID[cityId].name+': Not authorised to use second build queue','BUILD'); return; } } var time = t.getBuildTime(cityId, lvl, btype, true); var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.bid = bid; params.pos = bpos.split("pos")[1]; params.lv = lvl-1; params.type = btype; params.pay_for_an_additional_queue=additionalqueue; params.permission=0; new MyAjaxRequest(uW.g_ajaxpath + "ajax/destruct.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { if (rslt.timeNeeded) { time = rslt.timeNeeded; } actionLog(Cities.byID[cityId].name+': Deconstructing '+uW.buildingcost['bdg'+btype][0],'BUILD'); t.AddSeedQueueEntry(cityId, btype, 0, rslt.buildingId, uW.unixtime(), uW.unixtime()+time, 0, time, params.pos); if (params.cid == uW.currentcityid) uW.update_bdg(); delete t.BuildQueue[t.QueueKey(cityId)][bpos]; // remove destroy request from queue t.SaveBuildQueue(); } else { t.HandleBuildError (rslt,cityId,bpos,btype,lvl); } t.PaintOverview(); jQuery('#btBuildCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': AJAX Error','BUILD'); jQuery('#btBuildCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); } },true); }, Build : function(cityId,bpos,btype,lvl) { var t = Tabs.Build; var citynum = Cities.byID[cityId].idx+1; var bid = 0; var BuildOK = true; if (Seed.buildings["city" + cityId][bpos]) { bid = parseIntNan(Seed.buildings["city" + cityId][bpos][3]); } var additionalqueue = 0; var qcon = Seed.queue_con["city"+cityId]; if (matTypeof(qcon) == 'array' && qcon.length > 0) { if (CM.QueueModel.hasFreeQueue() && Options.BuildOptions.bothqueues) { // double check! additionalqueue = 1; } else { t.citydelay[citynum] = 10; // delay 10 loops actionLog(Cities.byID[cityId].name+': Not authorised to use second build queue','BUILD'); BuildOK = false; } } // double check building requirements? if (btype != 30 && btype != 31) { // not defensive tower...? var saveCityId = uW.currentcityid; uW.currentcityid = cityId; var chk = uW.checkreq("bdg", btype, lvl); //check if all requirements are met uW.currentcityid = saveCityId; for (var c = 0; c < chk[3].length; c++) { if (chk[3][c] == 0) { t.citydelay[citynum] = 10; // delay 10 loops actionLog(Cities.byID[cityId].name+': Final building check failed ('+uW.buildingcost['bdg'+btype][0]+' Level '+lvl+')','BUILD'); BuildOK = false; } } } if (BuildOK) { jQuery('#btBuildCity_'+citynum).css('color', 'green'); var time = t.getBuildTime(cityId, lvl-1, btype, false); var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.bid = ""; if (bid!=0) params.bid = bid; params.pos = bpos.split("pos")[1]; params.lv = lvl; params.type = btype; params.pay_for_an_additional_queue=additionalqueue; if (params.lv > 9) { params.permission = 1; } else { params.permission=0; } new MyAjaxRequest(uW.g_ajaxpath + "ajax/construct.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { if (rslt.timeNeeded) { time = rslt.timeNeeded; } actionLog(Cities.byID[cityId].name+': Building '+uW.buildingcost['bdg'+btype][0]+' Level '+lvl,'BUILD'); t.AddSeedQueueEntry(cityId,btype,lvl,rslt.buildingId,uW.unixtime(),uW.unixtime()+time,0,time,params.pos); if (btype == 30) { // defensive tower different jQuery.each(CM.defensiveTower.itemsReq[lvl], function (i, G) { CM.InventoryView.removeItemFromInventory(i, G) }); var unitFood = parseInt(CM.defensiveTower.costs[lvl][1]); var unitWood = parseInt(CM.defensiveTower.costs[lvl][2]); var unitStone = parseInt(CM.defensiveTower.costs[lvl][3]); var unitOre = parseInt(CM.defensiveTower.costs[lvl][4]); } else { if (btype == 31) { // redoubt tower different jQuery.each(CM.defensiveTowerRedoubt.itemsReq[lvl], function (i, G) { CM.InventoryView.removeItemFromInventory(i, G) }); var unitFood = parseInt(CM.defensiveTowerRedoubt.costs[lvl][1]); var unitWood = parseInt(CM.defensiveTowerRedoubt.costs[lvl][2]); var unitStone = parseInt(CM.defensiveTowerRedoubt.costs[lvl][3]); var unitOre = parseInt(CM.defensiveTowerRedoubt.costs[lvl][4]); } else { var BuildMult = Math.pow(2, lvl-1); var unitFood = parseInt(uW.buildingcost['bdg'+btype][1])*BuildMult; var unitWood = parseInt(uW.buildingcost['bdg'+btype][2])*BuildMult; var unitStone = parseInt(uW.buildingcost['bdg'+btype][3])*BuildMult; var unitOre = parseInt(uW.buildingcost['bdg'+btype][4])*BuildMult; } } Seed.resources["city"+cityId].rec1[0] -= unitFood; Seed.resources["city"+cityId].rec2[0] -= unitWood; Seed.resources["city"+cityId].rec3[0] -= unitStone; Seed.resources["city"+cityId].rec4[0] -= unitOre; var V = 1; if (lvl > 9) { var h = "i401"; if (btype == 0) { if (lvl == 11) { h = "i402" } else { if (lvl == 12) { h = "i404" } else { if (lvl == 13) { h = "i409" } else { if (lvl == 14) { h = "i415" } else { if (lvl == 15) { h = "i416" } } } } } } else { if (lvl > 11) { h = "i403" } } if (btype == 12) { if (lvl == 13) { h = "i410" } else { if (lvl == 14) { h = "i419"; V = 3; } else { if (lvl == 15) { h = "i420"; V = 5; } } } } if (btype == 19) { if (lvl == 13) { h = "i408" } else { if (lvl == 14) { h = "i417" } else { if (lvl == 15) { h = "i418" } } } } if (btype == 5 && lvl == 12) { h = "i407" } var c = CM.BuildingRequirements.get(btype, (lvl-1)); h = c || h; Seed.items[h] = parseInt(Seed.items[h]) - V; uW.ksoItems[parseInt(h.substr(1))].subtract(V); } if (Options.BuildOptions.help && time > 59) t.bot_gethelp(params.bid, cityId, time, 1); if (params.cid == uW.currentcityid) { if (jQuery("#queue_head_building").hasClass("sel") ) { uW.queue_changetab_building(); } uW.modal_build_show_state(); uW.update_bdg(); } if (lvl==t.BuildQueue[t.QueueKey(cityId)][bpos].maxlevel) { t.BuildQueue[t.QueueKey(cityId)][bpos].ascendcomplete = Seed.cityData.city[cityId].prestigeInfo.prestigeLevel; // completed } t.BuildQueue[t.QueueKey(cityId)][bpos].errors = 0; t.SaveBuildQueue(); } else { t.HandleBuildError (rslt,cityId,bpos,btype,lvl); } t.PaintOverview(); jQuery('#btBuildCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': AJAX Error','BUILD'); jQuery('#btBuildCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); } },true); } }, HandleBuildError : function (rslt,cityId,bpos,btype,lvl) { var t = Tabs.Build; var citynum = Cities.byID[cityId].idx+1; // fix Seed missing buildingId for next pass... if (rslt.buildingId && Seed.buildings["city" + cityId][bpos]) { Seed.buildings["city" + cityId][bpos][3] = parseInt(rslt.buildingId); } if (!rslt.msg) {rslt.msg = 'Error Code ('+rslt.error_code+')';} actionLog(Cities.byID[cityId].name+': Building Error - '+rslt.msg,'BUILD'); var a = null; var g = Number(rslt.error_code); var g_server = uW.g_server; var SetError = false; switch (g) { case 0: a = "Unexpected Error."; break; case 2: // building in progress - update seed to fix uW.buildingcost["bdg666"] = uWCloneInto(["Building...", 0, 0, 0, 0, 0, 0, 0, [], [], ""]); t.AddSeedQueueEntry(cityId, 666, 666, 666, uW.unixtime(), uW.unixtime() + 90, 0, 90, 999); a = "Construction is already starting."; break; case 3: // Unknown issue when updating your game, please try again break; case 8: a = "Excess traffic."; CM.GATracker("Error", a + " (" + g + ")", g_server); break; case 102: // Another building already exists on the same spot SetError = true; break; case 103: // building already at this level SetError = true; break; case 104: // building cannot be built here SetError = true; break; case 105: // building does not exist here SetError = true; break; case 106: // only one building of this type SetError = true; break; case 107: // only one field building of this type SetError = true; break; case 108: // all available queues in use - update seed to fix uW.buildingcost["bdg666"] = uWCloneInto(["Building...", 0, 0, 0, 0, 0, 0, 0, [], [], ""]); t.AddSeedQueueEntry(cityId, 666, 666, 666, uW.unixtime(), uW.unixtime() + 90, 0, 90, 999); a = "all available queues are in use."; break; default: a = "Something has gone wrong."; CM.GATracker("Error", a + " (" + g + ")", g_server); }; if (SetError) { if (!t.BuildQueue[t.QueueKey(cityId)][bpos].errors) { t.BuildQueue[t.QueueKey(cityId)][bpos].errors = 0; } t.BuildQueue[t.QueueKey(cityId)][bpos].errors++; if (t.BuildQueue[t.QueueKey(cityId)][bpos].errors >= 3) { // remove building from queue after 3 errors actionLog(Cities.byID[cityId].name+': Removing Building in Position '+bpos+' from Build Queue','BUILD'); delete t.BuildQueue[t.QueueKey(cityId)][bpos]; } t.SaveBuildQueue(); } if(rslt.user_action) { // captcha wtf? actionLog(Cities.byID[cityId].name+': Build Captcha Detected - delaying...','BUILD'); t.citydelay[citynum] = 10; } }, AddSeedQueueEntry : function(cityId,btype,lvl,id,start,end,zero,duration,pos) { var t = Tabs.Build; var k = uWCloneInto([]); k.push(btype); k.push(lvl); k.push(parseInt(id)); k.push(start); k.push(end); k.push(zero); k.push(duration); k.push(pos); Seed.queue_con["city"+cityId].push(k); }, LoadBuildPresets : function () { var t = Tabs.Build; ById('btBuildPreset').options.length = 0; var o = document.createElement("option"); o.text = "-- "+tx('Select Layout')+" --" o.value = 0; ById("btBuildPreset").options.add(o); for (var y in Options.BuildOptions.BuildPresetNames) { var o = document.createElement("option"); o.text = Options.BuildOptions.BuildPresetNames[y]; o.value = y; ById("btBuildPreset").options.add(o); } t.NextPresetNumber = parseIntNan(y) + 1; if (t.InitPresetNumber != 0) { ById('btBuildPreset').value = t.InitPresetNumber; t.InitPresetNumber = 0; } for (var a=1;a<=3;a++) { t.LoadAscensionPresets('btAscendPreset_'+a,a); } }, PaintBldPreset : function (PN,msg) { var t = Tabs.Build; t.FieldView = false; t.PresetType = Options.BuildOptions.BuildPresetTypes[PN]||parseIntNan(Seed.cityData.city[t.ModelCityId].prestigeInfo.prestigeType); t.PresetName = Options.BuildOptions.BuildPresetNames[PN]||""; if (PN!=0) { t.Preset = JSON2.parse(JSON2.stringify(Options.BuildOptions.BuildPresets[PN])); } else { t.Preset = {pos0:"bdg0",pos1:"bdg19"}; } t.PresetNum = PN; if (PN==0) { ById('btBldPresetMessages').innerHTML = tx('Layout Name')+': '; } else { ById('btBldPresetMessages').innerHTML = msg; } var m = ''; m += '
     
     
    '; m += '

    '+tx('Layout Type')+': '+htmlSelector(t.PresetTypes,t.PresetType,'id=btBldPresetType')+'
    '; m += '
    '+tx('City View')+'  '+tx('Field View')+'
    '; m += '
    '+strButton8(tx('Copy Current'),'id=btBldPresetCopy')+' '+strButton8(tx('Delete Layout'),'id=btBldPresetDelete')+' '+strButton8(tx('Save Changes'),'id=btBldPresetSave')+' '+strButton8(uW.g_js_strings.commonstr.cancel,'id=btBldPresetCancel')+'
    '; m += '
    '; m += '
    '; ById('btBldPresetDetails').innerHTML = m; t.setLayoutImage(); t.displaySlots(); if (PN==0) { jQuery('#btBldPresetDelete').addClass("disabled"); } else { jQuery('#btBldPresetCancel').addClass("disabled"); jQuery('#btBldPresetSave').addClass("disabled"); } ById('btBldPresetCity').addEventListener('change', function () { t.FieldView = !ById('btBldPresetCity').checked; t.setLayoutImage(); t.displaySlots(); }, false); ById('btBldPresetField').addEventListener('change', function () { t.FieldView = ById('btBldPresetField').checked; t.setLayoutImage(); t.displaySlots(); }, false); ById('btBldPresetType').addEventListener('change',function (e) { t.PresetType = e.target.value; jQuery('#btBldPresetSave').removeClass("disabled"); t.ValidateLayout(); t.setLayoutImage(); t.displaySlots(); } ,false); if (ById('btBldPresetName')) { ById('btBldPresetName').addEventListener('change',function (e) { jQuery('#btBldPresetSave').removeClass("disabled"); jQuery('#btBldPresetCancel').removeClass("disabled"); } ,false); } ById('btBldPresetCopy').addEventListener('click', t.CopyBldPreset,false); ById('btBldPresetSave').addEventListener('click', t.SaveBldPreset,false); ById('btBldPresetDelete').addEventListener('click', t.DeleteBldPreset,false); ById('btBldPresetCancel').addEventListener('click', t.CancelBldPreset,false); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, setLayoutImage : function () { var t = Tabs.Build; var ImageFile = CITY_VIEW; if (!t.FieldView) { if (t.PresetType==1) { ImageFile = DRUID_CITY_VIEW; } if (t.PresetType==2) { ImageFile = FEY_CITY_VIEW; } if (t.PresetType==3) { ImageFile = BRITON_CITY_VIEW; } } else { ImageFile = FIELD_VIEW; if (t.PresetType==1) { ImageFile = DRUID_FIELD_VIEW; } if (t.PresetType==2) { ImageFile = FEY_FIELD_VIEW; } if (t.PresetType==3) { ImageFile = BRITON_FIELD_VIEW; } } ById('btBldPresetImage').innerHTML = ''; }, displaySlots : function() { var t = Tabs.Build; var min = 0; var max = 32; var rowcount = 11; if (GlobalOptions.btWinSize.x == 750) {rowcount = 17;} if (GlobalOptions.btWinSize.x == 1250) {rowcount = 9;} var m = '
    '; var Blds = t.CityBuildings; if (!t.FieldView) { if (t.PresetType==1) { Blds = t.DruidCityBuildings; } if (t.PresetType==2) { Blds = t.FeyCityBuildings; } if (t.PresetType==3) { Blds = t.BritonCityBuildings; } } else { Blds = t.FieldBuildings; if (t.PresetType==1) { Blds = t.DruidFieldBuildings; } if (t.PresetType==2) { Blds = t.FeyFieldBuildings; } if (t.PresetType==3) { Blds = t.BritonFieldBuildings; } rowcount = 14; if (GlobalOptions.btWinSize.x == 750) {rowcount = 21;} if (GlobalOptions.btWinSize.x == 1250) {rowcount = 11;} if (t.PresetType==0) { min = 100; max = 145; } else { min = 101; max = 103; } } var BldSelect = {0:"-- Select Building --"}; for (var k in Blds) { if (uW.buildingcost["bdg"+Blds[k]]) { BldSelect["bdg"+Blds[k]] = uW.buildingcost["bdg"+Blds[k]][0]; } } var c = 0; m += ''; for (var p = min; p<=max; p++) { if (t.FieldView && p > 139 && p != 142 && p != 145) { continue; } if (p==0) { m += ''; } else { if (p==1) { m += ''; } else { m += ''; } } c++; if (c%rowcount==0) { m += '
    '+p+':  '+uW.buildingcost["bdg0"][0]+'
    '+p+':  '+uW.buildingcost["bdg19"][0]+'
    '+p+': '+htmlSelector(BldSelect,t.Preset["pos"+p]||0,'class="btInput btBldPresetSelector" id="btBldPresetpos'+p+'"')+'
    '; } } m += '
    '; m += '
      '+tx('Empty Slots')+': '+htmlSelector(BldSelect,0,'class="btInput" id="btBldPresetposAll"')+' '+strButton8(tx('Set'),'id=btBldPresetposAllSet')+'
    '; m += '
        
    '; ById('btBldPresetSlots').innerHTML = m; var nodes = ByCl('btBldPresetSelector'); if(nodes.length > 0){ for(var i=0; i'; return; } var file = files[0]; var reader = new FileReader(); reader.onload = function (e) { var Import = JSON2.parse(e.target.result); if (Import.Preset) { t.Preset = JSON2.parse(JSON2.stringify(Import.Preset)); jQuery('#btBldPresetSave').removeClass("disabled"); jQuery('#btBldPresetCancel').removeClass("disabled"); if (Import.PresetName && ById('btBldPresetName')) { ById('btBldPresetName').value = Import.PresetName; } if (Import.PresetType) { t.PresetType = Import.PresetType; ById('btBldPresetType').value = Import.PresetType; t.setLayoutImage(); } ById('btBldPresetImportMessages').innerHTML = tx('City layout imported'); t.displaySlots(); } else { ById('btBldPresetImportMessages').innerHTML = tx('Invalid File')+'!'; } }; reader.readAsText(file); },false); ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); }, SetAllEmpty : function () { var t = Tabs.Build; var NewType = ById('btBldPresetposAll').value; if (NewType != 0) { var nodes = ByCl('btBldPresetSelector'); if(nodes.length > 0){ for(var i=0; imax) { delete t.Preset[b]; } } } } } }, NewBldPreset : function () { var t = Tabs.Build; ById('btBuildPreset').value = 0; jQuery('#btNewBldPreset').addClass("disabled"); t.PaintBldPreset(0,''); }, DeleteBldPreset : function () { var t = Tabs.Build; if (!t.PresetNum) return; delete Options.BuildOptions.BuildPresetTypes[t.PresetNum]; delete Options.BuildOptions.BuildPresetNames[t.PresetNum]; delete Options.BuildOptions.BuildPresets[t.PresetNum]; saveOptions(); t.LoadBuildPresets(); jQuery('#btNewBldPreset').removeClass("disabled"); t.clearBuildPresetDiv(); ById('btBldPresetMessages').innerHTML = tx('Layout Deleted')+'!'; }, CancelBldPreset : function () { var t = Tabs.Build; jQuery('#btNewBldPreset').removeClass("disabled"); ById('btBldPresetMessages').innerHTML = ' '; if (!t.PresetNum) { t.clearBuildPresetDiv(); } else { t.PaintBldPreset(t.PresetNum,''); } }, SaveBldPreset : function () { var t = Tabs.Build; // validate buildings? if (t.PresetNum==0) { t.PresetNum = t.NextPresetNumber; Options.BuildOptions.BuildPresetNames[t.PresetNum] = ById('btBldPresetName').value; } Options.BuildOptions.BuildPresetTypes[t.PresetNum] = ById('btBldPresetType').value; Options.BuildOptions.BuildPresets[t.PresetNum] = JSON2.parse(JSON2.stringify(t.Preset)); saveOptions(); jQuery('#btNewBldPreset').removeClass("disabled"); t.InitPresetNumber = t.PresetNum; t.LoadBuildPresets(); t.PaintBldPreset(t.PresetNum,tx('Layout Saved')+'!'); }, SelectBldPreset : function (sel) { var t = Tabs.Build; if (sel.value==0) { t.clearBuildPresetDiv(); } else { t.PaintBldPreset(sel.value,''); } }, CopyBldPreset : function () { var t = Tabs.Build; t.Preset = {pos0:"bdg0",pos1:"bdg19"}; t.PresetType = parseIntNan(Seed.cityData.city[t.ModelCityId].prestigeInfo.prestigeType); ById('btBldPresetType').value = t.PresetType; for (var b in Seed.buildings['city'+t.ModelCityId]) { var building = Seed.buildings['city'+t.ModelCityId][b]; if (building) { if (parseInt(building[2]) < 300 || parseInt(building[2]) > 309) { // no dummy ascension buildings if (building && building[1] != 0) { if (building[0]<30 && building[0]>0) { t.Preset[b] = "bdg"+building[0]; } } } } } jQuery('#btBldPresetSave').removeClass("disabled"); jQuery('#btBldPresetCancel').removeClass("disabled"); t.setLayoutImage(); t.displaySlots(); }, SetBldPreset : function () { var t = Tabs.Build; var cityId = t.ModelCityId; var ToLevel = parseIntNan(ById('btBldPresetAllTo').value.substr(5)); var PN = parseIntNan(ById('btBuildPreset').value); if (PN==0) return; ById('btBldPresetMessages').innerHTML = ' '; // validate correct type if (t.PresetType != parseIntNan(Seed.cityData.city[cityId].prestigeInfo.prestigeType)) { ById('btBldPresetMessages').innerHTML = 'Incorrect city type'; return; } for (var b in t.Preset) { var building = t.Preset[b]; if (building && building != 0) { var bid = parseInt(building.split("bdg")[1]); var pos = parseInt(b.split("pos")[1]); var CurrLevel=0; if (Seed.buildings['city'+cityId][b]) { CurrLevel = Seed.buildings['city'+cityId][b][1]; } if (CurrLevel==0 || Seed.buildings['city'+cityId][b][0]==bid) { t.addToBuildQueue(cityId,b,bid,ToLevel,CurrLevel); } } } t.SaveBuildQueue(); t.PaintOverview(); t.PaintCityInfo(); ById('btBldQueueLink').click(); }, Ascend : function (cityId,faction,blessingId,notify) { var t = Tabs.Build; var ascended = getAscensionValues(cityId); var cityPrestigeType = ascended.prestigeType; var cityPrestigeLevel = ascended.prestigeLevel; var blessings = Seed.cityData.city[cityId].prestigeInfo.blessings; if (!blessings) { blessings = []; } var action = 1; if (ascended.isPrestigeCity) { action = 2; faction = cityPrestigeType; } var paymentType = 'gems'; var crystalId = null; var cost = 0; var CanUseCrystal = false; var Lessers = Seed.items.i33000||0; var Greaters = Seed.items.i33001||0; if (cityPrestigeLevel<3) { // lessers ascend 1-3 CanUseCrystal = (Options.BuildOptions.UseLesserCrystals && Lessers); if (CanUseCrystal) { paymentType = 'crystals'; crystalId = '33000'; cost = 1; } } else { CanUseCrystal = (Options.BuildOptions.UseGreaterCrystals && Greaters); if (CanUseCrystal) { paymentType = 'crystals'; crystalId = '33001'; cost = 1; } } var cityValue = parseIntNan(Seed.cityData.city[cityId].cityValue); var cityPercent = parseIntNan(cityValue*100/Tabs.Build.getAscensionRequirements('max',faction,(cityPrestigeLevel+1))); if (cityPercent < 100 && !CanUseCrystal) { actionLog(Cities.byID[cityId].name+': Not ready for ascension ('+cityPercent+'%)','ASCEND'); return; } if (ascended.isPrestigeCity && cityPrestigeLevel != 3 && cityPrestigeLevel != 6 && cityPrestigeLevel != 9) { // minor var allowed = CM.BlessingSystemModel.getBlessingGroup().minor.blessing[faction]; if (allowed.indexOf(blessingId) == -1) { // this blessing not allowed, choose the first allowed one... blessingId = allowed[0]; } if (blessings.indexOf(blessingId) != -1) { // this blessing already used, find the first blessing in the allowed list that isn't used! for (var b in allowed) { blessingId = allowed[b]; if (blessings.indexOf(blessingId) == -1) { break; } } } blessings.push(blessingId); } else { // major blessingId = CM.BlessingSystemModel.getBlessingGroup().major[cityPrestigeLevel+1][faction-1]; // force the applicable major blessing - 0 index array!! blessings.push(blessingId); } var params = uW.Object.clone(uW.g_ajaxparams); params.action = action; params.cid = cityId; params.prestigeLevel = cityPrestigeLevel+1; params.prestigeType = faction; params.blessings = blessings.toString(); params.paymentType = paymentType; if (paymentType=="crystals") { params.crystalId = crystalId; } params.cost = cost; new MyAjaxRequest(uW.g_ajaxpath + "ajax/createPrestigeCity.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { CM.BlessingSystemModel.updateTempFaction(cityId, faction); CM.BlessingSystemModel.levelUp(cityId, uWCloneInto(rslt.updateSeed)); actionLog(Cities.byID[cityId].name+': Successfully Ascended','ASCEND'); if (notify) { notify(cityId,faction); } // action on successful ascend... // need to reload to get everything in order (the above stuff doesn't work) ReloadKOC(); } else { if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Failed to ascend ('+rslt.msg+')','ASCEND'); } else { if (rslt.feedback) { actionLog(Cities.byID[cityId].name+': Failed to ascend ('+rslt.feedback+')','ASCEND'); } else { actionLog(Cities.byID[cityId].name+': Failed to ascend ('+rslt.error_code+')','ASCEND'); } } t.killCityActivity(cityId); // try and stop things that may be going on.. } }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Failed to ascend (Ajax Error)','ASCEND'); }, },true); // noretry }, checkAutoAscend : function () { var t = Tabs.Build; // loop through cities checking if any cities ready to ascend for (var i = 1; i <= Cities.numCities; i++) { var cityId = Cities.cities[i-1].id; if (Options.BuildOptions.AscendEnabled[i] && Options.BuildOptions.AscendRunning) { var ascended = getAscensionValues(cityId); var cityPrestigeType = ascended.prestigeType; var cityPrestigeLevel = ascended.prestigeLevel; var faction = parseIntNan(Options.BuildOptions.AscendFaction)||1; if (ascended.isPrestigeCity) { faction = cityPrestigeType; } var blessings = ascended.blessings; if (!blessings) { blessings = []; } var MaxLevel = CM.PrestigeModel.getLevelCapSoft(faction); if (ascended.isPrestigeCity) { faction = cityPrestigeType; } var cityValue = parseIntNan(Seed.cityData.city[cityId].cityValue); var cityPercent = parseIntNan(cityValue*100/Tabs.Build.getAscensionRequirements('max',faction,(cityPrestigeLevel+1))); var cityExpTime = Seed.cityData.city[cityId].prestigeInfo.prestigeBuffExpire; if (isNaN(cityExpTime)) { cityExpTime = 0; } else { cityExpTime = cityExpTime-unixTime(); } ascendok = false; canAscend = (cityPercent >= 100); if (!canAscend) { var Lessers = Seed.items.i33000||0; var Greaters = Seed.items.i33001||0; if (cityPrestigeLevel<3) { canAscend = (Options.BuildOptions.UseLesserCrystals && Lessers); } else { if (cityPrestigeLevel<6) { canAscend = (Options.BuildOptions.UseGreaterCrystals && Greaters); } } } if (!ascended.isPrestigeCity && canAscend) { ascendok = true; } if (ascended.isPrestigeCity && (cityPrestigeLevel < MaxLevel) && canAscend && (cityExpTime <= (Options.BuildOptions.AscendTime*60))) { ascendok = true; } if (ascendok) { // get next available minor blessing from preferred list - var blessingId = 0; for (var b in Options.BuildOptions.AscendBlessings[faction]) { blessingId = parseIntNan(Options.BuildOptions.AscendBlessings[faction][b]); if (blessingId!=0) { if (blessings.indexOf(blessingId) == -1) { break; } } } // do ascend! Options.BuildOptions.AscensionReady[i] = true; // suspend auto functions! saveOptions(); citydormant = true; if (!citydormant) { // try and stop all the stuff going on before the next pass.... t.killCityActivity(cityId); } if (citydormant) { t.Ascend(cityId,faction,blessingId,t.AscensionCallBack); } } else { if (Options.BuildOptions.AscensionReady[i]) { Options.BuildOptions.AscensionReady[i] = false; saveOptions(); } } } else { if (Options.BuildOptions.AscensionReady[i]) { Options.BuildOptions.AscensionReady[i] = false; saveOptions(); } } } }, killCityActivity : function (cityId) { var t = Tabs.Build; // kill training queue Tabs.Train.cancelAll(cityId, true); // kill fortification queue Tabs.Fort.cancelAll(cityId, true); // kill currently reviving var q1 = Seed.queue_revive["city"+cityId]; if (q1 != null && q1.length > 0) { Tabs.Revive.cancelRevive(cityId,1); } var q2 = Seed.queue_revive2["city"+cityId]; if (q2 != null && q2.length > 0) { Tabs.Revive.cancelRevive(cityId,2); } // kill raids and attempt to bring all other marches home var now = unixTime(); Options.RaidLastReset = now; saveOptions(); ToggleCityRaids (cityId,'stopAll'); var city_atkp = Seed.queue_atkp['city'+cityId] var count=0; for (var e in city_atkp){ destinationUnixTime = city_atkp[e]['destinationUnixTime']; MarchId = city_atkp[e]['marchId']; MarchStatus = city_atkp[e]['marchStatus']; MarchType = city_atkp[e]['marchType']; botMarchStatus = city_atkp[e]['botMarchStatus']; if (MarchType == 9 && botMarchStatus == 3 && MarchStatus == 10) { count++; setTimeout(RaidManager.DoAllDelete, (count*1250), MarchId,Cities.byID[cityId].idx,count); } if (MarchType != 9 && MarchId && (MarchStatus==1 || MarchStatus==2)) { Dashboard.Recall(MarchId,false); } } // kill currently building var qcon = Seed.queue_con["city" + cityId]; if (qcon.length > 0) { var bldSlotId = qcon[0][7]; var currLevel = parseIntNan(qcon[0][1])-1; t.removeConstruction(cityId, bldSlotId, currLevel); } // cancel market trades - TODO }, cancelConstruction : function (cityId,q) { var t = Tabs.Build; var qcon = Seed.queue_con["city" + cityId]; if (qcon.length > 0) { var bldSlotId = qcon[q][7]; var currLevel = parseIntNan(qcon[q][1])-1; t.removeConstruction(cityId, bldSlotId, currLevel); } }, removeConstruction : function (cityId, bldSlotId, currLevel) { var t = Tabs.Build; var params = uW.Object.clone(uW.g_ajaxparams); params.requestType = "CANCEL_CONSTRUCTION"; params.cityId = cityId; params.buildingPosition = bldSlotId; if (Seed.buildings["city" + cityId]["pos" + bldSlotId]) { params.buildingId = Seed.buildings["city" + cityId]["pos" + bldSlotId][3]; } else { params.buildingId = 0; } new MyAjaxRequest(uW.g_ajaxpath + "ajax/cancelConstruction.php" + uW.g_ajaxsuffix, { method : "post", parameters : params, onSuccess : function (rslt) { if (rslt.ok) { var tgtlv = parseInt(Seed.queue_con["city" + cityId][0][1]); var city_queue = Seed.queue_con["city" + cityId]; for (var x in city_queue) { if (parseInt(city_queue[x][2]) == parseInt(params.buildingId)) { city_queue.splice(x, 1) } } if (currLevel == 0) { delete Seed.buildings["city" + cityId]["pos" + bldSlotId]; for (var b = 0; b < Seed.queue_con["city" + cityId].length; b++) { if (parseInt(Seed.queue_con["city" + cityId][b][7]) == parseInt(bldSlotId)) { Seed.queue_con["city" + cityId].splice(b, 1); break; } } } bldLvl = Seed.buildings["city" + cityId]["pos" + bldSlotId][1]; bdgType = Seed.buildings["city" + cityId]["pos" + bldSlotId][0]; if (bldLvl > 0 && tgtlv != 0) { if (parseInt(bdgType) == 30) { var costs = CM.TowerModel.getCosts().slice(0); Seed.resources["city" + cityId].rec1[0] += parseInt(costs[1] / 2) * 3600; Seed.resources["city" + cityId].rec2[0] += parseInt(costs[2] / 2) * 3600; Seed.resources["city" + cityId].rec3[0] += parseInt(costs[3] / 2) * 3600; Seed.resources["city" + cityId].rec4[0] += parseInt(costs[4] / 2) * 3600; } else { if (parseInt(bdgType) == 31) { var costs = CM.RedoubtModel.getCosts().slice(0); Seed.resources["city" + cityId].rec1[0] += parseInt(costs[1] / 2) * 3600; Seed.resources["city" + cityId].rec2[0] += parseInt(costs[2] / 2) * 3600; Seed.resources["city" + cityId].rec3[0] += parseInt(costs[3] / 2) * 3600; Seed.resources["city" + cityId].rec4[0] += parseInt(costs[4] / 2) * 3600; } else { mult = Math.pow(2, (bldLvl - 1)); Seed.resources["city" + cityId].rec1[0] += parseInt(uW.buildingcost["bdg" + bdgType][1]) * mult * 3600; Seed.resources["city" + cityId].rec2[0] += parseInt(uW.buildingcost["bdg" + bdgType][2]) * mult * 3600; Seed.resources["city" + cityId].rec3[0] += parseInt(uW.buildingcost["bdg" + bdgType][3]) * mult * 3600; Seed.resources["city" + cityId].rec4[0] += parseInt(uW.buildingcost["bdg" + bdgType][4]) * mult * 3600; Seed.citystats["city" + cityId].gold[0] += parseInt(uW.buildingcost["bdg" + bdgType][5]) * mult; } } if (uW.currentcityid == cityId) uW.update_gold(); } if (uW.currentcityid == cityId) uW.update_bdg() } }, },true) }, AscensionCallBack : function(cityId,faction) { var t = Tabs.Build; var citynum = Cities.byID[cityId].idx+1; Options.BuildOptions.AscensionReady[citynum] = false; // allow stuff to happen again! saveOptions(); var ToLevel = parseIntNan(Options.BuildOptions.AscendPresetLevel); var PN = parseIntNan(Options.BuildOptions.AscendPresets[faction]); if (PN==0) return; if (!Options.BuildOptions.BuildPresets[PN]) return; var Preset = JSON2.parse(JSON2.stringify(Options.BuildOptions.BuildPresets[PN])); // clear existing building queue before applying new preset.. delete t.BuildQueue[t.QueueKey(cityId)]; for (var b in Preset) { var building = Preset[b]; if (building && building != 0) { var bid = parseInt(building.split("bdg")[1]); var CurrLevel=0; t.addToBuildQueue(cityId,b,bid,ToLevel,CurrLevel); } } t.SaveBuildQueue(); t.PaintOverview(); t.PaintCityInfo(); }, PaintAscendOptions : function () { var t = Tabs.Build; var Lessers = Seed.items.i33000||0; var Greaters = Seed.items.i33001||0; var m = ''; m += ''; m += ''; m += ''; m += ''; m += '
     '+tx("Automatically ascend when city value is 100% and remaining protection is less than")+'  '+tx("minutes")+' 
     '+tx("Automatically use Ascension Crystals when city value is not 100%")+' '+uW.itemlist['i33000'].name+' ('+Lessers+')
      '+uW.itemlist['i33001'].name+' ('+Greaters+')
     '+tx("Default faction for unascended cities")+': '+htmlSelector({1: uW.g_js_strings.commonstr.druid, 2: uW.g_js_strings.commonstr.fey, 3: uW.g_js_strings.commonstr.briton}, Options.BuildOptions.AscendFaction, 'id=btBldAscendFaction')+'
     '+tx('Re-queue buildings to level')+'  '+tx('using preferred building layout selected below')+':-
    '; for (var a=1;a<=3;a++) { m += '' } m += ''; for (var a=1;a<=3;a++) { m += ''; } m += ''; for (var a=1;a<=3;a++) { m += '' } m += ''; for (var a=1;a<=3;a++) { var blessings = CM.BlessingSystemModel.getBlessingGroup().minor.blessing[a]; var blesslist = {0:"-- "+tx('Select Blessing')+" --"}; for (var bb=0; bb'; } m += ''; } m += '
    '+tx('Preferred Building Layouts')+'
    '+getFactionName(a)+'
     
    '+tx('Preferred Minor Blessings')+'
    '+getFactionName(a)+'
    '; m += '

    '; ById('btBldAscend').innerHTML = m; ToggleOption('BuildOptions','pbascendlesser','UseLesserCrystals'); ToggleOption('BuildOptions','pbascendgreater','UseGreaterCrystals'); ById('pbResetAscend').addEventListener ('click', t.resetCityStates, false); ById('pbascendinterval').addEventListener('change', function (e) { Options.BuildOptions.AscendTime = parseIntNan(this.value); if (Options.BuildOptions.AscendTime==0) { Options.BuildOptions.AscendTime = 1; this.value = Options.BuildOptions.AscendTime; } saveOptions(); }, false); ById('btBldAscendFaction').addEventListener('change', function (e) { Options.BuildOptions.AscendFaction = parseIntNan(this.value); saveOptions(); }, false); ById('btBldAscendAllTo').addEventListener('change', function (e) { Options.BuildOptions.AscendPresetLevel = parseIntNan(this.value.substr(5)); saveOptions(); }, false); for (var a=1;a<=3;a++) { ById('btAscendPreset_'+a).addEventListener('change', function (e) { Options.BuildOptions.AscendPresets[e.target['className']] = this.value; saveOptions(); }, false); var MaxLevel = CM.PrestigeModel.getLevelCapSoft(a); var Maj = Math.ceil(MaxLevel/3); var Min = MaxLevel-Maj; for (var b=1;b<=Min;b++) { ById('btAscendBlessing_'+a+'_'+b).addEventListener('change', function (e) { var elems = e.target['className'].split('_'); Options.BuildOptions.AscendBlessings[elems[0]][elems[1]] = this.value; saveOptions(); }, false); } } }, resetCityStates : function () { var t = Tabs.Build; for (var i = 1; i <= Cities.numCities; i++) { Options.BuildOptions.AscensionReady[i] = false; } saveOptions(); }, LoadAscensionPresets : function (sel,faction) { var t = Tabs.Build; ById(sel).options.length = 0; var o = document.createElement("option"); o.text = "-- "+tx('Select Layout')+" --" o.value = 0; ById(sel).options.add(o); for (var y in Options.BuildOptions.BuildPresetNames) { if (Options.BuildOptions.BuildPresetTypes[y]==faction) { var o = document.createElement("option"); o.text = Options.BuildOptions.BuildPresetNames[y]; o.value = y; ById(sel).options.add(o); } } if (Options.BuildOptions.AscendPresets[faction] != 0) { ById(sel).value = Options.BuildOptions.AscendPresets[faction]; } }, } /** Revive Tab **/ Tabs.Revive = { tabLabel: 'Revive', tabOrder: 2070, tabColor : 'brown', myDiv: null, timer: null, LoopCounter: 0, intervalSecs : 5, autodelay : 0, citydelay: {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}, loopaction : false, revivespeed : 0, revivecost : 0, totgold : 0, ModelCity: null, ModelCityId: 0, unitsarr : [], troopTotal: {}, LastWounded : 'x', noApothecary : [], Squire:0, Knight:0, Guinevere:0, Morgana:0, Arthur:0, Merlin:0, Divine:0, Epic:0, Legendary:0, Spectral:0, Demonic:0, Cupids:0, Serpent:0, Darkmoon:0, ItemList : [1, 2, 3, 4, 5, 6, 7, 8, 10], ItemTrans : ["SH","KH","GH","MH","AH","RH","DH","EH","LH"], ExtraItemList : [80, 81, 82, 83, 84], ExtraItemTrans : ["PH","NH","CU","SP","DM"], ExtraHGLimit : [2160000,4320000,12096000,13824000,25920000], CannotReviveUnit : [27], Options: { Running: false, ThroneCheck: false, ReviveSpeed: 0, MinGold : 5000, Enabled : {1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true}, HealArray : {1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[]}, BatchMin : 0, SelectBatchMax : true, BatchMax : 10000, UseLH : false, UseEH : false, UseDH : false, UseRH : false, UseAH : false, UseMH : false, UseGH : false, UseKH : false, UseSH : false, UsePH : false, UseNH : false, UseCU : false, UseOverride : false, OverrideItem : 0, OverrideHours : 0, OverrideMinutes : 1, Toggle : false, }, init: function (div) { var t = Tabs.Revive; t.myDiv = div; for (var ui in CM.UNIT_TYPES){ i = CM.UNIT_TYPES[ui]; if (t.CannotReviveUnit.indexOf(parseInt(i)) == -1) { t.unitsarr.push(i); } } if (!Options.ReviveOptions) { Options.ReviveOptions = t.Options; } else { for (var y in t.Options) { if (!Options.ReviveOptions.hasOwnProperty(y)) { Options.ReviveOptions[y] = t.Options[y]; } } } uWExportFunction('speedupRevive', Tabs.Revive.speedupRevive); uWExportFunction('cancelRevive', Tabs.Revive.cancelRevive); uWExportFunction('btRevQueueDeleteAll', Tabs.Revive.deleteRevQueueAll); uWExportFunction('btRevQueueDelete', Tabs.Revive.deleteRevQueue); uWExportFunction('btRevQueueUp', Tabs.Revive.RevQueueUp); uWExportFunction('btRevQueueDn', Tabs.Revive.RevQueueDn); var ReviveHourGlassName = {}; for (var h=0;h0)?false: true; if(t.noApothecary[x]) { t.noApothecary[x] = (getCityBuilding(cid, 23).count>0)?false: true; } } if (Options.ReviveOptions.Toggle) AddSubTabLink('AutoRevive',t.toggleAutoReviveState, 'ReviveToggleTab'); SetToggleButtonState('Revive',Options.ReviveOptions.Running,'Revive'); var m = '
    '+tx('AUTOMATED WOUNDED TROOP REVIVE')+'
    '; m += '
    '; m += '
     '+tx("Add toggle button to main screen header")+''+tx('Current Revive Speed')+':   
    '; m += ''; m += ''; m += ''; m += '
    '+tx('Only revive when revive speed is at least')+'  %'+tx('Current Revive Cost')+':   
     '+tx('Minimum Gold')+':   
    '; m += '
    '; m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; } m += '
      '+Cities.cities[i-1].name.substring(0, 12)+' 
    '+tx('Active')+' 
    '+tx('Facilities')+' 
     
    '+tx('Arcana Bonus')+' 
     
    '+tx('Queue 1')+' 
     
    '+tx('Queue 2')+' 
     
     
     
    '; m += '
    '+tx('USE AUTO-SPEEDUPS')+'
    '; m += ''; Boosts += ''; m += Boosts+'
    '; var ExtraHourGlassHint = ['Usage Condition: 25d+', 'Usage Condition: 50d+', 'Usage Condition: 140d+', 'Usage Condition: 160d+', 'Usage Condition: 300d+']; var Boosts = ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += ''; Boosts += ''; for (var i = 0; i < t.ItemList.length; i++) { Boosts += ''; } Boosts += ''; for (var i = 0; i < t.ExtraItemList.length; i++) { Boosts += ''; } Boosts += ''; for (var i = 0; i < t.ExtraItemList.length; i++) { Boosts += ''; } Boosts += '
    (' + parseIntNan(uW.ksoItems[t.ItemList[i]].count) + ')
    (' + parseIntNan(uW.ksoItems[t.ExtraItemList[i]].count) + ')
    '+tx('Override above by always using')+' '+htmlSelector(ReviveHourGlassName,Options.ReviveOptions.OverrideItem, 'id=pbreviveOVItem') + ' '+tx('when more than')+' '; Boosts += ' '+uW.g_js_strings.timestr.timehr+'  '+uW.g_js_strings.timestr.timemin+' '+tx('remaining')+'.
    '; m += '
     '+tx('REVIVE TROOPS')+'
    '; m += '
    '; m += '
    '; m += '
    '; m += ''; m += ''; m += ''; m += ''; m += '
    '+uW.g_js_strings.commonstr.city+': 
    '+tx(uW.g_js_strings.openCastle.trooptype)+': '; m += ' '+strButton8(tx('Add ALL Wounded'),'id=btRevAddAllWounded')+'
    '+tx('Total Wounded')+':  
     '+tx('Total Cost')+':  
     '+tx('Batch Size')+':-  
     '+tx('Min')+':  '+tx("Max")+': 
      
    '; m += '
    '; m += ''; m += '
    '+tx('REVIVE QUEUE')+'
     
    '; m += '
     
    '; m += '
     '+tx('WOUNDED TROOPS')+'
    '; m += '
    '; m += '
     

    '; div.innerHTML = m; ById('btReviveQueueLink').addEventListener ('click', function () {ToggleMainDivDisplay("Revive",100,GlobalOptions.btWinSize.x,"btReviveQueue",false)}, false); ById('btReviveWoundedLink').addEventListener ('click', function () {ToggleMainDivDisplay("Revive",100,GlobalOptions.btWinSize.x,"btReviveWounded",false)}, false); t.ModelCity = new CdispCityPicker('pbrevive', ById('pbrevivecity'), true, t.clickCitySelect, null); t.PaintWounded(); for (var i = 1; i <= Cities.numCities; i++) { ById('btReviveAutoCity_'+i).addEventListener('click', function(e){ var citynum = e.target['className']; Options.ReviveOptions.Enabled[citynum] = e.target.checked; if (Options.ReviveOptions.Enabled[citynum]) { t.citydelay[i] = 0; t.timer = setTimeout(function () { t.doAutoLoop(Number(citynum));}, 0); } saveOptions(); }, false); } ToggleOption('ReviveOptions','btReviveToggle','Toggle'); ToggleOption('ReviveOptions','pbreviveSH','UseSH'); ToggleOption('ReviveOptions','pbreviveKH','UseKH'); ToggleOption('ReviveOptions','pbreviveGH','UseGH'); ToggleOption('ReviveOptions','pbreviveMH','UseMH'); ToggleOption('ReviveOptions','pbreviveAH','UseAH'); ToggleOption('ReviveOptions','pbreviveRH','UseRH'); ToggleOption('ReviveOptions','pbreviveDH','UseDH'); ToggleOption('ReviveOptions','pbreviveEH','UseEH'); ToggleOption('ReviveOptions','pbreviveLH','UseLH'); ToggleOption('ReviveOptions','pbrevivePH','UsePH'); ToggleOption('ReviveOptions','pbreviveNH','UseNH'); ToggleOption('ReviveOptions','pbreviveCU','UseCU'); ToggleOption('ReviveOptions','pbreviveSP','UseSP'); ToggleOption('ReviveOptions','pbreviveDM','UseDM'); ToggleOption('ReviveOptions','pbreviveOV','UseOverride'); ChangeIntegerOption('ReviveOptions','pbreviveOVItem','OverrideItem'); ChangeIntegerOption('ReviveOptions','pbreviveOVHours','OverrideHours'); ChangeIntegerOption('ReviveOptions','pbreviveOVMinutes','OverrideMinutes'); ById('pbReviveHelp').addEventListener ('click', t.helpPop, false); ById('btAutoReviveState').addEventListener('click', function(){ t.toggleAutoReviveState(this); }, false); ToggleOption('ReviveOptions','btReviveTR','ThroneCheck'); ChangeIntegerOption('ReviveOptions','btReviveTRSpeed','ReviveSpeed'); ChangeIntegerOption('ReviveOptions','btReviveMinGold','MinGold'); ById('btRevType').addEventListener('change', t.PaintCityInfo, false); ById('btRevAddAllWounded').addEventListener('click', t.AddAllWounded, false); ById('btRevBatchMax').disabled=(!Options.ReviveOptions.SelectBatchMax); ChangeIntegerOption('ReviveOptions','btRevBatchMin','BatchMin',0,Tabs.Revive.PaintCityInfo); ChangeIntegerOption('ReviveOptions','btRevBatchMax','BatchMax',0,Tabs.Revive.PaintCityInfo); ById('btRevSelBatchMax').addEventListener('change', function(e){ Options.ReviveOptions.SelectBatchMax = e.target.checked; ById('btRevBatchMax').disabled = (!e.target.checked); if (!e.target.checked) { Options.ReviveOptions.BatchMax = ""; ById('btRevBatchMax').value = Options.ReviveOptions.BatchMax; } saveOptions(); t.PaintCityInfo(); }, false); ById("btRevNowButton").addEventListener('click', function(){ t.Revive_Now(t.ModelCity.city.idx,ById('btRevType').value,parseIntNan(Options.ReviveOptions.BatchMin),parseIntNan(Options.ReviveOptions.BatchMax),Options.ReviveOptions.SelectBatchMax); },false); ById("btRevButton").addEventListener('click', function(){ t.Add_Revive(t.ModelCity.city.idx,ById('btRevType').value,parseIntNan(Options.ReviveOptions.BatchMin),parseIntNan(Options.ReviveOptions.BatchMax),Options.ReviveOptions.SelectBatchMax); },false); // start autorevive loop timer to start in 25 seconds... if (Options.ReviveOptions.Running) { t.timer = setTimeout(function () { t.doAutoLoop(1,false);}, (25 * 1000)); } }, toggleAutoReviveState: function(obj){ var t = Tabs.Revive; obj = ById('btAutoReviveState'); if (Options.ReviveOptions.Running == true) { Options.ReviveOptions.Running = false; obj.value = tx("AutoRevive = OFF"); } else { Options.ReviveOptions.Running = true; obj.value = tx("AutoRevive = ON"); t.citydelay = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0}; t.timer = setTimeout(function () { t.doAutoLoop(1,false);}, 0); } saveOptions(); SetToggleButtonState('Revive',Options.ReviveOptions.Running,'Revive'); t.PaintOverview(); }, show: function (init) { var t = Tabs.Revive; var DispCityId = uW.currentcityid; if (init) { DispCityId = InitialCityId; } if (t.ModelCityId!=DispCityId) { t.ModelCity.selectBut(Cities.byID[DispCityId].idx); } t.PaintOverview(); t.PaintCityInfo(); }, helpPop : function (){ var t = Tabs.Revive; var helpText = '
    '+tx("Using Speedups for Revive"); helpText += '

    '+tx('Speedups will be used in the following order if they are selected, and the required criteria is met')+' :-

    '; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += ''; helpText += '
    '+uW.g_js_strings.commonstr.item+''+uW.g_js_strings.commonstr.time+''+tx('Criteria')+'
    '+uW.itemlist.i84.name+'360 days'+tx('More than 300 days remaining')+'
    '+uW.itemlist.i83.name+'180 days'+tx('More than 160 days remaining')+'
    '+uW.itemlist.i82.name+'150 days'+tx('More than 140 days remaining')+'
    '+uW.itemlist.i81.name+'60 days'+tx('More than 50 days remaining')+'
    '+uW.itemlist.i80.name+'30 days'+tx('More than 25 days remaining')+'
    '+uW.itemlist.i10.name+'4 days'+tx('More than 3 days and 12 hours remaining')+'
    '+uW.itemlist.i8.name+'2.5 days'+tx('More than 48 hours remaining')+'
    '+uW.itemlist.i7.name+'24 hrs'+tx('More than 23 hours 30 minutes remaining')+'
    '+uW.itemlist.i6.name+'15 hrs'+tx('More than 14 hours 30 minutes remaining')+'
    '+uW.itemlist.i5.name+'8 hrs'+tx('More than 7 hours 30 minutes remaining')+'
    '+uW.itemlist.i4.name+'2.5 hrs'+tx('More than 2 hours remaining')+'
    '+uW.itemlist.i3.name+'1 hr'+tx('More than 45 minutes remaining')+'
    '+uW.itemlist.i2.name+'15 mins'+tx('More than 5 minutes remaining')+'
    '+uW.itemlist.i1.name+'1 min'+tx('More than 30 seconds remaining')+'
    '; helpText += '

    '+tx('If the override box is ticked, then the override rule specified will take priority')+'.


    '; var pop = new CPopup ('BotHelp', 0, 0, 500, 420, true); pop.centerMe (mainPop.getMainDiv()); pop.getMainDiv().innerHTML = helpText; pop.getTopDiv().innerHTML = '
    '+tx("PowerBot+ Lite Help")+': '+tx("Speedups")+'
    '; pop.show (true); }, EverySecond : function () { var t = Tabs.Revive; t.LoopCounter = t.LoopCounter + 1; if (t.LoopCounter%2==0) { // refresh revive speed and overview display every 2 seconds //t.revivespeed = Math.floor(equippedthronestats(97)); //t.revivecost = Math.floor(equippedthronestats(98)); t.revivespeed = Math.floor(equippedthronestats(97)+equippedthronestats(164)); var getthePercVal = uW.cm.ThroneController.getBoundedEffect(164); getthePercVal = -(getthePercVal); t.revivecost = Math.floor(equippedthronestats(98) + getthePercVal); var hardCapCst = -50; if (uW.cm.thronestats.boosts.ReviveCost) { hardCapCst = uW.cm.thronestats.boosts.ReviveCost.Min; } // t.revivecost = Math.max(hardCapCst,t.revivecost); if (tabManager.currentTab.name == 'Revive' && Options.btWinIsOpen){ t.PaintOverview(); } } }, clickCitySelect: function (city) { var t = Tabs.Revive; t.ModelCityId = city.id; t.PaintCityInfo(); }, PaintOverview : function () { var t = Tabs.Revive; t.Squire = parseIntNan(Seed.items.i1); t.Knight = parseIntNan(Seed.items.i2); t.Guinevere = parseIntNan(Seed.items.i3); t.Morgana = parseIntNan(Seed.items.i4); t.Arthur = parseIntNan(Seed.items.i5); t.Merlin = parseIntNan(Seed.items.i6); t.Divine = parseIntNan(Seed.items.i7); t.Epic = parseIntNan(Seed.items.i8); t.Legendary = parseIntNan(Seed.items.i10); t.Spectral = parseIntNan(Seed.items.i80); t.Demonic = parseIntNan(Seed.items.i81); t.Cupids = parseIntNan(Seed.items.i82); t.Serpent = parseIntNan(Seed.items.i83); t.Darkmoon = parseIntNan(Seed.items.i84); ById('pbreviveUseSHLabel').innerHTML = t.Squire; ById('pbreviveUseKHLabel').innerHTML = t.Knight; ById('pbreviveUseGHLabel').innerHTML = t.Guinevere; ById('pbreviveUseMHLabel').innerHTML = t.Morgana; ById('pbreviveUseAHLabel').innerHTML = t.Arthur; ById('pbreviveUseRHLabel').innerHTML = t.Merlin; ById('pbreviveUseDHLabel').innerHTML = t.Divine; ById('pbreviveUseEHLabel').innerHTML = t.Epic; ById('pbreviveUseLHLabel').innerHTML = t.Legendary; ById('pbreviveUsePHLabel').innerHTML = t.Spectral; ById('pbreviveUseNHLabel').innerHTML = t.Demonic; ById('pbreviveUseCULabel').innerHTML = t.Cupids; ById('pbreviveUseSPLabel').innerHTML = t.Serpent; ById('pbreviveUseDMLabel').innerHTML = t.Darkmoon; t.PaintWounded(); t.totgold=0; var now = unixTime(); var q; for (var i = 0; i < Cities.numCities; i++) { citynum = i+1; cityId = Cities.cities[i].id; var citygold = parseIntNan(Seed.citystats["city" + cityId]['gold'][0]); t.totgold = t.totgold+citygold; var span = ''; if (citygold < Options.ReviveOptions.MinGold) { span = ''; } ById("btReviveGoldCity_"+citynum).innerHTML = span+addCommas(citygold)+''; var blvl = []; for (bpos in Seed.buildings["city"+cityId]) { var btype = parseInt(Seed.buildings["city"+cityId][bpos][0]); if (btype == 21 || btype == 23) { var bname = uW.buildingcost['bdg' + Seed.buildings["city"+cityId][bpos][0]][0]; blvl.push('Lv.' + Seed.buildings["city"+cityId][bpos][1]); } } var str = ''; if (blvl.join(', ')=='') { str = ''+tx('No')+'
    '+uW.buildingcost.bdg21[0]+'
    '; } else { str = bname + '
    (' + blvl.join(', ') + ')'; } if (Seed.cityData.city[cityId].isPrestigeCity) { if (Seed.cityData.city[cityId].prestigeInfo.blessings.indexOf(106) != -1) { str += '
    '+uW.g_js_strings.blessingSystem.blessing_name_106; } } ById('btReviveApothecaryCity_'+citynum).innerHTML = str; var str = ''; if (ArcanaEnabled()) { str = Dashboard.GetArcanaEffect(42002,(citynum-1))+'%'; } ById('btReviveArcanaCity_'+citynum).innerHTML = str; // paint currently reviving var q1 = Seed.queue_revive["city"+cityId]; var u = ''; if (q1 != null && q1.length > 0) { u = q1[0]; str = ''; var Speedups = ''; Speedups += t.dspHG(cityId,u[0],1,1,t.Squire); Speedups += t.dspHG(cityId,u[0],1,2,t.Knight); Speedups += t.dspHG(cityId,u[0],1,3,t.Guinevere); Speedups += t.dspHG(cityId,u[0],1,4,t.Morgana); Speedups += t.dspHG(cityId,u[0],1,5,t.Arthur); Speedups += ''; Speedups += t.dspHG(cityId,u[0],1,6,t.Merlin); Speedups += t.dspHG(cityId,u[0],1,7,t.Divine); Speedups += t.dspHG(cityId,u[0],1,8,t.Epic); Speedups += t.dspHG(cityId,u[0],1,10,t.Legendary); Speedups += ''; Speedups += t.dspHG(cityId,u[0],1,80,t.Spectral); Speedups += t.dspHG(cityId,u[0],1,81,t.Demonic); Speedups += t.dspHG(cityId,u[0],1,82,t.Cupids); Speedups += t.dspHG(cityId,u[0],1,83,t.Serpent); Speedups += t.dspHG(cityId,u[0],1,84,t.Darkmoon); if (Speedups != "") Speedups = ''; str = str+Speedups+'
    '+addCommas(u[1])+' '+uW.unitcost["unt"+u[0]][0]+'
    '; if (parseInt(u[3]) > now) { str += '('+timestr(parseInt(u[3])-now)+')
    ' + Speedups + '
    '+tx("Cancel")+'
    '; } else { str += '(done)'; if (cityId != uW.currentcityid) { Seed.units["city"+cityId]["unt"+u[0]] = parseInt(Seed.units["city"+cityId]["unt"+u[0]]) + parseInt(u[1]); Seed.queue_revive["city"+cityId].splice(0,1); } } str += '
    '; } else { if (t.citydelay[citynum] > 0) { str = ''+tx('Busy')+'!'; } else { if (Options.BuildOptions && Options.BuildOptions.AscensionReady[citynum]) { str = ''+tx('Ascension')+'!'; } else { str = ''; } } } ById('btReviveActivityCity1_'+citynum).innerHTML = str; // revive queue 2 var q2 = Seed.queue_revive2["city"+cityId]; var u = ''; if (q2 != null && q2.length > 0) { u = q2[0]; str = ''; var Speedups = ''; Speedups += t.dspHG(cityId,u[0],2,1,t.Squire); Speedups += t.dspHG(cityId,u[0],2,2,t.Knight); Speedups += t.dspHG(cityId,u[0],2,3,t.Guinevere); Speedups += t.dspHG(cityId,u[0],2,4,t.Morgana); Speedups += t.dspHG(cityId,u[0],2,5,t.Arthur); Speedups += ''; Speedups += t.dspHG(cityId,u[0],2,6,t.Merlin); Speedups += t.dspHG(cityId,u[0],2,7,t.Divine); Speedups += t.dspHG(cityId,u[0],2,8,t.Epic); Speedups += t.dspHG(cityId,u[0],2,10,t.Legendary); Speedups += ''; Speedups += t.dspHG(cityId,u[0],2,80,t.Spectral); Speedups += t.dspHG(cityId,u[0],2,81,t.Demonic); Speedups += t.dspHG(cityId,u[0],2,82,t.Cupids); Speedups += t.dspHG(cityId,u[0],2,83,t.Serpent); Speedups += t.dspHG(cityId,u[0],2,84,t.Darkmoon); if (Speedups != "") Speedups = ''; str = str+Speedups+'
    '+addCommas(u[1])+' '+uW.unitcost["unt"+u[0]][0]+'
    '; if (parseInt(u[3]) > now) { str += '(' + timestr(parseInt(u[3]) - now) + ')
    ' + Speedups + '
    '+tx("Cancel")+'
    '; } else { str += '(done)'; if (cityId != uW.currentcityid) { Seed.units["city"+cityId]["unt"+u[0]] = parseInt(Seed.units["city"+cityId]["unt"+u[0]]) + parseInt(u[1]); Seed.queue_revive2["city"+cityId].splice(0,1); } } str += '
    '; } else { if (t.citydelay[citynum] > 0) { str = ''+tx('Busy')+'!'; } else { if (Options.BuildOptions && Options.BuildOptions.AscensionReady[citynum]) { str = ''+tx('Ascension')+'!'; } else { str = ''; } } } ById('btReviveActivityCity2_'+citynum).innerHTML = str; } ById('btTotGold').innerHTML = addCommas(t.totgold); if (Options.ReviveOptions.ThroneCheck && (t.revivespeed < Number(Options.ReviveOptions.ReviveSpeed))) { ts = ''+t.revivespeed+'%'; } else { ts = t.revivespeed+'%'; } ById("btReviveCurrTR").innerHTML = ts; ById("btReviveCostTR").innerHTML = t.revivecost+'%'; }, dspHG : function (cityId, qitem, i, item, count) { var t = Tabs.Revive; var n = ''; if (count>0) { n += ''; } return n; }, PaintCityInfo : function () { var t = Tabs.Revive; var cityId = t.ModelCityId; if (cityId) { var citynum = Cities.byID[cityId].idx+1; var unitId = ById('btRevType').value; ById('btRevType').options.length = 0; var o = document.createElement("option"); o.text = "-- "+uW.g_js_strings.commonstr.select+" --" o.value = 0; ById("btRevType").options.add(o); for (var ui in CM.UNIT_TYPES) { var u = CM.UNIT_TYPES[ui]; if (t.CannotReviveUnit.indexOf(parseInt(u)) == -1 && parseIntNan(Seed.woundedUnits['city'+cityId]['unt'+u])>0) { var o = document.createElement("option"); o.text = uW.unitcost["unt"+u][0]; o.value = u; if (unitId==u) o.selected = true; ById("btRevType").options.add(o); } } ById('btRevWounded').innerHTML = ' '; ById('btRevCost').innerHTML = ' '; if (unitId!=0) { var unitWounded = parseIntNan(Seed.woundedUnits['city'+cityId]['unt'+unitId]); ById('btRevWounded').innerHTML = addCommas(unitWounded); ById('btRevCost').innerHTML = addCommas(t.getRevivalCost(unitId,unitWounded)); if (Seed.woundedUnits['city'+cityId]['unt'+unitId] > parseIntNan(Options.ReviveOptions.BatchMax) && Options.ReviveOptions.SelectBatchMax){ var amt = parseIntNan(Options.ReviveOptions.BatchMax); } else { var amt = parseIntNan(Seed.woundedUnits['city'+cityId]['unt'+unitId]); } if (amt0) { ById('btRevEstTime').innerHTML = tx('Estimated Time')+': '+timestr(t.getReviveTime(cityId,unitId, amt)); } else { ById('btRevEstTime').innerHTML = ' '; } } var m = '
    '; m += ''; var rownum = 0; var gotqueue = false; for (var i=0; i'; var dispmax = ""; if (info.max_sel) dispmax = addCommas(info.max); m += ''; } if (!gotqueue) { m += ''; } m += '
     '+tx(uW.g_js_strings.openCastle.trooptype)+''+tx('Min')+''+tx('Max')+''+strButton14(tx('Clear'),'id=btClearLog onclick="btRevQueueDeleteAll(this,'+citynum+')"')+'

    '+uW.unitcost['unt'+info.troop][0]+''+addCommas(info.min)+''+dispmax+''+strButton8(uW.g_js_strings.commonstr.deletetx,'onclick="btRevQueueDelete(this,'+i+','+citynum+')"')+'

    '+tx('No wounded troops in revive queue')+'
    '; ById('btReviveCityQueue').innerHTML = m; } }, deleteRevQueueAll : function(obj,citynum) { var t = Tabs.Revive; Options.ReviveOptions.HealArray[citynum] = []; saveOptions(); ById('btRevMessages').innerHTML = tx("City Queue deleted!"); t.PaintCityInfo(); }, deleteRevQueue : function(obj,index,citynum) { var t = Tabs.Revive; Options.ReviveOptions.HealArray[citynum].splice(index,1); saveOptions(); ById('btRevMessages').innerHTML = tx("Queue entry deleted!"); t.PaintCityInfo(); }, RevQueueUp : function(obj,index,citynum) { var t = Tabs.Revive; if (index>0) { Options.ReviveOptions.HealArray[citynum].splice(index-1, 0, Options.ReviveOptions.HealArray[citynum].splice(index, 1)[0]); } saveOptions(); t.PaintCityInfo(); }, RevQueueDn : function(obj,index,citynum) { var t = Tabs.Revive; if (index= 5 ? p : 5; if (q > 1) { p = p / 1.2 } p = p - (p * (bonus / 100)) p = Math.ceil(p - (p * CM.BlessingSystemModel.applyBlessing(CM.BlessingSystemModel.getBlessing().PICK_ME_UP, cid))); return p; }, PaintWounded : function () { var t = Tabs.Revive; var rownum = 0; var irows = []; var rows = []; var acts = []; irows[0] = []; // wounded might function _row(name, row, noTotal, icon, act) { var t = Tabs.Revive; var tot = 0; if (!noTotal) { for (var i = 0; i < row.length; i++) tot += parseIntNan(row[i]); if (tot==0) { return ''; } } if (rownum++ % 2) style = ' class="evenRow"'; else style = ' class="oddRow"'; var m = []; m.push(''); if (icon) { m.push(icon); } else { m.push(''+name+' '); } m.push(''); if (!noTotal) { m.push('
    '); t.troopTotal[name] = tot; m.push(addCommas(tot)); m.push('
    '); } for (var i = 0; i < row.length; i++) { m.push('
    '); if (act) { m.push(''); } else { m.push(''); } m.push(addCommas(row[i])); m.push('
    '); } m.push(''); return m.join(''); } var m = ''; for (var i = 1; i <= Cities.numCities; i++) { m += ''; irows[0][i-1] = 0; } m += ""; // spacer for (var r = 1; r < t.unitsarr.length + 1; r++) { rows[r] = []; acts[r] = []; for (var i = 0; i < Cities.numCities; i++) { cityId = Cities.cities[i].id; rows[r][i] = 0; if (Seed.woundedUnits['city'+cityId] && Seed.woundedUnits['city'+cityId]['unt'+t.unitsarr[r-1]]) { rows[r][i] = parseIntNan(Seed.woundedUnits['city'+cityId]['unt'+t.unitsarr[r-1]]); } acts[r][i] = ""; var q1 = Seed.queue_revive["city"+cityId]; var u1 = 0; if (q1 != null && q1.length > 0) { u1 = q1[0][0]; } var q2 = Seed.queue_revive2["city"+cityId]; var u2 = 0; if (q2 != null && q2.length > 0) { u2 = q2[0][0]; } if (t.unitsarr[r-1]==u1||t.unitsarr[r-1]==u2) { acts[r][i] = "boldGreen"; } irows[0][i] += parseIntNan(rows[r][i]) * uW.unitmight['unt'+t.unitsarr[r-1]]; } } rownum = 0; for (var j = 1; j < t.unitsarr.length+1; j++) { m += _row(uW.unitcost['unt'+t.unitsarr[j-1]][0], rows[j], false, TroopImage(t.unitsarr[j-1]),acts[j]); } m += ''; m += _row('', irows[0], false); m += '
      '+Cities.cities[i-1].name.substring(0, 12)+' 
    '+tx('Wounded Might')+' 
    '; if (t.LastWounded!=m) { ById('btReviveWoundedDiv').innerHTML = m; ResetFrameSize('btMain',100,GlobalOptions.btWinSize.x); t.LastWounded = m; } }, doAutoLoop : function (idx,addqueue) { var t = Tabs.Revive; clearTimeout(t.timer); if (!Options.ReviveOptions.Running) return; var cityId = Cities.cities[idx-1].id; if (idx==1) { t.loopaction = false; } // reset loop action indicator for first city t.autodelay = 0; // no delay if no action taken! if (Options.ReviveOptions.HealArray[idx] && !t.noApothecary[idx] && Options.ReviveOptions.Enabled[idx]) { if (t.citydelay[idx] > 0) { t.citydelay[idx]--; } // city being delayed due to error, reduce delay number and skip city else { // first check if city is idle (or busy) var now = unixTime(); if (addqueue) { var qrev = Seed.queue_revive2["city" + cityId]; var slot=2;} else { var qrev = Seed.queue_revive["city" + cityId]; var slot=1; } if (qrev.length > 0 && parseInt(qrev[0][3]) > now) { // queue busy, try speedup! t.autoSpeedup (cityId,qrev[0],slot); } else { if (qrev.length > 0 && parseInt(qrev[0][3]) < now) { if (GlobalOptions.ExtendedDebugMode) { logit(Cities.byID[cityId].name+': Fixing seed.revive array','REVIVE'); } qrev.pop(); // remove expired revive from queue } var ascensionok = (!Options.BuildOptions || !Options.BuildOptions.AscensionReady[idx]); if (ascensionok && (!Options.ReviveOptions.ThroneCheck || (t.revivespeed >= Options.ReviveOptions.ReviveSpeed))) { // if no revive speed restriction or enough revive speed var AvailGold = parseIntNan(Seed.citystats["city" + cityId].gold[0]) - parseIntNan(Options.ReviveOptions.MinGold); if (AvailGold > 0) { for (var i=0; i info.max && info.max_sel){ amt = info.max; } else { amt = Seed.woundedUnits['city'+cityId]['unt'+info.troop]; } var unitGold = t.getRevivalCost(info.troop,1); var costGold = unitGold*amt; if (costGold>AvailGold) { amt = Math.floor(AvailGold/unitGold); if (amt < info.min || amt==0) continue; } // revive this! if (info.troop > 0 && amt > 0){ t.autodelay = t.intervalSecs; t.loopaction = true; t.Revive(cityId,info.troop,amt); break; } } } } } if (!addqueue) { var twoqueues = false; if (Seed.cityData.city[cityId].isPrestigeCity) { twoqueues = (Seed.cityData.city[cityId].prestigeInfo.blessings.indexOf(106) != -1); } if (twoqueues) { // check additional queue t.timer = setTimeout(function () { t.doAutoLoop(idx,true); }, (t.autodelay * 1000)); return; } } } } if (idx == Cities.numCities) { if (!t.loopaction) { t.autodelay = t.intervalSecs; } // if no action this loop, apply delay anyway... t.timer = setTimeout(function () { t.doAutoLoop(1,false); }, (t.autodelay * 1000)); } else { t.timer = setTimeout(function () { t.doAutoLoop(idx+1,false); }, (t.autodelay * 1000)); } }, autoSpeedup: function (cityId,q,slot) { var t = Tabs.Revive; var now = unixTime(); var item = 0; totTime = q[3] - now; if (totTime > 0) { if (Options.ReviveOptions.UseOverride && Options.ReviveOptions.OverrideItem != 0) { var THRESHOLD_SECONDS = (parseIntNan(Options.ReviveOptions.OverrideMinutes)*60)+(parseIntNan(Options.ReviveOptions.OverrideHours)*60*60); if (totTime >= THRESHOLD_SECONDS && uW.ksoItems[Options.ReviveOptions.OverrideItem].count > 0) { item = Options.ReviveOptions.OverrideItem; } } if (item==0 && totTime >= t.ExtraHGLimit[4] && Options.ReviveOptions.UseDM && uW.ksoItems[84].count > 0) { item = 84; } if (item==0 && totTime >= t.ExtraHGLimit[3] && Options.ReviveOptions.UseSP && uW.ksoItems[83].count > 0) { item = 83; } if (item==0 && totTime >= t.ExtraHGLimit[2] && Options.ReviveOptions.UseCU && uW.ksoItems[82].count > 0) { item = 82; } if (item==0 && totTime >= t.ExtraHGLimit[1] && Options.ReviveOptions.UseNH && uW.ksoItems[81].count > 0) { item = 81; } if (item==0 && totTime >= t.ExtraHGLimit[0] && Options.ReviveOptions.UsePH && uW.ksoItems[80].count > 0) { item = 80; } if (item==0 && totTime >= HGLimit[8] && Options.ReviveOptions.UseLH && uW.ksoItems[10].count > 0) { item = 10; } if (item==0 && totTime >= HGLimit[7] && Options.ReviveOptions.UseEH && uW.ksoItems[8].count > 0) { item = 8; } if (item==0 && totTime >= HGLimit[6] && Options.ReviveOptions.UseDH && uW.ksoItems[7].count > 0) { item = 7; } if (item==0 && totTime >= HGLimit[5] && Options.ReviveOptions.UseRH && uW.ksoItems[6].count > 0) { item = 6; } if (item==0 && totTime >= HGLimit[4] && Options.ReviveOptions.UseAH && uW.ksoItems[5].count > 0) { item = 5; } if (item==0 && totTime >= HGLimit[3] && Options.ReviveOptions.UseMH && uW.ksoItems[4].count > 0) { item = 4; } if (item==0 && totTime >= HGLimit[2] && Options.ReviveOptions.UseGH && uW.ksoItems[3].count > 0) { item = 3; } if (item==0 && totTime >= HGLimit[1] && Options.ReviveOptions.UseKH && uW.ksoItems[2].count > 0) { item = 2; } if (item==0 && totTime >= HGLimit[0] && Options.ReviveOptions.UseSH && uW.ksoItems[1].count > 0) { item = 1; } } if (item != 0) { t.autodelay = t.intervalSecs; t.loopaction = true; t.speedupRevive(cityId,item,q[0],slot,true); } }, cancelRevive : function (cityId,slotNum) { var t = Tabs.Revive; var q; if (slotNum == 1) { q = Seed.queue_revive['city'+cityId][0]; } if (slotNum == 2) { q = Seed.queue_revive2['city'+cityId][0]; } if(q) { CM.last_building_opened = 23; // force apothecary view boolean uW.removeTraining(0, cityId, q[0], q[1], q[3], q[2], q[5], false, 'rev'+slotNum); } }, speedupRevive : function (cityId,item,cid,slotNum,noretry) { var t = Tabs.Revive; var citynum = Cities.byID[cityId].idx+1; jQuery('#btReviveCity_'+citynum).css('color', 'magenta'); var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.iid = item; params.uid = cid; params.slotNum = slotNum; params.apothecary = true; new MyAjaxRequest(uW.g_ajaxpath + "ajax/speedupTraining.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (rslt.ok) { var reduced = CM.intelligentOrdering.getReduceTime(item); Seed.items["i" + item] = parseInt(Seed.items["i" + item]) - 1; uW.ksoItems[item].subtract(); var qloc = 0; var timered = 0; var queue = Seed.queue_revive; if (params.slotNum == 2) { queue = Seed.queue_revive2; } queue["city" + cityId][0][3] = rslt.dateTraining; if (rslt.updateCityUnits) { uW.update_cityUnits(uWCloneInto(rslt.updateCityUnits)); } if (rslt.updateWoundedCityUnits) { uW.update_woundedCityUnits(uWCloneInto(rslt.updateWoundedCityUnits)); } timered = SpeedupArray[parseInt(item) - 1]; if (Seed.player.usedSpeedup && Seed.player.usedSpeedup == 0) { Seed.player.usedSpeedup = 1; } if (cityId == uW.currentcityid) uW.update_queue(); } else { if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Revive speedup failed ('+rslt.msg+')','REVIVE'); } else { actionLog(Cities.byID[cityId].name+': Revive speedup failed ('+rslt.error_code+')','REVIVE'); } } jQuery('#btReviveCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Revive speedup failed (AJAX Error)','REVIVE'); jQuery('#btReviveCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, },noretry); }, Revive_Now: function(idx,troop,min,max,max_sel){ var t = Tabs.Revive; ById('btRevMessages').innerHTML = ""; var citynum=idx+1; if(t.noApothecary[citynum]) { ById('btRevMessages').innerHTML = tx("No Apothecary")+"!"; return; } var cid = Cities.cities[idx].id; var amt = 0; var twoqueues = false; if (Seed.cityData.city[cid].isPrestigeCity) { twoqueues = (Seed.cityData.city[cid].prestigeInfo.blessings.indexOf(106) != -1); } if (Seed.queue_revive['city'+cid].length > 0 && (Seed.queue_revive2['city'+cid].length > 0 || !twoqueues)) { ById('btRevMessages').innerHTML = tx("Revive queue is full")+"!"; return; } var AvailGold = parseIntNan(Seed.citystats["city" + cid].gold[0]) - parseIntNan(Options.ReviveOptions.MinGold); if (AvailGold < 0) { ById('btRevMessages').innerHTML = tx("Gold is below minimum threshold")+"!"; return; } if (Seed.woundedUnits['city'+cid]['unt'+troop] < min) { ById('btRevMessages').innerHTML = tx("Wounded troops are below minimum threshold")+"!"; return; } if (Seed.woundedUnits['city'+cid]['unt'+troop] == 0) { ById('btRevMessages').innerHTML = tx("No troops to revive")+"!"; return; } if (Seed.woundedUnits['city'+cid]['unt'+troop] > max && max_sel){ var amt = parseIntNan(max); } else { var amt = parseIntNan(Seed.woundedUnits['city'+cid]['unt'+troop]); } // check gold! var unitGold = t.getRevivalCost(troop,1); var costGold = unitGold*amt; if (costGold>AvailGold) { amt = Math.floor(AvailGold/unitGold); if (amt < min || amt==0) { ById('btRevMessages').innerHTML = tx("Not enough gold above threshold to revive minimum troop threshold")+"!"; return; } } if(cid > 0 && troop > 0 && amt > 0){ t.Revive(cid,troop,amt); } }, Add_Revive: function(idx,troop,min,max,max_sel){ var t = Tabs.Revive; var citynum = idx+1; ById('btRevMessages').innerHTML = ""; if(t.noApothecary[citynum]) { ById('btRevMessages').innerHTML = tx("No Apothecary")+"!"; return; } if (troop==0 || (max_sel && max<1) || (max_sel && max0) { var gottroops = false; for (var e in Options.ReviveOptions.HealArray[citynum]) { if (Options.ReviveOptions.HealArray[citynum][e].troop==unitId) { gottroops = true; break; } } if (!gottroops) { t.Add_Revive(t.ModelCity.city.idx,unitId,min,max,max_sel); } } } }, Revive : function(cityId,unitId,num){ var t = Tabs.Revive; var citynum = Cities.byID[cityId].idx+1; jQuery('#btReviveCity_'+citynum).css('color', 'green'); var params = uW.Object.clone(uW.g_ajaxparams); params.cid = cityId; params.type = unitId; params.quant = num; params.apothecary = true; var time = t.getReviveTime(cityId,unitId, num); new MyAjaxRequest(uW.g_ajaxpath + "ajax/train.php" + uW.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function(rslt) { if (rslt.ok) { if (!rslt.initTS) { rslt.initTS = uW.unixTime() - 1; } if (rslt.queue_revive && rslt.queue_revive["city" + cityId]) { time = rslt.queue_revive["city" + cityId][0][5]; } if (Seed.queue_revive["city"+cityId].length == 0) { RQ = Seed.queue_revive["city" + cityId] } else { RQ = Seed.queue_revive2["city"+cityId] } RQ.push(uWCloneInto([unitId, num, rslt.initTS, parseInt(rslt.initTS) + time, 0, time, null])); var cost = t.getRevivalCost(unitId, num); Seed.citystats["city" + cityId].gold[0] -= parseInt(cost); if (uW.currentcityid == cityId) unsafeWindow.update_gold(); Seed.woundedUnits["city"+cityId]["unt"+unitId]=parseInt(Seed.woundedUnits["city"+cityId]["unt"+unitId])-num; t.PaintCityInfo(); } else { if (rslt.error_code == 6) { // city already reviving? delay 10 loops t.citydelay[citynum] = 10; } if (rslt.msg) { actionLog(Cities.byID[cityId].name+': Revive failed ('+rslt.msg+')','REVIVE'); } else { actionLog(Cities.byID[cityId].name+': Revive failed ('+rslt.error_code+')','REVIVE'); } } jQuery('#btReviveCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, onFailure: function () { actionLog(Cities.byID[cityId].name+': Revive failed (AJAX Error)','REVIVE'); jQuery('#btReviveCity_'+citynum).css('color', 'rgb('+HEXtoRGB(Options.Colors.PanelText).r+','+HEXtoRGB(Options.Colors.PanelText).g+','+HEXtoRGB(Options.Colors.PanelText).b+')'); }, },true); }, } /** END OF TABS **/ if (document.URL.search(/main_src.php/i) != -1) { if (window.self.location != window.parent.location) { // Fix weird bug with koc game? PowerBotStartup(); } }