Pokered Save Editor 2
Pokemon Red & Blue save file editor - Qt 6 C++/QML
Loading...
Searching...
No Matches
SpriteData Class Reference

One on-map sprite/NPC – the most byte-level object in the area. More...

#include <spritedata.h>

Inheritance diagram for SpriteData:
Collaboration diagram for SpriteData:

Public Member Functions

 SpriteData (bool blankNPC=false, SaveFile *saveFile=nullptr, var8 index=0)
 Create a blank sprite or load one from a map.
 SpriteData (MapDBEntrySprite *entry)
 Create a sprite from map data.
virtual ~SpriteData ()
void load (bool blankNPC=false, SaveFile *saveFile=nullptr, var8 index=0)
void load (MapDBEntrySprite *spriteData)
 Loads preset from map data, useful if your not already in the map but want to re-create the sprites as they should be on said map.
void loadSpriteData1 (SaveFile *saveFile, var8 index)
 Expand the first sprite-data table for index.
void loadSpriteData2 (SaveFile *saveFile, var8 index)
 Expand the second sprite-data table for index.
void loadSpriteDataNPC (SaveFile *saveFile, var8 index)
 Expand the NPC-only sprite data for index.
void checkMissable (SaveFile *saveFile, var8 index)
 Resolve whether this sprite is a missable.
void save (SaveFile *saveFile, var8 index)
void saveSpriteData1 (SaveFile *saveFile, var8 index)
 Flatten the first sprite-data table.
void saveSpriteData2 (SaveFile *saveFile, var8 index)
 Flatten the second sprite-data table.
void saveSpriteDataNPC (SaveFile *saveFile, var8 index)
 Flatten the NPC-only sprite data.
SpriteDBEntrytoSprite ()
 Resolve this sprite to its DB entry.
int getRangeDirByte ()
void setRangeDirByte (int val)
void resetRangeDirByte ()
 Clear the optional rangeDirByte.
int getTextID ()
void setTextID (int val)
void resetTextID ()
 Clear the optional textID.
int getTrainerClassOrItemID ()
void setTrainerClassOrItemID (int val)
void resetTrainerClassOrItemID ()
 Clear the optional trainerClassOrItemID.
int getTrainerSetID ()
void setTrainerSetID (int val)
void resetTrainerSetID ()
 Clear the optional trainerSetID.
int getMissableIndex ()
void setMissableIndex (int val)
void resetMissableIndex ()
 Clear the optional missableIndex.
int getYStepVector ()
void setYStepVector (int val)
int getXStepVector ()
void setXStepVector (int val)
protected::void pictureIDChanged ()
void movementStatusChanged ()
void imageIndexChanged ()
void faceDirChanged ()
void yDispChanged ()
void xDispChanged ()
void mapYChanged ()
void mapXChanged ()
void movementByteChanged ()
void grassPriorityChanged ()
void yStepVectorChanged ()
void xStepVectorChanged ()
void yPixelsChanged ()
void xPixelsChanged ()
void intraAnimationFrameCounterChanged ()
void animFrameCounterChanged ()
void walkAnimationCounterChanged ()
void movementDelayChanged ()
void imageBaseOffsetChanged ()
void rangeDirByteChanged ()
void textIDChanged ()
void trainerClassOrItemIDChanged ()
void trainerSetIDChanged ()
void missableIndexChanged ()
void reset (bool blankNPC=false)
 Blank this sprite (optionally as a blank NPC).
void randomize (QVector< TmpSpritePos * > *tmpPos)
 Randomize this sprite (avoiding tmpPos clashes).
void setTo (MapDBEntrySprite *spriteData)
 Copy values from a map-defined sprite.

Static Public Member Functions

static void saveMissables (SaveFile *saveFile, QVector< SpriteData * > spriteData)
static QVector< SpriteData * > randomizeAll (QVector< MapDBEntrySprite * > mapSprites)
 Randomize a whole map's sprites.
static QVector< SpriteData * > setToAll (QVector< MapDBEntrySprite * > spriteSigns)
 Build sprites from a map's sprite list.

Public Attributes

