00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <gccore.h>
00010 #include <stdio.h>
00011 #include <stdlib.h>
00012 #include <string.h>
00013 #include <math.h>
00014 #include <ogcsys.h>
00015 #include <unistd.h>
00016 #include <wiiuse/wpad.h>
00017
00018 #include "menu.h"
00019 #include "video.h"
00020 #include "input.h"
00021 #include "libwiigui/gui.h"
00022
00023 int rumbleRequest[4] = {0,0,0,0};
00024 GuiTrigger userInput[4];
00025 static int rumbleCount[4] = {0,0,0,0};
00026
00027
00028
00029
00030
00031
00032 void UpdatePads()
00033 {
00034 WPAD_ScanPads();
00035 PAD_ScanPads();
00036
00037 for(int i=3; i >= 0; i--)
00038 {
00039 userInput[i].pad.btns_d = PAD_ButtonsDown(i);
00040 userInput[i].pad.btns_u = PAD_ButtonsUp(i);
00041 userInput[i].pad.btns_h = PAD_ButtonsHeld(i);
00042 userInput[i].pad.stickX = PAD_StickX(i);
00043 userInput[i].pad.stickY = PAD_StickY(i);
00044 userInput[i].pad.substickX = PAD_SubStickX(i);
00045 userInput[i].pad.substickY = PAD_SubStickY(i);
00046 userInput[i].pad.triggerL = PAD_TriggerL(i);
00047 userInput[i].pad.triggerR = PAD_TriggerR(i);
00048 }
00049 }
00050
00051
00052
00053
00054
00055
00056 void SetupPads()
00057 {
00058 PAD_Init();
00059 WPAD_Init();
00060
00061
00062 WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
00063 WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
00064
00065 for(int i=0; i < 4; i++)
00066 {
00067 userInput[i].chan = i;
00068 userInput[i].wpad = WPAD_Data(i);
00069 }
00070 }
00071
00072
00073
00074
00075
00076 void ShutoffRumble()
00077 {
00078 for(int i=0;i<4;i++)
00079 {
00080 WPAD_Rumble(i, 0);
00081 rumbleCount[i] = 0;
00082 }
00083 }
00084
00085
00086
00087
00088
00089 void DoRumble(int i)
00090 {
00091 if(rumbleRequest[i] && rumbleCount[i] < 3)
00092 {
00093 WPAD_Rumble(i, 1);
00094 rumbleCount[i]++;
00095 }
00096 else if(rumbleRequest[i])
00097 {
00098 rumbleCount[i] = 12;
00099 rumbleRequest[i] = 0;
00100 }
00101 else
00102 {
00103 if(rumbleCount[i])
00104 rumbleCount[i]--;
00105 WPAD_Rumble(i, 0);
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114
00115 s8 WPAD_Stick(u8 chan, u8 right, int axis)
00116 {
00117 float mag = 0.0;
00118 float ang = 0.0;
00119 WPADData *data = WPAD_Data(chan);
00120
00121 switch (data->exp.type)
00122 {
00123 case WPAD_EXP_NUNCHUK:
00124 case WPAD_EXP_GUITARHERO3:
00125 if (right == 0)
00126 {
00127 mag = data->exp.nunchuk.js.mag;
00128 ang = data->exp.nunchuk.js.ang;
00129 }
00130 break;
00131
00132 case WPAD_EXP_CLASSIC:
00133 if (right == 0)
00134 {
00135 mag = data->exp.classic.ljs.mag;
00136 ang = data->exp.classic.ljs.ang;
00137 }
00138 else
00139 {
00140 mag = data->exp.classic.rjs.mag;
00141 ang = data->exp.classic.rjs.ang;
00142 }
00143 break;
00144
00145 default:
00146 break;
00147 }
00148
00149
00150 if (mag > 1.0) mag = 1.0;
00151 else if (mag < -1.0) mag = -1.0;
00152 double val;
00153
00154 if(axis == 0)
00155 val = mag * sin((PI * ang)/180.0f);
00156 else
00157 val = mag * cos((PI * ang)/180.0f);
00158
00159 return (s8)(val * 128.0f);
00160 }