Exemplo n.º 1
0
        public static EncounterTable LoadOrGet(int id)
        {
            string name = _ids[id];

            if (name is null)
            {
                throw new ArgumentOutOfRangeException(nameof(id));
            }
            EncounterTable e;

            if (!_loadedEncounterTables.ContainsKey(id))
            {
                e = new EncounterTable(name);
                _loadedEncounterTables.Add(id, new WeakReference <EncounterTable>(e));
                return(e);
            }
            WeakReference <EncounterTable> w = _loadedEncounterTables[id];

            if (w.TryGetTarget(out e))
            {
                return(e);
            }
            e = new EncounterTable(name);
            w.SetTarget(e);
            return(e);
        }
Exemplo n.º 2
0
        private static EncounterTable.Encounter RollEncounter(EncounterTable tbl, ushort combinedChance)
        {
            int r   = PBEUtils.GlobalRandom.RandomInt(1, combinedChance);
            int sum = 0;

            foreach (EncounterTable.Encounter encounter in tbl.Encounters)
            {
                sum += encounter.Chance;
                if (r <= sum)
                {
                    return(encounter);
                }
            }
            throw new Exception("Miscalculation with encounter table data");
        }
Exemplo n.º 3
0
        // TODO: Biking lowers the rate by 20% according to gen 3, running does not affect (according to gen 3, maybe it does after)
        public static bool CheckForWildBattle(bool ignoreAbilityOrItem)
        {
            PlayerObj player = PlayerObj.Player;

            Map.Layout.Block block = player.GetBlock(out Map map);
            EncounterType    t;

            switch (block.BlocksetBlock.Behavior)
            {
            case BlocksetBlockBehavior.AllowElevationChange_Cave_Encounter:
            case BlocksetBlockBehavior.Cave_Encounter:
            case BlocksetBlockBehavior.Grass_Encounter: t = EncounterType.Default; break;

            case BlocksetBlockBehavior.Grass_SpecialEncounter: t = EncounterType.DarkGrass; break;

            case BlocksetBlockBehavior.Surf: t = EncounterType.Surf; break;

            default: return(false);
            }
            EncounterTable tbl = map.Encounters.GetEncounterTable(t);

            if (tbl is null)
            {
                return(false);
            }
            int chance = tbl.ChanceOfPhenomenon;

            // Some abilities affect the wild encounter rate
            // This is an option because some encounters (like rock smash) do not use the ability to modify the rate
            if (!ignoreAbilityOrItem)
            {
                PartyPokemon pkmn = Game.Instance.Save.PlayerParty[0];
                PBEAbility   abilityOfFirstInParty = pkmn.Ability;
                PBEItem      itemOfFirstInParty    = pkmn.Item;
                // TODO: CompoundEyes
                // TODO: CuteCharm
                // TODO: Hustle, Pressure, VitalSpirit
                // TODO: Intimidate, KeenEye
                // TODO: MagnetPull, Static
                // TODO: SandVeil, SnowCloak
                // TODO: StickyHold, SuctionCups
                // TODO: Synchronize
                switch (abilityOfFirstInParty)
                {
                case PBEAbility.ArenaTrap:
                case PBEAbility.Illuminate:
                case PBEAbility.NoGuard: chance *= 2; break;

                case PBEAbility.QuickFeet:
                case PBEAbility.Stench:
                case PBEAbility.WhiteSmoke: chance /= 2; break;
                }
                switch (itemOfFirstInParty)
                {
                case PBEItem.CleanseTag: chance = chance * 2 / 3; break;     // Reduce by 1/3
                }
            }
            if (!PBEUtils.GlobalRandom.RandomBool(chance, byte.MaxValue))
            {
                return(false);
            }
            ushort combinedChance = tbl.GetCombinedChance();

            if (combinedChance == 0)
            {
                return(false);
            }
            EncounterTable.Encounter encounter0 = RollEncounter(tbl, combinedChance);
            Game.Instance.TempCreateWildBattle(map, block, encounter0);
            return(true);
        }
Exemplo n.º 4
0
 public EncounterGroup(EndianBinaryReader r)
 {
     Type  = r.ReadEnum <EncounterType>();
     Table = EncounterTable.LoadOrGet(r.ReadInt32());
 }