Friday, July 31, 2015

FMod - Level Management Improvement

Today while processing a feature request for Abiathar (the ability to shuffle levels around, changing their IDs), I noticed a crash bug in the level copy feature. When overwriting existing levels, it always tried to remove that level's entry in the view state cache, but that resulted in a KeyNotFoundException if that level had not been visited yet. I added a check for LevelViewStates.ContainsKey and the crash was fixed.

I then went to implement that feature request. It was a bit tricky, but I got the Level | Properties feature to enable changing the level ID. When the level ID is changed to the ID of an existing level, an option is provided to swap, reordering the levels. The undoable action description (for the Time Machine) is even customized based on whether the level was moved, swapped, or simply reconfigured.

Thursday, July 30, 2015

This Site Uses Cookies

Apparently the European Union has a law that requires all sites to declare their use of cookies, a law which Blogger told me about by raising a little notification on the Overview tab of my blog control panel. I'm not sure what the consequences are if you don't obey that law, but in the interest of being a good Internet citizen, I'll comply:

This blog, for some reason, uses cookies, and it's out of my control. I'm fairly certain the cookies are only there to recognize if you're signed in with Google. Hopefully, Google isn't doing anything super privacy-violating with said cookies. If you aren't OK with cookies, I guess you should read my blog through a proxy, or disable cookies entirely. (Expect stuff to break if you choose the second option.)

Hooray for laws?

Wednesday, July 29, 2015

Visual Studio 2015 Compiler Produces Smaller Assemblies

A PCKF community member pointed out that the binaries for Abiathar v2.8 were smaller than those for v2.7.2, which led me to notice that Abiathar v2.8 was the smallest version by file size to date. I certainly added features and didn't remove anything major, so the only explanation I have is that the Visual Studio 2015 compiler creates smaller, better-packed assemblies than the compiler in Visual Studio 2013, which I switched away from between v2.7.2 and v2.8. Note that I have not switched to .NET 4.6 for build targeting (thanks in no small part to this bug); I'm still targeting .NET 4.0, so the downsize is a function of the compiler, not the framework. Neat!

Tuesday, July 28, 2015

FMod - Missed a Space

I remembered that I had completely forgotten to make sure the Time Machine displays tileinfo-related undoable actions correctly. I checked that today, and fortunately there were no major problems. The description of normal tileinfo tweaks was, however, missing a space between the tile ID and the word "properties". I fixed it in my local build, but didn't bother to push a whole update for it since it's such a small and unobtrusive thing. Even so, I should probably be sure to test more thoroughly in the future.

Monday, July 27, 2015

FMod - v2.8

A few weeks ago, somebody noted that placing the worldmap Keen sprite in levels doesn't do anything bad, it just makes the level work like another worldmap. So, I finally remembered to downgrade the Abiathar Level Inspector's problem alerts about map Keen in levels and level Keen on the map to warnings. Since some mods (Kube, for instance) make serious use of the ability to use map Keen in normal levels, I also added a switch called IgnoreWorldmap in the InfoplaneInspector section of the ADEPS file to turn off the warnings. I did make sure that the sprites that always cause a crash still produce a "problem" message even with IgnoreWorldmap, since it's a combination of those same fields that trigger it.

I released those changes and those from the past few weeks as Abiathar v2.8.

Sunday, July 26, 2015

FMod - Fast Tile Updates

While poking around making sure that Abiathar v2.8 was in good working order, I noticed that I had forgotten to apply the GDI+ optimizations to single-tile updates in TileRenderPlane. I copied the five lines of configuration from the full-render routine and now I think the placement of individual tiles is graphically updated faster. (It would probably be more apparent on a slower machine.) For the curious, those lines are:

' g is your Graphics instance
g.CompositingMode = Drawing2D.CompositingMode.SourceCopy
g.InterpolationMode = Drawing2D.InterpolationMode.Default
g.CompositingQuality = Drawing2D.CompositingQuality.HighSpeed
g.SmoothingMode = Drawing2D.SmoothingMode.None
g.PixelOffsetMode = Drawing2D.PixelOffsetMode.None

