Menu

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.

Show posts Menu

Messages - Crimson Wizard

#2661
Hmm, i tried 3.5.1.21 and breakpoints work for me.

Does anyone else have similar problems?

I will test on Windows 10. EDIT: works on win10 too.
#2662
For dynamic arrays you'd have to store the length in the variable, so you'd have
Code: ags

int num_countries;
Country countries[];



Alternatively, there's a trick where you store the array length in the first element. This will make it possible to pass dynamic array to another function or return from function, without having to pass its length in a separate variable. The downside is that you have to remember that the first element is not a real item, so don't assign anything meaningful to it and skip it whenever you loop through array.
#2663
Which function and do you place the breakpoint in, and which line of code?
Are you sure that function is run at all?
#2664
CreateOverlay is a static method (called from the type, rather than the particular object) that returns overlay object. You must save that object in a variable:

Code: ags

myOverlay = Overlay.CreateGraphical(100, 100, 6);
#2665
You do the export/import wrong.
https://adventuregamestudio.github.io/ags-manual/ImportingFunctionsAndVariables.html#exporting-and-importing-a-variable

In MyVars.ash you should have:
Code: ags

struct RoomCoordXY{
  int x;
  int y;
  String charDirection;
};

import RoomCoordXY EntranceRoom;


In the MyVars.asc you should have:
Code: ags

RoomCoordXY EntranceRoom;
export EntranceRoom;

#2666
There's a manual entry on structs, with examples:
https://adventuregamestudio.github.io/ags-manual/ScriptKeywords.html#struct

Some of the game templates must have structs too, although they often use "attributes", which is a more advanced thing that you might not need at this point.

The structs are declared as
Code: ags

struct Backyard {
   bool IsEmpty;
}


This is just a struct's description, it's not an actual object containing data yet.

Declaring an object of such struct is:
Code: ags

Backyard backyard; // here you declare a variable "backyard" of type Backyard.


You need to put this object inside some script, and then declare an export of this object nearby, and also import of this object in the script's header for other scripts to see.
Just in case, how to share variables between scripts:
https://adventuregamestudio.github.io/ags-manual/ImportingFunctionsAndVariables.html



There's are two limitations in AGS currently:
You cannot put default values when declaring struct, because in AGS script there are no "constructors". All the variables will be zero/false at the start.
If you want to set up starting values, for single global object you may do that in game_start function, for structs in rooms you may do this in "room load" event.
Another problem is that you cannot put structs inside structs. There's a new advanced script compiler in the upcoming experimental version that allows that, but it's not formally released yet.

#2667
@SpeechCenter, Hello.

We found that SpeechCenter uses some of the AGS.Types classes and their methods directly, not through the interfaces. This makes it easy to break this plugin's integration, as the AGS developers are not aware if changing certain classes or methods will affect this plugin's work.

To give an example, recent changes to Script.SaveToDisk() parameter list has broken saving the script document from this plugin.

It will be nice to discuss this somehow, and see if we can move necessary methods to interfaces.
#2668
There's a build with the property list fixed, and also couple of more unrelated fixes:
https://cirrus-ci.com/task/4682187336318976
#2669
Quote from: Indra Anagram on Sun 04/09/2022 14:22:08
I finally tested AGS 3.5.1.21 Patch 14 on the XP computer. I replaced the original acwin.exe with the file that you provided. When I tried to run Editor, the error showed up: "G:\AGS\AGS-3.5.1.21-P14\AGSEditor.exe is not Win32 application".

What should I do to make 3.5.1 work on XP?

I was not certain if you were planning to make games on Windows XP; for some reason I thought the question was to run games on Windows XP.

In another message you mentioned that "I'm working under Windows7". So are you making games on Win7 or WinXP?

If you will make a game on Win7 using provided acwin.exe (xp compatible), then these games will run on any windows starting with win xp. You don't have to be on XP to make games for it.

Quote from: Indra Anagram on Sun 04/09/2022 14:22:08
I am sorry, just don't get it: should I place the acwin.exe for 3.5.1 to the AGS directory with the older Editor version (say, 3.4.1) to make it all work?

