From e76abcb25395347556103186a1078cb551cf57fd Mon Sep 17 00:00:00 2001 From: goldenfiredo Date: Fri, 15 Oct 2021 11:04:19 +0800 Subject: [PATCH 1/5] upgrate planet automatically --- content/productivity/upgrade-planet/index.md | 6 + .../upgrade-planet/screenshot.png | Bin 0 -> 12202 bytes .../upgrade-planet/upgrade_planet.js | 303 ++++++++++++++++++ 3 files changed, 309 insertions(+) create mode 100644 content/productivity/upgrade-planet/index.md create mode 100644 content/productivity/upgrade-planet/screenshot.png create mode 100644 content/productivity/upgrade-planet/upgrade_planet.js diff --git a/content/productivity/upgrade-planet/index.md b/content/productivity/upgrade-planet/index.md new file mode 100644 index 00000000..ad6c3118 --- /dev/null +++ b/content/productivity/upgrade-planet/index.md @@ -0,0 +1,6 @@ +--- +title: Update Planet +date: +subtitle: Move silver to selected planet then upgrade it automatically +version: 0.6.4 +--- diff --git a/content/productivity/upgrade-planet/screenshot.png b/content/productivity/upgrade-planet/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dd96aa203bebf34bb683249298ed6e7878e53f77 GIT binary patch literal 12202 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 Y&Gq&zQzH4@) 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 getPlanetMaxRank(planet) +} + +function distance(from, to) { + let fromloc = from.location; + let toloc = to.location; + return Math.sqrt((fromloc.coords.x - toloc.coords.x) ** 2 + (fromloc.coords.y - toloc.coords.y) ** 2); +} + +function getPlanetMaxRank(planet) { + if (!planet) return 0; + if (planet.spaceType === SpaceType.NEBULA) return 3; + if (planet.spaceType === SpaceType.SPACE) return 4; + return 5; +} + +function upgradeRequiredSilver(planet) { + const maxRank = getPlanetMaxRank(planet); + const silverPerRank = []; + + for (let i = 0; i < maxRank; i++) { + silverPerRank[i] = Math.floor((i + 1) * 0.2 * planet.silverCap); + } + + return silverPerRank[getPlanetRank(planet)]; +} + +function getPlanetArrivals(planetId) { + return df.getAllVoyages() + .filter(arrival => arrival.toPlanet === planetId) + .filter(p => p.arrivalTime > Date.now() / 1000); +} + +function isUpgrading(planet) { + return df.getUnconfirmedUpgrades().filter(p => p.locationId === planet.locationId).length > 0; +} + +function sendSilver(planet, rankSpan) { + df.terminal.current.println("[Upgrade Planet] send silver", 2); + + let target = df.getPlanetWithId(planet.locationId); + let rank = getPlanetRank(target); + let maxRank = getPlanetMaxRank(target); + if (rank < maxRank) + rankSpan.innerHTML = 'rank: ' + getPlanetRank(target); + else + rankSpan.innerHTML = 'rank: ' + getPlanetRank(target) + ', upgrade end'; + + let requiredSilver = rank + 1 == maxRank ? upgradeRequiredSilver(target) : target.silverCap; + let totalAmount = Math.min(target.silverCap - target.silver, requiredSilver - target.silver); + if (totalAmount <= 0) { + return; + } + + if (upgraded(target)) { + return; + } + + if (isUpgrading(target)) { + return; + } + + const allArrivals = getPlanetArrivals(target.locationId); + if (allArrivals.length + df.getUnconfirmedMoves().filter(move => move.to === target.locationId).length > 0) { + return; + } + + const candidates = df.getMyPlanets().filter( + p => p.planetType === PlanetType.SILVER_MINE + && p.planetLevel >= minPlanetLevel + && (p.silver >= Math.floor(p.silverCap * minSilverPercent / 100) || p.silver >= totalAmount) + ); + + let sources = [] + for (let i = 0; i < candidates.length; i++) { + let from = candidates[i]; + const t = df.getPlanetsInRange(from.locationId, minEnergyPercent).filter( + p => p.locationId === target.locationId + ); + + if (t.length == 0) continue; + + sources.push(from); + } + + const sorted = sources.map( + source => [source, distance(source, target)] + ).sort( + (a, b) => a[1] - b[1] + ); + + let sentAmount = 0; + + for (let i = 0; i < sorted.length; ++i) { + const source = sorted[i][0]; + const sourceId = source.locationId; + + const energyNeeded = Math.ceil(df.getEnergyNeededForMove(sourceId, target.locationId, 50)); + if (source.energy - energyNeeded < 0) { + continue; + } + + let silverAmount = Math.min(Math.floor(source.silver), Math.floor(totalAmount - sentAmount)); + + df.terminal.current.println("[Upgrade Planet] move: " + sourceId + " -> " + target.locationId + " silver amount: " + silverAmount, 2); + + df.move(sourceId, target.locationId, energyNeeded, silverAmount); + + sentAmount += silverAmount; + if (sentAmount >= totalAmount) break; + } + +} + +function upgradePlanet(target) { + let planet = df.getPlanetWithId(target.locationId); + if (isUpgrading(planet)) { + return; + } + + if (planet && canPlanetUpgrade(planet)) { + if (canStatUpgrade(planet, UpgradeBranchName.Defense)) { + df.upgrade(planet.locationId, UpgradeBranchName.Defense) + } else if (canStatUpgrade(planet, UpgradeBranchName.Range)) { + df.upgrade(planet.locationId, UpgradeBranchName.Range) + } else if (canStatUpgrade(planet, UpgradeBranchName.Speed)) { + df.upgrade(planet.locationId, UpgradeBranchName.Speed) + } else { + + } + } +} + +function App() { + let wrapper = { + display: 'flex', + justifyContent: 'space-between', + }; + + let [target, setTarget] = useState(false); + let [selectedPlanet, setSelectedPlanet] = useState(ui.getSelectedPlanet()); + useLayoutEffect(() => { + const sub = ui.selectedPlanetId$.subscribe(() => { + setSelectedPlanet(ui.getSelectedPlanet()); + }); + + return sub.unsubscribe; + }, []); + + function select() { + setTarget(selectedPlanet); + } + + function stop() { + if (!running) return; + + if (sendIntervalId != '') { + clearInterval(sendIntervalId); + sendIntervalId = ''; + } + + if (upgradeIntervalId != '') { + clearInterval(upgradeIntervalId); + upgradeIntervalId = ''; + } + + running = false; + selectBtn.disabled = false; + selectBtn.style = 'opacity: 1'; + startBtn.disabled = false; + startBtn.style = 'opacity: 1'; + rankSpan.innerHTML = ''; + } + + function start() { + if (running) return; + + running = true; + selectBtn.disabled = true; + selectBtn.style = 'opacity: 0.5'; + startBtn.disabled = true; + startBtn.style = 'opacity: 0.5'; + + if (sendIntervalId != '') { + clearInterval(sendIntervalId); + } + sendIntervalId = setInterval(sendSilver, 2 * 60 * 1000, target, rankSpan); + sendSilver(target, rankSpan); + + if (upgradeIntervalId != '') { + clearInterval(upgradeIntervalId); + } + upgradeIntervalId = setInterval(upgradePlanet, 0.5 * 60 * 1000, target); + upgradePlanet(target); + } + + function locate() { + ui.centerLocationId(target.locationId); + } + + return html` +
+
+ +
+ ${allowUpgrade(target) ? html` +
${planetShort(target.locationId)} + +
` + : html`
No planet selected or selected planet cannot be upgraded` + } +
+
+
+
+
+ ${allowUpgrade(target) && !upgraded(target) ? html`` + : html`` + } + +
+
+ `; +} + +let running = false; +let sendIntervalId = ''; +let upgradeIntervalId = ''; + +class Plugin { + constructor() { + this.container = null; + } + + async render(container) { + container.parentElement.style.minHeight = 'unset'; + container.style.width = '380px'; + container.style.minHeight = 'unset'; + + this.container = container; + + render(html`<${App} />`, container); + } + + destroy() { + if (sendIntervalId != '') { + clearInterval(sendIntervalId); + sendIntervalId = ''; + } + + if (upgradeIntervalId != '') { + clearInterval(upgradeIntervalId); + upgradeIntervalId = ''; + } + + running = false; + + render(null, this.container); + } +} + +export default Plugin; \ No newline at end of file From 557bbdbedcf3b5803254a3e86018f76797f9af6a Mon Sep 17 00:00:00 2001 From: goldenfiredo Date: Sat, 16 Oct 2021 12:33:47 +0800 Subject: [PATCH 2/5] upgrade planet automatically --- content/productivity/upgrade-planet/index.md | 2 +- .../upgrade-planet/screenshot.png | Bin 12202 -> 12416 bytes .../upgrade-planet/upgrade_planet.js | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/content/productivity/upgrade-planet/index.md b/content/productivity/upgrade-planet/index.md index ad6c3118..250caaa0 100644 --- a/content/productivity/upgrade-planet/index.md +++ b/content/productivity/upgrade-planet/index.md @@ -1,5 +1,5 @@ --- -title: Update Planet +title: Upgrade Planet date: subtitle: Move silver to selected planet then upgrade it automatically version: 0.6.4 diff --git a/content/productivity/upgrade-planet/screenshot.png b/content/productivity/upgrade-planet/screenshot.png index dd96aa203bebf34bb683249298ed6e7878e53f77..82552219b49dff8c3fceb3c603e67692ebf2a6b4 100644 GIT binary patch literal 12416 zcmd6ObySq^+vm_2l%OarC?X1|AT1$CD1wC2-Q7bon1DzK0wMx}lmb$cLyCZiG>GI# zcX!ON*Ykb%-Tl3Le!G9|p0geg4lpy%GxvR8pX(Esp$}9Qsg5%pN1;$u%1ZJYC=?L} z9?w&f!`HiS?{L9Cr0%zswJ70_Kcz(oe1Fd4j*f?>vz3RJshcIr+R53`lF!}T&C=4z z-NxBtg``#rh2lUd%gbtczh4^h(PFT!lwNiA6zS~z^EId_ROx{p!((|4JA-no>zrxR z7Zk?JCw(K7t++4EOmd5ONmfMYatnrvxW~LtOi;ODL|^UXYW3=E`72!mPW7iew7RG7 zoTPkGbbQ3a3s3m_Kw6)vGRW!7!hzVOOX%9Inyp@aLpAN{Ee*cxzn6(+eqG?=mX8ch zNnw+h_t>$uv5~iJA!9hhAV=bHflzS${ExOz^%0RFA;We3{fzY7DkxMo%H;N@ z_nWx58*B7*BaQD86V>(fULNb3kch5LNl6Y(2~i?~ACAprttb)X<hk5wDNg2T+_TK6-QpUjK?caF<9-OzgoYtv>~(BII+-Y!|H2E2@$HQs;a<$&yAFnw9cw{Y_{todhOVgpi9Z##A9P)1$ueq zJ{#QV<>6y7Exq|m!ijA~aqef1Dm@ogTP~%Tv_xM#d&^e{^%uW`Q`FRq$=&V$Vi*=m ze~D96^sJGQ5h~~@1r4XPbgl7_;v_F-uhrPM#Q)*L)7wi!{W;<|%uzsooLAY;pLew$ zJ-VIGu2&m9+da9mv=lx$X;F2sj4c>&cq?Rk>QTN?xHNuF4HZOo;>?HibkgPs)~Bjj z4J&~=5>=bs_uwRIFxS-7C@Cq`u@hD)LefHJXKifDTW~mb3Tl?R*elv7l&h<&_hMml zLBIhTRrfRYitF~Gu7$NV2`Y|HpZsY(N69VcQAvYp-_t1=f*8tVzW0+(rN`w`r;)*| zrKMMSB_$7kueXm=1oif6!I>esfB(Lcs%p~{vJ(aFGpf34n8UT^kdTnNr!-O_a0ri< zdW7k=9>S8_+1t~>-gb9uJbV6ptUKf0kM?#2B_+yJ^z_%Qew{ts>%hd#|4NZ&@6R_@ zw6WoV6Z1evhljORGgGC0cWr_Q<+r`~dR}s8*q!If71+n-wnP!+l`NtzsJ^~FC1qt< zEiDGs6e&lqZbA2H6;cWclG*ZiJiNT$#u|cCALXq5;EF_{{QdnOJa`cF?b|mgM~sOH z$8>wriQ<8i&d$#7CA`{g^*3fZf>pCfPzJSuhT^7FG&G7D8mIL1^;3K19%yMjO9|X> z$ylot+G9RRzBp7yBb-QuLf#L~?6;vI=DfVTYfRyP%3ZmFBGxu~vedZX1Zd|Q#SWgm zX~!USbm(sTz9v0go)_!CS2VJ}zP^49mK()tjhB^`?WUkW!I20aD7LMq2VB4gs;zm6`>dyXWTwQ#a4p$Xtl0}O z4QO-9f0>+{3;n1VX|_Ju(z&qpr`k{C#*G_MNlAQ3^#aBNNjdGVU;T#6BYr`r+@e|P!Z z{Lp7t=rC}@_D0jv{H#|RZF-*=IH1s z>hc%52_GL76jgS1cHQP&Pa)a={VnW4XJFDr)GIZ2AOj$zO-kmvPbhU$tfknyig~dx!G-EXLZ$NJxjK0aPT-B zgs?`=HbSvpp6UXAvq!DFcFG?uVLe<@RyNTT&J1u9e=Cmg$2`(>Wwg5cn4P>lDIBPD zH(A;bJ#(Gi-JChqsssWd`_rewu%qo5Jw-D!v(*j^LDLuCqb6-S{yh}=*djRpr*L4> zK7T$AaAjj-<6>JSBM@ENV&S%H-2i~0QG|XYLna$FpCsl^e&Wp4y3uMsIsonK=1odH z7bH9*FcQ(PUq1%Ka2Wimtf&3p0c}u(psOM~iiU<}4tM(W>D>wTqge;dk<6@Ji4mWI z;n6I&aqUl9Mbx5cspH%9GP1P8rOANZlQT0zhUX}s1m)N4f5tfuIh0DZtzzB%BqDbz zE5(rtCn6$xd(-|56BE-az#I0e(Fexj0Pzm3m6N|st|{Tf;Y7S?$`^;`kXBT53gxmi zc=LO6^8_5!`t_++0N80GGG=DxFnFF4YkHp@-KkT=sO&FamfaGjW@avpSj<(KO1|yj zn!6lmJ=x@3sPkgeT``1Q4wm*Lxm~5qSy@H;zb6F>`joZ)`)&{!B+~)?f z!VhpcXrV~!3yMh0DpT{53_KJC;C$gYR4U7GXLoP!yqK8oAe-01CFiVg*nkCeMkL`6jfg@jOEHL5xbz<(JwdV?b{I7iKg>6Zk!5Z6lh{J_8;@O z6)CmP^R1yFW8$NGE(Tg10%Q}B($pW!FPP(M0+5?H!>9KQ5FRDt=*SnrD)BqZak$u; zCfR%Z*w@n1+Zh^TP+!^k`HB`67se+h=;-JkZ*F=(GyIEPscBG?#y?wKb-8L-$sp5Q zsIRV0^kE{f{?$3bPACL+cJ?``kSi0XwN@FlbAQ$m@CQl!xm`8|c742n-}P3-shODy z?_L~3Cxm}QE{1@n^RIzd6O)Xr}1eOZuxG@J-C-XZR5s;{Muy~ z{PpYCb;?~*zt#jCY>xqR+ifOI}TWS-riz zqZcvOMt(~r{E?VhA-i6lt2zZJK>kmg$sCm4Q?c5sW5Miq1r0)MywA=b>x^A)nv^!d zIA!+CEiP-2uxd8QtH0T5Ad#1!6emINY(N?CT)tf2Do}eeriC=Dkyw_tz`mcqUG+RC zlL`NQ!U)x#$Nv68{@PZ*G1e_sUcQ$?ZsxL_yil$OA+>kJsoXJZ*gN4cG+WIH!`(mf zs|!s%Rht%%HGZ>p;+OoSTM~^>uZ@u0yn5pov*H1hLLC;Va@TAp?0`cY{(~|?D(NqF z^kSJy17`g#>FBzGfSz({aKJA($;|%k!|3U~tjtVmD;9Zqp`i51m6tPn^mJXFA|E<7 zE^(%%KK+N0zC8>LVF>xR53{wUr_*}oXxZ6mK6ZuF)ya4@%BPE#l$7xB^D8(x@$2d7 zkxQ^>paxouvwF_oy2Uy*HTC1yFL^`5B#8-5jWy(y_Bk{~3!S{-H`x_(<2-*tq=axzgIpurO00CJKp@ z$VH^DU5m0lly`cht=)WJE5re{2#orl`_I+A%;D}DB^6a{d-?I>$6Yq2 z?|b|Bm;$GxJa&u-g)k(Po10tb@88_^c=D%2P?%6fX*_8Fv(KMDFPfj<@|C}HCp9&d zsJ^})eg&)}%Fwudf96-h)2b>-*rVOuU8L(n8`JPn!}sF|uQhSNgVxs8fQ3KE=|kEb zhyqJTEO39|dI(KWTA73QRZ!p*5z&5h|QhmPS$emQ6NY?U@OFF zJcF^#jg6_<*-HCvAz@*1z&1aB{%ldQl1um=N`L+(CtxP|2d?w?-;2_TIFCMSvA7LK z3SMe*Bf$j_*T^}gtW2c+y%<;0KvPo_vW39wV;sNr5&Tmj2G|?PMf>H=)x){6Fd-Q|@dHKM=0D^{kc}=~a zG?xaKS7uUvuo~PL$|@|R14YmfLdSK@YuNw}-CaxZBxp01=+K(-^0Vg65uOA4z`%~5 zIFTVR0*vDoi`c24L&A#M(WVxrH(MR(OB6^%_zV-te#>(kmCKX4m_ECk@7}#bp^#;5 zG@I*w(PwwZ$ERX*f7|p|@;>si?7X~Kwq}zOJ=dw9r)>uafrQZE#*5YjROjeu1d#BL zpl?D$L%XN&$manJR!NZ>aq>~5_`uaZf3UZgT3Fa+D}h&bVhSe*O+e!zp0w%vJ%p}k z0Vrh8a>=mn1Gj$M@UTOfqgC-aHa0fY`yJy;UKcUdMmWoZ``q+GOg`+@L&0j5Jvahc z5Xfi`{ok5Lk!P=`wa%<;_v7)0^c7*P(U`35ZS;Go04AW}Pzz+FvNG`X?%lily~)M< z(5-l5H%`25UmL8+MfUm5ojV#Q;g+CfRXZ)9?MenM7gjD0v@9LfY^xbBv?|ZbG@r#M zwf-EymF+m|>oXIRkf`hHhkf|KF~|ECJrb}cwt%r-+uGSso8;#|w_UMeQiYeXb8wKC zk&#ImLO-gls5loG7^oT(+GiIVE3`bhvJx2=cLpoi(0=}O#inodh<&&M*TGe6?Lz#} zQNR+r^%k%%?DvJKsf!1{%BrhblarItD;lAS74oNB|`o_cmrM^O#*m zkHW*lf$Em!Ow7z!YmcUMNWaEzO6>Uoc1-_DSY2CtJu1i)-rbf97Y<3Y@nScb{PDV| z`Bze3nO+`pw69zKWcW1P+)UBc)nzz1C#m$1H+FF*3zW8U{DDk!TOSY)T~7%gZ|^^S zq2b{r%#7%n{i$t?@jFI>!~e^Un(6*|x7kyT5!{7SOrZu0$wy zdAm4gana#>W25P}XUA-uombrCgrTZnRj!>qxeA_5qnWI(Zi0}0qb@!zjZ@2T#(6o z)Bwf>h&4dEn4eRd(p@t2|C7A=8LUpl8#jT3q2S5I27`JANxd{Z60-mZRA}D(4N&5~ zY@dyg_ut19l`1-A0^UK{J{^EZlrw6>loa~fev4+(ie9^bKjp6M>X zQB}yFKRQsFtRRHp@0qYWzR9OvYh2&M>YAH#1^W;G&^;P-5a#yfq_Chl=>7fM?I+Xg zL^1&R(o%Fm0|!}D(&64vn*4Gz?q}v>PKmvl>1j?*PGUi;Uw==dUWdUmO<+Gk&;1p8 zz(iZre5kLd7nP6@3a|Nj#J`M)XiB>iR$$x1ovT~iG-Zrp**>3UY76fu z>buD!>@@7%e=!h+kWAQN*U2Arxds*8Q%iz-^j!sSl9MB<{dTC)XPx3<-9Q1vm$f1n zi|(?iy3(<`qNSlR9(Qo=U#w34gr%71=qI|xRzxV(_o9zMH=|`*H8nL~zkN$7OY4H) z_w-+Hxdg=%e;NyY2o5`ttyGOq4|H`y`SeTc%nDEH90H-pd6f6$QO@%=s|FCTmd5SS z>&>Tr#!{X<`3zn**OTSC`d2o%_4tz@DrVuoU_IQ1+RAU0$TO~GbFNw=2Od3|DB;C# z)%NarW+wMr74F613VNXVMWyw+c#xK+`(@k}oc&kpDO88B z?nm1*yG&QFJj$)hR{uzQ?p$cusBcblM={o>L=VWI0T%68*UzU|8-oGI>C~xHtJ8_j z#HeHp!N;J&jSO6rvr+3UF_*Y5Tp-P_C5VGol%bJ6ytci96SzWn_3ES+5HxT}i926E z>+b1Ui^Lq7%ZxLU64mba9VRM*i7 z0pEzfRcieQ7v+f)3#EM4Q%PXd8jkO5Y&3v?LvH7rUCHhIe!2Yq*3lQq^EkhiYIthH z3o2$53WT4~`1p8Kd^`mTafQGqI9atnVwaHM2>+!WLU(X^M^VF#)0yVp4oo2JjwZQ?% zO8}xN(s*t&+<7nRN}Qve&sMMw`WNWJz5I^%Voy6e9}KJ+S9%-+bslGg0W}{I8OdI- zyMkSjnw*|Sh#ac(&!3RtVS|CS_}EyWbCf91?63qZfj+<%Ii#f6tUHoD|3nn8C%0-d^8lf5 z&I3r*oO@OKeimE-oaFN$Ar5*2F_8inH#Rrr-Q71#g1hnpQ}!ZRB_4^lYJJjrE9}Vh zRc|RMmhtpyM8rrFcDaE1nVE3{*-m$>Hj0G3hVue#uiin}d}F!|9B7ix>nGhM)EU45 zyKb@u{B+Cv%+yta1Q`Xz#IFQF!%^cxGcp7fF5Zh1&Fwd=h>vHC6EKbdNd(P+<(6;n zmqQ$33HNtl;e@ob^ea}0Gblukj)TvS5^wiU0rmeZIJm*CWE_0DKNaqmRJdbu_kl7% zAn@k5*F+N)+*0rmn0KlD3rqaPem$6gPb-TX6AlO!|CpJXIpk)&uyX%Mbll-cT%zX1 z6$}OgcybCj)G90lP-HM$B(Roj0h{UOuVcikW1@`8PE^55K--h~D8QfUQmgq6VCRuYO05 zDcBH|f@R%V{NxV+CF-|*wWzq52nDG@@jZTsO!!|ZaKZUr19Ic_N%}u5@`t>M;-0*5 z{D!=SaS}PW-d@sbBj@7SW!i-mcL<5mZ+N` z8)0iMfo*g3-j{T-3Tc>5a(oxQ!!c1HbZR;o6r!HX^M zUNaj&j_N{D!Z?(n7$e8%qslBkpu1dkaei_V*`MkY&h%&v~k< zM!eZ2`kUxnBMb6v#209rsc<4T7qdCrW#i;jDlsrvi;<3wi7_mGe51mmG!n8G=*O#T z&FmyWhU>0gdjP(Wt?|V2fvJYrw%W!4WFIE<0|7GMO8VT8SBJJ&nmFQ$1*Sa#wvb^{ z&d51rIgw)rnlvT`C;~Ew$dMUc8 zXQfwj4>|+(mlm9m*JhpyIeiFo0{BfEIRNygB~862Ee5wslB60OZ{&MSMzP3UXz@dr z4J`}H@YMXBWx|ScK;0Swf7R|vvn!Y*iBazfDgbQ7-@wKrx!kt%izn8gI|N#Ml5;1TB^xKg?$ z2y@eGXI*wzO~DV?)-lr6wPm!=8fyNU^eH=gwmYlZ^KjP{@pWXHz2~7J;4BlMXG^H~ zRu3HE^HydNKpa(OxTBNz$o8sk`~K8sBo_pKb4aC*+!x;oYq5Bu&=X*%mDA@<*qbS| z?qHkaRmGGv}D?{}YxuN-hd|Ivor z>(1S~FT+YRSN3mB*Fxe50vdXS?XR_M?DR6f06%}zaD{tDKLEt*OetbkYY`+Y6{pSx z!`(LXSf{I;BiJyzDMx$k*c}R90+ME}jW=q%vbD9{g{re`PKk@Nia!aBF8KZX_xwX$ zj3CJ251JiJ++L&b12))S!0;IAlTbvGhpP=m3z6pp$syA~iNEMz^PN5Ke}vyLi~~8# z!^gL@UQ`!OJrHCwFM?j2AHGzdvv@u}w5!Untpk{_>nVGXyvAfl#d4e?BUNM-OgnZ8eh6 zNOoG@x_R^FS?NGYfOGuYw`b=9z|i{sUEX$}y_SMW2`{w)3#8!fEea%-MxDWReNq`q z6O3&I4fYbETr)7HkQVE^#Yr4%hEht^d3NjvkQJg2ek{R|#Nm`~$f_H?(+9gYa+x86k#MjYG)O zj~_qkAnXQf*=4r#{3~V=YP*ukp##b?36I$*ArA;01t+IV79#DPZ=XxzusUBHvi`X!Ae1 zq31hkj1-b;Ea8+k%c{!2ToT*e-$x)0+zSw}xF2&tOfxyQQc0;0)20o~Mse@}vY3oIpNBN=?dwufAEHY#k4I5eg z?zi~+3SWItNqZ(DoSYZ`tFxYF`U%`LutT1*z8JcrsJOFN?|%y!6EVFkDA==1!?5xQ zViR=aJD1b(lB179Y(6-SRG!A*7mQ&gZwLymRN^+mBO(-heZ@62GzzTRnEtzD?1tPE z`4(Yl0GV#Bk?(0T$H&bqtgOu71Vhk<_BnVz1H&xW{`vagUv%ETJd_LkJOgtbFGNPY z8!V;C$Km)K2h~M}5_KIXt-){Wm*s_p*zlZPZ($G8r^n1h@>K0jC!&H76x041{A$oY)3Ch*1{XBKv-TOPr_j*BCQuocgHf5y2SFdqz`4|#c1VAdsy zIL8Gh*o;(q?oP(262cd>bK!kS=s@`Q+69drE0AmISG3B>h_?_3VHqq>N%LsE2$uFQ=L`p%! z_Wkq29N#{2xZFgvX^Q$sg|Uqe>0q9hsG#WRQ*%2HAZfn}(j2@KIUSw1hInXZcdhrq zF7J+H!#VYReu!+)TVNdk<0l|K*sr1j7aj(R8iC*~)zF57EGzJfZRBTX2SGZl!%azy zgq6^!z8lC+N{EvwYP{lOhKfL2}u@2i~C0_%Be zZ!!jLe3dtLeB~*9mtp&oEs{6R#9!>u8HCIDW1lQp=z5C=oz zh(f`@#VRZf)`L}EUM_qnrnb%MDU@qa#ChW2#rSj_E zQwW=v4i9R9&-ks}0%Vrs)h{q13fvu|fQDbC?RbWfkqc-FIE}DXqCV>vpn>f(u){9a zv%8uGTb1MC${E6_s_1|r^10JX<8WKPRQh!aFN7=MSv9GnABo;*SP zF%ZZM_P=vwm6cmef-NqIi!+6t;rj+PgJ7htG0Ki;o@(uw<^w&w!HFlz%F2*l$bg~+ zifVXzBgod#5e$5?P2XEEeWI?ee*MpRx~^+$!|olaRaGpYs92&e)xa(M`1$iT%qW5N z14d)t#5&9wMoCXQ3o)r17!0p)Q0Tk5u0>%jxYAM`yVCA}&$j|ofLc~o++g=u@?DYG zqaY`zZgH*}1){}_-nkND<8m&%>AXnq1dK6-F2?A$Z^J44kA!x!ztiyy912R7bh`74mDnNp2PmzwqAMD&~MN~M9X9W*9D8Q_f6n<0lANhsw zC+M74u#65@tVO9Bc<(@+UeIwVm@E%hK(@0~^hz%;jz4T!>)}I75erR7 zEt2ZJiuCe;dBq#yq<&52!cKYZFBW&KE|uZTmIh07uxLIw3g@xQklDUk8Y;UNS_4%8 z47Um5(+tb@!5SD)y$9jY=e;zB4dOm;Fc{Wg6k;eT0Vj2^h6W6QEDF5>(fN5vNdqQA z4dPSyz)2PA9nt1bnZZF?2>XackA;4+%yu6gxwLdK;y1vNl1rt=z#|#)6`Hxlim$Fw{HO5}B}k^mJ|7>M@;%9L7KdIn4hV$^$a z&*Q$;Y)5-3N5^2$1)fVIwOi+uJ=2*ghny!5aaM5Up(|Ghwrvs_cr@$)$3XYoU@e5; z5Q>X6&ale6u$3x&C`HjwQ?ti%U(5NQvId`7?C|3ki6po{mTHol4jP0#iF;^9-@WsXx)!pPK;NwBPZ zgAz=QrG5MelOkF0kLA(um&Hj;+2Qum$h!V_c_EkW<&iKD<5cLgsu};xqiFsvDvCiy z4M2%pgJm=IA)}?G4T9(oyes00ii)SK)O1u_aKnx7#oSlB?+H+~TnU1d6&cY5c&~?f zF^fLB|H$SF{HkocU{Sy=gajpcgk9ZJidbAkgb@zkKkp+5Ga@<_ZWp0(1P}8dHw$8* z5XlI%wIvLtZr&{Mf(e|E7quW!RJSg0YH zF2Gk2bc~*R^+Zs}EdTVvLKuAW_x4<4gbx8lE7%eOWAZQ<&%U@D67quzTw8TLH=^fc cjk}nQMR!J;X%}7iF9ay%JF4$~bWSh#xJcQ!{X?H%mQ`CQDL&CTsytQ=fd@oS|J zgcVVilez7gygcf2n?~;~(VBysa7V~VudlLH>oSoTO2X7HA8nZxFqqJP-9uRFV^K{_ z&8mYxZ9DA_{$|^IJ(|){e*0VRb8~-OtQWPJYL4=piV}XfYQejXJ>JDyJ$gjY>9l?H zyFF>3!j1RSr%wptGW(;c$hwD;hUN*bX799#-)2JN{t~|orGUkEy7+{I(JepfuC;eN z_G&&pmAq4qry`ps}pyz{na6tfueov(8+Kt4^_kx-pJjPCW;SkKpVq+TT3o*7>ku%b<6ff}&-zDRTW!8$ZSCqy~*7k7B1Og{8qlB5P}FM2vZ2 zcRmxV;-cUt#?<%uZg5~AGUqDx(A@m~w|MTIqy5#`xH$YMg#w$?~tHvKgg z3EUp@p-@*>kC-$mwP)f`fAgfX^OmQlCxS#XOGX?V_=XNCPG1T*Tr`2FH#fgX&MYy2 zv#UAW8urgwwV|b@{rK@?V7-8=e?q6V@_1VtNo#BC&f#hR1>90=9H&|Po9jD0*dqc& zzsQOzA~Mox^2@2YP49!P(%Pm-{u<)QCQR?d)Ku`3Cjp+Op%Vyt}&)V!HchW^H>rapA3WfK;w=bwst# z_6g*JCN|o8ZM}ts;-k78e!|(Z&(=d zg^L&87Z=ldS2I6-`gCV^7MpSw*Yl#LwpJQmAe75VL?qxy0!o>bpP#>|q@=-0@WJ2T z?TA=&izZeo3TnWp+WXEYb`cRepY4@|=84G2$c%!vME>Dr_yLN)vmHd8U2PPnPQ_}_ zAtIh@tQH+_`S@Czny)J!%o!gWi{`IAIMeo$uMrN`aiW3n8H+UY zojZ5Fe*gX@ib1$yIjwMeb$&j4rY%u5?h@Q_)N1W9^XBFzA|@7%uf7*~j=wpYNj!af ze6A~P-zZ?=XBMcNcmbhM<%2CG4{QRqKW%85+-(Ow9*ZH6pyATl-MTk6O6g|_Q zd#}*2HX}nmqNS&Y8lKE^;_11izV)rG5LV&{`>m3qqF*_sV=wOEg#DVv=lkvopN*8S zVEZiSFDxv~;YUvcwJng;o~M7Q`;k<3FHhxYhxGBKL&MhcVbS2+>S`u8H#Y#tTN1iQ zU)f`R)jh`7ZV|kC^~~7Vn07fUG1QEewYAo5lS~*&xApXfn*wYtOE|Awxw5lAetenl z_~38HD?#fs-`d*Nd-Y82uTM68{QOx?LxUW~Q!+g+HQnLrYwrVZTxe)$e7cWHauBQ1 zaEhqQ$;h*O4Uh4O(3#zprl{J(B<>dNuzdl>7)*?T0`tfs-1Fy@2$SUM+oLsmd;9L% zHn>En^npxn*5w{3kBS;)d&v(fll@kL5o1O>#AC5o*T3n171m6p_|tJaGh9*Q5AsRpXM-roLcV@g+S%XtNcwrp*x25qn2Cl) z@ZH|x;v&_VGbaEB=Zg(jIk%>vkzWbfy(yBg8xo|UrNu*_=1AVL?*_orbQcs(-bp5O zadvh*KHQ!f$Tvd*zkHFaRDA_F`~Z%BpwN;+PV39F^Ve<}8uI#aeSa&-5ODMt>vXuc ziAQKtIGD~$B18H7%^RM3=K7b;CQAn}1AfX|Sa1YJC#9BZm`Hg2x$u(T1j^j~295mA z?k=0C=v|wb>`mI*Gb)p~PoElg)~7ONvUDY;1T?nfev3+%WbHfByWr zQLg^r0S0b6^5aLYOZO^humMNqOa9E>b8LV-N~Q((D+_3FvS9&h;@qetx1(Cu!D;7YX5K*S5A^uDFQs8sFbs=$)Ks z3^mvLIq#}p?R{M#ik=X#Xko#|TI?cHwKZgmp5a+O0|E~ZkF2U|`574*Y*(&md5;w; zq}9hrA8}peL($mSix5|P`IydA*( ze8-8KRe*`z&s!RvlEfw_KYRJ|tbUH}(pa@&#hKW@aQl-9ddBm`64$TOLVH0^2C@== z%*m0Lk-;Np5=-YgB4ZFTg$eAQSjix4UnI_~GHH_kfbf|DyBY`e>C>mzV1|n?li0|m zOnVo2yvW_=3H2VXY#vUSOy{31?l)fCdKIEkUtf=+n$+%e-0^rmt0@%4&aYsK^z*!O zf)b>gUuM-j47zLiOsIMmH{Cr_9!GNUImO^?^flne|WY2 zK|VAY@R-m-^{_B|_Dr%>%2;pGO*V4N$u)ASEaTa8$t$k^B7NrFoT>hmo3HPB6aX=d zuiea@UQLZQ5$3>TF8Fr7)5v7F8bj*N0k{*{)IEhy8;Wwy!c?LgSLdmh8WeFwx1Rq1D~LxT&P7Dtq_t`Kwp2 zLZ>Y*l!e`97Z9LSNTUK$_x0;n(@D-mZNVyP7M7TTf~&yhu1rvi-nFyiD<~+qrK=mV zv$IoA9=hTf@uH^7N={2FHrtF%yEru!Ll@OtPacf^5C2=YD1CP1F6$Z^w(XlwJ11Am z%B5q}_T=PvQa!&}I7moH0P`V&G9?ZQ{QcWvdS<5HqL6z?>hfiB0CpgRBGAmB7MRGg z7*aHdV8kT;T>d!Ri{4j3`~HHm)AB=mTe)nQCS+A84AA4|4UJDD>rv**DY^a7*{4HCNyWyRy< zM_Djinj+89_TwJzpQ7e~s~aucPk{j?Y(Ekh8cKxHHXv8X4J#`ygq4$%$j;6#VrzAE zHRjbTI^rNii$=@DBqk{6g#0i)=}8pYVK4w;dJ2t{ovl+<{o=6W^)(_dFE0W5D3}Kd zetwe9&d%w7YND}eEsCvM#>U2BF)^VEX^(ZY?6tKX6%(QMYplj7fk-^ySZXU=>|lt|>$_h65)^&B-CVfB$~o;G=HghY5@U zP+2fFZ>DwCSronp&KShXC3YkiTtAVHO-hQaT&-cac<~|^KYu7!g!_z>lM~maOYu@P zlarH_XU~Rw`=%nl*=8qg-F+b}HH?~51DR8ji{nsl0N!GH_4V_Fgs1CMEsYPaPAv3h zAKGI<&HYFgW#4>gW@bhOq{Fs97Yc)w6#+KWP3NGdMw*(M>NwwhF>`5rbd(9@uW)m$ z5tuV)&MbY~7xRy1X1O@b$;mkd1oEb=EIz_|}(pa zWp;&UH;jxJftlIsDJm%uUp6WWjN{ZifdmByXB5;#*Rm4B8Oi}AH!v`G*K2ddZ_l-| zf=Ti?Jh^>hP&_IsO2lcBz}L_33J_PI)T-uCzZQjqD?IQ1A=lcsOGmcEQplkk-Ax#; zy;l3$-d>!onB7b6nOs~@&}~1LT2yp16Q{TP2v6q+g z@nc;W6+6NueH6`zttp`(Cs&Y_4US*KW0jU>0h!6LR#Wjpyas9 Y&Gq&zQzH4@) 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 Date: Tue, 19 Oct 2021 09:20:29 +0800 Subject: [PATCH 3/5] add upgrading pattern option --- .../upgrade-planet/screenshot.png | Bin 12416 -> 14859 bytes .../upgrade-planet/upgrade_planet.js | 40 +++++++++--------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/content/productivity/upgrade-planet/screenshot.png b/content/productivity/upgrade-planet/screenshot.png index 82552219b49dff8c3fceb3c603e67692ebf2a6b4..7b9a6c429ac4e9e629267ba77272e0ee789e13bd 100644 GIT binary patch literal 14859 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 yZ^^?apAPyY`&lzjsL literal 12416 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 cjk}nQMR!J;X%}7iF9ay%JF4 a + b, 0); + if (pattern.length <= rank) return; + const upgradeBranch = ["d", "r", "s"].indexOf(pattern[rank]); + df.upgrade(planet.locationId, upgradeBranch); +} + +function upgradePlanet(target, patternInput) { let planet = df.getPlanetWithId(target.locationId); if (isUpgrading(planet)) { return; } if (planet && canPlanetUpgrade(planet)) { - if (canStatUpgrade(planet, UpgradeBranchName.Defense)) { - df.upgrade(planet.locationId, UpgradeBranchName.Defense) - } else if (canStatUpgrade(planet, UpgradeBranchName.Range)) { - df.upgrade(planet.locationId, UpgradeBranchName.Range) - } else if (canStatUpgrade(planet, UpgradeBranchName.Speed)) { - df.upgrade(planet.locationId, UpgradeBranchName.Speed) - } else { - - } + upgradePlanetPattern(planet, ([...patternInput.value])); } } @@ -191,6 +188,7 @@ function App() { function select() { setTarget(selectedPlanet); + rankSpan.innerHTML = 'rank: ' + getPlanetRank(selectedPlanet); } function stop() { @@ -211,7 +209,7 @@ function App() { selectBtn.style = 'opacity: 1'; startBtn.disabled = false; startBtn.style = 'opacity: 1'; - rankSpan.innerHTML = ''; + patternInput.disabled = false; } function start() { @@ -222,6 +220,7 @@ function App() { selectBtn.style = 'opacity: 0.5'; startBtn.disabled = true; startBtn.style = 'opacity: 0.5'; + patternInput.disabled = true; if (sendIntervalId != '') { clearInterval(sendIntervalId); @@ -232,8 +231,8 @@ function App() { if (upgradeIntervalId != '') { clearInterval(upgradeIntervalId); } - upgradeIntervalId = setInterval(upgradePlanet, 0.5 * 60 * 1000, target); - upgradePlanet(target); + upgradeIntervalId = setInterval(upgradePlanet, 0.5 * 60 * 1000, target, patternInput); + upgradePlanet(target, patternInput); } function locate() { @@ -246,10 +245,13 @@ function App() { ${allowUpgrade(target) ? html` -
${planetShort(target.locationId)} - -
` - : html`
No planet selected or selected planet cannot be upgraded` + ${planetShort(target.locationId)} +
+
upgrade pattern: + + +
` + : html`
No planet selected or selected planet cannot be upgraded` }