int pictureID
 Sprite data that applies to all sprites.
int movementStatus
 (0: uninitialized, 1: ready, 2: delayed, 3: moving) Advised to use ready
int imageIndex
 Basically, in the sprite sheet strip, which "pane" or "tile" is it at 0xFF if not on the screen.
int faceDir
 (0: down, 4: up, 8: left, $c: right)
int yDisp
 Important to set to 0x8 Keep sprites from wandering too far however it's noted that it's bugged to begin with.
int xDisp
int mapY
 These are very important to set, just usual coordinates for map placement +4 Coordinate 0,0 would be 4,4 Coordinate 5,5 would be 9,9 etc... Values less than 4 don't appear on the map.
int mapX
int movementByte
 (0xFF not moving, 0xFE random movements, others move without collision)
int grassPriority
 (0x80 in grass, 0x00 otherwise) - Prioritizing grass drawn around sprite
var8 yStepVector
 These actually don't really matter and can be zero I'm not sure if the game even uses these values in the sav file when loading.
var8 xStepVector
int yPixels
 Screen position in pixels aligned to 4 pixels offset from the grid (To appear centered).
int xPixels
int intraAnimationFrameCounter
 Counter that helps delay between animation frames so things aren't so instant and fast.
int animFrameCounter
 Animation frame counter.
int walkAnimationCounter
 Tracks movement & wandering, sprites are given 0x10 and it's decremented.
int movementDelay
 Delay until next movement, counts downward and flags movementStatus ready once reached.
int imageBaseOffset
 Used to help compute imageIndex based on vram.
std::optional< int > rangeDirByte
 How far a walking sprite can wander, or if still the facing direction A walking sprite having a value of 0 faces all directions There are certain special values that give special movement Notably 1-2 and D0-D3.
std::optional< int > textID
 Text id when this sprite is interacted with.
std::optional< int > trainerClassOrItemID
 If this is an item sprite, the item id, otherwise the trainer class.
std::optional< int > trainerSetID
 Trainer data id.
std::optional< int > missableIndex
 Sprite data that applies to all non-player missable sprites (All sprites that aren't sprite #0 and have an associated index in the global missable list which determine if it's rendered or not).

Detailed Description

One on-map sprite/NPC – the most byte-level object in the area.

Mirrors the game's per-sprite memory: picture, movement state, facing, map coordinates, animation counters, and (for non-player, non-missable, missable sprites in turn) a set of std::optional fields that only some sprites carry. Because the game splits sprite memory across several tables, load()/save() are broken into ...Data1 / ...Data2 / ...NPC parts (and a missable check).

The optional fields (rangeDirByte, textID, trainerClassOrItemID, trainerSetID, missableIndex) are surfaced to QML through getter/setter/reset property triples so QML – which can't speak std::optional or var8 – can read, write, and clear them. The field comments below are the authoritative description of each byte.

See also
SpriteDBEntry, MapDBEntrySprite, AreaSprites (the container).

Definition at line 138 of file spritedata.h.

Constructor & Destructor Documentation

◆ SpriteData() [1/2]

SpriteData::SpriteData ( bool blankNPC = false,
SaveFile * saveFile = nullptr,
var8 index = 0 )

Create a blank sprite or load one from a map.

Definition at line 88 of file spritedata.cpp.

References load().

Referenced by randomizeAll(), and setToAll().

◆ SpriteData() [2/2]

SpriteData::SpriteData ( MapDBEntrySprite * entry)

Create a sprite from map data.

Definition at line 93 of file spritedata.cpp.

References load().

◆ ~SpriteData()

SpriteData::~SpriteData ( )
virtual

Definition at line 98 of file spritedata.cpp.

Member Function Documentation

◆ animFrameCounterChanged()

void SpriteData::animFrameCounterChanged ( )

Referenced by loadSpriteData1(), and reset().

◆ checkMissable()

void SpriteData::checkMissable ( SaveFile * saveFile,
var8 index )

Resolve whether this sprite is a missable.

Definition at line 300 of file spritedata.cpp.

References SaveFile::iterator(), missableIndex, and missableIndexChanged().

