#include "FTTInput.h" #include "AndroidApp.h" #include "CFTTTime.h" bool FTTInput_bInitialised = false; //005CA22C uchar s_uKeyStates[343]; //005C9DD0 uchar s_bKeyStatesPressed[343]; //005C9F27 uchar s_bKeyStatesReleased[343]; //005CA07E uchar s_fRollerValues[20]; //005CA1D8 float s_fAxisValues[16]; //005CA1EC MYSTATIC int64 int64_3499A0 = 1; MYSTATIC float gs_fdword_3499A8[3] = {1.0, 1.0, 1.0}; //003499A8 MYSTATIC uchar byte_5CA230_mystatic[343]; MYSTATIC UseBy_unk_5CA388 UseBy_unk_5CA388_5CA388_mystatic; MYSTATIC CTouchStateInternal CTouchStateInternal_5CA390_mystatic[16]; MYSTATIC UseByAddTouchEvent_Internal UseByAddTouchEvent_Internal_5CA590_mystatic[128]; MYSTATIC bool byte_5CB190_mystatic; // CTouchStateInternal_5CA390_mystatic被初始化元素的count MYSTATIC int dword_5CB194_mystatic; MYSTATIC int dword_5CB198_mystatic; MYSTATIC int dword_5CB19C_mystatic; MYSTATIC FTTMutex fttmutex_5CB1AC_mystatic; #pragma pack(4) struct FTTInput { bool b_0; int i_4; int i_8; int i_C; uint field_10; uint field_14; uint field_18; FTTMutex tMutex_1C; }; #pragma pack() MYSTATIC FTTInput gs_input_005CB190; MYSTATIC float gs_fdword_5CB1D0[2]; MYSTATIC float gs_fdword_5CB1D8[4]; //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FF2C //^_^ __attribute__((noinline)) MYSTATIC void sub_21FF2C_mystatic() { } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FCC0 void AddTouchEvent_Internal(CTouchStateInternal *p_ctouchstateinternal_r0_arg, ETouchEvent etouchevent_r1_arg, float f_r2_arg, float f_r3_arg, uint ud_arg_0) { float f_s16 = f_r3_arg; float f_s18 = f_r2_arg; int64 ll_r8_r9; if (p_ctouchstateinternal_r0_arg != nullptr) { // 0021FCD4 // 0021FCD6 ll_r8_r9 = p_ctouchstateinternal_r0_arg->field_8; if ((f_s18 == -1.0) && (f_s16 == -1.0)) { // 0021FCDE 0021FCE8 // 0021FCF0 f_s18 = p_ctouchstateinternal_r0_arg->field_0; f_s16 = p_ctouchstateinternal_r0_arg->field_4; } bool b_r0; if ((etouchevent_r1_arg == 1) && ((b_r0 = p_ctouchstateinternal_r0_arg->NeedsDeferredRelease()) != false)) { // 0021FCF8 0021FD04 // 0021FD06 p_ctouchstateinternal_r0_arg->field_0 = f_s18; p_ctouchstateinternal_r0_arg->field_4 = f_s16; p_ctouchstateinternal_r0_arg->b_1c = true; // 0021FE22 // LOGI("AddTouchEvent_Internal 1_21 return 1"); return; } else if (((etouchevent_r1_arg == 1) && (b_r0 == false)) || ((etouchevent_r1_arg | 2) == 3)) { // 0021FD24 // 0021FD28 dup int i_r0 = gs_input_005CB190.i_4 - (p_ctouchstateinternal_r0_arg - CTouchStateInternal_5CA390_mystatic); int i_r2 = i_r0 - 1; memmove(p_ctouchstateinternal_r0_arg, &p_ctouchstateinternal_r0_arg[1], sizeof(CTouchStateInternal) * i_r2); gs_input_005CB190.i_4--; memset(&CTouchStateInternal_5CA390_mystatic[gs_input_005CB190.i_4], 0, sizeof(CTouchStateInternal)); } else { // 0021FDC4 p_ctouchstateinternal_r0_arg->field_0 = f_s18; p_ctouchstateinternal_r0_arg->field_4 = f_s16; } } else { // 0021FD14 if (etouchevent_r1_arg == 3) { // 0021FD14 // 0021FD1A // 0021FDBE ll_r8_r9 = 0; } else { // 0021FD60 if ((etouchevent_r1_arg == 0) || (etouchevent_r1_arg == 2)) { // 0021FD68 // 0021FD6C int i_r0 = gs_input_005CB190.i_4; if (i_r0 <= 0xF) { // 0021FD72 // 0021FD76 gs_input_005CB190.i_4++; int64 ll_r0_r1 = int64_3499A0; CTouchStateInternal_5CA390_mystatic[i_r0].field_0 = f_s18; CTouchStateInternal_5CA390_mystatic[i_r0].field_4 = f_s16; int64_3499A0++; CTouchStateInternal_5CA390_mystatic[i_r0].field_8 = ll_r0_r1; CTouchStateInternal_5CA390_mystatic[i_r0].field_10 = ud_arg_0; CTouchStateInternal_5CA390_mystatic[i_r0].uFrameNumber_14 = CFTTTime::s_uFrameNumber; uint ui_r0 = CFTTTime::GetSystemTime(); ll_r8_r9 = CTouchStateInternal_5CA390_mystatic[i_r0].field_8; CTouchStateInternal_5CA390_mystatic[i_r0].field_18 = ui_r0; CTouchStateInternal_5CA390_mystatic[i_r0].b_1c = false; } else { ll_r8_r9 = 0; } } else { // 0021FDBE ll_r8_r9 = 0; } } } // 0021FDCC 合 int i_r1 = gs_input_005CB190.i_8; int i_r2 = gs_input_005CB190.i_C; int i_r7 = i_r2 + i_r1; i_r7 = i_r7 % 128; UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_0 = etouchevent_r1_arg; UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_10 = ll_r8_r9; UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_4 = f_s18; UseByAddTouchEvent_Internal_5CA590_mystatic[i_r7].field_8 = f_s16; if (i_r2 <= 0x7F) { // 0021FDD4 // 0021FE08 gs_input_005CB190.i_C = i_r2 + 1; } else { // 0021FE0E i_r1++; gs_input_005CB190.b_0 = true; gs_input_005CB190.i_8 = i_r1 % 128; } } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FAF0 //^_- 唯一区别: // 在0021FB3C、0021FB40、0021FB48、0021FB4E、0021FB52处,原始的是VST1.32,而我们的是VST1.8,但指令后面的操作数完全相同 void FTTInput_Init() { } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FB8C //^_- 唯一区别: // 在0021FBB6、0021FBC0、0021FBC8、0021FBCE处,原始的是VST1.32,而我们的是VST1.8,但指令后面的操作数完全相同 void FTTInput_Process() { } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021fc6c ^_^ void FTTInput_ClearTriggers() { memset(&s_bKeyStatesPressed, 0, sizeof(s_bKeyStatesPressed)); memset(&s_bKeyStatesReleased, 0, sizeof(s_bKeyStatesReleased)); } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FC94 int FTTInput_Shutdown() { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FCB0 //^_^ void FTTInput_SetButtonRemappings(TButtonRemapping *p_tbuttonremapping_r0, uint ud_r1) { } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021fe7c ^_^ void FTTInputTouch_Init(void) { FTTInputTouch_Shutdown(); } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FE80 //^_^ void FTTInputTouch_Shutdown() { } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FECC //^_^ void FTTInputTouch_AddTouchEvent(ETouchEvent eEvent1, float f2, float f3, unsigned int u4) { FTTMutex *pFFTutex = FTTInputTouch_GetMutex(); pFFTutex->Lock(); sub_21FF2C_mystatic(); CTouchStateInternal *pTouchStateInternal_r6 = CTouchStateInternal_5CA390_mystatic; int count = gs_input_005CB190.i_4; int i = 0; while (1) { if (i < count) { if (pTouchStateInternal_r6->field_10 == u4) { if (pTouchStateInternal_r6->b_1c == 0) break; } i++; pTouchStateInternal_r6++; } else { pTouchStateInternal_r6 = NULL; break; } }; AddTouchEvent_Internal(pTouchStateInternal_r6, eEvent1, f2, f3, u4); pFFTutex->Unlock(); } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FF70 //^_^ UseByAddTouchEvent_Internal FTTInput_GetTouchEvent() { UseByAddTouchEvent_Internal usebyaddtouchevent_internal_retval; gs_input_005CB190.tMutex_1C.Lock(); sub_21FF2C_mystatic(); if (gs_input_005CB190.b_0 == true) { // 0021FF88 // 0021FF8C gs_input_005CB190.b_0 = false; } if (gs_input_005CB190.i_C != 0) { // 0021FF92 // 0021FF94 usebyaddtouchevent_internal_retval = UseByAddTouchEvent_Internal_5CA590_mystatic[gs_input_005CB190.i_8]; gs_input_005CB190.i_8 = (gs_input_005CB190.i_8 + 1) % 128; gs_input_005CB190.i_C--; } else { // 0021FFC8 usebyaddtouchevent_internal_retval.field_10 = 0; usebyaddtouchevent_internal_retval.field_0 = ETouchEvent_neg1; usebyaddtouchevent_internal_retval.field_4 = -1.0; usebyaddtouchevent_internal_retval.field_8 = -1.0; } gs_input_005CB190.tMutex_1C.Unlock(); return usebyaddtouchevent_internal_retval; } //--------------------------------------------------------------------------------------------------------------------------------------------- //0021FFF0 //xxx int FTTInputTouch_GetTouchState(CTouchState *, int) { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220040 __attribute__((noinline)) FTTMutex *FTTInputTouch_GetMutex() { return &gs_input_005CB190.tMutex_1C; } int i=0; float g_r0[19]={566.000000 ,569.626648 ,573.039978 ,576.880005 ,580.506653 ,583.919983 ,587.546692 ,591.173340 ,594.799988 ,598.426636 ,602.053345 ,605.679993 ,609.306641 ,612.933350 ,616.559998 ,620.186646 ,623.813354 ,627.440002 ,630.000000 }; float g_r1[19]={1214.000000,1180.170044,1148.329956,1112.510010,1078.679932,1046.839966,1013.010010,979.179993, 945.349976, 911.520020, 877.690002, 843.859985, 810.030029, 776.199951, 742.369995, 708.539978, 674.710022, 640.880005, 617.000000}; bool flag=false; //--------------------------------------------------------------------------------------------------------------------------------------------- //0022004C ^_^ bool IsSaveSwipe() { FILE *fp = fopen("/data/local/tmp/startgetdata", "r"); if (fp) { fclose(fp); return true; } return false; } void FTTInputTouch_AddAndroidTouchEvent(float f_r0, float f_r1, int d_r2, int d_r3) { if (IsSaveSwipe() == true) { LOGE("save data"); //Hook::SaveSwipe(f_r0, f_r1, d_r2, d_r3); }else LOGE("NormalAddAndroidTouchEvent"); switch (d_r2) { case 0: case 5: { FTTInputTouch_AddTouchEvent(ETouchEvent_0, f_r0, f_r1, d_r3); } break; case 1: case 6: { if(f_r0==630.0f&&f_r1==617.0f){ LOGE("replace end"); i=0; } FTTInputTouch_AddTouchEvent(ETouchEvent_1, f_r0, f_r1, d_r3); } break; case 2: { if(i){ LOGE("replace"); f_r0=g_r0[i]; f_r1=g_r1[i]; i++; } LOGE("r0=%f,r1=%f",f_r0,f_r1); if(f_r0==566.0f&&f_r1==1214.0f){ i++; } FTTInputTouch_AddTouchEvent(ETouchEvent_Touch_2, f_r0, f_r1, d_r3); } break; case 3: { FTTInputTouch_AddTouchEvent(ETouchEvent_3, f_r0, f_r1, d_r3); } break; case 4: { } break; } } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220084 ^_^ void FTTInput_ProcessJoystick() { } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220190 单元测试跑不到 void FTTInput_worldOriUpdatedAndroid(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9) { LOGE("FTTInput_worldOriUpdatedAndroid%f%f%f%f%f%f%f%f%f",f1,f2,f3,f4,f5,f6,f7,f8,f9); } //--------------------------------------------------------------------------------------------------------------------------------------------- //002201F4 void FTTInput_PlatformInit() { //empty } //--------------------------------------------------------------------------------------------------------------------------------------------- //002201F6 void FTTInput_PlatformShutdown() { //empty } //--------------------------------------------------------------------------------------------------------------------------------------------- //002201f8 ^_^ void FTTInput_PlatformProcess() { return FTTInput_ProcessJoystick(); } //--------------------------------------------------------------------------------------------------------------------------------------------- //002201FC ^_^ int FTTInput_PlatformGetNumXInputDevices() { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220200 ^_^ int FTTInput_PlatformGetXInputDevicesMask() { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220204 //xxx int FTTInput_PlatformWorldOriSupported() { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220258 //xxx int FTTInput_PlatformWorldOriEnabled() { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //002202AC //xxx int FTTInput_PlatformEnableWorldOri() { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //002202F8 //xxx int FTTInput_PlatformDisableWorldOri() { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220344 //xxx int FTTInput_PlatformGetWorldOri(CFTTMatrix32 &) { return 1; } //--------------------------------------------------------------------------------------------------------------------------------------------- //00220448 void FTTInput_PadSetRumble(int, float, float) { //empty } //---------------------------------------------------------------------------------------------------------------------------------------------