From 97906c50d1989cacfdfb377171c078dafdf37305 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 3 May 2020 21:13:37 +0100 Subject: [PATCH] Fix BFG Fixes the BFG (now as devastating as it was before) Many cvar defaults courtesy of VR_Bummser --- Projects/Android/AndroidManifest.xml | 4 +-- .../Android/jni/QzDoom/QzDoom_SurfaceView.c | 2 +- .../jni/gzdoom-g3.3mgw_mobile/src/actor.h | 5 ++- .../gzdoom-g3.3mgw_mobile/src/c_console.cpp | 2 +- .../src/gl/renderer/gl_postprocess.cpp | 2 +- .../src/gl/stereo3d/gl_oculusquest.cpp | 6 ++-- .../src/gl/stereo3d/gl_stereo_cvars.cpp | 6 ++-- .../src/gl/system/gl_framebuffer.cpp | 2 +- .../src/gl/system/gl_menu.cpp | 2 +- .../gzdoom-g3.3mgw_mobile/src/menu/menu.cpp | 2 +- .../gzdoom-g3.3mgw_mobile/src/p_effect.cpp | 2 +- .../jni/gzdoom-g3.3mgw_mobile/src/p_map.cpp | 32 +++++++++++++----- .../gzdoom-g3.3mgw_mobile/src/p_teleport.cpp | 2 +- .../gzdoom-g3.3mgw_mobile/src/r_utility.cpp | 2 +- .../src/sound/i_music.cpp | 2 +- .../jni/gzdoom-g3.3mgw_mobile/src/v_video.cpp | 2 +- .../jni/gzdoom-g3.3mgw_mobile/src/version.h | 2 +- .../static/zscript/actors/doom/weaponbfg.zs | 12 +++---- assets/res/lzdoom.pk3 | Bin 1251638 -> 1251661 bytes 19 files changed, 55 insertions(+), 34 deletions(-) diff --git a/Projects/Android/AndroidManifest.xml b/Projects/Android/AndroidManifest.xml index d7f1e86..199ee3c 100644 --- a/Projects/Android/AndroidManifest.xml +++ b/Projects/Android/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="13" + android:versionName="0.6.0" android:installLocation="auto" > diff --git a/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c b/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c index a3edc7d..a82a3d9 100644 --- a/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c +++ b/Projects/Android/jni/QzDoom/QzDoom_SurfaceView.c @@ -1288,7 +1288,7 @@ void VR_Init() remote_movementUp = 0.0f; positional_movementSideways = 0.0f; positional_movementForward = 0.0f; - snapTurn = 90.0f; // start partly turned + snapTurn = 0.0f; // start partly turned //init randomiser srand(time(NULL)); diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/actor.h b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/actor.h index 05b8fb0..8f347b4 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/actor.h +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/actor.h @@ -1505,8 +1505,11 @@ public: //For VR, override firing position - Thank-you Fishbiter for this code!! bool OverrideAttackPosDir; + DVector3 AttackPos; - //DVector3 AttackDir; + DAngle AttackPitch; + DAngle AttackAngle; + DVector3 (*AttackDir)(AActor* actor, DAngle yaw, DAngle pitch); }; diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/c_console.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/c_console.cpp index 83b3f78..32616a6 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/c_console.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/c_console.cpp @@ -148,7 +148,7 @@ static char *work = NULL; static int worklen = 0; CVAR(Float, con_notifytime, 3.f, CVAR_ARCHIVE) -CVAR(Bool, con_centernotify, false, CVAR_ARCHIVE) +CVAR(Bool, con_centernotify, true, CVAR_ARCHIVE) CUSTOM_CVAR(Int, con_scaletext, 0, CVAR_ARCHIVE) // Scale notify text at high resolutions? { if (self < 0) self = 0; diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp index d4012d0..46e1592 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp @@ -150,7 +150,7 @@ CUSTOM_CVAR(Bool, gl_paltonemap_reverselookup, true, CVAR_ARCHIVE | CVAR_NOINITC GLRenderer->ClearTonemapPalette(); } -CVAR(Float, gl_menu_blur, -1.0f, CVAR_ARCHIVE) +CVAR(Float, gl_menu_blur, 0.0f, CVAR_ARCHIVE) EXTERN_CVAR(Float, vid_brightness) EXTERN_CVAR(Float, vid_contrast) diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp index b2ae118..a702d0f 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp @@ -370,7 +370,6 @@ namespace s3d DVector3 direction = { pc * yaw.Cos(), pc * yaw.Sin(), -pitch.Sin() }; return direction; } - double pc = pitch.Cos(); yaw -= actor->Angles.Yaw; @@ -378,7 +377,7 @@ namespace s3d //pitch -= actor->Angles.Pitch; pitch.Degrees = 0; - pc = pitch.Cos(); + double pc = pitch.Cos(); LSVec3 local = { (float)(pc * yaw.Cos()), (float)(pc * yaw.Sin()), (float)(-pitch.Sin()), 0.0f }; @@ -473,6 +472,9 @@ namespace s3d { player->mo->OverrideAttackPosDir = true; + player->mo->AttackPitch = -weaponangles[PITCH]; + player->mo->AttackAngle = -90 + (doomYaw - hmdorientation[YAW]) + weaponangles[YAW]; + player->mo->AttackPos.X = player->mo->X() - (weaponoffset[0] * vr_vunits_per_meter); player->mo->AttackPos.Y = player->mo->Y() - (weaponoffset[2] * vr_vunits_per_meter); player->mo->AttackPos.Z = player->mo->Z() + (((hmdPosition[1] + weaponoffset[1] + vr_height_adjust) * vr_vunits_per_meter) / pixelstretch); diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp index 361d5cd..71e397b 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_stereo_cvars.cpp @@ -64,15 +64,15 @@ CVAR(Bool, vr_teleport, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_weaponRotate, -30, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_weaponScale, 1.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_snapTurn, 45.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -CVAR(Int, vr_move_speed, 24, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) -CVAR(Float, vr_run_multiplier, 1.6, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Int, vr_move_speed, 19, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Float, vr_run_multiplier, 1.5, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, vr_switch_sticks, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_pickup_haptic_level, 0.2, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_quake_haptic_level, 0.8, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) //HUD control -CVAR(Float, vr_hud_scale, 0.3f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(Float, vr_hud_scale, 0.25f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_hud_stereo, 1.4f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_hud_rotate, 10.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, vr_hud_fixed_pitch, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_framebuffer.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_framebuffer.cpp index b2e71a0..c777b31 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_framebuffer.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_framebuffer.cpp @@ -66,7 +66,7 @@ void gl_PrintStartupLog(); extern bool vid_hdr_active; -CUSTOM_CVAR(Int, vid_hwgamma, 2, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +CUSTOM_CVAR(Int, vid_hwgamma, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) //Defaulted off for VR { if (self < 0 || self > 2) self = 2; if (GLRenderer != NULL && GLRenderer->framebuffer != NULL) GLRenderer->framebuffer->DoSetGamma(); diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_menu.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_menu.cpp index 3aa959b..4761912 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_menu.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/system/gl_menu.cpp @@ -71,7 +71,7 @@ CUSTOM_CVAR (Float, vid_contrast, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) } } -CUSTOM_CVAR (Float, vid_saturation, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CUSTOM_CVAR (Float, vid_saturation, 1.2f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) //Defaulted for VR { if (screen != NULL) { diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp index 11bd149..125aed6 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/menu/menu.cpp @@ -66,7 +66,7 @@ int DMenu::InMenu; // Todo: Move these elsewhere // CVAR (Float, mouse_sensitivity, 1.5f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) -CVAR (Bool, show_messages, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CVAR (Bool, show_messages, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) // Defaulted to off for VR CVAR (Bool, show_obituaries, true, CVAR_ARCHIVE) CVAR (Int, m_showinputgrid, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, m_blockcontrollers, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_effect.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_effect.cpp index 89ae15c..e559a42 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_effect.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_effect.cpp @@ -130,7 +130,7 @@ void P_InitParticles (); // [BC] Allow the maximum number of particles to be specified by a cvar (so people // with lots of nice hardware can have lots of particles!). -CUSTOM_CVAR( Int, r_maxparticles, 4000, CVAR_ARCHIVE ) +CUSTOM_CVAR( Int, r_maxparticles, 100, CVAR_ARCHIVE ) //Default to min for VR { if ( self == 0 ) self = 4000; diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_map.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_map.cpp index d0959b8..e95d983 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_map.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_map.cpp @@ -4179,7 +4179,7 @@ struct aim_t } else continue; // shot over the thing } - continue; // shot under the thing + else continue; // shot under the thing } if (crossedffloors) @@ -4314,17 +4314,27 @@ DAngle P_AimLineAttack(AActor *t1, DAngle angle, double distance, FTranslatedLin aim_t aim; + DVector3 pos = t1->Pos(); + DAngle attackPitch = t1->Angles.Pitch; + DAngle attackAngle = angle; + if (t1->player != nullptr && t1->player->mo->OverrideAttackPosDir) + { + pos = t1->player->mo->AttackPos; + attackPitch = t1->player->mo->AttackPitch; + attackAngle = t1->player->mo->AttackAngle + (angle - t1->Angles.Yaw); + } + aim.flags = flags; aim.shootthing = t1; - aim.friender = (friender == NULL) ? t1 : friender; + aim.friender = (friender == nullptr) ? t1 : friender; aim.aimdir = aim_t::aim_up | aim_t::aim_down; - aim.startpos = t1->Pos(); - aim.aimtrace = angle.ToVector(distance); + aim.startpos = pos; + aim.aimtrace = attackAngle.ToVector(distance); aim.limitz = aim.shootz = shootz; - aim.toppitch = t1->Angles.Pitch - vrange; - aim.bottompitch = t1->Angles.Pitch + vrange; + aim.toppitch = attackPitch - vrange; + aim.bottompitch = attackPitch + vrange; aim.attackrange = distance; - aim.aimpitch = t1->Angles.Pitch; + aim.aimpitch = attackPitch; aim.lastsector = t1->Sector; aim.startfrac = 0; aim.unlinked = false; @@ -4338,7 +4348,13 @@ DAngle P_AimLineAttack(AActor *t1, DAngle angle, double distance, FTranslatedLin { *pLineTarget = *result; } - return result->linetarget ? result->pitch : t1->Angles.Pitch; + + if (result->linetarget) + { + return result->pitch; + } + + return t1->Angles.Pitch; } //========================================================================== diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_teleport.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_teleport.cpp index cfb71c8..dfb2498 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_teleport.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/p_teleport.cpp @@ -50,7 +50,7 @@ static FRandom pr_teleport ("Teleport"); -CVAR (Bool, telezoom, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG); +CVAR (Bool, telezoom, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG); // Default to off for VR //========================================================================== // diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp index 6fbb824..52f8adf 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_utility.cpp @@ -105,7 +105,7 @@ CVAR (Bool, r_deathcamera, false, CVAR_ARCHIVE) CVAR (Int, r_clearbuffer, 0, 0) CVAR (Bool, r_drawvoxels, true, 0) CVAR (Bool, r_drawplayersprites, true, 0) // [RH] Draw player sprites? -CVAR(Int, r_PlayerSprites3DMode, 0, CVAR_ARCHIVE); +CVAR(Int, r_PlayerSprites3DMode, 1, CVAR_ARCHIVE); // Back only as default CVAR(Float, gl_fatItemWidth, 0.5f, CVAR_ARCHIVE); CUSTOM_CVAR(Float, r_quakeintensity, 0.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // Defaulted to 0 for VR { diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/sound/i_music.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/sound/i_music.cpp index 1cb0981..fe803ad 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/sound/i_music.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/sound/i_music.cpp @@ -111,7 +111,7 @@ float saved_relative_volume = 1.0f; // this could be used to implement an ACS Fa // Maximum volume of MOD/stream music. //========================================================================== -CUSTOM_CVAR (Float, snd_musicvolume, 0.5f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CUSTOM_CVAR (Float, snd_musicvolume, 0.6f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) { if (self < 0.f) self = 0.f; diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_video.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_video.cpp index e43b3f0..64291cc 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_video.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/v_video.cpp @@ -195,7 +195,7 @@ CUSTOM_CVAR (Int, vid_refreshrate, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) } } -CUSTOM_CVAR (Float, dimamount, -1.f, CVAR_ARCHIVE) +CUSTOM_CVAR (Float, dimamount, 0.f, CVAR_ARCHIVE) { if (self < 0.f && self != -1.f) { diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h index 549ced3..a960fd1 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/version.h @@ -41,7 +41,7 @@ const char *GetVersionString(); /** Lots of different version numbers **/ -#define VERSIONSTR "DrBeef's QuestZDoom-0.5.5 (LZDoom 3.83a)" +#define VERSIONSTR "DrBeef's QuestZDoom-0.6.0 (LZDoom 3.83a)" // The version as seen in the Windows resource #define RC_FILEVERSION 3,83,1 diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/zscript/actors/doom/weaponbfg.zs b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/zscript/actors/doom/weaponbfg.zs index e92f2ee..edbe47d 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/zscript/actors/doom/weaponbfg.zs +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/wadsrc/static/zscript/actors/doom/weaponbfg.zs @@ -191,19 +191,19 @@ extend class Actor { // // A_BFGSpray - // Spawn a BFG explosion on every monster in view + // Spawn a BFG explosion on every monster in 360 arc of detonating missile // - void A_BFGSpray(class spraytype = "BFGExtra", int numrays = 40, int damagecnt = 15, double ang = 90, double distance = 16*64, double vrange = 32, int defdamage = 0, int flags = 0) + void A_BFGSpray(class spraytype = "BFGExtra", int numrays = 160, int damagecnt = 15, double ang = 360, double distance = 12*64, double vrange = 45, int defdamage = 0, int flags = BFGF_MISSILEORIGIN) { int damage; FTranslatedLineTarget t; // validate parameters if (spraytype == null) spraytype = "BFGExtra"; - if (numrays <= 0) numrays = 40; + if (numrays <= 0) numrays = 140; if (damagecnt <= 0) damagecnt = 15; - if (ang == 0) ang = 90.; - if (distance <= 0) distance = 16 * 64; + if (ang == 0) ang = 360.; + if (distance <= 0) distance = 10 * 64; if (vrange == 0) vrange = 32.; // [RH] Don't crash if no target @@ -216,7 +216,7 @@ extend class Actor // offset angles from its attack ang for (int i = 0; i < numrays; i++) { - double an = angle - ang / 2 + ang / numrays*i; + double an = angle - ang / 2 + ((ang / numrays) * i); originator.AimLineAttack(an, distance, t, vrange); diff --git a/assets/res/lzdoom.pk3 b/assets/res/lzdoom.pk3 index ae870903203ee6c29d94d874c3f824c87e7c15ec..f13c5509d56d7dfa9308af70cad0be988c27be31 100644 GIT binary patch delta 5791 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 bNDIO#901{hm_I=j%m`wp9O~V4_)F>kxtf3z