These are really only good if you're not stretching or scaling in DrawImage calls. If you are doing that with these settings, it's going to look super awful. But if you're just copying images, these are great.

Saturday, July 25, 2015

FMod - Improved Time Machine

Today I made some tweaks to the Time Machine feature. The normal TileUndo class now records which tool was active when it was instantiated and adds a "using tool" phrase to the end of its description. The word "tiles" is now singularized when there was only one tile modified. Clear History now requires confirmation before doing its work, which - naturally - cannot be undone. Finally, I made sure the Time Machine window can't be resized in a way that hides some of the buttons.

The improved Time Machine
Visual Studio 2015 bug: the dividing lines between methods and other important stuff don't extend to the right when the horizontal scroll bar is used in the code window.

Friday, July 24, 2015

FMod - Time Machine

I rearranged Abiathar's Patches window today to have two tabs, one for user-generated custom patches and one to provide easy access to the auto-generated patches. I realized that yesterday's solution of copying the full text of the auto-generated section to the clipboard would cause problems when users only wanted to, say, paste an updated music mappings table into their external patch file. So, now there's the Auto-Generated Patches tab, which has a read-only text field for easy copying of subsections.

I also decided to go ahead with the Time Machine idea. Adding a Description property to IUndoableAction wasn't too hard. I figured a timestamp should be attached to each action as well, so the undo and redo stacks got converted to stacks of tuples of times and actions. The Time Machine window itself wasn't very difficult either, but I do think it's an interesting feature and that it will be occasionally useful, at least in emergencies.


In the Time Machine dialog, actions that have been done (i.e. that can be undone) appear in black. The most recent action that hasn't been reverted appears in bold. Actions that have been done but were undone appear in gray. Selecting an action in the list and then pressing Go undoes or redoes actions to make things as they were at that point in time. Revert All rewinds to the beginning of the list (a necessary button because using Go on the first action would still leave that one done). Clear History does exactly what it says on the tin. Done simply closes the dialog. (The other buttons take effect immediately. Clear History cannot be undone.)

And some more new VS2015 things:

  • There's a little overlay that appears when I move the mouse over a breakpoint that lets me change its settings or disable it. This is really nice because I can now adjust the breakpoint without right-clicking a small area and picking from a bunch of menu-items.
  • Stepping through code (with F8) produces a little text to the right of the line of code that says approximately how long it took to get from the last stop to this place. Neat!
  • The tree view that appears when mousing over objects in debug mode hides non-public members under a new "Non-Public Members" drop-down. This is probably good for reducing visual clutter, but it's another tiny little thing I have to hit if I do need to see those fields.
  • Syntax errors in the current line are highlighted while I'm still typing on that line, which is incredibly annoying. I liked VS2013's behavior of not critiquing lines until I'm done typing on them.
  • Enumerators can be evaluated using the debugger's object inspection thing, which is really nice.
  • This happened once when I tried to run:

Thursday, July 23, 2015

FMod - Copyable Auto-Generated Patches

Today I finished up testing the optimizations of row/column manipulation that I wrote about yesterday. It's all working correctly, and I noticed that I could skip the link detection loop completely when the user had chosen to not update links. (Previously, it had checked the link update policy for every tile.) That change saved a tiny bit of time, but row/column management is still a bit slow. It's definitely better than before, though.

I made a slight change to the Patches window to add a button that copies the automatically-generated patches (e.g. music mapping table) minus the header and footer to the clipboard. That way, it's easy to get your music mapping table (which is really the only difficult part if you were doing it manually) and still be able to tweak your patch file outside of Abiathar.

Wednesday, July 22, 2015

FMod - Row/Column Management Optimization

I was investigating the slowness with row/column management when I remembered that disabling the undo feature (by enabling High Speed Mode) non-negligibly increases the speed of those operations. Investigation of those tools (Row Adjuster and Column Adjuster) showed that they create a copy of the level to store in the LevelUndoAction when FastMode is not on.

