Synchronize area changes

This commit is contained in:
MysterD 2020-08-10 12:08:40 -07:00
parent 6701b6096d
commit 1bef126df8
8 changed files with 99 additions and 35 deletions

View file

@ -87,7 +87,7 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;WINSOCK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
@ -2231,6 +2231,7 @@
<ClCompile Include="..\build\us_pc\textures\water\jrb_textures.0A800.rgba16.inc.c" />
<ClCompile Include="..\build\us_pc\textures\water\jrb_textures.0B800.rgba16.inc.c" />
<ClCompile Include="..\data\behavior_data.c" />
<ClCompile Include="..\data\behavior_table.c" />
<ClCompile Include="..\include\trig_tables.inc.c" />
<ClCompile Include="..\levels\bbh\areas\1\1\model.inc.c" />
<ClCompile Include="..\levels\bbh\areas\1\10\model.inc.c" />
@ -3955,6 +3956,9 @@
<ClCompile Include="..\src\pc\network\packets\packet_reliable.c" />
<ClCompile Include="..\src\pc\network\packets\packet_spawn_objects.c" />
<ClCompile Include="..\src\pc\network\packets\packet_spawn_star.c" />
<ClCompile Include="..\src\pc\network\socket\socket.c" />
<ClCompile Include="..\src\pc\network\socket\socket_linux.c" />
<ClCompile Include="..\src\pc\network\socket\socket_windows.c" />
<ClCompile Include="..\src\pc\pc_main.c" />
<ClCompile Include="..\src\pc\platform.c" />
<ClCompile Include="..\src\pc\ultra_reimplementation.c" />
@ -4293,7 +4297,11 @@
<ClCompile Include="..\tools\utils.h" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\include\behavior_table.h" />
<ClInclude Include="..\src\pc\network\network.h" />
<ClInclude Include="..\src\pc\network\socket\socket.h" />
<ClInclude Include="..\src\pc\network\socket\socket_linux.h" />
<ClInclude Include="..\src\pc\network\socket\socket_windows.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View file

@ -3421,6 +3421,12 @@
<Filter Include="Source Files\src\pc\network\packets">
<UniqueIdentifier>{f7dcd9e2-f84f-4c82-96c5-0dc32d408693}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\src\pc\network\socket">
<UniqueIdentifier>{d884729b-710d-45b4-8757-287303e2d8e2}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\src\pc\network\socket">
<UniqueIdentifier>{b1b4937e-775c-4a0c-92f5-48b010783e4d}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\actors\amp\anims\anim_0800401C.inc.c">
@ -14973,6 +14979,18 @@
<ClCompile Include="..\src\pc\network\packets\packet_spawn_star.c">
<Filter>Source Files\src\pc\network\packets</Filter>
</ClCompile>
<ClCompile Include="..\src\pc\network\socket\socket_linux.c">
<Filter>Source Files\src\pc\network\socket</Filter>
</ClCompile>
<ClCompile Include="..\src\pc\network\socket\socket_windows.c">
<Filter>Source Files\src\pc\network\socket</Filter>
</ClCompile>
<ClCompile Include="..\src\pc\network\socket\socket.c">
<Filter>Source Files\src\pc\network\socket</Filter>
</ClCompile>
<ClCompile Include="..\data\behavior_table.c">
<Filter>Source Files\data</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\actors\common0.h">
@ -15877,5 +15895,17 @@
<ClInclude Include="..\src\pc\network\network.h">
<Filter>Header Files\src\pc\network</Filter>
</ClInclude>
<ClInclude Include="..\src\pc\network\socket\socket_linux.h">
<Filter>Header Files\src\pc\network\socket</Filter>
</ClInclude>
<ClInclude Include="..\src\pc\network\socket\socket_windows.h">
<Filter>Header Files\src\pc\network\socket</Filter>
</ClInclude>
<ClInclude Include="..\src\pc\network\socket\socket.h">
<Filter>Header Files\src\pc\network\socket</Filter>
</ClInclude>
<ClInclude Include="..\include\behavior_table.h">
<Filter>Header Files\include</Filter>
</ClInclude>
</ItemGroup>
</Project>

View file

