feat(mosstank): add VTank-style automation PoC
This commit is contained in:
parent
f6fe0f2a4f
commit
4e6e9bc9d9
212 changed files with 49462 additions and 416 deletions
|
|
@ -0,0 +1,134 @@
|
|||
using AcDream.Plugin.Abstractions;
|
||||
|
||||
namespace AcDream.Plugins.MossTank.Tests;
|
||||
|
||||
public sealed class VtankAmmunitionDatabaseTests
|
||||
{
|
||||
[Fact]
|
||||
public void LoadsCompleteOfficialGameInfoTable()
|
||||
{
|
||||
Assert.Equal(120, VtankAmmunitionDatabase.Options.Count);
|
||||
Assert.Equal(5, VtankAmmunitionDatabase.LauncherType(0x001u));
|
||||
Assert.Equal(6, VtankAmmunitionDatabase.LauncherType(0x080u));
|
||||
Assert.Equal(7, VtankAmmunitionDatabase.LauncherType(0x020u));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SpecialMaskSelectsRaiderOnlyWhenEnabled()
|
||||
{
|
||||
var character = new Character(
|
||||
[
|
||||
new PluginSkillInfo(
|
||||
47u,
|
||||
"Missile Weapons",
|
||||
PluginSkillTraining.Trained,
|
||||
300u)
|
||||
{
|
||||
Base = 300u,
|
||||
},
|
||||
]);
|
||||
|
||||
VtankAmmunitionOption regular = Assert.IsType<VtankAmmunitionOption>(
|
||||
VtankAmmunitionDatabase.Select(
|
||||
5,
|
||||
MonsterDamageType.Electric,
|
||||
VtankPrismaticAmmoPolicy.NoPrismatic,
|
||||
enabledSpecialMask: 0,
|
||||
character,
|
||||
static _ => true));
|
||||
VtankAmmunitionOption raider = Assert.IsType<VtankAmmunitionOption>(
|
||||
VtankAmmunitionDatabase.Select(
|
||||
5,
|
||||
MonsterDamageType.Electric,
|
||||
VtankPrismaticAmmoPolicy.NoPrismatic,
|
||||
enabledSpecialMask: 1,
|
||||
character,
|
||||
static _ => true));
|
||||
|
||||
Assert.Equal("Deadly Lightning Arrow", regular.Name);
|
||||
Assert.Equal("Raider Lightning Arrow", raider.Name);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PrismaticAmmoRequiresBothOfficialSkills()
|
||||
{
|
||||
var missileOnly = new Character(
|
||||
[
|
||||
new PluginSkillInfo(
|
||||
47u,
|
||||
"Missile Weapons",
|
||||
PluginSkillTraining.Trained,
|
||||
400u)
|
||||
{
|
||||
Base = 400u,
|
||||
},
|
||||
]);
|
||||
var both = new Character(
|
||||
[
|
||||
new PluginSkillInfo(
|
||||
47u,
|
||||
"Missile Weapons",
|
||||
PluginSkillTraining.Trained,
|
||||
400u)
|
||||
{
|
||||
Base = 400u,
|
||||
},
|
||||
new PluginSkillInfo(
|
||||
37u,
|
||||
"Fletching",
|
||||
PluginSkillTraining.Trained,
|
||||
400u),
|
||||
]);
|
||||
|
||||
VtankAmmunitionOption withoutFletching =
|
||||
Assert.IsType<VtankAmmunitionOption>(
|
||||
VtankAmmunitionDatabase.Select(
|
||||
5,
|
||||
MonsterDamageType.Fire,
|
||||
VtankPrismaticAmmoPolicy.ForcePrismatic,
|
||||
0,
|
||||
missileOnly,
|
||||
static _ => true));
|
||||
VtankAmmunitionOption withFletching =
|
||||
Assert.IsType<VtankAmmunitionOption>(
|
||||
VtankAmmunitionDatabase.Select(
|
||||
5,
|
||||
MonsterDamageType.Fire,
|
||||
VtankPrismaticAmmoPolicy.ForcePrismatic,
|
||||
0,
|
||||
both,
|
||||
static _ => true));
|
||||
|
||||
Assert.Equal("Deadly Fire Arrow", withoutFletching.Name);
|
||||
Assert.Equal("Deadly Prismatic Arrow", withFletching.Name);
|
||||
}
|
||||
|
||||
private sealed class Character(IReadOnlyList<PluginSkillInfo> skills)
|
||||
: ICharacterInfo
|
||||
{
|
||||
public bool IsInWorld => true;
|
||||
public uint ObjectId => 1u;
|
||||
public uint CurrentHealth => 100u;
|
||||
public uint MaxHealth => 100u;
|
||||
public uint CurrentStamina => 100u;
|
||||
public uint MaxStamina => 100u;
|
||||
public uint CurrentMana => 100u;
|
||||
public uint MaxMana => 100u;
|
||||
public IReadOnlyList<PluginSkillInfo> Skills => skills;
|
||||
public IReadOnlyList<PluginAttributeInfo> Attributes => [];
|
||||
public IReadOnlyList<PluginActiveEnchantment> ActiveEnchantments => [];
|
||||
|
||||
public bool TryGetSkill(uint skillId, out PluginSkillInfo skill)
|
||||
{
|
||||
foreach (PluginSkillInfo value in skills)
|
||||
{
|
||||
if (value.SkillId != skillId)
|
||||
continue;
|
||||
skill = value;
|
||||
return true;
|
||||
}
|
||||
skill = default;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue