summaryrefslogtreecommitdiffstats
path: root/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html')
-rw-r--r--micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html516
1 files changed, 516 insertions, 0 deletions
diff --git a/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html b/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html
new file mode 100644
index 0000000..c702832
--- /dev/null
+++ b/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html
@@ -0,0 +1,516 @@
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <style type=text/css>body{font-family:monospace;}</style>
+ <title>Playlog: Hundred Lines Last Defense Academy | micro.pinapelz.com</title>
+
+ <meta name="author" content="map[avatar:https://files.catbox.moe/5r1pue.jpg banner:https://files.pinapelz.com/pso2ngs-2232-collab.png bio:yo! and he&#39;s more than a cover he&#39;s a quilt&lt;br/&gt;
+ General arcade rhythm game enjoyer (SDVX, IIDX, CHUNITHM)&lt;br/&gt;
+ Mostly play MMOs (FFXIV, OSRS), JRPGs, and VNs (anything with a good story)&lt;br/&gt;
+ I Watch only slice of life (and Bandori)&lt;br/&gt;
+ Arch Linux &#43; Hyprland user (btw)&lt;br/&gt;
+ Hi from the &lt;a href=&#34;https://indieweb.org/&#34;&gt;indieweb&lt;/a&gt;, if you are seeing me bridged elsewhere! email:yukais@pinapelz.com name:Pinapelz]">
+ <link rel="stylesheet" href="/css/style.css">
+
+
+
+ <link rel="me" href="https://github.com/pinapelz" />
+ <link rel="me" href="mailto:yukais@pinapelz.com" />
+ <link rel="me" href="https://sakurajima.social/@pinapelz" />
+ <link rel="me" href="https://bsky.app/profile/pinapelz.moe" /><link rel="pgpkey" href="https://pinapelz.com/Yukai_Shan.asc">
+ <link
+ rel="authorization_endpoint"
+ href="https://indieauth.com/auth"
+ />
+ <link
+ rel="token_endpoint"
+ href="https://tokens.indieauth.com/token"
+ />
+ <link rel="webmention" href="https://webmention.io/micro.pinapelz.com/webmention" />
+
+
+
+</head>
+<body>
+ <header>
+ <div style="display:flex;flex-flow:row wrap;justify-content:space-between">
+ <div style="align-self:flex-start;">
+ ==============<br>
+ == <a href="https://micro.pinapelz.com/">Pinapelz</a> ==<br>
+ ==============
+ </div>
+ <div style="align-self:center;">check it out. I&#39;m in the house like carpet</div>
+ </div>
+ <nav style="margin: 1rem auto;">
+
+
+ <a href="/posts/"><b>Posts</b></a>.
+
+ <a href="/categories/"><b>Categories</b></a>.
+
+ <a href="/tags/"><b>Tags</b></a>.
+
+
+ </nav>
+</header>
+
+
+
+ <main>
+ <article class="h-entry">
+ <a class="u-bridgy-fed" href="https://fed.brid.gy/" hidden="from-humans"></a>
+ <h1 class="p-name">Playlog: Hundred Lines Last Defense Academy</h1>
+ <div hidden><div class="h-card p-author bio-card" style="text-align:center;">
+
+ <div class="banner" style="margin-bottom: 1rem; position: relative;">
+ <img class="u-featured" src="https://files.pinapelz.com/pso2ngs-2232-collab.png" alt="Banner" style="width: 100%; max-width: 400px; height: auto; border-radius: 8px; opacity: 0.6;">
+ <img class="u-photo avatar" src="https://files.catbox.moe/5r1pue.jpg" alt="Pinapelz's avatar" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
+ </div>
+
+ <div class="bio">
+ <p class="p-note">yo! and he's more than a cover he's a quilt<br/>
+ General arcade rhythm game enjoyer (SDVX, IIDX, CHUNITHM)<br/>
+ Mostly play MMOs (FFXIV, OSRS), JRPGs, and VNs (anything with a good story)<br/>
+ I Watch only slice of life (and Bandori)<br/>
+ Arch Linux + Hyprland user (btw)<br/>
+ Hi from the <a href="https://indieweb.org/">indieweb</a>, if you are seeing me bridged elsewhere!</p>
+ </div>
+ <p class="bio-name"><a href="https://micro.pinapelz.com/" rel="me" class="p-nickname p-name u-url">Pinapelz</a></p>
+</div>
+<hr/>
+</div>
+
+
+ <div><b>
+ <time class="dt-published" datetime="2026-03-17T17:19:03-07:00">
+ Tuesday, March 17, 2026
+ </time>
+ - <a href="https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/" class="u-url u-uid" >Permalink</a>
+ </b></div>
+ <div class="article-meta"><span class="categories">
+ Categories:
+
+ <a href="/categories/games">games</a>
+
+ </span>--<span class="tags">
+ Tags:
+
+ #<a href="/tags/playlog" class="p-category">playlog</a>
+
+ </span></div><div class="e-content">
+ <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so.
+<figure><img src="/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png"
+ alt="105 hours or more played">
+</figure>
+</p>
+<h2 id="core-mechanics">Core Mechanics</h2>
+<ul>
+<li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li>
+<li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li>
+</ul>
+<h2 id="structure">Structure</h2>
+<ul>
+<li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li>
+<li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li>
+<li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li>
+<li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li>
+</ul>
+<h2 id="content">Content</h2>
+<ul>
+<li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li>
+<li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li>
+<li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li>
+<li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li>
+</ul>
+<h2 id="technical-execution">Technical Execution</h2>
+<p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p>
+<h2 id="presentation">Presentation</h2>
+<p>Was good since I&rsquo;m a Danganronpa fan. I would&rsquo;ve liked to see a few more tracks or at least variations in boss fights. It does get a bit repetitive after 100 times&hellip; Still a surprising number of lines were voiced so props to them! (+14)</p>
+<p><strong>(86/100)</strong></p>
+
+ </div>
+
+
+
+
+
+
+ <section id="comments" class="webmentions">
+ <h2 class="wm-title">Webmentions</h2>
+ <div id="mentions" class="wm-list">Loading…</div>
+</section>
+
+<style>
+.webmentions {
+ margin-top: 2.5rem;
+ padding-top: 1rem;
+ border-top: 2px dashed var(--hrcolor);
+}
+
+.webmentions .wm-title {
+ color: var(--titlecolor);
+ margin-bottom: 1rem;
+}
+
+.wm-list {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+
+.wm-reactions {
+ margin-bottom: 1.5rem;
+}
+
+.wm-reaction-group {
+ margin-bottom: 1rem;
+}
+
+.wm-reaction-title {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--titlecolor);
+ margin-bottom: 0.5rem;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.wm-avatar-grid {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+ align-items: center;
+}
+
+.wm-avatar {
+ position: relative;
+ display: inline-block;
+}
+
+.wm-avatar img {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ border: 2px solid var(--hrcolor);
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
+}
+
+.wm-avatar:hover img {
+ transform: scale(1.1);
+ box-shadow: 0 4px 12px rgba(255, 140, 200, 0.4);
+}
+
+.wm-avatar-tooltip {
+ position: absolute;
+ bottom: 120%;
+ left: 50%;
+ transform: translateX(-50%);
+ background: var(--blockquotecolor);
+ color: var(--titlecolor);
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 0.8rem;
+ white-space: nowrap;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.2s ease;
+ z-index: 10;
+ border: 1px solid var(--hrcolor);
+}
+
+.wm-avatar:hover .wm-avatar-tooltip {
+ opacity: 1;
+}
+
+
+.wm-comments-header {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--titlecolor);
+ margin-bottom: 0.5rem;
+ margin-top: 1rem;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+
+.wm-regular {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.wm {
+ display: flex;
+ gap: 0.6rem;
+ padding: 0.6rem 0.75rem;
+ border-radius: 10px;
+ background: var(--alertbgcolor);
+ border: 1px solid var(--hrcolor);
+ box-shadow: 0 0 6px rgba(255, 180, 220, 0.22);
+}
+
+.wm-author img {
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ box-shadow: 0 0 4px rgba(255, 140, 200, 0.35);
+}
+
+.wm-body {
+ flex: 1;
+ font-size: 0.9rem;
+}
+
+.wm-author-name a {
+ font-weight: 600;
+ color: var(--linkcolor);
+}
+
+.wm-type {
+ font-size: 0.8rem;
+ margin-top: 2px;
+ color: var(--titlecolor);
+}
+
+.wm-content {
+ margin-top: 4px;
+ padding: 6px 8px;
+ font-size: 0.9rem;
+ background: var(--blockquotecolor);
+ border-left: 3px solid var(--hrcolor);
+ border-radius: 6px;
+}
+
+.wm-meta {
+ margin-top: 3px;
+ font-size: 0.75rem;
+ opacity: 0.7;
+}
+
+.wm-meta a {
+ color: var(--linkcolor);
+}
+
+
+@media (max-width: 600px) {
+ .wm-avatar img {
+ width: 32px;
+ height: 32px;
+ }
+
+ .wm-avatar-grid {
+ gap: 3px;
+ }
+
+ .wm-reaction-title {
+ font-size: 1rem;
+ }
+
+ .wm-comments-header {
+ font-size: 1rem;
+ }
+}
+</style>
+
+<script>
+const PAGE_URL = "https:\/\/micro.pinapelz.com\/posts\/2026-03-17-11-hundred-lines-last-defense-playlog\/";
+
+async function loadMentions() {
+ const url =
+ "https://webmention.io/api/mentions.jf2?domain=micro.pinapelz.com&token=hdjQAqlZwgJmSuPSiU8h8w";
+
+ const res = await fetch(url);
+ const data = await res.json();
+
+ const container = document.getElementById("mentions");
+ container.innerHTML = "";
+
+
+ const mentions = data.children.filter(m => {
+ const t = m["wm-target"];
+ const inReply = m["in-reply-to"];
+ const likeOf = m["like-of"];
+ const repostOf = m["repost-of"];
+ const mentionOf = m["mention-of"];
+
+ return (
+ t === PAGE_URL ||
+ inReply === PAGE_URL ||
+ likeOf === PAGE_URL ||
+ repostOf === PAGE_URL ||
+ mentionOf === PAGE_URL
+ );
+ });
+
+ if (!mentions.length) {
+ container.innerHTML = "<p>No webmentions yet.</p>";
+ return;
+ }
+
+
+ const likes = mentions.filter(m => m["wm-property"] === "like-of");
+ const reposts = mentions.filter(m => m["wm-property"] === "repost-of");
+ const replies = mentions.filter(m => m["wm-property"] === "in-reply-to");
+ const regularMentions = mentions.filter(m =>
+ !["like-of", "repost-of", "in-reply-to"].includes(m["wm-property"])
+ );
+
+
+ const reactionsDiv = document.createElement("div");
+ reactionsDiv.className = "wm-reactions";
+
+
+ if (reposts.length > 0) {
+ const repostGroup = document.createElement("div");
+ repostGroup.className = "wm-reaction-group";
+
+ const repostTitle = document.createElement("div");
+ repostTitle.className = "wm-reaction-title";
+ repostTitle.textContent = `${reposts.length} Repost${reposts.length !== 1 ? 's' : ''}`;
+
+ const repostGrid = document.createElement("div");
+ repostGrid.className = "wm-avatar-grid";
+
+ reposts.forEach(mention => {
+ const author = mention.author || {};
+ const avatarDiv = document.createElement("div");
+ avatarDiv.className = "wm-avatar";
+
+ avatarDiv.innerHTML = `
+ <a href="${author.url || "#"}" target="_blank">
+ <img src="${author.photo || ""}" alt="${author.name || 'Unknown'}" />
+ </a>
+ <div class="wm-avatar-tooltip">${author.name || 'Unknown'}</div>
+ `;
+
+ repostGrid.appendChild(avatarDiv);
+ });
+
+ repostGroup.appendChild(repostTitle);
+ repostGroup.appendChild(repostGrid);
+ reactionsDiv.appendChild(repostGroup);
+ }
+
+
+ if (likes.length > 0) {
+ const likeGroup = document.createElement("div");
+ likeGroup.className = "wm-reaction-group";
+
+ const likeTitle = document.createElement("div");
+ likeTitle.className = "wm-reaction-title";
+ likeTitle.textContent = `${likes.length} Like${likes.length !== 1 ? 's' : ''}`;
+
+ const likeGrid = document.createElement("div");
+ likeGrid.className = "wm-avatar-grid";
+
+ likes.forEach(mention => {
+ const author = mention.author || {};
+ const avatarDiv = document.createElement("div");
+ avatarDiv.className = "wm-avatar";
+
+ avatarDiv.innerHTML = `
+ <a href="${author.url || "#"}" target="_blank">
+ <img src="${author.photo || ""}" alt="${author.name || 'Unknown'}" />
+ </a>
+ <div class="wm-avatar-tooltip">${author.name || 'Unknown'}</div>
+ `;
+
+ likeGrid.appendChild(avatarDiv);
+ });
+
+ likeGroup.appendChild(likeTitle);
+ likeGroup.appendChild(likeGrid);
+ reactionsDiv.appendChild(likeGroup);
+ }
+
+
+ if (reactionsDiv.children.length > 0) {
+ container.appendChild(reactionsDiv);
+ }
+
+
+ const regularMentionsToShow = [...replies, ...regularMentions];
+
+ if (regularMentionsToShow.length > 0) {
+
+ const commentsHeader = document.createElement("div");
+ commentsHeader.className = "wm-comments-header";
+ commentsHeader.textContent = "Comments";
+ container.appendChild(commentsHeader);
+
+ const regularDiv = document.createElement("div");
+ regularDiv.className = "wm-regular";
+
+ regularMentionsToShow.forEach(m => {
+ const div = document.createElement("div");
+ div.className = "wm";
+
+ const author = m.author || {};
+ const content = m.content || {};
+ const type =
+ m["wm-property"] === "in-reply-to" ? "replied 💬" :
+ "mentioned this";
+
+ div.innerHTML = `
+ <div class="wm-author">
+ <img src="${author.photo || ""}" alt="${author.name || 'Unknown'}">
+ </div>
+
+ <div class="wm-body">
+ <div class="wm-author-name">
+ <a href="${author.url || "#"}" target="_blank">
+ ${author.name || "Unknown"}
+ </a>
+ </div>
+
+ <div class="wm-type">${type}</div>
+
+ ${content.text ? `<div class="wm-content">${content.text}</div>` : ""}
+
+ <div class="wm-meta">
+ <a href="${m.url}" target="_blank">source</a> •
+ ${m["wm-received"]
+ ? new Date(m["wm-received"]).toLocaleString()
+ : ""}
+ </div>
+ </div>
+ `;
+ regularDiv.appendChild(div);
+ });
+
+ container.appendChild(regularDiv);
+ }
+
+
+ if (container.children.length === 0) {
+ container.innerHTML = "<p>No webmentions yet.</p>";
+ }
+}
+
+loadMentions();
+</script>
+
+ </article>
+ </main>
+
+ <hr />
+<footer>
+ <p>
+ <a href="https://github.com/pinapelz"><b>Github</b></a>.
+ <a href="https://pinapelz.moe"><b>pinapelz.moe</b></a>.
+ </p>
+
+
+
+ <p style="text-align: center" class="copyright">
+ &copy; <a href="https://micro.pinapelz.com/"><b>micro.pinapelz.com</b></a>.
+ </p>
+</footer>
+
+</body>
+</html>
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage