Aetheria/tools/AetherDb/AutoGunsCatalog.cs
soul 5367c899a6 auto-guns: copy the plain gun's fields
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 06:09:53 +02:00

41 lines
2.3 KiB
C#

using System;
using System.IO;
using System.Linq;
using GameCult.Caching;
using System.Reflection;
// Makes the named plain guns fully automatic (ruling fire-mode-is-the-design): each one's InstantWeaponData becomes an
// AutoWeaponData carrying every authored stat unchanged, so cadence and damage do not move. A gun that is already an
// AutoWeapon (or any other kind) is left alone, so a rerun writes nothing. Dry run unless apply.
public static class AutoGunsCatalog
{
public static readonly string[] Guns = { "Slug Rifle", "Long Slug Rifle" };
public static int Run(CultCache cache, bool apply, TextWriter output)
{
var changed = new System.Collections.Generic.List<GearData>();
foreach (var name in Guns)
{
var gear = cache.GetAll<GearData>().SingleOrDefault(g => g.Name == name);
if (gear == null) { output.WriteLine($"{name}: no such gear, skipped"); continue; }
var index = gear.Behaviors.FindIndex(b => b.GetType() == typeof(InstantWeaponData));
if (index < 0) { output.WriteLine($"{name}: no plain gun, kept"); continue; }
var plain = (InstantWeaponData) gear.Behaviors[index];
var auto = new AutoWeaponData();
// AutoWeaponData adds no member of its own: every field of the plain gun, from every base, carries over.
for (var type = typeof(InstantWeaponData); type != null; type = type.BaseType)
foreach (var field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly))
field.SetValue(auto, field.GetValue(plain));
gear.Behaviors[index] = auto;
output.WriteLine($"{name}: InstantWeaponData -> AutoWeaponData (cooldown {plain.Cooldown.Max:0.###} s)");
changed.Add(gear);
}
if (!apply) { output.WriteLine("\nDry run. Pass \"apply\" to author them."); return 0; }
if (changed.Count == 0) { output.WriteLine("Nothing to author."); return 0; }
foreach (var gear in changed) CultRecordRefs.Validate(gear);
cache.Commit(batch => { foreach (var gear in changed) batch.Upsert(typeof(GearData), gear, cache.RefOf(gear).Key); });
output.WriteLine($"\nAuthored {changed.Count} guns in Aetheria.cc");
return 0;
}
}