That clone operation actually seemed fairly expensive, so I tried disabling it. The copy was necessary because all links that need adjustment have to be zeroed so that the updated links don't get overwritten when the normal level and nonlinkable infoplane values are copied. Disabling the zeroer resulted in links not getting updated at all.

It turns out that old links only needed to be zeroed because I did the standard copy and link update in the reverse order of what one would expect. After I swapped them so that link updates are done last, no zeroing and therefore no cloning had to be done. The old level was not modified and could be jammed into the LevelUndoAction. Speed improved!

Oh, and some things I noticed that are new in Visual Studio 2015:

  • The Start button (to launch the program) is on the opposite side of the Debug/Release and platform dropdowns than it was before. That is actually pretty inconvenient because I'm so used to the old positioning.
  • There's a new dropdown next to Start that lets me set the startup project (in a multi-project solution) by picking it from its list of non-library projects. I like that a lot.
  • The left margin highlight color for saved changes is a brighter green. I'm not sure if I like that.
  • There is a new Diagnostic Tools thing that appeared without asking me and made a bunch of neat graphs of Abiathar's resource consumption over time. It briefly got in the way, but was easy to dismiss and will be a nice tool when I need it.
  • There is a new dropdown to the left of the class and method/property/event dropdowns at the top of the code window. It seems to always contain a single entry: the project in which the file resides. That's kind of weird; perhaps it should have been a label. (I do like seeing at a glance what project the code file I'm looking at belongs to.)
  • Little balloons appear when Visual Studio can make little changes for me, like simplifying enum entry names by removing some namespaces. I'm not yet sure if this is useful enough to warrant the visual distraction.
  • There is a smiley face next to the notification alert icon that creates a menu containing feedback-related actions when I click on it. I think all these items used to be in the Help menu.
  • The icon for a form code file is a little different.

Tuesday, July 21, 2015

Abiathar Feature Idea: Time Machine (Advanced Undo/Redo)

I recently was in an IRC conversation with someone who had just created some problems for himself by using the copy/paste mode of Abiathar's Tile Property Modifier without understanding how it works. Fortunately, the damage was fairly easy to undo using the normal Undo feature, but it gave me an idea for a possible new feature which I may or may not actually implement.

A new menu option would be added to the Edit menu: Time Machine. It would bring up a dialog listing actions that had been taken with a short description of what was done (e.g. "fill rectangle", "edit foreground tile 423 properties", "create level 2") with a timestamp for each and provide UI to rewind to a certain time or action. That would allow users to quickly reverse a slew of individual actions that they took without understanding what was going on. In that person's specific case, all the "paste foreground tile properties" entries could be undone in one swoop.

The Time Machine UI itself would be easy to implement, but more information about actions would need to be added to IUndoableAction and in all the places that call PushUndoStack. Also, it wouldn't be used very often, if at all. It would be a neat feature, but I'm not sure whether I'll go ahead with it.

Monday, July 20, 2015

Visual Studio 2015

Visual Studio 2015, the newest version of Microsoft's Visual Studio IDE, has been fully released today! Download it at the official site. I installed it as soon as I heard the news.

It's a fairly large download and took about a half hour to install. There are quite a few optional components (version control systems, and stuff for mobile devices), most of which I chose not to install. It required a reboot, but that might be because I chose to install the Hyper-V emulator for Android devices. Once all was said and done, about 7GB of hard disk space had been newly consumed.

I launched it and it looked fairly similar to Visual Studio 2013. I can definitely see the Windows 10 art style making its way into the IDE, but besides a few icons and the lowercase menu items, its chrome looks the same as VS2013. I opened a simple project and everything seemed the same as in VS2013 except that cast keywords (CInt) appear in a faded purple/blue. Right-clicking in the code window reveals a Quick Actions entry, which did absolutely nothing when I clicked it, and some entries for quickly managing Imports statements. I may post new observations as I continue to work with the IDE.

VS2015 also came with the .NET Framework 4.6 Targeting Pack, so I'll be able to compile for .NET 4.6 from VS2013 if I really need to use my Professional installation for anything.

Thursday, July 16, 2015

