Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - Charles

Pages: [1]
1
SCI Development Tools / RESOURCE.000 compression/decompression algorithms
« on: January 12, 2024, 02:26:29 PM »
I'm writing my own resource viewer for funsies and I'm hung up on the compression methods and algorithms used on some of the patch files.  The info on the scummvm documentation https://wiki.scummvm.org/index.php?title=SCI/Specifications/Resource_files/Decompression_algorithms and sierrahelp documentation http://sci.sierrahelp.com/Documentation/SCISpecifications/10-DecompressionAlgorithms.html seems to be identical and outdated (or incomplete?).

Obviously these are solved problems, because ScummVM can play the games, and SCICompanion can edit them, etc, but would somebody be able to point me to the code in either of those two github repositories where I could follow along?

2
Mega Tokyo SCI Archive / Right-Click "Look"
« on: March 19, 2003, 08:35:20 PM »
Just one quick question -- I haven`t actually looked too hard for this, but it is just a passing question of mine, so I thought I`d tap the resource of all the knowledgable people on this forum:

With SCI Studio, can you (and how easy is it) to do right-click looking at objects.  Similar to was used in QFG1/2.  (Also, ctrl-click for get object... QFG2 did that to a very limited extent.)

3
So a number of years back (probably over ten years by this point), I started an attempt at remastering all the old sierra game manuals. I only got as far as the King's Quest series before life took over and my enthusiasm petered out.

I thought it was time I shared my efforts.  Here's the King's Quest 5 documentation, in the best quality you've ever seen.
If there's an interest, I can share my others. I have KQ1-6, and the map from QFG2.

4
The Games and other Sierra Adventure stuff / QFG1 EGA Deluxe
« on: December 17, 2022, 05:51:57 PM »
This is the 1st public release of a mod for Quest For Glory I EGA that I've been working off and on for a couple years now.

It's an extensive rewrite a couple key aspects of QFG1 to support 1 new major feature I added now (and a handful of minor ones), and 2 potential features I would like to add in the future.

The big feature is one I've talked about before: No game over screens when you die.  I've replaced all Restore/Restart/Quit death screens with Retry/Restore/Quit death screens. These will let you revert things to just before the death, and as a bonus will mark that death as achieved, in your Death List.  No auto-saves, no 'save early, save often' required.

Because of how invasive this mod is, I cannot distribute it as simple patch files. I also opted not to distribute as a binary diff, so instead wrote my own extractor program that requires an existing copy of QFG1 (any QFG1 EGA) to validate against before extracting. Note, you'll still need to add it to ScummVM or DOSBox manually to run it.

Some of the potential features I started (but have disabled) are selecting from different playable avatars (it's disabled because while I've done the code to allow it, I haven't done any of the artwork...), and enabling access to the shed in the town (again, it's disabled because while I've made the door openable, I haven't drawn a room for it).  You can enable either of those BETA features by a creating specially named file in the game folder, if you want to try them.

I'll paste the rest of my readme here:
==================================
## QFG1Deluxe

Custom mod of QFG1 EGA, replacing death screens with a Retry feature, and keeping track of which deaths you've experiences.
Beta features include adding a second playable character, and new rooms/puzzles.
To enable BETA features, place the corresponding file in the game folder (the file can be empty):
 - 2AVATARS : Enables two avatars to pick from: Male or Female
 - 3AVATARS : Enabled three avatars to pick from: Male, Female, or Other.
           Other is an inverted colour for debugging. This could conceivably be replaced with
           any other sprites in the future... an elf, an ogre, whatever.
 - SHEDOPEN : Unlocks the doors to the Town shed.  Note, the room is a very crude drawing.
            Technically, this isn't even in BETA, more like ALPHA.

## Changelog

