mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +01:00
Refactor intro into IntroScene
This commit is contained in:
@@ -25,7 +25,6 @@
|
|||||||
# include <algorithm>
|
# include <algorithm>
|
||||||
# include <cmath>
|
# include <cmath>
|
||||||
# include <openrct2-ui/interface/Window.h>
|
# include <openrct2-ui/interface/Window.h>
|
||||||
# include <openrct2/Intro.h>
|
|
||||||
# include <openrct2/config/Config.h>
|
# include <openrct2/config/Config.h>
|
||||||
# include <openrct2/core/Console.hpp>
|
# include <openrct2/core/Console.hpp>
|
||||||
# include <openrct2/drawing/Drawing.h>
|
# include <openrct2/drawing/Drawing.h>
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include <openrct2-ui/interface/Widget.h>
|
#include <openrct2-ui/interface/Widget.h>
|
||||||
#include <openrct2-ui/windows/Window.h>
|
#include <openrct2-ui/windows/Window.h>
|
||||||
#include <openrct2/Context.h>
|
#include <openrct2/Context.h>
|
||||||
#include <openrct2/Intro.h>
|
|
||||||
#include <openrct2/config/Config.h>
|
#include <openrct2/config/Config.h>
|
||||||
#include <openrct2/localisation/Localisation.h>
|
#include <openrct2/localisation/Localisation.h>
|
||||||
#include <openrct2/sprites.h>
|
#include <openrct2/sprites.h>
|
||||||
@@ -38,9 +37,6 @@ static Widget _titleExitWidgets[] = {
|
|||||||
|
|
||||||
void OnMouseUp(WidgetIndex widgetIndex) override
|
void OnMouseUp(WidgetIndex widgetIndex) override
|
||||||
{
|
{
|
||||||
if (gIntroState != IntroState::None)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (widgetIndex)
|
switch (widgetIndex)
|
||||||
{
|
{
|
||||||
case WIDX_EXIT:
|
case WIDX_EXIT:
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include <openrct2-ui/interface/Widget.h>
|
#include <openrct2-ui/interface/Widget.h>
|
||||||
#include <openrct2-ui/windows/Window.h>
|
#include <openrct2-ui/windows/Window.h>
|
||||||
#include <openrct2/Context.h>
|
#include <openrct2/Context.h>
|
||||||
#include <openrct2/Intro.h>
|
|
||||||
#include <openrct2/config/Config.h>
|
#include <openrct2/config/Config.h>
|
||||||
#include <openrct2/localisation/Localisation.h>
|
#include <openrct2/localisation/Localisation.h>
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
#include "GameState.h"
|
#include "GameState.h"
|
||||||
#include "GameStateSnapshots.h"
|
#include "GameStateSnapshots.h"
|
||||||
#include "Input.h"
|
#include "Input.h"
|
||||||
#include "Intro.h"
|
|
||||||
#include "OpenRCT2.h"
|
#include "OpenRCT2.h"
|
||||||
#include "ParkImporter.h"
|
#include "ParkImporter.h"
|
||||||
#include "PlatformEnvironment.h"
|
#include "PlatformEnvironment.h"
|
||||||
@@ -67,6 +66,7 @@
|
|||||||
#include "scenario/Scenario.h"
|
#include "scenario/Scenario.h"
|
||||||
#include "scenario/ScenarioRepository.h"
|
#include "scenario/ScenarioRepository.h"
|
||||||
#include "scenes/game/GameScene.h"
|
#include "scenes/game/GameScene.h"
|
||||||
|
#include "scenes/intro/IntroScene.h"
|
||||||
#include "scenes/title/TitleScene.h"
|
#include "scenes/title/TitleScene.h"
|
||||||
#include "scenes/title/TitleSequenceManager.h"
|
#include "scenes/title/TitleSequenceManager.h"
|
||||||
#include "scripting/HookEngine.h"
|
#include "scripting/HookEngine.h"
|
||||||
@@ -124,6 +124,7 @@ namespace OpenRCT2
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Scenes
|
// Scenes
|
||||||
|
std::unique_ptr<IntroScene> _introScene;
|
||||||
std::unique_ptr<TitleScene> _titleScene;
|
std::unique_ptr<TitleScene> _titleScene;
|
||||||
std::unique_ptr<GameScene> _gameScene;
|
std::unique_ptr<GameScene> _gameScene;
|
||||||
IScene* _activeScene = nullptr;
|
IScene* _activeScene = nullptr;
|
||||||
@@ -174,6 +175,7 @@ namespace OpenRCT2
|
|||||||
#ifndef DISABLE_NETWORK
|
#ifndef DISABLE_NETWORK
|
||||||
, _network(*this)
|
, _network(*this)
|
||||||
#endif
|
#endif
|
||||||
|
, _introScene(std::make_unique<IntroScene>(*this))
|
||||||
, _titleScene(std::make_unique<TitleScene>(*this))
|
, _titleScene(std::make_unique<TitleScene>(*this))
|
||||||
, _gameScene(std::make_unique<GameScene>(*this))
|
, _gameScene(std::make_unique<GameScene>(*this))
|
||||||
, _painter(std::make_unique<Painter>(uiContext))
|
, _painter(std::make_unique<Painter>(uiContext))
|
||||||
@@ -317,8 +319,7 @@ namespace OpenRCT2
|
|||||||
|
|
||||||
IScene* GetIntroScene() override
|
IScene* GetIntroScene() override
|
||||||
{
|
{
|
||||||
// TODO: Implement me.
|
return _introScene.get();
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IScene* GetTitleScene() override
|
IScene* GetTitleScene() override
|
||||||
@@ -917,7 +918,6 @@ namespace OpenRCT2
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
gIntroState = IntroState::None;
|
|
||||||
if (gOpenRCT2Headless)
|
if (gOpenRCT2Headless)
|
||||||
{
|
{
|
||||||
// NONE or OPEN are the only allowed actions for headless mode
|
// NONE or OPEN are the only allowed actions for headless mode
|
||||||
@@ -937,8 +937,7 @@ namespace OpenRCT2
|
|||||||
switch (gOpenRCT2StartupAction)
|
switch (gOpenRCT2StartupAction)
|
||||||
{
|
{
|
||||||
case StartupAction::Intro:
|
case StartupAction::Intro:
|
||||||
gIntroState = IntroState::PublisherBegin;
|
SetActiveScene(GetIntroScene());
|
||||||
SetActiveScene(GetTitleScene());
|
|
||||||
break;
|
break;
|
||||||
case StartupAction::Title:
|
case StartupAction::Title:
|
||||||
SetActiveScene(GetTitleScene());
|
SetActiveScene(GetTitleScene());
|
||||||
|
|||||||
@@ -1,303 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Copyright (c) 2014-2024 OpenRCT2 developers
|
|
||||||
*
|
|
||||||
* For a complete list of all authors, please refer to contributors.md
|
|
||||||
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
|
||||||
*
|
|
||||||
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#include "Intro.h"
|
|
||||||
|
|
||||||
#include "Context.h"
|
|
||||||
#include "audio/AudioChannel.h"
|
|
||||||
#include "audio/AudioMixer.h"
|
|
||||||
#include "audio/audio.h"
|
|
||||||
#include "drawing/Drawing.h"
|
|
||||||
#include "sprites.h"
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
using namespace OpenRCT2::Audio;
|
|
||||||
|
|
||||||
static constexpr PaletteIndex kBackgroundColourDark = PALETTE_INDEX_10;
|
|
||||||
static constexpr PaletteIndex kBackgroundColourLogo = PALETTE_INDEX_245;
|
|
||||||
static constexpr PaletteIndex kBorderColourPublisher = PALETTE_INDEX_129;
|
|
||||||
|
|
||||||
constexpr int32_t PALETTE_G1_IDX_DEVELOPER = 23217;
|
|
||||||
constexpr int32_t PALETTE_G1_IDX_LOGO = 23224;
|
|
||||||
|
|
||||||
IntroState gIntroState;
|
|
||||||
|
|
||||||
// Used mainly for timing but also for Y coordinate and fading.
|
|
||||||
static int32_t _introStateCounter;
|
|
||||||
|
|
||||||
static std::shared_ptr<IAudioChannel> _soundChannel = nullptr;
|
|
||||||
static bool _chainLiftFinished;
|
|
||||||
|
|
||||||
static void ScreenIntroProcessMouseInput();
|
|
||||||
static void ScreenIntroProcessKeyboardInput();
|
|
||||||
static void ScreenIntroSkipPart();
|
|
||||||
static void ScreenIntroDrawLogo(DrawPixelInfo& dpi);
|
|
||||||
|
|
||||||
// rct2: 0x0068E966
|
|
||||||
void IntroUpdate()
|
|
||||||
{
|
|
||||||
ScreenIntroProcessMouseInput();
|
|
||||||
ScreenIntroProcessKeyboardInput();
|
|
||||||
|
|
||||||
switch (gIntroState)
|
|
||||||
{
|
|
||||||
case IntroState::Disclaimer1:
|
|
||||||
case IntroState::Disclaimer2:
|
|
||||||
// Originally used for the disclaimer text
|
|
||||||
gIntroState = IntroState::PublisherBegin;
|
|
||||||
[[fallthrough]];
|
|
||||||
case IntroState::PublisherBegin:
|
|
||||||
LoadPalette();
|
|
||||||
|
|
||||||
// Set the Y for the Infogrames logo
|
|
||||||
_introStateCounter = -580;
|
|
||||||
|
|
||||||
// Play the chain lift sound
|
|
||||||
_soundChannel = CreateAudioChannel(SoundId::LiftBM, true);
|
|
||||||
_chainLiftFinished = false;
|
|
||||||
gIntroState = IntroState::PublisherScroll;
|
|
||||||
break;
|
|
||||||
case IntroState::PublisherScroll:
|
|
||||||
// Move the Infogrames logo down
|
|
||||||
_introStateCounter += 5;
|
|
||||||
|
|
||||||
// Check if logo is off the screen...ish
|
|
||||||
if (_introStateCounter > ContextGetHeight() - 120)
|
|
||||||
{
|
|
||||||
_introStateCounter = -116;
|
|
||||||
gIntroState = IntroState::DeveloperBegin;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case IntroState::DeveloperBegin:
|
|
||||||
// Set the Y for the Chris Sawyer logo
|
|
||||||
_introStateCounter = -116;
|
|
||||||
|
|
||||||
gIntroState = IntroState::DeveloperScroll;
|
|
||||||
break;
|
|
||||||
case IntroState::DeveloperScroll:
|
|
||||||
_introStateCounter += 5;
|
|
||||||
|
|
||||||
// Check if logo is almost scrolled to the bottom
|
|
||||||
if (!_chainLiftFinished && _introStateCounter >= ContextGetHeight() + 40 - 421)
|
|
||||||
{
|
|
||||||
_chainLiftFinished = true;
|
|
||||||
|
|
||||||
// Stop the chain lift sound
|
|
||||||
if (_soundChannel != nullptr)
|
|
||||||
{
|
|
||||||
_soundChannel->Stop();
|
|
||||||
_soundChannel = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Play the track friction sound
|
|
||||||
_soundChannel = CreateAudioChannel(SoundId::TrackFrictionBM, true, kMixerVolumeMax, 0.25f, 0.75);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if logo is off the screen...ish
|
|
||||||
if (_introStateCounter >= ContextGetHeight() + 40)
|
|
||||||
{
|
|
||||||
// Stop the track friction sound
|
|
||||||
if (_soundChannel != nullptr)
|
|
||||||
{
|
|
||||||
_soundChannel->Stop();
|
|
||||||
_soundChannel = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Play long peep scream sound
|
|
||||||
_soundChannel = CreateAudioChannel(SoundId::Scream1);
|
|
||||||
|
|
||||||
gIntroState = IntroState::LogoFadeIn;
|
|
||||||
_introStateCounter = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IntroState::LogoFadeIn:
|
|
||||||
// Fade in, add 4 / 256 to fading
|
|
||||||
_introStateCounter += 0x400;
|
|
||||||
if (_introStateCounter > 0xFF00)
|
|
||||||
{
|
|
||||||
gIntroState = IntroState::LogoWait;
|
|
||||||
_introStateCounter = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IntroState::LogoWait:
|
|
||||||
// Wait 80 game ticks
|
|
||||||
_introStateCounter++;
|
|
||||||
if (_introStateCounter >= 80)
|
|
||||||
{
|
|
||||||
// Set fading to 256
|
|
||||||
_introStateCounter = 0xFF00;
|
|
||||||
|
|
||||||
gIntroState = IntroState::LogoFadeOut;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IntroState::LogoFadeOut:
|
|
||||||
// Fade out, subtract 4 / 256 from fading
|
|
||||||
_introStateCounter -= 0x400;
|
|
||||||
if (_introStateCounter < 0)
|
|
||||||
{
|
|
||||||
gIntroState = IntroState::Clear;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IntroState::Clear:
|
|
||||||
// Stop any playing sound
|
|
||||||
if (_soundChannel != nullptr)
|
|
||||||
{
|
|
||||||
_soundChannel->Stop();
|
|
||||||
_soundChannel = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move to next part
|
|
||||||
gIntroState = IntroState::Finish;
|
|
||||||
_introStateCounter = 0;
|
|
||||||
break;
|
|
||||||
case IntroState::Finish:
|
|
||||||
gIntroState = IntroState::None;
|
|
||||||
LoadPalette();
|
|
||||||
OpenRCT2::Audio::PlayTitleMusic();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void IntroDraw(DrawPixelInfo& dpi)
|
|
||||||
{
|
|
||||||
int32_t screenWidth = ContextGetWidth();
|
|
||||||
|
|
||||||
switch (gIntroState)
|
|
||||||
{
|
|
||||||
case IntroState::Disclaimer1:
|
|
||||||
case IntroState::Disclaimer2:
|
|
||||||
break;
|
|
||||||
case IntroState::PublisherBegin:
|
|
||||||
GfxClear(dpi, kBackgroundColourDark);
|
|
||||||
break;
|
|
||||||
case IntroState::PublisherScroll:
|
|
||||||
GfxClear(dpi, kBackgroundColourDark);
|
|
||||||
|
|
||||||
// Draw a white rectangle for the logo background (gives a bit of white margin)
|
|
||||||
GfxFillRect(
|
|
||||||
dpi,
|
|
||||||
{ { (screenWidth / 2) - 320 + 50, _introStateCounter + 50 },
|
|
||||||
{ (screenWidth / 2) - 320 + 50 + 540, _introStateCounter + 50 + 425 } },
|
|
||||||
kBorderColourPublisher);
|
|
||||||
|
|
||||||
// Draw Infogrames logo
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_INFOGRAMES_00), { (screenWidth / 2) - 320 + 69, _introStateCounter + 69 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_INFOGRAMES_10), { (screenWidth / 2) - 320 + 319, _introStateCounter + 69 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_INFOGRAMES_01), { (screenWidth / 2) - 320 + 69, _introStateCounter + 319 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_INFOGRAMES_11), { (screenWidth / 2) - 320 + 319, _introStateCounter + 319 });
|
|
||||||
break;
|
|
||||||
case IntroState::DeveloperBegin:
|
|
||||||
GfxClear(dpi, kBackgroundColourDark);
|
|
||||||
GfxTransposePalette(PALETTE_G1_IDX_DEVELOPER, 255);
|
|
||||||
break;
|
|
||||||
case IntroState::DeveloperScroll:
|
|
||||||
GfxClear(dpi, kBackgroundColourDark);
|
|
||||||
|
|
||||||
// Draw Chris Sawyer logo
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_CHRIS_SAWYER_00), { (screenWidth / 2) - 320 + 70, _introStateCounter });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_CHRIS_SAWYER_10), { (screenWidth / 2) - 320 + 320, _introStateCounter });
|
|
||||||
break;
|
|
||||||
case IntroState::LogoFadeIn:
|
|
||||||
if (_introStateCounter <= 0xFF00)
|
|
||||||
{
|
|
||||||
GfxTransposePalette(PALETTE_G1_IDX_LOGO, (_introStateCounter >> 8) & 0xFF);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GfxTransposePalette(PALETTE_G1_IDX_LOGO, 255);
|
|
||||||
}
|
|
||||||
ScreenIntroDrawLogo(dpi);
|
|
||||||
break;
|
|
||||||
case IntroState::LogoWait:
|
|
||||||
ScreenIntroDrawLogo(dpi);
|
|
||||||
break;
|
|
||||||
case IntroState::LogoFadeOut:
|
|
||||||
if (_introStateCounter >= 0)
|
|
||||||
{
|
|
||||||
GfxTransposePalette(PALETTE_G1_IDX_LOGO, (_introStateCounter >> 8) & 0xFF);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GfxTransposePalette(PALETTE_G1_IDX_LOGO, 0);
|
|
||||||
}
|
|
||||||
ScreenIntroDrawLogo(dpi);
|
|
||||||
break;
|
|
||||||
case IntroState::Clear:
|
|
||||||
GfxClear(dpi, kBackgroundColourDark);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ScreenIntroProcessMouseInput()
|
|
||||||
{
|
|
||||||
if (ContextGetCursorState()->any == CURSOR_PRESSED)
|
|
||||||
{
|
|
||||||
ScreenIntroSkipPart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* rct2: 0x006E3AEC
|
|
||||||
*/
|
|
||||||
static void ScreenIntroProcessKeyboardInput()
|
|
||||||
{
|
|
||||||
const uint8_t* keys = ContextGetKeysState();
|
|
||||||
for (int i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
if (keys[i] != 0)
|
|
||||||
{
|
|
||||||
ScreenIntroSkipPart();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ScreenIntroSkipPart()
|
|
||||||
{
|
|
||||||
switch (gIntroState)
|
|
||||||
{
|
|
||||||
case IntroState::None:
|
|
||||||
break;
|
|
||||||
case IntroState::Disclaimer2:
|
|
||||||
gIntroState = IntroState::PublisherBegin;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
gIntroState = IntroState::Clear;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ScreenIntroDrawLogo(DrawPixelInfo& dpi)
|
|
||||||
{
|
|
||||||
int32_t screenWidth = ContextGetWidth();
|
|
||||||
int32_t imageWidth = 640;
|
|
||||||
int32_t imageX = (screenWidth - imageWidth) / 2;
|
|
||||||
|
|
||||||
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_00);
|
|
||||||
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_10);
|
|
||||||
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_20);
|
|
||||||
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_01);
|
|
||||||
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_11);
|
|
||||||
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_21);
|
|
||||||
|
|
||||||
GfxClear(dpi, kBackgroundColourLogo);
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_00), { imageX + 0, 0 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_10), { imageX + 220, 0 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_20), { imageX + 440, 0 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_01), { imageX + 0, 240 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_11), { imageX + 220, 240 });
|
|
||||||
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_21), { imageX + 440, 240 });
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Copyright (c) 2014-2024 OpenRCT2 developers
|
|
||||||
*
|
|
||||||
* For a complete list of all authors, please refer to contributors.md
|
|
||||||
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
|
||||||
*
|
|
||||||
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
struct DrawPixelInfo;
|
|
||||||
|
|
||||||
enum class IntroState : uint8_t
|
|
||||||
{
|
|
||||||
None,
|
|
||||||
PublisherBegin,
|
|
||||||
PublisherScroll,
|
|
||||||
DeveloperBegin,
|
|
||||||
DeveloperScroll,
|
|
||||||
LogoFadeIn,
|
|
||||||
LogoWait,
|
|
||||||
LogoFadeOut,
|
|
||||||
Disclaimer1,
|
|
||||||
Disclaimer2,
|
|
||||||
Clear = 254,
|
|
||||||
Finish = 255,
|
|
||||||
};
|
|
||||||
|
|
||||||
extern IntroState gIntroState;
|
|
||||||
|
|
||||||
void IntroUpdate();
|
|
||||||
void IntroDraw(DrawPixelInfo& dpi);
|
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
|
||||||
#include "../Context.h"
|
#include "../Context.h"
|
||||||
#include "../Intro.h"
|
|
||||||
#include "../OpenRCT2.h"
|
#include "../OpenRCT2.h"
|
||||||
#include "../PlatformEnvironment.h"
|
#include "../PlatformEnvironment.h"
|
||||||
#include "../config/Config.h"
|
#include "../config/Config.h"
|
||||||
@@ -26,6 +25,7 @@
|
|||||||
#include "../object/ObjectManager.h"
|
#include "../object/ObjectManager.h"
|
||||||
#include "../ride/Ride.h"
|
#include "../ride/Ride.h"
|
||||||
#include "../ride/RideAudio.h"
|
#include "../ride/RideAudio.h"
|
||||||
|
#include "../scenes/intro/IntroScene.h"
|
||||||
#include "../ui/UiContext.h"
|
#include "../ui/UiContext.h"
|
||||||
#include "../util/Util.h"
|
#include "../util/Util.h"
|
||||||
#include "../world/Climate.h"
|
#include "../world/Climate.h"
|
||||||
@@ -294,7 +294,7 @@ namespace OpenRCT2::Audio
|
|||||||
|
|
||||||
void PlayTitleMusic()
|
void PlayTitleMusic()
|
||||||
{
|
{
|
||||||
if (gGameSoundsOff || !(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) || gIntroState != IntroState::None)
|
if (gGameSoundsOff || !(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) || IntroIsPlaying())
|
||||||
{
|
{
|
||||||
StopTitleMusic();
|
StopTitleMusic();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -10,12 +10,12 @@
|
|||||||
#include "X8DrawingEngine.h"
|
#include "X8DrawingEngine.h"
|
||||||
|
|
||||||
#include "../Context.h"
|
#include "../Context.h"
|
||||||
#include "../Intro.h"
|
|
||||||
#include "../config/Config.h"
|
#include "../config/Config.h"
|
||||||
#include "../core/Numerics.hpp"
|
#include "../core/Numerics.hpp"
|
||||||
#include "../interface/Screenshot.h"
|
#include "../interface/Screenshot.h"
|
||||||
#include "../interface/Viewport.h"
|
#include "../interface/Viewport.h"
|
||||||
#include "../interface/Window.h"
|
#include "../interface/Window.h"
|
||||||
|
#include "../scenes/intro/IntroScene.h"
|
||||||
#include "../ui/UiContext.h"
|
#include "../ui/UiContext.h"
|
||||||
#include "../util/Util.h"
|
#include "../util/Util.h"
|
||||||
#include "Drawing.h"
|
#include "Drawing.h"
|
||||||
@@ -184,7 +184,7 @@ void X8DrawingEngine::Invalidate(int32_t left, int32_t top, int32_t right, int32
|
|||||||
|
|
||||||
void X8DrawingEngine::BeginDraw()
|
void X8DrawingEngine::BeginDraw()
|
||||||
{
|
{
|
||||||
if (gIntroState == IntroState::None)
|
if (!IntroIsPlaying())
|
||||||
{
|
{
|
||||||
// HACK we need to re-configure the bits if light fx has been enabled / disabled
|
// HACK we need to re-configure the bits if light fx has been enabled / disabled
|
||||||
if (_lastLightFXenabled != (gConfigGeneral.EnableLightFx != 0))
|
if (_lastLightFXenabled != (gConfigGeneral.EnableLightFx != 0))
|
||||||
@@ -837,4 +837,4 @@ void X8DrawingContext::DrawTTFBitmap(
|
|||||||
else
|
else
|
||||||
DrawTTFBitmapInternal<false>(dpi, fgColor, surface, x, y, 0);
|
DrawTTFBitmapInternal<false>(dpi, fgColor, surface, x, y, 0);
|
||||||
#endif // NO_TTF
|
#endif // NO_TTF
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
#include "../Context.h"
|
#include "../Context.h"
|
||||||
#include "../Game.h"
|
#include "../Game.h"
|
||||||
#include "../GameState.h"
|
#include "../GameState.h"
|
||||||
#include "../Intro.h"
|
|
||||||
#include "../OpenRCT2.h"
|
#include "../OpenRCT2.h"
|
||||||
#include "../PlatformEnvironment.h"
|
#include "../PlatformEnvironment.h"
|
||||||
#include "../actions/CheatSetAction.h"
|
#include "../actions/CheatSetAction.h"
|
||||||
@@ -490,7 +489,6 @@ int32_t CommandLineForScreenshot(const char** argv, int32_t argc, ScreenshotOpti
|
|||||||
throw std::runtime_error("Failed to load park.");
|
throw std::runtime_error("Failed to load park.");
|
||||||
}
|
}
|
||||||
|
|
||||||
gIntroState = IntroState::None;
|
|
||||||
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
gScreenFlags = SCREEN_FLAGS_PLAYING;
|
||||||
|
|
||||||
Viewport viewport{};
|
Viewport viewport{};
|
||||||
|
|||||||
@@ -275,7 +275,6 @@
|
|||||||
<ClInclude Include="interface\WindowClasses.h" />
|
<ClInclude Include="interface\WindowClasses.h" />
|
||||||
<ClInclude Include="interface\Window_internal.h" />
|
<ClInclude Include="interface\Window_internal.h" />
|
||||||
<ClInclude Include="interface\ZoomLevel.h" />
|
<ClInclude Include="interface\ZoomLevel.h" />
|
||||||
<ClInclude Include="Intro.h" />
|
|
||||||
<ClInclude Include="Limits.h" />
|
<ClInclude Include="Limits.h" />
|
||||||
<ClInclude Include="localisation\ConversionTables.h" />
|
<ClInclude Include="localisation\ConversionTables.h" />
|
||||||
<ClInclude Include="localisation\Currency.h" />
|
<ClInclude Include="localisation\Currency.h" />
|
||||||
@@ -512,6 +511,7 @@
|
|||||||
<ClInclude Include="scenario\ScenarioRepository.h" />
|
<ClInclude Include="scenario\ScenarioRepository.h" />
|
||||||
<ClInclude Include="scenario\ScenarioSources.h" />
|
<ClInclude Include="scenario\ScenarioSources.h" />
|
||||||
<ClInclude Include="scenes\Scene.h" />
|
<ClInclude Include="scenes\Scene.h" />
|
||||||
|
<ClInclude Include="scenes\intro\IntroScene.h" />
|
||||||
<ClInclude Include="scenes\game\GameScene.h" />
|
<ClInclude Include="scenes\game\GameScene.h" />
|
||||||
<ClInclude Include="scenes\title\Command\End.h" />
|
<ClInclude Include="scenes\title\Command\End.h" />
|
||||||
<ClInclude Include="scenes\title\Command\FollowEntity.h" />
|
<ClInclude Include="scenes\title\Command\FollowEntity.h" />
|
||||||
@@ -793,7 +793,6 @@
|
|||||||
<ClCompile Include="interface\Window.cpp" />
|
<ClCompile Include="interface\Window.cpp" />
|
||||||
<ClCompile Include="interface\Window_internal.cpp" />
|
<ClCompile Include="interface\Window_internal.cpp" />
|
||||||
<ClCompile Include="interface\ZoomLevel.cpp" />
|
<ClCompile Include="interface\ZoomLevel.cpp" />
|
||||||
<ClCompile Include="Intro.cpp" />
|
|
||||||
<ClCompile Include="localisation\ConversionTables.cpp" />
|
<ClCompile Include="localisation\ConversionTables.cpp" />
|
||||||
<ClCompile Include="localisation\Convert.cpp" />
|
<ClCompile Include="localisation\Convert.cpp" />
|
||||||
<ClCompile Include="localisation\Currency.cpp" />
|
<ClCompile Include="localisation\Currency.cpp" />
|
||||||
@@ -1003,6 +1002,7 @@
|
|||||||
<ClCompile Include="scenario\ScenarioSources.cpp" />
|
<ClCompile Include="scenario\ScenarioSources.cpp" />
|
||||||
<ClCompile Include="scenes\Scene.cpp" />
|
<ClCompile Include="scenes\Scene.cpp" />
|
||||||
<ClCompile Include="scenes\game\GameScene.cpp" />
|
<ClCompile Include="scenes\game\GameScene.cpp" />
|
||||||
|
<ClCompile Include="scenes\intro\IntroScene.cpp" />
|
||||||
<ClCompile Include="scenes\title\Command\End.cpp" />
|
<ClCompile Include="scenes\title\Command\End.cpp" />
|
||||||
<ClCompile Include="scenes\title\Command\FollowEntity.cpp" />
|
<ClCompile Include="scenes\title\Command\FollowEntity.cpp" />
|
||||||
<ClCompile Include="scenes\title\Command\LoadPark.cpp" />
|
<ClCompile Include="scenes\title\Command\LoadPark.cpp" />
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
#include "../Game.h"
|
#include "../Game.h"
|
||||||
#include "../GameState.h"
|
#include "../GameState.h"
|
||||||
#include "../Intro.h"
|
|
||||||
#include "../OpenRCT2.h"
|
#include "../OpenRCT2.h"
|
||||||
#include "../ReplayManager.h"
|
#include "../ReplayManager.h"
|
||||||
#include "../config/Config.h"
|
#include "../config/Config.h"
|
||||||
@@ -24,6 +23,7 @@
|
|||||||
#include "../localisation/Language.h"
|
#include "../localisation/Language.h"
|
||||||
#include "../paint/Paint.h"
|
#include "../paint/Paint.h"
|
||||||
#include "../profiling/Profiling.h"
|
#include "../profiling/Profiling.h"
|
||||||
|
#include "../scenes/intro/IntroScene.h"
|
||||||
#include "../scenes/title/TitleScene.h"
|
#include "../scenes/title/TitleScene.h"
|
||||||
#include "../ui/UiContext.h"
|
#include "../ui/UiContext.h"
|
||||||
#include "../world/TileInspector.h"
|
#include "../world/TileInspector.h"
|
||||||
@@ -43,7 +43,8 @@ void Painter::Paint(IDrawingEngine& de)
|
|||||||
PROFILED_FUNCTION();
|
PROFILED_FUNCTION();
|
||||||
|
|
||||||
auto dpi = de.GetDrawingPixelInfo();
|
auto dpi = de.GetDrawingPixelInfo();
|
||||||
if (gIntroState != IntroState::None)
|
|
||||||
|
if (IntroIsPlaying())
|
||||||
{
|
{
|
||||||
IntroDraw(*dpi);
|
IntroDraw(*dpi);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../../common.h"
|
#include "../../common.h"
|
||||||
#include "../../drawing/Drawing.h"
|
|
||||||
#include "../Scene.h"
|
#include "../Scene.h"
|
||||||
|
|
||||||
namespace OpenRCT2
|
namespace OpenRCT2
|
||||||
|
|||||||
326
src/openrct2/scenes/intro/IntroScene.cpp
Normal file
326
src/openrct2/scenes/intro/IntroScene.cpp
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2014-2024 OpenRCT2 developers
|
||||||
|
*
|
||||||
|
* For a complete list of all authors, please refer to contributors.md
|
||||||
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
||||||
|
*
|
||||||
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "IntroScene.h"
|
||||||
|
|
||||||
|
#include "../../Context.h"
|
||||||
|
#include "../../audio/AudioChannel.h"
|
||||||
|
#include "../../audio/AudioMixer.h"
|
||||||
|
#include "../../audio/audio.h"
|
||||||
|
#include "../../drawing/Drawing.h"
|
||||||
|
#include "../../sprites.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
using OpenRCT2::Audio::SoundId;
|
||||||
|
|
||||||
|
namespace OpenRCT2
|
||||||
|
{
|
||||||
|
static constexpr PaletteIndex kBackgroundColourDark = PALETTE_INDEX_10;
|
||||||
|
static constexpr PaletteIndex kBackgroundColourLogo = PALETTE_INDEX_245;
|
||||||
|
static constexpr PaletteIndex kBorderColourPublisher = PALETTE_INDEX_129;
|
||||||
|
|
||||||
|
constexpr int32_t PALETTE_G1_IDX_DEVELOPER = 23217;
|
||||||
|
constexpr int32_t PALETTE_G1_IDX_LOGO = 23224;
|
||||||
|
|
||||||
|
static IntroState _introState;
|
||||||
|
|
||||||
|
// Used mainly for timing but also for Y coordinate and fading.
|
||||||
|
static int32_t _introStateCounter;
|
||||||
|
|
||||||
|
static std::shared_ptr<Audio::IAudioChannel> _soundChannel = nullptr;
|
||||||
|
static bool _chainLiftFinished;
|
||||||
|
|
||||||
|
bool IntroIsPlaying()
|
||||||
|
{
|
||||||
|
return _introState != IntroState::None;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntroScene::Load()
|
||||||
|
{
|
||||||
|
_introState = IntroState::PublisherBegin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntroScene::Stop()
|
||||||
|
{
|
||||||
|
_introState = IntroState::None;
|
||||||
|
LoadPalette();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ScreenIntroProcessMouseInput();
|
||||||
|
static void ScreenIntroProcessKeyboardInput();
|
||||||
|
static void ScreenIntroSkipPart();
|
||||||
|
static void ScreenIntroDrawLogo(DrawPixelInfo& dpi);
|
||||||
|
|
||||||
|
// rct2: 0x0068E966
|
||||||
|
void IntroScene::Tick()
|
||||||
|
{
|
||||||
|
ScreenIntroProcessMouseInput();
|
||||||
|
ScreenIntroProcessKeyboardInput();
|
||||||
|
|
||||||
|
switch (_introState)
|
||||||
|
{
|
||||||
|
case IntroState::Disclaimer1:
|
||||||
|
case IntroState::Disclaimer2:
|
||||||
|
// Originally used for the disclaimer text
|
||||||
|
_introState = IntroState::PublisherBegin;
|
||||||
|
[[fallthrough]];
|
||||||
|
case IntroState::PublisherBegin:
|
||||||
|
LoadPalette();
|
||||||
|
|
||||||
|
// Set the Y for the Infogrames logo
|
||||||
|
_introStateCounter = -580;
|
||||||
|
|
||||||
|
// Play the chain lift sound
|
||||||
|
_soundChannel = Audio::CreateAudioChannel(SoundId::LiftBM, true);
|
||||||
|
_chainLiftFinished = false;
|
||||||
|
_introState = IntroState::PublisherScroll;
|
||||||
|
break;
|
||||||
|
case IntroState::PublisherScroll:
|
||||||
|
// Move the Infogrames logo down
|
||||||
|
_introStateCounter += 5;
|
||||||
|
|
||||||
|
// Check if logo is off the screen...ish
|
||||||
|
if (_introStateCounter > ContextGetHeight() - 120)
|
||||||
|
{
|
||||||
|
_introStateCounter = -116;
|
||||||
|
_introState = IntroState::DeveloperBegin;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case IntroState::DeveloperBegin:
|
||||||
|
// Set the Y for the Chris Sawyer logo
|
||||||
|
_introStateCounter = -116;
|
||||||
|
|
||||||
|
_introState = IntroState::DeveloperScroll;
|
||||||
|
break;
|
||||||
|
case IntroState::DeveloperScroll:
|
||||||
|
_introStateCounter += 5;
|
||||||
|
|
||||||
|
// Check if logo is almost scrolled to the bottom
|
||||||
|
if (!_chainLiftFinished && _introStateCounter >= ContextGetHeight() + 40 - 421)
|
||||||
|
{
|
||||||
|
_chainLiftFinished = true;
|
||||||
|
|
||||||
|
// Stop the chain lift sound
|
||||||
|
if (_soundChannel != nullptr)
|
||||||
|
{
|
||||||
|
_soundChannel->Stop();
|
||||||
|
_soundChannel = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Play the track friction sound
|
||||||
|
_soundChannel = Audio::CreateAudioChannel(
|
||||||
|
SoundId::TrackFrictionBM, true, Audio::kMixerVolumeMax, 0.25f, 0.75);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if logo is off the screen...ish
|
||||||
|
if (_introStateCounter >= ContextGetHeight() + 40)
|
||||||
|
{
|
||||||
|
// Stop the track friction sound
|
||||||
|
if (_soundChannel != nullptr)
|
||||||
|
{
|
||||||
|
_soundChannel->Stop();
|
||||||
|
_soundChannel = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Play long peep scream sound
|
||||||
|
_soundChannel = Audio::CreateAudioChannel(SoundId::Scream1);
|
||||||
|
|
||||||
|
_introState = IntroState::LogoFadeIn;
|
||||||
|
_introStateCounter = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IntroState::LogoFadeIn:
|
||||||
|
// Fade in, add 4 / 256 to fading
|
||||||
|
_introStateCounter += 0x400;
|
||||||
|
if (_introStateCounter > 0xFF00)
|
||||||
|
{
|
||||||
|
_introState = IntroState::LogoWait;
|
||||||
|
_introStateCounter = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IntroState::LogoWait:
|
||||||
|
// Wait 80 game ticks
|
||||||
|
_introStateCounter++;
|
||||||
|
if (_introStateCounter >= 80)
|
||||||
|
{
|
||||||
|
// Set fading to 256
|
||||||
|
_introStateCounter = 0xFF00;
|
||||||
|
|
||||||
|
_introState = IntroState::LogoFadeOut;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IntroState::LogoFadeOut:
|
||||||
|
// Fade out, subtract 4 / 256 from fading
|
||||||
|
_introStateCounter -= 0x400;
|
||||||
|
if (_introStateCounter < 0)
|
||||||
|
{
|
||||||
|
_introState = IntroState::Clear;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IntroState::Clear:
|
||||||
|
// Stop any playing sound
|
||||||
|
if (_soundChannel != nullptr)
|
||||||
|
{
|
||||||
|
_soundChannel->Stop();
|
||||||
|
_soundChannel = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move to next part
|
||||||
|
_introState = IntroState::Finish;
|
||||||
|
_introStateCounter = 0;
|
||||||
|
break;
|
||||||
|
case IntroState::Finish:
|
||||||
|
{
|
||||||
|
auto& context = GetContext();
|
||||||
|
context.SetActiveScene(context.GetTitleScene());
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IntroDraw(DrawPixelInfo& dpi)
|
||||||
|
{
|
||||||
|
int32_t screenWidth = ContextGetWidth();
|
||||||
|
|
||||||
|
switch (_introState)
|
||||||
|
{
|
||||||
|
case IntroState::Disclaimer1:
|
||||||
|
case IntroState::Disclaimer2:
|
||||||
|
break;
|
||||||
|
case IntroState::PublisherBegin:
|
||||||
|
GfxClear(dpi, kBackgroundColourDark);
|
||||||
|
break;
|
||||||
|
case IntroState::PublisherScroll:
|
||||||
|
GfxClear(dpi, kBackgroundColourDark);
|
||||||
|
|
||||||
|
// Draw a white rectangle for the logo background (gives a bit of white margin)
|
||||||
|
GfxFillRect(
|
||||||
|
dpi,
|
||||||
|
{ { (screenWidth / 2) - 320 + 50, _introStateCounter + 50 },
|
||||||
|
{ (screenWidth / 2) - 320 + 50 + 540, _introStateCounter + 50 + 425 } },
|
||||||
|
kBorderColourPublisher);
|
||||||
|
|
||||||
|
// Draw Infogrames logo
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_INFOGRAMES_00), { (screenWidth / 2) - 320 + 69, _introStateCounter + 69 });
|
||||||
|
GfxDrawSprite(
|
||||||
|
dpi, ImageId(SPR_INTRO_INFOGRAMES_10), { (screenWidth / 2) - 320 + 319, _introStateCounter + 69 });
|
||||||
|
GfxDrawSprite(
|
||||||
|
dpi, ImageId(SPR_INTRO_INFOGRAMES_01), { (screenWidth / 2) - 320 + 69, _introStateCounter + 319 });
|
||||||
|
GfxDrawSprite(
|
||||||
|
dpi, ImageId(SPR_INTRO_INFOGRAMES_11), { (screenWidth / 2) - 320 + 319, _introStateCounter + 319 });
|
||||||
|
break;
|
||||||
|
case IntroState::DeveloperBegin:
|
||||||
|
GfxClear(dpi, kBackgroundColourDark);
|
||||||
|
GfxTransposePalette(PALETTE_G1_IDX_DEVELOPER, 255);
|
||||||
|
break;
|
||||||
|
case IntroState::DeveloperScroll:
|
||||||
|
GfxClear(dpi, kBackgroundColourDark);
|
||||||
|
|
||||||
|
// Draw Chris Sawyer logo
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_CHRIS_SAWYER_00), { (screenWidth / 2) - 320 + 70, _introStateCounter });
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_CHRIS_SAWYER_10), { (screenWidth / 2) - 320 + 320, _introStateCounter });
|
||||||
|
break;
|
||||||
|
case IntroState::LogoFadeIn:
|
||||||
|
if (_introStateCounter <= 0xFF00)
|
||||||
|
{
|
||||||
|
GfxTransposePalette(PALETTE_G1_IDX_LOGO, (_introStateCounter >> 8) & 0xFF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GfxTransposePalette(PALETTE_G1_IDX_LOGO, 255);
|
||||||
|
}
|
||||||
|
ScreenIntroDrawLogo(dpi);
|
||||||
|
break;
|
||||||
|
case IntroState::LogoWait:
|
||||||
|
ScreenIntroDrawLogo(dpi);
|
||||||
|
break;
|
||||||
|
case IntroState::LogoFadeOut:
|
||||||
|
if (_introStateCounter >= 0)
|
||||||
|
{
|
||||||
|
GfxTransposePalette(PALETTE_G1_IDX_LOGO, (_introStateCounter >> 8) & 0xFF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GfxTransposePalette(PALETTE_G1_IDX_LOGO, 0);
|
||||||
|
}
|
||||||
|
ScreenIntroDrawLogo(dpi);
|
||||||
|
break;
|
||||||
|
case IntroState::Clear:
|
||||||
|
GfxClear(dpi, kBackgroundColourDark);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ScreenIntroProcessMouseInput()
|
||||||
|
{
|
||||||
|
if (ContextGetCursorState()->any == CURSOR_PRESSED)
|
||||||
|
{
|
||||||
|
ScreenIntroSkipPart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* rct2: 0x006E3AEC
|
||||||
|
*/
|
||||||
|
static void ScreenIntroProcessKeyboardInput()
|
||||||
|
{
|
||||||
|
const uint8_t* keys = ContextGetKeysState();
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
if (keys[i] != 0)
|
||||||
|
{
|
||||||
|
ScreenIntroSkipPart();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ScreenIntroSkipPart()
|
||||||
|
{
|
||||||
|
switch (_introState)
|
||||||
|
{
|
||||||
|
case IntroState::None:
|
||||||
|
break;
|
||||||
|
case IntroState::Disclaimer2:
|
||||||
|
_introState = IntroState::PublisherBegin;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_introState = IntroState::Clear;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ScreenIntroDrawLogo(DrawPixelInfo& dpi)
|
||||||
|
{
|
||||||
|
int32_t screenWidth = ContextGetWidth();
|
||||||
|
int32_t imageWidth = 640;
|
||||||
|
int32_t imageX = (screenWidth - imageWidth) / 2;
|
||||||
|
|
||||||
|
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_00);
|
||||||
|
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_10);
|
||||||
|
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_20);
|
||||||
|
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_01);
|
||||||
|
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_11);
|
||||||
|
DrawingEngineInvalidateImage(SPR_INTRO_LOGO_21);
|
||||||
|
|
||||||
|
GfxClear(dpi, kBackgroundColourLogo);
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_00), { imageX + 0, 0 });
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_10), { imageX + 220, 0 });
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_20), { imageX + 440, 0 });
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_01), { imageX + 0, 240 });
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_11), { imageX + 220, 240 });
|
||||||
|
GfxDrawSprite(dpi, ImageId(SPR_INTRO_LOGO_21), { imageX + 440, 240 });
|
||||||
|
}
|
||||||
|
} // namespace OpenRCT2
|
||||||
48
src/openrct2/scenes/intro/IntroScene.h
Normal file
48
src/openrct2/scenes/intro/IntroScene.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (c) 2014-2024 OpenRCT2 developers
|
||||||
|
*
|
||||||
|
* For a complete list of all authors, please refer to contributors.md
|
||||||
|
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
|
||||||
|
*
|
||||||
|
* OpenRCT2 is licensed under the GNU General Public License version 3.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
#include "../Scene.h"
|
||||||
|
|
||||||
|
struct DrawPixelInfo;
|
||||||
|
|
||||||
|
namespace OpenRCT2
|
||||||
|
{
|
||||||
|
enum class IntroState : uint8_t
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
PublisherBegin,
|
||||||
|
PublisherScroll,
|
||||||
|
DeveloperBegin,
|
||||||
|
DeveloperScroll,
|
||||||
|
LogoFadeIn,
|
||||||
|
LogoWait,
|
||||||
|
LogoFadeOut,
|
||||||
|
Disclaimer1,
|
||||||
|
Disclaimer2,
|
||||||
|
Clear = 254,
|
||||||
|
Finish = 255,
|
||||||
|
};
|
||||||
|
|
||||||
|
class IntroScene final : public Scene
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using Scene::Scene;
|
||||||
|
|
||||||
|
void Load() override;
|
||||||
|
void Tick() override;
|
||||||
|
void Stop() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool IntroIsPlaying();
|
||||||
|
void IntroUpdate();
|
||||||
|
void IntroDraw(DrawPixelInfo& dpi);
|
||||||
|
} // namespace OpenRCT2
|
||||||
Reference in New Issue
Block a user