Add option to increase/decrease the amount of characters in SS4 Mewtube videos

ALSO: Bug fix
This commit is contained in:
RocketRobz 2021-11-08 23:52:19 -07:00
parent 32c9a395b0
commit d34b6e73dd
7 changed files with 578 additions and 61 deletions

13
include/danceCpk.hpp Normal file
View 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

View File

@ -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

Binary file not shown.

BIN
romfs/danceJ.cpk Normal file

Binary file not shown.

450
source/danceCpk.cpp Normal file
View 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);
}

View 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);

View File

@ -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
}
}
}
}