mirror of
https://github.com/RocketRobz/SavvyManager.git
synced 2025-06-18 17:15:34 -04:00
Add option to increase/decrease the amount of characters in SS4 Mewtube videos
ALSO: Bug fix
This commit is contained in:
parent
32c9a395b0
commit
d34b6e73dd
13
include/danceCpk.hpp
Normal file
13
include/danceCpk.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef DANCECPK_H
|
||||
#define DANCECPK_H
|
||||
|
||||
|
||||
#include <3ds.h>
|
||||
|
||||
extern void readDanceCpk(void);
|
||||
extern int danceGetPeopleAmount(const int video);
|
||||
extern void danceSetPeopleAmount(const int video, int amount);
|
||||
extern u16 danceGetCharacterId(const int video, const int slot);
|
||||
extern void danceWriteDataToCpk(const int video);
|
||||
|
||||
#endif // DANCECPK_H
|
@ -33,6 +33,7 @@ private:
|
||||
int videoShownFirst = 0;
|
||||
const int numberofVideos = 18;
|
||||
int characterShownFirst = 0;
|
||||
mutable int textTimer = 0;
|
||||
|
||||
bool showMessage = false;
|
||||
int messageNo = 0;
|
||||
|
BIN
romfs/dance.cpk
Normal file
BIN
romfs/dance.cpk
Normal file
Binary file not shown.
BIN
romfs/danceJ.cpk
Normal file
BIN
romfs/danceJ.cpk
Normal file
Binary file not shown.
450
source/danceCpk.cpp
Normal file
450
source/danceCpk.cpp
Normal file
@ -0,0 +1,450 @@
|
||||
#include <3ds.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h> // access
|
||||
#include "tonccpy.h"
|
||||
|
||||
extern u8 saveRegion[4];
|
||||
|
||||
static const char* danceCpkPath = "sdmc:/luma/titles/00040000001C2500/romfs/USA/Common/Scene/dance.cpk";
|
||||
char danceCpkData[0x21188];
|
||||
|
||||
void readDanceCpk(void) {
|
||||
switch (saveRegion[3]) {
|
||||
case CFG_REGION_EUR:
|
||||
case CFG_REGION_AUS:
|
||||
danceCpkPath = "sdmc:/luma/titles/00040000001C2600/romfs/EUR/Common/Scene/dance.cpk";
|
||||
break;
|
||||
case CFG_REGION_JPN:
|
||||
danceCpkPath = "sdmc:/luma/titles/000400000019F600/romfs/JPN/Common/Scene/dance.cpk";
|
||||
break;
|
||||
}
|
||||
|
||||
if (access(danceCpkPath, F_OK) != 0) {
|
||||
FILE* file = fopen((saveRegion[3] == CFG_REGION_JPN) ? "romfs:/danceJ.cpk" : "romfs:/dance.cpk", "rb");
|
||||
fread(danceCpkData, 1, (int)sizeof(danceCpkData), file);
|
||||
fclose(file);
|
||||
|
||||
file = fopen(danceCpkPath, "wb");
|
||||
fwrite(danceCpkData, 1, (saveRegion[3] == CFG_REGION_JPN) ? 0x19910 : 0x21188, file);
|
||||
fclose(file);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
FILE* file = fopen(danceCpkPath, "rb");
|
||||
fread(danceCpkData, 1, (int)sizeof(danceCpkData), file);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
static inline void writeDanceCpkDword(const u16* dst, u16 dword) {
|
||||
*(u16*)(danceCpkData + (u32)dst) = dword;
|
||||
}
|
||||
|
||||
static inline void writeDanceCpkWord(const u32* dst, u32 word) {
|
||||
*(u32*)(danceCpkData + (u32)dst) = word;
|
||||
}
|
||||
|
||||
int danceGetPeopleAmount(const int video) {
|
||||
if (saveRegion[3] == CFG_REGION_JPN) {
|
||||
return (int)danceCpkData[0x800 + 2 + 0xAC*video];
|
||||
}
|
||||
return (int)danceCpkData[0x800 + 2 + 0xB0*video];
|
||||
}
|
||||
|
||||
void danceSetPeopleAmount(const int video, int amount) {
|
||||
if (video == 12) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (amount < 1) amount = 1;
|
||||
if (amount > 3) amount = 3;
|
||||
|
||||
const u16* charIdLoc = (u16*)((u32)0x800 + 0x64 + (saveRegion[3] == CFG_REGION_JPN ? (0xAC*video) : (0xB0*video)));
|
||||
const u16* charAniLoc = (u16*)((u32)0x800 + 0x6A + (saveRegion[3] == CFG_REGION_JPN ? (0xAC*video) : (0xB0*video)));
|
||||
const u32* groupFormLoc = (u32*)((u32)0x800 + 0x70 + (saveRegion[3] == CFG_REGION_JPN ? (0xAC*video) : (0xB0*video)));
|
||||
|
||||
if (saveRegion[3] == CFG_REGION_JPN) {
|
||||
danceCpkData[0x800 + 2 + 0xAC*video] = amount;
|
||||
} else {
|
||||
danceCpkData[0x800 + 2 + 0xB0*video] = amount;
|
||||
}
|
||||
amount--;
|
||||
|
||||
switch (video) {
|
||||
case 0: // Open Plaza: Flying Shiny Day
|
||||
default:
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x05DD);
|
||||
writeDanceCpkDword(charIdLoc+2, 0x05DC);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05C5);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05C6);
|
||||
writeDanceCpkWord(groupFormLoc, 0xA194082A);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x43);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05AA);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05AB);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x44);
|
||||
writeDanceCpkWord(groupFormLoc, 0x9C67D93E);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1: // Open Plaza: Ready Go!!
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x05DD);
|
||||
writeDanceCpkDword(charIdLoc+2, 0x05DC);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05AE);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05AF);
|
||||
writeDanceCpkWord(groupFormLoc, 0xA1940829);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x43);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x057C);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x057C);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x44);
|
||||
writeDanceCpkWord(groupFormLoc, 0x9C67D93E);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2: // Outdoor Festival: Flying Shiny Day
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x05DD);
|
||||
writeDanceCpkDword(charIdLoc+2, 0x05DC);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05C5);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05C6);
|
||||
writeDanceCpkWord(groupFormLoc, 0x9C67D939);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x43);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05AA);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05AB);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x44);
|
||||
writeDanceCpkWord(groupFormLoc, 0x9C67D93E);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3: // Outdoor Festival: Ready Go!!
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x05DD);
|
||||
writeDanceCpkDword(charIdLoc+2, 0x05DC);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05AE);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05AF);
|
||||
writeDanceCpkWord(groupFormLoc, 0x9C67D939);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x43);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x057C);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x057C);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x44);
|
||||
writeDanceCpkWord(groupFormLoc, 0x9C67D93E);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: // Concert Hall: Higher Higher
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D1);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x43);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x44);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D2);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5: // Concert Hall: To the Future
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x05DD);
|
||||
writeDanceCpkDword(charIdLoc+2, 0x05DC);
|
||||
writeDanceCpkDword(charAniLoc, 0x057E);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05B2);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05B3);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D1);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x43);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05B4);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x44);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05B4);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D2);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc, 0x05C4);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6: // Charity Stage: Higher Higher
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc, 0x057D);
|
||||
writeDanceCpkDword(charAniLoc+1, 0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D1);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x06);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x07);
|
||||
writeDanceCpkDword(charAniLoc, 0x057D);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05B0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05B1);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D2);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc, 0x05C2);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05C3);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 7: // Charity Stage: To the Future
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc, 0x057E);
|
||||
writeDanceCpkDword(charAniLoc+1, 0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D1);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x06);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05B4);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x07);
|
||||
writeDanceCpkDword(charAniLoc, 0x057E);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05B4);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05B4);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D2);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc, 0x05C4);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3DF);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 8: // Live Music Club: Wings
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x05DD);
|
||||
writeDanceCpkDword(charIdLoc+2, 0x05DC);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05AC);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05AD);
|
||||
writeDanceCpkWord(groupFormLoc, 0xBFA664C4);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x52);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x057A);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x057A);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x53);
|
||||
writeDanceCpkWord(groupFormLoc, 0x3E89C708);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 9: // Live Music Club: Beautiful
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x05DD);
|
||||
writeDanceCpkDword(charIdLoc+2, 0x05DC);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05AC);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05AD);
|
||||
writeDanceCpkWord(groupFormLoc, 0xBFA664C4);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x52);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05B5);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05B6);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x53);
|
||||
writeDanceCpkWord(groupFormLoc, 0x3E89C708);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 10: // Celestial Hotel: Make Me Glow
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xE3C262CE);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x52);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05BD);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x05BE);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x53);
|
||||
writeDanceCpkWord(groupFormLoc, 0xE3C262CF);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 11: // Celestial Hotel: Glowing Moon
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xE3C262CE);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x52);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x0581);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x0581);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x53);
|
||||
writeDanceCpkWord(groupFormLoc, 0xE3C262CF);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 12: // Alinatron On-Air: Fight For Your Style
|
||||
break;
|
||||
case 13: // Promo Video: Twinkle Fantasia
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0x6DC190BE);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x54);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x057B);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x057B);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x55);
|
||||
writeDanceCpkWord(groupFormLoc, 0x7D054615);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 14: // Cinema: Maria
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0);
|
||||
writeDanceCpkDword(charAniLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0x7D054614);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x54);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x057B);
|
||||
writeDanceCpkDword(charAniLoc+2, 0x057B);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x55);
|
||||
writeDanceCpkWord(groupFormLoc, 0x7D054615);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 15: // Concert Hall: Dosukoi Koi Koi (Break It Down)
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0x7D054614);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x54);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x55);
|
||||
writeDanceCpkWord(groupFormLoc, 0x7D054615);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 16: // Concert Hall: Radiance
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0x7D054614);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x54);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x55);
|
||||
writeDanceCpkWord(groupFormLoc, 0x7D05461A);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 17: // Open Plaza: Ring a Ding
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05C0);
|
||||
writeDanceCpkWord(groupFormLoc, 0xA194082A);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x02);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x03);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05C0);
|
||||
writeDanceCpkWord(groupFormLoc, 0x20776A6F);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x05BF);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 18: // Open Plaza: Bravo
|
||||
if (amount == 0) {
|
||||
writeDanceCpkDword(charIdLoc+1, 0);
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x0589);
|
||||
writeDanceCpkWord(groupFormLoc, 0xA194082A);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+1, 0x01);
|
||||
if (amount == 2) {
|
||||
writeDanceCpkDword(charIdLoc+2, 0x03);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x0589);
|
||||
writeDanceCpkWord(groupFormLoc, 0x9F5ACCA1);
|
||||
} else {
|
||||
writeDanceCpkDword(charIdLoc+2, 0);
|
||||
writeDanceCpkDword(charAniLoc+1, 0x0588);
|
||||
writeDanceCpkWord(groupFormLoc, 0xFE21E3D0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
u16 danceGetCharacterId(const int video, const int slot) {
|
||||
return *(u16*)((u32)danceCpkData + 0x800 + (saveRegion[3] == CFG_REGION_JPN ? (0xAC*video) : (0xB0*video)) + 0x64 + slot*sizeof(u16));
|
||||
}
|
||||
|
||||
void danceWriteDataToCpk(const int video) {
|
||||
u32 charIdLoc = 0x800 + (saveRegion[3] == CFG_REGION_JPN ? (0xAC*video) : (0xB0*video));
|
||||
|
||||
FILE* file = fopen(danceCpkPath, "rb+");
|
||||
fseek(file, charIdLoc, SEEK_SET);
|
||||
fwrite(danceCpkData + charIdLoc, 1, 0xAC, file);
|
||||
fclose(file);
|
||||
}
|
@ -12,6 +12,7 @@
|
||||
#include "gameSelect.hpp"
|
||||
#include "inifile.h"
|
||||
#include "rocketRobz.hpp"
|
||||
#include "danceCpk.hpp"
|
||||
#include "savedata.h"
|
||||
#include "screen.hpp"
|
||||
#include "sound.h"
|
||||
@ -201,38 +202,6 @@ int main()
|
||||
mkdir("sdmc:/luma", 0777);
|
||||
mkdir("sdmc:/luma/titles", 0777);
|
||||
|
||||
switch (sysRegion) {
|
||||
default:
|
||||
// Style Savvy: Trendsetters folders
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
case CFG_REGION_EUR:
|
||||
case CFG_REGION_AUS:
|
||||
// New Style Boutique folders
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
case CFG_REGION_JPN:
|
||||
// Wagamama Fashion: Girls Mode - Yokubari Sengen folders
|
||||
mkdir("sdmc:/luma/titles/000400000005D100", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000005D100/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000005D100/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000005D100/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
case CFG_REGION_KOR:
|
||||
// Girls Style: Paesyeon Lideo Seon-eon! folders
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
}
|
||||
|
||||
// Style Savvy: Fashion Forward folders
|
||||
//mkdir("sdmc:/luma/titles/0004000000196500", 0777);
|
||||
|
||||
@ -362,6 +331,39 @@ int main()
|
||||
saveRegion[1] = CFG_REGION_KOR;
|
||||
break;
|
||||
}
|
||||
if (R_SUCCEEDED(res)) {
|
||||
switch (saveRegion[1]) {
|
||||
default:
|
||||
// Style Savvy: Trendsetters folders
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9100/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
case CFG_REGION_EUR:
|
||||
case CFG_REGION_AUS:
|
||||
// New Style Boutique folders
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000A9000/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
case CFG_REGION_JPN:
|
||||
// Wagamama Fashion: Girls Mode - Yokubari Sengen folders
|
||||
mkdir("sdmc:/luma/titles/000400000005D100", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000005D100/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000005D100/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000005D100/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
case CFG_REGION_KOR:
|
||||
// Girls Style: Paesyeon Lideo Seon-eon! folders
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00/romfs/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000000C4F00/romfs/Common/Sound", 0777);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
res = archiveMount(ARCHIVE_USER_SAVEDATA, {PATH_BINARY, 12, path3}, "ss3"); // Read from digital version
|
||||
@ -408,6 +410,38 @@ int main()
|
||||
saveRegion[3] = CFG_REGION_JPN;
|
||||
break;
|
||||
}
|
||||
if (R_SUCCEEDED(res)) {
|
||||
switch (saveRegion[3]) {
|
||||
default:
|
||||
// Style Savvy: Styling Star folders
|
||||
mkdir("sdmc:/luma/titles/00040000001C2500", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2500/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2500/romfs/USA", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2500/romfs/USA/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2500/romfs/USA/Common/Scene", 0777);
|
||||
readDanceCpk();
|
||||
break;
|
||||
case CFG_REGION_EUR:
|
||||
case CFG_REGION_AUS:
|
||||
// New Style Boutique 3: Styling Star folders
|
||||
mkdir("sdmc:/luma/titles/00040000001C2600", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2600/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2600/romfs/EUR", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2600/romfs/EUR/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/00040000001C2600/romfs/EUR/Common/Scene", 0777);
|
||||
readDanceCpk();
|
||||
break;
|
||||
case CFG_REGION_JPN:
|
||||
// Girls Mode 4: Star Stylist
|
||||
mkdir("sdmc:/luma/titles/000400000019F600", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000019F600/romfs", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000019F600/romfs/JPN", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000019F600/romfs/JPN/Common", 0777);
|
||||
mkdir("sdmc:/luma/titles/000400000019F600/romfs/JPN/Common/Scene", 0777);
|
||||
readDanceCpk();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ss2SaveFound = (access(ss2SavePath, F_OK) == 0);
|
||||
ss3SaveFound = (access(ss3SavePath, F_OK) == 0);
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "screenvars.h"
|
||||
#include "whatToDo.hpp"
|
||||
|
||||
#include "danceCpk.hpp"
|
||||
#include "savedata.h"
|
||||
|
||||
#include "ss4charnames.h"
|
||||
@ -50,28 +51,6 @@ static const char* songTitle[] = {
|
||||
"Bravo",
|
||||
};
|
||||
|
||||
static const int peopleAmount[] = {
|
||||
1,
|
||||
1,
|
||||
3,
|
||||
1,
|
||||
3,
|
||||
1,
|
||||
2,
|
||||
2,
|
||||
1,
|
||||
3,
|
||||
3,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
3,
|
||||
3,
|
||||
3,
|
||||
3,
|
||||
};
|
||||
|
||||
extern const char* getSS4CharName(u16 charId);
|
||||
|
||||
MewtubeChange::MewtubeChange() {
|
||||
@ -377,9 +356,10 @@ void MewtubeChange::Draw(void) const {
|
||||
}
|
||||
i2 += 48;
|
||||
}
|
||||
textTimer = 0;
|
||||
} else if (subScreenMode == 1) {
|
||||
Gui::DrawString(8, 8, 0.50, BLACK, "Select the character you want to change.");
|
||||
for (int i = 0; i < peopleAmount[cursorPosition[0]]; i++) {
|
||||
for (int i = 0; i < danceGetPeopleAmount(cursorPosition[0]); i++) {
|
||||
u16 charId = getSS4MewtubeCharacterId(cursorPosition[0], 3+i);
|
||||
u16 orgCharId = getSS4MewtubeCharacterId(cursorPosition[0], i);
|
||||
GFX::DrawSprite(sprites_item_button_idx, 16, i2-20);
|
||||
@ -395,9 +375,13 @@ void MewtubeChange::Draw(void) const {
|
||||
i2 += 48;
|
||||
}
|
||||
u16 charId = getSS4MewtubeCharacterId(cursorPosition[0], 3+cursorPosition[1]);
|
||||
if (charId != 0) {
|
||||
Gui::DrawString(88, 201, 0.50, BLACK, ": Remove");
|
||||
if (cursorPosition[0] != 12 && textTimer > iFps*3) {
|
||||
Gui::DrawString(88, 201, 0.50, BLACK,"LEFT/RIGHT: Remove/Add");
|
||||
} else if (charId != 0) {
|
||||
Gui::DrawString(88, 201, 0.50, BLACK, ": Blank out");
|
||||
}
|
||||
textTimer++;
|
||||
if (textTimer > iFps*6 || charId == 0) textTimer = 0;
|
||||
Gui::DrawString(88, 217, 0.50, BLACK, "SELECT: Revert to original");
|
||||
} else {
|
||||
char chrCounter[24];
|
||||
@ -411,6 +395,7 @@ void MewtubeChange::Draw(void) const {
|
||||
Gui::DrawString(32, i2+8, 0.60, BLACK, songTitle[i]);
|
||||
i2 += 48;
|
||||
}
|
||||
textTimer = 0;
|
||||
}
|
||||
|
||||
GFX::DrawSprite(sprites_button_shadow_idx, 5, 199);
|
||||
@ -564,11 +549,45 @@ void MewtubeChange::Logic(u32 hDown, u32 hDownRepeat, u32 hHeld, touchPosition t
|
||||
sndHighlight();
|
||||
cursorPosition[1]++;
|
||||
cursorPositionOnScreen[1]++;
|
||||
if (cursorPosition[1] > peopleAmount[cursorPosition[0]]-1) {
|
||||
cursorPosition[1] = peopleAmount[cursorPosition[0]]-1;
|
||||
if (cursorPosition[1] > danceGetPeopleAmount(cursorPosition[0])-1) {
|
||||
cursorPosition[1] = danceGetPeopleAmount(cursorPosition[0])-1;
|
||||
}
|
||||
if (cursorPositionOnScreen[1] > peopleAmount[cursorPosition[0]]-1) {
|
||||
cursorPositionOnScreen[1] = peopleAmount[cursorPosition[0]]-1;
|
||||
if (cursorPositionOnScreen[1] > danceGetPeopleAmount(cursorPosition[0])-1) {
|
||||
cursorPositionOnScreen[1] = danceGetPeopleAmount(cursorPosition[0])-1;
|
||||
}
|
||||
}
|
||||
if ((hDown & KEY_LEFT) && cursorPosition[0] != 12) {
|
||||
int peopleAmount = danceGetPeopleAmount(cursorPosition[0]);
|
||||
peopleAmount--;
|
||||
if (peopleAmount < 1) {
|
||||
peopleAmount = 1;
|
||||
} else {
|
||||
sndHighlight();
|
||||
danceSetPeopleAmount(cursorPosition[0], peopleAmount);
|
||||
danceWriteDataToCpk(cursorPosition[0]);
|
||||
if (getSS4MewtubeCharacterId(cursorPosition[0], peopleAmount) != 0) {
|
||||
writeSS4MewtubeCharacterId(0, cursorPosition[0], peopleAmount);
|
||||
writeSS4MewtubeCharacter(cursorPosition[0], peopleAmount);
|
||||
writeSS4MewtubeCharacterToSave(cursorPosition[0], peopleAmount); // Write to save data
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((hDown & KEY_RIGHT) && cursorPosition[0] != 12) {
|
||||
int peopleAmount = danceGetPeopleAmount(cursorPosition[0]);
|
||||
peopleAmount++;
|
||||
if (peopleAmount > 3) {
|
||||
peopleAmount = 3;
|
||||
} else {
|
||||
sndHighlight();
|
||||
danceSetPeopleAmount(cursorPosition[0], peopleAmount);
|
||||
danceWriteDataToCpk(cursorPosition[0]);
|
||||
if (getSS4MewtubeCharacterId(cursorPosition[0], peopleAmount-1) == 0) {
|
||||
u16 charId = danceGetCharacterId(cursorPosition[0], peopleAmount-1);
|
||||
readSS4Character(charId);
|
||||
writeSS4MewtubeCharacterId(charId, cursorPosition[0], peopleAmount-1);
|
||||
writeSS4MewtubeCharacter(cursorPosition[0], peopleAmount-1);
|
||||
writeSS4MewtubeCharacterToSave(cursorPosition[0], peopleAmount-1); // Write to save data
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user