FMod - Level Inspector Hex Coordinates

I noticed that the Level Inspector's results dialog was not respecting the UseHexidecimalDisplay configuration entry; it always displayed coordinates of problem areas in decimal form. So, I updated it to check the MouseOverCoordinates entry of that config compound; if the user wants coordinates to display in hexadecimal, the Level Inspector formats the coordinates as two-digit hexadecimal numbers with an "h" appended to indicate hexadecimalness.

Wednesday, July 15, 2015

FMod - Minor Drawing Speed Improvements

I noticed that Abiathar performs abysmally when resizing levels with the row/column management tools. The speed of those tools is heavily dependent on the performance of the initial rendering pass; everything is fast when you only have to redraw one tile. To speed that up, I tried two approaches that I thought were clever: parallelizing the SetRenderProps calls in InitializeLevelDrawingSurfaces, and parallelizing the Render calls on uninitialized view planes in RenderViewer. The first attempt was useless because not much actually happens in SetRenderProps. The second failed because GDI+ apparently can't handle multithreading.

So I had to speed up the actual drawing rather than just shoving it off to different cores. I attacked that problem by tuning image formats and drawing modes to minimize the work GDI+ had to do in the Render implementation. Rendering levels seems to be faster, but row/column management is still slow.

Tuesday, July 14, 2015

ADEPS Configuration for Kube

Today Levellass released an impressive mod she made in less than one day (using Abiathar) called Kube. Its intense patches change how the game loads graphics, so a bit of special configuration of Abiathar is needed if you want to look at its levels without extracting the graphics. The full NPW run should go like this:

  • Template: Keen 4
  • Containing Folder: Wherever you downloaded and extracted the mod
  • Level Source: Start from existing level files
  • Level Files: Accept the defaults
  • Graphics Source: EGA resources
  • Graphics Files: Accept the default names for EgaGraph and EgaHead, uncheck "This game uses compressed graphics"
  • Tileinfo Source: Create or load a separate tileinfo file
  • Tileinfo File: Load from the pre-existing resource, accept the default tileinfo file name
And there you have it!

Success.

Monday, July 13, 2015

FMod - Mouse Drag Bugfix

While chatting on in the #KeenModding IRC channel yesterday, I found out about a little bug in Abiathar's UI. While selecting a region (e.g. with the Copier), using the arrow keys to pan the level resulted in the next mouse movement being counted as the second click of the selection even if the mouse button was not released. 

I looked around in the mouse movement handler (which is called to update the selection rectangle when the arrow keys are pressed, and also for normal mouse movement) and discovered that it assigns the "last state of the mouse buttons" variable even for the fake keyboard-induced mouse events. Since the fake event generator supplied blank values for everything, the button state variable got cleared, resulting in Abiathar thinking it got a new click when the mouse moved into a new tile with a button pressed.

I fixed that by making the mouse handler not set the button state variable if the mouse-move event isn't actually caused by a mouse movement. (I signal such events by setting the Delta field to 255, which can't happen naturally, if I remember correctly.)

Sunday, July 12, 2015

Markeen - Eager Generation

Today I implemented eager generation of rare structures for Markeen. I consider "rare structures" to be arrangements of tiles such that starting from any tile in the structure, there should be a 100% chance that the full structure be formed. For example, multi-tile decorations such as the exit sign must always appear whole; it doesn't make sense to have one corner of the exit sign floating somewhere. The fuse structures in Keen 5 are similar examples. On the other hand, platform structures of a certain length are not "rare structures" because those tiles can be arranged in multiple valid structures.

Eager generation of valid structures is important because fill orders lacking it tend to cut off such structures (other tiles have encroached upon the already generated part of the structure and made it impossible to continue generating). My current implementation checks to see if the newly placed tile is compatible with exactly one tile on each side and, if so, places the only possible companion and repeats the process for that new tile.

Results so far are encouraging, but there are some problems. It's possible for the eager generator to be "too late" if tiles have already been placed that block the outgrowth of particularly large structures. Also, this algorithm generates rare structures far too frequently - the fuse box from the Regulation Control Center appears at least once in literally every Keen 5 level I've generated.

