Files
scummvm-cursorfix/engines/ags/engine/main/game_start.cpp
2026-02-02 04:50:13 +01:00

139 lines
3.8 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
//
// Game initialization
//
#include "ags/shared/ac/common.h"
#include "ags/shared/ac/character_info.h"
#include "ags/engine/ac/game.h"
#include "ags/engine/ac/game_setup.h"
#include "ags/shared/ac/game_setup_struct.h"
#include "ags/engine/ac/game_setup.h"
#include "ags/engine/ac/game_state.h"
#include "ags/engine/ac/global_game.h"
#include "ags/engine/ac/mouse.h"
#include "ags/engine/ac/room.h"
#include "ags/engine/ac/screen.h"
#include "ags/engine/ac/timer.h"
#include "ags/engine/debugging/debug_log.h"
#include "ags/engine/debugging/debugger.h"
#include "ags/shared/debugging/out.h"
#include "ags/engine/device/mouse_w32.h"
#include "ags/engine/main/game_run.h"
#include "ags/engine/main/game_start.h"
#include "ags/engine/media/audio/audio_system.h"
#include "ags/engine/script/script_runtime.h"
#include "ags/engine/script/script.h"
#include "ags/ags.h"
#include "ags/globals.h"
namespace AGS3 {
using namespace AGS::Shared;
using namespace AGS::Engine;
void start_game_init_editor_debugging() {
Debug::Printf(kDbgMsg_Info, "Try connect to the external debugger");
if (!init_editor_debugging())
return;
// Debugger expects strict multitasking
_GP(usetup).multitasking = true;
_GP(usetup).override_multitasking = -1;
SetMultitasking(1);
auto waitUntil = AGS_Clock::now() + std::chrono::milliseconds(500);
while (waitUntil > AGS_Clock::now()) {
// pick up any breakpoints in game_start
check_for_messages_from_debugger();
}
ccSetDebugHook(scriptDebugHook);
}
static void start_game_load_savegame_on_startup(int loadSave) {
if (loadSave != -1) {
current_fade_out_effect();
try_restore_save(loadSave);
}
}
void start_game() {
set_room_placeholder();
set_cursor_mode(MODE_WALK);
_GP(mouse).SetPosition(Point(160, 100));
newmusic(0);
set_our_eip(-42);
// skip ticks to account for initialisation or a restored game.
skipMissedTicks();
RunScriptFunctionInModules("game_start");
set_our_eip(-43);
// Only auto-set first restart point in < 3.6.1 games,
// since 3.6.1+ users are suggested to set one manually in script.
if (_G(loaded_game_file_version) < kGameVersion_361_10)
SetRestartPoint();
set_our_eip(-3);
if (_G(displayed_room) < 0) {
current_fade_out_effect();
load_new_room(_G(playerchar)->room, _G(playerchar));
}
first_room_initialization();
}
void initialize_start_and_play_game(int override_start_room, int loadSave) {
//try { // BEGIN try for ALI3DEXception
set_cursor_mode(MODE_WALK);
if (override_start_room)
_G(playerchar)->room = override_start_room;
Debug::Printf(kDbgMsg_Info, "Engine initialization complete");
Debug::Printf(kDbgMsg_Info, "Starting game");
if (_G(editor_debugging_enabled))
start_game_init_editor_debugging();
start_game_load_savegame_on_startup(loadSave);
// only start if not restored a save
if (_G(displayed_room) < 0)
start_game();
RunGameUntilAborted();
/*} catch (Ali3DException gfxException) {
quit(gfxException.Message.GetCStr());
}*/
}
} // namespace AGS3