Path: blob/main/RSDKv4/NativeObjects/MultiplayerHandler.cpp
817 views
#include "RetroEngine.hpp"12#if !RETRO_USE_ORIGINAL_CODE && RETRO_USE_NETWORKING3void MultiplayerHandler_Create(void *objPtr)4{5RSDK_THIS(MultiplayerHandler);67self->pingLabel = CREATE_ENTITY(TextLabel);8self->pingLabel->fontID = FONT_TEXT;9self->pingLabel->x = SCREEN_XSIZE_F / 2 - 64.0f;10self->pingLabel->y = -(SCREEN_YSIZE_F / 2) + 4.0f;11self->pingLabel->alignPtr(self->pingLabel, ALIGN_LEFT);12self->pingLabel->scale = 0.175;13self->pingLabel->useColors = true;14self->pingLabel->r = 0xFF;1516self->state = 1;17}18void MultiplayerHandler_Main(void *objPtr)19{20RSDK_THIS(MultiplayerHandler);21char buf[0x30];22if (dcError && self->state != 3)23self->state = 2;2425switch (self->state) {26case 0:27if (!(activeStageList & 1)) {28self->state = 1;29break;30}3132self->timer += Engine.deltaTime;33if (self->pingLabel->alignOffset) {34self->pingLabel->alignPtr(self->pingLabel, ALIGN_LEFT);35self->pingLabel->x -= 28.0f;36}3738if (self->timer >= 0.25f && !waitingForPing) {39waitingForPing = true;40self->timer = 0;41if (lastPing < 800.0f) {42sprintf(buf, "Ping: %.1fms", lastPing);43self->pingLabel->g = 0xFF;44self->pingLabel->b = 0xFF;45}46else if (lastPing < 2000.0f) {47self->pingLabel->g = 0xFF;48self->pingLabel->b = 0x30;49sprintf(buf, "Ping: %.2fs", lastPing / 1000);50}51else {52self->pingLabel->g = 0x30;53self->pingLabel->b = 0x30;54sprintf(buf, "Ping: %.0fs", self->timer);55}56SetStringToFont8(self->pingLabel->text, buf, FONT_TEXT);57}58else if (self->timer >= 10.0f) {59DisconnectNetwork();60dcError = 2; // timeout61self->state = 2;62vsPlaying = false;63}64else if (self->timer >= 5.0f && waitingForPing) {65self->pingLabel->g = 0xCF * (fmod(self->timer, .5) >= .25) + 0x30;66self->pingLabel->b = 0xCF * (fmod(self->timer, .5) >= .25) + 0x30;67self->pingLabel->alignPtr(self->pingLabel, ALIGN_CENTER);68self->pingLabel->x += 28.0f;69sprintf(buf, " !! %.2fs !!", 10 - self->timer);70SetStringToFont8(self->pingLabel->text, buf, FONT_TEXT);71}72SetRenderBlendMode(RENDER_BLEND_ALPHA);73RenderRect(SCREEN_XSIZE_F / 2 - 68, -(SCREEN_YSIZE_F / 2) + 16, 160, 68, 16, 0, 0, 0, 0x80);74// FallThrough75case 1:76// wait for regular77if (!vsPlaying) {78if (dcError) {79self->state = 2;80break;81}82RemoveNativeObject(self->pingLabel);83RemoveNativeObject(self->errorPanel);84RemoveNativeObject(self);85break;86}87else if (activeStageList & 1)88self->state = 0;89break;9091case 2: {92// display error93StopMusic(true);94RemoveNativeObject(self->pingLabel);95RemoveNativeObjectType(RetroGameLoop_Create, RetroGameLoop_Main);96RemoveNativeObjectType(VirtualDPad_Create, VirtualDPad_Main);97RemoveNativeObjectType(FadeScreen_Create, FadeScreen_Main);9899self->fadeError = CREATE_ENTITY(FadeScreen);100self->fadeError->state = FADESCREEN_STATE_FADEOUT;101self->errorPanel = CREATE_ENTITY(DialogPanel);102self->errorPanel->buttonCount = DLGTYPE_OK;103char *set = NULL;104switch (dcError) {105case 1: set = (char *)"The other player has disconnected.\rReturning to title screen."; break;106case 2: set = (char *)"Connection timed out.\rReturning to title screen."; break;107case 3: set = (char *)"This room is full.\rReturning to title screen.";108// fallthrough109case 5:110if (!set)111set = (char *)"This room doesn't exist.\rReturning to title screen.";112self->fadeError->timer = self->fadeError->delay;113for (int i = 0; i < nativeEntityCount; ++i) {114if (objectEntityBank[activeEntityList[i]].eventMain == MultiplayerScreen_Main) {115MultiplayerScreen_Destroy(&objectEntityBank[i]);116break;117}118}119break;120case 4: set = (char *)"Couldn't connect after 10 retries.\rReturning to title screen."; break;121}122SetStringToFont8(self->errorPanel->text, set, FONT_TEXT);123self->state = 3;124dcError = 0;125}126// FallThrough127case 3:128RenderRetroBuffer(256, 160);129if (self->errorPanel->state == DIALOGPANEL_STATE_EXIT)130self->errorPanel->state = DIALOGPANEL_STATE_IDLE;131if (self->fadeError->timer >= self->fadeError->delay) {132RenderRect(-SCREEN_CENTERX_F, SCREEN_CENTERY_F, 160.0, SCREEN_XSIZE_F, SCREEN_YSIZE_F, 0, 0, 0, 255);133}134135if (!self->fade) {136if (self->errorPanel->selection) {137self->fade = CREATE_ENTITY(FadeScreen);138self->fade->state = FADESCREEN_STATE_FADEOUT;139}140}141142else if (self->fade->timer > self->fade->delay) {143ClearNativeObjects();144Engine.nativeMenuFadeIn = false;145if (skipStartMenu) {146activeStageList = 0;147stageMode = STAGEMODE_LOAD;148Engine.gameMode = ENGINE_MAINGAME;149stageListPosition = 0;150CREATE_ENTITY(RetroGameLoop);151if (Engine.gameDeviceType == RETRO_MOBILE)152CREATE_ENTITY(VirtualDPad);153}154else {155RenderRect(-SCREEN_CENTERX_F, SCREEN_CENTERY_F, 160.0, SCREEN_XSIZE_F, SCREEN_YSIZE_F, 0, 0, 0, 255);156CREATE_ENTITY(SegaSplash);157}158}159break;160}161}162#endif163164165