I'm at a loss as to what has happened. Anyone care to point out where I've done something stupid?
Code: Select all
#include <nds.h>
#include <string>
using std::string; //to use C++ strings
#include <stdio.h>
#include <string.h>
int backgrounds[2][4]; //[main?] [layer]
void loadBgTiles(int bg, const char* path);
void loadBgMap(bool main, int bg, bool extended,const char* path);
void loadBgPal(bool main,int bg, const char* path);
void loadBgMap256x256(int bg, u8* buffer, int size);
void loadBgMapNotER(int bg, u8* buffer, int size);
void loadBg(bool main, int number, int mapBase, int tileBase, const char* name, BgSize size){
string path = name;
path = "bg/" + path + ".map.bin";
if(main){
if(number < 2){
backgrounds[main][number] = bgInit(number, BgType_Text8bpp, size, mapBase, tileBase);
}
else{
backgrounds[main][number] = bgInit(number, BgType_ExRotation, size, mapBase/2, tileBase);
}
}
else{
backgrounds[main][number] = bgInitSub(number, BgType_Text8bpp, BgSize_T_512x512, mapBase, tileBase);
}
bgHide(backgrounds[main][number]);
bool rotScale = false;
if(main && number>1){
rotScale = true;
}
loadBgMap(rotScale, backgrounds[main][number], size == BgSize_ER_512x512, path.c_str());
path = name;
path = "bg/" + path + ".img.bin";
loadBgTiles(backgrounds[main][number], path.c_str());
path = name;
path = "bg/" + path + ".pal.bin";
loadBgPal(main, number, path.c_str());
bgShow(backgrounds[main][number]);
}
void loadBg(bool main, int number, int tileMapBase, const char* name, BgSize size){
loadBg(main, number, tileMapBase, tileMapBase, name, size);
}
void loadBg(bool main, int number, int mapBase, int tileBase, const char* name){
BgSize size = BgSize_T_512x512;
if(main && number >= 2){
size = BgSize_ER_512x512;
}
loadBg(main, number, mapBase, tileBase, name, size);
}
void loadBg(bool main, int number, int tileMapBase, const char* name){
BgSize size = BgSize_T_512x512;
if(main && number >= 2){
size = BgSize_ER_512x512;
}
loadBg(main, number, tileMapBase, tileMapBase, name, size);
}
void loadBgTiles(int bg, const char* path){
int i, size;
u8* buffer;
FILE* gfx;
gfx = fopen(path, "rb");
if(gfx != NULL) {
fseek(gfx, 0, SEEK_END);
size = ftell(gfx);
fseek(gfx, 0, SEEK_SET);
buffer = new u8[size];
i = 0;
while(i < size) {
fread(&buffer[i], 1, 1, gfx);
i++;
}
memcpy( bgGetGfxPtr(bg), /* Our address for main
background 3 */
buffer, /* This variable is generated for us by
grit. */
size); /* This length (in bytes) is generated
from grit. */
delete[] buffer;
fclose(gfx);
}else{
iprintf("File NULL");
}
}
void loadBgMap(bool main, int bg, bool extended, const char* path){
FILE* gfx;
int i, size;
u8* buffer;
gfx = fopen(path, "rb");
if(gfx != NULL) {
fseek(gfx, 0, SEEK_END);
size = ftell(gfx);
fseek(gfx, 0, SEEK_SET);
buffer = new u8[size];
i = 0;
while(i < size) {
fread(&buffer[i], 1, 1, gfx);
i++;
}
if((size>4095 && extended ) || !main ){
memcpy( bgGetMapPtr(bg), //Our address for background
buffer, //This variable is generated for us by
// grit.
size); // This length (in bytes)
}else{
if(extended){
loadBgMap256x256(bg, buffer, size);
}else{
loadBgMapNotER(bg, buffer, size);
}
}
delete[] buffer;
fclose(gfx);
}else{
iprintf("File NULL");
}
}
void loadBgMapNotER(int bg, u8* buffer, int size){
//----------------------------
u16* map = (u16*)bgGetMapPtr(bg);
//draw top half
for(int iy = 0; iy < 32; iy++){
//first the left half
memcpy(map+(iy*32), buffer+(iy*128), 64);
//then the right half
memcpy(map + (32 + iy) * 32, buffer + iy * 128 + 64, 32 * 2);
}
//map += 32 * 32 * 2;
//draw bottom half
for(int iy = 0; iy < 32; iy++){
//copy one line at a time
//first the left half
memcpy(map+((iy+64)*32), buffer+((iy+32)*128), 64);
//then the right half
memcpy(map+((iy+96)*32), buffer+((iy+32)*128)+64, 64);
}
//----------------------------------
}
void loadBgMap256x256(int bg, u8* buffer, int size){
u16* map = (u16*)bgGetMapPtr(bg);
for(int iy = 0; iy < 32; iy++){
memcpy(map+(iy*64), buffer+(iy*64), 64);
}
}
void loadBgPal(bool main, int number, const char* path){
FILE* gfx;
int i, size;
u8* buffer;
gfx = fopen(path, "rb");
if(gfx != NULL) {
fseek(gfx, 0, SEEK_END);
size = ftell(gfx);
fseek(gfx, 0, SEEK_SET);
buffer = new u8[size];
i = 0;
while(i < size) {
fread(&buffer[i], 1, 1, gfx);
i++;
}
if(main){
vramSetBankE(VRAM_E_LCD);
memcpy(VRAM_E_EXT_PALETTE[number*16], /* screen palette*/
buffer, size);
vramSetBankE(VRAM_E_BG_EXT_PALETTE);
switch(number){
case 3:
REG_BG3CNT |= BG_PALETTE_SLOT3;
break;
case 2:
REG_BG2CNT |= BG_PALETTE_SLOT2;
break;
case 1:
REG_BG1CNT |= BG_PALETTE_SLOT1;
break;
case 0:
REG_BG0CNT |= BG_PALETTE_SLOT0;
break;
}
}else{
vramSetBankH(VRAM_H_LCD);
memcpy(VRAM_H_EXT_PALETTE[number*16], /* screen palette*/
buffer, size);
vramSetBankH(VRAM_H_SUB_BG_EXT_PALETTE);
switch(number){
case 3:
REG_BG3CNT_SUB |= BG_PALETTE_SLOT3;
break;
case 2:
REG_BG2CNT_SUB |= BG_PALETTE_SLOT2;
break;
case 1:
REG_BG1CNT_SUB |= BG_PALETTE_SLOT1;
break;
case 0:
REG_BG0CNT_SUB |= BG_PALETTE_SLOT0;
break;
}
REG_DISPCNT_SUB |= DISPLAY_BG_EXT_PALETTE; /*Tell the sub screen to use
extended palettes for the backgrounds*/
}
delete[] buffer;
fclose(gfx);
}else{
iprintf("File NULL");
}
}
void loadFont(char* name, ConsoleFont target){
//First the tiles
string path = name;
path = "font/"+path+".img.bin";
int i, size;
u16* buffer;
FILE* gfx;
gfx = fopen(path.c_str(), "rb");
if(gfx != NULL) {
fseek(gfx, 0, SEEK_END);
size = ftell(gfx);
fseek(gfx, 0, SEEK_SET);
buffer = (u16*)malloc(size);
i = 0;
while(i < size) {
fread(&buffer[i], 1, 1, gfx);
i++;
}
memcpy( target.gfx, /* Font's tiles */
buffer, /* This variable is generated for us by
* grit. */
size); /* This length (in bytes) is generated
from the file read. */
free(buffer);
fclose(gfx);
}else{
iprintf("File NULL");
}
//Then the palette
path = name;
path = "font/"+path+".pal.bin";
gfx = fopen(path.c_str(), "rb");
if(gfx != NULL) {
fseek(gfx, 0, SEEK_END);
size = ftell(gfx);
fseek(gfx, 0, SEEK_SET);
buffer = (u16*)malloc(size);
i = 0;
while(i < size) {
fread(&buffer[i], 1, 1, gfx);
i++;
}
memcpy( target.pal, /* Font's tiles */
buffer, /* This variable is generated for us by
grit. */
size); /* This length (in bytes) is generated
from the file read. */
target.numColors = size / 2;
free(buffer);
fclose(gfx);
}else{
iprintf("File NULL");
}
target.numChars = 95;
target.bpp = 4;
target.asciiOffset = 32;
target.convertSingleColor = false;
}
void setBlackFade(){
REG_BLDCNT_SUB = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_BLACK;
REG_BLDCNT = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 |BLEND_FADE_BLACK;
REG_BLDY_SUB = 16;
REG_BLDY = 16;
}
void fadeBoth(){
REG_BLDCNT_SUB = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_BLACK;
REG_BLDCNT = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_BLACK;
for(int dark = 0; dark<=32;dark++){
REG_BLDY_SUB = dark>>1;
REG_BLDY = dark>>1;
swiWaitForVBlank();
}
}
void unFadeBoth(){
REG_BLDCNT_SUB = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_BLACK;
REG_BLDCNT = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_BLACK;
for(int dark = 32; dark>=0;dark--){
REG_BLDY_SUB = dark>>1;
REG_BLDY = dark>>1;
swiWaitForVBlank();
}
}
void whiteFadeBoth(){
REG_BLDCNT_SUB = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_WHITE;
REG_BLDCNT = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_WHITE;
for(int dark = 0; dark<=32;dark++){
REG_BLDY_SUB = dark>>1;
REG_BLDY = dark>>1;
swiWaitForVBlank();
}
}
void unWhiteFadeBoth(){
REG_BLDCNT_SUB = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_WHITE;
REG_BLDCNT = BLEND_SRC_SPRITE | BLEND_SRC_BG0 | BLEND_SRC_BG1 | BLEND_SRC_BG2 | BLEND_SRC_BG3 | BLEND_FADE_WHITE;
for(int dark = 32; dark>=0;dark--){
REG_BLDY_SUB = dark>>1;
REG_BLDY = dark>>1;
swiWaitForVBlank();
}
}