From 6a655189f87bf1fa54868082dc7ffb05e2dc366e Mon Sep 17 00:00:00 2001 From: goldenfiredo Date: Fri, 29 Oct 2021 19:00:05 +0800 Subject: [PATCH 4/5] display planet name instead of Id --- .../upgrade-planet/screenshot.png | Bin 14859 -> 12912 bytes .../upgrade-planet/upgrade_planet.js | 11 ++++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/content/productivity/upgrade-planet/screenshot.png b/content/productivity/upgrade-planet/screenshot.png index 7b9a6c429ac4e9e629267ba77272e0ee789e13bd..e474ae9fde1d67daf2c665b84af18db764502cfb 100644 GIT binary patch literal 12912 zcmb_@2RPOL-}g}xMMPN{sf4VI>=6w_l$m2@Z{cvV6-t?9?@CDa-XnWULL7(69>>Yv zJn!@S-@ohr|Nqzh+|P4g&(n3eD$eqLLRx!KNXaIc?|Y<&5>(n=`a(UMc~G>d7hK=@h}pzDgG!b2sDNDtT1Q;n2y;3N3`u^wi5_QUKqE8*>(o%h3w{WhNCvsHsOEp{Rr zIyx_VERO7(m#gp;6co8b7#1=?C!MvmwI&P(GhmKl$konXn&?Rs#bvk-dpl;2Z=zD^ zX&aBP?^aJ1*OVSCg|Q8F57q}0$5&*#X7Xw2sAGJpkoi@cs-$d4Ho2<-52RxyKGfCK z)vSM0uGwA4cI%TpSRb&%Rz)uk=U11Cq1~sWb+!jm52wEAMwIOj`yS8@4i4TN&`nJg zbu6;zVZ5iTOcW>OF1R)3Lg~G`{;L{aHwj;h>mml}{Z{m1Pc8-q2BN(%@=u?4T}}=S z4K;YE5G$D2<3J{WNb9$voAN(NITLT0@@r$*=%n#Po%a%^JiH^4BW+-QtmwYZ2@;aG z@$nrP$9miw+-avwrQxDTKEs-z5xc8mVm}7bIcsWaream9z7D9#;=b*_dGn?_PM|5> z{HkhF`&@sT0WyPoV{tf~LCE6IH)Vd;E}D}LvRnI|-1!CWYZl)I2A*Z4Vjh({Bs<>^ zGR(L9^87?VK)}1<#g5KSll8fNCJ9u~(vn>Xk~hD0lTokSft{C^qIg6_OY3~9@1gj{ z#s=|;6Y!bOz8Jr&t4n$Df@CO1_m;P}G(tv3#>~QknvwDKppE&_;ep$RwJ;-#@4nNA z4<8C1@n~vm7g-NnRk^B>xmo@G{gWi{I%+uD_ zS8;L@kdwo%4X0sQ%zS)&K7Rc8XWSG2xD?57!{*#+TArUxl(NLeyX*5)v$HNg8;JG~ z4%`=W%OBM|6|gAQ)m4BfS5i`{S?iVjVJBi@ViLt?uc$~`jmFQcPIn=$T)FaRE-ieu zh0X|Z-S^Ndj8(R`KTUxsPRQ~MiNBogR*CgMh4b_&y)ru@W4My;6zN2`2(*=NqHT6| zwu_CA!p3pfUXjz}T^k!4MJ1)juoSz|l8&rh*_|nx4{2%cKcAi4UMlXBC{aTfhlG%K zc6H4U=d+$Tabg`mks3_L@4P-`Fyf|RoR*N5{A(v0eTh)m~Gu;bcSV>tzwJ5DiAkhYufyFiXZ%RY|}Rcl7j3f6vlz$Sse@_;(v$ zFEDL8lcUXzuY#qhM#p!>yfzNN7!j#mL{jO{|lr|8S_k+|j7aZsbFV z?ey#{_W++km05XhQW8_f{X`Ps($>bNrf9me4G;)%!q#tB#rXKbj`sVGG+9_B-9lcn z`uvzbSlimNod1@7b6{9DoF=x~)TGuAQx&_ecTzxdm+uHIhl!@1s}{Ncr92ewn5 zo{}~Qbe!Rf=%dzPjPgkdudXpvF zZc$2`iTawFUiREvdJJcjB;%dnGTSQvCkwS=q}-7;Iy#!Stbgp@+Qx=?Z<2WDtB*>N zSDog*vN?=Z5D9z7p@r!!y5qjQptuk<+~-Ghd^A~BMkZx<*TW4zPH_{7WP}qvcmBM9 z&;C<4+-N$vi!fzi zuSb^_AQ4+bFSNlvqFv#YL{zl2t%KP*xEWE#(0kHQ3vVkZto;t=AMF{)*5Mas4AtNu z4!L_7U$>Xnv@`n6@Sw**8e=7r7#&H{JA|K}W|te1b9HqU78W*!Zx;Wd4Q~16oT-|u zeu(QXbd*`c{`k=jp-)Ce=H#(7-><-Gjw!RhXUZlakziQs!8LG$k>c?1kUsQo=Fl+D zl`8>7MS|74j`qeS7E|qS_9u=GQdhSjWJ2f#o`3joscvss5>7`>Nr`M^WJFU-tFm-l zukxJP)yS;D{4?9z+niqpkn~oDi&hzrcGbKUNOIPmb z?l$X5xWRXxiH@$V&U-J)e|m9I+05(;B0W8wH=*&%moJ?N^RS0BpCg_eEr>g|KY7|hKRS3k+_6ZQO9vJ zNL0J=8ivH4)(WS|PoF+Lc<%7+qY|M2=~uhu-a4U|tDS!0Q@@p>va$x!-=a7k%Efi} zRkKYT=APMC=+YiqA4JsocBwx=7X_w{|!Am&yU`k(^mV)18Tx zmEV#VYy9<{+!c2Av&_srm&2tR!(|T@-QC@*yRL9>2w8o-NJ7cdP58c!k@xfyNlNK; zDoBvdiE?*4J7{QAGc&6{Ov8!pOMhgRbSrS2kg@1ZQc_VNM@&yoGl@NUcWaMO7gx6@ z!wGOhJA1nQ&E>HQCx2LCWL%sg3MD*0KTo(pC~Hp^zH>nbi<9;g`MN#|mwYUtb@-}E z+)V=m=30*p^;Qb3uA@*Wt>cA;noPkTrM9t6C)Pcr)ucDh9qetj*_5hlYiH;)68+g- z%rAxxoS~K)R$g8%Si94ckdmV6>|C_!c?+2vW8|}Q$NjQRDKduNsP}?nP5;8CLKss= z2!l`*4)>$b-!jGhE`#6j;s!)A)%o**BX$;jDbmnSR%d08bmtw?Gcw-3efzxMs@bHl z02*z2%UpY+V_gTdE=*ENOiU~65fV}^t^dKphhIjDEk`O{GBq~%^~yrdb8G)_)iQLS zK3_cvSD_}ebEUAbFiz!aZ;Esm;fTwEpLqLkUbDXziMocs+t(Y^dV(tjz;@WUb= z?}#otmY|Bp*onmY+`doB=HRNJP|I&nb=${BMmdJ(i<#hKk;Hy0VTd~2-XbzKiEfxBL&SLaM8g!{%{Uj!`v@8|7gJI1( zG*}Lk-l5t@;iaX%C?KY>8&pwXyk}xj-c!bf);UAbOt#Fzpywxk$}NTQ0ztWP)q~3;)ei^ba53 z@%8nkrlENi8tU4W+Z#xAA6k7!SJ!0oD;g+^YO!h8_)f$_LxngzM@w7ez2|oA+O?|B zd~C}SP+*!{Ti>Rn^g?p6ckBOD9~Kl4c+=P@UsP0dr8(e9@$1*8;Gdj4JXZt+`Uj>z zy;hc^y>LMpik;5jr2xe0>S|DE=mv`6^KbQtjrjouq=`JL5Z=V#>-Hw8^xWSdeay{B znU$55nwt90=H^|98$CT`Rn@S8av3#6#fFIqR{t*zkTJj#Ty?BZ)f$H9=R3ycR2MHd zA4+~3nH)$C$0yHBPq+LiGzDGE#WaQ*mL`BQH%K9IoO^%r7msaL`+lFa)XoEAAD{L!x+m9VP7DaVD z=}dv7QszMa*RMb41*>vbMb6BCz=EFf?;S36iWGwsu-Amvy-@lrh83KTULzyi~ifX@h(?G+72l0+RK*!^X6{c)(4 z54E-LT3K-dVtQXz7E@4gy|Jrq4bHcN-KE0zkPrYeN$01DG2& zdWK01AzWK|H-ui!+?@St4BUw4@O?u_Q6XEvbKdWYap4NoSX=#V`D)p zGlr6k>=%HH&bSUZF$Srp*Xj5TQC*w0wYBpT^|CK1Sz9fN-$X^3iPqLm4v$PucCT`A zaqUA}=+|Od&_jTEjm0&_7#SIxHtiNF-{#%+1rWrj~s(64eKzqsVG+TPv%EuCCKh zy!I1ZwIbjcN`Lr9b_5vW$GY%Cd`LYBPcI@s%i}X8n_<4j#>TKPdUcJb!q=jV`;(zi~=e$J&r zqxP8xhew9%pLE+BbYYAhmDh2?R>>$RaDS?pd5xedJ$X{lB>JMo#A$)zNp(a7Rmj~m zEQgy*d5^A~oSa+uhDYr{ZfdW?#K`1C|0EpN!omXW#_smE81|C2on12s3(J)ly{51* zJm?CqUcLGSv@soG1%Ui$mc9Svq>+KaeMQ9}tRR3ew*kpD!bz~VdwF@qi8);&pn#O% z&`>QB!O**xMS$p!LttYbK7!l;o(AE ztTJA4A3t6J2nC?1E0(_+)w()t2mcs`%SG<547E?+caq(c+2 zvZm5nDtdc)Rk*KZyu3!eJj8Cv8#t%hn<}fOug^5u77n=2q!bBh-npe0xT_R_B?1lU zTkev4SQzk%=&uXE^cRpZv9Vp&W^7fDpteKmr|{j<(my4*!|TLWl`?jr$(8TK2(*Hr zurQ0p0J3j_G>tv-w{FE>e|)UJzu(#VMX)~OWg*5;yNSBw=H}a=>`ar8$yYpF>m%uq z<~5jIHLmZsy28z^?9-@2+Hc?P`fnQCUs#6YFG1}81X%uGU)ndlhdkBK47^Loaa@W3 z#_jBKGP|6zYigu`tF`WKEOPPkZlJ`mZ;9g{)c*PNL_6QG=kQ=px8e!g&dyE>Uq>$J zF>&H9SAj2C{AvuOw#bdhOMg)7zBW?`ok2V2QU9bo`9-LZ0A>k@f2J=LKkr<{PA2%? z1GtD85YQC9v@Ux%to3!2T5LZr0JK5KTHG7nLJX)2TNNv^=r{ieVDYPstpkv4QD(sH25L34P-L;EhPMccpt2aoIQ?3C1b!Yx&MP#s-fE?Qbz z3dgG8q8t$&6?NUDImj)smxzdHe@*sC=<(yna~mGoxyTk^qJ9~9^T3ByH8s!C1_y#@ zA!0uo&|!A$B7iASy2we6gR}^OLIDV@3yX_HUu{ZjHb-p z(9)Tto<_idOOzgk#h^>Pp)pxlTm?B3vA>CN^jc}5yT@6-zuL7wujX5%XR)(7U9&Tj zcynN4Gb=Nt(WdnGAWdsJ-%Wvc56^7Njs$3TV72Sr^>lW%W7G@N8o+3pQTl6%V6mrV3z?B2<|3It@ zcx#7nQdwCNebH=d0s>fZVwpP5eNJ+}*-EmLGyzQ)J#nYfjE7D{Ex^P>h;|r5AWN?y$P{FmD~C zh?Nn`R4(2JPynESL{kzg?BT6;HX&ey?0#Ga8kZ@xb+9!-_)kr3EfEt-FzlncUdPq7 z^cwQ~WreVh1qBg6@DL#GfqwGy%Sl$^1d{p4w{L&cc~=*KI3I1$0KyG78_6Fi6a<)E z&J1l9x+T(1mWL;Vfcj{ts@-sx*x6g8C7;qcVbHwxA{S)${~X`j!drrd&!b-vakP_q z^e{uT{!zlLy^qWG?k+XxFTwnER^@d-Xx{f*MY*^ALq{wev719l{QmuWX@>vWHTCiK zJZFo7dT#J8t{H?5iH-Uybd>{yOPcW6%WYW$Etd^e0rI{Wc@ef6E#xwzayW6c=bI$v z^c;*O?j{nfuBN7Du(qkI>kS}22y!N|2vA+zhJP(CcKK7vC_a5ECXz@YD=V8GJl@^a zl|48v2Oa~1xbsJ>tr5s`nBqNbJf>dQp%l4;nK*2P<6qg>&}wxWwPikk{`|_}9==>$ z`toJ}-@i?ux#X5q0L#S9IJG^B%M`N_ml*Z6)Jw6q=KbU#T|F`yugcHQU)=^xqp7Pa z7(}y|vnifoP&kTwj}BD_r@4CC(kc_jX_HmkAl3RHaPTIDYK6 z5<|^VNxCgPG2K9Ol%seZeIFi&5+^n&oekuTlk*dnP6gn?-X>0C`~j%2yfPc#b22hs z6ciMQWJ>;ZhM74zId?>v6OfmChKB%n!)Iix2+@>`4aLF!9B{&vv z1NbEe(y?=9PzpX^(G7RQm|l(8xmCUL`twt6raL~Z2JzhAKVHK1GssqU^upe+q3yU< zTo_^Y-kFZw@2cNF4SFsDq}c18n|9L_Q&y1s6D*M(&5&_V!PJPFWqJCO=+voGQT9_) zQ=F4`5y0%+Ol3fbOfop#Z+!jJZ#==dAh6$ea{hi9F&a?(z=AlDaBL3vq!i?Or)@EC zgOBOyME57nz4tb?hUloM8fv%3F(#7c=H}!VM98fqZb>;$DNeg*58eY|O%VU}{Vlza zLbA58Z>5mo(hLj?`@blC8_WbB8XERyrur4g$Xw^s`h!|b9uH*P?_8(2 zAo8d2G(Tr*6x^Tj(vQMrPG&1cltGzYJk|x`iQqyx=pF%bjJsh=TkE-X7YHPnE?`VV zt;7Q9aa$hiQ0A}w7?SP<>KGu`hLuA}5*`Y}gkiz%D!G}gh`ANKdyu8y> z9g#e`MZ}REx52@KTV=2yNlax#Z@?Gq;;|!llNMS)7zwgdz@HE)rsKC~lE@Jz| z_|KYW=Hl5#xCC?NWn^{_wj@7{V08Il@7}Bv<_nl3`WFEC-UFoE=H}+7RUv$IG&Hvi z4O23^=3?MA3-*|@P>^Ii;3u&uDGpn%Tq~5$l49>YKw{CU+bDo*XW80202cKzGgAok zWm-P{xxZl^#3Z4J?X1lfdu%MQp#8%L@X~RDZ>z-aC2{=RSukUC3r$Xd&-4ey)p*=2 z?UCr;PXEL?+$O?JDDo+f-M8=DCG&?qgs%-vK52> zZx)9wmD>bo_g%l0l)(%6w0=l;?5}zGv7Y78i$aM#Am*sWz9$7O4a}>ifxwEyj_3ny z05C7WZOkdl*3jT?XAgpB+nJ@22_`MnbWnOae}3_omN5c5wXzc0H9!@xq=H_(lFP2O zmF@E+2UOa{U*Da2xXw{MOOUGpXpsrKPKr2=t9W=wAmHISdgWnYmy4W#KU@r68K4dT z2WIBx0v_vDXP6~!ySa$~y&E?449(Rme;X6?V#F@v^XJ!nvPVhadOd&syuH1>!T9?O}605V9?}l8wbmiimEZh8W@Kt=-?QTmR`t=7psF2XmX$YyC1DUgLE-Qek zU!bP|`W1XeuwY(vYHE0k3DHk*!0ss`pgVl6_w{|3b%U0LB`<)U;O)Y!%>$OUmX#}~sk^J{k#<~KY5;*5^n^&Cjfs;`|q`3Jf&H*Wz9Fo2ahWFpDxyI+WP zbD%qaK0QFmb9vnh{9B)c-4y^^8k(9Pi7Nsg_5F&WjZdSy4N|A5!&rf5UPVP5h|+|K ziyn(xnFCzB*OOI;Kb(fwf49(4OY6VxFeY|4oFzAhn~(2|ABeGehP5`Lz_m3O0CBKO zNF=}&^*f~e12H8@u>G_;8qLm+kB!x-mKz#ESuQ%_w}}7~UpoS=D3_!O*S6vY8j=mV zienb^m5)_b34rzBTK)6$`GJ!0%3KeW0J#b2S?uZVUMgvj*8gr;)cz2_DB;4OX7*>Q zv67I}-?X;Q!tVD>D&>M}{SNj4-GUo)ijwkV0*R~Mh3?wYI*{tdeUA<{-3krdH9FeW5fl`B1WyJ?Anmz%9V}5uP$1UupNNEn&g}fU*MB*I zC1R$-EDC$GpJe<%k>=B{Xn=W*FwnS{Mv9XpT<=-8l#13CZ%Eq0C<=`JD2fZD(ZV*9 zB++58uve|Ecg^=5e>OZLXO$Ui8YDx1wOT17>h`?m4?>=6$6Z6;16M=ujX~|q4bZ%y zv=zg6g73NX{sPpzx(r+p?XaM$0uE=S#v$v9mDtHz%!`HP?Ydrg=J4k{yRYvNtz|M$ z9-tF$21INDR>5rwLI1T2ScxruDo@(K6h<7M<}mypE}$pJy?JW1ZMk~Ta^s|dGF!kL z&tF=WyH|+Hr^KXW8tk(Yf@Swl-S*#oIgL9JwTHWl28W({P#i2%y<=n#SHcadnArmM zvM#kFsxQ2$z`!h0dw2I0Nl87QHUrZ0Z%><8@BXRPN93h| zIRr++~J}n%YFv9)gG0!Hzp%ZfCjOn>UcE5nDA#`1?cg{}3YmcNg_f&c>E*pGYQpt{$rsS02^ouU$E%KyJnTo^e|Hati|DVtO_hHC?e`+PlNEt!!hpDOQ z1x$!x#Bly~LY0cUyEwoxXpkU^NE?Jvq4j|iug&zB0zm^q*rSR`5^%L0AZUOs8c5{A zx1xXXknJ%d;OQ)XYn9@KksH885r13A%?9j1)uCAw1EvB*t?1)Zm#JI?HN2@iUP!mr z;|4eYD6Vc4BPyTh%GDN)2M@k3cSA6w17yp|;Q>2ELaT&>z$`R1Z$EfIb@uF8m{xMH zy27>`N608>XQ0Z+-MJH(*=7Cy!-wbaCJ-VOzzf#Z)y4J7dTl>(R!usl&vY3SS$2N@ z{K;rH8rTgsPnY+$P9o^OK*iTk3}^mBzm1J?;%bL;8Q_f^(}H^c`N9Ovhhh^`Q}FeR zZUFe=6BVAyNry?(zYceHb(+o|${N5aB9KLd87Tmw5>B!dc~mG+%VK0?WMgZKE!CAY zsP$p?NoRkp=$RUQZO>zd#f5?saooj%`IlS0sVyP)wPiAU-WF!hBn z14*ehA_CU<&6|GICVmEfHwNZWpc7QsMxwn4ZwG!p3lhUaq$#LXIR@2bEne7M_MvWj zxgo%$@FyE90r(bXbZ!yGg7i@gDrMArhH6-3fpTKw#68~FcGv|1pEz!vmtJ+$Hp5)!aZCy*f!yPLSh z_1!=!dr6lWatOZZo!L}Nh<~`0k^4t8iH_Uw^%Pe+{HW06PVlsbx;kL!U!bgm@l2Q_ zI?Z3x0CP3(&Az}?4?%|m2?Ee6f#&}i(sP7y6G?-5OfOPfM~5&RdhGb|c$jiL*xj%d z2v^P2NXRSaCYZsrh6FQM_eSv}9s-67cf@r{AnU0D0YyiQN&+Oh zckdKoI!e|@e+R$0!mGeGI0T2CN6=^iY&EyEaP?L09>U1BTezN{c0O87uhU*GV{kP8 zbLm$w9C&B^GmO%&GlshH<^dk8*1x5o{nxlNimQ_VMB(J@(9;Ov6NYQLZF6&0>@}OqSY-=~3~H1= z3B@G|iBX50z2#~(T@gXSw_uw&J3B*w>W#XBS+l?I)f&bO(-}>Fja;+>p25w)rT?qF z>6d}H#>;CCmK;z{FeYaEQZ1ox@(uPA4h**kl726wnfn$N4WPNrOt28fn`xUQCDF@M z(K?3jLEu|mbq20X-T=57(C=@UMQgPaF%^t|RB97#fOZBg2qK6SS^zx$=wRXq7b6t& zv-Qg%m|vp?*ZLWQTL=?zKNd>XX8X$N$!j*Yf&fn-lc?Ry59EW&ur=<*gQtxh(I5|= z0pPY!0#FhL`o=|KYu#{++1j}aR47uU@S{9d2oEuGo*<`91%QCK|we*m^F3z-Atwyd%2mp)aSrsxgMGhzu_3K zo(1SSJcc!KfXLS%xvNWZlugY5JHx~+VJy$XqiTUq%>HnMwK6lk;zD#xOwp5H@?iA! zfn8Q@fd9NxJHH^!OZ2zXTd-%(28gitZ|gSJh?LC(@n3qK8qae+e@^i8L#Pd13ZPOY zBPD(Jd4W|nH+9`F_97_xI&(E!883*bgBPh$HH1*Y6+@ zdyw!&OGgXeiL{AzgunK=DXHJ3gFpUsk3-@AC*4)lw)_A2M({;$;txDbaOsN7A09 zJ>a(a82E(s%alIE{LAbL&x08?0M%WFi=m0AC|9{B^0NB1&b3O+hEl9Qi5YQJ>l z&~kYDHH|SY8UBcvi`b0({CxB{6C44(zrR15nB`#vdyt4u+7&-i?)gCO;IioM?rs;- zoB_O-qdJ8`34F8h{AkVouI}zpBC+?)_Vc4kWi09xCA!h4=QruOgX!N)2n8P%RC|Mk z7tR=&95@rq_KsQQdvh~=qE^Tax81dK0xa}AF)v@dpv~1AJjK1*TOlPOQGCkDkNW!+ z_3(pUUhCBiX}#9s?8SklPWTc&0@{PfJ3?AbM)Pym1*LYD-@q4C`H~vy@J$`q@bgIS z>!qt1qfsN`?Xxr1l{7heN_5;Gl>Rz|kOT8_^720O#l7C+ky7@?NXq7Pe|3PYloN@v zlYud>4?B@-SlpD7gC}j{cDETNBqXjjcT)ySoeDkY4KH1~gm@?8afwlG5pnI>HUG74 zed?FIf~7uRSk2;SEuVlu)pP@k(&5ua6=t17LqiW-R@q}3C*IaE-Zn9DTA5@$d9o3Q zq`2wjKRo!2vP162A{BKrv{Z7sWhUPlO%eziH*U}pD_69VPn*z*2><+|&G@j)c~4AZ zFcyn62}yNzbBmEJ3JWA`PA3z8ZJC;ywj{}8GzR6i7i;T&{P46vjfg+~dDIe@)M|&W z>Ol)~%6jDYgq^tDSK)El#>VDqbDpvyc}~ouElVrId}*wH-@bhxJ7<2jwed(w#?^)} z#-LE)H_}F1rSOl*r1?+j>1Lt{nfdvaJ6mhwl9FT7)2hC{GPKX0{P=O>{rmU#F`fdE zk&y^*Z|_&HUtfFl=nPBvbD9GTeRUbUhqM)U#79R*-?dt1XJ_|)wV?lj;jHbsck9+I zlKx)Il8{OD2W^GTV4sz#W2c9ftxFjdHi8BQ3`53DD%|-*L_~sLycioD-SaI;-cQc(K><5?RU z8!OjG{Oi73&f7X0Q0?7`>K9eUjd15LUxwyFA zym_-R?}QBRw!Lua(oGJ>Lv(bH))$5!R=6Jw3J%_v*s(k)v3KF6L@QF>g@)2``pte+uv~S?%g|4`{IZ>oYLL9cZK1i-iTzcFEDSgmyu^w+!jtrNx9nG zf8ErS8}7YwPWN&e*A5-R$;oMXWd+{&kKWF+r%&HWIj9rH_ZYQiUv#_{st=eS#AaqSQ3A6odYN}b@RVKnB zR8dx@>FDUlHLhZ}KB=haImZTv09VmqxB+fZe~AN1M$6>k!`wKdO7D&-_(-3YcOo>_ zGixEi!I@5{gK~5E(=`)P1sm$?m&o{CVM{w=D0lqiaXUlD?CWb zN;1btb>YSXjw`O$=Vzv;rm~UNs^h&g?hMH<=|(jd78XuRI|udk-QV8c?t_XjGcz+W zF_9_15fKp~Ie79gt*DsTp8J*F1zRT-JZ71v+Y-lLUQGI8fGsaisPbDEMN<6RK3u6S zcbjIDuw_1R;=~*tn+ywIvcX#Z)Z*&uG&x#zcKm{-!OGV%56SB4N%W);(4pVXl)WRt_f!)eY)OTWv} zM-Swhn3$k{jL*!dU%$Rj2)q5YRc2&lgg0!gU1fA@%XcJT-3UYQ_yiYg_=-luW6>5@s_J%C(Sb$L)!Qpugw@-#XU{{7XDbgyRhZnLiH>MhM6+kwy@Xj*hd~ z=B6g^-JSLMd&Rx(EXW*;BEMHj*107+arO`eXQfqEFHgh?m6_sk%|w}4sL=f%PV$D; zu$uUHj0Zg6k8^BY#9*rPlGjg3Iezh3vD`~T<1_JE6)NQv%BkALu(JJmze1jTH|CiH z+u_;LwvX4IbuH!Sy?*`rZG1e9^V;ma<4jBjCH5!bPp%QBMC1F9`uYOoZeZ~f=uZdf z>1jTurlz*q#9^^m-`Ahlp1PQfM8h4KcM%VaY3xE1WzSwW2@MVX_DHxWVf(h8o~0X! zgPFN2ZwFuD5&r7cQFxc`-i6AMzNGDKe@^e;dptIu9N_$znMoIP?A#56fXQAH|E1>@ zbGhCr;k63o<>hjejq$m`QpO-CE`1*chN=Tluty6$2zt4Cmt%Ntjlm+Fjjw&nr@PUa zOsQKV^kPor)|=_z#F0WJC zyP>DYLS83Y!G651qO#|6GYiOhkRIQrY+5|ZJMaHcInzvH)~(Z)j= zlfcc-!?7MR960&))5;+X^=1Xm^8*qd>^$FK>Gnh4g|%5TJZvQ3bjul9u;x4AYgPCn zH~S~n&h{;}3;GA)JOyoG7tf{g%+UN1U6HnyHB6xPn>YGs_0mrq<=bk^iy@>^fH zaN)vp{LX^c>}|E1HxEIVgAHXaiR%Aq5$hC?=!AINNaQT78mENz%#>|WZ z*6u~zIL8xnP(=rHN=}Q`F{Mzy7ASIQ+)!J#rxiD+6?bP^ln-$S|9L@ii{}R2_iIZz zi#&WaCnIg?<}$02dvoIYL`8D3K8~_|*;jQ}Fn?*EC3kRV@ksmajLx;32Pb61>&?DD z7A^K0|3NWaPfzCwaT4ciG@)0LcBvX~|AI1M5fd9KP&eULZgXVdj zhvzs4$F1A9Z#&hW4{pxN&Ha>_85(m@`;LhTzIT+4^|$kKFJbM|=g&HZhBqxOd88bN z{(|2?6`(~DoU&CJez{`~o|m6gUAYfYo$P}wz4Pf7R= zd<@A$x@N!hhwZeqG`>rhW?SzEJNu}psK9%yd$9fO6=?CF8icM3VO+*vJk(}d4{jlW zC;9vJxE-JF>seP@`wZ03(D1Mh^Ye-dndRl>FZcNw9FkwX3Nl7FJQ8;P)6P9RJNw~S z+!2uZ85vgSIZVca%Fg_Z4S98%RMiX0_?@)N+5Z0i0FJPu9IiK)wQt@`{q!jqgba-^ zC>bSXWj-MxFKcpTr5u7s>%*T2=YbQ)k3U7Dg{W{H#d)g zZ)l9U$YE2qjsMxUFbDkaUKNMYEeSKADXW{SPzr*1jXJL5(g&FBWP$Lu8 ze8i%=H(7#4s&3bZBBaew>$||1S3Q z@#Dwo=;_Cyelg7BM@S&X@8{_;aLUmYo&WUi9UI6RVfIK^Ut+dhys&ejpe(rVR903> z2X2=Q6h?-JpA#2<3sOU-DB$W<1f21mhMjju7af4rL1Ey?zvHYcKEuw>spC2Dh>_; z&uEXF<>r1uH5+s1&Yurgt+_Myuv@i-IIa1+1^` z2wit_Zn95)|DGMrCluCGXZkJkpRc%W6O7RrSy_!!xxe9x9OjVeN(mSoG|uQe#?EfL zLL;8m@e^)<11YWB79-E#H`#Oo#U1(P&GF(80$t<{^O!&3VPR|v{$-s}L=aZju07fM z`~ai}G=4yk@N{Q+o7RBN$tlcwpsULS3omGgWY_(m5s$;6Z|y|hI46^6?o=fkqAl~QleE7K z)J}*+Vlfttc0#S=6Px7&cIi7Fe2CkAAOVLn*C)amxM2!y`!@6QuU|#s*f7P4euF4Y z9&vW^Md7^h;^8ZSuCAi6jcpIZ0fERCBoed?^LlI=i2VIm1}MW0$qSA|wL2kkB3qbV zj|pOc6m$=;`P_R#%UtTlL9&8smk{in2)5nsye#WHfjc?O+BK zNG0g3EE^_tNJvPnJbr4*5-Oa7F@~JmY)l>jJ(QWr%jx@v8wx~Cf|%858Oc7UU06qZ z_wKbXSz2E&0Onc`~sJZ6o)z zv=|N^JQ#6O?8Vg7lqBopi<<9(pmNea+XICN1PQ2-S^E=ygRCqp$4{K7H;VzC&_(OiojchFTG9GDB1ZO?#UXykgFho#HN;%zT1^1=hrVhh- z*_NN17pkjDw{|WS^cPH|dZEq}U_9>Wp^XEgYbuZ%o0}rg6Hq?uH9m92L_jguGqIeQh2tUyw^)EL&s}heb;Qk9pC_s5oS0oeHCC%SnA?(vykrX+gELD_}Z6W>;Ob-gv!Bp`Eo4|7ya|+Pc6b@SdMk; z&$zaOz_BfZiQT&xle`@aGH=b&R6Y`)1lwP$xwEq~D>L(VqSweCLxnmpGut~vq?h&X ze0d?IeffS3EXS3e2TrDvsHK$^U9LoHbiiEw^!$A5!Z1cwvkY{E9I4M7F0-)BuTPSb z@(x^nOM~V@6xp3Ws)}ZR+Ea!{s^v)|CQ)7JLM*y!gPe2Zlq6y?++;fyXQrm9c^=>w zxRXkp*&og5kN_$$^PKB@(rpVWVtKw4|J8eG%umnw&K)Hq%h1p5*2)-|1-D@n0<0T4~& z4beHxP?-`HKDU7QjEFc4XaQ=DL(;+oxMw(q3jdXGdye+>;q=;chd zrzoG6aaR+Fe)-arG}jNX%msdsLfoZ915o-nDZZO2B^C-(3|odF{A=kY;rOe z05WJj?59rI*xH)S4;0T*I3kg-SgF+lm~MZiqmv(8mUYTkeMLW{iQf|AUFb&qhDCI6 z4A5B{+uEi~cDLeNWwhm%_Ca^5vldU~Jp`y-pG%t^^lpr{!pj?JP%52AYxb|%|AM7D zos3N4+Wvh2F}tfs*)Y$}$=S2Gw8VYx91Xx*W|h&dEZweP)%N^-7V4_0{A4&XVcVq@>o{eb*H!JoN&S%ahJev$PtxO-J0A!}Mwe?kWuNYL{z+E!l zyx7nOE}qX+g4G5Phe3yDAiM_TD*gXEB}ON)4Cd_m5vx?)-Nj$Nd^xMI@c8fB=9Z@B zVW=_68J*O23QW*JY_2OIsRV8Z&ECCzReq%vx0ICj0!2TMl5}vDri5_%hK92WmB=pG z|NF(i4pkt>WG4)#K#utJ>keEj@YGk<*49qTdLFj6(J1V1$-b8p6erXHODek&2{Ofh zd#RzTr)TdXfb(~sKAo@LrTBrqx?klhA!ga~v7+MrIn}75m(+&g4|5b-lmdCKFoH{Q zBz=5f@Pp)_6%;{nadBtLwhu~bqKcRC;K9*hFZ^VN;tn6&=F-jIf=AAm@P z5S*gZ<~w!#Z=}5jAWs1=w1~m)FaYkJYD*+6F8K{8kjAjyOR25#D#pf1t!1TE8v*|Q z-f&+Vo0@E;KwJ;X2IfSKm>BJlhgyxdX*$3Y!U*Ud?j0~QKwc9|4O|Bd1-p1ITzH+3 zkmaarWYlVv9FQ(Z#m_Ife&?X8&+_p#PDulO2B=zmB@j%UhlhuxNjgxa3&3{TvOYfh zAUddu?p^tLE_xB(kEUp*c+C?$`~K!Qfm%F1xjvk=&~M$*Loyn~(_o3icu(E~1YG%N zlg;skUPR-k&z=oFd7U}yudKey4Y}RZ0vND;<@CbK2K)s90L%KX-;9pIcH2%iC{jcolseus>9iJK&)wF7aix9#*XOX0GaIq#=|85P zz6WRQcY`JT^KiiM6`sR=5#Pz1n@hD^ly;k?LGo>z;sH++EXL~8sZ-6+%&COf!C2_> zWxEx_%c=w?Z7Zn$)fj_3y%x(tnK)Z*?ZF1)ZK#Amb%FA+OJuzW4wh!7mPabXOb}BQ zh>nP;dnEkD39nF1UchLTmfq+0j3)k^u6>Qw_B%|g96!$W({M$JuxO_Wt6QjgoAs4E-b2ta7FG(gI4>e$uY#oN9_fXezqyXx4Zt-K(|N;M zx$*&_fKc&xflIW25yatBk}Z~gNaU_(MtN~qbaZKg&#%r6J3G6B3=9j4smb7etE;Oe zGv0xzlJwd*C27wFesZ*GeWY+^P2z9kz7VYpJFgL>*Q^t6c)ruXzn#=|Ux#^Zoh|B* zIvLapI1-s^1_7>RSwHW@dL*GIPZE1=qh2WRdlZLkSK)ELwNkI`{6K{PGTFWE^~Qlz z@Psh?a^R8LAd_=gJHR0*UB7-kgyWS?+6@=rrl^?#s4DhiLxWviU5=`=puqsacdHlA zRC7jeIt>)PgdYUDB9rbteQ#w%5L#mKrZ9|!YNwuz9AG&8Xkn-v#*vwXQqq0!C$PvR zk)dzjGNWb;VDzP%{4l+j-~)wi6Ew~TmR&f?jecC<3uE*F!ylu-fzYIp*ax&+kQaDO z%>p=%R5n5n>5}RJ<*sI6knmm@{2t7KM0Uy8-5g`7vd+H{_mhe$ELIW57hYu)QlA|N z8v%o_b?Fyn?0RwqZ(W?T0ab`ME65~rsOYG{G52e0kC#%n!k{0rKPS1cuAyO^NW|Ms zw%rAx2A~9hH^R{O4-5!q-~I+~14sHp3@4XXjeh#{DZIme!y9Z=*s*|XXb6GApV{gH zMefI+jPJ=AcoI@a=NL?sa_<-H1%m_~smo`5J#~9y zX4j#}c|BgvW+xEz!Gn@DtWYqBXe+yuqqgdi;pYXIJMs$8Ol9tB9G#J+#bd1t<$ z7m6~p862qAN8mZ2g99w-FLOy79v|timbZZm?=)2QI^NhFOxo(_+W!nepL|`zne=K4--*@ymD^*3DJ^M5$2mv??hM(hPBDMiE<@Wne{%2cU1#Xhe}~yH6^Cg`bVibI6VHpG zp@->OiA{jzqw38@lXtf>3`x*^6QCEw!P10b>EB1}T3MJh<|7L|&vBoSS+9kn z%{>DSm6+DjuEpcPajg%p_@||&s%dDL&vs?;!>XMj$Ai~m zdj)w1@N);lSp>{l-%C_2zgnrLeh%leqm-y z1|i~n3niI{R{j%TP1zy$HE@bl*$TV6~x-D|!$ zd~S8j{HudVvZ1M`wZS1upoiBTU8iH>Fj zm%L3X#e!1=Q1zK774|wP>ekO1@d!0Fwcm{wlOKcDMu0&H1vBz0CWhwQ)BW_qFutv} zYI*k^)D+|qP9eacSy8q(!R37CTPtM6H*g^}VT>LvPhv|3Q-#_YyzF(J(l)?&2Ih1y z0nmN$Km%|mbv_M(O|rqD+W$%j1IO%QwFGrkE+KIuPmi98)Cvj;;0gfl20}2)dbY^_ zS|pcZwTTh#SSogQsl1?y@%{Hl;8Ezq>-Sy_3{-&5ZR;c;Bl8|+j(Y^E%3;<=Mb(AT zP}vF{1|>Z{RF{>p74{$g1`4se?$E3F_y*7mPvVS`YHFeHH}*hA0Lq?D{P@@y%%9l@~ni}*hC-G0f&*Wu&|hoPk_MK>CW*aY!%}Jh@HR;;HytwW#xzV_S;~ygSu@Y z^OP+gkf%3j>7A0Bn_FwjrlRvs+~zo3huLZnjR-mhhAD7al7!yg-kc?GUtgFDe{UAT z+80K_7$q!K+Fhs5ct<829g9Le$bey?tLixQNU87~iPB8>j9D0-_m*;UB5F1JnO6Y< z1M|WwAaFrZkxN@!J2fqB(48~*sKc7{W@-GH;h`ZJ0e$BEiTRW54bfayu$F*I#eDpD z22wmXR8*d~Zsm=S&#OZ$2hKvmt|znM(7}Uy3 z{zt-n{EY14bXCSqg||Qt0D8Kr5iKer@)~k25G43MP;7^B-v&S=l;eDu_*oRX@e zspj%p6v)_6Rrjpx&6{DZN9*SYOB3Y%N@V23LDN$wiLgZxy6Kvu+Q=;?Vl`Qi%YX67 z@aS`l0YA%HYH}(sM8>j}PeY^+atF}#Y?<(hoji;jGIg+-x;7x8l%Nn$QQJ_ek8K;X zyQib`JyR#GYZ4%MNV6Y1HVtfpgW%is;+h&I>WXX2ej0~ehdoMn=+JEKPnawF4p|Ig zyo7)P$$?$T0C*WdCW*LCs1;Yjzk&Bq^IT9=sKc>j|K*p4#xR8e<)H>qBj6vAH)_4` z0S!QTPRmdr(%>`mIle0;5`si9Wz3AD7T*gnZHL_sY`PCV2xQn*K*lg&hyOr+t8(eb zslO)fgDvhe5mj6L;fz!(3~(Ff;xGT2po0v|v7%3mT^A2jh0YmH9pkZ1lMVg-<*31- zK_~3z@^XVJEfN0>XCMNd4IKwNcKO(c^5~N_reTTC#nR+HEPo?4;+;19751~3T@ODj zm-XGfcbEY){!rx#=(5cBL3SBH5MY_Dfz)VzS_K*Z=FP9tQZLBZI9Pg=VK4w89JHn( zlPRsAY|K~by>zy|zP@s6His?p21w(u)Gr={9xW>@9gM3JjJZh1)`d=zY?2R?Ln-;V zkbvN$N~=fy-VBMo*J^AYdn<=N(eVAB;+_A}P_vSXhBO@kB1vi&%?iPlX{5HaB%3)+ zxF6IS3mXgcAJ|57T#|g1D?j)3U2b{gx8B}(2wcI?R=Fy6V^2*@jkNP`1htfd$vi75 zS)zdxhIpmsua%6+f+#PA-}SK&O32(TG0dY*SWlkp7s5S-biw%B2`-@RL*;JWA+}U3 z7VxJ5joh)*%QLhnq<|1>gPg?vBDrMJ|B!SXfLic8BRTLrj9*$T#qQm^2S!pQz_8~( z^tRc;z5i&3vrMHx-)ggTGfrn?sx|;EscCD&OdLd_8jROK&fVi$Far|_y@4^N@w%Q~ zTq^-ez5}N}o&(zHX~n?G2J$hbRVUbt08F77CW6^B7iaI7ahC(-3*x!Gz5RE)0)RT0 zXN;9%cLZR#0tg;;y~kh^Mm1&ro1y>$XdZ#GZ%I~628NnBnDOZoHK+tIOI=IL5~|y5 zXTAb3G?*25&lNOKDHW!hHnE=d=+SRLYs=kdjw66W%0VNi%K4Oyg`!8__fnIb7%wN( zSJ)tKz-u{&T}L5TbOy*JxDrRAGK5xFy<2v(GLptRwH1qf92Y7)2wipfE&Kj9D#nI* zWLC5Qzo1}Ac{0*!639M`k#h)~aMrEw)~J>w$=%UW5GFk(d=So)#BnTSw~b+d!o1%| znM`PaW;cJwA3@F9fG(Kl2@JwQE0UaVKLH-L5*+q6gd#0K!Q09QA6-WSXblJm$jZ-O z_%if*!bDH6XDVeX>aE{Dn#oGV-4GmN`18{~IFJgLGS=k_&Nof@c zcafA-)@>~GtF^V&vfN`Eb1pF!(mhKsxbmvl85SAgh`EtA(-BiE6D|am2c#j~oHS0U z^XETlEWz0C4fO3_pEWiYYZ);d8S?)?8ldmT6ne)^lYw5XDOvb|Tv}RPy&Hdo_F1c| zc9HSz?ipVahoxwOvzM3GO---x@Njdgvr}4MT?LSyt3if1>FCeb=U~$G=KcGDQ>NL> zDl;yAhq$+}oELYgVX4C8ox@eej6oqG2Vj1snr74QVQkC^an-Vlz?(O3M!&ef;0Z%_ z7XJGm8H6^;WU+v)Rl#{M6HmdUXEj5+{{D%lM6G;nb z_H2h=2ol94B)X@Xt)Uh|*3a{@0(afFj&VU_p!ncH$BKK6b*;+$m+D!;?oq8_^9oK8 z2Rktfjkdy92Sl8{@--vm-uy5o9_-YJ_xO=n0s+|eeB0X@O^9Q_kP^!2@w5{)+e z(X;6}F7lMr@-GdcEM>?V8fboyE_guxYM4jWkrP-70lNW6=o@U&?ym-gmM)Ok^a#sK zi{esj0}K8PE(b_^NG?I=#pi7VAEgPA`(^|VDB`cb{{JyT|85ljbC&5ZdnTi*-*UyH zM2Z?|8a>Z6*3f6vFgii}*#?c^@L|!pbN@*4|4XU==ds-X-V5$V1_tQfm{+f^f(?N% ze$@$GbSC7czI=HFA^`3`S>`l%9ReaPH8s!afoC#6&^Ul2Dl#?otmnc|Bd9uoQqc1}C52!fx1-R)L4r>#5aO4aR&x@iWaR~lS(qE+;{qiq!&x6oQ132D9{_E&d z*#u#@e;)NxeF=s}C7mZ=lAs0)5Q0v?38XJi`K70%JOKm-ZGrB{k|L1Mn5WeZzF!+%A$TwVp_!5QEazaHe? zD!t-1^#$gB)eN=yEiIZb>pgAQJ37Gykx(J*QpGGN9hwE-=SNeWR3PbvNl7AsQIZ`h zkL_3Z$HN-4zwY9qs8N2%ae*NTOT7)TBG~UN;gh=@Y8kbFf+6i?b^2@M$Ot^p;XaWP z!fDp@mJjF*!gGE=B`~nMRR#+5Bq&permU-kIzZy;;)M%3cka|cU~~`FAV7-)Seios ztos`tcQ7?g5o74T;Y0+0FdznUh?*V=T*u(4GsM4A(++QTg^-&X0G&oubxJ1RP7ue( z(|7{E@ywL|vMmN~er4Qwes+F`p8GmAgiqCX8Kf;BxCW(;MyRzdjc9DF?i(aDUj+q) zc?K#Sqz3dsTOi;b>^~zV6%QI50U-*oP%1jiz_7rrq<;K(b@<;yRVk3jhxHRe0*+8M z3Gpa7h<5pdO`nfbT&iONh6jTYHYx%_P{ZKyCV^S`Vh#i1oc@c~;Bg6SM@P%y3J*w~ z(gy*cdI@*xj;=18=DtTOQ>_oH{mWHdWG`$c%lW+Ff_Vfip*UD8xq3N{6R75l}k>3Vwf%Hy(pTYUFzjNYOSz3(w5U ztA{ZvXRzD;0Rai{Sb*}2!#0Ic5JT4vU-0}}LJCDqNFBg8 z*-Ppg8fFXPue3aNq8=7?R3rvm#twv26LhzwwKWg#!I{pCLYqz=iH`WVIO_Pp%*?FI zL+gX|HOPBWQ)FXxFPYAtKflUrnX$T^Vj)KW!cGmWK+p>UE3E>|G8%3F$T&@6PT@wX zf~h&otzS?8sF@GIp})KJO(v=5b_=)N)*tQl3nJ-VU44~$Fg1oevCMV=bzTLTMputa z4CaFZj+*d?l|l6wsNM$+D}dUmv0Lbxu48ov*RYrd!u$nN6m?Ck-+{agIHez~iHs3$Ye7q$!X7#AIH1vGSy%&X7Fk ziqt>Fg{Tq~w5;=9yo#FC}?T$h9D-yp#KZj|JMOQjDSj2r~(cW zjAr8O1{hBVR0_ce<5^%FcmWO1t1w?}2 zp&qa{NNC@_;++RRxPM=#B7{!SL5N6Gk^g{zEIg@!qG$ISiQa-uEYT zG3q?hXEIiQYx3mPyLXwX$P1oVuz&})7#!063N{T-ky1JSZ_HT!ci{DIU;01)h!=Cy zzJuPzB4Bvk(9jTjYCj}{&q8PjO17?!j;YtqU%78cZPSQdsHcu{0@km`HzUvq5c(tmF+!0qQWgTyR1P# yZ^^?apAPyY`&lzjsL diff --git a/content/productivity/upgrade-planet/upgrade_planet.js b/content/productivity/upgrade-planet/upgrade_planet.js index 344cec0e..dc2af051 100644 --- a/content/productivity/upgrade-planet/upgrade_planet.js +++ b/content/productivity/upgrade-planet/upgrade_planet.js @@ -20,7 +20,9 @@ import { import { PlanetType, SpaceType -} from "https://cdn.skypack.dev/@darkforest_eth/types" +} from "https://cdn.skypack.dev/@darkforest_eth/types"; + +const { getPlanetName } = df.getProcgenUtils(); const minSilverPercent = 95; const minEnergyPercent = 95; @@ -188,7 +190,6 @@ function App() { function select() { setTarget(selectedPlanet); - rankSpan.innerHTML = 'rank: ' + getPlanetRank(selectedPlanet); } function stop() { @@ -245,8 +246,8 @@ function App() { ${allowUpgrade(target) ? html` - ${planetShort(target.locationId)} -
+
${getPlanetName(target)} +

upgrade pattern: @@ -278,7 +279,7 @@ class Plugin { async render(container) { container.parentElement.style.minHeight = 'unset'; - container.style.width = '380px'; + container.style.width = '300px'; container.style.minHeight = 'unset'; this.container = container; From ca27cd695d1278fd1424c3476c5cb3f257c3dc3f Mon Sep 17 00:00:00 2001 From: goldenfiredo Date: Tue, 14 Dec 2021 14:50:14 +0800 Subject: [PATCH 5/5] protect planets plugin --- content/productivity/protect_planets/index.md | 6 + .../protect_planets/protect_planets.js | 283 ++++++++++++++++++ .../protect_planets/screenshot.png | Bin 0 -> 23819 bytes 3 files changed, 289 insertions(+) create mode 100644 content/productivity/protect_planets/index.md create mode 100644 content/productivity/protect_planets/protect_planets.js create mode 100644 content/productivity/protect_planets/screenshot.png diff --git a/content/productivity/protect_planets/index.md b/content/productivity/protect_planets/index.md new file mode 100644 index 00000000..7a727635 --- /dev/null +++ b/content/productivity/protect_planets/index.md @@ -0,0 +1,6 @@ +--- +title: Protect Planets +date: +subtitle: Monitoring if your planet was attacked, and try to get it back when your planet was occupied +version: 0.6.4 +--- diff --git a/content/productivity/protect_planets/protect_planets.js b/content/productivity/protect_planets/protect_planets.js new file mode 100644 index 00000000..f3646696 --- /dev/null +++ b/content/productivity/protect_planets/protect_planets.js @@ -0,0 +1,283 @@ +// Protect Planets +// +// Monitoring if your planet was attacked +// Try to get it back when your planet was occupied +// +// Written by goldenfiredo, goldenfiredo@gmail.com +// + +import { + PlanetType, +} from "https://cdn.skypack.dev/@darkforest_eth/types"; + +const minProtectPlanetLevel = 2; +const minAttackPlanetLevel = 3; +const minEnergyPercentForAttacking = 90; +const usedEnergyPercentForAttacking = 70; +const maxAttackingPlanetNumber = 6; +const minArrivedEnergy = 1000; + +class Plugin { + + constructor() { + this.running = false; + this.intervalId = ''; + this.minPlanetLevel = minProtectPlanetLevel; + this.displayWarning = true; + this.attacking = true; + this.planetIdsUnderAttack = []; + this.planetIdsOccupied = []; + this.planetIdsAttacked = df.getAllVoyages().filter( + e => e.player !== df.account && + df.getPlanetWithId(e.toPlanet).owner === df.account + ).map(e => e.toPlanet); + } + + attack(planetOccupied) { + if (getPlanetUnconfirmedMoves(planetOccupied.locationId).length > 0) { + + return; + } + + if (getPlanetArrivals(planetOccupied.locationId).length > 0) { + + return; + } + + // 1. find the best planet to attack + let candidates = df.getMyPlanets().filter( + p => p.planetLevel > planetOccupied.planetLevel + && p.energy * usedEnergyPercentForAttacking / 100 > planetOccupied.energyCap + && p.planetType !== PlanetType.SILVER_BANK + && p.unconfirmedDepartures.length === 0 + ).map( + from => [from, distance(from, planetOccupied)] + ).sort( + (a, b) => a[1] - b[1] + ); + + for (const candidate of candidates) { + let planet = candidate[0]; + let energyNeeded = Math.ceil( + df.getEnergyNeededForMove(planet.locationId, planetOccupied.locationId, planetOccupied.energyCap + 100)); + if (planet.energy * 7 / 10 >= energyNeeded) { + df.move(planet.locationId, planetOccupied.locationId, energyNeeded, 0); + + return; + } + } + + // 2. no best planet, find the nearest planet to attack occupied planet, up to maxAttackingPlanetNumber + candidates = df.getMyPlanets().filter( + p => p.planetLevel >= minAttackPlanetLevel + && p.energy >= p.energyCap * minEnergyPercentForAttacking / 100 + && p.planetType !== PlanetType.SILVER_BANK + && p.unconfirmedDepartures.length === 0 + ).map( + from => [from, distance(from, planetOccupied)] + ).sort( + (a, b) => a[1] - b[1] + ); + + let sumEnergy = 0; + let planetsWillAttack = []; + for (const candidate of candidates) { + let planet = candidate[0]; + let energyArrived = df.getEnergyArrivingForMove( + planet.locationId, planetOccupied.locationId, undefined, + Math.floor(planet.energy * usedEnergyPercentForAttacking / 100)); + if (energyArrived >= minArrivedEnergy) { + planetsWillAttack.push(planet); + sumEnergy += energyArrived; + if (sumEnergy >= planetOccupied.energyCap + 100 || planetsWillAttack.length >= maxAttackingPlanetNumber) break; + } + } + + for (const planet of planetsWillAttack) { + df.move(planet.locationId, planetOccupied.locationId, + Math.floor(planet.energy * usedEnergyPercentForAttacking / 100), 0); + } + } + + protect() { + df.terminal.current.println("[Protect Planets] check attacking", 2); + + let planetIdsUnderAttack = df.getAllVoyages().filter( + e => e.arrivalTime > Date.now() / 1000 && + e.player !== df.account && + df.getPlanetWithId(e.toPlanet).owner === df.account && + df.getPlanetWithId(e.toPlanet).planetLevel >= this.minPlanetLevel + ).map(e => e.toPlanet); + + this.planetIdsUnderAttack = planetIdsUnderAttack; + + for (const id of planetIdsUnderAttack) { + if (!this.planetIdsAttacked.includes(id)) { + this.planetIdsAttacked.push(id); + } + } + + for (const id of this.planetIdsAttacked) { + if (df.getPlanetWithId(id).owner !== df.account && !this.planetIdsOccupied.includes(id)) { + this.planetIdsOccupied.push(id) + } + } + + this.planetIdsOccupied = this.planetIdsOccupied + .sort((a, b) => df.getPlanetWithId(b).planetLevel - df.getPlanetWithId(a).planetLevel); + + // remove occupied planets + this.planetIdsAttacked = this.planetIdsAttacked.filter( + id => df.getPlanetWithId(id).owner === df.account + ); + + if (!this.attacking) { + return; + } + + for (const id of this.planetIdsOccupied) { + let planet = df.getPlanetWithId(id); + if (planet.owner !== df.account) { + this.attack(planet); + } + } + } + + stop() { + this.planetIdsUnderAttack = []; + if (this.intervalId != '') { + clearInterval(this.intervalId); + this.intervalId = ''; + } + this.running = false; + } + + async render(container) { + container.style.width = '540px'; + + let levelLabel = document.createElement('label'); + levelLabel.innerText = 'Min. level planets to protect'; + levelLabel.style.display = 'block'; + + let level = document.createElement('select'); + level.style.background = 'rgb(8,8,8)'; + level.style.width = '100%'; + level.style.marginTop = '10px'; + level.style.marginBottom = '10px'; + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(lvl => { + let opt = document.createElement('option'); + opt.value = `${lvl}`; + opt.innerText = `Level ${lvl}`; + level.appendChild(opt); + }); + + level.value = `${this.minPlanetLevel}`; + level.onchange = (evt) => { + try { + this.minPlanetLevel = parseInt(evt.target.value); + } catch (e) { + console.error('could not parse planet level', e); + } + } + + let warningLabel = document.createElement('label'); + warningLabel.innerText = 'Display warning when my planet was under attack'; + warningLabel.style.paddingRight = "10px"; + warningLabel.style.marginLeft = '10px'; + warningLabel.style.marginTop = '20px'; + + let warningCheckbox = document.createElement('input'); + warningCheckbox.type = "checkbox"; + warningCheckbox.style.marginRight = "10px"; + warningCheckbox.checked = true; + warningCheckbox.onchange = (evt) => { + if (evt.target.checked) { + this.displayWarning = true; + } else { + this.displayWarning = false; + } + }; + + let attackingLabel = document.createElement('label'); + attackingLabel.innerText = 'Get it back when my planet was occupied'; + attackingLabel.style.paddingRight = "10px"; + attackingLabel.style.marginLeft = '10px'; + + let attackingCheckbox = document.createElement('input'); + attackingCheckbox.type = "checkbox"; + attackingCheckbox.style.marginRight = "10px"; + attackingCheckbox.checked = true; + attackingCheckbox.onchange = (evt) => { + if (evt.target.checked) { + this.attacking = true; + } else { + this.attacking = false; + } + }; + + let startBtn = document.createElement('button'); + startBtn.style.width = '100%'; + startBtn.style.marginBottom = '10px'; + startBtn.style.marginTop = '30px'; + startBtn.innerHTML = 'start' + startBtn.onclick = () => { + if (this.running) { + this.stop(); + startBtn.innerHTML = 'start'; + } else { + this.running = true; + this.protect(); + this.intervalId = setInterval(this.protect.bind(this), 30 * 1000); + startBtn.innerHTML = 'stop'; + } + }; + + container.appendChild(levelLabel); + container.appendChild(level); + container.appendChild(warningLabel); + container.appendChild(warningCheckbox); + container.appendChild(attackingLabel); + container.appendChild(attackingCheckbox); + container.appendChild(startBtn); + } + + draw(ctx) { + let count = this.planetIdsUnderAttack.length; + if (this.displayWarning && count > 0) { + const viewport = ui.getViewport(); + ctx.save(); + ctx.fillStyle = "red"; + ctx.font = "24px Sans-serif"; + let msg = ""; + if (count === 1) msg = "You have 1 planet under attack"; + else msg = "You have " + count + " planets under attack"; + ctx.fillText(msg, viewport.viewportWidth/2 - 200, viewport.viewportHeight - 30); + ctx.restore(); + } + } + + destroy() { + this.stop(); + } +} +export default Plugin; + + +function getPlanetArrivals(planetId) { + return df.getAllVoyages() + .filter(arrival => arrival.toPlanet === planetId && + arrival.player === df.account && + arrival.arrivalTime > Date.now() / 1000 + ); +} + +function getPlanetUnconfirmedMoves(planetId) { + return df.getUnconfirmedMoves() + .filter(move => move.to === planetId && move.owner === df.account); +} + +function distance(from, to) { + let fromloc = from.location; + let toloc = to.location; + return Math.sqrt((fromloc.coords.x - toloc.coords.x) ** 2 + (fromloc.coords.y - toloc.coords.y) ** 2); +} \ No newline at end of file diff --git a/content/productivity/protect_planets/screenshot.png b/content/productivity/protect_planets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ed42406684675e0cc3271f407ce5b9ed35c989a7 GIT binary patch literal 23819 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 bPp6N4J8w=Dc~uWLbK2%l{MVQJMTq|kxgn1x literal 0 HcmV?d00001