[Scummvm-git-logs] scummvm master -> 301689e870b742ff97fecffcfe529ba3ec58c2c5

dreammaster dreammaster at scummvm.org
Wed Aug 4 01:56:58 UTC 2021


This automated email contains information about 7 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8f3ade4b0d AGS: Added detection entry
83a29c5e1d AGS: Let FileStream wrap std streams (stdin/out/err)
ddc99c673d AGS: Implemented String::AppendFmt() for easier formatted append
c9e6af5750 AGS: Do not error on DrawingSurface drawing over itself
9aeaf99a52 AGS: In DrawingSurface.DrawImage clamp transparency instead of error
b6261f7a0e AGS: Convert top/bottom walk area coords along with the walk mask
301689e870 AGS: In old games put player to walkable area when changing rooms


Commit: 8f3ade4b0d6a9c2f54902f9ade96ec5baea3925e
    https://github.com/scummvm/scummvm/commit/8f3ade4b0d6a9c2f54902f9ade96ec5baea3925e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-03T18:56:34-07:00

Commit Message:
AGS: Added detection entry

Changed paths:
    engines/ags/detection_tables.h


diff --git a/engines/ags/detection_tables.h b/engines/ags/detection_tables.h
index 885adf33f8..bfd4c147ea 100644
--- a/engines/ags/detection_tables.h
+++ b/engines/ags/detection_tables.h
@@ -2612,6 +2612,7 @@ const AGSGameDescription GAME_DESCRIPTIONS[] = {
 	GAME_ENTRY("escapetheship", "Escape.exe", "3b7cceb3e4bdb031dc5d8f290936e94b", 1063503),
 	GAME_ENTRY("esper", "esper.exe", "0710e2ec71042617f565c01824f0cf3c", 17409715),
 	GAME_ENTRY("eternallyus", "Eternally Us.exe", "3faa59edd92158ff2cbd4b9db54acf61", 43467084),
+	GAME_ENTRY("eternallyus", "Eternally Us.exe", "3faa59edd92158ff2cbd4b9db54acf61", 43468014),
 	GAME_ENTRY("eventtimer", "Timer.exe", "95b7dd55f6e15c8a2118856ed9fe8ff9", 3000682),
 	GAME_ENTRY("exclamation", "!.exe", "0514661a4ba6772cf0db0cf839fc7003", 2785515),
 	GAME_ENTRY("exit", "EXIT.exe", "3b7cceb3e4bdb031dc5d8f290936e94b", 54723513),


Commit: 83a29c5e1d8c70884477ce84cb293a46d50eaff5
    https://github.com/scummvm/scummvm/commit/83a29c5e1d8c70884477ce84cb293a46d50eaff5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-03T18:56:35-07:00

Commit Message:
AGS: Let FileStream wrap std streams (stdin/out/err)

>From upstream d49964ed09b8cd3a1b8142559c4b16e115b7a8c5

Changed paths:
    engines/ags/shared/util/file.cpp
    engines/ags/shared/util/file.h


diff --git a/engines/ags/shared/util/file.cpp b/engines/ags/shared/util/file.cpp
index 872c724e54..6b134d45e3 100644
--- a/engines/ags/shared/util/file.cpp
+++ b/engines/ags/shared/util/file.cpp
@@ -147,6 +147,18 @@ Stream *File::OpenFile(const String &filename, FileOpenMode open_mode, FileWorkM
 	return fs;
 }
 
+Stream *File::OpenStdin() {
+	error("TODO: File::OpenStdin");
+}
+
+Stream *File::OpenStdout() {
+	error("TODO: File::OpenStdout");
+}
+
+Stream *File::OpenStderr() {
+	error("TODO: File::OpenStderr");
+}
+
 String File::FindFileCI(const String &dir_name, const String &file_name) {
 #if !defined (AGS_CASE_SENSITIVE_FILESYSTEM)
 	// Simply concat dir and filename paths
diff --git a/engines/ags/shared/util/file.h b/engines/ags/shared/util/file.h
index 8f144970ae..87c11be4f9 100644
--- a/engines/ags/shared/util/file.h
+++ b/engines/ags/shared/util/file.h
@@ -86,6 +86,13 @@ inline Stream *OpenFileWrite(const String &filename) {
 	return OpenFile(filename, kFile_Create, kFile_Write);
 }
 
+// Opens stdin stream for reading
+Stream *OpenStdin();
+// Opens stdout stream for writing
+Stream *OpenStdout();
+// Opens stderr stream for writing
+Stream *OpenStderr();
+
 // Case insensitive find file
 String FindFileCI(const String &dir_name, const String &file_name);
 // Case insensitive file open: looks up for the file using FindFileCI


Commit: ddc99c673d059018649880e04ded3db9bb5c44a6
    https://github.com/scummvm/scummvm/commit/ddc99c673d059018649880e04ded3db9bb5c44a6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-03T18:56:35-07:00

Commit Message:
AGS: Implemented String::AppendFmt() for easier formatted append

>From upstream 78b934e1b02ca4c772026a65907e4a1cd9c0bfcc

Changed paths:
    engines/ags/shared/util/string.cpp
    engines/ags/shared/util/string.h


diff --git a/engines/ags/shared/util/string.cpp b/engines/ags/shared/util/string.cpp
index 93c1d6ec70..3038b0c073 100644
--- a/engines/ags/shared/util/string.cpp
+++ b/engines/ags/shared/util/string.cpp
@@ -449,6 +449,25 @@ void String::AppendChar(char c) {
 	}
 }
 
+void String::AppendFmt(const char *fcstr, ...) {
+	va_list argptr;
+	va_start(argptr, fcstr);
+	AppendFmtv(fcstr, argptr);
+	va_end(argptr);
+}
+
+void String::AppendFmtv(const char *fcstr, va_list argptr) {
+	fcstr = fcstr ? fcstr : "";
+	va_list argptr_cpy;
+	va_copy(argptr_cpy, argptr);
+	size_t length = vsnprintf(nullptr, 0u, fcstr, argptr);
+	ReserveAndShift(false, length);
+	vsprintf(_cstr + _len, fcstr, argptr_cpy);
+	va_end(argptr_cpy);
+	_len += length;
+	_cstr[_len] = 0;
+}
+
 void String::ClipLeft(size_t count) {
 	if ((_len != 0) && (count > 0)) {
 		count = Math::Min(count, _len);
diff --git a/engines/ags/shared/util/string.h b/engines/ags/shared/util/string.h
index 1d1c108c0c..bceb58d100 100644
--- a/engines/ags/shared/util/string.h
+++ b/engines/ags/shared/util/string.h
@@ -287,6 +287,9 @@ public:
 	void    Append(const char *cstr, size_t len);
 	// Appends a single character
 	void    AppendChar(char c);
+	// Appends a formatted string
+	void    AppendFmt(const char *fcstr, ...);
+	void    AppendFmtv(const char *fcstr, va_list argptr);
 	// Clip* methods decrease the string, removing defined part
 	// Cuts off leftmost N characters
 	void    ClipLeft(size_t count);


Commit: c9e6af5750cd6caca5290a63854b5f369ec60e79
    https://github.com/scummvm/scummvm/commit/c9e6af5750cd6caca5290a63854b5f369ec60e79
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-03T18:56:35-07:00

Commit Message:
AGS: Do not error on DrawingSurface drawing over itself

>From upstream aeb65ccbf3c94c1d4a0d73359cf93315bc0849d8

Changed paths:
    engines/ags/engine/ac/drawing_surface.cpp


diff --git a/engines/ags/engine/ac/drawing_surface.cpp b/engines/ags/engine/ac/drawing_surface.cpp
index 9545794849..a784e638f5 100644
--- a/engines/ags/engine/ac/drawing_surface.cpp
+++ b/engines/ags/engine/ac/drawing_surface.cpp
@@ -125,14 +125,9 @@ void DrawingSurface_DrawImageImpl(ScriptDrawingSurface *sds, Bitmap *src,
 	int dst_x, int dst_y, int trans, int dst_width, int dst_height,
 	int src_x, int src_y, int src_width, int src_height, int sprite_id, bool src_has_alpha) {
 	Bitmap *ds = sds->GetBitmapSurface();
-
-	// WORKAROUND: Strangeland triggers this error, so change to a warning
-	static bool shownWarning = false;
-	if (src == ds && !shownWarning) {
-		warning("!DrawingSurface.DrawImage: cannot draw onto itself");
-		shownWarning = true;
-	}
-
+	if (src == ds) {
+	} // ignore for now; bitmap lib supports, and may be used for effects
+/* debug_script_warn("DrawingSurface.DrawImage: drawing onto itself"); */
 	if ((trans < 0) || (trans > 100))
 		quit("!DrawingSurface.DrawImage: invalid transparency setting");
 
@@ -141,7 +136,7 @@ void DrawingSurface_DrawImageImpl(ScriptDrawingSurface *sds, Bitmap *src,
 	if (dst_width < 1 || dst_height < 1 || src_width < 1 || src_height < 1)
 		return; // invalid src or dest rectangles
 
-				// Setup uninitialized arguments; convert coordinates for legacy script mode
+	// Setup uninitialized arguments; convert coordinates for legacy script mode
 	if (dst_width == SCR_NO_VALUE) {
 		dst_width = src->GetWidth();
 	} else {
@@ -174,7 +169,7 @@ void DrawingSurface_DrawImageImpl(ScriptDrawingSurface *sds, Bitmap *src,
 	if (dst_x >= ds->GetWidth() || dst_x + dst_width <= 0 || dst_y >= ds->GetHeight() || dst_y + dst_height <= 0 ||
 		src_x >= src->GetWidth() || src_x + src_width <= 0 || src_y >= src->GetHeight() || src_y + src_height <= 0)
 		return; // source or destination rects lie completely off surface
-				// Clamp the source rect to the valid limits to prevent exceptions (ignore dest, bitmap drawing deals with that)
+	// Clamp the source rect to the valid limits to prevent exceptions (ignore dest, bitmap drawing deals with that)
 	Math::ClampLength(src_x, src_width, 0, src->GetWidth());
 	Math::ClampLength(src_y, src_height, 0, src->GetHeight());
 


Commit: 9aeaf99a520fd46f5ad1b36af07063342a0e021b
    https://github.com/scummvm/scummvm/commit/9aeaf99a520fd46f5ad1b36af07063342a0e021b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-03T18:56:35-07:00

Commit Message:
AGS: In DrawingSurface.DrawImage clamp transparency instead of error

>From upstream e00eabf57ceb32523ed81007e06e3587abe6d013

Changed paths:
    engines/ags/engine/ac/drawing_surface.cpp


diff --git a/engines/ags/engine/ac/drawing_surface.cpp b/engines/ags/engine/ac/drawing_surface.cpp
index a784e638f5..ddb9440ceb 100644
--- a/engines/ags/engine/ac/drawing_surface.cpp
+++ b/engines/ags/engine/ac/drawing_surface.cpp
@@ -129,7 +129,8 @@ void DrawingSurface_DrawImageImpl(ScriptDrawingSurface *sds, Bitmap *src,
 	} // ignore for now; bitmap lib supports, and may be used for effects
 /* debug_script_warn("DrawingSurface.DrawImage: drawing onto itself"); */
 	if ((trans < 0) || (trans > 100))
-		quit("!DrawingSurface.DrawImage: invalid transparency setting");
+		debug_script_warn("DrawingSurface.DrawImage: invalid transparency %d, range is %d - %d", trans, 0, 100);
+	trans = Math::Clamp(trans, 0, 100);
 
 	if (trans == 100)
 		return; // fully transparent


Commit: b6261f7a0eb610b4f19347ddd50a980fdf7d620c
    https://github.com/scummvm/scummvm/commit/b6261f7a0eb610b4f19347ddd50a980fdf7d620c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-03T18:56:35-07:00

Commit Message:
AGS: Convert top/bottom walk area coords along with the walk mask

>From upstream 60d79d1ee26b642ef4bcc7c18dfa53540e7ae77f

Changed paths:
    engines/ags/engine/ac/room.cpp


diff --git a/engines/ags/engine/ac/room.cpp b/engines/ags/engine/ac/room.cpp
index 0f2010621e..53aa7a4654 100644
--- a/engines/ags/engine/ac/room.cpp
+++ b/engines/ags/engine/ac/room.cpp
@@ -204,6 +204,11 @@ void convert_room_background_to_game_res() {
 	_GP(thisroom).HotspotMask = FixBitmap(_GP(thisroom).HotspotMask, mask_width, mask_height);
 	_GP(thisroom).RegionMask = FixBitmap(_GP(thisroom).RegionMask, mask_width, mask_height);
 	_GP(thisroom).WalkAreaMask = FixBitmap(_GP(thisroom).WalkAreaMask, mask_width, mask_height);
+
+	for (size_t i = 0; i < _GP(thisroom).WalkAreaCount; ++i) {
+		_GP(thisroom).WalkAreas[i].Top = room_to_mask_coord(_GP(thisroom).WalkAreas[i].Top);
+		_GP(thisroom).WalkAreas[i].Bottom = room_to_mask_coord(_GP(thisroom).WalkAreas[i].Bottom);
+	}
 }
 
 


Commit: 301689e870b742ff97fecffcfe529ba3ec58c2c5
    https://github.com/scummvm/scummvm/commit/301689e870b742ff97fecffcfe529ba3ec58c2c5
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-03T18:56:36-07:00

Commit Message:
AGS: In old games put player to walkable area when changing rooms

>From upstream f33e064cd148c6a709ccbf25a5fd4939272a7814

Changed paths:
    engines/ags/engine/ac/character.cpp
    engines/ags/engine/ac/character.h
    engines/ags/engine/ac/room.cpp


diff --git a/engines/ags/engine/ac/character.cpp b/engines/ags/engine/ac/character.cpp
index 114219c485..27fde1500b 100644
--- a/engines/ags/engine/ac/character.cpp
+++ b/engines/ags/engine/ac/character.cpp
@@ -1807,6 +1807,11 @@ int doNextCharMoveStep(CharacterInfo *chi, int &char_index, CharacterExtras *che
 	return 0;
 }
 
+bool is_char_walking_ndirect(CharacterInfo *chi) {
+	return ((chi->walking > 0) && (chi->walking < TURNING_AROUND)) &&
+		(_G(mls)[chi->walking].direct == 0);
+}
+
 int find_nearest_walkable_area_within(int *xx, int *yy, int range, int step) {
 	int ex, ey, nearest = 99999, thisis, nearx = 0, neary = 0;
 	int startx = 0, starty = 14;
diff --git a/engines/ags/engine/ac/character.h b/engines/ags/engine/ac/character.h
index a33401373f..b62f2e91ae 100644
--- a/engines/ags/engine/ac/character.h
+++ b/engines/ags/engine/ac/character.h
@@ -189,6 +189,8 @@ void fix_player_sprite(MoveList *cmls, CharacterInfo *chinf);
 // Check whether two characters have walked into each other
 int  has_hit_another_character(int sourceChar);
 int  doNextCharMoveStep(CharacterInfo *chi, int &char_index, CharacterExtras *chex);
+// Tells if character is currently moving, in eWalkableAreas mode
+bool is_char_walking_ndirect(CharacterInfo *chi);
 int  find_nearest_walkable_area_within(int *xx, int *yy, int range, int step);
 void find_nearest_walkable_area(int *xx, int *yy);
 void walk_character(int chac, int tox, int toy, int ignwal, bool autoWalkAnims);
diff --git a/engines/ags/engine/ac/room.cpp b/engines/ags/engine/ac/room.cpp
index 53aa7a4654..3cba8064a7 100644
--- a/engines/ags/engine/ac/room.cpp
+++ b/engines/ags/engine/ac/room.cpp
@@ -23,6 +23,7 @@
 #include "ags/shared/core/platform.h"
 #include "ags/shared/util/string_utils.h" //strlwr()
 #include "ags/shared/ac/common.h"
+#include "ags/engine/ac/character.h"
 #include "ags/engine/ac/character_cache.h"
 #include "ags/engine/ac/character_extras.h"
 #include "ags/engine/ac/draw.h"
@@ -692,6 +693,7 @@ void load_new_room(int newnum, CharacterInfo *forchar) {
 		_G(rgb_map) = &_GP(rgb_table);
 	}
 	_G(our_eip) = 211;
+	bool place_on_walkable = false;
 	if (forchar != nullptr) {
 		// if it's not a Restore Game
 
@@ -711,10 +713,18 @@ void load_new_room(int newnum, CharacterInfo *forchar) {
 
 		forchar->prevroom = forchar->room;
 		forchar->room = newnum;
+
+		// Compatibility: old games had a *possibly unintentional* effect:
+		 // if a character was moving when "change room" function is called,
+		 // they ended up forced to a walkable area in the next room.
+		if (_G(loaded_game_file_version) < kGameVersion_300) {
+			if (is_char_walking_ndirect(forchar))
+				place_on_walkable = true;
+		}
+
 		// only stop moving if it's a new room, not a restore game
 		for (cc = 0; cc < _GP(game).numcharacters; cc++)
 			StopMoving(cc);
-
 	}
 
 	update_polled_stuff_if_runtime();
@@ -735,6 +745,8 @@ void load_new_room(int newnum, CharacterInfo *forchar) {
 	if ((_G(new_room_x) != SCR_NO_VALUE) && (forchar != nullptr)) {
 		forchar->x = _G(new_room_x);
 		forchar->y = _G(new_room_y);
+		if (place_on_walkable)
+			Character_PlaceOnWalkableArea(forchar);
 
 		if (_G(new_room_loop) != SCR_NO_VALUE)
 			forchar->loop = _G(new_room_loop);




More information about the Scummvm-git-logs mailing list