This commit is contained in:
fix94.1 2012-07-06 00:36:45 +00:00
parent f3e90060e2
commit 5254ace17c
15 changed files with 314 additions and 62 deletions

BIN
data/custombanner.bin Normal file

Binary file not shown.

View File

@ -57,16 +57,50 @@ void AnimatedBanner::Clear()
bool AnimatedBanner::LoadBanner(Banner *banner)
{
Clear();
u32 banner_bin_size;
const u8 *banner_bin = banner->GetFile((char*)"banner.bin", &banner_bin_size);
if(banner_bin == NULL)
return false;
return LoadBannerBin(banner_bin, banner_bin_size);
}
bool AnimatedBanner::LoadBannerBin(const u8 *banner_bin, u32 banner_bin_size)
{
Clear();
layout_banner = LoadLayout(banner_bin, banner_bin_size, "banner", CONF_GetLanguageString());
return (layout_banner != NULL);
}
void AnimatedBanner::SetBannerText(const char *text_name, const wchar_t *wText)
{
if(!layout_banner || !wText)
return;
Textbox *tbox = dynamic_cast<Textbox *>(layout_banner->FindPane(text_name));
if(tbox)
{
int len = wcslen(wText);
u16 *text_char16 = new u16[len+1];
for(int i = 0; i < len; i++)
text_char16[i] = (u16) wText[i];
text_char16[len] = 0;
tbox->SetText(text_char16);
}
}
void AnimatedBanner::SetBannerTexture(const char *tex_name, const u8 *data, float width, float height, u8 fmt)
{
if(!layout_banner)
return;
Texture *texture = layout_banner->FindTexture( tex_name );
if(texture != NULL && data != NULL) {
texture->LoadTextureData(data, width, height, fmt);
}
}
Layout* AnimatedBanner::LoadLayout(const u8 *bnr, u32 bnr_size, const std::string& lyt_name, const std::string &language)
{
u32 brlyt_size = 0;

View File

@ -37,7 +37,10 @@ public:
void Clear();
bool LoadBanner(Banner *banner);
bool LoadBannerBin(const u8 *banner_bin, u32 banner_bin_size);
Layout *getBanner() const { return layout_banner; }
void SetBannerTexture(const char *tex_name, const u8 *data, float width, float height, u8 fmt);
void SetBannerText(const char *text_name, const wchar_t *wText);
protected:
Layout* LoadLayout(const u8 *bnr, u32 bnr_size, const std::string& lyt_name, const std::string &language);

View File

@ -23,9 +23,11 @@
BannerWindow *m_banner;
void BannerWindow::LoadBanner(Banner *banner, CVideo *vid, u8 *font1, u8 *font2)
extern const u8 custombanner_bin[];
extern const u32 custombanner_bin_size;
void BannerWindow::Init(CVideo *vid, u8 *font1, u8 *font2)
{
changing = true;
MaxAnimSteps = 30;
returnVal = -1;
reducedVol = false;
@ -42,7 +44,19 @@ void BannerWindow::LoadBanner(Banner *banner, CVideo *vid, u8 *font1, u8 *font2)
AnimPosY = 0.5f * (ScreenProps.y - fIconHeight);
AnimationRunning = false;
ChangeGame(banner);
gameBanner->Clear();
if(!FontLoaded)
{
gameBanner->LoadFont(sysFont1, sysFont2);
FontLoaded = true;
}
}
void BannerWindow::LoadBanner(Banner *banner, CVideo *vid, u8 *font1, u8 *font2)
{
changing = true;
Init(vid, font1, font2);
gameBanner->LoadBanner(banner);
gameSelected = 1;
changing = false;
}
@ -64,15 +78,21 @@ BannerWindow::BannerWindow()
gameBanner = new AnimatedBanner;
}
void BannerWindow::ChangeGame(Banner *banner)
void BannerWindow::LoadBannerBin(u8 *bnr, u32 bnr_size, CVideo *vid, u8 *font1, u8 *font2)
{
gameBanner->Clear();
if(!FontLoaded)
{
gameBanner->LoadFont(sysFont1, sysFont2);
FontLoaded = true;
}
gameBanner->LoadBanner(banner);
changing = true;
Init(vid, font1, font2);
gameBanner->LoadBannerBin(bnr, bnr_size);
gameSelected = 1;
changing = false;
}
void BannerWindow::CreateGCBanner(u8 *bnr, CVideo *vid, u8 *font1, u8 *font2, const wchar_t *title)
{
GC_OpeningBnr *openingBnr = (GC_OpeningBnr *)bnr;
LoadBannerBin((u8*)custombanner_bin, (u32)custombanner_bin_size, vid, font1, font2);
gameBanner->SetBannerTexture("GCIcon.tpl", openingBnr->tpl_data, 96, 32, GX_TF_RGB5A3);
gameBanner->SetBannerText("T_GameTitle", title);
}
bool BannerWindow::ToogleZoom(void)

