using System;
using System.Collections.Generic;
using UnityEngine;
namespace Jovian.ZoneSystem {
///
/// Serializable representations for JSON export.
/// Kept in Runtime so server-side or headless builds can also consume them.
///
[Serializable]
public class ZoneExportEntry {
public string id;
public string name;
public string role;
public int priority;
// Base
public string encounterTableId;
public int baseDifficultyTier;
public float baseEncounterChance;
// Modifier
public float encounterChanceMultiplier;
public int difficultyTierBonus;
// Override
public bool isSafeZone;
public string overrideEncounterTableId;
public float overrideEncounterChance;
public int overrideDifficultyTier;
// Shape
public string shape;
public float circleRadius;
public float[] position;
public List polygon;
}
[Serializable]
public class ZoneExportRoot {
public List zones = new();
}
public static class ZoneExporter {
public static ZoneExportRoot BuildExport(ZoneInstance[] instances, MapPlane plane = MapPlane.XZ) {
ZoneExportRoot root = new ZoneExportRoot();
foreach(ZoneInstance inst in instances) {
if(inst.data == null) {
continue;
}
ZoneData d = inst.data;
Vector3 pos = inst.transform.position;
Vector2 origin = MapPlaneUtility.ProjectToPlane(pos, plane);
ZoneExportEntry entry = new ZoneExportEntry {
id = d.zoneId,
name = d.zoneName,
role = d.role.ToString(),
priority = d.priority,
shape = d.shape.ToString(),
circleRadius = d.circleRadius,
position = new[] { pos.x, pos.y, pos.z },
encounterTableId = d.encounterTableId,
baseDifficultyTier = (int)d.baseDifficultyTier,
baseEncounterChance = d.baseEncounterChance,
encounterChanceMultiplier = d.encounterChanceMultiplier,
difficultyTierBonus = d.difficultyTierBonus,
isSafeZone = d.isSafeZone,
overrideEncounterTableId = d.overrideEncounterTableId,
overrideEncounterChance = d.overrideEncounterChance,
overrideDifficultyTier = (int)d.overrideDifficultyTier,
polygon = new List()
};
foreach(Vector2 pt in d.polygon) {
Vector2 worldPt = pt + origin;
entry.polygon.Add(new[] { worldPt.x, worldPt.y });
}
root.zones.Add(entry);
}
return root;
}
public static string ToJson(ZoneExportRoot root, bool pretty = true) {
return JsonUtility.ToJson(root, pretty);
}
}
}