Referenced by load().

◆ faceDirChanged()

void SpriteData::faceDirChanged ( )

◆ getMissableIndex()

int SpriteData::getMissableIndex ( )
See also
missableIndex property.

Definition at line 487 of file spritedata.cpp.

References missableIndex.

◆ getRangeDirByte()

int SpriteData::getRangeDirByte ( )
See also
rangeDirByte property.

Definition at line 407 of file spritedata.cpp.

References rangeDirByte.

◆ getTextID()

int SpriteData::getTextID ( )
See also
textID property.

Definition at line 427 of file spritedata.cpp.

References textID.

◆ getTrainerClassOrItemID()

int SpriteData::getTrainerClassOrItemID ( )
See also
trainerClassOrItemID property.

Definition at line 447 of file spritedata.cpp.

References trainerClassOrItemID.

◆ getTrainerSetID()

int SpriteData::getTrainerSetID ( )
See also
trainerSetID property.

Definition at line 467 of file spritedata.cpp.

References trainerSetID.

◆ getXStepVector()

int SpriteData::getXStepVector ( )
See also
xStepVector property.

Definition at line 518 of file spritedata.cpp.

References xStepVector.

◆ getYStepVector()

int SpriteData::getYStepVector ( )
See also
yStepVector property.

Definition at line 507 of file spritedata.cpp.

References yStepVector.

◆ grassPriorityChanged()

void SpriteData::grassPriorityChanged ( )

Referenced by loadSpriteData2(), randomize(), and reset().

◆ imageBaseOffsetChanged()

void SpriteData::imageBaseOffsetChanged ( )

Referenced by loadSpriteData2(), and reset().

◆ imageIndexChanged()

void SpriteData::imageIndexChanged ( )

Referenced by loadSpriteData1(), and reset().

◆ intraAnimationFrameCounterChanged()

void SpriteData::intraAnimationFrameCounterChanged ( )

Referenced by loadSpriteData1(), and reset().

◆ load() [1/2]

void SpriteData::load ( bool blankNPC = false,
SaveFile * saveFile = nullptr,
var8 index = 0 )

◆ load() [2/2]

◆ loadSpriteData1()

◆ loadSpriteData2()

◆ loadSpriteDataNPC()

void SpriteData::loadSpriteDataNPC ( SaveFile * saveFile,
var8 index )

◆ mapXChanged()

void SpriteData::mapXChanged ( )

◆ mapYChanged()

void SpriteData::mapYChanged ( )

◆ missableIndexChanged()

void SpriteData::missableIndexChanged ( )

◆ movementByteChanged()

void SpriteData::movementByteChanged ( )

◆ movementDelayChanged()

void SpriteData::movementDelayChanged ( )

Referenced by loadSpriteData2(), and reset().

◆ movementStatusChanged()

void SpriteData::movementStatusChanged ( )

Referenced by loadSpriteData1(), and reset().

◆ pictureIDChanged()

protected::void SpriteData::pictureIDChanged ( )

◆ randomize()

◆ randomizeAll()

QVector< SpriteData * > SpriteData::randomizeAll ( QVector< MapDBEntrySprite * > mapSprites)
static

Randomize a whole map's sprites.

Definition at line 625 of file spritedata.cpp.

References SpriteData(), and TmpSpritePos::x.

Referenced by missableIndexChanged(), and AreaSprites::randomize().

◆ rangeDirByteChanged()

void SpriteData::rangeDirByteChanged ( )

◆ reset()

◆ resetMissableIndex()

void SpriteData::resetMissableIndex ( )

Clear the optional missableIndex.

Definition at line 501 of file spritedata.cpp.

References missableIndex, and missableIndexChanged().

◆ resetRangeDirByte()

void SpriteData::resetRangeDirByte ( )

Clear the optional rangeDirByte.

Definition at line 421 of file spritedata.cpp.

References rangeDirByte, and rangeDirByteChanged().

◆ resetTextID()

void SpriteData::resetTextID ( )

Clear the optional textID.

Definition at line 441 of file spritedata.cpp.

