From 1478cee2a3738b96ae5a09ba4f3741d2bb69c6fb Mon Sep 17 00:00:00 2001 From: michniewski Date: Wed, 6 Aug 2008 14:40:28 +0000 Subject: [PATCH] - Superscope support for wiimote and GC controller - Fixed Multitap --- source/ngc/menu.cpp | 19 +++++++-- source/ngc/preferences.cpp | 2 +- source/ngc/s9xconfig.cpp | 6 ++- source/ngc/snes9xGX.cpp | 85 ++++++++++++++++++++++++++------------ source/ngc/snes9xGX.h | 3 ++ 5 files changed, 83 insertions(+), 32 deletions(-) diff --git a/source/ngc/menu.cpp b/source/ngc/menu.cpp index 56fc2af..dd10191 100644 --- a/source/ngc/menu.cpp +++ b/source/ngc/menu.cpp @@ -336,7 +336,8 @@ static char emulatorOptions[][20] = { "Reverse Stereo OFF", "Interp. Sound ON", "Transparency ON", "FPS Display OFF", "MultiTap 5 OFF", "C-Stick Zoom OFF", "Auto Load OFF", "Auto Save OFF", "Verify MC Saves OFF", - "Video Filtering OFF", "Save Prefs Now", "Return to previous" + "Video Filtering OFF", "Superscope OFF", + "Save Prefs Now", "Return to previous" }; void @@ -381,8 +382,11 @@ EmulatorOptions () sprintf (emulatorOptions[9], "Video Filtering %s", GCSettings.render == true ? " ON" : "OFF"); + + if (GCSettings.Superscope > 0) sprintf (emulatorOptions[10], "Superscope: Pad %d", GCSettings.Superscope); + else sprintf (emulatorOptions[10], "Superscope OFF"); - ret = RunMenu (emulatorOptions, emuCount, (char*)"Emulator Options"); + ret = RunMenu (emulatorOptions, emuCount, (char*)"Emulator Options", 18); switch (ret) { @@ -440,11 +444,17 @@ EmulatorOptions () break; case 10: + GCSettings.Superscope ++; + if (GCSettings.Superscope > 4) + GCSettings.Superscope = 0; + break; + + case 11: quickSavePrefs(NOTSILENT); break; case -1: /*** Button B ***/ - case 11: + case 12: quit = 1; break; @@ -875,4 +885,7 @@ mainmenu () #endif ReInitGCVideo(); // update video after reading settings + Settings.SuperScopeMaster = (GCSettings.Superscope > 0 ? true : false); // update superscope settings + // update mouse/justifier info? + SetControllers(); } diff --git a/source/ngc/preferences.cpp b/source/ngc/preferences.cpp index e73999c..8dd054d 100644 --- a/source/ngc/preferences.cpp +++ b/source/ngc/preferences.cpp @@ -31,7 +31,7 @@ extern unsigned int wmpadmap[]; extern unsigned int ccpadmap[]; extern unsigned int ncpadmap[]; -#define PREFSVERSTRING "Snes9x GX 004 Prefs" +#define PREFSVERSTRING "Snes9x GX 004a Prefs" char prefscomment[2][32] = { {PREFSVERSTRING}, {"Preferences"} }; diff --git a/source/ngc/s9xconfig.cpp b/source/ngc/s9xconfig.cpp index 9e7df32..98c4211 100644 --- a/source/ngc/s9xconfig.cpp +++ b/source/ngc/s9xconfig.cpp @@ -166,8 +166,8 @@ DefaultSettings () memset (&Settings, 0, sizeof (Settings)); /*** General ***/ - Settings.MouseMaster = true; - Settings.SuperScopeMaster = true; + Settings.MouseMaster = false; + Settings.SuperScopeMaster = false; Settings.MultiPlayer5Master = false; Settings.JustifierMaster = true; Settings.ShutdownMaster = false; @@ -219,6 +219,8 @@ DefaultSettings () GCSettings.NGCZoom = 0; GCSettings.VerifySaves = 0; GCSettings.render = 0; + GCSettings.Superscope = 0; + GCSettings.Mouse = 0; Settings.ForceNTSC = 0; Settings.ForcePAL = 0; diff --git a/source/ngc/snes9xGX.cpp b/source/ngc/snes9xGX.cpp index d674527..60d8085 100644 --- a/source/ngc/snes9xGX.cpp +++ b/source/ngc/snes9xGX.cpp @@ -252,28 +252,50 @@ unsigned int gcscopemap[] = { PAD_TRIGGER_Z, PAD_BUTTON_B, PAD_BUTTON_A, PAD_BUTTON_Y, PAD_BUTTON_START }; +/*** Superscope : wiimote button mapping ***/ +unsigned int wmscopemap[] = { WPAD_BUTTON_MINUS, WPAD_BUTTON_B, + WPAD_BUTTON_A, WPAD_BUTTON_DOWN, + WPAD_BUTTON_PLUS +}; -void UpdateCursorPosition (int input_x, int input_y, int &pos_x, int &pos_y) +void UpdateCursorPosition (int pad, int &pos_x, int &pos_y) { + // gc left joystick + signed char pad_x = PAD_StickX (pad); + signed char pad_y = PAD_StickY (pad); int SCOPEPADCAL = 30; +#ifdef HW_RVL + // wiimote ir + struct ir_t ir; +#endif - if (input_x > SCOPEPADCAL){ + if (pad_x > SCOPEPADCAL){ pos_x +=4; if (pos_x > 256) pos_x = 256; } - if (input_x < -SCOPEPADCAL){ + if (pad_x < -SCOPEPADCAL){ pos_x -=4; if (pos_x < 0) pos_x = 0; } - if (input_y < -SCOPEPADCAL){ + if (pad_y < -SCOPEPADCAL){ pos_y +=4; if (pos_y > 224) pos_y = 224; } - if (input_y > SCOPEPADCAL){ + if (pad_y > SCOPEPADCAL){ pos_y -=4; if (pos_y < 0) pos_y = 0; } + +#ifdef HW_RVL + // read wiimote IR + WPAD_IR(pad, &ir); + if (ir.valid) + { + scope_x = (ir.x * 256) / 640; + scope_y = (ir.y * 224) / 480; + } +#endif } @@ -392,20 +414,24 @@ decodepad (int pad) } /*** Superscope ***/ - if (pad == 0 && Settings.SuperScopeMaster) // report only once + if (pad == GCSettings.Superscope-1) // report only once { // buttons offset = 0x50; for (i = 0; i < 6; i++) - { - if ( jp & gcscopemap[i] ) + { + if ( jp & gcscopemap[i] +#ifdef HW_RVL + || wp & wmscopemap[i] +#endif + ) S9xReportButton (offset + i, true); else S9xReportButton (offset + i, false); } // pointer offset = 0x60; - UpdateCursorPosition (pad_x, pad_y, scope_x, scope_y); + UpdateCursorPosition (pad, scope_x, scope_y); S9xReportPointer(offset, (u16)scope_x, (u16)scope_y); } } @@ -566,6 +592,26 @@ u32 wpad_get_analogues(int pad, float* mag1, u16* ang1, float* mag2, u16* ang2) return exp_type; // return expansion type } +void SetControllers () +{ + if (Settings.MultiPlayer5Master == true) + { + + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_MP5, 1, 2, 3, -1); + } + else if (Settings.SuperScopeMaster == true) + { + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_SUPERSCOPE, 1, 0, 0, 0); + } + else + { + /*** Plugin 2 Joypads by default ***/ + S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); + S9xSetController (1, CTL_JOYPAD, 1, 0, 0, 0); + } +} /**************************************************************************** * Set the default mapping for NGC @@ -647,23 +693,7 @@ SetDefaultButtonMap () S9xMapPointer( maxcode++, S9xGetCommandT("Pointer Superscope"), false); // add mouses here - if (Settings.MultiPlayer5Master == true) - { - - S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); - S9xSetController (1, CTL_MP5, 1, 2, 3, -1); - } - else if (Settings.SuperScopeMaster == true) - { - S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); - S9xSetController (1, CTL_SUPERSCOPE, 1, 0, 0, 0); - } - else - { - /*** Plugin 2 Joypads by default ***/ - S9xSetController (0, CTL_JOYPAD, 0, 0, 0, 0); - S9xSetController (1, CTL_JOYPAD, 1, 0, 0, 0); - } + SetControllers (); } @@ -742,6 +772,9 @@ main () #ifdef HW_RVL WPAD_Init(); + // read wiimote accelerometer and IR data + WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); + WPAD_SetVRes(WPAD_CHAN_ALL,640,480); #endif diff --git a/source/ngc/snes9xGX.h b/source/ngc/snes9xGX.h index fc1de8e..a23682c 100644 --- a/source/ngc/snes9xGX.h +++ b/source/ngc/snes9xGX.h @@ -182,6 +182,8 @@ struct SGCSettings{ uint8 VerifySaves; u16 render; // 0 - original, 1 - no AA u32 QuickSaveSlot; // -1 Disabled - no prefs are loaded, 0 Memory card in slot A, 1 Memory card in slot B, 2 SD card in slot A, 3 SD card in slot B, 4 SMB share, 5 USB + u16 Superscope; + u16 Mouse; }; START_EXTERN_C @@ -190,6 +192,7 @@ extern unsigned short saveicon[1024]; extern bool8 isWii; extern u32 wpad_get_analogues(int pad, float* mag1, u16* ang1, float* mag2, u16* ang2); +extern void SetControllers (); END_EXTERN_C #define JOY_THRESHOLD 0.70 // for wii (expansion) analogues