Initial commit
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Immortal.BuildOrders;
|
||||
|
||||
public class BuildComparisonModel {
|
||||
public List<BuildOrderModel> Builds { get; set; } = new() {
|
||||
new BuildOrderModel(),
|
||||
new BuildOrderModel(),
|
||||
new BuildOrderModel()
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Model.Immortal.Entity;
|
||||
using Model.Immortal.Entity.Data;
|
||||
|
||||
namespace Model.Immortal.BuildOrders;
|
||||
|
||||
public class BuildOrderModel {
|
||||
public string Name { get; set; } = "";
|
||||
public string Color { get; set; } = "red";
|
||||
|
||||
public Dictionary<int, List<EntityModel>> Orders { get; set; } = new() {
|
||||
{
|
||||
0,
|
||||
new List<EntityModel> {
|
||||
EntityModel.Get(DataType.STARTING_Bastion),
|
||||
EntityModel.Get(DataType.STARTING_TownHall_Aru)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public string Notes { get; set; } = @"";
|
||||
|
||||
public List<string> BuildTypes { get; set; } = new();
|
||||
|
||||
|
||||
public List<EntityModel> GetOrdersAt(int interval) {
|
||||
return (from ordersAtTime in Orders
|
||||
from orders in ordersAtTime.Value
|
||||
where ordersAtTime.Key == interval
|
||||
select orders).ToList();
|
||||
}
|
||||
|
||||
public List<EntityModel> GetCompletedAt(int interval) {
|
||||
return (from ordersAtTime in Orders
|
||||
from orders in ordersAtTime.Value
|
||||
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) == interval
|
||||
select orders).ToList();
|
||||
}
|
||||
|
||||
public List<EntityModel> GetCompletedBefore(int interval) {
|
||||
return (from ordersAtTime in Orders
|
||||
from orders in ordersAtTime.Value
|
||||
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
|
||||
select orders).ToList();
|
||||
}
|
||||
|
||||
public List<EntityModel> GetHarvestersCompletedBefore(int interval) {
|
||||
return (from ordersAtTime in Orders
|
||||
from orders in ordersAtTime.Value
|
||||
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
|
||||
where orders.Harvest() != null
|
||||
select orders).ToList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System.Collections.Generic;
|
||||
using Model.Immortal.Chart.Enums;
|
||||
|
||||
namespace Model.Immortal.Chart;
|
||||
|
||||
public class ChartModel {
|
||||
public List<PointModel> Points { get; set; } = new();
|
||||
public string ChartColor { get; set; } = ChartColorType.Red.ToString();
|
||||
|
||||
public int Offset { get; set; } = 0;
|
||||
public int IntervalDisplayMax { get; set; } = 300;
|
||||
public int ValueDisplayMax { get; set; } = 5000;
|
||||
|
||||
public float HighestIntervalPoint { get; set; } = 5000;
|
||||
public float HighestValuePoint { get; set; } = 5000;
|
||||
|
||||
public static List<ChartModel> GetAll() {
|
||||
var cs = new List<ChartModel>();
|
||||
|
||||
var c1 = new ChartModel {
|
||||
IntervalDisplayMax = 1000,
|
||||
ValueDisplayMax = 300,
|
||||
ChartColor = "Orange",
|
||||
Points = new List<PointModel>()
|
||||
};
|
||||
|
||||
for (var i = 0; i < c1.IntervalDisplayMax; i++)
|
||||
c1.Points.Add(new PointModel
|
||||
{ Interval = i, Value = (int)(i / (float)c1.IntervalDisplayMax * c1.ValueDisplayMax) });
|
||||
|
||||
cs.Add(c1);
|
||||
|
||||
return cs;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace Model.Immortal.Chart.Enums;
|
||||
|
||||
public enum ChartColorType {
|
||||
Red,
|
||||
LightGreen,
|
||||
Cyan,
|
||||
Yellow,
|
||||
Orange,
|
||||
LightBlue,
|
||||
Pink
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace Model.Immortal.Chart;
|
||||
|
||||
public class PointModel {
|
||||
public float Interval { get; set; } = 0;
|
||||
public float Value { get; set; } = 0;
|
||||
public float TempValue { get; set; } = 0;
|
||||
|
||||
public string GetInterval(float highestInterval, float displayScale) {
|
||||
var display = Interval / highestInterval * displayScale;
|
||||
return ((int)display).ToString();
|
||||
}
|
||||
|
||||
public string GetValue(float highestValue, float displayScale) {
|
||||
var display = Value / highestValue * displayScale;
|
||||
return ((int)display).ToString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Work.Git;
|
||||
|
||||
public class ChangeModel {
|
||||
public static int id;
|
||||
|
||||
public static List<ChangeModel> exampleData = new() { new ChangeModel() };
|
||||
|
||||
public ChangeModel() {
|
||||
Id = id++;
|
||||
}
|
||||
|
||||
public int Id { get; set; } = 1;
|
||||
public int PatchModelId { get; set; } = 1;
|
||||
public string Name { get; set; } = "Add name...";
|
||||
public string Description { get; set; } = "Add desciption...";
|
||||
public string Commit { get; set; } = CommitType.Feature;
|
||||
public DateTime Date { get; set; } = DateTime.Now;
|
||||
public string Important { get; set; } = "False";
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
namespace Model.Work.Git;
|
||||
|
||||
public class CommitType {
|
||||
public const string Feature = "Feature";
|
||||
public const string Game_Patch = "Game Patch";
|
||||
public const string Fix = "Fix";
|
||||
public const string Documents = "Documents";
|
||||
public const string Style = "Style";
|
||||
public const string Refactor = "Refactor";
|
||||
public const string Perf = "Perf";
|
||||
public const string Test = "Test";
|
||||
public const string Build = "Build";
|
||||
public const string CI = "CI";
|
||||
public const string Chore = "Chore";
|
||||
public const string Typo = "Typo";
|
||||
public const string Revert = "Revert";
|
||||
public const string Planning = "Planning";
|
||||
public const string PrivacyPolicy = "Privacy Policy";
|
||||
public const string None = "None";
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Work.Git;
|
||||
|
||||
public class PatchModel {
|
||||
public static int id;
|
||||
|
||||
public static List<PatchModel> exampleData = new() { new PatchModel { ChangeModels = ChangeModel.exampleData } };
|
||||
|
||||
public PatchModel() {
|
||||
Id = id++;
|
||||
}
|
||||
|
||||
public int Id { get; set; } = 1;
|
||||
public string Name { get; set; } = "Add name...";
|
||||
public DateTime Date { get; set; } = DateTime.Now;
|
||||
public virtual ICollection<ChangeModel> ChangeModels { get; set; } = new List<ChangeModel>();
|
||||
|
||||
public string Important { get; set; } = "False";
|
||||
|
||||
public PatchModel AddChange(ChangeModel changeModel) {
|
||||
if (ChangeModels == null) ChangeModels = new List<ChangeModel>();
|
||||
|
||||
changeModel.PatchModelId = Id;
|
||||
ChangeModels.Add(changeModel);
|
||||
return this;
|
||||
}
|
||||
|
||||
public PatchModel ConnectChildren() {
|
||||
foreach (var change in ChangeModels) change.PatchModelId = Id;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Model.Work.Tasks.Enums;
|
||||
|
||||
public class PriorityType {
|
||||
public const string Blocker = "Blocker";
|
||||
public const string High = "High";
|
||||
public const string Medium = "Medium";
|
||||
public const string Low = "Low";
|
||||
public const string None = "None";
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
namespace Model.Work.Tasks.Enums;
|
||||
|
||||
public class ProjectType {
|
||||
public const string Management = "Management";
|
||||
public const string Immortal = "Management";
|
||||
public const string Food = "Management";
|
||||
public const string Job = "Management";
|
||||
public const string Time = "Management";
|
||||
public const string Maintence = "Management";
|
||||
public const string Website = "Management";
|
||||
public const string Tasks = "Management";
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Work.Tasks.Enums;
|
||||
|
||||
public class SprintType {
|
||||
public const string Current = "Current";
|
||||
public const string Planned = "Planned";
|
||||
public const string Completed = "Completed";
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Model.Work.Tasks.Enums;
|
||||
|
||||
public class StatusType {
|
||||
public const string In_Progress = "In_Progress";
|
||||
public const string Todo = "Todo";
|
||||
public const string To_Test = "To_Test";
|
||||
public const string Done = "Done";
|
||||
public const string Canceled = "Canceled";
|
||||
public const string Fun_Idea = "Fun_Idea";
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Work.Tasks.Enums;
|
||||
|
||||
public class TaskType {
|
||||
public const string Feature = "Feature";
|
||||
public const string Bug = "Bug";
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using Model.Work.Tasks.Enums;
|
||||
|
||||
namespace Model.Work.Tasks;
|
||||
|
||||
public class SprintModel {
|
||||
private static int id = 1;
|
||||
|
||||
public SprintModel() {
|
||||
Id = id++;
|
||||
}
|
||||
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; } = "Add name...";
|
||||
public string Description { get; set; } = "Add description...";
|
||||
|
||||
public DateTime? StartDate { get; set; } = null;
|
||||
public DateTime? EndDate { get; set; } = null;
|
||||
|
||||
public string Notes { get; set; } = "Add notes...";
|
||||
|
||||
public string GetSprintType() {
|
||||
var now = DateTime.Now;
|
||||
|
||||
|
||||
if (StartDate == null || EndDate == null) return SprintType.Planned;
|
||||
|
||||
|
||||
if (DateTime.Compare(now, EndDate.GetValueOrDefault()) > 0) return SprintType.Completed;
|
||||
|
||||
if (DateTime.Compare(now, StartDate.GetValueOrDefault()) >= 0) return SprintType.Current;
|
||||
|
||||
return SprintType.Planned;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Model.Work.Tasks.Enums;
|
||||
|
||||
namespace Model.Work.Tasks;
|
||||
|
||||
public class TaskModel {
|
||||
private static int id = 1;
|
||||
|
||||
public TaskModel() {
|
||||
Id = id++;
|
||||
}
|
||||
|
||||
public int Id { get; set; } = 1;
|
||||
public int? SprintModelId { get; set; } = null;
|
||||
public string Name { get; set; } = "Add name...";
|
||||
public string Description { get; set; } = "Add description...";
|
||||
public string Notes { get; set; } = "Add notes...";
|
||||
public string Status { get; set; } = StatusType.Fun_Idea;
|
||||
public string Priority { get; set; } = PriorityType.Medium;
|
||||
public string Task { get; set; } = TaskType.Feature;
|
||||
|
||||
public string Project { get; set; }
|
||||
|
||||
public DateTime? Created { get; set; } = null;
|
||||
public DateTime? Finished { get; set; } = null;
|
||||
|
||||
public string StatusColor() {
|
||||
return Status == StatusType.Fun_Idea ? "gray"
|
||||
: Status == StatusType.In_Progress ? "#3be330"
|
||||
: Status == StatusType.To_Test ? "cyan"
|
||||
: Status == StatusType.Todo ? "yellow"
|
||||
: Status == StatusType.Done ? "orange"
|
||||
: "white";
|
||||
}
|
||||
|
||||
public static List<string> Statuses(List<TaskModel> Data) {
|
||||
return (from task in Data
|
||||
select task.Status).Distinct().ToList();
|
||||
}
|
||||
|
||||
public static List<string> Projects(List<TaskModel> Data) {
|
||||
return (from task in Data
|
||||
select task.Project).Distinct().ToList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System.Collections.Generic;
|
||||
using Model.Immortal.Entity;
|
||||
|
||||
namespace Model.Immortal.Economy;
|
||||
|
||||
public class EconomyModel {
|
||||
public int Interval { get; set; } = 0;
|
||||
public float Alloy { get; set; } = 0;
|
||||
public float Ether { get; set; } = 0;
|
||||
public float Pyre { get; set; } = 0;
|
||||
public int Supply { get; set; } = 0;
|
||||
public int WorkerCount { get; set; } = 6;
|
||||
public int BusyWorkerCount { get; set; } = 0;
|
||||
public int CreatingWorkerCount { get; set; } = 0;
|
||||
public List<int> CreatingWorkerDelays { get; set; } = new();
|
||||
public List<EntityModel> Harvesters { get; set; } = new();
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Model.Immortal.BuildOrders;
|
||||
using Model.Immortal.Entity;
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Economy;
|
||||
|
||||
public class EconomyOverTimeModel {
|
||||
public List<EconomyModel> EconomyOverTime { get; set; } = new();
|
||||
|
||||
public void Calculate(BuildOrderModel buildOrder, int timing, int fromInterval) {
|
||||
if (EconomyOverTime == null) {
|
||||
EconomyOverTime = new List<EconomyModel>();
|
||||
for (var interval = 0; interval < timing; interval++)
|
||||
EconomyOverTime.Add(new EconomyModel { Interval = interval });
|
||||
}
|
||||
|
||||
if (EconomyOverTime.Count > timing) EconomyOverTime.RemoveRange(timing, EconomyOverTime.Count - timing);
|
||||
|
||||
while (EconomyOverTime.Count < timing)
|
||||
EconomyOverTime.Add(new EconomyModel { Interval = EconomyOverTime.Count - 1 });
|
||||
|
||||
for (var interval = fromInterval; interval < timing; interval++) {
|
||||
var economyAtSecond = EconomyOverTime[interval];
|
||||
if (interval > 0) {
|
||||
economyAtSecond.Alloy = EconomyOverTime[interval - 1].Alloy;
|
||||
economyAtSecond.Ether = EconomyOverTime[interval - 1].Ether;
|
||||
economyAtSecond.WorkerCount = EconomyOverTime[interval - 1].WorkerCount;
|
||||
economyAtSecond.BusyWorkerCount = EconomyOverTime[interval - 1].BusyWorkerCount;
|
||||
economyAtSecond.CreatingWorkerCount = EconomyOverTime[interval - 1].CreatingWorkerCount;
|
||||
economyAtSecond.Harvesters = EconomyOverTime[interval - 1].Harvesters.ToList();
|
||||
economyAtSecond.CreatingWorkerDelays = EconomyOverTime[interval - 1].CreatingWorkerDelays.ToList();
|
||||
}
|
||||
|
||||
economyAtSecond.Interval = interval;
|
||||
|
||||
// Add funds
|
||||
float freeWorkers = economyAtSecond.WorkerCount - economyAtSecond.BusyWorkerCount;
|
||||
var workersNeeded = 0;
|
||||
|
||||
economyAtSecond.Harvesters =
|
||||
(from harvester in buildOrder.GetHarvestersCompletedBefore(interval)
|
||||
select harvester).ToList();
|
||||
|
||||
// Add funds
|
||||
foreach (var entity in economyAtSecond.Harvesters) {
|
||||
var harvester = entity.Harvest();
|
||||
if (harvester.RequiresWorker)
|
||||
if (harvester.Resource == ResourceType.Alloy) {
|
||||
var usedWorkers = Math.Min(harvester.Slots, freeWorkers);
|
||||
economyAtSecond.Alloy += harvester.HarvestedPerInterval * usedWorkers;
|
||||
freeWorkers -= usedWorkers;
|
||||
|
||||
if (usedWorkers < harvester.Slots) workersNeeded += 1;
|
||||
}
|
||||
|
||||
if (harvester.RequiresWorker == false) {
|
||||
if (harvester.Resource == ResourceType.Ether)
|
||||
economyAtSecond.Ether += harvester.HarvestedPerInterval * harvester.Slots;
|
||||
|
||||
if (harvester.Resource == ResourceType.Alloy)
|
||||
economyAtSecond.Alloy += harvester.HarvestedPerInterval * harvester.Slots;
|
||||
}
|
||||
}
|
||||
|
||||
// Create new worker
|
||||
if (economyAtSecond.CreatingWorkerCount > 0)
|
||||
for (var i = 0; i < economyAtSecond.CreatingWorkerDelays.Count; i++)
|
||||
if (economyAtSecond.CreatingWorkerDelays[i] > 0) {
|
||||
if (economyAtSecond.Alloy > 2.5f) {
|
||||
economyAtSecond.Alloy -= 2.5f;
|
||||
economyAtSecond.CreatingWorkerDelays[i]--;
|
||||
}
|
||||
}
|
||||
else {
|
||||
economyAtSecond.CreatingWorkerCount -= 1;
|
||||
economyAtSecond.WorkerCount += 1;
|
||||
economyAtSecond.CreatingWorkerDelays.Remove(i);
|
||||
i--;
|
||||
}
|
||||
|
||||
if (workersNeeded > economyAtSecond.CreatingWorkerCount) {
|
||||
economyAtSecond.CreatingWorkerCount += 1;
|
||||
economyAtSecond.CreatingWorkerDelays.Add(50);
|
||||
}
|
||||
|
||||
// Remove Funds from Build Order
|
||||
var ordersAtTime = buildOrder.GetOrdersAt(interval);
|
||||
|
||||
foreach (var order in ordersAtTime) {
|
||||
var foundEntity = EntityModel.GetDictionary()[order.DataType];
|
||||
var production = foundEntity.Production();
|
||||
|
||||
if (production != null) {
|
||||
economyAtSecond.Alloy -= production.Alloy;
|
||||
economyAtSecond.Ether -= production.Ether;
|
||||
var finishedAt = interval + production.BuildTime;
|
||||
|
||||
if (production.RequiresWorker) economyAtSecond.BusyWorkerCount += 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Handle new entities
|
||||
var completedAtInterval = buildOrder.GetCompletedAt(interval);
|
||||
foreach (var newEntity in completedAtInterval) {
|
||||
var harvest = newEntity;
|
||||
if (harvest != null) economyAtSecond.Harvesters.Add(harvest);
|
||||
|
||||
var production = newEntity.Production();
|
||||
if (production != null && production.RequiresWorker) economyAtSecond.BusyWorkerCount -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Economy.Enums;
|
||||
|
||||
public enum HarvesterType {
|
||||
Worker,
|
||||
EtherExtractor,
|
||||
Bastion
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Economy.Enums;
|
||||
|
||||
public enum RequestType {
|
||||
Unit,
|
||||
Building
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Economy.Enums;
|
||||
|
||||
public enum WorkerStateType {
|
||||
Building,
|
||||
Unit
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,20 @@
|
||||
namespace Model.Immortal.Entity.Data;
|
||||
|
||||
public static class EntityType {
|
||||
public static string None = "None";
|
||||
public static string Any = "Any";
|
||||
public static string Teapot = "Teapot";
|
||||
public static string Family = "Family";
|
||||
public static string Faction = "Faction";
|
||||
public static string Command = "Command";
|
||||
public static string Worker = "Worker";
|
||||
public static string Army = "Army";
|
||||
public static string Building = "Building";
|
||||
public static string Building_Upgrade = "Building_Upgrade";
|
||||
public static string Immortal = "Immortal";
|
||||
public static string Pyre_Spell = "Pyre_Spell";
|
||||
public static string Pyre_Event = "Pyre_Event";
|
||||
public static string Ability = "Ability";
|
||||
public static string Tech = "Tech";
|
||||
public static string Passive = "Passive";
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
namespace Model.Immortal.Entity.Data;
|
||||
|
||||
public static class DataType {
|
||||
public static string PYREEVENT_TowerKilled = "9a923928-b016-49f2-8c7d-950abf09e287";
|
||||
public static string PYREEVENT_CampTaken = "cc27a9b2-69e2-4322-8102-7a9f8bea7871";
|
||||
public static string PYREEVENT_MinerTaken = "5b158cf2-2810-4a2a-8131-c4fe4b392ce9";
|
||||
public static string TEAPOT_Teapot = "7c30273e-b73b-458f-88d6-545360d046cc";
|
||||
public static string TEAPOT_FlyingTeapot = "3eb385ed-7086-4abb-8670-332e7a16c008";
|
||||
public static string FAMILY_Sylv = "73d69995-128d-4cfe-a40a-e5f00491f87b";
|
||||
public static string FAMILY_Human = "466d3be4-5322-4d5c-88d2-fb26563c8ee8";
|
||||
public static string FAMILY_Angelic = "c43686a6-f6d0-4a18-9870-338c64511051";
|
||||
public static string FAMILY_Coalition = "8aba0aff-ce18-4e15-afdc-28bb12a112bb";
|
||||
public static string FAMILY_Rae = "ce8d60f3-b590-4619-ad90-27e65f77312b";
|
||||
public static string FAMILY_Demonic = "f61a3630-9474-4ec3-bc71-997cacc52bc1";
|
||||
public static string FAMILY_NazRa = "56cc934f-57a9-442c-909a-25690f836679";
|
||||
public static string FACTION_Aru = "fb103962-7518-48df-b7d9-83906a009db8";
|
||||
public static string FACTION_Iratek = "dbc12bda-b4f2-4fa0-8270-18dc1646d62d";
|
||||
public static string FACTION_Yul = "9c0492af-1ef8-4113-9010-92178493f8b3";
|
||||
public static string FACTION_Jora = "692f534f-2bdc-4b27-90b4-d88bed3dd910";
|
||||
public static string FACTION_Telmetra = "1b1e2742-81c9-42d0-966c-1e43eb11e34a";
|
||||
public static string FACTION_Kjor = "1b1a354a-863f-440e-b4e7-acad41a6ece8";
|
||||
public static string FACTION_QRath = "3bb4bdf7-d7bf-45cb-b123-02f8ba52b848";
|
||||
public static string FACTION_YRiah = "c7537d12-a536-4ef5-99b9-d7ad704716fe";
|
||||
public static string FACTION_ArkShai = "ffe82eea-b8c6-4933-9230-cd019fd1c259";
|
||||
public static string FACTION_Herlesh = "e6c09f4a-ae7d-4bfd-b5d4-a63445d59498";
|
||||
public static string FACTION_EntralledRae = "9316a2a1-a8e6-47ae-a4c6-411ff54f949a";
|
||||
public static string FACTION_Khardu = "a1764de6-8178-4775-819a-59d23677dd76";
|
||||
public static string COMMAND_Attack = "168486ff-581e-46da-a308-74f1d7d615fd";
|
||||
public static string COMMAND_StandGround = "cb9ee44f-7293-4a82-826c-a3829491006b";
|
||||
public static string MISC_Rocks = "030016ad-b972-4ad5-a601-41a99f8db305";
|
||||
public static string NEUTRAL_Tower = "40a5d5c7-42b8-48af-b71f-d75fedafb7b6";
|
||||
public static string NEUTRAL_PyreCamp = "185a9895-63da-402b-8d09-4c8609d52b04";
|
||||
public static string NEUTRAL_PyreMiner = "474727ee-0353-462f-9241-fb9031eb52a8";
|
||||
public static string STARTING_Bastion = "73d17ce2-8304-43dc-a0dd-d4a5666ea0b3";
|
||||
public static string STARTING_Tower = "3ca43196-db92-4beb-b5c5-65bdffbd32cf";
|
||||
public static string STARTING_TownHall_Aru = "f08e5320-8419-4259-b48d-e201b1f05ccf";
|
||||
public static string STARTING_TownHall_QRath = "150a4727-f831-48be-81fe-4dfd3588dfec";
|
||||
public static string IMMORTAL_Orzum = "bd06682f-c8d5-4115-bb63-f948a034fab2";
|
||||
public static string IMMORTAL_Ajari = "a8041f5a-801a-4c7a-90a9-ea6897eda8be";
|
||||
public static string IMMORTAL_Mala = "9ce65813-952d-4abd-b360-8d4d9c2ffc5a";
|
||||
public static string IMMORTAL_Xol = "73a9d002-4b64-40bd-aac9-669313d9df94";
|
||||
public static string ISPELL_InfuseTroops = "e6da53fb-3cef-48eb-abbf-c5336820127f";
|
||||
public static string ISPELL_SummonCitadel = "3813b14c-eac5-4249-85ac-8cd7253e3aa3";
|
||||
public static string ISPELL_EmpireUnbroken = "3f442411-e958-4ff2-8671-291c47e6404a";
|
||||
public static string ISPELL_PillarOfHeaven = "af822b5c-7404-4961-9589-774c7b073877";
|
||||
public static string ISPELL_DeliverFromEvil = "4168ca14-be95-4db4-b2b8-8b5491510b1a";
|
||||
public static string ISPELL_HeavensAegis = "0dcbdeac-eea2-4208-a7a1-83f47fb76e66";
|
||||
public static string ISPELL_SummonGroveGuardian = "4829079a-9c7c-44f0-90a1-d6eb36f91a2f";
|
||||
public static string ISPELL_ConstructBloodWell = "07aee142-02dd-4804-878a-2d5c6881e8c8";
|
||||
public static string ISPELL_RedTithe = "57008163-5e3a-4b95-98f3-d00b54e18684";
|
||||
public static string ISPELL_RainOfBlood = "792df385-c66a-4710-9f75-97731897a565";
|
||||
public static string ISPELL_GreatHunt = "efa14586-33f0-487f-b691-1ed3bcd5b0e6";
|
||||
public static string TOWER_Citadel = "e4bb8fbd-9c42-449c-82a6-2f72504bd2b4";
|
||||
public static string TOWER_GroveGuardian = "ea772cd5-534b-4bb0-9d4b-36498b8a6c8f";
|
||||
public static string BUILDING_Acropolis = "ee1498cf-3c8c-4793-8869-5e097fe4d372";
|
||||
public static string BUILDING_ApostleOfBinding = "87198418-ad47-455e-bd08-e42a5b2ecde1";
|
||||
public static string BUILDING_GroveHeart = "9b3f8795-d988-4b5f-92ce-090e4f598cea";
|
||||
public static string BUILDING_EtherMaw = "430d05b8-0c3e-4aa9-a4ff-631c7715a1fd";
|
||||
public static string BUPGRADE_MiningLevel2_QRath = "d7beb217-8eaf-4f88-8882-05bd7e0fbebd";
|
||||
public static string BUPGRADE_MiningLevel3_QRath = "2b7d0da9-a897-4d3e-b9bd-3ec4a7c95d2c";
|
||||
public static string BUPGRADE_MiningLevel2_Aru = "ffa76506-470b-4a67-acc6-3dc9686df004";
|
||||
public static string BUPGRADE_MiningLevel3_Aru = "010b3279-472d-4d54-9a85-ebc5c664ee73";
|
||||
public static string BUPGRADE_GodHeart = "45bf16e8-0336-4b5c-9fdd-16022ee9b985";
|
||||
public static string BUPGRADE_Omnivore = "54dd873e-32f3-40c0-9393-2cfdd5eb3a2f";
|
||||
public static string BUILDING_LegionHall = "713dfa80-06cd-489a-bfb2-342b58ece4d1";
|
||||
public static string BUILDING_SoulFoundry = "f884c445-3872-49e4-a236-f69ff8ba800d";
|
||||
public static string BUILDING_Angelarium = "f0c8d993-7c1b-4b6b-91a8-69bd5d6dcb0c";
|
||||
public static string BUILDING_AltarOfTheWorthy = "072bf955-0395-4783-8b77-1abe56f3873d";
|
||||
public static string BUILDING_AmberWomb = "b10995c3-c8fb-4455-87b7-4550d25f2c2b";
|
||||
public static string BUILDING_BoneCanopy = "1b08bb64-d4b5-483c-b3ab-caad8692674a";
|
||||
public static string BUILDING_Reliquary = "21e40775-3480-46ac-a66a-139528d846db";
|
||||
public static string BUILDING_HouseOfFadingSaints = "94ace260-b151-44e3-b16f-bc30124555a6";
|
||||
public static string BUILDING_EyeOfAros = "d07e212d-fae3-436b-a67e-ad5de00b87c4";
|
||||
public static string BUILDING_BearerOfTheCrown = "4341d0c0-1ead-47f0-a322-1e80ca370cce";
|
||||
public static string BUILDING_RedVale = "47e4ab2a-2ea4-4da4-99cb-a8133b656a58";
|
||||
public static string BUILDING_DeepNest = "3076ae6e-89bf-4ea1-a66c-ea45ffcb4046";
|
||||
public static string BUILDING_Neurocyte = "90c6e53f-0430-4992-a1eb-4f91699292cb";
|
||||
public static string DEFENSE_FireSinger = "c7a90286-6977-4d92-91e0-2a0a46eb13ea";
|
||||
public static string DEFENSE_Aerovore = "b68307b7-4759-43a3-8679-d844ac3aa73f";
|
||||
public static string UPGRADE_FaithCastBlades = "32087a66-900e-4f25-95f7-de56d5b424c7";
|
||||
public static string UPGRADE_RelicOfTheWrathfulGaze = "e6fa5ded-53f5-4914-85bb-1fdff5f32b64";
|
||||
public static string UPGRADE_WindStep = "c263fe42-ebde-4145-8b7f-42e5d5d5d10c";
|
||||
public static string UPGRADE_ZephyrRange = "0817c6fd-97ca-4619-aa1c-60378c734898";
|
||||
public static string UPGRADE_SiroccoScript = "9a11909f-6b9b-40c4-8186-213efd2b1e8d";
|
||||
public static string UPGRADE_IconOfKhastEem = "2919a2e2-0602-4969-a381-7689ce0a1ee5";
|
||||
public static string UPGRADE_BladesOfTheGodhead = "d3758f7d-4043-4027-a476-7653c52201d9";
|
||||
public static string UPGRADE_WingsOfTheKenLatir = "18c25c61-0073-4f7e-abf7-1771fc6a844e";
|
||||
public static string UPGRADE_Offering = "9bcb4a21-4e73-470a-94ae-55d592b93b99";
|
||||
public static string UPGRADE_BloodMothersFevor = "15369157-3503-408c-a9cc-c151bcbeb329";
|
||||
public static string UPGRADE_DenInstinct = "1a3c6180-9c43-43f9-b1a4-8499ffda4f2b";
|
||||
public static string UPGRADE_PursuitLigaments = "51a4e848-ae67-4182-9c1f-27cb24e9c531";
|
||||
public static string UPGRADE_XacalDamage = "f10b8f7a-0c52-4e78-8d7d-002ac14e8862";
|
||||
public static string UPGRADE_ResinantDeploy = "29f49353-8fdf-4c5d-b034-37f96447dedb";
|
||||
public static string UPGRADE_WraithBow = "80c09dc3-28a5-48cf-886e-c7f5a52f6b47";
|
||||
public static string UPGRADE_BehemothCapacity = "d0390dd2-d9a5-4b20-9d8b-f554f4c52143";
|
||||
public static string UPGRADE_BloodPlague = "9c207e21-f595-49d0-967d-f30ca8cc3745";
|
||||
public static string UPGRADE_BirthingStorm = "0cb2f1a4-03b3-491b-9db3-d2d4590ede3a";
|
||||
public static string PASSIVE_MendingCommand = "25d94c3d-dba9-4f02-abf4-904269b539c6";
|
||||
public static string PASSIVE_StabilizeHallowedGround = "0bbbaf06-fd22-4f48-a888-cc1ab6af046e";
|
||||
public static string PASSIVE_SpawnQuitl = "80f6b382-da1c-49a1-8235-1ea37983ea54";
|
||||
public static string PASSIVE_XacalDamage = "69928f20-5332-418f-ada3-694da3f7b199";
|
||||
public static string ABILITY_BladesOfTheGodhead = "000154ac-faf5-483d-b0bd-e84335891a27";
|
||||
public static string ABILITY_Windstep = "a410b296-39f7-42e0-87c8-6cef11eb967c";
|
||||
public static string ABILITY_Intervention = "aa155b88-125a-4d25-b63f-77987ea6e519";
|
||||
public static string ABILITY_OrdainedPassage = "3382a5a5-2d22-4b03-a12c-1974199e8a92";
|
||||
public static string ABILITY_DeployMobilizeMagi = "5d5bc595-54b7-42e4-a6f5-b000c2128fa9";
|
||||
public static string ABILITY_DeployMobilizeAbsolver = "c9b5c9c3-6336-4ffe-86d2-e0a9344726c8";
|
||||
public static string ABILITY_Awestrike = "6282b1c3-b11b-43f2-9ce9-b3b300b1f2fa";
|
||||
public static string ABILITY_Offering = "ca2f92b5-3bbe-4b35-a4ba-f7b8b7d3bb1a";
|
||||
public static string ABILITY_DiveBomb = "1699824c-1d65-4862-bb13-776123b0341a";
|
||||
public static string ABILITY_CullingStrike = "b43396de-b7e4-4b87-af74-21522a888af3";
|
||||
public static string ABILITY_LethalBond = "07a4ff49-3f19-4c9d-8b86-a3374eb9a139";
|
||||
public static string ABILITY_DrainingEmbrace = "243c9a28-8d26-49fe-82b8-b07ce0e6ee0d";
|
||||
public static string ABILITY_BloodPlague = "11444d33-cbe9-4e7d-a00b-02d5385d508e";
|
||||
public static string ABILITY_DeployMobilizeResinant = "15fb784f-8cb7-4693-9485-242a6003e4da";
|
||||
public static string ABILITY_DeployMobilizeUnderSpine = "e79f3483-cca0-4de3-9a09-4d98fdbaf792";
|
||||
public static string ABILITY_RootVice = "b3d7099e-5034-4416-b1e9-2f34eb2d30a9";
|
||||
public static string ABILITY_BirthingStorm = "ba85a10c-eeff-4f44-abd7-09fc976c558c";
|
||||
public static string ABILITY_SummonSiegeMaw = "26196eef-906d-4aeb-b51b-d6cdc717618c";
|
||||
public static string ABILITY_AwakenAcaaluk = "59e1513a-ea79-4c4c-bb58-2bd997416f6a";
|
||||
public static string VANGUARD_Zentari_Orzum = "de078e4e-9bab-4b30-8831-a6087abf1793";
|
||||
public static string VANGUARD_Sceptre_Orzum = "ceaf26f7-4463-4bae-aab9-0c7ab7c19cfc";
|
||||
public static string VANGUARD_ArkMother_Ajari = "80a336fe-f5a9-4acb-b618-0bbef345691e";
|
||||
public static string VANGUARD_Saoshin_Ajari = "f208c78f-12f4-4794-9ca4-d711cd0a9d70";
|
||||
public static string VANGUARD_BoneStalker_Xol = "150543a6-7704-4749-9038-f4db157f3f79";
|
||||
public static string VANGUARD_WhiteWoodReaper_Xol = "bce39fea-3423-4079-9dac-5f506b850861";
|
||||
public static string VANGUARD_DreadSister_Mala = "7999270f-365b-4ddd-b3b7-6e214a4c1249";
|
||||
public static string VANGUARD_Incubator_Mala = "60d7957e-66a3-4f58-8e8f-46df134e580d";
|
||||
public static string WORKER_Mote = "a02a0194-2a36-4d61-aa2a-52ae918347d4";
|
||||
public static string WORKER_Symbiote = "eeac56bf-8ad0-4752-9bed-00f42f4e09d5";
|
||||
public static string UNIT_Sipari = "2053c402-9238-48eb-8991-bfb5f3a50f60";
|
||||
public static string UNIT_Zephyr = "53524b19-5846-4150-a984-69a047c19fe1";
|
||||
public static string UNIT_Magi = "5516ffc4-2e07-4f2a-bf40-52a1beb7c247";
|
||||
public static string UNIT_Dervish = "d82c14ef-918a-4961-9db2-ad9241f8405a";
|
||||
public static string UNIT_Absolver = "ac0b0557-f0ec-421c-808c-97cd2c0e1471";
|
||||
public static string UNIT_Hallower = "6e11b7d8-b683-4872-ad58-5df19e640f7f";
|
||||
public static string UNIT_Castigator = "43f8e5cc-0a8a-42d0-a34c-8a0a9a11b4bf";
|
||||
public static string UNIT_Warden = "cf300adc-d9d4-4b5c-94fb-4a4e57bbf90a";
|
||||
public static string UNIT_Sentinel = "1eac79a1-27d2-4aad-a7d6-ff490900605b";
|
||||
public static string UNIT_Throne = "319c7c58-cb4e-4f33-8028-6bc14b8cbedc";
|
||||
public static string UNIT_SharU = "f46097a6-ebb4-42c9-aaf3-c1c3b2c9091f";
|
||||
public static string UNIT_MaskedHunter = "9f4efd3a-103a-4c82-a908-083fe69224b2";
|
||||
public static string UNIT_Bloodbound = "4197e7e3-3496-4459-bf56-780e61232fe1";
|
||||
public static string UNIT_Xacal = "d49b0d2c-aa9b-4142-a9f1-21e0360f3f2e";
|
||||
public static string UNIT_RedSeer = "dce30e51-4f5b-4cc2-8d39-9b469b05e151";
|
||||
public static string UNIT_Acaaluk = "cdc0398d-0173-4c8a-808c-053192712f05";
|
||||
public static string UNIT_Ichor = "ff4355f1-ac0c-4ea1-8a47-ef6791252bb9";
|
||||
public static string UNIT_Resinant = "4dff710f-c326-46af-8406-c308e1969596";
|
||||
public static string UNIT_WraithBow = "775f08e8-d40d-45a9-93c5-69709de10c37";
|
||||
public static string UNIT_UnderSpine = "03f54c91-0bf0-4006-8372-ac090f606e7a";
|
||||
public static string UNIT_Aarox = "56669268-2172-4792-aa17-574c54c7fded";
|
||||
public static string UNIT_Thrum = "5fa85c8e-5e61-4c07-ab74-6bf58048c219";
|
||||
public static string UNIT_Behemoth = "3783004b-65fd-4e4e-bef0-4cf161ea2d2d";
|
||||
public static string SUMMON_Quitl = "d554fb2a-eec5-45fd-bf36-a52d51e615e2";
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using Model.Immortal.Entity.Data;
|
||||
using Model.Immortal.Entity.Parts;
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity;
|
||||
|
||||
public class EntityModel {
|
||||
public static readonly string GameVersion = "0.0.6.8375a";
|
||||
|
||||
private static Dictionary<string, EntityModel> _database;
|
||||
|
||||
private static List<EntityModel> entityModels;
|
||||
|
||||
private static List<EntityModel> entityModelsOnlyHotkey;
|
||||
|
||||
private static Dictionary<string, List<EntityModel>> entityModelsByHotkey;
|
||||
|
||||
|
||||
public EntityModel() { }
|
||||
|
||||
public EntityModel(string data, string entity, bool isSpeculative = false) {
|
||||
DataType = data;
|
||||
EntityType = entity;
|
||||
IsSpeculative = isSpeculative;
|
||||
}
|
||||
|
||||
[Key] public int Id { get; set; } = 1;
|
||||
|
||||
|
||||
|
||||
public string DataType { get; set; }
|
||||
|
||||
// TODO Serilization currently being used for build orders
|
||||
public string EntityType { get; set; }
|
||||
|
||||
public List<IEntityPartInterface> EntityParts { get; set; } = new();
|
||||
|
||||
public bool IsSpeculative { get; set; }
|
||||
|
||||
//TODO Use these values
|
||||
public string Name { get; set; } = "";
|
||||
public string Descriptive { get; set; } = DescriptiveType.None;
|
||||
public string Description { get; set; } = "";
|
||||
public string Notes { get; set; }
|
||||
|
||||
|
||||
public EntityModel Clone() {
|
||||
return (EntityModel)MemberwiseClone();
|
||||
}
|
||||
|
||||
|
||||
public void Copy(EntityModel entity) {
|
||||
DataType = entity.DataType;
|
||||
EntityType = entity.EntityType;
|
||||
EntityParts = entity.EntityParts.ToList();
|
||||
}
|
||||
|
||||
|
||||
public EntityModel AddPart(IEntityPartInterface unitPart) {
|
||||
EntityParts.Add(unitPart);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public static Dictionary<string, EntityModel> GetDictionary() {
|
||||
if (_database == null) _database = DATA.Get();
|
||||
|
||||
return _database;
|
||||
}
|
||||
|
||||
|
||||
public static EntityModel Get(string entity) {
|
||||
if (_database == null) _database = DATA.Get();
|
||||
|
||||
return _database[entity];
|
||||
}
|
||||
|
||||
|
||||
public static List<EntityModel> GetList() {
|
||||
if (entityModels == null) entityModels = DATA.Get().Values.ToList();
|
||||
|
||||
return entityModels;
|
||||
}
|
||||
|
||||
|
||||
public static List<EntityModel> GetListOnlyHotkey() {
|
||||
if (entityModelsOnlyHotkey == null) {
|
||||
entityModelsOnlyHotkey = new List<EntityModel>();
|
||||
|
||||
foreach (var entity in DATA.Get().Values)
|
||||
if (entity.Hotkey() != null)
|
||||
entityModelsOnlyHotkey.Add(entity);
|
||||
}
|
||||
|
||||
return entityModelsOnlyHotkey;
|
||||
}
|
||||
|
||||
|
||||
public static Dictionary<string, List<EntityModel>> GetEntitiesByHotkey() {
|
||||
if (entityModelsByHotkey == null) {
|
||||
entityModelsByHotkey = new Dictionary<string, List<EntityModel>>();
|
||||
|
||||
foreach (var entity in GetList()) {
|
||||
var entityHotkey = entity.Hotkey();
|
||||
if (entityHotkey != null) {
|
||||
if (!entityModelsByHotkey.ContainsKey(entityHotkey.Hotkey))
|
||||
entityModelsByHotkey[entityHotkey.Hotkey] = new List<EntityModel>();
|
||||
|
||||
entityModelsByHotkey[entityHotkey.Hotkey].Add(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return entityModelsByHotkey;
|
||||
}
|
||||
|
||||
|
||||
public static EntityModel GetFrom(string hotkey, string hotkeyGroup, bool holdSpace, string faction,
|
||||
string immortal) {
|
||||
if (hotkey == null || hotkey == "") return null;
|
||||
|
||||
var foundList = from entity in GetEntitiesByHotkey()[hotkey]
|
||||
where entity.Hotkey()?.HotkeyGroup == hotkeyGroup
|
||||
&& entity.Hotkey()?.HoldSpace == holdSpace
|
||||
&& entity.Faction()?.Faction == faction
|
||||
&& (entity.Vanguard()?.Immortal == immortal || entity.Vanguard() == null)
|
||||
&& (entity.Replaceds().Count == 0 || (from replace in entity.Replaceds()
|
||||
where replace.Immortal == immortal
|
||||
select replace).ToList().Count == 0)
|
||||
select entity;
|
||||
|
||||
if (foundList == null || foundList.Count() == 0) return null;
|
||||
|
||||
var found = foundList.First();
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
public EntityInfoModel Info() {
|
||||
return (EntityInfoModel)EntityParts.Find(x => x.GetType() == typeof(EntityInfoModel));
|
||||
}
|
||||
|
||||
|
||||
public EntitySupplyModel Supply() {
|
||||
return (EntitySupplyModel)EntityParts.Find(x => x.GetType() == typeof(EntitySupplyModel));
|
||||
}
|
||||
|
||||
|
||||
public EntityTierModel Tier() {
|
||||
return (EntityTierModel)EntityParts.Find(x => x.GetType() == typeof(EntityTierModel));
|
||||
}
|
||||
|
||||
|
||||
public EntityProductionModel Production() {
|
||||
return (EntityProductionModel)EntityParts.Find(x => x.GetType() == typeof(EntityProductionModel));
|
||||
}
|
||||
|
||||
|
||||
public EntityMovementModel Movement() {
|
||||
return (EntityMovementModel)EntityParts.Find(x => x.GetType() == typeof(EntityMovementModel));
|
||||
}
|
||||
|
||||
|
||||
public EntityVitalityModel Vitality() {
|
||||
return (EntityVitalityModel)EntityParts.Find(x => x.GetType() == typeof(EntityVitalityModel));
|
||||
}
|
||||
|
||||
|
||||
public List<EntityRequirementModel> Requirements() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityRequirementModel))
|
||||
.Cast<EntityRequirementModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<EntityWeaponModel> Weapons() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityWeaponModel))
|
||||
.Cast<EntityWeaponModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<EntityVanguardReplacedModel> Replaceds() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityVanguardReplacedModel))
|
||||
.Cast<EntityVanguardReplacedModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public EntityVanguardAddedModel Vanguard() {
|
||||
return (EntityVanguardAddedModel)EntityParts.Find(x => x.GetType() == typeof(EntityVanguardAddedModel));
|
||||
}
|
||||
|
||||
|
||||
public EntityHotkeyModel Hotkey() {
|
||||
return (EntityHotkeyModel)EntityParts.Find(x => x.GetType() == typeof(EntityHotkeyModel));
|
||||
}
|
||||
|
||||
|
||||
public EntityFactionModel Faction() {
|
||||
return (EntityFactionModel)EntityParts.Find(x => x.GetType() == typeof(EntityFactionModel));
|
||||
}
|
||||
|
||||
|
||||
public EntityHarvestModel Harvest() {
|
||||
return (EntityHarvestModel)EntityParts.Find(x => x.GetType() == typeof(EntityHarvestModel));
|
||||
}
|
||||
|
||||
|
||||
public List<EntityIdAbilityModel> IdAbilities() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityIdAbilityModel))
|
||||
.Cast<EntityIdAbilityModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<EntityIdArmyModel> IdArmies() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityIdArmyModel))
|
||||
.Cast<EntityIdArmyModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<EntityIdPassiveModel> IdPassives() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityIdPassiveModel))
|
||||
.Cast<EntityIdPassiveModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<EntityIdUpgradeModel> IdUpgrades() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityIdUpgradeModel))
|
||||
.Cast<EntityIdUpgradeModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<EntityIdVanguardModel> IdVanguards() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityIdVanguardModel))
|
||||
.Cast<EntityIdVanguardModel>().ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<EntityIdPyreSpellModel> IdPyreSpells() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityIdPyreSpellModel))
|
||||
.Cast<EntityIdPyreSpellModel>().ToList();
|
||||
}
|
||||
|
||||
public List<EntityMechanicModel> Mechanics() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityMechanicModel))
|
||||
.Cast<EntityMechanicModel>().ToList();
|
||||
}
|
||||
|
||||
public List<EntityPassiveModel> Passives() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityPassiveModel))
|
||||
.Cast<EntityPassiveModel>().ToList();
|
||||
}
|
||||
|
||||
public List<EntityStrategyModel> Strategies() {
|
||||
return EntityParts.FindAll(x => x.GetType() == typeof(EntityStrategyModel))
|
||||
.Cast<EntityStrategyModel>().ToList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityFactionModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityFactionModel";
|
||||
public string Faction { get; set; } = FactionType.QRath;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityHarvestModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityHarvestModel";
|
||||
public ResourceType Resource { get; set; } = ResourceType.Alloy;
|
||||
public float Slots { get; set; }
|
||||
public float HarvestedPerInterval { get; set; }
|
||||
public float HarvestDelay { get; set; } = 1;
|
||||
public int TotalAmount { get; set; }
|
||||
public bool RequiresWorker { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityHotkeyModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityHotkeyModel";
|
||||
public string Hotkey { get; set; }
|
||||
public bool HoldSpace { get; set; } = false;
|
||||
public string HotkeyGroup { get; set; }
|
||||
|
||||
|
||||
public bool IsSelectedHotkey(List<string> keys) {
|
||||
return keys.Contains(Hotkey.ToUpper());
|
||||
}
|
||||
|
||||
public bool IsSelectedHotkeyGroup(List<string> keys) {
|
||||
return keys.Contains(HotkeyGroup.ToUpper());
|
||||
}
|
||||
|
||||
|
||||
public bool IsSelectedHoldSpace(List<string> keys) {
|
||||
return (keys.Contains("SPACE") || keys.Contains(" ")) == HoldSpace;
|
||||
}
|
||||
|
||||
|
||||
public bool IsSelectedHotkeyGroupWithSpace(List<string> keys) {
|
||||
var foundKey = false;
|
||||
var foundHold = false;
|
||||
foreach (var key in keys) {
|
||||
if (key.ToUpper().Equals(HotkeyGroup.ToUpper())) foundKey = true;
|
||||
if (key.ToUpper().Equals("SPACE") || key.ToUpper().Equals(" ")) foundHold = true;
|
||||
}
|
||||
|
||||
if (foundKey && foundHold == HoldSpace) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityIdAbilityModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityIdAbilityModel";
|
||||
public string Id { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityIdArmyModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityIdArmyModel";
|
||||
public string Id { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityIdPassiveModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityIdPassiveModel";
|
||||
public string Id { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityIdPyreSpellModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityIdPyreSpellModel";
|
||||
public string Id { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityIdUpgradeModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityIdUpgradeModel";
|
||||
|
||||
public string Id { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityIdVanguardModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityIdVanguardModel";
|
||||
public string Id { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityInfoModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityInfoModel";
|
||||
public string Name { get; set; } = "";
|
||||
public string Descriptive { get; set; } = DescriptiveType.None;
|
||||
public string Description { get; set; } = "";
|
||||
public string Notes { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityMechanicModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityMechanicModel";
|
||||
public string Name { get; set; } = "";
|
||||
public string Description { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityMovementModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityMovementModel";
|
||||
public float Speed { get; set; } = 0;
|
||||
public string Movement { get; set; } = MovementType.Ground;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityPassiveModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityPassiveModel";
|
||||
public string Name { get; set; } = "";
|
||||
public string Description { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityProductionModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityProductionModel";
|
||||
public int Alloy { get; set; } = 0;
|
||||
|
||||
public int Ether { get; set; } = 0;
|
||||
|
||||
public int Pyre { get; set; } = 0;
|
||||
|
||||
public int Energy { get; set; } = 0;
|
||||
public int BuildTime { get; set; } = 0;
|
||||
|
||||
// Remove cooldown as a cost, and move into ability stats
|
||||
public int Cooldown { get; set; } = 0;
|
||||
|
||||
public bool RequiresWorker { get; set; } = false;
|
||||
public bool ConsumesWorker { get; set; } = false;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityPyreRewardModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityPyreRewardModel";
|
||||
|
||||
public int BaseReward { get; set; } = 0;
|
||||
public float OverTimeReward { get; set; } = 0;
|
||||
public int OverTimeRewardDuration { get; set; } = 0;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityRequirementModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityRequirementModel";
|
||||
public string Name { get; set; } = "";
|
||||
public string DataType { get; set; }
|
||||
public string Requirement { get; set; } = RequirementType.Production_Building;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityStrategyModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityStrategyModel";
|
||||
public string Notes { get; set; } = "";
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntitySupplyModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntitySupplyModel";
|
||||
public int Takes { get; set; } = 0;
|
||||
public int Grants { get; set; } = 0;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityTierModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityTierModel";
|
||||
public float Tier { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityVanguardAddedModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityVanguardAddedModel";
|
||||
public string Immortal { get; set; } = ImmortalType.Ajari;
|
||||
public string Replaces { get; set; } = "";
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityVanguardReplacedModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityVanguardReplacedModel";
|
||||
public string Immortal { get; set; } = ImmortalType.Ajari;
|
||||
public string ReplacedBy { get; set; } = "";
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityVitalityModel : IEntityPartInterface {
|
||||
public string Type { get; set; } = "EntityVitalityModel";
|
||||
public int Health { get; set; } = 0;
|
||||
public int DefenseLayer { get; set; } = 0;
|
||||
public string Defense { get; set; } = DefenseType.None;
|
||||
public string Armor { get; set; } = ArmorType.Light;
|
||||
public bool IsEtheric { get; set; } = false;
|
||||
public bool IsStructure { get; set; } = false;
|
||||
|
||||
public int Energy { get; set; } = 0;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using Model.Immortal.Types;
|
||||
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public class EntityWeaponModel : IEntityPartInterface {
|
||||
public int Id { get; set; } = 1;
|
||||
public int EntityModelId { get; set; }
|
||||
public virtual EntityModel EntityModel { get; set; }
|
||||
|
||||
public int Range { get; set; } = 40;
|
||||
public float AttacksPerSecond { get; set; } = 0;
|
||||
public float SecondsBetweenAttacks { get; set; } = 0;
|
||||
|
||||
|
||||
public int Damage { get; set; } = 0;
|
||||
|
||||
|
||||
public bool HasSplash { get; set; }
|
||||
|
||||
public int LightDamage { get; set; } = 0;
|
||||
public int MediumDamage { get; set; } = 0;
|
||||
public int HeavyDamage { get; set; } = 0;
|
||||
|
||||
|
||||
public int StructureDamageBonus { get; set; } = 0;
|
||||
public int EthericDamageBonus { get; set; } = 0;
|
||||
public string Targets { get; set; } = TargetType.All;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
namespace Model.Immortal.Entity.Parts;
|
||||
|
||||
public interface IEntityPartInterface { }
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class ArmorType {
|
||||
public static string Light = "Light";
|
||||
public static string Medium = "Medium";
|
||||
public static string Heavy = "Heavy";
|
||||
public static string Etheric = "Etheric";
|
||||
public static string Structure = "Structure";
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class BuildType {
|
||||
public static string Eco = "Eco";
|
||||
public static string Harass = "Harass";
|
||||
public static string Pyre_Hunting = "Pyre_Hunting";
|
||||
public static string Timing = "Timing";
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class DefenseType {
|
||||
public static string None = "None";
|
||||
public static string Shield = "Shield";
|
||||
public static string Overgrowth = "Overgrowth";
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class DescriptiveType {
|
||||
public static string None = "None";
|
||||
public static string Frontliner = "Frontliner";
|
||||
public static string Force_Multiplier = "Force_Multiplier";
|
||||
public static string Assassin = "Assassin";
|
||||
public static string Generalist = "Generalist";
|
||||
public static string Harrier = "Harrier";
|
||||
public static string Zone_Control = "Zone_Control";
|
||||
public static string Air_Denial = "Air_Denial";
|
||||
public static string Dislodger = "Dislodger";
|
||||
public static string Air_Superiority = "Air_Superiority";
|
||||
public static string Elite_Caster = "Elite_Caster";
|
||||
public static string Worker = "Worker";
|
||||
public static string Skirmisher = "Skirmisher";
|
||||
public static string Town_Hall_Starting = "Town_Hall_Starting";
|
||||
public static string Town_Hall = "Town_Hall";
|
||||
public static string Ether_Extractor = "Ether_Extractor";
|
||||
public static string Production = "Production";
|
||||
public static string Research = "Research";
|
||||
public static string Utility = "Utility";
|
||||
public static string Defense = "Defense";
|
||||
public static string Tower = "Tower";
|
||||
public static string Summon = "Summon";
|
||||
public static string Upgrade = "Upgrade";
|
||||
public static string Ability = "Ability";
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class FactionType {
|
||||
public static string None = "None";
|
||||
public static string Any = "Any";
|
||||
public static string Neutral = "Neutral";
|
||||
public static string QRath = "QRath";
|
||||
public static string Aru = "Aru";
|
||||
public static string Jora = "Jora";
|
||||
public static string Talmetra = "Talmetra";
|
||||
public static string Iratek = "Iratek";
|
||||
public static string Herlesh = "Herlesh";
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class ImmortalType {
|
||||
public static string None = "None";
|
||||
|
||||
public static string Any = "Any";
|
||||
|
||||
public static string Orzum = "Orzum";
|
||||
public static string Ajari = "Ajari";
|
||||
|
||||
public static string Mala = "Mala";
|
||||
public static string Xol = "Xol";
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class MovementType {
|
||||
public static string Ground = "Ground";
|
||||
public static string Air = "Air";
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class RequirementType {
|
||||
public static string Production_Building = "Production_Building";
|
||||
public static string Research_Building = "Research_Building";
|
||||
public static string Research_Upgrade = "Research_Upgrade";
|
||||
public static string Morph = "Morph";
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public enum ResourceType {
|
||||
Alloy,
|
||||
Ether,
|
||||
Pyre
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.Types;
|
||||
|
||||
public static class TargetType {
|
||||
public static string Ground = "Ground";
|
||||
public static string Air = "Air";
|
||||
public static string All = "All";
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Model.Immortal.Hotkeys;
|
||||
|
||||
public enum KeyType {
|
||||
Action,
|
||||
ControlGroup,
|
||||
Cancel,
|
||||
Advance,
|
||||
Economy,
|
||||
Pyre
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Immortal.Hotkeys;
|
||||
|
||||
public class HotkeyModel {
|
||||
public static readonly string[] KeyGroups = { "Z", "1", "2", "TAB", "CONTROL", "SHIFT", "C" };
|
||||
public static readonly string[] HotKeys = { "`", "Q", "W", "E", "R", "A", "S", "F", "X", "V" };
|
||||
public string KeyText { get; set; }
|
||||
public KeyType KeyType { get; set; }
|
||||
public int PositionX { get; set; }
|
||||
public int PositionY { get; set; }
|
||||
public bool IsHidden { get; set; }
|
||||
|
||||
public string GetColor() {
|
||||
return KeyType == KeyType.Action ? "#404146"
|
||||
: KeyType == KeyType.Cancel ? "#621b1b"
|
||||
: KeyType == KeyType.ControlGroup ? "#443512"
|
||||
: KeyType == KeyType.Advance ? "#23262c"
|
||||
: KeyType == KeyType.Economy ? "#262c23"
|
||||
: KeyType == KeyType.Pyre ? "#440e2c"
|
||||
: "#37393F";
|
||||
}
|
||||
|
||||
public static List<HotkeyModel> GetAll() {
|
||||
return new List<HotkeyModel> {
|
||||
new() {
|
||||
KeyText = "`",
|
||||
KeyType = KeyType.Cancel,
|
||||
PositionX = 0,
|
||||
PositionY = 0
|
||||
},
|
||||
new() {
|
||||
KeyText = "TAB",
|
||||
KeyType = KeyType.ControlGroup,
|
||||
PositionX = 0,
|
||||
PositionY = 1
|
||||
},
|
||||
new() {
|
||||
KeyText = "1",
|
||||
KeyType = KeyType.ControlGroup,
|
||||
PositionX = 1,
|
||||
PositionY = 0
|
||||
},
|
||||
new() {
|
||||
KeyText = "Q",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 1,
|
||||
PositionY = 1
|
||||
},
|
||||
new() {
|
||||
KeyText = "W",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 2,
|
||||
PositionY = 1
|
||||
},
|
||||
new() {
|
||||
KeyText = "E",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 3,
|
||||
PositionY = 1
|
||||
},
|
||||
new() {
|
||||
KeyText = "R",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 4,
|
||||
PositionY = 1
|
||||
},
|
||||
new() {
|
||||
KeyText = "A",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 1,
|
||||
PositionY = 2
|
||||
},
|
||||
new() {
|
||||
KeyText = "S",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 2,
|
||||
PositionY = 2
|
||||
},
|
||||
new() {
|
||||
KeyText = "D",
|
||||
KeyType = KeyType.ControlGroup,
|
||||
PositionX = 3,
|
||||
PositionY = 2
|
||||
},
|
||||
new() {
|
||||
KeyText = "F",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 4,
|
||||
PositionY = 2
|
||||
},
|
||||
new() {
|
||||
KeyText = "Z",
|
||||
KeyType = KeyType.ControlGroup,
|
||||
PositionX = 1,
|
||||
PositionY = 3
|
||||
},
|
||||
new() {
|
||||
KeyText = "X",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 2,
|
||||
PositionY = 3
|
||||
},
|
||||
new() {
|
||||
KeyText = "C",
|
||||
KeyType = KeyType.ControlGroup,
|
||||
PositionX = 3,
|
||||
PositionY = 3
|
||||
},
|
||||
new() {
|
||||
KeyText = "V",
|
||||
KeyType = KeyType.Action,
|
||||
PositionX = 4,
|
||||
PositionY = 3
|
||||
},
|
||||
new() {
|
||||
KeyText = "SPACE",
|
||||
KeyType = KeyType.Advance,
|
||||
PositionX = 1,
|
||||
PositionY = 4
|
||||
},
|
||||
// Economy
|
||||
new() {
|
||||
KeyText = "SHIFT", //TODO Update when game changes
|
||||
KeyType = KeyType.Economy,
|
||||
PositionX = 0,
|
||||
PositionY = 2
|
||||
},
|
||||
// Pyre
|
||||
new() {
|
||||
KeyText = "2",
|
||||
KeyType = KeyType.Pyre,
|
||||
PositionX = 2,
|
||||
PositionY = 0,
|
||||
IsHidden = true
|
||||
},
|
||||
|
||||
// Morphs
|
||||
new() {
|
||||
KeyText = "CONTROL",
|
||||
KeyType = KeyType.Economy,
|
||||
PositionX = 0,
|
||||
PositionY = 3
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
namespace Model.Immortal.Hotkeys;
|
||||
|
||||
public enum HotKeyType {
|
||||
SPACE
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Immortal.MemoryTester;
|
||||
|
||||
public class AnswerEventArgs {
|
||||
public string Name { get; set; }
|
||||
public bool IsCorrect { get; set; }
|
||||
public int Guess { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Immortal.MemoryTester;
|
||||
|
||||
public class MemoryEntityModel {
|
||||
public static List<MemoryEntityModel> TestData = new() {
|
||||
new MemoryEntityModel { Id = 1, Name = "Masked Hunter" },
|
||||
new MemoryEntityModel { Id = 2, Name = "Scepter" },
|
||||
new MemoryEntityModel { Id = 3, Name = "Wraith Bow" },
|
||||
new MemoryEntityModel { Id = 4, Name = "Thrum" }
|
||||
};
|
||||
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Immortal.MemoryTester;
|
||||
|
||||
public class MemoryQuestionModel {
|
||||
public static List<MemoryQuestionModel> TestData = new() {
|
||||
new MemoryQuestionModel { Id = 1, MemoryEntityModelId = 1, Name = "Range", Answer = 600, IsRevealed = false },
|
||||
new MemoryQuestionModel { Id = 2, MemoryEntityModelId = 2, Name = "Range", Answer = 600, IsRevealed = false },
|
||||
new MemoryQuestionModel { Id = 3, MemoryEntityModelId = 3, Name = "Range", Answer = 600, IsRevealed = false },
|
||||
new MemoryQuestionModel { Id = 4, MemoryEntityModelId = 4, Name = "Range", Answer = 600, IsRevealed = false }
|
||||
};
|
||||
|
||||
public int Id { get; set; }
|
||||
public int MemoryEntityModelId { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
public int Guess { get; set; }
|
||||
public int Answer { get; set; }
|
||||
public bool IsRevealed { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="_PaperWork\**" />
|
||||
<EmbeddedResource Remove="_PaperWork\**" />
|
||||
<None Remove="_PaperWork\**" />
|
||||
<None Remove="Immortal\MemoryTester\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,109 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Model.Immortal.Notes;
|
||||
|
||||
public class NoteModel {
|
||||
public static readonly List<NoteModel> Data = new() {
|
||||
new NoteModel {
|
||||
Id = 1,
|
||||
LastUpdated = new DateTime(2022, 02, 18),
|
||||
Section = "Coop",
|
||||
Name = "Coop Holdout, Some distant place (Nuath)",
|
||||
IsPreAlpha = true,
|
||||
Description =
|
||||
@"Information contained in this note is based on this <a href=""https://www.youtube.com/watch?v=XkAgOCIz3DE"">YouTube, Reference Video</a>.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/OpenBases.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Open Bases</b></div>
|
||||
|
||||
On this map, you start with around 500 alloy and 100 ether. You are probably going to want to expand to the bases in the marked order, given the density of defending enemies shown on the minimap.
|
||||
|
||||
You should know that these are all standard bases that will mine out in 10 minutes. Giving a total of 18,000 alloy and 7,200 ether. Plus an additional 6,000 alloy from the starting Bastion. In the late game, you will have zero income, aside from pyre.
|
||||
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/EnemySpawns.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Enemy Spawn Areas</b></div>
|
||||
|
||||
The first enemy wave will spawn at 1 minute, and every 2 minutes after will spawn a new wave. These waves are small, and won't be a threat until the 15-minute mark.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/DefendPoints.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Pyre Towers</b></div>
|
||||
|
||||
You have till then to take all 5 of your bases, and set a defensive line at the outer Pyre towers.
|
||||
|
||||
The spawn size post the 15-minute mark does become rather large. You may be tempted to fall back and abandon forward bases, but the waves will stack if not dealt with. Eventually, more units than the game can handle, so ensure outer pyre towers are held. Try to take them back if you lose them.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/Pyre.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Pyre Camps</b></div>
|
||||
|
||||
When you have the time you are also going to need to take the 4 pyre camps spread around the map. It will probably be ideal to split your army in half, to protect your two outer towers, and just have a small force of Ichors or Dervishes to clear the camps quickly.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/Multipliers.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Multipliers</b></div>
|
||||
|
||||
If you have additional free time, you can take out the Altar of the Worthys on the edges of the map to double your current more multiplier: 2, 4, 8, to the max of 16. Amber Wombs will also spawn, with a pack of enemies to defend them. Killing an Amber Womb will increase your score, but also spawn random friendly and enemy units. With this spawning, it's possible to go past the supply cap.
|
||||
|
||||
But really, these optional objectives can be completely ignored, so you can just focus on surviving for as long as possible.
|
||||
"
|
||||
}
|
||||
};
|
||||
|
||||
public static readonly Dictionary<string, NoteModel> Notes = new() {
|
||||
{
|
||||
"79d80c48-67d4-4945-a3ed-7c7803b5f6b5", new NoteModel {
|
||||
LastUpdated = new DateTime(2022, 02, 18),
|
||||
Section = "Coop",
|
||||
Name = "Coop Holdout, Some distant place (Nuath)",
|
||||
IsPreAlpha = true,
|
||||
Description =
|
||||
@"Information contained in this note is based on this <a href=""https://www.youtube.com/watch?v=XkAgOCIz3DE"">YouTube, Reference Video</a>.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/OpenBases.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Open Bases</b></div>
|
||||
|
||||
On this map, you start with around 500 alloy and 100 ether. You are probably going to want to expand to the bases in the marked order, given the density of defending enemies shown on the minimap.
|
||||
|
||||
You should know that these are all standard bases that will mine out in 10 minutes. Giving a total of 18,000 alloy and 7,200 ether. Plus an additional 6,000 alloy from the starting Bastion. In the late game, you will have zero income, aside from pyre.
|
||||
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/EnemySpawns.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Enemy Spawn Areas</b></div>
|
||||
|
||||
The first enemy wave will spawn at 1 minute, and every 2 minutes after will spawn a new wave. These waves are small, and won't be a threat until the 15-minute mark.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/DefendPoints.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Pyre Towers</b></div>
|
||||
|
||||
You have till then to take all 5 of your bases, and set a defensive line at the outer Pyre towers.
|
||||
|
||||
The spawn size post the 15-minute mark does become rather large. You may be tempted to fall back and abandon forward bases, but the waves will stack if not dealt with. Eventually, more units than the game can handle, so ensure outer pyre towers are held. Try to take them back if you lose them.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/Pyre.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Pyre Camps</b></div>
|
||||
|
||||
When you have the time you are also going to need to take the 4 pyre camps spread around the map. It will probably be ideal to split your army in half, to protect your two outer towers, and just have a small force of Ichors or Dervishes to clear the camps quickly.
|
||||
|
||||
<img width=""420"" style=""margin: auto; border:2px solid black;"" src=""image/notes/coop-holdout/Multipliers.png"" />
|
||||
<div style=""margin: auto; text-align:center;""><b>Multipliers</b></div>
|
||||
|
||||
If you have additional free time, you can take out the Altar of the Worthys on the edges of the map to double your current more multiplier: 2, 4, 8, to the max of 16. Amber Wombs will also spawn, with a pack of enemies to defend them. Killing an Amber Womb will increase your score, but also spawn random friendly and enemy units. With this spawning, it's possible to go past the supply cap.
|
||||
|
||||
But really, these optional objectives can be completely ignored, so you can just focus on surviving for as long as possible.
|
||||
"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public int Id { get; set; }
|
||||
public DateTime LastUpdated { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Section { get; set; }
|
||||
public string Description { get; set; }
|
||||
public bool IsHidden { get; set; } = false;
|
||||
public bool IsPreAlpha { get; set; } = true;
|
||||
|
||||
public string DEPRECATED_Id() {
|
||||
return (Section + "-" + Name).ToLower().Replace(" ", "-");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Model.Immortal.RoadMap.Enums;
|
||||
|
||||
public class ReleasePriorityType {
|
||||
public static string High = "High";
|
||||
public static string Medium = "Medium";
|
||||
public static string Low = "Low";
|
||||
public static string Very_Low = "Very_Low";
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Model.Immortal.RoadMap.Enums;
|
||||
|
||||
public class ReleaseStatusType {
|
||||
public static string In_Development = "In_Development";
|
||||
public static string Done = "Done";
|
||||
public static string Future_Possibility = "Future_Possibility";
|
||||
public static string Planned = "Planned";
|
||||
public static string Cancelled = "Cancelled";
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
using System.Collections.Generic;
|
||||
using Model.Immortal.RoadMap.Enums;
|
||||
|
||||
namespace Model.Immortal.RoadMap;
|
||||
|
||||
public class ImmortalRoadMapModel {
|
||||
public static readonly List<ImmortalRoadMapModel> Data = new() {
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "UI Overhaul",
|
||||
Description =
|
||||
@"In the process of redoing the UI. Perhaps add 'Making Of' page for development related details, including a visual list of all components used, for ease of design reference. Ideally avoid menu bloat. Database, Build Calculator, Notes and Documentation, should be obvious main pages. Review 900px width on all pages.",
|
||||
Priority = ReleasePriorityType.High,
|
||||
Status = ReleaseStatusType.In_Development
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Build Calculator Improvements",
|
||||
Description =
|
||||
@"The Calculator will be optimized to perform faster. It needs to be updated to consider training queue limits. Also, it needs error popups added for not enough ether, not enough supply, or no more interval time.",
|
||||
Priority = ReleasePriorityType.High,
|
||||
Status = ReleaseStatusType.Planned
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Build Calculator Pyre",
|
||||
Description =
|
||||
@"Build calculator should also handle pyre generation over time. 2 key will represent taking pyre camps. Make sure people can mark ""casted"" pyre spells as a part of the build order.",
|
||||
Priority = ReleasePriorityType.Medium,
|
||||
Status = ReleaseStatusType.Planned
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Build Comparisons",
|
||||
Description =
|
||||
@"You should be able to calculate two builds and load them against each other. Compare armies over time, to see when it would be best to strike against a certain build, and when it would be too late.",
|
||||
Priority = ReleasePriorityType.Medium,
|
||||
Status = ReleaseStatusType.Planned
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Notes",
|
||||
Description =
|
||||
@"There should be general notes on how to play Immortal. Nothing too extensive, but general faction and gameplay feel, like mentioning mechanics like Overgrowth for Aru and Wards for Q'Rath. Interesting but basic lore notes are also ideal, but all of these notes still need to be sortable in a method that feels natural, not a giant text bloat.",
|
||||
Priority = ReleasePriorityType.High,
|
||||
Status = ReleaseStatusType.Planned
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Documentation",
|
||||
Description =
|
||||
@"There should be documents on how to use this website. Calculator, Database, etc. Ideally, these documents will be designed in a way that becomes easily maintainable with patches. (Currently, some QA document type stuff is appended to the bottom of each tool page.) Add a button to easily go from the current tool, to its matching documented.",
|
||||
Priority = ReleasePriorityType.Medium,
|
||||
Status = ReleaseStatusType.Planned
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Test Automation",
|
||||
Description =
|
||||
@"All patches should be tested via test automation, to avoid obvious bugs from getting into production. Add a informational test automation page to the Development section.",
|
||||
Priority = ReleasePriorityType.Medium,
|
||||
Status = ReleaseStatusType.Planned
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Hot Key Reference",
|
||||
Description =
|
||||
@"Assuming the game continues to use Unreal-based hotkeys, there should be a reference for viewing and generating hotkey templates. Perhaps link to community hotkey files for people that do not wish to write their own.",
|
||||
Priority = ReleasePriorityType.Low,
|
||||
Status = ReleaseStatusType.Future_Possibility
|
||||
},
|
||||
new ImmortalRoadMapModel {
|
||||
Name = "Data Features",
|
||||
Description =
|
||||
@"Being able to save and load the state of the website would be cool. User's would keep all the data as JSON on their local machine, and just be able to load it when visiting the website. Being able to use the website offline would also be cool. People would only visit the live website to get updates. Perhaps offline website could do a check for this update version.",
|
||||
Priority = ReleasePriorityType.Very_Low,
|
||||
Status = ReleaseStatusType.Future_Possibility
|
||||
}
|
||||
};
|
||||
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string Priority { get; set; }
|
||||
public string Status { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Website.Enums;
|
||||
|
||||
public enum NavSelectionType {
|
||||
None,
|
||||
Section,
|
||||
Page
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Model.Website.Enums;
|
||||
|
||||
public class NavigationStateType {
|
||||
public const string Default = "Default";
|
||||
public const string Hovering_Menu = "Hovering_Menu";
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Model.Website.Enums;
|
||||
|
||||
public enum WebDeploymentType {
|
||||
Private,
|
||||
Public,
|
||||
Immortal
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace Model.Website.Enums;
|
||||
|
||||
public class WebPageType {
|
||||
//TODO Deprecated
|
||||
public static readonly string None = "725d1adb-d5c8-4e51-bafb-09c86a94d0b0";
|
||||
public static readonly string IMMORTAL_About = "16e56a46-e593-4de5-a2ff-272b41a28d99";
|
||||
public static readonly string IMMORTAL_BuildCalculator = "c3abee8c-6b10-426d-8a7f-9042e536c007";
|
||||
|
||||
public static readonly string IMMORTAL_MemoryTester = "1234";
|
||||
|
||||
public static readonly string IMMORTAL_ChartComparision = "72ff145b-cfe0-454d-ae8f-ee977007eb73";
|
||||
public static readonly string IMMORTAL_Database = "2602b6ff-24c8-4924-ac59-3d7ad9dbca6b";
|
||||
public static readonly string IMMORTAL_HarassCalculator = "617547c2-c89a-4fa9-b063-5240d46d37b0";
|
||||
public static readonly string IMMORTAL_Notes = "47fbdc7e-97e7-4046-8c91-23f80b87fb86";
|
||||
public static readonly string IMMORTAL_KeyMapping = "315118a1-1d94-4237-a254-76de4ede845a";
|
||||
public static readonly string IMMORTAL_RoadMap = "119ddb93-ac4c-4481-9b89-91111201c543";
|
||||
public static readonly string IMMORTAL_Documentation = "f1a0a435-90ba-4cb3-8ae4-e27e1a249aa1";
|
||||
public static readonly string IMMORTAL_MakingOf = "532c08ed-c9ac-4425-b882-b5501127a567";
|
||||
public static readonly string IMMORTAL_Contact = "37dcbee4-53d9-4cbb-997c-445c2536dde8";
|
||||
public static readonly string IMMORTAL_ChangeLog = "36d459b4-4126-42f8-a391-222af8291c9c";
|
||||
public static readonly string IMMORTAL_Agile = "29a152d2-744a-4567-ba6a-68538c6462ae";
|
||||
public static readonly string IMMORTAL_Streams = "7f375283-83fa-44cf-8fe1-4b8cbd45007e";
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Model.Website.Enums;
|
||||
|
||||
public class WebSectionType {
|
||||
public static readonly string None = "28eefe79-3808-48da-8665-3eab5aebca1d";
|
||||
|
||||
public static readonly string ImmortalGeneral = "1a7dce11-57ff-453e-abac-6eeab01b9a61";
|
||||
public static readonly string ImmortalTools = "c68afaa1-23b6-4ead-9622-797781bb4575";
|
||||
public static readonly string ImmortalResources = "3baddebc-e570-4855-946e-296b823411d6";
|
||||
public static readonly string ImmortalDevelopment = "df411a6f-2389-404b-b4fb-a86ebb764ecc";
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Model.Website;
|
||||
|
||||
public static class SupportedWebSizes {
|
||||
// Mins
|
||||
//public static string Phone = "0px";
|
||||
public static string Tablet = "479px";
|
||||
public static string Desktop = "1024px";
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
using Model.Website.Enums;
|
||||
|
||||
namespace Model.Website;
|
||||
|
||||
public class WebDeploymentModel {
|
||||
public static WebDeploymentType DeploymentType { get; set; } = WebDeploymentType.Private;
|
||||
|
||||
public static List<string> Get() {
|
||||
return DeploymentType == WebDeploymentType.Immortal ? GetImmortal() : new List<string>();
|
||||
}
|
||||
|
||||
|
||||
public static List<string> GetImmortal() {
|
||||
return new List<string> {
|
||||
"",
|
||||
"build-calculator",
|
||||
"comparison-charts",
|
||||
"database"
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Model.Website.Enums;
|
||||
|
||||
namespace Model.Website;
|
||||
|
||||
public class WebDescriptionModel {
|
||||
public static readonly List<WebDescriptionModel> List = new();
|
||||
|
||||
public string Name { get; set; } = "Add Name";
|
||||
public string Description { get; set; } = "Add description";
|
||||
public string Parent { get; set; } = WebSectionType.None;
|
||||
public bool IsPrivate { get; set; } = true;
|
||||
|
||||
public static IEnumerable<WebDescriptionModel> GetPages(string forSection) {
|
||||
return from page in List
|
||||
where page.Parent == forSection
|
||||
select page;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Model.Website;
|
||||
|
||||
public class WebPageModel {
|
||||
public int Id { get; set; }
|
||||
public int WebSectionModelId { get; set; }
|
||||
public string Name { get; set; } = "Add name";
|
||||
public string Description { get; set; } = "Add description";
|
||||
public string Href { get; set; } = null;
|
||||
public string IsPrivate { get; set; } = "True";
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Model.Website;
|
||||
|
||||
public class WebSectionModel {
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; } = "Add name";
|
||||
public string Description { get; set; } = "Add description";
|
||||
public string Href { get; set; } = null;
|
||||
public int Order { get; set; } = 0;
|
||||
public string IsPrivate { get; set; } = "True";
|
||||
}
|
||||
Reference in New Issue
Block a user