feature(BuildCalc) Added reset button, can change micro delay, and can alter timing interval again
This commit is contained in:
Binary file not shown.
+7
-7
@@ -62,13 +62,13 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<_ContentIncludedByDefault Remove="wwwroot\content\notes\coop\image\notes\map-lostprovince\Map_LostProvince.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\CoopBaseLarge.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\DefendPoints.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\EnemySpawns.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\Multipliers.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\OpenBases.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\Pyre.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\content\notes\coop\image\notes\map-lostprovince\Map_LostProvince.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\CoopBaseLarge.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\DefendPoints.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\EnemySpawns.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\Multipliers.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\OpenBases.png" />
|
||||
<_ContentIncludedByDefault Remove="wwwroot\image\notes\coop-holdout\Pyre.png" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
+1
-15
@@ -1,19 +1,5 @@
|
||||
@page "/"
|
||||
@using Microsoft.Extensions.Localization
|
||||
|
||||
@layout PageLayout
|
||||
|
||||
|
||||
@inject IStringLocalizer<Localizations> locale
|
||||
|
||||
<DevOnlyComponent>
|
||||
<DocumentationIndexPage></DocumentationIndexPage>
|
||||
|
||||
@locale["Greeting"].Value
|
||||
@locale["Greeting"]
|
||||
@locale["Greeting"].Name
|
||||
@locale["Greeting"].ResourceNotFound
|
||||
</DevOnlyComponent>
|
||||
|
||||
|
||||
<HomePage></HomePage>
|
||||
<HomePage/>
|
||||
Generated
+6
@@ -104,5 +104,11 @@ namespace IGP {
|
||||
return ResourceManager.GetString("Tooltip Hotkey Info", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string Tooltip_Options_Info {
|
||||
get {
|
||||
return ResourceManager.GetString("Tooltip Options Info", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<root>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root"
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
|
||||
id="root"
|
||||
xmlns="">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
|
||||
@@ -66,4 +67,7 @@ You can also use the default Immortal hotkeys, but the above hotkey UI must have
|
||||
|
||||
Additionally, more entities will appear as you build the required technology. You can click or press ` to remove the last made entity. <i>But you cannot remove the starting entities at interval 0.</i></value>
|
||||
</data>
|
||||
<data name="Tooltip Options Info" xml:space="preserve">
|
||||
<value>Misc calculator controls.</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -17,7 +17,7 @@ else
|
||||
@foreach (var sprint in agileService.AgileSprintModels!
|
||||
.OrderBy(e => e.EndDate).Reverse())
|
||||
{
|
||||
<details class="sprintDisplayContainer @sprint.GetSprintType().ToLower()"
|
||||
<details class="sprintDisplayContainer @sprint.GetSprintType().ToLower()"
|
||||
open="@(sprint.GetSprintType() == SprintType.Current)">
|
||||
<summary class="sprintSummary">
|
||||
<div class="sprintTitle">@sprint.Name</div>
|
||||
@@ -91,8 +91,8 @@ else
|
||||
|
||||
void HasChanged()
|
||||
{
|
||||
if(!agileService.IsLoaded()) return;
|
||||
|
||||
if (!agileService.IsLoaded()) return;
|
||||
|
||||
backlog.Clear();
|
||||
|
||||
foreach (var task in agileService.AgileTaskModels!)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<div class="tasksContainer">
|
||||
@if (AgileSprint.AgileTaskModels.Count > 0)
|
||||
{
|
||||
@foreach (var task in AgileSprint.AgileTaskModels.OrderBy(x=>x.OrderPriority))
|
||||
@foreach (var task in AgileSprint.AgileTaskModels.OrderBy(x => x.OrderPriority))
|
||||
{
|
||||
<div class="taskContainer @task.Status.ToLower() @task.Task.ToLower()">
|
||||
<div class="taskName">@task.Name</div>
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
@inject ITimingService timingService
|
||||
|
||||
@page "/build-calculator"
|
||||
@using Microsoft.Extensions.Localization
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
@@ -20,89 +19,93 @@
|
||||
<AlertComponent Type="@SeverityType.Warning">
|
||||
<Title>Work In Progress and Not Fully Tested</Title>
|
||||
<Message>
|
||||
Currently not considering training queue times. Lacking error toasts for invalid actions. Performance needs to be optimized. Calculations haven't been thoroughly compared against real gameplay. Added a 2 second delay to actions to account for casual micro (will probably tweak later).
|
||||
Currently not considering training queue times.
|
||||
</Message>
|
||||
</AlertComponent>
|
||||
|
||||
<ContentDividerComponent></ContentDividerComponent>
|
||||
|
||||
|
||||
<div class="calculatorGrid">
|
||||
|
||||
<div style="grid-area: timing;" class="gridItem">
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Timing Info"]">
|
||||
|
||||
<TimingComponent></TimingComponent>
|
||||
</InfoTooltipComponent>
|
||||
<div class="gridItem" style="grid-area: timing;">
|
||||
<ButtonComponent OnClick="OnResetClicked">Clear Build Order</ButtonComponent>
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Timing Info"]">
|
||||
<TimingComponent></TimingComponent>
|
||||
</InfoTooltipComponent>
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
|
||||
@if (true)
|
||||
{
|
||||
<div style="grid-area: chart;" class="gridItem">
|
||||
<div class="gridItem" style="grid-area: chart;">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Chart Info"]">
|
||||
<ChartComponent></ChartComponent>
|
||||
</InfoTooltipComponent>
|
||||
</div>
|
||||
}
|
||||
|
||||
<div style="grid-area: filter;" class="gridItem">
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Filter Info"]">
|
||||
<FilterComponent></FilterComponent>
|
||||
</InfoTooltipComponent>
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
@if (true)
|
||||
{
|
||||
<div style="grid-area: view;" class="gridItem">
|
||||
<div class="gridItem" style="grid-area: filter;">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Filter Info"]">
|
||||
<FilterComponent></FilterComponent>
|
||||
</InfoTooltipComponent>
|
||||
</PanelComponent>
|
||||
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Options Info"]">
|
||||
<OptionsComponent></OptionsComponent>
|
||||
</InfoTooltipComponent>
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
<div class="gridItem" style="grid-area: view;">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Entity Info"]">
|
||||
<EntityClickViewComponent/>
|
||||
</InfoTooltipComponent>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (true)
|
||||
{
|
||||
<div style="grid-area: bank;" class="gridItem">
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
<div class="gridItem" style="grid-area: bank;">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Bank Info"]">
|
||||
<BankComponent></BankComponent>
|
||||
</InfoTooltipComponent>
|
||||
</div>
|
||||
}
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
@if (true)
|
||||
{
|
||||
<div style="grid-area: army;" class="gridItem">
|
||||
<div class="gridItem" style="grid-area: army;">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Army Info"]">
|
||||
<ArmyComponent></ArmyComponent>
|
||||
</InfoTooltipComponent>
|
||||
</div>
|
||||
}
|
||||
|
||||
<div class="gridItem gridKeys">
|
||||
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Hotkey Info"]">
|
||||
|
||||
<HotkeyViewerComponent Size="80"></HotkeyViewerComponent>
|
||||
</InfoTooltipComponent>
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
@if (true)
|
||||
{
|
||||
<div style="grid-area: highlights;" class="gridItem">
|
||||
<div class="gridItem gridKeys">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Hotkey Info"]">
|
||||
<HotkeyViewerComponent Size="80"></HotkeyViewerComponent>
|
||||
</InfoTooltipComponent>
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
<div class="gridItem" style="grid-area: highlights;">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip Highlights Info"]">
|
||||
<HighlightsComponent></HighlightsComponent>
|
||||
</InfoTooltipComponent>
|
||||
</div>
|
||||
}
|
||||
@if (true)
|
||||
{
|
||||
<div style="grid-area: buildorder;" class="gridItem">
|
||||
</PanelComponent>
|
||||
</div>
|
||||
|
||||
<div class="gridItem" style="grid-area: buildorder;">
|
||||
<PanelComponent>
|
||||
<InfoTooltipComponent InfoText="@locale["Tooltip BuildOrder Info"]">
|
||||
<BuildOrderComponent></BuildOrderComponent>
|
||||
</InfoTooltipComponent>
|
||||
</div>
|
||||
}
|
||||
</PanelComponent>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ContentDividerComponent></ContentDividerComponent>
|
||||
@@ -135,7 +138,7 @@
|
||||
|
||||
<InfoBodyComponent>
|
||||
<InfoQuestionComponent>
|
||||
What is CONTROl key for?
|
||||
What is CONTROL key for?
|
||||
</InfoQuestionComponent>
|
||||
<InfoAnswerComponent>
|
||||
Economy and tech related upgrades for townhalls.
|
||||
@@ -165,6 +168,12 @@
|
||||
|
||||
|
||||
<style>
|
||||
.gridItem {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.calculatorGrid {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
@@ -178,12 +187,6 @@
|
||||
'chart chart chart chart';
|
||||
}
|
||||
|
||||
.gridItem {
|
||||
border: 2px solid var(--paper-border);
|
||||
padding: 20px;
|
||||
background-color: var(--paper);
|
||||
}
|
||||
|
||||
.gridKeys {
|
||||
grid-area: keys;
|
||||
}
|
||||
@@ -209,30 +212,35 @@
|
||||
padding-left: 2px;
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
.gridItem {
|
||||
padding: 0px;
|
||||
border: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@code {
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
economyService.Calculate(buildOrderService, timingService, 0);
|
||||
|
||||
|
||||
keyService.Subscribe(HandleClick);
|
||||
}
|
||||
|
||||
|
||||
void IDisposable.Dispose()
|
||||
{
|
||||
keyService.Unsubscribe(HandleClick);
|
||||
}
|
||||
|
||||
|
||||
private void OnResetClicked()
|
||||
{
|
||||
toastService.AddToast(new ToastModel(){
|
||||
SeverityType = SeverityType.Success,
|
||||
Message = "Build order has been cleared.",
|
||||
Title = "Reset"});
|
||||
|
||||
buildOrderService.Reset();
|
||||
}
|
||||
|
||||
|
||||
private void HandleClick()
|
||||
{
|
||||
var hotkey = keyService.GetHotkey();
|
||||
@@ -254,16 +262,17 @@
|
||||
var faction = filterService.GetFactionType();
|
||||
var immortal = filterService.GetImmortalType();
|
||||
|
||||
EntityModel? entity = EntityModel.GetFrom(hotkey!, hotkeyGroup, isHoldSpace, faction, immortal);
|
||||
var entity = EntityModel.GetFrom(hotkey!, hotkeyGroup, isHoldSpace, faction, immortal);
|
||||
|
||||
if (entity == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (buildOrderService.Add(entity, economyService, toastService))
|
||||
{
|
||||
economyService.Calculate(buildOrderService, timingService, buildOrderService.GetLastRequestInterval());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
@inject IJSRuntime jsRuntime
|
||||
|
||||
@inject IBuildOrderService BuildOrder
|
||||
@inject IBuildOrderService buildOrder
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
@@ -35,12 +35,12 @@
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
BuildOrder.Subscribe(OnBuildOrderChanged);
|
||||
buildOrder.Subscribe(OnBuildOrderChanged);
|
||||
}
|
||||
|
||||
void IDisposable.Dispose()
|
||||
{
|
||||
BuildOrder.Unsubscribe(OnBuildOrderChanged);
|
||||
buildOrder.Unsubscribe(OnBuildOrderChanged);
|
||||
}
|
||||
|
||||
protected override bool ShouldRender()
|
||||
@@ -57,20 +57,20 @@
|
||||
jsRuntime.InvokeVoidAsync("console.timeEnd", "ArmyComponent");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void OnBuildOrderChanged()
|
||||
{
|
||||
int armyCountWas = 0;
|
||||
var armyCountWas = 0;
|
||||
foreach (var army in armyCount)
|
||||
{
|
||||
armyCountWas += army.Value;
|
||||
}
|
||||
|
||||
|
||||
armyCount.Clear();
|
||||
|
||||
lastInterval = 0;
|
||||
|
||||
var entitiesOverTime = BuildOrder.GetOrders();
|
||||
var entitiesOverTime = buildOrder.GetOrders();
|
||||
|
||||
foreach (var entitiesAtTime in entitiesOverTime)
|
||||
{
|
||||
@@ -91,19 +91,18 @@
|
||||
}
|
||||
}
|
||||
|
||||
//TODO Better
|
||||
int armyCountIs = 0;
|
||||
//TODO Better
|
||||
var armyCountIs = 0;
|
||||
foreach (var army in armyCount)
|
||||
{
|
||||
armyCountIs += army.Value;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (armyCountWas != armyCountIs)
|
||||
{
|
||||
StateHasChanged();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -43,7 +43,7 @@
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "BankComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
|
||||
|
||||
@inject IBuildOrderService buildOrderService
|
||||
|
||||
@implements IDisposable
|
||||
@@ -29,7 +28,7 @@
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "BuildOrderComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -39,4 +38,5 @@
|
||||
jsRuntime.InvokeVoidAsync("console.timeEnd", "BuildOrderComponent");
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
@if (lastRequestedRefreshIndex != requestedRefreshIndex)
|
||||
{
|
||||
<LoadingComponent/>
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -30,8 +29,8 @@ else
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
.chartsContainer {
|
||||
position: relative;
|
||||
@@ -60,8 +59,6 @@ else
|
||||
<Display>@highestArmyPoint</Display>
|
||||
</FormDisplayComponent>
|
||||
</FormLayoutComponent>
|
||||
|
||||
|
||||
}
|
||||
|
||||
@code {
|
||||
@@ -80,7 +77,7 @@ else
|
||||
|
||||
private Timer ageTimer = null!;
|
||||
|
||||
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
buildOrderService.Subscribe(OnBuilderOrderChanged);
|
||||
@@ -89,12 +86,13 @@ else
|
||||
ageTimer.Elapsed += OnAge!;
|
||||
ageTimer.Enabled = true;
|
||||
|
||||
|
||||
|
||||
GenerateChart();
|
||||
}
|
||||
|
||||
|
||||
int lastRequestedRefreshIndex = 0;
|
||||
|
||||
void OnAge(object? sender, ElapsedEventArgs elapsedEventArgs)
|
||||
{
|
||||
if (requestedRefreshIndex > 0)
|
||||
@@ -105,14 +103,13 @@ else
|
||||
requestedRefreshIndex = 0;
|
||||
lastRequestedRefreshIndex = 0;
|
||||
}
|
||||
|
||||
|
||||
lastRequestedRefreshIndex = requestedRefreshIndex;
|
||||
}
|
||||
|
||||
|
||||
ageTimer.Enabled = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void IDisposable.Dispose()
|
||||
{
|
||||
@@ -121,6 +118,7 @@ else
|
||||
|
||||
|
||||
int requestedRefreshIndex = 0;
|
||||
|
||||
void OnBuilderOrderChanged()
|
||||
{
|
||||
requestedRefreshIndex++;
|
||||
@@ -133,7 +131,7 @@ else
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "ChartComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -143,7 +141,7 @@ else
|
||||
jsRuntime.InvokeVoidAsync("console.timeEnd", "ChartComponent");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void GenerateChart()
|
||||
{
|
||||
var economyOverTime = economyService.GetOverTime();
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
|
||||
|
||||
@inject IKeyService keyService
|
||||
@inject IImmortalSelectionService filterService
|
||||
@inject IBuildOrderService buildOrderService
|
||||
@inject IKeyService keyService
|
||||
@inject IImmortalSelectionService filterService
|
||||
@inject IBuildOrderService buildOrderService
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
@@ -68,4 +66,5 @@
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
@inject IImmortalSelectionService filterService
|
||||
|
||||
<FormLayoutComponent>
|
||||
<FormSelectComponent OnChange="@OnFactionChanged">
|
||||
@@ -12,12 +13,12 @@
|
||||
<FormSelectComponent OnChange="@OnImmortalChanged">
|
||||
<FormLabelComponent>Immortal</FormLabelComponent>
|
||||
<ChildContent>
|
||||
@if (FilterService.GetFactionType() == FactionType.QRath)
|
||||
@if (filterService.GetFactionType() == FactionType.QRath)
|
||||
{
|
||||
<option value="@DataType.IMMORTAL_Orzum" selected>Orzum</option>
|
||||
<option value="@DataType.IMMORTAL_Ajari">Ajari</option>
|
||||
}
|
||||
@if (FilterService.GetFactionType() == FactionType.Aru)
|
||||
@if (filterService.GetFactionType() == FactionType.Aru)
|
||||
{
|
||||
<option value="@DataType.IMMORTAL_Mala" selected>Mala</option>
|
||||
<option value="@DataType.IMMORTAL_Xol">Xol</option>
|
||||
@@ -28,17 +29,14 @@
|
||||
|
||||
@code {
|
||||
|
||||
[Inject]
|
||||
public IImmortalSelectionService FilterService { get; set; } = default!;
|
||||
|
||||
void OnFactionChanged(ChangeEventArgs e)
|
||||
{
|
||||
FilterService.SelectFactionType(e.Value!.ToString()!);
|
||||
filterService.SelectFactionType(e.Value!.ToString()!);
|
||||
}
|
||||
|
||||
void OnImmortalChanged(ChangeEventArgs e)
|
||||
{
|
||||
FilterService.SelectImmortalType(e.Value!.ToString()!);
|
||||
filterService.SelectImmortalType(e.Value!.ToString()!);
|
||||
}
|
||||
|
||||
protected override bool ShouldRender()
|
||||
@@ -46,7 +44,7 @@
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "FilterComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -56,4 +54,5 @@
|
||||
jsRuntime.InvokeVoidAsync("console.timeEnd", "FilterComponent");
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
|
||||
@inject IEconomyService economyService
|
||||
@inject IBuildOrderService buildOrderService
|
||||
@inject ITimingService timingService
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
@@ -7,7 +9,7 @@
|
||||
<div>
|
||||
<div>Requested</div>
|
||||
|
||||
@foreach (var ordersAtTime in BuildOrderService.StartedOrders.Reverse())
|
||||
@foreach (var ordersAtTime in buildOrderService.StartedOrders.Reverse())
|
||||
{
|
||||
foreach (var order in ordersAtTime.Value)
|
||||
{
|
||||
@@ -26,7 +28,7 @@
|
||||
<div>
|
||||
<div>Finished</div>
|
||||
|
||||
@foreach (var ordersAtTime in BuildOrderService.CompletedOrders.Reverse())
|
||||
@foreach (var ordersAtTime in buildOrderService.CompletedOrders.Reverse())
|
||||
{
|
||||
foreach (var order in ordersAtTime.Value)
|
||||
{
|
||||
@@ -57,25 +59,16 @@
|
||||
|
||||
@code {
|
||||
|
||||
[Inject]
|
||||
IEconomyService EconomyService { get; set; } = default!;
|
||||
|
||||
[Inject]
|
||||
IBuildOrderService BuildOrderService { get; set; } = default!;
|
||||
|
||||
[Inject]
|
||||
ITimingService TimingService { get; set; } = default!;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
EconomyService.Subscribe(StateHasChanged);
|
||||
BuildOrderService.Subscribe(StateHasChanged);
|
||||
economyService.Subscribe(StateHasChanged);
|
||||
buildOrderService.Subscribe(StateHasChanged);
|
||||
}
|
||||
|
||||
void IDisposable.Dispose()
|
||||
{
|
||||
EconomyService.Unsubscribe(StateHasChanged);
|
||||
BuildOrderService.Unsubscribe(StateHasChanged);
|
||||
economyService.Unsubscribe(StateHasChanged);
|
||||
buildOrderService.Unsubscribe(StateHasChanged);
|
||||
}
|
||||
|
||||
protected override bool ShouldRender()
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
|
||||
@using System.Diagnostics
|
||||
@implements IDisposable
|
||||
@inject IKeyService keyService
|
||||
@inject IKeyService keyService
|
||||
@inject IBuildOrderService buildOrderService
|
||||
@inject IImmortalSelectionService filterService
|
||||
|
||||
@@ -57,7 +55,6 @@
|
||||
@hotkey.KeyText
|
||||
@foreach (var entity in data.Values)
|
||||
{
|
||||
|
||||
if (InvalidKey(entity, hotkey) || InvalidKeyGroup(entity, hotkey) || InvalidHoldSpace(entity))
|
||||
{
|
||||
continue;
|
||||
@@ -67,7 +64,7 @@
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (InvalidVanguard(entity) || InvalidNonVanguard(entity))
|
||||
{
|
||||
continue;
|
||||
@@ -75,7 +72,7 @@
|
||||
|
||||
var isVanguard = entity.VanguardAdded() != null;
|
||||
var style = isVanguard ? "font-weight: bold;" : "";
|
||||
|
||||
|
||||
if (buildOrderService.WillMeetRequirements(entity) == null)
|
||||
{
|
||||
style += "color:gray; font-style: italic;";
|
||||
@@ -138,6 +135,7 @@
|
||||
}
|
||||
|
||||
int completedTimeCount = 0;
|
||||
|
||||
void OnBuilderOrderChanged()
|
||||
{
|
||||
if (buildOrderService.UniqueCompletedTimes.Count != completedTimeCount)
|
||||
@@ -146,13 +144,13 @@
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected override bool ShouldRender()
|
||||
{
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "HotKeyViewerComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -177,8 +175,8 @@
|
||||
// Move to Filter Service
|
||||
bool InvalidVanguard(EntityModel entity)
|
||||
{
|
||||
if (entity.VanguardAdded() != null
|
||||
&& entity.VanguardAdded()?.ImmortalId != filterService.GetImmortalType()
|
||||
if (entity.VanguardAdded() != null
|
||||
&& entity.VanguardAdded()?.ImmortalId != filterService.GetImmortalType()
|
||||
&& filterService.GetImmortalType() != ImmortalType.Any)
|
||||
{
|
||||
return true;
|
||||
@@ -252,11 +250,10 @@
|
||||
|
||||
void OnKeyPressed()
|
||||
{
|
||||
|
||||
string controlGroupWas = controlGroup;
|
||||
string keyWas = key;
|
||||
|
||||
|
||||
var controlGroupWas = controlGroup;
|
||||
var keyWas = key;
|
||||
|
||||
|
||||
if (keyService.GetAllPressedKeys().Contains("Z"))
|
||||
{
|
||||
controlGroup = "Z";
|
||||
@@ -299,13 +296,11 @@
|
||||
|
||||
if (controlGroupWas != controlGroup || keyWas != key)
|
||||
{
|
||||
|
||||
StateHasChanged();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void HandleClick()
|
||||
{
|
||||
var hotkey = keyService.GetHotkey();
|
||||
@@ -327,16 +322,17 @@
|
||||
var faction = filterService.GetFactionType();
|
||||
var immortal = filterService.GetImmortalType();
|
||||
|
||||
EntityModel? entity = EntityModel.GetFrom(hotkey!, hotkeyGroup, isHoldSpace, faction, immortal);
|
||||
var entity = EntityModel.GetFrom(hotkey!, hotkeyGroup, isHoldSpace, faction, immortal);
|
||||
|
||||
if (entity == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (buildOrderService.Add(entity, economyService, toastService))
|
||||
{
|
||||
economyService.Calculate(buildOrderService, timingService, buildOrderService.GetLastRequestInterval());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
@inject IKeyService keyService
|
||||
@inject IKeyService keyService
|
||||
|
||||
@inject IJSRuntime jsRuntime;
|
||||
|
||||
@@ -13,9 +13,10 @@
|
||||
</div>
|
||||
|
||||
@code {
|
||||
|
||||
[Parameter]
|
||||
public RenderFragment ChildContent { get; set; } = default!;
|
||||
|
||||
|
||||
private void HandleKeyDown(KeyboardEventArgs e)
|
||||
{
|
||||
keyService.AddPressedKey(e.Key);
|
||||
@@ -31,7 +32,7 @@
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "InputPanelComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -41,4 +42,5 @@
|
||||
jsRuntime.InvokeVoidAsync("console.timeEnd", "InputPanelComponent");
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
|
||||
@inject IBuildOrderService buildOrderService
|
||||
@inject IEconomyService economyService
|
||||
@inject IToastService toastService
|
||||
@inject ITimingService timingService
|
||||
|
||||
<FormLayoutComponent>
|
||||
<FormNumberComponent Max="600"
|
||||
Min="0"
|
||||
Value="@buildOrderService.BuildingInputDelay"
|
||||
OnChange="@OnBuildingInputDelayChanged">
|
||||
<FormLabelComponent>Building Input Delay</FormLabelComponent>
|
||||
<FormInfoComponent>Add a input delay to constructing buildings for simulating worker movement and player micro.</FormInfoComponent>
|
||||
</FormNumberComponent>
|
||||
|
||||
</FormLayoutComponent>
|
||||
|
||||
@code {
|
||||
|
||||
void OnBuildingInputDelayChanged(ChangeEventArgs changeEventArgs)
|
||||
{
|
||||
buildOrderService.BuildingInputDelay = int.Parse(changeEventArgs.Value!.ToString()!);
|
||||
}
|
||||
|
||||
protected override bool ShouldRender()
|
||||
{
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "TimingComponent");
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override void OnAfterRender(bool firstRender)
|
||||
{
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.timeEnd", "TimingComponent");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
@inject IJSRuntime jsRuntime;
|
||||
|
||||
@inject IJSRuntime jsRuntime
|
||||
@inject IEconomyService economyService
|
||||
@inject IBuildOrderService buildOrderService
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
<Virtualize Items="@EconomyService.GetOverTime()" Context="economyAtSecond" ItemSize="400" OverscanCount="4">
|
||||
<Virtualize Items="@economyService.GetOverTime()" Context="economyAtSecond" ItemSize="400" OverscanCount="4">
|
||||
<div style="display: grid; gap: 8px; grid-template-columns: 1fr 1fr;">
|
||||
<div>
|
||||
<div>
|
||||
@@ -27,19 +28,19 @@
|
||||
<br/>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@if (BuildOrderService.StartedOrders.TryGetValue(economyAtSecond.Interval, out var ordersAtTime))
|
||||
|
||||
@if (buildOrderService.StartedOrders.TryGetValue(economyAtSecond.Interval, out var ordersAtTime))
|
||||
{
|
||||
@foreach (var order in ordersAtTime)
|
||||
{
|
||||
<div>
|
||||
Requested: @order.Info().Name
|
||||
</div>
|
||||
}
|
||||
<div>
|
||||
Requested: @order.Info().Name
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@if (BuildOrderService.CompletedOrders.TryGetValue(economyAtSecond.Interval, out var ordersCompletedAtTime))
|
||||
|
||||
|
||||
@if (buildOrderService.CompletedOrders.TryGetValue(economyAtSecond.Interval, out var ordersCompletedAtTime))
|
||||
{
|
||||
@foreach (var order in ordersCompletedAtTime)
|
||||
{
|
||||
@@ -55,30 +56,24 @@
|
||||
|
||||
@code {
|
||||
|
||||
[Inject]
|
||||
IEconomyService EconomyService { get; set; } = default!;
|
||||
|
||||
[Inject]
|
||||
IBuildOrderService BuildOrderService { get; set; } = default!;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
EconomyService.Subscribe(StateHasChanged);
|
||||
BuildOrderService.Subscribe(StateHasChanged);
|
||||
economyService.Subscribe(StateHasChanged);
|
||||
buildOrderService.Subscribe(StateHasChanged);
|
||||
}
|
||||
|
||||
void IDisposable.Dispose()
|
||||
{
|
||||
EconomyService.Unsubscribe(StateHasChanged);
|
||||
BuildOrderService.Unsubscribe(StateHasChanged);
|
||||
economyService.Unsubscribe(StateHasChanged);
|
||||
buildOrderService.Unsubscribe(StateHasChanged);
|
||||
}
|
||||
|
||||
|
||||
protected override bool ShouldRender()
|
||||
{
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "TimelineComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,11 +5,8 @@
|
||||
@inject IToastService toastService
|
||||
@inject ITimingService timingService
|
||||
|
||||
|
||||
|
||||
<FormLayoutComponent>
|
||||
<FormNumberComponent ReadOnly="true"
|
||||
Max="600"
|
||||
<FormNumberComponent Max="2048"
|
||||
Min="0"
|
||||
Value="@timingService.GetTiming()"
|
||||
OnChange="@OnTimingChanged">
|
||||
@@ -27,10 +24,17 @@
|
||||
</FormLayoutComponent>
|
||||
|
||||
@code {
|
||||
|
||||
void OnTimingChanged(ChangeEventArgs changeEventArgs)
|
||||
{
|
||||
timingService.SetTiming(int.Parse(changeEventArgs.Value!.ToString()!));
|
||||
economyService.Calculate(buildOrderService, timingService, buildOrderService.GetLastRequestInterval());
|
||||
toastService.AddToast(new ToastModel()
|
||||
{
|
||||
Title = "Timing Interval",
|
||||
Message = "Timing interval has changed.",
|
||||
SeverityType = SeverityType.Success
|
||||
});
|
||||
}
|
||||
|
||||
void OnNameChanged(ChangeEventArgs changeEventArgs)
|
||||
@@ -48,13 +52,13 @@
|
||||
{
|
||||
buildOrderService.SetNotes(changeEventArgs.Value!.ToString()!);
|
||||
}
|
||||
|
||||
|
||||
protected override bool ShouldRender()
|
||||
{
|
||||
#if DEBUG
|
||||
jsRuntime.InvokeVoidAsync("console.time", "TimingComponent");
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -65,5 +69,4 @@
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -21,7 +21,7 @@ grid-template-areas: 'loader sand compare compare' ;">
|
||||
|
||||
<div style="grid-area: compare; border: 2px solid black; padding: 20px;">
|
||||
Comparision Charts
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ grid-template-areas: 'loader sand compare compare' ;">
|
||||
|
||||
[Inject]
|
||||
IEconomyService EconomyService { get; set; } = default!;
|
||||
|
||||
|
||||
|
||||
[Inject]
|
||||
ITimingService TimingService { get; set; } = default!;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
var requirements = passive.Requirements();
|
||||
|
||||
|
||||
|
||||
<div>
|
||||
<div>
|
||||
<b>Passive Name:</b> @info.Name
|
||||
@@ -46,7 +46,7 @@
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@if (requirements.Count > 0)
|
||||
{
|
||||
@foreach (var requirement in requirements)
|
||||
@@ -71,7 +71,7 @@
|
||||
var info = passive.Info();
|
||||
|
||||
var production = passive.Production();
|
||||
|
||||
|
||||
var requirements = passive.Requirements();
|
||||
|
||||
|
||||
@@ -89,20 +89,20 @@
|
||||
<b>Notes:</b> @((MarkupString)info.Notes)
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@if (requirements.Count > 0)
|
||||
{
|
||||
@foreach (var requirement in requirements)
|
||||
|
||||
|
||||
@if (requirements.Count > 0)
|
||||
{
|
||||
var requirementModel = DATA.Get()[requirement.Id];
|
||||
<div>
|
||||
<span>
|
||||
<b>@requirement.Requirement.Replace("_", " "):</b> @requirementModel.Info().Name
|
||||
</span>
|
||||
</div>
|
||||
@foreach (var requirement in requirements)
|
||||
{
|
||||
var requirementModel = DATA.Get()[requirement.Id];
|
||||
<div>
|
||||
<span>
|
||||
<b>@requirement.Requirement.Replace("_", " "):</b> @requirementModel.Info().Name
|
||||
</span>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
}
|
||||
</div>
|
||||
|
||||
@if (production != null)
|
||||
@@ -122,7 +122,6 @@
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
||||
}
|
||||
</EntityDisplayComponent>
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
{
|
||||
<div>
|
||||
<b>Shields:</b> @Production.DefensiveLayer
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (!Production.BuildTime.Equals(0))
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
@using System.Net.Http.Json
|
||||
@using Markdig.Extensions.Yaml
|
||||
@using Markdig.Syntax
|
||||
@using YamlDotNet.Serialization
|
||||
@inject HttpClient httpClient
|
||||
|
||||
@if (content == null)
|
||||
@@ -19,10 +15,10 @@ else
|
||||
</div>
|
||||
</div>
|
||||
<div class="docContent">@((MarkupString)Markdown.ToHtml(content, Pipeline))</div>
|
||||
<div class="docFooter"><EditLinkComponent Href="@GitUrl"></EditLinkComponent></div>
|
||||
<div class="docFooter">
|
||||
<EditLinkComponent Href="@GitUrl"></EditLinkComponent>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
}
|
||||
|
||||
<style>
|
||||
@@ -56,22 +52,33 @@ else
|
||||
</style>
|
||||
|
||||
@code {
|
||||
[Parameter] public DocContentModel DocContentModel { get; set; } = default!;
|
||||
|
||||
[Parameter]
|
||||
public DocContentModel DocContentModel { get; set; } = default!;
|
||||
|
||||
DocFrontMatterModel docFrontMatter = null!;
|
||||
private string? content = null;
|
||||
|
||||
|
||||
private string Filepath => $"content/docs/{DocContentModel.Content}.md";
|
||||
private string GitUrl => $"{Project.GitResourcesUrl}/{Filepath}";
|
||||
private MarkdownPipeline Pipeline => MarkdownFiles.Pipeline;
|
||||
|
||||
private async Task<DocFrontMatterModel> LoadContent() {
|
||||
private async Task<DocFrontMatterModel> LoadContent()
|
||||
{
|
||||
content = await MarkdownFiles.LoadMarkdown(httpClient, Filepath);
|
||||
|
||||
|
||||
return docFrontMatter =
|
||||
await MarkdownFiles.LoadFrontMatter<DocFrontMatterModel>(httpClient, Filepath);
|
||||
}
|
||||
|
||||
protected override async Task OnParametersSetAsync() => await LoadContent();
|
||||
protected override async Task OnInitializedAsync() => await LoadContent();
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
await LoadContent();
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await LoadContent();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -77,16 +77,16 @@
|
||||
Border: <input type="color" value="@info_border" @onchange="e => info_border = e.Value!.ToString()!"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="color info_secondary">
|
||||
<div>Info Secondary</div>
|
||||
<div>
|
||||
Base: <input type="color" value="@info_secondary" @onchange="e => info_secondary = e.Value!.ToString()!"/>
|
||||
</div>
|
||||
<div>
|
||||
Border: <input type="color" value="@info_secondary_border" @onchange="e => info_secondary_border = e.Value!.ToString()!"/>
|
||||
</div>
|
||||
|
||||
<div class="color info_secondary">
|
||||
<div>Info Secondary</div>
|
||||
<div>
|
||||
Base: <input type="color" value="@info_secondary" @onchange="e => info_secondary = e.Value!.ToString()!"/>
|
||||
</div>
|
||||
<div>
|
||||
Border: <input type="color" value="@info_secondary_border" @onchange="e => info_secondary_border = e.Value!.ToString()!"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
@@ -183,6 +183,6 @@
|
||||
string info_border = "#210b36";
|
||||
string info_secondary = "#4c3e59";
|
||||
string info_secondary_border = "#7e58a2";
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -6,15 +6,15 @@
|
||||
Group specfic webpages. Each webpage link is used to navigate to that specific webpage. If on the webpage, the link turns dark gray. It can be clicked again to leave the page and return to home.
|
||||
</Description>
|
||||
<Example>
|
||||
<NavSectionComponent Section=@(new WebSectionModel { Name = "Example Section" })
|
||||
Children=@(new List<WebPageModel> { new() { Name = "Example Page", Href = "immortal-makingof", IsPrivate = "False" }, new() { Name = "Database", Href = "immortal-database", IsPrivate = "False" } })>
|
||||
</NavSectionComponent>
|
||||
<DesktopNavSectionComponent Section=@(new WebSectionModel { Name = "Example Section" })
|
||||
Children=@(new List<WebPageModel> { new() { Name = "Example Page", Href = "immortal-makingof", IsPrivate = "False" }, new() { Name = "Database", Href = "immortal-database", IsPrivate = "False" } })>
|
||||
</DesktopNavSectionComponent>
|
||||
</Example>
|
||||
<Usage>
|
||||
<CodeComponent>
|
||||
<NavSectionComponent Section=@@(new WebSectionModel{Name = "Example Section"})
|
||||
<DesktopNavSectionComponent Section=@@(new WebSectionModel{Name = "Example Section"})
|
||||
Children=@@(new List<WebPageModel>{new WebPageModel{Name="Example Page", Href = "immortal-makingof", IsPrivate = false}, new WebPageModel{Name="Database", Href = "immortal-database", IsPrivate = false}})>
|
||||
</NavSectionComponent>
|
||||
</DesktopNavSectionComponent>
|
||||
</CodeComponent>
|
||||
</Usage>
|
||||
<Code>
|
||||
|
||||
@@ -15,7 +15,9 @@ else
|
||||
</div>
|
||||
</div>
|
||||
<div class="noteContent">@((MarkupString)Markdown.ToHtml(content, Pipeline))</div>
|
||||
<div class="noteFooter"><EditLinkComponent Href="@GitUrl"></EditLinkComponent></div>
|
||||
<div class="noteFooter">
|
||||
<EditLinkComponent Href="@GitUrl"></EditLinkComponent>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -43,23 +45,33 @@ else
|
||||
</style>
|
||||
|
||||
@code {
|
||||
[Parameter] public NoteContentModel NoteContentModel { get; set; } = default!;
|
||||
|
||||
[Parameter]
|
||||
public NoteContentModel NoteContentModel { get; set; } = default!;
|
||||
|
||||
NoteFrontMatterModel noteFrontMatter = null!;
|
||||
private string? content = null;
|
||||
|
||||
|
||||
private string Filepath => $"content/notes/{NoteContentModel.Content}.md";
|
||||
private string GitUrl => $"{Project.GitResourcesUrl}/{Filepath}";
|
||||
private MarkdownPipeline Pipeline => MarkdownFiles.Pipeline;
|
||||
|
||||
private async Task<NoteFrontMatterModel> LoadContent() {
|
||||
private async Task<NoteFrontMatterModel> LoadContent()
|
||||
{
|
||||
content = await MarkdownFiles.LoadMarkdown(httpClient, Filepath);
|
||||
|
||||
|
||||
return noteFrontMatter =
|
||||
await MarkdownFiles.LoadFrontMatter<NoteFrontMatterModel>(httpClient, Filepath);
|
||||
}
|
||||
|
||||
protected override async Task OnParametersSetAsync() => await LoadContent();
|
||||
protected override async Task OnInitializedAsync() => await LoadContent();
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
await LoadContent();
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await LoadContent();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,9 +5,8 @@
|
||||
@if (toastService.HasToasts())
|
||||
{
|
||||
<div class="toastsContainer">
|
||||
@foreach(var toast in Toasts)
|
||||
@foreach (var toast in Toasts)
|
||||
{
|
||||
|
||||
<ToastComponent Toast="toast"/>
|
||||
}
|
||||
</div>
|
||||
@@ -27,25 +26,24 @@
|
||||
|
||||
@code {
|
||||
private List<ToastModel> Toasts => toastService.GetToasts();
|
||||
|
||||
|
||||
private Timer ageTimer = null!;
|
||||
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
toastService.Subscribe(OnUpdate);
|
||||
|
||||
|
||||
ageTimer = new Timer(10);
|
||||
ageTimer.Elapsed += OnAge!;
|
||||
ageTimer.Enabled = true;
|
||||
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
toastService.Unsubscribe(OnUpdate);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void OnAge(object? sender, ElapsedEventArgs elapsedEventArgs)
|
||||
{
|
||||
toastService.AgeToasts();
|
||||
@@ -57,4 +55,5 @@
|
||||
{
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,7 +6,6 @@ using Services.Development;
|
||||
using Services.Immortal;
|
||||
using Services.Website;
|
||||
|
||||
|
||||
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
|
||||
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US");
|
||||
|
||||
@@ -44,7 +43,6 @@ builder.Services.AddSingleton(new HttpClient
|
||||
});
|
||||
|
||||
|
||||
|
||||
#if NO_SQL
|
||||
|
||||
#else
|
||||
@@ -52,7 +50,6 @@ builder.Services.AddSingleton(new HttpClient
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
await builder.Build().RunAsync();
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
namespace IGP.Utils;
|
||||
|
||||
public static class Interval {
|
||||
public static string ToTime(int interval) {
|
||||
public static class Interval
|
||||
{
|
||||
public static string ToTime(int interval)
|
||||
{
|
||||
return TimeSpan.FromSeconds(interval).ToString(@"mm\:ss");
|
||||
}
|
||||
}
|
||||
+14
-13
@@ -1,18 +1,18 @@
|
||||
using Markdig;
|
||||
using Markdig.Extensions.Yaml;
|
||||
using Markdig.Syntax;
|
||||
using Model.Doc;
|
||||
using YamlDotNet.Serialization;
|
||||
|
||||
namespace IGP.Utils;
|
||||
|
||||
public static class MarkdownFiles {
|
||||
private static readonly IDeserializer YamlDeserializer =
|
||||
public static class MarkdownFiles
|
||||
{
|
||||
private static readonly IDeserializer YamlDeserializer =
|
||||
new DeserializerBuilder()
|
||||
.IgnoreUnmatchedProperties()
|
||||
.Build();
|
||||
|
||||
public static readonly MarkdownPipeline Pipeline
|
||||
|
||||
public static readonly MarkdownPipeline Pipeline
|
||||
= new MarkdownPipelineBuilder()
|
||||
.UseYamlFrontMatter()
|
||||
.UseAdvancedExtensions()
|
||||
@@ -22,30 +22,31 @@ public static class MarkdownFiles {
|
||||
{
|
||||
return await httpClient.GetStringAsync(filepath);
|
||||
}
|
||||
|
||||
public static async Task<T> LoadFrontMatter<T>(HttpClient httpClient, string filepath) {
|
||||
|
||||
public static async Task<T> LoadFrontMatter<T>(HttpClient httpClient, string filepath)
|
||||
{
|
||||
var markdown = await LoadMarkdown(httpClient, filepath);
|
||||
|
||||
var document = Markdown.Parse(markdown, Pipeline);
|
||||
|
||||
|
||||
var block = document
|
||||
.Descendants<YamlFrontMatterBlock>()
|
||||
.FirstOrDefault();
|
||||
|
||||
if (block == null)
|
||||
if (block == null)
|
||||
return default!;
|
||||
|
||||
|
||||
var yaml =
|
||||
block
|
||||
.Lines
|
||||
.Lines
|
||||
.Lines
|
||||
.Lines
|
||||
.OrderByDescending(x => x.Line)
|
||||
.Select(x => $"{x}\n")
|
||||
.ToList()
|
||||
.Select(x => x.Replace("---", string.Empty))
|
||||
.Where(x => !string.IsNullOrWhiteSpace(x))
|
||||
.Aggregate((s, agg) => agg + s);
|
||||
|
||||
|
||||
return YamlDeserializer.Deserialize<T>(yaml);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
namespace IGP.Utils;
|
||||
|
||||
public static class Project {
|
||||
public static string GitResourcesUrl => "https://github.com/JonathanMcCaffrey/IGP-Fan-Reference/blob/develop/IGP/wwwroot/";
|
||||
|
||||
public static class Project
|
||||
{
|
||||
public static string GitResourcesUrl =>
|
||||
"https://github.com/JonathanMcCaffrey/IGP-Fan-Reference/blob/develop/IGP/wwwroot/";
|
||||
}
|
||||
+9
-7
@@ -6,11 +6,10 @@
|
||||
@using Components.Layout
|
||||
@using Components.Navigation
|
||||
@using Components.Shared
|
||||
@using IGP.Utils
|
||||
@using System.Globalization
|
||||
@using IGP.Dialog
|
||||
@using IGP.Pages
|
||||
@using IGP.Pages.Agile.Parts
|
||||
@using IGP.Pages.BuildCalculator
|
||||
@using IGP.Pages.BuildCalculator.Parts
|
||||
@using IGP.Pages.Comparision
|
||||
@using IGP.Pages.Comparision.Parts
|
||||
@@ -23,27 +22,28 @@
|
||||
@using IGP.Pages.Home.Parts
|
||||
@using IGP.Pages.MakingOf.Parts
|
||||
@using IGP.Pages.MemoryTester.Parts
|
||||
@using IGP.Pages.RoadMap.Parts
|
||||
@using IGP.Pages.Notes
|
||||
@using IGP.Pages.Notes.Parts
|
||||
@using System.Timers
|
||||
@using IGP.Pages.RoadMap.Parts
|
||||
@using IGP.Portals
|
||||
@using IGP.Utils
|
||||
@using Markdig
|
||||
@using Model.Feedback
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@using Microsoft.AspNetCore.Components.Routing
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||
@using Microsoft.AspNetCore.Components.WebAssembly.Http
|
||||
@using Microsoft.EntityFrameworkCore
|
||||
@using Microsoft.Extensions.Localization
|
||||
@using Microsoft.JSInterop
|
||||
@using Model.Chart
|
||||
@using Model.Git
|
||||
@using Model.Doc
|
||||
@using Model.Economy
|
||||
@using Model.Entity
|
||||
@using Model.Entity.Data
|
||||
@using Model.Entity.Parts
|
||||
@using Model.Feedback
|
||||
@using Model.Git
|
||||
@using Model.Hotkeys
|
||||
@using Model.MemoryTester
|
||||
@using Model.Notes
|
||||
@@ -55,4 +55,6 @@
|
||||
@using Model.Work.Tasks.Enums
|
||||
@using Services
|
||||
@using Services.Immortal
|
||||
@using System.Reflection
|
||||
@using System.Globalization
|
||||
@using System.Reflection
|
||||
@using System.Timers
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Cheat Sheet
|
||||
summary: Handy links or quick information on this project.
|
||||
created_date: 2022-04-11
|
||||
updated_date: 2022-04-11
|
||||
title: Cheat Sheet summary: Handy links or quick information on this project. created_date: 2022-04-11 updated_date:
|
||||
2022-04-11
|
||||
---
|
||||
|
||||
# Overview
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
---
|
||||
title: Project Data
|
||||
summary: Using data in this project.
|
||||
created_date: 2022-04-11
|
||||
updated_date: 2022-04-11
|
||||
title: Project Data summary: Using data in this project. created_date: 2022-04-11 updated_date: 2022-04-11
|
||||
---
|
||||
|
||||
# Overview
|
||||
@@ -11,7 +8,8 @@ This document will contain general information on data in this project.
|
||||
|
||||
## General Note
|
||||
|
||||
This project is a work in progress. As such, most of the data in the website doesn't follow the document. Ideally, this will be fixed over time.
|
||||
This project is a work in progress. As such, most of the data in the website doesn't follow the document. Ideally, this
|
||||
will be fixed over time.
|
||||
|
||||
## SQL
|
||||
|
||||
@@ -19,7 +17,9 @@ Relational data is stored in a local SQL database.
|
||||
|
||||
This data is converted into JSON so it can be handled by Blazor WASM.
|
||||
|
||||
<i>Currently, Blazor WASM has a bug that prevents SQL from being used in production. Although, given SQL doesn't seem to provide much, aside from increased build times and load times, it might just be best to use the design principals of SQL, and it's interface, without using the actual technology in production.</i>
|
||||
<i>Currently, Blazor WASM has a bug that prevents SQL from being used in production. Although, given SQL doesn't seem to
|
||||
provide much, aside from increased build times and load times, it might just be best to use the design principals of
|
||||
SQL, and it's interface, without using the actual technology in production.</i>
|
||||
|
||||
The data is then loaded in by a Service, via it's load method.
|
||||
|
||||
@@ -90,7 +90,8 @@ else
|
||||
|
||||
Localized strings are handled in the Localizations.resx file.
|
||||
|
||||
Most text isn't using localized strings yet. And English is the only plan of support in the short term, and probably in the long term as well.
|
||||
Most text isn't using localized strings yet. And English is the only plan of support in the short term, and probably in
|
||||
the long term as well.
|
||||
|
||||
## Markdown Files
|
||||
|
||||
|
||||
@@ -1,18 +1,15 @@
|
||||
---
|
||||
title: Setup
|
||||
summary: Get set up on developing this web project.
|
||||
created_date: 3/30/2022
|
||||
updated_date: 4/7/2022
|
||||
title: Setup summary: Get set up on developing this web project. created_date: 3/30/2022 updated_date: 4/7/2022
|
||||
---
|
||||
|
||||
|
||||
# Overview
|
||||
|
||||
This document will contain general setup notes for the project.
|
||||
|
||||
## Prerequisite
|
||||
|
||||
To understand content in this document, it is recommended to have some software development experience. Particularly using GitHub and Visual Studio.
|
||||
To understand content in this document, it is recommended to have some software development experience. Particularly
|
||||
using GitHub and Visual Studio.
|
||||
|
||||
- [GitHub Documentation](https://docs.github.com/en/get-started)
|
||||
|
||||
@@ -24,10 +21,13 @@ To make updates to this website, it is recommended to understand HTML/CSS and C#
|
||||
- [Mozilla's HTML Documentation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started)
|
||||
- [W3SCHOOLS' HTML Documentation](https://www.w3schools.com/html/)
|
||||
|
||||
Further, you should understand the product and clients this website is for. So it is recommended to play "Immortal: Gates of Pyre".
|
||||
Further, you should understand the product and clients this website is for. So it is recommended to play "Immortal:
|
||||
Gates of Pyre".
|
||||
|
||||
- [IGP Website](https://gatesofpyre.com/)
|
||||
- **Please Note:** This product currently has restricted access with it is in a pre-alpha state. If you are not aware or interested in IGP, I recommend to wait for product release. Otherwise, check out their discord for steps of getting access.
|
||||
- **Please Note:** This product currently has restricted access with it is in a pre-alpha state. If you are not
|
||||
aware or interested in IGP, I recommend to wait for product release. Otherwise, check out their discord for steps
|
||||
of getting access.
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -37,7 +37,8 @@ Download and install Visual Studio preview.
|
||||
|
||||
[https://visualstudio.microsoft.com/vs/preview/](https://visualstudio.microsoft.com/vs/preview/)
|
||||
|
||||
When installing, ensure you have selected "Workloads | **ASP.NET and web development**" and "Individual components | **.NET WebAssembly build tools**".
|
||||
When installing, ensure you have selected "Workloads | **ASP.NET and web development**" and "Individual components | **
|
||||
.NET WebAssembly build tools**".
|
||||
|
||||
## Download Project
|
||||
|
||||
@@ -77,11 +78,13 @@ C:.
|
||||
|
||||
Code committed to the `main` branch will automatically be deployed to [production](https://www.igpfanreference.com/).
|
||||
|
||||
Code committed to the `develop` branch will automatically be deployed to [development](https://calm-mud-04916b210.1.azurestaticapps.net/).
|
||||
Code committed to the `develop` branch will automatically be deployed
|
||||
to [development](https://calm-mud-04916b210.1.azurestaticapps.net/).
|
||||
|
||||
_This is handle via the files in `.github/workflow`. Look into these [GitHub Actions Documents](https://docs.github.com/en/actions) if curious about how this CI system works._
|
||||
_This is handle via the files in `.github/workflow`. Look into
|
||||
these [GitHub Actions Documents](https://docs.github.com/en/actions) if curious about how this CI system works._
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
||||
Nothing that some good internet searches cannot resolved. But you can also contact the project maintainer on [Discord](https://discord.gg/uMq8bMGeeN).
|
||||
Nothing that some good internet searches cannot resolved. But you can also contact the project maintainer
|
||||
on [Discord](https://discord.gg/uMq8bMGeeN).
|
||||
@@ -1,26 +1,27 @@
|
||||
---
|
||||
title: Holdout
|
||||
summary: First coop test map in pre-alpha.
|
||||
created_date: 2/18/2022
|
||||
updated_date: 2/18/2022
|
||||
title: Holdout summary: First coop test map in pre-alpha. created_date: 2/18/2022 updated_date: 2/18/2022
|
||||
---
|
||||
|
||||
Information contained in this note is based on this <a href="https://www.youtube.com/watch?v=XkAgOCIz3DE">YouTube, Reference Video</a>.
|
||||
Information contained in this note is based on this <a href="https://www.youtube.com/watch?v=XkAgOCIz3DE">YouTube,
|
||||
Reference Video</a>.
|
||||
|
||||

|
||||
|
||||
**Open Bases**
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||

|
||||
|
||||
**Enemy Spawn Areas**
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||

|
||||
|
||||
@@ -28,19 +29,26 @@ The first enemy wave will spawn at 1 minute, and every 2 minutes after will spaw
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||

|
||||
|
||||
**Pyre Camps**
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||

|
||||
|
||||
**Multipliers**
|
||||
|
||||
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.
|
||||
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.
|
||||
But really, these optional objectives can be completely ignored, so you can just focus on surviving for as long as
|
||||
possible.
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Custom HotKey Setup
|
||||
summary: Customize your hotkeys in the pre-alpha.
|
||||
created_date: 4/13/2022
|
||||
updated_date: 4/13/2022
|
||||
title: Custom HotKey Setup summary: Customize your hotkeys in the pre-alpha. created_date: 4/13/2022 updated_date:
|
||||
4/13/2022
|
||||
---
|
||||
|
||||
In the pre-alpha, IGP comes with some Unreal default hotkey setup.
|
||||
@@ -15,78 +13,79 @@ This document will explain how to set up, modify, and use a new hotkey setup.
|
||||
|
||||
```ini
|
||||
[/Script/Engine.InputSettings]
|
||||
ActionMappings=(ActionName="Ability1",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Q)
|
||||
ActionMappings=(ActionName="Ability2",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=W)
|
||||
ActionMappings=(ActionName="Ability3",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=E)
|
||||
ActionMappings=(ActionName="Ability4",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=R)
|
||||
ActionMappings=(ActionName="Ability5",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=F)
|
||||
ActionMappings=(ActionName="Ability6",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=V)
|
||||
ActionMappings=(ActionName="Ability7",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=A)
|
||||
ActionMappings=(ActionName="Ability8",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=S)
|
||||
ActionMappings=(ActionName="AttackMove",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=A)
|
||||
ActionMappings=(ActionName="CancelOrders",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Tilde)
|
||||
ActionMappings=(ActionName="CompleteAllTraining",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)
|
||||
ActionMappings=(ActionName="CompleteConstructions",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=K)
|
||||
ActionMappings=(ActionName="ConstructionTab",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=C)
|
||||
ActionMappings=(ActionName="ControlGroup1",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=D)
|
||||
ActionMappings=(ActionName="ControlGroup10",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Zero)
|
||||
ActionMappings=(ActionName="ControlGroup2",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Two)
|
||||
ActionMappings=(ActionName="ControlGroup3",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Three)
|
||||
ActionMappings=(ActionName="ControlGroup4",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Four)
|
||||
ActionMappings=(ActionName="ControlGroup5",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Five)
|
||||
ActionMappings=(ActionName="ControlGroup6",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Six)
|
||||
ActionMappings=(ActionName="ControlGroup7",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Seven)
|
||||
ActionMappings=(ActionName="ControlGroup8",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Eight)
|
||||
ActionMappings=(ActionName="ControlGroup9",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Nine)
|
||||
ActionMappings=(ActionName="ControlGroupAddStealKey",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)
|
||||
ActionMappings=(ActionName="Delete",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Delete)
|
||||
ActionMappings=(ActionName="DisableWeapons",bShift=True,bCtrl=False,bAlt=True,bCmd=False,Key=J)
|
||||
ActionMappings=(ActionName="DownArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Down)
|
||||
ActionMappings=(ActionName="DragPan",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MiddleMouseButton)
|
||||
ActionMappings=(ActionName="Enter Cinematic Camera",bShift=True,bCtrl=False,bAlt=True,bCmd=False,Key=L)
|
||||
ActionMappings=(ActionName="FullMana",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=J)
|
||||
ActionMappings=(ActionName="FullyDamageSelectedUnits",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=P)
|
||||
ActionMappings=(ActionName="GetAlloyEther",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=M)
|
||||
ActionMappings=(ActionName="GetPyre",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=L)
|
||||
ActionMappings=(ActionName="Hide HUD",bShift=True,bCtrl=False,bAlt=True,bCmd=False,Key=O)
|
||||
ActionMappings=(ActionName="InclusiveSelect/QueueCommand",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftShift)
|
||||
ActionMappings=(ActionName="JumpToCameraLocation1",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Z)
|
||||
ActionMappings=(ActionName="JumpToCameraLocation2",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=X)
|
||||
ActionMappings=(ActionName="JumpToCameraLocation3",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=C)
|
||||
ActionMappings=(ActionName="JumpToCameraLocation4",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=V)
|
||||
ActionMappings=(ActionName="JumpToCameraLocation5",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Two)
|
||||
ActionMappings=(ActionName="JumpToCameraLocation6",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Three)
|
||||
ActionMappings=(ActionName="JumpToCameraLocation7",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Four)
|
||||
ActionMappings=(ActionName="LeftArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Left)
|
||||
ActionMappings=(ActionName="LeftMouseClick",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)
|
||||
ActionMappings=(ActionName="MarcoPolo",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Comma)
|
||||
ActionMappings=(ActionName="Menu",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Escape)
|
||||
ActionMappings=(ActionName="Menu",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=F10)
|
||||
ActionMappings=(ActionName="MinimapJumpTo",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)
|
||||
ActionMappings=(ActionName="Move/ContextCommand",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=RightMouseButton)
|
||||
ActionMappings=(ActionName="PyreTab",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=One)
|
||||
ActionMappings=(ActionName="ResearchTab",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Tab)
|
||||
ActionMappings=(ActionName="RespawnNeutrals",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=N)
|
||||
ActionMappings=(ActionName="RightArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Right)
|
||||
ActionMappings=(ActionName="RightMouseClick",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=RightMouseButton)
|
||||
ActionMappings=(ActionName="Select/ConfirmAbility",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)
|
||||
ActionMappings=(ActionName="SelectUnitProductionBuildings",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Z)
|
||||
ActionMappings=(ActionName="SetCameraLocation1",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Z)
|
||||
ActionMappings=(ActionName="SetCameraLocation2",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=X)
|
||||
ActionMappings=(ActionName="SetCameraLocation3",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=C)
|
||||
ActionMappings=(ActionName="SetCameraLocation4",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=V)
|
||||
ActionMappings=(ActionName="SetCameraLocation5",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Two)
|
||||
ActionMappings=(ActionName="SetCameraLocation6",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Three)
|
||||
ActionMappings=(ActionName="SetCameraLocation7",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Four)
|
||||
ActionMappings=(ActionName="StandGround",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=S)
|
||||
ActionMappings=(ActionName="SwitchAbilityCommandLayer",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)
|
||||
ActionMappings=(ActionName="TheCheatToRuleThemAll",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=None)
|
||||
ActionMappings=(ActionName="Toggle Gamepad",bShift=False,bCtrl=True,bAlt=True,bCmd=False,Key=Slash)
|
||||
ActionMappings=(ActionName="UpArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Up)
|
||||
ActionMappings=(ActionName="ZoomIn",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MouseScrollUp)
|
||||
ActionMappings=(ActionName="ZoomOut",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MouseScrollDown)
|
||||
ActionMappings=(ActionName="UnitTypeSelectionModifier",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftControl)
|
||||
ActionMappings = (ActionName="Ability1",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Q)
|
||||
ActionMappings = (ActionName="Ability2",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=W)
|
||||
ActionMappings = (ActionName="Ability3",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=E)
|
||||
ActionMappings = (ActionName="Ability4",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=R)
|
||||
ActionMappings = (ActionName="Ability5",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=F)
|
||||
ActionMappings = (ActionName="Ability6",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=V)
|
||||
ActionMappings = (ActionName="Ability7",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=A)
|
||||
ActionMappings = (ActionName="Ability8",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=S)
|
||||
ActionMappings = (ActionName="AttackMove",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=A)
|
||||
ActionMappings = (ActionName="CancelOrders",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Tilde)
|
||||
ActionMappings = (ActionName="CompleteAllTraining",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)
|
||||
ActionMappings = (ActionName="CompleteConstructions",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=K)
|
||||
ActionMappings = (ActionName="ConstructionTab",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=C)
|
||||
ActionMappings = (ActionName="ControlGroup1",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=D)
|
||||
ActionMappings = (ActionName="ControlGroup10",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Zero)
|
||||
ActionMappings = (ActionName="ControlGroup2",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Two)
|
||||
ActionMappings = (ActionName="ControlGroup3",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Three)
|
||||
ActionMappings = (ActionName="ControlGroup4",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Four)
|
||||
ActionMappings = (ActionName="ControlGroup5",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Five)
|
||||
ActionMappings = (ActionName="ControlGroup6",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Six)
|
||||
ActionMappings = (ActionName="ControlGroup7",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Seven)
|
||||
ActionMappings = (ActionName="ControlGroup8",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Eight)
|
||||
ActionMappings = (ActionName="ControlGroup9",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Nine)
|
||||
ActionMappings = (ActionName="ControlGroupAddStealKey",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)
|
||||
ActionMappings = (ActionName="Delete",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Delete)
|
||||
ActionMappings = (ActionName="DisableWeapons",bShift=True,bCtrl=False,bAlt=True,bCmd=False,Key=J)
|
||||
ActionMappings = (ActionName="DownArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Down)
|
||||
ActionMappings = (ActionName="DragPan",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MiddleMouseButton)
|
||||
ActionMappings = (ActionName="Enter Cinematic Camera",bShift=True,bCtrl=False,bAlt=True,bCmd=False,Key=L)
|
||||
ActionMappings = (ActionName="FullMana",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=J)
|
||||
ActionMappings = (ActionName="FullyDamageSelectedUnits",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=P)
|
||||
ActionMappings = (ActionName="GetAlloyEther",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=M)
|
||||
ActionMappings = (ActionName="GetPyre",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=L)
|
||||
ActionMappings = (ActionName="Hide HUD",bShift=True,bCtrl=False,bAlt=True,bCmd=False,Key=O)
|
||||
ActionMappings = (ActionName="InclusiveSelect/QueueCommand",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftShift)
|
||||
ActionMappings = (ActionName="JumpToCameraLocation1",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Z)
|
||||
ActionMappings = (ActionName="JumpToCameraLocation2",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=X)
|
||||
ActionMappings = (ActionName="JumpToCameraLocation3",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=C)
|
||||
ActionMappings = (ActionName="JumpToCameraLocation4",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=V)
|
||||
ActionMappings = (ActionName="JumpToCameraLocation5",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Two)
|
||||
ActionMappings = (ActionName="JumpToCameraLocation6",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Three)
|
||||
ActionMappings = (ActionName="JumpToCameraLocation7",bShift=True,bCtrl=False,bAlt=False,bCmd=False,Key=Four)
|
||||
ActionMappings = (ActionName="LeftArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Left)
|
||||
ActionMappings = (ActionName="LeftMouseClick",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)
|
||||
ActionMappings = (ActionName="MarcoPolo",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Comma)
|
||||
ActionMappings = (ActionName="Menu",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Escape)
|
||||
ActionMappings = (ActionName="Menu",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=F10)
|
||||
ActionMappings = (ActionName="MinimapJumpTo",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)
|
||||
ActionMappings = (ActionName="Move/ContextCommand",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=RightMouseButton)
|
||||
ActionMappings = (ActionName="PyreTab",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=One)
|
||||
ActionMappings = (ActionName="ResearchTab",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Tab)
|
||||
ActionMappings = (ActionName="RespawnNeutrals",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=N)
|
||||
ActionMappings = (ActionName="RightArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Right)
|
||||
ActionMappings = (ActionName="RightMouseClick",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=RightMouseButton)
|
||||
ActionMappings = (ActionName="Select/ConfirmAbility",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)
|
||||
ActionMappings = (ActionName="SelectUnitProductionBuildings",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Z)
|
||||
ActionMappings = (ActionName="SetCameraLocation1",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Z)
|
||||
ActionMappings = (ActionName="SetCameraLocation2",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=X)
|
||||
ActionMappings = (ActionName="SetCameraLocation3",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=C)
|
||||
ActionMappings = (ActionName="SetCameraLocation4",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=V)
|
||||
ActionMappings = (ActionName="SetCameraLocation5",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Two)
|
||||
ActionMappings = (ActionName="SetCameraLocation6",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Three)
|
||||
ActionMappings = (ActionName="SetCameraLocation7",bShift=False,bCtrl=True,bAlt=False,bCmd=False,Key=Four)
|
||||
ActionMappings = (ActionName="StandGround",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=S)
|
||||
ActionMappings = (ActionName="SwitchAbilityCommandLayer",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)
|
||||
ActionMappings = (ActionName="TheCheatToRuleThemAll",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=None)
|
||||
ActionMappings = (ActionName="Toggle Gamepad",bShift=False,bCtrl=True,bAlt=True,bCmd=False,Key=Slash)
|
||||
ActionMappings = (ActionName="UpArrow",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Up)
|
||||
ActionMappings = (ActionName="ZoomIn",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MouseScrollUp)
|
||||
ActionMappings = (ActionName="ZoomOut",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MouseScrollDown)
|
||||
ActionMappings = (ActionName="UnitTypeSelectionModifier",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftControl)
|
||||
```
|
||||
|
||||
***Copy the above content and save the file as `Input.ini`.***
|
||||
|
||||
## Understand the Input.ini
|
||||
@@ -94,13 +93,20 @@ ActionMappings=(ActionName="UnitTypeSelectionModifier",bShift=False,bCtrl=False,
|
||||
You can notice a single line of this file can be broken down like this.
|
||||
|
||||
`ActionMappings=(ActionName="AttackMove",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=A)`
|
||||
|
||||
- `ActionMappings=(***)`: Indicates content is an action mapping. i.e. a hotkey
|
||||
- `ActionName="AttackMove"`: Indicates the name of the selected action. Here, we are using the `AttackMove` move action, that forces your selected army to attack.
|
||||
- `Key=A`: Indicates key being mapped to the action. Set to `Key=Tab` to require the Tab key to be pressed instead, to perform the `AttackMove` action.
|
||||
- `bShift=False`: Indicates that the Shift key is not held. Set to `bShift=True` to require a shift key held to perform the mapped action.
|
||||
- `bCtrl=False`: Indicates that the Ctrl key is not held. Set to `bCtrl=True` to require a ctrl key held to perform the mapped action.
|
||||
- `bAlt=False`: Indicates that the Alt key is not held. Set to `bAlt=True` to require a alt key held to perform the mapped action.
|
||||
- `bCmd=False`: Indicates that the Cmd key is not held. Set to `bCmd=True` to require a cmd key held to perform the mapped action. (Macs not supported by IGP)
|
||||
- `ActionName="AttackMove"`: Indicates the name of the selected action. Here, we are using the `AttackMove` move action,
|
||||
that forces your selected army to attack.
|
||||
- `Key=A`: Indicates key being mapped to the action. Set to `Key=Tab` to require the Tab key to be pressed instead, to
|
||||
perform the `AttackMove` action.
|
||||
- `bShift=False`: Indicates that the Shift key is not held. Set to `bShift=True` to require a shift key held to
|
||||
perform the mapped action.
|
||||
- `bCtrl=False`: Indicates that the Ctrl key is not held. Set to `bCtrl=True` to require a ctrl key held to perform
|
||||
the mapped action.
|
||||
- `bAlt=False`: Indicates that the Alt key is not held. Set to `bAlt=True` to require a alt key held to perform the
|
||||
mapped action.
|
||||
- `bCmd=False`: Indicates that the Cmd key is not held. Set to `bCmd=True` to require a cmd key held to perform the
|
||||
mapped action. (Macs not supported by IGP)
|
||||
|
||||
## Modify the Input.ini file
|
||||
|
||||
@@ -108,9 +114,11 @@ 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.
|
||||
|
||||
*For example, you can swap the Z Key value in SelectUnitProductionBuildings to C. Which would look like this: `ActionMappings=(ActionName="SelectUnitProductionBuildings",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=C)`*
|
||||
*For example, you can swap the Z Key value in SelectUnitProductionBuildings to C. Which would look like
|
||||
this: `ActionMappings=(ActionName="SelectUnitProductionBuildings",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=C)`*
|
||||
|
||||
**Key Values**
|
||||
|
||||
- `AnyKey`
|
||||
- `MouseX`
|
||||
- `MouseY`
|
||||
@@ -242,8 +250,9 @@ To do this, replace any of the Key=`VALUE` mapped to the desired actions with an
|
||||
|
||||
# Transfer the Input.ini file
|
||||
|
||||
Drag and drop this new `Input.ini` file into `WindowsClient` folder in IGP. This folder can be found under `C:\Users\YOUR_USER\AppData\Local\Programs\CURRENT_IMMORTAL_CLIENT\Immortal\Saved\Config\WindowsClient\`.
|
||||
Remember to use proper values for `YOUR_USER` and `CURRENT_IMMORTAL_CLIENT`.
|
||||
Drag and drop this new `Input.ini` file into `WindowsClient` folder in IGP. This folder can be found
|
||||
under `C:\Users\YOUR_USER\AppData\Local\Programs\CURRENT_IMMORTAL_CLIENT\Immortal\Saved\Config\WindowsClient\`. Remember
|
||||
to use proper values for `YOUR_USER` and `CURRENT_IMMORTAL_CLIENT`.
|
||||
|
||||
There will be a blank `Input.ini` file in this folder. You can safely override it with your modified file.
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
---
|
||||
title: Armor Types
|
||||
summary: Heavy, Medium, and Light. What does it mean?
|
||||
created_date: 4/13/2000
|
||||
updated_date: 4/13/2000
|
||||
title: Armor Types summary: Heavy, Medium, and Light. What does it mean? created_date: 4/13/2000 updated_date: 4/13/2000
|
||||
---
|
||||
|
||||
## Armor Types
|
||||
@@ -13,12 +10,14 @@ All units in "IMMORTAL: Gates of Pyre" have one of the three armor types.
|
||||
- Medium
|
||||
- Light
|
||||
|
||||
These types mean nothing inherently. A Light armor unit will not take more damage than a Heavy armor unit, from the same damage source.
|
||||
These types mean nothing inherently. A Light armor unit will not take more damage than a Heavy armor unit, from the same
|
||||
damage source.
|
||||
|
||||
Where this change is some units deal particular damage to a particular armor type.
|
||||
|
||||
For example, a Dervish deals 16 damage generally, 24 to medium, and 32 damage to heavy armor types.
|
||||
As an opposite example, the Zephyr will deal 20 damage generally, 24 to medium and 28 to heavy armor types. And as a different example, Sipari deals 20 damage generally, 18 damage to heavy armor.
|
||||
For example, a Dervish deals 16 damage generally, 24 to medium, and 32 damage to heavy armor types. As an opposite
|
||||
example, the Zephyr will deal 20 damage generally, 24 to medium and 28 to heavy armor types. And as a different example,
|
||||
Sipari deals 20 damage generally, 18 damage to heavy armor.
|
||||
|
||||
Wait? There was no pattern to what general and specific damage is.
|
||||
|
||||
@@ -32,29 +31,36 @@ They have two armies, one is a pack of Masked Hunters, and one is a pack of Xaca
|
||||
|
||||
Masked Hunters have the light armor type and Xacals have the heavy armor type.
|
||||
|
||||
Well, you know Dervish deals the most damage to Light, and Zephyr deals the most damage to heavy, so you should generally have your Dervish attack the Masked Hunters and the Zephyr's attack the Xacals.
|
||||
Well, you know Dervish deals the most damage to Light, and Zephyr deals the most damage to heavy, so you should
|
||||
generally have your Dervish attack the Masked Hunters and the Zephyr's attack the Xacals.
|
||||
|
||||
But wait, your opponent moved their two armies together!
|
||||
|
||||
Defensively, Masked Hunters deal less damage to the heavy armor type, and Xacals do less damage to Light.
|
||||
|
||||
So while you want your Dervish to attack Masked Hunters, and the Zephyrs to attack the Xacals, you also want your Dervish to defend against the Xacals and Zephyrs to defend against the Masked Hunters.
|
||||
So while you want your Dervish to attack Masked Hunters, and the Zephyrs to attack the Xacals, you also want your
|
||||
Dervish to defend against the Xacals and Zephyrs to defend against the Masked Hunters.
|
||||
|
||||
In mixed battles, you can spend some micro on your units to defend against enemy attackers they are strong against while having them attack potentially different enemies.
|
||||
|
||||
So what should you do? Build some Sipari, a Light armor unit, to help tank some Xacal shots, to give your Dervish and Zephyrs room to maneuver against their key targets.
|
||||
In mixed battles, you can spend some micro on your units to defend against enemy attackers they are strong against while
|
||||
having them attack potentially different enemies.
|
||||
|
||||
So what should you do? Build some Sipari, a Light armor unit, to help tank some Xacal shots, to give your Dervish and
|
||||
Zephyrs room to maneuver against their key targets.
|
||||
|
||||
## What else is there?
|
||||
|
||||
Some units have additional tags, such as Structure and Etheric. Units can deal particular, or BONUS damage against enemies with those tags.
|
||||
Some units have additional tags, such as Structure and Etheric. Units can deal particular, or BONUS damage against
|
||||
enemies with those tags.
|
||||
|
||||
**What are structures?** Structures are any building. Pretty much anything not a part of your moving army.
|
||||
|
||||
As an example of bonus damage, the Absolver deals +8 damage to structures, giving it 29 DPS to heavy structures. Conversely, it has 23 DPS against heavy structures when deployed, meaning Absolvers are better at sniping most structures when mobilized.
|
||||
As an example of bonus damage, the Absolver deals +8 damage to structures, giving it 29 DPS to heavy structures.
|
||||
Conversely, it has 23 DPS against heavy structures when deployed, meaning Absolvers are better at sniping most
|
||||
structures when mobilized.
|
||||
|
||||
Heads up though, that not all structures are heavy, examples include Radiant Wards generated by the Dervish.
|
||||
|
||||
**What are etherics?** Etherics are most caster units in the game. These casters can generally win long drawn-out fights, so are good to snipe with units that deal extra damage against them.
|
||||
**What are etherics?** Etherics are most caster units in the game. These casters can generally win long drawn-out
|
||||
fights, so are good to snipe with units that deal extra damage against them.
|
||||
|
||||
An etheric example would be the Bloodbounds Culling Strike ability, which deals bonus damage against etheric.
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
---
|
||||
title: Economy Overview
|
||||
summary: Alloy, Ether and Supply. Don't forget to expand!
|
||||
created_date: 1/01/2000
|
||||
updated_date: 1/01/2000
|
||||
title: Economy Overview summary: Alloy, Ether and Supply. Don't forget to expand!
|
||||
created_date: 1/01/2000 updated_date: 1/01/2000
|
||||
---
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
---
|
||||
title: Families, Factions, and Immortal Vanguards
|
||||
summary: How IMMORTAL: Gates of Pyre handle your army selection choices
|
||||
created_date: 1/01/2000
|
||||
updated_date: 1/01/2000
|
||||
title: Families, Factions, and Immortal Vanguards summary: How IMMORTAL: Gates of Pyre handle your army selection
|
||||
choices created_date: 1/01/2000 updated_date: 1/01/2000
|
||||
---
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Immortals Spells and Pyre
|
||||
summary: Customize your hotkeys in the pre-alpha.
|
||||
created_date: 1/01/2000
|
||||
updated_date: 1/01/2000
|
||||
title: Immortals Spells and Pyre summary: Customize your hotkeys in the pre-alpha. created_date: 1/01/2000 updated_date:
|
||||
1/01/2000
|
||||
---
|
||||
|
||||
## What are Immortals
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
---
|
||||
title: Timing and Scouting
|
||||
summary: Knowing is half the battle.
|
||||
created_date: 1/01/2000
|
||||
updated_date: 1/01/2000
|
||||
title: Timing and Scouting summary: Knowing is half the battle. created_date: 1/01/2000 updated_date: 1/01/2000
|
||||
---
|
||||
|
||||
## Timing
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
--info-secondary: #4c3e59;
|
||||
--info-secondary-border: #7e58a2;
|
||||
|
||||
|
||||
--info-hover: #451376;
|
||||
--info-border-hover: #210b36;
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -8,8 +8,8 @@ self.addEventListener('fetch', event => event.respondWith(onFetch(event)));
|
||||
|
||||
const cacheNamePrefix = 'offline-cache-';
|
||||
const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`;
|
||||
const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ];
|
||||
const offlineAssetsExclude = [ /^service-worker\.js$/ ];
|
||||
const offlineAssetsInclude = [/\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/];
|
||||
const offlineAssetsExclude = [/^service-worker\.js$/];
|
||||
|
||||
async function onInstall(event) {
|
||||
console.info('Service worker: Install');
|
||||
@@ -18,7 +18,7 @@ async function onInstall(event) {
|
||||
const assetsRequests = self.assetsManifest.assets
|
||||
.filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url)))
|
||||
.filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url)))
|
||||
.map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' }));
|
||||
.map(asset => new Request(asset.url, {integrity: asset.hash, cache: 'no-cache'}));
|
||||
await caches.open(cacheName).then(cache => cache.addAll(assetsRequests));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user