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

Topics - Crimson Wizard

#301
That became apparent long time ago that developing AGS further becomes difficult while keeping the "luggage" of old functionality, which was mostly kept for running old games and easier project upgrade.
So this is overdue, and we are planning to introduce a "break" in the versions, where the updates are split into two "branches". We currently call these branches "ags3" and "ags4", but these are informal names, and may be given proper names later.

"ags3" is going to be a fully backward compatible version, based on the latest AGS 3.5.0. From now on it will only receive bug fixes, perfomance and utility updates. There will be no new script functions or game features whatsoever.
There's at least one planned update currently, which number will probably be AGS 3.6.0, and its main feature will be change from "Allegro 4" to SDL2 library. AGS used "Allegro 4" for nearly two decades, but it's discontinued, and often not very well suited for the contemporary OSes. As this change comes with new potential problems, there may be lesser updates in the middle (like 3.5.1 etc) when necessary, until SDL2 update works well enough to be officially released.

"ags4" will be a breaking change version, also based on AGS 3.5.0, but having all the deprecated functions cut off. It may also have other things removed, such as certain plugin functions support which are not convenient to keep. This will be the main branch to develop AGS further. It will also be updated to SDL2 library.
It's not known at the moment how it will be developed, there are several priority tasks, but it mostly depends on how much time contributors can spare, so it's too early to talk about any new features.
We do not yet know what number will this version use, but probably we'll skip couple of them to reserve for "ags3" branch, so somewhere in the range of AGS 3.7.0 - 3.9.0.


Related short-term roadmap ticket on github: https://github.com/adventuregamestudio/ags/issues/1121
#302
DOWNLOAD TypedText 0.7.0 (beta version) MODULE PACK
Archive contains modules: TypedText, TypedTextHelper and TypedTextDrawing.
DOWNLOAD Demo Game

Latest source code may be found here
Git cloning address: https://ivan-mogilko@bitbucket.org/ivan-mogilko/ags-script-modules.git
Demo Game git cloning address: https://ivan-mogilko@bitbucket.org/ivan-mogilko/ags-script-demos.git

Module supports AGS 3.2.1 and higher


Introduction

TypedText module provides means for displaying continiously typed text, also known as typewriter style display. Letter appears by letter with certain delay in between.

A while ago I was scripting a typing text animation for a game project; later I found out that there is already Phemar's Typewriter module, but it did not allow the kind of behavior that the project required, so I continued with my own script.
Now I found some free time to rewrite that script in a cleaner way and make an actual script module of it. But I also copied few things from Phemar's module, to make TypedText suitable for the needs of people who used Phemar's module before.

The general peculiarity of this module, and also what makes it different from existing one, is that it is based on a Type (struct), and objects of that type, instead of a Function. This leads to following effects:
1. You can have multiple typed text animations simultaneously.
2. Since objects keep their states in them, you may have both blocking and non-blocking typed texts.
3. Having an object with exposed interface (public functions and properties) make it possible to alter its behavior on fly, as well as override it, and use it to create your own custom typewriters.


Using an object may be more complicated than using a single function, and require time to study it, so I added TypedTextHelper module with number of "helper" functions to make it easier to start using TypedText in your project. Also those functions may be just what you need if standart behavior is enough. This is why I will explain their use before going into detail about TypedText itself.

But first I need to quickly clarify on some concepts.


TypedText concepts

TypedText simulates continious text typing, letter by letter. When doing so it passes several states:

Inactive - this is when it has no text set whatsoever.
Typing text - this is when it is in process of typing text.
Waiting for reader - this is when all text was fully typed and displayed on screen, but settings demand TypedText to wait a little longer to give human an opportunity to finish reading the text.
Idling - this is when typing and waiting is complete, and TypedText is not going to do anything else.

NOTE: Helper functions, such as those that display TypedText on Overlays, rely on "waiting for reader" state to know when typed text should be removed from screen.

