New SpellMetadata + SpellTable. Loads docs/research/data/spells.csv at GameWindow construction (3,956 spells x 11 useful fields including Family for buff stacking which issue #6 needs). The CSV is copied to bin/<config>/net10.0/data/spells.csv via the csproj <None Include> entry; SpellTable.LoadFromCsv resolves relative to AppContext.BaseDirectory. Hand-rolled CSV parser handles RFC 4180 quoted fields with embedded commas (the Description column) + escaped double-quotes ("" -> "). No external CsvHelper dep. Falls back to SpellTable.Empty + console warning if the file is missing (tooling contexts). Spellbook now accepts an optional SpellTable in its constructor + exposes TryGetMetadata(spellId, out SpellMetadata). When the table is absent (legacy `new Spellbook()` calls), TryGetMetadata returns false gracefully so existing tests keep passing. GameWindow: - SpellTable field initialized via LoadSpellTable() helper that handles the missing-file case + emits the spells: loaded N entries log line. - SpellBook field constructor-initialized with the loaded SpellTable so TryGetMetadata works for the live session. 10 new tests (SpellTableTests): - Empty table behavior - Header-only loads to empty - Single row populates all metadata - Quoted Description with embedded commas - Blank lines skipped - Bad-spell-id rows silently skipped (third-party data is messy) - Unknown spell-id lookup returns false - ParseRow primitive: simple comma split, quoted-field with comma, escaped double-quote. Total tests: 818 -> 828. Closes #11. Phase G (issue #6 — fold enchantment buffs into vital max via EnchantmentMath using SpellTable.Family for stacking) unblocked. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
62 lines
3.2 KiB
XML
62 lines
3.2 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
<PropertyGroup>
|
|
<OutputType>Exe</OutputType>
|
|
<TargetFramework>net10.0</TargetFramework>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
<Nullable>enable</Nullable>
|
|
<LangVersion>latest</LangVersion>
|
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
<RootNamespace>AcDream.App</RootNamespace>
|
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
</PropertyGroup>
|
|
<ItemGroup>
|
|
<PackageReference Include="Silk.NET.OpenGL" Version="2.23.0" />
|
|
<PackageReference Include="Silk.NET.Windowing" Version="2.23.0" />
|
|
<PackageReference Include="Silk.NET.Input" Version="2.23.0" />
|
|
<PackageReference Include="Silk.NET.OpenAL" Version="2.23.0" />
|
|
<PackageReference Include="Silk.NET.OpenAL.Extensions.Creative" Version="2.23.0" />
|
|
<PackageReference Include="Silk.NET.OpenAL.Extensions.EXT" Version="2.23.0" />
|
|
<PackageReference Include="Silk.NET.OpenAL.Soft.Native" Version="1.23.1" />
|
|
<PackageReference Include="Serilog" Version="4.0.2" />
|
|
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
|
|
<PackageReference Include="StbTrueTypeSharp" Version="1.26.12" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\AcDream.Core\AcDream.Core.csproj" />
|
|
<ProjectReference Include="..\AcDream.Core.Net\AcDream.Core.Net.csproj" />
|
|
<ProjectReference Include="..\AcDream.UI.Abstractions\AcDream.UI.Abstractions.csproj" />
|
|
<ProjectReference Include="..\AcDream.UI.ImGui\AcDream.UI.ImGui.csproj" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<None Update="Rendering\Shaders\*.*">
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
</None>
|
|
<!-- Issue #11: copy spells.csv from docs/research/data/ to bin output's
|
|
data/ subdir so SpellTable.LoadFromCsv can find it at runtime. -->
|
|
<None Include="..\..\docs\research\data\spells.csv" Link="data\spells.csv">
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
</None>
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<!-- Build the smoke plugin first and copy it into plugins/AcDream.Plugins.Smoke/ -->
|
|
<ProjectReference Include="..\AcDream.Plugins.Smoke\AcDream.Plugins.Smoke.csproj">
|
|
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
|
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
|
|
</ProjectReference>
|
|
</ItemGroup>
|
|
<Target Name="CopySmokePluginToPluginsDir" AfterTargets="Build">
|
|
<PropertyGroup>
|
|
<_SmokePluginSourceDir>..\AcDream.Plugins.Smoke\bin\$(Configuration)\net10.0</_SmokePluginSourceDir>
|
|
<_SmokePluginDestDir>$(OutputPath)plugins\AcDream.Plugins.Smoke</_SmokePluginDestDir>
|
|
</PropertyGroup>
|
|
<MakeDir Directories="$(_SmokePluginDestDir)" />
|
|
<Copy
|
|
SourceFiles="$(_SmokePluginSourceDir)\AcDream.Plugins.Smoke.dll"
|
|
DestinationFolder="$(_SmokePluginDestDir)"
|
|
SkipUnchangedFiles="true" />
|
|
<WriteLinesToFile
|
|
File="$(_SmokePluginDestDir)\plugin.json"
|
|
Overwrite="true"
|
|
Lines="{ "id": "acdream.smoke", "displayName": "Smoke Plugin", "version": "0.1.0", "entryDll": "AcDream.Plugins.Smoke.dll", "apiVersion": 1 }" />
|
|
</Target>
|
|
</Project>
|