Ownership data
This commit is contained in:
@@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
sessionId: session-260928-192341-jvqx
|
||||||
|
---
|
||||||
|
|
||||||
|
# Requirements
|
||||||
|
|
||||||
|
### Overview & Goals
|
||||||
|
Introduce a dedicated **Faction Mode** to `ZeroSpace.MapEditor` that allows rapid visual painting and assignment of faction ownership to star systems on the galaxy map canvas. The user can switch the active faction using hotkeys (`A`, `S`, `D`) or toolbar controls, click on any system to assign the selected faction, immediately observe the updated faction color on the map and inspector, and have changes automatically persisted to the underlying markdown files.
|
||||||
|
|
||||||
|
### Scope
|
||||||
|
- **In Scope:**
|
||||||
|
- Active Faction Mode state in `MapEditorPage` supporting the three core factions:
|
||||||
|
- `A` → **The Eden Accord** (Green: `#10b981`)
|
||||||
|
- `S` → **The Keeper Council** (Blue: `#38bdf8`)
|
||||||
|
- `D` → **The Obsidian Order** (Red: `#ef4444`)
|
||||||
|
- Toolbar UI controls and indicators showing the current active faction mode and its associated hotkey.
|
||||||
|
- Keyboard shortcut listeners for `A`, `S`, and `D` that activate the corresponding faction mode (with guards against triggering when typing in text fields like search or coordinate entries).
|
||||||
|
- Applying the active faction to star system nodes upon single click / selection.
|
||||||
|
- Applying the active faction directly to currently selected node(s) when `A`, `S`, or `D` is pressed.
|
||||||
|
- Immediate visual feedback on the map canvas (`MapDrawable`) and inspector panel (`OwnerLabel`) reflecting the updated owner color.
|
||||||
|
- Auto-saving owner modifications back to the markdown frontmatter in `zs.docs/StarSystem/*.md` via `StarSystemDocStore`.
|
||||||
|
- **Out of Scope:**
|
||||||
|
- Modifying gameplay balance or data generation outside of `ZeroSpace.MapEditor` and `StarSystemDocStore`.
|
||||||
|
- Adding new factions beyond the defined three in `StarSystemOwners`.
|
||||||
|
|
||||||
|
### User Stories
|
||||||
|
- **As a Map Designer**, I want to press `A`, `S`, or `D` to switch the active faction mode so that I can rapidly tag multiple star systems without tedious manual dropdown selection.
|
||||||
|
- **As a Map Designer**, I want to click on a star system on the map canvas and have its faction immediately update with corresponding visual color changes so that I have real-time visual confirmation of galaxy ownership boundaries.
|
||||||
|
- **As a Map Designer**, I want my faction changes to automatically save to the system markdown files so that I do not lose progress or have to manually click save after every edit.
|
||||||
|
|
||||||
|
### Functional Requirements
|
||||||
|
1. **Faction Mode State & Controls:**
|
||||||
|
- The toolbar must display the currently active faction mode with appropriate faction accent coloring.
|
||||||
|
- Interactive buttons for each faction (`[A] Eden Accord`, `[S] Keeper Council`, `[D] Obsidian Order`) allowing mouse-based activation as well as hotkey discovery.
|
||||||
|
2. **Hotkey Handling:**
|
||||||
|
- Pressing `A` (or `a`) sets active faction to `"The Eden Accord"`.
|
||||||
|
- Pressing `S` (or `s`) sets active faction to `"The Keeper Council"`.
|
||||||
|
- Pressing `D` (or `d`) sets active faction to `"The Obsidian Order"`.
|
||||||
|
- Hotkeys must not fire when focus is in an input field (`SearchControl`, `XEntry`, `YEntry`).
|
||||||
|
3. **Click-to-Assign:**
|
||||||
|
- Clicking a star system node in faction mode assigns the active faction to that node's `Doc.Owner`.
|
||||||
|
- If nodes are selected, pressing `A`, `S`, or `D` immediately updates the owner of all selected nodes.
|
||||||
|
4. **UI Color Synchronization:**
|
||||||
|
- The star system circle on the map canvas immediately re-renders with the faction's color:
|
||||||
|
- The Eden Accord: `#10b981`
|
||||||
|
- The Keeper Council: `#38bdf8`
|
||||||
|
- The Obsidian Order: `#ef4444`
|
||||||
|
- If the system is displayed in the inspector panel, the `OwnerLabel` and its styling update in real time.
|
||||||
|
5. **Auto-Saving:**
|
||||||
|
- Modifying a node's owner marks `Doc.IsDirty = true`.
|
||||||
|
- Automatically triggers `AutoSaveAsync()` to persist the `owner: <Faction>` frontmatter property in the system's markdown file.
|
||||||
|
- The Save button and status text reflect save progress and confirmation ("Saving...", "Saved", "Auto-saved X system(s)").
|
||||||
|
|
||||||
|
# Technical Design
|
||||||
|
|
||||||
|
### Current Implementation
|
||||||
|
- `StarSystemDocStore`: Parses YAML frontmatter from markdown files in `zs.docs/StarSystem/`. Currently, `SavePositions` only updates `x:` and `y:` lines in frontmatter. `owner:` is read during `LoadFile` but not rewritten during save.
|
||||||
|
- `MapDrawable`: Renders systems using `ColorForOwner(node.Doc.Owner)`. Supports node translation gizmo, marquee selection, background image, and connection lines.
|
||||||
|
- `MapEditorPage`: Handles pointer gestures (`OnPointerPressed`, `OnPointerMoved`, `OnPointerReleased`), panning, selection, inspector binding, and debounced auto-saving for position edits.
|
||||||
|
- `StarSystemOwners`: Defines constant strings for `"The Eden Accord"`, `"The Keeper Council"`, and `"The Obsidian Order"` along with standard hex colors.
|
||||||
|
|
||||||
|
### Key Decisions
|
||||||
|
1. **Faction Mode Model**:
|
||||||
|
- Introduce an explicit active faction mode state in `MapEditorPage` (`_activeFaction`: string or enum, defaulting to `"The Eden Accord"` or toggleable mode).
|
||||||
|
- Hotkeys `A`, `S`, `D` both switch the active painting faction and immediately apply it to any actively selected system(s).
|
||||||
|
2. **Keyboard Event Interception**:
|
||||||
|
- Hook window / page key down events on Windows / MAUI (`Loaded` / platform key events / MAUI `KeyboardAccelerators`).
|
||||||
|
- Check `IsFocused` on `SearchControl`, `XEntry`, and `YEntry` before handling hotkeys so normal text entry is never hindered.
|
||||||
|
3. **Markdown Frontmatter Persistence**:
|
||||||
|
- Update `StarSystemDocStore` save logic to update or insert the `owner: <Owner>` frontmatter entry alongside `x:` and `y:` while preserving all other frontmatter fields and body markdown intact.
|
||||||
|
4. **Immediate Color Feedback**:
|
||||||
|
- Mutating `node.Doc.Owner` directly triggers `MapView.Invalidate()` and `PopulateInspector(_selected)`, ensuring zero latency in UI color updates.
|
||||||
|
|
||||||
|
### Data Models & Contracts
|
||||||
|
```csharp
|
||||||
|
public enum FactionMode
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
EdenAccord, // Hotkey A - #10b981
|
||||||
|
KeeperCouncil, // Hotkey S - #38bdf8
|
||||||
|
ObsidianOrder // Hotkey D - #ef4444
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Frontmatter update in `StarSystemDocStore`:
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
category: StarSystem
|
||||||
|
systemCategory: Side System
|
||||||
|
owner: The Keeper Council
|
||||||
|
occupationBuff: +50 Starting Hexite
|
||||||
|
systemMastery: "[[Unit Health and Shields]]"
|
||||||
|
x: 450.2
|
||||||
|
y: 310.8
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
### Components & File Structure
|
||||||
|
- `ZeroSpace.MapEditor/Services/StarSystemDocStore.cs`:
|
||||||
|
- Enhance `SaveDoc` / `SaveDocs` / `SavePosition` to serialize `owner` to the frontmatter.
|
||||||
|
- `ZeroSpace.MapEditor/Views/MapEditorPage.xaml`:
|
||||||
|
- Add Faction Mode UI toolbar buttons/indicators (`Eden Accord [A]`, `Keeper Council [S]`, `Obsidian Order [D]`) with visual active highlights and color badges.
|
||||||
|
- `ZeroSpace.MapEditor/Views/MapEditorPage.xaml.cs`:
|
||||||
|
- Manage active faction mode state and toolbar button styling.
|
||||||
|
- Implement key press listeners for `A`, `S`, `D`.
|
||||||
|
- Handle click-to-assign on star system hit test.
|
||||||
|
- Refresh inspector and canvas colors.
|
||||||
|
- Integrate with `AutoSaveAsync()`.
|
||||||
|
|
||||||
|
### Architecture Diagram
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
UserKeyboard["User Press: A / S / D"] --> KeyHandler["MapEditorPage Key Handler"]
|
||||||
|
UserClick["User Click on Star System Node"] --> PointerHandler["OnPointerPressed / Click Handler"]
|
||||||
|
ToolbarButton["User Click Toolbar Faction Button"] --> FactionSelector["SetActiveFactionMode(...)"]
|
||||||
|
|
||||||
|
KeyHandler --> FactionSelector
|
||||||
|
KeyHandler --> ApplyFaction["Apply Faction to Selected Node(s)"]
|
||||||
|
FactionSelector --> UpdateToolbarUI["Update Toolbar Mode Indicators & Badges"]
|
||||||
|
PointerHandler --> ApplyFaction
|
||||||
|
|
||||||
|
ApplyFaction --> UpdateDoc["Update Doc.Owner & Set Doc.IsDirty = true"]
|
||||||
|
UpdateDoc --> RedrawMap["MapView.Invalidate() (MapDrawable.ColorForOwner)"]
|
||||||
|
UpdateDoc --> UpdateInspector["PopulateInspector(node) (OwnerLabel Color)"]
|
||||||
|
UpdateDoc --> AutoSave["AutoSaveAsync()"]
|
||||||
|
AutoSave --> DocStore["StarSystemDocStore.SaveDocs(...)"]
|
||||||
|
DocStore --> MarkdownFiles["Persist 'owner: ...' to zs.docs/StarSystem/*.md"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Risks & Mitigations
|
||||||
|
- **Risk:** Typing 'a', 's', or 'd' inside the search bar or coordinate entries could trigger faction mode changes.
|
||||||
|
- *Mitigation:* Ensure key events check focus status on all input entries (`SearchControl.IsFocused`, `XEntry.IsFocused`, `YEntry.IsFocused`) before processing hotkeys.
|
||||||
|
- **Risk:** Modifying frontmatter could accidentally reorder or corrupt markdown content.
|
||||||
|
- *Mitigation:* Use regex/line-based frontmatter replacement in `StarSystemDocStore` matching existing `SavePosition` patterns to preserve line endings, spacing, and other YAML metadata.
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
|
||||||
|
### Validation Approach
|
||||||
|
Verify faction mode switching, hotkey interactions, click-to-assign workflows, real-time UI color updating, and frontmatter persistence across unit tests and interactive workflows.
|
||||||
|
|
||||||
|
### Key Scenarios
|
||||||
|
1. **Hotkey Faction Switching:**
|
||||||
|
- Press `A`: Faction mode switches to **The Eden Accord**; toolbar highlights the Accord button with green accent (`#10b981`).
|
||||||
|
- Press `S`: Faction mode switches to **The Keeper Council**; toolbar highlights the Keeper button with blue accent (`#38bdf8`).
|
||||||
|
- Press `D`: Faction mode switches to **The Obsidian Order**; toolbar highlights the Obsidian button with red accent (`#ef4444`).
|
||||||
|
2. **Click-to-Assign System Faction:**
|
||||||
|
- Click an unassigned or Eden system while Keeper Council mode (`S`) is active.
|
||||||
|
- Verify node color on map canvas immediately turns blue (`#38bdf8`).
|
||||||
|
- Verify Inspector `OwnerLabel` updates to "The Keeper Council" with matching color.
|
||||||
|
3. **Multi-Selection Assignment:**
|
||||||
|
- Marquee-select 3 systems and press `D`.
|
||||||
|
- Verify all 3 systems immediately turn red (`#ef4444`).
|
||||||
|
4. **Auto-Saving to Markdown:**
|
||||||
|
- Change a system's faction; verify the Save button transitions to "Saving..." and then "Saved" / "Auto-saved 1 system".
|
||||||
|
- Inspect the `.md` file on disk in `zs.docs/StarSystem/` and confirm `owner: ...` has been updated with valid YAML frontmatter formatting.
|
||||||
|
5. **Text Input Protection:**
|
||||||
|
- Focus `SearchControl` and type "Ashes"; verify 'A' and 's' are entered into the search box and do NOT trigger faction changes.
|
||||||
|
|
||||||
|
### Edge Cases
|
||||||
|
- File with missing or malformed `owner` frontmatter key is gracefully updated and written.
|
||||||
|
- Multiple rapid hotkey presses or clicks debounce auto-save properly without race conditions.
|
||||||
|
- System with read-only attributes or special characters in name handles saving cleanly.
|
||||||
|
|
||||||
|
# Delivery Steps
|
||||||
|
|
||||||
|
### ✓ Step 1: Update StarSystemDocStore to support owner serialization and dirty state tracking
|
||||||
|
StarSystemDocStore supports persisting the `owner` property to markdown frontmatter, and StarSystemDoc dirty state tracks faction edits.
|
||||||
|
|
||||||
|
- Extend `StarSystemDocStore` methods (`SaveDoc`, `SaveDocs`, or `SavePosition`) to update or add the `owner:` frontmatter key when writing changes to `.md` files.
|
||||||
|
- Preserve all existing frontmatter keys, comments, and markdown body byte-for-byte when updating `owner`, `x`, and `y`.
|
||||||
|
- Ensure `doc.IsDirty` is set to `true` whenever `doc.Owner` is modified.
|
||||||
|
- Verify unit doc save logic parses and preserves the standard faction names (`The Eden Accord`, `The Keeper Council`, `The Obsidian Order`).
|
||||||
|
|
||||||
|
### ✓ Step 2: Add Faction Mode UI toolbar controls and visual indicators
|
||||||
|
The MapEditorPage toolbar displays visual buttons and indicators for the active faction mode with distinct faction colors.
|
||||||
|
|
||||||
|
- Add faction mode selection and indicator controls to the top toolbar in `MapEditorPage.xaml` (e.g., dedicated buttons/badges for Accord `[A]`, Keeper `[S]`, and Obsidian `[D]`, plus a mode toggle or active indicator).
|
||||||
|
- Style the faction buttons/indicators with their corresponding colors: Green (`#10b981`) for The Eden Accord, Blue (`#38bdf8`) for The Keeper Council, and Red (`#ef4444`) for The Obsidian Order.
|
||||||
|
- Update `OwnerLabel` (and optional badge) in the inspector panel to display the owner name with faction color coding.
|
||||||
|
- Provide clear visual feedback indicating which faction mode is currently active.
|
||||||
|
|
||||||
|
### ✓ Step 3: Implement hotkeys, click-to-assign logic, and auto-save integration
|
||||||
|
Pressing A, S, or D switches the active faction mode, and clicking any star system node immediately applies the faction and triggers auto-save.
|
||||||
|
|
||||||
|
- Add keyboard event handling to `MapEditorPage` for hotkeys `A`, `S`, and `D` (switching active faction to Eden Accord, Keeper Council, and Obsidian Order respectively), ignoring hotkeys when text fields (`SearchControl`, `XEntry`, `YEntry`) are focused.
|
||||||
|
- If one or more nodes are currently selected when pressing `A`, `S`, or `D`, apply the faction to the selection immediately.
|
||||||
|
- Update `OnPointerPressed` / `OnPointerReleased` to apply the active faction to the clicked `MapNode` when in faction mode.
|
||||||
|
- Invalidate the `MapView` canvas so the node's fill color updates immediately via `MapDrawable.ColorForOwner`.
|
||||||
|
- Trigger `AutoSaveAsync()` (or debounced `ScheduleAutoSave()`) whenever a system's owner changes, keeping the Save button status and feedback message in sync.
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using ZeroSpace.Model;
|
||||||
|
|
||||||
|
namespace ZeroSpace.MapEditor.Models;
|
||||||
|
|
||||||
|
public enum FactionMode
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
EdenAccord, // Hotkey A - #10b981
|
||||||
|
KeeperCouncil, // Hotkey S - #38bdf8
|
||||||
|
ObsidianOrder // Hotkey D - #ef4444
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class FactionModeExtensions
|
||||||
|
{
|
||||||
|
public static string ToOwnerName(this FactionMode mode) => mode switch
|
||||||
|
{
|
||||||
|
FactionMode.EdenAccord => StarSystemOwners.EdenAccord,
|
||||||
|
FactionMode.KeeperCouncil => StarSystemOwners.KeeperCouncil,
|
||||||
|
FactionMode.ObsidianOrder => StarSystemOwners.ObsidianOrder,
|
||||||
|
_ => string.Empty
|
||||||
|
};
|
||||||
|
|
||||||
|
public static string ToDisplayName(this FactionMode mode) => mode switch
|
||||||
|
{
|
||||||
|
FactionMode.EdenAccord => "Eden Accord",
|
||||||
|
FactionMode.KeeperCouncil => "Keeper Council",
|
||||||
|
FactionMode.ObsidianOrder => "Obsidian Order",
|
||||||
|
_ => "None"
|
||||||
|
};
|
||||||
|
|
||||||
|
public static string GetColorHex(this FactionMode mode) => mode switch
|
||||||
|
{
|
||||||
|
FactionMode.EdenAccord => StarSystemOwners.GetColor(StarSystemOwners.EdenAccord),
|
||||||
|
FactionMode.KeeperCouncil => StarSystemOwners.GetColor(StarSystemOwners.KeeperCouncil),
|
||||||
|
FactionMode.ObsidianOrder => StarSystemOwners.GetColor(StarSystemOwners.ObsidianOrder),
|
||||||
|
_ => "#94a3b8"
|
||||||
|
};
|
||||||
|
|
||||||
|
public static FactionMode FromOwnerName(string? owner) => owner switch
|
||||||
|
{
|
||||||
|
StarSystemOwners.EdenAccord => FactionMode.EdenAccord,
|
||||||
|
StarSystemOwners.KeeperCouncil => FactionMode.KeeperCouncil,
|
||||||
|
StarSystemOwners.ObsidianOrder => FactionMode.ObsidianOrder,
|
||||||
|
_ => FactionMode.None
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -9,10 +9,23 @@ namespace ZeroSpace.MapEditor.Services;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class StarSystemDoc
|
public sealed class StarSystemDoc
|
||||||
{
|
{
|
||||||
|
private string _owner = string.Empty;
|
||||||
|
|
||||||
public string FilePath { get; set; } = string.Empty;
|
public string FilePath { get; set; } = string.Empty;
|
||||||
public string Name { get; set; } = string.Empty;
|
public string Name { get; set; } = string.Empty;
|
||||||
public string SystemCategory { get; set; } = string.Empty;
|
public string SystemCategory { get; set; } = string.Empty;
|
||||||
public string Owner { get; set; } = string.Empty;
|
public string Owner
|
||||||
|
{
|
||||||
|
get => _owner;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (!string.Equals(_owner, value, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
_owner = value;
|
||||||
|
IsDirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public bool HigherInfluenceYield { get; set; }
|
public bool HigherInfluenceYield { get; set; }
|
||||||
public bool HigherCreditYield { get; set; }
|
public bool HigherCreditYield { get; set; }
|
||||||
public bool HigherEnergyYield { get; set; }
|
public bool HigherEnergyYield { get; set; }
|
||||||
@@ -151,27 +164,30 @@ public static class StarSystemDocStore
|
|||||||
doc.HasPosition = true;
|
doc.HasPosition = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doc.IsDirty = false;
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes x/y back into each dirty file's frontmatter, preserving
|
/// Writes x/y and owner back into each dirty file's frontmatter, preserving
|
||||||
/// every other line byte-for-byte.
|
/// every other line byte-for-byte.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static int SavePositions(IEnumerable<StarSystemDoc> docs)
|
public static int SaveDocs(IEnumerable<StarSystemDoc> docs)
|
||||||
{
|
{
|
||||||
var count = 0;
|
var count = 0;
|
||||||
var errors = new List<Exception>();
|
var errors = new List<Exception>();
|
||||||
var items = docs.Where(static d => d.IsDirty)
|
var items = docs.Where(static d => d.IsDirty)
|
||||||
.Select(static d => (Doc: d, TargetX: d.X, TargetY: d.Y))
|
.Select(static d => (Doc: d, TargetX: d.X, TargetY: d.Y, TargetOwner: d.Owner))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
SavePosition(item.Doc.FilePath, item.TargetX, item.TargetY);
|
SaveDoc(item.Doc.FilePath, item.TargetX, item.TargetY, item.TargetOwner);
|
||||||
if (item.Doc.X == item.TargetX && item.Doc.Y == item.TargetY)
|
if (item.Doc.X == item.TargetX &&
|
||||||
|
item.Doc.Y == item.TargetY &&
|
||||||
|
string.Equals(item.Doc.Owner, item.TargetOwner, StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
item.Doc.IsDirty = false;
|
item.Doc.IsDirty = false;
|
||||||
}
|
}
|
||||||
@@ -197,12 +213,24 @@ public static class StarSystemDocStore
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SavePosition(StarSystemDoc doc)
|
/// <summary>
|
||||||
|
/// Backwards-compatible alias for <see cref="SaveDocs"/>.
|
||||||
|
/// </summary>
|
||||||
|
public static int SavePositions(IEnumerable<StarSystemDoc> docs) => SaveDocs(docs);
|
||||||
|
|
||||||
|
public static void SaveDoc(StarSystemDoc doc)
|
||||||
{
|
{
|
||||||
SavePosition(doc.FilePath, doc.X, doc.Y);
|
SaveDoc(doc.FilePath, doc.X, doc.Y, doc.Owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void SavePosition(StarSystemDoc doc) => SaveDoc(doc);
|
||||||
|
|
||||||
public static void SavePosition(string filePath, double x, double y)
|
public static void SavePosition(string filePath, double x, double y)
|
||||||
|
{
|
||||||
|
SaveDoc(filePath, x, y, owner: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SaveDoc(string filePath, double x, double y, string? owner = null)
|
||||||
{
|
{
|
||||||
var text = File.ReadAllText(filePath);
|
var text = File.ReadAllText(filePath);
|
||||||
var newline = text.Contains("\r\n", StringComparison.Ordinal) ? "\r\n" : "\n";
|
var newline = text.Contains("\r\n", StringComparison.Ordinal) ? "\r\n" : "\n";
|
||||||
@@ -220,8 +248,10 @@ public static class StarSystemDocStore
|
|||||||
|
|
||||||
var xLine = $"x: {x.ToString("F1", CultureInfo.InvariantCulture)}";
|
var xLine = $"x: {x.ToString("F1", CultureInfo.InvariantCulture)}";
|
||||||
var yLine = $"y: {y.ToString("F1", CultureInfo.InvariantCulture)}";
|
var yLine = $"y: {y.ToString("F1", CultureInfo.InvariantCulture)}";
|
||||||
|
var ownerLine = owner is not null ? $"owner: {owner}" : null;
|
||||||
var foundX = false;
|
var foundX = false;
|
||||||
var foundY = false;
|
var foundY = false;
|
||||||
|
var foundOwner = false;
|
||||||
|
|
||||||
for (var i = 1; i < closeIndex; i++)
|
for (var i = 1; i < closeIndex; i++)
|
||||||
{
|
{
|
||||||
@@ -236,6 +266,17 @@ public static class StarSystemDocStore
|
|||||||
lines[i] = yLine;
|
lines[i] = yLine;
|
||||||
foundY = true;
|
foundY = true;
|
||||||
}
|
}
|
||||||
|
else if (ownerLine is not null && string.Equals(key, "owner", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
lines[i] = ownerLine;
|
||||||
|
foundOwner = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ownerLine is not null && !foundOwner)
|
||||||
|
{
|
||||||
|
lines.Insert(closeIndex, ownerLine);
|
||||||
|
closeIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundX)
|
if (!foundX)
|
||||||
|
|||||||
@@ -4,25 +4,44 @@
|
|||||||
x:Class="ZeroSpace.MapEditor.Views.MapEditorPage"
|
x:Class="ZeroSpace.MapEditor.Views.MapEditorPage"
|
||||||
Title="ZeroSpace Map Editor">
|
Title="ZeroSpace Map Editor">
|
||||||
<Grid RowDefinitions="Auto,*" ColumnDefinitions="*,340">
|
<Grid RowDefinitions="Auto,*" ColumnDefinitions="*,340">
|
||||||
<HorizontalStackLayout Grid.Row="0" Grid.ColumnSpan="2" Padding="8" Spacing="8">
|
<ScrollView Grid.Row="0" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalScrollBarVisibility="Never">
|
||||||
<Button Text="Open Folder" Clicked="OnOpenFolderClicked" />
|
<HorizontalStackLayout Padding="8" Spacing="8" VerticalOptions="Center">
|
||||||
<Button x:Name="SaveButton" Text="Saved" Clicked="OnSaveClicked" IsEnabled="False" />
|
<Button Text="Open Folder" Clicked="OnOpenFolderClicked" />
|
||||||
<Button Text="+" WidthRequest="44" Clicked="OnZoomInClicked" />
|
<Button x:Name="SaveButton" Text="Saved" Clicked="OnSaveClicked" IsEnabled="False" />
|
||||||
<Button Text="−" WidthRequest="44" Clicked="OnZoomOutClicked" />
|
<Button Text="+" WidthRequest="44" Clicked="OnZoomInClicked" />
|
||||||
<Button Text="Reset View" Clicked="OnResetViewClicked" />
|
<Button Text="−" WidthRequest="44" Clicked="OnZoomOutClicked" />
|
||||||
<Button x:Name="PanModeButton" Text="Pan: Off" Clicked="OnPanModeClicked" />
|
<Button Text="Reset View" Clicked="OnResetViewClicked" />
|
||||||
<CheckBox x:Name="BackgroundCheckBox" IsChecked="True" CheckedChanged="OnBackgroundToggled" VerticalOptions="Center" />
|
<Button x:Name="PanModeButton" Text="Pan: Off" Clicked="OnPanModeClicked" />
|
||||||
<Label Text="Galaxy map" VerticalOptions="Center" />
|
<CheckBox x:Name="BackgroundCheckBox" IsChecked="True" CheckedChanged="OnBackgroundToggled" VerticalOptions="Center" />
|
||||||
<SearchBar x:Name="SearchControl"
|
<Label Text="Galaxy map" VerticalOptions="Center" />
|
||||||
Placeholder="Search systems..."
|
<BoxView WidthRequest="1" HeightRequest="24" Color="#334155" VerticalOptions="Center" Margin="4,0" />
|
||||||
WidthRequest="220"
|
<Label Text="Faction:" VerticalOptions="Center" FontAttributes="Bold" />
|
||||||
TextChanged="OnSearchTextChanged"
|
<Button x:Name="EdenFactionButton" Text="[A] Eden Accord" Clicked="OnEdenFactionClicked" />
|
||||||
SearchButtonPressed="OnSearchButtonPressed" />
|
<Button x:Name="KeeperFactionButton" Text="[S] Keeper Council" Clicked="OnKeeperFactionClicked" />
|
||||||
<Label x:Name="StatusLabel"
|
<Button x:Name="ObsidianFactionButton" Text="[D] Obsidian Order" Clicked="OnObsidianFactionClicked" />
|
||||||
Text="No folder loaded."
|
<Button x:Name="NoneFactionButton" Text="None" Clicked="OnNoneFactionClicked" />
|
||||||
VerticalOptions="Center"
|
<Border x:Name="ActiveFactionBadge"
|
||||||
Margin="8,0,0,0" />
|
StrokeShape="RoundRectangle 4"
|
||||||
</HorizontalStackLayout>
|
StrokeThickness="1"
|
||||||
|
Padding="6,2"
|
||||||
|
VerticalOptions="Center"
|
||||||
|
IsVisible="False">
|
||||||
|
<Label x:Name="ActiveFactionLabel"
|
||||||
|
FontSize="12"
|
||||||
|
FontAttributes="Bold" />
|
||||||
|
</Border>
|
||||||
|
<BoxView WidthRequest="1" HeightRequest="24" Color="#334155" VerticalOptions="Center" Margin="4,0" />
|
||||||
|
<SearchBar x:Name="SearchControl"
|
||||||
|
Placeholder="Search systems..."
|
||||||
|
WidthRequest="220"
|
||||||
|
TextChanged="OnSearchTextChanged"
|
||||||
|
SearchButtonPressed="OnSearchButtonPressed" />
|
||||||
|
<Label x:Name="StatusLabel"
|
||||||
|
Text="No folder loaded."
|
||||||
|
VerticalOptions="Center"
|
||||||
|
Margin="8,0,0,0" />
|
||||||
|
</HorizontalStackLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
<GraphicsView Grid.Row="1" Grid.Column="0" x:Name="MapView">
|
<GraphicsView Grid.Row="1" Grid.Column="0" x:Name="MapView">
|
||||||
<GraphicsView.GestureRecognizers>
|
<GraphicsView.GestureRecognizers>
|
||||||
@@ -43,7 +62,15 @@
|
|||||||
<Label x:Name="CategoryLabel" />
|
<Label x:Name="CategoryLabel" />
|
||||||
|
|
||||||
<Label Text="Owner" FontAttributes="Bold" />
|
<Label Text="Owner" FontAttributes="Bold" />
|
||||||
<Label x:Name="OwnerLabel" />
|
<Border x:Name="OwnerBadge"
|
||||||
|
StrokeShape="RoundRectangle 6"
|
||||||
|
StrokeThickness="1"
|
||||||
|
Padding="8,4"
|
||||||
|
HorizontalOptions="Start"
|
||||||
|
BackgroundColor="#1e293b"
|
||||||
|
Stroke="#334155">
|
||||||
|
<Label x:Name="OwnerLabel" Text="—" FontAttributes="Bold" TextColor="#94a3b8" />
|
||||||
|
</Border>
|
||||||
|
|
||||||
<Label Text="Yields" FontAttributes="Bold" />
|
<Label Text="Yields" FontAttributes="Bold" />
|
||||||
<Label x:Name="YieldsLabel" />
|
<Label x:Name="YieldsLabel" />
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ using System.Globalization;
|
|||||||
using CommunityToolkit.Maui.Storage;
|
using CommunityToolkit.Maui.Storage;
|
||||||
using ZeroSpace.MapEditor.Models;
|
using ZeroSpace.MapEditor.Models;
|
||||||
using ZeroSpace.MapEditor.Services;
|
using ZeroSpace.MapEditor.Services;
|
||||||
|
using ZeroSpace.Model;
|
||||||
|
|
||||||
namespace ZeroSpace.MapEditor.Views;
|
namespace ZeroSpace.MapEditor.Views;
|
||||||
|
|
||||||
@@ -34,9 +35,14 @@ public partial class MapEditorPage : ContentPage
|
|||||||
public MapEditorPage()
|
public MapEditorPage()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
UpdateFactionModeUI();
|
||||||
_drawable.FindNode = name => _byName.TryGetValue(name, out var node) ? node : null;
|
_drawable.FindNode = name => _byName.TryGetValue(name, out var node) ? node : null;
|
||||||
MapView.Drawable = _drawable;
|
MapView.Drawable = _drawable;
|
||||||
MapView.SizeChanged += OnMapViewSizeChanged;
|
MapView.SizeChanged += OnMapViewSizeChanged;
|
||||||
|
#if WINDOWS
|
||||||
|
Loaded += OnPageLoaded;
|
||||||
|
Unloaded += OnPageUnloaded;
|
||||||
|
#endif
|
||||||
TryAutoLoad();
|
TryAutoLoad();
|
||||||
LoadGalaxyMapAsync();
|
LoadGalaxyMapAsync();
|
||||||
}
|
}
|
||||||
@@ -127,6 +133,223 @@ public partial class MapEditorPage : ContentPage
|
|||||||
: "Select mode enabled. Drag empty space to multi-select.";
|
: "Select mode enabled. Drag empty space to multi-select.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----- faction mode -----
|
||||||
|
|
||||||
|
private FactionMode _activeFaction = FactionMode.None;
|
||||||
|
|
||||||
|
public FactionMode ActiveFaction => _activeFaction;
|
||||||
|
|
||||||
|
public void SetActiveFactionMode(FactionMode mode)
|
||||||
|
{
|
||||||
|
_activeFaction = mode;
|
||||||
|
UpdateFactionModeUI();
|
||||||
|
if (_activeFaction != FactionMode.None)
|
||||||
|
{
|
||||||
|
StatusLabel.Text = $"Faction painting mode: {_activeFaction.ToDisplayName()} (Click system or press A/S/D).";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void HandleFactionHotkey(FactionMode mode)
|
||||||
|
{
|
||||||
|
SetActiveFactionMode(mode);
|
||||||
|
var targets = _selectedNodes.Count > 0
|
||||||
|
? _selectedNodes.ToList()
|
||||||
|
: (_selected is not null ? new List<MapNode> { _selected } : null);
|
||||||
|
|
||||||
|
if (targets is not null && targets.Count > 0)
|
||||||
|
{
|
||||||
|
ApplyFactionToNodes(targets, mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ApplyFactionToNodes(IEnumerable<MapNode> nodes, FactionMode mode)
|
||||||
|
{
|
||||||
|
var ownerName = mode.ToOwnerName();
|
||||||
|
var anyChanged = false;
|
||||||
|
foreach (var node in nodes)
|
||||||
|
{
|
||||||
|
if (!string.Equals(node.Doc.Owner, ownerName, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
node.Doc.Owner = ownerName;
|
||||||
|
anyChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anyChanged)
|
||||||
|
{
|
||||||
|
UpdateDirtyState();
|
||||||
|
if (_selected is not null)
|
||||||
|
{
|
||||||
|
PopulateInspector(_selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
MapView.Invalidate();
|
||||||
|
ScheduleAutoSave();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsTextInputFocused()
|
||||||
|
{
|
||||||
|
if (SearchControl.IsFocused || XEntry.IsFocused || YEntry.IsFocused)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WINDOWS
|
||||||
|
if (Handler?.PlatformView is Microsoft.UI.Xaml.FrameworkElement fe && fe.XamlRoot is not null)
|
||||||
|
{
|
||||||
|
var focused = Microsoft.UI.Xaml.Input.FocusManager.GetFocusedElement(fe.XamlRoot);
|
||||||
|
if (focused is Microsoft.UI.Xaml.Controls.TextBox ||
|
||||||
|
focused is Microsoft.UI.Xaml.Controls.AutoSuggestBox ||
|
||||||
|
focused is Microsoft.UI.Xaml.Controls.RichEditBox ||
|
||||||
|
focused is Microsoft.UI.Xaml.Controls.PasswordBox)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WINDOWS
|
||||||
|
private Microsoft.UI.Xaml.UIElement? _keyElement;
|
||||||
|
private Microsoft.UI.Xaml.Input.KeyEventHandler? _keyHandler;
|
||||||
|
|
||||||
|
private void OnPageLoaded(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (Handler?.PlatformView is Microsoft.UI.Xaml.FrameworkElement fe)
|
||||||
|
{
|
||||||
|
_keyHandler = new Microsoft.UI.Xaml.Input.KeyEventHandler(OnPlatformKeyDown);
|
||||||
|
_keyElement = fe.XamlRoot?.Content as Microsoft.UI.Xaml.UIElement ?? fe;
|
||||||
|
_keyElement.AddHandler(Microsoft.UI.Xaml.UIElement.KeyDownEvent, _keyHandler, handledEventsToo: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPageUnloaded(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_keyHandler is not null)
|
||||||
|
{
|
||||||
|
if (_keyElement is not null)
|
||||||
|
{
|
||||||
|
_keyElement.RemoveHandler(Microsoft.UI.Xaml.UIElement.KeyDownEvent, _keyHandler);
|
||||||
|
_keyElement = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_keyHandler = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlatformKeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (IsTextInputFocused())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ctrlDown = Microsoft.UI.Input.InputKeyboardSource
|
||||||
|
.GetKeyStateForCurrentThread(global::Windows.System.VirtualKey.Control)
|
||||||
|
.HasFlag(global::Windows.UI.Core.CoreVirtualKeyStates.Down);
|
||||||
|
var altDown = e.KeyStatus.IsMenuKeyDown || Microsoft.UI.Input.InputKeyboardSource
|
||||||
|
.GetKeyStateForCurrentThread(global::Windows.System.VirtualKey.Menu)
|
||||||
|
.HasFlag(global::Windows.UI.Core.CoreVirtualKeyStates.Down);
|
||||||
|
|
||||||
|
if (ctrlDown || altDown)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (e.Key)
|
||||||
|
{
|
||||||
|
case global::Windows.System.VirtualKey.A:
|
||||||
|
HandleFactionHotkey(FactionMode.EdenAccord);
|
||||||
|
e.Handled = true;
|
||||||
|
break;
|
||||||
|
case global::Windows.System.VirtualKey.S:
|
||||||
|
HandleFactionHotkey(FactionMode.KeeperCouncil);
|
||||||
|
e.Handled = true;
|
||||||
|
break;
|
||||||
|
case global::Windows.System.VirtualKey.D:
|
||||||
|
HandleFactionHotkey(FactionMode.ObsidianOrder);
|
||||||
|
e.Handled = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private void OnEdenFactionClicked(object? sender, EventArgs e) =>
|
||||||
|
ToggleOrSetFactionMode(FactionMode.EdenAccord);
|
||||||
|
|
||||||
|
private void OnKeeperFactionClicked(object? sender, EventArgs e) =>
|
||||||
|
ToggleOrSetFactionMode(FactionMode.KeeperCouncil);
|
||||||
|
|
||||||
|
private void OnObsidianFactionClicked(object? sender, EventArgs e) =>
|
||||||
|
ToggleOrSetFactionMode(FactionMode.ObsidianOrder);
|
||||||
|
|
||||||
|
private void OnNoneFactionClicked(object? sender, EventArgs e) =>
|
||||||
|
SetActiveFactionMode(FactionMode.None);
|
||||||
|
|
||||||
|
private void ToggleOrSetFactionMode(FactionMode mode)
|
||||||
|
{
|
||||||
|
var targetMode = _activeFaction == mode ? FactionMode.None : mode;
|
||||||
|
SetActiveFactionMode(targetMode);
|
||||||
|
if (targetMode != FactionMode.None && _selectedNodes.Count > 0)
|
||||||
|
{
|
||||||
|
ApplyFactionToNodes(_selectedNodes, targetMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateFactionModeUI()
|
||||||
|
{
|
||||||
|
// Eden Accord [A]
|
||||||
|
var isEden = _activeFaction == FactionMode.EdenAccord;
|
||||||
|
EdenFactionButton.BackgroundColor = isEden ? Color.FromArgb("#10b981") : Color.FromArgb("#1e293b");
|
||||||
|
EdenFactionButton.TextColor = isEden ? Colors.White : Color.FromArgb("#10b981");
|
||||||
|
EdenFactionButton.BorderColor = isEden ? Color.FromArgb("#059669") : Color.FromArgb("#10b981");
|
||||||
|
EdenFactionButton.BorderWidth = isEden ? 2 : 1;
|
||||||
|
EdenFactionButton.FontAttributes = isEden ? FontAttributes.Bold : FontAttributes.None;
|
||||||
|
|
||||||
|
// Keeper Council [S]
|
||||||
|
var isKeeper = _activeFaction == FactionMode.KeeperCouncil;
|
||||||
|
KeeperFactionButton.BackgroundColor = isKeeper ? Color.FromArgb("#38bdf8") : Color.FromArgb("#1e293b");
|
||||||
|
KeeperFactionButton.TextColor = isKeeper ? Color.FromArgb("#0f172a") : Color.FromArgb("#38bdf8");
|
||||||
|
KeeperFactionButton.BorderColor = isKeeper ? Color.FromArgb("#0284c7") : Color.FromArgb("#38bdf8");
|
||||||
|
KeeperFactionButton.BorderWidth = isKeeper ? 2 : 1;
|
||||||
|
KeeperFactionButton.FontAttributes = isKeeper ? FontAttributes.Bold : FontAttributes.None;
|
||||||
|
|
||||||
|
// Obsidian Order [D]
|
||||||
|
var isObsidian = _activeFaction == FactionMode.ObsidianOrder;
|
||||||
|
ObsidianFactionButton.BackgroundColor = isObsidian ? Color.FromArgb("#ef4444") : Color.FromArgb("#1e293b");
|
||||||
|
ObsidianFactionButton.TextColor = isObsidian ? Colors.White : Color.FromArgb("#ef4444");
|
||||||
|
ObsidianFactionButton.BorderColor = isObsidian ? Color.FromArgb("#dc2626") : Color.FromArgb("#ef4444");
|
||||||
|
ObsidianFactionButton.BorderWidth = isObsidian ? 2 : 1;
|
||||||
|
ObsidianFactionButton.FontAttributes = isObsidian ? FontAttributes.Bold : FontAttributes.None;
|
||||||
|
|
||||||
|
// None
|
||||||
|
var isNone = _activeFaction == FactionMode.None;
|
||||||
|
NoneFactionButton.BackgroundColor = isNone ? Color.FromArgb("#475569") : Color.FromArgb("#1e293b");
|
||||||
|
NoneFactionButton.TextColor = isNone ? Colors.White : Color.FromArgb("#94a3b8");
|
||||||
|
NoneFactionButton.BorderColor = isNone ? Color.FromArgb("#64748b") : Color.FromArgb("#475569");
|
||||||
|
NoneFactionButton.BorderWidth = isNone ? 2 : 1;
|
||||||
|
NoneFactionButton.FontAttributes = isNone ? FontAttributes.Bold : FontAttributes.None;
|
||||||
|
|
||||||
|
// Badge indicator
|
||||||
|
if (_activeFaction != FactionMode.None)
|
||||||
|
{
|
||||||
|
var hex = _activeFaction.GetColorHex();
|
||||||
|
var factionColor = Color.FromArgb(hex);
|
||||||
|
ActiveFactionBadge.IsVisible = true;
|
||||||
|
ActiveFactionBadge.Stroke = factionColor;
|
||||||
|
ActiveFactionBadge.BackgroundColor = factionColor.WithAlpha(0.2f);
|
||||||
|
ActiveFactionLabel.Text = $"Active: {_activeFaction.ToDisplayName()}";
|
||||||
|
ActiveFactionLabel.TextColor = factionColor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ActiveFactionBadge.IsVisible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void CenterOnNode(MapNode node)
|
private void CenterOnNode(MapNode node)
|
||||||
{
|
{
|
||||||
var width = MapView.Width;
|
var width = MapView.Width;
|
||||||
@@ -325,7 +548,7 @@ public partial class MapEditorPage : ContentPage
|
|||||||
_pressNode.IsSelected = true;
|
_pressNode.IsSelected = true;
|
||||||
SetActiveNode(_pressNode);
|
SetActiveNode(_pressNode);
|
||||||
InspectorScroll.IsVisible = true;
|
InspectorScroll.IsVisible = true;
|
||||||
PopulateInspector(_selected);
|
PopulateInspector(_pressNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
MapView.Invalidate();
|
MapView.Invalidate();
|
||||||
@@ -336,7 +559,7 @@ public partial class MapEditorPage : ContentPage
|
|||||||
{
|
{
|
||||||
_wasAlreadySelectedInGroup = _selectedNodes.Count > 1;
|
_wasAlreadySelectedInGroup = _selectedNodes.Count > 1;
|
||||||
SetActiveNode(_pressNode);
|
SetActiveNode(_pressNode);
|
||||||
PopulateInspector(_selected);
|
PopulateInspector(_pressNode);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -478,6 +701,10 @@ public partial class MapEditorPage : ContentPage
|
|||||||
{
|
{
|
||||||
var hit = HitTest(position.Value);
|
var hit = HitTest(position.Value);
|
||||||
Select(hit);
|
Select(hit);
|
||||||
|
if (hit is not null && _activeFaction != FactionMode.None)
|
||||||
|
{
|
||||||
|
ApplyFactionToNodes(new[] { hit }, _activeFaction);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_panning = false;
|
_panning = false;
|
||||||
@@ -485,6 +712,7 @@ public partial class MapEditorPage : ContentPage
|
|||||||
else if (_pressNode is not null)
|
else if (_pressNode is not null)
|
||||||
{
|
{
|
||||||
var wasDragging = _draggingNode;
|
var wasDragging = _draggingNode;
|
||||||
|
var clickedNode = _pressNode;
|
||||||
if (!_draggingNode && _wasAlreadySelectedInGroup)
|
if (!_draggingNode && _wasAlreadySelectedInGroup)
|
||||||
{
|
{
|
||||||
Select(_pressNode);
|
Select(_pressNode);
|
||||||
@@ -497,6 +725,10 @@ public partial class MapEditorPage : ContentPage
|
|||||||
{
|
{
|
||||||
_ = AutoSaveAsync();
|
_ = AutoSaveAsync();
|
||||||
}
|
}
|
||||||
|
else if (_activeFaction != FactionMode.None)
|
||||||
|
{
|
||||||
|
ApplyFactionToNodes(new[] { clickedNode }, _activeFaction);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (_marqueeSelecting)
|
else if (_marqueeSelecting)
|
||||||
{
|
{
|
||||||
@@ -652,11 +884,12 @@ public partial class MapEditorPage : ContentPage
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SetActiveNode(primary ?? (_selected is not null && _selectedNodes.Contains(_selected)
|
var primaryNode = primary ?? (_selected is not null && _selectedNodes.Contains(_selected)
|
||||||
? _selected
|
? _selected
|
||||||
: _selectedNodes.First()));
|
: _selectedNodes.First());
|
||||||
|
SetActiveNode(primaryNode);
|
||||||
InspectorScroll.IsVisible = true;
|
InspectorScroll.IsVisible = true;
|
||||||
PopulateInspector(_selected);
|
PopulateInspector(primaryNode);
|
||||||
if (_selectedNodes.Count > 1)
|
if (_selectedNodes.Count > 1)
|
||||||
{
|
{
|
||||||
StatusLabel.Text = $"{_selectedNodes.Count} systems selected.";
|
StatusLabel.Text = $"{_selectedNodes.Count} systems selected.";
|
||||||
@@ -695,7 +928,14 @@ public partial class MapEditorPage : ContentPage
|
|||||||
var doc = node.Doc;
|
var doc = node.Doc;
|
||||||
NameLabel.Text = doc.Name;
|
NameLabel.Text = doc.Name;
|
||||||
CategoryLabel.Text = string.IsNullOrEmpty(doc.SystemCategory) ? "—" : doc.SystemCategory;
|
CategoryLabel.Text = string.IsNullOrEmpty(doc.SystemCategory) ? "—" : doc.SystemCategory;
|
||||||
OwnerLabel.Text = string.IsNullOrEmpty(doc.Owner) ? "—" : doc.Owner;
|
var owner = doc.Owner;
|
||||||
|
OwnerLabel.Text = string.IsNullOrEmpty(owner) ? "—" : owner;
|
||||||
|
var ownerColor = Color.FromArgb(StarSystemOwners.GetColor(owner));
|
||||||
|
OwnerLabel.TextColor = string.IsNullOrEmpty(owner) ? Color.FromArgb("#94a3b8") : ownerColor;
|
||||||
|
OwnerBadge.Stroke = string.IsNullOrEmpty(owner) ? Color.FromArgb("#334155") : ownerColor;
|
||||||
|
OwnerBadge.BackgroundColor = string.IsNullOrEmpty(owner)
|
||||||
|
? Color.FromArgb("#1e293b")
|
||||||
|
: ownerColor.WithAlpha(0.15f);
|
||||||
YieldsLabel.Text = YieldText(doc);
|
YieldsLabel.Text = YieldText(doc);
|
||||||
BuffLabel.Text = doc.OccupationBuff ?? "—";
|
BuffLabel.Text = doc.OccupationBuff ?? "—";
|
||||||
MasteryLabel.Text = doc.SystemMastery ?? "—";
|
MasteryLabel.Text = doc.SystemMastery ?? "—";
|
||||||
@@ -913,7 +1153,7 @@ public partial class MapEditorPage : ContentPage
|
|||||||
SaveButton.Text = "Save";
|
SaveButton.Text = "Save";
|
||||||
SaveButton.IsEnabled = true;
|
SaveButton.IsEnabled = true;
|
||||||
StatusLabel.Text =
|
StatusLabel.Text =
|
||||||
$"{remainingDirty} unsaved position change{(remainingDirty == 1 ? string.Empty : "s")}.";
|
$"{remainingDirty} unsaved change{(remainingDirty == 1 ? string.Empty : "s")}.";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -944,7 +1184,7 @@ public partial class MapEditorPage : ContentPage
|
|||||||
{
|
{
|
||||||
SaveButton.Text = "Save";
|
SaveButton.Text = "Save";
|
||||||
SaveButton.IsEnabled = true;
|
SaveButton.IsEnabled = true;
|
||||||
StatusLabel.Text = $"{dirty} unsaved position change{(dirty == 1 ? string.Empty : "s")}.";
|
StatusLabel.Text = $"{dirty} unsaved change{(dirty == 1 ? string.Empty : "s")}.";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\ZeroSpace.Model\ZeroSpace.Model.csproj" />
|
||||||
<PackageReference Include="Microsoft.Maui.Controls" Version="10.0.110" />
|
<PackageReference Include="Microsoft.Maui.Controls" Version="10.0.110" />
|
||||||
<PackageReference Include="CommunityToolkit.Maui.Core" Version="15.0.1" />
|
<PackageReference Include="CommunityToolkit.Maui.Core" Version="15.0.1" />
|
||||||
<!-- In-game galaxy map screenshot shown as the canvas background. -->
|
<!-- In-game galaxy map screenshot shown as the canvas background. -->
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public static class StarSystems
|
|||||||
Id: "AquilaRift",
|
Id: "AquilaRift",
|
||||||
Name: "Aquila Rift",
|
Name: "Aquila Rift",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -39,7 +39,7 @@ public static class StarSystems
|
|||||||
Id: "ArtemisGrotto",
|
Id: "ArtemisGrotto",
|
||||||
Name: "Artemis Grotto",
|
Name: "Artemis Grotto",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -119,7 +119,7 @@ public static class StarSystems
|
|||||||
Id: "BurningCairn",
|
Id: "BurningCairn",
|
||||||
Name: "Burning Cairn",
|
Name: "Burning Cairn",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -135,7 +135,7 @@ public static class StarSystems
|
|||||||
Id: "CalmBelt",
|
Id: "CalmBelt",
|
||||||
Name: "Calm Belt",
|
Name: "Calm Belt",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -183,7 +183,7 @@ public static class StarSystems
|
|||||||
Id: "CrimsonExpanse",
|
Id: "CrimsonExpanse",
|
||||||
Name: "Crimson Expanse",
|
Name: "Crimson Expanse",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -215,7 +215,7 @@ public static class StarSystems
|
|||||||
Id: "DevilSTrident",
|
Id: "DevilSTrident",
|
||||||
Name: "Devil's Trident",
|
Name: "Devil's Trident",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: true,
|
HigherCreditYield: true,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -231,7 +231,7 @@ public static class StarSystems
|
|||||||
Id: "DraconisReach",
|
Id: "DraconisReach",
|
||||||
Name: "Draconis Reach",
|
Name: "Draconis Reach",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -247,7 +247,7 @@ public static class StarSystems
|
|||||||
Id: "EbonyKeep",
|
Id: "EbonyKeep",
|
||||||
Name: "Ebony Keep",
|
Name: "Ebony Keep",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: true,
|
HigherInfluenceYield: true,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -327,7 +327,7 @@ public static class StarSystems
|
|||||||
Id: "ForgeOfSouls",
|
Id: "ForgeOfSouls",
|
||||||
Name: "Forge of Souls",
|
Name: "Forge of Souls",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: true,
|
HigherEnergyYield: true,
|
||||||
@@ -343,7 +343,7 @@ public static class StarSystems
|
|||||||
Id: "GalacticZenith",
|
Id: "GalacticZenith",
|
||||||
Name: "Galactic Zenith",
|
Name: "Galactic Zenith",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: true,
|
HigherInfluenceYield: true,
|
||||||
HigherCreditYield: true,
|
HigherCreditYield: true,
|
||||||
HigherEnergyYield: true,
|
HigherEnergyYield: true,
|
||||||
@@ -375,7 +375,7 @@ public static class StarSystems
|
|||||||
Id: "GelidStorm",
|
Id: "GelidStorm",
|
||||||
Name: "Gelid Storm",
|
Name: "Gelid Storm",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -391,7 +391,7 @@ public static class StarSystems
|
|||||||
Id: "GlitteringHope",
|
Id: "GlitteringHope",
|
||||||
Name: "Glittering Hope",
|
Name: "Glittering Hope",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: true,
|
HigherInfluenceYield: true,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -407,7 +407,7 @@ public static class StarSystems
|
|||||||
Id: "HeigenStream",
|
Id: "HeigenStream",
|
||||||
Name: "Heigen Stream",
|
Name: "Heigen Stream",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -423,7 +423,7 @@ public static class StarSystems
|
|||||||
Id: "HeliosCrossing",
|
Id: "HeliosCrossing",
|
||||||
Name: "Helios Crossing",
|
Name: "Helios Crossing",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -487,7 +487,7 @@ public static class StarSystems
|
|||||||
Id: "InfernoSEdgeStronghold",
|
Id: "InfernoSEdgeStronghold",
|
||||||
Name: "Inferno's Edge Stronghold",
|
Name: "Inferno's Edge Stronghold",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: true,
|
HigherEnergyYield: true,
|
||||||
@@ -519,7 +519,7 @@ public static class StarSystems
|
|||||||
Id: "IvoryFields",
|
Id: "IvoryFields",
|
||||||
Name: "Ivory Fields",
|
Name: "Ivory Fields",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -567,7 +567,7 @@ public static class StarSystems
|
|||||||
Id: "LeviathanSWake",
|
Id: "LeviathanSWake",
|
||||||
Name: "Leviathan's Wake",
|
Name: "Leviathan's Wake",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: true,
|
HigherEnergyYield: true,
|
||||||
@@ -599,7 +599,7 @@ public static class StarSystems
|
|||||||
Id: "MagentaBloom",
|
Id: "MagentaBloom",
|
||||||
Name: "Magenta Bloom",
|
Name: "Magenta Bloom",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -663,7 +663,7 @@ public static class StarSystems
|
|||||||
Id: "NeeraSGift",
|
Id: "NeeraSGift",
|
||||||
Name: "Neera's Gift",
|
Name: "Neera's Gift",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -695,7 +695,7 @@ public static class StarSystems
|
|||||||
Id: "NexusPrime",
|
Id: "NexusPrime",
|
||||||
Name: "Nexus Prime",
|
Name: "Nexus Prime",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: true,
|
HigherCreditYield: true,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -711,7 +711,7 @@ public static class StarSystems
|
|||||||
Id: "NoxiousEnergy",
|
Id: "NoxiousEnergy",
|
||||||
Name: "Noxious Energy",
|
Name: "Noxious Energy",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -727,7 +727,7 @@ public static class StarSystems
|
|||||||
Id: "NucleicRedux",
|
Id: "NucleicRedux",
|
||||||
Name: "Nucleic Redux",
|
Name: "Nucleic Redux",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -743,7 +743,7 @@ public static class StarSystems
|
|||||||
Id: "ObsidianPalace",
|
Id: "ObsidianPalace",
|
||||||
Name: "Obsidian Palace",
|
Name: "Obsidian Palace",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -791,7 +791,7 @@ public static class StarSystems
|
|||||||
Id: "PleiadesCluster",
|
Id: "PleiadesCluster",
|
||||||
Name: "Pleiades Cluster",
|
Name: "Pleiades Cluster",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: true,
|
HigherCreditYield: true,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -871,7 +871,7 @@ public static class StarSystems
|
|||||||
Id: "ShatteredLight",
|
Id: "ShatteredLight",
|
||||||
Name: "Shattered Light",
|
Name: "Shattered Light",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -919,7 +919,7 @@ public static class StarSystems
|
|||||||
Id: "StarlessSky",
|
Id: "StarlessSky",
|
||||||
Name: "Starless Sky",
|
Name: "Starless Sky",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -935,7 +935,7 @@ public static class StarSystems
|
|||||||
Id: "SteelDepths",
|
Id: "SteelDepths",
|
||||||
Name: "Steel Depths",
|
Name: "Steel Depths",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -951,7 +951,7 @@ public static class StarSystems
|
|||||||
Id: "StellarForge",
|
Id: "StellarForge",
|
||||||
Name: "Stellar Forge",
|
Name: "Stellar Forge",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -967,7 +967,7 @@ public static class StarSystems
|
|||||||
Id: "StrongholdAtlas",
|
Id: "StrongholdAtlas",
|
||||||
Name: "Stronghold Atlas",
|
Name: "Stronghold Atlas",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -999,7 +999,7 @@ public static class StarSystems
|
|||||||
Id: "StrongholdLeo",
|
Id: "StrongholdLeo",
|
||||||
Name: "Stronghold Leo",
|
Name: "Stronghold Leo",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: true,
|
HigherInfluenceYield: true,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1047,7 +1047,7 @@ public static class StarSystems
|
|||||||
Id: "StrongholdTau",
|
Id: "StrongholdTau",
|
||||||
Name: "Stronghold Tau",
|
Name: "Stronghold Tau",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: true,
|
HigherCreditYield: true,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1063,7 +1063,7 @@ public static class StarSystems
|
|||||||
Id: "StrongholdVega",
|
Id: "StrongholdVega",
|
||||||
Name: "Stronghold Vega",
|
Name: "Stronghold Vega",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: true,
|
HigherCreditYield: true,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1095,7 +1095,7 @@ public static class StarSystems
|
|||||||
Id: "TartarusExpanse",
|
Id: "TartarusExpanse",
|
||||||
Name: "Tartarus Expanse",
|
Name: "Tartarus Expanse",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1127,7 +1127,7 @@ public static class StarSystems
|
|||||||
Id: "TheHighCouncil",
|
Id: "TheHighCouncil",
|
||||||
Name: "The High Council",
|
Name: "The High Council",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: true,
|
HigherInfluenceYield: true,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1175,7 +1175,7 @@ public static class StarSystems
|
|||||||
Id: "TyphonSCall",
|
Id: "TyphonSCall",
|
||||||
Name: "Typhon's Call",
|
Name: "Typhon's Call",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: true,
|
HigherEnergyYield: true,
|
||||||
@@ -1207,7 +1207,7 @@ public static class StarSystems
|
|||||||
Id: "VoidStar",
|
Id: "VoidStar",
|
||||||
Name: "Void Star",
|
Name: "Void Star",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1239,7 +1239,7 @@ public static class StarSystems
|
|||||||
Id: "WildSEnd",
|
Id: "WildSEnd",
|
||||||
Name: "Wild's End",
|
Name: "Wild's End",
|
||||||
SystemCategory: StarSystemCategory.HomeworldSystem,
|
SystemCategory: StarSystemCategory.HomeworldSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Obsidian Order",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: true,
|
HigherCreditYield: true,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1255,7 +1255,7 @@ public static class StarSystems
|
|||||||
Id: "XenonAbyss",
|
Id: "XenonAbyss",
|
||||||
Name: "Xenon Abyss",
|
Name: "Xenon Abyss",
|
||||||
SystemCategory: StarSystemCategory.CoreSystem,
|
SystemCategory: StarSystemCategory.CoreSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1271,7 +1271,7 @@ public static class StarSystems
|
|||||||
Id: "XenthicFields",
|
Id: "XenthicFields",
|
||||||
Name: "Xenthic Fields",
|
Name: "Xenthic Fields",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
@@ -1303,7 +1303,7 @@ public static class StarSystems
|
|||||||
Id: "ZetaHorizon",
|
Id: "ZetaHorizon",
|
||||||
Name: "Zeta Horizon",
|
Name: "Zeta Horizon",
|
||||||
SystemCategory: StarSystemCategory.SideSystem,
|
SystemCategory: StarSystemCategory.SideSystem,
|
||||||
Owner: "The Eden Accord",
|
Owner: "The Keeper Council",
|
||||||
HigherInfluenceYield: false,
|
HigherInfluenceYield: false,
|
||||||
HigherCreditYield: false,
|
HigherCreditYield: false,
|
||||||
HigherEnergyYield: false,
|
HigherEnergyYield: false,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +0.05 Topbar regeneration rate
|
occupationBuff: +0.05 Topbar regeneration rate
|
||||||
systemMastery: "[[Building Health and Shields]]"
|
systemMastery: "[[Building Health and Shields]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +4% Unit health and shields
|
occupationBuff: +4% Unit health and shields
|
||||||
systemMastery: "[[Unit Vision and Attack Range]]"
|
systemMastery: "[[Unit Vision and Attack Range]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +5% cooldown reduction on Topbar abilities
|
occupationBuff: +5% cooldown reduction on Topbar abilities
|
||||||
systemMastery: "[[Unit Health and Shields]]"
|
systemMastery: "[[Unit Health and Shields]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +2% Unit health and shields
|
occupationBuff: +2% Unit health and shields
|
||||||
systemMastery: "[[Starting Topbar Energy]]"
|
systemMastery: "[[Starting Topbar Energy]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +20 Topbar maximum energy
|
occupationBuff: +20 Topbar maximum energy
|
||||||
systemMastery: "[[Hero Health and Shields]]"
|
systemMastery: "[[Hero Health and Shields]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherCreditYield: true
|
higherCreditYield: true
|
||||||
occupationBuff: +15% cooldown reduction on Topbar abilities
|
occupationBuff: +15% cooldown reduction on Topbar abilities
|
||||||
systemMastery: "[[Hero Damage]]"
|
systemMastery: "[[Hero Damage]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +5% unit max energy and regeneration
|
occupationBuff: +5% unit max energy and regeneration
|
||||||
systemMastery: "[[Max Supply]]"
|
systemMastery: "[[Max Supply]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherInfluenceYield: true
|
higherInfluenceYield: true
|
||||||
occupationBuff: +0.15 Topbar regeneration rate
|
occupationBuff: +0.15 Topbar regeneration rate
|
||||||
systemMastery: "[[Production Speed for Buildings]]"
|
systemMastery: "[[Production Speed for Buildings]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherEnergyYield: true
|
higherEnergyYield: true
|
||||||
occupationBuff: +4% Unit health and shields
|
occupationBuff: +4% Unit health and shields
|
||||||
systemMastery: "[[Unit Health and Shields]]"
|
systemMastery: "[[Unit Health and Shields]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
higherCreditYield: true
|
higherCreditYield: true
|
||||||
higherInfluenceYield: true
|
higherInfluenceYield: true
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
occupationBuff: +5 Topbar maximum energy
|
occupationBuff: +5 Topbar maximum energy
|
||||||
systemMastery: "[[Hero Health and Shields]]"
|
systemMastery: "[[Hero Health and Shields]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherInfluenceYield: true
|
higherInfluenceYield: true
|
||||||
occupationBuff: +10 max supply
|
occupationBuff: +10 max supply
|
||||||
systemMastery: "[[Production Speed for Buildings]]"
|
systemMastery: "[[Production Speed for Buildings]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
occupationBuff: +5% unit max energy and regeneration
|
occupationBuff: +5% unit max energy and regeneration
|
||||||
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +6% Unit health and shields
|
occupationBuff: +6% Unit health and shields
|
||||||
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherEnergyYield: true
|
higherEnergyYield: true
|
||||||
occupationBuff: +75 Starting Flux
|
occupationBuff: +75 Starting Flux
|
||||||
systemMastery: "[[Turret Damage]]"
|
systemMastery: "[[Turret Damage]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +50 Starting Flux
|
occupationBuff: +50 Starting Flux
|
||||||
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherEnergyYield: true
|
higherEnergyYield: true
|
||||||
occupationBuff: +150 Starting Hexite
|
occupationBuff: +150 Starting Hexite
|
||||||
systemMastery: "[[Unit Vision and Attack Range]]"
|
systemMastery: "[[Unit Vision and Attack Range]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +3 Topbar starting energy
|
occupationBuff: +3 Topbar starting energy
|
||||||
systemMastery: "[[Building Health and Shields]]"
|
systemMastery: "[[Building Health and Shields]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +5 Topbar starting energy
|
occupationBuff: +5 Topbar starting energy
|
||||||
systemMastery: "[[Unit Health and Shields]]"
|
systemMastery: "[[Unit Health and Shields]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherCreditYield: true
|
higherCreditYield: true
|
||||||
occupationBuff: +0.5 unit vision and attack range
|
occupationBuff: +0.5 unit vision and attack range
|
||||||
systemMastery: "[[Building Health and Shields]]"
|
systemMastery: "[[Building Health and Shields]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
occupationBuff: +6% hero damage, health and shields
|
occupationBuff: +6% hero damage, health and shields
|
||||||
systemMastery: "[[Unit Vision and Attack Range]]"
|
systemMastery: "[[Unit Vision and Attack Range]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +20 max supply
|
occupationBuff: +20 max supply
|
||||||
systemMastery: "[[Starting Topbar Energy]]"
|
systemMastery: "[[Starting Topbar Energy]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
occupationBuff: +10% cooldown reduction on Topbar abilities
|
occupationBuff: +10% cooldown reduction on Topbar abilities
|
||||||
systemMastery: "[[Building Health and Shields]]"
|
systemMastery: "[[Building Health and Shields]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherCreditYield: true
|
higherCreditYield: true
|
||||||
occupationBuff: +5 max supply
|
occupationBuff: +5 max supply
|
||||||
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
systemMastery: "[[Unit Energy and Regeneration (not heroes)]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +15% cooldown reduction on Topbar abilities
|
occupationBuff: +15% cooldown reduction on Topbar abilities
|
||||||
systemMastery: "[[Hero Damage]]"
|
systemMastery: "[[Hero Damage]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +100 Starting Hexite
|
occupationBuff: +100 Starting Hexite
|
||||||
systemMastery: "[[Production Speed for Buildings]]"
|
systemMastery: "[[Production Speed for Buildings]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
occupationBuff: +10% unit max energy and regeneration
|
occupationBuff: +10% unit max energy and regeneration
|
||||||
systemMastery: "[[Production Speed for Buildings]]"
|
systemMastery: "[[Production Speed for Buildings]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
occupationBuff: +75 Starting Flux
|
occupationBuff: +75 Starting Flux
|
||||||
systemMastery: "[[Max Supply]]"
|
systemMastery: "[[Max Supply]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +5 Topbar starting energy
|
occupationBuff: +5 Topbar starting energy
|
||||||
systemMastery: "[[Hero Damage]]"
|
systemMastery: "[[Hero Damage]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherInfluenceYield: true
|
higherInfluenceYield: true
|
||||||
occupationBuff: +100 Starting Hexite
|
occupationBuff: +100 Starting Hexite
|
||||||
systemMastery: "[[Hero Damage]]"
|
systemMastery: "[[Hero Damage]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherCreditYield: true
|
higherCreditYield: true
|
||||||
occupationBuff: +50 Starting Flux
|
occupationBuff: +50 Starting Flux
|
||||||
systemMastery: "[[Turret Damage]]"
|
systemMastery: "[[Turret Damage]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherCreditYield: true
|
higherCreditYield: true
|
||||||
occupationBuff: +9% hero damage, health and shields
|
occupationBuff: +9% hero damage, health and shields
|
||||||
systemMastery: "[[Turret Damage]]"
|
systemMastery: "[[Turret Damage]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +12% hero damage, health and shields
|
occupationBuff: +12% hero damage, health and shields
|
||||||
systemMastery: "[[Hero Damage]]"
|
systemMastery: "[[Hero Damage]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherInfluenceYield: true
|
higherInfluenceYield: true
|
||||||
occupationBuff: +12% hero damage, health and shields
|
occupationBuff: +12% hero damage, health and shields
|
||||||
systemMastery: "[[Starting Topbar Energy]]"
|
systemMastery: "[[Starting Topbar Energy]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherEnergyYield: true
|
higherEnergyYield: true
|
||||||
occupationBuff: +10% unit max energy and regeneration
|
occupationBuff: +10% unit max energy and regeneration
|
||||||
systemMastery: "[[Unit Health and Shields]]"
|
systemMastery: "[[Unit Health and Shields]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
higherChanceForItems: true
|
higherChanceForItems: true
|
||||||
occupationBuff: +20 Topbar maximum energy
|
occupationBuff: +20 Topbar maximum energy
|
||||||
systemMastery: "[[Unit Health and Shields]]"
|
systemMastery: "[[Unit Health and Shields]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Homeworld System
|
systemCategory: Homeworld System
|
||||||
owner: The Eden Accord
|
owner: The Obsidian Order
|
||||||
higherCreditYield: true
|
higherCreditYield: true
|
||||||
occupationBuff: +10 max supply
|
occupationBuff: +10 max supply
|
||||||
systemMastery: "[[Max Supply]]"
|
systemMastery: "[[Max Supply]]"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Core System
|
systemCategory: Core System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +10 Topbar starting energy
|
occupationBuff: +10 Topbar starting energy
|
||||||
systemMastery: "[[Starting Topbar Energy]]"
|
systemMastery: "[[Starting Topbar Energy]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +50 Starting Hexite
|
occupationBuff: +50 Starting Hexite
|
||||||
systemMastery: "[[Turret Damage]]"
|
systemMastery: "[[Turret Damage]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
category: StarSystem
|
category: StarSystem
|
||||||
systemCategory: Side System
|
systemCategory: Side System
|
||||||
owner: The Eden Accord
|
owner: The Keeper Council
|
||||||
occupationBuff: +0.25 unit vision and attack range
|
occupationBuff: +0.25 unit vision and attack range
|
||||||
systemMastery: "[[Unit Vision and Attack Range]]"
|
systemMastery: "[[Unit Vision and Attack Range]]"
|
||||||
connectedSystems:
|
connectedSystems:
|
||||||
|
|||||||
Reference in New Issue
Block a user