TypedText has a concept of the flashing caret. Depending on setup, it may flash last typed letter, or draw certain symbol behind typed text (like '_', for example).
The caret, if enabled, commences to flash whenever delay between two typed letters is greater than caret's waiting timer. This timer resets when next letter is typed. This also means that when all  the text was already typed, caret will then flash endlessly (so long as TypedText is on screen).

Keeping the above in mind, TypedText relies on following parameters:

Typing delay - how many game ticks to wait after each typed letter.
Typing delay style - this concept is copied from Phemar's module, and defines delay behavior for spaces and caret-returns in the text (are they same, slower than usual or faster than usual),
Caret depiction - is the caret is depicted anyway, and how: this may be flashing last letter, or specific string drawn in the end, or even a sprite - for the advanced TypedText implementations.
Caret flash times - how long caret stays on screen and stays hidden when it flashes.
Text reading time - how much time, in game ticks, is spent on reading 1 letter: this parameter is used to calculate average reading time of a text.

Finally, extended variants of TypedText also support sound that is played whenever next letter was typed.


Using TypedTextHelper

TypedTextHelper module requires TypedText module to present above it in the modules list.

It provides a number of functions to run typed text blocking or non-blocking, in a number of ways: on a Button, on a Label, or on an Overlay.

Because TypedText has a significant number of parameters, many of which are supposed to stay same for the most of the time in game, I thought it would be very inconvenient to put all of those parameters into functions. Instead, TypedTextHelper has a special preset system.
This works pretty simple actually: you setup least changing properties as a preset under certain ID, and then use that preset ID when starting typed text on Label, or Overlay; this makes all of that preset's parameters to be used for that instance of text typing.

Following are preset functions you may use:

Code: ags

/// Set general parameters for the specified preset
TypewriterPreset.SetGeneral(int preset, int delay_min, int delay_max, TypedDelayStyle style, int read_time = 12);
/// Set caret parameters for the specified preset
TypewriterPreset.SetCaret(int preset, int flash_on_time, int flash_off_time, TypedCaretStyle style, String caret_str, int caret_sprite = 0);
/// Set sound parameters for the specified preset
TypewriterPreset.SetSounds(int preset, AudioClip *type_sound, AudioClip *caret_sound, AudioClip *end_sound);
TypewriterPreset.SetSoundArray(int preset, AudioClip *type_sounds[], int type_sound_count,
                                 AudioClip *caret_sound, AudioClip *end_sound);


Maximal number of presets is determined with TYPEDTEXTHELPER_MAXPRESETS constant in the module header. It is 8 by default, but you may increase it if you need more.
Maximal number of sounds that you may assign for preset and each typewriter is determined with TYPEDTEXTRENDER_MAXSOUNDS contant.

Best place to set preset's parameters is "game_start" function, but you may change them anytime by using same preset ID.

After you set up at least one preset, you may begin using helper functions. All of them are made as extender functions, which means you first type object (Button, Label, Character) pointer name, then call the function from it, like:

Code: ags

// NOTE: preset is optional, and will be 0 if you don't type anything
/// Print TypedText as a text on button
SomeButton.Typewriter(String text, BlockingStyle bs, int preset = 0);
/// Print TypedText as a text on label
SomeLabel.Typewriter(String text, BlockingStyle bs, int preset = 0);


The only difference is Overlay static extender (static extenders is a new thing since AGS 3.4.0), where you do not use overlay's pointer, but just "Overlay" word:
Code: ags

// NOTE: preset is optional, and will be 0 if you don't type anything
/// Print TypedText as a text on created overlay
Overlay.Typewriter(int x, int y, int color, FontType font, String text, BlockingStyle bs, int preset = 0);

If you are working in pre-3.4.0, you will have to use non-extender function for overlays, called TypewriteOnOverlay, but it works essentially same, and has same parameters (except it is not called from Overlay).


