The original Adrift runners are written in Visual Basic, so there is no decompiled code incorporated into Scarier.
Okay, but then what did you mean by “but also on decompilation of the Adrift runners”?
I decompiled the original Adrift runners to P-code and, where possible, to Visual Basic, in order to determine exactly how they work.
So you consulted the decompiled code, but didn’t transpile and incorporate it like you did the Scare and Frankendrift code? That sounds good from a licensing perspective. ![]()
To be clear, Scarier is written entirely in C++. No VB or C# from ADRIFT or FrankenDrift is in Scarier.
SCARE is written in C (not C++) and distributed under a GPLv2 license. SCARE was directly imported into Scarier (with modifications to make it valid C++). SCARE has bugs, some of them 20 years old.
Claude automatically fixed a bunch of bugs in SCARE based on the results of automated testing, and also by decompiling old versions of ADRIFT (3.7, 3.8, 3.9, and 4.0) to see how they used to work.
For ADRIFT 5, no decompilation is necessary; ADRIFT 5’s source is available at https://github.com/jcwild/ADRIFT-5/ under a BSD 3-clause license. FrankenDrift forked from that.
Does it address the “Events and Walks messed up after gameover / (undo or restore)” issue? ( Overriding the UNDO command? - ADRIFT Forum )
I don’t think that bug manifests in Scarier. At least I can’t reproduce it. There have been lots of changes to UNDO to allow multiple undos and undo after death, so one of them might have fixed it.
Who’s taken over Geas?
I guess that would be Claude.
I think it would make sense to rename Spatterlight’s Geas, just as it made sense to rename SCARE for Spatterlight’s fork, Scarier. (May I suggest the name “Wyrd”?)
Then it would be correct to say that Geas is (still) abandonware, but the new thing is maintained by @Angstsmurf (and Claude, if you like).
How about Claudeas?
That’s a good one! (But, don’t actually use it… Anthropic has been litigious around Claude-generated projects that incorporate the name “Claude” in their name, e.g. Clawdbot.)
Hmm, perhaps Gaia then. Though the ancestral mother may object to the “ai” in it being repurposed.
For a while it was going to be called Questionable. I like both Wyrd and Gaia better, though.
Hotfix release 1.5.4 is out!
https://github.com/angstsmurf/spatterlight/releases/tag/v1.5.4
ADRIFT 5, last time I checked, had an issue with operator associativity:
(A)/B/C is handled as (A/B)/C
(A+0)/B/C is handled as A/(B/C)
Has this been fixed in the original? How does the new interpreter handle it?
That is correct, and is still present in the current Adrift 5 runner (and FrankenDrift). Scarier does not do this, but evaluates both as (A/B)/C.
You would think that this should cause problems and break games, but the output of Scarier has been compared to the output of FrankenDrift for nearly all known Adrift 5 games, and it seems to be pretty much identical. I’ll do some extra testing to make sure, now that you pointed it out. EDIT: Only winning walkthroughs are tested, though, so some side path might still trip on this.
Scarier does reproduce many other Adrift 5 runner quirks, though, such as per-division rounding and the unusual ^ precedence.
EDIT: All 174 Adrift 5 games in my library were checked, and the expression pattern (A+0)/B/C does not appear in any of them. Of course, somebody could still write a new game which hits this quirk.
Do you happen to know of a game where this potentially makes a difference?
Not really; a few years ago, I was curious how Campbell implemented the expression evaluator, so I looked over it, and realized there was this edge case where it would give an incorrect result.
Does Scarier have short-circuit evaluation for if/and/or? I don’t think it mattered on ADRIFT 4, but the addition of user defined functions and urand mean it makes a difference. (ADRIFT 4 Runner did not use short-circuit evalution; jAsea and SCARE did.)
(urand is a random number generator that doesn’t repeat numbers, so it matters whether an expression using urand is evaluated. User defined functions make recursive expressions possible, though A5’s non-short-circuit implementation will cause them to infinite loop.)
How about “100 * urand(0+0, 5) + urand(0, 5)” vs “100 * urand(0,5) + urand(0,5)”? In what order are the calls to urand evaluated? (Under A5 Runner, the order differs.)
If an expression is mentioned twice identically within a block of text using <# … #>, the A5 Runner will evaluate it twice, but print the result from the first evalution in both places. (saabie found this one.) How does Scarier handle it?
Scarier does use use short-circuit expression evaluation for Adrift 5 games, but not for Adrift 4 ones.
As far as I can tell, in the other cases you mention, Scarier diverges from the A5 Runner.
100 * urand(0+0, 5) + urand(0, 5) and 100 * urand(0,5) + urand(0,5) are evaluated in the same order in Scarier, unlike in the Runner, and two identical <# … #> are evaluated twice, potentially printing two different values.
At least the second case seems like something that should be fixed in Scarier. Do you remember where @saabie mentioned this, by any chance? Is there a particular game where this matters?
I exchanged some private messages with saabie on the ADRIFT board.
Currently, the discussion is academic; I found an oddity in how ADRIFT evaluates expressions and multiple consequences of that.
Another potential oddity: 1) A single block of text has a <# #> tag that evaluates to a string containing a <# #> expression. 2) A single block of text has a <# #> tag that evaluates to a string containing a <# #> expression, and a second <# #> tag that has the second expression directly. 3) A single block of text, with a <# #> tag, followed by a <# #> tag that evaluates to something containing the first tag.
I suspect that in case 2, the inner expression will be evaluated, while in cases 1 and 3, the inner expression will be left unevaluated.