diff --git a/PkmnLib.Dynamic/Libraries/DynamicLibrary.cs b/PkmnLib.Dynamic/Libraries/DynamicLibrary.cs index 9fb0cc7..b59c513 100644 --- a/PkmnLib.Dynamic/Libraries/DynamicLibrary.cs +++ b/PkmnLib.Dynamic/Libraries/DynamicLibrary.cs @@ -39,6 +39,12 @@ public interface IDynamicLibrary /// ICaptureLibrary CaptureLibrary { get; } + /// + /// The experience gain calculator deals with the calculation of experience gained by a + /// Pokémon after defeating another Pokémon. + /// + IExperienceGainCalculator ExperienceGainCalculator { get; } + /// /// A holder of the script types that can be resolved by this library. /// @@ -64,12 +70,13 @@ public class DynamicLibraryImpl : IDynamicLibrary return new DynamicLibraryImpl(load.StaticLibrary, load.Registry.BattleStatCalculator!, load.Registry.DamageCalculator!, load.Registry.MiscLibrary!, load.Registry.CaptureLibrary!, load.Resolver, - load.Registry.ExplicitAIHandlers); + load.Registry.ExplicitAIHandlers, load.Registry.ExperienceGainCalculator!); } private DynamicLibraryImpl(IStaticLibrary staticLibrary, IBattleStatCalculator statCalculator, IDamageCalculator damageCalculator, IMiscLibrary miscLibrary, ICaptureLibrary captureLibrary, - ScriptResolver scriptResolver, IReadOnlyExplicitAIHandlers explicitAIHandlers) + ScriptResolver scriptResolver, IReadOnlyExplicitAIHandlers explicitAIHandlers, + IExperienceGainCalculator experienceGainCalculator) { StaticLibrary = staticLibrary; StatCalculator = statCalculator; @@ -77,6 +84,7 @@ public class DynamicLibraryImpl : IDynamicLibrary MiscLibrary = miscLibrary; ScriptResolver = scriptResolver; ExplicitAIHandlers = explicitAIHandlers; + ExperienceGainCalculator = experienceGainCalculator; CaptureLibrary = captureLibrary; } @@ -95,6 +103,9 @@ public class DynamicLibraryImpl : IDynamicLibrary /// public ICaptureLibrary CaptureLibrary { get; } + /// + public IExperienceGainCalculator ExperienceGainCalculator { get; } + /// public ScriptResolver ScriptResolver { get; } diff --git a/PkmnLib.Dynamic/Libraries/ExperienceGainCalculator.cs b/PkmnLib.Dynamic/Libraries/ExperienceGainCalculator.cs new file mode 100644 index 0000000..2fc1d37 --- /dev/null +++ b/PkmnLib.Dynamic/Libraries/ExperienceGainCalculator.cs @@ -0,0 +1,14 @@ +using PkmnLib.Dynamic.Models; + +namespace PkmnLib.Dynamic.Libraries; + +/// +/// Calculates experience gain for Pokémon battles. +/// +public interface IExperienceGainCalculator +{ + /// + /// Calculates the experience a Pokémon gains when defeating another Pokémon. + /// + uint CalculateExperienceGain(IPokemon defeatedPokemon, IPokemon victoriousPokemon); +} \ No newline at end of file diff --git a/PkmnLib.Dynamic/Libraries/LibraryLoader.cs b/PkmnLib.Dynamic/Libraries/LibraryLoader.cs index 26ef872..3401efe 100644 --- a/PkmnLib.Dynamic/Libraries/LibraryLoader.cs +++ b/PkmnLib.Dynamic/Libraries/LibraryLoader.cs @@ -36,6 +36,8 @@ public static class LibraryLoader throw new InvalidOperationException("Misc library not found in plugins."); if (registry.CaptureLibrary is null) throw new InvalidOperationException("Capture library not found in plugins."); + if (registry.ExperienceGainCalculator is null) + throw new InvalidOperationException("Experience gain calculator not found in plugins."); var scriptResolver = new ScriptResolver(registry.ScriptTypes, registry.ItemScriptTypes); return new LoadResult(registry, scriptResolver, staticLibrary); } diff --git a/PkmnLib.Dynamic/Models/Pokemon.cs b/PkmnLib.Dynamic/Models/Pokemon.cs index dad5d5e..a819330 100644 --- a/PkmnLib.Dynamic/Models/Pokemon.cs +++ b/PkmnLib.Dynamic/Models/Pokemon.cs @@ -1184,6 +1184,11 @@ public class PokemonImpl : ScriptSource, IPokemon BattleData.BattleSide.MarkFaint(BattleData.Position); BattleData.BattleSide.ForceClearPokemonFromField(BattleData.Position); + foreach (var opponent in BattleData.SeenOpponents.WhereNotNull()) + { + opponent.AddExperience(Library.ExperienceGainCalculator.CalculateExperienceGain(this, opponent)); + } + // Validate the battle state to see if the battle is over. BattleData.Battle.ValidateBattleState(); } diff --git a/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs b/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs index 756ac62..0a90089 100644 --- a/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs +++ b/PkmnLib.Dynamic/ScriptHandling/Registry/ScriptRegistry.cs @@ -19,6 +19,7 @@ public class ScriptRegistry private IDamageCalculator? _damageCalculator; private IMiscLibrary? _miscLibrary; private ICaptureLibrary? _captureLibrary; + private IExperienceGainCalculator? _experienceGainCalculator; /// /// Automatically register all scripts in the given assembly that have the , and @@ -110,11 +111,18 @@ public class ScriptRegistry public void RegisterCaptureLibrary(T captureLibrary) where T : ICaptureLibrary => _captureLibrary = captureLibrary; + /// + /// Register an experience gain calculator. + /// + public void RegisterExperienceGainCalculator(T experienceGainCalculator) where T : IExperienceGainCalculator => + _experienceGainCalculator = experienceGainCalculator; + internal IReadOnlyDictionary<(ScriptCategory category, StringKey name), Func