Initial commit
This commit is contained in:
333
engines/m4/vars.cpp
Normal file
333
engines/m4/vars.cpp
Normal file
@@ -0,0 +1,333 @@
|
||||
/* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common/debug.h"
|
||||
#include "m4/vars.h"
|
||||
#include "m4/adv_r/adv.h"
|
||||
#include "m4/adv_r/adv_been.h"
|
||||
#include "m4/core/errors.h"
|
||||
#include "m4/dbg/debug.h"
|
||||
#include "m4/graphics/gr_pal.h"
|
||||
#include "m4/gui/game_menu.h"
|
||||
#include "m4/gui/gui_buffer.h"
|
||||
#include "m4/gui/gui_dialog.h"
|
||||
#include "m4/gui/gui_mouse.h"
|
||||
#include "m4/gui/gui_sys.h"
|
||||
#include "m4/gui/gui_vmng.h"
|
||||
#include "m4/mem/mem.h"
|
||||
#include "m4/detection.h"
|
||||
#include "m4/core/param.h"
|
||||
#include "m4/m4.h"
|
||||
|
||||
namespace M4 {
|
||||
|
||||
Vars *g_vars;
|
||||
|
||||
Vars::Vars() : _digi(g_engine->_mixer), _midi() {
|
||||
g_vars = this;
|
||||
|
||||
Common::fill(_sizeMem, _sizeMem + _MEMTYPE_LIMIT, 0);
|
||||
Common::fill(_requests, _requests + _MEMTYPE_LIMIT, 0);
|
||||
Common::fill(_memBlock, _memBlock + _MEMTYPE_LIMIT, nullptr);
|
||||
}
|
||||
|
||||
Vars::~Vars() {
|
||||
game_systems_shutdown();
|
||||
|
||||
woodscript_shutdown();
|
||||
dbg_ws_shutdown();
|
||||
player_been_shutdown();
|
||||
gui_system_shutdown();
|
||||
gui_buffer_system_shutdown();
|
||||
gui_dialog_shutdown();
|
||||
gui_mouse_shutdown();
|
||||
mem_stash_shutdown();
|
||||
param_shutdown();
|
||||
sysfile_shutdown();
|
||||
f_stream_Shutdown();
|
||||
|
||||
g_vars = nullptr;
|
||||
}
|
||||
|
||||
bool Vars::init() {
|
||||
param_init();
|
||||
parse_all_flags();
|
||||
GUI::SaveLoadMenuBase::init();
|
||||
|
||||
if (_G(system_shutting_down))
|
||||
return false;
|
||||
|
||||
game_systems_initialize(INSTALL_ALL);
|
||||
|
||||
if (!_kernel.hag_mode) {
|
||||
if (!read_catalog())
|
||||
error_show(FL, 'PARS', "game_main");
|
||||
}
|
||||
|
||||
term_message("Load walker engines");
|
||||
if (!LoadWSAssets("walker script", &_master_palette[0]))
|
||||
error_show(FL, 'FNF!', "walker script");
|
||||
if (!LoadWSAssets("show script", &_master_palette[0]))
|
||||
error_show(FL, 'FNF!', "show script");
|
||||
if (!LoadWSAssets("stream script", &_master_palette[0]))
|
||||
error_show(FL, 'FNF!', "stream script");
|
||||
|
||||
grab_fonts();
|
||||
gr_font_set(_font_inter);
|
||||
|
||||
if (_cheating_enabled) {
|
||||
if (!dbg_ws_init(_kernel.start_up_with_dbg_ws, _font_tiny_prop, _globals))
|
||||
error_show(FL, 'DWIF', "cheat system");
|
||||
}
|
||||
|
||||
main_cold_data_init();
|
||||
create_mouse_watch_dialog();
|
||||
global_menu_system_init();
|
||||
initialize_game();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void Vars::game_systems_initialize(byte flags) {
|
||||
_G(term).init(_G(kernel).use_debug_monitor, _G(kernel).use_log_file);
|
||||
|
||||
int totalMem = _G(kernel).mem_avail();
|
||||
if (_G(kernel).suppress_cache == CACHE_NOT_OVERRIDE_BY_FLAG_PARSE)
|
||||
_G(kernel).suppress_cache = totalMem < 8000000;
|
||||
|
||||
debugC(kDebugCore, _G(kernel).suppress_cache ?
|
||||
"Cache System Disabled" : "Cache System Enabled");
|
||||
debugC(kDebugCore, "Available memory: %d", totalMem);
|
||||
|
||||
mem_stash_init(32);
|
||||
|
||||
_system_font = gr_font_create_system_font();
|
||||
gr_font_set(_system_font);
|
||||
|
||||
sysfile_init(_kernel.hag_mode);
|
||||
|
||||
if (flags & INSTALL_PLAYER_BEEN_INIT) {
|
||||
if (!player_been_init(MAX_SCENES))
|
||||
error_show(FL, 'PBIF');
|
||||
}
|
||||
|
||||
term_message("Firing up GUI");
|
||||
fire_up_gui();
|
||||
|
||||
if (flags & INSTALL_SOUND_DRIVERS) {
|
||||
int result = _midi.open();
|
||||
if (result > 0)
|
||||
warning("MIDI Player init failed: \"%s\"", MidiDriver::getErrorName(result));
|
||||
} else {
|
||||
term_message("Sound driver installation skipped");
|
||||
}
|
||||
|
||||
if (!woodscript_init())
|
||||
error_show(FL, 'WSIF');
|
||||
|
||||
gr_pal_clear(_master_palette);
|
||||
|
||||
// Start up rail system
|
||||
if (flags & INSTALL_RAIL_SYSTEM)
|
||||
InitRails();
|
||||
|
||||
if (!f_stream_Init())
|
||||
error_show(FL, 'FSIF');
|
||||
|
||||
mouse_set_sprite(kArrowCursor);
|
||||
|
||||
if (flags & INSTALL_INVENTORY_SYSTEM)
|
||||
inv_init(128); // Initialize with 128 objects
|
||||
|
||||
if (flags & INSTALL_INVERSE_PALETTE)
|
||||
_inverse_pal = new InvPal(nullptr); // Create an empty color table.
|
||||
else
|
||||
_inverse_pal = nullptr;
|
||||
}
|
||||
|
||||
void Vars::game_systems_shutdown() {
|
||||
_system_shutting_down = true;
|
||||
#ifdef TODO
|
||||
term_message("asset list be gone!");
|
||||
db_destroy_cat();
|
||||
#endif
|
||||
rail_system_shutdown();
|
||||
|
||||
term_message("fonts be gone!");
|
||||
gr_font_dealloc(_font_tiny_prop);
|
||||
gr_font_dealloc(_font_tiny);
|
||||
gr_font_dealloc(_font_line);
|
||||
gr_font_dealloc(_font_inter);
|
||||
gr_font_dealloc(_font_conv);
|
||||
gr_font_dealloc(_font_menu);
|
||||
gr_font_dealloc(_font_misc);
|
||||
gr_font_system_shutdown();
|
||||
#ifdef TODO
|
||||
|
||||
term_message("tin streams be gone!");
|
||||
f_stream_Shutdown();
|
||||
|
||||
term_message("mouse dialog be gone!");
|
||||
DialogDestroy(_mousePosDialog, nullptr);
|
||||
|
||||
term_message("sounds stop");
|
||||
midi_stop();
|
||||
digi_stop(1);
|
||||
digi_stop(2);
|
||||
digi_stop(3);
|
||||
|
||||
if (_globals)
|
||||
mem_free(_globals);
|
||||
if (_globalCtrls)
|
||||
mem_free(_globalCtrls);
|
||||
if (_inverse_pal)
|
||||
delete (inverse_pal);
|
||||
|
||||
term_message("big buffers be gone");
|
||||
if (_gameDrawBuff)
|
||||
delete _gameDrawBuff;
|
||||
|
||||
term_message("SOS be gone");
|
||||
digi_uninstall();
|
||||
midi_uninstall();
|
||||
|
||||
f_io_report(nullptr, nullptr);
|
||||
term_message("calling registry shutdown");
|
||||
registry_shutdown_all();
|
||||
term_shutdown();
|
||||
#endif
|
||||
}
|
||||
|
||||
void Vars::fire_up_gui() {
|
||||
if (!gui_system_init())
|
||||
error_show(FL, 'GUI0');
|
||||
if (!vmng_init())
|
||||
error_show(FL, 'GUI1');
|
||||
if (!gui_mouse_init())
|
||||
error_show(FL, 'GUI2');
|
||||
if (!gui_dialog_init())
|
||||
error_show(FL, 'GUI3');
|
||||
#ifdef TODO
|
||||
if (!InitItems())
|
||||
error_show(FL, 'GUI4');
|
||||
#endif
|
||||
if (!gui_buffer_system_init())
|
||||
error_show(FL, 'GUI5');
|
||||
}
|
||||
|
||||
bool Vars::woodscript_init() {
|
||||
if (!InitWSAssets())
|
||||
return false;
|
||||
if (!ws_Initialize(_G(globals)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Vars::woodscript_shutdown() {
|
||||
ShutdownWSAssets();
|
||||
ws_Shutdown();
|
||||
}
|
||||
|
||||
void Vars::grab_fonts() {
|
||||
term_message("Grabbing fonts");
|
||||
|
||||
_font_tiny_prop = gr_font_load("4X6PP.FNT");
|
||||
_font_tiny = gr_font_load("FONTTINY.FNT");
|
||||
_font_line = gr_font_load("FONTLINE.FNT");
|
||||
_font_inter = gr_font_load("FONTINTR.FNT");
|
||||
_font_conv = gr_font_load("FONTCONV.FNT");
|
||||
_font_menu = gr_font_load("FONTMENU.FNT");
|
||||
_font_misc = gr_font_load("FONTMISC.FNT");
|
||||
}
|
||||
|
||||
void Vars::create_mouse_watch_dialog() {
|
||||
int x_offset;
|
||||
|
||||
gr_font_set(_font_tiny);
|
||||
_mousePosDialog = DialogCreateAbsolute(0, 380, 200, 480, 3 | SF_GET_MOUSE);
|
||||
_showMousePos = false;
|
||||
x_offset = 64;
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, 4, 4, "Scene:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 4, "0", 1);
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, 4, 14, "Mouse:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 14, "0", 2);
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 22, "0", 3);
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, 4, 32, "Player:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 32, "0", 4);
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 40, "0", 5);
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, 4, 50, "Scale:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, 43, 50, "0", 6);
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, 4, 60, "Depth:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 60, "0", 7);
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, 4, 70, "Camera:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 70, "0", 8);
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, 4, 80, "D:W:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, 35, 80, "0", 9);
|
||||
|
||||
Dialog_Add_Message(_mousePosDialog, x_offset, 50, "Facing:", 0);
|
||||
Dialog_Add_Message(_mousePosDialog, 115, 50, "0", 10);
|
||||
|
||||
Dialog_Configure(_mousePosDialog, 0, 0, 0);
|
||||
}
|
||||
|
||||
void Vars::initMouseSeries(const Common::String &assetName, RGB8 *myPalette) {
|
||||
int32 maxW, maxH;
|
||||
|
||||
_mouseSeriesHandle = nullptr;
|
||||
_mouseSeriesOffset = 0;
|
||||
_mouseSeriesPalOffset = 0;
|
||||
|
||||
if (_mouseSprite)
|
||||
_mouseSprite->data = nullptr;
|
||||
if (_mouseBuffer.data)
|
||||
mem_free(_mouseBuffer.data);
|
||||
|
||||
if (LoadSpriteSeries(assetName.c_str(), &_mouseSeriesHandle, &_mouseSeriesOffset, &_mouseSeriesPalOffset, myPalette) > 0) {
|
||||
_mouseSeriesResource = assetName;
|
||||
|
||||
if (ws_GetSSMaxWH(_mouseSeriesHandle, _mouseSeriesOffset, &maxW, &maxH)) {
|
||||
if (maxW && maxH) {
|
||||
_mouseBuffer.data = (byte *)mem_alloc(maxW * maxH, "mouse graphic");
|
||||
_mouseBuffer.w = maxW;
|
||||
_mouseBuffer.h = maxH;
|
||||
_mouseBuffer.stride = maxW;
|
||||
|
||||
vmng_screen_show(_mouseScreenSource);
|
||||
ResizeScreen(_mouseScreenSource, maxW, maxH);
|
||||
|
||||
_currMouseNum = -1;
|
||||
_mouseIsLocked = false;
|
||||
mouse_set_sprite(kArrowCursor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace M4
|
||||
Reference in New Issue
Block a user