Working on tile16 blockset

This commit is contained in:
Justin Scofield
2022-06-20 20:44:52 -04:00
parent 367fe3552f
commit 6dd18c3418
12 changed files with 254 additions and 239 deletions

View File

@@ -40,8 +40,9 @@ static TileInfo GetTilesInfo(ushort tile) {
return TileInfo(tid, p, v, h, o);
}
void Overworld::Load(app::rom::ROM& rom) {
void Overworld::Load(app::rom::ROM& rom, uchar* allGfxPtr) {
rom_ = rom;
allGfx16Ptr = allGfxPtr;
for (int i = 0; i < 0x2B; i++) {
tileLeftEntrance.push_back(constants::overworldEntranceAllowedTilesLeft +
(i * 2));
@@ -54,8 +55,8 @@ void Overworld::Load(app::rom::ROM& rom) {
DecompressAllMapTiles();
// Map Initialization
for (int i = 0; i < 160; i++) {
overworld_maps_.push_back(OverworldMap(rom_, tiles16, (uchar)i));
for (int i = 0; i < constants::NumberOfOWMaps; i++) {
overworld_maps_.push_back(OverworldMap(rom_, tiles16, i));
}
FetchLargeMaps();
LoadOverworldMap();
@@ -64,7 +65,7 @@ void Overworld::Load(app::rom::ROM& rom) {
for (int i = 0; i < 160; i++) {
overworld_maps_[i].BuildMap(mapParent, size, gameState, allmapsTilesLW,
allmapsTilesDW, allmapsTilesSP,
currentOWgfx16Ptr);
currentOWgfx16Ptr, allGfx16Ptr, mapblockset16);
}
isLoaded = true;
@@ -298,9 +299,9 @@ void Overworld::FetchLargeMaps() {
}
void Overworld::LoadOverworldMap() {
overworldMapBitmap = new Bitmap(128, 128, 8, overworldMapPointer);
overworldMapBitmap.Create(128, 128, 8, overworldMapPointer);
char* ptr = overworldMapPointer;
auto ptr = overworldMapPointer;
int pos = 0;
for (int sy = 0; sy < 16; sy++) {
@@ -315,7 +316,8 @@ void Overworld::LoadOverworldMap() {
}
}
// overworld_map_texture = overworldMapBitmap->CreateTexture(rom_.Renderer());
auto renderer = rom_.Renderer();
overworldMapBitmap.CreateTexture(renderer);
}
} // namespace zelda3

View File

@@ -22,13 +22,13 @@ class Overworld {
Overworld() = default;
~Overworld();
void Load(app::rom::ROM& rom);
void Load(app::rom::ROM& rom, uchar* allGfxPtr);
inline auto GetTiles16() const { return tiles16; }
inline auto GetCurrentGfxSetPtr() { return currentOWgfx16Ptr; }
inline auto GetMapBlockset16Ptr() { return mapblockset16; }
char* overworldMapPointer = new char[0x40000];
gfx::Bitmap* overworldMapBitmap;
uchar* overworldMapPointer = new uchar[0x40000];
gfx::Bitmap overworldMapBitmap;
private:
ushort GenerateTile32(int i, int k, int dimension);
@@ -50,6 +50,7 @@ class Overworld {
std::vector<ushort> tileLeftEntrance;
std::vector<ushort> tileRightEntrance;
uchar* allGfx16Ptr = nullptr;
uchar* mapblockset16 = new uchar[1048576];
uchar* currentOWgfx16Ptr = new uchar[(128 * 512) / 2];
SDL_Texture* overworld_map_texture;

View File

@@ -15,7 +15,7 @@ using namespace core;
using namespace gfx;
OverworldMap::OverworldMap(app::rom::ROM& rom,
const std::vector<gfx::Tile16> tiles16, uchar index)
const std::vector<gfx::Tile16> tiles16, int index)
: rom_(rom), index(index), tiles16_(tiles16), parent(index) {
if (index != 0x80) {
if (index <= 150) {
@@ -111,9 +111,12 @@ OverworldMap::OverworldMap(app::rom::ROM& rom,
void OverworldMap::BuildMap(uchar* mapParent, int count, int gameState,
ushort** allmapsTilesLW, ushort** allmapsTilesDW,
ushort** allmapsTilesSP, uchar* currentOWgfx16Ptr) {
ushort** allmapsTilesSP, uchar* currentOWgfx16Ptr,
uchar* allGfxPtr, uchar* mapblockset16) {
tilesUsed = new ushort*[32];
currentOWgfx16Ptr_ = currentOWgfx16Ptr;
allGfx16Ptr_ = allGfxPtr;
mapblockset16_ = mapblockset16;
for (int i = 0; i < 32; i++) tilesUsed[i] = new ushort;
if (largeMap) {
@@ -121,8 +124,20 @@ void OverworldMap::BuildMap(uchar* mapParent, int count, int gameState,
if (parent != index) {
if (!firstLoad) {
gfx = rom_.GetRawData()[constants::mapGfx + parent];
palette = rom_.GetRawData()[constants::overworldMapPalette + parent];
if (index >= 0x80 && index <= 0x8A && index != 0x88) {
gfx = rom_.GetRawData()[core::constants::overworldSpecialGFXGroup +
(parent - 128)];
palette =
rom_.GetRawData()[core::constants::overworldSpecialPALGroup + 1];
} else if (index == 0x88) {
gfx = 81;
palette = 0;
} else {
gfx = rom_.GetRawData()[core::constants::mapGfx + parent];
palette =
rom_.GetRawData()[core::constants::overworldMapPalette + parent];
}
firstLoad = true;
}
}
@@ -155,16 +170,16 @@ void OverworldMap::BuildMap(uchar* mapParent, int count, int gameState,
}
}
void OverworldMap::CopyTile8bpp16(int x, int y, int tile, int* destbmpPtr,
int* sourcebmpPtr) {
void OverworldMap::CopyTile8bpp16(int x, int y, int tile, uchar* destbmpPtr,
uchar* sourcebmpPtr) {
int sourceY = (tile / 8);
int sourceX = (tile) - ((sourceY)*8);
int sourcePtrPos = ((tile - ((tile / 8) * 8)) * 16) +
((tile / 8) * 2048); //(sourceX * 16) + (sourceY * 128);
uchar* sourcePtr = (uchar*)sourcebmpPtr;
auto sourcePtr = sourcebmpPtr;
int destPtrPos = (x + (y * 512));
uchar* destPtr = (uchar*)destbmpPtr;
auto destPtr = destbmpPtr;
for (int ystrip = 0; ystrip < 16; ystrip++) {
for (int xstrip = 0; xstrip < 16; xstrip++) {
@@ -175,10 +190,9 @@ void OverworldMap::CopyTile8bpp16(int x, int y, int tile, int* destbmpPtr,
}
void OverworldMap::CopyTile8bpp16From8(int xP, int yP, int tileID,
int* destbmpPtr, int* sourcebmpPtr) {
auto gfx16Data = (uchar*)destbmpPtr;
auto gfx8Data = currentOWgfx16Ptr;
uchar* destbmpPtr, uchar* sourcebmpPtr) {
auto gfx16Data = destbmpPtr;
auto gfx8Data = currentOWgfx16Ptr_;
int offsets[] = {0, 8, 4096, 4104};
@@ -197,8 +211,8 @@ void OverworldMap::CopyTile8bpp16From8(int xP, int yP, int tileID,
}
void OverworldMap::BuildTiles16Gfx(int count) {
uchar* gfx16Data = (uchar*)mapblockset16;
uchar* gfx8Data = currentOWgfx16Ptr;
auto gfx16Data = mapblockset16_;
auto gfx8Data = currentOWgfx16Ptr_;
int offsets[] = {0, 8, 1024, 1032};
auto yy = 0;
@@ -335,11 +349,7 @@ void OverworldMap::BuildTileset(int gameState) {
}
uchar* currentmapgfx8Data = currentOWgfx16Ptr_;
// (uchar*)GFX.currentOWgfx16Ptr.ToPointer(); // loaded gfx for the current
// // map (empty at this point)
uchar* allgfxData = new uchar[(128 * 7136) / 2];
// (uchar*)GFX.allgfx16Ptr
// .ToPointer(); // all gfx of the game pack of 2048 uchars (4bpp)
uchar* allgfxData = allGfx16Ptr_;
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 2048; j++) {

View File

@@ -16,41 +16,40 @@ using ushort = unsigned short;
class OverworldMap {
public:
uchar parent = 0;
uchar index = 0;
int index = 0;
uchar gfx = 0;
uchar palette = 0;
bool firstLoad = false;
short messageID = 0;
bool largeMap = false;
bool needRefresh = false;
uchar sprgfx[3];
uchar sprpalette[3];
uchar musics[4];
app::rom::ROM rom_;
int* gfxPtr = new int[512 * 512];
int* mapblockset16 = new int[1048576];
uchar* gfxPtr = new uchar[512 * 512];
uchar* mapblockset16_ = nullptr;
uchar* currentOWgfx16Ptr_ = nullptr;
uchar* allGfx16Ptr_ = nullptr;
gfx::Bitmap gfxBitmap;
std::vector<gfx::Tile16> tiles16_;
uchar* staticgfx =
new uchar[16]; // Need to be used to display map and not pre render it!
ushort** tilesUsed;
bool needRefresh = false;
app::rom::ROM rom_;
uchar* currentOWgfx16Ptr = new uchar[(128 * 512) / 2];
std::vector<gfx::Tile16> tiles16_;
OverworldMap(app::rom::ROM& rom, const std::vector<gfx::Tile16> tiles16,
uchar index);
int index);
void BuildMap(uchar* mapParent, int count, int gameState,
ushort** allmapsTilesLW, ushort** allmapsTilesDW,
ushort** allmapsTilesSP, uchar* currentOWgfx16Ptr);
void CopyTile8bpp16(int x, int y, int tile, int* destbmpPtr,
int* sourcebmpPtr);
void CopyTile8bpp16From8(int xP, int yP, int tileID, int* destbmpPtr,
int* sourcebmpPtr);
ushort** allmapsTilesSP, uchar* currentOWgfx16Ptr,
uchar* allGfxPtr, uchar* mapblockset16);
void CopyTile8bpp16(int x, int y, int tile, uchar* destbmpPtr,
uchar* sourcebmpPtr);
void CopyTile8bpp16From8(int xP, int yP, int tileID, uchar* destbmpPtr,
uchar* sourcebmpPtr);
private:
void BuildTiles16Gfx(int count);