You might try, although I don't see much sense in that. Firstly, there is no guarantee that the test mode works correctly (when running the game from the editor), because old editor may not attach to the new engine well. Also, you won't have easy access to any new script functions (there is a workaround for that, but I'd leave that as the last resort).
#2670
Beginners' Technical Questions / Re: ID's
Sun 04/09/2022 02:18:35
Above script works, but is overcomplicated. You seem to already know that "cScientist3" exists, but extract its ID. Instead you may use these pointers to address the object for all the purposes.

The "character[]" array, in fact, contains exactly same pointers, including "cScientist3".

So, in your case, you may do it as:
Code: ags

function member_select(Character *c, int set_portrait_gfx)
{
    //gPlayer.BackgroundGraphic = set_portrait_gfx;
    c.SetAsPlayer();
    //targetCharacter = player;
}


And call this function like:
Code: ags

member_select(cScientist3, 2144);


The only reason to use numeric IDs and take objects from array is when you don't have a pointer ready, or don't know which pointer to use, but have a number stored somewhere, and want to get an object using that number. For example, you could have saved a character's ID into a file, and read it back. Then of course you will have to get object as "Character *c = character[some_id];". But when you already know which object to use, there's little reason to not pass it as a pointer and use directly.
#2671
Quote from: eri0o on Sat 03/09/2022 21:11:27
While I have some idea how this would work on the Editor side, I don't have much idea how this works in the engine. Perhaps I need some reverse map to be able to check whenever an input event happens if I need to trigger some script event. Also this may need a script API in case someone wants to remap buttons on runtime.

I'd like to add a important note, that I'd very much like to aim the concept where everything should be createable in script (as mentioned in the preliminary concept draft written a while ago).

In this concept the script methods have a priority, and Editor acts rather as a frontend for generating the starting state of the game.

Therefore ideally you should be able to create, delete and configure these Actions right in script too. Perhaps even think about the script API first, and then figure out how to configure them using Editor interface.

EDIT: if something cannot be done right in script yet, then of course some workaround may be used for objects created in script. For example, if there won't be a feature of connecting event handlers in script done yet (#1409), then the script-born Action could trigger a default function with predefined name (like on_action).
#2672
Quote from: js on Sat 03/09/2022 16:21:27
I was annoyed to put ID of item for doing comparisons in script.
The ID is error prone, it could change, etc.

Usually you don't have to use numeric IDs at all for comparison, you can use script names for that. These are names like iCup etc. For each item you create in game there's a automatically generated pointer variable of same name, that may be used for comparisons or for accessing that item.

For example, if you have inventory items with script names iCup and iKey, then you can do:
Code: ags

if (player.ActiveInventory == iCup) {
    // do something
} else if (player.ActiveInventory == iKey) {
    // do something else
}


Even if you must use a numeric ID somewhere, you can access the ID property from the same pointer variable instead of typing the number itself, for example:
Code: ags

int item_id = iCup.ID;



Quote from: js on Sat 03/09/2022 16:21:27
Is there an include_file() function or something like that ?

No, AGS script compiler does not support that at the moment, but if still necessary, you could create a dummy script at the top of the list, and then print your results right into the script's header file perhaps.
#2673
So, apparently this only happens if you have some Color Theme enabled; does not happen with default theme.
#2674
There's event eEventEnterRoomAfterFadein added in 3.6.0 beta.
#2675
Okay, I reuploaded the fixed build again (same links).
#2676
I made a typo, and it became Shift + Enter
#2677
Updated to Beta 15
(use download links in the first post)

Editor:
- "Attach game data to exe" setting's default value is now "false". This is to encourage users to have separate exe and data. Binding data to exe may cause troubles, for instance anti-viruses do not like AGS games because of this.
- The TextWindow edges now have distinct names in the dropdown list of the property grid.
- Fixed in dialogs numbers inside names were incorrectly highlighted as numeric values.
- Fixed error in dialog scripts occurring when the digit is a part of a character name.
- Fixed in dialogs character's script name on a regular script line was styled like a character's dialog name.

Script API:
- Added Mouse.AutoLock property that toggles automatic mouse lock inside the game window.

Engine:
- Fixed pressing '`' key for showing console did not work if the "new key handling mode" was enabled.
- Fixed calling System.Log in script would cause previous log messages overwritten in the game console.
- Fixed Ctrl+Alt was not working for toggling mouse lock.




I think this may be the last Beta update. There are couple of minor things that are currently missing, like some Android config options are not doing anything anymore (perhaps they may be hidden temporarily). If no serious problems are found soon, I'll make this a "Release Candidate" version.

There are 2 known missing functionalities, but these are not often used, and at the same time difficult to fix because they depend on libraries. So, in my opinion, we may leave them for the future patches.
These functionalities are:
1) AudioChannel.Position and Seek are not working for MIDI and MOD clips. These are clip type specific commands that allow to position playback not by time but by beat/pattern. PositionMs and SeekMs are working though.
2) AVI videos were discontinued, because they were using Windows-only system feature to play. Today it's recommended to use OGV videos with AGS anyway.
#2678
There's only AudioChannel.Speed, if that's what you mean; if you mean changing pitch alone - that is not supported at the moment.
#2679
AGS 3.5.1 - Patch 14
Full release number: 3.5.1.21


