Browse Source

game patch(Immortal) 0.0.6.9121a patch updates, plus WIP build calculator code

main
Jonathan McCaffrey 4 years ago
parent
commit
656b914c6e
  1. 7
      Components/Inputs/EntityLabelComponent.razor
  2. 4
      Components/Navigation/DesktopNavComponent.razor
  3. BIN
      IGP/Database.db
  4. 1
      IGP/Dialog/EntityDialogComponent.razor
  5. 7
      IGP/Pages/Agile/Parts/SprintComponent.razor
  6. 12
      IGP/Pages/Database/Entity/Parts/EntityAbilitiesComponent.razor
  7. 4
      IGP/Pages/Database/Entity/Parts/EntityPassivesComponent.razor
  8. 12
      IGP/Pages/Database/Entity/Parts/EntityProductionComponent.razor
  9. 13
      IGP/Pages/Database/Entity/Parts/EntityStatsComponent.razor
  10. 18
      IGP/Program.cs
  11. 2
      IGP/wwwroot/content/notes/settings/hotkeys.md
  12. 2
      IGP/wwwroot/generated/AgileSprintModels.json
  13. 2
      IGP/wwwroot/generated/AgileTaskModels.json
  14. 2
      IGP/wwwroot/generated/GitChangeModels.json
  15. 2
      IGP/wwwroot/generated/GitPatchModels.json
  16. 1
      Model/Agile/Enums/TaskType.cs
  17. 23
      Model/BuildOrders/BuildOrderModel.cs
  18. 215
      Model/Entity/Data/DATA.cs
  19. 18
      Model/Entity/Data/Ids_Entity.cs
  20. 2
      Model/Entity/EntityModel.cs
  21. 2
      Model/Entity/Parts/EntityProductionModel.cs
  22. 2
      Model/Entity/Parts/EntityVitalityModel.cs
  23. 11
      Services/IServices.cs
  24. 2
      Services/Immortal/BuildComparisionService.cs
  25. 82
      Services/Immortal/BuildOrderService.cs
  26. 58
      Services/Immortal/GameLogicService.cs
  27. 1
      Services/Website/NavigationService.cs

7
Components/Inputs/EntityLabelComponent.razor

@ -22,15 +22,8 @@ else
private EntityModel Entity => DATA.Get()[EntityId]; private EntityModel Entity => DATA.Get()[EntityId];
protected override void OnInitialized()
{
Console.Write(Entity.Info().Name);
}
void EntityLabelClicked() void EntityLabelClicked()
{ {
Console.WriteLine("EntityLabelClicked()");
entityDialogService.AddDialog(EntityId); entityDialogService.AddDialog(EntityId);
} }
} }

4
Components/Navigation/DesktopNavComponent.razor

@ -26,7 +26,7 @@
{ {
<div class="navMenuPosition"> <div class="navMenuPosition">
<div class="navMenuContainer"> <div class="navMenuContainer">
<DesktopNavSectionComponent Section=webSection/> <DesktopNavSectionComponent Section=webSection> </DesktopNavSectionComponent>
</div> </div>
</div> </div>
} }
@ -141,7 +141,6 @@
void MenuClicked(int menuName) void MenuClicked(int menuName)
{ {
Console.WriteLine($"MenuClicked {menuName}");
navigationService.ChangeNavigationSectionId(menuName); navigationService.ChangeNavigationSectionId(menuName);
} }
@ -152,7 +151,6 @@
void HoverOut(MouseEventArgs mouseEventArgs) void HoverOut(MouseEventArgs mouseEventArgs)
{ {
Console.WriteLine(NavigationStateType.Default);
navigationService.ChangeNavigationState(NavigationStateType.Default); navigationService.ChangeNavigationState(NavigationStateType.Default);
} }

BIN
IGP/Database.db

Binary file not shown.

1
IGP/Dialog/EntityDialogComponent.razor

@ -155,7 +155,6 @@
entity = DATA.Get()[entityDialogService.GetEntityId()]; entity = DATA.Get()[entityDialogService.GetEntityId()];
refresh++; refresh++;
Console.WriteLine("OnUpdate()");
StateHasChanged(); StateHasChanged();
} }

7
IGP/Pages/Agile/Parts/SprintComponent.razor

@ -110,9 +110,6 @@
} }
.taskContainer.@StatusType.In_Progress.ToLower() { .taskContainer.@StatusType.In_Progress.ToLower() {
border-color: #030129; border-color: #030129;
background-color: #2c3a4c; background-color: #2c3a4c;
@ -144,6 +141,10 @@
border-width: 8px; border-width: 8px;
} }
.taskContainer.@TaskType.Document.ToLower() {
border-style: dashed;
border-width: 2px;
}
.taskName { .taskName {
font-weight: bold; font-weight: bold;

12
IGP/Pages/Database/Entity/Parts/EntityAbilitiesComponent.razor

@ -33,6 +33,12 @@
<b>- Energy: </b> @production.Energy <b>- Energy: </b> @production.Energy
</div> </div>
} }
@if (!production.DefensiveLayer.Equals(0))
{
<div>
<b>- Shields:</b> @production.DefensiveLayer
</div>
}
if (production.BuildTime != 0) if (production.BuildTime != 0)
{ {
<div> <div>
@ -84,6 +90,12 @@
<b> Energy: </b> @production.Energy <b> Energy: </b> @production.Energy
</div> </div>
} }
@if (!production.DefensiveLayer.Equals(0))
{
<div>
<b>Shields:</b> @production.DefensiveLayer
</div>
}
if (production.BuildTime != 0) if (production.BuildTime != 0)
{ {
<div> <div>

4
IGP/Pages/Database/Entity/Parts/EntityPassivesComponent.razor

@ -15,7 +15,7 @@
<div> <div>
<div> <div>
<b>Name:</b> @info.Name <b>Passive Name:</b> @info.Name
</div> </div>
<div> <div>
<b>- Description:</b> @((MarkupString)info.Description) <b>- Description:</b> @((MarkupString)info.Description)
@ -54,7 +54,7 @@
var requirementModel = DATA.Get()[requirement.Id]; var requirementModel = DATA.Get()[requirement.Id];
<div> <div>
<span> <span>
<b>@requirement.Requirement.Replace("_", " "):</b> @requirementModel.Info().Name <b>- @requirement.Requirement.Replace("_", " "):</b> @requirementModel.Info().Name
</span> </span>
</div> </div>
} }

12
IGP/Pages/Database/Entity/Parts/EntityProductionComponent.razor

