Compare commits

..

No commits in common. "main" and "0.1.20pre1" have entirely different histories.

34 changed files with 285 additions and 1164 deletions

View file

@ -40,14 +40,13 @@ jobs:
runs-on: docker runs-on: docker
steps: steps:
- name: Release New Version - name: Release New Version
uses: https://code.forgejo.org/actions/forgejo-release@v1 uses: actions/forgejo-release@v1
with: with:
direction: upload direction: upload
url: https://forgejo.neshweb.net url: https://forgejo.neshweb.net
release-dir: release release-dir: release
token: ${{ secrets.FORGEJO_TOKEN }} token: ${{ secrets.FORGEJO_TOKEN }}
tag: ${{ github.ref_name }} tag: ${{ github.ref_name }}
prerelease: true
# doesn't work atm # doesn't work atm
# unlighthouse: # unlighthouse:

View file

@ -40,7 +40,7 @@ jobs:
runs-on: docker runs-on: docker
steps: steps:
- name: Release New Version - name: Release New Version
uses: https://code.forgejo.org/actions/forgejo-release@v1 uses: actions/forgejo-release@v1
with: with:
direction: upload direction: upload
url: https://forgejo.neshweb.net url: https://forgejo.neshweb.net

View file

@ -23,7 +23,6 @@ jobs:
deploy-unlighthouse-files: deploy-unlighthouse-files:
needs: [ unlighthouse ] needs: [ unlighthouse ]
if: success()
runs-on: docker runs-on: docker
env: env:
DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
@ -68,7 +67,6 @@ jobs:
deploy-unlighthouse-site: deploy-unlighthouse-site:
needs: [ deploy-unlighthouse-files ] needs: [ deploy-unlighthouse-files ]
if: success()
runs-on: docker runs-on: docker
env: env:
DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
@ -93,6 +91,5 @@ jobs:
key: ${{ secrets.SSH_PRIVATE_KEY }} key: ${{ secrets.SSH_PRIVATE_KEY }}
script: | script: |
PATH="$HOME/.local/bin:$PATH" PATH="$HOME/.local/bin:$PATH"
screen -ls | grep 'firq_dev-unlighthouse' | awk '{print $1}' | xargs -I % -t screen -X -S % quit
cd firq_dev cd firq_dev
screen -S firq_dev-unlighthouse -dm serve unlighthouse/ -p ${{ secrets.UNLIGHTHOUSE_DEPLOY_PORT }} screen -S firq_dev-unlighthouse -dm serve unlighthouse/ -p ${{ secrets.UNLIGHTHOUSE_DEPLOY_PORT }}

1074
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
{ {
"name": "@firq/fgosite", "name": "@firq/fgosite",
"type": "module", "type": "module",
"version": "0.1.27", "version": "0.1.20",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
@ -15,7 +15,7 @@
"@astrojs/check": "^0.3.3", "@astrojs/check": "^0.3.3",
"@astrojs/mdx": "^2.0.3", "@astrojs/mdx": "^2.0.3",
"@astrojs/sitemap": "^3.0.3", "@astrojs/sitemap": "^3.0.3",
"astro": "^4.2.1", "astro": "^4.0.7",
"autoprefixer": "^10.4.16", "autoprefixer": "^10.4.16",
"iconoir": "^7.2.0", "iconoir": "^7.2.0",
"postcss-preset-env": "^9.3.0", "postcss-preset-env": "^9.3.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

View file

@ -1,26 +1,29 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import mlb_ce from '../assets/ce/mlb.webp' import mlb_ce from '../assets/ce/mlb.webp'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
name: string name: string
imageFile: string imageFile: string
mlb: boolean mlb: string
} }
const { mlb, imageFile, name } = Astro.props const { mlb, imageFile, name } = Astro.props
const imagePath = `/src/assets/ce/${imageFile}` const imagePath = `/src/assets/ce/${imageFile}`
const images_ces = import.meta.glob<GlobImage>('/src/assets/ce/*.png') const images_ces = import.meta.glob<{ default: ImageMetadata }>(
const loadedCEImage = plsLoadImage(images_ces, imagePath) '/src/assets/ce/*.png'
)
const mlb_image = mlb ? 'mlbalign' : 'hidemlb' let mlb_image: string = 'mlbalign'
if (mlb === 'false') {
mlb_image = 'hidemlb'
}
--- ---
<article> <article>
<div> <div>
<Image src={loadedCEImage} alt={name} class="ce-crop" /> <Image src={images_ces[imagePath]()} alt={name} class="ce-crop" />
</div> </div>
<div class={mlb_image}> <div class={mlb_image}>
<Image src={mlb_ce} alt="Max-limit broken" class="mlb" /> <Image src={mlb_ce} alt="Max-limit broken" class="mlb" />