For Editor
Spoiler

For Android
Spoiler

For Engine/Editor developers
Spoiler

Released: 1st September 2022

Previous stable version: AGS 3.5.0 P10 forum thread


This release is brought to you by:

- Alan v. Drake
- Crimson Wizard
- eri0o
- fernewelten (fixes)
- James Duong (implemented "--console-attach" option for Windows)
- Morgan Willcock
- Nick Sonneveld
- rofl0r
- Pablo Navarro (fixes)
- Thierry Crozat (bug fixing)
- vga256 (bug fixing)



Summary

3.5.1 is a minor update after 3.5.0, which contains mostly utility additions, fixes and perfomance improvements.

Changes in the Patch 14:

Editor:
- Do not error when compiling a 256 colors game if Direct3D or OpenGL are selected as a default graphics driver (display a warning instead).
- Fixed crash when trying to import pre-2.60 game projects.


Changes in the Patch 13:

Engine:
- Fixed room object does not update its texture if it had a dynamic sprite assigned to it, and that sprite was unassigned, modified or recreated with same ID, and then reassigned again, - all within the same game frame.
- Fixed normal font renderer is not reinitialized correctly in the engine if a plugin uses IAGSEngine::ReplaceFontRenderer(), passing original renderer's pointer (which it received from the previous ReplaceFontRenderer call).


Changes in the Patch 12:

