Monday, November 16, 2020

Syrup and the Ultimate Sweet: Illustration 27

If you type the game's name into Google, one of the search suggestions is the title of this post.  I myself had gotten all the endings and was only missing this one illustration, and finding absolutely nothing to go off of on the internet, I set off on my journey to find it.  As a result, I don't know exactly what triggered it, but I do have it now, and I have a pretty good idea of what might need to be done to get it.

Oh and fair warning: I'm going to talk about the end of the story in this post, so if you haven't already played the game and seen all the endings, maybe don't read further.  Your call though.

I started by noting that the illustrations in the gallery are in the order in which they appear in the story.  Illustration 26 is the one where Syrup goes to sleep after seeing what was recorded on the crystal ball, and illustration 28 is from when she goes to return the crystal ball and has a chat with Toffee before going to sleep.  I figured it had to be somewhere around that specific point in the story.

My first step was going for Gumdrop End and experimenting with different choices on Mt. Sorbet, but that got me nowhere.  My next idea was to get Pastille to show up on Mt. Sorbet.  It had been a few days and I kinda forgot what I needed to do for that.  As a result I got Frozen End a few times.  The gist of getting Pastille End is: be nice to Gumdrop and tell Pastille you wanted to help him (when given the choice to supervise Gumdrop, help Pastille, or leave), then let Gumdrop disappear but help Pastille find her.  I forget if choices matter on Mt. Sorbet before telling Butterscotch you hate her in order to stay trapped in the cave.  If you end up in Treat's cabin, you're on the right track, just avoid getting the Worst End and you'll be good.  Once you're down off the mountain and have the crystal ball, look at it before going to sleep.

Anyway, I got Pastille End.  Then I remembered that Toffee End has a slight difference if you get it again, so I went and got Pastille End again, but this time Syrup had some new dialogue after seeing the scene in the crystal ball.  After this, I got the elusive illustration 27.

This was technically my third time getting Pastille End, but it was also the second time in a row getting this ending.  My recommendation is simply to keep getting Pastille End, and eventually you should get the illustration.  If you need to, play around with choices that you feel are less integral to getting Pastille End.

Wednesday, November 11, 2020

Sentimental Shooting: Compatibility Update

I've been trying to resist the "storytime" intro I often do in my blog posts for this specific series, but this one does have a small story for context.

I was perusing some old speedruns on YouTube when I noticed one in particular was using a program called D3DWindower to force the game to run windowed.  I had been searching for something exactly like this, but I guess I just hadn't typed the right things into Google.  However, searching for D3DWindower by name and sifting through the results revealed an even better option: DxWnd.

DxWnd is now my official recommendation for running Sentimental Shooting on modern versions of Windows.  It fixes 100% of the palette corruption issues and allows a number of other useful tweaks.  Most of them don't actually apply to Sentimental Shooting, but the few that do could be useful depending on your needs.

You can add Sentimental Shooting to DxWnd simply by dragging and dropping SGSTG.EXE onto its window.  In the Options menu, enable Expert Mode so that the Tools menu will appear.  Then, with Sentimental Shooting selected, go to Tools → Clear Compatibility flags to clear any Windows compatibility options you may have set after following my previous post.  After that, right click on the game's icon in DxWnd and select Modify.

Here are the base settings I will recommend.  If a listed item is a checkbox or radio option, it should be selected.  Anything that's omitted should be left default (or in some cases, changed to suit your tastes).  For reference, all of this has been tested on DxWnd v2_05_59, which is the latest version at the time of writing.
  • Main
    • Name: Sentimental Shooting
  • Main → Generic:
    • Do not notify on task switch
    • No banner
    • Run in Window
  • Main → Position:
    • Hide desktop background
    • Keep Aspect Ratio
    • (W)idth: 640
    • (H)eight: 480
    • Desktop
  • Video
    • Initial virtual color setting: 8 BPP
    • Z order: top
    • Window size & position: Anchored
  • DirectX → Emulation
    • Renderer: OpenGL
    • Full bilinear filter (only if you can't achieve an integer scale)
  • Compat. → Tweaks
    • Win7 color fix (may not be needed outside of Windows 7)
As I mentioned with the Full bilinear filter option, it's only necessary if you can't get an integer scale when the game goes fullscreen.  If you're unsure whether or not this is possible, divide your screen resolution's height by 480.  If you get a whole number, congratulations, you can get an integer scale and don't need the bilinear filter.  Otherwise, enable the bilinear filter to make the game's bitmap fonts look right, and to reduce shimmering in the scrolling backgrounds.  Both of those issues are caused by non-integer scaling, and while the bilinear filter means you won't get the chunky pixels you deserve, it's better than the alternative.

Once you have the game configured and working when launched from within DxWnd, you can right click on it and select Proxy → ddraw to be able to run the game without having to launch it from within DxWnd.  When you do this, it will place some extra files in the game directory and the settings will be applied automatically when you launch the game.

These options will force the game to run in a pillarboxed 4:3 aspect ratio, so the graphics will appear as intended.  If you're one of those people who hates "black bars", please seek help for your mental condition.

With this new recommendation, the only remaining compatibility issue is for those who want to use a controller instead of the keyboard controls.  There are three options here:
  1. An XInput controller, with a compatibility layer that translates the game's DirectInput calls into the equivalent XInput calls.  Basically, the reverse of x360ce.
  2. A controller like the Logitech F310 or F710 (F310 = wired, F710 = wireless), that has a switch to toggle the controller between XInput and DirectInput.  If you want to use a controller but lack a controller for your computer, this is probably the easiest option, and it has the side benefit of also working with modern games.
  3. An older DirectInput-only controller, or one of the myriad of USB adapters for controllers from older consoles.  As long as there's X and Y axes (not a POV hat) and at least three buttons, it'll work.
Looks like we can see the light at the end of the tunnel.  There aren't really any more objective "best" options left, it's just down to user preference at this point.

Tuesday, November 10, 2020

Abusing C-Style Comment Syntaxes For Fun (and Profit)

C originally only had multi-line comments, which work like this:
/* no comment */
All characters between the /* and the */, including newlines, will be ignored by the compiler, and you're free to document your code as you see fit.  People eventually got tired of typing */ and thus the syntax // for a single-line comment was born.  Interestingly, we can abuse a combination of both comment syntaxes to easily toggle between two alternate blocks of code with the addition or removal of a single character.

Feast your eyes upon this abomination:
/* code block 1 /*/ code block 2 //*/
In that example, code block 1 is commented and code block 2 will run.  However, add a single slash at the beginning:
//* code block 1 /*/ code block 2 //*/
Now code block 2 is commented, and code block 1 will run instead.

This works because when the beginning is /*, it begins a multi-line comment.  The /*/ ends the multi-line comment, and //*/ is a single-line comment.  When the beginning is //*, it's a single-line comment.  The /*/ begins a multi-line comment, and the //*/ ends the multi-line comment.

Have a nice day!