References textID, and textIDChanged().

◆ resetTrainerClassOrItemID()

void SpriteData::resetTrainerClassOrItemID ( )

Clear the optional trainerClassOrItemID.

Definition at line 461 of file spritedata.cpp.

References trainerClassOrItemID, and trainerClassOrItemIDChanged().

◆ resetTrainerSetID()

void SpriteData::resetTrainerSetID ( )

Clear the optional trainerSetID.

Definition at line 481 of file spritedata.cpp.

References trainerSetID, and trainerSetIDChanged().

◆ save()

void SpriteData::save ( SaveFile * saveFile,
var8 index )

Definition at line 325 of file spritedata.cpp.

References saveSpriteData1(), saveSpriteData2(), and saveSpriteDataNPC().

◆ saveMissables()

void SpriteData::saveMissables ( SaveFile * saveFile,
QVector< SpriteData * > spriteData )
static

◆ saveSpriteData1()

void SpriteData::saveSpriteData1 ( SaveFile * saveFile,
var8 index )

◆ saveSpriteData2()

void SpriteData::saveSpriteData2 ( SaveFile * saveFile,
var8 index )

◆ saveSpriteDataNPC()

void SpriteData::saveSpriteDataNPC ( SaveFile * saveFile,
var8 index )

Flatten the NPC-only sprite data.

Definition at line 369 of file spritedata.cpp.

References SaveFile::iterator(), SaveFileIterator::offsetTo(), rangeDirByte, SaveFileIterator::setByte(), textID, trainerClassOrItemID, and trainerSetID.

Referenced by save().

◆ setMissableIndex()

void SpriteData::setMissableIndex ( int val)
See also
missableIndex property.

Definition at line 495 of file spritedata.cpp.

References missableIndex, and missableIndexChanged().

◆ setRangeDirByte()

void SpriteData::setRangeDirByte ( int val)
See also
rangeDirByte property.

Definition at line 415 of file spritedata.cpp.

References rangeDirByte, and rangeDirByteChanged().

◆ setTextID()

void SpriteData::setTextID ( int val)
See also
textID property.

Definition at line 435 of file spritedata.cpp.

References textID, and textIDChanged().

◆ setTo()

void SpriteData::setTo ( MapDBEntrySprite * spriteData)

Copy values from a map-defined sprite.

Definition at line 713 of file spritedata.cpp.

References load(), and reset().

Referenced by missableIndexChanged().

◆ setToAll()

QVector< SpriteData * > SpriteData::setToAll ( QVector< MapDBEntrySprite * > spriteSigns)
static

Build sprites from a map's sprite list.

Definition at line 723 of file spritedata.cpp.

References SpriteData().

Referenced by missableIndexChanged(), and AreaSprites::setTo().

◆ setTrainerClassOrItemID()

void SpriteData::setTrainerClassOrItemID ( int val)
See also
trainerClassOrItemID property.

Definition at line 455 of file spritedata.cpp.

References trainerClassOrItemID, and trainerClassOrItemIDChanged().

◆ setTrainerSetID()

void SpriteData::setTrainerSetID ( int val)
See also
trainerSetID property.

Definition at line 475 of file spritedata.cpp.

References trainerSetID, and trainerSetIDChanged().

◆ setXStepVector()

void SpriteData::setXStepVector ( int val)
See also
xStepVector property.

Definition at line 523 of file spritedata.cpp.

References xStepVector, and xStepVectorChanged().

◆ setYStepVector()

void SpriteData::setYStepVector ( int val)
See also
yStepVector property.

Definition at line 512 of file spritedata.cpp.

References yStepVector, and yStepVectorChanged().

◆ textIDChanged()

void SpriteData::textIDChanged ( )

◆ toSprite()

SpriteDBEntry * SpriteData::toSprite ( )

Resolve this sprite to its DB entry.

Definition at line 739 of file spritedata.cpp.

References SpritesDB::getIndAt(), SpritesDB::inst(), and pictureID.

◆ trainerClassOrItemIDChanged()

void SpriteData::trainerClassOrItemIDChanged ( )

◆ trainerSetIDChanged()

