Some economy and other notes
@@ -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
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>ZeroSpace</title>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var pathSegmentsToKeep = 0;
|
||||||
|
var l = window.location;
|
||||||
|
l.replace(
|
||||||
|
l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') +
|
||||||
|
l.pathname.split('/').slice(0, 1 + pathSegmentsToKeep).join('/') + '/?/' +
|
||||||
|
l.pathname.slice(1).split('/').slice(pathSegmentsToKeep).join('/').replace(/&/g, '~and~') +
|
||||||
|
(l.search ? '&' + l.search.slice(1).replace(/&/g, '~and~') : '') +
|
||||||
|
l.hash
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. Update `ZeroSpace.Web/wwwroot/index.html`
|
||||||
|
Add the URL reconstruction handler before Blazor script startup in `<head>`:
|
||||||
|
```html
|
||||||
|
<script type="text/javascript">
|
||||||
|
(function(l) {
|
||||||
|
if (l.search[1] === '/' ) {
|
||||||
|
var decoded = l.search.slice(1).split('&').map(function(s) {
|
||||||
|
return s.replace(/~and~/g, '&')
|
||||||
|
}).join('?');
|
||||||
|
window.history.replaceState(null, null,
|
||||||
|
l.pathname.slice(0, -1) + decoded + l.hash
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}(window.location))
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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` `<head>` 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.
|
||||||
@@ -36,6 +36,7 @@
|
|||||||
"higherCreditYield": "checkbox",
|
"higherCreditYield": "checkbox",
|
||||||
"unitHealthAndShields": "number",
|
"unitHealthAndShields": "number",
|
||||||
"unitHealthAndShieldRegen": "number",
|
"unitHealthAndShieldRegen": "number",
|
||||||
"availableOn": "multitext"
|
"availableOn": "multitext",
|
||||||
|
"mergeRecipe": "multitext"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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.
|
||||||
|
Before Width: | Height: | Size: 356 KiB After Width: | Height: | Size: 356 KiB |
|
Before Width: | Height: | Size: 294 KiB After Width: | Height: | Size: 294 KiB |
|
Before Width: | Height: | Size: 793 KiB After Width: | Height: | Size: 793 KiB |
|
Before Width: | Height: | Size: 444 KiB After Width: | Height: | Size: 444 KiB |
|
Before Width: | Height: | Size: 699 KiB After Width: | Height: | Size: 699 KiB |
|
Before Width: | Height: | Size: 490 KiB After Width: | Height: | Size: 490 KiB |
|
Before Width: | Height: | Size: 490 KiB After Width: | Height: | Size: 490 KiB |
|
Before Width: | Height: | Size: 498 KiB After Width: | Height: | Size: 498 KiB |
|
Before Width: | Height: | Size: 437 KiB After Width: | Height: | Size: 437 KiB |
|
Before Width: | Height: | Size: 436 KiB After Width: | Height: | Size: 436 KiB |
|
Before Width: | Height: | Size: 503 KiB After Width: | Height: | Size: 503 KiB |
|
Before Width: | Height: | Size: 576 KiB After Width: | Height: | Size: 576 KiB |
|
Before Width: | Height: | Size: 574 KiB After Width: | Height: | Size: 574 KiB |
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"nodes":[
|
"nodes":[
|
||||||
{"id":"e4afbbb53b1c8412","type":"file","file":"Screenshot 2026-10-05 123702.png","x":-760,"y":-239,"width":400,"height":189},
|
{"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":"Screenshot 2026-10-05 123152.png","x":-320,"y":-239,"width":400,"height":204},
|
{"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":"Screenshot 2026-10-05 123148.png","x":-840,"y":20,"width":400,"height":183},
|
{"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":"Screenshot 2026-10-05 123138 1.png","x":-400,"y":20,"width":400,"height":154},
|
{"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":"Screenshot 2026-10-05 123135.png","x":60,"y":0,"width":400,"height":301},
|
{"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":"Screenshot 2026-10-05 123132.png","x":-360,"y":-480,"width":400,"height":218},
|
{"id":"a54bbdbb4ef9b7b6","type":"file","file":"ScratchImages/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":"ac09fd369b71c459","type":"file","file":"ScratchImages/Screenshot 2026-10-05 123721.png","x":100,"y":-232,"width":400,"height":176},
|
||||||
{"id":"d95b1bb0433db717","x":-440,"y":280,"width":400,"height":266,"type":"file","file":"Screenshot 2026-10-05 130838.png"}
|
{"id":"d95b1bb0433db717","type":"file","file":"ScratchImages/Screenshot 2026-10-05 130838.png","x":-400,"y":203,"width":400,"height":266}
|
||||||
],
|
],
|
||||||
"edges":[]
|
"edges":[]
|
||||||
}
|
}
|
||||||
@@ -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"}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
---
|
git ---
|
||||||
category: "[[Unit]]"
|
category: "[[Unit]]"
|
||||||
hexite: 75
|
hexite: 75
|
||||||
Flux: 50
|
Flux: 50
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ damagePerSecond: 11
|
|||||||
attackRange: 6
|
attackRange: 6
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Heavy Armor]]"
|
- "[[Heavy Armor]]"
|
||||||
- "[[Merged from 3 Xyther]]"
|
|
||||||
Tier: 3
|
Tier: 3
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
buildAtSameTime: 1
|
buildAtSameTime: 1
|
||||||
Armor rating: 2
|
Armor rating: 2
|
||||||
Energy: 0
|
Energy: 0
|
||||||
Shields: 100
|
Shields: 100
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Xyther]]"
|
||||||
|
- "[[Xyther]]"
|
||||||
|
- "[[Xyther]]"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ damagePerSecond: 60
|
|||||||
attackRange: 12
|
attackRange: 12
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Heavy Armor]]"
|
- "[[Heavy Armor]]"
|
||||||
- "[[Merged from Aegis, Eradicator and Gravitron]]"
|
|
||||||
Tier: 3
|
Tier: 3
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
buildAtSameTime: 1
|
buildAtSameTime: 1
|
||||||
Armor rating: 1
|
Armor rating: 1
|
||||||
Energy: 0
|
Energy: 0
|
||||||
Shields: 0
|
Shields: 0
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Aegis]]"
|
||||||
|
- "[[Eradicator]]"
|
||||||
|
- "[[Gravitron]]"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ damagePerSecond: 29
|
|||||||
attackRange: 2
|
attackRange: 2
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Heavy Armor]]"
|
- "[[Heavy Armor]]"
|
||||||
- "[[Merged from 2 Xyther]]"
|
|
||||||
- "[[Bonus Damage vs Light Armor]]"
|
- "[[Bonus Damage vs Light Armor]]"
|
||||||
Tier: 2
|
Tier: 2
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
@@ -18,4 +17,7 @@ buildAtSameTime: 1
|
|||||||
Armor rating: 2
|
Armor rating: 2
|
||||||
Energy: 6
|
Energy: 6
|
||||||
Shields: 0
|
Shields: 0
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Xyther]]"
|
||||||
|
- "[[Xyther]]"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ damagePerSecond: 7
|
|||||||
attackRange: 5
|
attackRange: 5
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Medium Armor]]"
|
- "[[Medium Armor]]"
|
||||||
- "[[Merged from 2 Roller]]"
|
|
||||||
- "[[Bonus Damage vs Medium Armor]]"
|
- "[[Bonus Damage vs Medium Armor]]"
|
||||||
Tier: 2
|
Tier: 2
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
@@ -18,4 +17,7 @@ buildAtSameTime: 1
|
|||||||
Armor rating: 0
|
Armor rating: 0
|
||||||
Energy: 0
|
Energy: 0
|
||||||
Shields: 0
|
Shields: 0
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Roller]]"
|
||||||
|
- "[[Roller]]"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ damagePerSecond: 7
|
|||||||
attackRange: 16
|
attackRange: 16
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Heavy Armor]]"
|
- "[[Heavy Armor]]"
|
||||||
- "[[Merged from 3 Spectron]]"
|
|
||||||
- "[[Bonus Damage vs Heavy Armor]]"
|
- "[[Bonus Damage vs Heavy Armor]]"
|
||||||
Tier: 3
|
Tier: 3
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
@@ -18,4 +17,8 @@ buildAtSameTime: 1
|
|||||||
Armor rating: 1
|
Armor rating: 1
|
||||||
Energy: 0
|
Energy: 0
|
||||||
Shields: 0
|
Shields: 0
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Spectron]]"
|
||||||
|
- "[[Spectron]]"
|
||||||
|
- "[[Spectron]]"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ damagePerSecond: 10
|
|||||||
attackRange: 8
|
attackRange: 8
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Medium Armor]]"
|
- "[[Medium Armor]]"
|
||||||
- "[[Merged from 3 Roller]]"
|
|
||||||
Tier: 3
|
Tier: 3
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
buildAtSameTime: 1
|
buildAtSameTime: 1
|
||||||
Armor rating: 0
|
Armor rating: 0
|
||||||
Energy: 0
|
Energy: 0
|
||||||
Shields: 200
|
Shields: 200
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Roller]]"
|
||||||
|
- "[[Roller]]"
|
||||||
|
- "[[Roller]]"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ damagePerSecond: 14
|
|||||||
attackRange: 13
|
attackRange: 13
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Heavy Armor]]"
|
- "[[Heavy Armor]]"
|
||||||
- "[[Merged from Defiant, Synapse and Echo]]"
|
|
||||||
Tier: 4
|
Tier: 4
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
buildAtSameTime: 1
|
buildAtSameTime: 1
|
||||||
Armor rating: 0
|
Armor rating: 0
|
||||||
Energy: 0
|
Energy: 0
|
||||||
Shields: 750
|
Shields: 750
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Defiant]]"
|
||||||
|
- "[[Synapse]]"
|
||||||
|
- "[[Echo]]"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ damagePerSecond: 17
|
|||||||
attackRange: 6
|
attackRange: 6
|
||||||
attributes:
|
attributes:
|
||||||
- "[[Light Armor]]"
|
- "[[Light Armor]]"
|
||||||
- "[[Merged from 2 Spectron]]"
|
|
||||||
Tier: 2
|
Tier: 2
|
||||||
Faction: "[[Xol]]"
|
Faction: "[[Xol]]"
|
||||||
buildAtSameTime: 1
|
buildAtSameTime: 1
|
||||||
Armor rating: 0
|
Armor rating: 0
|
||||||
Energy: 0
|
Energy: 0
|
||||||
Shields: 0
|
Shields: 0
|
||||||
|
mergeRecipe:
|
||||||
|
- "[[Spectron]]"
|
||||||
|
- "[[Spectron]]"
|
||||||
---
|
---
|
||||||
|
|||||||