View File

@ -27,14 +27,31 @@
#define FAVORITE_STARS 5
typedef struct _GC_OpeningBnr
{
u32 magic; // BNR1 or BNR2
u8 pad[0x1C];
u8 tpl_data[0x1800]; // 96x32 pixel format GX_TF_RGB5A3
struct
{
u8 disc_title[0x20]; // Gamename
u8 developer_short[0x20]; // Company/Developer
u8 full_title[0x40]; // Full Game Title
u8 developer[0x40]; // Company/Developer Full name, or description
u8 long_description[0x80]; // Game Description
} description[6]; // 6 only on BNR2 => English, German, French, Spanish, Italian, Dutch ??
} GC_OpeningBnr;
class BannerWindow
{
public:
BannerWindow();
void DeleteBanner(bool gamechange = false);
void LoadBanner(Banner *banner, CVideo *vid, u8 *font1, u8 *font2);
void LoadBannerBin(u8 *bnr, u32 bnr_size, CVideo *vid, u8 *font1, u8 *font2);
int GetSelectedGame() { return gameSelected; }
bool GetZoomSetting() { return AnimZoom; }
void CreateGCBanner(u8 *bnr, CVideo *vid, u8 *font1, u8 *font2, const wchar_t *title);
void Draw(void);
bool ToogleZoom(void);
protected:
@ -43,6 +60,7 @@ class BannerWindow
void ChangeGame(Banner *banner);
void DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color);
void ReSetup_GX(void);
void Init(CVideo *vid, u8 *font1, u8 *font2);
static const float fBannerWidth = 608.f;
static const float fBannerHeight = 448.f;

View File