Except this one. (But I had to go through dozens to find it.)

Saturday, July 11, 2015

Markeen - High-Order Chains

Today I finally hammered out an implementation of high-order chain awareness for Markeen's level generator. Its first results were extremely boring; it just generated levels either filled completely with one platform style's inner tile or as an empty space with point items strewn about. The problem was that I had confused the sign on the offsets after rewriting the scoring algorithm to examine faraway tiles. After fixing that, I got a level that was decent:


I then tried fiddling with different fill patterns without much success. However, after a tweak to the scoring algorithm to devalue candidate exclusions based on distance, Markeen produced one of its best levels so far:


I created yet another fill pattern, this time one that starts in the center of the level and spirals out. It's currently creating levels that are extremely messy, so I guess my only remaining areas of research are eager generation of rare structures (i.e. if placing this iteration's tile leaves only one candidate for an adjacent space, fill that too) and smarter erasure.

Friday, July 10, 2015

FMod - Paste Planes

Once again I didn't get much time to tinker with Keen-related things, but I did continue making improvements in the style of yesterday's UI tweaks. Most notably, the Essential Manipulator's paste preview overlay now responds to changes in the plane states, just like that of the Paster. I also made its copy behavior match the normal Copier, copying all planes that aren't fully hidden.

Making the Essential Manipulator respond to plane state changes was surprisingly easy since it already had an event handler hooked up to the clipboard change notifier. Once I changed the Essential Manipulator's invocation of SetPastePreviewTiles to indicate that the preview plane should respect the plane states, the existing call to ClipNotify.Notify() in the StandardTools stop on the plane state change event bus was sufficient.

Thursday, July 9, 2015

Markeen - Minimal Abiathar Extension

I didn't have much time to tinker with Keen-related stuff today, but I did dust off the Abiathar API listings and start on the Abiathar extension part of Markeen. (My goal is to have it usable either as a console program or an Abiathar extension - just change its extension to AEX.)

I successfully got it to be detected as an Abiathar extension and register a single tool, the Probabilistic Polisher. The Probabilistic Polisher will be the main tool for Markeen in Abiathar, but currently it does nothing besides take up the J hotkey. (Fun fact: with Markeen loaded into Abiathar, every single letter key on the home row does something.)

Tomorrow, I'll try to figure out how to take advantage of these deep profiles I made a couple days ago.

Wednesday, July 8, 2015

FMod - v2.7.2

Yesterday, I pushed an Abiathar update, version 2.7.2, containing the following changes:

  • Reload Graphics no longer causes a stack overflow crash. The bug was created by my previous poorly-tested fix for certain tools causing crashes after Reload Graphics; I had gotten the order of two very important lines switched around. Now that tools are reinitialized after the view states are rebuilt, everything is good.
  • Placing hex composites (tiles beyond the end of the tileset) into the foreground plane no longer results in a crash.
  • The Audio Resources dialog now allows the linking of nonexistent files to the project. This is useful if one is about to compile a new set of audio resources from a collection of individual sound files. A warning is given, of course.
Those changes have already been released. Tonight, I made a few more improvements:
  • The H key is no longer a tri-state toggle; it now only switches the Find Highlight on and off without passing through the pulsing state. That state can now be directly accessed by pressing Shift+H.
  • The Find Highlight now draws opaque thin squares around tiles by default, rather than doing a recolor. The old behavior can be brought back with a configuration option.
  • The Find Highlight overlay no longer waits until the mouse is moved to a different tile before updating when Simultaneous Tileset is off. (That was a really fun one to debug.)
  • Opening a different project file while Find Highlight is on no longer causes a project load failure.
  • The Copier now copies all planes except hidden ones rather than only capturing the active layers. The Paster now respects plane states in addition to the planes on the clipboard.
  • The paste preview overlay no longer includes planes that will not be pasted into the level. Its translucency effect has been fixed so as to not create strange lines when a non-transparent foreground tile is over a background tile.
