mirror of
https://github.com/zeldaret/ss
synced 2026-07-09 14:15:23 -04:00
d_rumble OK
This commit is contained in:
@@ -10,7 +10,7 @@ draw__17dTgGateToGround_cFv = .text:0x000002F0; // type:function size:0x8
|
||||
__dt__17dTgGateToGround_cFv = .text:0x00000300; // type:function size:0x70
|
||||
_ctors = .ctors:0x00000000; // type:label scope:global
|
||||
_dtors = .dtors:0x00000000; // type:label scope:global
|
||||
@20562 = .rodata:0x00000000; // type:object size:0x4 data:float scope:local
|
||||
@20562 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float
|
||||
g_profile_GATE2GND_TAG = .data:0x00000000; // type:object size:0x10
|
||||
@20583 = .data:0x00000010; // type:object size:0xC scope:local
|
||||
__vt__17dTgGateToGround_c = .data:0x0000001C; // type:object size:0x74
|
||||
|
||||
@@ -309,10 +309,13 @@ d/d_cursor_hit_check.cpp:
|
||||
.sbss start:0x80575260 end:0x80575268
|
||||
.sdata2 start:0x80577938 end:0x80577958
|
||||
|
||||
toBeSorted/d_rumble.cpp:
|
||||
d/d_rumble.cpp:
|
||||
.text start:0x800664F0 end:0x80066F58 align:16
|
||||
.ctors start:0x804DB6A0 end:0x804DB6A4
|
||||
.sbss start:0x80575268 end:0x80575270
|
||||
.data start:0x8050DFA0 end:0x8050DFAC
|
||||
.sbss start:0x80575268 end:0x8057526C
|
||||
.sdata2 start:0x80577958 end:0x80577994
|
||||
.bss start:0x805A0778 end:0x805A0868
|
||||
|
||||
toBeSorted/string_util.cpp:
|
||||
.text start:0x80066F60 end:0x80066FB0 align:16
|
||||
|
||||
+28
-27
@@ -2886,17 +2886,17 @@ getCursorPos__18dCursorInterface_cFv = .text:0x80066480; // type:function size:0
|
||||
__dt__18dCursorInterface_cFv = .text:0x80066490; // type:function size:0x40
|
||||
getType__20dCursorHitCheckLyt_cFv = .text:0x800664D0; // type:function size:0xC
|
||||
getType__19dCursorHitCheckCC_cFv = .text:0x800664E0; // type:function size:0xC
|
||||
fn_800664F0 = .text:0x800664F0; // type:function size:0x10
|
||||
fn_80066500 = .text:0x80066500; // type:function size:0x48
|
||||
fn_80066550 = .text:0x80066550; // type:function size:0x54
|
||||
fn_800665B0 = .text:0x800665B0; // type:function size:0x4B8
|
||||
fn_80066A70 = .text:0x80066A70; // type:function size:0x90
|
||||
fn_80066B00 = .text:0x80066B00; // type:function size:0x224
|
||||
fn_80066D30 = .text:0x80066D30; // type:function size:0x54
|
||||
fn_80066D90 = .text:0x80066D90; // type:function size:0x10
|
||||
fn_80066DA0 = .text:0x80066DA0; // type:function size:0x5C
|
||||
fn_80066E00 = .text:0x80066E00; // type:function size:0x44
|
||||
fn_80066E50 = .text:0x80066E50; // type:function size:0x108
|
||||
__ct__9dRumble_cFv = .text:0x800664F0; // type:function size:0x10
|
||||
__dt__9dRumble_cFv = .text:0x80066500; // type:function size:0x48
|
||||
init__9dRumble_cFv = .text:0x80066550; // type:function size:0x54
|
||||
play__9dRumble_cFv = .text:0x800665B0; // type:function size:0x4B8
|
||||
deinit__9dRumble_cFv = .text:0x80066A70; // type:function size:0x90
|
||||
start__9dRumble_cFRC14dRumbleEntry_cUl = .text:0x80066B00; // type:function size:0x224
|
||||
stop__9dRumble_cFl = .text:0x80066D30; // type:function size:0x54
|
||||
__ct__14dRumbleEntry_cFlUlf = .text:0x80066D90; // type:function size:0x10
|
||||
start__12dRumbleIdx_cFRC14dRumbleEntry_cUl = .text:0x80066DA0; // type:function size:0x5C
|
||||
stop__12dRumbleIdx_cFv = .text:0x80066E00; // type:function size:0x44
|
||||
__sinit_\d_rumble_cpp = .text:0x80066E50; // type:function size:0x108 scope:local
|
||||
fn_80066F60 = .text:0x80066F60; // type:function size:0x50
|
||||
lzSafeDecompress__FPCvUlPv = .text:0x80066FB0; // type:function size:0x64
|
||||
matrixCreateFromPosRotYScale__FR6mMtx_cRC7mVec3_c4mAngRC7mVec3_cP6mMtx_cf = .text:0x80067020; // type:function size:0x138
|
||||
@@ -14106,7 +14106,7 @@ __dt__30sFStateFct_c<14dAcBoomerang_c>Fv = .text:0x80260FD0; // type:function si
|
||||
__dt__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80261040; // type:function size:0xA0
|
||||
__dt__53sFStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c>Fv = .text:0x802610E0; // type:function size:0xA4
|
||||
areaCallback__FP12dAcObjBase_cP7mVec3_cUl = .text:0x80261190; // type:function size:0x18
|
||||
hitCallback__14dAcBoomerang_cFP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x802611B0; // type:function size:0x290
|
||||
atHitCallback__14dAcBoomerang_cFP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x802611B0; // type:function size:0x290
|
||||
fn_80261440 = .text:0x80261440; // type:function size:0x10
|
||||
dAcBoomerang_atHitCallback__FP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x80261450; // type:function size:0x24
|
||||
AcBoomerang__assignBeetleModel = .text:0x80261480; // type:function size:0x5C
|
||||
@@ -30867,7 +30867,7 @@ __vt__18dCursorInterface_c = .data:0x8050DF60; // type:object size:0x10
|
||||
__vt__20dCursorHitCheckLyt_c = .data:0x8050DF70; // type:object size:0x14
|
||||
__vt__24dCsCheckLyt_BoundingData = .data:0x8050DF84; // type:object size:0xC
|
||||
__vt__19dCursorHitCheckCC_c = .data:0x8050DF90; // type:object size:0x10
|
||||
lbl_8050DFA0 = .data:0x8050DFA0; // type:object size:0x10
|
||||
__vt__9dRumble_c = .data:0x8050DFA0; // type:object size:0xC
|
||||
lbl_8050DFB0 = .data:0x8050DFB0; // type:object size:0xC
|
||||
lbl_8050DFBC = .data:0x8050DFBC; // type:object size:0xC
|
||||
lbl_8050DFC8 = .data:0x8050DFC8; // type:object size:0xC
|
||||
@@ -41337,8 +41337,8 @@ dSystem__s_NewMEM1ArenaHi = .sbss:0x80575240; // type:object size:0x8 data:4byte
|
||||
dSystem__myDylinkInitPhase = .sbss:0x80575248; // type:object size:0x8
|
||||
sInstance__18ArcCallbackHandler = .sbss:0x80575250; // type:object size:0x8 data:4byte
|
||||
aspectRatio = .sbss:0x80575258; // type:object size:0x4 align:4 data:float
|
||||
sInstance__8dCsMgr_c = .sbss:0x80575260; // type:object size:0x8 data:4byte
|
||||
lbl_80575268 = .sbss:0x80575268; // type:object size:0x8 data:4byte
|
||||
sInstance__8dCsMgr_c = .sbss:0x80575260; // type:object size:0x4 data:4byte
|
||||
spInstance__9dRumble_c = .sbss:0x80575268; // type:object size:0x4 data:4byte
|
||||
someColor = .sbss:0x80575270; // type:object size:0x1 data:byte
|
||||
reloadColorFaderPtr = .sbss:0x80575274; // type:object size:0x4 data:4byte
|
||||
sInstance__22CurrentStageArcManager = .sbss:0x80575278; // type:object size:0x4 data:4byte
|
||||
@@ -50385,18 +50385,19 @@ sHandMats = .bss:0x805A06C8; // type:object size:0xE scope:local data:byte
|
||||
@7070 = .bss:0x805A06F0; // type:object size:0xC scope:local
|
||||
sFader__8dScene_c = .bss:0x805A06FC; // type:object size:0x24 data:4byte
|
||||
SysConfig = .bss:0x805A0720; // type:object size:0x58 data:4byte
|
||||
lbl_805A0778 = .bss:0x805A0778; // type:object size:0xC data:4byte
|
||||
lbl_805A0784 = .bss:0x805A0784; // type:object size:0xC data:4byte
|
||||
lbl_805A0790 = .bss:0x805A0790; // type:object size:0xC data:4byte
|
||||
lbl_805A079C = .bss:0x805A079C; // type:object size:0xC data:4byte
|
||||
lbl_805A07A8 = .bss:0x805A07A8; // type:object size:0xC data:4byte
|
||||
lbl_805A07B4 = .bss:0x805A07B4; // type:object size:0xC data:4byte
|
||||
lbl_805A07C0 = .bss:0x805A07C0; // type:object size:0x18 data:4byte
|
||||
lbl_805A07D8 = .bss:0x805A07D8; // type:object size:0xC
|
||||
lbl_805A07E4 = .bss:0x805A07E4; // type:object size:0xC
|
||||
lbl_805A07F0 = .bss:0x805A07F0; // type:object size:0xC
|
||||
lbl_805A07FC = .bss:0x805A07FC; // type:object size:0x44 data:byte
|
||||
lbl_805A0840 = .bss:0x805A0840; // type:object size:0x28 data:byte
|
||||
sRumblePreset0__9dRumble_c = .bss:0x805A0778; // type:object size:0xC data:4byte
|
||||
sRumblePreset1__9dRumble_c = .bss:0x805A0784; // type:object size:0xC data:4byte
|
||||
sRumblePreset2__9dRumble_c = .bss:0x805A0790; // type:object size:0xC data:4byte
|
||||
sRumblePreset3__9dRumble_c = .bss:0x805A079C; // type:object size:0xC data:4byte
|
||||
sRumblePreset4__9dRumble_c = .bss:0x805A07A8; // type:object size:0xC data:4byte
|
||||
sRumblePreset5__9dRumble_c = .bss:0x805A07B4; // type:object size:0xC data:4byte
|
||||
sRumblePreset6__9dRumble_c = .bss:0x805A07C0; // type:object size:0xC data:4byte
|
||||
sRumblePreset7__9dRumble_c = .bss:0x805A07CC; // type:object size:0xC data:4byte
|
||||
sRumblePreset8__9dRumble_c = .bss:0x805A07D8; // type:object size:0xC data:4byte
|
||||
sRumblePreset9__9dRumble_c = .bss:0x805A07E4; // type:object size:0xC data:4byte
|
||||
sRumblePreset10__9dRumble_c = .bss:0x805A07F0; // type:object size:0xC data:4byte
|
||||
lbl_805A07FC = .bss:0x805A07FC; // type:object size:0x42 scope:local data:byte
|
||||
lbl_805A0840 = .bss:0x805A0840; // type:object size:0x21 scope:local data:byte
|
||||
@LOCAL@getCurrentStageDirectory__22CurrentStageArcManagerFv@sStageDirTmp = .bss:0x805A0868; // type:object size:0x40 scope:local data:byte
|
||||
s_roomArcTmp = .bss:0x805A08A8; // type:object size:0x20 scope:local data:byte
|
||||
lbl_805A08C8 = .bss:0x805A08C8; // type:object size:0x138 data:2byte
|
||||
|
||||
+1
-1
@@ -424,7 +424,7 @@ config.libs = [
|
||||
Object(Matching, "toBeSorted/arc_callback_handler.cpp"),
|
||||
Object(NonMatching, "d/d_video.cpp"),
|
||||
Object(NonMatching, "d/d_cursor_hit_check.cpp"),
|
||||
Object(NonMatching, "toBeSorted/d_rumble.cpp"),
|
||||
Object(Matching, "d/d_rumble.cpp"),
|
||||
Object(NonMatching, "toBeSorted/string_util.cpp"),
|
||||
Object(NonMatching, "toBeSorted/cx_util.cpp"),
|
||||
Object(NonMatching, "toBeSorted/area_math.cpp"),
|
||||
|
||||
@@ -29,6 +29,10 @@ public:
|
||||
return fn_800918E0(field_0xDA0, a1, a2);
|
||||
}
|
||||
|
||||
void setScreenShakeIntensity(f32 val) {
|
||||
mScreenShakeIntensity = val;
|
||||
}
|
||||
|
||||
private:
|
||||
/* 0x068 */ u8 _0x068[0x6C - 0x068];
|
||||
/* 0x06C */ mVec3_c mPositionMaybe;
|
||||
@@ -37,6 +41,8 @@ private:
|
||||
/* 0xD98 */ void *field_0xD98;
|
||||
/* 0xD9C */ u8 _0xD9C[0xDA0 - 0xD9C];
|
||||
/* 0xDA0 */ void *field_0xDA0;
|
||||
/* 0xDA4 */ u8 _0xDA4[0xDB0 - 0xDA4];
|
||||
/* 0xDB0 */ f32 mScreenShakeIntensity;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
#ifndef D_RUMBLE_H
|
||||
#define D_RUMBLE_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
class dRumbleEntry_c {
|
||||
friend class dRumble_c;
|
||||
|
||||
public:
|
||||
dRumbleEntry_c(s32 length, u32 bits, f32 instesity);
|
||||
|
||||
private:
|
||||
/* 0x00 */ s32 mLength;
|
||||
/* 0x04 */ s32 mBits;
|
||||
/* 0x08 */ f32 mIntensity;
|
||||
};
|
||||
|
||||
class dRumbleIdx_c {
|
||||
public:
|
||||
~dRumbleIdx_c() {
|
||||
stop();
|
||||
}
|
||||
|
||||
/* Queues the entry into the Rumble Manager */
|
||||
bool start(const dRumbleEntry_c &entry, u32 flags);
|
||||
void stop();
|
||||
|
||||
bool isActive() const {
|
||||
return mIdx != -1;
|
||||
}
|
||||
void setIdx(s32 idx) {
|
||||
mIdx = idx;
|
||||
}
|
||||
s32 getIdx() const {
|
||||
return mIdx;
|
||||
}
|
||||
|
||||
private:
|
||||
s32 mIdx;
|
||||
};
|
||||
|
||||
/**
|
||||
* Made-up name.
|
||||
* Size: 0x54
|
||||
*/
|
||||
class dRumble_c {
|
||||
public:
|
||||
enum Flags_c {
|
||||
FLAG_SLOT0 = 0x1,
|
||||
FLAG_SLOT1 = 0x2,
|
||||
FLAG_ACTIVE = 0x10,
|
||||
FLAG_INITIALIZE = 0x200,
|
||||
};
|
||||
|
||||
struct RumbleData {
|
||||
/* 0x00 */ s32 mLength;
|
||||
/* 0x04 */ s32 mBitsLeft;
|
||||
/* 0x08 */ s32 mRumbleBits;
|
||||
/* 0x0C */ u32 mFlags;
|
||||
/* 0x10 */ f32 mIntensity;
|
||||
};
|
||||
|
||||
public:
|
||||
/** Generates the instance */
|
||||
static void init();
|
||||
/** Deletes the instance */
|
||||
static void deinit();
|
||||
|
||||
/** Runs the rumble instances */
|
||||
static void play();
|
||||
|
||||
/** inserts a rumble isntance into the manger. returns the index */
|
||||
static s32 start(const dRumbleEntry_c &entry, u32 flags);
|
||||
/** Stops one of the data instances (sets lenght to 0)/ -1 means to stop all */
|
||||
static void stop(s32 idx);
|
||||
|
||||
virtual ~dRumble_c();
|
||||
// 80066e50
|
||||
/** Rumble Presets */
|
||||
static dRumbleEntry_c sRumblePreset0;
|
||||
static dRumbleEntry_c sRumblePreset1;
|
||||
static dRumbleEntry_c sRumblePreset2;
|
||||
static dRumbleEntry_c sRumblePreset3;
|
||||
static dRumbleEntry_c sRumblePreset4;
|
||||
static dRumbleEntry_c sRumblePreset5;
|
||||
static dRumbleEntry_c sRumblePreset6;
|
||||
static dRumbleEntry_c sRumblePreset7;
|
||||
static dRumbleEntry_c sRumblePreset8;
|
||||
static dRumbleEntry_c sRumblePreset9;
|
||||
static dRumbleEntry_c sRumblePreset10;
|
||||
|
||||
private:
|
||||
RumbleData mRumbleData[4];
|
||||
|
||||
private:
|
||||
dRumble_c();
|
||||
static dRumble_c *spInstance;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -47,9 +47,18 @@ void dAcBoomerang_c::atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB,
|
||||
setChrAnimation(RB_HOLD);
|
||||
mAnmChr[0].setRate(0.f);
|
||||
mAnmChr[0].setFrameOnly(i_actorB->GetLinkage().field_0x24);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mStateMgr.isState(StateID_MoveCancelWait)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (i_objInfB->ChkTgBit23()) {
|
||||
setChrAnimation(RB_CUT);
|
||||
}
|
||||
}
|
||||
|
||||
bool dAcBoomerang_atHitCallback(
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "d/col/bg/d_bg_s.h"
|
||||
#include "d/col/bg/d_bg_w.h"
|
||||
#include "d/d_linkage.h"
|
||||
#include "d/d_rumble.h"
|
||||
#include "d/flag/sceneflag_manager.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
#include "s/s_Math.h"
|
||||
@@ -257,11 +258,9 @@ void dAcOsw_c::executeState_On() {
|
||||
}
|
||||
}
|
||||
|
||||
extern char lbl_805A0790[];
|
||||
extern "C" void fn_80066B00(void *, bool);
|
||||
void dAcOsw_c::finalizeState_On() {
|
||||
playSound(0xA18);
|
||||
fn_80066B00(lbl_805A0790, true);
|
||||
dRumble_c::start(dRumble_c::sRumblePreset2, 0x1);
|
||||
}
|
||||
|
||||
void dAcOsw_c::initializeState_OffWait() {
|
||||
|
||||
@@ -0,0 +1,261 @@
|
||||
#include "d/d_rumble.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "d/lyt/d_lyt_control_game.h"
|
||||
#include "m/m_pad.h"
|
||||
#include "toBeSorted/reload_color_fader.h"
|
||||
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset0(8, 0b11000000000000000000000000000000, 2.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset1(9, 0b11010000000000000000000000000000, 4.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset2(10, 0b11101100000000000000000000000000, 6.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset3(12, 0b11101101000000000000000000000000, 8.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset4(12, 0b11101110110000000000000000000000, 10.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset5(16, 0b11011101101100000000000000000000, 12.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset6(16, 0b11101111111011000000000000000000, 14.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset7(32, 0b11111110111111000000000000000000, 14.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset8(8, 0b11100000000000000000000000000000, 2.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset9(16, 0b11100000000000000000000000000000, 2.f);
|
||||
dRumbleEntry_c dRumble_c::sRumblePreset10(24, 0b11100000000000000000000000000000, 2.f);
|
||||
|
||||
dRumble_c *dRumble_c::spInstance;
|
||||
|
||||
dRumble_c::dRumble_c() {}
|
||||
|
||||
dRumble_c::~dRumble_c() {
|
||||
spInstance = nullptr;
|
||||
}
|
||||
|
||||
void dRumble_c::init() {
|
||||
spInstance = new dRumble_c();
|
||||
|
||||
spInstance->mRumbleData[0].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[1].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[2].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[3].mBitsLeft = 0;
|
||||
}
|
||||
|
||||
void dRumble_c::play() {
|
||||
// If the game is not being controlled, do not do anything
|
||||
if (dLytControlGame_c::getInstance()) {
|
||||
if (!dLytControlGame_c::getInstance()->isStateNormal()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// I am guessing on any reload screen or homebutton menu?
|
||||
if (ReloadColorFader::GetInstance()->is1Or5()) {
|
||||
mPad::g_core[0]->stopRumbleMgr();
|
||||
mPad::g_core[1]->stopRumbleMgr();
|
||||
return;
|
||||
}
|
||||
|
||||
struct Entry {
|
||||
u32 bits;
|
||||
s32 length;
|
||||
bool isActive;
|
||||
} entries[2] = {};
|
||||
struct Info {
|
||||
u32 mBits;
|
||||
f32 intensites[4];
|
||||
s32 combinedLength;
|
||||
s32 mBitsLeft;
|
||||
} info = {};
|
||||
|
||||
for (s32 i = 0; i < 4; ++i) {
|
||||
RumbleData &data = spInstance->mRumbleData[i];
|
||||
if (data.mBitsLeft == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
u32 bit = data.mLength - data.mBitsLeft;
|
||||
if (data.mFlags & FLAG_ACTIVE) {
|
||||
info.mBits |= data.mRumbleBits << bit;
|
||||
if (data.mFlags & FLAG_INITIALIZE) {
|
||||
info.intensites[i] = data.mIntensity;
|
||||
} else {
|
||||
info.intensites[i] = data.mIntensity * ((f32)data.mBitsLeft / data.mLength);
|
||||
}
|
||||
if (info.combinedLength < data.mBitsLeft) {
|
||||
info.combinedLength = data.mBitsLeft;
|
||||
}
|
||||
} else {
|
||||
info.intensites[i] = 0.f;
|
||||
}
|
||||
|
||||
if (data.mFlags & FLAG_SLOT0) {
|
||||
entries[0].bits |= data.mRumbleBits << bit;
|
||||
|
||||
if (entries[0].length < data.mBitsLeft) {
|
||||
entries[0].length = data.mBitsLeft;
|
||||
}
|
||||
if (bit == 0) {
|
||||
entries[0].isActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (data.mFlags & FLAG_SLOT1) {
|
||||
entries[1].bits |= data.mRumbleBits << bit;
|
||||
|
||||
if (entries[1].length < data.mBitsLeft) {
|
||||
entries[1].length = data.mBitsLeft;
|
||||
}
|
||||
if (bit == 0) {
|
||||
entries[1].isActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (--data.mBitsLeft == 0) {
|
||||
if (data.mFlags & FLAG_INITIALIZE) {
|
||||
data.mBitsLeft = data.mLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (info.combinedLength != 0) {
|
||||
struct {
|
||||
s32 slot;
|
||||
f32 shake;
|
||||
} s = {0, 0.1f};
|
||||
for (s32 i = 0; i < 4; i++) {
|
||||
if (s.shake < info.intensites[i]) {
|
||||
s.shake = info.intensites[i];
|
||||
s.slot = i;
|
||||
}
|
||||
}
|
||||
|
||||
f32 shake = 0.f;
|
||||
for (s32 i = 0; i < 4; i++) {
|
||||
if (i == s.slot) {
|
||||
shake += info.intensites[i];
|
||||
} else {
|
||||
f32 tmp = info.intensites[i];
|
||||
shake += tmp * (tmp / s.shake);
|
||||
}
|
||||
}
|
||||
|
||||
f32 modifier = 0.f;
|
||||
if ((info.mBits << 0) & 0x80000000) {
|
||||
modifier += 0.6f;
|
||||
}
|
||||
if ((info.mBits << 1) & 0x80000000) {
|
||||
modifier += 0.3f;
|
||||
}
|
||||
if ((info.mBits << 2) & 0x80000000) {
|
||||
modifier += 0.1f;
|
||||
}
|
||||
|
||||
if (dScGame_c::getCamera(0)) {
|
||||
dScGame_c::getCamera(0)->setScreenShakeIntensity(shake * modifier);
|
||||
}
|
||||
}
|
||||
|
||||
static char rumble_strings[2][32 + 1];
|
||||
for (s32 i = 0; i < 2; i++) {
|
||||
if (entries[i].isActive) {
|
||||
s32 j = 0;
|
||||
for (; j < entries[i].length && j < 32; j++) {
|
||||
rumble_strings[i][j] = (entries[i].bits << j) & 0x80000000 ? '*' : '-';
|
||||
}
|
||||
rumble_strings[i][j] = '\0';
|
||||
|
||||
mPad::g_core[0]->stopRumbleMgr();
|
||||
mPad::g_core[0]->startPatternRumble(rumble_strings[i], entries[i].length, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dRumble_c::deinit() {
|
||||
if (spInstance != nullptr) {
|
||||
spInstance->mRumbleData[0].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[1].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[2].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[3].mBitsLeft = 0;
|
||||
mPad::g_core[0]->stopRumbleMgr();
|
||||
mPad::g_core[1]->stopRumbleMgr();
|
||||
|
||||
delete spInstance;
|
||||
spInstance = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
s32 dRumble_c::start(const dRumbleEntry_c &entry, u32 flags) {
|
||||
static char rumble_string[32 + 1];
|
||||
if (dLytControlGame_c::getInstance()) {
|
||||
if (!dLytControlGame_c::getInstance()->isStateNormal()) {
|
||||
s32 j = 0;
|
||||
for (; j < entry.mLength && j < 32; j++) {
|
||||
rumble_string[j] = (entry.mBits << j) & 0x80000000 ? '*' : '-';
|
||||
}
|
||||
rumble_string[j] = '\0';
|
||||
|
||||
mPad::g_core[0]->stopRumbleMgr();
|
||||
mPad::g_core[0]->startPatternRumble(rumble_string, entry.mLength, false);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
s32 idx = 0;
|
||||
for (s32 i = 0; i < 4; i++) {
|
||||
if (spInstance->mRumbleData[i].mBitsLeft == 0) {
|
||||
idx = i;
|
||||
break;
|
||||
}
|
||||
|
||||
s32 bitsLeft = (spInstance->mRumbleData[i].mFlags & FLAG_INITIALIZE) ?
|
||||
(spInstance->mRumbleData[i].mLength * 10) :
|
||||
(spInstance->mRumbleData[i].mBitsLeft);
|
||||
if (bitsLeft < 9999) {
|
||||
idx = i;
|
||||
}
|
||||
}
|
||||
|
||||
spInstance->mRumbleData[idx].mLength = entry.mLength;
|
||||
spInstance->mRumbleData[idx].mBitsLeft = entry.mLength;
|
||||
spInstance->mRumbleData[idx].mRumbleBits = entry.mBits;
|
||||
spInstance->mRumbleData[idx].mIntensity = entry.mIntensity;
|
||||
spInstance->mRumbleData[idx].mFlags = flags;
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
void dRumble_c::stop(s32 idx) {
|
||||
if (spInstance == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
// -1 means stop all
|
||||
if (idx == -1) {
|
||||
spInstance->mRumbleData[0].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[1].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[2].mBitsLeft = 0;
|
||||
spInstance->mRumbleData[3].mBitsLeft = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (idx > ARRAY_LENGTH(spInstance->mRumbleData) - 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
spInstance->mRumbleData[idx].mBitsLeft = 0;
|
||||
}
|
||||
|
||||
dRumbleEntry_c::dRumbleEntry_c(s32 length, u32 bits, f32 intensity) {
|
||||
mLength = length;
|
||||
mBits = bits;
|
||||
mIntensity = intensity;
|
||||
}
|
||||
|
||||
bool dRumbleIdx_c::start(const dRumbleEntry_c &entry, u32 flags) {
|
||||
if (isActive()) {
|
||||
return false;
|
||||
}
|
||||
setIdx(dRumble_c::start(entry, flags | dRumble_c::FLAG_INITIALIZE));
|
||||
return isActive();
|
||||
}
|
||||
|
||||
void dRumbleIdx_c::stop() {
|
||||
if (isActive()) {
|
||||
dRumble_c::stop(getIdx());
|
||||
setIdx(-1);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "d/d_base.h"
|
||||
#include "d/d_rumble.h"
|
||||
#include "f/f_base.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m_fader_base.h"
|
||||
@@ -14,7 +15,6 @@ static bool gameStateIsActive = true;
|
||||
extern "C" u32 lbl_80574FA0;
|
||||
extern "C" u32 lbl_80574FA4;
|
||||
extern "C" void fn_801942F0(int, int);
|
||||
extern "C" void fn_80066D30(int);
|
||||
|
||||
dFader_c dScene_c::sFader;
|
||||
|
||||
@@ -49,7 +49,7 @@ int dScene_c::preExecute() {
|
||||
} else if (sFader.isStatus(mFaderBase_c::FADED_OUT)) {
|
||||
deleteRequest();
|
||||
resetFlags();
|
||||
fn_80066D30(-1);
|
||||
dRumble_c::stop(-1);
|
||||
}
|
||||
return NOT_READY;
|
||||
} else {
|
||||
|
||||
+2
-2
@@ -5,6 +5,7 @@
|
||||
#include "d/d_base.h"
|
||||
#include "d/d_bzs_types.h"
|
||||
#include "d/d_room.h"
|
||||
#include "d/d_rumble.h"
|
||||
#include "d/d_sc_game.h"
|
||||
#include "d/d_sc_title.h"
|
||||
#include "d/d_stage_mgr.h"
|
||||
@@ -54,7 +55,6 @@ extern "C" void ScrapperPickupMgr__update(void *);
|
||||
extern "C" void ScrapperPickupMgr__dtor();
|
||||
extern "C" void fn_80028A80();
|
||||
extern "C" void fn_80028EC0();
|
||||
extern "C" void fn_80066D30(s32);
|
||||
extern "C" void setPCAMpos2(const PCAM *);
|
||||
|
||||
int dStage_c::create() {
|
||||
@@ -100,7 +100,7 @@ int dStage_c::create() {
|
||||
|
||||
int dStage_c::doDelete() {
|
||||
fn_80028EC0();
|
||||
fn_80066D30(-1);
|
||||
dRumble_c::stop(-1);
|
||||
ScrapperPickupMgr__dtor();
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user