@ -159,9 +159,9 @@ int GC_GameIsInstalled(char *discid, const char* partition, const char* dmlgamed
return 0;
}
void DML_New_SetOptions(char *GamePath, char *CheatPath, char *NewCheatPath, bool cheats, bool debugger, u8 NMM, u8 nodisc, u8 DMLvideoMode)
void DML_New_SetOptions(const char *GamePath, char *CheatPath, char *NewCheatPath, bool cheats, bool debugger, u8 NMM, u8 nodisc, u8 DMLvideoMode)
{
gprintf("Wiiflow DML: Launch game 'sd:/games/%s/game.iso' through memory (new method)\n", GamePath);
gprintf("Wiiflow DML: Launch game '%s' through memory (new method)\n", GamePath);
DMLCfg = (DML_CFG*)MEM1_alloc(sizeof(DML_CFG));
if(DMLCfg == NULL)
@ -177,10 +177,7 @@ void DML_New_SetOptions(char *GamePath, char *CheatPath, char *NewCheatPath, boo
if(GamePath != NULL)
{
if(GC_GameIsInstalled(GamePath, "sd", "%s:/games") == 2)
snprintf(DMLCfg->GamePath, sizeof(DMLCfg->GamePath), "/games/%s/", GamePath);
else
snprintf(DMLCfg->GamePath, sizeof(DMLCfg->GamePath), "/games/%s/game.iso", GamePath);
strncpy(DMLCfg->GamePath, GamePath, sizeof(DMLCfg->GamePath));
DMLCfg->Config |= DML_CFG_GAME_PATH;
}
@ -215,7 +212,7 @@ void DML_New_SetOptions(char *GamePath, char *CheatPath, char *NewCheatPath, boo
void DML_Old_SetOptions(char *GamePath, char *CheatPath, char *NewCheatPath, bool cheats)
{
gprintf("Wiiflow DML: Launch game 'sd:/games/%s/game.iso' through boot.bin (old method)\n", GamePath);
gprintf("Wiiflow DML: Launch game '%s' through boot.bin (old method)\n", GamePath);
FILE *f;
f = fopen("sd:/games/boot.bin", "wb");
fwrite(GamePath, 1, strlen(GamePath) + 1, f);

View File

@ -49,7 +49,7 @@ void GC_SetVideoMode(u8 videomode);
void GC_SetLanguage(u8 lang);
int GC_GameIsInstalled(char *discid, const char* partition, const char* dmlgamedir);
void DML_New_SetOptions(char *GamePath, char *CheatPath, char *NewCheatPath, bool cheats, bool debugger, u8 NMM, u8 nodisc, u8 DMLvideoMode);
void DML_New_SetOptions(const char *GamePath, char *CheatPath, char *NewCheatPath, bool cheats, bool debugger, u8 NMM, u8 nodisc, u8 DMLvideoMode);
void DML_Old_SetOptions(char *GamePath, char *CheatPath, char *NewCheatPath, bool cheats);
void DML_New_SetBootDiscOption();
void DML_New_WriteOptions();

117
source/gc/gcdisc.cpp Normal file
View File

@ -0,0 +1,117 @@
/****************************************************************************
* Copyright (C) 2012 FIX94
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include "gcdisc.hpp"
#include "loader/gc_disc_dump.hpp"
#include "mem2.hpp"
#include "gecko.h"
#include "gc.h"
using namespace std;
void GC_Disc::init(char *path)
{
opening_bnr = NULL;
strncpy(GamePath, path, sizeof(GamePath));
FILE *f;
if(strcasestr(GamePath, "boot.bin") != NULL)
{
GameType = TYPE_FST;
string fst(GamePath);
fst.erase(fst.end() - 8, fst.end());
fst.append("fst.bin");
f = fopen(fst.c_str(), "rb");
fseek(f, 0, SEEK_END);
u32 size = ftell(f);
fseek(f, 0, SEEK_SET);
Read_FST(f, size);
fclose(f);
}
else
{
GameType = TYPE_ISO;
f = fopen(GamePath, "rb");
u8 *ReadBuffer = (u8*)MEM2_alloc(0x440);
fread(ReadBuffer, 1, 0x440, f);
u32 FSTOffset = *(vu32*)(ReadBuffer+0x424);
u32 FSTSize = *(vu32*)(ReadBuffer+0x428);
MEM2_free(ReadBuffer);
fseek(f, FSTOffset, SEEK_SET);
Read_FST(f, FSTSize);
fclose(f);
}
}
void GC_Disc::clear()
{
if(opening_bnr)
{
MEM2_free(opening_bnr);
opening_bnr = NULL;
}
if(FSTable)
{
MEM2_free(FSTable);
FSTable = NULL;
}
}
void GC_Disc::Read_FST(FILE *f, u32 FST_size)
{
FSTable = (u8*)MEM2_alloc(FST_size);
fread(FSTable, 1, FST_size, f);
FSTEnt = *(vu32*)(FSTable+0x08);
FSTNameOff = (char*)(FSTable + FSTEnt * 0x0C);
}
u8 *GC_Disc::GetGameCubeBanner()
{
FILE *f = NULL;
FST *fst = (FST *)(FSTable);
for(u32 i = 1; i < FSTEnt; ++i)
{
if(fst[i].Type) //Folder
continue;
else if(strcasecmp(FSTNameOff + fst[i].NameOffset, "opening.bnr") == 0)
{
if(GameType == TYPE_FST)
{
string path(GamePath);
path.erase(path.end() - 12, path.end());
path.append("root/opening.bnr");
f = fopen(path.c_str(), "rb");
}
else
{
f = fopen(GamePath, "rb");
fseek(f, fst[i].FileOffset, SEEK_SET);
}
if(f)
{
opening_bnr = (u8*)MEM2_alloc(fst[i].FileLength);
fread(opening_bnr, 1, fst[i].FileLength, f);
fclose(f);
}
}
}
return opening_bnr;
}

46
source/gc/gcdisc.hpp Normal file
View File

@ -0,0 +1,46 @@
/****************************************************************************
* Copyright (C) 2012 FIX94
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************/
#ifndef _GCDISC_HPP_
#define _GCDISC_HPP_
#include <gccore.h>
#include "banner/AnimatedBanner.h"
#include "banner/BannerWindow.hpp"
enum
{
TYPE_ISO = 0,
TYPE_FST,
};
class GC_Disc
{
public:
void init(char *path);
void clear();
u8 *GetGameCubeBanner();
private:
void Read_FST(FILE *f, u32 FST_size);
char GamePath[1024];
u8 GameType;
u8 *FSTable;
u32 FSTEnt;
char *FSTNameOff;
u8 *opening_bnr;
};
#endif

View File

@ -77,7 +77,8 @@ void CList<T>::GetPaths(vector<string> &pathlist, string containing, string dire
if(!depth_limit)
temp_pathlist.push_back(sfmt("%s/%s", temp_pathlist[0].c_str(), ent->d_name));
else if(dml && !FoundFile && strncasecmp(ent->d_name, "sys", 3) == 0 &&
fsop_FileExist(fmt("%s/%s/boot.bin", temp_pathlist[0].c_str(), ent->d_name)))
fsop_FileExist(fmt("%s/%s/boot.bin", temp_pathlist[0].c_str(), ent->d_name)) &&
!fsop_FileExist(fmt("%s/game.iso", temp_pathlist[0].c_str())))
{
FoundFile = true;
//gprintf("Pushing %s to the list.\n", sfmt("%s/%s/boot.bin", temp_pathlist[0].c_str(), ent->d_name).c_str());
@ -215,12 +216,12 @@ void CList<dir_discHdr>::GetHeaders(vector<string> pathlist, vector<dir_discHdr>
if(gc_hdr.gc_magic == GC_MAGIC)
{
strcpy(tmp.path, (*itr).c_str());
strncpy(tmp.id, (char*)gc_hdr.id, 6);
(*itr)[(*itr).find_last_of('/')] = 0;
if(strcasecmp(filename, "boot.bin") == 0)
(*itr)[(*itr).find_last_of('/')] = 0;
(*itr).assign(&(*itr)[(*itr).find_last_of('/') + 1]);
strcpy(tmp.path, (*itr).c_str());
GTitle = custom_titles.getString("TITLES", tmp.id);
tmp.casecolor = 0;
int ccolor = custom_titles.getColor("COVERS", tmp.id, tmp.casecolor).intVal();

View File

@ -21,17 +21,16 @@
* 3. This notice may not be removed or altered from any source
* distribution.
*
* gc_disc.cpp
* gc_disc_dump.cpp
*
***************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <ogcsys.h>
#include <sys/statvfs.h>
#include "mem2.hpp"
#include "gc_disc.hpp"
#include "gc_disc_dump.hpp"
#include "DeviceHandler.hpp"
#include "disc.h"
#include "utils.h"

View File

@ -21,12 +21,12 @@
* 3. This notice may not be removed or altered from any source
* distribution.
*
* gc_disc.hpp
* gc_disc_dump.hpp
*
***************************************************************************/
#ifndef GC_DISC_H_
#define GC_DISC_H_
#ifndef GC_DISC_DUMP_H_
#define GC_DISC_DUMP_H_
typedef void (*progress_callback_t)(int status,int total,void *user_data);
typedef void (*message_callback_t)(int message, int info, char *cinfo, void *user_data);
@ -39,6 +39,33 @@ enum spcall
GB,
};
struct FST
{
union
{
struct
{
u32 Type :8;
u32 NameOffset :24;
};
u32 TypeName;
};
union
{
struct
{
u32 FileOffset;
u32 FileLength;
};
struct
{
u32 ParentOffset;
u32 NextOffset;
};
u32 entry[2];
};
};
class GCDump
{
public:
@ -100,36 +127,10 @@ private:
u32 MultiGameDump;
u32 Gamesize[10];
u64 NextOffset;
typedef struct
{
union
{
struct
{
u32 Type :8;
u32 NameOffset :24;
};
u32 TypeName;
};
union
{
struct
{
u32 FileOffset;
u32 FileLength;
};
struct
{
u32 ParentOffset;
u32 NextOffset;
};
u32 entry[2];
};
} FST;
s32 __DiscReadRaw(void *outbuf, u64 offset, u32 length);
s32 __DiscWrite(char * path, u64 offset, u32 length, u8 *ReadBuffer);
s32 __DiscWriteFile(FILE *f, u64 offset, u32 length, u8 *ReadBuffer);
void __AnalizeMultiDisc();
bool __WaitForDisc(u8 dsc, u32 msg);
};
#endif
#endif

View File

@ -22,7 +22,7 @@
#include "gct.h"
#include "DeviceHandler.hpp"
#include "musicplayer.h"
#include "loader/gc_disc.hpp"
#include "loader/gc_disc_dump.hpp"
//Also in wbfs.h
#define PART_FS_WBFS 0

View File

@ -35,6 +35,7 @@
#include "types.h"
#include "gc/gc.h"
#include "gc/fileOps.h"
#include "gc/gcdisc.hpp"
#include "Gekko.h"
extern const u8 btngamecfg_png[];
@ -807,7 +808,17 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool DML)
}
if(m_new_dml)
DML_New_SetOptions(hdr->path, CheatPath, NewCheatPath, cheats, DML_debug, NMM, nodisc, DMLvideoMode);
{
string path;
if(strcasestr(hdr->path, "boot.bin") != NULL)
{
path = &hdr->path[string(hdr->path).find_first_of(":/")+1];
path.erase(path.end() - 12, path.end());
}
else
path = &hdr->path[string(hdr->path).find_first_of(":/")+1];
DML_New_SetOptions(path.c_str(), CheatPath, NewCheatPath, cheats, DML_debug, NMM, nodisc, DMLvideoMode);
}
else
DML_Old_SetOptions(hdr->path, CheatPath, NewCheatPath, cheats);
@ -1524,6 +1535,9 @@ void CMenu::_gameSoundThread(CMenu *m)
return;
}
extern SmartBuf m_wbf1_font;
extern SmartBuf m_wbf2_font;
bool custom = false;
u8 *custom_bnr_file = NULL;
u32 custom_bnr_size = 0;
@ -1556,9 +1570,14 @@ void CMenu::_gameSoundThread(CMenu *m)
fp = fopen(custom_banner, "rb");
if(!fp && m->m_cf.getHdr()->type == TYPE_GC_GAME)
{
m_banner->DeleteBanner();
GC_Disc disc;
disc.init(m->m_cf.getHdr()->path);
u8 *opening_bnr = disc.GetGameCubeBanner();
if(opening_bnr != NULL)
m_banner->CreateGCBanner(opening_bnr, &m->m_vid, m_wbf1_font.get(), m_wbf2_font.get(), m->m_cf.getHdr()->title);
m->m_gameSound.Load(gc_ogg, gc_ogg_size, false);
m->m_gamesound_changed = true;
disc.clear();
return;
}
}
@ -1599,9 +1618,6 @@ void CMenu::_gameSoundThread(CMenu *m)
}
_extractBannerTitle(banner, GetLanguage(m->m_loc.getString(m->m_curLanguage, "gametdb_code", "EN").c_str()));
extern SmartBuf m_wbf1_font;
extern SmartBuf m_wbf2_font;
const u8 *soundBin = banner->GetFile((char *) "sound.bin", &sndSize);
m_banner->LoadBanner(banner, &m->m_vid, m_wbf1_font.get(), m_wbf2_font.get());
delete banner;

View File

@ -2,7 +2,7 @@
#include "menu.hpp"
#include "loader/wbfs.h"
#include "lockMutex.hpp"
#include "loader/gc_disc.hpp"
#include "loader/gc_disc_dump.hpp"
#include "gc.h"
#include "fileOps.h"
#include "music/SoundHandler.hpp"