View file

@ -1,7 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
site: string site: string
@ -10,27 +9,19 @@ export interface Props {
} }
const { imageFile, link, site } = Astro.props const { imageFile, link, site } = Astro.props
const logoAltText = `${site} Logo`
const imagePath = `/src/assets/social/${imageFile}` const imagePath = `/src/assets/social/${imageFile}`
const images_logos = import.meta.glob<GlobImage>( const images_logos = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/social/*.{png,webp}' '/src/assets/social/*.{png,webp}'
) )
const loadedLogoImage = plsLoadImage(images_logos, imagePath)
--- ---
<a <a href={link} target="_blank" rel="noopener noreferrer" aria-label={site}>
href={link}
target="_blank"
rel="noopener noreferrer"
aria-label=`${site} - new window`
>
<article class="contact do-hover"> <article class="contact do-hover">
<Image src={loadedLogoImage} alt={logoAltText} /> <Image src={images_logos[imagePath]()} alt="" />
<div> <div>
<h2>{site}</h2> <h2>{site}</h2>
</div> </div>
</article> </article>
<span class="visually-hidden">{logoAltText}</span>
</a> </a>
<style> <style>

View file

@ -1,7 +1,6 @@
--- ---
import { Image } from 'astro:assets' import type { ImageMetadata } from 'astro';
import type { GlobImage } from '../types/generic' import { Image } from 'astro:assets';
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
name: string name: string
@ -12,20 +11,12 @@ export interface Props {
const { link, imageFile, origin, name } = Astro.props const { link, imageFile, origin, name } = Astro.props
const imagePath = `/src/assets/favourites/${imageFile}` const imagePath = `/src/assets/favourites/${imageFile}`
const images = import.meta.glob<GlobImage>( const images = import.meta.glob<{ default: ImageMetadata }>('/src/assets/favourites/*.{png,webp}')
'/src/assets/favourites/*.{png,webp}'
)
const loadedImage = plsLoadImage(images, imagePath)
--- ---
<a <a href={link} target="_blank" rel="noopener noreferrer">
href={link}
target="_blank"
rel="noopener noreferrer"
aria-label=`${name} - new window`
>
<div class="heading">{name}</div> <div class="heading">{name}</div>
<Image src={loadedImage} alt={name} /> <Image src={images[imagePath]()} alt={name} />
<h2 class="subtext"> <h2 class="subtext">
{origin} {origin}
</h2> </h2>
@ -45,6 +36,10 @@ const loadedImage = plsLoadImage(images, imagePath)
align-items: center; align-items: center;
} }
a:hover {
transform: scale(var(--hover-scale));
}
a { a {
border-radius: 1rem; border-radius: 1rem;
display: flex; display: flex;
@ -60,16 +55,12 @@ const loadedImage = plsLoadImage(images, imagePath)
text-align: center; text-align: center;
transition: transform var(--speed) var(--ease); transition: transform var(--speed) var(--ease);
text-decoration: none; text-decoration: none;
}
&:hover { a > img {
transform: scale(var(--hover-scale)); padding: 0px 0.25em;
} width: 90%;
height: auto;
img {
padding: 0px 0.25em;
width: 90%;
height: auto;
}
} }
@media (min-width: 512px) { @media (min-width: 512px) {
@ -77,10 +68,12 @@ const loadedImage = plsLoadImage(images, imagePath)
padding: 10px 10px; padding: 10px 10px;
width: auto; width: auto;
height: auto; height: auto;
img { }
padding: 0px 1.5em;
width: 200px; a > img {
} padding: 0px 1.5em;
width: 200px;
height: auto;
} }
} }

View file

@ -1,27 +0,0 @@
---
---
<div>
<span>
I am currently working on a site to catalogue past and future TAs.<br/>
Check it out at <a href="https://fgo-ta.com">fgo-ta.com</a>
</span>
</div>
<style>
div {
display: flex;
width: 100%;
height: 5em;
background-color: var(--c-gray);
text-align: center;
align-items: center;
justify-content: center;
color: white;
font-size: 1.5em;
}
a {
color: var(--c-darkpurple);
text-decoration: none;
}
</style>

View file

@ -6,19 +6,18 @@ const hamburger_src_url = `url("${hamburger.src}")`;
--- ---
<header> <header>
<a href="/" rel="noopener noreferrer" aria-label="Home" role="navigation"> <a href="/" rel="noopener noreferrer" aria-label="Home">
<Image src={logo} alt="Firq Website Logo"/> <Image src={logo} alt="Website Logo"/>
<span class="visually-hidden">Firq Website Logo</span>
</a> </a>
<ul class="desktop"> <ul class="desktop">
<slot name="desktop"/> <slot />
</ul> </ul>
<button class="mobile" aria-label="Navigation Button" tabindex="0" onclick="this.focus()" role="navigation"> <button class="mobile" aria-label="Navigation Button" tabindex="0" onclick="this.focus()">
<ul> <ul>
<slot name="mobile"/> <slot />
</ul> </ul>
<div class="placeholder"></div> <div class="placeholder"></div>
<div class="hamburger-menu" role="navigation"></div> <div class="hamburger-menu"></div>
</button> </button>
</header> </header>
@ -109,12 +108,12 @@ const hamburger_src_url = `url("${hamburger.src}")`;
.hamburger-menu { .hamburger-menu {
mask: var(--hamburger_src_url) no-repeat center; mask: var(--hamburger_src_url) no-repeat center;
background-color: white; background-color: white;
width: 2rem; width: 2em;
height: 2rem; height: 2em;
position: static; position: static;
align-self: flex-start; align-self: flex-start;
margin-right: 1rem; padding-right: 1em;
margin-top: 1rem; padding-top: 2.5em;
} }
@media (min-width: 1140px) { @media (min-width: 1140px) {

View file

@ -1,13 +1,12 @@
--- ---
export interface Props { export interface Props {
currentPage?: string currentPage?: string
navtype: "mobile" | "desktop"
link: string link: string
text: string text: string
icon: ImageMetadata icon: ImageMetadata
} }
const { icon, text, link, navtype, currentPage } = Astro.props const { icon, text, link, currentPage } = Astro.props
let currPage = '' let currPage = ''
const slug = link.replace(new RegExp('/', 'g'), '') const slug = link.replace(new RegExp('/', 'g'), '')
@ -20,8 +19,6 @@ if (currentPage === slug) {
const icon_src_url = `url("${icon.src}")`; const icon_src_url = `url("${icon.src}")`;
const fulllink = `/${slug}` const fulllink = `/${slug}`
let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
--- ---
<li> <li>
@ -30,8 +27,7 @@ let extraattributes = navtype === "mobile" ? { tabindex: "0"} : {}
rel="noopener noreferrer" rel="noopener noreferrer"
aria-label={text} aria-label={text}
class={currPage} class={currPage}
role="navigation" tabindex="0"
{...extraattributes}
> >
<div class="icon"></div> <div class="icon"></div>
{text} {text}

View file

@ -1,7 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro';
import { Image } from 'astro:assets'; import { Image } from 'astro:assets';
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
name: string name: string
@ -17,10 +16,8 @@ export interface Props {
const { bond10, ml, bondceImageFile, servantImageFile, np, skills, level, name } = Astro.props const { bond10, ml, bondceImageFile, servantImageFile, np, skills, level, name } = Astro.props
const servantImagePath = `/src/assets/servant/${servantImageFile}` const servantImagePath = `/src/assets/servant/${servantImageFile}`
const bondceImagePath = `/src/assets/ce/bond-ce/${bondceImageFile}` const bondceImagePath = `/src/assets/ce/bond-ce/${bondceImageFile}`
const images_servants = import.meta.glob<GlobImage>('/src/assets/servant/*.{png,webp}') const images_servants = import.meta.glob<{ default: ImageMetadata }>('/src/assets/servant/*.{png,webp}')
const images_bond_ces = import.meta.glob<GlobImage>('/src/assets/ce/bond-ce/*.{png,webp}') const images_bond_ces = import.meta.glob<{ default: ImageMetadata }>('/src/assets/ce/bond-ce/*.{png,webp}')
const loadedServantImage = plsLoadImage(images_servants, servantImagePath)
const loadedBondCEImage = plsLoadImage(images_bond_ces, bondceImagePath)
let bondce_css: string = 'bond-ce' let bondce_css: string = 'bond-ce'
@ -30,14 +27,14 @@ if (bond10 === false) {
--- ---
<article> <article>
<Image src={loadedServantImage} alt={name} /> <Image src={images_servants[servantImagePath]()} alt={name} />
<h2 class="subtext"> <h2 class="subtext">
Level {level}<br /> Level {level}<br />
{skills}<br /> {skills}<br />
NP {np} NP {np}
</h2> </h2>
<div class="expand-on-hover"> <div class="expand-on-hover">
<Image src={loadedBondCEImage} alt="" class={bondce_css}/> <Image src={images_bond_ces[bondceImagePath]()} alt="" class={bondce_css}/>
<h2 class="subtext">Mana Loading: {ml === 'Not Unlocked' && <br />}{ml}</h2> <h2 class="subtext">Mana Loading: {ml === 'Not Unlocked' && <br />}{ml}</h2>
</div> </div>
</article> </article>

View file

@ -1,8 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
date: string date: string
title: string title: string
@ -26,16 +24,13 @@ const targetImagePath = `/src/assets/ta_icons/${targetImageFile}`
const servantImagePath = `/src/assets/ta_icons/ta_servants/${servantImageFile}` const servantImagePath = `/src/assets/ta_icons/ta_servants/${servantImageFile}`
const formatted_date = new Date(date).toLocaleDateString('de-DE', options_date) const formatted_date = new Date(date).toLocaleDateString('de-DE', options_date)
const target_images = import.meta.glob<GlobImage>( const target_images = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/ta_icons/*.{png,webp}' '/src/assets/ta_icons/*.{png,webp}'
) )
const servant_images = import.meta.glob<GlobImage>( const servant_images = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/ta_icons/ta_servants/*.{png,webp}' '/src/assets/ta_icons/ta_servants/*.{png,webp}'
) )
const loadedServantImage = plsLoadImage(servant_images, servantImagePath)
const loadedTargetImage = plsLoadImage(target_images, targetImagePath)
let hasuser = '' let hasuser = ''
if (user !== undefined) { if (user !== undefined) {
hasuser = 'hasuser' hasuser = 'hasuser'
@ -44,7 +39,7 @@ if (user !== undefined) {
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}> <a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}>
<article> <article>
<Image src={loadedTargetImage} alt={title} class="icon" /> <Image src={target_images[targetImagePath]()} alt={title} class="icon" />
<div class="title"> <div class="title">
<h2>{title}</h2> <h2>{title}</h2>
</div> </div>
@ -55,7 +50,7 @@ if (user !== undefined) {
{formatted_date} {formatted_date}
</p> </p>
<div class="expand-on-hover"> <div class="expand-on-hover">
<Image src={loadedServantImage} alt="" /> <Image src={servant_images[servantImagePath ?? 'undefined']()} alt="" />
<h2>{turns}</h2> <h2>{turns}</h2>
</div> </div>
</article> </article>

View file

@ -1,7 +1,6 @@
--- ---
import type { ImageMetadata } from 'astro'
import { Image } from 'astro:assets' import { Image } from 'astro:assets'
import type { GlobImage } from '../types/generic'
import { plsLoadImage } from '../utils/tools'
export interface Props { export interface Props {
title: string title: string
@ -10,22 +9,19 @@ export interface Props {
} }
const { imageFile, link, title } = Astro.props const { imageFile, link, title } = Astro.props
const logoAltText = `${title} Logo`
const imagePath = `/src/assets/technologies/${imageFile}` const imagePath = `/src/assets/technologies/${imageFile}`
const images_logos = import.meta.glob<GlobImage>( const images_logos = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/technologies/*.{png,webp}' '/src/assets/technologies/*.{png,webp}'
) )
const loadedImage = plsLoadImage(images_logos, imagePath)
--- ---
<a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}> <a href={link} target="_blank" rel="noopener noreferrer" aria-label={title}>
<article> <article>
<Image src={loadedImage} alt={logoAltText} /> <Image src={images_logos[imagePath]()} alt="" />
<div> <div>
<h2>{title}</h2> <h2>{title}</h2>
</div> </div>
</article> </article>
<span class="visually-hidden">{logoAltText}</span>
</a> </a>
<style> <style>

View file

@ -77,12 +77,7 @@ const mapped_navdata = navdata.map((item) => ({
<Navbar> <Navbar>
{ {
mapped_navdata.map((item) => ( mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="desktop" {...item} slot="desktop"/> <NavbarEntry currentPage={currentpage} {...item} />
))
}
{
mapped_navdata.map((item) => (
<NavbarEntry currentPage={currentpage} navtype="mobile" {...item} slot="mobile"/>
)) ))
} }
</Navbar> </Navbar>
@ -107,15 +102,4 @@ const mapped_navdata = navdata.map((item) => ({
background: var(--c-lightgray); background: var(--c-lightgray);
margin: 0px; margin: 0px;
} }
.visually-hidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
</style> </style>

View file

@ -17,7 +17,7 @@ const description = "Error. This shouldn't happen :/"
<Image src={sadshishou} alt="Sad Shishou" /> <Image src={sadshishou} alt="Sad Shishou" />
<h2>Well ... you were not supposed to end up here.</h2> <h2>Well ... you were not supposed to end up here.</h2>
<a href="/" aria-label="Home" rel="noopener noreferrer"> <a href="/" aria-label="Home" rel="noopener noreferrer">
&lt;&lt; Go back home <i class="iconoir-fast-arrow-left"></i>Go back home
</a> </a>
</div> </div>
</BaseSection> </BaseSection>
@ -50,10 +50,10 @@ const description = "Error. This shouldn't happen :/"
text-decoration: none; text-decoration: none;
font-size: 1.5rem; font-size: 1.5rem;
font-weight: bold; font-weight: bold;
}
&:hover { a:hover {
color: var(--c-darkpurple); color: var(--c-darkpurple);
}
} }
img { img {

View file

@ -6,9 +6,6 @@ description: 'A handful of observations from the cernunnos fight'
author: 'Requiem & Firq' author: 'Requiem & Firq'
tags: ['fgo', 'lostbelt 6', 'cernunnos'] tags: ['fgo', 'lostbelt 6', 'cernunnos']
--- ---
import thumbnail_firq from "../../assets/thumbnails/WrHudtdfivA.jpg"
import thumbnail_requiem from "../../assets/thumbnails/O1f-go7uJQM.jpg"
import YoutubeEmbed from "../../components/youtubeEmbed.astro"
## Foreword ## Foreword
@ -48,19 +45,3 @@ On the first break Cernunnos skill seals your servants. This means on turn 2 you
As an example: As an example:
Let's say I used Alteras third skill turn 1. She has to wait 5 turns to reuse it and on turn 3 Vitch gives her 2 times cooldown reduction. Let's say I used Alteras third skill turn 1. She has to wait 5 turns to reuse it and on turn 3 Vitch gives her 2 times cooldown reduction.
Ideally you would be able to reuse her third skill on turn 4 but because she gets skill sealed she can't do it. Ideally you would be able to reuse her third skill on turn 4 but because she gets skill sealed she can't do it.
## Resulting runs
Both Requiem and I managed to get unique TAs done with Scathach (Requiem even with more servants). Those runs are embedded here:
### Firq
This run doesn't use the support Castoria provided by the game and instead makes use of Sherlock instead.
<YoutubeEmbed id="WrHudtdfivA" thumbnail={thumbnail_firq.src}/>
### Requiem
A frontline only run with double Castoria
<YoutubeEmbed id="O1f-go7uJQM" thumbnail={thumbnail_requiem.src}/>

View file

@ -11,7 +11,6 @@ import TaSection from '../layouts/taSection.astro'
import TaCard from '../components/taCard.astro' import TaCard from '../components/taCard.astro'
import tadata from '../../static/data/_tadata.json' import tadata from '../../static/data/_tadata.json'
import featured_data from '../../static/data/_featureddata.json' import featured_data from '../../static/data/_featureddata.json'
import FgotaHero from '../components/fgotaHero.astro'
const important_data = tadata.filter(function (el) { const important_data = tadata.filter(function (el) {
return [ return [
@ -37,7 +36,6 @@ const description = 'A collection of TAs previously completed be Firq.'
currentpage="ta-collection" currentpage="ta-collection"
descriptionOverride={description} descriptionOverride={description}
> >
<FgotaHero />
<TaSection title="Notable TAs" abovetext="My most notable TAs"> <TaSection title="Notable TAs" abovetext="My most notable TAs">
{important_data.map((item) => <TaCard {...item} />)} {important_data.map((item) => <TaCard {...item} />)}
</TaSection> </TaSection>

View file

@ -1,10 +0,0 @@
export interface IconsLookup {
[key: string]: ImageMetadata
}
interface GlobGeneric<T> {
default: T
}
export type GlobAny = GlobGeneric<any>
export type GlobImage = GlobGeneric<ImageMetadata>

View file

@ -1,5 +0,0 @@
export function plsLoadImage(record: Record<string, () => Promise<{default: ImageMetadata}>>, path: string) {
const loadedImage = record[path]?.();
if (!loadedImage) throw new Error("Asset was not found:" + path);
return loadedImage;
}

View file

@ -2,56 +2,56 @@
{ {
"name": "The Merciless One", "name": "The Merciless One",
"imageFile": "merciless_one.png", "imageFile": "merciless_one.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Ox-Demon King", "name": "Ox-Demon King",
"imageFile": "ox-demon.png", "imageFile": "ox-demon.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Holy Maiden's Teachings", "name": "Holy Maiden's Teachings",
"imageFile": "maidens_teachings.png", "imageFile": "maidens_teachings.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Kaleidoscope", "name": "Kaleidoscope",
"imageFile": "kaleidoscope.png", "imageFile": "kaleidoscope.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "The Black Grail", "name": "The Black Grail",
"imageFile": "black_grail.png", "imageFile": "black_grail.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "A Fragment Of 2030", "name": "A Fragment Of 2030",
"imageFile": "2030.png", "imageFile": "2030.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Outrage", "name": "Outrage",
"imageFile": "outrage.png", "imageFile": "outrage.png",
"mlb": false "mlb": "false"
}, },
{ {
"name": "Vessel of the Saint", "name": "Vessel of the Saint",
"imageFile": "vessel.png", "imageFile": "vessel.png",
"mlb": false "mlb": "false"
}, },
{ {
"name": "Devilish Bodhisattva", "name": "Devilish Bodhisattva",
"imageFile": "devilish_bodhisattva.png", "imageFile": "devilish_bodhisattva.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "500-Year Obsession", "name": "500-Year Obsession",
"imageFile": "500.png", "imageFile": "500.png",
"mlb": true "mlb": "true"
}, },
{ {
"name": "Prisma Cosmos", "name": "Prisma Cosmos",
"imageFile": "prisma_cosmos.png", "imageFile": "prisma_cosmos.png",
"mlb": true "mlb": "true"
} }
] ]

View file

@ -1,19 +1,9 @@
[ [
{
"name": "Scathach",
"level": "120",
"np": "5",
"skills": "10 / 10 / 10",
"ml": "10",
"servantImageFile": "scathach_03.png",
"bondceImageFile": "scathach.png",
"bond10": true
},
{ {
"name": "Skadi", "name": "Skadi",
"level": "120", "level": "120",
"np": "5", "np": "5",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "10", "ml": "10",
"servantImageFile": "skadi_03.png", "servantImageFile": "skadi_03.png",
"bondceImageFile": "skadi.png", "bondceImageFile": "skadi.png",
@ -23,7 +13,7 @@
"name": "Skadi", "name": "Skadi",
"level": "70", "level": "70",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "1", "ml": "1",
"servantImageFile": "skadi_02.png", "servantImageFile": "skadi_02.png",
"bondceImageFile": "skadi.png", "bondceImageFile": "skadi.png",
@ -33,7 +23,7 @@
"name": "Skadi", "name": "Skadi",
"level": "1", "level": "1",
"np": "1", "np": "1",
"skills": "10 / X / X", "skills": "10 / X / X ",
"ml": "1", "ml": "1",
"servantImageFile": "skadi_01.png", "servantImageFile": "skadi_01.png",
"bondceImageFile": "skadi.png", "bondceImageFile": "skadi.png",
@ -43,18 +33,18 @@
"name": "Koyanskaya of Light", "name": "Koyanskaya of Light",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "koyanlight_01.png", "servantImageFile": "koyanlight_01.png",
"bondceImageFile": "koyanlight.png", "bondceImageFile": "koyanlight.png",
"bond10": true "bond10": false
}, },
{ {
"name": "Castoria", "name": "Castoria",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "10", "ml": "7",
"servantImageFile": "castoria_02.png", "servantImageFile": "castoria_02.png",
"bondceImageFile": "castoria.png", "bondceImageFile": "castoria.png",
"bond10": true "bond10": true
@ -63,7 +53,7 @@
"name": "Castoria", "name": "Castoria",
"level": "70", "level": "70",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "1", "ml": "1",
"servantImageFile": "castoria_01.png", "servantImageFile": "castoria_01.png",
"bondceImageFile": "castoria.png", "bondceImageFile": "castoria.png",
@ -73,17 +63,17 @@
"name": "Oberon", "name": "Oberon",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "1", "ml": "Not Unlocked",
"servantImageFile": "oberon_02.png", "servantImageFile": "oberon_02.png",
"bondceImageFile": "oberon.png", "bondceImageFile": "oberon.png",
"bond10": true "bond10": false
}, },
{ {
"name": "Merlin", "name": "Merlin",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "merlin_03.png", "servantImageFile": "merlin_03.png",
"bondceImageFile": "merlin.png", "bondceImageFile": "merlin.png",
@ -93,7 +83,7 @@
"name": "Merlin", "name": "Merlin",
"level": "70", "level": "70",
"np": "1", "np": "1",
"skills": "9 / 1 / 9", "skills": "9 / 1 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "merlin_01.png", "servantImageFile": "merlin_01.png",
"bondceImageFile": "merlin.png", "bondceImageFile": "merlin.png",
@ -103,7 +93,7 @@
"name": "Waver", "name": "Waver",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "waver_02.png", "servantImageFile": "waver_02.png",
"bondceImageFile": "waver.png", "bondceImageFile": "waver.png",
@ -113,7 +103,7 @@
"name": "Reines", "name": "Reines",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "9", "ml": "9",
"servantImageFile": "reines_01.png", "servantImageFile": "reines_01.png",
"bondceImageFile": "reines.png", "bondceImageFile": "reines.png",
@ -123,7 +113,7 @@
"name": "Tamamo-no-Mae", "name": "Tamamo-no-Mae",
"level": "90", "level": "90",
"np": "2", "np": "2",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "tamamo_03.png", "servantImageFile": "tamamo_03.png",
"bondceImageFile": "tamamo.png", "bondceImageFile": "tamamo.png",
@ -133,7 +123,7 @@
"name": "Van Gogh", "name": "Van Gogh",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "10", "ml": "10",
"servantImageFile": "gogh_01.png", "servantImageFile": "gogh_01.png",
"bondceImageFile": "gogh.png", "bondceImageFile": "gogh.png",
@ -143,7 +133,7 @@
"name": "Miss Crane", "name": "Miss Crane",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "crane_01.png", "servantImageFile": "crane_01.png",
"bondceImageFile": "crane.png", "bondceImageFile": "crane.png",
@ -153,8 +143,8 @@
"name": "Ashiya Douman", "name": "Ashiya Douman",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "9 / 9 / 10", "skills": "9 / 9 / 10 ",
"ml": "10", "ml": "Not Unlocked",
"servantImageFile": "douman_01.png", "servantImageFile": "douman_01.png",
"bondceImageFile": "douman.png", "bondceImageFile": "douman.png",
"bond10": false "bond10": false
@ -163,47 +153,27 @@
"name": "Himiko", "name": "Himiko",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "9 / 9 / 9", "skills": "9 / 9 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "himiko_03.png", "servantImageFile": "himiko_03.png",
"bondceImageFile": "himiko.png", "bondceImageFile": "himiko.png",
"bond10": false "bond10": false
}, },
{
"name": "Sherlock Holmes",
"level": "90",
"np": "1",
"skills": "9 / 10 / 9",
"ml": "Not Unlocked",
"servantImageFile": "sherlock_03.png",
"bondceImageFile": "sherlock.png",
"bond10": false
},
{ {
"name": "Nero (Bride)", "name": "Nero (Bride)",
"level": "90", "level": "90",
"np": "1", "np": "1",
"skills": "10 / 10 / 10", "skills": "10 / 10 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "bride_03.png", "servantImageFile": "bride_03.png",
"bondceImageFile": "bride.png", "bondceImageFile": "bride.png",
"bond10": false "bond10": false
}, },
{
"name": "Taigon Wang",
"level": "70",
"np": "1",
"skills": "10 / 9 / 10",
"ml": "Not Unlocked",
"servantImageFile": "taigong_03.png",
"bondceImageFile": "taigong.png",
"bond10": false
},
{ {
"name": "Nightingale (Santa)", "name": "Nightingale (Santa)",
"level": "80", "level": "80",
"np": "5", "np": "5",
"skills": "9 / 10 / 9", "skills": "9 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "santagale_01.png", "servantImageFile": "santagale_01.png",
"bondceImageFile": "santagale.png", "bondceImageFile": "santagale.png",
@ -213,7 +183,7 @@
"name": "Nightingale (Santa)", "name": "Nightingale (Santa)",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "1 / 10 / 10", "skills": "1 / 10 / 10 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "santagale_01.png", "servantImageFile": "santagale_01.png",
"bondceImageFile": "santagale.png", "bondceImageFile": "santagale.png",
@ -223,7 +193,7 @@
"name": "Elisabeth Báthory", "name": "Elisabeth Báthory",
"level": "40", "level": "40",
"np": "1", "np": "1",
"skills": "9 / 9 / X", "skills": "9 / 9 / X ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "liz_01.png", "servantImageFile": "liz_01.png",
"bondceImageFile": "liz.png", "bondceImageFile": "liz.png",
@ -233,7 +203,7 @@
"name": "Wu Zetian", "name": "Wu Zetian",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "10 / 9 / 10", "skills": "9 / 1 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "wu_01.png", "servantImageFile": "wu_01.png",
"bondceImageFile": "wu.png", "bondceImageFile": "wu.png",
@ -243,7 +213,7 @@
"name": "Ibaraki-Douji", "name": "Ibaraki-Douji",
"level": "40", "level": "40",
"np": "1", "np": "1",
"skills": "9 / 10 / X ", "skills": "8 / 8 / X ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "ibaraki_02.png", "servantImageFile": "ibaraki_02.png",
"bondceImageFile": "ibaraki.png", "bondceImageFile": "ibaraki.png",
@ -253,7 +223,7 @@
"name": "Calamity Jane", "name": "Calamity Jane",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "1 / 9 / 9", "skills": "1 / 9 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "jane_02.png", "servantImageFile": "jane_02.png",
"bondceImageFile": "jane.png", "bondceImageFile": "jane.png",
@ -263,7 +233,7 @@
"name": "Chiron", "name": "Chiron",
"level": "60", "level": "60",
"np": "1", "np": "1",
"skills": "1 / 10 / 10", "skills": "1 / 9 / 9 ",
"ml": "Not Unlocked", "ml": "Not Unlocked",
"servantImageFile": "chiron_01.png", "servantImageFile": "chiron_01.png",
"bondceImageFile": "chiron.png", "bondceImageFile": "chiron.png",

View file

@ -310,21 +310,5 @@
"date": "2023-12-16", "date": "2023-12-16",
"servantImageFile": "shishou.png", "servantImageFile": "shishou.png",
"turns": "3T" "turns": "3T"
},
{
"title": "Tunguska - Beast of Taming 4T (FLO)",
"link": "https://www.youtube.com/watch?v=g6aASJeL-ao",
"targetImageFile": "koyanskayaofdark.png",
"date": "2023-12-26",
"servantImageFile": "shishou.png",
"turns": "4T"
},
{
"title": "Tunguska - Beast IV:L 4T",
"link": "https://www.youtube.com/watch?v=brz21NKMMsY",
"targetImageFile": "beast_4_l.png",
"date": "2023-12-31",
"servantImageFile": "shishou.png",
"turns": "4T"
} }
] ]