@ -42,6 +42,12 @@
<b>Pyre:</b> @Production.Pyre <b>Pyre:</b> @Production.Pyre
</div> </div>
} }
@if (!Production.Pyre.Equals(0))
{
<div>
<b>Shields:</b> @Production.DefensiveLayer
</div>
}
@if (!Production.BuildTime.Equals(0)) @if (!Production.BuildTime.Equals(0))
{ {
@ -128,6 +134,12 @@
<b>Pyre:</b> @Production.Pyre <b>Pyre:</b> @Production.Pyre
</div> </div>
} }
@if (!Production.DefensiveLayer.Equals(0))
{
<div>
<b>Shields:</b> @Production.DefensiveLayer
</div>
}
@if (!Production.BuildTime.Equals(0)) @if (!Production.BuildTime.Equals(0))
{ {

13
IGP/Pages/Database/Entity/Parts/EntityStatsComponent.razor

@ -23,6 +23,13 @@
<b>Energy:</b> @Vitality.Energy <b>Energy:</b> @Vitality.Energy
</div> </div>
} }
@if (!Vitality.Lasts.Equals(0))
{
<div>
<b>Lasts:</b> @Vitality.Lasts.ToString()s
</div>
}
@if (Vitality.Armor != "") @if (Vitality.Armor != "")
{ {
<div> <div>
@ -92,6 +99,12 @@
<b>Energy:</b> @Vitality.Energy <b>Energy:</b> @Vitality.Energy
</div> </div>
} }
@if (!Vitality.Lasts.Equals(0))
{
<div>
<b>Lasts:</b> @Vitality.Lasts.ToString()s
</div>
}
@if (Vitality.Armor != "") @if (Vitality.Armor != "")
{ {
<div> <div>

18
IGP/Program.cs

@ -20,7 +20,6 @@ builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.
builder.Services.AddLocalization(); builder.Services.AddLocalization();
builder.Services.AddSingleton<INavigationService, NavigationService>(); builder.Services.AddSingleton<INavigationService, NavigationService>();
builder.Services.AddSingleton<IKeyService, KeyService>(); builder.Services.AddSingleton<IKeyService, KeyService>();
builder.Services.AddSingleton<IImmortalSelectionService, ImmortalSelectionService>(); builder.Services.AddSingleton<IImmortalSelectionService, ImmortalSelectionService>();
@ -30,9 +29,15 @@ builder.Services.AddSingleton<IEconomyService, EconomyService>();
builder.Services.AddSingleton<ITimingService, TimingService>(); builder.Services.AddSingleton<ITimingService, TimingService>();
builder.Services.AddSingleton<IMemoryTesterService, MemoryTesterService>(); builder.Services.AddSingleton<IMemoryTesterService, MemoryTesterService>();
builder.Services.AddSingleton<IEntityFilterService, EntityFilterService>(); builder.Services.AddSingleton<IEntityFilterService, EntityFilterService>();
builder.Services.AddSingleton<IGameLogicService, GameLogicService>();
builder.Services.AddSingleton<IEntityDisplayService, EntityDisplayService>(); builder.Services.AddSingleton<IEntityDisplayService, EntityDisplayService>();
builder.Services.AddSingleton<IEntityDialogService, EntityDialogService>();
builder.Services.AddSingleton<IToastService, ToastService>();
builder.Services.AddSingleton<IWebsiteService, WebsiteService>();
builder.Services.AddSingleton<IAgileService, AgileService>();
builder.Services.AddSingleton<IGitService, GitService>();
builder.Services.AddSingleton<INoteService, NoteService>();
builder.Services.AddSingleton<IDocumentationService, DocumentationService>();
builder.Services.AddSingleton(new HttpClient builder.Services.AddSingleton(new HttpClient
{ {
@ -40,8 +45,6 @@ builder.Services.AddSingleton(new HttpClient
}); });
builder.Services.AddSingleton<IEntityDialogService, EntityDialogService>();
builder.Services.AddSingleton<IToastService, ToastService>();
#if NO_SQL #if NO_SQL
@ -49,11 +52,6 @@ builder.Services.AddSingleton<IToastService, ToastService>();
//builder.Services.AddDbContext<DatabaseContext>(options => { options.UseSqlite("Data Source=./Database.db"); }); //builder.Services.AddDbContext<DatabaseContext>(options => { options.UseSqlite("Data Source=./Database.db"); });
#endif #endif
builder.Services.AddSingleton<IWebsiteService, WebsiteService>();
builder.Services.AddSingleton<IAgileService, AgileService>();
builder.Services.AddSingleton<IGitService, GitService>();
builder.Services.AddSingleton<INoteService, NoteService>();
builder.Services.AddSingleton<IDocumentationService, DocumentationService>();
await builder.Build().RunAsync(); await builder.Build().RunAsync();

2
IGP/wwwroot/content/notes/settings/hotkeys.md

@ -104,7 +104,7 @@ You can notice a single line of this file can be broken down like this.
## Modify the Input.ini file ## Modify the Input.ini file
Your now going to want to modify the file with your own hotkey setup. You are now going to want to modify the file with your own hotkey setup.
To do this, replace any of the Key=`VALUE` mapped to the desired actions with any value from the list below. To do this, replace any of the Key=`VALUE` mapped to the desired actions with any value from the list below.

2
IGP/wwwroot/generated/AgileSprintModels.json

@ -1 +1 @@
[{"Id":1,"Name":"Agile Sprint","Description":"Changelogs and sprint views were going to be pushed till later, but I am feeling inspired by the IGP Content Creators\u0027 minimum weekly lifecycle requirement. So I am going to focus on agile-related tasks, and handle roadmap tasks after this initial sprint. All weekly sprints will release on Sunday, starting next Sunday.","StartDate":"2022-02-14T00:00:00","EndDate":"2022-02-20T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":2,"Name":"SQL Update","Description":"The SQL update is big enough to be a full sprint in of itself, and I spent less time this week for development. Will just extend sprint by 2 week, and remove all non SQL tasks from the sprint.","StartDate":"2022-02-20T00:00:00","EndDate":"2022-03-27T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":3,"Name":"Database Page","Description":"Improvements to the Database page","StartDate":"2022-03-27T00:00:00","EndDate":"2022-04-03T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":4,"Name":"Branding","Description":"Improve streaming branding around the website","StartDate":"2022-04-03T00:00:00","EndDate":"2022-04-10T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":5,"Name":"Calculators","Description":"Improve Calculators","StartDate":"2022-04-10T00:00:00","EndDate":"2022-04-24T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":6,"Name":"Infrastructure Misc","Description":"Localization, Analytics, and Test Automation","StartDate":"2022-04-24T00:00:00","EndDate":"2022-05-08T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":7,"Name":"Damage Calculator and Lists","Description":"Sort unit data by damage output. Select a attack and defense unit to see hits to kill.","StartDate":"2022-05-08T00:00:00","EndDate":"2022-05-22T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":8,"Name":"More Test Automation and CI","Description":"More test automation work. Integrate into CI","StartDate":"2022-05-22T00:00:00","EndDate":"2022-06-05T00:00:00","Notes":null,"AgileTaskModels":[]}] [{"Id":0,"Name":"Easy Tasks","Description":"General tasks that I can grab when too tired to program","StartDate":null,"EndDate":null,"Notes":null,"AgileTaskModels":[]},{"Id":1,"Name":"Agile Sprint","Description":"Changelogs and sprint views were going to be pushed till later, but I am feeling inspired by the IGP Content Creators\u0027 minimum weekly lifecycle requirement. So I am going to focus on agile-related tasks, and handle roadmap tasks after this initial sprint. All weekly sprints will release on Sunday, starting next Sunday.","StartDate":"2022-02-14T00:00:00","EndDate":"2022-02-20T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":2,"Name":"SQL Update","Description":"The SQL update is big enough to be a full sprint in of itself, and I spent less time this week for development. Will just extend sprint by 2 week, and remove all non SQL tasks from the sprint.","StartDate":"2022-02-20T00:00:00","EndDate":"2022-03-27T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":3,"Name":"Database Page","Description":"Improvements to the Database page","StartDate":"2022-03-27T00:00:00","EndDate":"2022-04-03T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":4,"Name":"Branding","Description":"Improve streaming branding around the website","StartDate":"2022-04-03T00:00:00","EndDate":"2022-04-10T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":5,"Name":"Calculators","Description":"Improve Calculators","StartDate":"2022-04-10T00:00:00","EndDate":"2022-04-24T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":6,"Name":"Infrastructure Misc","Description":"Localization, Analytics, and Test Automation","StartDate":"2022-04-24T00:00:00","EndDate":"2022-05-08T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":7,"Name":"Damage Calculator and Lists","Description":"Sort unit data by damage output. Select a attack and defense unit to see hits to kill.","StartDate":"2022-05-08T00:00:00","EndDate":"2022-05-22T00:00:00","Notes":null,"AgileTaskModels":[]},{"Id":8,"Name":"More Test Automation and CI","Description":"More test automation work. Integrate into CI","StartDate":"2022-05-22T00:00:00","EndDate":"2022-06-05T00:00:00","Notes":null,"AgileTaskModels":[]}]

2
IGP/wwwroot/generated/AgileTaskModels.json

File diff suppressed because one or more lines are too long

2
IGP/wwwroot/generated/GitChangeModels.json

File diff suppressed because one or more lines are too long

2
IGP/wwwroot/generated/GitPatchModels.json

@ -1 +1 @@
[{"Id":1,"Name":"Database UX Patch","Date":"2022-03-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":2,"Name":"Thrum Stats Hotfix","Date":"2022-03-12T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":3,"Name":"Memory Tester Patch","Date":"2022-03-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":4,"Name":"Hide Pyre Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":5,"Name":"Stream Patch","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":6,"Name":"Agile UI Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":7,"Name":"Armor Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":8,"Name":"Home Page Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":9,"Name":"Mobile Menu Hotfix 2","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":10,"Name":"Mobile Menu Hotfix","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":11,"Name":"Mobile Menu Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":12,"Name":"0.0.6.8375a Patch","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":13,"Name":"Google Tracking Hotfix","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":14,"Name":"Privacy Policy Patch","Date":"2022-02-17T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":15,"Name":"Home Page Quick Hotfix","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":16,"Name":"Early Agile Patch","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":17,"Name":"Form Text Rendering Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":18,"Name":"Reducing Timing Interval Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":19,"Name":"Changelog Patch","Date":"2022-02-14T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":20,"Name":"SQL Patch","Date":"2022-03-26T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":21,"Name":"Stream Patch","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":22,"Name":"0.0.6.8900a Patch","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":23,"Name":"Database Links Patch","Date":"2022-04-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":24,"Name":"Open Source Patch","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":25,"Name":"Stream Patch","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":26,"Name":"Notes/Docs Patch","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":27,"Name":"Stream Patch","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":28,"Name":"Passive Patch","Date":"2022-04-12T00:00:00","GitChangeModels":[],"Important":"True"}] [{"Id":1,"Name":"Database UX Patch","Date":"2022-03-13T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":2,"Name":"Thrum Stats Hotfix","Date":"2022-03-12T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":3,"Name":"Memory Tester Patch","Date":"2022-03-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":4,"Name":"Hide Pyre Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":5,"Name":"Stream Patch","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":6,"Name":"Agile UI Hotfix","Date":"2022-02-20T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":7,"Name":"Armor Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":8,"Name":"Home Page Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":9,"Name":"Mobile Menu Hotfix 2","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":10,"Name":"Mobile Menu Hotfix","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":11,"Name":"Mobile Menu Patch","Date":"2022-02-19T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":12,"Name":"0.0.6.8375a Patch","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":13,"Name":"Google Tracking Hotfix","Date":"2022-02-18T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":14,"Name":"Privacy Policy Patch","Date":"2022-02-17T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":15,"Name":"Home Page Quick Hotfix","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":16,"Name":"Early Agile Patch","Date":"2022-02-16T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":17,"Name":"Form Text Rendering Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":18,"Name":"Reducing Timing Interval Hotfix","Date":"2022-02-15T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":19,"Name":"Changelog Patch","Date":"2022-02-14T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":20,"Name":"SQL Patch","Date":"2022-03-26T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":21,"Name":"Stream Patch","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":22,"Name":"0.0.6.8900a Patch","Date":"2022-03-30T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":23,"Name":"Database Links Patch","Date":"2022-04-01T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":24,"Name":"Open Source Patch","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":25,"Name":"Stream Patch","Date":"2022-04-03T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":26,"Name":"Notes/Docs Patch","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":27,"Name":"Stream Patch","Date":"2022-04-10T00:00:00","GitChangeModels":[],"Important":"False"},{"Id":28,"Name":"Passive Patch","Date":"2022-04-12T00:00:00","GitChangeModels":[],"Important":"True"},{"Id":29,"Name":"0.0.6.9121a Patch","Date":"2022-04-13T00:00:00","GitChangeModels":[],"Important":"True"}]

1
Model/Agile/Enums/TaskType.cs

@ -4,4 +4,5 @@ public class TaskType
{ {
public const string Feature = "Feature"; public const string Feature = "Feature";
public const string Bug = "Bug"; public const string Bug = "Bug";
public const string Document = "Document";
} }

23
Model/BuildOrders/BuildOrderModel.cs

@ -10,7 +10,19 @@ public class BuildOrderModel
public string Name { get; set; } = ""; public string Name { get; set; } = "";
public string Color { get; set; } = "red"; public string Color { get; set; } = "red";
public Dictionary<int, List<EntityModel>> Orders { get; set; } = new() public Dictionary<int, List<EntityModel>> StartedOrders { get; set; } = new()
{
{
0,
new List<EntityModel>
{
EntityModel.Get(DataType.STARTING_Bastion),
EntityModel.Get(DataType.STARTING_TownHall_Aru)
}
}
};
public Dictionary<int, List<EntityModel>> CompletedOrders { get; set; } = new()
{ {
{ {
0, 0,
@ -29,7 +41,7 @@ public class BuildOrderModel
public List<EntityModel> GetOrdersAt(int interval) public List<EntityModel> GetOrdersAt(int interval)
{ {
return (from ordersAtTime in Orders return (from ordersAtTime in StartedOrders
from orders in ordersAtTime.Value from orders in ordersAtTime.Value
where ordersAtTime.Key == interval where ordersAtTime.Key == interval
select orders).ToList(); select orders).ToList();
@ -37,7 +49,7 @@ public class BuildOrderModel
public List<EntityModel> GetCompletedAt(int interval) public List<EntityModel> GetCompletedAt(int interval)
{ {
return (from ordersAtTime in Orders return (from ordersAtTime in StartedOrders
from orders in ordersAtTime.Value from orders in ordersAtTime.Value
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) == interval where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) == interval
select orders).ToList(); select orders).ToList();
@ -45,15 +57,16 @@ public class BuildOrderModel
public List<EntityModel> GetCompletedBefore(int interval) public List<EntityModel> GetCompletedBefore(int interval)
{ {
return (from ordersAtTime in Orders return (from ordersAtTime in StartedOrders
from orders in ordersAtTime.Value from orders in ordersAtTime.Value
where ordersAtTime.Key >= interval
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
select orders).ToList(); select orders).ToList();
} }
public List<EntityModel> GetHarvestersCompletedBefore(int interval) public List<EntityModel> GetHarvestersCompletedBefore(int interval)
{ {
return (from ordersAtTime in Orders return (from ordersAtTime in StartedOrders
from orders in ordersAtTime.Value from orders in ordersAtTime.Value
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
where orders.Harvest() != null where orders.Harvest() != null

215
Model/Entity/Data/DATA.cs

@ -55,8 +55,8 @@ public class DATA
DataType.TEAPOT_FlyingTeapot, new EntityModel(DataType.TEAPOT_FlyingTeapot, EntityType.Teapot) DataType.TEAPOT_FlyingTeapot, new EntityModel(DataType.TEAPOT_FlyingTeapot, EntityType.Teapot)
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ {
Name = "Flying Teapot", Description = "Basic observer. Can fly and see hidden units", Name = "Flying Teapot", Description = "Basic observer. Can fly and see hidden units within 1000 range.",
Notes = @"Much flying, Wow!" Notes = @"Doesn't take up a scout slot."
}) })
.AddPart(new EntityRequirementModel { Id = DataType.TEAPOT_Teapot }) .AddPart(new EntityRequirementModel { Id = DataType.TEAPOT_Teapot })
.AddPart(new EntityProductionModel { Alloy = 100, Ether = 50 }) .AddPart(new EntityProductionModel { Alloy = 100, Ether = 50 })
@ -259,6 +259,7 @@ public class DATA
.AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_SummonGroveGuardian }) .AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_SummonGroveGuardian })
.AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_InfuseTroops }) .AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_InfuseTroops })
.AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_ConstructBloodWell }) .AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_ConstructBloodWell })
.AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_MarkPrey })
.AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_TheGreatHunt }) .AddPart(new EntityIdPyreSpellModel { Id = DataType.ISPELL_TheGreatHunt })
.AddPart(new EntityIdVanguardModel { Id = DataType.VANGUARD_BoneStalker_Xol }) .AddPart(new EntityIdVanguardModel { Id = DataType.VANGUARD_BoneStalker_Xol })
.AddPart(new EntityIdVanguardModel { Id = DataType.VANGUARD_WhiteWoodReaper_Xol }) .AddPart(new EntityIdVanguardModel { Id = DataType.VANGUARD_WhiteWoodReaper_Xol })
@ -319,7 +320,12 @@ public class DATA
DataType.IPASSIVE_MothersHunger, DataType.IPASSIVE_MothersHunger,
new EntityModel(DataType.IPASSIVE_MothersHunger, EntityType.Passive) new EntityModel(DataType.IPASSIVE_MothersHunger, EntityType.Passive)
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ Name = "Mother's Hunger", Description = "Mala's Blood Wells grant you pyre for nearby non-quitl deaths." }) {
Name = "Mother's Hunger",
Description = "Mala's Blood Wells grant you pyre for nearby non-quitl deaths, based on the supply.",
Notes = "+1 per supply"
})
}, },
{ {
DataType.IPASSIVE_StalkersSense, DataType.IPASSIVE_StalkersSense,
@ -458,7 +464,10 @@ public class DATA
DataType.VANGUARD_Sceptre_Orzum, DataType.VANGUARD_Sceptre_Orzum,
new EntityModel(DataType.VANGUARD_Sceptre_Orzum, EntityType.Army) new EntityModel(DataType.VANGUARD_Sceptre_Orzum, EntityType.Army)
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ Name = "Sceptre", Descriptive = DescriptiveType.Harrier, Description = "" }) {
Name = "Sceptre", Descriptive = DescriptiveType.Harrier, Description = "",
Notes = "Loses 16 energy per second when moving."
})
.AddPart(new EntityTierModel { Tier = 3 }) .AddPart(new EntityTierModel { Tier = 3 })
.AddPart(new EntityHotkeyModel { Hotkey = "R", HoldSpace = true, HotkeyGroup = "Z" }) .AddPart(new EntityHotkeyModel { Hotkey = "R", HoldSpace = true, HotkeyGroup = "Z" })
.AddPart(new EntityFactionModel { Faction = FactionType.QRath }) .AddPart(new EntityFactionModel { Faction = FactionType.QRath })
@ -631,7 +640,7 @@ public class DATA
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityVanguardAddedModel .AddPart(new EntityVanguardAddedModel
{ ReplaceId = DataType.UNIT_MaskedHunter, ImmortalId = DataType.IMMORTAL_Xol }) { ReplaceId = DataType.UNIT_MaskedHunter, ImmortalId = DataType.IMMORTAL_Xol })
.AddPart(new EntityProductionModel { Alloy = 50, Ether = 0, BuildTime = 40 }) .AddPart(new EntityProductionModel { Alloy = 50, Ether = 0, BuildTime = 35 })
.AddPart(new EntitySupplyModel { Takes = 2 }) .AddPart(new EntitySupplyModel { Takes = 2 })
.AddPart(new EntityVitalityModel .AddPart(new EntityVitalityModel
{ Health = 85, DefenseLayer = 10, Armor = ArmorType.Light, IsEtheric = false }) { Health = 85, DefenseLayer = 10, Armor = ArmorType.Light, IsEtheric = false })
@ -687,6 +696,7 @@ public class DATA
.AddPart(new EntityMovementModel { Speed = 400, Movement = MovementType.Ground }) .AddPart(new EntityMovementModel { Speed = 400, Movement = MovementType.Ground })
.AddPart(new EntityWeaponModel .AddPart(new EntityWeaponModel
{ Damage = 5, Range = 50, AttacksPerSecond = 1.887f, Targets = TargetType.Ground }) { Damage = 5, Range = 50, AttacksPerSecond = 1.887f, Targets = TargetType.Ground })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_HarvestAlloy })
}, },
{ {
DataType.UNIT_Sipari, DataType.UNIT_Sipari,
@ -790,6 +800,8 @@ public class DATA
Damage = 20, MediumDamage = 24, HeavyDamage = 28, Range = 500, AttacksPerSecond = 0.667f, Damage = 20, MediumDamage = 24, HeavyDamage = 28, Range = 500, AttacksPerSecond = 0.667f,
Targets = TargetType.All Targets = TargetType.All
}) })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_WindStep })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_ZephyrRange })
.AddPart(new EntityIdAbilityModel { Id = DataType.ABILITY_Windstep }) .AddPart(new EntityIdAbilityModel { Id = DataType.ABILITY_Windstep })
}, },
{ {
@ -815,11 +827,13 @@ public class DATA
.AddPart(new EntityMovementModel { Speed = 435, Movement = MovementType.Ground }) .AddPart(new EntityMovementModel { Speed = 435, Movement = MovementType.Ground })
.AddPart(new EntityWeaponModel .AddPart(new EntityWeaponModel
{ {
Damage = 20, LightDamage = 40, MediumDamage = 30, Range = 250, AttacksPerSecond = 0.5f, LightDamage = 32, MediumDamage = 24, Damage = 16, Range = 250, AttacksPerSecond = 0.5f,
Targets = TargetType.Ground Targets = TargetType.Ground
}) })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_SiroccoScript }) .AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_SiroccoScript })
.AddPart(new EntityIdPassiveModel(){Id = DataType.PASSIVE_RadiantWard}) .AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_RadiantWard })
.AddPart(new EntityIdAbilityModel {Id = DataType.ABILITY_RadiantWard})
.AddPart(new EntityIdPassiveModel(){Id = DataType.PASSIVE_SiroccoScript})
}, },
{ {
@ -829,7 +843,8 @@ public class DATA
{ {
Name = "Absolver", Descriptive = DescriptiveType.Zone_Control, Name = "Absolver", Descriptive = DescriptiveType.Zone_Control,
Description = Description =
"Zone Control (Ground Unit) - Deploys to gain increased rate of fire to hold a position. Can only attack ground." "Zone Control (Ground Unit) - Deploys to gain increased rate of fire to hold a position. Can only attack ground.",
Notes = "Deploy time is 2 seconds. Mobilize time is 1.5 seconds."
}) })
.AddPart(new EntityTierModel { Tier = 2 }) .AddPart(new EntityTierModel { Tier = 2 })
.AddPart(new EntityHotkeyModel { Hotkey = "F", HotkeyGroup = "Z" }) .AddPart(new EntityHotkeyModel { Hotkey = "F", HotkeyGroup = "Z" })
@ -886,7 +901,7 @@ public class DATA
.AddPart(new EntityWeaponModel .AddPart(new EntityWeaponModel
{ Damage = 8, Range = 500, AttacksPerSecond = 1.429f, Targets = TargetType.Ground }) { Damage = 8, Range = 500, AttacksPerSecond = 1.429f, Targets = TargetType.Ground })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_RelicOfTheWrathfulGaze }) .AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_RelicOfTheWrathfulGaze })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_Maledictions }) .AddPart(new EntityIdAbilityModel { Id = DataType.ABILITY_Maledictions })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_RelicOfTheWrathfulGaze }) .AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_RelicOfTheWrathfulGaze })
}, },
{ {
@ -922,6 +937,8 @@ public class DATA
Damage = 60, MediumDamage = 80, HeavyDamage = 100, Range = 1300, AttacksPerSecond = 0.143f, Damage = 60, MediumDamage = 80, HeavyDamage = 100, Range = 1300, AttacksPerSecond = 0.143f,
Targets = TargetType.Ground Targets = TargetType.Ground
}) })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_HallowedRuin })
}, },
{ {
DataType.UNIT_Sentinel, DataType.UNIT_Sentinel,
@ -1059,6 +1076,7 @@ public class DATA
.AddPart(new EntityMovementModel { Speed = 400, Movement = MovementType.Ground }) .AddPart(new EntityMovementModel { Speed = 400, Movement = MovementType.Ground })
.AddPart(new EntityWeaponModel .AddPart(new EntityWeaponModel
{ Damage = 8, Range = 40, AttacksPerSecond = 1.25f, Targets = TargetType.Ground }) { Damage = 8, Range = 40, AttacksPerSecond = 1.25f, Targets = TargetType.Ground })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_HarvestAlloy })
}, },
{ {
DataType.UNIT_MaskedHunter, DataType.UNIT_MaskedHunter,
@ -1088,6 +1106,7 @@ public class DATA
{ Damage = 7, Range = 400, AttacksPerSecond = 1.4f, Targets = TargetType.All, HeavyDamage = 6 }) { Damage = 7, Range = 400, AttacksPerSecond = 1.4f, Targets = TargetType.All, HeavyDamage = 6 })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_Offering }) .AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_Offering })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_BloodMothersFevor }) .AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_BloodMothersFevor })
.AddPart(new EntityIdPassiveModel { Id = DataType.ABILITY_Offering })
}, },
{ {
DataType.UNIT_Xacal, DataType.UNIT_Xacal,
@ -1148,6 +1167,8 @@ public class DATA
Targets = TargetType.Ground Targets = TargetType.Ground
}) })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_QuenchingScythes }) .AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_QuenchingScythes })
.AddPart(new EntityIdPassiveModel { Id = DataType.ABILITY_CullingStrike })
}, },
{ {
DataType.UNIT_RedSeer, DataType.UNIT_RedSeer,
@ -1311,6 +1332,8 @@ public class DATA
TargetType.Air TargetType.Air
}) })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_AaroxBurn }) .AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_AaroxBurn })
.AddPart(new EntityIdAbilityModel() { Id = DataType.ABILITY_DiveBomb })
}, },
{ {
DataType.UNIT_Thrum, DataType.UNIT_Thrum,
@ -1355,6 +1378,7 @@ public class DATA
.AddPart(new EntityWeaponModel .AddPart(new EntityWeaponModel
{ Damage = 9, Range = 500, AttacksPerSecond = 0.714f, Targets = TargetType.Ground }) { Damage = 9, Range = 500, AttacksPerSecond = 0.714f, Targets = TargetType.Ground })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_GuidingAmber }) .AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_GuidingAmber })
.AddPart(new EntityIdPassiveModel() { Id = DataType.PASSIVE_WraithBowRange })
}, },
{ {
DataType.UNIT_Behemoth, DataType.UNIT_Behemoth,
@ -1383,7 +1407,7 @@ public class DATA
Targets = TargetType.Ground Targets = TargetType.Ground
}) })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_BehemothCapacity }) .AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_BehemothCapacity })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_QuitlStorage }) .AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_BehemothCapacity })
.AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_QuitlStorage2 }) .AddPart(new EntityIdPassiveModel { Id = DataType.PASSIVE_QuitlStorage2 })
@ -1417,6 +1441,19 @@ public class DATA
}) })
}, },
{
DataType.UPGRADE_RadiantWard,
new EntityModel(DataType.UPGRADE_RadiantWard, EntityType.Tech)
.AddPart(new EntityInfoModel
{
Name = "Research Radiant Ward", Descriptive = DescriptiveType.Upgrade,
Description = "Unlocks the dervish's Radiant Ward ability"
})
.AddPart(new EntityHotkeyModel { Hotkey = "V", HotkeyGroup = "TAB" })
.AddPart(new EntityFactionModel { Faction = FactionType.QRath })
.AddPart(new EntityProductionModel { Alloy = 80, Ether = 80, BuildTime = 34 })
},
{ {
DataType.UPGRADE_FortifiedIcons, DataType.UPGRADE_FortifiedIcons,
new EntityModel(DataType.UPGRADE_FortifiedIcons, EntityType.Tech) new EntityModel(DataType.UPGRADE_FortifiedIcons, EntityType.Tech)
@ -1498,7 +1535,7 @@ public class DATA
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ {
Name = "Sirocco Script", Descriptive = DescriptiveType.Upgrade, Name = "Sirocco Script", Descriptive = DescriptiveType.Upgrade,
Description = "Increases the Dervish's movement speed by 50%." Description = "Grant's the Dervish Sirocco Script"
}) })
.AddPart(new EntityHotkeyModel { Hotkey = "F", HotkeyGroup = "TAB" }) .AddPart(new EntityHotkeyModel { Hotkey = "F", HotkeyGroup = "TAB" })
.AddPart(new EntityFactionModel { Faction = FactionType.QRath }) .AddPart(new EntityFactionModel { Faction = FactionType.QRath })
@ -1563,7 +1600,10 @@ public class DATA
DataType.UPGRADE_Offering, DataType.UPGRADE_Offering,
new EntityModel(DataType.UPGRADE_Offering, EntityType.Tech) new EntityModel(DataType.UPGRADE_Offering, EntityType.Tech)
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ Name = "Offering", Descriptive = DescriptiveType.Upgrade, Description = "Unlocks Offering" }) {
Name = "Offering",
Descriptive = DescriptiveType.Upgrade,
Description = "Unlocks Offering" })
.AddPart(new EntityHotkeyModel { Hotkey = "W", HotkeyGroup = "TAB" }) .AddPart(new EntityHotkeyModel { Hotkey = "W", HotkeyGroup = "TAB" })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityRequirementModel .AddPart(new EntityRequirementModel
@ -1684,9 +1724,47 @@ public class DATA
Requirement = RequirementType.Research_Building Requirement = RequirementType.Research_Building
}) })
.AddPart(new EntityProductionModel { Alloy = 50, Ether = 75, BuildTime = 29 }) .AddPart(new EntityProductionModel { Alloy = 50, Ether = 75, BuildTime = 29 })
.AddPart(new EntityIdUpgradeModel { Id = DataType.UPGRADE_WraithBowRange })
.AddPart(new EntityIdPassiveModel() { Id = DataType.PASSIVE_WraithBowRange })
}, },
{
DataType.UPGRADE_Stalk,
new EntityModel(DataType.UPGRADE_Stalk, EntityType.Tech)
.AddPart(new EntityInfoModel
{
Name = "Research Stalk",
Description = "Unlocks the Bone Stalker's Stabilize",
Descriptive = DescriptiveType.Upgrade
})
.AddPart(new EntityHotkeyModel { Hotkey = "W", HotkeyGroup = "TAB", HoldSpace = false })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityRequirementModel
{
Id = DataType.BUILDING_Neurocyte,
Requirement = RequirementType.Research_Building
})
.AddPart(new EntityProductionModel { Alloy = 100, Ether = 80, BuildTime = 60 })
},
{
DataType.UPGRADE_Ambush,
new EntityModel(DataType.UPGRADE_Ambush, EntityType.Tech)
.AddPart(new EntityInfoModel
{
Name = "Research Ambush",
Description = "When Hidden, the Bone Stalker's next attack deals double damage",
Descriptive = DescriptiveType.Upgrade
})
.AddPart(new EntityHotkeyModel { Hotkey = "V", HotkeyGroup = "TAB", HoldSpace = false })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityRequirementModel
{
Id = DataType.BUILDING_RedVale,
Requirement = RequirementType.Research_Building
})
.AddPart(new EntityProductionModel { Alloy = 100, Ether = 125, BuildTime = 80 })
},
{ {
DataType.UPGRADE_BloodPlague, DataType.UPGRADE_BloodPlague,
new EntityModel(DataType.UPGRADE_BloodPlague, EntityType.Tech) new EntityModel(DataType.UPGRADE_BloodPlague, EntityType.Tech)
@ -1726,7 +1804,7 @@ public class DATA
// Neutral // Neutral
{ {
DataType.PASSIVE_BastionPassives, DataType.PASSIVE_BastionPassives,
new EntityModel(DataType.PASSIVE_Respite, EntityType.Passive) new EntityModel(DataType.PASSIVE_BastionPassives, EntityType.Passive)
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ {
Name = "(Scouts and Pyre)", Descriptive = DescriptiveType.Passive, Name = "(Scouts and Pyre)", Descriptive = DescriptiveType.Passive,
@ -1742,7 +1820,7 @@ public class DATA
{ {
Name = "Respite", Descriptive = DescriptiveType.Passive, Name = "Respite", Descriptive = DescriptiveType.Passive,
Description = Description =
@"Nearby units will slowly heal after not attacking for several seconds." @"Nearby units will slowly heal after not attacking or being attacked for 10 seconds."
}) })
.AddPart(new EntityFactionModel { Faction = FactionType.Any }) .AddPart(new EntityFactionModel { Faction = FactionType.Any })
}, },
@ -1854,6 +1932,18 @@ public class DATA
.AddPart(new EntityFactionModel { Faction = FactionType.QRath }) .AddPart(new EntityFactionModel { Faction = FactionType.QRath })
}, },
{
DataType.PASSIVE_SiroccoScript,
new EntityModel(DataType.PASSIVE_SiroccoScript, EntityType.Passive)
.AddPart(new EntityInfoModel
{
Name = "Sirocco Script Rites", Descriptive = DescriptiveType.Passive,
Description = @"Increases the derish's movement speed"
})
.AddPart(new EntityRequirementModel(){ Id = DataType.UPGRADE_SiroccoScript})
.AddPart(new EntityFactionModel { Faction = FactionType.QRath })
},
{ {
DataType.PASSIVE_HallowingRites, DataType.PASSIVE_HallowingRites,
new EntityModel(DataType.PASSIVE_HallowingRites, EntityType.Passive) new EntityModel(DataType.PASSIVE_HallowingRites, EntityType.Passive)
@ -1956,8 +2046,8 @@ public class DATA
}, },
{ {
DataType.PASSIVE_QuitlStorage, DataType.PASSIVE_BehemothCapacity,
new EntityModel(DataType.PASSIVE_QuitlStorage, EntityType.Passive) new EntityModel(DataType.PASSIVE_BehemothCapacity, EntityType.Passive)
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ {
Name = "Quitl Storage", Descriptive = DescriptiveType.Passive, Name = "Quitl Storage", Descriptive = DescriptiveType.Passive,
@ -2000,17 +2090,7 @@ public class DATA
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
}, },
{
DataType.PASSIVE_RadiantWard,
new EntityModel(DataType.PASSIVE_RadiantWard, EntityType.Passive)
.AddPart(new EntityInfoModel
{
Name = "Radiant Ward", Descriptive = DescriptiveType.Applies_Debuff,
Description = @"This unit is revealed?",
Notes = "Not implemented."
})
.AddPart(new EntityFactionModel { Faction = FactionType.QRath })
},
{ {
DataType.PASSIVE_Stalk, DataType.PASSIVE_Stalk,
@ -2018,10 +2098,11 @@ public class DATA
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ {
Name = "Stalk", Descriptive = DescriptiveType.Passive, Name = "Stalk", Descriptive = DescriptiveType.Passive,
Description = @"This unit has hidden when stabilized.", Description = @"After remaining stationary for several seconds, gain Hidden 3 and a movement speed boost.",
Notes = "Not implemented." Notes = "Lose hidden on attacking"
}) })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityRequirementModel{Id=DataType.UPGRADE_Stalk})
}, },
{ {
@ -2029,9 +2110,20 @@ public class DATA
new EntityModel(DataType.PASSIVE_Stalk, EntityType.Passive) new EntityModel(DataType.PASSIVE_Stalk, EntityType.Passive)
.AddPart(new EntityInfoModel .AddPart(new EntityInfoModel
{ {
Name = "Stalk", Descriptive = DescriptiveType.Passive, Name = "Ambush", Descriptive = DescriptiveType.Passive,
Description = @"This unit deals double damage when attacking from hidden.", Description = @"This unit deals double damage when attacking from hidden.",
Notes = "Not implemented." })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityRequirementModel(){Id=DataType.UPGRADE_Ambush})
},
{
DataType.PASSIVE_HiddenX,
new EntityModel(DataType.PASSIVE_HiddenX, EntityType.Passive)
.AddPart(new EntityInfoModel
{
Name = "Hidden X", Descriptive = DescriptiveType.Passive,
Description = @"This unit cannot be seen unless enemies units are within X.",
}) })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
}, },
@ -2085,19 +2177,6 @@ public class DATA
.AddPart(new EntityRequirementModel(){ Id = DataType.UPGRADE_FortifiedIcons, Requirement = RequirementType.Research_Upgrade}) .AddPart(new EntityRequirementModel(){ Id = DataType.UPGRADE_FortifiedIcons, Requirement = RequirementType.Research_Upgrade})
.AddPart(new EntityFactionModel { Faction = FactionType.QRath }) .AddPart(new EntityFactionModel { Faction = FactionType.QRath })
}, },
{
DataType.PASSIVE_Maledictions,
new EntityModel(DataType.PASSIVE_Maledictions, EntityType.Passive)
.AddPart(new EntityInfoModel
{
Name = "Maledictions", Descriptive = DescriptiveType.Applies_Debuff,
Description = @"Stun ground unit? With Maledictions spell.",
Notes = "Not implemented"
})
.AddPart(new EntityFactionModel { Faction = FactionType.QRath })
},
{ {
DataType.PASSIVE_MendingCommand, DataType.PASSIVE_MendingCommand,
new EntityModel(DataType.PASSIVE_MendingCommand, EntityType.Passive) new EntityModel(DataType.PASSIVE_MendingCommand, EntityType.Passive)
@ -2246,6 +2325,32 @@ public class DATA
// Abilities // Abilities
// Q'Rath // Q'Rath
{
DataType.ABILITY_RadiantWard,
new EntityModel(DataType.ABILITY_RadiantWard, EntityType.Ability)
.AddPart(new EntityInfoModel
{
Name = "Radiant Ward", Descriptive = DescriptiveType.Ability,
Description = @"Spawns a mine that reveals enemy units, slows them, and makes them take increased damage for a duration.",
})
.AddPart(new EntityFactionModel { Faction = FactionType.QRath })
.AddPart(new EntityProductionModel { DefensiveLayer = 30, Cooldown = 40} )
.AddPart(new EntityRequirementModel { Id = DataType.UPGRADE_RadiantWard })
.AddPart(new EntityVitalityModel {Health = 30, DefenseLayer = 30, Lasts = 30, Armor = ArmorType.Light, IsStructure = true})
},
{
DataType.ABILITY_Maledictions,
new EntityModel(DataType.ABILITY_Maledictions, EntityType.Ability)
.AddPart(new EntityInfoModel
{
Name = "Maledictions", Descriptive = DescriptiveType.Ability,
Description = @"Stun ground unit? With Maledictions spell.",
Notes = "Not implemented"
})
.AddPart(new EntityFactionModel { Faction = FactionType.QRath })
},
{ {
DataType.ABILITY_BladesOfTheGodhead, DataType.ABILITY_BladesOfTheGodhead,
new EntityModel(DataType.ABILITY_BladesOfTheGodhead, EntityType.Ability) new EntityModel(DataType.ABILITY_BladesOfTheGodhead, EntityType.Ability)
@ -2368,10 +2473,12 @@ public class DATA
{ {
Name = "Offering", Descriptive = DescriptiveType.Ability, Name = "Offering", Descriptive = DescriptiveType.Ability,
Description = Description =
"Sacrifices 10 life to increase range, speed, and attack speed for several seconds." "Sacrifices 10 life to give Masked Hunters +3 damage for 3 shots. And increased speed and attack speed."
}) })
.AddPart(new EntityHotkeyModel { Hotkey = "E", HotkeyGroup = "D" }) .AddPart(new EntityHotkeyModel { Hotkey = "E", HotkeyGroup = "D" })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityRequirementModel(){ Id= DataType.UPGRADE_Offering})
}, },
{ {
DataType.ABILITY_DiveBomb, DataType.ABILITY_DiveBomb,
@ -2405,7 +2512,7 @@ public class DATA
{ {
Name = "Lethal Bond", Descriptive = DescriptiveType.Ability, Name = "Lethal Bond", Descriptive = DescriptiveType.Ability,
Description = Description =
"After a short delay, enemy units in the target area receive a debuff which causes them to take double damage from all attacks for a duration." "After a short delay, enemy units in the target area receive a debuff which causes them to take double damage from all attacks for a duration. Also gives the White Wood Reaper invisibility if it affects at least 1 enemy"
}) })
.AddPart(new EntityHotkeyModel { Hotkey = "R", HotkeyGroup = "D" }) .AddPart(new EntityHotkeyModel { Hotkey = "R", HotkeyGroup = "D" })
.AddPart(new EntityVanguardAddedModel .AddPart(new EntityVanguardAddedModel
@ -2484,7 +2591,7 @@ public class DATA
Description = Description =
"Deals damage over time in an area and marks affected units for several seconds. Units that die while marked spawn a quitl.", "Deals damage over time in an area and marks affected units for several seconds. Units that die while marked spawn a quitl.",
Notes = Notes =
"Deals 20 damage + 15% of max life of the target immediately upon affecting the enemy unit. It deals the same damage again after 8 seconds. If the unit dies during those 8 seconds (including the final burst), spawns 1 quitl every 2 supply of the dead unit, rounded up" "Deals 10 damage + 5% of max life of the target immediately upon affecting the enemy unit. It deals 15 damage + 15% after 8 seconds. If the unit dies during those 8 seconds (including the final burst), spawns 1 quitl every 2 supply of the dead unit, rounded up. Stacking only refreshes duration of debuff."
}) })
.AddPart(new EntityHotkeyModel { Hotkey = "W", HotkeyGroup = "D" }) .AddPart(new EntityHotkeyModel { Hotkey = "W", HotkeyGroup = "D" })
.AddPart(new EntityVanguardAddedModel { ImmortalId = DataType.IMMORTAL_Mala }) .AddPart(new EntityVanguardAddedModel { ImmortalId = DataType.IMMORTAL_Mala })
@ -2530,6 +2637,7 @@ public class DATA
.AddPart(new EntityMovementModel { Speed = 210, Movement = MovementType.Ground }) .AddPart(new EntityMovementModel { Speed = 210, Movement = MovementType.Ground })
.AddPart(new EntityWeaponModel .AddPart(new EntityWeaponModel
{ Damage = 125, Range = 1500, AttacksPerSecond = 0.175f, Targets = TargetType.Ground }) { Damage = 125, Range = 1500, AttacksPerSecond = 0.175f, Targets = TargetType.Ground })
.AddPart(new EntityIdPassiveModel(){Id = DataType.PASSIVE_HiddenX})
}, },
// Pyre Spells // Pyre Spells
// Q'Rath // Q'Rath
@ -2691,16 +2799,19 @@ public class DATA
{ {
DataType.ISPELL_MarkPrey, DataType.ISPELL_MarkPrey,
new EntityModel(DataType.ISPELL_MarkPrey, EntityType.Pyre_Spell) new EntityModel(DataType.ISPELL_MarkPrey, EntityType.Pyre_Spell)
.AddPart(new EntityInfoModel { Name = "Mark Prey", Description = "Knowing where things are lets you hunt them?", Notes = "Not implemented."}) .AddPart(new EntityInfoModel { Name = "Mark Prey",
Description = @"Enemy units in the target area are <b>Revealed</b> through fog of war. Units still in the area after a short delay are marked for 10 seconds to take bonus damage and provide Pyre when killed.",
Notes = "+3 pyre for kills"
})
.AddPart(new EntityHotkeyModel { Hotkey = "E", HotkeyGroup = "1" }) .AddPart(new EntityHotkeyModel { Hotkey = "E", HotkeyGroup = "1" })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityVanguardAddedModel { ImmortalId = DataType.IMMORTAL_Xol }) .AddPart(new EntityVanguardAddedModel { ImmortalId = DataType.IMMORTAL_Xol })
.AddPart(new EntityProductionModel { }) .AddPart(new EntityProductionModel { Cooldown = 15, Pyre = 25})
}, },
{ {
DataType.ISPELL_TheGreatHunt, DataType.ISPELL_TheGreatHunt,
new EntityModel(DataType.ISPELL_TheGreatHunt, EntityType.Pyre_Spell) new EntityModel(DataType.ISPELL_TheGreatHunt, EntityType.Pyre_Spell)
.AddPart(new EntityInfoModel { Name = "The Great Hunt", Description = "Reduces enemy vision to 300."}) .AddPart(new EntityInfoModel { Name = "The Great Hunt", Description = "Enemy unit and structures have their vision reduce to 3 for a short time."})
.AddPart(new EntityHotkeyModel { Hotkey = "R", HotkeyGroup = "1" }) .AddPart(new EntityHotkeyModel { Hotkey = "R", HotkeyGroup = "1" })
.AddPart(new EntityFactionModel { Faction = FactionType.Aru }) .AddPart(new EntityFactionModel { Faction = FactionType.Aru })
.AddPart(new EntityVanguardAddedModel { ImmortalId = DataType.IMMORTAL_Xol }) .AddPart(new EntityVanguardAddedModel { ImmortalId = DataType.IMMORTAL_Xol })

18
Model/Entity/Data/Ids_Entity.cs

@ -115,16 +115,23 @@ public static class DataType
public static string UPGRADE_BloodPlague = "9c207e21-f595-49d0-967d-f30ca8cc3745"; public static string UPGRADE_BloodPlague = "9c207e21-f595-49d0-967d-f30ca8cc3745";
public static string UPGRADE_BirthingStorm = "0cb2f1a4-03b3-491b-9db3-d2d4590ede3a"; public static string UPGRADE_BirthingStorm = "0cb2f1a4-03b3-491b-9db3-d2d4590ede3a";
public static string UPGRADE_RadiantWard = "c8acc6d0-9f26-475a-aff4-4e2b2f9657f2";
public static string UPGRADE_Stalk = "36fbc2c0-e9e3-4f54-a79a-981db908c25c";
public static string UPGRADE_Ambush = "6cf83dc9-717f-4fa9-b417-a3371474a1da";
public static string PASSIVE_WraithBowRange = "196dd8a6-2044-44e1-aac4-fbaa40552699"; public static string PASSIVE_WraithBowRange = "196dd8a6-2044-44e1-aac4-fbaa40552699";
public static string PASSIVE_HiddenX = "7b819996-ffc0-4e07-9c11-c91c5f9d467b";
public static string PASSIVE_Respite = "607c39f4-a957-4a7a-8fc6-a239f9e570ec"; public static string PASSIVE_Respite = "607c39f4-a957-4a7a-8fc6-a239f9e570ec";
public static string PASSIVE_BastionPassives = "ea42b9cb-2456-4ed2-b490-fcfde12c6153"; public static string PASSIVE_BastionPassives = "ea42b9cb-2456-4ed2-b490-fcfde12c6153";
public static string PASSIVE_HallowedWarrior = "fea43ced-33f3-4531-af7d-740c1789fec1"; public static string PASSIVE_HallowedWarrior = "fea43ced-33f3-4531-af7d-740c1789fec1";
public static string PASSIVE_GreavesOfAhqar = "3c408d75-7bee-4089-84c0-74620ac708b6"; public static string PASSIVE_GreavesOfAhqar = "3c408d75-7bee-4089-84c0-74620ac708b6";
public static string PASSIVE_FortifiedIcons = "35f3f02f-e22e-44be-b2ea-82972c383308"; public static string PASSIVE_FortifiedIcons = "35f3f02f-e22e-44be-b2ea-82972c383308";
public static string PASSIVE_Maledictions = "6cdc109c-157d-433a-b225-192e39c0b613";
public static string PASSIVE_HarvestAlloy = "84bacf5a-b106-455c-8cff-66c3998404f8"; public static string PASSIVE_HarvestAlloy = "84bacf5a-b106-455c-8cff-66c3998404f8";
public static string PASSIVE_RelicOfTheWrathfulGaze = "ccebc0c9-cfd5-465a-8a5d-2495bd745a83"; public static string PASSIVE_RelicOfTheWrathfulGaze = "ccebc0c9-cfd5-465a-8a5d-2495bd745a83";
@ -139,6 +146,8 @@ public static class DataType
public static string PASSIVE_ThroneMovingShot = "699423ed-7410-4daf-8b07-9dc733a8bf55"; public static string PASSIVE_ThroneMovingShot = "699423ed-7410-4daf-8b07-9dc733a8bf55";
public static string PASSIVE_SiroccoScript = "11c21afa-ff88-4e42-9f97-a1d1595b115c";
public static string PASSIVE_HallowingRites = "9c8ae47b-954e-4a17-8f35-f128c9114b61"; public static string PASSIVE_HallowingRites = "9c8ae47b-954e-4a17-8f35-f128c9114b61";
public static string PASSIVE_RegentsWrath = "f111f004-6548-4430-9d13-ef44ab108ae7"; public static string PASSIVE_RegentsWrath = "f111f004-6548-4430-9d13-ef44ab108ae7";
public static string PASSIVE_PsalmOfFire = "d28f6b7c-d319-4fb8-bdd4-92ede40a0751"; public static string PASSIVE_PsalmOfFire = "d28f6b7c-d319-4fb8-bdd4-92ede40a0751";
@ -146,10 +155,9 @@ public static class DataType
public static string PASSIVE_HallowedGround = "bdb28984-246f-4642-84ab-9e83c02b3e2e"; public static string PASSIVE_HallowedGround = "bdb28984-246f-4642-84ab-9e83c02b3e2e";
public static string PASSIVE_CastFromLife = "3cc734de-f8e7-4e69-9fa5-bdf725c4941b"; public static string PASSIVE_CastFromLife = "3cc734de-f8e7-4e69-9fa5-bdf725c4941b";
public static string PASSIVE_Rootway = "46768d4a-5047-4973-b5ca-995cda25ee8d"; public static string PASSIVE_Rootway = "46768d4a-5047-4973-b5ca-995cda25ee8d";
public static string PASSIVE_QuitlStorage = "a210f109-d3ac-44d4-9724-601c795a2394"; public static string PASSIVE_BehemothCapacity = "a210f109-d3ac-44d4-9724-601c795a2394";
public static string PASSIVE_QuitlStorage2 = "0b27b863-fce5-40e4-96c7-6df94bdd92b9"; public static string PASSIVE_QuitlStorage2 = "0b27b863-fce5-40e4-96c7-6df94bdd92b9";
public static string PASSIVE_Temporary = "940c04f1-df0b-4cf7-9514-09dfd9009554"; public static string PASSIVE_Temporary = "940c04f1-df0b-4cf7-9514-09dfd9009554";
public static string PASSIVE_RadiantWard = "db1fc8bd-d86a-4eda-b83c-16e8d0ce4f81";
public static string PASSIVE_Stalk = "9c107bfd-0050-4670-91b8-f9a8d771225d"; public static string PASSIVE_Stalk = "9c107bfd-0050-4670-91b8-f9a8d771225d";
public static string PASSIVE_Ambush = "9d0a9482-0303-4a15-bb88-972f6ae60a39"; public static string PASSIVE_Ambush = "9d0a9482-0303-4a15-bb88-972f6ae60a39";
@ -177,6 +185,10 @@ public static class DataType
public static string PASSIVE_FireQuitl = "80f6b382-da1c-49a1-8235-1ea37983ea54"; public static string PASSIVE_FireQuitl = "80f6b382-da1c-49a1-8235-1ea37983ea54";
public static string PASSIVE_XacalDamage = "69928f20-5332-418f-ada3-694da3f7b199"; public static string PASSIVE_XacalDamage = "69928f20-5332-418f-ada3-694da3f7b199";
public static string ABILITY_RadiantWard = "db1fc8bd-d86a-4eda-b83c-16e8d0ce4f81";
public static string ABILITY_Maledictions = "6cdc109c-157d-433a-b225-192e39c0b613";
public static string ABILITY_BladesOfTheGodhead = "000154ac-faf5-483d-b0bd-e84335891a27"; public static string ABILITY_BladesOfTheGodhead = "000154ac-faf5-483d-b0bd-e84335891a27";
public static string ABILITY_Windstep = "a410b296-39f7-42e0-87c8-6cef11eb967c"; public static string ABILITY_Windstep = "a410b296-39f7-42e0-87c8-6cef11eb967c";
public static string ABILITY_Leap = "aa155b88-125a-4d25-b63f-77987ea6e519"; public static string ABILITY_Leap = "aa155b88-125a-4d25-b63f-77987ea6e519";

2
Model/Entity/EntityModel.cs

@ -12,7 +12,7 @@ namespace Model.Entity;
public class EntityModel public class EntityModel
{ {
public static readonly string GameVersion = "0.0.6.8900a"; public static readonly string GameVersion = "0.0.6.9121a";
private static Dictionary<string, EntityModel> _database= null!; private static Dictionary<string, EntityModel> _database= null!;

2
Model/Entity/Parts/EntityProductionModel.cs

@ -10,6 +10,8 @@ public class EntityProductionModel : IEntityPartInterface
public int Pyre { get; set; } = 0; public int Pyre { get; set; } = 0;
public int Energy { get; set; } = 0; public int Energy { get; set; } = 0;
public int DefensiveLayer { get; set; } = 0;
public int BuildTime { get; set; } = 0; public int BuildTime { get; set; } = 0;
// Remove cooldown as a cost, and move into ability stats // Remove cooldown as a cost, and move into ability stats

2
Model/Entity/Parts/EntityVitalityModel.cs

@ -7,6 +7,8 @@ public class EntityVitalityModel : IEntityPartInterface
public string Type { get; set; } = "EntityVitalityModel"; public string Type { get; set; } = "EntityVitalityModel";
public int Health { get; set; } = 0; public int Health { get; set; } = 0;
public int DefenseLayer { get; set; } = 0; public int DefenseLayer { get; set; } = 0;
public int Lasts { get; set; } = 0;
public string Defense { get; set; } = DefenseType.None; public string Defense { get; set; } = DefenseType.None;
public string Armor { get; set; } = ArmorType.Light; public string Armor { get; set; } = ArmorType.Light;
public bool IsEtheric { get; set; } = false; public bool IsEtheric { get; set; } = false;

11
Services/IServices.cs

@ -244,6 +244,17 @@ public interface IMemoryTesterService {
public void Unsubscribe(MemoryAction memoryAction); public void Unsubscribe(MemoryAction memoryAction);
} }
public interface IGameLogicService
{
public bool Add(EntityModel entity, int atInterval);
public int MeetsRequirements(EntityModel entity, int interval);
public int MeetsAlloy(EntityModel entity, int interval);
public int MeetsEther(EntityModel entity, int interval);
public int MeetsPyre(EntityModel entity, int interval);
public int MeetsSupply(EntityModel entity, int interval);
public int MeetsTrainingQueue(EntityModel entity, int interval);
}
public interface IBuildOrderService { public interface IBuildOrderService {
public bool Add(EntityModel entity, IEconomyService withEconomy, IToastService toastService); public bool Add(EntityModel entity, IEconomyService withEconomy, IToastService toastService);
public void Add(EntityModel entity, int atInterval); public void Add(EntityModel entity, int atInterval);

2
Services/Immortal/BuildComparisionService.cs

@ -72,7 +72,7 @@ public class BuildComparisionService : IBuildComparisonService {
public void HydratedLoadedJson() { public void HydratedLoadedJson() {
foreach (var build in buildComparison.Builds) foreach (var build in buildComparison.Builds)
foreach (var orders in build.Orders.Values) foreach (var orders in build.StartedOrders.Values)
foreach (var order in orders) foreach (var order in orders)
order.Copy(EntityModel.Get(order.DataType)); order.Copy(EntityModel.Get(order.DataType));
} }

82
Services/Immortal/BuildOrderService.cs

@ -22,7 +22,7 @@ public class BuildOrderService : IBuildOrderService
public Dictionary<int, List<EntityModel>> GetOrders() public Dictionary<int, List<EntityModel>> GetOrders()
{ {
return buildOrder.Orders; return buildOrder.StartedOrders;
} }
public void Subscribe(Action action) public void Subscribe(Action action)
@ -37,10 +37,26 @@ public class BuildOrderService : IBuildOrderService
public void Add(EntityModel entity, int atInterval) public void Add(EntityModel entity, int atInterval)
{ {
if (!buildOrder.Orders.ContainsKey(atInterval)) if (!buildOrder.StartedOrders.ContainsKey(atInterval))
buildOrder.Orders.Add(atInterval, new List<EntityModel> { entity.Clone() }); {
else buildOrder.StartedOrders.Add(atInterval, new List<EntityModel> { });
buildOrder.Orders[atInterval].Add(entity.Clone()); }
var production = entity.Production();
var completedTime = atInterval;
if (production != null)
{
completedTime += production.BuildTime;
}
if (!buildOrder.CompletedOrders.ContainsKey(atInterval))
{
buildOrder.CompletedOrders.Add(completedTime, new List<EntityModel> { });
}
buildOrder.StartedOrders[atInterval].Add(entity.Clone());
buildOrder.CompletedOrders[completedTime].Add(entity.Clone());
if (atInterval > lastInterval) lastInterval = atInterval; if (atInterval > lastInterval) lastInterval = atInterval;
} }
@ -72,10 +88,10 @@ public class BuildOrderService : IBuildOrderService
//Account for human Micro delay //Account for human Micro delay
interval += HumanMicro; interval += HumanMicro;
if (!buildOrder.Orders.ContainsKey(interval)) if (!buildOrder.StartedOrders.ContainsKey(interval))
buildOrder.Orders.Add(interval, new List<EntityModel> { entity.Clone() }); buildOrder.StartedOrders.Add(interval, new List<EntityModel> { entity.Clone() });
else else
buildOrder.Orders[interval].Add(entity.Clone()); buildOrder.StartedOrders[interval].Add(entity.Clone());
lastInterval = interval; lastInterval = interval;
@ -109,20 +125,20 @@ public class BuildOrderService : IBuildOrderService
EntityModel entityRemoved = null!; EntityModel entityRemoved = null!;
if (buildOrder.Orders.Keys.Count > 1) if (buildOrder.StartedOrders.Keys.Count > 1)
{ {
var last = buildOrder.Orders.Keys.Last(); var last = buildOrder.StartedOrders.Keys.Last();
if (buildOrder.Orders[last].Count > 0) if (buildOrder.StartedOrders[last].Count > 0)
{ {
entityRemoved = buildOrder.Orders[last].Last(); entityRemoved = buildOrder.StartedOrders[last].Last();
buildOrder.Orders[last].Remove(buildOrder.Orders[last].Last()); buildOrder.StartedOrders[last].Remove(buildOrder.StartedOrders[last].Last());
} }
if (buildOrder.Orders[last].Count == 0) buildOrder.Orders.Remove(last); if (buildOrder.StartedOrders[last].Count == 0) buildOrder.StartedOrders.Remove(last);
if (buildOrder.Orders.Keys.Count > 0) if (buildOrder.StartedOrders.Keys.Count > 0)
lastInterval = buildOrder.Orders.Keys.Last() + 1; lastInterval = buildOrder.StartedOrders.Keys.Last() + 1;
else else
lastInterval = 1; lastInterval = 1;
@ -158,23 +174,27 @@ public class BuildOrderService : IBuildOrderService
public List<EntityModel> GetOrdersAt(int interval) public List<EntityModel> GetOrdersAt(int interval)
{ {
return (from ordersAtTime in buildOrder.Orders if (!buildOrder.StartedOrders.ContainsKey(interval))
from orders in ordersAtTime.Value {
where ordersAtTime.Key == interval return new List<EntityModel>();
select orders).ToList(); }
return buildOrder.StartedOrders[interval].ToList();
} }
public List<EntityModel> GetCompletedAt(int interval) public List<EntityModel> GetCompletedAt(int interval)
{ {
return (from ordersAtTime in buildOrder.Orders if (!buildOrder.CompletedOrders.ContainsKey(interval))
from orders in ordersAtTime.Value {
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) == interval return new List<EntityModel>();
select orders).ToList(); }
return buildOrder.CompletedOrders[interval].ToList();
} }
public List<EntityModel> GetCompletedBefore(int interval) public List<EntityModel> GetCompletedBefore(int interval)
{ {
return (from ordersAtTime in buildOrder.Orders return (from ordersAtTime in buildOrder.StartedOrders
from orders in ordersAtTime.Value from orders in ordersAtTime.Value
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
select orders).ToList(); select orders).ToList();
@ -182,7 +202,7 @@ public class BuildOrderService : IBuildOrderService
public List<EntityModel> GetHarvestersCompletedBefore(int interval) public List<EntityModel> GetHarvestersCompletedBefore(int interval)
{ {
return (from ordersAtTime in buildOrder.Orders return (from ordersAtTime in buildOrder.StartedOrders
from orders in ordersAtTime.Value from orders in ordersAtTime.Value
where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval where ordersAtTime.Key + (orders.Production() == null ? 0 : orders.Production().BuildTime) <= interval
where orders.Harvest() != null where orders.Harvest() != null
@ -197,14 +217,14 @@ public class BuildOrderService : IBuildOrderService
foreach (var requirement in requirements) foreach (var requirement in requirements)
if (requirement.Requirement == RequirementType.Morph) if (requirement.Requirement == RequirementType.Morph)
{ {
var entitiesNeeded = from entitiesAtInterval in buildOrder.Orders var entitiesNeeded = from entitiesAtInterval in buildOrder.StartedOrders
from requiredEntity in entitiesAtInterval.Value from requiredEntity in entitiesAtInterval.Value
where requestedInterval > entitiesAtInterval.Key + where requestedInterval > entitiesAtInterval.Key +
(requiredEntity.Production() == null ? 0 : requiredEntity.Production().BuildTime) (requiredEntity.Production() == null ? 0 : requiredEntity.Production().BuildTime)
where requiredEntity.DataType == requirement.Id where requiredEntity.DataType == requirement.Id
select requiredEntity; select requiredEntity;
var entitiesAlreadyMorphed = from entitiesAtInterval in buildOrder.Orders var entitiesAlreadyMorphed = from entitiesAtInterval in buildOrder.StartedOrders
from existingEntity in entitiesAtInterval.Value from existingEntity in entitiesAtInterval.Value
where existingEntity.DataType == entity.DataType where existingEntity.DataType == entity.DataType
select existingEntity; select existingEntity;
@ -214,7 +234,7 @@ public class BuildOrderService : IBuildOrderService
} }
else else
{ {
var entitiesNeeded = from entitiesAtInterval in buildOrder.Orders var entitiesNeeded = from entitiesAtInterval in buildOrder.StartedOrders
from requiredEntity in entitiesAtInterval.Value from requiredEntity in entitiesAtInterval.Value
where requestedInterval > entitiesAtInterval.Key + where requestedInterval > entitiesAtInterval.Key +
(requiredEntity.Production() == null ? 0 : requiredEntity.Production().BuildTime) (requiredEntity.Production() == null ? 0 : requiredEntity.Production().BuildTime)
@ -279,14 +299,14 @@ public class BuildOrderService : IBuildOrderService
var supplyTakenTotal = 0; var supplyTakenTotal = 0;
var supplyTakens = from entitiesAtInterval in buildOrder.Orders var supplyTakens = from entitiesAtInterval in buildOrder.StartedOrders
from supplyTakingEntity in entitiesAtInterval.Value from supplyTakingEntity in entitiesAtInterval.Value
where supplyTakingEntity.Supply()?.Takes > 0 where supplyTakingEntity.Supply()?.Takes > 0
select supplyTakingEntity.Supply().Takes; select supplyTakingEntity.Supply().Takes;
foreach (var supplyTaken in supplyTakens) supplyTakenTotal += supplyTaken; foreach (var supplyTaken in supplyTakens) supplyTakenTotal += supplyTaken;
var supplyGrantedTotal = 0; var supplyGrantedTotal = 0;
var supplyGranteds = from entitiesAtInterval in buildOrder.Orders var supplyGranteds = from entitiesAtInterval in buildOrder.StartedOrders
from supplyGrantingEntity in entitiesAtInterval.Value from supplyGrantingEntity in entitiesAtInterval.Value
where supplyGrantingEntity.Supply()?.Grants > 0 where supplyGrantingEntity.Supply()?.Grants > 0
select supplyGrantingEntity.Supply().Grants; select supplyGrantingEntity.Supply().Grants;

58
Services/Immortal/GameLogicService.cs

@ -0,0 +1,58 @@
using Model.Entity;
using Model.Types;
namespace Services.Immortal;
public class GameLogicService : IGameLogicService
{
private ITimingService timingService;
private IEconomyService economyService;
private IBuildOrderService buildOrderService;
public GameLogicService(ITimingService timingService, IEconomyService economyService, IBuildOrderService buildOrderService)
{
this.timingService = timingService;
this.economyService = economyService;
this.buildOrderService = buildOrderService;
}
public bool Add(EntityModel entity, int atInterval)
{
throw new NotImplementedException();
}
public int MeetsRequirements(EntityModel entity, int interval)
{
var buildOrders = buildOrderService.GetCompletedBefore(interval);
return -1;
}
public int MeetsAlloy(EntityModel entity, int interval)
{
throw new NotImplementedException();
}
public int MeetsEther(EntityModel entity, int interval)
{
throw new NotImplementedException();
}
public int MeetsPyre(EntityModel entity, int interval)
{
throw new NotImplementedException();
}
public int MeetsSupply(EntityModel entity, int interval)
{
throw new NotImplementedException();
}
public int MeetsTrainingQueue(EntityModel entity, int interval)
{
throw new NotImplementedException();
}
}

1
Services/Website/NavigationService.cs

@ -63,7 +63,6 @@ public class NavigationService : INavigationService {
webSectionType = section; webSectionType = section;
navSelectionType = NavSelectionType.Section; navSelectionType = NavSelectionType.Section;
Console.WriteLine(webSectionType);
NotifyDataChanged(); NotifyDataChanged();
} }

Loading…
Cancel
Save