258 lines
6.1 KiB
C++
258 lines
6.1 KiB
C++
#include "room.h"
|
|
|
|
#include "app/core/common.h"
|
|
#include "app/gfx/bitmap.h"
|
|
#include "app/gfx/snes_palette.h"
|
|
#include "app/gfx/snes_tile.h"
|
|
#include "app/gui/canvas.h"
|
|
#include "app/rom.h"
|
|
|
|
namespace yaze {
|
|
namespace app {
|
|
namespace zelda3 {
|
|
namespace dungeon {
|
|
|
|
void Room::LoadGfxGroups() {
|
|
int gfxPointer =
|
|
(rom_[gfx_groups_pointer + 1] << 8) + rom_[gfx_groups_pointer];
|
|
gfxPointer = core::SnesToPc(gfxPointer);
|
|
|
|
for (int i = 0; i < 37; i++) {
|
|
for (int j = 0; j < 8; j++) {
|
|
mainGfx[i][j] = rom_[gfxPointer + (i * 8) + j];
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 82; i++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
roomGfx[i][j] = rom_[entrance_gfx_group + (i * 4) + j];
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 144; i++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
spriteGfx[i][j] = rom_[sprite_blockset_pointer + (i * 4) + j];
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 72; i++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
paletteGfx[i][j] = rom_[dungeons_palettes_groups + (i * 4) + j];
|
|
}
|
|
}
|
|
}
|
|
|
|
bool Room::SaveGroupsToROM() {
|
|
int gfxPointer =
|
|
(rom_[gfx_groups_pointer + 1] << 8) + rom_[gfx_groups_pointer];
|
|
gfxPointer = core::SnesToPc(gfxPointer);
|
|
|
|
for (int i = 0; i < 37; i++) {
|
|
for (int j = 0; j < 8; j++) {
|
|
rom_.Write(gfxPointer + (i * 8) + j, mainGfx[i][j]);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 82; i++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
rom_.Write(entrance_gfx_group + (i * 4) + j, roomGfx[i][j]);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 144; i++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
rom_.Write(sprite_blockset_pointer + (i * 4) + j, spriteGfx[i][j]);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 72; i++) {
|
|
for (int j = 0; j < 4; j++) {
|
|
rom_.Write(dungeons_palettes_groups + (i * 4) + j, paletteGfx[i][j]);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void Room::LoadChests() {
|
|
// ChestList.Clear();
|
|
|
|
// int cpos = rom_.Read24(core::constants::chests_data_pointer1).SNEStoPC();
|
|
// int clength = rom_.Read16(core::constants::chests_length_pointer);
|
|
|
|
// for (int i = 0; i < clength; i += 3) {
|
|
// ushort roomid = (ushort)(rom_.Read16(cpos) & 0x7FFF);
|
|
// cpos += 2;
|
|
// uchar item = rom_[cpos++]; // get now so cpos is incremented too
|
|
|
|
// if (roomid == RoomID) {
|
|
// ChestList.Add(new DungeonChestItem(ItemReceipt.GetTypeFromID(item)));
|
|
// }
|
|
// }
|
|
}
|
|
|
|
void Room::LoadBlocks() {}
|
|
|
|
void Room::LoadTorches() {}
|
|
|
|
void Room::LoadSecrets() {}
|
|
|
|
void Room::Resync() {}
|
|
|
|
void Room::LoadObjectsFromArray(int loc) {}
|
|
|
|
void Room::LoadSpritesFromArray(int loc) {}
|
|
|
|
void Room::LoadRoomGraphics(uchar entrance_blockset) {
|
|
for (int i = 0; i < 8; i++) {
|
|
blocks[i] = mainGfx[BackgroundTileset][i];
|
|
if (i >= 6 && i <= 6) {
|
|
// 3-6
|
|
if (entrance_blockset != 0xFF) {
|
|
// 6 is wrong for the entrance? -NOP need to fix that
|
|
// TODO: Find why this is wrong - Thats because of the stairs need to
|
|
// find a workaround
|
|
if (roomGfx[entrance_blockset][i - 3] != 0) {
|
|
blocks[i] = roomGfx[entrance_blockset][i - 3];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
blocks[8] = 115 + 0; // Static Sprites Blocksets (fairy,pot,ect...)
|
|
blocks[9] = 115 + 10;
|
|
blocks[10] = 115 + 6;
|
|
blocks[11] = 115 + 7;
|
|
for (int i = 0; i < 4; i++) {
|
|
blocks[12 + i] = (uchar)(spriteGfx[SpriteTileset + 64][i] + 115);
|
|
} // 12-16 sprites
|
|
|
|
auto newPdata = rom_.GetGraphicsBuffer();
|
|
|
|
uchar* sheetsData = current_graphics_.GetData();
|
|
// Into "room gfx16" 16 of them
|
|
|
|
int sheetPos = 0;
|
|
for (int i = 0; i < 16; i++) {
|
|
int d = 0;
|
|
int ioff = blocks[i] * 2048;
|
|
while (d < 2048) {
|
|
// NOTE LOAD BLOCKSETS SOMEWHERE FIRST
|
|
uchar mapByte = newPdata[d + ioff];
|
|
if (i < 4) // removed switch
|
|
{
|
|
mapByte += 0x88;
|
|
} // Last line of 6, first line of 7 ?
|
|
|
|
sheetsData[d + sheetPos] = mapByte;
|
|
d++;
|
|
}
|
|
|
|
sheetPos += 2048;
|
|
}
|
|
|
|
LoadAnimatedGraphics();
|
|
}
|
|
|
|
void Room::LoadAnimatedGraphics() {
|
|
int gfxanimatedPointer = core::SnesToPc(gfx_animated_pointer);
|
|
|
|
auto newPdata = rom_.GetGraphicsBuffer();
|
|
|
|
uchar* sheetsData = current_graphics_.GetData();
|
|
int data = 0;
|
|
while (data < 512) {
|
|
uchar mapByte = newPdata[data + (92 * 2048) + (512 * animated_frame)];
|
|
sheetsData[data + (7 * 2048)] = mapByte;
|
|
|
|
mapByte =
|
|
newPdata[data + (rom_[gfxanimatedPointer + BackgroundTileset] * 2048) +
|
|
(512 * animated_frame)];
|
|
sheetsData[data + (7 * 2048) - 512] = mapByte;
|
|
data++;
|
|
}
|
|
}
|
|
|
|
void Room::LoadRoomFromROM() {
|
|
// Load dungeon header
|
|
int headerPointer = core::SnesToPc(room_header_pointer);
|
|
|
|
MessageID = messages_id_dungeon + (RoomID * 2);
|
|
|
|
int hpos = core::SnesToPc((rom_[room_header_pointers_bank] << 16) |
|
|
headerPointer + (RoomID * 2));
|
|
hpos++;
|
|
uchar b = rom_[hpos];
|
|
|
|
Layer2Mode = (uchar)(b >> 5);
|
|
// TODO(@scawful): Make LayerMerging object.
|
|
// LayerMerging = LayerMergeType.ListOf[(b & 0x0C) >> 2];
|
|
|
|
IsDark = (b & 0x01) == 0x01;
|
|
hpos++;
|
|
|
|
Palette = rom_[hpos];
|
|
hpos++;
|
|
|
|
BackgroundTileset = rom_[hpos];
|
|
hpos++;
|
|
|
|
SpriteTileset = rom_[hpos];
|
|
hpos++;
|
|
|
|
Layer2Behavior = rom_[hpos];
|
|
hpos++;
|
|
|
|
Tag1 = rom_[hpos];
|
|
hpos++;
|
|
|
|
Tag2 = rom_[hpos];
|
|
hpos++;
|
|
|
|
b = rom_[hpos];
|
|
|
|
Pits.TargetLayer = (uchar)(b & 0x03);
|
|
Stair1.TargetLayer = (uchar)((b >> 2) & 0x03);
|
|
Stair2.TargetLayer = (uchar)((b >> 4) & 0x03);
|
|
Stair3.TargetLayer = (uchar)((b >> 6) & 0x03);
|
|
hpos++;
|
|
Stair4.TargetLayer = (uchar)(rom_[hpos] & 0x03);
|
|
hpos++;
|
|
|
|
Pits.Target = rom_[hpos];
|
|
hpos++;
|
|
Stair1.Target = rom_[hpos];
|
|
hpos++;
|
|
Stair2.Target = rom_[hpos];
|
|
hpos++;
|
|
Stair3.Target = rom_[hpos];
|
|
hpos++;
|
|
Stair4.Target = rom_[hpos];
|
|
hpos++;
|
|
|
|
// Load room objects
|
|
int objectPointer = core::SnesToPc(room_object_pointer);
|
|
int room_address = objectPointer + (RoomID * 3);
|
|
|
|
int objects_location = core::SnesToPc(room_address);
|
|
|
|
LoadObjectsFromArray(objects_location);
|
|
|
|
// Load sprites
|
|
int spr_ptr = 0x040000 | rooms_sprite_pointer;
|
|
int sprite_address =
|
|
core::SnesToPc(dungeon_spr_ptrs | spr_ptr + (RoomID * 2));
|
|
LoadSpritesFromArray(sprite_address);
|
|
|
|
// Load other stuff
|
|
LoadChests();
|
|
LoadBlocks();
|
|
LoadTorches();
|
|
LoadSecrets();
|
|
Resync();
|
|
}
|
|
|
|
} // namespace dungeon
|
|
} // namespace zelda3
|
|
} // namespace app
|
|
} // namespace yaze
|