Once these changes go through a bit more testing, I'll release them as v2.7.3.

Tuesday, July 7, 2015

Markeen - Small Adjustments

Today's tinkering on Markeen started with testing it on Keen 8, the second installment in Ceilick excellent "The Universe is Toast" trilogy:

A clumsy but interesting-looking fusion of the volcano and desert themes.
I then realized that perhaps my scoring algorithm was to blame for the poor arrangements of certain tiles. Previously, the algorithm had allowed ultra-rare combinations in one direction if there was also a common combination already in place in a different direction. I changed it to score the tile using the lowest prevalence of all the sides' combinations. That resulted in great improvements:

Note the increased prevalence of correctly formed structures.
The best I could get out of Keen 5. It actually might be playable after some cleanup.
Pleased with those results but still not seeing any actually decent levels, I decided to take the plunge and add support for higher-order chains. I updated the profiler to create profiles of arbitrary depth; it now logs the probability of each tile appearing next to each possible match at each position whose distance doesn't exceed the profiling depth. Profiling Keen 5 at a depth of 3 creates a file of manageable size, just 875KB, up from 128KB at the old depth of 1.

Once I add support for higher depth in the generator, stuff should start looking good.

Monday, July 6, 2015

Markeen - Some Progress

Today I continued tinkering with Markeen, and got a prototype working to some degree. The first thing to do was get a fill pattern going, specifically the inward spiral. The first test didn't do any random generation; it just used tile ID x * y so I could make sure the spiral hit every spot.

The pink section to the right consists of tiles past the end of the tileset, which Abiathar displays as their hex value.
I then wrote the actual random generation code, selecting each tile based on the existing ones next to it (the level edges count as special tiles). If a combination of surrounding tiles was found that didn't allow any tile to be placed at the current position, the spot was marked as bad and a 3x3 centered on it was erased. I had code to do extra passes if such problems were encountered, but that didn't work at first.

The pink splotches are the errored regions, consisting of tile $FA17
Parts of coherent level could be seen at this point! I knew not all of those error tiles could be contradictions, so I bypassed the part of the code that erases surrounding tiles so I could see what was actually generated:


Lots of correctly-formed platform structures were placed, but they didn't form a coherent whole; it was trying to generate several different blobs all on top of each other. Keen 5 was making this difficult by having three types of platforms that don't fit together, so I tried it on Keen Dreams, which has fewer tile types:


Every Dreams level I generated looked more or less like that, just a bunch of platforms floating over a void, plus world map borders sprinkled in the blank areas. I suspected that the problem might have to do with the fill order, so I tried swapping the spiral out for an expansion from the lower-left corner up to the upper-right. That produced more or less the same problems as those seen in the spiral. While I was at it, I also wrote a fill order selector that fills the points on the level in a random order, one that fills from the bottom up one row at a time, and one that can switch from a starter fill order to a primary one after a certain number of spots. Tinkering with those led to some actually interesting maps, such as this one made by starting with random generation for 30 spots and then using corner-to-corner:


It then occurred to me that one very rarely wants a level to have multiple styles of platforms. So I created a profile from only one level at a time. (That had the good side effect of not including world map tiles.) I also tried introducing an "originality" constant that can increase or decrease the chances of less common tiles being used. Using a profile from the Security Center in Keen 5 and setting the originality constant to crush the minorities, I got this level:

It could actually be made usable after a bit of cleaning up and decorating.
From the Regulation Control Center's profile.
From Defense Tunnel Vlook's profile. A bit too much solid metal, I think.
I think I need to explore higher-order chains or more intelligent erasure routines before I can make anything more interesting. However, it has been able to successfully repair existing levels after I scribbled over them with $FA17 (the unfilled/"come back and fix this" tile). Progress has been made!

Sunday, July 5, 2015

Markeen: Random Keen Level Generator

Today while relaxing after completing a large-ish essay, I started a small project called Markeen. My goal is to be able to randomly generate levels for any Keen Galaxy-ish game. This will be accomplished by profiling an existing set of levels to determine the probabilities of each tile appearing next to every other possible tile, then using those probabilities to build a new level. It's kind of like Markov models for text, hence "Markeen".