Engine:
- Fixed GUI textual controls don't redraw when the game translation changes until player clicks on GUI (regression since previous 3.5.1 updates).
- Fixed multitasking mode persisting if the game was switched from windowed to fullscreen mode (even though it's not supposed to work in fullscreen).


Changes in the Patch 11:

Editor:
- Fixed batch sprite export with "Set exported file as sprite source" option was assigning new source paths without file extension.

Engine:
- Perfomance fix: GUIs changing Transparency or Visible state should not redraw their surface.

Compatibility:
- Allow AudioClip.Play to to place clips on a crossfade channel, which is normally unaccessible from script. This prevents errors in some games that relied on this behavior.


Changes in the Patch 10:

Engine:
- Fixed crash when visible viewport does not have any linked camera.
- Fixed ListBox.FillSaveGameList() may include save slots with negative slot number (e.g. when the save file has "*.-01" extension).
- Fixed potential crash after failed RunAGSGame() call.
- Fixed search for the game data by GUID when restoring a save belonging to another game;
  this was implemented in 3.5.1, but appeared to not work correctly.


Changes in the Patch 9:

Editor:
- Removed restriction on max dialog topics in the project. The dialog limit in the engine was removed in 3.4.1, but remained in the Editor by oversight.
- Fixed Audio Clip items in the project tree not displaying their IDs right after being renamed.

Compiler:
- Fixed crash occuring when compiler tries to report "Already referenced name as import" error.

Engine:
- Added "--translation" and "--no-translation" command-line arguments.


Changes in the Patch 8:

Engine:
- Clearer error messages for Get/SetProperty functions.
- Fixed PlayFlic() command fails to start the video (regression in 3.5.1).
- Fixed DrawingSurface.DrawSurface() not applying transparency parameter correctly if the drawn surface has alpha channel.
- Fixed OVERHOTSPOT is not updated immediately when character's name changes while cursor is above that character.

Templates:
- In BASS template fixed right click not dropping currently selected item if cursor was hovering over another item.


Changes in the Patch 7:

Editor:
- Added "Layout -> Reset to Defaults" menu command.
- Editor will now reset panel layout to default state if loading layout fail for any reason.
- Default config is now saved also when the game is run in debug mode (F5). This ensures that the test run is using the latest Default Setup, if the user's config has not been created yet.
- Editor will now display an error if user tried to reserve too many channels for audio types.
- Fixed Editor failing to start if user preferences file is corrupted.
- Fixed "Use old-style custom dialog options API" was not set when importing pre-3.4.0 projects.
- Fixed comboboxes' drop-down arrows were not painted with the right color from a color theme.

Engine:
- Fixed program crash occuring if the game reserved too many channels for audio types.
- Fixed potential crash occuring when player loads a save made in a multi-frame room, but the room was since edited and no longer has as many frames.
- Fixed character may have incorrect Frame (property) values while turning.


Changes in the Patch 6:

Editor:
- Added line numbers in the dialog script editor.
- Fixed Dialog script loosing changes if the pane is closed or redocked.
- Fixed controls arrangement on the Dialog pane getting broken when it's redocked.

Engine:
- Fixed filepaths in scripts that have backslashes ('\') fail on non-Windows systems.
  All the (script) File functions will now convert backslashes in filepaths into forward slashes for compatibility.
- Fixed engine was still creating standard directories for game saves and data, even if user provided the custom paths for these.
- Fixed TextBox control crashing the game if it's empty and player presses Backspace.
- Fixed controls on a fully transparent GUI were not interactive (this is an original AGS behavior, which was unintentionally changed in 3.5.0 by mistake).

Compatibility:
- When running 3.5.0 games, treat fully transparent GUI as non-interactable.
  In AGS transparent GUIs may be still interacted with, but 3.5.0 introduced an unintentional (and undocumented) change to this, which was reverted in 3.5.1.

Android:
- Support global engine's config file when the game is run from the Launcher: it's located in the AGS games' parent directory, same place where android.cfg is.

WinSetup:
- Added "Custom game shared data path" to complement "Custom save path" option.


Changes in the Patch 5:

Contained no changes and was a formal re-release with only fixed program build instructions for Linux.


Changes in the Patch 4:

Editor:
- Fixed swapping of inventory item's numeric ID could lead to errors.
- Fixed crash when importing pre-3.* games with multiple script modules.
- Renamed "Enforce object-based scripting" setting to "Enforce post-2.62 scripting". This is for clarity.

Compiler:
- Fixed potential memory corruption when user script reaches max nested if/else blocks.

Engine:
- Also tell module name and approximate source line when reporting script import errors for the variables and local functions.


Changes in the Patch 3:

Editor:
- Fixed sprite file over 2 GB could not be loaded (regression since the last patch).

Engine:
- Further improvement to GUI perfomance: don't redraw GUI when the mouse cursor is hovering over or interacting with controls not leading to an actual visual change.
- Fixed ListBox items could become unaccessible if its font or height is changed leading to a disabled scrollbar.


Changes in the Patch 2:

Engine:
- Fixed speech lipsync getting disabled after loading another game with RunAGSGame().
- Fixed MOD/XM clips fail to play (regression).
- Fixed certain OGV videos fail to play (regression).
- Fixed software renderer was not updating game screen correctly when running a game with legacy "letterboxed" feature (regression).


Changes in the Patch 1:

Editor:
- Fixed script compiler sometimes was not specifying actual Dialog number when reporting errors in the dialog scripts.

Engine:
- Fixed Game.TranslationFilename always returning empty string (regression).
- Fixed GUI controls which were toggled from disabled to enabled state not responding to the mouse clicks until the mouse is moved (regression).
- Fixed OpenGL did not apply a Linear filter when "Render sprites in screen resolution" option is off.


What is new in 3.5.1

Editor:
- Added "Attach game data to exe" option to General Settings. This lets you to package game data separately from the game.exe (only important on Windows at the moment).
- Deprecated "Limit display mode to 16-bit" property in Runtime Setup as it's no longer used by the engine.
- Display aspect ratio in game resolution dialog.
- Implemented classic Color Picker dialog for the Color type values in the property grid, instead of the default one which does not allow user-defined colors.
- Improved tab switching performance for script windows.
- Editor will now enforce full game rebuild after upgrading an older project, this ensures that all scripts are recompiled with the new version rules.
- Fixed room lists in property editor were not updated after room number is changed.
- Fixed importing pre-3.* projects broken by incorrect assignment of "Game file name" property.
- Fixed importing Characters and GUI without sprites still created empty sprite folders.
- Fixed crash when exporting/importing Characters with no Normal View.
- Fixed translation compiler did not correctly save some of the escaped sequences, such as "\n".

Scripting:
- Implemented correct parsing of a "const string" function return type.
- Fixed implementing imported functions was forbidden in the room scripts.

Script API:
- Added GUI.Shown readonly property that tells whether GUI is active on screen. This is primarily for GUIs with "Popup At Y" style, because they hide themselves regardless of Visible property. Note that since 3.5.0 GUI.Visible only tells a script-set value.
- File.Open() now supports $CONFIGFILE$ tag which will try to open user config file for reading or writing regardless of where config is located on disk.
- Added System.SaveConfigToFile() which writes current engine settings to the user config file. Only the options that can be changed at runtime are written back at the moment.
- GetTranslation() now returns "const string" (was "string"). This is to prevent modifying returned string using old-style string functions, such as StrCat(), as this string may be allocated in the internal engine memory for its own use.

Engine:
- Support loading audio and video from data packages larger than 2 GB.
- Improved game data loading times by introducing buffered file stream. Initial tests showed 3-4 times faster file reading.
- Improved game perfomance by not reupdating all of the GUIs each time anything changes, instead only affected GUI will be updated each time.
- Some improvement to general script perfomance.
- Some improvement to script Dictionary and Set types perfomance.
- Room Object's Graphic property now can be assigned a sprite with index over 32767 and up to 65535. This restriction is due to internal data format, which cannot be fully fixed without breaking compatibility with plugin API. This may still be worked around by assigning a View, as View's frames may contain sprites of any index available.
- Similarily, Object's View, Loop and Frame can now be assigned a value over 32767 and up to 65535; not that this was ever an issue...
- Removed arbitrary limit of 1000000 dynamic array elements (now supports over 2 billion).
- Dialogs with no enabled options left will be now stopped, instead of raising script error.
- Engine will not longer quit the game when failing to write a save, but simply display an error on screen (...why this was a thing in the first place?!).
- When restoring a save engine will now try to match game pack by GUID rather than using exe/pack name. This resolves potential problems when game package may have different name in distribution to another system. Also makes saves in multi-game collections more reliable.
- In Debug game mode allow to toggle infinite FPS mode (prior it could not be turned off).
- Expanded text parser error messages for easier debugging.
- Adjusted all the command-line options to have consistent prefix convention, where all full-name options must be preceded by double-dash, and one-letter options by single dash.
- Added "--localuserconf" command and similar global config option which tells engine to read and write user config in the game's directory rather than using standard platform path. Game dir must be writeable for this to work.
- Added "--conf" command which forces engine to read only explicit config file on startup.
- Added "--user-data-dir" and "--shared-data-dir" commands for setting save game directory and shared app data directory from command line (this corresponds to existing options in config).
- Fully configurable log output (in both game config and command line) allows to set up which message types and groups are printed by which output methods (sinks), including: file, system console, in-game console. "warnings.log" is now created only if file log was not requested by user.
- Added "--log-" set of command line options for setting up log output.
- Added "--tell-filepath" option for printing known engine's and game's file locations.
- Added "--tell-gameproperties" option for printing some of the game's general settings.
More information on log config and --tell commands currently may be found in following text file: OPTIONS.md
This has to be added to the manual eventually.
- Support proper lookup for Allegro 4 library resources (such as its own config and digital MIDI patches) in the game directory.
- Engine will no longer precreate directories for common files: saves, user config, shared files and so forth, - before actually having to write these. This ensures that no new directories are created on your disk without actual need. Also this fixed a problem that could happen if someone deleted e.g. a game's save directory while game was running.
- Fixed running game from another directory by passing its relative filename as command-line argument: in this case engine was incorrectly using its own directory to search for external game data, opening files for reading by script command, and so on.
- Fixed some of the engine's own hotkeys (such windowed/fullscreen mode toggle) not working during certain skippable game states.
- Fixed overlay was set to wrong position if it were using TextWindow gui and either its text or X, Y properties got changed.
- Fixed crash occuring when the speech is using text window gui with zero Padding and the speech text is an empty line.
- Fixed characters and room objects were not updating their looks if their current graphic was a Dynamic Sprite, and that sprite was modified with ChangeCanvasSize, CopyTransparencyMask, Crop, Flip, Resize, Rotate or Tint function.
- Fixed Views' frames keeping reference to deleted Dynamic Sprites causing crashes. Now they will be reset to dummy sprite 0 for safety.
- Fixed engine crash when button's graphic is set to sprite out of range.
- Fixed animated cursor's normal graphic reappearing in between animation frames if mouse mode is being repeatedly reassigned, for example in rep-exec script.
- Fixed certain interactions did not work with GUI if it was made fully transparent.
- Fixed ListBox.FillSaveGameList() search pattern, it included files which contain save filename pattern but do not exactly match; for example: "agssave.001_".
- Fixed engine was ignoring audio files in game directory when running games which use old audio system.
- Fixed crash in Direct3D and OpenGL renderers that occured if game uses a plugin that performs software drawing on screen, and one of the rooms is smaller than the game's resolution.
- Fixed Direct3D was assigning wrong fullscreen refresh rate sometimes, slowing alt-tabbing.
- Fixed "--test" mode was lost upon restoring a save.

Engine Plugin API:
- Added IAGSEngine::GetRenderStageDesc() function which returns current render stage parameters. As of this version these parameters include 3 transformation matrixes, allowing any 3D render plugin to stay compliant to engine's scene rendering.

Compatibility:
- Fixed engine was trying to read unnecessary data when loading pre-2.72 games.
- Fixed "upscale" mode for old games (was broken in 3.5.0). Also engine will now try to detect if "upscale" mode wanted by reading old config options (if they are present).
- Fixed GUI.Visible not returning expected values for GUIs with "Popup At Y" style in pre-3.5.0 games, breaking some older games logic.
- Fixed potential buffer overflow when reading pre-3.1.0 games with old dialog script texts.
- Fixed engine was applying player's position too early when ChangeRoom was called for 2.72 and earlier games, which could result in wrong placement in the new room if the character was walking right before the transition.

Android:
- Corrected game scanning in AGS launcher, now it will work consistently with the desktop ports, and detect any compatible game data files named "*.ags" or "*.exe".

OSX:
- When looking for game files engine will no longer use hardcoded filename, will search for any compatible pack file instead.

Windows:
- Windows version of the engine now reads global configuration file. It is looked up in "%USERPROFILE%/Saved Games/Adventure Game Studio/acsetup.cfg"
- Default log file location is now also in "%USERPROFILE%/Saved Games/Adventure Game Studio".
- Added "--no-message-box" command line option to hide message boxes when alerts are raised. These messages will be still printed to log (if one is enabled).
- Added "--console-attach" command line option to try attach to the parent process's console. This is useful if you run game from command line and want to see engine's log in the console.

WinSetup:
- Fixed changing fullscreen mode from "use current desktop" to explicit resolution on save.







Thanks to everyone who contributed to and tested this version!



#2680
Quote from: multi007 on Tue 30/08/2022 18:32:01
Reading the tutoring, If there is a problem with 256 color pallet on some D3d or OpenGL graphic drivers, why wouldn't people just use the 32 bit and only use up to 256 colors, instead of using the 256 color pallet.  In other words, am I missing something with the desire for some people to use the 256 color pallet?

Today barely anyone uses true 256-colored mode, I heard some people use 32-bit but restrict themselves to a number of colors, emulating "old school" looks.

The two possible benefits of a true palette mode are:
- smaller game size and memory requirements;
- palette effects: that is when you modify palette at runtime, which results in all the graphics changing their colors without any additional operation. In the modern world this is achievable using shaders (although AGS currently does not let custom shaders).

Quote from: multi007 on Tue 30/08/2022 18:32:01
With regards to game resolution - Does AGS engine allow for in-game resolution changes?  meaning, if I set for 640 x 480, but someone's native resolution is 1040 x760 - their game window will look much smaller.

AGS distincts native game resolution (e.g. 640x480) which defines how much game pixels do you see at once, and display resolution (e.g. 1920x1080) meaning the size of the window that game is scaled to.
The native resolution is set once in the General Settings, and rarely changed, unless you want to remake your game graphics.
The display resolution may be changed anytime in game setup, by both game developer and players.
SMF spam blocked by CleanTalk