Cleanup, grammar fixes, and build fix

This commit is contained in:
2026-06-18 15:00:53 -04:00
parent 9ef921f772
commit 9130cdd66f
29 changed files with 115 additions and 187 deletions
+10 -4
View File
@@ -2,8 +2,10 @@
using Markdig;
using Model;
var docsDir = Path.GetFullPath(args.Length > 0 ? args[0] : Path.Combine("..", "..", "gsr.docs"));
var outputDir = Path.GetFullPath(args.Length > 1 ? args[1] : Path.Combine("..", "Model"));
var repoRoot = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", ".."));
var docsDir = Path.GetFullPath(args.Length > 0 ? args[0] : Path.Combine(repoRoot, "gsr.docs"));
var outputDir = Path.GetFullPath(args.Length > 1 ? args[1] : Path.Combine(repoRoot, "GSR", "Model"));
var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
@@ -17,6 +19,7 @@ foreach (var file in Directory.EnumerateFiles(docsDir, "*.md"))
string body;
var category = string.Empty;
bool? isVisible = true;
string? link = null;
string? git = null;
@@ -42,6 +45,7 @@ foreach (var file in Directory.EnumerateFiles(docsDir, "*.md"))
{
case "category": category = val; break;
case "link": link = val; break;
case "isVisible": isVisible = bool.Parse(val); break;
case "git": git = val; break;
}
}
@@ -70,7 +74,8 @@ foreach (var file in Directory.EnumerateFiles(docsDir, "*.md"))
Category = category,
Link = link,
Git = git,
ContentHtml = html
ContentHtml = html,
IsVisible = isVisible,
});
}
}
@@ -98,7 +103,8 @@ foreach (var g in games)
sb.AppendLine($" Category = {VStr(g.Category)},");
sb.AppendLine($" Link = {VStr(g.Link)},");
sb.AppendLine($" Git = {VStr(g.Git)},");
sb.AppendLine($" ContentHtml = {VStr(g.ContentHtml)}");
sb.AppendLine($" ContentHtml = {VStr(g.ContentHtml)},");
sb.AppendLine($" IsVisible = {(g.IsVisible != null && g.IsVisible.Value ? "true" : "false")},");
sb.AppendLine(" },");
}
+1
View File
@@ -7,4 +7,5 @@ public class GameDoc
public string? Link { get; set; }
public string? Git { get; set; }
public string ContentHtml { get; set; } = string.Empty;
public bool? IsVisible { get; set; } = true;
}
+17 -11
View File
@@ -4,8 +4,8 @@ namespace Model;
public static class GeneratedData
{
public static string? OverviewHtml => @"<p>The reason of these tools come back to playing Star Craft 2, and not feeling like I get why I win or lose. Was my unit comp bad? Was I too greedy? Should I make defenses? Should I harass? Was my build order efficent? This is true of many games, where some elements can be a bit vague, like damage scaling or the like. So the purpose of this website is to host my own tooling, references, opinions, and learnings on the hobbies I partake it, to better understand and improve on gameplay.</p>
<p>The website is called Game Slop Reference, to make the scope clear. These are game reference materials, and the slop refers to two things. One, the obviousness of AI generation in the development of these tools, are more commonly referred to in 2026 as AI slop. But also the indication of quality one can expect from these websites, given the lack of plans to monetize, and my desire to quickly develop with low quality control, and to make tools for my own purposes then would perhaps be most beneficial to the general public.</p>
public static string? OverviewHtml => @"<p>The website is called Game Slop Reference to make the scope clear. These are game reference materials, and the slop refers to two things. One, the obviousness of AI generation in the development of these tools is more commonly referred to in 2026 as AI slop. But also the indication of quality one can expect from these websites, given the lack of plans to monetize, and my desire to quickly develop with low quality control, and to make tools for my own purposes.</p>
<p>The reason these tools come back to playing StarCraft 2, and not feeling like I get why I win or lose. Was my unit comp bad? Was I too greedy? Should I make defenses? Should I harass? Was my build order efficient? This is true of many games, where some elements can be a bit vague, like damage scaling or the like. So the purpose of this website is to host my own tooling, references, opinions, and learnings on the hobbies I partake in, to better understand and improve on gameplay.</p>
<p>Perhaps in the future, you can catch me on Twitch working on this slop: <a href=""https://www.twitch.tv/jonathanmccaffrey"">JonathanMcCaffrey - Twitch</a>.</p>
";
@@ -18,16 +18,18 @@ public static class GeneratedData
Link = null,
Git = null,
ContentHtml = @"<p>My plans are to make a rules reference, so I can easily search for rules of the game. Also obvious card gallery and ability to take notes on each card and chimera.</p>
"
",
IsVisible = false,
},
new GameDoc
{
Title = @"Chrono CCG",
Category = @"Game",
Link = null,
Link = @"https://cccg.gameslopreference.ca/",
Git = @"https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/ChronoCCG",
ContentHtml = @"<p>Simple card gallery. For future plans, being able to create my own decks would be clear feature addition. But more importantly for my usages, being able to write notes on each card and favourite them. I'll be saving these notes on PostgreSQL and storing them on a local machine, so I can reference the cards and save notes from anywhere.</p>
"
",
IsVisible = true,
},
new GameDoc
{
@@ -36,18 +38,20 @@ public static class GeneratedData
Link = @"https://et.gameslopreference.ca/",
Git = @"https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/EarthborneTrailerblazer",
ContentHtml = @"<p>Basic rule reference, card reference, and simulator of game states to understand meeple spread over time.</p>
"
",
IsVisible = true,
},
new GameDoc
{
Title = @"IMMORTAL Gates of Pyre",
Category = @"Game",
Link = null,
Git = null,
Link = @"https://igpfanreference.ca/",
Git = @"https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/IGP-Fan-Reference",
ContentHtml = @"<p><a href=""https://igpfanreference.ca/"">IGP Fan Reference</a> was made before the AI agents, however I plan on using agents to update the site and add new features.</p>
<p>Such as adding tech trees, glossaries, and new UI. Generated code needs more work to prevent problems, such as hallucinated game terms, or styling issues.</p>
<p>However, simple things like playwright tests and minor UI feedback for improved UX experience has been added to the Build Calculator.</p>
"
",
IsVisible = true,
},
new GameDoc
{
@@ -56,7 +60,8 @@ public static class GeneratedData
Link = null,
Git = null,
ContentHtml = @"<p>I have collected many notes on Path of Exile 2, and wrote utility tools, like generating hideout ground and new character names. So my plan would be to remake these tools in a unified location, and I would want to add new basic tools that sample my characters damage and defenses, and inform me when they are too low or too high for the content I am doing.</p>
"
",
IsVisible = false,
},
new GameDoc
{
@@ -66,7 +71,8 @@ public static class GeneratedData
Git = null,
ContentHtml = @"<p>Not much work has been done in this area. Mostly note taking and playing the game to get a good understanding of the game and features I would want to implement.</p>
<p>One obvious feature is a unit reference, knowing the amount of production buildings I should have based on my income to maximize production, and build calculators and such.</p>
"
",
IsVisible = false,
},
};
}
-3
View File
@@ -1,8 +1,5 @@
@inherits LayoutComponentBase
<div class="layout">
<aside class="sidebar">
<NavMenu />
</aside>
<div class="main-area">
<main>
<article class="content">
-16
View File
@@ -1,16 +0,0 @@
<div class="nav-header">
<a class="nav-brand" href="">
<span class="brand-icon">&#9670;</span>
<span class="brand-text">Game Slop Reference</span>
</a>
</div>
<nav class="nav-links">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
Home
</NavLink>
<NavLink class="nav-link" href="games">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="6" x2="6" y2="18"/><line x1="10" y1="6" x2="10" y2="18"/><path d="M14 6h4a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-4"/></svg>
Games
</NavLink>
</nav>
-78
View File
@@ -1,78 +0,0 @@
.nav-header {
padding: 1.25rem 1rem;
border-bottom: 1px solid var(--border);
}
.nav-brand {
display: flex;
align-items: center;
gap: 0.6rem;
text-decoration: none;
color: var(--text);
}
.brand-icon {
font-size: 1.3rem;
color: var(--accent);
}
.brand-text {
font-size: 0.95rem;
font-weight: 600;
}
.nav-links {
padding: 0.75rem 0.5rem;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.nav-link {
display: flex;
align-items: center;
gap: 0.6rem;
padding: 0.6rem 0.75rem;
border-radius: 6px;
color: var(--text-muted);
text-decoration: none;
font-size: 0.9rem;
font-weight: 500;
transition: background 0.15s, color 0.15s;
}
.nav-link:hover {
background: var(--bg-hover);
color: var(--text);
}
.nav-link.active {
background: rgba(0, 212, 255, 0.08);
color: var(--accent);
}
.nav-icon {
width: 1.1rem;
height: 1.1rem;
flex-shrink: 0;
}
@media (max-width: 768px) {
.nav-header {
padding: 0.75rem 1rem;
}
.nav-links {
flex-direction: row;
padding: 0.5rem;
gap: 0.25rem;
}
.nav-link {
flex: 1;
justify-content: center;
padding: 0.5rem;
font-size: 0.8rem;
}
.brand-text {
font-size: 0.85rem;
}
}
-55
View File
@@ -1,55 +0,0 @@
@page "/games"
@inject GameService Service
<PageTitle>Games</PageTitle>
<h1>Games</h1>
<div class="game-cards">
@foreach (var game in Service.Games)
{
<div class="game-card" @onclick="() => ShowDetail(game)">
<h3>@game.Title</h3>
@if (!string.IsNullOrEmpty(game.Link) || !string.IsNullOrEmpty(game.Git))
{
<div class="links">
@if (!string.IsNullOrEmpty(game.Link))
{
<a href="@game.Link" target="_blank" @onclick:stopPropagation>
<span class="label">link</span> @game.Link
</a>
}
@if (!string.IsNullOrEmpty(game.Git))
{
<a href="@game.Git" target="_blank" @onclick:stopPropagation>
<span class="label">git</span> @game.Git
</a>
}
</div>
}
</div>
}
</div>
@if (_selected is not null)
{
<div class="dialog-overlay" @onclick="CloseDetail">
<div class="dialog" @onclick:stopPropagation>
<div class="dialog-header">
<h2>@_selected.Title</h2>
<button class="dialog-close" @onclick="CloseDetail">&times;</button>
</div>
<div class="dialog-body">
@((MarkupString)_selected.ContentHtml)
</div>
</div>
</div>
}
@code {
private GameDoc? _selected;
private void ShowDetail(GameDoc game) => _selected = game;
private void CloseDetail() => _selected = null;
}
+53
View File
@@ -9,3 +9,56 @@
{
<div class="overview-content">@((MarkupString)html)</div>
}
<div class="game-cards">
@foreach (var game in Service.Games.Where(a=>a.IsVisible == true))
{
<div class="game-card" @onclick="() => ShowDetail(game)">
<h3>@game.Title</h3>
@if (!string.IsNullOrEmpty(game.Link) || !string.IsNullOrEmpty(game.Git))
{
<div class="links">
@if (!string.IsNullOrEmpty(game.Link))
{
<a href="@game.Link" target="_blank" @onclick:stopPropagation>
<span class="label">link</span> @game.Link
</a>
}
@if (!string.IsNullOrEmpty(game.Git))
{
<a href="@game.Git" target="_blank" @onclick:stopPropagation>
<span class="label">git</span> @game.Git
</a>
}
</div>
}
</div>
}
</div>
@if (_selected is not null)
{
<div class="dialog-overlay" @onclick="CloseDetail">
<div class="dialog" @onclick:stopPropagation>
<div class="dialog-header">
<h2>@_selected.Title</h2>
<button class="dialog-close" @onclick="CloseDetail">&times;</button>
</div>
<div class="dialog-body">
@((MarkupString)_selected.ContentHtml)
</div>
</div>
</div>
}
@code {
private GameDoc? _selected;
private void ShowDetail(GameDoc game) => _selected = game;
private void CloseDetail() => _selected = null;
}
+8
View File
@@ -0,0 +1,8 @@
{
"types": {
"aliases": "aliases",
"cssclasses": "multitext",
"tags": "tags",
"isVisible": "checkbox"
}
}
+7 -7
View File
@@ -13,12 +13,12 @@
"state": {
"type": "markdown",
"state": {
"file": "Chrono CCG.md",
"file": "Overview.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Chrono CCG"
"title": "Overview"
}
}
]
@@ -185,12 +185,12 @@
},
"active": "8c140a22a97ab926",
"lastOpenFiles": [
"Path of Exile 2.md",
"Overview.md",
"IMMORTAL Gates of Pyre.md",
"Chrono CCG.md",
"Earthborne Trailblazers.md",
"Overview.md",
"ZeroSpace.md",
"Ashes Reborn.md"
"Path of Exile 2.md",
"Earthborne Trailblazers.md",
"Ashes Reborn.md",
"Chrono CCG.md"
]
}
+1
View File
@@ -1,4 +1,5 @@
---
category: Game
isVisible: false
---
My plans are to make a rules reference, so I can easily search for rules of the game. Also obvious card gallery and ability to take notes on each card and chimera.
+2 -1
View File
@@ -1,6 +1,7 @@
---
category: Game
link:
link: https://cccg.gameslopreference.ca/
git: https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/ChronoCCG
isVisible: true
---
Simple card gallery. For future plans, being able to create my own decks would be clear feature addition. But more importantly for my usages, being able to write notes on each card and favourite them. I'll be saving these notes on PostgreSQL and storing them on a local machine, so I can reference the cards and save notes from anywhere.
+1
View File
@@ -2,5 +2,6 @@
category: Game
link: https://et.gameslopreference.ca/
git: https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/EarthborneTrailerblazer
isVisible: true
---
Basic rule reference, card reference, and simulator of game states to understand meeple spread over time.
+3
View File
@@ -1,5 +1,8 @@
---
category: Game
link: https://igpfanreference.ca/
git: https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/IGP-Fan-Reference
isVisible: true
---
[IGP Fan Reference](https://igpfanreference.ca/) was made before the AI agents, however I plan on using agents to update the site and add new features.
+3 -4
View File
@@ -1,6 +1,5 @@
The reason of these tools come back to playing Star Craft 2, and not feeling like I get why I win or lose. Was my unit comp bad? Was I too greedy? Should I make defenses? Should I harass? Was my build order efficent? This is true of many games, where some elements can be a bit vague, like damage scaling or the like. So the purpose of this website is to host my own tooling, references, opinions, and learnings on the hobbies I partake it, to better understand and improve on gameplay.
The website is called Game Slop Reference to make the scope clear. These are game reference materials, and the slop refers to two things. One, the obviousness of AI generation in the development of these tools is more commonly referred to in 2026 as AI slop. But also the indication of quality one can expect from these websites, given the lack of plans to monetize, and my desire to quickly develop with low quality control, and to make tools for my own purposes.
The website is called Game Slop Reference, to make the scope clear. These are game reference materials, and the slop refers to two things. One, the obviousness of AI generation in the development of these tools, are more commonly referred to in 2026 as AI slop. But also the indication of quality one can expect from these websites, given the lack of plans to monetize, and my desire to quickly develop with low quality control, and to make tools for my own purposes then would perhaps be most beneficial to the general public.
Perhaps in the future, you can catch me on Twitch working on this slop: [JonathanMcCaffrey - Twitch](https://www.twitch.tv/jonathanmccaffrey).
The reason these tools come back to playing StarCraft 2, and not feeling like I get why I win or lose. Was my unit comp bad? Was I too greedy? Should I make defenses? Should I harass? Was my build order efficient? This is true of many games, where some elements can be a bit vague, like damage scaling or the like. So the purpose of this website is to host my own tooling, references, opinions, and learnings on the hobbies I partake in, to better understand and improve on gameplay.
Perhaps in the future, you can catch me on Twitch working on this slop: [JonathanMcCaffrey - Twitch](https://www.twitch.tv/jonathanmccaffrey).
+1
View File
@@ -1,4 +1,5 @@
---
category: Game
isVisible: false
---
I have collected many notes on Path of Exile 2, and wrote utility tools, like generating hideout ground and new character names. So my plan would be to remake these tools in a unified location, and I would want to add new basic tools that sample my characters damage and defenses, and inform me when they are too low or too high for the content I am doing.
+1
View File
@@ -1,5 +1,6 @@
---
category: Game
isVisible: false
---
Not much work has been done in this area. Mostly note taking and playing the game to get a good understanding of the game and features I would want to implement.
@@ -11,14 +11,13 @@
"id": "c9828c929e6de2aa",
"type": "leaf",
"state": {
"type": "markdown",
"type": "bases",
"state": {
"file": "Generate a Website.md",
"mode": "source",
"source": false
"file": "_Tasks.base",
"viewName": "Table"
},
"icon": "lucide-file",
"title": "Generate a Website"
"icon": "columns",
"title": "_Tasks"
}
}
]
@@ -183,11 +182,11 @@
"bases:Create new base": false
}
},
"active": "c9828c929e6de2aa",
"active": "b3e9c9f896e71147",
"lastOpenFiles": [
"Generate a Website.md",
"_AI Tasks.base",
"_Tasks.base",
"Generate a Website.md",
"Task.md",
"T2.md",
"T1.md",