diff --git a/client/src/Class320.java b/client/src/Class320.java index 4ff6b089..3e6a9ecf 100644 --- a/client/src/Class320.java +++ b/client/src/Class320.java @@ -5,6 +5,7 @@ final class Class320 { static short aShort3992 = 320; static int anInt3993; + static int anInt3995 = Constant.ZOOM_OFFSET_DEFAULT; static float aFloat3994; static final boolean method2547(int i, byte i_0_) { diff --git a/client/src/Class348_Sub42_Sub3.java b/client/src/Class348_Sub42_Sub3.java index b2ce5651..58ed3c06 100644 --- a/client/src/Class348_Sub42_Sub3.java +++ b/client/src/Class348_Sub42_Sub3.java @@ -24,6 +24,19 @@ static final void method3174(int i, int i_0_, int i_1_, boolean bool, byte i_2_, if (i_4_ < 0) i_4_ = 0; else if (i_4_ > 100) i_4_ = 100; int i_5_ = ((-Class110.aShort1700 + Class168.aShort2250) * i_4_ / 100 + Class110.aShort1700); + int i_5_base = i_5_; + if (Class320.anInt3995 != 0) i_5_ += Class320.anInt3995; + int i_5_min = Class110.aShort1700 * Constant.FOV_MIN_FACTOR_NUM / Constant.FOV_MIN_FACTOR_DEN; + int i_5_max = Class168.aShort2250 * Constant.FOV_MAX_FACTOR_NUM / Constant.FOV_MAX_FACTOR_DEN; + if (i_5_min < Constant.FOV_MIN_ABS) i_5_min = Constant.FOV_MIN_ABS; + if (i_5_min > i_5_max) { + int i_5_tmp = i_5_min; + i_5_min = i_5_max; + i_5_max = i_5_tmp; + } + if (i_5_ < i_5_min) i_5_ = i_5_min; + else if (i_5_ > i_5_max) i_5_ = i_5_max; + if (Class320.anInt3995 != 0) Class320.anInt3995 = i_5_ - i_5_base; if (i_5_ < Class348_Sub42_Sub8.aShort9555) i_5_ = Class348_Sub42_Sub8.aShort9555; else if (Class48.aShort851 < i_5_) i_5_ = Class48.aShort851; int i_6_ = 512 * i_5_ * i_3_ / (i_1_ * 334); diff --git a/client/src/Constant.java b/client/src/Constant.java new file mode 100644 index 00000000..54d526a8 --- /dev/null +++ b/client/src/Constant.java @@ -0,0 +1,13 @@ +final class Constant { + static final int ZOOM_OFFSET_DEFAULT = 0; // Linear zoom offset added to the computed FOV (0 = no offset). + static final int ZOOM_OFFSET_STEP = 15; // Scroll step size for the linear zoom offset. + + static final int FOV_MIN_FACTOR_NUM = 1; // FOV minimum as a fraction of the base min (numerator). + static final int FOV_MIN_FACTOR_DEN = 4; // FOV minimum as a fraction of the base min (denominator). + static final int FOV_MAX_FACTOR_NUM = 4; // FOV maximum as a fraction of the base max (numerator). + static final int FOV_MAX_FACTOR_DEN = 1; // FOV maximum as a fraction of the base max (denominator). + static final int FOV_MIN_ABS = 50; // Absolute minimum FOV clamp regardless of base settings. + + private Constant() { + } +} diff --git a/client/src/client.java b/client/src/client.java index 60dcfa1d..6b0d860e 100644 --- a/client/src/client.java +++ b/client/src/client.java @@ -1764,7 +1764,11 @@ private final void method114(int i) { Class318_Sub1_Sub3.aClass262_8744.method1999(class348_sub45, -20180); if (Class318_Sub1_Sub3.aClass262_8744.method1998(0) > 10) Class318_Sub1_Sub3.aClass262_8744.method1997(8); } - } else Class98.anInt1565 += class348_sub45.method3315(0); + } else { + int i_112_ = class348_sub45.method3315(0); + Class98.anInt1565 += i_112_; + Class320.anInt3995 += -i_112_ * Constant.ZOOM_OFFSET_STEP; + } } else r_Sub1.aClass262_10479.method1999(class348_sub45, -20180); } if (Class348_Sub42_Sub16_Sub2.method3263(true)) Class38.method363(125);