← Back to projects

Android / WearOS

SmartPokeWalker

An expanded Pokéwalker reimagined for WearOS - high-accuracy step tracking, custom Pokémon data extracted from ROM, and peer-to-peer monster trading over BLE/GATT with no internet required.

Year 2024
Role Solo Developer
Status Active Development
Kotlin WearOS Android Sensor API BLE / GATT Python ndspy

Overview

In 2009 and 2010, Pokemon HeartGold/SoulSilver came with an additional peripheral in the box. The Pokewalker was a beloved peripheral, a wearable pedometer that let you take your Pokémon for a walk, earn watts, and catch wild Pokémon. SmartPokeWalker reimagines this concept for modern WearOS smartwatches, with expanded mechanics and wireless trading between devices.

Step Tracking

WearOS provides access to the Android Sensor API, including the TYPE_STEP_COUNTER and TYPE_STEP_DETECTOR sensors. SmartPokeWalker uses a hybrid approach:

  • TYPE_STEP_COUNTER for cumulative accuracy (this sensor is hardware-accelerated and drift-resistant on most devices)
  • TYPE_STEP_DETECTOR for real-time event feedback (satisfying immediate UI response when a step registers)

Steps are accumulated into watts using the original Pokéwalker formula, which are then spent on in-game actions.

ROM Data Extraction

Rather than reimplementing Pokémon data by hand, I wrote a Python pipeline using ndspy to extract and decode the Sprite data (decoded from the DS 4bpp tile format to usable bitmaps) directly from the HeartGold/SoulSilver ROM:

The extracted data is bundled into the WearOS app as a set of local resources, so no network connection is needed for any gameplay.

Monster Model Adaptability

The monster data layer is deliberately decoupled from the ROM extraction pipeline. Rather than hardcoding HeartGold/SoulSilver data into the application, the SQLite schema treats monster definitions as generic records.

This separation means the application is not fundamentally tied to any one game's data. Any conforming data source can populate the same schema and be rendered and played with identically.

Custom monster import (coming soon). An import feature is in the design phase that will allow users to define their own monsters via a structured format, supplying custom monster definitions and images. Custom sprites will be resized and converted to the app's internal bitmap format at import time, so hand-drawn or pixel art images can be used directly without manual preprocessing. This opens the door to entirely fan-made rosters alongside or in place of the extracted ROM data.

Peer-to-Peer Trading

The original Pokéwalker used infrared for trading. SmartPokeWalker replaces this with BLE GATT, which is well-supported on WearOS. The trading protocol:

  1. Both devices advertise a custom GATT service UUID
  2. Either player initiates a scan and connects to a peer
  3. Pokémon data is exchanged using custom GATT characteristics
  4. Both sides confirm the trade before committing the write to local storage

With this you can trade your monsters with your friends nearby