90 load(blankNPC, saveFile, index);
102 if(saveFile ==
nullptr)
103 return reset(blankNPC);
130 if(spriteData->
getMove() ==
"Stay")
139 if(spriteData->
getFace() ==
"Down")
141 else if(spriteData->
getFace() ==
"Left")
143 else if(spriteData->
getFace() ==
"None")
145 else if(spriteData->
getFace() ==
"Right")
147 else if(spriteData->
getFace() ==
"Up")
166 else if(spriteData->
getFace() ==
"Boulder Movement Byte 2") {
187 if(spriteDataItem->getItem() ==
"0") {
248 yDisp = it->getByte();
251 xDisp = it->getByte();
254 mapY = it->getByte();
257 mapX = it->getByte();
290 it->offsetTo((2 * index) + 0x27B0);
304 for (
var8 i = 0; i < 17; i++) {
305 it->offsetTo((0x2 * i) + 0x287A);
306 var8 mId = it->getByte();
307 var8 mIndex = it->getByte();
377 it->offsetTo((2 * index) + 0x27B0);
388 for (
var8 i = 0; i < spriteData.size() && i < 16; i++) {
389 auto val = spriteData[i];
392 if(!val->missableIndex || *val->missableIndex < 0)
400 it->setByte(*val->missableIndex);
628 QVector<SpriteData*> sprites;
636 QVector<TmpSpritePos*> tmpPos;
638 for(
auto entry : mapSprites) {
642 if(entry->getSprite() ==
"Boulder")
646 tmp->
x = entry->adjustedX();
647 tmp->y = entry->adjustedY();
652 for(
auto entry : mapSprites) {
662 if(entry->getSprite() ==
"Boulder")
666 tmp->randomize(&tmpPos);
675 if(tmpPos !=
nullptr) {
679 auto rndCoords = tmpPos->at(rndPos);
690 tmpPos->removeAt(rndPos);
717 if(spriteData ==
nullptr)
726 QVector<SpriteData*> sprites;
728 for(
auto entry : spriteSigns) {
int rangeInclusive(const int start, const int end) const
Random integer in the closed interval [start, end].
static Random * inst()
< Convenience 50% coin flip (integer path), readable from QML.
int rangeExclusive(const int start, const int end) const
Random integer in the half-open interval [start, end).
void setByte(var8 val, var16 padding=0)
Write a byte at the cursor; advances.
SaveFileIterator * offsetTo(var16 val)
Move the cursor to an absolute offset. Returns this for chaining.
One loaded save: the raw 32 KB bytes, their expanded object tree, and the tools that move between the...
SaveFileIterator * iterator()
Returns a unique iterator that's setup to iterate over the raw sav file data.
void movementStatusChanged()
void loadSpriteData1(SaveFile *saveFile, var8 index)
Expand the first sprite-data table for index.
int grassPriority
(0x80 in grass, 0x00 otherwise) - Prioritizing grass drawn around sprite
void movementDelayChanged()
void setMissableIndex(int val)
int movementByte
(0xFF not moving, 0xFE random movements, others move without collision)
void load(bool blankNPC=false, SaveFile *saveFile=nullptr, var8 index=0)
std::optional< int > missableIndex
Sprite data that applies to all non-player missable sprites (All sprites that aren't sprite #0 and ha...
void yStepVectorChanged()
int getTrainerClassOrItemID()
std::optional< int > textID
Text id when this sprite is interacted with.
void setTrainerSetID(int val)
void setXStepVector(int val)
void saveSpriteData2(SaveFile *saveFile, var8 index)
Flatten the second sprite-data table.
void saveSpriteData1(SaveFile *saveFile, var8 index)
Flatten the first sprite-data table.
void randomize(QVector< TmpSpritePos * > *tmpPos)
Randomize this sprite (avoiding tmpPos clashes).
void resetMissableIndex()
Clear the optional missableIndex.
SpriteData(bool blankNPC=false, SaveFile *saveFile=nullptr, var8 index=0)
Create a blank sprite or load one from a map.
void setTrainerClassOrItemID(int val)
int movementDelay
Delay until next movement, counts downward and flags movementStatus ready once reached.
void setRangeDirByte(int val)
void movementByteChanged()
std::optional< int > trainerSetID
Trainer data id.
void imageBaseOffsetChanged()
void trainerClassOrItemIDChanged()
void xStepVectorChanged()
void animFrameCounterChanged()
void save(SaveFile *saveFile, var8 index)
void loadSpriteData2(SaveFile *saveFile, var8 index)
Expand the second sprite-data table for index.
int imageBaseOffset
Used to help compute imageIndex based on vram.
int yDisp
Important to set to 0x8 Keep sprites from wandering too far however it's noted that it's bugged to be...
int yPixels
Screen position in pixels aligned to 4 pixels offset from the grid (To appear centered).
void loadSpriteDataNPC(SaveFile *saveFile, var8 index)
Expand the NPC-only sprite data for index.
void reset(bool blankNPC=false)
Blank this sprite (optionally as a blank NPC).
void setYStepVector(int val)
void resetTextID()
Clear the optional textID.
std::optional< int > rangeDirByte
How far a walking sprite can wander, or if still the facing direction A walking sprite having a value...
int mapY
These are very important to set, just usual coordinates for map placement +4 Coordinate 0,...
void walkAnimationCounterChanged()
static QVector< SpriteData * > setToAll(QVector< MapDBEntrySprite * > spriteSigns)
Build sprites from a map's sprite list.
var8 yStepVector
These actually don't really matter and can be zero I'm not sure if the game even uses these values in...
static void saveMissables(SaveFile *saveFile, QVector< SpriteData * > spriteData)
void setTo(MapDBEntrySprite *spriteData)
Copy values from a map-defined sprite.
static QVector< SpriteData * > randomizeAll(QVector< MapDBEntrySprite * > mapSprites)
Randomize a whole map's sprites.
void saveSpriteDataNPC(SaveFile *saveFile, var8 index)
Flatten the NPC-only sprite data.
void resetTrainerClassOrItemID()
Clear the optional trainerClassOrItemID.
protected::void pictureIDChanged()
int movementStatus
(0: uninitialized, 1: ready, 2: delayed, 3: moving) Advised to use ready
void missableIndexChanged()
std::optional< int > trainerClassOrItemID
If this is an item sprite, the item id, otherwise the trainer class.
void resetTrainerSetID()
Clear the optional trainerSetID.
int animFrameCounter
Animation frame counter.
int walkAnimationCounter
Tracks movement & wandering, sprites are given 0x10 and it's decremented.
int faceDir
(0: down, 4: up, 8: left, $c: right)
SpriteDBEntry * toSprite()
Resolve this sprite to its DB entry.
int intraAnimationFrameCounter
Counter that helps delay between animation frames so things aren't so instant and fast.
void grassPriorityChanged()
int pictureID
Sprite data that applies to all sprites.
void intraAnimationFrameCounterChanged()
void resetRangeDirByte()
Clear the optional rangeDirByte.
void rangeDirByteChanged()
int imageIndex
Basically, in the sprite sheet strip, which "pane" or "tile" is it at 0xFF if not on the screen.
void trainerSetIDChanged()
void checkMissable(SaveFile *saveFile, var8 index)
Resolve whether this sprite is a missable.
static SpritesDB * inst()
< Number of sprites.
SpriteDBEntry * getIndAt(const QString &key) const
Sprite by name key (for QML).
const QVector< SpriteDBEntry * > getStore() const
All sprites.
var8e var8
Everyday 8-bit alias. Exact (not "fastest") to dodge the pointer-width bug noted above.
A map sprite that is a pick-up item (type ITEM).
A map sprite that is a static, battleable Pokemon (type POKEMON).
A map sprite that is a battleable trainer (type TRAINER).
A map's sprite definition – base class for the four sprite kinds.
virtual SpriteType type() const
The sprite kind (overridden by subclasses).
const QString getMove() const
const QString getFace() const
SpriteDBEntry * getToSprite() const
One sprite definition: its name/picture-id and the maps that use it.
static var8 random()
A random valid facing.
static var8 random()
A random grass value.
static var8 random()
A random mobility value.
@ Ready
Ready (advised value).
static var8 random()
A random movement pattern.