mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@706 385bec56-5757-e545-9c3a-d8741f4650f1
193 lines
5.8 KiB
C++
193 lines
5.8 KiB
C++
/*---------------------------------------------------------------------------*
|
|
Project: Horizon
|
|
File: main.cpp
|
|
|
|
Copyright 2011 Nintendo. All rights reserved.
|
|
|
|
These coded instructions, statements, and computer programs contain
|
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
|
Company Ltd., and are protected by Federal copyright law. They may
|
|
not be disclosed to third parties or copied or duplicated in any form,
|
|
in whole or in part, without the prior written consent of Nintendo.
|
|
|
|
$Rev$
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
#include <nn.h>
|
|
#include <nn/applet.h>
|
|
#include <nn/cfg.h>
|
|
#include <nn/cfg/CTR/cfg_ApiInit.h>
|
|
#include <nn/cfg/CTR/cfg_ApiSys.h>
|
|
#include <nn/cfg/CTR/detail/cfg_Keys.h>
|
|
#include <nn/ns.h>
|
|
#include <nn/hid/CTR/hid_ApiWithPrivilege.h>
|
|
#include <nn/ptm/CTR/ptm_ApiSysmenu.h>
|
|
|
|
#include "sysHeap.h"
|
|
#include "syokaikidou.h"
|
|
#include "CfgChanger.h"
|
|
#include "StateManager.h"
|
|
|
|
#include "demo.h"
|
|
#include <scene.h>
|
|
|
|
#define HANDLE_ERROR(result) \
|
|
if(result.IsFailure()) \
|
|
{ \
|
|
DrawError(result); \
|
|
} \
|
|
|
|
namespace
|
|
{
|
|
demo::RenderSystemDrawing s_RenderSystem;
|
|
}
|
|
|
|
extern "C" void nninitSetupDaemons(void)
|
|
{
|
|
}
|
|
|
|
void DrawError(nn::Result result)
|
|
{
|
|
s_RenderSystem.SetClearColor(NN_GX_DISPLAY_BOTH, 1, 0, 0, 1);
|
|
s_RenderSystem.SetColor(1, 1, 1);
|
|
|
|
for(;;)
|
|
{
|
|
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0);
|
|
s_RenderSystem.Clear();
|
|
s_RenderSystem.DrawText(0, 0, "Error: %08X", result.GetPrintableBits());
|
|
|
|
s_RenderSystem.SwapBuffers();
|
|
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1);
|
|
s_RenderSystem.Clear();
|
|
s_RenderSystem.SwapBuffers();
|
|
s_RenderSystem.WaitVsync(NN_GX_DISPLAY_BOTH);
|
|
}
|
|
}
|
|
|
|
extern "C" void nnMain()
|
|
{
|
|
nn::Result result;
|
|
nn::applet::Enable();
|
|
nn::cfg::CTR::init::Initialize();
|
|
nn::cfg::CTR::system::Initialize();
|
|
nn::ptm::CTR::InitializeForSystemMenu();
|
|
|
|
nn::os::Initialize();
|
|
nn::fs::Initialize();
|
|
|
|
// ヒープの準備
|
|
sys::Mem::init();
|
|
|
|
// RenderSystem の準備
|
|
const size_t heapSizeofRender = 8 * 1024 * 1024;
|
|
void* heapBuf = sys::Mem::getDeviceHeap()->getHeap()->Allocate(heapSizeofRender);
|
|
s_RenderSystem.Initialize(reinterpret_cast<uptr>(heapBuf), heapSizeofRender);
|
|
s_RenderSystem.SetClearColor(NN_GX_DISPLAY_BOTH, 0, 1, 0, 1);
|
|
|
|
result = nn::ns::InitializeForShell();
|
|
HANDLE_ERROR(result);
|
|
|
|
nn::hid::InitializeWithPrivilege();
|
|
nn::hid::PadReader padReader;
|
|
nn::hid::PadStatus padStatus;
|
|
|
|
const size_t heapSizeofWriter = 4 * 1024 * 1024;
|
|
void* fontHeapAddr = sys::Mem::getDeviceHeap()->getHeap()->Allocate(heapSizeofWriter);
|
|
scene::TextWriter textWriter;
|
|
nn::fnd::ExpHeap fontHeap;
|
|
fontHeap.Initialize(reinterpret_cast<uptr>(fontHeapAddr), heapSizeofWriter);
|
|
textWriter.Initialize(&fontHeap);
|
|
|
|
// タイトル設定
|
|
wchar_t title[] = L"CTR User Setting Manager";
|
|
scene::SetTitle(title, sizeof(title)/sizeof(wchar_t));
|
|
|
|
StateManager* pManager;
|
|
|
|
bool updateSaveData = false;
|
|
padReader.ReadLatest(&padStatus);
|
|
if(padStatus.hold & nn::hid::BUTTON_Y &&
|
|
padStatus.hold & nn::hid::BUTTON_A &&
|
|
padStatus.hold & nn::hid::BUTTON_B &&
|
|
padStatus.hold & nn::hid::BUTTON_X
|
|
)
|
|
{
|
|
NN_LOG("Updating SaveData\n");
|
|
updateSaveData = true;
|
|
}
|
|
|
|
if(updateSaveData)
|
|
{
|
|
pManager = new(sys::Mem::getMainHeap()) StateManager(StateManager::MODE_OVERWITE);
|
|
}
|
|
else
|
|
{
|
|
pManager = new(sys::Mem::getMainHeap()) StateManager(StateManager::MODE_APPLY);
|
|
}
|
|
|
|
for(;;)
|
|
{
|
|
bool goNext = false;
|
|
padReader.ReadLatest(&padStatus);
|
|
if(padStatus.trigger & nn::hid::BUTTON_A ||
|
|
padStatus.trigger & nn::hid::BUTTON_START
|
|
)
|
|
{
|
|
goNext = true;
|
|
}
|
|
|
|
// 電源ボタン短押しでシステムにシャットダウン通知を投げる
|
|
if( nn::applet::IsExpectedToProcessPowerButton())
|
|
{
|
|
result = nn::ns::ShutdownAsync();
|
|
HANDLE_ERROR(result);
|
|
}
|
|
|
|
// シャットダウンが始まったらアプリを終了させる
|
|
if ( nn::applet::IsExpectedToCloseApplication())
|
|
{
|
|
NN_LOG("Close Application\n");
|
|
result = nn::ns::FinalizeForShell();
|
|
HANDLE_ERROR(result);
|
|
s_RenderSystem.Finalize();
|
|
nn::ptm::CTR::FinalizeForSystemMenu();
|
|
nn::cfg::CTR::init::Finalize();
|
|
nn::cfg::CTR::system::Finalize();
|
|
result = nn::applet::PrepareToCloseApplication();
|
|
HANDLE_ERROR(result);
|
|
result = nn::applet::CloseApplication();
|
|
HANDLE_ERROR(result);
|
|
}
|
|
|
|
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0);
|
|
if(pManager->IsError())
|
|
{
|
|
s_RenderSystem.SetClearColor(NN_GX_DISPLAY_BOTH, 1, 0, 0, 1);
|
|
}
|
|
else if(pManager->IsFinished())
|
|
{
|
|
s_RenderSystem.SetClearColor(NN_GX_DISPLAY_BOTH, 0, 1, 0, 1);
|
|
}
|
|
else
|
|
{
|
|
s_RenderSystem.SetClearColor(NN_GX_DISPLAY_BOTH, 0, 0, 0, 1);
|
|
}
|
|
s_RenderSystem.Clear();
|
|
|
|
textWriter.BeginRender(NN_GX_DISPLAY0);
|
|
scene::DrawTitle(&textWriter);
|
|
if(pManager->Exec(goNext, &textWriter))
|
|
{
|
|
pManager->GoNext();
|
|
}
|
|
textWriter.EndRender();
|
|
|
|
s_RenderSystem.SwapBuffers();
|
|
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1);
|
|
s_RenderSystem.Clear();
|
|
s_RenderSystem.SwapBuffers();
|
|
s_RenderSystem.WaitVsync(NN_GX_DISPLAY_BOTH);
|
|
}
|
|
}
|