If you run these functions with eBlock, they will display typed text inside of them, and return when typing (and waiting) state has finished.
If you run them with eNoBlock, they will return back immediately, but typed text will work on a background, updated from repeatedly_execute inside the module.

You may run only one blocking typed text at the same time.
Maximal simultaneous non-blocking typed texts is determined by TYPEDTEXTHELPER_MAXTYPEWRITERS constant in the module header. It is 8 by default, but you may increase it if you need more.


Each of those helper functions return unique ID of typewriter. If you want to control that typewriter, such as detect when it stops typing, or be able to cancel it, store this ID in a variable for later. You may then use this ID with TypewriterRunners static functions and properties:

Code: ags

/// Get number of currently running typewriters
int TypewriterRunners.ActiveCount;
/// Get number of maximal supported typewriters that can run simultaneously
int TypewriterRunners.MaxCount;
/// Get whether given typewriter ID is currently running (use unique ID as an array index)
bool TypewriterRunners.IsActive[];
/// Get whether given typewriter ID is blocking (use unique ID as an array index)
bool TypewriterRunners.IsBlocking[];
/// Stop typewriter under given ID
void Cancel(int id);


The principal example:
Code: ags

int tw_id = SomeButton.Typewriter(text, eNoBlock);

<... later ...>

if (TypewriterRunners.IsActive[tw_id])
  TypewriterRunners.Cancel(tw_id); // interrupt typewriter if it was still running



Using TypedText directly

If above helper functions do not do what you like, you may create and use objects of TypedText struct, or any derived structs, directly.

TypedText struct's purpose is to calculate timing and  basic state of the text. It does not draw anything on screen on its own, but calculates and tells how the text should look like at any given moment, letting you to use that information as you see fit. In other words, it tells what is happening, but does not tell you how it should look (and sound) like.


Setting up TypedText is fairly straighforward, here are its configuration properties:
Code: ags

/// Base delay (in ticks) between every typing event
import attribute int              TypeDelay;
/// Bounds for random base delay
import attribute int              TypeDelayMin;
import attribute int              TypeDelayMax;
import attribute TypedDelayStyle  TypeDelayStyle;
/// Time (in ticks) the caret stays shown
import attribute int              CaretFlashOnTime;
/// Time (in ticks) the caret stays hidden
import attribute int              CaretFlashOffTime;
/// Time (in ticks) given to read one text character
import attribute int              TextReadTime;


/// Whitespace/caret-return delay style defines relation of special case
/// delays to the base type delay.
/// Idea is conforming to the Phemar's Typewriter module.
enum TypedDelayStyle
{
  /// wait for the same amount of time as after regular letters
  eTypedDelay_Uniform = 0,
  /// wait twice as long after whitespaces
  eTypedDelay_LongSpace,
  /// wait twice as less after whitespaces
  eTypedDelay_ShortSpace,
  /// randomly choose a style every time
  eTypedDelay_Mixed
};



And its control methods are:
Code: ags
  
/// Gets/sets paused state
import attribute bool             Paused;

/// Clears all text and resets all timers
import void                       Clear();
/// Sets new string, resets all timers and commences typing
import void                       Start(String text);
/// Skips all the remaining typing
import void                       Skip();

/// Update typed text state, advancing it by single tick
import void                       Tick();



Since you are using TypedText yourself, you need to be continiously checking its state in repeating function:
Code: ags

/// Full string that has to be typed
readonly import attribute String  FullString;
/// Part of string that is supposed to be shown at current time
readonly import attribute String  CurrentString;
/// Part of string that was 'typed' during latest update
readonly import attribute String  LastTyped;

