33 lines
1.3 KiB
C#
33 lines
1.3 KiB
C#
namespace PkmnLib.Plugin.Gen7.Scripts.Moves;
|
|
|
|
[Script(ScriptCategory.Move, "conversion_2")]
|
|
public class Conversion2 : Script, IScriptOnSecondaryEffect
|
|
{
|
|
/// <inheritdoc />
|
|
public void OnSecondaryEffect(IExecutingMove move, IPokemon target, byte hit)
|
|
{
|
|
var previousTurnChoices = target.BattleData?.Battle.PreviousTurnChoices;
|
|
var nextExecutingChoice = target.BattleData?.Battle.ChoiceQueue?.Peek();
|
|
var lastMoveByTarget = target.BattleData?.LastMoveChoice;
|
|
if (lastMoveByTarget == null)
|
|
{
|
|
move.GetHitData(target, hit).Fail();
|
|
return;
|
|
}
|
|
|
|
var typeLibrary = move.User.BattleData!.Battle.Library.StaticLibrary.Types;
|
|
// Get all types against which the last move would be not very effective
|
|
var type = typeLibrary.GetAllEffectivenessFromAttacking(lastMoveByTarget.ChosenMove.MoveData.MoveType)
|
|
.Where(x => x.effectiveness < 1)
|
|
// Shuffle them randomly, but deterministically
|
|
.OrderBy(_ => move.User.BattleData.Battle.Random.GetInt()).ThenBy(x => x.type.Value)
|
|
// And grab the first one
|
|
.Select(x => x.type).FirstOrDefault();
|
|
if (type == null)
|
|
{
|
|
move.GetHitData(target, hit).Fail();
|
|
return;
|
|
}
|
|
move.User.SetTypes([type]);
|
|
}
|
|
} |