port TriggerCDTrack and TriggerNormalCDTrack

This commit is contained in:
rr- 2021-02-26 01:08:49 +01:00
parent 1a4fdea193
commit 26d103678d
7 changed files with 102 additions and 14 deletions

View file

@ -8,6 +8,7 @@
#define MAX_ROOMS 1024
#define MAX_ROOMS_TO_DRAW 100
#define MAX_FRAMES 10
#define MAX_CD_TRACKS 64
#define MAX_TEXTURES 2048
#define NUMBER_ITEMS 256
#define MAX_SECRETS 16

View file

@ -982,6 +982,88 @@ void AddRoomFlipItems(ROOM_INFO* r)
}
}
void TriggerCDTrack(int16_t value, int16_t flags, int16_t type)
{
if (value <= 1 || value >= MAX_CD_TRACKS) {
return;
}
switch (value) {
case 28:
if ((CDFlags[value] & IF_ONESHOT)
&& LaraItem->current_anim_state == AS_UPJUMP) {
value = 29;
}
break;
case 37:
if (LaraItem->current_anim_state != AS_HANG) {
return;
}
break;
case 41:
if (LaraItem->current_anim_state != AS_HANG) {
return;
}
break;
case 42:
if ((CDFlags[value] & IF_ONESHOT)
&& LaraItem->current_anim_state == AS_HANG) {
value = 43;
}
break;
case 49:
if (LaraItem->current_anim_state != AS_SURFTREAD) {
return;
}
break;
case 50:
if (CDFlags[value] & IF_ONESHOT) {
static int16_t gym_completion_counter = 0;
gym_completion_counter++;
if (gym_completion_counter == 30 * 4) {
LevelComplete = 1;
gym_completion_counter = 0;
}
} else if (LaraItem->current_anim_state != AS_WATEROUT) {
return;
}
break;
}
TriggerNormalCDTrack(value, flags, type);
}
void TriggerNormalCDTrack(int16_t value, int16_t flags, int16_t type)
{
if (CDFlags[value] & IF_ONESHOT) {
return;
}
if (type == TT_SWITCH) {
CDFlags[value] ^= flags & IF_CODE_BITS;
} else if (type == TT_ANTIPAD) {
CDFlags[value] &= -1 - (flags & IF_CODE_BITS);
} else if (flags & IF_CODE_BITS) {
CDFlags[value] |= flags & IF_CODE_BITS;
}
if ((CDFlags[value] & IF_CODE_BITS) == IF_CODE_BITS) {
if (flags & IF_ONESHOT) {
CDFlags[value] |= IF_ONESHOT;
}
if (value != CDTrack) {
S_CDPlay(value);
}
} else {
S_CDStop();
}
}
void T1MInjectGameControl()
{
INJECT(0x004133B0, ControlPhase);
@ -1000,4 +1082,5 @@ void T1MInjectGameControl()
INJECT(0x00414E50, xLOS);
INJECT(0x004150C0, ClipTarget);
INJECT(0x004151A0, FlipMap);
INJECT(0x00415310, TriggerCDTrack);
}

View file

@ -27,6 +27,8 @@ int32_t ClipTarget(GAME_VECTOR* start, GAME_VECTOR* target, FLOOR_INFO* floor);
void FlipMap();
void RemoveRoomFlipItems(ROOM_INFO* r);
void AddRoomFlipItems(ROOM_INFO* r);
void TriggerCDTrack(int16_t value, int16_t flags, int16_t type);
void TriggerNormalCDTrack(int16_t value, int16_t flags, int16_t type);
void T1MInjectGameControl();

View file

@ -110,6 +110,7 @@
#define ControlText ARRAY_(0x0045A2F8, TEXTSTRING*, [2])
#define ScanCodeNames ARRAY_(0x00454A40, char*, [])
#define OptionMusicVolume VAR_I_(0x00456334, int32_t, 255)
#define CDFlags ARRAY_(0x00462C20, int16_t, [MAX_CD_TRACKS])
// #define LaraControlRoutines ARRAY_(0x00456490, ControlRoutine, [])
// #define LaraCollisionRoutines ARRAY_(0x00456570, CollisionRoutine, [])

View file

@ -2,11 +2,12 @@
#define T1M_SPECIFIC_SNDPC_H
// clang-format off
#define S_CDLoop ((void (*)())0x004380B0)
#define S_CDStop ((void (*)())0x00438E40)
#define S_CDVolume ((void (*)(int16_t volume))0x00437F30)
#define SoundStart ((void (*)())0x0041CDA0)
#define SoundInit ((int32_t (*)())0x00437E00)
#define S_CDLoop ((void (*)())0x004380B0)
#define S_CDStop ((void (*)())0x00438E40)
#define S_CDPlay ((void (*)(int16_t track))0x00438D40)
#define S_CDVolume ((void (*)(int16_t volume))0x00437F30)
#define SoundStart ((void (*)())0x0041CDA0)
#define SoundInit ((int32_t (*)())0x00437E00)
// clang-format on
#endif