/// Tells whether TypedText has active content to process or display
readonly import attribute bool    IsActive;
/// Tells whether TypedText is in process of typing text
/// (return FALSE if either no text is set, or text is already fully typed)
readonly import attribute bool    IsTextBeingTyped;
/// Tells whether TypedText is waiting for the text to be read by player
/// (return FALSE when reading timer has ran out, regardless of other states)
readonly import attribute bool    IsWaitingForReader;
/// Tells whether TypedText is currently idling, either not having a content,
/// or after finishing all the required actions (typing & waiting for reader)
readonly import attribute bool    IsIdle;
/// Tells whether caret should be currently displayed
readonly import attribute bool    IsCaretShown;

/// Gets if the new character was just typed
readonly import attribute bool    EvtCharTyped;
/// Gets if the text has just ended being typed
readonly import attribute bool    EvtFinishedTyping;



One of the simpliest examples for using TypedText is this:
Code: ags

// in GlobalScript.asc
TypedText my_tt;

function game_start()
{
    // Config typed text to your liking
    my_tt.TypeDelay = 4;
    my_tt.CaretFlashOnTime = 4;
    my_tt.CaretFlashOffTime = 4;
}

// Calling TypeSay will start typed text
function TypeSay(string s)
{
    my_tt.Start(s);
}

function repeatedly_execute()
{
    if (my_tt.IsIdle)
    {
        my_tt.Clear(); // clear the text, stop timers ticking, etc
    }
    else if (my_tt.IsActive)
    {
        my_tt.Tick(); // update TT
        String text_to_show = my_tt.CurrentString;
        if (my_tt.IsCaretShown)
            text_to_show = text_to_show.Append("_"); // append caret symbol to the end of the text
        player.Saybackground(text_to_show); // print TT's current text as a player's background speech
    }
}



Using TypewriterRender and its subtypes

There is a number of extended types provided by the module, which add bit more functionality. First is struct TypewriterRender, which extends TypedText, and other structs extend TypewriterRender further.

As was mentioned above, TypedText does not draw anything on its own, only calculates the text's state. TypewriterRender does not do much too, but it adds few more properties and serves rather like a base class for actual visualizing:
Code: ags

/// Caret display style
import attribute TypedCaretStyle CaretStyle;
/// A string (or single character) that represents typewriter caret
import attribute String          CaretString;

/// The only sound to play when a character is typed
import attribute AudioClip *     TypeSound;
/// Array of sounds to choose at random when a character is typed
readonly import attribute AudioClip *TypeSounds[];
/// Number of typing sounds registered
readonly import attribute int    TypeSoundCount;
/// Sound to play when the line break is met
import attribute AudioClip *     CaretSound;
/// Sound to play when the typewriter finished typing text
import attribute AudioClip *     EndSound;

/// Sets the array of sounds to play at random when character is typed
import void                      SetRandomTypeSounds(AudioClip *sounds[], int count);


/// Style of the caret displayed during typing
enum TypedCaretStyle
{
  /// No caret display
  eTypedCaret_None = 0, 
  /// Flash last character
  eTypedCaret_LastChar, 
  /// Draw separate caret at the next assumed character location
  eTypedCaret_Explicit
};



The actual workers are inheriting types: TypewriterButton, TypewriterLabel, TypewriterOverlay. They have respective properties to set up an object they will print text on (or from which perspective), as well as their own overwritten Clear, Start and Tick methods.

Using them you will avoid necessity to draw text yourself:
Code: ags

// in GlobalScript.asc
TypewriterLabel my_tt_label;

function game_start()
{
    my_tt_label.TypeOnLabel = lblTypewriter; // put your actual label's name here
    my_tt_label.TypeDelay = 4;
    my_tt_label.CaretFlashOnTime = 4;
    my_tt_label.CaretFlashOffTime = 4;
    my_tt_label.CaretStyle = eTypedCaret_LastChar; // make last char flash
    my_tt_label.TypeSound = aTypewriterTyping; // set sound to play
}

// Calling TypeOnLabel will start typed text
function TypeOnLabel(string s)
{
    my_tt_label.Start(s);
}