I wrote the profiler already. It stores the average level dimensions and the standard deviation for each dimension's length. Most of the profile data is in the tile frequency section, which has a record for each tile, containing the tiles that can appear to each side and their instance counts. The file created by the profiler is surprisingly small, only 128KB for Keen 5.

I started writing the level generator, but I'm still trying to decide on the order in which the level will be filled and how to back up if an already-generated combination of tiles would require an illegal (unseen in the original game) arrangement of new tiles. I think my strategy will be to fill the level in a spiral pattern starting on the outside and going in. Contradictions will be addressed by deleting a swath of tiles around the problem area and regenerating that section.

Saturday, July 4, 2015

Abiathar's July 4 Background

As of v2.7, Abiathar checks for a temporary updated logo and uses it as the background image in the main window if present. I made use of the feature today to make this the background, in celebration of the United States's Independence Day:


(I don't actually plan to make extended use of this; today's use was pretty much just a test. Its main purpose will be to mark important days in the Keen community, like the release of the long-awaited Atroxian Realm mod.)

Friday, July 3, 2015

Moving from Compressed Audio to Uncompressed AudioT with Abiathar

Today I helped convert some audio files for a Keen modding team working on a big project. They needed to switch to uncompressed audio (AudioT) because the decompression routine in the game was causing out-of-memory errors. (Their songs are huge!) Fortunately, Abiathar is well-equipped to deal with special audio formats. This is the procedure I used to convert the audio resources:

  1. Configure the AudioSettings compound in the ADEPS file. (This was only necessary because they were using a special audio chunk layout.)
  2. Link the compressed audio resources to the Abiathar project using the Audio Resources dialog.
  3. Export the audio data to individual files using the Export command.
  4. Reconfigure the Audio Resources dialog to treat the files as uncompressed. (This step went smoothly for us, but does have a chance of causing error messages. If you get those, you'll have to edit the ADEPS file manually to force Abiathar to treat the files as uncompressed.)
  5. Import the ASNDS audio data list created in step 3. This rewrites the audio resources to be in uncompressed AudioT format.
  6. Delete the Huffman dictionary file used for the audio resources.
Since KeenWave can't handle uncompressed audio files, only Abiathar can be used to manage audio after this procedure is performed.

Thursday, July 2, 2015

FMod - v2.7

Today I continued making small changes to Abiathar in preparation for the release of v2.7:

  • Dragging the middle mouse button no longer allows scrolling outside the level when "Allow scrolling outside level borders" is disabled.
  • The Tile Property Modifier now displays a much more obvious (modal) warning about read-only tileinfo.
  • Closing the dependency file now does a much better job of cleaning up the view state. (For instance, TilesetOffsetY and ShowTileset are now zeroed.)
  • The Resource Accountant's hotkey was changed to Ctrl+U to be distinct from the Tile Property's hotkey of Ctrl+P.
  • The code responsible for refocusing the Tile Property Modifier when the selected tile is changed in the level now prevents a tile not visible in the tileset from becoming the focus of the TPM, which could have caused crashes and data corruption.
I released all this as v2.7, then soon noticed that I had created a visual bug in the foreground tileset when Infoplane Override is in use. Oops. v2.7.1 was released as I was writing this.

Wednesday, July 1, 2015

FMod - Bio Menace Tileinfo

As I noted yesterday, Bio Menace stores the background tileinfo data (animation offset and delay) in the reverse order of that used in Keen Galaxy. Today I added a project file setting and a static field in BackgroundAnimHelper to account for that. Bio Menace background tileinfo can now be edited using the normal animation tools in the Tile Property Modifier.

I also made the generic (pre-v2.7) tileinfo list be copied into the per-project tile property lists if the project file was not built from a template. That way, no inconvenience is had when upgrading to v2.7, but all the benefits - adding custom named properties - are accessible.

A little more testing, especially of that last part, has to be done, but I'm just about ready to release Abiathar v2.7!