From 3ffe3b84d64d1d26a11d979fb2bfdbd87cddddcb Mon Sep 17 00:00:00 2001 From: outoftheline Date: Thu, 13 May 2021 18:26:15 +0200 Subject: [PATCH 01/11] GvG Tool Rebuild --- js/web/gvg/js/gvg.js | 187 +++++++++++++++++++------------------------ 1 file changed, 84 insertions(+), 103 deletions(-) diff --git a/js/web/gvg/js/gvg.js b/js/web/gvg/js/gvg.js index db6b9a322..bd3f53723 100644 --- a/js/web/gvg/js/gvg.js +++ b/js/web/gvg/js/gvg.js @@ -12,23 +12,26 @@ */ FoEproxy.addHandler('ClanBattleService', 'grantIndependence', (data, postData) => { - //GvG.AddCount(data.responseData.__class__, GvG.Independences, 'GvGIndependencesCount'); - GvG.AddIndepences(data.responseData.__class__); + GvG.AddCount(data.responseData.__class__, postData[0]['requestMethod']); }); FoEproxy.addHandler('ClanBattleService', 'deploySiegeArmy', (data, postData) => { - //GvG.AddCount(data.responseData.__class__, GvG.Defenders, 'GvGDefendersCount'); - GvG.AddSieges(data.responseData.__class__); + GvG.AddCount(data.responseData.__class__, postData[0]['requestMethod']); }); FoEproxy.addHandler('ClanBattleService', 'deployDefendingArmy', (data, postData) => { - //GvG.AddCount(data.responseData.__class__, GvG.Sieges, 'GvGSiegesCount'); - GvG.AddDefenders(data.responseData.__class__); + GvG.AddCount(data.responseData.__class__, postData[0]['requestMethod']); }); FoEproxy.addHandler('ClanBattleService', 'getContinent', (data, postData) => { - GvG.SetRecalc(data.responseData.continent.calculation_time.start_time); - GvG.ShowGvgHud(); + if (GvG.Actions == undefined) { + GvG.InitActions(); + } + GvG.SetRecalc(data.responseData.continent.calculation_time.start_time, true); +}); + +FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) => { + console.log("Entered Province", data.responseData.province_detailed.era); }); FoEproxy.addHandler('AnnouncementsService', 'fetchAllAnnouncements', (data, postData) => { @@ -36,10 +39,27 @@ FoEproxy.addHandler('AnnouncementsService', 'fetchAllAnnouncements', (data, post }); let GvG = { - Independences: localStorage.getItem('GvGIndependencesCount')*1 || 0, - Sieges: localStorage.getItem('GvGSiegesCount')*1 || 0, - Defenders: localStorage.getItem('GvGDefendersCount')*1 || 0, - NextCalc: localStorage.getItem('GvGRecalcTime')*1 || 0, + Actions: undefined, + Init: false, + + InitActions: () => { + console.log("GvG Init"); + let Actions = JSON.parse(localStorage.getItem('GvGActions')); + + if (Actions == null) { + Actions = { + Independences: 0, + Sieges: 0, + Defenders: 0, + NextCalc: 0, + PrevCalc: 0, + LastAction: 0 + }; + localStorage.setItem('GvGActions', JSON.stringify(Actions)); + } + GvG.Actions = Actions; + GvG.Init = true; + }, /** * Build HUD @@ -55,7 +75,7 @@ let GvG = { }); $('body').append(div).promise().done(function() { - div.append('
'+GvG.Independences+'/4
'+GvG.Sieges+'
'+GvG.Defenders+'
') + div.append('
'+GvG.Actions.Independences+'/4
'+GvG.Actions.Sieges+'
'+GvG.Actions.Defenders+'
') .attr('title', i18n('GvG.Independences.Tooltip') + '
' + i18n('GvG.Independences.Tooltip.Warning') + '') .tooltip( { @@ -68,9 +88,9 @@ let GvG = { }); } else { - $('#gvg-hud .independences').text(GvG.Independences+'/4'); - $('#gvg-hud .sieges').text(GvG.Sieges); - $('#gvg-hud .defenders').text(GvG.Defenders); + $('#gvg-hud .independences').text(GvG.Actions.Independences+'/4'); + $('#gvg-hud .sieges').text(GvG.Actions.Sieges); + $('#gvg-hud .defenders').text(GvG.Actions.Defenders); } }, @@ -85,117 +105,78 @@ let GvG = { } }, - /** - * Add Granted Indepence on GvGMap - * @param data - * - AddCount: (data, variable, local)=> { - let nextCalc = localStorage.getItem('GvGRecalcTime')*1 || 0; - let time = Math.ceil(MainParser.getCurrentDateTime()/1000); - - console.log(nextCalc, time); - if (data === "Success") { - if (time != nextCalc) { - GvG.ResetData(); - } - variable++; - } - - localStorage.setItem(local, variable); - GvG.ShowGvgHud(); - }, - - /** - * Add Granted Indepence on GvGMap - * @param data + /** + * + * @param {*} response + * @param {*} requestMethod */ - AddIndepences: (data)=> { - let nextCalc = localStorage.getItem('GvGRecalcTime')*1 || 0; + AddCount: (response, requestMethod) => { let time = Math.ceil(MainParser.getCurrentDateTime()/1000); - console.log(nextCalc, time); - if (data === "Success") { - if (time > nextCalc) { - GvG.ResetData(); - } - GvG.Independences++; + if (time > GvG.Actions.NextCalc) { // when on a map during recalc + GvG.ResetData(); } - localStorage.setItem('GvGIndependencesCount', GvG.Independences); - GvG.ShowGvgHud(); - }, - - /** - * Add Granted Indepence on GvGMap - * @param data - */ - AddDefenders: (data)=> { - let nextCalc = localStorage.getItem('GvGRecalcTime')*1 || 0; - let time = Math.ceil(MainParser.getCurrentDateTime()/1000); - - console.log('Defender added', nextCalc, time); - if (data === "Success") { - if (time > nextCalc) { - GvG.ResetData(); - } - GvG.Defenders++; + if (requestMethod === "deployDefendingArmy" && response === "Success") { + GvG.Actions.Defenders++; + } + else if (requestMethod === "deploySiegeArmy" && response === "Success") { + GvG.Actions.Sieges++; + } + else if (requestMethod === "grantIndependence" && response === "Success") { + GvG.Actions.Independences++; } - localStorage.setItem('GvGDefendersCount', GvG.Defenders); + GvG.LastAction = time; GvG.ShowGvgHud(); + + localStorage.setItem('GvGActions', JSON.stringify(GvG.Actions)); }, - + /** - * Add To Sieges on GvGMap - * @param data + * Set Recalc time + * @param calcTime */ - AddSieges: (data)=> { - let nextCalc = localStorage.getItem('GvGRecalcTime')*1 || 0; + SetRecalc: (calcTime) => { let time = Math.ceil(MainParser.getCurrentDateTime()/1000); - console.log("Siege placed", nextCalc, time); - if (data === "Success") { - if (time > nextCalc) { - GvG.ResetData(); + if (GvG.Actions.NextCalc != calcTime) { + GvG.Actions.NextCalc = calcTime; + if ((time-20) < calcTime) { + console.log('Reset during Recalc'); + GvG.ResetData(calcTime); } - GvG.Sieges++; } - localStorage.setItem('GvGSiegesCount', GvG.Sieges); - GvG.ShowGvgHud(); - }, - - /** - * Set Recalc time - * @param calcTime - */ - SetRecalc: (calcTime)=> { + if (GvG.Actions.PrevCalc == 0) { + GvG.Actions.PrevCalc = calcTime-86400; + } - if (GvG.NextCalc != calcTime) { - //if (calcTime > GvG.NextCalc) - // GvG.ResetData(); - localStorage.setItem('GvGRecalcTime', calcTime); + if (GvG.Actions.LastAction < GvG.Actions.PrevCalc) { + GvG.ResetData(calcTime); } - GvG.ShowGvgHud(); - GvG.NextCalc = calcTime; + localStorage.setItem('GvGActions', JSON.stringify(GvG.Actions)); + console.log("SetRecalc", GvG.Actions); + GvG.ShowGvgHud(); }, /** * Reset all Data */ - ResetData() { - console.log('reset'); - let time = MainParser.getCurrentDateTime()/1000; - - GvG.Independences = 0; - GvG.Sieges = 0; - GvG.Defenders = 0; - GvG.NextCalc = time+80000; + ResetData: (calcTime = 0) => { + let time = Math.ceil(MainParser.getCurrentDateTime()/1000); + console.log('GvG Data Reset'); + + GvG.Actions.Independences = 0; + GvG.Actions.Sieges = 0; + GvG.Actions.Defenders = 0; + GvG.Actions.PrevCalc = GvG.Actions.NextCalc; + GvG.Actions.NextCalc = time+40000; + if (calcTime > 0) { + GvG.Actions.NextCalc = calcTime; + } - localStorage.setItem('GvGIndependencesCount', GvG.Independences); - localStorage.setItem('GvGSiegesCount', GvG.Sieges); - localStorage.setItem('GvGDefendersCount', GvG.Defenders); - localStorage.setItem('GvGRecalcTime', GvG.NextCalc); + localStorage.setItem('GvGActions', JSON.stringify(GvG.Actions)); } } \ No newline at end of file From da6327e9cd12276d1db5d7eb3604be7939998acc Mon Sep 17 00:00:00 2001 From: Daniel Voigt Date: Fri, 14 May 2021 14:44:26 +0200 Subject: [PATCH 02/11] table column bugfix --- js/web/investment/js/investment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/web/investment/js/investment.js b/js/web/investment/js/investment.js index 9ec0ee80c..7e1434ddb 100644 --- a/js/web/investment/js/investment.js +++ b/js/web/investment/js/investment.js @@ -181,7 +181,7 @@ let Investment = { if(showBlueprints) { - h.push(''); + h.push(''); } h.push(''); From bf5c43c4b83a9400895431e889f049b53e52ba2c Mon Sep 17 00:00:00 2001 From: outoftheline Date: Fri, 14 May 2021 23:01:43 +0200 Subject: [PATCH 03/11] GvG Map Beta --- js/web/gvg/css/gvg.css | 127 +++++++++- js/web/gvg/img/flags_medium.png | Bin 0 -> 82110 bytes js/web/gvg/img/flags_small.png | Bin 0 -> 27449 bytes js/web/gvg/js/gvg.js | 400 +++++++++++++++++++++++++++++++- 4 files changed, 521 insertions(+), 6 deletions(-) create mode 100644 js/web/gvg/img/flags_medium.png create mode 100644 js/web/gvg/img/flags_small.png diff --git a/js/web/gvg/css/gvg.css b/js/web/gvg/css/gvg.css index a335cab69..6d10f41af 100644 --- a/js/web/gvg/css/gvg.css +++ b/js/web/gvg/css/gvg.css @@ -60,4 +60,129 @@ #gvg-hud .defenders { background: var(--black-50) url('../../x_img/gvg-defenders.png') no-repeat 6px center; background-size: 20px 20px; -} \ No newline at end of file +} + + + +#GvGMap { + left: calc(50vw - 285px); + top: calc(50vw - 270px); + width: 570px; + width: 800px; +} + +#GvGMapBody { + height: inherit; + display: flex; + align-items: stretch; +} + +#GvGMapWrap { + width: 80%; + height: inherit; + overflow: auto; + background-color: #111213; + border-right: 2px solid var(--text-dark); + cursor: grab; +} + +#GvGMapGuilds { + width: 30%; + height: inherit; + overflow: auto; + max-width: 300px; +} + +#GvGMapInfo { + position: absolute; + bottom: 0; + left: 0; +} + +.sectorInfo { + position: absolute; + bottom: 10px; + left: 10px; + border-radius: 4px; + padding: 5px; + border: 1px solid var(--text-bright); + background-color: #210b02; + width: 200px; + font-size: 90%; +} + +.sectorInfo .guildflag { + float: right; + border-width: 5px; + border-style: solid; + border-radius: 50px; + position: absolute; + bottom: 6px; + right: 2px; + height: 20px; +} + +.sectorInfo b { + color: var(--text-bright); +} + +.guildflag { + width: 20px; + height: 18px; + border-radius: 2px; + display: inline-block; + margin-right: 3px; + box-shadow: 0 1px 2px var(--black-50); + vertical-align: middle; + background-image: url(../img/flags_small.png); + background-repeat: no-repeat; +} + +.guildflag.flag_1 { background-position: -57px -9px; } +.guildflag.flag_2, .guildflag.flag_2_G { background-position: -102px -9px; } +.guildflag.flag_3, .guildflag.flag_3_G { background-position: -148px -9px; } +.guildflag.flag_4 { background-position: -193px -9px; } +.guildflag.flag_5, .guildflag.flag_5_R { background-position: -237px -9px; } +.guildflag.flag_6 { background-position: -282px -9px; } +.guildflag.flag_7 { background-position: -327px -9px; } +.guildflag.flag_8 { background-position: -372px -9px; } +.guildflag.flag_9, .guildflag.flag_9_G { background-position: -418px -9px; } + +.guildflag.flag_10 { background-position: -11px -45px; } +.guildflag.flag_11, .guildflag.flag_11_G { background-position: -57px -45px; } +.guildflag.flag_12 { background-position: -102px -44px; } +.guildflag.flag_13 { background-position: -148px -45px; } +.guildflag.flag_14 { background-position: -193px -45px; } +.guildflag.flag_15 { background-position: -237px -45px; } +.guildflag.flag_16, .guildflag.flag_16_G { background-position: -282px -45px; } +.guildflag.flag_17 { background-position: -327px -45px; } +.guildflag.flag_18 { background-position: -372px -46px; } +.guildflag.flag_19 { background-position: -418px -45px; } + +.guildflag.flag_20, .guildflag.flag_20_R { background-position: -13px -81px; } +.guildflag.flag_21, .guildflag.flag_21_R { background-position: -58px -81px; } +.guildflag.flag_22, .guildflag.flag_22_G { background-position: -102px -80px; } +.guildflag.flag_23 { background-position: -148px -80px; } +.guildflag.flag_24, .guildflag.flag_24_R { background-position: -193px -81px; } +.guildflag.flag_25, .guildflag.flag_25_R { background-position: -237px -80px; } +.guildflag.flag_26 { background-position: -282px -81px; } +.guildflag.flag_27, .guildflag.flag_27_R { background-position: -327px -80px; } +.guildflag.flag_28, .guildflag.flag_28_R { background-position: -373px -80px; } +.guildflag.flag_29 { background-position: -418px -80px; } + +.guildflag.flag_30, .guildflag.flag_30_R { background-position: -12px -117px; } +.guildflag.flag_31, .guildflag.flag_31_R { background-position: -57px -116px; } +.guildflag.flag_32, .guildflag.flag_32_G { background-position: -103px -117px; } + +.guildflag.premium_flag_1 { background-position: -57px -153px; } +.guildflag.premium_flag_2 { background-position: -102px -153px; } +.guildflag.premium_flag_3 { background-position: -148px -153px; } +.guildflag.premium_flag_4 { background-position: -193px -153px; } +.guildflag.premium_flag_5 { background-position: -237px -153px; } +.guildflag.premium_flag_6 { background-position: -282px -153px; } +.guildflag.premium_flag_7 { background-position: -327px -153px; } +.guildflag.premium_flag_8 { background-position: -372px -153px; } +.guildflag.premium_flag_9 { background-position: -418px -153px; } +.guildflag.premium_flag_10 { background-position: -12px -189px; } +.guildflag.premium_flag_11 { background-position: -57px -189px; } +.guildflag.premium_flag_12 { background-position: -103px -189px; } \ No newline at end of file diff --git a/js/web/gvg/img/flags_medium.png b/js/web/gvg/img/flags_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..b68094efdbc794b20f2983a8db42f3fd582fecaf GIT binary patch literal 82110 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

si+nVBJ-*nZZ`+P-tM~5O5!kWc_f%bA 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 PkMATzWQ8jP^?d&yVNH3x literal 0 HcmV?d00001 diff --git a/js/web/gvg/img/flags_small.png b/js/web/gvg/img/flags_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a46d2b21dccb957600801e1ebd1fd4a0b20ee7d6 GIT binary patch literal 27449 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 { FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) => { console.log("Entered Province", data.responseData.province_detailed.era); + + GvGProvince.MapData = data['responseData']; + GvGProvince.MapDataTime = MainParser.getCurrentDateTime(); }); FoEproxy.addHandler('AnnouncementsService', 'fetchAllAnnouncements', (data, postData) => { @@ -84,7 +87,8 @@ let GvG = { placement: 'bottom', html: true } - ); + ) + .append(''); }); } else { @@ -114,6 +118,7 @@ let GvG = { let time = Math.ceil(MainParser.getCurrentDateTime()/1000); if (time > GvG.Actions.NextCalc) { // when on a map during recalc + console.log('time > GvG.Actions.NextCalc'); GvG.ResetData(); } @@ -142,17 +147,18 @@ let GvG = { if (GvG.Actions.NextCalc != calcTime) { GvG.Actions.NextCalc = calcTime; - if ((time-20) < calcTime) { + /*if ((time-20) < calcTime) { // when switching maps via overview during recalc console.log('Reset during Recalc'); GvG.ResetData(calcTime); - } + }*/ } if (GvG.Actions.PrevCalc == 0) { - GvG.Actions.PrevCalc = calcTime-86400; + GvG.Actions.PrevCalc = (calcTime-86400); } - if (GvG.Actions.LastAction < GvG.Actions.PrevCalc) { + if (GvG.Actions.LastAction < GvG.Actions.PrevCalc && GvG.Actions.LastAction != 0) { + console.log('GvG.Actions.LastAction < GvG.Actions.PrevCalc'); GvG.ResetData(calcTime); } @@ -173,10 +179,394 @@ let GvG = { GvG.Actions.Defenders = 0; GvG.Actions.PrevCalc = GvG.Actions.NextCalc; GvG.Actions.NextCalc = time+40000; + GvG.Actions.LastAction = time; if (calcTime > 0) { GvG.Actions.NextCalc = calcTime; } localStorage.setItem('GvGActions', JSON.stringify(GvG.Actions)); } +} + +let GvGProvince = { + + Map: {}, + MapData: {}, + MapDataTime: 0, + MapCTX: {}, + + Mouse: { + x: undefined, + y: undefined + }, + + HexWidth: 50, + HexHeight: 40, + + Sectors: [], + Guilds: [], + PowerValues: [], + + Colors: { + "blank": [{"r":240,"g":240,"b":240}], + "b": [ + {"r":0,"g":185,"b":238}, + {"r":0,"g":159,"b":227}, + {"r":72,"g":140,"b":203}, + {"r":0,"g":105,"b":180}, + {"r":61,"g":61,"b":210}, + {"r":86,"g":68,"b":163}, + {"r":0,"g":72,"b":153}, + {"r":0,"g":85,"b":120}, + {"r":0,"g":55,"b":97}, + {"r":40,"g":85,"b":120}, + {"r":40,"g":55,"b":97}, + {"r":40,"g":10,"b":50}, + {"r":0,"g":10,"b":50} + ], + "r": [ + {"r":203,"g":78,"b":72}, + {"r":163,"g":77,"b":68}, + {"r":227,"g":80,"b":0}, + {"r":238,"g":0,"b":0}, + {"r":180,"g":0,"b":0}, + {"r":153,"g":0,"b":51}, + {"r":120,"g":20,"b":0}, + {"r":140,"g":40,"b":0}, + {"r":97,"g":0,"b":45}, + {"r":127,"g":0,"b":55}, + {"r":140,"g":17,"b":74}, + {"r":190,"g":17,"b":74}, + {"r":210,"g":61,"b":89} + ], + "g": [ + {"r":0,"g":220,"b":0}, + {"r":50,"g":200,"b":70}, + {"r":0,"g":180,"b":0}, + {"r":50,"g":160,"b":70}, + {"r":0,"g":140,"b":70}, + {"r":50,"g":120,"b":0}, + {"r":0,"g":100,"b":0}, + {"r":50,"g":80,"b":0}, + {"r":0,"g":60,"b":0}, + {"r":0,"g":40,"b":0}, + {"r":90,"g":160,"b":80}, + {"r":50,"g":180,"b":30}, + {"r":50,"g":200,"b":80} + ], + "premium": [ + {"r":2,"g":2,"b":2}, + {"r":36,"g":76,"b":32}, + {"r":13,"g":43,"b":70}, + {"r":14,"g":77,"b":86}, + {"r":79,"g":26,"b":126}, + {"r":100,"g":63,"b":33}, + {"r":232,"g":189,"b":64}, + {"r":35,"g":60,"b":30}, + {"r":93,"g":100,"b":104}, + {"r":80,"g":70,"b":97}, + {"r":61,"g":13,"b":13}, + {"r":56,"g":81,"b":16}, + {"r":210,"g":150,"b":21}] + }, + + Era: "", + CurrentGuild: {"color": {"r":240,"g":240,"b":240}}, + NoGuild: {"color": {"r":240,"g":240,"b":240}}, + + /** + * Build GvG Map + */ + ShowGvgMap: () => { + if ($('#gvg-map').length == 0) { + + moment.locale(MainParser.Language); + + HTML.Box({ + id: 'GvGMap', + title: 'GvG (BETA!)', + auto_close: true, + dragdrop: true, + minimize: true, + resize: true + }); + + GvGProvince.BuildMap(); + } + }, + + /** + * Hide HUD + */ + HideGvgMap: () => { + if ($('#GvGMap').length > 0) { + $('#GvGMap').remove(); + $('#gvg-map').remove(); + } + }, + + BuildMap: () => { + + GvGProvince.PowerValues = GvGProvince.MapData.province_detailed.power_values; + let h = []; + h.push('

'); + $('#GvGMapBody').html(h.join('')); + + GvGProvince.Map = document.getElementById("gvg-map"); + GvGProvince.MapCTX = GvGProvince.Map.getContext('2d'); + GvGProvince.Guilds = []; + GvGProvince.Sectors = []; + let provinceData = GvGProvince.MapData.province_detailed; + let guildData = GvGProvince.MapData.province_detailed.clans; + let bounds = GvGProvince.MapData.province_detailed.bounds; + let width = (provinceData.bounds.x_max - provinceData.bounds.x_min)*GvGProvince.HexWidth+GvGProvince.HexWidth/2; + let height = (provinceData.bounds.y_max - provinceData.bounds.y_min)*GvGProvince.HexHeight*0.8; + + $(GvGProvince.Map).attr({ + 'id': 'gvg-map', + 'width': width, + 'height': height + }); + + GvGProvince.MapCTX.clearRect(0, 0, width, height); + + guildData.forEach(function (guild) { + let guildOnMap = { + id: guild.id, + name: guild.name, + flag: guild.flag, + color: GvGProvince.GetColor(guild), + flagCoordinates: GvGProvince.FlagImageCoordinates(guild.flag), + power: 0, + sectors: 0, + }; + GvGProvince.Guilds.push(guildOnMap); + }); + + provinceData.sectors.forEach(function (sector) { + if ((sector.terrain == 'plain' || sector.terrain == 'beach') && sector.hitpoints != undefined) { + let realX = (sector.position.x - bounds.x_min) * GvGProvince.HexWidth; + let realY = (sector.position.y - bounds.y_min) * GvGProvince.HexHeight; + let newSector = {}; + + if (sector.position.y % 2 == 0) { + newSector = new Sector(realX, realY * 0.75, sector); + } + else { + newSector = new Sector(realX + (GvGProvince.HexWidth * 0.5), realY * 0.75, sector); + } + GvGProvince.Sectors.push(newSector); + + let guild = newSector.findOwnerById(newSector.owner.id); + if (guild != undefined) { + guild.power += newSector.power; + guild.sectors++; + } + newSector.draw(); + } + }); + + GvGProvince.MapCTX.font = "bold 22px Arial"; + GvGProvince.MapCTX.textAlign = "left"; + GvGProvince.MapCTX.fillStyle = '#ddd'; + GvGProvince.MapCTX.fillText(provinceData.era, 10, 25); + GvGProvince.MapCTX.font = "12px Arial"; + GvGProvince.MapCTX.fillText(moment(GvGProvince.MapDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); + + GvGProvince.BuildGuilds(); + + GvGProvince.Map.addEventListener("mousedown", function (e) { + let currentSector = GvGProvince.setSector(e); + }, false); + }, + + setSector: (e) => { + GvGProvince.Sectors.forEach(function (sector) { + if (e.offsetX >= (sector.position.x + 5) && e.offsetX <= (sector.position.x + GvGProvince.HexWidth - 5)) { + if (e.offsetY >= (sector.position.y + 5) && e.offsetY <= (sector.position.y + GvGProvince.HexHeight - 5)) { + GvGProvince.ShowSector(sector); + return sector; + } + } + }); + return undefined; + }, + + ShowSector: (sector) => { + let html = '
'; + html += ''; + html += ''+ sector.owner.name +'
'; + html += 'Coords: '+ sector.coords() +'
'; + html += 'Power: '+ sector.power +'
'; + html += 'Protected: '+ sector.isProtected +'
'; + html += 'Beach: '+ sector.beach +'
'; + html += '
'; + document.getElementById("GvGMapInfo").innerHTML = html; + }, + + BuildGuilds: () => { + let t = []; + + GvGProvince.Guilds.sort(function(a, b) { + if (a.power > b.power) + return -1; + if (a.power < b.power) + return 1; + return 0; + }); + + t.push(''); + t.push(''); + t.push(''); + t.push(''); + t.push(''); + t.push(''); + GvGProvince.Guilds.forEach(function (guild) { + t.push(''); + t.push(''); + t.push(''); + t.push(''); + t.push(''); + }); + t.push('
NameSectorsPower
'+guild.name+''+guild.sectors+''+guild.power+'
'); + + $('#GvGMapGuilds').html(t.join('')); + }, + + GetColor: (guild) => { + flag = guild.flag.split("_") || null; + let color = {"r":255,"g":255,"b":255}; + + if (flag != null) { + if (flag[0].search("premium") >= 0) { + color = GvGProvince.Colors.premium[flag[flag.length-1]-1]; + } + else if (flag[flag.length - 1].toLowerCase() == "r") { + color = GvGProvince.Colors.r[Math.round(guild.id/13)%13]; + } + else if (flag[flag.length - 1].toLowerCase() == "g") + color = GvGProvince.Colors.g[Math.round(guild.id/13)%13]; + else + if (flag.length != 1) + color = GvGProvince.Colors.b[Math.round(guild.id/13)%13]; + + } + + return color; + }, + + FlagImageCoordinates: (flag) => { + let id = flag.split("_"); + + if (id[id.length - 1].toLowerCase() == "r" || id[id.length - 1].toLowerCase() == "g") + id = parseInt(id[id.length - 2]); + else + id = parseInt(id[id.length - 1]); + + if (flag.search("premium") >= 0) + id += 40; + + return {"x": (id % 10 ) * (GvGProvince.HexWidth), "y": Math.floor(id / 10) * (GvGProvince.HexHeight)}; + }, + + ColorStringify: (color) => { + return "rgb("+color.r+","+color.g+","+color.b+")"; + }, +} + +class Sector { + + constructor(x, y, info) { + this.position = { + "x": x, + "y": y + }; + this.coordinates = { + "x": info.position.x, + "y": info.position.y + }; + this.power = parseInt(GvGProvince.PowerValues[info.power]) || GvGProvince.PowerValues[0]; + this.powerMultiplicator = parseInt(info.power)+1 || 1; + this.isProtected = info.is_protected; + this.owner = this.findOwnerById(info.owner_id) || { id: 0 }; + this.headquarter = (info.building != null); + this.beach = (info.terrain == "beach"); + } + + findOwnerById(id) { + let guild = GvGProvince.Guilds.find(x => x.id === id); + return guild; + } + + might() { + return this.power; + } + + draw() { + this.drawHex(); + this.drawHexText(); + if (this.owner.id > 0) { + let flag = this.owner.flagCoordinates; + + let img = new Image(); + img.src = 'https://tools.kingshood.de/gvg/img/flags_small.png'; + + let sector = this; + img.onload = function () { + + if (sector.headquarter) + GvGProvince.MapCTX.drawImage(img, 450, 200, GvGProvince.HexWidth, GvGProvince.HexHeight, sector.position.x, sector.position.y, GvGProvince.HexWidth, GvGProvince.HexHeight); + if (sector.isProtected) + GvGProvince.MapCTX.drawImage(img, 400, 200, GvGProvince.HexWidth, GvGProvince.HexHeight, sector.position.x, sector.position.y, GvGProvince.HexWidth, GvGProvince.HexHeight); + + GvGProvince.MapCTX.drawImage(img, flag.x, flag.y, GvGProvince.HexWidth, GvGProvince.HexHeight, sector.position.x, sector.position.y-5, GvGProvince.HexWidth, GvGProvince.HexHeight); + + } + } + } + + redraw() { + this.drawHex(); + this.drawHexText(); + } + + drawHex() { + if (this.beach && this.owner.id < 0) { + this.owner.color = {"r":233,"g":233,"b":114-this.powerMultiplicator*10}; + } + else if (this.owner.id < 0) { + this.owner.color = {"r":126-this.powerMultiplicator*10,"g":222-this.powerMultiplicator*10,"b":110-this.powerMultiplicator*10}; + } + else if (this.owner.id == 0) { + this.owner.color = {"r":this.owner.id%255,"g":(this.owner.id+100)%255,"b":this.owner.id%120+100}; + } + + GvGProvince.MapCTX.fillStyle = GvGProvince.ColorStringify(this.owner.color); + GvGProvince.MapCTX.beginPath(); + GvGProvince.MapCTX.moveTo(this.position.x + GvGProvince.HexWidth / 2, this.position.y); + GvGProvince.MapCTX.lineTo(this.position.x + GvGProvince.HexWidth, this.position.y + GvGProvince.HexHeight * 0.25); + GvGProvince.MapCTX.lineTo(this.position.x + GvGProvince.HexWidth, this.position.y + GvGProvince.HexHeight * 0.75); + GvGProvince.MapCTX.lineTo(this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight); + GvGProvince.MapCTX.lineTo(this.position.x, this.position.y + GvGProvince.HexHeight * 0.75); + GvGProvince.MapCTX.lineTo(this.position.x, this.position.y + GvGProvince.HexHeight * 0.25); + GvGProvince.MapCTX.closePath(); + GvGProvince.MapCTX.fill(); + GvGProvince.MapCTX.strokeStyle = "rgba(0,0,0,0.2)"; + GvGProvince.MapCTX.stroke(); + } + + drawHexText() { + GvGProvince.MapCTX.font = "9px Arial"; + GvGProvince.MapCTX.textAlign = "center"; + GvGProvince.MapCTX.fillStyle = ((this.owner.color.r+this.owner.color.g+this.owner.color.b) < 400) ? '#ddd':'#222'; + //GvGProvince.MapCTX.fillText(this.might(), this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.3); + GvGProvince.MapCTX.fillText(this.coords(), this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.8); + } + + coords() { + if (this.beach) + return "~"+this.coordinates.x + ", " + this.coordinates.y+"~"; + GvGProvince.MapCTX.font = "bold 10px Arial"; + return this.coordinates.x + ", " + this.coordinates.y; + } } \ No newline at end of file From c1167ad2df51e9c595e76213103d3b2ddd64b536 Mon Sep 17 00:00:00 2001 From: outoftheline Date: Sat, 15 May 2021 12:40:24 +0200 Subject: [PATCH 04/11] GvG Map Additions Added dragging Added rocks and water sectors Rearranged Sector Info --- js/web/gvg/css/gvg.css | 1 + js/web/gvg/js/gvg.js | 148 +++++++++++++++++++++++++++++------------ 2 files changed, 107 insertions(+), 42 deletions(-) diff --git a/js/web/gvg/css/gvg.css b/js/web/gvg/css/gvg.css index 6d10f41af..fe51801d1 100644 --- a/js/web/gvg/css/gvg.css +++ b/js/web/gvg/css/gvg.css @@ -84,6 +84,7 @@ background-color: #111213; border-right: 2px solid var(--text-dark); cursor: grab; + overflow: hidden; } #GvGMapGuilds { diff --git a/js/web/gvg/js/gvg.js b/js/web/gvg/js/gvg.js index d123133bc..5dc30f852 100644 --- a/js/web/gvg/js/gvg.js +++ b/js/web/gvg/js/gvg.js @@ -30,9 +30,7 @@ FoEproxy.addHandler('ClanBattleService', 'getContinent', (data, postData) => { GvG.SetRecalc(data.responseData.continent.calculation_time.start_time, true); }); -FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) => { - console.log("Entered Province", data.responseData.province_detailed.era); - +FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) => { GvGProvince.MapData = data['responseData']; GvGProvince.MapDataTime = MainParser.getCurrentDateTime(); }); @@ -206,6 +204,7 @@ let GvGProvince = { Sectors: [], Guilds: [], PowerValues: [], + ProvinceData: {}, Colors: { "blank": [{"r":240,"g":240,"b":240}], @@ -316,11 +315,12 @@ let GvGProvince = { GvGProvince.MapCTX = GvGProvince.Map.getContext('2d'); GvGProvince.Guilds = []; GvGProvince.Sectors = []; - let provinceData = GvGProvince.MapData.province_detailed; + GvGProvince.ProvinceData = GvGProvince.MapData.province_detailed; let guildData = GvGProvince.MapData.province_detailed.clans; let bounds = GvGProvince.MapData.province_detailed.bounds; - let width = (provinceData.bounds.x_max - provinceData.bounds.x_min)*GvGProvince.HexWidth+GvGProvince.HexWidth/2; - let height = (provinceData.bounds.y_max - provinceData.bounds.y_min)*GvGProvince.HexHeight*0.8; + let width = (GvGProvince.ProvinceData.bounds.x_max - GvGProvince.ProvinceData.bounds.x_min)*GvGProvince.HexWidth+GvGProvince.HexWidth/2; + let height = (GvGProvince.ProvinceData.bounds.y_max - GvGProvince.ProvinceData.bounds.y_min)*GvGProvince.HexHeight*0.8; + let drag = false; $(GvGProvince.Map).attr({ 'id': 'gvg-map', @@ -343,8 +343,8 @@ let GvGProvince = { GvGProvince.Guilds.push(guildOnMap); }); - provinceData.sectors.forEach(function (sector) { - if ((sector.terrain == 'plain' || sector.terrain == 'beach') && sector.hitpoints != undefined) { + GvGProvince.ProvinceData.sectors.forEach(function (sector) { + if (/*(sector.terrain == 'plain' || sector.terrain == 'beach') /*&&*/ sector.hitpoints != undefined) { let realX = (sector.position.x - bounds.x_min) * GvGProvince.HexWidth; let realY = (sector.position.y - bounds.y_min) * GvGProvince.HexHeight; let newSector = {}; @@ -366,18 +366,60 @@ let GvGProvince = { } }); - GvGProvince.MapCTX.font = "bold 22px Arial"; - GvGProvince.MapCTX.textAlign = "left"; - GvGProvince.MapCTX.fillStyle = '#ddd'; - GvGProvince.MapCTX.fillText(provinceData.era, 10, 25); - GvGProvince.MapCTX.font = "12px Arial"; - GvGProvince.MapCTX.fillText(moment(GvGProvince.MapDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); + GvGProvince.drawInfo(); GvGProvince.BuildGuilds(); GvGProvince.Map.addEventListener("mousedown", function (e) { - let currentSector = GvGProvince.setSector(e); + drag = true; + GvGProvince.setSector(e) }, false); + GvGProvince.Map.addEventListener("mouseup", function (e) { + drag = false; + }, false); + GvGProvince.Map.addEventListener("mousemove", function (e) { + }, false); + + GvGProvince.MapDraggable(); + }, + + drawInfo: () => { + GvGProvince.MapCTX.font = "bold 22px Arial"; + GvGProvince.MapCTX.textAlign = "left"; + GvGProvince.MapCTX.fillStyle = '#ddd'; + GvGProvince.MapCTX.fillText('Map: '+GvGProvince.ProvinceData.era, 10, 25); + GvGProvince.MapCTX.font = "12px Arial"; + GvGProvince.MapCTX.fillText('Data fetched: '+ moment(GvGProvince.MapDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); + }, + + MapDraggable: () => { + const wrapper = document.getElementById('GvGMapWrap'); + let pos = { top: 0, left: 0, x: 0, y: 0 }; + + const mouseDownHandler = function(e) { + pos = { + left: wrapper.scrollLeft, + top: wrapper.scrollTop, + x: e.clientX, + y: e.clientY, + }; + + document.addEventListener('mousemove', mouseMoveHandler); + document.addEventListener('mouseup', mouseUpHandler); + }; + + const mouseMoveHandler = function(e) { + const dx = e.clientX - pos.x; + const dy = e.clientY - pos.y; + wrapper.scrollTop = pos.top - dy; + wrapper.scrollLeft = pos.left - dx; + }; + + const mouseUpHandler = function() { + document.removeEventListener('mousemove', mouseMoveHandler); + document.removeEventListener('mouseup', mouseUpHandler); + }; + wrapper.addEventListener('mousedown', mouseDownHandler); }, setSector: (e) => { @@ -393,14 +435,21 @@ let GvGProvince = { }, ShowSector: (sector) => { - let html = '
'; - html += ''; - html += ''+ sector.owner.name +'
'; - html += 'Coords: '+ sector.coords() +'
'; - html += 'Power: '+ sector.power +'
'; - html += 'Protected: '+ sector.isProtected +'
'; - html += 'Beach: '+ sector.beach +'
'; - html += '
'; + let html = ''; + if (sector.owner.name != undefined) { + html = '
' + html += ''; + html += ''+ sector.owner.name +'
'; + html += 'Hitpoints: '+ sector.hitpoints +'/80
'; + html += 'Coords: '+ sector.coords() +'
'; + html += 'Power: '+ sector.power +'
'; + if (sector.isProtected) + html += 'Sector is protected
'; + html += 'Terrain: '+ sector.terrain +'
'; + if (sector.underSiege()) + html += 'Under Siege by: '+ sector.underSiege() +'
'; + html += '
'; + } document.getElementById("GvGMapInfo").innerHTML = html; }, @@ -475,7 +524,6 @@ let GvGProvince = { } class Sector { - constructor(x, y, info) { this.position = { "x": x, @@ -488,9 +536,13 @@ class Sector { this.power = parseInt(GvGProvince.PowerValues[info.power]) || GvGProvince.PowerValues[0]; this.powerMultiplicator = parseInt(info.power)+1 || 1; this.isProtected = info.is_protected; - this.owner = this.findOwnerById(info.owner_id) || { id: 0 }; + this.terrain = info.terrain; this.headquarter = (info.building != null); - this.beach = (info.terrain == "beach"); + this.hitpoints = info.hitpoints; + this.owner = this.findOwnerById(info.owner_id) || { id: 0, color: this.setColorByTerrain() }; + this.siege = { + "clan": info.siege_clan_id || 0, + }; } findOwnerById(id) { @@ -498,8 +550,27 @@ class Sector { return guild; } - might() { - return this.power; + underSiege() { + if (this.siege.clan != 0) + return GvGProvince.Guilds.find(x => x.id === this.siege.clan).name; + return false; + } + + setColorByTerrain() { + let color = {}; + if (this.terrain == "beach") { + color = {"r":233,"g":233,"b":114-this.powerMultiplicator*10}; + } + else if (this.terrain == "plain") { + color = {"r":126-this.powerMultiplicator*10,"g":222-this.powerMultiplicator*10,"b":110-this.powerMultiplicator*10}; + } + else { + if (this.terrain == "rocks") + color = {"r":50,"g":50,"b":50}; + if (this.terrain == "water") + color = {"r":4,"g":28,"b":45}; + } + return color; } draw() { @@ -531,16 +602,6 @@ class Sector { } drawHex() { - if (this.beach && this.owner.id < 0) { - this.owner.color = {"r":233,"g":233,"b":114-this.powerMultiplicator*10}; - } - else if (this.owner.id < 0) { - this.owner.color = {"r":126-this.powerMultiplicator*10,"g":222-this.powerMultiplicator*10,"b":110-this.powerMultiplicator*10}; - } - else if (this.owner.id == 0) { - this.owner.color = {"r":this.owner.id%255,"g":(this.owner.id+100)%255,"b":this.owner.id%120+100}; - } - GvGProvince.MapCTX.fillStyle = GvGProvince.ColorStringify(this.owner.color); GvGProvince.MapCTX.beginPath(); GvGProvince.MapCTX.moveTo(this.position.x + GvGProvince.HexWidth / 2, this.position.y); @@ -558,15 +619,18 @@ class Sector { drawHexText() { GvGProvince.MapCTX.font = "9px Arial"; GvGProvince.MapCTX.textAlign = "center"; - GvGProvince.MapCTX.fillStyle = ((this.owner.color.r+this.owner.color.g+this.owner.color.b) < 400) ? '#ddd':'#222'; - //GvGProvince.MapCTX.fillText(this.might(), this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.3); + GvGProvince.MapCTX.fillStyle = ((this.owner.color.r+this.owner.color.g+this.owner.color.b) < 420) ? '#ddd' : '#222'; GvGProvince.MapCTX.fillText(this.coords(), this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.8); + if (this.owner.id == 0 && this.terrain != "water" && this.terrain != "rocks") + GvGProvince.MapCTX.fillText(this.power, this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.3); } coords() { - if (this.beach) + if (this.terrain == "beach") return "~"+this.coordinates.x + ", " + this.coordinates.y+"~"; GvGProvince.MapCTX.font = "bold 10px Arial"; - return this.coordinates.x + ", " + this.coordinates.y; + if (this.terrain == "plain") + return this.coordinates.x + ", " + this.coordinates.y; + return ""; } } \ No newline at end of file From c8c6efb0982c3ff6e56ea37ab153bff95038c6b3 Mon Sep 17 00:00:00 2001 From: outoftheline Date: Sat, 15 May 2021 16:08:39 +0200 Subject: [PATCH 05/11] GvG Map Edit --- js/web/gvg/css/gvg.css | 18 ++-- js/web/gvg/js/gvg.js | 204 +++++++++++++++++++++++++++++------------ 2 files changed, 156 insertions(+), 66 deletions(-) diff --git a/js/web/gvg/css/gvg.css b/js/web/gvg/css/gvg.css index fe51801d1..d0ef47f02 100644 --- a/js/web/gvg/css/gvg.css +++ b/js/web/gvg/css/gvg.css @@ -62,8 +62,6 @@ background-size: 20px 20px; } - - #GvGMap { left: calc(50vw - 285px); top: calc(50vw - 270px); @@ -83,15 +81,13 @@ overflow: auto; background-color: #111213; border-right: 2px solid var(--text-dark); - cursor: grab; overflow: hidden; } #GvGMapGuilds { - width: 30%; height: inherit; overflow: auto; - max-width: 300px; + width: 320px; } #GvGMapInfo { @@ -100,6 +96,12 @@ left: 0; } +#GvGMapActions{ + position: absolute; + top: 10px; + right: 332px; +} + .sectorInfo { position: absolute; bottom: 10px; @@ -139,6 +141,10 @@ background-repeat: no-repeat; } +#GvGGuilds.foe-table tr.active { + background-color: var(--black-50); +} + .guildflag.flag_1 { background-position: -57px -9px; } .guildflag.flag_2, .guildflag.flag_2_G { background-position: -102px -9px; } .guildflag.flag_3, .guildflag.flag_3_G { background-position: -148px -9px; } @@ -165,7 +171,7 @@ .guildflag.flag_22, .guildflag.flag_22_G { background-position: -102px -80px; } .guildflag.flag_23 { background-position: -148px -80px; } .guildflag.flag_24, .guildflag.flag_24_R { background-position: -193px -81px; } -.guildflag.flag_25, .guildflag.flag_25_R { background-position: -237px -80px; } +.guildflag.flag_25, .guildflag.flag_25_G { background-position: -237px -80px; } .guildflag.flag_26 { background-position: -282px -81px; } .guildflag.flag_27, .guildflag.flag_27_R { background-position: -327px -80px; } .guildflag.flag_28, .guildflag.flag_28_R { background-position: -373px -80px; } diff --git a/js/web/gvg/js/gvg.js b/js/web/gvg/js/gvg.js index 5dc30f852..f606c867f 100644 --- a/js/web/gvg/js/gvg.js +++ b/js/web/gvg/js/gvg.js @@ -25,9 +25,9 @@ FoEproxy.addHandler('ClanBattleService', 'deployDefendingArmy', (data, postData) FoEproxy.addHandler('ClanBattleService', 'getContinent', (data, postData) => { if (GvG.Actions == undefined) { - GvG.InitActions(); + GvG.initActions(); } - GvG.SetRecalc(data.responseData.continent.calculation_time.start_time, true); + GvG.setRecalc(data.responseData.continent.calculation_time.start_time, true); }); FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) => { @@ -43,7 +43,7 @@ let GvG = { Actions: undefined, Init: false, - InitActions: () => { + initActions: () => { console.log("GvG Init"); let Actions = JSON.parse(localStorage.getItem('GvGActions')); @@ -65,7 +65,7 @@ let GvG = { /** * Build HUD */ - ShowGvgHud: () => { + showGvgHud: () => { if ($('#gvg-hud').length == 0) { HTML.AddCssFile('gvg'); let div = $('
'); @@ -86,7 +86,7 @@ let GvG = { html: true } ) - .append(''); + .append(''); }); } else { @@ -117,7 +117,7 @@ let GvG = { if (time > GvG.Actions.NextCalc) { // when on a map during recalc console.log('time > GvG.Actions.NextCalc'); - GvG.ResetData(); + GvG.resetData(); } if (requestMethod === "deployDefendingArmy" && response === "Success") { @@ -131,7 +131,7 @@ let GvG = { } GvG.LastAction = time; - GvG.ShowGvgHud(); + GvG.showGvgHud(); localStorage.setItem('GvGActions', JSON.stringify(GvG.Actions)); }, @@ -140,14 +140,14 @@ let GvG = { * Set Recalc time * @param calcTime */ - SetRecalc: (calcTime) => { + setRecalc: (calcTime) => { let time = Math.ceil(MainParser.getCurrentDateTime()/1000); if (GvG.Actions.NextCalc != calcTime) { GvG.Actions.NextCalc = calcTime; /*if ((time-20) < calcTime) { // when switching maps via overview during recalc console.log('Reset during Recalc'); - GvG.ResetData(calcTime); + GvG.resetData(calcTime); }*/ } @@ -157,18 +157,18 @@ let GvG = { if (GvG.Actions.LastAction < GvG.Actions.PrevCalc && GvG.Actions.LastAction != 0) { console.log('GvG.Actions.LastAction < GvG.Actions.PrevCalc'); - GvG.ResetData(calcTime); + GvG.resetData(calcTime); } localStorage.setItem('GvGActions', JSON.stringify(GvG.Actions)); - console.log("SetRecalc", GvG.Actions); - GvG.ShowGvgHud(); + console.log("setRecalc", GvG.Actions); + GvG.showGvgHud(); }, /** * Reset all Data */ - ResetData: (calcTime = 0) => { + resetData: (calcTime = 0) => { let time = Math.ceil(MainParser.getCurrentDateTime()/1000); console.log('GvG Data Reset'); @@ -193,18 +193,24 @@ let GvGProvince = { MapDataTime: 0, MapCTX: {}, - Mouse: { - x: undefined, - y: undefined + Actions: { + edit: false, + drag: true }, + Width: 0, + Height: 0, HexWidth: 50, HexHeight: 40, + CurrentGuild: { + id: 0 + }, Sectors: [], Guilds: [], PowerValues: [], ProvinceData: {}, + GuildData: {}, Colors: { "blank": [{"r":240,"g":240,"b":240}], @@ -276,7 +282,7 @@ let GvGProvince = { /** * Build GvG Map */ - ShowGvgMap: () => { + showGvgMap: () => { if ($('#gvg-map').length == 0) { moment.locale(MainParser.Language); @@ -290,25 +296,24 @@ let GvGProvince = { resize: true }); - GvGProvince.BuildMap(); + GvGProvince.buildMap(); } }, /** * Hide HUD */ - HideGvgMap: () => { + hideGvgMap: () => { if ($('#GvGMap').length > 0) { $('#GvGMap').remove(); $('#gvg-map').remove(); } }, - BuildMap: () => { + buildMap: () => { - GvGProvince.PowerValues = GvGProvince.MapData.province_detailed.power_values; let h = []; - h.push('
'); + h.push('
EditDrag
'); $('#GvGMapBody').html(h.join('')); GvGProvince.Map = document.getElementById("gvg-map"); @@ -316,27 +321,26 @@ let GvGProvince = { GvGProvince.Guilds = []; GvGProvince.Sectors = []; GvGProvince.ProvinceData = GvGProvince.MapData.province_detailed; - let guildData = GvGProvince.MapData.province_detailed.clans; - let bounds = GvGProvince.MapData.province_detailed.bounds; - let width = (GvGProvince.ProvinceData.bounds.x_max - GvGProvince.ProvinceData.bounds.x_min)*GvGProvince.HexWidth+GvGProvince.HexWidth/2; - let height = (GvGProvince.ProvinceData.bounds.y_max - GvGProvince.ProvinceData.bounds.y_min)*GvGProvince.HexHeight*0.8; - let drag = false; + GvGProvince.GuildData = GvGProvince.MapData.province_detailed.clans; + GvGProvince.PowerValues = GvGProvince.MapData.province_detailed.power_values; + GvGProvince.Width = (GvGProvince.ProvinceData.bounds.x_max - GvGProvince.ProvinceData.bounds.x_min)*GvGProvince.HexWidth+GvGProvince.HexWidth/2; + GvGProvince.Height = (GvGProvince.ProvinceData.bounds.y_max - GvGProvince.ProvinceData.bounds.y_min)*GvGProvince.HexHeight*0.8; $(GvGProvince.Map).attr({ 'id': 'gvg-map', - 'width': width, - 'height': height + 'width': GvGProvince.Width, + 'height': GvGProvince.Height }); - GvGProvince.MapCTX.clearRect(0, 0, width, height); + GvGProvince.MapCTX.clearRect(0, 0, GvGProvince.Width, GvGProvince.Height); - guildData.forEach(function (guild) { + GvGProvince.GuildData.forEach(function (guild) { let guildOnMap = { id: guild.id, name: guild.name, flag: guild.flag, - color: GvGProvince.GetColor(guild), - flagCoordinates: GvGProvince.FlagImageCoordinates(guild.flag), + color: GvGProvince.getColor(guild), + flagCoordinates: GvGProvince.getFlagImageCoordinates(guild.flag), power: 0, sectors: 0, }; @@ -345,8 +349,8 @@ let GvGProvince = { GvGProvince.ProvinceData.sectors.forEach(function (sector) { if (/*(sector.terrain == 'plain' || sector.terrain == 'beach') /*&&*/ sector.hitpoints != undefined) { - let realX = (sector.position.x - bounds.x_min) * GvGProvince.HexWidth; - let realY = (sector.position.y - bounds.y_min) * GvGProvince.HexHeight; + let realX = (sector.position.x - GvGProvince.ProvinceData.bounds.x_min) * GvGProvince.HexWidth; + let realY = (sector.position.y - GvGProvince.ProvinceData.bounds.y_min) * GvGProvince.HexHeight; let newSector = {}; if (sector.position.y % 2 == 0) { @@ -367,35 +371,53 @@ let GvGProvince = { }); GvGProvince.drawInfo(); + GvGProvince.buildGuilds(); - GvGProvince.BuildGuilds(); + let editBtn = document.getElementById("editMap"); + let dragBtn = document.getElementById("dragMap"); - GvGProvince.Map.addEventListener("mousedown", function (e) { - drag = true; - GvGProvince.setSector(e) + editBtn.addEventListener('click', function (e) { + GvGProvince.Actions.edit = true; + GvGProvince.Actions.drag = false; + dragBtn.classList.remove('btn-default-active'); + editBtn.classList.add('btn-default-active'); }, false); - GvGProvince.Map.addEventListener("mouseup", function (e) { - drag = false; - }, false); - GvGProvince.Map.addEventListener("mousemove", function (e) { + dragBtn.addEventListener('click', function (e) { + GvGProvince.Actions.edit = false; + GvGProvince.Actions.drag = true; + editBtn.classList.remove('btn-default-active'); + dragBtn.classList.add('btn-default-active'); }, false); - GvGProvince.MapDraggable(); + GvGProvince.mapDragOrEdit(); + GvGProvince.setCurrentGuild(); }, drawInfo: () => { GvGProvince.MapCTX.font = "bold 22px Arial"; GvGProvince.MapCTX.textAlign = "left"; - GvGProvince.MapCTX.fillStyle = '#ddd'; - GvGProvince.MapCTX.fillText('Map: '+GvGProvince.ProvinceData.era, 10, 25); + GvGProvince.MapCTX.fillStyle = '#ffb539'; + GvGProvince.MapCTX.fillText(GvGProvince.ProvinceData.era, 10, 25); GvGProvince.MapCTX.font = "12px Arial"; + GvGProvince.MapCTX.fillStyle = '#ccc'; GvGProvince.MapCTX.fillText('Data fetched: '+ moment(GvGProvince.MapDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); }, - MapDraggable: () => { + setCurrentGuild: () => { + $('#GvGGuilds tr').click(function (e) { + let id = $(this).attr('id').replace('id-', '')/1; + $('#GvGGuilds tr').removeClass('active'); + $(this).addClass('active'); + + GvGProvince.CurrentGuild = GvGProvince.Guilds.find(x => x.id === id); + console.log(GvGProvince.CurrentGuild); + }); + }, + + mapDragOrEdit: () => { const wrapper = document.getElementById('GvGMapWrap'); let pos = { top: 0, left: 0, x: 0, y: 0 }; - + const mouseDownHandler = function(e) { pos = { left: wrapper.scrollLeft, @@ -419,14 +441,36 @@ let GvGProvince = { document.removeEventListener('mousemove', mouseMoveHandler); document.removeEventListener('mouseup', mouseUpHandler); }; - wrapper.addEventListener('mousedown', mouseDownHandler); + + GvGProvince.Map.addEventListener('mousedown', function (e) { + if (GvGProvince.Actions.drag) { + wrapper.addEventListener('mousedown', mouseDownHandler); + } + if (GvGProvince.Actions.edit) { + wrapper.removeEventListener('mousedown', mouseDownHandler); + } + GvGProvince.setSector(e); + }, false); }, setSector: (e) => { GvGProvince.Sectors.forEach(function (sector) { if (e.offsetX >= (sector.position.x + 5) && e.offsetX <= (sector.position.x + GvGProvince.HexWidth - 5)) { if (e.offsetY >= (sector.position.y + 5) && e.offsetY <= (sector.position.y + GvGProvince.HexHeight - 5)) { - GvGProvince.ShowSector(sector); + if (GvGProvince.Actions.drag) { + GvGProvince.showSector(sector); + console.log('hi'); + } + else { + let prevOwner = sector.owner; + sector.owner = GvGProvince.CurrentGuild; + if (sector.owner.id == 0) + sector.owner.color = sector.setColorByTerrain(); + if (sector.terrain == "plain" || sector.terrain == "beach") { + sector.draw(); + } + GvGProvince.recalcGuildProvinces(prevOwner, sector.owner, sector); + } return sector; } } @@ -434,11 +478,36 @@ let GvGProvince = { return undefined; }, - ShowSector: (sector) => { + recalcGuildProvinces: (oldGuild, newGuild, sector) => { + if (oldGuild.id > 0) { + oldGuild.sectors--; + oldGuild.power -= sector.power; + } + + if (newGuild.id > 0) { + newGuild.sectors++; + newGuild.power += sector.power; + } + + GvGProvince.updateGuildData(oldGuild); + GvGProvince.updateGuildData(newGuild); + }, + + updateGuildData: (guild) => { + let tableRow = document.getElementById("id-"+guild.id); + if (tableRow != null) { + let html = ''+guild.name+''; + html += ''+guild.sectors+''; + html += ''+guild.power+''; + tableRow.innerHTML = html; + } + }, + + showSector: (sector) => { let html = ''; if (sector.owner.name != undefined) { html = '
' - html += ''; + html += ''; html += ''+ sector.owner.name +'
'; html += 'Hitpoints: '+ sector.hitpoints +'/80
'; html += 'Coords: '+ sector.coords() +'
'; @@ -453,7 +522,7 @@ let GvGProvince = { document.getElementById("GvGMapInfo").innerHTML = html; }, - BuildGuilds: () => { + buildGuilds: () => { let t = []; GvGProvince.Guilds.sort(function(a, b) { @@ -464,15 +533,15 @@ let GvGProvince = { return 0; }); - t.push(''); + t.push('
'); t.push(''); t.push(''); t.push(''); t.push(''); t.push(''); GvGProvince.Guilds.forEach(function (guild) { - t.push(''); - t.push(''); + t.push(''); + t.push(''); t.push(''); t.push(''); t.push(''); @@ -482,7 +551,7 @@ let GvGProvince = { $('#GvGMapGuilds').html(t.join('')); }, - GetColor: (guild) => { + getColor: (guild) => { flag = guild.flag.split("_") || null; let color = {"r":255,"g":255,"b":255}; @@ -504,7 +573,7 @@ let GvGProvince = { return color; }, - FlagImageCoordinates: (flag) => { + getFlagImageCoordinates: (flag) => { let id = flag.split("_"); if (id[id.length - 1].toLowerCase() == "r" || id[id.length - 1].toLowerCase() == "g") @@ -518,7 +587,7 @@ let GvGProvince = { return {"x": (id % 10 ) * (GvGProvince.HexWidth), "y": Math.floor(id / 10) * (GvGProvince.HexHeight)}; }, - ColorStringify: (color) => { + colorToString: (color) => { return "rgb("+color.r+","+color.g+","+color.b+")"; }, } @@ -573,6 +642,9 @@ class Sector { return color; } + /** + * Draws a sector on the map + flag and HQ/status if it has an owner + */ draw() { this.drawHex(); this.drawHexText(); @@ -596,13 +668,19 @@ class Sector { } } + /** + * Redraw + */ redraw() { this.drawHex(); this.drawHexText(); } + /** + * Draws Sector hexagon in its color + */ drawHex() { - GvGProvince.MapCTX.fillStyle = GvGProvince.ColorStringify(this.owner.color); + GvGProvince.MapCTX.fillStyle = GvGProvince.colorToString(this.owner.color); GvGProvince.MapCTX.beginPath(); GvGProvince.MapCTX.moveTo(this.position.x + GvGProvince.HexWidth / 2, this.position.y); GvGProvince.MapCTX.lineTo(this.position.x + GvGProvince.HexWidth, this.position.y + GvGProvince.HexHeight * 0.25); @@ -616,6 +694,9 @@ class Sector { GvGProvince.MapCTX.stroke(); } + /** + * Draws Sector coordinates (and power) + */ drawHexText() { GvGProvince.MapCTX.font = "9px Arial"; GvGProvince.MapCTX.textAlign = "center"; @@ -625,6 +706,9 @@ class Sector { GvGProvince.MapCTX.fillText(this.power, this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.3); } + /** + * Returns Sectors coordinates (with ~ if beach) + */ coords() { if (this.terrain == "beach") return "~"+this.coordinates.x + ", " + this.coordinates.y+"~"; From 5b263d40ea03870997d25d98da5b9287d88efdc5 Mon Sep 17 00:00:00 2001 From: outoftheline Date: Sat, 15 May 2021 22:18:53 +0200 Subject: [PATCH 06/11] GvG Map Zoom --- js/web/gvg/css/gvg.css | 2 +- js/web/gvg/js/gvg.js | 254 ++++++++++++++++++++++++----------------- 2 files changed, 150 insertions(+), 106 deletions(-) diff --git a/js/web/gvg/css/gvg.css b/js/web/gvg/css/gvg.css index d0ef47f02..926a27bc3 100644 --- a/js/web/gvg/css/gvg.css +++ b/js/web/gvg/css/gvg.css @@ -108,7 +108,7 @@ left: 10px; border-radius: 4px; padding: 5px; - border: 1px solid var(--text-bright); + border: 1px solid var(--text-dark); background-color: #210b02; width: 200px; font-size: 90%; diff --git a/js/web/gvg/js/gvg.js b/js/web/gvg/js/gvg.js index f606c867f..9e183d03d 100644 --- a/js/web/gvg/js/gvg.js +++ b/js/web/gvg/js/gvg.js @@ -31,8 +31,12 @@ FoEproxy.addHandler('ClanBattleService', 'getContinent', (data, postData) => { }); FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) => { - GvGProvince.MapData = data['responseData']; - GvGProvince.MapDataTime = MainParser.getCurrentDateTime(); + GvGMap.MapData = data['responseData']; + GvGMap.MapDataTime = MainParser.getCurrentDateTime(); +}); + +FoEproxy.addWsHandler('ClanBattleService', 'changeProvince', (data, postData) => { + console.log(data['responseData']); }); FoEproxy.addHandler('AnnouncementsService', 'fetchAllAnnouncements', (data, postData) => { @@ -86,7 +90,7 @@ let GvG = { html: true } ) - .append(''); + .append(''); }); } else { @@ -186,11 +190,11 @@ let GvG = { } } -let GvGProvince = { +let GvGMap = { - Map: {}, MapData: {}, MapDataTime: 0, + Map: {}, MapCTX: {}, Actions: { @@ -279,10 +283,26 @@ let GvGProvince = { CurrentGuild: {"color": {"r":240,"g":240,"b":240}}, NoGuild: {"color": {"r":240,"g":240,"b":240}}, + initMap: (hexWidth, hexHeight) => { + GvGMap.Map = document.getElementById("gvg-map"); + GvGMap.MapCTX = GvGMap.Map.getContext('2d'); + GvGMap.Guilds = []; + GvGMap.Sectors = []; + GvGMap.ProvinceData = GvGMap.MapData.province_detailed; + GvGMap.GuildData = GvGMap.MapData.province_detailed.clans; + GvGMap.PowerValues = GvGMap.MapData.province_detailed.power_values; + GvGMap.Size = 'small'; + GvGMap.HexWidth = hexWidth; + GvGMap.HexHeight = hexHeight; + GvGMap.Width = (GvGMap.ProvinceData.bounds.x_max - GvGMap.ProvinceData.bounds.x_min)*GvGMap.HexWidth+GvGMap.HexWidth/2; + GvGMap.Height = (GvGMap.ProvinceData.bounds.y_max - GvGMap.ProvinceData.bounds.y_min)*GvGMap.HexHeight*0.8; + GvGMap.CurrentGuild = { id: 0 }; + }, + /** * Build GvG Map */ - showGvgMap: () => { + showMap: () => { if ($('#gvg-map').length == 0) { moment.locale(MainParser.Language); @@ -296,70 +316,68 @@ let GvGProvince = { resize: true }); - GvGProvince.buildMap(); + GvGMap.buildMap(); } }, /** * Hide HUD */ - hideGvgMap: () => { + hideMap: () => { if ($('#GvGMap').length > 0) { $('#GvGMap').remove(); $('#gvg-map').remove(); } }, - buildMap: () => { - + buildMap: (mapSize = 'small') => { let h = []; - h.push('
EditDrag
'); + h.push('
EditZoomDrag
'); $('#GvGMapBody').html(h.join('')); - GvGProvince.Map = document.getElementById("gvg-map"); - GvGProvince.MapCTX = GvGProvince.Map.getContext('2d'); - GvGProvince.Guilds = []; - GvGProvince.Sectors = []; - GvGProvince.ProvinceData = GvGProvince.MapData.province_detailed; - GvGProvince.GuildData = GvGProvince.MapData.province_detailed.clans; - GvGProvince.PowerValues = GvGProvince.MapData.province_detailed.power_values; - GvGProvince.Width = (GvGProvince.ProvinceData.bounds.x_max - GvGProvince.ProvinceData.bounds.x_min)*GvGProvince.HexWidth+GvGProvince.HexWidth/2; - GvGProvince.Height = (GvGProvince.ProvinceData.bounds.y_max - GvGProvince.ProvinceData.bounds.y_min)*GvGProvince.HexHeight*0.8; - - $(GvGProvince.Map).attr({ + // reset all data to default; + if (mapSize != 'small') { + GvGMap.initMap(90,72); + GvGMap.Size = 'big'; + } + else { + GvGMap.initMap(50,40); + } + + $(GvGMap.Map).attr({ 'id': 'gvg-map', - 'width': GvGProvince.Width, - 'height': GvGProvince.Height + 'width': GvGMap.Width, + 'height': GvGMap.Height }); - GvGProvince.MapCTX.clearRect(0, 0, GvGProvince.Width, GvGProvince.Height); + GvGMap.MapCTX.clearRect(0, 0, GvGMap.Width, GvGMap.Height); - GvGProvince.GuildData.forEach(function (guild) { + GvGMap.GuildData.forEach(function (guild) { let guildOnMap = { id: guild.id, name: guild.name, flag: guild.flag, - color: GvGProvince.getColor(guild), - flagCoordinates: GvGProvince.getFlagImageCoordinates(guild.flag), + color: GvGMap.getColor(guild), + flagCoordinates: GvGMap.getFlagImageCoordinates(guild.flag), power: 0, sectors: 0, }; - GvGProvince.Guilds.push(guildOnMap); + GvGMap.Guilds.push(guildOnMap); }); - GvGProvince.ProvinceData.sectors.forEach(function (sector) { - if (/*(sector.terrain == 'plain' || sector.terrain == 'beach') /*&&*/ sector.hitpoints != undefined) { - let realX = (sector.position.x - GvGProvince.ProvinceData.bounds.x_min) * GvGProvince.HexWidth; - let realY = (sector.position.y - GvGProvince.ProvinceData.bounds.y_min) * GvGProvince.HexHeight; + GvGMap.ProvinceData.sectors.forEach(function (sector) { + if (sector.hitpoints != undefined) { + let realX = (sector.position.x - GvGMap.ProvinceData.bounds.x_min) * GvGMap.HexWidth; + let realY = (sector.position.y - GvGMap.ProvinceData.bounds.y_min) * GvGMap.HexHeight; let newSector = {}; if (sector.position.y % 2 == 0) { newSector = new Sector(realX, realY * 0.75, sector); } else { - newSector = new Sector(realX + (GvGProvince.HexWidth * 0.5), realY * 0.75, sector); + newSector = new Sector(realX + (GvGMap.HexWidth * 0.5), realY * 0.75, sector); } - GvGProvince.Sectors.push(newSector); + GvGMap.Sectors.push(newSector); let guild = newSector.findOwnerById(newSector.owner.id); if (guild != undefined) { @@ -370,37 +388,45 @@ let GvGProvince = { } }); - GvGProvince.drawInfo(); - GvGProvince.buildGuilds(); + GvGMap.drawInfo(); + GvGMap.buildGuilds(); let editBtn = document.getElementById("editMap"); let dragBtn = document.getElementById("dragMap"); + let zoomBtn = document.getElementById("zoomMap"); editBtn.addEventListener('click', function (e) { - GvGProvince.Actions.edit = true; - GvGProvince.Actions.drag = false; + GvGMap.Actions.edit = true; + GvGMap.Actions.drag = false; dragBtn.classList.remove('btn-default-active'); editBtn.classList.add('btn-default-active'); + GvGMap.buildMap('big'); }, false); dragBtn.addEventListener('click', function (e) { - GvGProvince.Actions.edit = false; - GvGProvince.Actions.drag = true; + GvGMap.Actions.edit = false; + GvGMap.Actions.drag = true; editBtn.classList.remove('btn-default-active'); dragBtn.classList.add('btn-default-active'); }, false); + zoomBtn.addEventListener('click', function (e) { + if (GvGMap.Size == 'small') + GvGMap.buildMap('big'); + else + GvGMap.buildMap(); + }, false); - GvGProvince.mapDragOrEdit(); - GvGProvince.setCurrentGuild(); + GvGMap.mapDragOrEdit(); + GvGMap.setCurrentGuild(); }, drawInfo: () => { - GvGProvince.MapCTX.font = "bold 22px Arial"; - GvGProvince.MapCTX.textAlign = "left"; - GvGProvince.MapCTX.fillStyle = '#ffb539'; - GvGProvince.MapCTX.fillText(GvGProvince.ProvinceData.era, 10, 25); - GvGProvince.MapCTX.font = "12px Arial"; - GvGProvince.MapCTX.fillStyle = '#ccc'; - GvGProvince.MapCTX.fillText('Data fetched: '+ moment(GvGProvince.MapDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); + GvGMap.MapCTX.font = "bold 22px Arial"; + GvGMap.MapCTX.textAlign = "left"; + GvGMap.MapCTX.fillStyle = '#ffb539'; + GvGMap.MapCTX.fillText(GvGMap.ProvinceData.era, 10, 25); + GvGMap.MapCTX.font = "12px Arial"; + GvGMap.MapCTX.fillStyle = '#ccc'; + GvGMap.MapCTX.fillText('Data fetched: '+ moment(GvGMap.MapDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); }, setCurrentGuild: () => { @@ -409,8 +435,7 @@ let GvGProvince = { $('#GvGGuilds tr').removeClass('active'); $(this).addClass('active'); - GvGProvince.CurrentGuild = GvGProvince.Guilds.find(x => x.id === id); - console.log(GvGProvince.CurrentGuild); + GvGMap.CurrentGuild = GvGMap.Guilds.find(x => x.id === id); }); }, @@ -442,34 +467,33 @@ let GvGProvince = { document.removeEventListener('mouseup', mouseUpHandler); }; - GvGProvince.Map.addEventListener('mousedown', function (e) { - if (GvGProvince.Actions.drag) { + GvGMap.Map.addEventListener('mousedown', function (e) { + if (GvGMap.Actions.drag) { wrapper.addEventListener('mousedown', mouseDownHandler); } - if (GvGProvince.Actions.edit) { + if (GvGMap.Actions.edit) { wrapper.removeEventListener('mousedown', mouseDownHandler); } - GvGProvince.setSector(e); + GvGMap.setSector(e); }, false); }, setSector: (e) => { - GvGProvince.Sectors.forEach(function (sector) { - if (e.offsetX >= (sector.position.x + 5) && e.offsetX <= (sector.position.x + GvGProvince.HexWidth - 5)) { - if (e.offsetY >= (sector.position.y + 5) && e.offsetY <= (sector.position.y + GvGProvince.HexHeight - 5)) { - if (GvGProvince.Actions.drag) { - GvGProvince.showSector(sector); - console.log('hi'); + GvGMap.Sectors.forEach(function (sector) { + if (e.offsetX >= (sector.position.x + 5) && e.offsetX <= (sector.position.x + GvGMap.HexWidth - 5)) { + if (e.offsetY >= (sector.position.y + 5) && e.offsetY <= (sector.position.y + GvGMap.HexHeight - 5)) { + if (GvGMap.Actions.drag) { + GvGMap.showSector(sector); } else { let prevOwner = sector.owner; - sector.owner = GvGProvince.CurrentGuild; + sector.owner = GvGMap.CurrentGuild; if (sector.owner.id == 0) sector.owner.color = sector.setColorByTerrain(); if (sector.terrain == "plain" || sector.terrain == "beach") { sector.draw(); } - GvGProvince.recalcGuildProvinces(prevOwner, sector.owner, sector); + GvGMap.recalcGuildProvinces(prevOwner, sector.owner, sector); } return sector; } @@ -489,14 +513,14 @@ let GvGProvince = { newGuild.power += sector.power; } - GvGProvince.updateGuildData(oldGuild); - GvGProvince.updateGuildData(newGuild); + GvGMap.updateGuildData(oldGuild); + GvGMap.updateGuildData(newGuild); }, updateGuildData: (guild) => { let tableRow = document.getElementById("id-"+guild.id); if (tableRow != null) { - let html = '
'; + let html = ''; html += ''; html += ''; tableRow.innerHTML = html; @@ -507,16 +531,16 @@ let GvGProvince = { let html = ''; if (sector.owner.name != undefined) { html = '
' - html += ''; + html += ''; html += ''+ sector.owner.name +'
'; + if (sector.underSiege()) + html += 'Under Siege by: '+ sector.underSiege() +'
'; html += 'Hitpoints: '+ sector.hitpoints +'/80
'; html += 'Coords: '+ sector.coords() +'
'; html += 'Power: '+ sector.power +'
'; if (sector.isProtected) html += 'Sector is protected
'; html += 'Terrain: '+ sector.terrain +'
'; - if (sector.underSiege()) - html += 'Under Siege by: '+ sector.underSiege() +'
'; html += '
'; } document.getElementById("GvGMapInfo").innerHTML = html; @@ -525,7 +549,7 @@ let GvGProvince = { buildGuilds: () => { let t = []; - GvGProvince.Guilds.sort(function(a, b) { + GvGMap.Guilds.sort(function(a, b) { if (a.power > b.power) return -1; if (a.power < b.power) @@ -539,9 +563,9 @@ let GvGProvince = { t.push(''); t.push(''); t.push(''); - GvGProvince.Guilds.forEach(function (guild) { + GvGMap.Guilds.forEach(function (guild) { t.push(''); - t.push(''); + t.push(''); t.push(''); t.push(''); t.push(''); @@ -557,16 +581,16 @@ let GvGProvince = { if (flag != null) { if (flag[0].search("premium") >= 0) { - color = GvGProvince.Colors.premium[flag[flag.length-1]-1]; + color = GvGMap.Colors.premium[flag[flag.length-1]-1]; } else if (flag[flag.length - 1].toLowerCase() == "r") { - color = GvGProvince.Colors.r[Math.round(guild.id/13)%13]; + color = GvGMap.Colors.r[Math.round(guild.id/13)%13]; } else if (flag[flag.length - 1].toLowerCase() == "g") - color = GvGProvince.Colors.g[Math.round(guild.id/13)%13]; + color = GvGMap.Colors.g[Math.round(guild.id/13)%13]; else if (flag.length != 1) - color = GvGProvince.Colors.b[Math.round(guild.id/13)%13]; + color = GvGMap.Colors.b[Math.round(guild.id/13)%13]; } @@ -584,7 +608,7 @@ let GvGProvince = { if (flag.search("premium") >= 0) id += 40; - return {"x": (id % 10 ) * (GvGProvince.HexWidth), "y": Math.floor(id / 10) * (GvGProvince.HexHeight)}; + return {"x": (id % 10 ) * (GvGMap.HexWidth), "y": Math.floor(id / 10) * (GvGMap.HexHeight)}; }, colorToString: (color) => { @@ -594,6 +618,7 @@ let GvGProvince = { class Sector { constructor(x, y, info) { + this.id = info.sector_id; this.position = { "x": x, "y": y @@ -602,7 +627,7 @@ class Sector { "x": info.position.x, "y": info.position.y }; - this.power = parseInt(GvGProvince.PowerValues[info.power]) || GvGProvince.PowerValues[0]; + this.power = parseInt(GvGMap.PowerValues[info.power]) || GvGMap.PowerValues[0]; this.powerMultiplicator = parseInt(info.power)+1 || 1; this.isProtected = info.is_protected; this.terrain = info.terrain; @@ -615,13 +640,13 @@ class Sector { } findOwnerById(id) { - let guild = GvGProvince.Guilds.find(x => x.id === id); + let guild = GvGMap.Guilds.find(x => x.id === id); return guild; } underSiege() { if (this.siege.clan != 0) - return GvGProvince.Guilds.find(x => x.id === this.siege.clan).name; + return GvGMap.Guilds.find(x => x.id === this.siege.clan).name; return false; } @@ -650,20 +675,38 @@ class Sector { this.drawHexText(); if (this.owner.id > 0) { let flag = this.owner.flagCoordinates; + let imgPositions = { + hqX: 450, + hqY: 200, + shieldX: 400, + shieldY: 200 + } let img = new Image(); img.src = 'https://tools.kingshood.de/gvg/img/flags_small.png'; + if (GvGMap.Size != 'small') { + img.src = 'https://tools.kingshood.de/gvg/img/flags_medium.png'; + imgPositions = { + hqX: 900*0.9, + hqY: 400*0.9, + shieldX: 800*0.9, + shieldY: 400*0.9 + } + } let sector = this; img.onload = function () { - if (sector.headquarter) - GvGProvince.MapCTX.drawImage(img, 450, 200, GvGProvince.HexWidth, GvGProvince.HexHeight, sector.position.x, sector.position.y, GvGProvince.HexWidth, GvGProvince.HexHeight); + GvGMap.MapCTX.drawImage(img, imgPositions.hqX, imgPositions.hqY, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y, GvGMap.HexWidth, GvGMap.HexHeight); if (sector.isProtected) - GvGProvince.MapCTX.drawImage(img, 400, 200, GvGProvince.HexWidth, GvGProvince.HexHeight, sector.position.x, sector.position.y, GvGProvince.HexWidth, GvGProvince.HexHeight); - - GvGProvince.MapCTX.drawImage(img, flag.x, flag.y, GvGProvince.HexWidth, GvGProvince.HexHeight, sector.position.x, sector.position.y-5, GvGProvince.HexWidth, GvGProvince.HexHeight); + GvGMap.MapCTX.drawImage(img, imgPositions.shieldX, imgPositions.shieldY, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y, GvGMap.HexWidth, GvGMap.HexHeight); + if (GvGMap.Size != 'small') { + GvGMap.MapCTX.drawImage(img, flag.x, flag.y, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y, GvGMap.HexWidth, GvGMap.HexHeight); + } + else { + GvGMap.MapCTX.drawImage(img, flag.x, flag.y, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y-5, GvGMap.HexWidth, GvGMap.HexHeight); + } } } } @@ -680,30 +723,32 @@ class Sector { * Draws Sector hexagon in its color */ drawHex() { - GvGProvince.MapCTX.fillStyle = GvGProvince.colorToString(this.owner.color); - GvGProvince.MapCTX.beginPath(); - GvGProvince.MapCTX.moveTo(this.position.x + GvGProvince.HexWidth / 2, this.position.y); - GvGProvince.MapCTX.lineTo(this.position.x + GvGProvince.HexWidth, this.position.y + GvGProvince.HexHeight * 0.25); - GvGProvince.MapCTX.lineTo(this.position.x + GvGProvince.HexWidth, this.position.y + GvGProvince.HexHeight * 0.75); - GvGProvince.MapCTX.lineTo(this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight); - GvGProvince.MapCTX.lineTo(this.position.x, this.position.y + GvGProvince.HexHeight * 0.75); - GvGProvince.MapCTX.lineTo(this.position.x, this.position.y + GvGProvince.HexHeight * 0.25); - GvGProvince.MapCTX.closePath(); - GvGProvince.MapCTX.fill(); - GvGProvince.MapCTX.strokeStyle = "rgba(0,0,0,0.2)"; - GvGProvince.MapCTX.stroke(); + GvGMap.MapCTX.fillStyle = GvGMap.colorToString(this.owner.color); + GvGMap.MapCTX.beginPath(); + GvGMap.MapCTX.moveTo(this.position.x + GvGMap.HexWidth / 2, this.position.y); + GvGMap.MapCTX.lineTo(this.position.x + GvGMap.HexWidth, this.position.y + GvGMap.HexHeight * 0.25); + GvGMap.MapCTX.lineTo(this.position.x + GvGMap.HexWidth, this.position.y + GvGMap.HexHeight * 0.75); + GvGMap.MapCTX.lineTo(this.position.x + GvGMap.HexWidth / 2, this.position.y + GvGMap.HexHeight); + GvGMap.MapCTX.lineTo(this.position.x, this.position.y + GvGMap.HexHeight * 0.75); + GvGMap.MapCTX.lineTo(this.position.x, this.position.y + GvGMap.HexHeight * 0.25); + GvGMap.MapCTX.closePath(); + GvGMap.MapCTX.fill(); + GvGMap.MapCTX.strokeStyle = "rgba(0,0,0,0.2)"; + GvGMap.MapCTX.stroke(); } /** * Draws Sector coordinates (and power) */ drawHexText() { - GvGProvince.MapCTX.font = "9px Arial"; - GvGProvince.MapCTX.textAlign = "center"; - GvGProvince.MapCTX.fillStyle = ((this.owner.color.r+this.owner.color.g+this.owner.color.b) < 420) ? '#ddd' : '#222'; - GvGProvince.MapCTX.fillText(this.coords(), this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.8); - if (this.owner.id == 0 && this.terrain != "water" && this.terrain != "rocks") - GvGProvince.MapCTX.fillText(this.power, this.position.x + GvGProvince.HexWidth / 2, this.position.y + GvGProvince.HexHeight * 0.3); + GvGMap.MapCTX.font = "9px Arial"; + if (GvGMap.Size == 'big') + GvGMap.MapCTX.font = "12px Arial"; + GvGMap.MapCTX.textAlign = "center"; + GvGMap.MapCTX.fillStyle = ((this.owner.color.r+this.owner.color.g+this.owner.color.b) < 300) ? '#ddd' : '#222'; + GvGMap.MapCTX.fillText(this.coords(), this.position.x + GvGMap.HexWidth / 2, this.position.y + GvGMap.HexHeight * 0.85); + if (GvGMap.Size == 'big' && this.terrain != "water" && this.terrain != "rocks") + GvGMap.MapCTX.fillText(this.power, this.position.x + GvGMap.HexWidth / 2, this.position.y + GvGMap.HexHeight * 0.25); } /** @@ -712,7 +757,6 @@ class Sector { coords() { if (this.terrain == "beach") return "~"+this.coordinates.x + ", " + this.coordinates.y+"~"; - GvGProvince.MapCTX.font = "bold 10px Arial"; if (this.terrain == "plain") return this.coordinates.x + ", " + this.coordinates.y; return ""; From fcf8a205bf815b99883755b42bcfc79bc88badfe Mon Sep 17 00:00:00 2001 From: outoftheline Date: Sat, 15 May 2021 22:27:59 +0200 Subject: [PATCH 07/11] GvG Map Bugfix --- js/web/gvg/js/gvg.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/web/gvg/js/gvg.js b/js/web/gvg/js/gvg.js index 9e183d03d..f8c27c0a2 100644 --- a/js/web/gvg/js/gvg.js +++ b/js/web/gvg/js/gvg.js @@ -400,7 +400,6 @@ let GvGMap = { GvGMap.Actions.drag = false; dragBtn.classList.remove('btn-default-active'); editBtn.classList.add('btn-default-active'); - GvGMap.buildMap('big'); }, false); dragBtn.addEventListener('click', function (e) { GvGMap.Actions.edit = false; From bc3c52cc678479e2718712e1e348283a7bb7f250 Mon Sep 17 00:00:00 2001 From: outoftheline Date: Sat, 15 May 2021 22:41:37 +0200 Subject: [PATCH 08/11] GvG Test Code ausgebaut --- js/web/gvg/js/gvg.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/web/gvg/js/gvg.js b/js/web/gvg/js/gvg.js index f8c27c0a2..b44e8175c 100644 --- a/js/web/gvg/js/gvg.js +++ b/js/web/gvg/js/gvg.js @@ -35,9 +35,9 @@ FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) GvGMap.MapDataTime = MainParser.getCurrentDateTime(); }); -FoEproxy.addWsHandler('ClanBattleService', 'changeProvince', (data, postData) => { +/*FoEproxy.addWsHandler('ClanBattleService', 'changeProvince', (data, postData) => { console.log(data['responseData']); -}); +});*/ FoEproxy.addHandler('AnnouncementsService', 'fetchAllAnnouncements', (data, postData) => { GvG.HideGvgHud(); From a8e1c08eee1732b24fd86539d77e3b12da85150a Mon Sep 17 00:00:00 2001 From: Daniel Voigt Date: Sun, 16 May 2021 16:37:27 +0200 Subject: [PATCH 09/11] min-width for last column --- js/web/investment/css/investment.css | 1 + 1 file changed, 1 insertion(+) diff --git a/js/web/investment/css/investment.css b/js/web/investment/css/investment.css index bbb93cee7..31995a4f0 100644 --- a/js/web/investment/css/investment.css +++ b/js/web/investment/css/investment.css @@ -83,6 +83,7 @@ background-size: 20px 20px; background-position: center right; background-repeat: no-repeat; + min-width: 4px; } #InvestmentBody table tbody tr.fphistory.open td:last-child { From 7e4cae7df500329e081df779d272ab5b15181a0a Mon Sep 17 00:00:00 2001 From: Julian2424 <50926918+Julian2424@users.noreply.github.com> Date: Sun, 16 May 2021 23:00:51 +0200 Subject: [PATCH 10/11] mainly added incident stats (#2014) * incident stats and more incident stats preparations for aid stats changed info fields opacity to full * Update indexdb.js * (half)added aid statistics * seperated shard rewards * fixed some images goods icon was missing each good was strangely implemented. Used CDN assets for all * moved quest abort counter up to make it easier to read the current guild expedition level * Update indexdb.js * removed aidstats * Update de.json * Update en.json * Update boxes.css * Update stats.js * Update stats.js * fixed league rewards league rewards are now split from incidents in fp collector and stats * updated translations --- css/web/boxes.css | 6 +- js/web/_i18n/de.json | 9 ++- js/web/_i18n/en.json | 9 ++- js/web/fp-collector/js/fp-collector.js | 5 +- js/web/quests/css/quests.css | 2 +- js/web/stats/js/stats.js | 100 +++++++++++++++---------- 6 files changed, 84 insertions(+), 47 deletions(-) diff --git a/css/web/boxes.css b/css/web/boxes.css index 9926596d4..d159ffbaf 100644 --- a/css/web/boxes.css +++ b/css/web/boxes.css @@ -1126,8 +1126,8 @@ FP-Bar */ } .tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); + opacity: 1; + filter: alpha(opacity=100); } .tooltip.top { @@ -1505,4 +1505,4 @@ SettingsBox */ color: var(--text-normal); text-shadow: 0 1px 1px var(--black-65); user-select: none; -} \ No newline at end of file +} diff --git a/js/web/_i18n/de.json b/js/web/_i18n/de.json index 75483e464..69ef53660 100644 --- a/js/web/_i18n/de.json +++ b/js/web/_i18n/de.json @@ -161,6 +161,8 @@ "Boxes.FPCollector.Where": "Wo?", "Boxes.FPCollector.Who": "Wer?", "Boxes.FPCollector.antiquesDealer": "Antiquitätenhändler", + "Boxes.FPCollector.archeologyEvent": "Archäologie-Event-Vase", + "Boxes.FPCollector.archeologyEventAutoCollect": "Archäologie-Event-Vase", "Boxes.FPCollector.battlegrounds_conquest": "Gefechts-Belohnung", "Boxes.FPCollector.chest": "Begegnungsbelohnung", "Boxes.FPCollector.chestEvent": "Event Belohnung", @@ -171,6 +173,7 @@ "Boxes.FPCollector.double_collection": "x2 durch Blaue Galaxie", "Boxes.FPCollector.guildExpedition": "Relikt", "Boxes.FPCollector.hiddenReward": "Ereignis", + "Boxes.FPCollector.leagueReward": "Liga-Belohnung", "Boxes.FPCollector.pickupProduction": "Gebäude Ernte", "Boxes.FPCollector.plunderReward": "Plünder Belohnung", "Boxes.FPCollector.reward_calender": "Winterevent - Kalender", @@ -590,13 +593,17 @@ "Boxes.Stats.PeriodTitle.today": "Heute gesammelt", "Boxes.Stats.Rewards.Source.__event": "Event", "Boxes.Stats.Rewards.Source.battlegrounds_conquest": "Gildengefechte", - "Boxes.Stats.Rewards.Source.diplomaticGifts": "Diplomatische Geschenke", + "Boxes.Stats.Rewards.Source.default": "Ereignisse", + "Boxes.Stats.Rewards.Source.diplomaticGifts": "Dipl. Geschenke", "Boxes.Stats.Rewards.Source.guildExpedition": "GEX", + "Boxes.Stats.Rewards.Source.shards": "Scherben", "Boxes.Stats.Rewards.Source.spoilsOfWar": "Kriegsbeute", "Boxes.Stats.Rewards.SourceTitle.__event": "Eventbelohnungen", "Boxes.Stats.Rewards.SourceTitle.battlegrounds_conquest": "Belohnungen von den Gildengefechten", + "Boxes.Stats.Rewards.SourceTitle.default": "Belohnungen aus Ereignissen", "Boxes.Stats.Rewards.SourceTitle.diplomaticGifts": "Vom Weltfraumfrachter gesammelte diplomatische Geschenke", "Boxes.Stats.Rewards.SourceTitle.guildExpedition": "Belohnungen von der Gildenexpedition, die vom Relikttempel erzeugt wurden", + "Boxes.Stats.Rewards.SourceTitle.shards": "Mysteriöse Scherben von der Fliegenden Insel", "Boxes.Stats.Rewards.SourceTitle.spoilsOfWar": "Kriegsbeute durch die Burg Himeji", "Boxes.Stats.SourceTitle.statsGBGPlayers": "Punktestände der Spieler der Gildengefechte", "Boxes.Stats.SourceTitle.statsRewards": "Deine Belohnungen der Burg Himej, Relikttempel und Gildengefechten", diff --git a/js/web/_i18n/en.json b/js/web/_i18n/en.json index e492485d6..c2c0d04b3 100644 --- a/js/web/_i18n/en.json +++ b/js/web/_i18n/en.json @@ -161,6 +161,8 @@ "Boxes.FPCollector.Where": "Where?", "Boxes.FPCollector.Who": "Who?", "Boxes.FPCollector.antiquesDealer": "Antiques Dealer", + "Boxes.FPCollector.archeologyEvent": "Archeology Event vase", + "Boxes.FPCollector.archeologyEventAutoCollect": "Archeology Event vase", "Boxes.FPCollector.battlegrounds_conquest": "GBG (after negotiation or fight)", "Boxes.FPCollector.chest": "GE reward", "Boxes.FPCollector.chestEvent": "Event Reward", @@ -170,7 +172,8 @@ "Boxes.FPCollector.diplomaticGifts": "Diplomatic Gift", "Boxes.FPCollector.double_collection": "Blue Galaxy (x2)", "Boxes.FPCollector.guildExpedition": "GE Relic", - "Boxes.FPCollector.hiddenReward": "Hidden Reward / Event Reward Chest", + "Boxes.FPCollector.hiddenReward": "Hidden Reward", + "Boxes.FPCollector.leagueReward": "League Reward", "Boxes.FPCollector.pickupProduction": "Town Building Collection", "Boxes.FPCollector.plunderReward": "Plunder Reward", "Boxes.FPCollector.reward_calendar": "Event - Calendar", @@ -582,14 +585,18 @@ "Boxes.Stats.PeriodTitle.thisMonth": "Collected this month", "Boxes.Stats.PeriodTitle.today": "Collected Today", "Boxes.Stats.Rewards.Source.__event": "Event", + "Boxes.Stats.Rewards.Source.default": "Incidents", "Boxes.Stats.Rewards.Source.battlegrounds_conquest": "GBG", "Boxes.Stats.Rewards.Source.diplomaticGifts": "Diplomatic Gifts", "Boxes.Stats.Rewards.Source.guildExpedition": "GE", + "Boxes.Stats.Rewards.Source.shards": "Shards", "Boxes.Stats.Rewards.Source.spoilsOfWar": "Spoils of War", "Boxes.Stats.Rewards.SourceTitle.__event": "Rewards from Seasonal or Special Events", "Boxes.Stats.Rewards.SourceTitle.battlegrounds_conquest": "GBG Rewards", + "Boxes.Stats.Rewards.SourceTitle.default": "Rewards from incidents", "Boxes.Stats.Rewards.SourceTitle.diplomaticGifts": "Diplomatic Gifts (Space Carrier)", "Boxes.Stats.Rewards.SourceTitle.guildExpedition": "GE Relic Rewards (Temple of Relic)", + "Boxes.Stats.Rewards.SourceTitle.shards": "Mysterious Shards (Flying Island)", "Boxes.Stats.Rewards.SourceTitle.spoilsOfWar": "Spoils of War Rewards (Himeji Castle)", "Boxes.Stats.SourceTitle.statsGBGPlayers": "GBG Players' Scoreboard", "Boxes.Stats.SourceTitle.statsRewards": "Your Rewards from Himeji Castle, Temple of Relics, Guild Battleground", diff --git a/js/web/fp-collector/js/fp-collector.js b/js/web/fp-collector/js/fp-collector.js index 3a667161f..e4e599116 100644 --- a/js/web/fp-collector/js/fp-collector.js +++ b/js/web/fp-collector/js/fp-collector.js @@ -24,10 +24,13 @@ FoEproxy.addHandler('RewardService', 'collectReward', (data, postData) => { return; } - // default is hiddenreward + // default is hiddenreward or leaguereward else if(event === 'default') { event = 'hiddenReward'; + if(postData[0].requestMethod === 'useItem'){ + event = 'leagueReward'; + } } StrategyPoints.insertIntoDB({ diff --git a/js/web/quests/css/quests.css b/js/web/quests/css/quests.css index b8bb002da..47542560f 100644 --- a/js/web/quests/css/quests.css +++ b/js/web/quests/css/quests.css @@ -16,7 +16,7 @@ left: 0; z-index: 750; width: 43px; - top: 65px; + top: 40px; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; font-size: 0.75rem; diff --git a/js/web/stats/js/stats.js b/js/web/stats/js/stats.js index 5f970ae9c..5fb8f7eb9 100644 --- a/js/web/stats/js/stats.js +++ b/js/web/stats/js/stats.js @@ -23,6 +23,16 @@ FoEproxy.addHandler('GuildBattlegroundStateService', 'getState', async (data, po Stats.HandlePlayerLeaderboard(data.responseData['playerLeaderboardEntries']); } }); +//Currently in Outpost +var isCurrentlyInOutpost = 0; +FoEproxy.addHandler('CityMapService', 'getCityMap', async (data, postData) => { + if (data.responseData['gridId'] === 'cultural_outpost') { + isCurrentlyInOutpost=1; + } +}); +FoEproxy.addHandler('CityMapService', 'getEntities', async (data, postData) => { + isCurrentlyInOutpost=0; +}); // Reward log FoEproxy.addHandler('RewardService', 'collectReward', async (data, postData) => { @@ -30,16 +40,21 @@ FoEproxy.addHandler('RewardService', 'collectReward', async (data, postData) => if (!Array.isArray(r)) { return; } - const [rewards, rewardIncidentSource] = r; // pair, 1st is reward list, second source of incident, e.g spoilsOfWar - + var [rewards, rewardIncidentSource] = r; // pair, 1st is reward list, second source of incident, e.g spoilsOfWar await IndexDB.getDB(); - + for (let reward of rewards) { - // default is incident reward + if (rewardIncidentSource === 'default') { - continue; + //split flying island incidents from normal ones + if (isCurrentlyInOutpost === 1){ + rewardIncidentSource = 'shards'; + } + //split league rewards from incidents + if(postData[0].requestMethod === 'useItem'){ + continue; + } } - // Add reward info to the db if (!(await IndexDB.db.statsRewardTypes.get(reward.id))) { // Reduce amount of saved data @@ -129,7 +144,6 @@ FoEproxy.addHandler('ArmyUnitManagementService', 'getArmyInfo', async (data, pos }); }); - /** * @type {{RenderOptions: (function(): string), isSelectedUnitSources: (function(): boolean), DatePickerObj: null, applyDeltaToSeriesIfNeed: (function({series: *, [p: string]: *}): {series: *, chartType: string}), shortEraName: (function(*): (void|string|*)), Render: (function(): Promise), RenderButton: (function({name: *, isActive?: *, dataType: *, value: *, title?: *, disabled?: *}): string), updateCharts: (function(): Promise), getSelectedEras: (function(): string[]), updateOptions: Stats.updateOptions, treasureSources: [string, string, string, string], createUnitsSeries: (function(): Promise<{series, pointFormat: string, footerFormat: string}>), loadHighcharts: (function(): Promise), RemoveTable: Stats.RemoveTable, createTreasureSeries: (function(): Promise<{series, pointFormat: string, colors: *[], footerFormat: string}>), ResMap: {NoAge: [string, string, string, string, string], special: [string, string, string, string]}, RenderCheckbox: (function({name: *, isActive: *, dataType: *, value: *}): string), state: {eras: {}, showAnnotations: boolean, period: string, currentType: null, chartType: string, rewardSource: string, eraSelectOpen: boolean, source: string, isGroupByEra: boolean}, createRewardSeries: (function(): Promise<{series: {data: this, name: string}[], title: string}>), isVisitingCulturalOutpost: boolean, isSelectedGBGSources: (function(): boolean), gbgSources: [string], promisedLoadCode: (function(*=): Promise), createGBGSeries: (function(*=): Promise<{series: {data, avatarUrl: (string), name: string}[], pointFormat: string}>), createTreasureGroupByEraSeries: (function(): Promise<{series: {data, name: *}[]}>), RenderTab: (function({name: *, isActive?: *, dataType: *, value: *, title?: *, disabled?: *}): string), kilos: (function(*=): string), HandlePlayerLeaderboard: (function(*=): Promise), isSelectedTreasureSources: (function(): boolean), RenderBox: (function({name: *, isActive: *, disabled: *, dataType: *, value: *}): string), getAnnotations: (function(): Promise<{xAxisPlotLines: {color: string, dashStyle: string, width: number, value: *}[], annotations: {useHTML: boolean, labelOptions: {verticalAlign: string, backgroundColor: string, y: number, style: {fontSize: string}}, labels: {text: string, point: {xAxis: number, x: *, y: number}}[]}[]}>), updateCommonChart: (function({series: *, colors?: *, pointFormat?: *, footerFormat?: *, chartType?: *}): Promise), RenderSecondaryOptions: (function(): string), PlayableEras: string[], unitSources: [string, string], equals: (function(*=, *=): boolean), isSelectedRewardSources: (function(): boolean), Show: Stats.Show, RenderEraSwitchers: (function(): string), updateRewardCharts: Stats.updateRewardCharts, rewardSources: [string]}} */ @@ -258,34 +272,30 @@ let Stats = { Stats.state.eras = {}; Object.keys(Stats.ResMap).map(it => Stats.state.eras[it] = true); - } else - if (isChangedToMyTreasure) { - // If changed to player's treasure select 2 last eras - Stats.state.eras = {}; - Stats.state.eras = { - [Technologies.EraNames[CurrentEraID]]: true, - }; + } else if (isChangedToMyTreasure) { + // If changed to player's treasure select 2 last eras + Stats.state.eras = {}; + Stats.state.eras = { + [Technologies.EraNames[CurrentEraID]]: true, + }; + if (CurrentEraID > 2) { + Stats.state.eras[Technologies.EraNames[CurrentEraID - 1]] = true; + } - if (CurrentEraID > 2) { - Stats.state.eras[Technologies.EraNames[CurrentEraID - 1]] = true; - } + } else if (isChangedToClanTreasure) { + // If changed to treasure select all playable eras + Stats.state.eras = {}; + Stats.PlayableEras.forEach(era => Stats.state.eras[era] = true); - } else - if (isChangedToClanTreasure) { - // If changed to treasure select all playable eras - Stats.state.eras = {}; - Stats.PlayableEras.forEach(era => Stats.state.eras[era] = true); + } else if (isChangedToGBG) { + Stats.state.chartType = 'delta'; + Stats.isGG = true; - } else - if (isChangedToGBG) { - Stats.state.chartType = 'delta'; - Stats.isGG = true; + } else if (isChangedToReward) { + Stats.state.period = 'sinceTuesday'; + Stats.state.rewardSource = 'guildExpedition'; - } else - if (isChangedToReward) { - Stats.state.period = 'sinceTuesday'; - Stats.state.rewardSource = 'guildExpedition'; - } + } Stats.state.source = value || 'statsTreasurePlayerH'; break; @@ -524,11 +534,13 @@ let Stats = { //btnsPeriodSelect.push(''); const btnsRewardSelect = [ - '__event', - 'battlegrounds_conquest', // Battle ground + 'default', //incidents + '__event', //event rewards + 'battlegrounds_conquest', // Battlegrounds 'guildExpedition', // Temple of Relics 'spoilsOfWar', // Himeji Castle - 'diplomaticGifts', + 'diplomaticGifts', //Space Carrier + 'shards', //Flying Island ].map(it => Stats.RenderButton({ name: i18n('Boxes.Stats.Rewards.Source.' + it), title: i18n('Boxes.Stats.Rewards.SourceTitle.' + it), @@ -1142,17 +1154,25 @@ let Stats = { const seriesMapBySource = groupedByRewardSource[rewardSource] || {}; const serieData = Object.keys(seriesMapBySource).map(it => { const rewardInfo = (rewardTypes.find(r => r.id === it) || {name: it}); - const iconClass = rewardInfo.type === 'unit' ? `units-icon ${rewardInfo.subType}` : - rewardInfo.type === 'good' ? `goods-sprite ${rewardInfo.subType}` : ''; - // Asset image if not goods or goods sprite + const iconClass = rewardInfo.type === 'unit' ? `units-icon ${rewardInfo.subType}` : ''; + // Asset image if not unit let pointImage = ''; - if (rewardInfo.type != 'good' && rewardInfo.type != 'unit') { + if (rewardInfo.type != 'unit') { let url = ''; if ((rewardInfo.iconAssetName || rewardInfo.assembledReward && rewardInfo.assembledReward.iconAssetName)) { const icon = rewardInfo.assembledReward && rewardInfo.assembledReward.iconAssetName ? rewardInfo.assembledReward.iconAssetName : rewardInfo.iconAssetName; url = `${MainParser.InnoCDN}assets/shared/icons/reward_icons/reward_icon_${icon}.png`; - } else if (rewardInfo.type == 'building' && rewardInfo.subType) { - url = `${MainParser.InnoCDN}assets/city/buildings/${rewardInfo.subType.replace(/^(\w)_/, '$1_SS_')}.png`; + //fix for fragment missing images for buildings + if (rewardInfo.type == 'good' && rewardInfo.iconAssetName == 'random_goods' && rewardInfo.subType) { + url = `${MainParser.InnoCDN}assets/shared/icons/reward_icons/reward_icon_random_goods.png`; + } + if (rewardInfo.subType == 'fragment' && rewardInfo.subType) { + if (rewardInfo.assembledReward.type == 'building' && rewardInfo.subType){ + url = `${MainParser.InnoCDN}assets/city/buildings/${rewardInfo.assembledReward.subType.replace(/^(\w)_/, '$1_SS_')}.png`; + } + } + }else if (rewardInfo.type == 'building' && rewardInfo.subType) { + url = `${MainParser.InnoCDN}assets/city/buildings/${rewardInfo.subType.replace(/^(\w)_/, '$1_SS_')}.png`; } if (url) { pointImage = ``; From 0934eb417a5a03d1be21719d35cb0bc64dd2e110 Mon Sep 17 00:00:00 2001 From: outoftheline Date: Sun, 16 May 2021 23:08:57 +0200 Subject: [PATCH 11/11] GvG Log preparations --- css/web/boxes.css | 2 +- js/web/_i18n/de.json | 12 + js/web/_i18n/en.json | 12 + js/web/eventhandler/css/eventhandler.css | 4 - js/web/gvg/css/gvg.css | 6 +- js/web/gvg/js/gvg.js | 3712 ++++++++++++++++++++-- 6 files changed, 3532 insertions(+), 216 deletions(-) diff --git a/css/web/boxes.css b/css/web/boxes.css index 9926596d4..a0f566077 100644 --- a/css/web/boxes.css +++ b/css/web/boxes.css @@ -340,7 +340,7 @@ p { white-space: nowrap; } -.text-warning { +.text-warning, .text-bright { color: var(--text-bright); } diff --git a/js/web/_i18n/de.json b/js/web/_i18n/de.json index 75483e464..3e41950e6 100644 --- a/js/web/_i18n/de.json +++ b/js/web/_i18n/de.json @@ -283,6 +283,18 @@ "Boxes.GuildMemberStat.TotalGuildGoods": "Summe aller Güter", "Boxes.GuildMemberStat.TotalGuildPower": "Summe Gildenmacht", "Boxes.GuildMemberStat.TreasuryGoods": "Güter der Gildenkasse", + "Boxes.GvGMap.Action.Drag": "Ziehen", + "Boxes.GvGMap.Action.Edit": "Bearbeiten", + "Boxes.GvGMap.Action.Zoom": "Zoom", + "Boxes.GvGMap.Guild.Name": "Gilde", + "Boxes.GvGMap.Guild.Power": "Macht", + "Boxes.GvGMap.Guild.Sectors": "Sektoren", + "Boxes.GvGMap.Sector.Beach": "Strand", + "Boxes.GvGMap.Sector.Coords": "Koordinaten", + "Boxes.GvGMap.Sector.Hitpoints": "Lebenspunkte", + "Boxes.GvGMap.Sector.Power": "Macht", + "Boxes.GvGMap.Sector.Protected": "Sektor ist geschützt", + "Boxes.GvGMap.Title": "GvG Karte", "Boxes.HiddenRewards.Disappears": "Verschwindet", "Boxes.HiddenRewards.HelpLink": "https://foe-rechner.de/docs/2/incidents", "Boxes.HiddenRewards.NoEvents": "Keine Ereignisse vorhanden.", diff --git a/js/web/_i18n/en.json b/js/web/_i18n/en.json index e492485d6..f8bbea2a5 100644 --- a/js/web/_i18n/en.json +++ b/js/web/_i18n/en.json @@ -276,6 +276,18 @@ "Boxes.GuildMemberStat.TotalGuildGoods": "Total of all goods", "Boxes.GuildMemberStat.TotalGuildPower": "Total guild power", "Boxes.GuildMemberStat.TreasuryGoods": "Treasury Goods", + "Boxes.GvGMap.Action.Drag": "Drag", + "Boxes.GvGMap.Action.Edit": "Edit", + "Boxes.GvGMap.Action.Zoom": "Zoom", + "Boxes.GvGMap.Guild.Name": "Guild", + "Boxes.GvGMap.Guild.Power": "Power", + "Boxes.GvGMap.Guild.Sectors": "Sectors", + "Boxes.GvGMap.Sector.Beach": "Beach", + "Boxes.GvGMap.Sector.Coords": "Coords", + "Boxes.GvGMap.Sector.Hitpoints": "Hitpoints", + "Boxes.GvGMap.Sector.Power": "Power", + "Boxes.GvGMap.Sector.Protected": "Sector is protected", + "Boxes.GvGMap.Title": "GvG Map", "Boxes.HiddenRewards.Disappears": "Disappears", "Boxes.HiddenRewards.HelpLink": "https://foe-rechner.de/docs/2/incidents", "Boxes.HiddenRewards.NoEvents": "No Incidents displayed.", diff --git a/js/web/eventhandler/css/eventhandler.css b/js/web/eventhandler/css/eventhandler.css index 4885aad21..2060a71f2 100644 --- a/js/web/eventhandler/css/eventhandler.css +++ b/js/web/eventhandler/css/eventhandler.css @@ -25,10 +25,6 @@ overflow-y: auto; } -.text-bright { - color: var(--text-bright); -} - #moppelhelper .title { font-size: 115%; } diff --git a/js/web/gvg/css/gvg.css b/js/web/gvg/css/gvg.css index 926a27bc3..dd617e5d4 100644 --- a/js/web/gvg/css/gvg.css +++ b/js/web/gvg/css/gvg.css @@ -84,10 +84,10 @@ overflow: hidden; } -#GvGMapGuilds { +#gvgOptions { height: inherit; overflow: auto; - width: 320px; + width: 350px; } #GvGMapInfo { @@ -96,7 +96,7 @@ left: 0; } -#GvGMapActions{ +#GvGMapActions { position: absolute; top: 10px; right: 332px; diff --git a/js/web/gvg/js/gvg.js b/js/web/gvg/js/gvg.js index b44e8175c..c6947c1a4 100644 --- a/js/web/gvg/js/gvg.js +++ b/js/web/gvg/js/gvg.js @@ -31,12 +31,12 @@ FoEproxy.addHandler('ClanBattleService', 'getContinent', (data, postData) => { }); FoEproxy.addHandler('ClanBattleService', 'getProvinceDetailed', (data, postData) => { - GvGMap.MapData = data['responseData']; - GvGMap.MapDataTime = MainParser.getCurrentDateTime(); + GvGMap.Map.OnloadData = data['responseData']; + GvGMap.Map.OnloadDataTime = MainParser.getCurrentDateTime(); }); /*FoEproxy.addWsHandler('ClanBattleService', 'changeProvince', (data, postData) => { - console.log(data['responseData']); + GvGLog.addEntry(data.responseData); });*/ FoEproxy.addHandler('AnnouncementsService', 'fetchAllAnnouncements', (data, postData) => { @@ -165,7 +165,6 @@ let GvG = { } localStorage.setItem('GvGActions', JSON.stringify(GvG.Actions)); - console.log("setRecalc", GvG.Actions); GvG.showGvgHud(); }, @@ -191,30 +190,31 @@ let GvG = { } let GvGMap = { - - MapData: {}, - MapDataTime: 0, - Map: {}, - MapCTX: {}, + OnloadDataTime: 0, + Canvas: {}, + CanvasCTX: {}, + Map: { + OnloadData: {}, + ProvinceData: {}, + GuildData: {}, + Sectors: [], + Guilds: [], + Width: 0, + Height: 0, + HexWidth: 50, + HexHeight: 40, + Era: "", + }, + OwnGuildId: 0, Actions: { edit: false, drag: true }, - - Width: 0, - Height: 0, - HexWidth: 50, - HexHeight: 40, CurrentGuild: { id: 0 }, - - Sectors: [], - Guilds: [], PowerValues: [], - ProvinceData: {}, - GuildData: {}, Colors: { "blank": [{"r":240,"g":240,"b":240}], @@ -279,24 +279,69 @@ let GvGMap = { {"r":210,"g":150,"b":21}] }, - Era: "", - CurrentGuild: {"color": {"r":240,"g":240,"b":240}}, - NoGuild: {"color": {"r":240,"g":240,"b":240}}, + Tabs: [], + TabsContent: [], + + /** + * Merkt sich alle Tabs + * + * @param id + */ + SetTabs: (id)=> { + GvGMap.Tabs.push('
  •  
  • '); + }, + + /** + * Gibt alle gemerkten Tabs aus + * + * @returns {string} + */ + GetTabs: ()=> { + return '
      ' + GvGMap.Tabs.join('') + '
    '; + }, + + /** + * Speichert BoxContent zwischen + * + * @param id + * @param content + */ + SetTabContent: (id, content)=> { + // ab dem zweiten Eintrag verstecken + let style = GvGMap.TabsContent.length > 0 ? ' style="display:none"' : ''; + + GvGMap.TabsContent.push('
    ' + content + '
    '); + }, + + /** + * Setzt alle gespeicherten Tabellen zusammen + * + * @returns {string} + */ + GetTabContent: ()=> { + return GvGMap.TabsContent.join(''); + }, initMap: (hexWidth, hexHeight) => { - GvGMap.Map = document.getElementById("gvg-map"); - GvGMap.MapCTX = GvGMap.Map.getContext('2d'); - GvGMap.Guilds = []; - GvGMap.Sectors = []; - GvGMap.ProvinceData = GvGMap.MapData.province_detailed; - GvGMap.GuildData = GvGMap.MapData.province_detailed.clans; - GvGMap.PowerValues = GvGMap.MapData.province_detailed.power_values; + GvGMap.Canvas = document.getElementById("gvg-map"); + GvGMap.CanvasCTX = GvGMap.Canvas.getContext('2d'); + GvGMap.Map.Guilds = []; + GvGMap.Map.Sectors = []; + GvGMap.Map.ProvinceData = GvGMap.Map.OnloadData.province_detailed; + GvGMap.Map.GuildData = GvGMap.Map.OnloadData.province_detailed.clans; + GvGMap.PowerValues = GvGMap.Map.OnloadData.province_detailed.power_values; + GvGMap.Map.Era = GvGMap.Map.OnloadData.province_detailed.era; + GvGMap.Map.HexWidth = hexWidth; + GvGMap.Map.HexHeight = hexHeight; GvGMap.Size = 'small'; - GvGMap.HexWidth = hexWidth; - GvGMap.HexHeight = hexHeight; - GvGMap.Width = (GvGMap.ProvinceData.bounds.x_max - GvGMap.ProvinceData.bounds.x_min)*GvGMap.HexWidth+GvGMap.HexWidth/2; - GvGMap.Height = (GvGMap.ProvinceData.bounds.y_max - GvGMap.ProvinceData.bounds.y_min)*GvGMap.HexHeight*0.8; - GvGMap.CurrentGuild = { id: 0 }; + if (hexWidth > 50) { + GvGMap.Size = 'big'; + } + GvGMap.Map.Width = (GvGMap.Map.ProvinceData.bounds.x_max - GvGMap.Map.ProvinceData.bounds.x_min)*GvGMap.Map.HexWidth+GvGMap.Map.HexWidth/2; + GvGMap.Map.Height = (GvGMap.Map.ProvinceData.bounds.y_max - GvGMap.Map.ProvinceData.bounds.y_min)*GvGMap.Map.HexHeight*0.8; + console.log(GvGMap.Map.OnloadData); + GvGMap.CurrentGuild = {}; + GvGMap.OwnGuildId = GvGMap.Map.OnloadData.clan_data.clan.id; }, /** @@ -309,7 +354,7 @@ let GvGMap = { HTML.Box({ id: 'GvGMap', - title: 'GvG (BETA!)', + title: i18n('Boxes.GvGMap.Title'), auto_close: true, dragdrop: true, minimize: true, @@ -320,39 +365,81 @@ let GvGMap = { } }, - /** - * Hide HUD - */ - hideMap: () => { - if ($('#GvGMap').length > 0) { - $('#GvGMap').remove(); - $('#gvg-map').remove(); - } - }, - buildMap: (mapSize = 'small') => { - let h = []; - h.push('
    EditZoomDrag
    '); + GvGMap.Tabs = []; + GvGMap.TabsContent = []; + + GvGMap.SetTabs('gvgmapguilds'); + GvGMap.SetTabs('gvgmaplog'); + + let h = [], t = []; + h.push('
    '+i18n('Boxes.GvGMap.Action.Edit')+''+i18n('Boxes.GvGMap.Action.Zoom')+''+i18n('Boxes.GvGMap.Action.Drag')+'
    '); + h.push('
    '); + //h.push('
    '); + $('#GvGMapBody').html(h.join('')); - // reset all data to default; - if (mapSize != 'small') { + GvGMap.populateCanvas(mapSize); + GvGMap.drawInfo(); + GvGMap.showGuilds(); + + //GvGLog.testData(); + //GvGLog.show(); + + let editBtn = document.getElementById("editMap"); + let dragBtn = document.getElementById("dragMap"); + let zoomBtn = document.getElementById("zoomMap"); + + editBtn.addEventListener('click', function (e) { + GvGMap.Actions.edit = true; + GvGMap.Actions.drag = false; + dragBtn.classList.remove('btn-default-active'); + editBtn.classList.add('btn-default-active'); + }, false); + dragBtn.addEventListener('click', function (e) { + GvGMap.Actions.edit = false; + GvGMap.Actions.drag = true; + editBtn.classList.remove('btn-default-active'); + dragBtn.classList.add('btn-default-active'); + }, false); + zoomBtn.addEventListener('click', function (e) { + if (GvGMap.Size == 'small') + GvGMap.buildMap('big'); + else + GvGMap.buildMap(); + }, false); + + GvGMap.mapDragOrEdit(); + GvGMap.setCurrentGuild(); + + t.push('
    '); + t.push( GvGMap.GetTabs() ); + t.push( GvGMap.GetTabContent() ); + t.push('
    '); + $('#gvgOptions').html(t.join('')); + + $('#GvGMap').find('#gvgmaplog').promise().done(function() { + $('.gvg-tabs').tabslet({active: 1}); + $('.gvg-tabs .gvgmapguilds span').text(i18n('Boxes.GvGMap.Guild.Name')); + $('.gvg-tabs .gvgmaplog span').text('Log (soonish)'); + }); + }, + + populateCanvas: (mapSize) => { + if (mapSize != 'small') GvGMap.initMap(90,72); - GvGMap.Size = 'big'; - } - else { + else GvGMap.initMap(50,40); - } - $(GvGMap.Map).attr({ + $(GvGMap.Canvas).attr({ 'id': 'gvg-map', - 'width': GvGMap.Width, - 'height': GvGMap.Height + 'width': GvGMap.Map.Width, + 'height': GvGMap.Map.Height }); - GvGMap.MapCTX.clearRect(0, 0, GvGMap.Width, GvGMap.Height); + GvGMap.CanvasCTX.clearRect(0, 0, GvGMap.Map.Width, GvGMap.Map.Height); - GvGMap.GuildData.forEach(function (guild) { + GvGMap.Map.GuildData.forEach(function (guild) { let guildOnMap = { id: guild.id, name: guild.name, @@ -362,70 +449,44 @@ let GvGMap = { power: 0, sectors: 0, }; - GvGMap.Guilds.push(guildOnMap); + GvGMap.Map.Guilds.push(guildOnMap); + if ((guild.id) == GvGMap.OwnGuildId) { + GvGMap.CurrentGuild = guildOnMap; + } }); - GvGMap.ProvinceData.sectors.forEach(function (sector) { + GvGMap.Map.ProvinceData.sectors.forEach(function (sector) { if (sector.hitpoints != undefined) { - let realX = (sector.position.x - GvGMap.ProvinceData.bounds.x_min) * GvGMap.HexWidth; - let realY = (sector.position.y - GvGMap.ProvinceData.bounds.y_min) * GvGMap.HexHeight; + let realX = (sector.position.x - GvGMap.Map.ProvinceData.bounds.x_min) * GvGMap.Map.HexWidth; + let realY = (sector.position.y - GvGMap.Map.ProvinceData.bounds.y_min) * GvGMap.Map.HexHeight; let newSector = {}; if (sector.position.y % 2 == 0) { - newSector = new Sector(realX, realY * 0.75, sector); + newSector = MapSector.create(realX, realY * 0.75, sector); } else { - newSector = new Sector(realX + (GvGMap.HexWidth * 0.5), realY * 0.75, sector); + newSector = MapSector.create(realX + (GvGMap.Map.HexWidth * 0.5), realY * 0.75, sector); } - GvGMap.Sectors.push(newSector); + GvGMap.Map.Sectors.push(newSector); - let guild = newSector.findOwnerById(newSector.owner.id); + let guild = MapSector.findOwnerById(newSector.owner.id); if (guild != undefined) { guild.power += newSector.power; guild.sectors++; } - newSector.draw(); + MapSector.draw(newSector); } }); - - GvGMap.drawInfo(); - GvGMap.buildGuilds(); - - let editBtn = document.getElementById("editMap"); - let dragBtn = document.getElementById("dragMap"); - let zoomBtn = document.getElementById("zoomMap"); - - editBtn.addEventListener('click', function (e) { - GvGMap.Actions.edit = true; - GvGMap.Actions.drag = false; - dragBtn.classList.remove('btn-default-active'); - editBtn.classList.add('btn-default-active'); - }, false); - dragBtn.addEventListener('click', function (e) { - GvGMap.Actions.edit = false; - GvGMap.Actions.drag = true; - editBtn.classList.remove('btn-default-active'); - dragBtn.classList.add('btn-default-active'); - }, false); - zoomBtn.addEventListener('click', function (e) { - if (GvGMap.Size == 'small') - GvGMap.buildMap('big'); - else - GvGMap.buildMap(); - }, false); - - GvGMap.mapDragOrEdit(); - GvGMap.setCurrentGuild(); }, drawInfo: () => { - GvGMap.MapCTX.font = "bold 22px Arial"; - GvGMap.MapCTX.textAlign = "left"; - GvGMap.MapCTX.fillStyle = '#ffb539'; - GvGMap.MapCTX.fillText(GvGMap.ProvinceData.era, 10, 25); - GvGMap.MapCTX.font = "12px Arial"; - GvGMap.MapCTX.fillStyle = '#ccc'; - GvGMap.MapCTX.fillText('Data fetched: '+ moment(GvGMap.MapDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); + GvGMap.CanvasCTX.font = "bold 22px Arial"; + GvGMap.CanvasCTX.textAlign = "left"; + GvGMap.CanvasCTX.fillStyle = '#ffb539'; + GvGMap.CanvasCTX.fillText(GvGMap.Map.Era, 10, 25); + GvGMap.CanvasCTX.font = "12px Arial"; + GvGMap.CanvasCTX.fillStyle = '#ccc'; + GvGMap.CanvasCTX.fillText('Data fetched: '+ moment(GvGMap.Map.OnloadDataTime).format('D.M.YY - HH:mm:ss'), 10, 45); }, setCurrentGuild: () => { @@ -434,10 +495,18 @@ let GvGMap = { $('#GvGGuilds tr').removeClass('active'); $(this).addClass('active'); - GvGMap.CurrentGuild = GvGMap.Guilds.find(x => x.id === id); + GvGMap.CurrentGuild = GvGMap.Map.Guilds.find(x => x.id === id); }); }, + findGuildById: (id) => { + return GvGMap.Map.Guilds.find(x => x.id === id); + }, + + findSectorById: (id) => { + return GvGMap.Map.Sectors.find(x => x.id === id); + }, + mapDragOrEdit: () => { const wrapper = document.getElementById('GvGMapWrap'); let pos = { top: 0, left: 0, x: 0, y: 0 }; @@ -466,7 +535,7 @@ let GvGMap = { document.removeEventListener('mouseup', mouseUpHandler); }; - GvGMap.Map.addEventListener('mousedown', function (e) { + GvGMap.Canvas.addEventListener('mousedown', function (e) { if (GvGMap.Actions.drag) { wrapper.addEventListener('mousedown', mouseDownHandler); } @@ -478,19 +547,20 @@ let GvGMap = { }, setSector: (e) => { - GvGMap.Sectors.forEach(function (sector) { - if (e.offsetX >= (sector.position.x + 5) && e.offsetX <= (sector.position.x + GvGMap.HexWidth - 5)) { - if (e.offsetY >= (sector.position.y + 5) && e.offsetY <= (sector.position.y + GvGMap.HexHeight - 5)) { + GvGMap.Map.Sectors.forEach(function (sector) { + if (e.offsetX >= (sector.position.x + 5) && e.offsetX <= (sector.position.x + GvGMap.Map.HexWidth - 5)) { + if (e.offsetY >= (sector.position.y + 5) && e.offsetY <= (sector.position.y + GvGMap.Map.HexHeight - 5)) { if (GvGMap.Actions.drag) { GvGMap.showSector(sector); } else { let prevOwner = sector.owner; sector.owner = GvGMap.CurrentGuild; - if (sector.owner.id == 0) - sector.owner.color = sector.setColorByTerrain(); + console.log(sector.owner); + if (sector.owner.id <= 0) + sector.owner.color = MapSector.setColorByTerrain(sector); if (sector.terrain == "plain" || sector.terrain == "beach") { - sector.draw(); + MapSector.draw(sector); } GvGMap.recalcGuildProvinces(prevOwner, sector.owner, sector); } @@ -532,23 +602,24 @@ let GvGMap = { html = '
    ' html += ''; html += ''+ sector.owner.name +'
    '; - if (sector.underSiege()) - html += 'Under Siege by: '+ sector.underSiege() +'
    '; - html += 'Hitpoints: '+ sector.hitpoints +'/80
    '; - html += 'Coords: '+ sector.coords() +'
    '; - html += 'Power: '+ sector.power +'
    '; + if (MapSector.underSiege(sector)) + html += 'Under Siege by: '+ MapSector.underSiege(sector) +'
    '; + html += i18n('Boxes.GvGMap.Sector.Hitpoints') + ': ' + sector.hitpoints +'/80
    '; + html += i18n('Boxes.GvGMap.Sector.Coords') + ': ' + MapSector.coords(sector) +'
    '; + html += i18n('Boxes.GvGMap.Sector.Power') + ': ' + sector.power +'
    '; if (sector.isProtected) - html += 'Sector is protected
    '; + html += i18n('Boxes.GvGMap.Sector.Protected')+'
    '; html += 'Terrain: '+ sector.terrain +'
    '; html += '
    '; } + document.getElementById("GvGMapInfo").innerHTML = html; }, - buildGuilds: () => { + showGuilds: () => { let t = []; - GvGMap.Guilds.sort(function(a, b) { + GvGMap.Map.Guilds.sort(function(a, b) { if (a.power > b.power) return -1; if (a.power < b.power) @@ -558,11 +629,11 @@ let GvGMap = { t.push('
    NameSectorsPower
    '+guild.name+'
    '+guild.name+''+guild.sectors+''+guild.power+'
    '+guild.name+''+guild.name+''+guild.sectors+''+guild.power+'SectorsPower
    '+guild.name+''+guild.name+''+guild.sectors+''+guild.power+'
    '); t.push(''); - t.push(''); - t.push(''); - t.push(''); + t.push(''); + t.push(''); + t.push(''); t.push(''); - GvGMap.Guilds.forEach(function (guild) { + GvGMap.Map.Guilds.forEach(function (guild) { t.push(''); t.push(''); t.push(''); @@ -570,8 +641,8 @@ let GvGMap = { t.push(''); }); t.push('
    NameSectorsPower'+i18n('Boxes.GvGMap.Guild.Name')+''+i18n('Boxes.GvGMap.Guild.Sectors')+''+i18n('Boxes.GvGMap.Guild.Power')+'
    '+guild.name+''+guild.sectors+'
    '); - - $('#GvGMapGuilds').html(t.join('')); + + GvGMap.SetTabContent('gvgmapguilds', t.join('')); }, getColor: (guild) => { @@ -592,7 +663,6 @@ let GvGMap = { color = GvGMap.Colors.b[Math.round(guild.id/13)%13]; } - return color; }, @@ -607,7 +677,7 @@ let GvGMap = { if (flag.search("premium") >= 0) id += 40; - return {"x": (id % 10 ) * (GvGMap.HexWidth), "y": Math.floor(id / 10) * (GvGMap.HexHeight)}; + return {"x": (id % 10 ) * (GvGMap.Map.HexWidth), "y": Math.floor(id / 10) * (GvGMap.Map.HexHeight)}; }, colorToString: (color) => { @@ -615,65 +685,3292 @@ let GvGMap = { }, } -class Sector { - constructor(x, y, info) { - this.id = info.sector_id; - this.position = { - "x": x, - "y": y - }; - this.coordinates = { - "x": info.position.x, - "y": info.position.y - }; - this.power = parseInt(GvGMap.PowerValues[info.power]) || GvGMap.PowerValues[0]; - this.powerMultiplicator = parseInt(info.power)+1 || 1; - this.isProtected = info.is_protected; - this.terrain = info.terrain; - this.headquarter = (info.building != null); - this.hitpoints = info.hitpoints; - this.owner = this.findOwnerById(info.owner_id) || { id: 0, color: this.setColorByTerrain() }; - this.siege = { - "clan": info.siege_clan_id || 0, - }; +let GvGLog = { + Entries: [], + + DummyData: [ + { + "army_id": 2078642, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187759, + "player_id": 585359, + "sector_id": 4060, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078646, + "hitpoints": 40, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187764, + "player_id": 585359, + "sector_id": 4060, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078649, + "hitpoints": 50, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187768, + "player_id": 585359, + "sector_id": 4060, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078651, + "hitpoints": 60, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187771, + "player_id": 585359, + "sector_id": 4060, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077944, + "hitpoints": 1, + "hitpoint_change": -10, + "type": "ClanBattle/siege_deleted", + "timestamp": 1621187772, + "player_id": 7458293, + "sector_id": 4121, + "source_clan_id": 30785, + "target_clan_id": 11484, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078653, + "hitpoints": 70, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187779, + "player_id": 585359, + "sector_id": 4060, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078657, + "hitpoints": 80, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187783, + "player_id": 585359, + "sector_id": 4060, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078662, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187792, + "player_id": 7458293, + "sector_id": 4142, + "source_clan_id": 30785, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078665, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187797, + "player_id": 7458293, + "sector_id": 4142, + "source_clan_id": 30785, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187800, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187801, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187802, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187804, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187805, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187807, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078669, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187808, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187811, + "player_id": 587212, + "sector_id": 3991, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078673, + "hitpoints": 40, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187812, + "player_id": 587212, + "sector_id": 3991, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078678, + "hitpoints": 40, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187820, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078680, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187821, + "player_id": 587212, + "sector_id": 4011, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078682, + "hitpoints": 50, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187824, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078684, + "hitpoints": 60, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187828, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187829, + "player_id": 587212, + "sector_id": 4011, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078685, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187830, + "player_id": 587212, + "sector_id": 4011, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078686, + "hitpoints": 70, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187832, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187835, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078688, + "hitpoints": 80, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187836, + "player_id": 585359, + "sector_id": 4072, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078689, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187836, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187842, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078691, + "hitpoints": 40, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187844, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187846, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078693, + "hitpoints": 50, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187847, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078694, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187848, + "player_id": 8770396, + "sector_id": 3961, + "source_clan_id": 20227, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187852, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187853, + "player_id": 10071404, + "sector_id": 3961, + "source_clan_id": 20227, + "target_clan_id": 20227, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078698, + "hitpoints": 60, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187853, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078699, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187855, + "player_id": 10071404, + "sector_id": 3961, + "source_clan_id": 20227, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187855, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078700, + "hitpoints": 50, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187856, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078703, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187865, + "player_id": 10083035, + "sector_id": 3958, + "source_clan_id": 20227, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187865, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078704, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187865, + "player_id": 587212, + "sector_id": 3952, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078705, + "hitpoints": 60, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187865, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078706, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187866, + "player_id": 8770396, + "sector_id": 3960, + "source_clan_id": 20227, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187871, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187872, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187872, + "player_id": 587212, + "sector_id": 3952, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078707, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187873, + "player_id": 587212, + "sector_id": 3952, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078709, + "hitpoints": 70, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187877, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187884, + "player_id": 587212, + "sector_id": 3938, + "source_clan_id": 1654, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078712, + "hitpoints": 80, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187887, + "player_id": 717487, + "sector_id": 4090, + "source_clan_id": 467, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621187889, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187891, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187892, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187892, + "player_id": 800794, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187893, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187893, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "type": "ClanBattle/siege_low_hp", + "timestamp": 1621187893, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187893, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187894, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187894, + "player_id": 800794, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187895, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187895, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187895, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078714, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_defeated", + "timestamp": 1621187896, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187904, + "player_id": 6807803, + "sector_id": 4149, + "source_clan_id": 11484, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078720, + "hitpoints": 8, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621187907, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187908, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187909, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187909, + "player_id": 7317165, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187909, + "player_id": 800794, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187909, + "player_id": 587212, + "sector_id": 3968, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078720, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187909, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "type": "ClanBattle/siege_low_hp", + "timestamp": 1621187909, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078721, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187910, + "player_id": 587212, + "sector_id": 3968, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187910, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187910, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187911, + "player_id": 513225, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187911, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621187911, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187911, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187911, + "player_id": 6183084, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187911, + "player_id": 800794, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078720, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/siege_defeated", + "timestamp": 1621187912, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 5, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621187922, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187923, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078726, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187923, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187924, + "player_id": 7317165, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078727, + "hitpoints": 70, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187924, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187924, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187924, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "type": "ClanBattle/siege_low_hp", + "timestamp": 1621187925, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187925, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187925, + "player_id": 6183084, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187926, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621187926, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187926, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187927, + "player_id": 800794, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187928, + "player_id": 807568, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621187928, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078726, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/siege_defeated", + "timestamp": 1621187929, + "player_id": 511977, + "sector_id": 3938, + "source_clan_id": 9323, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187933, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078733, + "hitpoints": 80, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187934, + "player_id": 587212, + "sector_id": 3994, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078738, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187949, + "player_id": 587212, + "sector_id": 4009, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_slot_unlocked", + "timestamp": 1621187955, + "player_id": 587212, + "sector_id": 4009, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078743, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187955, + "player_id": 587212, + "sector_id": 4009, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 10, + "type": "ClanBattle/defender_replaced", + "timestamp": 1621187968, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": 20227, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078751, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/defender_deployed", + "timestamp": 1621187969, + "player_id": 587212, + "sector_id": 3951, + "source_clan_id": 1654, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187981, + "player_id": 8432453, + "sector_id": 4138, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "building": { + "next_relocate": 1621188000, + "__class__": "ClanBattleHeadquarter" + }, + "type": "ClanBattle/headquarter_placed", + "timestamp": 1621187981, + "player_id": 6807803, + "sector_id": 4109, + "source_clan_id": 11484, + "target_clan_id": 11484, + "__class__": "ClanBattleBuildingChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187983, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187984, + "player_id": 8432453, + "sector_id": 4126, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187986, + "player_id": 2024164, + "sector_id": 4124, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187987, + "player_id": 8432453, + "sector_id": 4125, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187995, + "player_id": 10071404, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078768, + "hitpoints": 2, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621187996, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187997, + "player_id": 7317165, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "type": "ClanBattle/sector_independence_granted", + "timestamp": 1621187998, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078770, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621187999, + "player_id": 807568, + "sector_id": 3927, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188012, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188013, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078775, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188013, + "player_id": 511977, + "sector_id": 4065, + "source_clan_id": 9323, + "target_clan_id": 6998, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078777, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188013, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078779, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188013, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078780, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188013, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077929, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_defeated", + "timestamp": 1621188014, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_conquered", + "timestamp": 1621188014, + "player_id": 4529031, + "sector_id": 3938, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078773, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188015, + "player_id": 7317165, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188015, + "player_id": 10083035, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078800, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188015, + "player_id": 8432453, + "sector_id": 4126, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188015, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077586, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188016, + "player_id": 511977, + "sector_id": 4065, + "source_clan_id": 9323, + "target_clan_id": 6998, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188016, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188016, + "player_id": 6183084, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078808, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188016, + "player_id": 423722, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188016, + "player_id": 513225, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078810, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188017, + "player_id": 5687524, + "sector_id": 4098, + "source_clan_id": 11484, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188017, + "player_id": 7317165, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188017, + "player_id": 4529031, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078811, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188017, + "player_id": 512828, + "sector_id": 4018, + "source_clan_id": 9133, + "target_clan_id": 30549, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078813, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188017, + "player_id": 803214, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188017, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188017, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078815, + "hitpoints": 30, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188018, + "player_id": 427548, + "sector_id": 4009, + "source_clan_id": 10136, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076963, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188018, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078816, + "hitpoints": 80, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188018, + "player_id": 423416, + "sector_id": 4089, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078817, + "hitpoints": 80, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188018, + "player_id": 1613507, + "sector_id": 4060, + "source_clan_id": 29669, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188018, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188018, + "player_id": 511977, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188018, + "player_id": 5269109, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188018, + "player_id": 7317165, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "type": "ClanBattle/siege_low_hp", + "timestamp": 1621188018, + "player_id": 7317165, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078819, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188018, + "player_id": 2960343, + "sector_id": 4037, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188019, + "player_id": 6183084, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078822, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188019, + "player_id": 585359, + "sector_id": 4111, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188019, + "player_id": 4529031, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188019, + "player_id": 1473126, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188020, + "player_id": 423722, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188020, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188020, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188020, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188020, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188020, + "player_id": 513225, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188020, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188020, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078824, + "hitpoints": 20, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188020, + "player_id": 115968, + "sector_id": 4001, + "source_clan_id": 9133, + "target_clan_id": 30549, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188020, + "player_id": 803214, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078825, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188021, + "player_id": 511977, + "sector_id": 4079, + "source_clan_id": 9323, + "target_clan_id": 6998, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188021, + "player_id": 7732998, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188021, + "player_id": 10083035, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188021, + "player_id": 7317165, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078274, + "hitpoints": 19, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188021, + "player_id": 585359, + "sector_id": 4111, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188021, + "player_id": 6183084, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078827, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188021, + "player_id": 8404356, + "sector_id": 4021, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188021, + "player_id": 5933688, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188022, + "player_id": 4529031, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188022, + "player_id": 5269109, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "type": "ClanBattle/siege_low_hp", + "timestamp": 1621188022, + "player_id": 5269109, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077729, + "hitpoints": 19, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188022, + "player_id": 512828, + "sector_id": 4018, + "source_clan_id": 9133, + "target_clan_id": 30549, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076963, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188022, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188022, + "player_id": 10071404, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078828, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188022, + "player_id": 6807803, + "sector_id": 4110, + "source_clan_id": 11484, + "target_clan_id": 25179, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188022, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188022, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188022, + "player_id": 5933688, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188022, + "player_id": 5933688, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077266, + "hitpoints": 29, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188023, + "player_id": 1244937, + "sector_id": 4009, + "source_clan_id": 10136, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188023, + "player_id": 423722, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188023, + "player_id": 7457766, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188023, + "player_id": 7317165, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188023, + "player_id": 5933688, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078832, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188023, + "player_id": 587212, + "sector_id": 3993, + "source_clan_id": 1654, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 1473126, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188024, + "player_id": 1473126, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076945, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 5687524, + "sector_id": 4098, + "source_clan_id": 11484, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078833, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188024, + "player_id": 587053, + "sector_id": 4031, + "source_clan_id": 1654, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 513225, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 803214, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076963, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 5933688, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 7732998, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188024, + "player_id": 10083035, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 4529031, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188025, + "player_id": 10071404, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078743, + "hitpoints": 28, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188024, + "player_id": 427548, + "sector_id": 4009, + "source_clan_id": 10136, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188025, + "player_id": 423722, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078836, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188025, + "player_id": 8472982, + "sector_id": 4020, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078135, + "hitpoints": 18, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188025, + "player_id": 512828, + "sector_id": 4018, + "source_clan_id": 9133, + "target_clan_id": 30549, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077553, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_defeated", + "timestamp": 1621188025, + "player_id": 5933688, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_conquered", + "timestamp": 1621188025, + "player_id": 5933688, + "sector_id": 4122, + "source_clan_id": 11484, + "target_clan_id": 30785, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188025, + "player_id": 5269109, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078837, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188025, + "player_id": 511977, + "sector_id": 4052, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078433, + "hitpoints": 79, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188025, + "player_id": 423416, + "sector_id": 4089, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078274, + "hitpoints": 18, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188026, + "player_id": 820806, + "sector_id": 4111, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188026, + "player_id": 1371928, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078773, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/siege_defeated", + "timestamp": 1621188026, + "player_id": 6183084, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188026, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076963, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188026, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076963, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188026, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188027, + "player_id": 10071404, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188027, + "player_id": 4529031, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188027, + "player_id": 423722, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188027, + "player_id": 1473126, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078839, + "hitpoints": 4, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188027, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188027, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078840, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188028, + "player_id": 8432453, + "sector_id": 4138, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077729, + "hitpoints": 17, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 512828, + "sector_id": 4018, + "source_clan_id": 9133, + "target_clan_id": 30549, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076944, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 587053, + "sector_id": 4031, + "source_clan_id": 1654, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076945, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 5687524, + "sector_id": 4098, + "source_clan_id": 11484, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078743, + "hitpoints": 27, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 1244937, + "sector_id": 4009, + "source_clan_id": 10136, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077832, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 8404356, + "sector_id": 4020, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078657, + "hitpoints": 79, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 1613507, + "sector_id": 4060, + "source_clan_id": 29669, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078770, + "hitpoints": 10, + "hitpoint_change": -1, + "type": "ClanBattle/siege_defeated", + "timestamp": 1621188028, + "player_id": 5269109, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076963, + "hitpoints": 5, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078136, + "hitpoints": 19, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188028, + "player_id": 115968, + "sector_id": 4001, + "source_clan_id": 9133, + "target_clan_id": 30549, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078438, + "hitpoints": 78, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188029, + "player_id": 423416, + "sector_id": 4089, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188029, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078274, + "hitpoints": 17, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188029, + "player_id": 820806, + "sector_id": 4111, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078839, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188029, + "player_id": 6183084, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077266, + "hitpoints": 26, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188029, + "player_id": 427548, + "sector_id": 4009, + "source_clan_id": 10136, + "target_clan_id": 1654, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076874, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188029, + "player_id": 7732998, + "sector_id": 4110, + "source_clan_id": 11484, + "target_clan_id": 25179, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076874, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188029, + "player_id": 803214, + "sector_id": 4110, + "source_clan_id": 11484, + "target_clan_id": 25179, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078842, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188030, + "player_id": 7458293, + "sector_id": 4149, + "source_clan_id": 30785, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078749, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_defeated", + "timestamp": 1621188030, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "type": "ClanBattle/sector_conquered", + "timestamp": 1621188030, + "player_id": 8770396, + "sector_id": 3974, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleSectorChange" + }, + { + "army_id": 2076945, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188030, + "player_id": 7457766, + "sector_id": 4098, + "source_clan_id": 11484, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077831, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188030, + "player_id": 2960343, + "sector_id": 4037, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188030, + "player_id": 423722, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077729, + "hitpoints": 16, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188030, + "player_id": 512828, + "sector_id": 4018, + "source_clan_id": 9133, + "target_clan_id": 30549, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 3, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188030, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078846, + "hitpoints": 10, + "hitpoint_change": 10, + "type": "ClanBattle/siege_deployed", + "timestamp": 1621188031, + "player_id": 10083035, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078839, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188031, + "player_id": 1371928, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076944, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188031, + "player_id": 587053, + "sector_id": 4031, + "source_clan_id": 1654, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076963, + "hitpoints": 4, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188031, + "player_id": 2024164, + "sector_id": 4135, + "source_clan_id": 28563, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077832, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188031, + "player_id": 8472982, + "sector_id": 4020, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076945, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188031, + "player_id": 5687524, + "sector_id": 4098, + "source_clan_id": 11484, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076945, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188031, + "player_id": 5687524, + "sector_id": 4098, + "source_clan_id": 11484, + "target_clan_id": 467, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077847, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188031, + "player_id": 1473126, + "sector_id": 4019, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078839, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188032, + "player_id": 6183084, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077201, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 587212, + "sector_id": 3993, + "source_clan_id": 1654, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078274, + "hitpoints": 16, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 585359, + "sector_id": 4111, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078274, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188032, + "player_id": 585359, + "sector_id": 4111, + "source_clan_id": 467, + "target_clan_id": 6704, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078611, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 10071404, + "sector_id": 3927, + "source_clan_id": 20227, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076874, + "hitpoints": 7, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 5933688, + "sector_id": 4110, + "source_clan_id": 11484, + "target_clan_id": 25179, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076929, + "hitpoints": 9, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 7458293, + "sector_id": 4149, + "source_clan_id": 30785, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078181, + "hitpoints": 2, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 807568, + "sector_id": 3956, + "source_clan_id": 9323, + "target_clan_id": -27, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078004, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 800794, + "sector_id": 4066, + "source_clan_id": 9323, + "target_clan_id": 27272, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076874, + "hitpoints": 6, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 803214, + "sector_id": 4110, + "source_clan_id": 11484, + "target_clan_id": 25179, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2076874, + "type": "ClanBattle/defender_low_hp", + "timestamp": 1621188032, + "player_id": 803214, + "sector_id": 4110, + "source_clan_id": 11484, + "target_clan_id": 25179, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2077831, + "hitpoints": 8, + "hitpoint_change": -1, + "type": "ClanBattle/defender_damaged", + "timestamp": 1621188032, + "player_id": 8404356, + "sector_id": 4037, + "source_clan_id": 9133, + "target_clan_id": 29538, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078839, + "hitpoints": 1, + "hitpoint_change": -1, + "type": "ClanBattle/siege_damaged", + "timestamp": 1621188032, + "player_id": 8770396, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + { + "army_id": 2078839, + "type": "ClanBattle/siege_low_hp", + "timestamp": 1621188032, + "player_id": 8770396, + "sector_id": 3956, + "source_clan_id": 20227, + "target_clan_id": 9323, + "__class__": "ClanBattleArmyChange" + }, + ], + + addEntry: (response) => { + if (response != undefined) { + let type = response.type.replace('ClanBattle/',''); + if (response.__class__ == "ClanBattleArmyChange" && type != "defender_low_hp" && type != "siege_low_hp") { + entry = { + type: type, + timestamp: response.timestamp, + sectorId: response.sector_id, + sourceClan: response.source_clan_id, + targetClan: response.target_clan_id, + hitpoints: response.hitpoints + } + } + if (entry != null) + GvGLog.Entries.push(entry); + //GvGLog.Entries.push(response); + } + }, + + testData: () => { + let entry = null; + GvGLog.DummyData.forEach(function (data) { + let type = data.type.replace('ClanBattle/',''); + if (data.__class__ == "ClanBattleArmyChange" && type != "defender_low_hp" && type != "siege_low_hp") { + entry = { + type: type, + timestamp: data.timestamp, + sectorId: data.sector_id, + sourceClan: data.source_clan_id, + targetClan: data.target_clan_id, + hitpoints: data.hitpoints + } + } + if (entry != null) + GvGLog.Entries.push(entry); + }); + }, + + show: () => { + let t = []; + + t.push(''); + t.push(''); + t.push(''); + t.push(''); + t.push(''); + + GvGLog.Entries.forEach(function(entry) { + let sector = MapSector.findById(entry.sectorId); + if (sector != undefined) { // if sector is on map + let sectorCoords = MapSector.coords(sector); + let targetClan = (GvGMap.findGuildById(entry.targetClan) != undefined) ? GvGMap.findGuildById(entry.targetClan).name : "NPC"; + let sourceClan = (GvGMap.findGuildById(entry.sourceClan) != undefined) ? GvGMap.findGuildById(entry.sourceClan).name : "Unbekannte Gilde"; + t.push(''); + t.push(''); + t.push(''); + t.push(''); + } + }); + t.push('
    SectorInfo
    '+sectorCoords+'
    '+moment.unix(entry.timestamp).format('HH:mm:ss')+'
    '); + if (entry.sourceClan != entry.targetClan && entry.targetClan != undefined && entry.sourceClan != undefined) + t.push(sourceClan +' → '+ targetClan); + else if (sourceClan != undefined) + t.push(sourceClan); + t.push('
    '+entry.type); + //t.push(', HP: '+entry.hitpoints); + t.push('
    '); + + GvGMap.SetTabContent('gvgmaplog', t.join('')); } +} + +let MapSector = { + create: (x, y, info) => { + //console.log(info.sector_id, info.terrain); + let sector = { + id: info.sector_id, + position: { + "x": x, + "y": y + }, + coordinates: { + "x": info.position.x, + "y": info.position.y + }, + power: parseInt(GvGMap.PowerValues[info.power]) || GvGMap.PowerValues[0], + powerMultiplicator: parseInt(info.power)+1 || 1, + isProtected: info.is_protected, + terrain: info.terrain, + headquarter: (info.building != null), + hitpoints: info.hitpoints, + owner: MapSector.findOwnerById(info.owner_id) || { id: 0, color: MapSector.setColorByTerrain(info) }, + siege: { + clan: info.siege_clan_id || 0, + }, + } + return sector; + }, - findOwnerById(id) { - let guild = GvGMap.Guilds.find(x => x.id === id); + findOwnerById: (id) => { + let guild = GvGMap.Map.Guilds.find(x => x.id === id); return guild; - } + }, - underSiege() { - if (this.siege.clan != 0) - return GvGMap.Guilds.find(x => x.id === this.siege.clan).name; + findById: (id) => { + return GvGMap.Map.Sectors.find(x => x.id === id); + }, + + underSiege: (sector) => { + if (sector.siege.clan != 0) + return GvGMap.Map.Guilds.find(x => x.id === sector.siege.clan).name; return false; - } + }, - setColorByTerrain() { + setColorByTerrain: (sector) => { let color = {}; - if (this.terrain == "beach") { - color = {"r":233,"g":233,"b":114-this.powerMultiplicator*10}; + if (sector.terrain == "beach") { + color = {"r":233,"g":233,"b":114-(parseInt(sector.power)+1)*10}; + console.log('beach', color); } - else if (this.terrain == "plain") { - color = {"r":126-this.powerMultiplicator*10,"g":222-this.powerMultiplicator*10,"b":110-this.powerMultiplicator*10}; + else if (sector.terrain == "plain") { + color = {"r":126-(parseInt(sector.power)+1)*10,"g":222-(parseInt(sector.power)+1)*10,"b":110-(parseInt(sector.power)+1)*10}; + console.log('plain', color); } else { - if (this.terrain == "rocks") + if (sector.terrain == "rocks") color = {"r":50,"g":50,"b":50}; - if (this.terrain == "water") + if (sector.terrain == "water") color = {"r":4,"g":28,"b":45}; } return color; - } + }, /** * Draws a sector on the map + flag and HQ/status if it has an owner */ - draw() { - this.drawHex(); - this.drawHexText(); - if (this.owner.id > 0) { - let flag = this.owner.flagCoordinates; + draw: (sector) => { + MapSector.drawHex(sector); + MapSector.drawHexText(sector); + if (sector.owner.id > 0) { + let flag = sector.owner.flagCoordinates; let imgPositions = { hqX: 450, hqY: 200, @@ -693,71 +3990,70 @@ class Sector { } } - let sector = this; img.onload = function () { if (sector.headquarter) - GvGMap.MapCTX.drawImage(img, imgPositions.hqX, imgPositions.hqY, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y, GvGMap.HexWidth, GvGMap.HexHeight); + GvGMap.CanvasCTX.drawImage(img, imgPositions.hqX, imgPositions.hqY, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight, sector.position.x, sector.position.y, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight); if (sector.isProtected) - GvGMap.MapCTX.drawImage(img, imgPositions.shieldX, imgPositions.shieldY, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y, GvGMap.HexWidth, GvGMap.HexHeight); + GvGMap.CanvasCTX.drawImage(img, imgPositions.shieldX, imgPositions.shieldY, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight, sector.position.x, sector.position.y, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight); if (GvGMap.Size != 'small') { - GvGMap.MapCTX.drawImage(img, flag.x, flag.y, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y, GvGMap.HexWidth, GvGMap.HexHeight); + GvGMap.CanvasCTX.drawImage(img, flag.x, flag.y, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight, sector.position.x, sector.position.y, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight); } else { - GvGMap.MapCTX.drawImage(img, flag.x, flag.y, GvGMap.HexWidth, GvGMap.HexHeight, sector.position.x, sector.position.y-5, GvGMap.HexWidth, GvGMap.HexHeight); + GvGMap.CanvasCTX.drawImage(img, flag.x, flag.y, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight, sector.position.x, sector.position.y-5, GvGMap.Map.HexWidth, GvGMap.Map.HexHeight); } } } - } + }, /** * Redraw */ - redraw() { - this.drawHex(); - this.drawHexText(); - } + redraw: (sector) => { + MapSector.drawHex(sector); + MapSector.drawHexText(sector); + }, /** - * Draws Sector hexagon in its color + * Draws Sector hexagon in its owners color */ - drawHex() { - GvGMap.MapCTX.fillStyle = GvGMap.colorToString(this.owner.color); - GvGMap.MapCTX.beginPath(); - GvGMap.MapCTX.moveTo(this.position.x + GvGMap.HexWidth / 2, this.position.y); - GvGMap.MapCTX.lineTo(this.position.x + GvGMap.HexWidth, this.position.y + GvGMap.HexHeight * 0.25); - GvGMap.MapCTX.lineTo(this.position.x + GvGMap.HexWidth, this.position.y + GvGMap.HexHeight * 0.75); - GvGMap.MapCTX.lineTo(this.position.x + GvGMap.HexWidth / 2, this.position.y + GvGMap.HexHeight); - GvGMap.MapCTX.lineTo(this.position.x, this.position.y + GvGMap.HexHeight * 0.75); - GvGMap.MapCTX.lineTo(this.position.x, this.position.y + GvGMap.HexHeight * 0.25); - GvGMap.MapCTX.closePath(); - GvGMap.MapCTX.fill(); - GvGMap.MapCTX.strokeStyle = "rgba(0,0,0,0.2)"; - GvGMap.MapCTX.stroke(); - } + drawHex: (sector) => { + GvGMap.CanvasCTX.fillStyle = GvGMap.colorToString(sector.owner.color); + GvGMap.CanvasCTX.beginPath(); + GvGMap.CanvasCTX.moveTo(sector.position.x + GvGMap.Map.HexWidth / 2, sector.position.y); + GvGMap.CanvasCTX.lineTo(sector.position.x + GvGMap.Map.HexWidth, sector.position.y + GvGMap.Map.HexHeight * 0.25); + GvGMap.CanvasCTX.lineTo(sector.position.x + GvGMap.Map.HexWidth, sector.position.y + GvGMap.Map.HexHeight * 0.75); + GvGMap.CanvasCTX.lineTo(sector.position.x + GvGMap.Map.HexWidth / 2, sector.position.y + GvGMap.Map.HexHeight); + GvGMap.CanvasCTX.lineTo(sector.position.x, sector.position.y + GvGMap.Map.HexHeight * 0.75); + GvGMap.CanvasCTX.lineTo(sector.position.x, sector.position.y + GvGMap.Map.HexHeight * 0.25); + GvGMap.CanvasCTX.closePath(); + GvGMap.CanvasCTX.fill(); + GvGMap.CanvasCTX.strokeStyle = "rgba(0,0,0,0.2)"; + GvGMap.CanvasCTX.stroke(); + }, /** * Draws Sector coordinates (and power) */ - drawHexText() { - GvGMap.MapCTX.font = "9px Arial"; + drawHexText: (sector) => { + GvGMap.CanvasCTX.font = "9px Arial"; if (GvGMap.Size == 'big') - GvGMap.MapCTX.font = "12px Arial"; - GvGMap.MapCTX.textAlign = "center"; - GvGMap.MapCTX.fillStyle = ((this.owner.color.r+this.owner.color.g+this.owner.color.b) < 300) ? '#ddd' : '#222'; - GvGMap.MapCTX.fillText(this.coords(), this.position.x + GvGMap.HexWidth / 2, this.position.y + GvGMap.HexHeight * 0.85); - if (GvGMap.Size == 'big' && this.terrain != "water" && this.terrain != "rocks") - GvGMap.MapCTX.fillText(this.power, this.position.x + GvGMap.HexWidth / 2, this.position.y + GvGMap.HexHeight * 0.25); - } + GvGMap.CanvasCTX.font = "12px Arial"; + GvGMap.CanvasCTX.textAlign = "center"; + GvGMap.CanvasCTX.fillStyle = ((sector.owner.color.r+sector.owner.color.g+sector.owner.color.b) < 300) ? '#ddd' : '#222'; + GvGMap.CanvasCTX.fillText(MapSector.coords(sector), sector.position.x + GvGMap.Map.HexWidth / 2, sector.position.y + GvGMap.Map.HexHeight * 0.85); + if (GvGMap.Size == 'big' && sector.terrain != "water" && sector.terrain != "rocks") + GvGMap.CanvasCTX.fillText(sector.power, sector.position.x + GvGMap.Map.HexWidth / 2, sector.position.y + GvGMap.Map.HexHeight * 0.25); + }, /** * Returns Sectors coordinates (with ~ if beach) */ - coords() { - if (this.terrain == "beach") - return "~"+this.coordinates.x + ", " + this.coordinates.y+"~"; - if (this.terrain == "plain") - return this.coordinates.x + ", " + this.coordinates.y; + coords(sector) { + if (sector.terrain == "beach") + return sector.coordinates.x + ", " + sector.coordinates.y; + if (sector.terrain == "plain") + return sector.coordinates.x + ", " + sector.coordinates.y; return ""; - } + }, } \ No newline at end of file