about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/App.svelte77
-rw-r--r--src/bestiary.js15
2 files changed, 80 insertions, 12 deletions
diff --git a/src/App.svelte b/src/App.svelte
index 0de1e0e..a68b9ee 100644
--- a/src/App.svelte
+++ b/src/App.svelte
@@ -4,13 +4,18 @@
   import { onMount } from "svelte";
   import { formatUtc } from "./times";
   import { getMatches } from "./bestiary";
+  import day from "dayjs";
+  import relativeTime from "dayjs/plugin/relativeTime";
+  day.extend(relativeTime);
 
   onMount(async () => {
     updateWeatherStores();
   });
 
   let date = new Date().getTime() * (1440 / 70);
+  let matches, upMatches, otherMatches, normalMatches, pagosForecast;
 
+  newMatches();
   setInterval(() => {
     date = new Date().getTime() * (1440 / 70);
   }, 1000);
@@ -20,11 +25,47 @@
     paWeather.set(ew.forecast(ew.PAGOS_WEATHER));
   }
 
-  const pagosForecast = ew.forecast(ew.PAGOS_WEATHER);
-  getMatches(pagosForecast, $level);
+  function formatWeathers(weathers) {
+    if (weathers.length === 1) {
+      return ew.getWeatherName(weathers[0]);
+    }
+    return weathers
+      .map((w, i) => {
+        if (i + 1 === weathers.length) {
+          return `and ${ew.getWeatherName(w)}`;
+        }
+        return `${ew.getWeatherName(w)}, `;
+      })
+      .join("");
+  }
+
+  function newMatches() {
+    pagosForecast = ew.forecast(ew.PAGOS_WEATHER);
+    matches = getMatches(pagosForecast, $level).sort(
+      (a, b) => a.level < b.level
+    );
+
+    upMatches = matches.filter((m) => m.uptime.isUp);
+    normalMatches = matches.filter((m) => !m.special);
+    otherMatches = matches.filter((m) => m.special && !m.uptime.isUp);
+  }
+
+  function formatNextUptime(futures) {
+    let i;
+    futures.find((f, idx) => {
+      if (f) i = idx;
+      return f;
+    });
+
+    if (i) {
+      return `in ${day(pagosForecast[i + 1].date).fromNow()}`;
+    }
+    return "in the far future";
+  }
 
   function levelChanged(evt) {
     level.set(Number(evt.target.value));
+    newMatches();
   }
 </script>
 
@@ -37,7 +78,37 @@
 
   Time is {currentEzTime}<br />
 
-  Anemos Weather is {pagosForecast[0].weatherName}
+  <h5>matches</h5>
+  <ul>
+    {#each upMatches as m (m.name)}
+      <li>
+        <em>(Lv{m.level})</em> <strong>{m.name}</strong>
+        ({#if m.mutating}mutates{/if}{#if m.augmenting}augments{/if} in {formatWeathers(
+          m.uptime.weathers
+        )})
+      </li>
+    {/each}
+  </ul>
+
+  <h5>regular enemies</h5>
+  <ul>
+    {#each normalMatches as m (m.name)}
+      <li><em>(Lv{m.level})</em> <strong>{m.name}</strong></li>
+    {/each}
+  </ul>
+
+  <h5>special enemies that do not mutate/augment right now</h5>
+  <ul>
+    {#each otherMatches as m (m.name)}
+      <li>
+        <em>(Lv{m.level})</em> <strong>{m.name}</strong>
+        ({#if m.mutating}mutates{/if}{#if m.augmenting}augments{/if}
+        {formatNextUptime(m.uptime.futureUptime)})
+      </li>
+    {/each}
+  </ul>
+
+  Pagos Weather is {pagosForecast[0].weatherName}
 </div>
 
 <style></style>
diff --git a/src/bestiary.js b/src/bestiary.js
index 33779d3..0598abb 100644
--- a/src/bestiary.js
+++ b/src/bestiary.js
@@ -4,12 +4,12 @@ import isBetween from "dayjs/plugin/isBetween";
 day.extend(isBetween);
 
 export function getMatches(forecast, level) {
-  console.log(level);
   let res = [];
   pagosB.forEach((b) => {
     if (b.level >= level && b.level - 2 < level) {
       res.push({
         name: b.name,
+        level: b.level,
         elem: b.elem,
         special: b.type > 0,
         mutating: b.type === 1,
@@ -19,6 +19,7 @@ export function getMatches(forecast, level) {
     }
   });
   console.log(res);
+  return res;
 }
 
 function getEzTime() {
@@ -29,19 +30,15 @@ function findForecastMatch(forecast, conditions) {
   const time = getEzTime();
   const dn = time.isBetween(time.hour(8), time.hour(18)) ? "day" : "night";
   return {
-    isUp: forecastMatches(forecast, conditions[dn], 0).length > 0,
-    weathers: forecastMatches(forecast, conditions[dn], 0),
+    isUp: forecastMatches(forecast, conditions[dn], 0),
+    weathers: conditions[dn],
     futureUptime: [1, 2, 3, 4].map((i) => {
-      const match = forecastMatches(forecast, conditions[dn], i);
-      return {
-        isUp: match.length > 0,
-        weathers: match,
-      };
+      return forecastMatches(forecast, conditions[dn], i);
     }),
   };
 }
 
 function forecastMatches(forecast, condition, index) {
   const currWeather = forecast[index].currWeather;
-  return condition.filter((c) => c === currWeather);
+  return condition.some((c) => c === currWeather);
 }