Advertisement
Waffle3z

Untitled

Feb 19th, 2022 (edited)
1,199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let MIN_ENERGY_PERCENT = 20;
  2. let TARGET_ENERGY_PERCENT = 15;
  3.  
  4. function CreateSlider(container, label, defaultValue, onchange) {
  5.     let SliderLabel = document.createElement('label');
  6.     SliderLabel.innerText = label;
  7.     SliderLabel.style.display = 'block';
  8.  
  9.     let Slider = document.createElement('input');
  10.     Slider.type = 'range';
  11.     Slider.min = '0';
  12.     Slider.max = '100';
  13.     Slider.step = '1';
  14.     Slider.value = defaultValue;
  15.     Slider.style.width = '80%';
  16.     Slider.style.height = '24px';
  17.  
  18.     let PercentLabel = document.createElement('span');
  19.     PercentLabel.innerText = `${Slider.value}%`;
  20.     PercentLabel.style.float = 'right';
  21.  
  22.     Slider.onchange = (evt) => {
  23.         PercentLabel.innerText = `${evt.target.value}%`;
  24.         onchange(evt.target.value);
  25.     }
  26.    
  27.     container.appendChild(SliderLabel);
  28.     container.appendChild(Slider);
  29.     container.appendChild(PercentLabel);
  30. }
  31.  
  32. function CreateButton(container, label, onclick) {
  33.     let Button = document.createElement('button');
  34.     Button.style.width = '100%';
  35.     Button.style.marginBottom = '10px';
  36.     Button.innerHTML = label;
  37.     Button.onclick = onclick;
  38.     container.appendChild(Button);
  39.     return Button;
  40. }
  41.  
  42. class Plugin {
  43.     constructor() {
  44.         this.preview = null;
  45.         this.previewColor = 'yellow';
  46.     }
  47.    
  48.     draw(ctx) {
  49.         if (this.preview) {
  50.             drawLineBetweenPlanets(ctx, this.preview[0], this.preview[1], this.previewColor);
  51.         }
  52.     }
  53.    
  54.     render(container) {
  55.         container.style.width = '400px';
  56.        
  57.         CreateSlider(container, 'Minimum energy % to leave', MIN_ENERGY_PERCENT, (value) => {MIN_ENERGY_PERCENT = value});
  58.         CreateSlider(container, 'Target energy % to fill', TARGET_ENERGY_PERCENT, (value) => {TARGET_ENERGY_PERCENT = value});
  59.        
  60.         let InfoLabel = document.createElement('label');
  61.         let UpdateInfo = (info) => {
  62.             console.log(info);
  63.             if (!info) {
  64.                 this.preview = null;
  65.                 InfoLabel.innerText = 'No candidate planets found';
  66.             } else {
  67.                 this.preview = info[0];
  68.                 InfoLabel.innerText = `Sending ${info[1]} energy and ${info[2]} silver (${(info[1]-info[3])} energy spent in transit, ${info[3]} reaching destination)`;
  69.             }
  70.         };
  71.  
  72.         let PreviewEnergyButton = CreateButton(container, 'Preview energy move', () => {
  73.             UpdateInfo(sendPayload(true, false));
  74.             this.previewColor = 'blue';
  75.         });
  76.         PreviewEnergyButton.style.width = 'calc(50% - 5px)';
  77.  
  78.         let PreviewSilverButton = CreateButton(container, 'Preview silver move', () => {
  79.             UpdateInfo(sendPayload(true, true));
  80.             this.previewColor = 'yellow';
  81.         });
  82.         PreviewSilverButton.style.width = 'calc(50% - 5px)';
  83.         PreviewSilverButton.style.marginLeft = '10px';
  84.  
  85.         let SendEnergyButton = CreateButton(container, 'Send energy to selected', () => {
  86.             UpdateInfo(sendPayload(false, false));
  87.             this.preview = null;
  88.         });
  89.  
  90.         let SendSilverButton = CreateButton(container, 'Send silver to selected', () => {
  91.             UpdateInfo(sendPayload(false, true));
  92.             this.preview = null;
  93.         });
  94.  
  95.         let ClearButton = CreateButton(container, 'Clear preview', () => {
  96.             this.preview = null;
  97.         });
  98.        
  99.         InfoLabel.style.width = '100%';
  100.         container.appendChild(InfoLabel);
  101.     }
  102. }
  103.  
  104. export default Plugin;
  105.  
  106. function getEnergyBudget(planet) {
  107.     return Math.max(0, Math.floor(planet.energy - planet.energyCap*MIN_ENERGY_PERCENT/100));
  108. }
  109.  
  110. function getEnergyToSend(source, target) {
  111.     let desiredEnergy = target.energyCap*TARGET_ENERGY_PERCENT/100;
  112.     let futureEnergy = df.getAllVoyages()
  113.         .filter(arrival => arrival.toPlanet === target.locationId)
  114.         .reduce((seed, arrival) => seed + arrival.energyArriving, target.owner === df.account ? target.energy : -target.energy);
  115.     let energyToDeliver = Math.max(1, Math.ceil(desiredEnergy - futureEnergy));
  116.     let requiredEnergy = Math.ceil(df.getEnergyNeededForMove(source.locationId, target.locationId, energyToDeliver));
  117.     let sendingEnergy = Math.min(getEnergyBudget(source), requiredEnergy);
  118.     let arrivingEnergy = Math.floor(df.getEnergyArrivingForMove(source.locationId, target.locationId, distance(source, target), sendingEnergy));
  119.     return [sendingEnergy, arrivingEnergy];
  120. }
  121.  
  122. function getSilverToSend(source, target) {
  123.     let futureSilver = df.getAllVoyages()
  124.         .filter(arrival => arrival.toPlanet === target.locationId)
  125.         .reduce((seed, arrival) => seed + arrival.silverMoved, target.silver);
  126.     return Math.min(Math.floor(source.silver), Math.ceil(target.silverCap - futureSilver));
  127. }
  128.  
  129. function sendPayload(previewing = false, sendSilver = false) {
  130.     let selectedPlanet = ui.getSelectedPlanet();
  131.     if (selectedPlanet) {
  132.         let targetData = df.getMyPlanets()
  133.             .filter(p => p.locationId !== selectedPlanet.locationId)
  134.             .map(source => {
  135.                 let moveCost = Math.ceil(df.getEnergyNeededForMove(source.locationId, selectedPlanet.locationId, 1));
  136.                 return [source, moveCost];
  137.             })
  138.             .filter(p => getEnergyBudget(p[0]) > p[1] && (!sendSilver || p[0].silver > 0))
  139.             .map(p => p[0])
  140.             .map(source => {
  141.                 let [cost, arriving] = getEnergyToSend(source, selectedPlanet);
  142.                 let silver = sendSilver ? getSilverToSend(source, selectedPlanet) : 0;
  143.                 let costPerUnit = sendSilver ? cost/silver : cost/arriving;
  144.                 return [source, costPerUnit, cost, silver, arriving];
  145.             })
  146.         console.log(targetData);
  147.         if (targetData.length > 0) {
  148.             let [source, costPerUnit, energy, silver, arriving] = targetData.reduce((seed, current) => (seed && seed[1] < current[1] ? seed : current));
  149.             if (!previewing) {
  150.                 df.move(source.locationId, selectedPlanet.locationId, energy, silver);
  151.             }
  152.             return [[source, selectedPlanet], energy, silver, arriving];
  153.         }
  154.     }
  155. }
  156.  
  157. function distance(from, to) {
  158.     let a = from.location, b = to.location;
  159.     return Math.sqrt((a.coords.x - b.coords.x)**2 + (a.coords.y - b.coords.y)**2);
  160. }
  161.  
  162. function drawLineBetweenPlanets(ctx, planetA, planetB, color, thickness=3) {
  163.     const viewport = ui.getViewport();
  164.     const startPoint = viewport.worldToCanvasCoords(planetA.location.coords);
  165.     const endPoint = viewport.worldToCanvasCoords(planetB.location.coords);
  166.     drawLine(ctx, startPoint, endPoint, color, thickness);
  167. }
  168. function drawLine(ctx, startPoint, endPoint, color, thickness=3) {
  169.     ctx.beginPath();
  170.     ctx.moveTo(startPoint.x, startPoint.y);
  171.     ctx.lineTo(endPoint.x, endPoint.y);
  172.     ctx.strokeStyle = color;
  173.     ctx.lineWidth = thickness;
  174.     ctx.stroke();
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement