mirror of
https://github.com/zeldaret/ss
synced 2026-06-27 02:15:12 -04:00
d_snd_bgm_harp_data OK
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
#include "d/snd/d_snd_bgm_harp_data.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "nw4r/snd/snd_SeqSoundHandle.h"
|
||||
|
||||
dSndBgmDataHarpVarSetBase_c::dSndBgmDataHarpVarSetBase_c(s32 count) {
|
||||
mPosition = -1;
|
||||
mMax = count;
|
||||
mCount = 0;
|
||||
mpVars = new dSndBgmDataHarpVar_c[count];
|
||||
resetVars();
|
||||
}
|
||||
|
||||
dSndBgmDataHarpVarSetBase_c::~dSndBgmDataHarpVarSetBase_c() {
|
||||
delete[] mpVars;
|
||||
}
|
||||
|
||||
void dSndBgmDataHarpVarSetBase_c::resetVars() {
|
||||
mCount = 0;
|
||||
mPosition = -1;
|
||||
for (int i = 0; i < mMax; i++) {
|
||||
mpVars[i].reset();
|
||||
}
|
||||
}
|
||||
|
||||
void dSndBgmDataHarpVarSetBase_c::addVar(u8 value) {
|
||||
if (mCount < mMax) {
|
||||
mpVars[mCount].field_0x01 = value;
|
||||
mCount++;
|
||||
}
|
||||
}
|
||||
|
||||
dSndBgmHarpDataBase_c::dSndBgmHarpDataBase_c() : mMax(0), mCount(0), field_0x08(0) {}
|
||||
|
||||
void dSndBgmHarpDataBase_c::resetVars() {
|
||||
mCount = 0;
|
||||
field_0x08 = 0;
|
||||
for (int i = 0; i < mMax; i++) {
|
||||
mpVarSets[i].resetVars();
|
||||
}
|
||||
}
|
||||
|
||||
s32 dSndBgmHarpDataBase_c::getIdxForPosition(s32 position) {
|
||||
if (position < 0) {
|
||||
return 0;
|
||||
}
|
||||
if (mpVarSets[0].getPosition() > position) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int i = mCount - 1; i > 0; i--) {
|
||||
if (mpVarSets[i].getPosition() <= position) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dSndBgmHarpDataBase_c::addVar(s32 position, s32 value, s32 unk) {
|
||||
if (position < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (value <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (field_0x08 > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mCount > mMax) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Look at the set that might not be full yet
|
||||
dSndBgmDataHarpVarSetBase_c *set = getVarSet(mCount);
|
||||
if (set->getPosition() >= 0 && set->getPosition() < position) {
|
||||
// If it's not full but it doesn't match the position,
|
||||
// advance either way
|
||||
set++;
|
||||
mCount++;
|
||||
}
|
||||
|
||||
// Set position for new set
|
||||
if (set->getPosition() < 0) {
|
||||
// Make sure set positions are strictly monotonically increasing (1),
|
||||
// do not record e.g. a fifth value for the same set
|
||||
if (mCount > 0 && set[-1].getPosition() >= position) {
|
||||
return;
|
||||
}
|
||||
set->setPosition(position);
|
||||
}
|
||||
|
||||
dSndBgmDataHarpVar_c *var = set->getUnusedVar();
|
||||
if (var != nullptr) {
|
||||
if (unk == 0x7F) {
|
||||
var->onFlag();
|
||||
}
|
||||
set->addVar(value);
|
||||
|
||||
if (set->getCount() >= set->getMax()) {
|
||||
// If the set is full, continue with the next set.
|
||||
// Condition (1) above will make sure that the next
|
||||
// set gets a strictly higher position, so there are
|
||||
// no sets with the same position.
|
||||
mCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dSndBgmHarpDataBase_c::setField_0x08(s32 value) {
|
||||
if (value < 0) {
|
||||
value = 0;
|
||||
}
|
||||
field_0x08 = value;
|
||||
}
|
||||
|
||||
dSndBgmDataHarpVarSetBase_c *dSndBgmHarpDataBase_c::getUsableVarSet(s32 idx) {
|
||||
if (idx < 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (idx >= mCount) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &mpVarSets[idx];
|
||||
}
|
||||
|
||||
dSndBgmDataHarpVarSetBase_c *dSndBgmHarpDataBase_c::getVarSet(s32 idx) {
|
||||
if (idx < 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (idx >= mMax) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &mpVarSets[idx];
|
||||
}
|
||||
|
||||
dSndBgmHarpData_c::dSndBgmHarpData_c() {
|
||||
mpVarSets = new dSndBgmDataHarpVarSet_c[NUM_SETS];
|
||||
mMax = NUM_SETS;
|
||||
resetVars();
|
||||
}
|
||||
|
||||
dSndBgmHarpData_c::~dSndBgmHarpData_c() {
|
||||
delete[] mpVarSets;
|
||||
}
|
||||
|
||||
void dSndBgmHarpData_c::writeSeqVars(s32 idx) {
|
||||
if (idx < 0) {
|
||||
return;
|
||||
}
|
||||
if (idx >= mCount) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < mpVarSets[idx].getCount(); i++) {
|
||||
nw4r::snd::SeqSoundHandle::WriteGlobalVariable(10 + i, mpVarSets[idx].getVar(i)->field_0x01);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user