Access game data
This guide explains how to read game data (items, creatures, moves, types and more) from your PSDK scripts: the data accessors, the iterators, and the gotchas to know about unknown entries and creature forms.
Where the game data lives
Everything you edit in Pokémon Studio (items, creatures, moves, zones...) is saved as data files under Data/Studio/ in your project. When the game starts in debug mode and the compiled file Data/Studio/psdk.dat is missing, PSDK regenerates it from those files automatically. Your scripts never parse the files themselves: PSDK loads everything in memory and gives you accessor functions.
The accessors are defined in scripts/3 Studio/001 Accessors.rb (in the PSDK sources) as private methods of Object. In practice, this means you can call them from anywhere in your scripts, without any receiver or module prefix.
How to read one entity
Each kind of entity has a data_<kind> function taking the db_symbol of the entry and returning a Studio data object:
| Function | Returns |
|---|---|
data_ability(db_symbol) | Studio::Ability |
data_creature(db_symbol) | Studio::Creature |
data_creature_form(db_symbol, form) | Studio::CreatureForm |
data_dex(db_symbol) | Studio::Dex |
data_group(db_symbol) | Studio::Group |
data_item(db_symbol) | Studio::Item |
data_map_link(db_symbol) | Studio::MapLink |
data_move(db_symbol) | Studio::Move |
data_nature(db_symbol) | Studio::Nature |
data_quest(db_symbol) | Studio::Quest |
data_trainer(db_symbol) | Studio::Trainer |
data_type(db_symbol) | Studio::Type |
data_world_map(db_symbol) | Studio::WorldMap |
data_zone(db_symbol) | Studio::Zone |
data_pokemon also exists as an alias of data_creature.
The db_symbol is the stable identifier you see in Pokémon Studio (e.g. :potion, :pikachu). For example:
item = data_item(:potion)
puts item.price
move = data_move(:thunderbolt)
puts move.power
You can pass an Integer id instead of a db_symbol; PSDK then searches the entry by its id property. Prefer db_symbols: they survive data reorganization, they are readable, and the id lookup scans the whole collection.
An unknown entry does not return nil. The accessors fall back to a placeholder entity whose db_symbol is :__undef__. If you need to detect a missing entry, compare the db_symbol:
item = data_item(:does_not_exist)
item.db_symbol # => :__undef__
Creatures and their forms
Studio::Creature only holds the basics shared by all forms (id, db_symbol, name, species, description) plus a forms array of Studio::CreatureForm, where the actual stats, types, abilities and move set live.
The forms array is not indexed by form number: each entry carries its own form property. To get a specific form, use data_creature_form, which finds the right entry and falls back to the first form when the requested one does not exist:
creature = data_creature(:pikachu)
puts creature.name
form = data_creature_form(:pikachu, 0)
puts form.base_hp
How to iterate through data
Every kind of entity also has an each_data_<kind> function: each_data_ability, each_data_creature, each_data_dex, each_data_group, each_data_item, each_data_map_link, each_data_move, each_data_nature, each_data_quest, each_data_trainer, each_data_type, each_data_world_map and each_data_zone.
They accept a block, or return an Enumerator when called without one. The Enumerator form is the most useful: it gives you the whole Ruby Enumerable toolbox (select, map, count, find...).
# How many types does the game have?
type_count = each_data_type.size
# All the items that cost 200 or less
cheap_items = each_data_item.select { |item| item.price <= 200 }
# Print every creature name
each_data_creature { |creature| puts creature.name }
Going further
The accessors return instances of the Studio data classes. To know which fields each class exposes, read their source in the PSDK scripts under scripts/3 Studio/2 Data/ (one file per entity: 021 Item.rb, 041 Creature.rb, 042 CreatureForm.rb, and so on). The classes are plain data holders with documented attributes, so the source reads like a field list.
If you are maintaining a project started before PSDK .25.14, you may still see GameData::Item[...]-style access in old scripts. The GameData module was replaced by the Studio classes and the accessors above; the data itself is the same, but most flags gained an is_ prefix and most Integer references became Symbols.
Conclusion
- Game data is edited in Pokémon Studio and read from scripts through
data_<kind>(db_symbol)accessors, callable from anywhere. - Prefer db_symbols over Integer ids: stable, readable and faster to look up.
- An unknown entry returns the
:__undef__placeholder entity, nevernil. - Creature data is split:
Studio::Creaturefor the basics,Studio::CreatureForm(viadata_creature_form) for stats, types and moves. Forms are identified by theirformproperty, not by their position in the array. each_data_<kind>iterates over a whole collection and returns anEnumeratorwithout a block, ready forselect,maporcount.- The field list of every
Studioclass is in the PSDK sources underscripts/3 Studio/2 Data/.