Pārlūkot izejas kodu

0x00135554,CUIMsgRewind::Render bugfix

DESKTOP-AB9OQPJ\RED-10 3 gadi atpakaļ
vecāks
revīzija
86e17f5e41
9 mainītis faili ar 291 papildinājumiem un 62 dzēšanām
  1. 5 2
      jni/CMessageBox.cpp
  2. 3 2
      jni/CStageManager.cpp
  3. 220 2
      jni/CUIMsgRewind.cpp
  4. 1 0
      jni/FE2D.cpp
  5. 8 6
      jni/FESU.cpp
  6. 2 1
      jni/FEU.cpp
  7. 11 11
      jni/FREE.cpp
  8. 1 0
      jni/FTTFont.cpp
  9. 40 38
      jni/GM.h

+ 5 - 2
jni/CMessageBox.cpp

@@ -63,7 +63,8 @@ void CMessageBox::RenderStarburst(float, float, float, float, uint, uint) {
 }
 //-------------------------------------------------------------------------------------------------
 //00121CC8
-void CMessageBox::RenderBox(float, float, float, float) {
+void CMessageBox::RenderBox(float f1, float f2, float f3, float f4) {
+  LOGE("CMessageBox::RenderBox%p%f%f%f%f",this,f1,f2,f3,f4);
 }
 //-------------------------------------------------------------------------------------------------
 //00121D8C
@@ -71,7 +72,8 @@ void CMessageBox::RenderPattern(float, float, float, float) {
 }
 //-------------------------------------------------------------------------------------------------
 //00121ED4
-void CMessageBox::RenderBorder(float, float, float, float) {
+void CMessageBox::RenderBorder(float f1, float f2, float f3, float f4) {
+  LOGE("CMessageBox::RenderBorder%p%f%f%f%f",this,f1,f2,f3,f4);
 }
 //-------------------------------------------------------------------------------------------------
 //00122040
@@ -80,6 +82,7 @@ void CMessageBox::Render() {
 //-------------------------------------------------------------------------------------------------
 //001220CC
 void CMessageBox::RenderOptions() {
+  LOGE("CMessageBox::RenderBorder%p",this);
 }
 //-------------------------------------------------------------------------------------------------
 //00122228

+ 3 - 2
jni/CStageManager.cpp

@@ -77,8 +77,9 @@ void CStageManager::RenderHUD() {
 }
 //-------------------------------------------------------------------------------------------------
 //001EBEC0
-int CStageManager::GetPlayableIndex(int) {
-	return 0;
+int CStageManager::GetPlayableIndex(int a1) {
+	LOGE("%pCStageManager::GetPlayableIndex%x",this,a1);
+	return rand();
 }
 //-------------------------------------------------------------------------------------------------
 //001EBEE0

+ 220 - 2
jni/CUIMsgRewind.cpp

@@ -1,5 +1,12 @@
 #include "CUIMsgRewind.h"
-
+#include "FETU.h"
+#include "FESU.h"
+#include "LOCstring.h"
+#include "FREE.h"
+#include "FE2D.h"
+#include "CStoryCore.h"
+#include "FEU.h"
+#include "TStoryConfig.h"
 //-------------------------------------------------------------------------------------------------
 //001354C0
 CUIMsgRewind::CUIMsgRewind() {
@@ -7,10 +14,221 @@ CUIMsgRewind::CUIMsgRewind() {
 //-------------------------------------------------------------------------------------------------
 //00135554
 void CUIMsgRewind::Render() {
+  // 00135554
+  wchar_t var_D8_sp228[64];
+  TImage var_2D8_sp28;
+  TRect rc_2E8;
+  float s0_f = 24.0;
+  float s22_f = 0.5;
+  float s28_f = this->field_14;
+  // 47AEA8 - 0x477E90 =3018
+  float s26_f = this->field_10;
+  float s30_f = this->field_8;
+  float r5_f = s26_f;
+  float s17_f = this->field_C;
+  s0_f = s28_f + s0_f;
+  int r8_i = MP_cMyProfile.m_TProfileData.m_CGameSettings_2b80.filed_0.filed_0;
+  float s20_f = s26_f * s22_f;
+  // 00135596
+  if (r8_i == 11) {
+    // 0013559C
+    s28_f = s0_f;
+  }
+  // 001355A0
+  float s19_f = this->field_24;
+  float s18_f = s28_f * s22_f;
+  float s21_f = this->field_28;
+  float s16_f = s30_f - s20_f;
+  float s23_f = this->field_1C;
+  float s24_f = s17_f - s18_f;
+  RenderBox(s16_f, s24_f, s26_f, s28_f);
+  RenderBorder(s16_f, s24_f, s26_f, s28_f);
+  RenderOptions();
+  int r5_i = 1;
+  FESU_SetFont(1);
+  int r7_i = -1;
+  int r6_i = 0;
+  FTTFont_SetColour(0xFFFFFFFF, 0);
+  int r0_i = FREE_tInfo.filed_0.b_8;
+  float r1_f;
+  // 00135604
+  if (r0_i != 0) {
+    // 00135608
+    wchar_t *r2_pwc = LOCstring(193);
+    xsnprintf(var_D8_sp228, 64, r2_pwc);
+    FESU_Capitalize(var_D8_sp228, var_D8_sp228, -1);
+    FESU_SetFontScale(0.699999988079071, -1);
+    // 0013562E
+    if (r8_i == 11) {
+      // 00135634
+      FESU_SetFontScale(0.5, -1);
+    }
+    // loc_13563E
+    FTTFont_SetAlign(EFontAlign_2);
+    s0_f = s26_f * 0.300000012f;
+    FESU_SetFontScaleForWidth(var_D8_sp228, s0_f);
+    s0_f = -25.0f;
+    float s4_f = 82;
+    float s2_f = 4;
+    float r6_f = -0.5235987901687622;
+    s4_f = s16_f + s4_f;
+    s0_f = s17_f + s0_f;
+    float s25_f = s0_f + s2_f;
+    FTTFont_PrintRotUnicode(s4_f, s25_f, r6_f, s4_f, s25_f, var_D8_sp228);
+    s0_f = s30_f + s20_f + (float)(-50.0) + (float)(-44.0);
+    // loc_13576E
+    FTTFont_PrintRotUnicode(s0_f, s25_f, r6_f, s0_f, s25_f, var_D8_sp228);
+  } else {
+    // loc_1356AE
+    FETU_GetImage(&var_2D8_sp28, "credits.png",
+                  0, EFTTTexFormat_19,
+                  0, 0, 1);
+    s0_f = -25.0;
+    float s6_f = -50.0;
+    float s2_f = s30_f + s20_f;
+    float r3_f = 50;
+    float s4_f = -8.0;
+    float s25_f = s17_f + s0_f;
+    s0_f = -20.0;
+    s2_f = s2_f + s6_f;
+    s4_f = s25_f + s4_f;
+    s0_f = s2_f + s0_f;
+    float r5_f = s0_f;
+    FE2D_DrawTexScaleColRot(&var_2D8_sp28, s0_f, s4_f, r3_f, r3_f, 0xFFFFFFFF, s23_f, s19_f, s21_f);
+    FESU_SetFontScale(0.699999988079071, -1);
+    FTTFont_SetAlign(EFontAlign_1);
+    // 4B0E28 - 0x4AB140
+    r0_i = CStoryCore::m_tStageManager.GetPlayableIndex(
+        CStoryCore::m_tStageManager.filed_5ce8);
+    // 0013572A
+    if (r0_i >= 9) {
+      // 0013572E
+      r0_i = 9;
+    }
+    // 00135730
+    wchar_t *r3_pwc = FESU_GetCommaSeperatedString(STY_tConfig.RewindCosts_5c8[r0_i],
+                                                   3);
+
+    xsnprintf(var_D8_sp228, 64, L"%s", r3_pwc);
+    s0_f = -2.0;
+    s0_f = s25_f + s0_f;
+    // loc_13576E
+    FTTFont_PrintRotUnicode(r5_f, s0_f, s23_f, r5_f, s0_f, var_D8_sp228);
+  }
+  // 00135772
+  FTTFont_SetAlign(EFontAlign_2);
+  FESU_SetFont(1);
+  float r0_f;
+  switch (r8_i) {
+    case 1:
+    case 6: {
+      // loc_135796
+      r0_f = 0.4000000059604645;
+      r1_f = -1;
+      FESU_SetFontScale(r0_f, r1_f);
+      break;
+    }
+    case 4:
+    case 5: {
+      // loc_13579A
+      r0_f = 0.47999998927116394;
+      r1_f = -1;
+      FESU_SetFontScale(r0_f, r1_f);
+      break;
+    }
+    case 2: {
+      // loc_13579E
+      r0_f = 0.4099999964237213;
+      r1_f = -1;
+      FESU_SetFontScale(r0_f, r1_f);
+      break;
+    }
+    case 3:
+    case 7:
+    case 8:
+    case 10:
+    default: {
+      // def_135786
+      r1_f = -1;
+      r0_f = 0.5f;
+      FESU_SetFontScale(r0_f, r1_f);
+      break;
+    }
+    case 9: {
+      // loc_1357AA
+      r0_f = 0.41999998688697815;
+      r1_f = -1;
+      FESU_SetFontScale(r0_f, r1_f);
+      break;
+    }
+    case 11: {
+      // loc_1357AE
+      r0_f = 0.44999998807907104;
+      r1_f = -1;
+      FESU_SetFontScale(r0_f, r1_f);
+      break;
+    }
+  }
+  // loc_1357B2
+  wchar_t *r2_pwc = LOCstring(6167);
+  wchar_t buf_sp28[0x100];
+  xsnprintf(buf_sp28, 256, r2_pwc);
+  s0_f = 0.800000012f;
+  s0_f = s26_f * s0_f;
+  float r6_f = FESU_BalanceWithWrapWidth(buf_sp28, s0_f, 50);
+  /*
+   * 此处返回类型很可能是TRect的,但为了不影响其它函数,暂时保留TextDimensions类型
+   */
+  TextDimensions var_2E8_sp18 =
+      FTTFont_GetUnicodeTextDimensionsWrap(EFontWrapType_2,
+                                           r6_f, buf_sp28);
+  s0_f = s17_f + s18_f;
+  float s2_f = var_2E8_sp18.field_4;
+  float s4_f = -12.0;
+  s0_f = s0_f - s2_f;
+  s0_f = s0_f + s4_f;
+  FTTFont_PrintWrapRotUnicode(s30_f, s0_f, EFontWrapType_2,
+                              r6_f, s28_f, s23_f, s19_f, s21_f, buf_sp28);
+
+  rc_2E8.fy_4 = s24_f;
+  rc_2E8.fx_0 = s16_f;
+  rc_2E8.fWidth_8 = s26_f;
+  rc_2E8.fHeight_C = s28_f;
+  r0_i = this->filed_84;
+  // 00135838
+  if (r0_i != 0) {
+    // 0013583A
+    s0_f = r0_i;
+    s2_f = 0.015625;
+    s0_f = s0_f * s2_f;
+    r0_f = FEU_UpdateHighlightRect(&rc_2E8, s0_f);
+    s0_f = rc_2E8.fWidth_8;
+    s2_f = rc_2E8.fHeight_C;
+    s20_f = s0_f * s22_f;
+    s16_f = rc_2E8.fx_0;
+    s18_f = s2_f * s22_f;
+    s24_f = rc_2E8.fy_4;
+    s0_f = r0_f;
+  } else {
+    // loc_135872
+    s0_f = 1.0;
+  }
+  // loc_135876
+  s2_f = s24_f + s18_f;
+  s4_f = 160.0;
+  float s6_f = -0.5;
+  float s10_f = 66.0;
+  s4_f = s0_f * s4_f;
+  float s8_f = s16_f + s20_f;
+  s2_f = s2_f - s18_f;
+  s8_f = s8_f + s4_f * s6_f;
+  s2_f = s2_f + s0_f * s10_f;
+  RenderRewindIcon(s8_f, s2_f, s4_f, s4_f);
 }
 //-------------------------------------------------------------------------------------------------
 //00135918
-void CUIMsgRewind::RenderRewindIcon(float, float, float, float) {
+void CUIMsgRewind::RenderRewindIcon(float f1, float f2, float f3, float f4) {
+ LOGE("CUIMsgRewind::RenderRewindIcon%p%f%f%f%f",this,f1,f2,f3,f4);
 }
 //-------------------------------------------------------------------------------------------------
 //00135B78

+ 1 - 0
jni/FE2D.cpp

@@ -204,6 +204,7 @@ void FE2D_DrawTexScaleColRot(CFTTTexture *pTexture,
 //00149324 //^_^
 void FE2D_DrawTexScaleColRot(TImage *pImage, float f1, float f2, float f3, float f4, uint a5, float f6, float f7, float f8) {
   LOGI("FE2D_DrawTexScaleColRot 00149324 entry");
+  LOGE("%p%f%f%f%f%x%f%f",pImage,f1,f2,f3,f4,a5,f6,f7,f8);
 }
 //-------------------------------------------------------------------------------------------------
 //0014935A //^_^

+ 8 - 6
jni/FESU.cpp

@@ -51,6 +51,7 @@ void FESU_GetFontScale(float &, float &) {
 //-------------------------------------------------------------------------------------------------
 //0014D3AC //^_^
 void FESU_SetFontScale(float f_r0_arg, float f_r1_arg) {
+  LOGE("FESU_SetFontScale%f%f",f_r0_arg,f_r1_arg);
 }
 //-------------------------------------------------------------------------------------------------
 //0014D420 //^_- 自认为逻辑相同
@@ -58,8 +59,8 @@ void FESU_SetFontScale(float f_r0_arg, float f_r1_arg) {
 //单元测试结果: 无结果。玩了前两关游戏,函数并没有被调用到。查看IDA交叉引用,发现只有在FackBook相关的函数中被调用到
 float FESU_SetFontScaleForWidth(char const *pc_r0_arg, float f_r1_arg) {
   // LOGI("FESU_SetFontScaleForWidth entry");
-
-  return 0;
+ LOGE("FESU_SetFontScaleForWidth%p%f",pc_r0_arg,f_r1_arg);
+  return (float)rand();
 }
 //-------------------------------------------------------------------------------------------------
 //0014D498 //^_-
@@ -69,8 +70,8 @@ float FESU_SetFontScaleForWidth(char const *pc_r0_arg, float f_r1_arg) {
 //注意: 未测试的分支已标注为"分支未测试",原因是环境不支持或者IDA没有交叉引用
 float FESU_BalanceWithWrapWidth(wchar_t const *p_wc_r0_arg, float f_r1_arg, float f_r2_arg) {
   LOGI("FESU_BalanceWithWrapWidth entry");
-
-  return 0;
+LOGE("FESU_SetFontScaleForWidth%p%f%f",p_wc_r0_arg,f_r1_arg,f_r2_arg);
+ return (float)rand();
 }
 //-------------------------------------------------------------------------------------------------
 //0014D508 //^_-
@@ -78,12 +79,13 @@ float FESU_BalanceWithWrapWidth(wchar_t const *p_wc_r0_arg, float f_r1_arg, floa
 //单元测试结果: 玩了前两关游戏,只产生一组数据,无法测试所有分支,这一组数据的测试结果相同
 wchar_t *FESU_GetCommaSeperatedString(long long ll_r0_r1_arg, int d_r2_arg) {
   LOGI("ZZFESU_GetCommaSeperatedString entry");
-
-  return 0;
+  LOGE("%lld%dFESU_GetCommaSeperatedString",ll_r0_r1_arg,d_r2_arg);
+  return (wchar_t*)rand();
 }
 //-------------------------------------------------------------------------------------------------
 //0014D62C //^_^
 void FESU_SetFont(int d_r0_arg) {
+  LOGE("FESU_SetFont%x",d_r0_arg);
 }
 //-------------------------------------------------------------------------------------------------
 //0014D658

+ 2 - 1
jni/FEU.cpp

@@ -75,7 +75,8 @@ void FEU_DrawLoadingWheel(float f0, float f1, float f2) {
 //-------------------------------------------------------------------------------------------------
 //0014BA50
 float FEU_UpdateHighlightRect(TRect *pRect, float f2) {
-  return 0;
+  LOGE("FEU_UpdateHighlightRect%p%x",pRect,f2);
+  return (float)rand();
 }
 //-------------------------------------------------------------------------------------------------
 

+ 11 - 11
jni/FREE.cpp

@@ -571,25 +571,25 @@ void FREE_ProcessInProgressCore() {}
 // 001D956C
 void FREE_UpdateSuccess(void) {
   // 001D956C
-  TPoint3D var_30;
-  TPoint3D var_40;
+  TPoint3D var_30_sp20;
+  TPoint3D var_40_sp10;
 
   /*
    * 描述:寄存嚣加载略有不同,VLDR,VLD1.8这两个不知道到底什么区别
    * 原始汇编:VLDR            D16, [R2]
    * 自己汇编:VLD1.8          {D16}, [R2]
    */
-  TPoint3D var_50 = FREE_tInfo.filed_0.point3D_1848;
+  TPoint3D var_50_sp0 = FREE_tInfo.filed_0.point3D_1848;
   // 001D958E
   if (FREE_tInfo.filed_0.field_1840 > -1) {
     // 001D959C
-    int r1_i = FREE_tInfo.filed_0.point3D_1848.dz_8;
+    int r1_i = var_50_sp0.dz_8;
     // 001D95A8
     if (r1_i <= 0x1000) {
       // 001D95A8
       r1_i = 0x1000;
     }
-    var_50.dz_8 = r1_i;
+    var_50_sp0.dz_8 = r1_i;
     cBallProj.EnsureProj(FREE_tInfo.filed_0.kickTargetTime_1838 + 10);
     int r0_i = FREE_tInfo.filed_0.kickTargetTime_1838;
     int r7_i = 0x7FFFFFFF;
@@ -604,22 +604,22 @@ void FREE_UpdateSuccess(void) {
       // 47F7EC - 0x47DFB0 =183C
       r0_i = r0_i + r5_i;
       r0_i = r0_i % 512;
-      var_40 = cBallProj.field_E8[r0_i].point3D_0;
+      var_40_sp10 = cBallProj.field_E8[r0_i].point3D_0;
       // r9 = var40
       if (FREE_tInfo.filed_0.field_183C[0] != 0) {
         // 001D960E
-        r0_i = XMATH_Distance(&var_40.point_0, &var_50.point_0);
+        r0_i = XMATH_Distance(&var_40_sp10.point_0, &var_50_sp0.point_0);
       } else {
         // loc_1D9616
-        r0_i = XMATH_Distance3D(&var_40, &var_50);
+        r0_i = XMATH_Distance3D(&var_40_sp10, &var_50_sp0);
       }
       // loc_1D961C
       if (r0_i < r7_i) {
         // 001D9620
         r7_i = r0_i;
         r8_i = r5_i;
-        r11_i = var_40.dz_8 - var_50.dz_8;
-        var_30 = var_40;
+        r11_i = var_40_sp10.dz_8 - var_50_sp0.dz_8;
+        var_30_sp20 = var_40_sp10;
       }
       // loc_1D9636
       // 47F7E8 - 0x47DFB0 =1838
@@ -633,7 +633,7 @@ void FREE_UpdateSuccess(void) {
     }
     // loc_1D9660
     cBallProj.EnsureProj(r8_i + 1);
-    FREE_tInfo.filed_0.point3D_1848 = var_30;
+    FREE_tInfo.filed_0.point3D_1848 = var_30_sp20;
     FREE_tInfo.field_1884 = tGame.maybe_sound_0 + r8_i;
     FREE_tInfo.filed_0.gamestatus_1828 = 7;
     // 47F834 - 0x47DFB0 =1884

+ 1 - 0
jni/FTTFont.cpp

@@ -198,6 +198,7 @@ void FTTFont_PrintfUnicode(float f_r0, float f_r1, wchar_t const *p_wc_r2, ...)
 //001FCE88
 //^_^
 void FTTFont_PrintRotUnicode(float f_r0, float f_r1, float f_r2, float f_r3, float f_arg_0, wchar_t const *p_wc_arg_4) {
+LOGE("FTTFont_PrintRotUnicode%f%f%f%f%f%p",f_r0,f_r1,f_r2,f_r3,f_arg_0,p_wc_arg_4);
 }
 //-------------------------------------------------------------------------------------------------
 //001FCEC0 //^_-

+ 40 - 38
jni/GM.h

@@ -4,110 +4,112 @@
 
 #include "CPlayer.h"
 
-//0015B0A4
+// 0015B0A4
 void GM_CheckGoalSide();
 
-//0015B340
+// 0015B340
 void GM_CalcPlayerDist();
 
-//0015B7C8
+// 0015B7C8
 void GM_IsOnPitch(TPoint);
 
-//0015B7F8
+// 0015B7F8
 void GM_SwapInt(int &, int &);
 
-//0015B804
+// 0015B804
 int GM_CalcGoalDist(TPoint, int);
 
-//0016E0BC
+// 0016E0BC
 void GM_GetRotPowerTrajectory(TPoint3D, int *, int *, int *);
 
-//0016E108
+// 0016E108
 void GM_GetVecFromRotPowerTrajectory(TPoint3D *, int, int, int);
 
-//00171E50
+// 00171E50
 void GM_DeflectBallFromDribbler(CPlayer *, int *);
 
-//00178C7C
+// 00178C7C
 int GM_CheckInterception(CPlayer *, int, int, int);
 
-//00178D3C
+// 00178D3C
 void GM_CheckInterceptionPos(CPlayer *, int, int, TPoint *);
 
-//00179170
+// 00179170
 void GM_CheckInterceptionX(CPlayer *, int);
 
-//0017918C
+// 0017918C
 void GM_CalcPlayerBallInterceptions();
 
-//00179A44
+// 00179A44
 int GM_GetPlayerNearestPoint(int, TPoint, int, int *);
 
-//00179AD0
+// 00179AD0
 int GM_GetPlayerNearestPoint(int, TPoint, int *);
 
-//00179B60
+// 00179B60
 void GM_GetPlayerNearestPointF(int, TPoint, int, int, int);
 
-//00179BE0
+// 00179BE0
 void GM_GetPlayerNearestPointFX(int, TPoint, bool *, int, int, int, int);
 
-//00179C80
+// 00179C80
 void GM_GetPlayerNearestPointRange(int, TPoint, bool *, int, int);
 
-//00179F90
-void GM_GetLineIntersectWeighted(TPoint, TPoint, TPoint, int, int, int *, int *);
+// 00179F90
+void GM_GetLineIntersectWeighted(TPoint, TPoint, TPoint, int, int, int *,
+                                 int *);
 
-//0017A04C
-void GM_GetPlayerFutureNearestLineWeighted(int, int, bool *, TPoint3D, TPoint3D, int, int, int *, int *);
+// 0017A04C
+void GM_GetPlayerFutureNearestLineWeighted(int, int, bool *, TPoint3D, TPoint3D,
+                                           int, int, int *, int *);
 
-//0017A24C
+// 0017A24C
 int GM_GetPlayerFutureNearestLine(int, CPlayer *, TPoint, TPoint, int *, int *);
 
-//0017A340
+// 0017A340
 void GM_GetPlayerTotalSpace(int, int);
 
-//0017A510
+// 0017A510
 void GM_GetPointSpace(int, TPoint);
 
-//0017A558
+// 0017A558
 void GM_GetPlayerSpaceRot(CPlayer *, int, int, int);
 
-//0017A744
+// 0017A744
 void GM_DistanceSq(TPoint const *, TPoint const *);
 
-//0017A76A
+// 0017A76A
 void GM_Distance(TPoint const *, TPoint const *);
 
-//0017A796
+// 0017A796
 int GM_Distance3D(TPoint3D const *, TPoint3D const *);
 
-//0017A7DA
+// 0017A7DA
 void GM_PlayerLimitDistancePos(CPlayer *, TPoint, int);
 
-//0017A810
+// 0017A810
 void GM_PlayerLimitDistance(CPlayer *, int);
 
-//0017A858
+// 0017A858
 void GM_PlayerLimitDistancePosPol(CPlayer *, TPoint, int, int);
 
-//0017A898
+// 0017A898
 void GM_SetBestPointSpace(int, TPoint *, int, int);
 
-//0017A9EC
+// 0017A9EC
 void GM_PointIsBetweenPoints(TPoint, TPoint, TPoint, int);
 
-//0017AA3A
+// 0017AA3A
 void GM_TendAngle(int, int);
 
-//0017AA88
+// 0017AA88
 float GM_BlendAngleF(float, float, float);
 
-//0017AB34
+// 0017AB34
 float GM_BlendAngleAroundF(float, float, float, float);
 
-//0017ABC8
-int  GM_BlendAngle(int, int, int);
+// 0017ABC8
+int GM_BlendAngle(int i_0, int i_1, int i2) ;
 
 extern int GM_iInterceptScale[513];