Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a339b67380 | |||
| fe1a583da9 | |||
| 8ce9084ffb | |||
| 86580a9f5d | |||
| 3696f474e9 |
@@ -25,7 +25,7 @@ jobs:
|
|||||||
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_CALM_MUD_04916B210 }}
|
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_CALM_MUD_04916B210 }}
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
action: "upload"
|
action: "upload"
|
||||||
app_location: "Web"
|
app_location: "IGP"
|
||||||
api_location: ""
|
api_location: ""
|
||||||
output_location: "./wwwroot"
|
output_location: "./wwwroot"
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_NICE_COAST_0F8B08010 }}
|
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_NICE_COAST_0F8B08010 }}
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
action: "upload"
|
action: "upload"
|
||||||
app_location: "Web"
|
app_location: "IGP"
|
||||||
api_location: ""
|
api_location: ""
|
||||||
output_location: "./wwwroot"
|
output_location: "./wwwroot"
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,6 @@ DocProject/Help/html
|
|||||||
|
|
||||||
# Click-Once directory
|
# Click-Once directory
|
||||||
publish/
|
publish/
|
||||||
publish_release/
|
|
||||||
|
|
||||||
# Publish Web Output
|
# Publish Web Output
|
||||||
*.[Pp]ublish.xml
|
*.[Pp]ublish.xml
|
||||||
@@ -265,6 +264,3 @@ __pycache__/
|
|||||||
|
|
||||||
**/.vs/
|
**/.vs/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
|
||||||
publish_release/
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[]
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
3.0
|
|
||||||
Vendored
+3
-3
@@ -7,7 +7,7 @@
|
|||||||
"type": "process",
|
"type": "process",
|
||||||
"args": [
|
"args": [
|
||||||
"build",
|
"build",
|
||||||
"${workspaceFolder}/Web/Web.csproj",
|
"${workspaceFolder}/IGP/IGP.csproj",
|
||||||
"/property:GenerateFullPaths=true",
|
"/property:GenerateFullPaths=true",
|
||||||
"/consoleloggerparameters:NoSummary"
|
"/consoleloggerparameters:NoSummary"
|
||||||
],
|
],
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"type": "process",
|
"type": "process",
|
||||||
"args": [
|
"args": [
|
||||||
"publish",
|
"publish",
|
||||||
"${workspaceFolder}/Web/Web.csproj",
|
"${workspaceFolder}/IGP/IGP.csproj",
|
||||||
"/property:GenerateFullPaths=true",
|
"/property:GenerateFullPaths=true",
|
||||||
"/consoleloggerparameters:NoSummary"
|
"/consoleloggerparameters:NoSummary"
|
||||||
],
|
],
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
"watch",
|
"watch",
|
||||||
"run",
|
"run",
|
||||||
"--project",
|
"--project",
|
||||||
"${workspaceFolder}/Web/Web.csproj"
|
"${workspaceFolder}/IGP/IGP.csproj"
|
||||||
],
|
],
|
||||||
"problemMatcher": "$msCompile"
|
"problemMatcher": "$msCompile"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
|
||||||
<RootNamespace>API</RootNamespace>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="HotChocolate.AspNetCore" Version="16.1.2"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Model\Model.csproj"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,254 +0,0 @@
|
|||||||
using Model.Entity;
|
|
||||||
using Model.Entity.Parts;
|
|
||||||
|
|
||||||
namespace API.GraphQL.Types;
|
|
||||||
|
|
||||||
public class EntityGraphType : ObjectType<EntityModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Name("Entity");
|
|
||||||
|
|
||||||
descriptor.Field(e => e.DataType).Name("id");
|
|
||||||
descriptor.Field(e => e.EntityType).Name("type");
|
|
||||||
descriptor.Field(e => e.IsSpeculative);
|
|
||||||
descriptor.Field(e => e.Descriptive).Name("descriptiveType");
|
|
||||||
|
|
||||||
descriptor.Ignore(e => e.EntityParts);
|
|
||||||
|
|
||||||
descriptor.Field("name")
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().GetName());
|
|
||||||
|
|
||||||
descriptor.Field("factionName")
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().GetFaction());
|
|
||||||
|
|
||||||
descriptor.Field("info")
|
|
||||||
.Type<EntityInfoGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Info());
|
|
||||||
|
|
||||||
descriptor.Field("production")
|
|
||||||
.Type<EntityProductionGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Production());
|
|
||||||
|
|
||||||
descriptor.Field("supply")
|
|
||||||
.Type<EntitySupplyGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Supply());
|
|
||||||
|
|
||||||
descriptor.Field("tier")
|
|
||||||
.Type<EntityTierGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Tier());
|
|
||||||
|
|
||||||
descriptor.Field("movement")
|
|
||||||
.Type<EntityMovementGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Movement());
|
|
||||||
|
|
||||||
descriptor.Field("vitality")
|
|
||||||
.Type<EntityVitalityGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Vitality());
|
|
||||||
|
|
||||||
descriptor.Field("requirements")
|
|
||||||
.Type<ListType<EntityRequirementGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Requirements());
|
|
||||||
|
|
||||||
descriptor.Field("weapons")
|
|
||||||
.Type<ListType<EntityWeaponGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Weapons());
|
|
||||||
|
|
||||||
descriptor.Field("hotkey")
|
|
||||||
.Type<EntityHotkeyGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Hotkey());
|
|
||||||
|
|
||||||
descriptor.Field("faction")
|
|
||||||
.Type<EntityFactionGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Faction());
|
|
||||||
|
|
||||||
descriptor.Field("harvest")
|
|
||||||
.Type<EntityHarvestGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Harvest());
|
|
||||||
|
|
||||||
descriptor.Field("idAbilities")
|
|
||||||
.Type<ListType<EntityIdReferenceGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().IdAbilities());
|
|
||||||
|
|
||||||
descriptor.Field("idArmies")
|
|
||||||
.Type<ListType<EntityIdReferenceGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().IdArmies());
|
|
||||||
|
|
||||||
descriptor.Field("idPassives")
|
|
||||||
.Type<ListType<EntityIdReferenceGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().IdPassives());
|
|
||||||
|
|
||||||
descriptor.Field("idUpgrades")
|
|
||||||
.Type<ListType<EntityIdReferenceGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().IdUpgrades());
|
|
||||||
|
|
||||||
descriptor.Field("idVanguards")
|
|
||||||
.Type<ListType<EntityIdReferenceGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().IdVanguards());
|
|
||||||
|
|
||||||
descriptor.Field("idPyreSpells")
|
|
||||||
.Type<ListType<EntityIdReferenceGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().IdPyreSpells());
|
|
||||||
|
|
||||||
descriptor.Field("mechanics")
|
|
||||||
.Type<ListType<EntityMechanicGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Mechanics());
|
|
||||||
|
|
||||||
descriptor.Field("passives")
|
|
||||||
.Type<ListType<EntityNamedDescGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Passives());
|
|
||||||
|
|
||||||
descriptor.Field("strategies")
|
|
||||||
.Type<ListType<EntityStrategyGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Strategies());
|
|
||||||
|
|
||||||
descriptor.Field("replaceds")
|
|
||||||
.Type<ListType<EntityVanguardReplacedGraphType>>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().Replaceds());
|
|
||||||
|
|
||||||
descriptor.Field("vanguardAdded")
|
|
||||||
.Type<EntityVanguardAddedGraphType>()
|
|
||||||
.Resolve(ctx => ctx.Parent<EntityModel>().VanguardAdded());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityInfoGraphType : ObjectType<EntityInfoModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityInfoModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
descriptor.Field(e => e.Name);
|
|
||||||
descriptor.Field(e => e.Descriptive).Name("descriptiveType");
|
|
||||||
descriptor.Field(e => e.Description);
|
|
||||||
descriptor.Field(e => e.Notes);
|
|
||||||
descriptor.Field(e => e.FlavorText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityProductionGraphType : ObjectType<EntityProductionModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityProductionModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntitySupplyGraphType : ObjectType<EntitySupplyModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntitySupplyModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityTierGraphType : ObjectType<EntityTierModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityTierModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityMovementGraphType : ObjectType<EntityMovementModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityMovementModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityVitalityGraphType : ObjectType<EntityVitalityModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityVitalityModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityRequirementGraphType : ObjectType<EntityRequirementModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityRequirementModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityWeaponGraphType : ObjectType<EntityWeaponModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityWeaponModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityHotkeyGraphType : ObjectType<EntityHotkeyModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityHotkeyModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityFactionGraphType : ObjectType<EntityFactionModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityFactionModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityHarvestGraphType : ObjectType<EntityHarvestModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityHarvestModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityIdReferenceGraphType : ObjectType<EntityIdAbilityModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityIdAbilityModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityMechanicGraphType : ObjectType<EntityMechanicModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityMechanicModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityNamedDescGraphType : ObjectType<EntityPassiveModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityPassiveModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityStrategyGraphType : ObjectType<EntityStrategyModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityStrategyModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityVanguardReplacedGraphType : ObjectType<EntityVanguardReplacedModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityVanguardReplacedModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityVanguardAddedGraphType : ObjectType<EntityVanguardAddedModel>
|
|
||||||
{
|
|
||||||
protected override void Configure(IObjectTypeDescriptor<EntityVanguardAddedModel> descriptor)
|
|
||||||
{
|
|
||||||
descriptor.Ignore(e => e.Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using API.GraphQL.Types;
|
|
||||||
using Model.Entity.Data;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
|
||||||
|
|
||||||
builder.Services
|
|
||||||
.AddGraphQLServer()
|
|
||||||
.AddQueryType(d =>
|
|
||||||
{
|
|
||||||
d.Name("Query");
|
|
||||||
|
|
||||||
d.Field("entities")
|
|
||||||
.Type<NonNullType<ListType<NonNullType<EntityGraphType>>>>()
|
|
||||||
.Resolve(ctx => EntityData.Get().Values.ToList());
|
|
||||||
|
|
||||||
d.Field("entity")
|
|
||||||
.Type<EntityGraphType>()
|
|
||||||
.Argument("id", a => a.Type<NonNullType<StringType>>())
|
|
||||||
.Resolve(ctx =>
|
|
||||||
{
|
|
||||||
var id = ctx.ArgumentValue<string>("id");
|
|
||||||
EntityData.Get().TryGetValue(id, out var entity);
|
|
||||||
return entity;
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.AddType<EntityGraphType>();
|
|
||||||
|
|
||||||
var app = builder.Build();
|
|
||||||
|
|
||||||
app.MapGraphQL();
|
|
||||||
|
|
||||||
app.Run();
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"profiles": {
|
|
||||||
"API": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
},
|
|
||||||
"applicationUrl": "https://localhost:63192;http://localhost:63193"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<RootNamespace>IGP.Calculator.Cli</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Services\Services.csproj"/>
|
|
||||||
<ProjectReference Include="..\Model\Model.csproj"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
-155
@@ -1,155 +0,0 @@
|
|||||||
using IGP.Calculator.Cli.Services;
|
|
||||||
using Model.Entity;
|
|
||||||
using Model.Entity.Data;
|
|
||||||
using Services.Immortal;
|
|
||||||
using Services.Website;
|
|
||||||
|
|
||||||
var faction = DataType.FACTION_QRath;
|
|
||||||
var immortal = DataType.IMMORTAL_Orzum;
|
|
||||||
var attackTime = 1500;
|
|
||||||
var entityNames = new List<string>();
|
|
||||||
|
|
||||||
for (var i = 0; i < args.Length; i++)
|
|
||||||
switch (args[i].ToLower())
|
|
||||||
{
|
|
||||||
case "--faction" when i + 1 < args.Length:
|
|
||||||
var f = args[++i].ToLower();
|
|
||||||
faction = f switch
|
|
||||||
{
|
|
||||||
"qrath" => DataType.FACTION_QRath,
|
|
||||||
"aru" => DataType.FACTION_Aru,
|
|
||||||
_ => throw new Exception($"Unknown faction '{args[i]}'. Use QRath or Aru.")
|
|
||||||
};
|
|
||||||
immortal = f switch
|
|
||||||
{
|
|
||||||
"qrath" => DataType.IMMORTAL_Orzum,
|
|
||||||
"aru" => DataType.IMMORTAL_Mala,
|
|
||||||
_ => immortal
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case "--immortal" when i + 1 < args.Length:
|
|
||||||
var im = args[++i];
|
|
||||||
immortal = im switch
|
|
||||||
{
|
|
||||||
nameof(DataType.IMMORTAL_Orzum) => DataType.IMMORTAL_Orzum,
|
|
||||||
nameof(DataType.IMMORTAL_Ajari) => DataType.IMMORTAL_Ajari,
|
|
||||||
nameof(DataType.IMMORTAL_Atzlan) => DataType.IMMORTAL_Atzlan,
|
|
||||||
nameof(DataType.IMMORTAL_Mala) => DataType.IMMORTAL_Mala,
|
|
||||||
nameof(DataType.IMMORTAL_Xol) => DataType.IMMORTAL_Xol,
|
|
||||||
_ => throw new Exception($"Unknown immortal '{im}'.")
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case "--attack-time" or "-a" when i + 1 < args.Length:
|
|
||||||
attackTime = int.Parse(args[++i]);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
entityNames.Add(args[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var toastService = new ToastService();
|
|
||||||
var storageService = new NullStorageService();
|
|
||||||
var timingService = new TimingService(storageService);
|
|
||||||
timingService.SetAttackTime(attackTime);
|
|
||||||
var buildOrderService = new BuildOrderService(toastService, timingService);
|
|
||||||
var economyService = new EconomyService();
|
|
||||||
|
|
||||||
buildOrderService.Reset(faction);
|
|
||||||
economyService.Calculate(buildOrderService, timingService, 0);
|
|
||||||
|
|
||||||
Console.WriteLine($"Faction: {(faction == DataType.FACTION_QRath ? "Q'Rath" : "Aru")}");
|
|
||||||
Console.WriteLine($"Immortal: {immortal.Replace("IMMORTAL_", "")}");
|
|
||||||
Console.WriteLine($"Attack Time: {attackTime}s");
|
|
||||||
Console.WriteLine(new string('-', 50));
|
|
||||||
|
|
||||||
foreach (var name in entityNames)
|
|
||||||
{
|
|
||||||
if (name.StartsWith("wait ", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
var seconds = int.Parse(name[5..]);
|
|
||||||
buildOrderService.AddWait(seconds);
|
|
||||||
economyService.Calculate(buildOrderService, timingService, buildOrderService.GetLastRequestInterval());
|
|
||||||
Console.WriteLine($" Wait {seconds}s -> now at interval {buildOrderService.GetLastRequestInterval()}");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.StartsWith("waitto ", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
var interval = int.Parse(name[7..]);
|
|
||||||
buildOrderService.AddWaitTo(interval);
|
|
||||||
economyService.Calculate(buildOrderService, timingService, buildOrderService.GetLastRequestInterval());
|
|
||||||
Console.WriteLine($" Wait to {interval}s -> now at interval {buildOrderService.GetLastRequestInterval()}");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var entity = FindEntity(name, faction, immortal);
|
|
||||||
if (entity == null)
|
|
||||||
{
|
|
||||||
Console.WriteLine($" ERROR: '{name}' not found for this faction/immortal.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var beforeInterval = buildOrderService.GetLastRequestInterval();
|
|
||||||
var added = buildOrderService.Add(entity, economyService);
|
|
||||||
if (added)
|
|
||||||
{
|
|
||||||
economyService.Calculate(buildOrderService, timingService, buildOrderService.GetLastRequestInterval());
|
|
||||||
var startedAt = buildOrderService.GetLastRequestInterval();
|
|
||||||
var production = entity.Production();
|
|
||||||
var completedAt = production != null ? startedAt + production.BuildTime : startedAt;
|
|
||||||
var cost = production != null
|
|
||||||
? $" [{production.Alloy}a/{production.Ether}e/{production.Pyre}p, {production.BuildTime}s]"
|
|
||||||
: "";
|
|
||||||
Console.WriteLine($" {entity.GetName(),-25} start={startedAt,4}s done={completedAt,4}s{cost}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine($" ERROR: Could not add '{name}'.");
|
|
||||||
var toasts = toastService.GetToasts();
|
|
||||||
if (toasts.Count > 0)
|
|
||||||
{
|
|
||||||
var lastToast = toasts[0];
|
|
||||||
Console.WriteLine($" Reason: {lastToast.Title} - {lastToast.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine(new string('-', 50));
|
|
||||||
|
|
||||||
var lastInterval = buildOrderService.GetLastRequestInterval();
|
|
||||||
var finalEconomy = economyService.GetEconomy(timingService.GetAttackTime());
|
|
||||||
var lastEconomy = economyService.GetEconomy(lastInterval);
|
|
||||||
|
|
||||||
Console.WriteLine($"Army Attacking At: {timingService.GetAttackTime()}s");
|
|
||||||
Console.WriteLine("");
|
|
||||||
Console.WriteLine($"At attack time ({timingService.GetAttackTime()}s):");
|
|
||||||
Console.WriteLine($" Alloy: {finalEconomy.Alloy,10:F1}");
|
|
||||||
Console.WriteLine($" Ether: {finalEconomy.Ether,10:F1}");
|
|
||||||
Console.WriteLine($" Pyre: {finalEconomy.Pyre,10:F1}");
|
|
||||||
Console.WriteLine("");
|
|
||||||
Console.WriteLine($"At last build action ({lastInterval}s):");
|
|
||||||
Console.WriteLine($" Alloy: {lastEconomy.Alloy,10:F1}");
|
|
||||||
Console.WriteLine($" Ether: {lastEconomy.Ether,10:F1}");
|
|
||||||
Console.WriteLine($" Pyre: {lastEconomy.Pyre,10:F1}");
|
|
||||||
|
|
||||||
static EntityModel? FindEntity(string name, string faction, string immortal)
|
|
||||||
{
|
|
||||||
var candidates = EntityModel.GetList()
|
|
||||||
.Where(e => e.Info()?.Name?.Equals(name, StringComparison.OrdinalIgnoreCase) == true)
|
|
||||||
.Where(e => e.Faction()?.Faction == faction)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
if (candidates.Count == 0)
|
|
||||||
candidates = EntityModel.GetList()
|
|
||||||
.Where(e => e.Info()?.Name?.Equals(name, StringComparison.OrdinalIgnoreCase) == true)
|
|
||||||
.Where(e => e.Faction() == null || e.Faction()!.Faction == DataType.FACTION_Neutral)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
if (candidates.Count == 0) return null;
|
|
||||||
if (candidates.Count == 1) return candidates[0];
|
|
||||||
|
|
||||||
var vanguardMatch = candidates.FirstOrDefault(e => e.VanguardAdded()?.ImmortalId == immortal);
|
|
||||||
if (vanguardMatch != null) return vanguardMatch;
|
|
||||||
|
|
||||||
return candidates.FirstOrDefault(e => e.VanguardAdded() == null);
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
using Services;
|
|
||||||
|
|
||||||
namespace IGP.Calculator.Cli.Services;
|
|
||||||
|
|
||||||
public class NullStorageService : IStorageService
|
|
||||||
{
|
|
||||||
private readonly Dictionary<string, object?> _store = new();
|
|
||||||
|
|
||||||
public void Subscribe(Action action)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Unsubscribe(Action action)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public T GetValue<T>(string forKey)
|
|
||||||
{
|
|
||||||
if (_store.TryGetValue(forKey, out var value) && value is T typed)
|
|
||||||
return typed;
|
|
||||||
return default!;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetValue<T>(string key, T value)
|
|
||||||
{
|
|
||||||
_store[key] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task Load()
|
|
||||||
{
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
|
||||||
|
<StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
|
||||||
|
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
@page "/counter"
|
@page "/counter"
|
||||||
@rendermode InteractiveServer
|
@rendermode InteractiveWebAssembly
|
||||||
|
|
||||||
<PageTitle>Counter</PageTitle>
|
<PageTitle>Counter</PageTitle>
|
||||||
|
|
||||||
@@ -16,5 +16,4 @@
|
|||||||
{
|
{
|
||||||
currentCount++;
|
currentCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
||||||
|
|
||||||
|
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
||||||
|
|
||||||
|
await builder.Build().RunAsync();
|
||||||
@@ -6,6 +6,4 @@
|
|||||||
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
||||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||||
@using Microsoft.JSInterop
|
@using Microsoft.JSInterop
|
||||||
@using Server
|
@using Client.Client
|
||||||
@using Server.Components
|
|
||||||
@using Server.Components.Layout
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Client.Client\Client.Client.csproj" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<base href="/" />
|
||||||
|
<ResourcePreloader />
|
||||||
|
<link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]" />
|
||||||
|
<link rel="stylesheet" href="@Assets["app.css"]" />
|
||||||
|
<link rel="stylesheet" href="@Assets["Client.styles.css"]" />
|
||||||
|
<ImportMap />
|
||||||
|
<link rel="icon" type="image/png" href="favicon.png" />
|
||||||
|
<HeadOutlet />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<Routes />
|
||||||
|
<script src="@Assets["_framework/blazor.web.js"]"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
+4
-6
@@ -1,6 +1,6 @@
|
|||||||
<div class="top-row ps-3 navbar navbar-dark">
|
<div class="top-row ps-3 navbar navbar-dark">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<a class="navbar-brand" href="">Hybrid</a>
|
<a class="navbar-brand" href="">Client</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -13,16 +13,13 @@
|
|||||||
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
|
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link" href="database">
|
|
||||||
<span class="bi bi-database-fill-nav-menu" aria-hidden="true"></span> Database
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link" href="counter">
|
<NavLink class="nav-link" href="counter">
|
||||||
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
|
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="nav-item px-3">
|
<div class="nav-item px-3">
|
||||||
<NavLink class="nav-link" href="weather">
|
<NavLink class="nav-link" href="weather">
|
||||||
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
|
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
|
||||||
@@ -30,3 +27,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -25,12 +25,12 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
@code{
|
@code{
|
||||||
[CascadingParameter] private HttpContext? HttpContext { get; set; }
|
[CascadingParameter]
|
||||||
|
private HttpContext? HttpContext { get; set; }
|
||||||
|
|
||||||
private string? RequestId { get; set; }
|
private string? RequestId { get; set; }
|
||||||
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||||
|
|
||||||
protected override void OnInitialized() =>
|
protected override void OnInitialized() =>
|
||||||
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
|
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
|
||||||
|
|
||||||
}
|
}
|
||||||
+1
-4
@@ -9,9 +9,7 @@
|
|||||||
|
|
||||||
@if (forecasts == null)
|
@if (forecasts == null)
|
||||||
{
|
{
|
||||||
<p>
|
<p><em>Loading...</em></p>
|
||||||
<em>Loading...</em>
|
|
||||||
</p>
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -63,5 +61,4 @@ else
|
|||||||
public string? Summary { get; set; }
|
public string? Summary { get; set; }
|
||||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="new[] { typeof(Client._Imports).Assembly }" NotFoundPage="typeof(Pages.NotFound)">
|
||||||
|
<Found Context="routeData">
|
||||||
|
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
|
||||||
|
<FocusOnNavigate RouteData="routeData" Selector="h1" />
|
||||||
|
</Found>
|
||||||
|
</Router>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
@using System.Net.Http
|
||||||
|
@using System.Net.Http.Json
|
||||||
|
@using Microsoft.AspNetCore.Components.Forms
|
||||||
|
@using Microsoft.AspNetCore.Components.Routing
|
||||||
|
@using Microsoft.AspNetCore.Components.Web
|
||||||
|
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
||||||
|
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||||
|
@using Microsoft.JSInterop
|
||||||
|
@using Client
|
||||||
|
@using Client.Client
|
||||||
|
@using Client.Components
|
||||||
|
@using Client.Components.Layout
|
||||||
@@ -1,21 +1,24 @@
|
|||||||
using Server.Components;
|
using Client.Client.Pages;
|
||||||
|
using Client.Components;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddRazorComponents()
|
builder.Services.AddRazorComponents()
|
||||||
.AddInteractiveServerComponents();
|
.AddInteractiveWebAssemblyComponents();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
// Configure the HTTP request pipeline.
|
// Configure the HTTP request pipeline.
|
||||||
if (!app.Environment.IsDevelopment())
|
if (app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseWebAssemblyDebugging();
|
||||||
|
} else
|
||||||
{
|
{
|
||||||
app.UseExceptionHandler("/Error", createScopeForErrors: true);
|
app.UseExceptionHandler("/Error", createScopeForErrors: true);
|
||||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||||
app.UseHsts();
|
app.UseHsts();
|
||||||
}
|
}
|
||||||
|
|
||||||
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
|
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
|
||||||
app.UseHttpsRedirection();
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
@@ -23,6 +26,7 @@ app.UseAntiforgery();
|
|||||||
|
|
||||||
app.MapStaticAssets();
|
app.MapStaticAssets();
|
||||||
app.MapRazorComponents<App>()
|
app.MapRazorComponents<App>()
|
||||||
.AddInteractiveServerRenderMode();
|
.AddInteractiveWebAssemblyRenderMode()
|
||||||
|
.AddAdditionalAssemblies(typeof(Client.Client._Imports).Assembly);
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
+4
-2
@@ -5,7 +5,8 @@
|
|||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"dotnetRunMessages": true,
|
"dotnetRunMessages": true,
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"applicationUrl": "http://localhost:5024",
|
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
|
||||||
|
"applicationUrl": "http://localhost:5029",
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
}
|
||||||
@@ -14,7 +15,8 @@
|
|||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"dotnetRunMessages": true,
|
"dotnetRunMessages": true,
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"applicationUrl": "https://localhost:7116;http://localhost:5024",
|
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
|
||||||
|
"applicationUrl": "https://localhost:7182;http://localhost:5029",
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -4,7 +4,7 @@
|
|||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<RootNamespace>Components</RootNamespace>
|
<LangVersion>14</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
@inject IGlossaryService glossaryService
|
|
||||||
|
|
||||||
@if (TermId != null)
|
|
||||||
{
|
|
||||||
var term = glossaryService.GetTerm(TermId);
|
|
||||||
if (term != null)
|
|
||||||
{
|
|
||||||
<div class="glossaryTooltipWrapper">
|
|
||||||
<div class="glossaryTooltipContent">
|
|
||||||
<div class="glossaryTooltipHeader">
|
|
||||||
<span class="glossaryTooltipTerm">@term.Term</span>
|
|
||||||
<span class="glossaryTooltipCategory">@term.Category</span>
|
|
||||||
</div>
|
|
||||||
<div class="glossaryTooltipBody">
|
|
||||||
@term.ShortDefinition
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@ChildContent
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.glossaryTooltipWrapper {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossaryTooltipContent {
|
|
||||||
visibility: hidden;
|
|
||||||
position: absolute;
|
|
||||||
width: 400px;
|
|
||||||
max-width: 93vw;
|
|
||||||
bottom: 100%;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
padding: 12px;
|
|
||||||
z-index: 2147483647;
|
|
||||||
background-color: var(--info-secondary);
|
|
||||||
border: 1px solid var(--info-secondary-border);
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.5);
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossaryTooltipWrapper:hover .glossaryTooltipContent {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossaryTooltipHeader {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossaryTooltipTerm {
|
|
||||||
font-weight: 800;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossaryTooltipCategory {
|
|
||||||
font-size: 0.8rem;
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossaryTooltipBody {
|
|
||||||
font-size: 0.9rem;
|
|
||||||
line-height: 1.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@media only screen and (max-width: 1025px) {
|
|
||||||
.glossaryTooltipContent {
|
|
||||||
margin: auto;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
[Parameter] public RenderFragment ChildContent { get; set; } = default!;
|
|
||||||
|
|
||||||
[Parameter] public string TermId { get; set; } = default!;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
@inject ITooltipService TooltipService
|
||||||
|
|
||||||
|
@implements IDisposable
|
||||||
|
|
||||||
|
@if (Tooltip == null)
|
||||||
|
{
|
||||||
|
<div>Add tooltip object...</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div onclick="@Dismiss" class="tooltipContainer">
|
||||||
|
<div class="tooltip">
|
||||||
|
@Tooltip.Message
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.toastContainer {
|
||||||
|
border: 4px solid;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-items: stretch;
|
||||||
|
width: 250px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.@SeverityType.Warning.ToLower() {
|
||||||
|
background-color: var(--severity-warning-color);
|
||||||
|
border-color: var(--severity-warning-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.@SeverityType.Error.ToLower() {
|
||||||
|
background-color: var(--severity-error-color);
|
||||||
|
border-color: var(--severity-error-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.@SeverityType.Information.ToLower() {
|
||||||
|
background-color: var(--severity-information-color);
|
||||||
|
border-color: var(--severity-information-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.@SeverityType.Success.ToLower() {
|
||||||
|
background-color: var(--severity-success-color);
|
||||||
|
border-color: var(--severity-success-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toastTitle {
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[Parameter] public TooltipModel? Tooltip { get; set; }
|
||||||
|
|
||||||
|
protected override void OnInitialized()
|
||||||
|
{
|
||||||
|
base.OnInitialized();
|
||||||
|
TooltipService.Subscribe(OnUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dismiss()
|
||||||
|
{
|
||||||
|
TooltipService.RemoveTooltip(Tooltip!);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IDisposable.Dispose()
|
||||||
|
{
|
||||||
|
TooltipService.Unsubscribe(OnUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnUpdate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
@using Model.MemoryTester
|
@using Model.MemoryTester
|
||||||
|
@using Services.Immortal
|
||||||
@implements IDisposable
|
@implements IDisposable
|
||||||
|
|
||||||
@inject IMemoryTesterService MemoryTesterService
|
@inject IMemoryTesterService MemoryTesterService
|
||||||
@@ -12,7 +13,7 @@
|
|||||||
}
|
}
|
||||||
<div>
|
<div>
|
||||||
<input readonly="@MemoryQuestion.IsRevealed"
|
<input readonly="@MemoryQuestion.IsRevealed"
|
||||||
class="formTextInput @(MemoryQuestion.IsRevealed ? "revealed" : !IsSubmitted ? "guess" : int.Parse(guess ?? string.Empty) == MemoryQuestion.Answer ? "correct" : "wrong")"
|
class="formTextInput @(MemoryQuestion.IsRevealed ? "revealed" : IsSubmitted == false ? "guess" : int.Parse(guess ?? string.Empty) == MemoryQuestion.Answer ? "correct" : "wrong")"
|
||||||
placeholder="guess..."
|
placeholder="guess..."
|
||||||
type="number"
|
type="number"
|
||||||
value="@guess"
|
value="@guess"
|
||||||
|
|||||||
@@ -1,145 +0,0 @@
|
|||||||
@implements IDisposable
|
|
||||||
|
|
||||||
<div class="cooldown-wrap" style="--cooldown-size: @(Size)px">
|
|
||||||
<button class="cooldown-btn"
|
|
||||||
disabled="@_isCooldown"
|
|
||||||
@onclick="HandleClick"
|
|
||||||
@onclick:preventDefault="_isCooldown">
|
|
||||||
<span class="cooldown-btn-text">@ChildContent</span>
|
|
||||||
</button>
|
|
||||||
@if (_isCooldown)
|
|
||||||
{
|
|
||||||
<div class="cooldown-overlay" style="--angle: @(_elapsedAngle)deg">
|
|
||||||
<span class="cooldown-label">@_remainingSeconds</span>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.cooldown-wrap {
|
|
||||||
position: relative;
|
|
||||||
display: inline-flex;
|
|
||||||
width: var(--cooldown-size, 120px);
|
|
||||||
height: var(--cooldown-size, 120px);
|
|
||||||
}
|
|
||||||
.cooldown-btn {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
border: 2px solid var(--primary);
|
|
||||||
border-radius: 12px;
|
|
||||||
background: var(--paper);
|
|
||||||
color: var(--text-primary, #eee);
|
|
||||||
font-weight: 700;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 12px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
transition: background 0.15s, border-color 0.15s;
|
|
||||||
line-height: 1.3;
|
|
||||||
font-family: inherit;
|
|
||||||
}
|
|
||||||
.cooldown-btn:hover:not(:disabled) {
|
|
||||||
background: var(--paper-hover);
|
|
||||||
border-color: var(--primary-hover);
|
|
||||||
}
|
|
||||||
.cooldown-btn:active:not(:disabled) {
|
|
||||||
transform: scale(0.97);
|
|
||||||
}
|
|
||||||
.cooldown-btn:disabled {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
.cooldown-btn-text {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
.cooldown-overlay {
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
border-radius: 12px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
pointer-events: none;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
.cooldown-overlay::before {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
inset: 0;
|
|
||||||
border-radius: inherit;
|
|
||||||
background: rgba(22, 22, 24, 0.45);
|
|
||||||
mask-image: conic-gradient(transparent 0deg, transparent var(--angle), #000 var(--angle), #000 360deg);
|
|
||||||
-webkit-mask-image: conic-gradient(transparent 0deg, transparent var(--angle), #000 var(--angle), #000 360deg);
|
|
||||||
}
|
|
||||||
.cooldown-label {
|
|
||||||
font-size: 1.6rem;
|
|
||||||
font-weight: 900;
|
|
||||||
color: #999;
|
|
||||||
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
|
|
||||||
pointer-events: none;
|
|
||||||
position: relative;
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
[Parameter] public RenderFragment? ChildContent { get; set; }
|
|
||||||
[Parameter] public EventCallback OnClick { get; set; }
|
|
||||||
[Parameter] public int CooldownSeconds { get; set; } = 12;
|
|
||||||
[Parameter] public int Size { get; set; } = 120;
|
|
||||||
|
|
||||||
private bool _isCooldown;
|
|
||||||
private int _elapsedAngle;
|
|
||||||
private int _remainingSeconds;
|
|
||||||
private DateTime _startTime;
|
|
||||||
private System.Timers.Timer? _timer;
|
|
||||||
|
|
||||||
private async Task HandleClick()
|
|
||||||
{
|
|
||||||
if (_isCooldown) return;
|
|
||||||
await OnClick.InvokeAsync(null);
|
|
||||||
StartCooldown();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StartCooldown()
|
|
||||||
{
|
|
||||||
_isCooldown = true;
|
|
||||||
_startTime = DateTime.UtcNow;
|
|
||||||
_elapsedAngle = 0;
|
|
||||||
_remainingSeconds = CooldownSeconds;
|
|
||||||
|
|
||||||
_timer = new System.Timers.Timer(33);
|
|
||||||
_timer.Elapsed += OnTick;
|
|
||||||
_timer.AutoReset = true;
|
|
||||||
_timer.Enabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnTick(object? sender, System.Timers.ElapsedEventArgs e)
|
|
||||||
{
|
|
||||||
var elapsed = (DateTime.UtcNow - _startTime).TotalSeconds;
|
|
||||||
if (elapsed >= CooldownSeconds)
|
|
||||||
{
|
|
||||||
_isCooldown = false;
|
|
||||||
_timer?.Stop();
|
|
||||||
_timer?.Dispose();
|
|
||||||
_timer = null;
|
|
||||||
InvokeAsync(StateHasChanged);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_elapsedAngle = (int)(elapsed / CooldownSeconds * 360);
|
|
||||||
_remainingSeconds = CooldownSeconds - (int)elapsed;
|
|
||||||
InvokeAsync(StateHasChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if (_timer != null)
|
|
||||||
{
|
|
||||||
_timer.Stop();
|
|
||||||
_timer.Dispose();
|
|
||||||
_timer = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
@inject IGlossaryService glossaryService
|
|
||||||
@inject IGlossaryDialogService glossaryDialogService
|
|
||||||
|
|
||||||
@if (TermId == null)
|
|
||||||
{
|
|
||||||
<span>Missing term</span>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var term = glossaryService.GetTerm(TermId);
|
|
||||||
if (term != null)
|
|
||||||
{
|
|
||||||
<button class="glossaryLabel @term.Category.ToLowerInvariant()" @onclick="TermLabelClicked"
|
|
||||||
title="@term.ShortDefinition">
|
|
||||||
@term.Term
|
|
||||||
</button>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
[Parameter] public string TermId { get; set; } = default!;
|
|
||||||
|
|
||||||
void TermLabelClicked()
|
|
||||||
{
|
|
||||||
glossaryDialogService.AddDialog(TermId);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
.glossaryLabel {
|
|
||||||
font-weight: bolder;
|
|
||||||
box-shadow: 1px 1px 0 0 rgba(0, 0, 0, 0.2);
|
|
||||||
padding-right: 4px;
|
|
||||||
border: none;
|
|
||||||
background: none;
|
|
||||||
cursor: pointer;
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
text-decoration: underline;
|
|
||||||
text-decoration-style: dotted;
|
|
||||||
text-underline-offset: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.glossaryLabel:hover {
|
|
||||||
background-color: var(--primary-hover);
|
|
||||||
}
|
|
||||||
|
|
||||||
.resource {
|
|
||||||
color: gold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mechanic {
|
|
||||||
color: #8fc5ff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.faction {
|
|
||||||
color: #da4e4e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.role {
|
|
||||||
color: #87aa87;
|
|
||||||
}
|
|
||||||
@@ -7,7 +7,15 @@
|
|||||||
<i class="fa-solid fa-magnifying-glass" style="margin-left: 3px; margin-right: 6px;"></i> Search...
|
<i class="fa-solid fa-magnifying-glass" style="margin-left: 3px; margin-right: 6px;"></i> Search...
|
||||||
</div>
|
</div>
|
||||||
<div class="searchHotkey">
|
<div class="searchHotkey">
|
||||||
<span>/</span>
|
@if (IsMac)
|
||||||
|
{
|
||||||
|
<span><i class="fa-solid fa-command"></i>K</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>CTRL + K</span>
|
||||||
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
@@ -43,6 +51,8 @@
|
|||||||
|
|
||||||
private string _userAgent = "";
|
private string _userAgent = "";
|
||||||
|
|
||||||
|
bool IsMac => _userAgent.Contains("Mac OS");
|
||||||
|
|
||||||
private void ButtonClicked(EventArgs eventArgs)
|
private void ButtonClicked(EventArgs eventArgs)
|
||||||
{
|
{
|
||||||
SearchService.Show();
|
SearchService.Show();
|
||||||
|
|||||||
@@ -1,180 +0,0 @@
|
|||||||
@inject IEntityDialogService entityDialogService
|
|
||||||
@inject NavigationManager NavigationManager
|
|
||||||
|
|
||||||
<div class="techTreeContainer" @ref="containerRef">
|
|
||||||
<svg class="techTreeSvg" width="@svgWidth" height="@svgHeight">
|
|
||||||
<!-- Edges -->
|
|
||||||
@foreach (var edge in Graph.Edges)
|
|
||||||
{
|
|
||||||
var source = Graph.Nodes.FirstOrDefault(n => n.Id == edge.SourceId);
|
|
||||||
var target = Graph.Nodes.FirstOrDefault(n => n.Id == edge.TargetId);
|
|
||||||
if (source != null && target != null)
|
|
||||||
{
|
|
||||||
var color = EdgeColor(edge.EdgeType);
|
|
||||||
var strokeWidth = edge.EdgeType == TechTreeEdgeType.Produces ? "2.5" : "1.5";
|
|
||||||
var strokeDash = edge.EdgeType == TechTreeEdgeType.RequiresProduction || edge.EdgeType == TechTreeEdgeType.RequiresResearch ? "6,3" : "";
|
|
||||||
strokeDash = edge.EdgeType == TechTreeEdgeType.Morph ? "2,2" : strokeDash;
|
|
||||||
|
|
||||||
<line x1="@(source.X + nodeWidth / 2)" y1="@(source.Y + nodeHeight / 2)"
|
|
||||||
x2="@(target.X + nodeWidth / 2)" y2="@(target.Y + nodeHeight / 2)"
|
|
||||||
stroke="@color" stroke-width="@strokeWidth"
|
|
||||||
stroke-dasharray="@strokeDash"
|
|
||||||
marker-end="url(#arrowhead-@(edge.EdgeType))"/>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
<!-- Arrowhead markers -->
|
|
||||||
<defs>
|
|
||||||
@foreach (var edgeType in Graph.Edges.Select(e => e.EdgeType).Distinct())
|
|
||||||
{
|
|
||||||
<marker id="arrowhead-@edgeType" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto">
|
|
||||||
<polygon points="0 0, 10 3.5, 0 7" fill="@EdgeColor(edgeType)"/>
|
|
||||||
</marker>
|
|
||||||
}
|
|
||||||
</defs>
|
|
||||||
|
|
||||||
<!-- Nodes -->
|
|
||||||
@foreach (var node in Graph.Nodes)
|
|
||||||
{
|
|
||||||
var color = NodeColor(node.Descriptive);
|
|
||||||
var isHighlighted = HighlightEntityId == node.Id;
|
|
||||||
|
|
||||||
<g class="techTreeNode" @onclick="() => OnNodeClick(node.Id)">
|
|
||||||
<rect x="@node.X" y="@node.Y" width="@nodeWidth" height="@nodeHeight" rx="6"
|
|
||||||
fill="var(--paper)" stroke="@color" stroke-width="@(isHighlighted ? 3 : 1.5)"
|
|
||||||
class="@(isHighlighted ? "highlighted" : "")"/>
|
|
||||||
<text x="@(node.X + nodeWidth / 2)" y="@(node.Y + nodeHeight / 2)"
|
|
||||||
text-anchor="middle" dominant-baseline="central"
|
|
||||||
fill="white" font-size="12" font-weight="600">
|
|
||||||
@TruncateText(node.Name, 20)
|
|
||||||
</text>
|
|
||||||
<title>@node.Name (@node.EntityType)</title>
|
|
||||||
</g>
|
|
||||||
}
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.techTreeContainer {
|
|
||||||
width: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
border: 2px solid var(--paper-border);
|
|
||||||
border-radius: 8px;
|
|
||||||
background-color: var(--background);
|
|
||||||
}
|
|
||||||
|
|
||||||
.techTreeSvg {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.techTreeNode {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.techTreeNode rect {
|
|
||||||
transition: stroke-width 0.15s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.techTreeNode rect.highlighted {
|
|
||||||
filter: drop-shadow(0 0 6px rgba(255, 255, 255, 0.5));
|
|
||||||
}
|
|
||||||
|
|
||||||
.techTreeNode:hover rect {
|
|
||||||
stroke-width: 3;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
[Parameter] public TechTreeGraphModel Graph { get; set; } = new();
|
|
||||||
|
|
||||||
[Parameter] public string? HighlightEntityId { get; set; }
|
|
||||||
|
|
||||||
[Parameter] public EventCallback<string> OnEntitySelected { get; set; }
|
|
||||||
|
|
||||||
private ElementReference containerRef;
|
|
||||||
private const float nodeWidth = 140;
|
|
||||||
private const float nodeHeight = 36;
|
|
||||||
private const float horizontalSpacing = 60;
|
|
||||||
private const float verticalSpacing = 30;
|
|
||||||
private const float topPadding = 40;
|
|
||||||
private const float leftPadding = 40;
|
|
||||||
|
|
||||||
private float svgWidth = 800;
|
|
||||||
private float svgHeight = 600;
|
|
||||||
|
|
||||||
protected override void OnParametersSet()
|
|
||||||
{
|
|
||||||
ComputeLayout();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ComputeLayout()
|
|
||||||
{
|
|
||||||
if (Graph.Nodes.Count == 0) return;
|
|
||||||
|
|
||||||
var layers = Graph.Nodes.GroupBy(n => n.Layer)
|
|
||||||
.OrderBy(g => g.Key)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
// Simple layered layout: left to right (layers are columns)
|
|
||||||
for (var layerIdx = 0; layerIdx < layers.Count; layerIdx++)
|
|
||||||
{
|
|
||||||
var layerNodes = layers.ElementAt(layerIdx).OrderBy(n => n.Name).ToList();
|
|
||||||
var layerHeight = layerNodes.Count * (nodeHeight + verticalSpacing) - verticalSpacing;
|
|
||||||
|
|
||||||
for (var nodeIdx = 0; nodeIdx < layerNodes.Count; nodeIdx++)
|
|
||||||
{
|
|
||||||
var node = layerNodes[nodeIdx];
|
|
||||||
node.X = leftPadding + layerIdx * (nodeWidth + horizontalSpacing);
|
|
||||||
node.Y = topPadding + nodeIdx * (nodeHeight + verticalSpacing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
svgWidth = layers.Count * (nodeWidth + horizontalSpacing) + leftPadding + 100;
|
|
||||||
svgHeight = layers.Max(g => g.Count()) * (nodeHeight + verticalSpacing) + topPadding + 80;
|
|
||||||
|
|
||||||
if (svgWidth < 800) svgWidth = 800;
|
|
||||||
if (svgHeight < 400) svgHeight = 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnNodeClick(string entityId)
|
|
||||||
{
|
|
||||||
entityDialogService.AddDialog(entityId);
|
|
||||||
OnEntitySelected.InvokeAsync(entityId);
|
|
||||||
}
|
|
||||||
|
|
||||||
string NodeColor(string descriptive)
|
|
||||||
{
|
|
||||||
return descriptive.ToLowerInvariant() switch
|
|
||||||
{
|
|
||||||
"frontliner" => "#ff6b6b",
|
|
||||||
"skirmisher" => "#ffa502",
|
|
||||||
"support" => "#2ed573",
|
|
||||||
"generalist" => "#1e90ff",
|
|
||||||
"worker" => "#ffd43b",
|
|
||||||
"stronghold" => "#ff4757",
|
|
||||||
"upgrade" => "#a55eea",
|
|
||||||
"technology" => "#a55eea",
|
|
||||||
_ => "#8fc5ff"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
string EdgeColor(string edgeType)
|
|
||||||
{
|
|
||||||
return edgeType switch
|
|
||||||
{
|
|
||||||
"Produces" => "#2ed573",
|
|
||||||
"RequiresProduction" => "#ffa502",
|
|
||||||
"RequiresResearch" => "#a55eea",
|
|
||||||
"Morph" => "#ff6b6b",
|
|
||||||
"Upgrades" => "#1e90ff",
|
|
||||||
_ => "#666"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
string TruncateText(string text, int maxLength)
|
|
||||||
{
|
|
||||||
return text.Length <= maxLength ? text : text.Substring(0, maxLength - 3) + "...";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -4,13 +4,9 @@
|
|||||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||||
@using Microsoft.JSInterop
|
@using Microsoft.JSInterop
|
||||||
@using Model.Feedback
|
@using Model.Feedback
|
||||||
@using Model.Glossary
|
|
||||||
@using Model.TechTree
|
|
||||||
@using Model.Website
|
@using Model.Website
|
||||||
@using Model.Website.Enums
|
@using Model.Website.Enums
|
||||||
@using Services
|
@using Services
|
||||||
@using Services.Immortal
|
|
||||||
@using Services.Website
|
|
||||||
@using System.Net.Http
|
@using System.Net.Http
|
||||||
@using System.Net.Http.Json
|
@using System.Net.Http.Json
|
||||||
@using System.Text
|
@using System.Text
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
|
||||||
x:Class="Device.App">
|
|
||||||
<Application.Resources>
|
|
||||||
<ResourceDictionary>
|
|
||||||
<ResourceDictionary.MergedDictionaries>
|
|
||||||
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
|
|
||||||
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
|
|
||||||
</ResourceDictionary.MergedDictionaries>
|
|
||||||
</ResourceDictionary>
|
|
||||||
</Application.Resources>
|
|
||||||
</Application>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
namespace Device;
|
|
||||||
|
|
||||||
public partial class App : Application
|
|
||||||
{
|
|
||||||
public App()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override Window CreateWindow(IActivationState? activationState)
|
|
||||||
{
|
|
||||||
return new Window(new AppShell());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<Shell
|
|
||||||
x:Class="Device.AppShell"
|
|
||||||
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
|
||||||
xmlns:local="clr-namespace:Device"
|
|
||||||
Title="Device">
|
|
||||||
|
|
||||||
<ShellContent
|
|
||||||
Title="Home"
|
|
||||||
ContentTemplate="{DataTemplate local:MainPage}"
|
|
||||||
Route="MainPage" />
|
|
||||||
|
|
||||||
</Shell>
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace Device;
|
|
||||||
|
|
||||||
public partial class AppShell : Shell
|
|
||||||
{
|
|
||||||
public AppShell()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFrameworks>net10.0-android</TargetFrameworks>
|
|
||||||
<TargetFrameworks Condition="!$([MSBuild]::IsOSPlatform('linux'))">$(TargetFrameworks);net10.0-ios;net10.0-maccatalyst</TargetFrameworks>
|
|
||||||
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net10.0-windows10.0.19041.0</TargetFrameworks>
|
|
||||||
<ProjectRuntimeIdentifier Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">win-x64</ProjectRuntimeIdentifier>
|
|
||||||
|
|
||||||
<!-- Note for MacCatalyst:
|
|
||||||
The default runtime is maccatalyst-x64, except in Release config, in which case the default is maccatalyst-x64;maccatalyst-arm64.
|
|
||||||
When specifying both architectures, use the plural <RuntimeIdentifiers> instead of the singular <RuntimeIdentifier>.
|
|
||||||
The Mac App Store will NOT accept apps with ONLY maccatalyst-arm64 indicated;
|
|
||||||
either BOTH runtimes must be indicated or ONLY macatalyst-x64. -->
|
|
||||||
<!-- For example: <RuntimeIdentifiers>maccatalyst-x64;maccatalyst-arm64</RuntimeIdentifiers> -->
|
|
||||||
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<RootNamespace>Device</RootNamespace>
|
|
||||||
<UseMaui>true</UseMaui>
|
|
||||||
<SingleProject>true</SingleProject>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
|
|
||||||
<!-- Enable XAML source generation for faster build times and improved performance.
|
|
||||||
This generates C# code from XAML at compile time instead of runtime inflation.
|
|
||||||
To disable, remove this line.
|
|
||||||
For individual files, you can override by setting Inflator metadata:
|
|
||||||
<MauiXaml Update="MyPage.xaml" Inflator="Default" /> (reverts to defaults: Runtime for Debug, XamlC for Release)
|
|
||||||
<MauiXaml Update="MyPage.xaml" Inflator="Runtime" /> (force runtime inflation) -->
|
|
||||||
<MauiXamlInflator>SourceGen</MauiXamlInflator>
|
|
||||||
|
|
||||||
<!-- Display name -->
|
|
||||||
<ApplicationTitle>Device</ApplicationTitle>
|
|
||||||
|
|
||||||
<!-- App Identifier -->
|
|
||||||
<ApplicationId>com.companyname.device</ApplicationId>
|
|
||||||
|
|
||||||
<!-- Versions -->
|
|
||||||
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
|
|
||||||
<ApplicationVersion>1</ApplicationVersion>
|
|
||||||
|
|
||||||
<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
|
|
||||||
<WindowsPackageType>None</WindowsPackageType>
|
|
||||||
|
|
||||||
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>
|
|
||||||
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">15.0</SupportedOSPlatformVersion>
|
|
||||||
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
|
|
||||||
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
|
|
||||||
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<!-- App Icon -->
|
|
||||||
<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4"/>
|
|
||||||
|
|
||||||
<!-- Splash Screen -->
|
|
||||||
<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128"/>
|
|
||||||
|
|
||||||
<!-- Images -->
|
|
||||||
<MauiImage Include="Resources\Images\*"/>
|
|
||||||
<MauiImage Update="Resources\Images\dotnet_bot.png" Resize="True" BaseSize="300,185"/>
|
|
||||||
|
|
||||||
<!-- Custom Fonts -->
|
|
||||||
<MauiFont Include="Resources\Fonts\*"/>
|
|
||||||
|
|
||||||
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
|
|
||||||
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)"/>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="$(MauiVersion)"/>
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="10.0.0"/>
|
|
||||||
<PackageReference Include="MudBlazor" Version="9.2.0"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Components\Components.csproj"/>
|
|
||||||
<ProjectReference Include="..\Model\Model.csproj"/>
|
|
||||||
<ProjectReference Include="..\Pages\Pages.csproj"/>
|
|
||||||
<ProjectReference Include="..\Services\Services.csproj"/>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
|
||||||
xmlns:local="clr-namespace:Device"
|
|
||||||
x:Class="Device.MainPage">
|
|
||||||
|
|
||||||
<BlazorWebView x:Name="blazorWebView" HostPage="wwwroot/device.html">
|
|
||||||
<BlazorWebView.RootComponents>
|
|
||||||
<RootComponent Selector="#app" ComponentType="{x:Type local:MainRazor}" />
|
|
||||||
</BlazorWebView.RootComponents>
|
|
||||||
</BlazorWebView>
|
|
||||||
|
|
||||||
</ContentPage>
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user