v1.310
 - fixed original QFG1 bug with casting spells accidentally casting twice in some circumstances
 - fixed missing negative points for killing bear by daggers or magic.
 - added support for multiple avatars (choose Male, Female or Other)
    o   To enable, there must be the file 2AVATARS or 3AVATARS present in the game folder.
      Female is WIP, and only has a single replaced graphic
      Other is a Proof of Concept, and is for debug testing.
 - added * next to Zap on inventory screen when your weapon is charged (like in QFG2).
 - added the beginnings of the town shed interior. To enable, there must be a
   file called SHEDOPEN present in the game folder.
 - added additional game flags exported in your character save (at game end)
 - added right-click look on Maltese Falcon in the Brigand Leader's room.

v1.301
 - fixed a fatal bug in the goblin ambush area
 - made minor tweaks to several areas. They shouldn't affect gameplay.
   (rock throwing script, dagger throwing script, flame dart throwing script,
   antwerp following script, brigand courtyard script, dag-nab-it script,
   healer's hut tree script)

v1.300
Here?s a quick Changelog:
-   All deaths replaced with a Retry dialog
   o   The Retry will revert only the relevant bits back to just before the
      death, so as to let the hero try again.
   o   If the hero got killed, I restore some health (sometimes all health?
      can?t remember which gets what treatment)
   o   Any skill gained between dying and retying are kept (I?m taking a cue
      from EarthBound here? it is a game, afterall, the point of which is
      primarily to have fun. Building skills is incidental to that? and
      anyway, if you died because your skills were too low, you need them
      higher eventually anyway)
   o   Date/Time are not reset except in certain time-critical instances. 
      Conceivable, if you die hundreds of times in a room, days could pass,
      but that?s such a small problem, with no real consequences I don?t worry
      about it
-   Added a new screen that shows how many deaths total, and how many unique deaths
   you?ve had.
   o   It also lists the first 32 deaths (in a predefined order), with the most
      recent shown 1st in red.
-   Restored a unique death in the Sheriff Break-In house that was never shown due to
   an original script bug
   o   If you crack the safe 3 times in a row, the game accuses you of ?Power
      Gaming? to build up your skills, and wakes up the Sheriff.
-   Restored an unused instant-death and animation in the 2nd room of Fred the Troll?s
   cave. He sneaks up on you, and the game does a Luck Roll to see if you get killed
   instantly, or have to fight him.
-   Added a text title for the Sheriff?s Wife?s single line of dialog (if you enter
   her room). She always had a name in the source code, but I don?t believe it was
   ever visible in game before now.
-   Slightly tweaked the meetings with Baba Yaga to show the sword cursor when she?s
   expecting you to reply.
-   Changed Date/Time shortcut to ^d to be consistent with QFG2
-   Modified Razzle Dazzle slightly (show different title bar, expanded Alt-S details,
   let Alt-X ask what amount the skills should be set to.
-   Added a SillyClowns toggle. It modifies the Date/Time message a bit.
-   Changed in-game status bar text back to So You Want To Be A Hero, as it was in the
   original release of HQ1

5
Just stumbled across this new blog post a couple days ago by Chris Benshoof.
https://www.benshoof.org/blog/quest-for-glory-i-macintosh-easter-egg

The topic's mainly about an exclusive easter egg hidden in the Mac version of QFG1.  But he also goes into some of the joys and challenges of decompiling the Mac sierra games in general and Quest For Glory 1 specifically (which was ported to Mac about 2 years after the PC release).

He also includes an attachment to bring the exclusive easter egg over to the PC version, which is neat.

6
SCI Development Tools / Rebuilding resource.000 with external patches
« on: August 04, 2021, 04:58:51 PM »
Is there any easy way to rebuild a resource.000 with all the external patch files?

I thought Tools-->Rebuild resources did it, but it looks like that just removes duplicates from within the resource itself, not adding in any additional patch files.  I feel like I'm missing something obvious.

7
SCI Development Tools / SCI01 interp decompiling
« on: December 10, 2020, 04:58:52 PM »
So I was procrastinating on another project and idly wondering what it would take to decompile the SCI01 interpreter and re-incorporate text parser code into SCI11.

This is a nearly 30 year old program.. surely there must be decent decompilation software out there now, right?  I found one called Reko Decompiler that looked promising.  I opened it up, but it reported the file was compressed with LZEXE.  I noticed that Eric already knew that, and has already decompressed it in the SCI01 template.  But when I opened it up again in Reko, I found it was still partially compressed a second time with EXEPACKER.

So after hunting far and wide, I finally found a dead link to a DOS program that can unpack EXEPACKER files. A trip to the WayBackMachine found a working link, and in DOSBOX I was able to uncompress it yet again.

Now, Reko was able to process the thing. And here's where I've reached my level of incompetence. There were a small handful of errors decompressing, but there looks to be actual code -- that is bereft of any ral variable names -- so it might as well be gibberish to me.  Anyway, I've gone as far as I probably can with it, but I thought it was interesting that the EXE was compressed in two different ways, and wanted to share. I've also attached the hard to find unpack.exe, if somebody else wanted to give it a go.

8
SCI Community How To's & Tutorials / Retry/Restore/Quit Death Dialog
« on: December 09, 2020, 02:45:32 PM »
As I detailed in the "What are we working on?" thread earlier, I've modded QFG1EGA to implement a "Retry" feature when the Hero dies.

I was absolutely floored by the positive encouragement I've received in the community, so I wanted to share how I implemented it, so others could also implement in their games (or mod existing Sierra games).

My goal with "Retry" was to remove a potential point of frustration for new (and old) players being punished for exploring the game and trying things. However, I didn't want to eliminate the deaths entirely, because they are a fundamental part of the Sierra experience, and are part of each Sierra game's unique charm.

My particular solution was to replace game-ending deaths with an additional achievement system, which not only keeps track of which deaths the user encountered but also displays them (like QFG1EGA's inventory screen).

I chose a "minimally invasive" approach, whereby I only reverted the specific events that caused the death (and any items directly branched off from that death, if the death wasn't instant), leaving the rest of the users experiences intact.

I had to modify/add five things to make this happen:
  • game.sh (modified)
  • main.sc (modified)
  • menu.sc (modified)
  • DeathSheet.sc (added)
  • any script that calls the EgoDead function

To keep track of each unique death, I created an Enum. Because this can grow fairly large (QFG1EGA had 79 Unique Deaths), I decided to create a new file and reference it in game.sh, rather than putting everything into game.sh itself.
Code: [Select]
;These are death flags. They're used to track which ways the user has died. 
;They will be shown at the end of the game.

; unique deaths
(define DIE_RESTART -2) ;show Restore, Restart, Quit; (same as not specifying anything at all) instead of Retry, Restore, Quit)
(define DIE_RETRY -1) ;show a Retry, Restore, Quit
(define DIE_NOFLAG -1) ; a retry is shown, but nothing is flagged.
;explicitly define the starting number, ending number and death count, which will be used in the DeathSheet script.
(define DIE_START 450)
(define DIE_COUNT 79)
(define DIE_END 528)
;there are roughly 100 deaths, so we'll reserve flags 450-550 for them (with room for 50 more in expansion up to flag 600)
(enum 450
DIE_NOSTAMINA
DIE_PICKNOSE
DIE_ARRESTED
DIE_NIGHTGAUNT
)

Next up is modifying the EgoDeath function in main.sc.  Keeping track of the different deaths is done with the eventFlags variable, and Btst, Bclr, Bset. I don't know if every Sierra game includes them or not, so if they're not present, you'll need to add them. the eventFlags variable must be an array. Each byte of the array can hold 16 bits (or 16 individual flags).  QFG1EGA allocated 50 bytes (800 flags), and didn't use nearly all of them, so I was able to just use them without allocating any more space.
Code: [Select]
(procedure (Bset bit)
(= [eventFlags (/ bit 16)]
(|
[eventFlags (/ bit 16)]
(>> $8000 (mod bit 16))
)
)
)

(procedure (Bclr bit)
(= [eventFlags (/ bit 16)]
(&
[eventFlags (/ bit 16)]
(~ (>> $8000 (mod bit 16)))
)
)
)

(procedure (Btst bit)
(return
(&
[eventFlags (/ bit 16)]
(>> $8000 (mod bit 16))
)
)
)

Then the EgoDeath function. In QFG1EGA it's the first global function in main.sc, so I assume that's constant across all Sierra games.
Code: [Select]
(enum 1
RESTORE
RESTART
QUIT
RETRY
)

(procedure (EgoDead what how &tmp printRet)
;stops all sounds, plays the death music, and gives the player a choice:
; Restore, Restart, Quit or
; Retry, Restore, Quit
;
; 'what' decides what we're doing: Restart or Retry.
; if 'what' == DIE_RETRY (-1), it's a Retry death;
; if 'what' == DIE_RESTART (-2), it's a Restart death (explicitly defined).
; any other values are assumed to be the original EgoDead function, for a Restart death (implicitly defined),
; and should be fully passed to the Print procedure.
;
; 'how' is this specific death's flag, to be set in the eventFlags variable, via the Bset function
;
; (CI: NOTE: This procedure is a recreation, based on Eric Oaklands's SCI01 template)
; https://github.com/EricOakford/SCI01-Template/blob/master/src/Main.sc
; it has been modified to more closely match the original asm, which is commented out but intact above,
; then has been further modified to support a Retry mode.

(HandsOff)
(Wait 100)

(theGame setCursor: normalCursor TRUE)
(sounds eachElementDo: #stop)

(if (!= deathMusic NULL)
(music number: deathMusic priority: 15 init: play:)
)

;if we're specifying a way the player died, then we'll set the flag for that death method.
(if (and (== what DIE_RETRY) (!= how DIE_NOFLAG))
(++ deathCount)
(= prevDeathNum how) ;we're going to flag out *every* time the hero dies.
(if (not (Btst how))
(Bset how)
(++ deathCountUnique)
)
)

(repeat
(= printRet
(cond
;1st priority: the new Retry dialog
((== what DIE_RETRY)
(Print &rest
#width 250
#button { Retry_} RETRY
#button {Restore} RESTORE
#button { Quit_} QUIT
)
)
;2nd priority: an explicit DIE_RESTART flag with no second parameter
((== what DIE_RESTART)
(Print how &rest
#width 250
#button {Restore} RESTORE
#button { Restart_} RESTART
#button { Quit_} QUIT
)
)
;finally, any original script EgoDeath scripts
((>= what 0)
(Print what how &rest
#width 250
#button {Restore} RESTORE
#button { Restart_} RESTART
#button { Quit_} QUIT
)
)
)
)
(switch printRet
(RESTORE ;restore
(theGame restore:)
)
(RESTART ;restart
(theGame restart:)
)
(QUIT ;quit
(= quit TRUE)
(break)
)
(RETRY ;retry
(if (!= deathMusic NULL)
(music stop:)
)
(HandsOn)
(break)
)
)
)
)

If you wanted, you could stop here and compile your game without changing anything else. All existing calls to EgoDead will continue to function as they always have, bringing up the RESTORE/RESTART/QUIT dialog.

I'll describe the DeathSheet and actually implementing the new EgoDead function in game script in the next post.

EDIT: I forgot, I also added a couple of global variables to main.sc.  There were several unused variables in QFG1EGA, so I was able to just rename one of them, without adding any more.
Code: [Select]
deathCount ;added by CI: the total number of times Ego has died (shown on the Death List)
deathCountUnique ;added by CI: the number of unique ways Ego has died (shown on the Death List)
prevDeathNum ;added by CI: Used to highlight the most recent death in the Death List.

9
SCI Syntax Help / editing PICs
« on: October 10, 2020, 12:05:22 PM »
When editing a pic in SCICompanion, is there an easy way to nudge lines, either indivdiually or in a group?

In my specific case, I have a view with three boxes drawn on it, and I want to change where I've put those boxes.  I don't want to redraw the boxes from scratch, because they're fairly intricate, but I no longer like where I've placed them.

10
SCI Syntax Help / Problem recreating QFG2 source
« on: May 02, 2020, 03:56:12 PM »
Im working on recreating the source for QFG2, using a mix Eric’s source from the decompilation archive and my own efforts decompiling from scratch.

The problem is I’m seeing what feels like a memory corruption error and I don’t even know where to begin to troubleshoot it.

In a nutshell it looks like variables aren’t being set properly. Take this one instance in script 000, near the end of Trial:init (which isn’t that like the first code the game runs?)
Code: [Select]
(= possibleScore 500)
(Printf {possibleScore is %d} possibleScore)
It prints the message “possibleScore is 0”

Part of the problem I’m having is that I don’t think there’s anywhere *before* there that I can fix. I haven’t done any extensive troubleshooting, but given what I’m seeing, I don’t know where to begin. Any thoughts?[/code]

11
Didn't see this posted elsewhere on here, and thought everyone'd be interested.

https://www.kickstarter.com/projects/klytos/the-sierra-adventure-the-story-of-sierra-on-line

Shawn Mills, one of the co-founders of Infamous Quests, has written a book about the history of Sierra, and has started a kickstarter to get it professionally edited and printed.

Some of the Backer Rewards include autographed copies from The Coles (already gone), and Josh Mandel.

Looks interesting.


12
SCI Development Tools / Decompiler ambiguity for SCI0 and SCI01
« on: May 02, 2019, 04:19:14 PM »
I was looking through the decompiled QFG1EGA, and noticed something I think might be decompiling wrong, and I wanted to get other opinions on.

I've tried this in fresh decompilations for LSL3, QFG1EGA and QFG2, all with the same results. In script 994 (GAME.SC) it decompiles to (trimmed unnecessary code):
Code: [Select]
(instance controls of Controls
(properties)
)
(class Rm of Rgn
(properties
controls 0
)

(method (init &tmp temp0)
(= controls controls)
)
)

So there's a script instance called controls, and there's a property in the Rm class called the same thing.  In the Rm class, it's assigning (= controls controls).  Looks like the IDE assumes they're referencing the same thing, the control property (and I assume the compiler does the same), but I believe the original code being decompiled is actually (= <property>controls <instance>controls).

Can anybody confirm what's going on, or am I way off base?

13
SCI Development Tools / Recreating complete QFG1 EGA source code
« on: June 12, 2016, 11:05:00 PM »
So I've decompiled QFG1 EGA, and am going through trying to replace any proc# or localproc# with actual descriptive names (same for global variables, etc), and it's going fairly well. I'd say I'm learning a lot about SCI scripting in the process, but there are a couple of items/questions that have come up that I'm not sure how to interpret.

1) in script 968 (SmoothLooper) the doit method of the SmoothLooper class decompiles into this:
Code: [Select]
(method (doit &tmp [temp0 2])
CorruptFunction_CantDetermineCodeBounds
)
So clearly something unexpected is going on with the byte-code. I'm not really too keen on understanding the raw byte-code, but at the very least is there a way to force SCICompanion to try converting it to asm?  Unless anybody has an other suggestion?

2) kernel_113 is called in several scripts (1, 255, 202, 32).  Is this an undocumented kernel call?  No clue what it is supposed to do.

3) DoSound. The documentation (http://scicompanion.com/Documentation/Kernels/DoSound.html?highlight=sndCHECK_DRIVER) says that DoSound(sndCHECK_DRIVER) only returns TRUE or FALSE, depending if the sound driver is installed, however there is code in QFG1 to the effect of (DoSound(sndCHECK_DRIVER) == 1), (DoSound(sndCHECK_DRIVER) <= 4), (DoSound(sndCHECK_DRIVER) > 4), implying it is more along the lines of the number of music channels present.

That's about all I have for now. Thanks for reading.

Pages: [1]

SMF 2.0.19 | SMF © 2021, Simple Machines
Simple Audio Video Embedder

Page created in 0.029 seconds with 20 queries.