eCDP-Serial-Code/Vita/menu.c

276 lines
5.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "menu.h"
#include "draw.h"
#include "eCDP.h"
#include "sound.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vitasdk.h>
static int pos = 0;
static char StoreNo[64];
static char SerialNo[64];
static char MacAddress[64];
static char OutputCode[64];
static EcdpKeygenState state;
void randomize_octlets(char* octlets, size_t numbOctlets){
for(int i = 0; i < numbOctlets; i++){
int rng = (rand() % 0xF);
if(rng <= 9)
octlets[i] = ('0' + rng);
else
octlets[i] = ('A' + rng-9);
}
octlets[numbOctlets+1] = 0;
}
void clear_data(char* digits, size_t numbDigits){
memset(digits, '0', numbDigits);
}
void randomize_digits(char* digits, size_t numbDigits){
for(int i = 0; i < numbDigits; i++)
digits[i] = ('0' + (rand() % 10));
digits[numbDigits+1] = 0;
}
void wait_for_release(SceCtrlData oldPad){
SceCtrlData curPad;
memset(&curPad, 0, sizeof(curPad));
sceCtrlPeekBufferPositive(0, &curPad, 1);
do {
sceCtrlPeekBufferPositive(0, &curPad, 1);
} while(curPad.buttons == oldPad.buttons);
}
SceCtrlData get_buttons() {
SceCtrlData pad;
memset(&pad, 0, sizeof(pad));
sceCtrlPeekBufferPositive(0, &pad, 1);
if(pad.buttons != 0)
wait_for_release(pad);
return pad;
}
void handle_mac_picker(char* octlets, EcdpKeygenState nextState){
SceCtrlData pad = get_buttons();
size_t totalOctlets = strlen(octlets);
if(pos < 0) pos = 0;
if(pos >= totalOctlets) pos = totalOctlets-1;
char octlet = octlets[pos];
switch(pad.buttons){
case SCE_CTRL_UP:
play_type_se();
octlet++;
break;
case SCE_CTRL_DOWN:
play_type_se();
octlet--;
break;
case SCE_CTRL_LEFT:
play_type_se();
pos--;
return;
case SCE_CTRL_RIGHT:
play_type_se();
pos++;
return;
case SCE_CTRL_TRIANGLE:
play_confirm_se();
randomize_octlets(octlets, totalOctlets);
return;
case SCE_CTRL_CIRCLE:
play_back_se();
clear_data(octlets, totalOctlets);
return;
case SCE_CTRL_CROSS:
play_confirm_se();
state = nextState;
pos = 0;
return;
}
if(octlet == '9' + 1) octlet = 'A';
if(octlet == 'A' - 1) octlet = '9';
if(octlet > 'F') octlet = '0';
if(octlet < '0') octlet = 'F';
octlets[pos] = octlet;
}
void handle_number_picker(char* digits, EcdpKeygenState nextState){
SceCtrlData pad = get_buttons();
size_t totalDigits = strlen(digits);
if(pos < 0) pos = 0;
if(pos >= totalDigits) pos = totalDigits-1;
char digit = digits[pos];
switch(pad.buttons){
case SCE_CTRL_UP:
play_type_se();
digit++;
break;
case SCE_CTRL_DOWN:
play_type_se();
digit--;
break;
case SCE_CTRL_LEFT:
play_type_se();
pos--;
return;
case SCE_CTRL_RIGHT:
play_type_se();
pos++;
return;
case SCE_CTRL_TRIANGLE:
play_confirm_se();
randomize_digits(digits, totalDigits);
return;
case SCE_CTRL_CIRCLE:
play_back_se();
clear_data(digits, totalDigits);
return;
case SCE_CTRL_CROSS:
play_confirm_se();
state = nextState;
pos = 0;
return;
}
if(digit > '9') digit = '0';
if(digit < '0') digit = '9';
digits[pos] = digit;
}
void init_menus(){
pos = 0;
memset(StoreNo, 0, sizeof(StoreNo));
memset(SerialNo, 0, sizeof(SerialNo));
memset(MacAddress, 0, sizeof(MacAddress));
memset(OutputCode, 0, sizeof(OutputCode));
state = INPUT_MAC_ADDRESS;
clear_data(StoreNo, 6);
clear_data(SerialNo, 6);
clear_data(MacAddress, 12);
}
void process_enter_mgr_no(){
handle_number_picker(StoreNo, INPUT_SERIAL_NO);
}
void process_enter_serial_no(){
handle_number_picker(SerialNo, OUTPUT_CODE);
}
void process_enter_mac_address(){
handle_mac_picker(MacAddress, INPUT_MGR_NO);
}
void process_output_code(){
SceCtrlData pad = get_buttons();
switch(pad.buttons){
case SCE_CTRL_CROSS:
play_confirm_se();
init_menus();
break;
case SCE_CTRL_CIRCLE:
play_back_se();
sceKernelDelayThread(260000);
sceKernelExitProcess(0);
break;
}
}
void draw_end(){
draw_text_center(500, "× Generate Another / ○ Close Application");
}
void draw_controls(){
draw_text_center(500, "↑↓← → Change Input / △ Randomize Input / ○ Clear Input / × Confirm Input");
}
void draw_enter_mgr_no(){
draw_text_center(260, "Enter Store Number:");
draw_number_picker(280, StoreNo, pos);
draw_controls();
}
void draw_enter_serial_no(){
draw_text_center(260, "Enter Serial Number of DS Card:");
draw_number_picker(280, SerialNo, pos);
draw_controls();
}
void draw_enter_mac_addr(){
draw_text_center(260, "Enter DS Mac Address:");
draw_mac_picker(280, MacAddress, pos);
draw_controls();
}
void draw_output_code(){
draw_text_center(260, "Donald McDonald speaks with a cryptic message:");
draw_number_picker(280, OutputCode, -1);
draw_end();
}
void show_menu(){
switch(state){
case INPUT_MGR_NO:
draw_enter_mgr_no();
break;
case INPUT_SERIAL_NO:
draw_enter_serial_no();
break;
case INPUT_MAC_ADDRESS:
draw_enter_mac_addr();
break;
case OUTPUT_CODE:
draw_output_code();
break;
}
}
void process_menu() {
switch(state){
case INPUT_MGR_NO:
process_enter_mgr_no();
break;
case INPUT_SERIAL_NO:
process_enter_serial_no();
break;
case INPUT_MAC_ADDRESS:
process_enter_mac_address();
break;
case OUTPUT_CODE:
process_output_code();
break;
}
if(state == OUTPUT_CODE) {
ecdp_keygen(MacAddress, StoreNo, SerialNo, OutputCode, sizeof(OutputCode));
}
}