[Scummvm-git-logs] scummvm master -> da8d47e72e626dd1ad217ece7a8f70af7d35af2d
criezy
noreply at scummvm.org
Thu Dec 15 21:41:37 UTC 2022
This automated email contains information about 18 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
887f156f73 AGS: Engine: OpenGL, Software drivers also try 24bit display modes for 32bit
7ac540ed28 AGS: Updated build version (3.6.0.32)
d9a52bac54 AGS: SpriteFont: compatibility fix for engine interface < 26
ed8e6fb1ce AGS: added safety check for removing sprites
75a67377d6 AGS: Script API: added File.WriteRawInt(), complementing ReadRawInt
2548567c5d AGS: Updated build version (3.6.0.33)
39c98f652c AGS: Engine: initialize SDL audio using env variables, don't SDL_AudioInit
7d88a52275 AGS: Engine: fixed restoring a legacy savegame
c8eae1fa27 AGS: SpriteFont: corrected Clifftop's VariableWidth font height values
54e99b36e9 AGS: Engine: support pre-3.5.0 Label.TextAlignment with legacy values
31d76cd039 Graphics: Add flipHorizontal to Surface
9a3ff9b285 AGS: Implement shake screen and flip screen support
3dee5bb762 AGS: Script API: add "restrictToViewport" arg to Screen.ScreenToRoomPoint()
5c8287dfec AGS: Common: fixed BufferedSectionStream not preventing read past end
9a14045e0e AGS: Common: fixed linker error at BufferedStream::BufferSize
6c18c2d5b5 AGS: Engine: support Clifftop Games custom engine's resolution mod
aa6c07f03e AGS: Plugin API: few adjustments to recently added methods
da8d47e72e AGS: Updated build version (3.6.0.34)
Commit: 887f156f7350a0160d1cdb49a6e67fa96fb818ae
https://github.com/scummvm/scummvm/commit/887f156f7350a0160d1cdb49a6e67fa96fb818ae
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Engine: OpenGL, Software drivers also try 24bit display modes for 32bit
This is mostly a cosmetic fix, as graphic mode was created successfully anyway.
But the engine was incorrectly reporting no suitable modes available.
>From upstream 4399d6448c579c648fe7e0c157a6d5f1adc74a6c
Changed paths:
engines/ags/engine/gfx/ali_3d_scummvm.cpp
engines/ags/engine/main/graphics_mode.cpp
engines/ags/engine/platform/base/sys_main.cpp
engines/ags/engine/platform/base/sys_main.h
diff --git a/engines/ags/engine/gfx/ali_3d_scummvm.cpp b/engines/ags/engine/gfx/ali_3d_scummvm.cpp
index 2ed1ec6cab3..f6445656d3f 100644
--- a/engines/ags/engine/gfx/ali_3d_scummvm.cpp
+++ b/engines/ags/engine/gfx/ali_3d_scummvm.cpp
@@ -79,9 +79,15 @@ int ScummVMRendererGraphicsDriver::GetDisplayDepthForNativeDepth(int native_colo
return native_color_depth;
}
-IGfxModeList *ScummVMRendererGraphicsDriver::GetSupportedModeList(int /*color_depth*/) {
+IGfxModeList *ScummVMRendererGraphicsDriver::GetSupportedModeList(int color_depth) {
std::vector<DisplayMode> modes;
- sys_get_desktop_modes(modes);
+ sys_get_desktop_modes(modes, color_depth);
+ if ((modes.size() == 0) && color_depth == 32) {
+ // Pretend that 24-bit are 32-bit
+ sys_get_desktop_modes(modes, 24);
+ for (auto &m : modes)
+ m.ColorDepth = 32;
+ }
return new ScummVMRendererGfxModeList(modes);
}
diff --git a/engines/ags/engine/main/graphics_mode.cpp b/engines/ags/engine/main/graphics_mode.cpp
index e9d68418e10..0cdc7d02b53 100644
--- a/engines/ags/engine/main/graphics_mode.cpp
+++ b/engines/ags/engine/main/graphics_mode.cpp
@@ -113,9 +113,6 @@ bool find_nearest_supported_mode(const IGfxModeList &modes, const Size &wanted_s
if (!modes.GetMode(i, mode)) {
continue;
}
- if (mode.ColorDepth != color_depth) {
- continue;
- }
if (wanted_ratio > 0) {
uint32_t mode_ratio = (mode.Height << kShift) / mode.Width;
if (mode_ratio != wanted_ratio) {
@@ -217,7 +214,7 @@ bool try_init_compatible_mode(const DisplayMode &dm) {
Debug::Printf("Maximal allowed window size: %d x %d", device_size.Width, device_size.Height);
DisplayMode dm_compat = dm;
- std::unique_ptr<IGfxModeList> modes(_G(gfxDriver)->GetSupportedModeList(dm.ColorDepth)); // TODO: use unique_ptr when available
+ std::unique_ptr<IGfxModeList> modes(_G(gfxDriver)->GetSupportedModeList(dm.ColorDepth));
// Windowed mode
if (dm.IsWindowed()) {
@@ -282,8 +279,7 @@ void log_out_driver_modes(const int color_depth) {
DisplayMode mode;
String mode_str;
for (int i = 0, in_str = 0; i < mode_count; ++i) {
- if (!modes->GetMode(i, mode) || mode.ColorDepth != color_depth)
- continue;
+ modes->GetMode(i, mode);
mode_str.Append(String::FromFormat("%dx%d;", mode.Width, mode.Height));
if (++in_str % 8 == 0)
mode_str.Append("\n\t");
diff --git a/engines/ags/engine/platform/base/sys_main.cpp b/engines/ags/engine/platform/base/sys_main.cpp
index 6f8e0a72247..d9fa08e2a54 100644
--- a/engines/ags/engine/platform/base/sys_main.cpp
+++ b/engines/ags/engine/platform/base/sys_main.cpp
@@ -61,7 +61,7 @@ int sys_get_desktop_resolution(int &width, int &height) {
return 0;
}
-void sys_get_desktop_modes(std::vector<AGS::Engine::DisplayMode> &dms) {
+void sys_get_desktop_modes(std::vector<AGS::Engine::DisplayMode> &dms, int color_depth) {
#ifdef TODO
SDL_DisplayMode mode;
const int display_id = DEFAULT_DISPLAY_INDEX;
@@ -72,10 +72,14 @@ void sys_get_desktop_modes(std::vector<AGS::Engine::DisplayMode> &dms) {
SDL_Log("SDL_GetDisplayMode failed: %s", SDL_GetError());
continue;
}
+ const int bitsdepth = SDL_BITSPERPIXEL(mode.format);
+ if ((color_depth == 0) || (bitsdepth != color_depth)) {
+ continue;
+ }
AGS::Engine::DisplayMode dm;
dm.Width = mode.w;
dm.Height = mode.h;
- dm.ColorDepth = SDL_BITSPERPIXEL(mode.format);
+ dm.ColorDepth = bitsdepth;
dm.RefreshRate = mode.refresh_rate;
dms.push_back(dm);
}
diff --git a/engines/ags/engine/platform/base/sys_main.h b/engines/ags/engine/platform/base/sys_main.h
index 5436adb5a51..1e771b4ace8 100644
--- a/engines/ags/engine/platform/base/sys_main.h
+++ b/engines/ags/engine/platform/base/sys_main.h
@@ -50,7 +50,7 @@ void sys_set_background_mode(bool on);
// Queries current desktop resolution.
int sys_get_desktop_resolution(int &width, int &height);
// Queries supported desktop modes.
-void sys_get_desktop_modes(std::vector<AGS::Engine::DisplayMode> &dms);
+void sys_get_desktop_modes(std::vector<AGS::Engine::DisplayMode> &dms, int color_depth = 0);
// Sets output driver for the backend's renderer
void sys_renderer_set_output(const AGS::Shared::String &name);
Commit: 7ac540ed283ef44eef9e2c1f9a2c4d27eb4fe96e
https://github.com/scummvm/scummvm/commit/7ac540ed283ef44eef9e2c1f9a2c4d27eb4fe96e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Updated build version (3.6.0.32)
>From upstream c5ca2a632371b2509d380c3887ee8d9885c37f42
Changed paths:
engines/ags/shared/core/def_version.h
diff --git a/engines/ags/shared/core/def_version.h b/engines/ags/shared/core/def_version.h
index 70eab91245d..717d59d2325 100644
--- a/engines/ags/shared/core/def_version.h
+++ b/engines/ags/shared/core/def_version.h
@@ -22,9 +22,9 @@
#ifndef AGS_SHARED_CORE_DEFVERSION_H
#define AGS_SHARED_CORE_DEFVERSION_H
-#define ACI_VERSION_STR "3.6.0.31"
+#define ACI_VERSION_STR "3.6.0.32"
#if defined (RC_INVOKED) // for MSVC resource compiler
-#define ACI_VERSION_MSRC_DEF 3.6.0.31
+#define ACI_VERSION_MSRC_DEF 3.6.0.32
#endif
#define SPECIAL_VERSION ""
Commit: d9a52bac546ca08e33f9a0d3b3a6f753c4f333b9
https://github.com/scummvm/scummvm/commit/d9a52bac546ca08e33f9a0d3b3a6f753c4f333b9
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: SpriteFont: compatibility fix for engine interface < 26
>From upstream 29741334fc18c9cf5f55e5032087f72031a25954
Changed paths:
engines/ags/plugins/ags_sprite_font/ags_sprite_font.cpp
diff --git a/engines/ags/plugins/ags_sprite_font/ags_sprite_font.cpp b/engines/ags/plugins/ags_sprite_font/ags_sprite_font.cpp
index 00d611eb151..30a99bb62d0 100644
--- a/engines/ags/plugins/ags_sprite_font/ags_sprite_font.cpp
+++ b/engines/ags/plugins/ags_sprite_font/ags_sprite_font.cpp
@@ -108,14 +108,20 @@ void AGSSpriteFont::SetSpriteFont(ScriptMethodParams ¶ms) {
PARAMS9(int, fontNum, int, sprite, int, rows, int, columns, int, charWidth, int, charHeight, int, charMin, int, charMax, bool, use32bit);
_engine->PrintDebugConsole("AGSSpriteFont: SetSpriteFont");
_fontRenderer->SetSpriteFont(fontNum, sprite, rows, columns, charWidth, charHeight, charMin, charMax, use32bit);
- _engine->ReplaceFontRenderer2(fontNum, _fontRenderer);
+ if (_engine->version >= 26)
+ _engine->ReplaceFontRenderer2(fontNum, _fontRenderer);
+ else
+ _engine->ReplaceFontRenderer(fontNum, _fontRenderer);
}
void AGSSpriteFont::SetVariableSpriteFont(ScriptMethodParams ¶ms) {
PARAMS2(int, fontNum, int, sprite);
_engine->PrintDebugConsole("AGSSpriteFont: SetVariableFont");
_vWidthRenderer->SetSprite(fontNum, sprite);
- _engine->ReplaceFontRenderer2(fontNum, _vWidthRenderer);
+ if (_engine->version >= 26)
+ _engine->ReplaceFontRenderer2(fontNum, _vWidthRenderer);
+ else
+ _engine->ReplaceFontRenderer(fontNum, _vWidthRenderer);
}
void AGSSpriteFont::SetGlyph(ScriptMethodParams ¶ms) {
Commit: ed8e6fb1ce61d8c58b9bd032b33846fecaf2bc2e
https://github.com/scummvm/scummvm/commit/ed8e6fb1ce61d8c58b9bd032b33846fecaf2bc2e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: added safety check for removing sprites
Part of upstream a9e0e47ecfeec205a49ceaf8dd681944eede5eca
Changed paths:
engines/ags/shared/ac/sprite_cache.cpp
diff --git a/engines/ags/shared/ac/sprite_cache.cpp b/engines/ags/shared/ac/sprite_cache.cpp
index a454d00ec81..05b20bc6d5f 100644
--- a/engines/ags/shared/ac/sprite_cache.cpp
+++ b/engines/ags/shared/ac/sprite_cache.cpp
@@ -144,6 +144,9 @@ void SpriteCache::SubstituteBitmap(sprkey_t index, Bitmap *sprite) {
}
void SpriteCache::RemoveSprite(sprkey_t index, bool freeMemory) {
+ if (index < 0 || (size_t)index >= _spriteData.size())
+ return;
+
if (freeMemory)
delete _spriteData[index].Image;
InitNullSpriteParams(index);
Commit: 75a67377d6130b0d739730b5ad8debc137248d06
https://github.com/scummvm/scummvm/commit/75a67377d6130b0d739730b5ad8debc137248d06
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Script API: added File.WriteRawInt(), complementing ReadRawInt
>From upstream cf23239bcce2e50377866090a11f1489602fdd65
Changed paths:
engines/ags/engine/ac/file.cpp
engines/ags/engine/ac/file.h
diff --git a/engines/ags/engine/ac/file.cpp b/engines/ags/engine/ac/file.cpp
index 306386f9028..b04d491ba9f 100644
--- a/engines/ags/engine/ac/file.cpp
+++ b/engines/ags/engine/ac/file.cpp
@@ -110,6 +110,11 @@ void File_WriteRawChar(sc_File *fil, int towrite) {
FileWriteRawChar(fil->handle, towrite);
}
+void File_WriteRawInt(sc_File *fil, int towrite) {
+ Stream *out = get_valid_file_stream_from_handle(fil->handle, "FileWriteRawInt");
+ out->WriteInt32(towrite);
+}
+
void File_WriteRawLine(sc_File *fil, const char *towrite) {
FileWriteRawLine(fil->handle, towrite);
}
@@ -650,6 +655,10 @@ RuntimeScriptValue Sc_File_WriteRawChar(void *self, const RuntimeScriptValue *pa
API_OBJCALL_VOID_PINT(sc_File, File_WriteRawChar);
}
+RuntimeScriptValue Sc_File_WriteRawInt(void *self, const RuntimeScriptValue *params, int32_t param_count) {
+ API_OBJCALL_VOID_PINT(sc_File, File_WriteRawInt);
+}
+
// void (sc_File *fil, const char *towrite)
RuntimeScriptValue Sc_File_WriteRawLine(void *self, const RuntimeScriptValue *params, int32_t param_count) {
API_OBJCALL_VOID_POBJ(sc_File, File_WriteRawLine, const char);
@@ -693,6 +702,7 @@ void RegisterFileAPI() {
ccAddExternalObjectFunction("File::ReadStringBack^0", Sc_File_ReadStringBack);
ccAddExternalObjectFunction("File::WriteInt^1", Sc_File_WriteInt);
ccAddExternalObjectFunction("File::WriteRawChar^1", Sc_File_WriteRawChar);
+ ccAddExternalObjectFunction("File::WriteRawInt^1", Sc_File_WriteRawInt);
ccAddExternalObjectFunction("File::WriteRawLine^1", Sc_File_WriteRawLine);
ccAddExternalObjectFunction("File::WriteString^1", Sc_File_WriteString);
ccAddExternalObjectFunction("File::Seek^2", Sc_File_Seek);
diff --git a/engines/ags/engine/ac/file.h b/engines/ags/engine/ac/file.h
index b8d5cf80ea5..2025308694e 100644
--- a/engines/ags/engine/ac/file.h
+++ b/engines/ags/engine/ac/file.h
@@ -42,6 +42,7 @@ void File_Close(sc_File *fil);
void File_WriteString(sc_File *fil, const char *towrite);
void File_WriteInt(sc_File *fil, int towrite);
void File_WriteRawChar(sc_File *fil, int towrite);
+void File_WriteRawInt(sc_File *fil, int towrite);
void File_WriteRawLine(sc_File *fil, const char *towrite);
void File_ReadRawLine(sc_File *fil, char *buffer);
const char *File_ReadRawLineBack(sc_File *fil);
Commit: 2548567c5d489006cdda5f62e4bf970ac7c5a648
https://github.com/scummvm/scummvm/commit/2548567c5d489006cdda5f62e4bf970ac7c5a648
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Updated build version (3.6.0.33)
>From upstream 57423a7e7e790c43c71d408fd3a28ccfc2e6a3e2
Changed paths:
engines/ags/shared/core/def_version.h
diff --git a/engines/ags/shared/core/def_version.h b/engines/ags/shared/core/def_version.h
index 717d59d2325..97b1e816acf 100644
--- a/engines/ags/shared/core/def_version.h
+++ b/engines/ags/shared/core/def_version.h
@@ -22,9 +22,9 @@
#ifndef AGS_SHARED_CORE_DEFVERSION_H
#define AGS_SHARED_CORE_DEFVERSION_H
-#define ACI_VERSION_STR "3.6.0.32"
+#define ACI_VERSION_STR "3.6.0.33"
#if defined (RC_INVOKED) // for MSVC resource compiler
-#define ACI_VERSION_MSRC_DEF 3.6.0.32
+#define ACI_VERSION_MSRC_DEF 3.6.0.33
#endif
#define SPECIAL_VERSION ""
Commit: 39c98f652cff25f22b57009fcd365b0be6a0559b
https://github.com/scummvm/scummvm/commit/39c98f652cff25f22b57009fcd365b0be6a0559b
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Engine: initialize SDL audio using env variables, don't SDL_AudioInit
The code is present but not used in ScummVM. Keeping it synchronized
with upstream might help in the future.
>From upstream fcf4b76914a25daaf5a7b711b7ed287e5eaae9f6
Changed paths:
engines/ags/engine/platform/base/sys_main.cpp
diff --git a/engines/ags/engine/platform/base/sys_main.cpp b/engines/ags/engine/platform/base/sys_main.cpp
index d9fa08e2a54..d81ca47e957 100644
--- a/engines/ags/engine/platform/base/sys_main.cpp
+++ b/engines/ags/engine/platform/base/sys_main.cpp
@@ -100,20 +100,30 @@ bool sys_audio_init(const AGS::Shared::String &driver_name) {
#ifdef AGS_PLATFORM_SCUMMVM
return true;
#else
+ // IMPORTANT: we must use a combination of SDL_setenv and SDL_InitSubSystem
+ // here, and NOT use SDL_AudioInit, because SDL_AudioInit does not increment
+ // subsystem's reference count. Which in turn may cause problems down the
+ // way when initializing any additional SDL-based audio lib or plugin;
+ // at the very least - the mojoAl (OpenAL's implementation we're using).
bool res = false;
- if (!driver_name.IsEmpty()) {
- res = SDL_AudioInit(driver_name.GetCStr()) == 0;
- if (!res)
- Debug::Printf(kDbgMsg_Error, "Failed to initialize audio driver %s; error: %s",
- driver_name.GetCStr(), SDL_GetError());
- }
- if (!res) {
+ // If user config contained a driver request, then apply one for a try
+ if (!driver_name.IsEmpty())
+ SDL_setenv("SDL_AUDIODRIVER", driver_name.GetCStr(), 1);
+ const char *env_drv = SDL_getenv("SDL_AUDIODRIVER");
+ Debug::Printf("Requested audio driver: %s", env_drv ? env_drv : "default");
+ res = SDL_InitSubSystem(SDL_INIT_AUDIO) == 0;
+ // If there have been an explicit request that failed, then try to force
+ // SDL to go through a list of supported drivers and see if that succeeds.
+ if (!res && env_drv) {
+ Debug::Printf(kDbgMsg_Error, "Failed to initialize requested audio driver '%s'; error: %s", env_drv, SDL_GetError());
+ Debug::Printf("Attempt to initialize any audio driver from the known list");
+ SDL_setenv("SDL_AUDIODRIVER", "", 1);
res = SDL_InitSubSystem(SDL_INIT_AUDIO) == 0;
- if (!res)
- Debug::Printf(kDbgMsg_Error, "Failed to initialize audio backend: %s", SDL_GetError());
}
if (res)
Debug::Printf(kDbgMsg_Info, "Audio driver: %s", SDL_GetCurrentAudioDriver());
+ else
+ Debug::Printf(kDbgMsg_Error, "Failed to initialize any audio driver; error: %s", SDL_GetError());
return res;
#endif
}
Commit: 7d88a52275ddc9fd0b012174a38137fb9cc8960f
https://github.com/scummvm/scummvm/commit/7d88a52275ddc9fd0b012174a38137fb9cc8960f
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Engine: fixed restoring a legacy savegame
>From upstream 9776df3c8403f252e981f5518c48eace2e83d373
Changed paths:
engines/ags/engine/ac/room_status.cpp
engines/ags/engine/game/savegame_v321.cpp
engines/ags/engine/script/script.h
engines/ags/shared/game/room_struct.h
engines/ags/shared/util/aligned_stream.cpp
diff --git a/engines/ags/engine/ac/room_status.cpp b/engines/ags/engine/ac/room_status.cpp
index 7ba488389b3..ef42d360920 100644
--- a/engines/ags/engine/ac/room_status.cpp
+++ b/engines/ags/engine/ac/room_status.cpp
@@ -82,12 +82,13 @@ void RoomStatus::ReadFromFile_v321(Stream *in) {
beenhere = in->ReadInt32();
numobj = in->ReadInt32();
- obj.resize(numobj);
- objProps.resize(numobj);
- intrObject.resize(numobj);
+ obj.resize(MAX_ROOM_OBJECTS_v300);
+ objProps.resize(MAX_ROOM_OBJECTS_v300);
+ intrObject.resize(MAX_ROOM_OBJECTS_v300);
ReadRoomObjects_Aligned(in);
- in->Seek(MAX_LEGACY_ROOM_FLAGS * sizeof(int16_t)); // flagstates (OBSOLETE)
+ int16_t dummy[MAX_LEGACY_ROOM_FLAGS]; // cannot seek with AlignedStream
+ in->ReadArrayOfInt16(dummy, MAX_LEGACY_ROOM_FLAGS); // flagstates (OBSOLETE)
tsdatasize = in->ReadInt32();
in->ReadInt32(); // tsdata
for (int i = 0; i < MAX_ROOM_HOTSPOTS; ++i) {
diff --git a/engines/ags/engine/game/savegame_v321.cpp b/engines/ags/engine/game/savegame_v321.cpp
index 5db0f0c1d51..b8b11e6dfd0 100644
--- a/engines/ags/engine/game/savegame_v321.cpp
+++ b/engines/ags/engine/game/savegame_v321.cpp
@@ -173,7 +173,7 @@ static void restore_game_play(Stream *in, RestoredData &r_data) {
static void ReadMoveList_Aligned(Stream *in) {
AlignedStream align_s(in, Shared::kAligned_Read);
- for (int i = 0; i < _GP(game).numcharacters + MAX_ROOM_OBJECTS + 1; ++i) {
+ for (int i = 0; i < _GP(game).numcharacters + MAX_ROOM_OBJECTS_v300 + 1; ++i) {
_GP(mls)[i].ReadFromFile_Legacy(&align_s);
align_s.Reset();
}
@@ -395,8 +395,6 @@ static HSaveError restore_game_audioclips_and_crossfade(Stream *in, RestoredData
}
HSaveError restore_save_data_v321(Stream *in, const PreservedParams &pp, RestoredData &r_data) {
- int vv;
-
HSaveError err = restore_game_head_dynamic_values(in, r_data);
if (!err)
return err;
@@ -418,7 +416,8 @@ HSaveError restore_save_data_v321(Stream *in, const PreservedParams &pp, Restore
WordsDictionary *olddict = _GP(game).dict;
char *mesbk[MAXGLOBALMES];
int numchwas = _GP(game).numcharacters;
- for (vv = 0; vv < MAXGLOBALMES; vv++) mesbk[vv] = _GP(game).messages[vv];
+ for (size_t i = 0; i < MAXGLOBALMES; ++i)
+ mesbk[i] = _GP(game).messages[i];
int numdiwas = _GP(game).numdialog;
int numinvwas = _GP(game).numinvitems;
int numviewswas = _GP(game).numviews;
diff --git a/engines/ags/engine/script/script.h b/engines/ags/engine/script/script.h
index 622741aa4d7..1ed9b504865 100644
--- a/engines/ags/engine/script/script.h
+++ b/engines/ags/engine/script/script.h
@@ -24,7 +24,6 @@
#include "ags/lib/std/vector.h"
-#include "ags/shared/game/room_struct.h" // MAX_ROOM_OBJECTS
#include "ags/engine/script/cc_instance.h"
#include "ags/engine/script/executing_script.h"
#include "ags/engine/script/non_blocking_script_function.h"
diff --git a/engines/ags/shared/game/room_struct.h b/engines/ags/shared/game/room_struct.h
index 7852e895cea..5d70390aa10 100644
--- a/engines/ags/shared/game/room_struct.h
+++ b/engines/ags/shared/game/room_struct.h
@@ -102,6 +102,7 @@ enum RoomFlags {
#define MAX_ROOM_BGFRAMES 5 // max number of frames in animating bg scene
#define MAX_ROOM_HOTSPOTS 50 // v2.62: 20 -> 30; v2.8: -> 50
+#define MAX_ROOM_OBJECTS_v300 40 // for some legacy logic support
#define MAX_ROOM_OBJECTS 256 // v3.6.0: 40 -> 256 (now limited by room format)
#define MAX_ROOM_REGIONS 16
// TODO: this is remains of the older code, MAX_WALK_AREAS = real number - 1, where
diff --git a/engines/ags/shared/util/aligned_stream.cpp b/engines/ags/shared/util/aligned_stream.cpp
index 873aba9d149..e366b7d8d8b 100644
--- a/engines/ags/shared/util/aligned_stream.cpp
+++ b/engines/ags/shared/util/aligned_stream.cpp
@@ -189,6 +189,7 @@ size_t AlignedStream::WriteArrayOfInt64(const int64_t *buffer, size_t count) {
bool AlignedStream::Seek(soff_t /*offset*/, StreamSeek /*origin*/) {
// TODO: split out Seekable Stream interface
+ warning("AlignedStream::Seek not supported");
return false;
}
Commit: c8eae1fa27320a470c5bf44814fccaf635587633
https://github.com/scummvm/scummvm/commit/c8eae1fa27320a470c5bf44814fccaf635587633
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: SpriteFont: corrected Clifftop's VariableWidth font height values
Got their meaning wrong on the first time.
>From upstream d94f20742284ea75abbde86905159c490a7b4d46
Changed paths:
engines/ags/plugins/ags_sprite_font/variable_width_font.h
engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.cpp
engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.h
diff --git a/engines/ags/plugins/ags_sprite_font/variable_width_font.h b/engines/ags/plugins/ags_sprite_font/variable_width_font.h
index d520de65b17..60b4eb4c0c1 100644
--- a/engines/ags/plugins/ags_sprite_font/variable_width_font.h
+++ b/engines/ags/plugins/ags_sprite_font/variable_width_font.h
@@ -35,10 +35,11 @@ public:
int SpriteNumber = 0;
int FontReplaced = 0;
int Spacing = 0;
+ std::map<char, CharacterEntry> characters;
+ // Clifftop Games custom plugin support
int LineHeightAdjust = 0;
int LineSpacingAdjust = 0;
int LineSpacingOverride = 0;
- std::map<char, CharacterEntry> characters;
public:
void SetGlyph(int character, int x, int y, int width, int height);
diff --git a/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.cpp b/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.cpp
index d3cb2d775b8..986981e7159 100644
--- a/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.cpp
+++ b/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.cpp
@@ -73,28 +73,36 @@ int VariableWidthSpriteFontRenderer::GetTextHeight(const char *text, int fontNum
int VariableWidthSpriteFontRenderer::GetFontHeight(int fontNumber) {
VariableWidthFont *font = getFontFor(fontNumber);
if (font->characters.size() > 0) {
- return font->characters.begin()->_value.Height + font->LineHeightAdjust;
+ return font->characters.begin()->_value.Height + font->LineSpacingAdjust;
}
return 0;
}
int VariableWidthSpriteFontRenderer::GetLineSpacing(int fontNumber) {
- VariableWidthFont *font = getFontFor(fontNumber);
- return font->LineSpacingOverride;
+ // CHECKME: it's not clear whether LineSpacingOverride was ever meant as an
+ // actual, normal line spacing. In Clifftop's custom engine this value has
+ // been used specifically to tell the spacing for *empty lines* when
+ // printing a wrapped text on a GUI Label. Official engine does not have
+ // such functionality.
+ return 0; // use default (font height)
}
void VariableWidthSpriteFontRenderer::SetSpacing(int fontNum, int spacing) {
VariableWidthFont *font = getFontFor(fontNum);
font->Spacing = spacing;
-
-
}
-void VariableWidthSpriteFontRenderer::SetLineHeightAdjust(int fontNum, int LineHeight, int SpacingHeight, int SpacingOverride) {
+void VariableWidthSpriteFontRenderer::SetLineHeightAdjust(int fontNum, int lineHeight, int spacingHeight, int spacingOverride) {
VariableWidthFont *font = getFontFor(fontNum);
- font->LineHeightAdjust = LineHeight;
- font->LineSpacingAdjust = SpacingHeight;
- font->LineSpacingOverride = SpacingOverride;
+ font->LineHeightAdjust = lineHeight;
+ font->LineSpacingAdjust = spacingHeight;
+ font->LineSpacingOverride = spacingOverride;
+
+ char buf[1024];
+ snprintf(buf, sizeof(buf),
+ "VariableWidth::SetLineHeightAdjust: font %d, lineHeight %d, spacingHeight %d, spacingOverride %d",
+ fontNum, lineHeight, spacingHeight, spacingOverride);
+ _engine->PrintDebugConsole(buf);
if (_engine->version >= 26)
_engine->NotifyFontUpdated(fontNum);
diff --git a/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.h b/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.h
index 7c34d511dc6..d047299c6e4 100644
--- a/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.h
+++ b/engines/ags/plugins/ags_sprite_font/variable_width_sprite_font.h
@@ -44,6 +44,7 @@ public:
void SetGlyph(int fontNum, int charNum, int x, int y, int width, int height);
void SetSprite(int fontNum, int spriteNum);
void SetSpacing(int fontNum, int spacing);
+ // Clifftop Games custom plugin support
void SetLineHeightAdjust(int fontNum, int LineHeight, int SpacingHeight, int SpacingOverride);
// IAGSFontRenderer implementation
Commit: 54e99b36e92aaf6761e37bd3c08702b0a7943dad
https://github.com/scummvm/scummvm/commit/54e99b36e92aaf6761e37bd3c08702b0a7943dad
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Engine: support pre-3.5.0 Label.TextAlignment with legacy values
Some custom engines supported Label.TextAlignment before 3.5.0 got this
added officially, except they used old alignment constants.
>From upstream 46fc9bac4fa6082561a1937861b3e567ccea2cd4
Changed paths:
engines/ags/engine/ac/label.cpp
engines/ags/shared/gui/gui_object.cpp
engines/ags/shared/gui/gui_object.h
diff --git a/engines/ags/engine/ac/label.cpp b/engines/ags/engine/ac/label.cpp
index 81348ea41a7..ceb59287bc2 100644
--- a/engines/ags/engine/ac/label.cpp
+++ b/engines/ags/engine/ac/label.cpp
@@ -32,6 +32,8 @@
namespace AGS3 {
+using namespace AGS::Shared;
+
// ** LABEL FUNCTIONS
const char *Label_GetText_New(GUILabel *labl) {
@@ -51,12 +53,20 @@ void Label_SetText(GUILabel *labl, const char *newtx) {
}
int Label_GetTextAlignment(GUILabel *labl) {
- return labl->TextAlignment;
+ return (_G(loaded_game_file_version) >= kGameVersion_350) ?
+ labl->TextAlignment :
+ GetLegacyGUIAlignment(labl->TextAlignment);
}
void Label_SetTextAlignment(GUILabel *labl, int align) {
- if (labl->TextAlignment != align) {
- labl->TextAlignment = (HorAlignment)align;
+ // NOTE: some custom engines supported Label.TextAlignment
+ // before 3.5.0 got this added officially
+ HorAlignment use_align =
+ (_G(loaded_game_file_version) >= kGameVersion_350) ?
+ (HorAlignment)align :
+ ConvertLegacyGUIAlignment((LegacyGUIAlignment)align);
+ if (labl->TextAlignment != use_align) {
+ labl->TextAlignment = use_align;
labl->MarkChanged();
}
}
diff --git a/engines/ags/shared/gui/gui_object.cpp b/engines/ags/shared/gui/gui_object.cpp
index aaa1e49fc0a..4cdba043f07 100644
--- a/engines/ags/shared/gui/gui_object.cpp
+++ b/engines/ags/shared/gui/gui_object.cpp
@@ -212,14 +212,24 @@ void GUIObject::WriteToSavegame(Stream *out) const {
HorAlignment ConvertLegacyGUIAlignment(LegacyGUIAlignment align) {
switch (align) {
- case kLegacyGUIAlign_Left:
- return kHAlignLeft;
case kLegacyGUIAlign_Right:
return kHAlignRight;
case kLegacyGUIAlign_Center:
return kHAlignCenter;
+ default:
+ return kHAlignLeft;
+ }
+}
+
+LegacyGUIAlignment GetLegacyGUIAlignment(HorAlignment align) {
+ switch (align) {
+ case kHAlignRight:
+ return kLegacyGUIAlign_Right;
+ case kHAlignCenter:
+ return kLegacyGUIAlign_Center;
+ default:
+ return kLegacyGUIAlign_Left;
}
- return kHAlignNone;
}
} // namespace Shared
diff --git a/engines/ags/shared/gui/gui_object.h b/engines/ags/shared/gui/gui_object.h
index 9140538ee36..0996dd9e9b1 100644
--- a/engines/ags/shared/gui/gui_object.h
+++ b/engines/ags/shared/gui/gui_object.h
@@ -147,6 +147,7 @@ protected:
// Converts legacy alignment type used in GUI Label/ListBox data (only left/right/center)
HorAlignment ConvertLegacyGUIAlignment(LegacyGUIAlignment align);
+LegacyGUIAlignment GetLegacyGUIAlignment(HorAlignment align);
} // namespace Shared
} // namespace AGS
Commit: 31d76cd0392e641a1fe893303a36cb33358879c7
https://github.com/scummvm/scummvm/commit/31d76cd0392e641a1fe893303a36cb33358879c7
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
Graphics: Add flipHorizontal to Surface
This complements flipVertical and is needed for the AGS engine.
Changed paths:
graphics/surface.cpp
graphics/surface.h
diff --git a/graphics/surface.cpp b/graphics/surface.cpp
index 2e86094ed3a..e78cd59f6f9 100644
--- a/graphics/surface.cpp
+++ b/graphics/surface.cpp
@@ -419,6 +419,19 @@ void Surface::flipVertical(const Common::Rect &r) {
delete[] temp;
}
+void Surface::flipHorizontal(const Common::Rect &r) {
+ uint32 tmp = 0;
+ const int width = r.width() * format.bytesPerPixel;
+ for (int y = r.top; y < r.bottom; ++y) {
+ byte *row = (byte *)getBasePtr(r.left, y);
+ for (int x = 0; x < width / 2; x += format.bytesPerPixel) {
+ memcpy(&tmp, row + x, format.bytesPerPixel);
+ memcpy(row + x, row + width - format.bytesPerPixel - x, format.bytesPerPixel);
+ memcpy(row + width - format.bytesPerPixel - x, &tmp, format.bytesPerPixel);
+ }
+ }
+}
+
Graphics::Surface *Surface::scale(int16 newWidth, int16 newHeight, bool filtering) const {
Graphics::Surface *target = new Graphics::Surface();
diff --git a/graphics/surface.h b/graphics/surface.h
index d4d4661209a..1d35474bbc0 100644
--- a/graphics/surface.h
+++ b/graphics/surface.h
@@ -446,6 +446,13 @@ public:
*/
void flipVertical(const Common::Rect &r);
+ /**
+ * Flip the specified rect horizontally.
+ *
+ * @param r The rectangle to flip.
+ */
+ void flipHorizontal(const Common::Rect &r);
+
/**
* Scale the data to the given size.
*
Commit: 9a3ff9b28562f0e527bf81bb14b143c69071ab62
https://github.com/scummvm/scummvm/commit/9a3ff9b28562f0e527bf81bb14b143c69071ab62
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Implement shake screen and flip screen support
This is partially based on upstream 675560f7c2060528ba7c75d5ecca78c56b9f0d8e
Changed paths:
engines/ags/engine/gfx/ali_3d_scummvm.cpp
engines/ags/engine/gfx/ali_3d_scummvm.h
diff --git a/engines/ags/engine/gfx/ali_3d_scummvm.cpp b/engines/ags/engine/gfx/ali_3d_scummvm.cpp
index f6445656d3f..75aa9611c0b 100644
--- a/engines/ags/engine/gfx/ali_3d_scummvm.cpp
+++ b/engines/ags/engine/gfx/ali_3d_scummvm.cpp
@@ -434,8 +434,30 @@ void ScummVMRendererGraphicsDriver::copySurface(const Graphics::Surface &src, bo
_screen->addDirtyRect(Common::Rect(x1, y1, x2 + 1, y2 + 1));
}
-void ScummVMRendererGraphicsDriver::BlitToScreen() {
- const Graphics::Surface &src =
+void ScummVMRendererGraphicsDriver::Present(int xoff, int yoff, Shared::GraphicFlip flip) {
+ Graphics::Surface *srcTransformed = nullptr;
+ if (xoff != 0 || yoff != 0 || flip != Shared::kFlip_None) {
+ srcTransformed = new Graphics::Surface();
+ srcTransformed->copyFrom(virtualScreen->GetAllegroBitmap()->getSurface());
+ switch(flip) {
+ case kFlip_Horizontal:
+ srcTransformed->flipHorizontal(Common::Rect(srcTransformed->w, srcTransformed->h));
+ break;
+ case kFlip_Vertical:
+ srcTransformed->flipVertical(Common::Rect(srcTransformed->w, srcTransformed->h));
+ break;
+ case kFlip_Both:
+ srcTransformed->flipHorizontal(Common::Rect(srcTransformed->w, srcTransformed->h));
+ srcTransformed->flipVertical(Common::Rect(srcTransformed->w, srcTransformed->h));
+ break;
+ default:
+ break;
+ }
+ srcTransformed->move(xoff, yoff, srcTransformed->h);
+ }
+
+ const Graphics::Surface &src = srcTransformed ?
+ *srcTransformed :
virtualScreen->GetAllegroBitmap()->getSurface();
enum {
@@ -491,34 +513,28 @@ void ScummVMRendererGraphicsDriver::BlitToScreen() {
g_system->copyRectToScreen(src.getPixels(), src.pitch,
0, 0, src.w, src.h);
g_system->updateScreen();
+ if (srcTransformed) {
+ srcTransformed->free();
+ delete srcTransformed;
+ }
return;
default:
break;
}
+ if (srcTransformed) {
+ srcTransformed->free();
+ delete srcTransformed;
+ }
+
if (_screen)
_screen->update();
}
-void ScummVMRendererGraphicsDriver::Render(int /*xoff*/, int /*yoff*/, GraphicFlip flip) {
- switch (flip) {
- case kFlip_Both:
- _renderFlip = (RendererFlip)(FLIP_HORIZONTAL | FLIP_VERTICAL);
- break;
- case kFlip_Horizontal:
- _renderFlip = FLIP_HORIZONTAL;
- break;
- case kFlip_Vertical:
- _renderFlip = FLIP_VERTICAL;
- break;
- default:
- _renderFlip = FLIP_NONE;
- break;
- }
-
+void ScummVMRendererGraphicsDriver::Render(int xoff, int yoff, GraphicFlip flip) {
RenderToBackBuffer();
- Present();
+ Present(xoff, yoff, flip);
}
void ScummVMRendererGraphicsDriver::Render() {
@@ -575,7 +591,7 @@ bool ScummVMRendererGraphicsDriver::GetCopyOfScreenIntoBitmap(Bitmap *destinatio
Author: Matthew Leverton
**/
void ScummVMRendererGraphicsDriver::highcolor_fade_in(Bitmap *vs, void(*draw_callback)(),
- int /*offx*/, int /*offy*/, int speed, int targetColourRed, int targetColourGreen, int targetColourBlue) {
+ int speed, int targetColourRed, int targetColourGreen, int targetColourBlue) {
Bitmap *bmp_orig = vs;
const int col_depth = bmp_orig->GetColorDepth();
const int clearColor = makecol_depth(col_depth, targetColourRed, targetColourGreen, targetColourBlue);
@@ -609,7 +625,7 @@ void ScummVMRendererGraphicsDriver::highcolor_fade_in(Bitmap *vs, void(*draw_cal
}
void ScummVMRendererGraphicsDriver::highcolor_fade_out(Bitmap *vs, void(*draw_callback)(),
- int /*offx*/, int /*offy*/, int speed, int targetColourRed, int targetColourGreen, int targetColourBlue) {
+ int speed, int targetColourRed, int targetColourGreen, int targetColourBlue) {
Bitmap *bmp_orig = vs;
const int col_depth = vs->GetColorDepth();
const int clearColor = makecol_depth(col_depth, targetColourRed, targetColourGreen, targetColourBlue);
@@ -688,7 +704,7 @@ void ScummVMRendererGraphicsDriver::__fade_out_range(int speed, int from, int to
void ScummVMRendererGraphicsDriver::FadeOut(int speed, int targetColourRed, int targetColourGreen, int targetColourBlue) {
if (_srcColorDepth > 8) {
- highcolor_fade_out(virtualScreen, _drawPostScreenCallback, 0, 0, speed * 4, targetColourRed, targetColourGreen, targetColourBlue);
+ highcolor_fade_out(virtualScreen, _drawPostScreenCallback, speed * 4, targetColourRed, targetColourGreen, targetColourBlue);
} else {
__fade_out_range(speed, 0, 255, targetColourRed, targetColourGreen, targetColourBlue);
}
@@ -700,7 +716,7 @@ void ScummVMRendererGraphicsDriver::FadeIn(int speed, PALETTE p, int targetColou
RenderToBackBuffer();
}
if (_srcColorDepth > 8) {
- highcolor_fade_in(virtualScreen, _drawPostScreenCallback, 0, 0, speed * 4, targetColourRed, targetColourGreen, targetColourBlue);
+ highcolor_fade_in(virtualScreen, _drawPostScreenCallback, speed * 4, targetColourRed, targetColourGreen, targetColourBlue);
} else {
initialize_fade_256(targetColourRed, targetColourGreen, targetColourBlue);
__fade_from_range(faded_out_palette, p, speed, 0, 255);
diff --git a/engines/ags/engine/gfx/ali_3d_scummvm.h b/engines/ags/engine/gfx/ali_3d_scummvm.h
index f8f43f2b090..768a91fcfe2 100644
--- a/engines/ags/engine/gfx/ali_3d_scummvm.h
+++ b/engines/ags/engine/gfx/ali_3d_scummvm.h
@@ -240,7 +240,6 @@ private:
uint16 _defaultGammaBlue[256] {};
#endif
- RendererFlip _renderFlip = FLIP_NONE;
/* SDL_Renderer *_renderer = nullptr;
SDL_Texture *_screenTex = nullptr; */
// BITMAP struct for wrapping screen texture locked pixels, so that we may use blit()
@@ -276,15 +275,14 @@ private:
// Renders single sprite batch on the precreated surface
size_t RenderSpriteBatch(const ALSpriteBatch &batch, size_t from, Shared::Bitmap *surface, int surf_offx, int surf_offy);
- void highcolor_fade_in(Bitmap *vs, void(*draw_callback)(), int offx, int offy, int speed, int targetColourRed, int targetColourGreen, int targetColourBlue);
- void highcolor_fade_out(Bitmap *vs, void(*draw_callback)(), int offx, int offy, int speed, int targetColourRed, int targetColourGreen, int targetColourBlue);
+ void highcolor_fade_in(Bitmap *vs, void(*draw_callback)(), int speed, int targetColourRed, int targetColourGreen, int targetColourBlue);
+ void highcolor_fade_out(Bitmap *vs, void(*draw_callback)(), int speed, int targetColourRed, int targetColourGreen, int targetColourBlue);
void __fade_from_range(PALETTE source, PALETTE dest, int speed, int from, int to);
void __fade_out_range(int speed, int from, int to, int targetColourRed, int targetColourGreen, int targetColourBlue);
// Copy raw screen bitmap pixels to the screen
- void BlitToScreen();
void copySurface(const Graphics::Surface &src, bool mode);
// Render bitmap on screen
- void Present() { BlitToScreen(); }
+ void Present(int xoff = 0, int yoff = 0, Shared::GraphicFlip flip = Shared::kFlip_None);
};
Commit: 3dee5bb7628793533e67a5b212e7170b318ab1f8
https://github.com/scummvm/scummvm/commit/3dee5bb7628793533e67a5b212e7170b318ab1f8
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Script API: add "restrictToViewport" arg to Screen.ScreenToRoomPoint()
This argument works similarily to Viewport.ScreenToRoomPoint():
if it's set to true then the function returns null if there's no
viewport under the cursor; if it's set to false it converts
coordinates through the primary viewport in such case.
>From upstream 5014c502aa487d3cbdf01e99d57306f2131d4c54
Changed paths:
engines/ags/engine/ac/game_state.cpp
engines/ags/engine/ac/game_state.h
engines/ags/engine/ac/screen.cpp
diff --git a/engines/ags/engine/ac/game_state.cpp b/engines/ags/engine/ac/game_state.cpp
index cffeed10286..9378037f874 100644
--- a/engines/ags/engine/ac/game_state.cpp
+++ b/engines/ags/engine/ac/game_state.cpp
@@ -204,17 +204,20 @@ VpPoint GameState::ScreenToRoomImpl(int scrx, int scry, int view_index, bool cli
PViewport view;
if (view_index < 0) {
view = GetRoomViewportAt(scrx, scry);
- if (!view)
- return std::make_pair(Point(), -1);
+ if (!view) {
+ if (clip_viewport)
+ return std::make_pair(Point(), -1);
+ view = _roomViewports[0]; // use primary viewport
+ }
} else {
view = _roomViewports[view_index];
}
return view->ScreenToRoom(scrx, scry, clip_viewport, convert_cam_to_data);
}
-VpPoint GameState::ScreenToRoom(int scrx, int scry) {
+VpPoint GameState::ScreenToRoom(int scrx, int scry, bool restrict) {
if (_GP(game).options[OPT_BASESCRIPTAPI] >= kScriptAPI_v3507)
- return ScreenToRoomImpl(scrx, scry, -1, true, false);
+ return ScreenToRoomImpl(scrx, scry, -1, restrict, false);
return ScreenToRoomImpl(scrx, scry, 0, false, false);
}
diff --git a/engines/ags/engine/ac/game_state.h b/engines/ags/engine/ac/game_state.h
index 2a9c239c5be..6684f363c28 100644
--- a/engines/ags/engine/ac/game_state.h
+++ b/engines/ags/engine/ac/game_state.h
@@ -313,11 +313,12 @@ struct GameState {
int RoomToScreenX(int roomx);
int RoomToScreenY(int roomy);
// Converts game screen coordinates to the room coordinates through the room viewport
- // This pair of functions tries to find if there is any viewport at the given coords and results
- // in failure if there is none.
+ // This pair of functions tries to find if there is any viewport at the given coords.
+ // If "clip_viewport" parameter is true, then not finding a viewport results in failure,
+ // if it is false, proceeds converting through the primary viewport.
// TODO: find out if possible to refactor and get rid of "variadic" variants;
// usually this depends on how the arguments are created (whether they are in "variadic" or true coords)
- VpPoint ScreenToRoom(int scrx, int scry);
+ VpPoint ScreenToRoom(int scrx, int scry, bool clip_viewport = true);
VpPoint ScreenToRoomDivDown(int scrx, int scry); // native "variadic" coords variant
// Makes sure primary viewport and camera are created and linked together
diff --git a/engines/ags/engine/ac/screen.cpp b/engines/ags/engine/ac/screen.cpp
index a2fc8de46b1..6cd3cda395b 100644
--- a/engines/ags/engine/ac/screen.cpp
+++ b/engines/ags/engine/ac/screen.cpp
@@ -135,10 +135,10 @@ ScriptViewport *Screen_GetAnyViewport(int index) {
return _GP(play).GetScriptViewport(index);
}
-ScriptUserObject *Screen_ScreenToRoomPoint(int scrx, int scry) {
+ScriptUserObject *Screen_ScreenToRoomPoint(int scrx, int scry, bool restrict) {
data_to_game_coords(&scrx, &scry);
- VpPoint vpt = _GP(play).ScreenToRoom(scrx, scry);
+ VpPoint vpt = _GP(play).ScreenToRoom(scrx, scry, restrict);
if (vpt.second < 0)
return nullptr;
@@ -181,8 +181,14 @@ RuntimeScriptValue Sc_Screen_GetAnyViewport(const RuntimeScriptValue *params, in
API_SCALL_OBJAUTO_PINT(ScriptViewport, Screen_GetAnyViewport);
}
-RuntimeScriptValue Sc_Screen_ScreenToRoomPoint(const RuntimeScriptValue *params, int32_t param_count) {
- API_SCALL_OBJAUTO_PINT2(ScriptUserObject, Screen_ScreenToRoomPoint);
+RuntimeScriptValue Sc_Screen_ScreenToRoomPoint2(const RuntimeScriptValue *params, int32_t param_count) {
+ ASSERT_PARAM_COUNT(FUNCTION, 2);
+ ScriptUserObject* obj = Screen_ScreenToRoomPoint(params[0].IValue, params[1].IValue, true);
+ return RuntimeScriptValue().SetDynamicObject(obj, obj);
+}
+
+RuntimeScriptValue Sc_Screen_ScreenToRoomPoint3(const RuntimeScriptValue *params, int32_t param_count) {
+ API_SCALL_OBJAUTO_PINT3(ScriptUserObject, Screen_ScreenToRoomPoint);
}
RuntimeScriptValue Sc_Screen_RoomToScreenPoint(const RuntimeScriptValue *params, int32_t param_count) {
@@ -197,7 +203,8 @@ void RegisterScreenAPI() {
ccAddExternalStaticFunction("Screen::get_Viewport", Sc_Screen_GetViewport);
ccAddExternalStaticFunction("Screen::get_ViewportCount", Sc_Screen_GetViewportCount);
ccAddExternalStaticFunction("Screen::geti_Viewports", Sc_Screen_GetAnyViewport);
- ccAddExternalStaticFunction("Screen::ScreenToRoomPoint", Sc_Screen_ScreenToRoomPoint);
+ ccAddExternalStaticFunction("Screen::ScreenToRoomPoint^2", Sc_Screen_ScreenToRoomPoint2);
+ ccAddExternalStaticFunction("Screen::ScreenToRoomPoint^3", Sc_Screen_ScreenToRoomPoint3);
ccAddExternalStaticFunction("Screen::RoomToScreenPoint", Sc_Screen_RoomToScreenPoint);
}
Commit: 5c8287dfec2e465179ce7055e38fe1de5d522ce0
https://github.com/scummvm/scummvm/commit/5c8287dfec2e465179ce7055e38fe1de5d522ce0
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Common: fixed BufferedSectionStream not preventing read past end
There have been this stupid oversight all along since the introduction
of the class: while it reported Length and EOS correctly, it still
allowed to read past the end.
This can cause issues if the user code relies, for example, on Read()
or ReadByte() return value.
For upstream code, in practice this fixes MP3 streaming, where the length
of data is not always possible to precalculate. In ScummVM we used a
different code for MP3, but this may fix other cases as well.
>From upstream 6f02bedc65b902ce41858b7e92970662020a11cf
Changed paths:
engines/ags/shared/util/buffered_stream.cpp
diff --git a/engines/ags/shared/util/buffered_stream.cpp b/engines/ags/shared/util/buffered_stream.cpp
index 15101d42a73..1254ce2ac8a 100644
--- a/engines/ags/shared/util/buffered_stream.cpp
+++ b/engines/ags/shared/util/buffered_stream.cpp
@@ -56,8 +56,10 @@ BufferedStream::~BufferedStream() {
void BufferedStream::FillBufferFromPosition(soff_t position) {
FileStream::Seek(position, kSeekBegin);
- _buffer.resize(BufferSize);
- auto sz = FileStream::Read(_buffer.data(), BufferSize);
+ // remember to restrict to the end position!
+ size_t fill_size = std::min(BufferSize, static_cast<size_t>(_end - position));
+ _buffer.resize(fill_size);
+ auto sz = FileStream::Read(_buffer.data(), fill_size);
_buffer.resize(sz);
_bufferPosition = position;
}
@@ -101,7 +103,9 @@ size_t BufferedStream::Read(void *buffer, size_t size) {
// then read directly into the user buffer and bail out.
if (size >= BufferSize) {
FileStream::Seek(_position, kSeekBegin);
- size_t sz = FileStream::Read(buffer, size);
+ // remember to restrict to the end position!
+ size_t fill_size = std::min(size, static_cast<size_t>(_end - _position));
+ size_t sz = FileStream::Read(buffer, fill_size);
_position += sz;
return sz;
}
Commit: 9a14045e0ecc7ed3dc5240dc2ec707c91b47ee41
https://github.com/scummvm/scummvm/commit/9a14045e0ecc7ed3dc5240dc2ec707c91b47ee41
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Common: fixed linker error at BufferedStream::BufferSize
>From upstream 919f14226d1391bdee7ea50ac4825414b4dd5e95
Changed paths:
engines/ags/shared/util/buffered_stream.cpp
diff --git a/engines/ags/shared/util/buffered_stream.cpp b/engines/ags/shared/util/buffered_stream.cpp
index 1254ce2ac8a..1bd0a076135 100644
--- a/engines/ags/shared/util/buffered_stream.cpp
+++ b/engines/ags/shared/util/buffered_stream.cpp
@@ -33,6 +33,8 @@ namespace Shared {
// BufferedStream
//-----------------------------------------------------------------------------
+const size_t BufferedStream::BufferSize;
+
BufferedStream::BufferedStream(const String &file_name, FileOpenMode open_mode, FileWorkMode work_mode, DataEndianess stream_endianess)
: FileStream(file_name, open_mode, work_mode, stream_endianess) {
if (IsValid()) {
Commit: 6c18c2d5b594a8418eb6d07411a7e77c510a5ad5
https://github.com/scummvm/scummvm/commit/6c18c2d5b594a8418eb6d07411a7e77c510a5ad5
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Engine: support Clifftop Games custom engine's resolution mod
>From upstream 6a238e9cb4acda222898dd4b597cf20581b401f6
This replaces a slightly different fix we had in ScummVM. But this new
code works better and fixes bug #12949
Changed paths:
engines/ags/engine/main/game_file.cpp
engines/ags/shared/ac/game_setup_struct_base.cpp
engines/ags/shared/ac/game_struct_defines.h
diff --git a/engines/ags/engine/main/game_file.cpp b/engines/ags/engine/main/game_file.cpp
index 5b158198c9c..0b0647c7e9d 100644
--- a/engines/ags/engine/main/game_file.cpp
+++ b/engines/ags/engine/main/game_file.cpp
@@ -171,24 +171,36 @@ HError load_game_file() {
MainGameSource src;
LoadedGameEntities ents(_GP(game));
HError err = (HError)OpenMainGameFileFromDefaultAsset(src, _GP(AssetMgr).get());
- if (err) {
- err = (HError)ReadGameData(ents, src.InputStream.get(), src.DataVersion);
- src.InputStream.reset();
- if (err) {
- // Upscale mode -- for old games that supported it.
- // NOTE: this must be done before UpdateGameData, or resolution-dependant
- // adjustments won't be applied correctly.
- if ((_G(loaded_game_file_version) < kGameVersion_310) && _GP(usetup).override_upscale) {
- if (_GP(game).GetResolutionType() == kGameResolution_320x200)
- _GP(game).SetGameResolution(kGameResolution_640x400);
- else if (_GP(game).GetResolutionType() == kGameResolution_320x240)
- _GP(game).SetGameResolution(kGameResolution_640x480);
- }
-
- err = (HError)UpdateGameData(ents, src.DataVersion);
- }
+ if (!err)
+ return err;
+
+ err = (HError)ReadGameData(ents, src.InputStream.get(), src.DataVersion);
+ src.InputStream.reset();
+
+ //-------------------------------------------------------------------------
+ // Data overrides: for compatibility mode and custom engine support
+ // NOTE: this must be done before UpdateGameData, or certain adjustments
+ // won't be applied correctly.
+
+ // Custom engine detection (ugly hack, depends on the known game GUIDs)
+ if (strcmp(_GP(game).guid, "{d6795d1c-3cfe-49ec-90a1-85c313bfccaf}" /* Kathy Rain */ ) == 0 ||
+ strcmp(_GP(game).guid, "{5833654f-6f0d-40d9-99e2-65c101c8544a}" /* Whispers of a Machine */ ) == 0)
+ {
+ _GP(game).options[OPT_CUSTOMENGINETAG] = CUSTOMENG_CLIFFTOP;
+ }
+ // Upscale mode -- for old games that supported it.
+ if ((_G(loaded_game_file_version) < kGameVersion_310) && _GP(usetup).override_upscale) {
+ if (_GP(game).GetResolutionType() == kGameResolution_320x200)
+ _GP(game).SetGameResolution(kGameResolution_640x400);
+ else if (_GP(game).GetResolutionType() == kGameResolution_320x240)
+ _GP(game).SetGameResolution(kGameResolution_640x480);
+ }
+ if (_GP(game).options[OPT_CUSTOMENGINETAG] == CUSTOMENG_CLIFFTOP) {
+ if (_GP(game).GetResolutionType() == kGameResolution_640x400)
+ _GP(game).SetGameResolution(Size(640, 360));
}
+ err = (HError)UpdateGameData(ents, src.DataVersion);
if (!err)
return err;
err = LoadGameScripts(ents);
diff --git a/engines/ags/shared/ac/game_setup_struct_base.cpp b/engines/ags/shared/ac/game_setup_struct_base.cpp
index 1d32a93a3bf..8cd765516c9 100644
--- a/engines/ags/shared/ac/game_setup_struct_base.cpp
+++ b/engines/ags/shared/ac/game_setup_struct_base.cpp
@@ -240,9 +240,6 @@ Size ResolutionTypeToSize(GameResolutionType resolution, bool letterbox) {
case kGameResolution_320x240:
return Size(320, 240);
case kGameResolution_640x400:
- // The engine was modified for Whispers of a Machine to return 640x360
- if (strcmp(_GP(game).guid, "{5833654f-6f0d-40d9-99e2-65c101c8544a}") == 0)
- return Size(640, 360);
return letterbox ? Size(640, 480) : Size(640, 400);
case kGameResolution_640x480:
return Size(640, 480);
diff --git a/engines/ags/shared/ac/game_struct_defines.h b/engines/ags/shared/ac/game_struct_defines.h
index 22f8fe4dc99..cba85f2c106 100644
--- a/engines/ags/shared/ac/game_struct_defines.h
+++ b/engines/ags/shared/ac/game_struct_defines.h
@@ -86,13 +86,22 @@ namespace AGS3 {
#define OPT_CLIPGUICONTROLS 48 // clip drawn gui control contents to the control's rectangle
#define OPT_GAMETEXTENCODING 49 // how the text in the game data should be interpreted
#define OPT_KEYHANDLEAPI 50 // key handling mode (old/new)
-#define OPT_HIGHESTOPTION OPT_KEYHANDLEAPI
-#define OPT_NOMODMUSIC 98
+#define OPT_CUSTOMENGINETAG 51 // custom engine tag (for overriding behavior)
+#define OPT_HIGHESTOPTION OPT_CUSTOMENGINETAG
+#define OPT_NOMODMUSIC 98 // unused
#define OPT_LIPSYNCTEXT 99
+
+#define CUSTOMENG_NONE 0
+#define CUSTOMENG_DRACONIAN 1 // Draconian Edition
+#define CUSTOMENG_CLIFFTOP 2 // Clifftop Games
+
+// Sierra-style portrait position style
#define PORTRAIT_LEFT 0
#define PORTRAIT_RIGHT 1
#define PORTRAIT_ALTERNATE 2
#define PORTRAIT_XPOSITION 3
+
+// Room transition style
#define FADE_NORMAL 0
#define FADE_INSTANT 1
#define FADE_DISSOLVE 2
Commit: aa6c07f03eb909ade57a9aae2fbb737f4834b807
https://github.com/scummvm/scummvm/commit/aa6c07f03eb909ade57a9aae2fbb737f4834b807
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Plugin API: few adjustments to recently added methods
>From upstream ddf9aee9c360a60edcc2f3107fbac41f8efbe93c
Changed paths:
engines/ags/plugins/ags_plugin.cpp
engines/ags/plugins/ags_plugin.h
engines/ags/shared/font/fonts.cpp
engines/ags/shared/font/fonts.h
diff --git a/engines/ags/plugins/ags_plugin.cpp b/engines/ags/plugins/ags_plugin.cpp
index 594055a481b..3fd36a9a923 100644
--- a/engines/ags/plugins/ags_plugin.cpp
+++ b/engines/ags/plugins/ags_plugin.cpp
@@ -760,12 +760,12 @@ void IAGSEngine::GetRenderStageDesc(AGSRenderStageDesc *desc) {
void IAGSEngine::GetGameInfo(AGSGameInfo* ginfo) {
if (ginfo->Version >= 26) {
snprintf(ginfo->GameName, sizeof(ginfo->GameName), "%s", _GP(game).gamename);
- snprintf(ginfo->guid, sizeof(ginfo->guid), "%s", _GP(game).guid);
- ginfo->uniqueid = _GP(game).uniqueid;
+ snprintf(ginfo->Guid, sizeof(ginfo->Guid), "%s", _GP(game).guid);
+ ginfo->UniqueId = _GP(game).uniqueid;
}
}
-IAGSFontRenderer2* IAGSEngine::ReplaceFontRenderer2(int fontNumber, IAGSFontRenderer2 *newRenderer) {
+IAGSFontRenderer* IAGSEngine::ReplaceFontRenderer2(int fontNumber, IAGSFontRenderer2 *newRenderer) {
auto *old_render = font_replace_renderer(fontNumber, newRenderer);
GUI::MarkForFontUpdate(fontNumber);
return old_render;
diff --git a/engines/ags/plugins/ags_plugin.h b/engines/ags/plugins/ags_plugin.h
index 5f9555f6db6..124392978c5 100644
--- a/engines/ags/plugins/ags_plugin.h
+++ b/engines/ags/plugins/ags_plugin.h
@@ -316,12 +316,12 @@ struct AGSGameInfo {
// Which version of the plugin interface the struct corresponds to;
// this field must be filled by a plugin before passing the struct into the engine!
int Version;
- // Game name
+ // Game title (human-readable text)
char GameName[50];
- // guid
- char guid[40];
- // Random key identifying the game
- int uniqueid;
+ // Game's GUID
+ char Guid[40];
+ // Random key identifying the game (deprecated)
+ int UniqueId;
};
// The plugin-to-engine interface
@@ -582,7 +582,7 @@ public:
// please note that plugin MUST fill the struct's Version field before passing it into the function!
AGSIFUNC(void) GetGameInfo(AGSGameInfo* ginfo);
// install a replacement renderer (extended interface) for the specified font number
- AGSIFUNC(IAGSFontRenderer2*) ReplaceFontRenderer2(int fontNumber, IAGSFontRenderer2* newRenderer);
+ AGSIFUNC(IAGSFontRenderer*) ReplaceFontRenderer2(int fontNumber, IAGSFontRenderer2* newRenderer);
// notify the engine that certain custom font has been updated
AGSIFUNC(void) NotifyFontUpdated(int fontNumber);
};
diff --git a/engines/ags/shared/font/fonts.cpp b/engines/ags/shared/font/fonts.cpp
index 3ab78847f32..c8977b6c0f1 100644
--- a/engines/ags/shared/font/fonts.cpp
+++ b/engines/ags/shared/font/fonts.cpp
@@ -144,10 +144,10 @@ IAGSFontRenderer *font_replace_renderer(size_t fontNumber, IAGSFontRenderer *ren
return old_render;
}
-IAGSFontRenderer2* font_replace_renderer(size_t fontNumber, IAGSFontRenderer2 *renderer) {
+IAGSFontRenderer *font_replace_renderer(size_t fontNumber, IAGSFontRenderer2 *renderer) {
if (fontNumber >= _GP(fonts).size())
return nullptr;
- IAGSFontRenderer2* old_render = _GP(fonts)[fontNumber].Renderer2;
+ IAGSFontRenderer* old_render = _GP(fonts)[fontNumber].Renderer;
font_replace_renderer(fontNumber, renderer, renderer);
return old_render;
}
diff --git a/engines/ags/shared/font/fonts.h b/engines/ags/shared/font/fonts.h
index 3bb090c98d2..414fba8b0e3 100644
--- a/engines/ags/shared/font/fonts.h
+++ b/engines/ags/shared/font/fonts.h
@@ -69,7 +69,7 @@ void init_font_renderer();
void shutdown_font_renderer();
void adjust_y_coordinate_for_text(int *ypos, size_t fontnum);
IAGSFontRenderer *font_replace_renderer(size_t fontNumber, IAGSFontRenderer *renderer);
-IAGSFontRenderer2* font_replace_renderer(size_t fontNumber, IAGSFontRenderer2 *renderer);
+IAGSFontRenderer *font_replace_renderer(size_t fontNumber, IAGSFontRenderer2 *renderer);
void font_recalc_metrics(size_t fontNumber);
bool font_first_renderer_loaded();
bool is_font_loaded(size_t fontNumber);
Commit: da8d47e72e626dd1ad217ece7a8f70af7d35af2d
https://github.com/scummvm/scummvm/commit/da8d47e72e626dd1ad217ece7a8f70af7d35af2d
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2022-12-15T22:40:17+01:00
Commit Message:
AGS: Updated build version (3.6.0.34)
>From upstream 01f3a19eb80bed3e0803c37a9649e9560485038b
Changed paths:
engines/ags/shared/core/def_version.h
diff --git a/engines/ags/shared/core/def_version.h b/engines/ags/shared/core/def_version.h
index 97b1e816acf..849abe51870 100644
--- a/engines/ags/shared/core/def_version.h
+++ b/engines/ags/shared/core/def_version.h
@@ -22,9 +22,9 @@
#ifndef AGS_SHARED_CORE_DEFVERSION_H
#define AGS_SHARED_CORE_DEFVERSION_H
-#define ACI_VERSION_STR "3.6.0.33"
+#define ACI_VERSION_STR "3.6.0.34"
#if defined (RC_INVOKED) // for MSVC resource compiler
-#define ACI_VERSION_MSRC_DEF 3.6.0.33
+#define ACI_VERSION_MSRC_DEF 3.6.0.34
#endif
#define SPECIAL_VERSION ""
More information about the Scummvm-git-logs
mailing list