pyvgc 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pyvgc/__init__.py ADDED
@@ -0,0 +1,45 @@
1
+ """Public API for the pyvgc package."""
2
+
3
+ from .battle_logic import (
4
+ BattleLogic,
5
+ CARTRIDGE_CHAMPIONS_RELEASE_2026,
6
+ SIMULATOR_CHAMPIONS_RELEASE_2026,
7
+ get_battle_logic,
8
+ )
9
+ from .damage import calculate_damage, damage_rolls
10
+ from .items import Item, get_item
11
+ from .moves import (
12
+ Move,
13
+ get_move,
14
+ moves_for_pokemon,
15
+ pokemon_for_move,
16
+ )
17
+ from .pokemon import Pokemon
18
+ from .regulations import load_regulation
19
+ from .utils import (
20
+ pokemon_with_ability,
21
+ pokemon_with_single_ability,
22
+ regulation_description,
23
+ signature_moves,
24
+ )
25
+
26
+ __all__ = [
27
+ "BattleLogic",
28
+ "CARTRIDGE_CHAMPIONS_RELEASE_2026",
29
+ "SIMULATOR_CHAMPIONS_RELEASE_2026",
30
+ "calculate_damage",
31
+ "damage_rolls",
32
+ "get_battle_logic",
33
+ "get_item",
34
+ "get_move",
35
+ "Item",
36
+ "Move",
37
+ "moves_for_pokemon",
38
+ "Pokemon",
39
+ "pokemon_with_ability",
40
+ "pokemon_with_single_ability",
41
+ "pokemon_for_move",
42
+ "regulation_description",
43
+ "load_regulation",
44
+ "signature_moves",
45
+ ]
pyvgc/battle_logic.py ADDED
@@ -0,0 +1,135 @@
1
+ """Named battle-rule configurations used by regulations."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import csv
6
+ from dataclasses import dataclass, field, replace
7
+ from fractions import Fraction
8
+ from importlib import resources
9
+ from types import MappingProxyType
10
+ from typing import TYPE_CHECKING, Mapping, Optional
11
+
12
+ from .constants import (
13
+ BASE_HP_INCREASE,
14
+ BASE_STAT_INCREASE,
15
+ CRITICAL_MULTIPLIER,
16
+ DAMAGE_DIVISOR,
17
+ DAMAGE_LEVEL_DIVISOR,
18
+ LEVEL_DOUBLES,
19
+ MAX_TOTAL_TRAINING,
20
+ MAX_TRAINING_PER_STAT,
21
+ MAX_STAT_STAGE,
22
+ MIN_STAT_STAGE,
23
+ RANDOM_PERCENTAGES,
24
+ STAB_MULTIPLIER,
25
+ STAT_STAGE_MULTIPLIERS,
26
+ TYPES,
27
+ )
28
+
29
+ if TYPE_CHECKING:
30
+ from .damage import DamageRolls
31
+ from .pokemon import Pokemon
32
+
33
+
34
+ @dataclass(frozen=True)
35
+ class BattleLogic:
36
+ """Immutable rules and constants for one game-logic version."""
37
+
38
+ name: str
39
+ level: int = LEVEL_DOUBLES
40
+ base_hp_increase: int = BASE_HP_INCREASE
41
+ base_stat_increase: int = BASE_STAT_INCREASE
42
+ max_training_per_stat: int = MAX_TRAINING_PER_STAT
43
+ max_total_training: int = MAX_TOTAL_TRAINING
44
+ min_stat_stage: int = MIN_STAT_STAGE
45
+ max_stat_stage: int = MAX_STAT_STAGE
46
+ stat_stage_multipliers: Mapping[int, tuple[int, int]] = field(
47
+ default_factory=lambda: MappingProxyType(dict(STAT_STAGE_MULTIPLIERS))
48
+ )
49
+ damage_level_divisor: int = DAMAGE_LEVEL_DIVISOR
50
+ damage_divisor: int = DAMAGE_DIVISOR
51
+ random_percentages: range = RANDOM_PERCENTAGES
52
+ stab_multiplier: Fraction = STAB_MULTIPLIER
53
+ critical_multiplier: Fraction = CRITICAL_MULTIPLIER
54
+ type_chart: Optional[Mapping[str, Mapping[str, Fraction]]] = None
55
+
56
+ def with_type_chart(
57
+ self, type_chart: Mapping[str, Mapping[str, Fraction]]
58
+ ) -> "BattleLogic":
59
+ """Return this logic with an immutable type chart."""
60
+ immutable_chart = MappingProxyType({
61
+ attack: MappingProxyType(dict(defending))
62
+ for attack, defending in type_chart.items()
63
+ })
64
+ return replace(self, type_chart=immutable_chart)
65
+
66
+ def calculate_damage(
67
+ self,
68
+ attacker: "Pokemon",
69
+ defender: "Pokemon",
70
+ power: int,
71
+ move_type: str,
72
+ *,
73
+ special: bool = False,
74
+ percentage: bool = True,
75
+ ) -> "DamageRolls":
76
+ """Calculate damage using this battle logic and two Pokémon.
77
+
78
+ Both Pokémon must use this exact logic instance. This makes the
79
+ selected rule set explicit at the calculation call site.
80
+ """
81
+ from .damage import calculate_damage
82
+
83
+ if attacker.battle_logic is not self or defender.battle_logic is not self:
84
+ raise ValueError(
85
+ "attacker and defender must use this battle logic"
86
+ )
87
+ return calculate_damage(
88
+ attacker,
89
+ defender,
90
+ power,
91
+ move_type,
92
+ special=special,
93
+ percentage=percentage,
94
+ )
95
+
96
+
97
+ def _load_type_chart() -> Mapping[str, Mapping[str, Fraction]]:
98
+ """Load the initial packaged type chart used by current battle logic."""
99
+ path = resources.files("pyvgc.data").joinpath("initial_type_chart.csv")
100
+ with path.open(newline="", encoding="utf-8") as file:
101
+ return MappingProxyType({
102
+ row["AttackingType"]: MappingProxyType({
103
+ defending: Fraction(row[defending]) for defending in TYPES
104
+ })
105
+ for row in csv.DictReader(file)
106
+ })
107
+
108
+
109
+ CARTRIDGE_CHAMPIONS_RELEASE_2026 = BattleLogic(
110
+ name="Cartridge-Champions-Release-2026",
111
+ type_chart=_load_type_chart(),
112
+ )
113
+
114
+ SIMULATOR_CHAMPIONS_RELEASE_2026 = replace(
115
+ CARTRIDGE_CHAMPIONS_RELEASE_2026,
116
+ name="Simulator-Champions-Release-2026",
117
+ )
118
+
119
+ BATTLE_LOGICS = MappingProxyType(
120
+ {
121
+ "Cartridge-Champions-Release-2026": CARTRIDGE_CHAMPIONS_RELEASE_2026,
122
+ "Simulator-Champions-Release-2026": SIMULATOR_CHAMPIONS_RELEASE_2026,
123
+ }
124
+ )
125
+
126
+
127
+ def get_battle_logic(name: str) -> BattleLogic:
128
+ """Return a registered battle logic by case-insensitive name."""
129
+ if not isinstance(name, str) or not name.strip():
130
+ raise ValueError("battle logic name must be a non-empty string")
131
+ key = name.strip().casefold()
132
+ for logic_name, logic in BATTLE_LOGICS.items():
133
+ if logic_name.casefold() == key:
134
+ return logic
135
+ raise KeyError(f"Unknown battle logic: {name!r}")
pyvgc/constants.py ADDED
@@ -0,0 +1,53 @@
1
+ """Shared constants and packaged data paths for pyvgc."""
2
+
3
+ from fractions import Fraction
4
+
5
+ LEVEL_DOUBLES = 50
6
+
7
+ BASE_HP_INCREASE = 75
8
+ BASE_STAT_INCREASE = 20
9
+
10
+ MAX_TRAINING_PER_STAT = 32
11
+ MAX_TOTAL_TRAINING = 66
12
+ MIN_STAT_STAGE = -6
13
+ MAX_STAT_STAGE = 6
14
+
15
+ STAT_STAGE_MULTIPLIERS = {
16
+ stage: (2 + stage, 2) if stage >= 0 else (2, 2 - stage)
17
+ for stage in range(MIN_STAT_STAGE, MAX_STAT_STAGE + 1)
18
+ }
19
+ DAMAGE_LEVEL_DIVISOR = 5
20
+ DAMAGE_DIVISOR = 50
21
+
22
+ RANDOM_PERCENTAGES = range(85, 101)
23
+ STAB_MULTIPLIER = Fraction(3, 2)
24
+ CRITICAL_MULTIPLIER = Fraction(3, 2)
25
+ STAT_NAMES = (
26
+ "hp", "attack", "defense", "special_attack", "special_defense", "speed"
27
+ )
28
+ TYPES = frozenset((
29
+ "Normal", "Fire", "Water", "Electric", "Grass", "Ice", "Fighting",
30
+ "Poison", "Ground", "Flying", "Psychic", "Bug", "Rock", "Ghost",
31
+ "Dragon", "Dark", "Steel", "Fairy",
32
+ ))
33
+
34
+ ALWAYS_HIT_VALUE = "always-hit"
35
+
36
+ NATURES = {
37
+ "Hardy": ("attack", "attack"), "Lonely": ("attack", "defense"),
38
+ "Brave": ("attack", "speed"), "Adamant": ("attack", "special_attack"),
39
+ "Naughty": ("attack", "special_defense"),
40
+ "Bold": ("defense", "attack"), "Docile": ("defense", "defense"),
41
+ "Impish": ("defense", "special_attack"), "Lax": ("defense", "special_defense"),
42
+ "Relaxed": ("defense", "speed"),
43
+ "Modest": ("special_attack", "attack"), "Mild": ("special_attack", "defense"),
44
+ "Bashful": ("special_attack", "special_attack"),
45
+ "Rash": ("special_attack", "special_defense"), "Quiet": ("special_attack", "speed"),
46
+ "Calm": ("special_defense", "attack"), "Gentle": ("special_defense", "defense"),
47
+ "Careful": ("special_defense", "special_attack"),
48
+ "Quirky": ("special_defense", "special_defense"),
49
+ "Sassy": ("special_defense", "speed"),
50
+ "Timid": ("speed", "attack"), "Hasty": ("speed", "defense"),
51
+ "Jolly": ("speed", "special_attack"), "Naive": ("speed", "special_defense"),
52
+ "Serious": ("speed", "speed"),
53
+ }
pyvgc/damage.py ADDED
@@ -0,0 +1,183 @@
1
+ """Pokémon Champions damage calculation for level-50 Pokémon."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from fractions import Fraction
6
+ from typing import TYPE_CHECKING, Iterable, TypedDict
7
+
8
+ from .battle_logic import BattleLogic, CARTRIDGE_CHAMPIONS_RELEASE_2026
9
+ from .constants import TYPES
10
+
11
+ if TYPE_CHECKING:
12
+ from .pokemon import Pokemon
13
+
14
+
15
+ class DamageRolls(TypedDict, total=False):
16
+ """Mapping returned by damage calculations."""
17
+
18
+ normal: list[int]
19
+ critical: list[int]
20
+ normal_percentage: list[float]
21
+ critical_percentage: list[float]
22
+
23
+
24
+ def _normalize_type(type_name: str) -> str:
25
+ """Validate and canonicalize one Pokémon type name."""
26
+ if not isinstance(type_name, str):
27
+ raise ValueError(f"type names must be strings, got {type(type_name).__name__}")
28
+ normalized = type_name.strip().title()
29
+ if normalized not in TYPES:
30
+ raise ValueError(f"unknown Pokémon type: {type_name!r}")
31
+ return normalized
32
+
33
+
34
+ def _type_multiplier_for_types(
35
+ move_type: str, defender_types: tuple[str, ...], logic: BattleLogic
36
+ ) -> Fraction:
37
+ """Return effectiveness for already-normalized defender types."""
38
+ if logic.type_chart is None:
39
+ raise ValueError(f"battle logic {logic.name!r} has no type chart")
40
+ multiplier = Fraction(1)
41
+ for defender_type in defender_types:
42
+ multiplier *= logic.type_chart[move_type][defender_type]
43
+ return multiplier
44
+
45
+
46
+ def _type_multiplier(
47
+ move_type: str, defender_types: Iterable[str], logic: BattleLogic
48
+ ) -> Fraction:
49
+ """Normalize types and return their combined effectiveness multiplier."""
50
+ normalized_move = _normalize_type(move_type)
51
+ normalized_defenders = tuple(
52
+ _normalize_type(defender_type) for defender_type in defender_types
53
+ )
54
+ return _type_multiplier_for_types(
55
+ normalized_move, normalized_defenders, logic
56
+ )
57
+
58
+
59
+ def damage_rolls(
60
+ power: int,
61
+ attack: int,
62
+ defense: int,
63
+ move_type: str,
64
+ attacker_types: Iterable[str],
65
+ defender_types: Iterable[str],
66
+ *,
67
+ logic: BattleLogic = CARTRIDGE_CHAMPIONS_RELEASE_2026,
68
+ ) -> DamageRolls:
69
+ """Return all 16 normal and 16 critical damage rolls.
70
+
71
+ ``attack`` and ``defense`` are the already-calculated battle stats.
72
+ Damage is floored at every formula step, as in the games. Critical hits
73
+ use the selected logic's critical multiplier and ignore the relevant stat
74
+ stages.
75
+ """
76
+ if not all(
77
+ type(value) is int and value > 0
78
+ for value in (power, attack, defense)
79
+ ):
80
+ raise ValueError("power, attack, and defense must be positive integers")
81
+ move_type = _normalize_type(move_type)
82
+ attacker_types = tuple(
83
+ _normalize_type(type_name) for type_name in attacker_types
84
+ )
85
+ defender_types = tuple(
86
+ _normalize_type(type_name) for type_name in defender_types
87
+ )
88
+ if not attacker_types or not defender_types:
89
+ raise ValueError("attacker_types and defender_types must not be empty")
90
+ if len(attacker_types) > 2 or len(defender_types) > 2:
91
+ raise ValueError("a Pokémon can have at most two types")
92
+ stab = logic.stab_multiplier if move_type in attacker_types else Fraction(1)
93
+ effectiveness = _type_multiplier(move_type, defender_types, logic)
94
+
95
+ # (((((2L/5)+2) * Power * A / D) / 50) + 2), with integer floors.
96
+ base = (
97
+ (
98
+ (2 * logic.level // logic.damage_level_divisor + 2)
99
+ * power
100
+ * attack
101
+ // defense
102
+ )
103
+ // logic.damage_divisor
104
+ ) + 2
105
+
106
+ def rolls(critical: bool) -> list[int]:
107
+ """Calculate all 16 random outcomes for one hit category."""
108
+ result: list[int] = []
109
+ critical_damage = int(base * logic.critical_multiplier) if critical else base
110
+ for random_percent in logic.random_percentages:
111
+ fixed = critical_damage * random_percent // 100
112
+ fixed = int(fixed * stab)
113
+ fixed = int(fixed * effectiveness)
114
+ result.append(fixed)
115
+ return result
116
+
117
+ return {"normal": rolls(False), "critical": rolls(True)}
118
+
119
+
120
+ def calculate_damage(
121
+ attacker: "Pokemon",
122
+ defender: "Pokemon",
123
+ power: int,
124
+ move_type: str,
125
+ *,
126
+ special: bool = False,
127
+ percentage: bool = True,
128
+ ) -> DamageRolls:
129
+ """Calculate damage rolls using two Pokémon and their current battle state.
130
+
131
+ The Pokémon models provide state only. This function owns the damage
132
+ calculation, including critical-hit stat-stage handling and percentages.
133
+ """
134
+ from .pokemon import Pokemon
135
+
136
+ if not isinstance(attacker, Pokemon) or not isinstance(defender, Pokemon):
137
+ raise TypeError("attacker and defender must be Pokemon instances")
138
+ if attacker.battle_logic != defender.battle_logic:
139
+ raise ValueError("attacker and defender must use the same battle logic")
140
+
141
+ attack_stat = "special_attack" if special else "attack"
142
+ defense_stat = "special_defense" if special else "defense"
143
+ attack = getattr(attacker, attack_stat)
144
+ defense = getattr(defender, defense_stat)
145
+ rolls = damage_rolls(
146
+ power,
147
+ attack,
148
+ defense,
149
+ move_type,
150
+ attacker.types,
151
+ defender.types,
152
+ logic=attacker.battle_logic,
153
+ )
154
+ critical_attack = (
155
+ attacker._pre_stage_stats[attack_stat]
156
+ if attacker._stat_stages.get(attack_stat, 0) < 0
157
+ else attack
158
+ )
159
+ critical_defense = (
160
+ defender._pre_stage_stats[defense_stat]
161
+ if defender._stat_stages.get(defense_stat, 0) > 0
162
+ else defense
163
+ )
164
+ if critical_attack != attack or critical_defense != defense:
165
+ rolls["critical"] = damage_rolls(
166
+ power,
167
+ critical_attack,
168
+ critical_defense,
169
+ move_type,
170
+ attacker.types,
171
+ defender.types,
172
+ logic=attacker.battle_logic,
173
+ )["critical"]
174
+ if percentage:
175
+ rolls["normal_percentage"] = [
176
+ round(damage / defender.hp * 100, 2)
177
+ for damage in rolls["normal"]
178
+ ]
179
+ rolls["critical_percentage"] = [
180
+ round(damage / defender.hp * 100, 2)
181
+ for damage in rolls["critical"]
182
+ ]
183
+ return rolls
pyvgc/data/__init__.py ADDED
@@ -0,0 +1 @@
1
+ """Bundled data files for pyvgc."""
@@ -0,0 +1,167 @@
1
+ ItemName,ReleasedInRegulation,Description
2
+ Abomasite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
3
+ Absolite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
4
+ Absolite Z,M-C,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
5
+ Aerodactylite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
6
+ Aggronite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
7
+ Air Balloon,M-C,"This item, when attached to a Pokémon, causes it to be immune from Ground-type attacks and entry hazards."
8
+ Alakazite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
9
+ Altarianite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
10
+ Ampharosite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
11
+ Aspear Berry,M-A,Cures the holder of freeze.
12
+ Audinite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
13
+ Babiri Berry,M-A,Weakens one super-effective Steel-type attack against the holder.
14
+ Banettite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
15
+ Barbaracite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
16
+ Baxcalibrite,M-C,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
17
+ Beedrillite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
18
+ Big Root,M-B,Boosts HP restored by draining and recovery moves by 30%.
19
+ Binding Band,M-C,"This item, when attached to a Pokémon, increases damage caused by moves that constrict the opponent."
20
+ Black Belt,M-A,"When this item is held, any Fighting-type move used by the holder has its power increased by 20%."
21
+ Black Glasses,M-A,"When this item is held, any Dark-type move used by the holder has its power increased by 20%."
22
+ Blastoisinite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
23
+ Blazikenite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
24
+ Bright Powder,M-A,This hold item raises the holder's evasion by 10%.
25
+ Cameruptite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
26
+ Chandelurite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
27
+ Charcoal,M-A,"When this item is held, any Fire-type move used by the holder has its power increased by 20%."
28
+ Charizardite X,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
29
+ Charizardite Y,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
30
+ Charti Berry,M-A,Weakens one super-effective Rock-type attack against the holder.
31
+ Cheri Berry,M-A,Cures the holder of paralysis.
32
+ Chesnaughtite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
33
+ Chesto Berry,M-A,Cures the holder of sleep.
34
+ Chilan Berry,M-A,Weakens one super-effective Normal-type attack against the holder.
35
+ Chimechite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
36
+ Choice Scarf,M-A,"When this item is being held, the user's Speed is increased by 50%, but the Pokémon is limited to using the first attack it uses until it is withdrawn from battle."
37
+ Chople Berry,M-A,Weakens one super-effective Fighting-type attack against the holder.
38
+ Clefablite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
39
+ Coba Berry,M-A,Weakens one super-effective Flying-type attack against the holder.
40
+ Colbur Berry,M-A,Weakens one super-effective Dark-type attack against the holder.
41
+ Crabominite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
42
+ Damp Rock,M-B,"When this item is held by a Pokémon, if the holder uses the move Rain Dance, the weather effect lasts eight turns as opposed to five."
43
+ Delphoxite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
44
+ Dragalgite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
45
+ Dragon Fang,M-A,"When this item is held, any Dragon-type move used by the holder has its power increased by 20%."
46
+ Dragoninite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
47
+ Drampanite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
48
+ Eelektrossite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
49
+ Eject Button,M-C,"This item, when attached to a Pokémon, allows the holder to escape from battle should they get hit by an attack that makes physical contact."
50
+ Electric Seed,M-C,This item will boost the user's Defense by 1 stage when Electric Terrain is activated.
51
+ Emboarite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
52
+ Excadrite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
53
+ Expert Belt,M-B,"When this item is held, if the holder uses an attack on the opponent which is Super Effective, its power is increased by 20%."
54
+ Fairy Feather,M-A,This item increases damage inflicted by Fairy-type moves by 20%.
55
+ Falinksite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
56
+ Feraligite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
57
+ Floettite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
58
+ Focus Band,M-A,Gives the holder a 10% chance to survive an attack that would knock it out with 1 HP.
59
+ Focus Sash,M-A,"Prevents a full-HP holder from being knocked out by one attack, leaving it at 1 HP; consumed after use."
60
+ Froslassite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
61
+ Galladite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
62
+ Garchompite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
63
+ Garchompite Z,M-C,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
64
+ Gardevoirite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
65
+ Gengarite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
66
+ Glalitite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
67
+ Glimmoranite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
68
+ Golisopite,M-C,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
69
+ Golurkite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
70
+ Grassy Seed,M-C,This item will boost the user's Defense by 1 stage when Grassy Terrain is activated.
71
+ Greninjite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
72
+ Gyaradosite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
73
+ Haban Berry,M-A,Weakens one super-effective Dragon-type attack against the holder.
74
+ Hard Stone,M-A,"When this item is held, any Rock-type move used by the holder has its power increased by 20%."
75
+ Hawluchanite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
76
+ Heat Rock,M-B,"When this item is held by a Pokémon, if the holder uses the move Sunny Day, the weather effect lasts eight turns as opposed to five."
77
+ Heracronite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
78
+ Houndoominite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
79
+ Icy Rock,M-B,"When this item is held by a Pokémon, if the holder uses the move Hail, the weather effect lasts eight turns as opposed to five."
80
+ Iron Ball,M-B,"When this item is held by a Pokémon, the holder's Speed is reduced by 50%. If the holder is of the Flying-type or it has the ability; Levitate, it becomes susceptable to Ground-type moves."
81
+ Kangaskhanite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
82
+ Kasib Berry,M-A,Weakens one super-effective Ghost-type attack against the holder.
83
+ Kebia Berry,M-A,Weakens one super-effective Poison-type attack against the holder.
84
+ King's Rock,M-A,"When this item is held by a Pokémon, the likelihood of the opponent flinching from a damaging attack by this Pokémon is increased by 10 %."
85
+ Leek,M-C,"When this item is held by Farfetch'd, the holder's Critical Hit ratio is raised by 2 stages. In Pokémon Sword & Shield, this item's name was changed from Stick to Leek."
86
+ Leftovers,M-A,"When this item is held, at the end of every turn, the holder regains 1/16th of their maximum HP."
87
+ Leppa Berry,M-A,Restores 10 PP to a move when the holder runs out of PP for it.
88
+ Life Orb,M-B,"When this item is held by a Pokémon, the damage from the moves used by the holder is increased by 30%. The holder loses 10% of their maximum HP each turn."
89
+ Light Ball,M-A,Doubles the Attack and Special Attack of Pikachu.
90
+ Light Clay,M-B,"When this item is held by a Pokémon, if the holder uses the attacks Reflect or Light Screen, the effects of those attacks last eight turns as opposed to five."
91
+ Lopunnite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
92
+ Lucarionite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
93
+ Lucarionite Z,M-C,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
94
+ Lum Berry,M-A,Cures the holder of any major status condition or confusion.
95
+ Magnet,M-A,"When this item is held, any Electric-type move used by the holder has its power increased by 20%."
96
+ Malamarite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
97
+ Manectite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
98
+ Mawilite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
99
+ Medichamite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
100
+ Meganiumite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
101
+ Mental Herb,M-A,"Cures infatuation and certain move-prevention effects once, then is consumed."
102
+ Meowsticite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
103
+ Metagrossite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
104
+ Metal Coat,M-A,Boosts Steel-type moves by 20%.
105
+ Metronome,M-B,"Boosts the power of a move used consecutively, up to a maximum bonus."
106
+ Miracle Seed,M-A,"When this item is held, any Grass-type move used by the holder has its power increased by 20%."
107
+ Misty Seed,M-C,This item will boost the user's Special Defense by 1 stage when Misty Terrain is activated.
108
+ Muscle Band,M-B,"When this item is held, the holder's Physical attacks are increased in power by 10%."
109
+ Mystic Water,M-A,"When this item is held, any Water-type move used by the holder has its power increased by 20%."
110
+ Never-Melt Ice,M-A,Boosts the power of Ice-type moves.
111
+ Normal Gem,M-C,Boosts the power of the holder’s Normal-type move once by 30%; consumed after use.
112
+ Occa Berry,M-A,Weakens one super-effective Fire-type attack against the holder.
113
+ Oran Berry,M-A,Restores 10 HP when the holder has low HP.
114
+ Passho Berry,M-A,Weakens one super-effective Water-type attack against the holder.
115
+ Payapa Berry,M-A,Weakens one super-effective Psychic-type attack against the holder.
116
+ Pecha Berry,M-A,Cures the holder of poison.
117
+ Persim Berry,M-A,Cures the holder of confusion.
118
+ Pidgeotite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
119
+ Pinsirite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
120
+ Poison Barb,M-A,"When this item is held, any Poison-type move used by the holder has its power increased by 20%."
121
+ Psychic Seed,M-C,This item will boost the user's Special Defense by 1 stage when Psychic Terrain is activated.
122
+ Pyroarite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
123
+ Quick Claw,M-A,"When this item is held, the user has a 18.75% (Gen 3 & 4), or 20% (Gen 5 & beyond) chance of attacking first if the moves all Pokémon use are within the same Speed Priority level."
124
+ Raichunite X,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
125
+ Raichunite Y,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
126
+ Rawst Berry,M-A,Cures the holder of burn.
127
+ Red Card,M-C,"This item, when attached to a Pokémon, causes any Pokémon that makes physical contact to be removed from battle."
128
+ Rindo Berry,M-A,Weakens one super-effective Grass-type attack against the holder.
129
+ Rocky Helmet,M-C,"This item, when attached to a Pokémon, causes the attacker to receive recoil of 1/6th of maximum Hit Points should they make Physical Contact."
130
+ Roseli Berry,M-A,Weakens one super-effective Fairy-type attack against the holder.
131
+ Sablenite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
132
+ Salamencite,M-C,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
133
+ Sceptilite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
134
+ Scizorite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
135
+ Scolipite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
136
+ Scope Lens,M-A,"When held by a Pokémon, the Pokémon's Critical Hit ratio is raised by 1."
137
+ Scovillainite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
138
+ Scraftinite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
139
+ Sharp Beak,M-A,"When this item is held, any Flying-type move used by the holder has its power increased by 20%."
140
+ Sharpedonite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
141
+ Shed Shell,M-B,"When this item is held by a Pokémon, if the trainer tries to switch the holder with another Pokémon, the switch is not affected by any moves or abilities which would prvent it leaving."
142
+ Shell Bell,M-A,"When this item is held, the holder recovers 1/8th of the damage it inflicts on its opponents."
143
+ Shuca Berry,M-A,Weakens one super-effective Ground-type attack against the holder.
144
+ Silk Scarf,M-A,Boosts Normal-type moves by 20%.
145
+ Silver Powder,M-A,"When this item is held, any Bug-type move used by the holder has its power increased by 20%."
146
+ Sitrus Berry,M-A,Restores 25% of the holder’s maximum HP when its HP is low.
147
+ Skarmorite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
148
+ Slowbronite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
149
+ Smooth Rock,M-B,"When this item is held by a Pokémon, if the holder uses the move Sandstorm, the weather effect lasts eight turns as opposed to five."
150
+ Soft Sand,M-A,"When this item is held, any Ground-type move used by the holder has its power increased by 20%."
151
+ Spell Tag,M-A,"When this item is held, any Ghost-type move used by the holder has its power increased by 20%."
152
+ Staraptite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
153
+ Starminite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
154
+ Steelixite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
155
+ Swampertite,M-B,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
156
+ Tanga Berry,M-A,Weakens one super-effective Bug-type attack against the holder.
157
+ Terrain Extender,M-C,Extends terrain created by the holder’s move or ability by three turns.
158
+ Twisted Spoon,M-A,"When this item is held, any Psychic-type move used by the holder has its power increased by 20%."
159
+ Tyranitarite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
160
+ Venusaurite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
161
+ Victreebelite,M-A,"This item, when held, allows for the Pokémon to Mega Evolve in battle."
162
+ Wacan Berry,M-A,Weakens one super-effective Electric-type attack against the holder.
163
+ White Herb,M-A,"At the end of using a move, the holder's stats have been lowered, the White Herb restores the stat to normal. The White Herb disappears after use."
164
+ Wide Lens,M-B,"When this item is held by a Pokémon, the moves used by the Pokémon have their accuracy increased by 10% of their accuracy value."
165
+ Wise Glasses,M-B,"When this item is held, the holder's Special attacks are increased in power by 10%."
166
+ Yache Berry,M-A,Weakens one super-effective Ice-type attack against the holder.
167
+ Zoom Lens,M-B,"When this item is held by a Pokémon, if the holder moves last, its accuracy is increased by 20%."