forked from Shardstone/trail-into-darkness
3.7 KiB
3.7 KiB
Jovian Zone System
A polygon-based zone system for defining map regions with encounter difficulty, modifiers, and safe areas. No physics engine required.
Package Structure
Packages/com.jovian.zonesystem/
├── Runtime/
│ ├── ZoneTypes.cs ← Enums (ZoneRole, ZoneShape, DifficultyTier), ZoneContext struct
│ ├── ZoneData.cs ← ScriptableObject: per-zone config + polygon
│ ├── ZoneInstance.cs ← MonoBehaviour: scene object, owns polygon + bounds cache
│ ├── ZonesObjectHolder.cs ← Scene manager: registers zones, holds map plane
│ ├── ZoneSystemApi.cs ← Query API: resolve zones at world positions
│ ├── ZoneResolver.cs ← Pure logic: overlapping zones → ZoneContext
│ ├── MapPlane.cs ← MapPlane enum + projection/unprojection utilities
│ ├── PolygonUtils.cs ← Pure math: point-in-polygon, centroid, AABB, triangulation
│ ├── ShapeFactory.cs ← Default shape generation (square, circle, polygon)
│ └── ZoneExporter.cs ← Serialization to JSON
├── Editor/
│ ├── ZoneEditorWindow.cs ← Main editor window (Jovian → Zone System → Zone Editor)
│ ├── ZoneEditorSettings.cs ← Configurable settings: folder path, role colors
│ ├── ZoneInstanceEditor.cs ← Custom inspector + scene handles for shape editing
│ └── ZoneDataEditor.cs ← Role-aware ZoneData inspector
└── Documentation~/
└── index.html ← Full HTML documentation
Quick Start
- Add the package to your project (local package in
Packages/). - Create a ZonesObjectHolder GameObject and set Map Plane to match your map (e.g.
XZ). - Open Jovian → Zone System → Zone Editor.
- Click Create New Zone, set a name and shape, then click Create & Edit.
- Edit all zone data fields in the editor, then click Save Zone.
- Use scene handles to adjust the polygon shape.
Key Features
- Three zone roles: Base (encounter table + difficulty), Modifier (multiplicative stacking), Override (safe zones, story events)
- Visual polygon editing: Drag vertices, Ctrl+Click to insert, Shift+Click to delete, Esc to stop
- Concave polygon support: Ear-clipping triangulation for correct rendering of any shape
- Multi-plane support: XY, XZ, or YZ — one setting controls everything
- No physics dependency: Pure math ray-casting with AABB pre-rejection
- Save workflow: Create → Edit → Save with duplicate ID/name validation
- Role-based colors: Configured in ZoneEditorSettings, auto-applied on role change
- Zone duplication: Independent copies with unique IDs and assets
- JSON export: For runtime loading or external tools
Menu Items
| Menu Path | Description |
|---|---|
| Jovian → Zone System → Zone Editor | Main editor window |
| Jovian → Zone System → Settings | Select or create ZoneEditorSettings asset |
| Jovian → Zone System → Documentation | Open HTML documentation |
Runtime API
ZoneSystemApi api = new ZoneSystemApi(zonesObjectHolder);
// Query zone at a world position
ZoneContext ctx = api.QueryZone(partyWorldPosition);
if(!ctx.isSafe && Random.value < ctx.finalEncounterChance)
TriggerEncounter(ctx.encounterTableId, ctx.finalDifficultyTier);
// Quick safe-zone check
if(api.IsInSafeZone(partyWorldPosition))
return;
// Raw overlapping zones (sorted by priority)
List<ZoneData> zones = api.GetOverlappingZones(partyWorldPosition);
Documentation
Full documentation is available at Documentation~/index.html. Open it via Jovian → Zone System → Documentation.