public MoveInfo(int i, PBEPokemon pkmn, Action <MoveInfo> clickAction) { bool enabled; if (pkmn.IsForcedToStruggle()) { Move = PBEMove.Struggle; enabled = true; } else if (pkmn.TempLockedMove != PBEMove.None) { Move = pkmn.TempLockedMove; enabled = true; } else if (pkmn.ChoiceLockedMove != PBEMove.None) { Move = pkmn.ChoiceLockedMove; enabled = true; } else { Move = pkmn.Moves[i]; enabled = Move != PBEMove.None && pkmn.PP[i] > 0; } Tuple <SolidColorBrush, SolidColorBrush> ttb = Move == PBEMove.None ? typeToBrush[PBEType.Normal] : typeToBrush[pkmn.GetMoveType(Move)]; Brush = ttb.Item1; BorderBrush = ttb.Item2; Description = Move == PBEMove.None ? string.Empty : PBEMoveData.Data[Move].ToString(); var sub = new Subject <bool>(); SelectMoveCommand = ReactiveCommand.Create(() => clickAction(this), sub); sub.OnNext(enabled); }
public MoveInfo(int i, PBEPokemon pkmn, Action <MoveInfo> clickAction) { bool enabled; if (pkmn.IsForcedToStruggle()) { Move = PBEMove.Struggle; enabled = true; } else if (pkmn.TempLockedMove != PBEMove.None) { Move = pkmn.TempLockedMove; enabled = true; } else if (pkmn.ChoiceLockedMove != PBEMove.None) { Move = pkmn.ChoiceLockedMove; enabled = true; } else { Move = pkmn.Moves[i]; enabled = Move != PBEMove.None && pkmn.PP[i] > 0; } Tuple <Color, Color> ttc = Move == PBEMove.None ? typeToColor[PBEType.Normal] : typeToColor[pkmn.GetMoveType(Move)]; Color = ttc.Item1; BorderColor = ttc.Item2; SelectMoveCommand = new Command(() => clickAction(this), () => enabled); }
internal PBETransformPacket(PBEPokemon user, PBEPokemon target) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write(User = user.FieldPosition); w.Write((UserTeam = user.Team).Id); w.Write(Target = target.FieldPosition); w.Write((TargetTeam = target.Team).Id); w.Write(TargetAttack = target.Attack); w.Write(TargetDefense = target.Defense); w.Write(TargetSpAttack = target.SpAttack); w.Write(TargetSpDefense = target.SpDefense); w.Write(TargetSpeed = target.Speed); w.Write(TargetAttackChange = target.AttackChange); w.Write(TargetDefenseChange = target.DefenseChange); w.Write(TargetSpAttackChange = target.SpAttackChange); w.Write(TargetSpDefenseChange = target.SpDefenseChange); w.Write(TargetSpeedChange = target.SpeedChange); w.Write(TargetAccuracyChange = target.AccuracyChange); w.Write(TargetEvasionChange = target.EvasionChange); w.Write(TargetAbility = target.Ability); w.Write(TargetSpecies = target.Species); w.Write(TargetType1 = target.Type1); w.Write(TargetType2 = target.Type2); w.Write(TargetWeight = target.Weight); TargetMoves = target.Moves.ForTransformPacket(); for (int i = 0; i < TargetMoves.Count; i++) { w.Write(TargetMoves[i]); } Data = new ReadOnlyCollection <byte>(ms.ToArray()); } }
internal PBETransformPacket(PBEPokemon user, PBEPokemon target) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(User = user.FieldPosition)); bytes.Add((UserTeam = user.Team).Id); bytes.Add((byte)(Target = target.FieldPosition)); bytes.Add((TargetTeam = target.Team).Id); bytes.AddRange(BitConverter.GetBytes(TargetAttack = target.Attack)); bytes.AddRange(BitConverter.GetBytes(TargetDefense = target.Defense)); bytes.AddRange(BitConverter.GetBytes(TargetSpAttack = target.SpAttack)); bytes.AddRange(BitConverter.GetBytes(TargetSpDefense = target.SpDefense)); bytes.AddRange(BitConverter.GetBytes(TargetSpeed = target.Speed)); bytes.Add((byte)(TargetAttackChange = target.AttackChange)); bytes.Add((byte)(TargetDefenseChange = target.DefenseChange)); bytes.Add((byte)(TargetSpAttackChange = target.SpAttackChange)); bytes.Add((byte)(TargetSpDefenseChange = target.SpDefenseChange)); bytes.Add((byte)(TargetSpeedChange = target.SpeedChange)); bytes.Add((byte)(TargetAccuracyChange = target.AccuracyChange)); bytes.Add((byte)(TargetEvasionChange = target.EvasionChange)); bytes.Add((byte)(TargetAbility = target.Ability)); bytes.AddRange(BitConverter.GetBytes((ushort)(TargetSpecies = target.Species))); bytes.Add((byte)(TargetType1 = target.Type1)); bytes.Add((byte)(TargetType2 = target.Type2)); bytes.AddRange(BitConverter.GetBytes(TargetWeight = target.Weight)); TargetMoves = target.Moves.ForTransformPacket(); for (int i = 0; i < (byte)TargetMoves.Count; i++) { bytes.AddRange(BitConverter.GetBytes((ushort)TargetMoves[i])); } bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
public PBETransformPacket(PBEPokemon user, PBEPokemon target) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(User = user.FieldPosition)); bytes.Add((UserTeam = user.Team).Id); bytes.Add((byte)(Target = target.FieldPosition)); bytes.Add((TargetTeam = target.Team).Id); bytes.AddRange(BitConverter.GetBytes(TargetAttack = target.Attack)); bytes.AddRange(BitConverter.GetBytes(TargetDefense = target.Defense)); bytes.AddRange(BitConverter.GetBytes(TargetSpAttack = target.SpAttack)); bytes.AddRange(BitConverter.GetBytes(TargetSpDefense = target.SpDefense)); bytes.AddRange(BitConverter.GetBytes(TargetSpeed = target.Speed)); bytes.Add((byte)(TargetAttackChange = target.AttackChange)); bytes.Add((byte)(TargetDefenseChange = target.DefenseChange)); bytes.Add((byte)(TargetSpAttackChange = target.SpAttackChange)); bytes.Add((byte)(TargetSpDefenseChange = target.SpDefenseChange)); bytes.Add((byte)(TargetSpeedChange = target.SpeedChange)); bytes.Add((byte)(TargetAccuracyChange = target.AccuracyChange)); bytes.Add((byte)(TargetEvasionChange = target.EvasionChange)); bytes.Add((byte)(TargetAbility = target.Ability)); bytes.Add((byte)(TargetType1 = target.Type1)); bytes.Add((byte)(TargetType2 = target.Type2)); bytes.AddRange(BitConverter.GetBytes(TargetWeight = target.Weight)); bytes.Add((byte)(TargetMoves = Array.AsReadOnly(target.Moves)).Count); for (int i = 0; i < TargetMoves.Count; i++) { bytes.AddRange(BitConverter.GetBytes((ushort)TargetMoves[i])); } Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public void Update(PBEPokemon pkmn) { if (pkmn == null || pkmn.FieldPosition == PBEFieldPosition.None) { IsVisible = false; } else { //Level = $"{(pkmn.Shell.Gender == PBEGender.Genderless ? " " : pkmn.GenderSymbol)}[LV]{pkmn.Shell.Level}"; //HP = pkmn.HP; Status1.Source = pkmn.Status1 == PBEStatus1.None ? null : ImageSource.FromResource($"Kermalis.PokemonBattleEngineMobile.MISC.STATUS1_{pkmn.Status1}.png"); if (pkmn.HPPercentage <= 0.20) { HP.Color = red; } else if (pkmn.HPPercentage <= 0.50) { HP.Color = yellow; } else { HP.Color = green; } const byte lineW = 48, lineH = 3; Canvas.SetSize(HP, new Size(pkmn.HPPercentage * lineW, lineH)); IsVisible = true; } }
public PokemonInfo(PBEPokemon pkmn, bool locked, Action <PokemonInfo> clickAction) { Pokemon = pkmn; bool enabled = !locked && pkmn.FieldPosition == PBEFieldPosition.None && pkmn.HP > 0; SelectPokemonCommand = new Command(() => clickAction(this), () => enabled); }
internal PBEMoveCritPacket(PBEPokemon victim) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Victim = victim.FieldPosition)); bytes.Add((VictimTeam = victim.Team).Id); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
public PBEMoveEffectivenessPacket(PBEPokemon victim, PBEEffectiveness effectiveness) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Victim = victim.FieldPosition)); bytes.Add((VictimTeam = victim.Team).Id); bytes.Add((byte)(Effectiveness = effectiveness)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public PBEMoveMissedPacket(PBEPokemon moveUser, PBEPokemon pokemon2) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition)); bytes.Add((Pokemon2Team = pokemon2.Team).Id); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public PokemonInfo(PBEPokemon pkmn, bool locked, Action <PokemonInfo> clickAction) { Pokemon = pkmn; bool enabled = !locked && pkmn.FieldPosition == PBEFieldPosition.None && pkmn.HP > 0; var sub = new Subject <bool>(); SelectPokemonCommand = ReactiveCommand.Create(() => clickAction(this), sub); sub.OnNext(enabled); }
} // null means no victim public PBEWeatherPacket(PBEWeather weather, PBEWeatherAction weatherAction, PBEPokemon damageVictim) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Weather = weather)); bytes.Add((byte)(WeatherAction = weatherAction)); bytes.Add((byte)(DamageVictim = damageVictim == null ? PBEFieldPosition.None : damageVictim.FieldPosition)); bytes.Add((DamageVictimTeam = damageVictim?.Team) == null ? byte.MaxValue : damageVictim.Team.Id); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public PBEMoveUsedPacket(PBEPokemon moveUser, PBEMove move) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move))); bytes.Add((byte)((OwnsMove = moveUser.Moves.Contains(Move)) ? 1 : 0)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
internal PBEMoveCritPacket(PBEPokemon victim) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write(Victim = victim.FieldPosition); w.Write((VictimTeam = victim.Team).Id); Data = new ReadOnlyCollection <byte>(ms.ToArray()); } }
/// <summary> /// Creates valid actions for a battle turn for a specific team. /// </summary> /// <param name="team">The team to create actions for.</param> /// <exception cref="InvalidOperationException">Thrown when <paramref name="team"/> has no active battlers or <paramref name="team"/>'s <see cref="PBETeam.Battle"/>'s <see cref="PBEBattle.BattleState"/> is not <see cref="PBEBattleState.WaitingForActions"/>.</exception> /// <exception cref="ArgumentOutOfRangeException">Thrown when a Pokémon has no moves, the AI tries to use a move with invalid targets, or <paramref name="team"/>'s <see cref="PBETeam.Battle"/>'s <see cref="PBEBattle.BattleFormat"/> is invalid.</exception> public static IEnumerable <PBEAction> CreateActions(PBETeam team) { if (team.Battle.BattleState != PBEBattleState.WaitingForActions) { throw new InvalidOperationException($"{nameof(team.Battle.BattleState)} must be {PBEBattleState.WaitingForActions} to create actions."); } PBEPokemon[] active = team.ActiveBattlers.ToArray(); if (active.Length == 0) { throw new InvalidOperationException($"{nameof(team)} must have active battlers."); } var actions = new PBEAction[active.Length]; for (int i = 0; i < active.Length; i++) { PBEPokemon pkmn = active[i]; if (pkmn.Moves.All(m => m == PBEMove.None)) { throw new ArgumentOutOfRangeException(nameof(pkmn.Moves), $"{pkmn.Shell.Nickname} has no moves."); } actions[i].PokemonId = pkmn.Id; actions[i].Decision = PBEDecision.Fight; if (pkmn.IsForcedToStruggle()) { actions[i].FightMove = PBEMove.Struggle; } else if (pkmn.TempLockedMove != PBEMove.None) { actions[i].FightMove = pkmn.TempLockedMove; } else if (pkmn.ChoiceLockedMove != PBEMove.None) { actions[i].FightMove = pkmn.ChoiceLockedMove; } else { int index; do { index = PBEUtils.RNG.Next(0, pkmn.Moves.Length); actions[i].FightMove = pkmn.Moves[index]; } while (pkmn.PP[index] == 0); // PP of PBEMove.None is always 0 as well } if (pkmn.TempLockedTargets != PBETarget.None) { actions[i].FightTargets = pkmn.TempLockedTargets; } else { actions[i].FightTargets = DecideTargets(pkmn, actions[i].FightMove); } } return(actions); }
public PBEPkmnStatChangedPacket(PBEPokemon pokemon, PBEStat stat, sbyte oldValue, sbyte newValue) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Pokemon = pokemon.FieldPosition)); bytes.Add((PokemonTeam = pokemon.Team).Id); bytes.Add((byte)(Stat = stat)); bytes.Add((byte)(OldValue = oldValue)); bytes.Add((byte)(NewValue = newValue)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public PBEMoveLockPacket(PBEPokemon moveUser, PBEMove lockedMove, PBETarget lockedTargets, PBEMoveLockType moveLockType) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(LockedMove = lockedMove))); bytes.Add((byte)(LockedTargets = lockedTargets)); bytes.Add((byte)(MoveLockType = moveLockType)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
internal PBEMoveUsedPacket(PBEPokemon moveUser, PBEMove move, bool reveal) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(Move = move))); bytes.Add((byte)((Reveal = reveal) ? 1 : 0)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
internal PBEMoveFailedPacket(PBEPokemon moveUser, PBEPokemon pokemon2, PBEFailReason failReason) { var bytes = new List<byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition)); bytes.Add((Pokemon2Team = pokemon2.Team).Id); bytes.Add((byte)(FailReason = failReason)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection<byte>(bytes); }
internal PBETypeChangedPacket(PBEPokemon pokemon, PBEType type1, PBEType type2) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write(Pokemon = pokemon.FieldPosition); w.Write((PokemonTeam = pokemon.Team).Id); w.Write(Type1 = type1); w.Write(Type2 = type2); Data = new ReadOnlyCollection <byte>(ms.ToArray()); } }
internal PBEPkmnStatChangedPacket(PBEPokemon pokemon, PBEStat stat, sbyte oldValue, sbyte newValue) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Pokemon = pokemon.FieldPosition)); bytes.Add((PokemonTeam = pokemon.Team).Id); bytes.Add((byte)(Stat = stat)); bytes.Add((byte)(OldValue = oldValue)); bytes.Add((byte)(NewValue = newValue)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
internal PBEMoveMissedPacket(PBEPokemon moveUser, PBEPokemon pokemon2) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write(MoveUser = moveUser.FieldPosition); w.Write((MoveUserTeam = moveUser.Team).Id); w.Write(Pokemon2 = pokemon2.FieldPosition); w.Write((Pokemon2Team = pokemon2.Team).Id); Data = new ReadOnlyCollection <byte>(ms.ToArray()); } }
internal PBEMoveLockPacket(PBEPokemon moveUser, PBEMove lockedMove, PBETurnTarget lockedTargets, PBEMoveLockType moveLockType) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(MoveUser = moveUser.FieldPosition)); bytes.Add((MoveUserTeam = moveUser.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(LockedMove = lockedMove))); bytes.Add((byte)(LockedTargets = lockedTargets)); bytes.Add((byte)(MoveLockType = moveLockType)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
public PBEItemPacket(PBEPokemon itemHolder, PBEPokemon pokemon2, PBEItem item, PBEItemAction itemAction) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(ItemHolder = itemHolder.FieldPosition)); bytes.Add((ItemHolderTeam = itemHolder.Team).Id); bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition)); bytes.Add((Pokemon2Team = pokemon2.Team).Id); bytes.AddRange(BitConverter.GetBytes((ushort)(Item = item))); bytes.Add((byte)(ItemAction = itemAction)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
internal PBEMovePPChangedPacket(PBEPokemon moveUser, PBEMove move, int amountReduced) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write(MoveUser = moveUser.FieldPosition); w.Write((MoveUserTeam = moveUser.Team).Id); w.Write(Move = move); w.Write(AmountReduced = amountReduced); Data = new ReadOnlyCollection <byte>(ms.ToArray()); } }
private static void ScoreStatChange(PBEPokemon user, PBEPokemon target, PBEStat stat, int change, ref double score) { // TODO: Do we need the stat change? Physical vs special vs status users, and base stats/transform stats/power trick stats sbyte original = target.GetStatChange(stat); sbyte maxStatChange = user.Team.Battle.Settings.MaxStatChange; change = Math.Max(-maxStatChange, Math.Min(maxStatChange, original + change)) - original; if (change != 0) { score += (user.Team == target.Team ? +1 : -1) * change * 10; score += HPAware(target.HPPercentage, -20, +10); } }
public PBEAbilityPacket(PBEPokemon abilityOwner, PBEPokemon pokemon2, PBEAbility ability, PBEAbilityAction abilityAction) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(AbilityOwner = abilityOwner.FieldPosition)); bytes.Add((AbilityOwnerTeam = abilityOwner.Team).Id); bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition)); bytes.Add((Pokemon2Team = pokemon2.Team).Id); bytes.Add((byte)(Ability = ability)); bytes.Add((byte)(AbilityAction = abilityAction)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public PBEStatus1Packet(PBEPokemon status1Receiver, PBEPokemon pokemon2, PBEStatus1 status1, PBEStatusAction statusAction) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Status1Receiver = status1Receiver.FieldPosition)); bytes.Add((Status1ReceiverTeam = status1Receiver.Team).Id); bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition)); bytes.Add((Pokemon2Team = pokemon2.Team).Id); bytes.Add((byte)(Status1 = status1)); bytes.Add((byte)(StatusAction = statusAction)); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
public PBEIllusionPacket(PBEPokemon pokemon) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Pokemon = pokemon.FieldPosition)); bytes.Add((PokemonTeam = pokemon.Team).Id); bytes.Add((byte)(ActualGender = pokemon.Shell.Gender)); bytes.AddRange(PBEUtils.StringToBytes(ActualNickname = pokemon.Shell.Nickname)); bytes.Add((byte)((ActualShiny = pokemon.Shell.Shiny) ? 1 : 0)); bytes.AddRange(BitConverter.GetBytes((ushort)(ActualSpecies = pokemon.Shell.Species))); Buffer = BitConverter.GetBytes((short)bytes.Count).Concat(bytes); }
internal PBEStatus1Packet(PBEPokemon status1Receiver, PBEPokemon pokemon2, PBEStatus1 status1, PBEStatusAction statusAction) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Status1Receiver = status1Receiver.FieldPosition)); bytes.Add((Status1ReceiverTeam = status1Receiver.Team).Id); bytes.Add((byte)(Pokemon2 = pokemon2.FieldPosition)); bytes.Add((Pokemon2Team = pokemon2.Team).Id); bytes.Add((byte)(Status1 = status1)); bytes.Add((byte)(StatusAction = statusAction)); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }