207 Commits

Author SHA1 Message Date
Filippos Karapetis
9dd63b12b1 SCI: Add more script patcher checks for games without a selector vocab
Fixes the LSL1 demo
2019-09-14 11:39:35 +03:00
Filippos Karapetis
d2f5023ee9 SCI: Do not apply script patches when checking for static selectors
Fixes bug #10969
2019-06-08 13:57:34 +03:00
Filippos Karapetis
941869c466 SCI32: Remove reg32_t and use reg_t in all cases
reg32_t was a transitive solution, before reg_t's were
adapted to use 32-bit addresses internally, and before
support for SCI3 was added. It was introduced as another
way to handle large script offsets in SCI3, and was only
used for the program counter (PC). It's no longer
needed, as we now support SCI3 script offsets using
reg_t's, so we can use make_reg32 in all cases where
we need to access offsets over 64KB
2018-08-25 12:39:12 +03:00
Filippos Karapetis
f18711f3c2 SCI: Update comment 2018-08-21 03:36:03 +03:00
Colin Snover
f83c61fcb6 SCI32: Fix relocation of locals in SCI3
Somehow, up until trying to view an encrypted data cube in RAMA,
the missing relocation of locals did not seem to cause any trouble
in any of the other SCI3 games.
2017-09-23 20:57:03 -05:00
Torbjörn Andersson
7d52dbe7eb JANITORIAL: Remove unnecessary semicolon 2017-08-25 17:56:09 +02:00
Colin Snover
3bc00e6633 SCI: Stop double-initialization of SCI0/1 objects
These objects should have been initialized only during the first
pass. Double-initialization does not cause any visible problem
problem during normal operation (mostly it just causes memory
waste by making Object::_baseVars/_baseMethod double up their
data), but could have silently allowed games to receive bogus data
for an out-of-bounds property or method index, instead of raising
an error.
2017-07-15 20:29:36 -05:00
Colin Snover
63ad8fbbed SCI: Tidy Script errors & ensure script number exists in all of them 2017-06-10 20:34:55 -05:00
Colin Snover
ef69a59467 SCI: Stop leaking locals segments during script reuse
When a game deletes a script and then loads the same script again
before it has been fully deallocated,
SegManager::instantiateScript tries to reuse the same script
& locals segments, but it was failing to reuse the old locals
segment because Script::freeScript would unconditionally clear
the old locals SegmentId, which meant the old locals segment would
just leak.

This patch does not fix old save games which may contain orphaned
locals segments, but should prevent the problem from occurring
going forward. (It is possible to clean up these old save games,
but this is not a big leak so it doesn't seem worth the extra
effort to do so.)
2017-05-20 21:14:18 -05:00
Colin Snover
4917330038 SCI: Find and store the original static names of objects
See code comment in Object::init for more details.

Fixes Trac#9780.
2017-05-20 21:14:18 -05:00
Colin Snover
1f29e6f241 SCI: Refactor relocation code
This groundwork enables an object to look up its static name
separately from the normal process that is used to populate
Object::_variables when an object is first constructed.

(The static name property needs to be able to be retrieved from
objects inside of earlier save games whose name properties may
have already been modified at runtime, so the code cannot simply
pluck the value out of Object::_variables when they are first
initialised and then persisted into the save game, as nice and
easy as that would have been.)

This commit also helps to clarify the situation with relocation
tables in SCI1 games that start with a zero entry.

Refs Trac#9780.
2017-05-20 21:14:18 -05:00
Colin Snover
71630a7cb2 SCI: Remove duplicate relocateBlock function 2017-05-20 21:14:18 -05:00
Colin Snover
94dc6ae052 SCI: Hold script data as mutable internally
Script buffer data is modified after a script is loaded by
savegame operations, and, in SCI16, by string operations. Casting
away const to allow these mutations to happen is not a very good
design, so this patch just changes the privately held reference
to data to be mutable. (Public accessors still return immutable
data.)
2017-04-30 12:47:32 -05:00
Colin Snover
519719db49 SCI: Add var count sanity checking to object initialization 2017-04-24 21:45:49 -05:00
Colin Snover
28a06656af SCI: Improve error messages in Script::validateExportFunc 2017-04-23 13:07:25 -05:00
Colin Snover
d53f3f6095 SCI32: Exclude SCI3 code from compilation when SCI32 is disabled 2017-04-23 13:07:25 -05:00
Colin Snover
a799cb3462 SCI: Fix SCI3 exports
Export functions may be relocated above 64k in SCI3, but exports
that do not have an entry in the relocation table must be handled
the same as SCI1.1-2.1.
2017-04-23 13:07:25 -05:00
Colin Snover
eadf5d818f SCI: Fix support for 32-bit SCI3 script offsets 2017-04-23 13:07:25 -05:00
Colin Snover
0394fd44e8 SCI: Fix whitespace errors 2017-04-23 13:07:25 -05:00
Colin Snover
6b95528b49 SCI32: Fix bad relocations of SCI3 objects 2017-04-23 13:07:25 -05:00
Colin Snover
d0a143fa87 SCI32: Fix locals offset in SCI3
Locals offset needs to be set even when the script has no exports.
2017-04-23 13:07:25 -05:00
Colin Snover
7997451384 SCI32: Remove TODO from relocateOffsetSci3
The field at +8 is for the MemID associated with a relocation.
2017-04-23 13:07:25 -05:00
Colin Snover
c9342beca9 SCI: Remove unused commented code 2017-04-23 13:07:25 -05:00
Colin Snover
a620b6c354 SCI: Fix handling of buggy SCI0 export tables
The previous fix for this bug was incorrect; it only happened
to work because of another bug: the number of exports was being
read incorrectly (reading the byte size of the export block, not
the number of exports), so the validation check for the export
number always passed. Then, the "small" offsets that were seen
were actually either invalid reads into the header of the next
block in the script (KQ4), or reads into the bad first export
table which contained an unfilled offset (Camelot).

Once the incorrect number of exports was fixed, the previous "fix"
broke in KQ4 because the export number validation started to work
correctly and the first export table does not have enough entries
(needs 2, has 1).

This patch fixes the bug by using the last export table in SCI0
scripts instead of the first export table. (This does not affect
most scripts, since only the buggy scripts have more than one
export table.)

Fixes Trac#9731.
2017-04-18 11:47:18 -05:00
Willem Jan Palenstijn
ee86a74cd3 SCI: Fix remaining format string warning 2017-03-30 22:00:27 +02:00
Colin Snover
a233696212 SCI: Update formatting strings to match updated Span API 2017-03-30 14:23:41 -05:00
Colin Snover
323e74bda9 SCI: Simplify calculation of locals size in SCI0/1 2017-03-27 19:42:31 -05:00
Colin Snover
31daa956d6 SCI: Implement bounds-checked reads of game resources 2017-03-27 19:42:31 -05:00
Colin Snover
4814682d5f SCI: Improve disassembly output
1. pushi opcode now displays decimal value and selector value (if
   one exists) in-line
2. lofsa, lofss, and super opcodes now display resolved
   object/class names
3. Opcode arguments are visually aligned
2016-11-20 12:31:44 -06:00
Colin Snover
55222ec06c SCI32: Fix zero-offset exports
Exports with a zero offset are supposed to point to the start of
the code block in the script hunk, but they were being ignored.

This may also apply to SCI1.1 games, but until that can be
verified, this fixes the zero-offset in only SCI32 games for now.
2016-10-20 11:33:08 -05:00
Willem Jan Palenstijn
699a147348 SCI: Make -propDict- unique for each class
Previously, this was using the offset of the property dict inside the
script. However, this isn't unique. For example, SQ6's DPath and
PolyPath classes both have their property dict at offset 8 of their
respective scripts. This would break Obj::isMemberOf.

Closes #846.
2016-10-14 19:43:32 -05:00
Martin Kiewitz
0dd760724e SCI32: split up SCI2.1 into EARLY/MIDDLE/LATE
- Detection works via signatures (couldn't find a better way)
- new kString subcalls were introduced SCI2.1 LATE
- kString now has signatures and is split via subcall table
- kString fix, so that KQ7 doesn't crash, when starting a chapter
- Sci2StringFunctionType removed, because no longer needed
2015-12-29 01:44:11 +01:00
Filippos Karapetis
3a29dfaebf SCI: Fix object init in SCI3 scripts which are larger than 64kb 2015-07-13 01:35:26 +03:00
Martin Kiewitz
3b092e5d60 SCI: identifyOffsets() counter variables 2015-05-17 18:51:22 +02:00
Martin Kiewitz
3698ca8cf7 SCI: adjust SCI3 offset identify thx lskovlun 2015-05-15 23:46:25 +02:00
Martin Kiewitz
c787560acb SCI: add SCI3 support for debug cmd scro 2015-05-14 20:58:14 +02:00
Martin Kiewitz
3183ef0854 SCI: add said-details to script_said debug cmd 2015-05-14 20:41:21 +02:00
Martin Kiewitz
bfab4c4cbe SCI: debug commands scro, scrs and script_said
implement string collecting for SCI3
implement object offset collecting for SCI0-SCI2
implement said-str offset collecting for SCI0-SCI1
add new debug command scro / script_objects
add new debug command script_said
string without terminating NUL now a warning
the latter happens in qfg2 for amiga room 84
2015-05-14 20:33:21 +02:00
Martin Kiewitz
f1a75991ed SCI: fix bug in new string identifying code
fixes string identifying in mac SCI1.1 games
2015-05-04 21:50:42 +02:00
Martin Kiewitz
ed7007162a SCI: Scripts: identify strings + debug command
debug command is called "script_strings" / "scrs"
2015-05-04 21:19:05 +02:00
Martin Kiewitz
cb8e40c116 SCI: QFG3 fix priority of chief in hut bug #5173
this is a script issue and also happens
in Sierra's SCI. Gets solved by script patch.
2015-04-16 01:26:23 +02:00
Johannes Schickel
8fc7d60feb SCI: Make GPL headers consistent in themselves. 2014-02-18 02:39:37 +01:00
Martin Kiewitz
8bdffcb2fb SCI: script patcher is now a separate class 2013-12-04 20:42:16 +01:00
Martin Kiewitz
3fbbdbc2da SCI: improved script patcher
Gabriel Knight + King's Quest 6 patches now also work for Mac versions of those games
added support for selectors instead of using hardcoded values
2013-11-03 23:49:31 +01:00
Willem Jan Palenstijn
8f754ced42 SCI: Flip assert
This way the assert is checking that the allocated buffer is large enough
for the memcpy that follows it.
2012-10-07 12:27:14 +02:00
Filippos Karapetis
cc77688696 SCI: Remove an incorrect error check in validateExportFunc() 2012-06-28 03:29:34 +03:00
Filippos Karapetis
7e66cbd468 SCI: Rename a parameter in validateExportFunc()
This ensures that it won't be confused with a function with the same name
2012-06-26 11:13:14 +03:00
Filippos Karapetis
20b6770808 SCI: Change the program counter (PC) to be a 32-bit variable
This is needed for future support of large SCI3 scripts. The program
counter is isolated and does not interfere with other parts of the VM,
plus it does not get stored in saved games, so it's pretty straightforward
to convert
2012-06-23 21:45:26 +03:00
Filippos Karapetis
c1eb93bc5a SCI: Clean up validateExportFunc() and related functions
Also renamed some SCI3 related code to indicate when it's SCI3 specific
2012-06-23 21:45:24 +03:00
Filippos Karapetis
2b50824133 SCI: Add setter/getter methods to reg_t's
No functionality change has been made with this commit. This avoids
setting and getting the reg_t members directly, and is the basis of any
future work on large SCI3 scripts (larger than 64KB)
2012-06-18 05:24:06 +03:00