Reworks PokemonBuilder.
This commit is contained in:
parent
7f4ccbfe2a
commit
69ab7b197c
|
@ -1,5 +1,3 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PkmnLibSharp.Battling.ChoiceTurn
|
namespace PkmnLibSharp.Battling.ChoiceTurn
|
||||||
{
|
{
|
||||||
public class FleeTurnChoice : BaseTurnChoice
|
public class FleeTurnChoice : BaseTurnChoice
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PkmnLibSharp.Battling.ChoiceTurn
|
namespace PkmnLibSharp.Battling.ChoiceTurn
|
||||||
{
|
{
|
||||||
public class SwitchTurnChoice : BaseTurnChoice
|
public class SwitchTurnChoice : BaseTurnChoice
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using PkmnLibSharp.Library;
|
using PkmnLibSharp.Library;
|
||||||
using PkmnLibSharp.Utilities;
|
using PkmnLibSharp.Utilities;
|
||||||
|
|
|
@ -6,9 +6,9 @@ using Random = PkmnLibSharp.Utilities.Random;
|
||||||
|
|
||||||
namespace PkmnLibSharp.Battling
|
namespace PkmnLibSharp.Battling
|
||||||
{
|
{
|
||||||
public class PokemonBuilder
|
public abstract class BasePokemonBuilder<T> where T : Pokemon
|
||||||
{
|
{
|
||||||
private BattleLibrary _library;
|
protected readonly BattleLibrary Library;
|
||||||
public string Species { get; }
|
public string Species { get; }
|
||||||
public string Forme { get; private set; } = "default";
|
public string Forme { get; private set; } = "default";
|
||||||
public string Nickname { get; private set; } = "";
|
public string Nickname { get; private set; } = "";
|
||||||
|
@ -27,46 +27,46 @@ namespace PkmnLibSharp.Battling
|
||||||
public List<(string moveName, MoveLearnMethod learnMethod)> LearnedMoves { get; } =
|
public List<(string moveName, MoveLearnMethod learnMethod)> LearnedMoves { get; } =
|
||||||
new List<(string moveName, MoveLearnMethod learnMethod)>();
|
new List<(string moveName, MoveLearnMethod learnMethod)>();
|
||||||
|
|
||||||
public PokemonBuilder(BattleLibrary library, string species, byte level)
|
public BasePokemonBuilder(BattleLibrary library, string species, byte level)
|
||||||
{
|
{
|
||||||
_library = library;
|
Library = library;
|
||||||
Species = species;
|
Species = species;
|
||||||
Level = level;
|
Level = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PokemonBuilder WithForme(string forme)
|
public BasePokemonBuilder<T> WithForme(string forme)
|
||||||
{
|
{
|
||||||
Forme = forme;
|
Forme = forme;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PokemonBuilder WithGender(Gender gender)
|
public BasePokemonBuilder<T> WithGender(Gender gender)
|
||||||
{
|
{
|
||||||
Gender = gender;
|
Gender = gender;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PokemonBuilder ForceShiny(bool value)
|
public BasePokemonBuilder<T> ForceShiny(bool value)
|
||||||
{
|
{
|
||||||
IsForceShiny = value;
|
IsForceShiny = value;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PokemonBuilder WithHeldItem(string heldItem)
|
public BasePokemonBuilder<T> WithHeldItem(string heldItem)
|
||||||
{
|
{
|
||||||
HeldItem = heldItem;
|
HeldItem = heldItem;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PokemonBuilder WithNickname(string nickname)
|
public BasePokemonBuilder<T> WithNickname(string nickname)
|
||||||
{
|
{
|
||||||
Nickname = nickname;
|
Nickname = nickname;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PokemonBuilder LearnMove(string moveName, MoveLearnMethod moveLearnMethod)
|
public BasePokemonBuilder<T> LearnMove(string moveName, MoveLearnMethod moveLearnMethod)
|
||||||
{
|
{
|
||||||
if (LearnedMoves.Count > _library.StaticLibrary.Settings.MaximalMoves)
|
if (LearnedMoves.Count > Library.StaticLibrary.Settings.MaximalMoves)
|
||||||
{
|
{
|
||||||
throw new Exception("Too many moves for Pokemon.");
|
throw new Exception("Too many moves for Pokemon.");
|
||||||
}
|
}
|
||||||
|
@ -74,9 +74,60 @@ namespace PkmnLibSharp.Battling
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Pokemon Build()
|
protected byte Coloring;
|
||||||
|
protected uint Experience;
|
||||||
|
protected uint Uid;
|
||||||
|
protected int AbilityIndex;
|
||||||
|
protected bool HiddenAbility;
|
||||||
|
|
||||||
|
protected virtual void PopulateUninitialized(Species species, Forme forme, Random random)
|
||||||
{
|
{
|
||||||
if (!_library.StaticLibrary.SpeciesLibrary.TryGet(Species, out var species))
|
Experience = Library.StaticLibrary.GrowthRateLibrary.CalculateExperience(species.GrowthRate, Level);
|
||||||
|
Uid = random.GetUnsigned(0, uint.MaxValue);
|
||||||
|
|
||||||
|
if (Gender == (Gender) (-1))
|
||||||
|
{
|
||||||
|
Gender = species.GetRandomGender(random);
|
||||||
|
}
|
||||||
|
Coloring = 0;
|
||||||
|
if (IsForceShiny.HasValue)
|
||||||
|
{
|
||||||
|
Coloring = (byte) (IsForceShiny.Value ? 1 : 0);
|
||||||
|
}
|
||||||
|
else if (random.Get(Library.StaticLibrary.Settings.ShinyRate) == 0)
|
||||||
|
{
|
||||||
|
Coloring = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
AbilityIndex = 0;
|
||||||
|
HiddenAbility = false;
|
||||||
|
if (string.IsNullOrEmpty(Ability))
|
||||||
|
{
|
||||||
|
AbilityIndex = forme!.GetRandomAbility(random);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AbilityIndex = forme!.Abilities.IndexOf(Ability);
|
||||||
|
if (AbilityIndex == -1)
|
||||||
|
{
|
||||||
|
AbilityIndex = forme.HiddenAbilities.IndexOf(Ability);
|
||||||
|
if (AbilityIndex == -1)
|
||||||
|
{
|
||||||
|
throw new Exception(
|
||||||
|
$"Invalid ability '{Ability}' for Pokemon '{species.Name}' and forme '{forme.Name}'.");
|
||||||
|
}
|
||||||
|
|
||||||
|
HiddenAbility = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract T Finalize(Species species, Forme forme, Item? heldItem,
|
||||||
|
IReadOnlyCollection<LearnedMove> moves, Nature nature);
|
||||||
|
|
||||||
|
public T Build()
|
||||||
|
{
|
||||||
|
if (!Library.StaticLibrary.SpeciesLibrary.TryGet(Species, out var species))
|
||||||
{
|
{
|
||||||
throw new Exception($"Species '{Species}' was not found.");
|
throw new Exception($"Species '{Species}' was not found.");
|
||||||
}
|
}
|
||||||
|
@ -86,59 +137,21 @@ namespace PkmnLibSharp.Battling
|
||||||
throw new Exception($"Forme '{Forme}' was not found on species '{Species}'");
|
throw new Exception($"Forme '{Forme}' was not found on species '{Species}'");
|
||||||
}
|
}
|
||||||
|
|
||||||
var experience = _library.StaticLibrary.GrowthRateLibrary.CalculateExperience(species.GrowthRate, Level);
|
|
||||||
var random = new Random();
|
var random = new Random();
|
||||||
var uid = random.GetUnsigned(0, uint.MaxValue);
|
|
||||||
if (Gender == (Gender) (-1))
|
|
||||||
{
|
|
||||||
Gender = species.GetRandomGender(random);
|
|
||||||
}
|
|
||||||
|
|
||||||
byte coloring = 0;
|
|
||||||
if (IsForceShiny.HasValue)
|
|
||||||
{
|
|
||||||
coloring = (byte) (IsForceShiny.Value ? 1 : 0);
|
|
||||||
}
|
|
||||||
else if (random.Get(_library.StaticLibrary.Settings.ShinyRate) == 0)
|
|
||||||
{
|
|
||||||
coloring = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Item? heldItem = null;
|
Item? heldItem = null;
|
||||||
if (HeldItem != null)
|
if (HeldItem != null)
|
||||||
{
|
{
|
||||||
if (!_library.StaticLibrary.ItemLibrary.TryGet(HeldItem, out heldItem))
|
if (!Library.StaticLibrary.ItemLibrary.TryGet(HeldItem, out heldItem))
|
||||||
{
|
{
|
||||||
throw new Exception($"Item '{HeldItem}' was not found.");
|
throw new Exception($"Item '{HeldItem}' was not found.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var abilityIndex = 0;
|
var moves = new LearnedMove[Library.StaticLibrary.Settings.MaximalMoves];
|
||||||
var isHiddenAbility = false;
|
|
||||||
if (string.IsNullOrEmpty(Ability))
|
|
||||||
{
|
|
||||||
abilityIndex = forme!.GetRandomAbility(random);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
abilityIndex = forme!.Abilities.IndexOf(Ability);
|
|
||||||
if (abilityIndex == -1)
|
|
||||||
{
|
|
||||||
abilityIndex = forme.HiddenAbilities.IndexOf(Ability);
|
|
||||||
if (abilityIndex == -1)
|
|
||||||
{
|
|
||||||
throw new Exception(
|
|
||||||
$"Invalid ability '{Ability}' for Pokemon '{species.Name}' and forme '{forme.Name}'.");
|
|
||||||
}
|
|
||||||
|
|
||||||
isHiddenAbility = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var moves = new LearnedMove[_library.StaticLibrary.Settings.MaximalMoves];
|
|
||||||
for (var i = 0; i < LearnedMoves.Count; i++)
|
for (var i = 0; i < LearnedMoves.Count; i++)
|
||||||
{
|
{
|
||||||
if (!_library.StaticLibrary.MoveLibrary.TryGet(LearnedMoves[i].moveName, out var move))
|
if (!Library.StaticLibrary.MoveLibrary.TryGet(LearnedMoves[i].moveName, out var move))
|
||||||
{
|
{
|
||||||
throw new Exception($"Move '{LearnedMoves[i].moveName}' was not found.");
|
throw new Exception($"Move '{LearnedMoves[i].moveName}' was not found.");
|
||||||
}
|
}
|
||||||
|
@ -148,13 +161,11 @@ namespace PkmnLibSharp.Battling
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(Nature))
|
if (string.IsNullOrEmpty(Nature))
|
||||||
{
|
{
|
||||||
Nature = _library.StaticLibrary.NatureLibrary.GetRandomNatureName(random);
|
Nature = Library.StaticLibrary.NatureLibrary.GetRandomNatureName(random);
|
||||||
}
|
}
|
||||||
|
|
||||||
var nature = _library.StaticLibrary.NatureLibrary.GetNature(Nature);
|
var nature = Library.StaticLibrary.NatureLibrary.GetNature(Nature);
|
||||||
|
return Finalize(species, forme!, heldItem, moves, nature);
|
||||||
return new Pokemon(_library, species, forme, Level, experience, uid, Gender, coloring, heldItem, Nickname,
|
|
||||||
isHiddenAbility, (byte) abilityIndex, moves, IVs, EVs, nature);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -80,5 +80,22 @@ namespace Pkmnlib.Generated
|
||||||
[DllImport("pkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_Pokemon_GetStatusName")]
|
[DllImport("pkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_Pokemon_GetStatusName")]
|
||||||
internal static extern IntPtr GetStatusName(IntPtr p);
|
internal static extern IntPtr GetStatusName(IntPtr p);
|
||||||
|
|
||||||
|
/// <param name="p">const Pokemon *</param>
|
||||||
|
/// <returns>unsigned char</returns>
|
||||||
|
[DllImport("pkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_Pokemon_GetFriendship")]
|
||||||
|
internal static extern byte GetFriendship(IntPtr p);
|
||||||
|
|
||||||
|
/// <param name="p">Pokemon *</param>
|
||||||
|
/// <param name="value">unsigned char</param>
|
||||||
|
/// <returns>void</returns>
|
||||||
|
[DllImport("pkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_Pokemon_SetFriendship")]
|
||||||
|
internal static extern void SetFriendship(IntPtr p, byte value);
|
||||||
|
|
||||||
|
/// <param name="p">Pokemon *</param>
|
||||||
|
/// <param name="amount">signed char</param>
|
||||||
|
/// <returns>void</returns>
|
||||||
|
[DllImport("pkmnLib", CallingConvention = CallingConvention.Cdecl, EntryPoint= "PkmnLib_Pokemon_ChangeFriendship")]
|
||||||
|
internal static extern void ChangeFriendship(IntPtr p, sbyte amount);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using Pkmnlib;
|
|
||||||
using PkmnLibSharp.Utilities;
|
using PkmnLibSharp.Utilities;
|
||||||
|
|
||||||
namespace PkmnLibSharp.Library
|
namespace PkmnLibSharp.Library
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using System;
|
|
||||||
using PkmnLibSharp.Utilities;
|
using PkmnLibSharp.Utilities;
|
||||||
|
|
||||||
namespace PkmnLibSharp.Library.GrowthRates
|
namespace PkmnLibSharp.Library.GrowthRates
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Creaturelib.Generated;
|
using Creaturelib.Generated;
|
||||||
using Pkmnlib;
|
|
||||||
using Pkmnlib.Generated;
|
using Pkmnlib.Generated;
|
||||||
using PkmnLibSharp.Utilities;
|
using PkmnLibSharp.Utilities;
|
||||||
using EvolutionData = PkmnLibSharp.Library.Evolution.EvolutionData;
|
using EvolutionData = PkmnLibSharp.Library.Evolution.EvolutionData;
|
||||||
using Gender = PkmnLibSharp.Library.Gender;
|
|
||||||
using Random = PkmnLibSharp.Utilities.Random;
|
using Random = PkmnLibSharp.Utilities.Random;
|
||||||
|
|
||||||
namespace PkmnLibSharp.Library
|
namespace PkmnLibSharp.Library
|
||||||
|
|
BIN
PkmnLibSharp/Native/libpkmnLib.so (Stored with Git LFS)
BIN
PkmnLibSharp/Native/libpkmnLib.so (Stored with Git LFS)
Binary file not shown.
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace PkmnLibSharp.Utilities
|
namespace PkmnLibSharp.Utilities
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PkmnLibSharp.Utilities
|
namespace PkmnLibSharp.Utilities
|
||||||
{
|
{
|
||||||
public class Random : PointerWrapper
|
public class Random : PointerWrapper
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,5 +1,4 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
|
||||||
using PkmnLibSharp.Battling;
|
using PkmnLibSharp.Battling;
|
||||||
using PkmnLibSharp.Library;
|
using PkmnLibSharp.Library;
|
||||||
using PkmnLibSharp.Library.GrowthRates;
|
using PkmnLibSharp.Library.GrowthRates;
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using PkmnLibSharp.Battling;
|
||||||
|
using PkmnLibSharp.Library;
|
||||||
|
using PkmnLibSharp.Library.Items;
|
||||||
|
|
||||||
|
namespace PkmnLibSharpTests.Battling
|
||||||
|
{
|
||||||
|
public class PokemonBuilder : BasePokemonBuilder<Pokemon>
|
||||||
|
{
|
||||||
|
public PokemonBuilder(BattleLibrary library, string species, byte level) : base(library, species, level)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected override Pokemon Finalize(Species species, Forme forme, Item? heldItem, IReadOnlyCollection<LearnedMove> moves, Nature nature)
|
||||||
|
{
|
||||||
|
return new Pokemon(Library, species, forme!, Level, Experience, Uid, Gender, Coloring,
|
||||||
|
heldItem, Nickname, HiddenAbility, (byte) AbilityIndex, moves, IVs, EVs, nature);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue