Module pyboy.plugins.game_wrapper_pokemon_gen1
Expand source code
#
# License: See LICENSE.md file
# GitHub: https://github.com/Baekalfen/PyBoy
#
__pdoc__ = {
"GameWrapperPokemonGen1.cartridge_title": False,
"GameWrapperPokemonGen1.post_tick": False,
}
import numpy as np
import pyboy
from pyboy import utils
from pyboy.utils import WindowEvent
from .base_plugin import PyBoyGameWrapper
logger = pyboy.logging.get_logger(__name__)
class GameWrapperPokemonGen1(PyBoyGameWrapper):
"""
This class wraps Pokemon Red/Blue, and provides basic access for AIs.
If you call `print` on an instance of this object, it will show an overview of everything this object provides.
"""
cartridge_title = None
def __init__(self, *args, **kwargs):
super().__init__(*args, game_area_section=(0, 0, 20, 18), game_area_follow_scxy=True, **kwargs)
self.sprite_offset = 0
def enabled(self):
return (self.pyboy.cartridge_title == "POKEMON RED") or (self.pyboy.cartridge_title == "POKEMON BLUE")
def post_tick(self):
self._tile_cache_invalid = True
self._sprite_cache_invalid = True
scanline_parameters = self.pyboy.screen.tilemap_position_list
WX = scanline_parameters[0][2]
WY = scanline_parameters[0][3]
self.use_background(WY != 0)
def _get_screen_background_tilemap(self):
### SIMILAR TO CURRENT pyboy.game_wrapper.game_area(), BUT ONLY FOR BACKGROUND TILEMAP, SO NPC ARE SKIPPED
((scx, scy), (wx, wy)) = self.pyboy.screen.get_tilemap_position()
tilemap = np.array(self.pyboy.tilemap_background[:, :])
return np.roll(np.roll(tilemap, -scy // 8, axis=0), -scx // 8, axis=1)[:18, :20]
def _get_screen_walkable_matrix(self):
walkable_tiles_indexes = []
collision_ptr = self.pyboy.memory[0xD530] + (self.pyboy.memory[0xD531] << 8)
tileset_type = self.pyboy.memory[0xFFD7]
if tileset_type > 0:
grass_tile_index = self.pyboy.memory[0xD535]
if grass_tile_index != 0xFF:
walkable_tiles_indexes.append(grass_tile_index + 0x100)
for i in range(0x180):
tile_index = self.pyboy.memory[collision_ptr + i]
if tile_index == 0xFF:
break
else:
walkable_tiles_indexes.append(tile_index + 0x100)
screen_tiles = self._get_screen_background_tilemap()
bottom_left_screen_tiles = screen_tiles[1:1 + screen_tiles.shape[0]:2, ::2]
walkable_matrix = np.isin(bottom_left_screen_tiles, walkable_tiles_indexes).astype(np.uint8)
return walkable_matrix
def game_area_collision(self):
width = self.game_area_section[2]
height = self.game_area_section[3]
game_area = np.ndarray(shape=(height, width), dtype=np.uint32)
_collision = self._get_screen_walkable_matrix()
for i in range(height // 2):
for j in range(width // 2):
game_area[i * 2][j * 2:j*2 + 2] = _collision[i][j]
game_area[i*2 + 1][j * 2:j*2 + 2] = _collision[i][j]
return game_area
def __repr__(self):
# yapf: disable
return (
f"Pokemon Gen 1:\n" +
super().__repr__()
)
# yapf: enable
Classes
class GameWrapperPokemonGen1 (*args, **kwargs)
-
This class wraps Pokemon Red/Blue, and provides basic access for AIs.
If you call
print
on an instance of this object, it will show an overview of everything this object provides.Expand source code
class GameWrapperPokemonGen1(PyBoyGameWrapper): """ This class wraps Pokemon Red/Blue, and provides basic access for AIs. If you call `print` on an instance of this object, it will show an overview of everything this object provides. """ cartridge_title = None def __init__(self, *args, **kwargs): super().__init__(*args, game_area_section=(0, 0, 20, 18), game_area_follow_scxy=True, **kwargs) self.sprite_offset = 0 def enabled(self): return (self.pyboy.cartridge_title == "POKEMON RED") or (self.pyboy.cartridge_title == "POKEMON BLUE") def post_tick(self): self._tile_cache_invalid = True self._sprite_cache_invalid = True scanline_parameters = self.pyboy.screen.tilemap_position_list WX = scanline_parameters[0][2] WY = scanline_parameters[0][3] self.use_background(WY != 0) def _get_screen_background_tilemap(self): ### SIMILAR TO CURRENT pyboy.game_wrapper.game_area(), BUT ONLY FOR BACKGROUND TILEMAP, SO NPC ARE SKIPPED ((scx, scy), (wx, wy)) = self.pyboy.screen.get_tilemap_position() tilemap = np.array(self.pyboy.tilemap_background[:, :]) return np.roll(np.roll(tilemap, -scy // 8, axis=0), -scx // 8, axis=1)[:18, :20] def _get_screen_walkable_matrix(self): walkable_tiles_indexes = [] collision_ptr = self.pyboy.memory[0xD530] + (self.pyboy.memory[0xD531] << 8) tileset_type = self.pyboy.memory[0xFFD7] if tileset_type > 0: grass_tile_index = self.pyboy.memory[0xD535] if grass_tile_index != 0xFF: walkable_tiles_indexes.append(grass_tile_index + 0x100) for i in range(0x180): tile_index = self.pyboy.memory[collision_ptr + i] if tile_index == 0xFF: break else: walkable_tiles_indexes.append(tile_index + 0x100) screen_tiles = self._get_screen_background_tilemap() bottom_left_screen_tiles = screen_tiles[1:1 + screen_tiles.shape[0]:2, ::2] walkable_matrix = np.isin(bottom_left_screen_tiles, walkable_tiles_indexes).astype(np.uint8) return walkable_matrix def game_area_collision(self): width = self.game_area_section[2] height = self.game_area_section[3] game_area = np.ndarray(shape=(height, width), dtype=np.uint32) _collision = self._get_screen_walkable_matrix() for i in range(height // 2): for j in range(width // 2): game_area[i * 2][j * 2:j*2 + 2] = _collision[i][j] game_area[i*2 + 1][j * 2:j*2 + 2] = _collision[i][j] return game_area def __repr__(self): # yapf: disable return ( f"Pokemon Gen 1:\n" + super().__repr__() ) # yapf: enable
Ancestors
- PyBoyGameWrapper
- pyboy.plugins.base_plugin.PyBoyPlugin
Methods
def enabled(self)
-
Expand source code
def enabled(self): return (self.pyboy.cartridge_title == "POKEMON RED") or (self.pyboy.cartridge_title == "POKEMON BLUE")
def game_area_collision(self)
-
Expand source code
def game_area_collision(self): width = self.game_area_section[2] height = self.game_area_section[3] game_area = np.ndarray(shape=(height, width), dtype=np.uint32) _collision = self._get_screen_walkable_matrix() for i in range(height // 2): for j in range(width // 2): game_area[i * 2][j * 2:j*2 + 2] = _collision[i][j] game_area[i*2 + 1][j * 2:j*2 + 2] = _collision[i][j] return game_area
Inherited members