int xmain(int ra) { SetupCallbacks(); pgInit(); pgScreenFrame(1, 0); pgFillvram(0); mainImpl(); pgWaitVn(500); sceKernelExitGame(); return 0; }
void Draw_All(void) { int i,col; pgFillvram(0); strncpy(path_tmp, doomwaddir2, 128); mh_print(5, 5, "Please choose a game to launch (Press Circle to select)", rgb2col(255, 255, 255), 0, 0); mh_print(310, 245, "Vita Doom - Release 1", rgb2col(255, 0, 0), 0, 0); mh_print(245, 270, "based on DoomPSP-0.04 S.S. b5", rgb2col(255, 255, 0), 0, 0); /*char errtext[64]; sprintf(errtext, "Error: 0x%x", res); mh_print(10, 300, errtext, RGBA8(255, 0, 0, 2555), 0, 0);*/ if (dlist_num == 0) { mh_print(32, 40, "No WADs found... Put WADs in:", rgb2col(255, 0, 0), 0, 0); mh_print(32, 60, path_tmp, rgb2col(255, 0, 0), 0, 0); } else { i = dlist_start; while (i < (dlist_start + PATHLIST_H)) { if (i < dlist_num) { col = rgb2col(255, 255, 255); if (dlist[i].type & TYPE_DIR) { col = rgb2col(255, 255, 0); } if (i == dlist_curpos) { col = rgb2col(255, 0, 0); } strncpy(path_tmp, dlist[i].name, 40); mh_print(32, ((i - dlist_start) + 2) * 20, path_tmp, col, 0, 0); } i++; } } pgScreenFlipV(); }
void ButtonChange(char tempstring[][MAX_TEMP_STRING], const char* buttons[], const char* tempkeystring[]) { pgFillvram(0); int i = 0; int die = 0; int col; int tempact = 0; char tempselect[27]; for (i=0; i<MAX_CONTROL; i++) { if (d_controls[i] == CKEY_WEAPON) die = 0; else if (d_controls[i] == KEY_ENTER) die = 1; else if (d_controls[i] == KEY_ESCAPE) die = 2; else if (d_controls[i] == ' ') die = 3; else if (d_controls[i] == CKEY_MOVE) die = 4; else if (d_controls[i] == KEY_TAB) die = 5; else if (d_controls[i] == KEY_RSHIFT) die = 6; else if (d_controls[i] == KEY_RCTRL) die = 7; else if (d_controls[i] == ',') die = 8; else if (d_controls[i] == '.') die = 9; else if (d_controls[i] == 222) die = 10; else if (d_controls[i] == 266) die = 11; else if (d_controls[i] == 333) die = 12; col = rgb2col(255,255,255); if (i==d_clist_curpos) { col = rgb2col(255,0,0); } sprintf(tempstring[i], "%s = %s", buttons[i], tempkeystring[die]); mh_print(5, ((i + 1) * 20), tempstring[i], col, 0, 0); } if (d_controls[d_clist_curpos] == CKEY_WEAPON) die = 0; else if (d_controls[d_clist_curpos] == KEY_ENTER) die = 1; else if (d_controls[d_clist_curpos] == KEY_ESCAPE) die = 2; else if (d_controls[d_clist_curpos] == ' ') die = 3; else if (d_controls[d_clist_curpos] == CKEY_MOVE) die = 4; else if (d_controls[d_clist_curpos] == KEY_TAB) die = 5; else if (d_controls[d_clist_curpos] == KEY_RSHIFT) die = 6; else if (d_controls[d_clist_curpos] == KEY_RCTRL) die = 7; else if (d_controls[d_clist_curpos] == ',') die = 8; else if (d_controls[d_clist_curpos] == '.') die = 9; else if (d_controls[d_clist_curpos] == 222) die = 10; else if (d_controls[d_clist_curpos] == 266) die = 11; else if (d_controls[d_clist_curpos] == 333) die = 12; sprintf(tempselect, "Make selection for %s", tempkeystring[die]); mh_print(5, 255, tempselect, rgb2col(50, 255, 50), 0, 0); pgScreenFlipV(); unsigned long key; control_bef_ctl = now_pad; while (1) { key = Read_Key3(); if (key != 0) break; pgWaitV(); } if (d_controls[die] == CKEY_WEAPON || d_controls[die] == CKEY_MOVE) { tempact = d_controls[4]; d_controls[4] = d_controls[0]; d_controls[0] = tempact; if (d_controls[0] == CKEY_MOVE) { analog = 1; } else { analog = 0; } } else if (key & SCE_CTRL_START) { tempact = d_controls[1]; d_controls[1] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } else if (key & SCE_CTRL_SELECT) { tempact = d_controls[2]; d_controls[2] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } else if (key & SCE_CTRL_CROSS) { tempact = d_controls[3]; d_controls[3] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } else if (key & SCE_CTRL_TRIANGLE) { tempact = d_controls[5]; d_controls[5] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } else if (key & SCE_CTRL_SQUARE) { tempact = d_controls[6]; d_controls[6] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } else if (key & SCE_CTRL_CIRCLE) { tempact = d_controls[7]; d_controls[7] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } else if (key & SCE_CTRL_LTRIGGER) { tempact = d_controls[8]; d_controls[8] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } else if (key & SCE_CTRL_RTRIGGER) { tempact = d_controls[9]; d_controls[9] = d_controls[d_clist_curpos]; d_controls[d_clist_curpos] = tempact; } control_bef_ctl = key; }
void NewPrompter() { char* buttons[MAX_CONTROL]; char tempstring[MAX_CONTROL][MAX_TEMP_STRING]; char* tempkeystring[MAX_CONTROL+2]; tempkeystring[0] = "WEAPON"; tempkeystring[1] = "ENTER"; tempkeystring[2] = "ESC"; tempkeystring[3] = "USE"; tempkeystring[4] = "MOVE"; tempkeystring[5] = "MAP"; tempkeystring[6] = "RUN"; tempkeystring[7] = "FIRE"; tempkeystring[8] = "M_LEFT"; tempkeystring[9] = "M_RIGHT"; //tempkeystring[10] = "222"; //tempkeystring[11] = "266"; //tempkeystring[12] = "333"; buttons[0] = "ANALOG "; buttons[1] = "START "; buttons[2] = "SELECT "; buttons[3] = "CROSS "; buttons[4] = "DPAD "; buttons[5] = "TRIANGLE "; buttons[6] = "SQUARE "; buttons[7] = "CIRCLE "; buttons[8] = "L_TRIG "; buttons[9] = "R_TRIG "; //buttons[10] = "CPU_CLOCK"; control_bef_ctl = 0; pgScreenFrame(2,0); pgFillvram(0); pgScreenFlipV(); while (1) { pgFillvram(0); int i = 0; int die = 0; int col; for (i=0; i<MAX_CONTROL; i++) { if (d_controls[i] == CKEY_WEAPON) die = 0; else if (d_controls[i] == KEY_ENTER) die = 1; else if (d_controls[i] == KEY_ESCAPE) die = 2; else if (d_controls[i] == ' ') die = 3; else if (d_controls[i] == CKEY_MOVE) die = 4; else if (d_controls[i] == KEY_TAB) die = 5; else if (d_controls[i] == KEY_RSHIFT) die = 6; else if (d_controls[i] == KEY_RCTRL) die = 7; else if (d_controls[i] == ',') die = 8; else if (d_controls[i] == '.') die = 9; else if (d_controls[i] == 222) die = 10; else if (d_controls[i] == 266) die = 11; else if (d_controls[i] == 333) die = 12; col = rgb2col(255,255,255); if (i==d_clist_curpos) { col = rgb2col(255,0,0); } sprintf(tempstring[i], "%s = %s",buttons[i],tempkeystring[die]); mh_print(5, ((i + 2) * 20), tempstring[i], col, 0, 0); } if (d_clist_curpos != 10) { mh_print(5,255,"X: Exit | O: Change | Triangle: Save To File",rgb2col(50,255,50),0,0); } else { mh_print(5,255,"X: Exit | O: Increment | Square: Decrement | Triangle: Save To File",rgb2col(50,255,50),0,0); } pgScreenFlipV(); if (control_bef_ctl == 0) { Read_Key2(); pgWaitV(); } else { unsigned long ankey; while (1) { ankey = Read_Key3(); if (ankey != 0) break; pgWaitV(); } new_pad = old_pad = now_pad = ankey; control_bef_ctl = 0; } if (new_pad & SCE_CTRL_UP) { if (d_clist_curpos > 0) { d_clist_curpos--; if (d_clist_curpos < d_clist_start) { d_clist_start = d_clist_curpos; } } } else if (new_pad & SCE_CTRL_DOWN) { if (d_clist_curpos < (MAX_CONTROL-1)) { d_clist_curpos++; if (d_clist_curpos >= (d_clist_start+MAX_CONTROL-1)) { d_clist_start++; } } } else if (new_pad & SCE_CTRL_CIRCLE) { if (d_clist_curpos != 10) { ButtonChange(tempstring, buttons, tempkeystring); } else { change_cpu_clock(1); // increment } } else if (new_pad & SCE_CTRL_TRIANGLE) { SaveToFile(tempstring, buttons, tempkeystring); } else if (new_pad & SCE_CTRL_SQUARE) { if (d_clist_curpos == 10) change_cpu_clock(0); // decrement } else if (new_pad & SCE_CTRL_CROSS) { break; } } }
void InputUpdatePad(void) { SceCtrlData paddata; static boolean bPushFlag = FALSE; static boolean bTogglePushFlag = FALSE; g_PadBit[0]=0; stKeyState.bRapidA = FALSE; stKeyState.bRapidB = FALSE; sceCtrlPeekBufferPositive(&paddata, 1); // Analog pad state if (paddata.Ly > UPPER_THRESHOLD) { paddata.Buttons |= PSP_CTRL_A_DOWN; // DOWN(analog) } else if (paddata.Ly < LOWER_THRESHOLD) { paddata.Buttons |= PSP_CTRL_A_UP; // UP(analog) } if (paddata.Lx < LOWER_THRESHOLD) { paddata.Buttons |= PSP_CTRL_A_LEFT; // LEFT(analog) } else if (paddata.Lx > UPPER_THRESHOLD) { paddata.Buttons |= PSP_CTRL_A_RIGHT; // RIGHT(analog) } // Hold if (paddata.Buttons & PSP_CTRL_HOLD) { paddata.Buttons = 0; } // for Enter Menu now_pad = paddata.Buttons; // ↑↓←→ if((paddata.Buttons&setting.key_config[0])==setting.key_config[0] && setting.key_config[0]) g_PadBit[0] |= NES_UP; if((paddata.Buttons&setting.key_config[1])==setting.key_config[1] && setting.key_config[1]) g_PadBit[0] |= NES_DOWN; if((paddata.Buttons&setting.key_config[2])==setting.key_config[2] && setting.key_config[2]) g_PadBit[0] |= NES_LEFT; if((paddata.Buttons&setting.key_config[3])==setting.key_config[3] && setting.key_config[3]) g_PadBit[0] |= NES_RIGHT; // A、B AB連射 if((paddata.Buttons&setting.key_config[6])==setting.key_config[6] && setting.key_config[6]) stKeyState.bRapidA = TRUE; else if((paddata.Buttons&setting.key_config[4])==setting.key_config[4] && setting.key_config[4]) g_PadBit[0] |= NES_A; if((paddata.Buttons&setting.key_config[7])==setting.key_config[7] && setting.key_config[7]) stKeyState.bRapidB = TRUE; else if((paddata.Buttons&setting.key_config[5])==setting.key_config[5] && setting.key_config[5]) g_PadBit[0] |= NES_B; if((paddata.Buttons&setting.key_config[8])==setting.key_config[8] && setting.key_config[8]) g_PadBit[0] |= NES_SELECT; if((paddata.Buttons&setting.key_config[9])==setting.key_config[9] && setting.key_config[9]) g_PadBit[0] |= NES_START; g_PadBit[4]=0; // PLAYER2 MIC if((paddata.Buttons&setting.key_config[11])==setting.key_config[11] && setting.key_config[11]) g_PadBit[4] |= 0x04; //>>>davex if( screen_rotated_on){ if(paddata.Buttons & PSP_CTRL_DOWN) g_PadBit[0] |= NES_UP; if(paddata.Buttons & PSP_CTRL_UP) g_PadBit[0] |= NES_DOWN; if(paddata.Buttons & PSP_CTRL_LEFT) g_PadBit[0] |= NES_RIGHT; if(paddata.Buttons & PSP_CTRL_RIGHT) g_PadBit[0] |= NES_LEFT; }else{ // cross if(paddata.Buttons & PSP_CTRL_DOWN) g_PadBit[0] |= NES_DOWN; if(paddata.Buttons & PSP_CTRL_UP) g_PadBit[0] |= NES_UP; if( g_mirror){ if(paddata.Buttons & PSP_CTRL_LEFT) g_PadBit[0] |= NES_RIGHT; if(paddata.Buttons & PSP_CTRL_RIGHT) g_PadBit[0] |= NES_LEFT; }else{ if(paddata.Buttons & PSP_CTRL_LEFT) g_PadBit[0] |= NES_LEFT; if(paddata.Buttons & PSP_CTRL_RIGHT) g_PadBit[0] |= NES_RIGHT; } }//<<< // Toggle モードじゃないときの処理 if(!setting.bToggle) { // Speed mode if(setting.key_config[12] && (paddata.Buttons&setting.key_config[12])==setting.key_config[12]){ stKeyState.nSpeedMode = EMU_SPEED_MODE1; }else if(setting.key_config[13] && (paddata.Buttons&setting.key_config[13])==setting.key_config[13]){ stKeyState.nSpeedMode = EMU_SPEED_MODE2; } else { stKeyState.nSpeedMode = EMU_SPEED_NORMAL; } } else { // Speed mode 1(Toggle) if(setting.bToggle && setting.key_config[12] && (paddata.Buttons&setting.key_config[12])==setting.key_config[12]){ if (!bTogglePushFlag) { if( stKeyState.nSpeedMode == EMU_SPEED_MODE1 ){ char szTemp[128]; stKeyState.nSpeedMode = EMU_SPEED_NORMAL; _strcpy(szTemp, "SPEED MODE: NORMAL"); Scr_SetMessage(szTemp, 120, 0xFFFF); }else{ char msg[256], szTemp[128]; stKeyState.nSpeedMode = EMU_SPEED_MODE1; _strcpy(szTemp, "SPEED MODE: MODE 1 ("); _itoa(setting.speedmode1, msg); _strcat(szTemp, msg); _strcat(szTemp, "fps)"); Scr_SetMessage(szTemp, 120, 0xFFFF); } bTogglePushFlag = TRUE; } // キーをクリアすると押したとき動きが止まるのでクリアしない //g_PadBit[0]=0; } // Speed mode 2(Toggle) else if(setting.bToggle && setting.key_config[13] && (paddata.Buttons&setting.key_config[13])==setting.key_config[13]){ if (!bTogglePushFlag) { if( stKeyState.nSpeedMode == EMU_SPEED_MODE2 ){ char szTemp[128]; stKeyState.nSpeedMode = EMU_SPEED_NORMAL; _strcpy(szTemp, "SPEED MODE: NORMAL"); Scr_SetMessage(szTemp, 120, 0xFFFF); }else{ char msg[256], szTemp[128]; stKeyState.nSpeedMode = EMU_SPEED_MODE2; _strcpy(szTemp, "SPEED MODE: MODE 2 ("); _itoa(setting.speedmode2, msg); _strcat(szTemp, msg); _strcat(szTemp, "fps)"); Scr_SetMessage(szTemp, 120, 0xFFFF); } bTogglePushFlag = TRUE; } // キーをクリアすると押したとき動きが止まるのでクリアしない //g_PadBit[0]=0; } else { bTogglePushFlag = FALSE; } } if (1) { // Sound on/off if(setting.key_config[14] && (paddata.Buttons&setting.key_config[14])==setting.key_config[14]){ if (!bPushFlag) { g_NESConfig.sound.enabled = g_NESConfig.sound.enabled ? 0: 1; Scr_SetMessage(g_NESConfig.sound.enabled ? "SOUND ENABLE": "SOUND DISABLE", 120, 0xFFFF); PSPEMU_ApplySoundConfig(); wavout_enable=g_NESConfig.sound.enabled; bPushFlag = TRUE; } g_PadBit[0]=0; } // Screen size change else if(setting.key_config[15] && (paddata.Buttons&setting.key_config[15])==setting.key_config[15]){ if (!bPushFlag) { setting.screenmode = (setting.screenmode + 1) % SCREEN_COUNT; char szTemp[128]; _strcpy(szTemp, "SCREEN SIZE:"); _strcat(szTemp, aszScreenName[setting.screenmode]); // 画面の掃除 pgFillvram(0); pgScreenFlip(); pgFillvram(0); pgScreenFlip(); pgFillvram(0); pgScreenFlip(); Scr_SetMessage(szTemp, 120, 0xFFFF); bPushFlag = TRUE; } g_PadBit[0]=0; } // Quick save else if(setting.key_config[16] && (paddata.Buttons&setting.key_config[16])==setting.key_config[16]){ if (!bPushFlag) { PSPEMU_Freeze(); if(PSPEMU_SaveState(StateSlot)) { char szTemp[128]; _strcpy(szTemp, "State save at x"); szTemp[sizeof("State save at x") - 2] = StateSlot+'0'; Scr_SetMessage(szTemp, 120, 0xFFFF); } else Scr_SetMessage("State save Failed", 120, RGB(255, 0, 0)); bPushFlag = TRUE; PSPEMU_Thaw(); } g_PadBit[0]=0; } // Quick load else if(setting.key_config[17] && (paddata.Buttons&setting.key_config[17])==setting.key_config[17]){ if (!bPushFlag) { if(PSPEMU_LoadState(StateSlot)) { char szTemp[128]; _strcpy(szTemp, "State load at x"); szTemp[sizeof("State load at x") - 2] = StateSlot+'0'; Scr_SetMessage(szTemp, 120, 0xFFFF); } else Scr_SetMessage("State load Failed", 120, RGB(255, 0, 0)); bPushFlag = TRUE; } g_PadBit[0]=0; } // Quick Slot change else if(setting.key_config[18] && (paddata.Buttons&setting.key_config[18])==setting.key_config[18]){ if (!bPushFlag) { char szTemp[128]; StateSlot = (StateSlot + 1) % STATE_SLOT_MAX; _strcpy(szTemp,"QUICK SLOT : x"); szTemp[sizeof("QUICK SLOT : x") -2] = StateSlot+'0'; Scr_SetMessage(szTemp, 120, 0xFFFF); bPushFlag = TRUE; } g_PadBit[0]=0; } //Battery Display by Smiths else if(setting.key_config[19] && (paddata.Buttons&setting.key_config[19])==setting.key_config[19]){ if (!bPushFlag) { char szTemp[128]; int color; GetBatteryInfoString(szTemp, &color); Scr_SetMessage(szTemp, 120, 0xFFFF); bPushFlag = TRUE; } // キーをクリアすると押したとき動きが止まるのでクリアしない // メッセージしか表示しないしねぇ // g_PadBit[0]=0; } // Screen shot else if(setting.key_config[20] && (paddata.Buttons&setting.key_config[20])==setting.key_config[20]){ if (!bPushFlag) { PSPEMU_Freeze(); if(PSPEMU_SaveScreenShot()) { Scr_SetMessage("Save the Screen Shot Successfully", 120, 0xFFFF); } else Scr_SetMessage("Save the Screen Shot Failed", 120, RGB(255, 0, 0)); bPushFlag = TRUE; PSPEMU_Thaw(); } g_PadBit[0]=0; } else { bPushFlag = FALSE; } } // now_sensor_x=2047-paddata.analog[PSP_CTRL_ANALOG_X]+127; // now_sensor_y=2047-paddata.analog[PSP_CTRL_ANALOG_Y]+127; }
int main(int argc, char** argv) { #ifdef USE_DEBUGNET int ret = debugNetInit("255.255.255.255", 18194, DEBUG); printf("debugNetInit: %d", ret); #endif printf("DOOM started\n"); setbuf(stdout, NULL); int res = scePowerSetArmClockFrequency(50); if (res != 0x0) { printf("scePowerSetArmClockFrequency failed! (0x%08x) (Normal if not using PSM Unity 1.06. No clock speed change for you.)\n", res); } myargc = 0; myargv = 0; doomwaddir = PSP2_DIR("Documents/"); strcpy_s(doomwaddir2, 256, doomwaddir); strcat(doomwaddir2, "WADS/"); printf("WAD folder: %s\n", doomwaddir2); //pspAudioInit(); //pspAudioSetChannelCallback(0, (void *)&sound_callback); //_DisableFPUExceptions(); // pspDebugScreenInit(); //sceCtrlSetSamplingCycle(0); //int result = sceCtrlSetSamplingMode(PSP2_CTRL_MODE_ANALOG); // if (result < 0) // { // printf("sceCtrlSetSamplingMode : 0x%x", result); // } //SetupCallbacks(); pgInit(); pgScreenFrame(2,0); pgFillvram(0); Get_DirList(doomwaddir2); dlist_start = 0; dlist_curpos = 0; now_depth = 0; while(1) { Draw_All(); switch(Control()) { case 1: Get_DirList(doomwaddir2); break; case 2: pgFillvram(0); strcpy_s(target, 264, doomwaddir2); strcat(target, dlist[dlist_curpos].name); pgScreenFlipV(); //pspDebugScreenInit(); D_DoomMain (); } } return 0; }
// Picks an IP address - int[4] int IP_picker(int* address) { u32 buttonsLast = 0; int bRedraw = 1; int iPick = 0; int ipaddr[4]; if (address == NULL) return -1; // nowhere to store the IP! // copy the address for (iPick = 0;iPick<4;iPick++) ipaddr[iPick]=address[iPick]; iPick = 0; sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(0); // digital char number[5]; while (1) { int i; SceCtrlData pad; u32 buttonsNew; if (bRedraw) { pgFillvram(0); pgPrint4AtPixel(X_TITLE, X_TITLE, COLOR_GREY50, "Server IP"); for (i = 0; i < 4; i++) { u32 color1 = COLOR_GREY25; if (i == iPick) { color1 = COLOR_GREY75; // underline selected number pgPrint2AtPixel(i*16*4+32, MIDSCREEN+16, COLOR_WHITE, "---"); } sprintf(number,"%3d",ipaddr[i]); if (i < 3) { number[3]='.'; number[4]=0; } pgPrint2AtPixel(i*16*4+32, MIDSCREEN, color1, number); } pgScreenFlipV(); bRedraw = 0; } // handle inputs sceCtrlReadBufferPositive(&pad, 1); buttonsNew = pad.Buttons & ~buttonsLast; buttonsLast = pad.Buttons; if (buttonsNew & PSP_CTRL_RIGHT) { iPick++; if (iPick >= 4) iPick = 0; bRedraw = 1; } else if (buttonsNew & PSP_CTRL_LEFT) { iPick--; if (iPick < 0) iPick = 3; bRedraw = 1; } else if (buttonsLast & PSP_CTRL_UP) { ipaddr[iPick]++; if (ipaddr[iPick]>255) ipaddr[iPick]=0; bRedraw = 1; } else if (buttonsLast & PSP_CTRL_DOWN) { ipaddr[iPick]--; if (ipaddr[iPick]<0) ipaddr[iPick]=255; bRedraw = 1; } else if (buttonsNew & (PSP_CTRL_CIRCLE | PSP_CTRL_CROSS)) { break; // picked ! } else if (buttonsNew & PSP_CTRL_TRIANGLE) { iPick = -1; // cancel break; } } // show_confirmation: show final selection for a short time pgFillvram(0); pgPrint4AtPixel(X_TITLE, Y_TITLE, COLOR_GREY50, "Server IP"); if (iPick != -1) { int i; for (i=0;i<4;i++) address[i]=ipaddr[i]; } for (iPick = 0; iPick<4; iPick++) { sprintf(number,"%3d",address[iPick]); if (iPick < 3) { number[3]='.'; number[4]=0; } pgPrint2AtPixel(iPick*16*4+32, MIDSCREEN, COLOR_WHITE, number); } pgScreenFlipV(); pgWaitVn(50); return 0; }
int my_picker(const PICKER* pickerP) { int iPick = pickerP->pick_start; u32 buttonsLast = 0; int bRedraw = 1; if (pickerP->pick_count == 0) return -1; // nothing to pick sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(0); // digital while (1) { int i; SceCtrlData pad; u32 buttonsNew; if (pickerP->pick_count == 1) { // auto-pick if only one iPick = 0; break; } if (bRedraw) { pgFillvram(0); pgPrint4AtPixel(X_TITLE, X_TITLE, COLOR_GREY50, pickerP->szTitle); for (i = 0; i < pickerP->pick_count; i++) { PICKER_INFO const* pickP = &pickerP->picks[i]; u32 color1 = COLOR_GREY25; u32 color2 = COLOR_GREY12; int y2; if (i == iPick) { color1 = COLOR_GREY75; color2 = COLOR_GREY50; pgPrint4AtPixel(0, Y_PICK(i), COLOR_WHITE, STR_PICK); } pgPrint4AtPixel(X_PICK, Y_PICK(i), color1, pickP->szBig); y2 = Y_PICK_FINEPRINT(i); if (i != MAX_PICK-1) y2 += 2; // space it out a little pgPrint1AtPixel(X_PICK_FINEPRINT, y2, color2, pickP->szFinePrint); } pgScreenFlipV(); bRedraw = 0; } // handle up/down inputs sceCtrlReadBufferPositive(&pad, 1); buttonsNew = pad.Buttons & ~buttonsLast; buttonsLast = pad.Buttons; if (buttonsNew & PSP_CTRL_DOWN) { iPick++; if (iPick >= pickerP->pick_count) iPick = pickerP->pick_count-1; bRedraw = 1; } else if (buttonsNew & PSP_CTRL_UP) { iPick--; if (iPick < 0) iPick = 0; bRedraw = 1; } else if (buttonsNew & (PSP_CTRL_CIRCLE | PSP_CTRL_CROSS)) { if (iPick >= 0 && iPick < pickerP->pick_count) break; // picked ! } else if (buttonsNew & PSP_CTRL_TRIANGLE) { iPick = -1; // cancel break; } } // show_confirmation: show final selection for a short time pgFillvram(0); pgPrint4AtPixel(X_TITLE, Y_TITLE, COLOR_GREY50, pickerP->szTitle); if (iPick != -1) pgPrint4AtPixel(X_PICK, Y_PICK(iPick), COLOR_WHITE, pickerP->picks[iPick].szBig); else pgPrint4AtPixel(X_PICK, Y_PICK(2), COLOR_WHITE, "[Cancel]"); pgScreenFlipV(); pgWaitVn(50); return iPick; }