function repeatedly_execute()
{
    if (my_tt_label.IsIdle)
        my_tt_label.Clear(); // remove text when done typing & waiting for the reader
    else if (my_tt_label.IsActive)
        my_tt_label.Tick(); // update text
    // notice that you do not need to point where to print the text anymore,
    // TypewriterLabel already knows that and does printing for you
}



Using TypedTextDrawing

TypedTextDrawing is an advanced struct, extending TypewriterRender, that lets you draw typed text on DrawingSurface. This means you may have typewriter text on literally anything that can give drawing surfaces or have assigned image: room and GUI backgrounds, objects, character frames even (crazy).
Besides, TypedTextDrawing is the only one of the provided types that can draw caret as a sprite.

TypedTextDrawing is located in its own separate module (of same name) and requires TypedText module to work (but not TypedTextHelper).

Setting TypedTextDrawing up is very similar to setting other TypedText subtypes, but you also need to set up its position on DrawingSurface, text color and font, and optionally background color.

What is more important to remember, you must explicitly call Draw function, because you need to pass DrawingSurface pointer to its drawing. It cannot store DrawingSurface once for use later, because that goes against rules of using drawing surfaces (they have to be released right after every use).

Here is some example, that draws typed text on a room's backround
Code: ags

// in GlobalScript.asc
TypedTextDrawing tt_draw;
DynamicSprite *roomBkg; // will keep saved room background

function game_start()
{
    tt_draw.TypeDelay = 4;
    tt_draw.CaretFlashOnTime = 4;
    tt_draw.CaretFlashOffTime = 4;
    tt_draw.CaretStyle = eTypedCaret_Explicit; // draw caret
    tt_draw.CaretSprite = 1010; // put your sprite number here
    tt_draw.TypeSound = aTypewriterTyping; // set sound to play
    
    tt_draw.X = 40;
    tt_draw.Y = 40;
    tt_draw.Width = Room.Width - 80;
    tt_draw.Height = Room.Height - 80;
    tt_draw.Font = eFontText;
    tt_draw.TextAlign = eAlignCentre;
}

function RestoreRoomBkg()
{
    // Restore original room background
    DrawingSurface *ds = Room.GetDrawingSurfaceForBackground();
    ds.DrawImage(0, 0, roomBkg.Graphic);
    ds.Release();
}

// Calling TypeOnDS will start typed text
function TypeOnDS(string s)
{
    if (roomBkg == null)
    {
        roomBkg = DynamicSprite.CreateFromBackground();
    }
    else
    {
        RestoreRoomBkg();
    }
    tt_draw.Start(s);
}

function repeatedly_execute()
{
    if (tt_draw.IsIdle)
    {
        tt_draw.Clear();
        RestoreRoomBkg();
    }
    else if (tt_draw.IsActive)
    {
        tt_draw.Tick(); // update TT
        DrawingSurface *ds = Room.GetDrawingSurfaceForBackground();
        tt_draw.Draw(ds);
        ds.Release();
    }
}





Other script modules by me:
DragDrop module
KeyListener
#303
MISSING SCRIPT PROPERTIES - these are properties that set or get something that is already implemented in the engine, but just does not have means to know its value or change it in script.

Please help gather a list of such properties, grouped by object type. In many cases that would be super-simple to add readonly properties (ones that can tell you certain value). Changeable properties are less easy, because they often require to add values to savegame, but they are also should be mentioned.

NOTE: this relates to only things that are already in AGS, not completely new features.
For example:
* you can set a property in the Editor, but cannot read or set it in script;
* there is a script function that changes object's state, but no way to get what current state is.

Such list will be very useful, because engine contributors get reminded about them only once in a while, and these requests got forgotten in the presence of more critical tasks.
I would like to make a table in the first post, which lists the required properties, and status of their implementation.

