private static void WriteGameSetupStructBase_Aligned(BinaryWriter writer, Game game)
{
// assume stream is aligned at start
WriteString(SafeTruncate(game.Settings.GameName, 49), 50, writer);
writer.Write(new byte[2]); // alignment padding
int[] options = new int[100];
options[NativeConstants.GameOptions.OPT_ALWAYSSPCH] = (game.Settings.AlwaysDisplayTextAsSpeech ? 1 : 0);
options[NativeConstants.GameOptions.OPT_ANTIALIASFONTS] = (game.Settings.AntiAliasFonts ? 1 : 0);
options[NativeConstants.GameOptions.OPT_ANTIGLIDE] = (game.Settings.AntiGlideMode ? 1 : 0);
options[NativeConstants.GameOptions.OPT_NOWALKMODE] = (game.Settings.AutoMoveInWalkMode ? 0 : 1);
options[NativeConstants.GameOptions.OPT_RIGHTLEFTWRITE] = (game.Settings.BackwardsText ? 1 : 0);
options[NativeConstants.GameOptions.OPT_COMPRESSSPRITES] = (game.Settings.CompressSprites ? 1 : 0);
options[NativeConstants.GameOptions.OPT_DEBUGMODE] = (game.Settings.DebugMode ? 1 : 0);
options[NativeConstants.GameOptions.OPT_DIALOGUPWARDS] = (game.Settings.DialogOptionsBackwards ? 1 : 0);
options[NativeConstants.GameOptions.OPT_DIALOGGAP] = game.Settings.DialogOptionsGap;
options[NativeConstants.GameOptions.OPT_DIALOGIFACE] = game.Settings.DialogOptionsGUI;
options[NativeConstants.GameOptions.OPT_DUPLICATEINV] = (game.Settings.DisplayMultipleInventory ? 1 : 0);
options[NativeConstants.GameOptions.OPT_STRICTSTRINGS] = (game.Settings.EnforceNewStrings ? 1 : 0);
options[NativeConstants.GameOptions.OPT_STRICTSCRIPTING] = (game.Settings.EnforceObjectBasedScript ? 1 : 0);
options[NativeConstants.GameOptions.OPT_NOSCALEFNT] = (game.Settings.FontsForHiRes ? 1 : 0);
options[NativeConstants.GameOptions.OPT_NEWGUIALPHA] = (int)game.Settings.GUIAlphaStyle;
options[NativeConstants.GameOptions.OPT_SPRITEALPHA] = (int)game.Settings.SpriteAlphaStyle;
options[NativeConstants.GameOptions.OPT_HANDLEINVCLICKS] = (game.Settings.HandleInvClicksInScript ? 1 : 0);
options[NativeConstants.GameOptions.OPT_FIXEDINVCURSOR] = (game.Settings.InventoryCursors ? 0 : 1);
options[NativeConstants.GameOptions.OPT_GLOBALTALKANIMSPD] = (game.Settings.UseGlobalSpeechAnimationDelay ?
game.Settings.GlobalSpeechAnimationDelay : (-game.Settings.GlobalSpeechAnimationDelay - 1));
options[NativeConstants.GameOptions.OPT_LEFTTORIGHTEVAL] = (game.Settings.LeftToRightPrecedence ? 1 : 0);
options[NativeConstants.GameOptions.OPT_LETTERBOX] = (game.Settings.LetterboxMode ? 1 : 0);
options[NativeConstants.GameOptions.OPT_MOUSEWHEEL] = (game.Settings.MouseWheelEnabled ? 1 : 0);
options[NativeConstants.GameOptions.OPT_DIALOGNUMBERED] = (int)game.Settings.NumberDialogOptions;
options[NativeConstants.GameOptions.OPT_PIXPERFECT] = (game.Settings.PixelPerfect ? 1 : 0);
options[NativeConstants.GameOptions.OPT_FADETYPE] = (int)game.Settings.RoomTransition;
options[NativeConstants.GameOptions.OPT_RUNGAMEDLGOPTS] = (game.Settings.RunGameLoopsWhileDialogOptionsDisplayed ? 1 : 0);
options[NativeConstants.GameOptions.OPT_SAVESCREENSHOT] = (game.Settings.SaveScreenshots ? 1 : 0);
options[NativeConstants.GameOptions.OPT_NOSKIPTEXT] = (int)game.Settings.SkipSpeech;
options[NativeConstants.GameOptions.OPT_PORTRAITSIDE] = (int)game.Settings.SpeechPortraitSide;
options[NativeConstants.GameOptions.OPT_SPEECHTYPE] = (int)game.Settings.SpeechStyle;
options[NativeConstants.GameOptions.OPT_SPLITRESOURCES] = game.Settings.SplitResources;
options[NativeConstants.GameOptions.OPT_TWCUSTOM] = game.Settings.TextWindowGUI;
options[NativeConstants.GameOptions.OPT_THOUGHTGUI] = game.Settings.ThoughtGUI;
options[NativeConstants.GameOptions.OPT_TURNTOFACELOC] = (game.Settings.TurnBeforeFacing ? 1 : 0);
options[NativeConstants.GameOptions.OPT_ROTATECHARS] = (game.Settings.TurnBeforeWalking ? 1 : 0);
options[NativeConstants.GameOptions.OPT_NATIVECOORDINATES] = (game.Settings.UseLowResCoordinatesInScript ? 0 : 1);
options[NativeConstants.GameOptions.OPT_WALKONLOOK] = (game.Settings.WalkInLookMode ? 1 : 0);
options[NativeConstants.GameOptions.OPT_DISABLEOFF] = (int)game.Settings.WhenInterfaceDisabled;
options[NativeConstants.GameOptions.OPT_SAFEFILEPATHS] = 1; // always use safe file paths in new games
options[NativeConstants.GameOptions.OPT_DIALOGOPTIONSAPI] = (game.Settings.UseOldCustomDialogOptionsAPI ? -1 : 1);
options[NativeConstants.GameOptions.OPT_BASESCRIPTAPI] = (int)game.Settings.ScriptAPIVersion;
options[NativeConstants.GameOptions.OPT_SCRIPTCOMPATLEV] = (int)game.Settings.ScriptCompatLevel;
options[NativeConstants.GameOptions.OPT_RENDERATSCREENRES] = (int)game.Settings.RenderAtScreenResolution;
options[NativeConstants.GameOptions.OPT_LIPSYNCTEXT] = (game.LipSync.Type == LipSyncType.Text ? 1 : 0);
for (int i = 0; i < options.Length; ++i) // writing only ints, alignment preserved
{
writer.Write(options[i]);
}
for (int i = 0; i < 256; ++i) // writing 256 bytes, alignment preserved
{
if (game.Palette[i].ColourType == PaletteColourType.Background)
{
writer.Write((byte)2); // PAL_BACKGROUND
}
else writer.Write((byte)0); // PAL_GAMEWIDE
}
for (int i = 0; i < 256; ++i) // writing 256*4 bytes, alignment preserved
{
writer.Write((byte)(game.Palette[i].Colour.R / 4));
writer.Write((byte)(game.Palette[i].Colour.G / 4));
writer.Write((byte)(game.Palette[i].Colour.B / 4));
writer.Write((byte)0); // filler
}
writer.Write(game.ViewCount);
writer.Write(game.Characters.Count);
writer.Write(game.PlayerCharacter.ID);
writer.Write(game.Settings.MaximumScore);
writer.Write((short)(game.InventoryItems.Count + 1));
writer.Write(new byte[2]); // alignment padding
writer.Write(game.Dialogs.Count);
writer.Write(0); // numdlgmessage
writer.Write(game.Fonts.Count);
writer.Write((int)game.Settings.ColorDepth);
writer.Write(0); // target_win
writer.Write(game.Settings.DialogOptionsBullet); // aligned so far
writer.Write(game.Settings.InventoryHotspotMarker.Style != InventoryHotspotMarkerStyle.None ?
(short)game.Settings.InventoryHotspotMarker.DotColor : (short)0); // need 2 bytes for alignment
writer.Write((short)game.Settings.InventoryHotspotMarker.CrosshairColor); // aligned again
writer.Write(game.Settings.UniqueID);
writer.Write(game.GUIs.Count);
writer.Write(game.Cursors.Count);
if (game.Settings.LetterboxMode)
{
writer.Write((int)game.Settings.LegacyLetterboxResolution);
}
else
{
writer.Write(NativeConstants.GAME_RESOLUTION_CUSTOM);
writer.Write(game.Settings.CustomResolution.Width);
writer.Write(game.Settings.CustomResolution.Height);
}
writer.Write(game.LipSync.DefaultFrame);
writer.Write(game.Settings.InventoryHotspotMarker.Style == InventoryHotspotMarkerStyle.Sprite ?
game.Settings.InventoryHotspotMarker.Image : 0);
writer.Write(new byte[17 * sizeof(int)]); // reserved; 17 ints, alignment preserved
for (int i = 0; i < 500; ++i) // MAXGLOBALMES; write 500 ints, alignment preserved
{
writer.Write(string.IsNullOrEmpty(game.GlobalMessages[i]) ? 0 : 1);
}
// the rest are ints, alignment is correct
writer.Write(1); // dict != null
writer.Write(0); // globalscript != null
writer.Write(0); // chars != null
writer.Write(1); // compiled_script != null
// no final padding required
}