2.1 alpha 9 (2616) - Fixed: Regression: after updating investigators to use the pluralizer system, an investigator's starting clues are pluralized incorrectly when they start on an unstable location. - Fixed: Minor corrections/updates to the About dialog text. - Fixed: invisible preferences under Shoggoth theme. - Fixed: menu accelerators may fail to work because the enable/disable state may be out of date. A common case is opening a new code editor but finding that, say, Ctrl+S doesn't work until it is activated using the menu item at least once. - Fixed: possible NPE in CatalogID.compareDates when opening a catalogue with a missing id entry. - Fixed: renamed project files should be re-selected. - Fixed: when a folder is renamed, open editors of files that are children of the folder should have their save location updated to match the new parent folder. - Fixed: after jumping to a location in a code editor which has not previously been displayed, the starting state for some lines may be incorrect if they depend on the state of a previous line and the previous line has not been displayed. The most common case is that a multiline comment is not shown as a comment until the first line of the comment has appeared in the window. - Fixed: missing image results are cached, but installing a missing core could make the image available later. - Fixed: due to conflicting key names, New | Automation Script shows as New | Blank Script. - Fixed: Regression: Case Book Editor: double clicking on {#labels} in the preview view no longer searches for the label. - Fixed: Case Book Editor: after a successful search, event tree should scroll to ensure match is visible. - Fixed: Unable to create a deck/board after choosing to hide Arkham Horror components. - Incorporated the latest updates to the fr/fr_CA localizations by Marc Bélanger. - Incorporated es game text updates for BGotW by M.A.G. Espinosa. - Added StrangeEonsEditor[] getEditorsShowingFile( File f ) to StrangeEonsApplication. This has been implemented for a while, but I missed adding it to the interface. - Added a constructor for code editors that automatically chooses initial settings based on a content type: arkham.CodeEditor( File file, int codeType ) throws IOException (where codeType is one of the type values defined in CodeEditor: currently one of TYPE_PLAIN, TYPE_JAVASCRIPT, TYPE_JAVA, TYPE_PROPERTIES, TYPE_SETTINGS, TYPE_HTML, TYPE_UTF8, TYPE_CLASS_MAP, TYPE_SILHOUETTES, TYPE_TILES, TYPE_CSS). - Added syntax highlighting for regular expression literals to JavaScript tokenizer. - Added CodeEditor.Navigator implementation for property/setting files. - Added CodeEditor.Navigator implementation for JavaScript files. It isn't very good because it uses regular expressions instead of a lexer, but it is better than nothing when editing large scripts. - Added CodeEditor.Navigator implementation for HTML files. - Added support for icons to CodeEditor.Navigator and a set of standard icons (but custom icons can be used as well). - Minor usability improvements to automatic update system. - Added a preview panel to the file chooser for game components similar to the one for image files, and improved preview panel look and feel. - CodeEditors implement the ScriptEditor interface (see below), allowing you to add new editing commands and modify editor content. - Added the ability to register "games" and to associate an expansion with a particular game. The private setting "game" on a component is used to store the code of the game the component belongs to, if applicable and known. The built-in components have all been upgraded so that they are associated with Arkham Horror (code AH), with the exception of the Marker/Token component, DIY components, and decks, which are not associated with any game by default. The relevant GameData method signatures are: public static void registerGame( String code, String gameName ) public static String[] getRegisteredGames() public static String getGameName( String code ) public static void setGameForExpansion( String expansionCode, String gameCode ) public static String getGameForExpansion( String expansionCode ) The NX (base game/no expansion) and XX (generic custom expansion) codes are not associated with any game. The other built-in expansions are associated with Arkham Horror. - The Edit | Expansion Symbol menu makes use of registered game information to decide which expansions are applicable. The following rules are used: 1. If an expansion is not associated with a game, then it is always available. 2. If the current game component is not associated with a game by having its "game" private setting set, then all registered expansions will be available. 3. If the game component is associated with a game, then expansions that are not associated with the same game are not available (except for those covered by Rule #1). This only affects the expansions available from the menu. If desired, any expansion desired can be manually set on a card by patching the appropriate private setting. NOTE: If you have written a plug-in for a game other than Arkham Horror, and for some reason you do not wish to use the standard expansion icon system, it is still recommended that you register your game and associate new components with that game. This will prevent the standard Arkham Horror expansion icons from being shown as available for components created with your plug-in. See the Talisman DIY example for an example of how to do this (just leave out the lines that register expansion icons). - Added The Lurker at the Threshold as a new selectable Arkham Horror expansion, but it currently uses the default custom symbol. - Updated the case book editor layout to work better with the Nimbus look and feel. (TRANSLATORS: Several "cbe-*" strings were changed as a result.) - Updated the deck editor layout to work better with the Nimbus look and feel. Plug-in Authoring Kit - The Talisman DIY example has been updated to include code that registers Talisman as a game, marks the expansions that it registers as Talisman-specific, and sets the game for the cards it creates to Talisman. - A new DIY example has been added that demonstrates how to achieve some drawing effects, such as layer opacity, rotation, applying textures to an image, and using various filters. At a high level, the example defines several useful functions that can be copied and pasted into your own code. The lower-level code invoked by those functions demonstrates how to set up and use composites, convolutions, temporary images, affine transforms, and some of the image filters that are built into Strange Eons. 2.1 alpha 8 (2607) Web Site News Strange Eons now has a permanent home at . The old SFU address will redirect to the new site and should continue to work for the next several months, but if you link to the site it would be a good idea to update your URLs now. The new site has made the plug-in catalogue system possible, and I expect there will be lots of other interesting things ahead. In the meantime, I've updated several tutorials to work in the new project system and add demo videos, and added a few new entries to Miriam's collection. Mailing List News The latest version of SE supports automatic update checks (disabled by default). When a new version appears, the same release notes that are published to the list will also be available through the update system. I will send a mailing out for at least the next couple of updates to ensure that the kinks get worked out of the automatic processes. After that, I'll have to evaluate whether there is still enough interest in the list to use both channels. - Fixed: Create in Project may be disabled when using project's New | Game Component option. - Fixed: Edit | Clear no longer resets a component's file name to unsaved as this makes it much more difficult to work with newly added components in a project. - Fixed: when a project folder changes during synchronization, it will reexpand itself in the project view if it was expanded before the synch began; this means that, for example, when you rename a file in a folder the folder doesn't close (collpase). - Fixed: Autoupdate has been fixed. A bug in file name composition prevented the plug-in installer from creating .autoupdate files. (These are used when a bundle file is in use and can't be overwritten; .autoupdate files are automatically installed on the next run of the application.) - Fixed: documentation for PluginContext.compareMicroversions, which had the return values reversed. Basically, it returns a value that "points towards" the newest version. - Fixed: a newly created project should be added immediately to the recent file menu. - Fixed: first two entries in expansion symbol menu not disabled when appropriate. - Fixed: for some reason the insert chars dialog never had an initial position set so it always appeared at (0,0). - Fixed: missing bitmask in invert filter could produce funky effects in automatically inversed expansion symbols. - If all of the plug-ins in a bundle are uninstalled, then the plug- in bundle will be deleted. This usually can't be done while the JVM is running because the bundle is integrated into the classpath, so it is done on the next run. - Plug-in bundles now support both a Zip and a new solid BZip2 archive format. The BZip2 bundles are a solid BZip2 stream of the uncompressed Zip archive of the bundle contents (along with some magic numbers at the start). BZip2 bundles are typically significantly smaller than the compressed Zip equivalent, but BZip2 compression is much slower. Remember that any bundle that you distribute in this format effectively requires SE 2.1 alpha 8 or newer to use, so don't use this bundle format if you want your plug- in to work on older versions of SE. The easy way to create a BZip2 bundle interactively is to install the Catalogue Tools plug-in, create a project that includes your plug-in, use the "Make Bundle" action, and then right click on the bundle and choose the "Wrap BZip2" action. - Plug-in Catalogues: Supports automated installation of versioned plug-in bundles over a network connection. - A set of core libraries has been split off from the main application and made into .selibrary bundles. They contain mainly image resources used by different sets of component types. These are downloaded "just in time" when the relevant component is created. This will reduce the download size of the application on future updates as core libraries will only need to be updated rarely. This is another small step towards making SE "game neutral". It is unlikely that SE will ever be completely Arkham-free, but at least players of other games don't have to download all of the AH card graphics over and over with every update. - Plug-in Root Editor: Catalogue ID editing support; note that setting an ID here does not update catalogues that refer to the plug- in. - The $-notation for scripts has been extended. If you start a variable name with a double $, then instead of getting the value of the key as a string you will get a "live setting" object. This object has properties that match the public static parsing methods of the Settings class that will return the setting value in that form. For example: $$my_key_name.region, $$my_key_name.colour, etc. $$ variables cannot be assigned to (trying results in an UnsupportedOperationException being thrown). Currently you cannot assign values using, e.g., $$my_key_name.integer = x, although this may change in the future. In addition to the parsing methods in Settings, there is also .value and .string (the value as a string), .boolean (the value as a boolean, equivalent to .yesNo), .key (return the key name as a string), and .settings (return the Settings instance used by this live setting). The value used by a live setting for parsing is not cached; it always uses the current value of the underlying setting. - Added "setexpansionsymbol" task action; open files have their symbol set in place (essentially, the same as the edit menu). Closed files are opened, updated, and saved. The advantage over the edit menu item is that the project action applies to all selected .eon files in the project view. - The names of arkham.project.TaskAction.appliesTo( Member[] ) and arkham.project.TaskAction.perform( Member[] ) have been changed to arkham.project.TaskAction.appliesToSelection( Member[] ) and arkham.project.TaskAction.performOnSelection( Member[] ), respectively. This makes it possible to unambiguously subclass TaskAction from script code. - Added a cut action to project views. - Changed: the signature of StrangeEonsApplication.exitApplication() was changed to StrangeEonsApplication.exitApplication( boolean restart ), where passing true will attempt to restart the application automatically after exit. In theory compiled plug-ins that call this method will need to be recompiled against the new interface, but I am fairly certain that nobody has ever written a compiled plug-in that actually calls this. - Added StrangeEonsApplication.suggestRestart( String message ); if message is null, a default message is displayed. - Added a simple API for adding menu items to the application menu bar. Under this API, each menu has a standard location where new custom items are inserted. (Note: extending the Window menu is not supported by this API; use StrangeEonsApplication.trackWindow(Window, boolean) for that. For more extensive control over the menus, see the uiutils script library. Example code: // Add items to each supported menu var AppMenu = arkham.StrangeEonsApplication.AppMenu; var menus = [ AppMenu.FILE, AppMenu.EDIT, AppMenu.VIEW, AppMenu.MARKUP, AppMenu.TOOLBOX, AppMenu.HELP ]; function createItem( menu, i ) { var item = new swing.JMenuItem( menu + " " + i ); Eons.addMenuItem( menu, item ); item.addActionListener( function() { println( "Activated " + menu + " " + i ); Eons.removeMenuItem( menu, item ); }); } for( var m=0; m