PropertyTypeCommentStatus
Button
Animatingbool, readonlyfrom Animate()3.4.1
Frameint, readonlyfrom Animate()3.4.1
Loopint, readonlyfrom Animate()3.4.1
Viewint, readonlyfrom Animate()3.4.1
Character
FollowedCharacterCharacter*readonlyfrom FollowCharacter()
GUI
BackgroundColorint3.5.0
BorderColorint3.5.0
Mouse (alternatively make new static CursorModes struct)
Animating[]bool, readonly
Frame[]bool, readonlycurrent animation frame (if any)
ModeAnimated[]bool, readonly?array property, get/set whether particular cursor is animated
ModeAnimatedOnlyOnHotspots[]bool, readonly?
ModeAnimatedOnlyWhenMoving[]bool, readonly?
ModeView[]intarray propertyget/set VIEW for the mode
ModeHotspotX[]intarray propertyget/set hotspot X for the mode
ModeHotspotY[]intarray propertyget/set hotspot Y for the mode
#304
DOWNLOAD DragDrop 1.1.0 MODULE
DOWNLOAD DragDropCommon 1.1.0 MODULE
DOWNLOAD Demo game (needs AGS 3.2.1 or higher)

Additionally, latest sources of both the script module and the demo game may be found in this repository:
https://github.com/ivan-mogilko/ags-script-modules

Full documentation for this module is now available here:
https://github.com/ivan-mogilko/ags-script-modules/wiki/Drag-&-Drop-module

Module supports AGS 3.2.1 and higher.


DragDrop and DragDropCommon are two modules that make it possible to drag things around in AGS. What is the difference between these two?

DragDrop module implements an abstract drag-and-drop functionality. This means that the module does not drag any actual game object on its own, but rather calculates the dragging and dropping action, and tells you what and how happens, so that you could script the actual object movement. You might say, this module provides an idea of dragging, rather than dragging itself :).

The upside of such approach is that you may script dragging of anything, both standard AGS objects and your own custom things, even non-ordinary pseudo-objects. For example, you may use this module to script dragging a line from point A to B, or draw a rectangle by dragging one of it's corners. The downside is that you have to be ready to do some extra work, and understand scripting well.

When you need to just make normal ordinary game objects dragged around in your game, this is what DragDropCommon module is for. DragDropCommon supports drag-and-drop for Characters, Room Objects, GUIs and GUI controls, and inventory items, right out of the box, only with a minimal setup.

NOTE: DragDropCommon module actually depends on DragDrop module, so you will have to add both to your game if you want to use DragDropCommon.
#305
Editor Development / AGS Build Server
Wed 19/08/2015 09:49:28
UPDATED July 2020

The automated builds may be found here:
https://cirrus-ci.com/github/adventuregamestudio/ags

For latest dev version updates (the "master" branch), in particular:
https://cirrus-ci.com/github/adventuregamestudio/ags/master
#306
Welcome to the AGS Releases forum!

This forum is for announcing the releases of the new versions of AGS.

Currently only moderators can create topics here, but regular users may still post in these topics.

There are few notes on posting here.

DO POST here if:
- you want to clarify something about changes in the new AGS version,
- you are getting troubles when installing or running new AGS version, or
- you are getting troubles when running the game produced with new AGS version.
Spoiler
- you want to express how you feel about new version of AGS. :-D
[close]

NOTE: we also have an Issue Tracker for reporting bugs and suggesting new features; the only caveat is that you need a github account:
Official release issue tracker


DO NOT POST here if:
- you need help creating your game with AGS, scripting or using editor in general; these kind of questions should be posted in Beginners' Technical Questions or Advanced Technical Forum,
- you have suggestion on changing something in AGS (add new feature, improve or change how AGS works), or discuss current development; for this please post in Engine Development or Editor Development forums.
- you have questions on using game template, script module or plugin that was released by someone else; in such case please post in template/module/plugin - related thread. Usually such thread may be found in the Modules & Plugins forum.
- you found bugs in a game made by someone else; in such case you should rather post in the game-related thread (look in Completed Game Announcements) or contact the authors of the game elsewise.