void SpriteData::trainerSetIDChanged ( )

◆ walkAnimationCounterChanged()

void SpriteData::walkAnimationCounterChanged ( )

Referenced by loadSpriteData2(), and reset().

◆ xDispChanged()

void SpriteData::xDispChanged ( )

Referenced by loadSpriteData2(), and reset().

◆ xPixelsChanged()

void SpriteData::xPixelsChanged ( )

Referenced by loadSpriteData1(), and reset().

◆ xStepVectorChanged()

void SpriteData::xStepVectorChanged ( )

◆ yDispChanged()

void SpriteData::yDispChanged ( )

Referenced by loadSpriteData2(), and reset().

◆ yPixelsChanged()

void SpriteData::yPixelsChanged ( )

Referenced by loadSpriteData1(), and reset().

◆ yStepVectorChanged()

void SpriteData::yStepVectorChanged ( )

Member Data Documentation

◆ animFrameCounter

int SpriteData::animFrameCounter

Animation frame counter.

Definition at line 334 of file spritedata.h.

Referenced by loadSpriteData1(), reset(), and saveSpriteData1().

◆ faceDir

int SpriteData::faceDir

(0: down, 4: up, 8: left, $c: right)

Definition at line 288 of file spritedata.h.

Referenced by load(), loadSpriteData1(), randomize(), reset(), and saveSpriteData1().

◆ grassPriority

int SpriteData::grassPriority

(0x80 in grass, 0x00 otherwise) - Prioritizing grass drawn around sprite

Definition at line 309 of file spritedata.h.

Referenced by loadSpriteData2(), randomize(), reset(), and saveSpriteData2().

◆ imageBaseOffset

int SpriteData::imageBaseOffset

Used to help compute imageIndex based on vram.

Definition at line 345 of file spritedata.h.

Referenced by loadSpriteData2(), reset(), and saveSpriteData2().

◆ imageIndex

int SpriteData::imageIndex

Basically, in the sprite sheet strip, which "pane" or "tile" is it at 0xFF if not on the screen.

Advised to use 0xFF

Definition at line 285 of file spritedata.h.

Referenced by loadSpriteData1(), reset(), and saveSpriteData1().

◆ intraAnimationFrameCounter

int SpriteData::intraAnimationFrameCounter

Counter that helps delay between animation frames so things aren't so instant and fast.

Definition at line 331 of file spritedata.h.

Referenced by loadSpriteData1(), reset(), and saveSpriteData1().

◆ mapX

int SpriteData::mapX

Definition at line 303 of file spritedata.h.

Referenced by load(), loadSpriteData2(), randomize(), reset(), and saveSpriteData2().

◆ mapY

int SpriteData::mapY

These are very important to set, just usual coordinates for map placement +4 Coordinate 0,0 would be 4,4 Coordinate 5,5 would be 9,9 etc... Values less than 4 don't appear on the map.

Definition at line 302 of file spritedata.h.

Referenced by load(), loadSpriteData2(), randomize(), reset(), and saveSpriteData2().

◆ missableIndex

std::optional<int> SpriteData::missableIndex

Sprite data that applies to all non-player missable sprites (All sprites that aren't sprite #0 and have an associated index in the global missable list which determine if it's rendered or not).

If this is not null, then this sprite is a missable and it's appearance is determined by the flag in the global missable index this points to

Definition at line 377 of file spritedata.h.

Referenced by checkMissable(), getMissableIndex(), load(), loadSpriteDataNPC(), reset(), resetMissableIndex(), and setMissableIndex().

◆ movementByte

int SpriteData::movementByte

(0xFF not moving, 0xFE random movements, others move without collision)

Definition at line 306 of file spritedata.h.

Referenced by load(), loadSpriteData2(), randomize(), reset(), and saveSpriteData2().

◆ movementDelay

int SpriteData::movementDelay

Delay until next movement, counts downward and flags movementStatus ready once reached.

Definition at line 342 of file spritedata.h.

Referenced by loadSpriteData2(), reset(), and saveSpriteData2().

◆ movementStatus

int SpriteData::movementStatus

