dev #9

Merged
Firq merged 33 commits from dev into main 2023-12-21 11:27:53 +00:00
13 changed files with 5454 additions and 3579 deletions

View file

@ -0,0 +1,69 @@
on:
push:
tags:
- '[0-9]+\.[0-9]+\.[0-9]+pre[0-9]+'
jobs:
checking:
runs-on: docker
container: node:lts
steps:
- name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages
run: npm install
- name: Run astro check (linting + static analysis)
run: npm run astro check
build-site:
needs: [checking]
if: success()
runs-on: dind
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
registry: forgejo.neshweb.net
username: ${{ secrets.FORGEJO_USERNAME }}
password: ${{ secrets.FORGEJO_TOKEN }}
- name: Push to Package Registry
uses: docker/build-push-action@v5
with:
push: true
tags: forgejo.neshweb.net/firq/firq-dev-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/firq-dev-website:preview
publish:
needs: [build-site]
if: success()
runs-on: docker
steps:
- name: Release New Version
uses: actions/forgejo-release@v1
with:
direction: upload
url: https://forgejo.neshweb.net
release-dir: release
token: ${{ secrets.FORGEJO_TOKEN }}
tag: ${{ github.ref_name }}
# doesn't work atm
# unlighthouse:
# needs: [publish]
# if: success()
# runs-on: docker
# container: registry.gitlab.com/gitlab-ci-utils/lighthouse:latest
# services:
# website:
# image: forgejo.neshweb.net/firq/firq-dev-website:preview
# steps:
# - name: Install Dependencies
# run: npm install @unlighthouse/cli puppeteer
# - name: Run unlighthouse
# run: node_modules/.bin/unlighthouse-ci
# - name: Upload reports
# uses: actions/upload-artifact@v3
# with:
# name: unlighthouse-reports
# path: unlighthouse-reports/

View file

@ -0,0 +1,53 @@
on:
push:
tags:
- '[0-9]+\.[0-9]+\.[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+a[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+b[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+rc[0-9]+'
jobs:
checking:
runs-on: docker
container: node:lts
steps:
- name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages
run: npm install
- name: Run astro check (linting + static analysis)
run: npm run astro check
run: npm run astro check
build-site:
needs: [checking]
if: success()
runs-on: dind
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
registry: forgejo.neshweb.net
username: ${{ secrets.FORGEJO_USERNAME }}
password: ${{ secrets.FORGEJO_TOKEN }}
- name: Push to Package Registry
uses: docker/build-push-action@v5
with:
push: true
tags: forgejo.neshweb.net/firq/firq-dev-website:${{ github.ref_name }}, forgejo.neshweb.net/firq/firq-dev-website:latest
release:
needs: [build-site]
if: success()
runs-on: docker
steps:
- name: Release New Version
uses: actions/forgejo-release@v1
with:
direction: upload
url: https://forgejo.neshweb.net
release-dir: release
token: ${{ secrets.FORGEJO_TOKEN }}
tag: ${{ github.ref_name }}

View file

@ -0,0 +1,16 @@
on:
push:
branches:
- "**"
jobs:
checking:
runs-on: docker
container: node:lts
steps:
- name: Checkout source code
uses: https://code.forgejo.org/actions/checkout@v3
- name: Install packages
run: npm install
- name: Run astro check (linting + static analysis)
run: npm run astro check

View file

