Source code for pyboy.plugins.game_wrapper_kirby_dream_land
#
# License: See LICENSE.md file
# GitHub: https://github.com/Baekalfen/PyBoy
#
import pyboy
from pyboy.utils import PyBoyException
from .base_plugin import PyBoyGameWrapper
logger = pyboy.logging.get_logger(__name__)
[docs]
class GameWrapperKirbyDreamLand(PyBoyGameWrapper):
"""
This class wraps Kirby Dream Land, and provides easy 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 = "KIRBY DREAM LAN"
def __init__(self, *args, **kwargs):
self.score = 0
"""The score provided by the game"""
self.health = 0
"""The health provided by the game"""
self.lives_left = 0
"""The lives remaining provided by the game"""
self._game_over = False
"""The game over state"""
super().__init__(*args, game_area_section=(0, 0, 20, 16), game_area_follow_scxy=True, **kwargs)
def post_tick(self):
self._tile_cache_invalid = True
self._sprite_cache_invalid = True
self.score = 0
score_digits = 4
for n in range(score_digits):
self.score += self.pyboy.memory[0xD070 + n] * 10 ** (score_digits - n)
# Check if game is over
prev_health = self.health
self.health = self.pyboy.memory[0xD086]
if self.lives_left == 0:
if prev_health > 0 and self.health == 0:
self._game_over = True
self.lives_left = self.pyboy.memory[0xD089] - 1
[docs]
def start_game(self, timer_div=None):
"""
Call this function right after initializing PyBoy. This will navigate through menus to start the game at the
first playable state.
The state of the emulator is saved, and using `reset_game`, you can get back to this point of the game
instantly.
Kwargs:
* timer_div (int): Replace timer's DIV register with this value. Use `None` to randomize.
"""
if self.game_has_started:
raise PyBoyException("Gamewrapper already started! Use 'reset' instead.")
# Boot screen
while True:
self.pyboy.tick(1, False)
if self.tilemap_background[0:3, 16] == [231, 224, 235]: # 'HAL' on the first screen
break
# Wait for transition to finish (start screen)
self.pyboy.tick(25, False)
self.pyboy.button("start")
self.pyboy.tick()
# Wait for transition to finish (exit start screen, enter level intro screen)
self.pyboy.tick(60, False)
# Skip level intro
self.pyboy.button("start")
self.pyboy.tick()
# Wait for transition to finish (exit level intro screen, enter game)
self.pyboy.tick(60, False)
PyBoyGameWrapper.start_game(self, timer_div=timer_div)
[docs]
def reset_game(self, timer_div=None):
"""
After calling `start_game`, you can call this method at any time to reset the game.
Kwargs:
* timer_div (int): Replace timer's DIV register with this value. Use `None` to randomize.
"""
self._game_over = False
PyBoyGameWrapper.reset_game(self, timer_div=timer_div)
[docs]
def game_area(self):
"""
Use this method to get a matrix of the "game area" of the screen.
```text
0 1 2 3 4 5 6 7 8 9
____________________________________________________________________________________
0 | 383 383 383 301 383 383 383 297 383 383 383 301 383 383 383 297 383 383 383 293
1 | 383 383 383 383 300 294 295 296 383 383 383 383 300 294 295 296 383 383 299 383
2 | 311 318 319 320 383 383 383 383 383 383 383 383 383 383 383 383 383 301 383 383
3 | 383 383 383 321 322 383 383 383 383 383 383 383 383 383 383 383 383 383 300 294
4 | 383 383 383 383 323 290 291 383 383 383 313 312 311 318 319 320 383 290 291 383
5 | 383 383 383 383 324 383 383 383 383 315 314 383 383 383 383 321 322 383 383 383
6 | 383 383 383 383 324 293 292 383 383 316 383 383 383 383 383 383 323 383 383 383
7 | 383 383 383 383 324 383 383 298 383 317 383 383 383 383 383 383 324 383 383 383
8 | 319 320 383 383 324 383 383 297 383 317 383 383 383 152 140 383 324 383 383 307
9 | 383 321 322 383 324 294 295 296 383 325 383 383 383 383 383 383 326 272 274 309
10 | 383 383 323 383 326 383 383 383 2 18 383 330 331 331 331 331 331 331 331 331
11 | 274 383 324 272 274 272 274 272 274 272 274 334 328 328 328 328 328 328 328 328
12 | 331 331 331 331 331 331 331 331 331 331 331 328 328 328 328 328 328 328 328 328
13 | 328 328 328 277 278 328 328 328 328 328 328 328 328 277 278 328 328 277 278 277
14 | 328 277 278 279 281 277 278 328 328 277 278 277 278 279 281 277 278 279 281 279
15 | 278 279 281 280 282 279 281 277 278 279 281 279 281 280 282 279 281 280 282 280
```
Returns
-------
numpy.ndarray:
Simplified two-dimensional array of mapped tile identifiers with dtype `numpy.uint32`.
"""
return PyBoyGameWrapper.game_area(self)
[docs]
def game_over(self):
return self._game_over
def __repr__(self):
return (
"Kirby Dream Land:\n"
+ f"Score: {self.score}\n"
+ f"Health: {self.health}\n"
+ f"Lives left: {self.lives_left}\n"
+ super().__repr__()
)