diff --git a/ZeroSpace/.junie/plans/blazor-production-direct-url-redirect.md b/ZeroSpace/.junie/plans/blazor-production-direct-url-redirect.md new file mode 100644 index 0000000..5b8e4a1 --- /dev/null +++ b/ZeroSpace/.junie/plans/blazor-production-direct-url-redirect.md @@ -0,0 +1,176 @@ +--- +sessionId: session-260930-201705-1ilk +--- + +# Requirements + +### Overview & Goals +The objective is to ensure that deep link URLs (such as `https://zs.gameslopreference.ca/galaxy`, `/planetary-mastery-items`, `/StarSystem/...`, and `/SystemMastery/...`) load properly when requested directly or refreshed in production browsers, rather than resulting in 404 Not Found errors. + +Providing robust URL resolution maximizes utility for end users by enabling direct bookmarking, shareable links, and reliable browser refreshes across deployment targets including Azure Static Web Apps and static hosting environments. + +### Scope +- **In Scope:** + - Configuring Azure Static Web Apps navigation fallback rules (`staticwebapp.config.json`) in `ZeroSpace.Web/wwwroot`. + - Adding universal static host SPA 404 redirect fallback (`404.html`) and client-side URL restoration in `ZeroSpace.Web/wwwroot/index.html`. + - Ensuring static assets (images, CSS, JS, WASM binaries) remain directly accessible and properly cached without being captured by fallback rewrites. + - Verifying publish and deployment compatibility with `ZeroSpace.Deploy`. + +- **Out of Scope:** + - Modifying backend APIs or database schemas in `ZeroSpace.ApiService`. + - Altering Blazor internal routing logic in `App.razor` or `ReleaseGuard.razor`. + +### User Stories +- As a user navigating directly to `https://zs.gameslopreference.ca/galaxy`, I want the galaxy map page to render directly without encountering a host 404 error. +- As a user sharing or bookmarking a deep link to a star system or planetary mastery item, I want the recipient to immediately load the exact target route. +- As an administrator refreshing a deep page URL, I want the session and route to remain intact with zero broken navigation flows. + +### Functional Requirements +- Direct GET requests to client-side routes (e.g., `/galaxy`, `/planetary-mastery-items`) must return the main application shell (`index.html`) with HTTP 200/redirect so the Blazor WebAssembly client router can take over. +- Requests for physical static files under `/images/`, `/css/`, `/js/`, `/lib/`, and `/_framework/` must continue to be served directly as static files or return standard 404s if missing, avoiding infinite loop rewrites. +- URL query parameters and hash fragments must be preserved when client-side redirects occur. + +### Non-Functional Requirements +- **Performance & Reliability:** The redirect mechanism must execute with negligible overhead (<5ms execution time) before WebAssembly startup. +- **Portability:** The solution must function seamlessly whether deployed via Azure Static Web Apps (`swa deploy`), containerized Nginx (`ZeroSpace.Web/nginx.conf`), or static CDN hosts. + +# Technical Design + +### Current Implementation +- `ZeroSpace.Web` is a client-side Blazor WebAssembly application (`Microsoft.NET.Sdk.BlazorWebAssembly`) targeting .NET 10. +- `ZeroSpace.Deploy` publishes the Web project to a temporary directory and deploys `wwwroot` to Azure Static Web Apps using `swa deploy`. +- While `ZeroSpace.Web/nginx.conf` contains `try_files $uri $uri/ /index.html;` for Docker deployments, Azure Static Web Apps lacks a `staticwebapp.config.json` configuration, causing direct HTTP requests to deep paths like `/galaxy` to return 404 responses from Azure's edge servers. +- `ZeroSpace.Web/wwwroot/index.html` currently lacks client-side deep URL reconstruction script handlers for static host fallbacks. + +### Key Decisions +- **Dual-Layer Fallback Strategy (Azure SWA + Universal SPA Redirect):** + - *Decision:* Provide both `staticwebapp.config.json` for native Azure Static Web Apps server-side rewrites and `404.html` + `index.html` URL restoration script for generic static hosting. + - *Rationale:* Maximizes availability and utility across all deployment topologies while delivering instant, clean URL serving on Azure SWA without redirect hops. + +- **Explicit Asset Exclusion in Navigation Fallback:** + - *Decision:* Explicitly exclude `_framework`, `images`, `css`, `js`, and `lib` directories from navigation fallback rewriting. + - *Rationale:* Prevents corrupted binary downloads (such as `.wasm` or missing images) from accidentally serving `index.html` content with invalid MIME types. + +### Proposed Changes + +#### 1. Add `ZeroSpace.Web/wwwroot/staticwebapp.config.json` +Configure the Azure Static Web Apps routing engine: +```json +{ + "navigationFallback": { + "rewrite": "/index.html", + "exclude": [ + "/images/*", + "/css/*", + "/js/*", + "/lib/*", + "/_framework/*", + "/*.ico", + "/*.png", + "/*.json" + ] + }, + "responseOverrides": { + "404": { + "rewrite": "/index.html" + } + }, + "mimeTypes": { + ".wasm": "application/wasm", + ".json": "application/json" + } +} +``` + +#### 2. Add `ZeroSpace.Web/wwwroot/404.html` +Add lightweight SPA 404 redirect handler for static hosts: +```html + + + + + ZeroSpace + + + + + +``` + +#### 3. Update `ZeroSpace.Web/wwwroot/index.html` +Add the URL reconstruction handler before Blazor script startup in ``: +```html + +``` + +### File Structure +- `ZeroSpace.Web/` + - `wwwroot/` + - `staticwebapp.config.json` *(new)* + - `404.html` *(new)* + - `index.html` *(modified)* + +### Risks & Mitigations +- **Static Asset Masking:** If asset routes are mistakenly rewritten to `index.html`, WASM or image loads fail silently. + - *Mitigation:* Explicit glob exclusions in `staticwebapp.config.json` for `/_framework/*`, `/images/*`, `/css/*`, and asset extensions. +- **Route Guard Interaction:** Unreleased pages should still respect release restrictions. + - *Mitigation:* `ReleaseGuard.razor` continues to evaluate `SiteMap.IsReleased(pageType)` after router loads, gracefully redirecting unreleased routes to `/galaxy`. + +# Testing + +### Validation Approach +Verification focuses on confirming that published artifacts contain all necessary configuration files, that the build succeeds without error, and that URL restoration logic accurately handles routes, query strings, and asset exclusions. + +### Key Scenarios +- **Direct Route Navigation:** Direct GET to `/galaxy` serves the application shell and initializes Blazor at `/galaxy`. +- **Deep Item Route Navigation:** Direct GET to `/planetary-mastery-items` or `/StarSystem` routes directly to the requested component. +- **Static Asset Serving:** Requests to `/_framework/blazor.webassembly.js`, `/images/planetary-mastery-items/Battery.png`, and `/css/app.css` return the physical static files directly with correct MIME types. +- **Query Parameter Preservation:** Direct URL with queries (e.g. `/galaxy?filter=core`) retains the query parameters after URL reconstruction. + +### Test Changes +- Execute `dotnet build ZeroSpace.sln` to ensure all projects build cleanly. +- Execute `dotnet publish ZeroSpace.Web/ZeroSpace.Web.csproj -c Release` and inspect the output directory to confirm `staticwebapp.config.json`, `404.html`, and `index.html` are copied to `publish/wwwroot`. + +# Delivery Steps + +### Step 1: Configure Azure Static Web Apps navigation fallback +Azure Static Web Apps routes direct SPA page requests to `/index.html` while preserving direct access to static assets. + +- Create `ZeroSpace.Web/wwwroot/staticwebapp.config.json` with `navigationFallback.rewrite` set to `/index.html`. +- Add route exclusions for static assets (`/images/*`, `/css/*`, `/js/*`, `/lib/*`, `/_framework/*`, and common file extensions). +- Define MIME type overrides for `.wasm` and `.json` to ensure optimal loading performance. + +### Step 2: Implement universal 404 SPA redirect and URL reconstruction +Static hosts without native rewrite capabilities redirect deep link 404s back to `index.html` where the original URL path is reconstructed seamlessly. + +- Add `ZeroSpace.Web/wwwroot/404.html` containing the lightweight SPA redirect script that converts deep URL paths into query parameters. +- Update `ZeroSpace.Web/wwwroot/index.html` `` section with the matching URL restoration script using `history.replaceState` before the Blazor WebAssembly runtime initializes. +- Ensure query strings and route hash fragments are preserved intact during URL reconstruction. + +### Step 3: Validate publish output and build verification +The project builds and publishes cleanly with all fallback and redirect assets bundled in the output `wwwroot`. + +- Run `dotnet build ZeroSpace.sln` to confirm compilation integrity. +- Run `dotnet publish ZeroSpace.Web/ZeroSpace.Web.csproj -c Release` to verify that `staticwebapp.config.json`, `404.html`, and `index.html` are correctly packaged into the published output directory. +- Verify that `ZeroSpace.Deploy/Program.cs` can deploy the published `wwwroot` artifact containing the fallback configurations. \ No newline at end of file diff --git a/zs.docs/.obsidian/types.json b/zs.docs/.obsidian/types.json index 9178758..a7d2da1 100644 --- a/zs.docs/.obsidian/types.json +++ b/zs.docs/.obsidian/types.json @@ -36,6 +36,7 @@ "higherCreditYield": "checkbox", "unitHealthAndShields": "number", "unitHealthAndShieldRegen": "number", - "availableOn": "multitext" + "availableOn": "multitext", + "mergeRecipe": "multitext" } } \ No newline at end of file diff --git a/zs.docs/GameSystem/Economy.md b/zs.docs/GameSystem/Economy.md new file mode 100644 index 0000000..c20b772 --- /dev/null +++ b/zs.docs/GameSystem/Economy.md @@ -0,0 +1,24 @@ +--- +category: GameSystem +--- + + +You start with a Mining Outpost that mines 133% value at full capacity. + +New Mining Outpost cost 400 hexite and mine at 100% value. This value is attached to the [[Hexite]] patch and not the base. + +Mining Outposts build structures that automatically harvest called Extractors. + +Most factions have up to 6, [[Xol]] have up to 4. It's all the same in total value. + +So the starting base harvests 8 [[Hexite]] a tick. 6 [[Hexite]] a tick for an expansion. There is also the concept of a base mining out, that causes it to harvest a reduced amount of [[Hexite]]. + +Flux is harvested with [[Harvester]]s that can be built from the [[Mining Outpost]]. + +A Xol harvester harvests at 1.8 flux a tick and costs 175 Hexite. Different factions can produce different amount of [[Harvester]]s, but its self to assume the total mined Flux is all the same. A [[Rich Flux]] patch allows harvesting at 1.75 speed. + +A basic unit Roller is 50 [[Hexite]]. Which means you have enough money to build a [[Roller]] every 6.25 ticks with only the main. If a [[Roller]] takes 34 to be able to build a new one, you should have ~5 [[Gyroforge]]s in the main to use your income in [[Roller]]s. + +So a calculator should allow the balancing of input and output. + +In coop, the main base mines at 150% rate, but the same 100% rate for one expansion. One coop mission has no expansions, some have 2. Which is a bit awkward to make the rates slightly different between coop and pvp, but oh well. You have slightly more Hexite in pvp. \ No newline at end of file diff --git a/zs.docs/Pasted image 20260619123010.png b/zs.docs/ScratchImages/Pasted image 20260619123010.png similarity index 100% rename from zs.docs/Pasted image 20260619123010.png rename to zs.docs/ScratchImages/Pasted image 20260619123010.png diff --git a/zs.docs/Pasted image 20260619123019.png b/zs.docs/ScratchImages/Pasted image 20260619123019.png similarity index 100% rename from zs.docs/Pasted image 20260619123019.png rename to zs.docs/ScratchImages/Pasted image 20260619123019.png diff --git a/zs.docs/Screenshot 2026-09-29 151104.png b/zs.docs/ScratchImages/Screenshot 2026-09-29 151104.png similarity index 100% rename from zs.docs/Screenshot 2026-09-29 151104.png rename to zs.docs/ScratchImages/Screenshot 2026-09-29 151104.png diff --git a/zs.docs/Screenshot 2026-10-05 123132.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123132.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123132.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123132.png diff --git a/zs.docs/Screenshot 2026-10-05 123135.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123135.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123135.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123135.png diff --git a/zs.docs/Screenshot 2026-10-05 123138 1.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123138 1.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123138 1.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123138 1.png diff --git a/zs.docs/Screenshot 2026-10-05 123138.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123138.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123138.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123138.png diff --git a/zs.docs/Screenshot 2026-10-05 123144.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123144.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123144.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123144.png diff --git a/zs.docs/Screenshot 2026-10-05 123148.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123148.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123148.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123148.png diff --git a/zs.docs/Screenshot 2026-10-05 123152.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123152.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123152.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123152.png diff --git a/zs.docs/Screenshot 2026-10-05 123702.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123702.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123702.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123702.png diff --git a/zs.docs/Screenshot 2026-10-05 123721.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 123721.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 123721.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 123721.png diff --git a/zs.docs/Screenshot 2026-10-05 130838.png b/zs.docs/ScratchImages/Screenshot 2026-10-05 130838.png similarity index 100% rename from zs.docs/Screenshot 2026-10-05 130838.png rename to zs.docs/ScratchImages/Screenshot 2026-10-05 130838.png diff --git a/zs.docs/Untitled.canvas b/zs.docs/Untitled.canvas index 6e19e60..68e54de 100644 --- a/zs.docs/Untitled.canvas +++ b/zs.docs/Untitled.canvas @@ -1,13 +1,13 @@ { "nodes":[ - {"id":"e4afbbb53b1c8412","type":"file","file":"Screenshot 2026-10-05 123702.png","x":-760,"y":-239,"width":400,"height":189}, - {"id":"ae542ef96ee99660","type":"file","file":"Screenshot 2026-10-05 123152.png","x":-320,"y":-239,"width":400,"height":204}, - {"id":"9ba2906bfaf98423","type":"file","file":"Screenshot 2026-10-05 123148.png","x":-840,"y":20,"width":400,"height":183}, - {"id":"ac04f6e11ac2783b","type":"file","file":"Screenshot 2026-10-05 123138 1.png","x":-400,"y":20,"width":400,"height":154}, - {"id":"d47509fd4e4a2329","type":"file","file":"Screenshot 2026-10-05 123135.png","x":60,"y":0,"width":400,"height":301}, - {"id":"a54bbdbb4ef9b7b6","type":"file","file":"Screenshot 2026-10-05 123132.png","x":-360,"y":-480,"width":400,"height":218}, - {"id":"ac09fd369b71c459","x":100,"y":-232,"width":400,"height":176,"type":"file","file":"Screenshot 2026-10-05 123721.png"}, - {"id":"d95b1bb0433db717","x":-440,"y":280,"width":400,"height":266,"type":"file","file":"Screenshot 2026-10-05 130838.png"} + {"id":"e4afbbb53b1c8412","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123702.png","x":-760,"y":-239,"width":400,"height":189}, + {"id":"ae542ef96ee99660","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123152.png","x":-320,"y":-239,"width":400,"height":204}, + {"id":"9ba2906bfaf98423","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123148.png","x":-840,"y":20,"width":400,"height":183}, + {"id":"ac04f6e11ac2783b","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123138 1.png","x":-400,"y":20,"width":400,"height":154}, + {"id":"d47509fd4e4a2329","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123135.png","x":60,"y":0,"width":400,"height":301}, + {"id":"a54bbdbb4ef9b7b6","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123132.png","x":-360,"y":-480,"width":400,"height":218}, + {"id":"ac09fd369b71c459","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123721.png","x":100,"y":-232,"width":400,"height":176}, + {"id":"d95b1bb0433db717","type":"file","file":"ScratchImages/Screenshot 2026-10-05 130838.png","x":-400,"y":203,"width":400,"height":266} ], "edges":[] } \ No newline at end of file diff --git a/zs.docs/Xol.canvas b/zs.docs/Xol.canvas new file mode 100644 index 0000000..dc0fdd4 --- /dev/null +++ b/zs.docs/Xol.canvas @@ -0,0 +1,29 @@ +{ + "nodes":[ + {"id":"f2c421613ff368fb","x":-1960,"y":-212,"width":400,"height":821,"type":"file","file":"[[Unit]]/[[Xol]]/Echo.md"}, + {"id":"ce704a962e5e389a","x":-1140,"y":-210,"width":400,"height":890,"type":"file","file":"[[Unit]]/[[Xol]]/Synapse.md"}, + {"id":"0707bc2984ef2bca","x":-1560,"y":-210,"width":400,"height":865,"type":"file","file":"[[Unit]]/[[Xol]]/Gravitron.md"}, + {"id":"4b9e0f87db07151b","x":-740,"y":-212,"width":400,"height":880,"type":"file","file":"[[Unit]]/[[Xol]]/Eradicator.md"}, + {"id":"81446d86847b9a1a","x":-940,"y":-1060,"width":400,"height":748,"type":"file","file":"[[Unit]]/[[Xol]]/Spectron.md"}, + {"id":"b42a9585082a3ed2","x":-1760,"y":-1060,"width":400,"height":660,"type":"file","file":"[[Unit]]/[[Xol]]/Roller.md"}, + {"id":"4562b975c84201e4","x":-320,"y":-212,"width":400,"height":782,"type":"file","file":"[[Unit]]/[[Xol]]/Defiant.md"}, + {"id":"aeeff88c1b4e3eaf","x":80,"y":-212,"width":400,"height":749,"type":"file","file":"[[Unit]]/[[Xol]]/Aegis.md"}, + {"id":"59650802103846b6","x":-120,"y":-1046,"width":400,"height":720,"type":"file","file":"[[Unit]]/[[Xol]]/Xyther.md"}, + {"id":"7236de438f2c5d3b","x":-1280,"y":960,"width":400,"height":799,"type":"file","file":"[[Unit]]/[[Xol]]/Paradox.md"}, + {"id":"6fd4210d72cab2e0","x":-600,"y":960,"width":400,"height":701,"type":"file","file":"[[Unit]]/[[Xol]]/Cataclyst.md"} + ], + "edges":[ + {"id":"ef104c41c92d002a","fromNode":"b42a9585082a3ed2","fromSide":"bottom","toNode":"f2c421613ff368fb","toSide":"top"}, + {"id":"5772904a8954dbcd","fromNode":"b42a9585082a3ed2","fromSide":"bottom","toNode":"0707bc2984ef2bca","toSide":"top"}, + {"id":"3b9725e2d6e219d1","fromNode":"81446d86847b9a1a","fromSide":"bottom","toNode":"ce704a962e5e389a","toSide":"top"}, + {"id":"dc41ec23ae555411","fromNode":"81446d86847b9a1a","fromSide":"bottom","toNode":"4b9e0f87db07151b","toSide":"top"}, + {"id":"57b71115abb3acc5","fromNode":"59650802103846b6","fromSide":"bottom","toNode":"4562b975c84201e4","toSide":"top"}, + {"id":"34630aa07cfa28a2","fromNode":"59650802103846b6","fromSide":"bottom","toNode":"aeeff88c1b4e3eaf","toSide":"top"}, + {"id":"e01172561655c604","fromNode":"f2c421613ff368fb","fromSide":"bottom","toNode":"7236de438f2c5d3b","toSide":"top"}, + {"id":"efe0bfef6fbb789c","fromNode":"ce704a962e5e389a","fromSide":"bottom","toNode":"7236de438f2c5d3b","toSide":"top"}, + {"id":"8240f58dfc1efc62","fromNode":"4562b975c84201e4","fromSide":"bottom","toNode":"7236de438f2c5d3b","toSide":"top"}, + {"id":"965886c425fdba9b","fromNode":"0707bc2984ef2bca","fromSide":"bottom","toNode":"6fd4210d72cab2e0","toSide":"top"}, + {"id":"b1bed79fc38e81b3","fromNode":"4b9e0f87db07151b","fromSide":"bottom","toNode":"6fd4210d72cab2e0","toSide":"top"}, + {"id":"9776f96aa5925e13","fromNode":"aeeff88c1b4e3eaf","fromSide":"bottom","toNode":"6fd4210d72cab2e0","toSide":"top"} + ] +} \ No newline at end of file diff --git a/zs.docs/[[Unit]]/[[Grell]]/Harbinger.md b/zs.docs/[[Unit]]/[[Grell]]/Harbinger.md index 735233e..159af83 100644 --- a/zs.docs/[[Unit]]/[[Grell]]/Harbinger.md +++ b/zs.docs/[[Unit]]/[[Grell]]/Harbinger.md @@ -1,4 +1,4 @@ ---- +git --- category: "[[Unit]]" hexite: 75 Flux: 50 diff --git a/zs.docs/[[Unit]]/[[Xol]]/Aegis.md b/zs.docs/[[Unit]]/[[Xol]]/Aegis.md index 508db4b..da79d2b 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Aegis.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Aegis.md @@ -10,11 +10,14 @@ damagePerSecond: 11 attackRange: 6 attributes: - "[[Heavy Armor]]" - - "[[Merged from 3 Xyther]]" Tier: 3 Faction: "[[Xol]]" buildAtSameTime: 1 Armor rating: 2 Energy: 0 Shields: 100 +mergeRecipe: + - "[[Xyther]]" + - "[[Xyther]]" + - "[[Xyther]]" --- diff --git a/zs.docs/[[Unit]]/[[Xol]]/Cataclyst.md b/zs.docs/[[Unit]]/[[Xol]]/Cataclyst.md index 4faf97a..9cb92c6 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Cataclyst.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Cataclyst.md @@ -10,11 +10,14 @@ damagePerSecond: 60 attackRange: 12 attributes: - "[[Heavy Armor]]" - - "[[Merged from Aegis, Eradicator and Gravitron]]" Tier: 3 Faction: "[[Xol]]" buildAtSameTime: 1 Armor rating: 1 Energy: 0 Shields: 0 +mergeRecipe: + - "[[Aegis]]" + - "[[Eradicator]]" + - "[[Gravitron]]" --- diff --git a/zs.docs/[[Unit]]/[[Xol]]/Defiant.md b/zs.docs/[[Unit]]/[[Xol]]/Defiant.md index 4e60842..2c5a0f0 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Defiant.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Defiant.md @@ -10,7 +10,6 @@ damagePerSecond: 29 attackRange: 2 attributes: - "[[Heavy Armor]]" - - "[[Merged from 2 Xyther]]" - "[[Bonus Damage vs Light Armor]]" Tier: 2 Faction: "[[Xol]]" @@ -18,4 +17,7 @@ buildAtSameTime: 1 Armor rating: 2 Energy: 6 Shields: 0 +mergeRecipe: + - "[[Xyther]]" + - "[[Xyther]]" --- diff --git a/zs.docs/[[Unit]]/[[Xol]]/Echo.md b/zs.docs/[[Unit]]/[[Xol]]/Echo.md index 28e8a2f..ad3615d 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Echo.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Echo.md @@ -10,7 +10,6 @@ damagePerSecond: 7 attackRange: 5 attributes: - "[[Medium Armor]]" - - "[[Merged from 2 Roller]]" - "[[Bonus Damage vs Medium Armor]]" Tier: 2 Faction: "[[Xol]]" @@ -18,4 +17,7 @@ buildAtSameTime: 1 Armor rating: 0 Energy: 0 Shields: 0 +mergeRecipe: + - "[[Roller]]" + - "[[Roller]]" --- diff --git a/zs.docs/[[Unit]]/[[Xol]]/Eradicator.md b/zs.docs/[[Unit]]/[[Xol]]/Eradicator.md index faf6724..791f349 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Eradicator.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Eradicator.md @@ -10,7 +10,6 @@ damagePerSecond: 7 attackRange: 16 attributes: - "[[Heavy Armor]]" - - "[[Merged from 3 Spectron]]" - "[[Bonus Damage vs Heavy Armor]]" Tier: 3 Faction: "[[Xol]]" @@ -18,4 +17,8 @@ buildAtSameTime: 1 Armor rating: 1 Energy: 0 Shields: 0 +mergeRecipe: + - "[[Spectron]]" + - "[[Spectron]]" + - "[[Spectron]]" --- diff --git a/zs.docs/[[Unit]]/[[Xol]]/Gravitron.md b/zs.docs/[[Unit]]/[[Xol]]/Gravitron.md index 29e70f4..a0c355d 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Gravitron.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Gravitron.md @@ -10,11 +10,14 @@ damagePerSecond: 10 attackRange: 8 attributes: - "[[Medium Armor]]" - - "[[Merged from 3 Roller]]" Tier: 3 Faction: "[[Xol]]" buildAtSameTime: 1 Armor rating: 0 Energy: 0 Shields: 200 +mergeRecipe: + - "[[Roller]]" + - "[[Roller]]" + - "[[Roller]]" --- diff --git a/zs.docs/[[Unit]]/[[Xol]]/Paradox.md b/zs.docs/[[Unit]]/[[Xol]]/Paradox.md index ac86f4f..ea88728 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Paradox.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Paradox.md @@ -10,11 +10,14 @@ damagePerSecond: 14 attackRange: 13 attributes: - "[[Heavy Armor]]" - - "[[Merged from Defiant, Synapse and Echo]]" Tier: 4 Faction: "[[Xol]]" buildAtSameTime: 1 Armor rating: 0 Energy: 0 Shields: 750 +mergeRecipe: + - "[[Defiant]]" + - "[[Synapse]]" + - "[[Echo]]" --- diff --git a/zs.docs/[[Unit]]/[[Xol]]/Synapse.md b/zs.docs/[[Unit]]/[[Xol]]/Synapse.md index 6dee002..2732e95 100644 --- a/zs.docs/[[Unit]]/[[Xol]]/Synapse.md +++ b/zs.docs/[[Unit]]/[[Xol]]/Synapse.md @@ -10,11 +10,13 @@ damagePerSecond: 17 attackRange: 6 attributes: - "[[Light Armor]]" - - "[[Merged from 2 Spectron]]" Tier: 2 Faction: "[[Xol]]" buildAtSameTime: 1 Armor rating: 0 Energy: 0 Shields: 0 +mergeRecipe: + - "[[Spectron]]" + - "[[Spectron]]" ---