@ -0,0 +1,95 @@
on:
push:
tags:
- '[0-9]+\.[0-9]+\.[0-9]+unlighthouse[0-9]+'
- '[0-9]+\.[0-9]+\.[0-9]+ulh[0-9]+'
jobs:
unlighthouse:
runs-on: docker
container: forgejo.neshweb.net/firq/unlighthouse-docker:latest
steps:
- name: Checkout repository
uses: https://code.forgejo.org/actions/checkout@v3
- name: Run unlighthouse
run: unlighthouse-ci --site "https://preview.firq.dev/"
- name: Prepare artifacts
run: cp serve.json unlighthouse-reports
- name: Upload reports
uses: actions/upload-artifact@v3
with:
name: unlighthouse-reports
path: unlighthouse-reports/
deploy-unlighthouse-files:
needs: [ unlighthouse ]
runs-on: docker
env:
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
steps:
- name: Install and update ssh + rsync
run: |
which rsync || ( apt update -y && apt install rsync -y)
which ssh-agent || ( apt update -y && apt install openssh-client -y)
- name: Downloading static site artifacts
uses: actions/download-artifact@v3
with:
name: unlighthouse-reports
path: public
- name: Install SSH Key
uses: https://github.com/shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_PRIVATE_KEY }}
known_hosts: unnecessary
- name: Adding Known Hosts
run: ssh-keyscan -H ${{ secrets.DEPLOY_HOST }} >> ~/.ssh/known_hosts
- name: Stop screen session, delete old files
uses: https://github.com/appleboy/ssh-action@master
with:
host: ${{ env.DEPLOY_HOST }}
username: ${{ env.DEPLOY_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
screen -X -S firq_dev-unlighthouse kill
rm -r -f firq_dev/unlighthouse/*
- name: Copy files using rsync
run: rsync -az --stats public/* ${{ env.DEPLOY_USER }}@${{ env.DEPLOY_HOST }}:~/firq_dev/unlighthouse
- name: Check files on deploy target
uses: https://github.com/appleboy/ssh-action@master
with:
host: ${{ env.DEPLOY_HOST }}
username: ${{ env.DEPLOY_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd firq_dev
find unlighthouse -maxdepth 1 -printf "%p\n"
deploy-unlighthouse-site:
needs: [ deploy-unlighthouse-files ]
runs-on: docker
env:
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
steps:
- name: Install and update ssh + rsync
run: |
which rsync || ( apt update -y && apt install rsync -y)
which ssh-agent || ( apt update -y && apt install openssh-client -y)
- name: Install SSH Key
uses: https://github.com/shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_PRIVATE_KEY }}
known_hosts: unnecessary
- name: Adding Known Hosts
run: ssh-keyscan -H ${{ secrets.DEPLOY_HOST }} >> ~/.ssh/known_hosts
- name: Start new screen session
uses: https://github.com/appleboy/ssh-action@master
with:
host: ${{ env.DEPLOY_HOST }}
username: ${{ env.DEPLOY_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
PATH="$HOME/.local/bin:$PATH"
cd firq_dev
screen -S firq_dev-unlighthouse -dm serve unlighthouse/ -p ${{ secrets.UNLIGHTHOUSE_DEPLOY_PORT }}

View file

@ -1,14 +0,0 @@
image: node:lts
pages:
cache:
paths:
- node_modules/
script:
- npm install
- npm run build
artifacts:
paths:
- public
expire_in: 3 days
only:
- main

17
Dockerfile Normal file
View file

@ -0,0 +1,17 @@
FROM node:lts AS build
WORKDIR /app
COPY . .
RUN npm i
RUN npm run build
FROM node:lts AS runtime
RUN npm install --global "@warren-bank/serve"
COPY --from=build /app/dist /public
COPY --from=build /app/serve.json /public/serve.json
RUN rm -r /public/assets/data/
ENV PORT 8081
EXPOSE 8081
CMD [ "serve", "public/", "-p", "8081" ]

View file

@ -7,7 +7,7 @@ import sitemap from "@astrojs/sitemap";
export default defineConfig({ export default defineConfig({
sitemap: true, sitemap: true,
base: '/', base: '/',
outDir: 'public', outDir: 'dist',
publicDir: 'static', publicDir: 'static',
site: 'https://firq.dev/', site: 'https://firq.dev/',
integrations: [sitemap()] integrations: [sitemap()]

8606
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.6", "version": "0.1.7",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
@ -11,8 +11,10 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astrojs/sitemap": "^1.2.1", "@astrojs/check": "^0.3.3",
"astro": "^2.8.0", "@astrojs/sitemap": "^3.0.3",
"iconoir": "^6.1.0" "astro": "^4.0.7",
"iconoir": "^6.1.0",
"typescript": "^5.3.3"
} }
} }

View file

@ -42,6 +42,7 @@ const fulllink = `/${slug}`
width: 200px; width: 200px;
} }
li > a { li > a {
display: inline-flex;
color: white; color: white;
text-decoration: none; text-decoration: none;
justify-content: center; justify-content: center;
@ -49,11 +50,12 @@ const fulllink = `/${slug}`
font-size: 1.4em; font-size: 1.4em;
height: 100%; height: 100%;
font-weight: bold; font-weight: bold;
gap: 0.2em;
} }
li > a:hover { li > a:hover {
color: var(--c-purplepink); color: var(--c-purplepink);
} }
.current { .current {
color: var(--c-darkpurple); color: var(--c-darkpurple) !important;
} }
</style> </style>

View file

@ -0,0 +1,115 @@
---
layout: ../../layouts/blogPost.astro
title: 'FGO Mechanics: Instant Death'
pubDate: 2023-08-19
description: 'Blog post talking about instant death in FGO, how you can take advantage of it and what its limits are.'
author: 'Firq'
tags: ['fgo', 'games']
---
> **Disclaimer**<br>
> While writing this, Requiem and I faced a bit of a challenge concerning death rate calculations. Case in point is the passive "Item Construction"
and its interaction with Instant Kill, as we could not reach a final verdict if it affects Instant Kill Hit rate or not. In case of this article, I will assume
it doesn't interact with the hitrate, but if you have proof that this is different, I will gladly incorporate this in the article.
## Introduction
Instant Kill & Instant Death: One of the most rejected systems to exist in FGO. Most players know of it, but discard it because of its unreliability and uselessness against stronger enemies. In this article, I want to dive a bit into the workings of Instant Kill and help you understand how you can, in specific scenarios, use it to your advantage.
There are a multitude of servants that have access to instant-kill, but I will only highlight a few here (You can view the full list on <a href="https://gamepress.gg/grandorder/instant-death" target="_blank" rel="noopener noreferrer" style="font-style: unset">Gamepress</a>)
- **Nitocris (Caster)**: The most prominent figure, as she has easy access to her instant-killing NP and a skill that increases her death hit rate
- **Void Shiki (Saber)**: Another Example of an AOE Instant-Kill servant who also has access to Death Resist debuffs. One quest in her release event even specifically used the Instant Kill mechanic (<a href="https://apps.atlasacademy.io/db/NA/quest/94021308/1" target="_blank" rel="noopener noreferrer" style="font-style: unset">Quest Link here</a>)
- **King Hassan (Assassin)**: The only servant that can afflict enemies with instant death on normal attacks (Note: David can do this as well, but only if he has his Bond CE equipped)
But since Instant Kill is based on probability, most players are relucatant to use it in their farming compositions. This thems from the different death rates enemies have:
- Bronze: 80%
- Silver: 50%
- Gold: 20%
This list here is just for rarities. However, there are a lot more factors to consider, as some enemies have higher death rate, some lower. Be sure to check each case individually, as rates may vary.
Also, servant enemies usually have a death rate of 0.1%, sometimes a bit more like 0.3% or 0.4%. So going for Instant Kill on servants will, in the majority of cases, not work.
## Calculating Instant Death Rate
The formular for getting the probability of an enemy dying to Instant Kill is as follows:
```
death = hitRate * deathRate * (1 + instantDeathRateUp - instantDeathRateDown - instantDeathResistUp + instantDeathResistDown)
```
The parameters here are the following:
- `hitRate`: The Death Hit rate of the effect or NP used
- `deathRate`: The Enemy Death rate
- `instantDeathRateUp`: Buffs that increases instant kill success rate (Nitocris S1)
- `instantDeathRateDown`: Debuffs that decreases instant kill success rate
- `instantDeathResistUp`: Buffs that increases instant kill resistance (Taira S2)
- `instantDeathResistDown`: Debuffs that decreases instant kill resistance (Void Shiki S1)
## Example
The main reason this came up was because of a farming comp used in <a href="https://apps.atlasacademy.io/db/NA/quest/94061820/1" target="_blank" rel="noopener noreferrer" style="font-style: unset">Hunting Quest XI - Day 5 - Pride+</a>. The node is structured
into a 2 - 1 - 1 Layout, meaning using a dual-DPS setup would be the way to go.
Looking at the stats for the first wave, it made sense to use Nitocris: Both Ghouls have a 100% Death Rate <a href="https://apps.atlasacademy.io/db/NA/enemy/9940700" target="_blank" rel="noopener noreferrer" style="font-style: unset">according to Atlas Academy</a>.
I went with using Nitocris, since she has a 100% NP charge and a skill that increases her Instant Death rate by 100%. Not needing any additional charge meant that no other buffs or AOE charges needed to be used on turn 1.
Her kit brings the following stats:
* Her NP has an Insta-Kill Hit Rate of 50% when used at Overcharge 1 (meaning 100% charge)
* Her S1 increases Insta-Kill success rate by 100%
### Actual calculation
When using the formular from above, we have the following values
```
hitRate: 50%
deathRate: 100%
instantDeathRateUp: 100%
instantDeathRateDown: 0%
instantDeathResistUp: 0%
instantDeathResistDown: 0%
```
This means we can fill in the formular like this
```
death = 0.5 * 1 * (1 + 1 - 0 - 0 + 0)
```
We now break everything down step by step
```
death = 0.5 * (1 + 1)
= 0.5 * 2
= 1
= 100%
```
So her death succeeds 100% of the time on these ghouls, which makes her perfect to use in this scenario.
For other skill levels, this looks like this (_Her S1 scales from 50% to 100%_)
```
Skill Level | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
-------------|-----|-------|-----|-------|-----|-------|-----|-------|-----|------
Death % | 75% | 77.5% | 80% | 82.5% | 85% | 87.5% | 90% | 92.5% | 95% | 100%
```
In the end, this resulted in the following comp that worked like a charm.
<div style="width: 100%; display: flex; justify-content: center; padding-top: 0.75rem">
<iframe width="640" height="360" src="https://www.youtube-nocookie.com/embed/UwbNp_dB_VU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div>
## Conclusion
This small article should have given you an insight into using Instant Death as an advantage in the future. But remember: Stacking Gacha in a Gacha game can backfire.
That's all for now, thanks for reading
~ Firq

View file

@ -2,17 +2,17 @@
{ {
"link": "/", "link": "/",
"text": "Home", "text": "Home",
"icon": "iconoir-home-alt" "icon": "iconoir-home"
}, },
{ {
"link": "/servants", "link": "/servants",
"text": "Servants", "text": "Servants",
"icon": "iconoir-database-script" "icon": "iconoir-task-list"
}, },
{ {
"link": "/ta-collection", "link": "/ta-collection",
"text": "TA Collection", "text": "TA Collection",
"icon": "iconoir-db" "icon": "iconoir-database"
}, },
{ {
"link": "/blog", "link": "/blog",

View file

@ -1,5 +1,4 @@
export default { export default {
site: 'staging.firq.dev',
puppeteerOptions: { puppeteerOptions: {
args: ["--no-sandbox", "--disable-setuid-sandbox"], args: ["--no-sandbox", "--disable-setuid-sandbox"],
}, },
@ -7,6 +6,5 @@ export default {
budget: 90, budget: 90,
buildStatic: true buildStatic: true
}, },
auth: { username: "staging", password: "staging" },
outputPath: "unlighthouse-reports", outputPath: "unlighthouse-reports",
} }