Now "Wiimote/Nunchunk Shake" on Keyboard works(for Win only).

Just press the "Shake" key.

The shake involves all the three axes: X, Y, Z.
So when you press the shake key, you are actually shaking not only up-down, left-right, and forward-backward at the same time.
I did this becuse different games may require different directional shake, no need to seperate them to 3 keys I think.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4624 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
ayuanx 2009-11-28 18:00:07 +00:00
parent 0f7b1a2f95
commit ff23c02795
3 changed files with 35 additions and 45 deletions

View File

@ -34,11 +34,17 @@ public:
virtual bool Open(u32 _CommandAddress, u32 _Mode) virtual bool Open(u32 _CommandAddress, u32 _Mode)
{ {
//PanicAlert("CWII_IPC_HLE_Device_Error"); //PanicAlert("CWII_IPC_HLE_Device_Error");
//Memory::Write_U32(GetDeviceID(), _CommandAddress+4); Memory::Write_U32(GetDeviceID(), _CommandAddress + 4);
Memory::Write_U32(0, _CommandAddress+4);
m_Active = true; m_Active = true;
return true; return true;
} }
virtual bool Close(u32 _CommandAddress)
{
Memory::Write_U32(0, _CommandAddress + 4);
m_Active = false;
return true;
}
}; };
#endif #endif

View File

@ -296,7 +296,7 @@ void UpdateEeprom()
g_wm.cal_zero.y = g_Eeprom[23]; g_wm.cal_zero.y = g_Eeprom[23];
g_wm.cal_zero.z = g_Eeprom[24]; g_wm.cal_zero.z = g_Eeprom[24];
g_wm.cal_g.x = g_Eeprom[26] - g_Eeprom[22]; g_wm.cal_g.x = g_Eeprom[26] - g_Eeprom[22];
g_wm.cal_g.y = g_Eeprom[27] - g_Eeprom[24]; g_wm.cal_g.y = g_Eeprom[27] - g_Eeprom[23];
g_wm.cal_g.z = g_Eeprom[28] - g_Eeprom[24]; g_wm.cal_g.z = g_Eeprom[28] - g_Eeprom[24];
INFO_LOG(WIIMOTE, "UpdateEeprom: %i %i %i", INFO_LOG(WIIMOTE, "UpdateEeprom: %i %i %i",

View File

@ -396,37 +396,40 @@ void FillReportInfo(wm_core& _core)
// For all functions // For all functions
u8 g_x, g_y, g_z, g_X, g_Y, g_Z; u8 g_x, g_y, g_z, g_X, g_Y, g_Z;
// For the shake function, 0 = Wiimote, 1 = Nunchuck // For the shake function, Wiimote: wm = 0, Nunchuck: wm = 1
int Shake[] = {-1, -1}; int Shake[] = {0, 0};
// For the tilt function, the size of this list determines how fast Y returns to its neutral value // For the tilt function, the size of this list determines how fast Y returns to its neutral value
std::vector<u8> yhist(15, 0); float KbDegree; std::vector<u8> yhist(15, 0); float KbDegree;
// Single shake of Wiimote while holding it sideways (Wario Land pound ground) // Single shake of all three directions
void SingleShake(u8 &_y, u8 &_z, int i) void SingleShake(u8 &_x, u8 &_y, u8 &_z, int wm)
{ {
#ifdef _WIN32 #ifdef _WIN32
// Shake Wiimote with S, Nunchuck with D if(Shake[wm] == 1)
if((i == 0 && IsKey(g_Wiimote_kbd.SHAKE)) || (i == 1 && IsKey(g_NunchuckExt.SHAKE)))
{ {
_z = 0; _x = 0x00;
_y = 0; _y = 0x00;
Shake[i] = 2; _z = 0x00;
Shake[wm] = -1;
} }
else if(Shake[i] == 2) else if((wm == 0 && IsKey(g_Wiimote_kbd.SHAKE)) || (wm == 1 && IsKey(g_NunchuckExt.SHAKE)))
{ {
// This works regardless of calibration, in Wario Land _x = 0xFF;
_z = g_wm.cal_zero.z - 2; _y = 0xFF;
_y = 0; _z = 0xFF;
Shake[i] = 1; Shake[wm] = 1;
} }
else if(Shake[i] == 1) else
{ {
Shake[i] = -1; _x = g_wm.cal_zero.x;
_y = g_wm.cal_zero.y;
_z = g_wm.cal_zero.z + g_wm.cal_g.z;
Shake[wm] = 0;
} }
#endif #endif
//if (Shake[i] > -1) DEBUG_LOG(WIIMOTE, "Shake: %i", Shake[i]); //if (Shake[wm] != 0) DEBUG_LOG(WIIMOTE, "Shake: %i - 0x%02x, 0x%02x, 0x%02x", Shake[wm], _x, _y, _z);
} }
@ -597,39 +600,20 @@ void FillReportAcc(wm_accel& _acc)
//DEBUG_LOG(WIIMOTE, "X, Y, Z: %u %u %u", _acc.x, _acc.y, _acc.z); //DEBUG_LOG(WIIMOTE, "X, Y, Z: %u %u %u", _acc.x, _acc.y, _acc.z);
} }
// The default values can change so we need to update them all the time
g_X = g_wm.cal_zero.x;
g_Y = g_wm.cal_zero.y;
g_Z = g_wm.cal_zero.z + g_wm.cal_g.z;
// Check that Dolphin is in focus // Check that Dolphin is in focus
if (!IsFocus()) if (!IsFocus())
{ {
_acc.x = g_X; _acc.x = g_wm.cal_zero.x;
_acc.y = g_y; _acc.y = g_wm.cal_zero.y;
_acc.z = g_z; _acc.z = g_wm.cal_zero.z + g_wm.cal_g.z;
return; return;
} }
// Wiimote to Gamepad translations
// The following functions may or may not update these values
g_x = g_X;
g_y = g_Y;
g_z = g_Z;
// Shake the Wiimote // Shake the Wiimote
SingleShake(g_y, g_z, 0); SingleShake(_acc.x, _acc.y, _acc.z, 0);
// Tilt Wiimote, allow the shake function to interrupt it // Tilt Wiimote, allow the shake function to interrupt it
if (Shake[0] == -1) Tilt(g_x, g_y, g_z); if (Shake[0] == 0) Tilt(_acc.x, _acc.y, _acc.z);
// Write final values
_acc.x = g_x;
_acc.y = g_y;
_acc.z = g_z;
// Debugging for translating Wiimote to Keyboard (or Gamepad) // Debugging for translating Wiimote to Keyboard (or Gamepad)
/* /*
@ -899,7 +883,7 @@ void FillReportExtension(wm_extension& _ext)
} }
// Shake the Wiimote // Shake the Wiimote
SingleShake(_ext.ay, _ext.az, 1); SingleShake(_ext.ax, _ext.ay, _ext.az, 1);
// The default joystick and button values unless we use them // The default joystick and button values unless we use them
_ext.jx = g_nu.jx.center; _ext.jx = g_nu.jx.center;