Cheat file format changed from binary to plaintext
This commit is contained in:
parent
0e67b0f026
commit
5def0c18e2
@ -24,6 +24,8 @@
|
|||||||
* reasonable ways as different from the original version.
|
* reasonable ways as different from the original version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* This file was entirely written by Duckbill */
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <3ds/types.h>
|
#include <3ds/types.h>
|
||||||
@ -31,5 +33,4 @@
|
|||||||
#define CHEATS_PER_MENU_PAGE 18
|
#define CHEATS_PER_MENU_PAGE 18
|
||||||
|
|
||||||
void RosalinaMenu_Cheats(void);
|
void RosalinaMenu_Cheats(void);
|
||||||
u32 Cheats_GetCurrentPID(u64* titleId);
|
void Cheat_applyKeyCheats();
|
||||||
void Cheats_applyKeyCheats();
|
|
||||||
|
@ -161,7 +161,7 @@ void menuThreadMain(void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (HID_PAD & 0xFFF) {
|
if (HID_PAD & 0xFFF) {
|
||||||
Cheats_applyKeyCheats();
|
Cheat_applyKeyCheats();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
svcSleepThread(50 * 1000 * 1000LL);
|
svcSleepThread(50 * 1000 * 1000LL);
|
||||||
|
@ -1,3 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Luma3DS
|
||||||
|
* Copyright (C) 2016-2017 Aurora Wright, TuxSH
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*
|
||||||
|
* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
|
||||||
|
* * Requiring preservation of specified reasonable legal notices or
|
||||||
|
* author attributions in that material or in the Appropriate Legal
|
||||||
|
* Notices displayed by works containing it.
|
||||||
|
* * Prohibiting misrepresentation of the origin of that material,
|
||||||
|
* or requiring that modified versions of such material be marked in
|
||||||
|
* reasonable ways as different from the original version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This file was entirely written by Duckbill */
|
||||||
|
|
||||||
#include <3ds.h>
|
#include <3ds.h>
|
||||||
#include "menus/cheats.h"
|
#include "menus/cheats.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
@ -16,7 +44,6 @@ typedef struct CheatProcessInfo {
|
|||||||
} CheatProcessInfo;
|
} CheatProcessInfo;
|
||||||
|
|
||||||
typedef struct CheatDescription {
|
typedef struct CheatDescription {
|
||||||
u64 titleId;
|
|
||||||
u32 active;
|
u32 active;
|
||||||
u32 keyActivated;
|
u32 keyActivated;
|
||||||
u32 keyCombo;
|
u32 keyCombo;
|
||||||
@ -26,7 +53,9 @@ typedef struct CheatDescription {
|
|||||||
} CheatDescription;
|
} CheatDescription;
|
||||||
|
|
||||||
CheatDescription* cheats[1024] = { 0 };
|
CheatDescription* cheats[1024] = { 0 };
|
||||||
u8 cheatBuffer[65536] = { 0 };
|
u8 cheatFileBuffer[16384] = { 0 };
|
||||||
|
u32 cheatFilePos = 0;
|
||||||
|
u8 cheatBuffer[16384] = { 0 };
|
||||||
|
|
||||||
static CheatProcessInfo cheatinfo[0x40] = { 0 };
|
static CheatProcessInfo cheatinfo[0x40] = { 0 };
|
||||||
|
|
||||||
@ -703,7 +732,7 @@ static bool Cheat_openLumaFile(IFile *file, const char *path) {
|
|||||||
return R_SUCCEEDED(Cheat_fileOpen(file, ARCHIVE_SDMC, path, FS_OPEN_READ));
|
return R_SUCCEEDED(Cheat_fileOpen(file, ARCHIVE_SDMC, path, FS_OPEN_READ));
|
||||||
}
|
}
|
||||||
|
|
||||||
CheatDescription* Cheats_allocCheat() {
|
CheatDescription* Cheat_allocCheat() {
|
||||||
CheatDescription* cheat;
|
CheatDescription* cheat;
|
||||||
if (cheatCount == 0) {
|
if (cheatCount == 0) {
|
||||||
cheat = (CheatDescription*) cheatBuffer;
|
cheat = (CheatDescription*) cheatBuffer;
|
||||||
@ -712,18 +741,175 @@ CheatDescription* Cheats_allocCheat() {
|
|||||||
cheat = (CheatDescription *) ((u8*) (prev) + sizeof(CheatDescription)
|
cheat = (CheatDescription *) ((u8*) (prev) + sizeof(CheatDescription)
|
||||||
+ sizeof(u64) * (prev->codesCount));
|
+ sizeof(u64) * (prev->codesCount));
|
||||||
}
|
}
|
||||||
|
cheat->active = 0;
|
||||||
|
cheat->codesCount = 0;
|
||||||
|
cheat->keyActivated = 0;
|
||||||
|
cheat->keyCombo = 0;
|
||||||
|
cheat->name[0] = '\0';
|
||||||
|
|
||||||
cheats[cheatCount] = cheat;
|
cheats[cheatCount] = cheat;
|
||||||
cheatCount++;
|
cheatCount++;
|
||||||
return cheat;
|
return cheat;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cheats_addCode(CheatDescription* cheat, u64 code) {
|
void Cheat_addCode(CheatDescription* cheat, u64 code) {
|
||||||
cheat->codes[cheat->codesCount] = code;
|
if (cheat) {
|
||||||
(cheat->codesCount)++;
|
cheat->codes[cheat->codesCount] = code;
|
||||||
|
(cheat->codesCount)++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadCheatsIntoMemory(u64 titleId) {
|
Result Cheat_readLine(char* line) {
|
||||||
|
Result res = 0;
|
||||||
|
|
||||||
|
char c = '\0';
|
||||||
|
u32 idx = 0;
|
||||||
|
while (R_SUCCEEDED(res)) {
|
||||||
|
c = cheatFileBuffer[cheatFilePos++];
|
||||||
|
res = c ? 0 : -1;
|
||||||
|
if (R_SUCCEEDED(res) && c != '\0') {
|
||||||
|
if (c == '\n' || c == '\r' || idx >= 1023) {
|
||||||
|
line[idx++] = '\0';
|
||||||
|
return idx;
|
||||||
|
} else {
|
||||||
|
line[idx++] = c;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (idx > 0) {
|
||||||
|
line[idx++] = '\0';
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Cheat_isCodeLine(const char *line) {
|
||||||
|
s32 len = strnlen(line, 1023);
|
||||||
|
if (len != 17) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (line[8] != ' ') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
char c = line[i];
|
||||||
|
if (!(('0' <= c && c <= '9') || ('A' <= c && c <= 'F')
|
||||||
|
|| ('a' <= c && c <= 'f'))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 9; i < 17; i++) {
|
||||||
|
char c = line[i];
|
||||||
|
if (!(('0' <= c && c <= '9') || ('A' <= c && c <= 'F')
|
||||||
|
|| ('a' <= c && c <= 'f'))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 Cheat_getCode(const char *line) {
|
||||||
|
u64 tmp = 0;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
char c = line[i];
|
||||||
|
u8 code = 0;
|
||||||
|
if ('0' <= c && c <= '9') {
|
||||||
|
code = c - '0';
|
||||||
|
}
|
||||||
|
if ('A' <= c && c <= 'F') {
|
||||||
|
code = c - 'A' + 10;
|
||||||
|
}
|
||||||
|
if ('a' <= c && c <= 'f') {
|
||||||
|
code = c - 'a' + 10;
|
||||||
|
}
|
||||||
|
tmp <<= 4;
|
||||||
|
tmp |= (code & 0xF);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 9; i < 17; i++) {
|
||||||
|
char c = line[i];
|
||||||
|
u8 code = 0;
|
||||||
|
if ('0' <= c && c <= '9') {
|
||||||
|
code = c - '0';
|
||||||
|
}
|
||||||
|
if ('A' <= c && c <= 'F') {
|
||||||
|
code = c - 'A' + 10;
|
||||||
|
}
|
||||||
|
if ('a' <= c && c <= 'f') {
|
||||||
|
code = c - 'a' + 10;
|
||||||
|
}
|
||||||
|
tmp <<= 4;
|
||||||
|
tmp |= (code & 0xF);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cheat_loadCheatsIntoMemory(u64 titleId) {
|
||||||
|
cheatCount = 0;
|
||||||
|
cheatTitleInfo = titleId;
|
||||||
|
hasKeyActivated = 0;
|
||||||
|
|
||||||
|
char path[] = "/luma/titles/0000000000000000/cheats.txt";
|
||||||
|
Cheat_progIdToStr(path + 28, titleId);
|
||||||
|
|
||||||
|
IFile file;
|
||||||
|
|
||||||
|
if (!Cheat_openLumaFile(&file, path))
|
||||||
|
return;
|
||||||
|
|
||||||
|
u64 fileLen = 0;
|
||||||
|
IFile_GetSize(&file, &fileLen);
|
||||||
|
if (fileLen > 16384) {
|
||||||
|
fileLen = 16384;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 total;
|
||||||
|
IFile_Read(&file, &total, cheatFileBuffer, fileLen);
|
||||||
|
IFile_Close(&file);
|
||||||
|
for (int i = fileLen; i < 16384; i++) {
|
||||||
|
cheatFileBuffer[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char line[1024] = { 0 };
|
||||||
|
strncpy(line, "asasd", 39);
|
||||||
|
Result res = 0;
|
||||||
|
CheatDescription* cheat = 0;
|
||||||
|
cheatFilePos = 0;
|
||||||
|
do {
|
||||||
|
res = Cheat_readLine(line);
|
||||||
|
if (R_SUCCEEDED(res)) {
|
||||||
|
s32 lineLen = strnlen(line, 1023);
|
||||||
|
if (!lineLen) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (line[0] == '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (Cheat_isCodeLine(line)) {
|
||||||
|
if (cheat) {
|
||||||
|
u64 tmp = Cheat_getCode(line);
|
||||||
|
Cheat_addCode(cheat, tmp);
|
||||||
|
if (((tmp >> 32) & 0xFFFFFFFF) == 0xDD000000) {
|
||||||
|
cheat->keyCombo |= (tmp & 0xFFF);
|
||||||
|
cheat->keyActivated = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cheat = Cheat_allocCheat();
|
||||||
|
strncpy(cheat->name, line, 39);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (R_SUCCEEDED(res));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadCheatsIntoMemoryBin(u64 titleId) {
|
||||||
cheatCount = 0;
|
cheatCount = 0;
|
||||||
cheatTitleInfo = titleId;
|
cheatTitleInfo = titleId;
|
||||||
hasKeyActivated = 0;
|
hasKeyActivated = 0;
|
||||||
@ -742,7 +928,7 @@ void loadCheatsIntoMemory(u64 titleId) {
|
|||||||
IFile_Read(&file, &total, buffer, 1);
|
IFile_Read(&file, &total, buffer, 1);
|
||||||
u8 cc = buffer[0];
|
u8 cc = buffer[0];
|
||||||
for (u8 i = 0; i < cc; i++) {
|
for (u8 i = 0; i < cc; i++) {
|
||||||
CheatDescription* cheat = Cheats_allocCheat();
|
CheatDescription* cheat = Cheat_allocCheat();
|
||||||
cheat->active = 0;
|
cheat->active = 0;
|
||||||
IFile_Read(&file, &total, buffer, 1);
|
IFile_Read(&file, &total, buffer, 1);
|
||||||
u8 nameLen = buffer[0];
|
u8 nameLen = buffer[0];
|
||||||
@ -759,7 +945,7 @@ void loadCheatsIntoMemory(u64 titleId) {
|
|||||||
for (u8 k = 1; k < 8; k++) {
|
for (u8 k = 1; k < 8; k++) {
|
||||||
tmp = (tmp << 8) + buffer[k];
|
tmp = (tmp << 8) + buffer[k];
|
||||||
}
|
}
|
||||||
Cheats_addCode(cheat, tmp);
|
Cheat_addCode(cheat, tmp);
|
||||||
if (((tmp >> 32) & 0xFFFFFFFF) == 0xDD000000) {
|
if (((tmp >> 32) & 0xFFFFFFFF) == 0xDD000000) {
|
||||||
cheat->keyCombo |= (tmp & 0xFFF);
|
cheat->keyCombo |= (tmp & 0xFFF);
|
||||||
cheat->keyActivated = 1;
|
cheat->keyActivated = 1;
|
||||||
@ -770,7 +956,7 @@ void loadCheatsIntoMemory(u64 titleId) {
|
|||||||
IFile_Close(&file);
|
IFile_Close(&file);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Cheats_GetCurrentPID(u64* titleId) {
|
u32 Cheat_GetCurrentPID(u64* titleId) {
|
||||||
s32 processAmount = Cheats_FetchProcessInfo();
|
s32 processAmount = Cheats_FetchProcessInfo();
|
||||||
|
|
||||||
s32 index = -1;
|
s32 index = -1;
|
||||||
@ -794,7 +980,7 @@ u32 Cheats_GetCurrentPID(u64* titleId) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cheats_applyKeyCheats(void) {
|
void Cheat_applyKeyCheats(void) {
|
||||||
if (!cheatCount) {
|
if (!cheatCount) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -803,7 +989,7 @@ void Cheats_applyKeyCheats(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
u64 titleId = 0;
|
u64 titleId = 0;
|
||||||
u32 pid = Cheats_GetCurrentPID(&titleId);
|
u32 pid = Cheat_GetCurrentPID(&titleId);
|
||||||
|
|
||||||
if (!titleId) {
|
if (!titleId) {
|
||||||
cheatCount = 0;
|
cheatCount = 0;
|
||||||
@ -828,11 +1014,11 @@ void Cheats_applyKeyCheats(void) {
|
|||||||
|
|
||||||
void RosalinaMenu_Cheats(void) {
|
void RosalinaMenu_Cheats(void) {
|
||||||
u64 titleId = 0;
|
u64 titleId = 0;
|
||||||
u32 pid = Cheats_GetCurrentPID(&titleId);
|
u32 pid = Cheat_GetCurrentPID(&titleId);
|
||||||
|
|
||||||
if (titleId != 0) {
|
if (titleId != 0) {
|
||||||
if (cheatTitleInfo != titleId) {
|
if (cheatTitleInfo != titleId) {
|
||||||
loadCheatsIntoMemory(titleId);
|
Cheat_loadCheatsIntoMemory(titleId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user