@ -268,6 +268,10 @@ void load_mario_area(void) {
func_80320890();
load_area(gMarioSpawnInfo->areaIndex);
for (int i = 0; i < MAX_PLAYERS; i++) {
gMarioStates[i].spawnInfo->areaIndex = gCurrentArea->index;
}
if (gCurrentArea->index == gMarioSpawnInfo->areaIndex) {
gCurrentArea->flags |= 0x01;
spawn_objects_from_info(0, gMarioSpawnInfo);
@ -293,11 +297,16 @@ void change_area(s32 index) {
load_area(index);
gCurrentArea->flags = areaFlags;
gMarioObject->oActiveParticleFlags = 0;
for (int i = 0; i < MAX_PLAYERS; i++) {
gMarioStates[i].marioObj->oActiveParticleFlags = 0;
}
}
if (areaFlags & 0x01) {
gMarioObject->header.gfx.unk18 = index, gMarioSpawnInfo->areaIndex = index;
for (int i = 0; i < MAX_PLAYERS; i++) {
gMarioStates[i].marioObj->header.gfx.unk18 = index;
gMarioStates[i].spawnInfo->areaIndex = index;
}
}
}

View file

@ -36,11 +36,6 @@
#include "pc/configfile.h"
#include "pc/network/network.h"
#define WARP_TYPE_NOT_WARPING 0
#define WARP_TYPE_CHANGE_LEVEL 1
#define WARP_TYPE_CHANGE_AREA 2
#define WARP_TYPE_SAME_AREA 3
#define WARP_NODE_F0 0xF0
#define WARP_NODE_DEATH 0xF1
#define WARP_NODE_F2 0xF2
@ -548,21 +543,24 @@ void check_instant_warp(void) {
struct InstantWarp *warp = &gCurrentArea->instantWarps[index];
if (warp->id != 0) {
gMarioState->pos[0] += warp->displacement[0];
gMarioState->pos[1] += warp->displacement[1];
gMarioState->pos[2] += warp->displacement[2];
for (int i = 0; i < MAX_PLAYERS; i++) {
gMarioStates[i].pos[0] += warp->displacement[0];
gMarioStates[i].pos[1] += warp->displacement[1];
gMarioStates[i].pos[2] += warp->displacement[2];
gMarioState->marioObj->oPosX = gMarioState->pos[0];
gMarioState->marioObj->oPosY = gMarioState->pos[1];
gMarioState->marioObj->oPosZ = gMarioState->pos[2];
gMarioStates[i].marioObj->oPosX = gMarioStates[i].pos[0];
gMarioStates[i].marioObj->oPosY = gMarioStates[i].pos[1];
gMarioStates[i].marioObj->oPosZ = gMarioStates[i].pos[2];
}
cameraAngle = gMarioState->area->camera->yaw;
change_area(warp->area);
gMarioState->area = gCurrentArea;
for (int i = 0; i < MAX_PLAYERS; i++) {
gMarioStates[i].area = gCurrentArea;
}
warp_camera(warp->displacement[0], warp->displacement[1], warp->displacement[2]);
gMarioState->area->camera->yaw = cameraAngle;
}
}
@ -1011,13 +1009,19 @@ s32 play_mode_normal(void) {
// warp, change play mode accordingly.
if (sCurrPlayMode == PLAY_MODE_NORMAL) {
if (sWarpDest.type == WARP_TYPE_CHANGE_LEVEL) {
set_play_mode((networkType != NT_NONE) ? PLAY_MODE_SYNC_LEVEL : PLAY_MODE_CHANGE_LEVEL);
network_send_level_warp();
if (sWarpDest.type == WARP_TYPE_NOT_WARPING) {
set_play_mode(PLAY_MODE_CHANGE_LEVEL);
} else {
set_play_mode((networkType != NT_NONE) ? PLAY_MODE_SYNC_LEVEL : PLAY_MODE_CHANGE_LEVEL);
network_send_level_warp();
}
} else if (sTransitionTimer != 0) {
////////////////////////////////////
// todo: synchronize change_area. //
////////////////////////////////////
set_play_mode(PLAY_MODE_CHANGE_AREA);
if (sWarpDest.type == WARP_TYPE_NOT_WARPING || gCurrentArea->index == sWarpDest.areaIdx) {
set_play_mode(PLAY_MODE_CHANGE_AREA);
} else {
set_play_mode((networkType != NT_NONE) ? PLAY_MODE_SYNC_LEVEL : PLAY_MODE_CHANGE_AREA);
network_send_level_warp();
}
} else if (pressed_pause()) {
lower_background_noise(1);
cancel_rumble();
@ -1259,15 +1263,6 @@ s32 init_level(void) {
sound_banks_disable(2, 0x0330);
}
// set mario/luigi model
for (int i = 0; i < MAX_PLAYERS; i++) {
if (i == 0) {
gMarioState[i].marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_MARIO : MODEL_LUIGI];
} else {
gMarioState[i].marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_LUIGI2 : MODEL_MARIO2];
}
}
return 1;
}

View file

@ -50,6 +50,10 @@
#define MARIO_SPAWN_LAUNCH_DEATH 0x25
#define MARIO_SPAWN_UNKNOWN_27 0x27
#define WARP_TYPE_NOT_WARPING 0
#define WARP_TYPE_CHANGE_LEVEL 1
#define WARP_TYPE_CHANGE_AREA 2
#define WARP_TYPE_SAME_AREA 3
struct CreditsEntry
{

View file

@ -35,6 +35,7 @@
#include "thread6.h"
#include "pc/configfile.h"
#include "pc/cheats.h"
#include "pc/network/network.h"
#ifdef BETTERCAMERA
#include "bettercamera.h"
#endif
@ -1943,6 +1944,13 @@ void init_mario(void) {
capObject->oMoveAngleYaw = 0;
}
// set mario/luigi model
if (isLocal) {
gMarioState->marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_MARIO : MODEL_LUIGI];
} else {
gMarioState->marioObj->header.gfx.sharedChild = gLoadedGraphNodes[(networkType == NT_SERVER) ? MODEL_LUIGI2 : MODEL_MARIO2];
}
skippy:
if (isLocal) {
gMarioState = &gMarioStates[1];

View file

@ -224,6 +224,7 @@ struct ParticleProperties sParticleTypes[] = {
void copy_mario_state_to_object(void) {
s32 i = 0;
// L is real
// two-player hack
if (gCurrentObject != gMarioObject) {
i += 1;
}

View file

@ -26,6 +26,7 @@ void network_receive_level_warp(struct Packet* p) {
bool matchingDest = memcmp(&remoteWarpDest, &sWarpDest, sizeof(struct WarpDest)) == 0;
if (remotePlayMode == PLAY_MODE_SYNC_LEVEL && (sCurrPlayMode == PLAY_MODE_NORMAL || sCurrPlayMode == PLAY_MODE_PAUSED)) {
if (remoteWarpDest.type == WARP_TYPE_NOT_WARPING) { return; }
sCurrPlayMode = PLAY_MODE_SYNC_LEVEL;
sWarpDest = remoteWarpDest;
gMenuMode = -1;
@ -38,9 +39,13 @@ void network_receive_level_warp(struct Packet* p) {
if (remotePlayMode == PLAY_MODE_SYNC_LEVEL && sCurrPlayMode == PLAY_MODE_SYNC_LEVEL) {
if (matchingDest) {
sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL;
switch (sWarpDest.type) {
case WARP_TYPE_CHANGE_AREA: sCurrPlayMode = PLAY_MODE_CHANGE_AREA; break;
case WARP_TYPE_CHANGE_LEVEL: sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL; break;
}
} else {
if (networkType == NT_CLIENT) {
if (remoteWarpDest.type == WARP_TYPE_NOT_WARPING) { return; }
// two-player hack: would need to use player index as priority
sWarpDest = remoteWarpDest;
}
@ -49,7 +54,11 @@ void network_receive_level_warp(struct Packet* p) {
return;
}
if (remotePlayMode == PLAY_MODE_CHANGE_LEVEL && sCurrPlayMode == PLAY_MODE_SYNC_LEVEL) {
sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL;
if ((remotePlayMode == PLAY_MODE_CHANGE_LEVEL || remotePlayMode == PLAY_MODE_CHANGE_AREA) && sCurrPlayMode == PLAY_MODE_SYNC_LEVEL) {
if (remoteWarpDest.type == WARP_TYPE_NOT_WARPING) { return; }
switch (sWarpDest.type) {
case WARP_TYPE_CHANGE_AREA: sCurrPlayMode = PLAY_MODE_CHANGE_AREA; break;
case WARP_TYPE_CHANGE_LEVEL: sCurrPlayMode = PLAY_MODE_CHANGE_LEVEL; break;
}
}
}