These rules may be updated in future if such need arises.
#307
Pardon me if I missed anything, but has anyone considered to add a sticky topic with a list of open-source game projects for peoples reference?
Just a suggestion, but it may be sticked somewhere in "Completed games" or "Advanced Tech forums" (along with modules, templates and plugins).

There's a wiki page, but it's rarely updated, also not sure if people will guess to look in there first:
http://www.adventuregamestudio.co.uk/wiki/Open_Source_Games

LIST UPDATED 30 June 2023:

* "A Suspicious Date": https://github.com/alkhimey/MAGS-May-19
* "AGS Awards client" (networking code!): https://bitbucket.org/agsa/ags-awards-source/src/master/
* "Aeronuts" (adventure + top-down fighter mini-game): http://shatten.sonores.de/wp-content/uploads/2014/09/AeroNuts_OSS.7z
* "Art of Dying", arcade, distributed with the source: http://www.adventuregamestudio.co.uk/forums/index.php?topic=49687.0
* "Byte of the Draculator II": http://www.vanwijst.com/games/swarm/draculator_source.zip
* "Black Cauldron Remake" distributed with the source (last time I checked): http://www.classic-retro-games.com/Black-Cauldron_118.html
* "Cargo": https://github.com/SpookyFM/Cargo
* "Cart Life", a sim / management game: https://github.com/gondur/cartlife_src
* "Cameras Tech Demo" (technical demo): https://github.com/ivan-mogilko/ags-camdemo
* "Cat Ventures" (uses python scripts for generating Rooms): https://github.com/juanmcasillas/CatVentures
* "Demo Quest", an ancient demo game, uses deprecated script: https://github.com/adventuregamestudio/ags-demo-quest
* "Dungeon Hands" (card game): https://github.com/ericoporto/DungeonHands
* "Eternally Us" distributed with the source: http://www.adventuregamestudio.co.uk/site/games/game/1303/
* "Hell Puppy" (arcade): https://github.com/VacaRoxa/dogfromhell
* "ICBM", a sim-game, distributed with the source:  https://gamejolt.com/games/icbm/57197
* "Last & Furious" (top-down racing): https://github.com/ivan-mogilko/ags-lastfurious
* "Oceanspirit Dennis", a big collection of joke games by various authors: https://www.adventuregamestudio.co.uk/forums/adventure-related-talk-chat/the-oceanspirit-omnibus/
* "Open Quest" (a simple demo game made in 2007): https://www.dropbox.com/s/3g01fjudw71xuld/OpenQuest_AGS.zip?dl=0
* "Read A Book": https://github.com/karjonas/Read-A-Book
* "Rescue Mission": https://github.com/ConeRX/RescueMission
* "Space Pool Alpha": http://www.kweepa.org/step/ags/games/SpacePool.zip
* "The 4th Wall": https://github.com/hewills/the4thwall
* "Three Little Pigs Remediation": https://github.com/KostisMon/Three-Little-Pigies--Remediation
* "Wilfred 2088": https://github.com/hewills/Wilfred-2088


Also for the record:
Spoiler
#308
As many of you should know, we have a number of AGS ports now that let run AGS games on other platforms (linux, etc). Plugins remain a problem, because they were written as Windows dynamic libraries. JJS already rewrote couple of plugins, and Calin disclosed his AGSBlend and SpriteFont plugins, so that their code could be used to compile plugins for other systems too.

Are there anyone else who would like to disclose his/her plugin source to let the games, which used them, become fully portable? Perhaps someone may contact plugin authors that did not visit forums for a while?
Could there be a reason to not to disclose plugin source?

Additionally, I want to mention, that maybe it could be a good idea to state a rule, that AGS plugin should be made open source from the start (NOTE: "open-source" does not mean "free to use")? Aside from portability, this would also ensure that no one will put something unexpected, like malicious code in there.
SMF spam blocked by CleanTalk