feat: Add custom overworld data loading and tileset setup to OverworldMap constructor
This commit is contained in:
@@ -6,7 +6,6 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
#include "app/editor/utils/gfx_context.h"
|
#include "app/editor/utils/gfx_context.h"
|
||||||
#include "app/gfx/bitmap.h"
|
#include "app/gfx/bitmap.h"
|
||||||
#include "app/gfx/snes_tile.h"
|
#include "app/gfx/snes_tile.h"
|
||||||
@@ -21,8 +20,19 @@ namespace overworld {
|
|||||||
|
|
||||||
OverworldMap::OverworldMap(int index, Rom& rom,
|
OverworldMap::OverworldMap(int index, Rom& rom,
|
||||||
std::vector<gfx::Tile16>& tiles16)
|
std::vector<gfx::Tile16>& tiles16)
|
||||||
: parent_(index), index_(index), rom_(rom), tiles16_(tiles16) {
|
: index_(index), parent_(index), rom_(rom), tiles16_(tiles16) {
|
||||||
LoadAreaInfo();
|
LoadAreaInfo();
|
||||||
|
|
||||||
|
if (flags()->kLoadCustomOverworld) {
|
||||||
|
// If the custom overworld ASM has NOT already been applied, manually set
|
||||||
|
// the vanilla values.
|
||||||
|
uint8_t asm_version = rom_[OverworldCustomASMHasBeenApplied];
|
||||||
|
if (asm_version == 0x00) {
|
||||||
|
LoadCustomOverworldData();
|
||||||
|
} else {
|
||||||
|
SetupCustomTileset(asm_version);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
absl::Status OverworldMap::BuildMap(int count, int game_state, int world,
|
absl::Status OverworldMap::BuildMap(int count, int game_state, int world,
|
||||||
@@ -143,6 +153,236 @@ void OverworldMap::LoadAreaInfo() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OverworldMap::LoadCustomOverworldData() {
|
||||||
|
// Set the main palette values.
|
||||||
|
if (index_ < 0x40) {
|
||||||
|
area_palette_ = 0;
|
||||||
|
} else if (index_ >= 0x40 && index_ < 0x80) {
|
||||||
|
area_palette_ = 1;
|
||||||
|
} else if (index_ >= 0x80 && index_ < 0xA0) {
|
||||||
|
area_palette_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index_ == 0x03 || index_ == 0x05 || index_ == 0x07) {
|
||||||
|
area_palette_ = 2;
|
||||||
|
} else if (index_ == 0x43 || index_ == 0x45 || index_ == 0x47) {
|
||||||
|
area_palette_ = 3;
|
||||||
|
} else if (index_ == 0x88) {
|
||||||
|
area_palette_ = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the mosaic values.
|
||||||
|
mosaic_ = index_ == 0x00 || index_ == 0x40 || index_ == 0x80 ||
|
||||||
|
index_ == 0x81 || index_ == 0x88;
|
||||||
|
|
||||||
|
int indexWorld = 0x20;
|
||||||
|
|
||||||
|
if (parent_ >= 0x40 && parent_ < 0x80) // DW
|
||||||
|
{
|
||||||
|
indexWorld = 0x21;
|
||||||
|
} else if (parent_ == 0x88) // Triforce room
|
||||||
|
{
|
||||||
|
indexWorld = 0x24;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto overworld_gfx_groups2 =
|
||||||
|
rom_.version_constants().kOverworldGfxGroups2;
|
||||||
|
|
||||||
|
// Main Blocksets
|
||||||
|
custom_tileset_.TileGFX0 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 0];
|
||||||
|
custom_tileset_.TileGFX1 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 1];
|
||||||
|
custom_tileset_.TileGFX2 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 2];
|
||||||
|
custom_tileset_.TileGFX3 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 3];
|
||||||
|
custom_tileset_.TileGFX4 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 4];
|
||||||
|
custom_tileset_.TileGFX5 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 5];
|
||||||
|
custom_tileset_.TileGFX6 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 6];
|
||||||
|
custom_tileset_.TileGFX7 =
|
||||||
|
(uint8_t)rom_[overworld_gfx_groups2 + (indexWorld * 8) + 7];
|
||||||
|
|
||||||
|
const auto overworldgfxGroups = rom_.version_constants().kOverworldGfxGroups1;
|
||||||
|
|
||||||
|
// Replace the variable tiles with the variable ones.
|
||||||
|
uint8_t temp = rom_[overworldgfxGroups + (area_graphics_ * 4)];
|
||||||
|
if (temp != 0) {
|
||||||
|
custom_tileset_.TileGFX3 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX3 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = rom_[overworldgfxGroups + (area_graphics_ * 4) + 1];
|
||||||
|
if (temp != 0) {
|
||||||
|
custom_tileset_.TileGFX4 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX4 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = rom_[overworldgfxGroups + (area_graphics_ * 4) + 2];
|
||||||
|
if (temp != 0) {
|
||||||
|
custom_tileset_.TileGFX5 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX5 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = rom_[overworldgfxGroups + (area_graphics_ * 4) + 3];
|
||||||
|
if (temp != 0) {
|
||||||
|
custom_tileset_.TileGFX6 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX6 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the animated GFX values.
|
||||||
|
if (index_ == 0x03 || index_ == 0x05 || index_ == 0x07 || index_ == 0x43 ||
|
||||||
|
index_ == 0x45 || index_ == 0x47) {
|
||||||
|
animated_gfx_ = 0x59;
|
||||||
|
} else {
|
||||||
|
animated_gfx_ = 0x5B;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the subscreen overlay values.
|
||||||
|
subscreen_overlay_ = 0x00FF;
|
||||||
|
|
||||||
|
if (index_ == 0x00 ||
|
||||||
|
index_ == 0x40) // Add fog 2 to the lost woods and skull woods.
|
||||||
|
{
|
||||||
|
subscreen_overlay_ = 0x009D;
|
||||||
|
} else if (index_ == 0x03 || index_ == 0x05 ||
|
||||||
|
index_ == 0x07) // Add the sky BG to LW death mountain.
|
||||||
|
{
|
||||||
|
subscreen_overlay_ = 0x0095;
|
||||||
|
} else if (index_ == 0x43 || index_ == 0x45 ||
|
||||||
|
index_ == 0x47) // Add the lava to DW death mountain.
|
||||||
|
{
|
||||||
|
subscreen_overlay_ = 0x009C;
|
||||||
|
} else if (index_ == 0x5B) // TODO: Might need this one too "index == 0x1B"
|
||||||
|
// but for now I don't think so.
|
||||||
|
{
|
||||||
|
subscreen_overlay_ = 0x0096;
|
||||||
|
} else if (index_ == 0x80) // Add fog 1 to the master sword area.
|
||||||
|
{
|
||||||
|
subscreen_overlay_ = 0x0097;
|
||||||
|
} else if (index_ ==
|
||||||
|
0x88) // Add the triforce room curtains to the triforce room.
|
||||||
|
{
|
||||||
|
subscreen_overlay_ = 0x0093;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OverworldMap::SetupCustomTileset(uint8_t asm_version) {
|
||||||
|
area_palette_ = rom_[OverworldCustomMainPaletteArray + index_];
|
||||||
|
mosaic_ = rom_[OverworldCustomMosaicArray + index_] != 0x00;
|
||||||
|
|
||||||
|
// This is just to load the GFX groups for ROMs that have an older version
|
||||||
|
// of the Overworld ASM already applied.
|
||||||
|
if (asm_version >= 0x01 && asm_version != 0xFF) {
|
||||||
|
custom_tileset_.TileGFX0 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 0];
|
||||||
|
custom_tileset_.TileGFX1 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 1];
|
||||||
|
custom_tileset_.TileGFX2 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 2];
|
||||||
|
custom_tileset_.TileGFX3 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 3];
|
||||||
|
custom_tileset_.TileGFX4 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 4];
|
||||||
|
custom_tileset_.TileGFX5 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 5];
|
||||||
|
custom_tileset_.TileGFX6 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 6];
|
||||||
|
custom_tileset_.TileGFX7 =
|
||||||
|
rom_[OverworldCustomTileGFXGroupArray + (index_ * 8) + 7];
|
||||||
|
|
||||||
|
animated_gfx_ = rom_[OverworldCustomAnimatedGFXArray + index_];
|
||||||
|
} else {
|
||||||
|
int indexWorld = 0x20;
|
||||||
|
|
||||||
|
if (parent_ >= 0x40 && parent_ < 0x80) // DW
|
||||||
|
{
|
||||||
|
indexWorld = 0x21;
|
||||||
|
} else if (parent_ == 0x88) // Triforce room
|
||||||
|
{
|
||||||
|
indexWorld = 0x24;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main Blocksets
|
||||||
|
custom_tileset_.TileGFX0 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 0];
|
||||||
|
custom_tileset_.TileGFX1 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 1];
|
||||||
|
custom_tileset_.TileGFX2 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 2];
|
||||||
|
custom_tileset_.TileGFX3 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 3];
|
||||||
|
custom_tileset_.TileGFX4 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 4];
|
||||||
|
custom_tileset_.TileGFX5 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 5];
|
||||||
|
custom_tileset_.TileGFX6 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 6];
|
||||||
|
custom_tileset_.TileGFX7 =
|
||||||
|
(uint8_t)rom_[rom_.version_constants().kOverworldGfxGroups2 +
|
||||||
|
(indexWorld * 8) + 7];
|
||||||
|
|
||||||
|
const auto overworldgfxGroups =
|
||||||
|
rom_.version_constants().kOverworldGfxGroups1;
|
||||||
|
|
||||||
|
// Replace the variable tiles with the variable ones.
|
||||||
|
// If the variable is 00 set it to 0xFF which is the new "don't load
|
||||||
|
// anything" value.
|
||||||
|
uint8_t temp = rom_[overworldgfxGroups + (area_graphics_ * 4)];
|
||||||
|
if (temp != 0x00) {
|
||||||
|
custom_tileset_.TileGFX3 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX3 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = rom_[overworldgfxGroups + (area_graphics_ * 4) + 1];
|
||||||
|
if (temp != 0x00) {
|
||||||
|
custom_tileset_.TileGFX4 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX4 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = rom_[overworldgfxGroups + (area_graphics_ * 4) + 2];
|
||||||
|
if (temp != 0x00) {
|
||||||
|
custom_tileset_.TileGFX5 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX5 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = rom_[overworldgfxGroups + (area_graphics_ * 4) + 3];
|
||||||
|
if (temp != 0x00) {
|
||||||
|
custom_tileset_.TileGFX6 = temp;
|
||||||
|
} else {
|
||||||
|
custom_tileset_.TileGFX6 = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the animated GFX values.
|
||||||
|
if (index_ == 0x03 || index_ == 0x05 || index_ == 0x07 || index_ == 0x43 ||
|
||||||
|
index_ == 0x45 || index_ == 0x47) {
|
||||||
|
animated_gfx_ = 0x59;
|
||||||
|
} else {
|
||||||
|
animated_gfx_ = 0x5B;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subscreen_overlay_ =
|
||||||
|
rom_[OverworldCustomSubscreenOverlayArray + (index_ * 2)];
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
void OverworldMap::LoadMainBlocksetId() {
|
void OverworldMap::LoadMainBlocksetId() {
|
||||||
@@ -525,7 +765,8 @@ absl::Status OverworldMap::BuildTiles16Gfx(int count) {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void CopyTile8bpp16(int x, int y, int tile, std::vector<uint8_t>& bitmap, std::vector<uint8_t>& blockset) {
|
void CopyTile8bpp16(int x, int y, int tile, std::vector<uint8_t>& bitmap,
|
||||||
|
std::vector<uint8_t>& blockset) {
|
||||||
int src_pos =
|
int src_pos =
|
||||||
((tile - ((tile / 0x08) * 0x08)) * 0x10) + ((tile / 0x08) * 2048);
|
((tile - ((tile / 0x08) * 0x08)) * 0x10) + ((tile / 0x08) * 2048);
|
||||||
int dest_pos = (x + (y * 0x200));
|
int dest_pos = (x + (y * 0x200));
|
||||||
|
|||||||
@@ -141,6 +141,8 @@ class OverworldMap : public editor::context::GfxContext {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void LoadAreaInfo();
|
void LoadAreaInfo();
|
||||||
|
void LoadCustomOverworldData();
|
||||||
|
void SetupCustomTileset(uint8_t asm_version);
|
||||||
|
|
||||||
void LoadMainBlocksetId();
|
void LoadMainBlocksetId();
|
||||||
void LoadSpritesBlocksets();
|
void LoadSpritesBlocksets();
|
||||||
|
|||||||
Reference in New Issue
Block a user