(0: uninitialized, 1: ready, 2: delayed, 3: moving) Advised to use ready

Definition at line 281 of file spritedata.h.

Referenced by loadSpriteData1(), reset(), and saveSpriteData1().

◆ pictureID

int SpriteData::pictureID

Sprite data that applies to all sprites.

Actual sprite image shown

Definition at line 277 of file spritedata.h.

Referenced by load(), loadSpriteData1(), randomize(), reset(), saveSpriteData1(), and toSprite().

◆ rangeDirByte

std::optional<int> SpriteData::rangeDirByte

How far a walking sprite can wander, or if still the facing direction A walking sprite having a value of 0 faces all directions There are certain special values that give special movement Notably 1-2 and D0-D3.

Definition at line 358 of file spritedata.h.

Referenced by getRangeDirByte(), load(), loadSpriteDataNPC(), reset(), resetRangeDirByte(), saveSpriteDataNPC(), and setRangeDirByte().

◆ textID

std::optional<int> SpriteData::textID

Text id when this sprite is interacted with.

Definition at line 361 of file spritedata.h.

Referenced by getTextID(), load(), loadSpriteDataNPC(), reset(), resetTextID(), saveSpriteDataNPC(), and setTextID().

◆ trainerClassOrItemID

std::optional<int> SpriteData::trainerClassOrItemID

If this is an item sprite, the item id, otherwise the trainer class.

Definition at line 364 of file spritedata.h.

Referenced by getTrainerClassOrItemID(), load(), loadSpriteDataNPC(), reset(), resetTrainerClassOrItemID(), saveSpriteDataNPC(), and setTrainerClassOrItemID().

◆ trainerSetID

std::optional<int> SpriteData::trainerSetID

Trainer data id.

Definition at line 367 of file spritedata.h.

Referenced by getTrainerSetID(), load(), loadSpriteDataNPC(), reset(), resetTrainerSetID(), saveSpriteDataNPC(), and setTrainerSetID().

◆ walkAnimationCounter

int SpriteData::walkAnimationCounter

Tracks movement & wandering, sprites are given 0x10 and it's decremented.

Definition at line 338 of file spritedata.h.

Referenced by loadSpriteData2(), reset(), and saveSpriteData2().

◆ xDisp

int SpriteData::xDisp

Definition at line 294 of file spritedata.h.

Referenced by loadSpriteData2(), reset(), and saveSpriteData2().

◆ xPixels

int SpriteData::xPixels

Definition at line 327 of file spritedata.h.

Referenced by loadSpriteData1(), reset(), and saveSpriteData1().

◆ xStepVector

var8 SpriteData::xStepVector

Definition at line 322 of file spritedata.h.

Referenced by getXStepVector(), loadSpriteData1(), reset(), saveSpriteData1(), and setXStepVector().

◆ yDisp

int SpriteData::yDisp

Important to set to 0x8 Keep sprites from wandering too far however it's noted that it's bugged to begin with.

Both are init to 0x8

Definition at line 293 of file spritedata.h.

Referenced by loadSpriteData2(), reset(), and saveSpriteData2().

◆ yPixels

int SpriteData::yPixels

Screen position in pixels aligned to 4 pixels offset from the grid (To appear centered).

Definition at line 326 of file spritedata.h.

Referenced by loadSpriteData1(), reset(), and saveSpriteData1().

◆ yStepVector

var8 SpriteData::yStepVector

These actually don't really matter and can be zero I'm not sure if the game even uses these values in the sav file when loading.

Regardless things work just fine if they're all zero When the sprite moves, exactly how far or how much is that? (-1, 0 or 1) These need to be kept at var8 since they deal with reading and writing unsigned numbers that can intentionally underflow

Definition at line 321 of file spritedata.h.

Referenced by getYStepVector(), loadSpriteData1(), reset(), saveSpriteData1(), and setYStepVector().


The documentation for this class was generated from the following files:
  • projects/savefile/src/pse-savefile/expanded/fragments/spritedata.h
  • projects/savefile/src/pse-savefile/expanded/fragments/spritedata.cpp