Tuesday, June 30, 2015

FMod - Great Tileinfo Progress

I did a whole lot of work on Abiathar today, and made a good deal of progress. I did some small things first: Lone Editing now works more like Keen Next (or at least TOM's Keen Next Mode, because I've never used the actual Keen Next) in that pressing the 1 through 3 keys makes only the requested plane active and switches the tileset to the appropriate plane if Simultaneous Tileset is on. I also removed ModKeen from the File Emitter because I don't want to be encouraging/facilitating the use of old technology; I will include TliExtend once I've fully tested it. The VeriMaps information label now changes to include the time the project was saved, in addition to whether it was saved with a signature.

Yesterday, I had written code to make the Tile Property Modifier update its active tile when the selected tiles were changed by means external to the TPM (e.g. using the Tile Placer's right click function in the level). Today I tested that more thoroughly, and it worked quite well. It even updated the TPM when the selected tile was changed with the mini-palette. I also identified and removed vestigial parts of the Tile Property Modifier's code.

While looking around the various tilesets in anticipation of the Great Tileinfo Un-Hardcoding, I stumbled upon a rare but serious bug in the Tile Property Modifier. If the TPM is being used with Simultaneous Tileset and the user cycles Simultaneous Tileset (turns it off and then back on), the TPM erases the properties of the selected tile. That was happening because tileset tools can receive two cancellation notifications when Simultaneous Tileset is disabled and the TPM saves its information and clears its data when cancelled. I fixed the bug by making the TPM ignore the extra notification.

Finally, I moved all the tile properties into the per-project configuration! This meant that I could finally provide different sets of property options for different games. I went through all the entries and tagged them with the appropriate episodes, and corrected some names along the way. Bio Menace has a completely different set of tile properties, but I think I figured them all out and included them. Adding these lists into existing projects was a bit tricky, but I think I got it all right, and if I didn't (if the lists are absent), the TPM displays generic options (the old hard-coded lists minus the ugly episode indicators).

Showing only entries applicable to Keen 5
Things to do tomorrow: deal with Bio Menace's switching of the background animation and delay fields, and test everything (and hold fast that which is good). v2.7 should be out in a day or two.

Monday, June 29, 2015

FMod - Extra Tile Placement Bugfix

For quite a while, Abiathar has had a bug that caused the default (zero) tile to be placed wherever the mouse was after the Open dialog box was finished by double-clicking on a file. (In my defense, that bug appears in every Keen level editor I've ever seen, including TOM and Mindbelt.) Today I finally fixed it.

Since the OpenFileDialog completed and closed after the second MouseDown event, an extra MouseMove event was sent to the form behind the dialog with the left mouse button held down, causing the Tile Placer to place a tile. There is now a JustOpened flag that gets set before calling OpenDeps and cleared the first time the mouse moves in the level editing pane, causing the event to be ignored.

Maybe tomorrow I'll finally figure out how to un-hardcode the tile property lists.

Sunday, June 28, 2015

FMod - Wrong Dictionary

Today while trying to open an existing Keen Dreams mod, I discovered that the default graphics decompression dictionary used for Keen Dreams when the "Use the game's default dictionary" box is checked was not at all the the correct dictionary. In fact, it seems I had accidentally used the no-effect dictionary for both EGADICT.KDR and NULL.DCT, which is clearly not right. The issue has been fixed.

I also noticed that Keen Dreams has two FgMisc (special) tile properties that I didn't put into the Tile Property Modifier. I'll have to figure out how to get those in when I finally un-hardcode the list of tile properties.

Saturday, June 27, 2015

FMod - Tileinfo Challenges

I was looking around the source of the Tile Property Modifier in anticipation of switching its property lists over to the individual project files when I noticed that it does some very strange things when activated on the infoplane tileset. It pretends that it's on the foreground tileset, and therefore selects clicked tiles into the foreground and allows editing their properties, but the selection highlight doesn't move because it was the foreground whose selected tile was changed. Since it doesn't make sense to edit the tile properties of infoplane icons, I completely stopped the Tile Property Modifier from being used on the infoplane; it will simply not open.

I also noticed that selecting a different tile in the level (not in the tileset while Simultaneous Tileset is on) does not cause the Tile Property Modifier to change what tile it's managing. That results in a very strange visual state, and I'm really not sure how to fix it. The tool API is laid out in a way that makes dealing with this very difficult.

While putting off dealing with subconsciously thinking over that problem, I rewrote TliExtend to have usage help, be able to truncate tilesets, and deal with combined MapHead/tileinfo files.

Friday, June 26, 2015

FMod - Another NPW Adjustment

Today I noticed that Abiathar's Tile Property Modifier doesn't change the animation delay when the continuous link mode is used. That's not super bad, but it is a bit inconvenient. So, I changed it to copy the animation delay from the starting tile to every tile that's included in the loop. (One-time animation link mode doesn't do anything special with animation delay.)

Yesterday while adding more tiles to an existing mod, I encountered several errors in dependency file processing. Every time, I had to check and re-enter all my settings (in the long form of the NPW!), which was fairly inconvenient. So today, I made the New Project Wizard automatically reopen in edit mode long form if the processing fails, after displaying the error. If the user wants to give up, it's easy to hit the Cancel button and go back to Abiathar's entry screen.

Thursday, June 25, 2015

TliExtend

Today in the #KeenModding IRC channel, I was helping a Keen modder who was working on adding new tiles to a source code-based mod. Getting Abiathar to load the extra tiles was fairly easy (even though it's the only Keen level editor that can handle extended tilesets). The tricky part was fixing the tileinfo file to include those extra tiles.

You see, the tileinfo format is planar, so the information for each tile is spread out all over the file, and at offsets determined by the number of tiles in the file. Therefore, it can't just be extended by writing a bunch of zeros at the end; the spaces for the new tiles have to be inserted throughout the file. That would, of course, be very painful to do by hand in a hex editor.

So, I quickly (in under five minutes!) wrote TliExtend to solve this very problem. It's not super well-tested, but it did what it had to do. Its syntax is fairly simple; it takes six command-line arguments, in this order: existing tileinfo file name, current number of background tiles, current number of foreground tiles, output tileinfo file name, new number of background tiles, and new number of foreground tiles.

Note that TliExtend does not support the shrinking of tileinfo files. (It won't prune tiles off the end, and will probably do nothing if you ask it to reduce tile counts.)

I'll probably include TliExtend in Abiathar's File Emitter, but you can download it now if you'd like. (Requires FMod.dll, which comes with Abiathar.)

Wednesday, June 24, 2015

FMod - Keyboard Convenience

I didn't get a lot of time to tinker with Abiathar today, but I did make a couple minor improvements. First, the Flood Filler no longer resets the bounding plane settings when you switch to it. (That was an inconvenient and obtrusive misfeature.)

I also made some minor changes to the tile ID entry forms (both the simple one and the Infoplane Helper). When they are opened, the text in their numeric box is automatically selected for ease of overwriting. Pressing the Enter and Escape keys now confirms and cancels those forms, respectively. I thought those would be good improvements because small numeric entry forms are usually the sites of quick keyboard hammering.

Tuesday, June 23, 2015

FMod - Level Inspector Improvements

Today I was reading the source code of NetKeen and Keen Dreams, looking for information on the implementation of tile animation. As I browsed, I found that there were some very convenient #define statements telling me exactly how many unique animated tile types there can be in the level and how many animating tiles can be on screen at once. I used the latter datum to tune the Level Inspector's warning and error thresholds for animation-on-screen checking, and the former to add a new check for unique animated tiles.

I also noticed while browsing my implementation of the Level Inspector that one of the checks for keyholder pointers would never fire because I forgot to add the target position in level to an iteration variable.

I have plans for the Tile Property Modifier. It doesn't make sense to have a bunch of entries that don't apply to the game being modded in the list of special properties, so I'll move that list or at least part of it into the dependency file.

Monday, June 22, 2015

FMod - Fixing Oversights

Over the last week or so, I ran into a few small issues with Abiathar that I finally fixed today. These were:

  • The NetKeen template didn't have the AudioSettings compound, so Abiathar couldn't be used to manage sound effects or music for NetKeen. Making the new AudioSettings entry apply to existing NetKeen dependency files was a bit tricky because that template doesn't set DefaultSet (which is what I use to auto-update the normal games' project files). I ended up detecting NetKeen dependency files by where background tiles start in the EGA resources.
  • The "save changes before closing?" message was appearing when Abiathar was closed following a failure to load a dependency file. I thought I had fixed this a few versions back, but I forgot that the New Project Wizard always set ChangesMade to True after calling OpenDepsFile.
  • The New Project Wizard was performing case-sensitive comparisons when making sure resource files were in the project directory, which created problems when using the file browser.
All of those have been fixed. I also added a line of code to ImfPreview to make sure that the selected song chunk is not blank; previously, trying to preview an empty song would cause ImfPreview to crash Abiathar.

Sunday, June 21, 2015

Gash - Everything Serialized

Today I finished the ToFiles method of NextGenGraphics, essentially completing the back-end of Gash. All I had to do today was add code to serialize texts, miscellaneous already-binary data, tiles, and small tiles. The trickiest part was the small tiles because of the way they're all stored in one chunk. The routine for saving them looks something like:

  • Are there any small tiles cached? (This will be true if any have been requested or set.) If so,
    • Get the decompressed version of the small tiles' chunk.
    • Is it null? (DecompressChunk returns Nothing if that chunk is not present.) If so,
      • Create a new one, with appropriate length, and use it instead.
    • Figure out how many bytes an individual small tile takes.
    • For every cached small tile,
      • Serialize the small tile like any other image.
      • Figure out (from the length of small tiles) where it should go in the chunk.
      • Jam it into the main small tiles chunk, overwriting whatever was there.
    • Assign the chunk into the appropriate index of the raw chunks list.
Tomorrow I will test the new additions, then I'll be ready to start working on Gash proper.

Saturday, June 20, 2015

Gash - Does No Harm

I continued investigating NextGenGraphics's reimport corruption problem demonstrated yesterday. The first thing I noticed was that I had completely forgotten to check if the chunk had a constant decompressed size; ToFiles always wrote the UInteger representing the decompressed length. That was certainly the cause of the image distortion, but attempting to launch Keen with EGA resources from the fixed version resulted in an MM_GetPtr: Out of memory! error immediately after the "loading" B800 screen. I was fairly confused about that too, especially because Abiathar could use those EGA resources just fine - there were no extra lines or other distortions.

A little looking around in the FromFiles method revealed a precarious situation: the MemoryStream stored in RawCompChunks included the 4-byte decompressed length. It wasn't the source of any corruption because the stream's position was moved to the start of the real data, but I'm sure the arrangement would have resulted in baffling bugs down the road.

It was after fixing the FromFiles chunkifier that I realized there must be a problem with the chunks representing the Terminator-style texts because those were the resources about to be called when the game crash occurred. Interrogation of RawCompChunks showed that NextGenGraphics was not changing the decompressed size of any chunks, but one of the two Terminator text chunks was immensely larger than the other. Even more suspiciously, the entry for the smaller chunk was claiming to be the same size as a masked tile.

The problem was that I had configured chunk settings wrong in all my tests. I must have miscopied MaskTileEnd as I was transcribing the settings from the old GalaxyGraphics format; the mistake was replicated into all my testing methods. Setting the correct end of masked tiles (which have a fixed decompressed length and therefore don't get the heading UInteger) fixed the crash. Everything else appeared to be working correctly.

Tomorrow, I'll see if the image serialization code I wrote yesterday actually works.

Friday, June 19, 2015

Gash - Writable

Today I filled in the ToFiles method and the setters on all the NextGenGraphics properties. There is code to serialize all the graphics into their binary representations, but right now I'm trying to get it to read in some EGA resources and then spit them back out without modifying them (essentially decompressing the EGAGRAPH). That's not quite working correctly; sprites, pictures, and fonts make it through safely, but tiles, other images, and miscellaneous resources (e.g. the Terminator-style text) get mangled to varying degrees.
All tiles have a 2px-high line through them and the scoreboard is messed up, but sprites are fine.
I am fairly baffled as to how anything is getting mangled; no actual parsing or image processing is done - it's all using the deferred processing system to avoid doing unnecessary work. Further investigation will be done tomorrow.

Thursday, June 18, 2015

Connecting Unknown USB Devices to Virtual Machines

I have an old scanner that worked fine on Windows XP, but the manufacturer is charging actual money for drivers that work on Vista and above. I'm not going to encourage that sort of business practice by purchasing the drivers, and I'm not really too enthused about buying a new scanner. I do have an old XP machine around that I've been using for scanning, but it is of course old, and it will one day die.

My standard response to situations like this is virtual machines, but the scanner is so weird that newer Windows OSes just treat it as an unknown USB device and refuse to do pretty much anything with it. Inserting it into virtual machines is difficult when it doesn't even display as a device.

The solution is to set the hypervisor to automatically connect USB devices to the virtual machine. In VirtualBox, this is done by adding an empty filter to the USB devices list in the VM's settings. It also has a button to add currently-detected devices to the list, so that's nice too. (If you have an empty filter, every device you plug into a physical USB port will be automatically plugged into the VM, which might be somewhat obtrusive.)

I did get my scanner set up in a Windows XP virtual machine and can scan documents even after that old box gives out.

Wednesday, June 17, 2015

Gash - Deferred Processing

I didn't actually get anything done on Gash today, but I'll take this opportunity to write down my plans for the implementation of its deferred processing (also known as laziness) because it's getting a bit hard to handle when the plan is only in my head.

When the xGA resources are opened with FromFiles, the main file is carved up into chunks which are stored in the RawCompChunks list because they haven't been decompressed yet.

When the chunk data is requested via a call to DecompressChunk, a check is made for the presence of the decompressed version of that chunk. If it is present, that same MemoryStream is returned. If not, the version in RawCompChunks is decompressed, and the resulting MemoryStream is added to RawChunks. The extra compressed version in RawCompChunks is removed.

When an image resource is requested, a check is made for the presence of the fully parsed version of it in the appropriate field. If it's there, it is returned. If not, the decompressed chunk is acquired and then parsed; the result is added to the appropriate cache field and returned.

When a new image object is assigned into a NextGenGraphics property, it is added to the appropriate cache field.

When it's time to save the xGA resources with ToFiles, the equality of the decompression dictionary and standard recompression (null-effect) dictionary is checked. If they're the same, entries remaining in RawCompChunks can be directly copied into the output. If not, they must be decompressed. Every image object in the caches is then serialized into the appropriate binary form and placed into RawChunks. Every entry of RawChunks is then copied to the output.

Tuesday, June 16, 2015

Gash - Rebinarizing

I finally started writing the part of FleexCore2's NextGenGraphics that actually recompiles the xGA resources. I wrote the methods that transform a LowColorBitmap into a byte array of colors-with-mask (the reverse of GetLowColorBitmap) and that transform that byte array into the actual binary data found in the image chunks (the reverse of GetPixelData). I have not yet tested either of those methods, because that would require having a functional ToFiles implementation.

I did start on the recompilation of the three xGA files; it is made a bit tricky by the ability to cache cache chunk data and reuse the raw chunks when the resources they represent weren't modified. When I next work on this I'll finish the xGAHEAD/xGAGRAPH writer to make sure the chunks are laid out correctly, then image serialization can be worked out.

Monday, June 15, 2015

Windows VMs Might Require I/O APIC

If you're virtualizing Windows in VirtualBox, you might have experienced a problem that causes the guest OS to completely fail to boot. If you know the installation to be non-corrupted, the issue is probably caused by I/O APIC being set incorrectly in the hypervisor.


APIC - Advanced Programmable Interrupt Controllers - are a CPU feature that requires special support in Windows. If Windows was initially installed with I/O APIC present, I/O APIC must be on when that OS is running. Conversely, if APIC was not present at installation, it must not ever appear. Windows, starting in Windows 2000, installs very different kernel files depending on the presence of APIC. APIC is required for 64-bit Windows OSes or if you want to use multiple CPUs.

Read more at this ServerFault question or the Wikipedia entry on APIC.

Sunday, June 14, 2015

Windows 10 No Longer Updates Differently

A few months back, I explained how Windows 10 updates differently (not through the normal Windows Update channel). That post was written when Windows 10 was a very different product, so the facts presented there are no longer accurate.

Newer preview builds of Windows 10 are now delivered alongside standard Windows updates, which can be found in the Metro settings app. (Apparently, the Windows Update found in the desktop Control Panel is gone. I'm still not sure how I feel about that.) If a new preview build is downloaded, a Metro-style notification box will appear telling you Windows has to restart to install it.

You can force Windows to check for new preview builds by setting your build acquisition speed appropriately (to "fast" if you want all the features and all the bugs) and then checking for updates as usual.

Saturday, June 13, 2015

Office 2016 Works on Windows 10

Two days ago, I had a rather inconvenient experience with the Office 2016 preview. I did, however, continue trying to make it work - they wouldn't have released it if it didn't work at all.

My first plan was to throw it onto a Windows 10 VM, and that required getting the latest build. One 3GB download and half an hour of installation time later, I had a very nice Win10 virtual machine. I then installed the Office 2016 preview, the trial version, just as before.

This time, when the installer finished, there was an animation above the finishing button. Clicking on that button closed the window correctly without any errors being thrown in my face. I went to launch Word and... it worked! I activated it with the product key given on the webpage, and a little banner indicating the trial-version-ness of the product appeared. I was then able to use Word just as usual.

The only useful difference I've noticed so far - I haven't messed with it much - is the presence of a "what do you want to do?" text box that grants access to all of Word's features when you type a few keywords about what you want to do. It's kind of like searching for settings in Windows 8, except that it seems to actually work.

It also somehow knew who I was and signed me into OneDrive and Office automatically. That was a little creepy. (I'm guessing it looked at the Microsoft account I was signed into the computer as.)

So, I guess the Office 2016 preview only works on Windows 10?

Friday, June 12, 2015

VirtualBox Installation Breaks Physical Ethernet Adapters

A few weeks back, I was having trouble with my Ethernet adapter. Despite it showing up in Network and Sharing Center as providing "Internet access", it was providing no access whatsoever. (Fortunately, I also have a WiFi adapter, which was and is working fine.) Windows network diagnostics provided no useful information, only stating that "there might be a problem with the network adapter." I reinstalled my Ethernet drivers; it did not help.

Looking at the adapter properties revealed that bytes were being sent, but nothing was ever received. I checked the Ethernet cable itself; it was working correctly. I tried disabling some of the extra bridge protocols on the adapter (like VMWare's explosion-at-the-protocol-factory and the VirtualBox bridge thing), but that didn't help either.

Eventually, I tried adding a static IP for that adapter, despite it getting a perfectly valid one from DHCP. That fixed the problem! However, I still didn't know what had originally caused it. I only found that out later, when I installed VirtualBox on a different computer and saw that it soon started showing the same issue. Assigning a static IP on the Ethernet adapter fixed that machine as well. (The other machine also had a working WiFi adapter.)

So, the only conclusion I can draw from this experience is that installing VirtualBox breaks the Ethernet adapter when you have more than one real adapter, unless you set a static IP.

Thursday, June 11, 2015

Trying Office 2016 Preview

I decided to install the preview of Office 2016 on my main machine here to give it some actual testing. Short version of this article: it was a complete bust and I have been moderately inconvenienced.

Since the organization through which I get Office 365 has not enabled preview versions for installation, I chose the download under "Don't have Office 365?" on the product info page. The installer told me that it would remove the old version (Office 2013) from my computer, and I said OK to that. (It's always possible to reinstall the stable 2013 version after removing the preview.) So I waited for the installer to do its thing, and it completed as I expected.

Once I acknowledged the setup completion, an error about OneDrive file synchronization was thrown in my face. It claimed my upload cache had been corrupted, and wanted to replace it with a clean one. I accepted, and it opened the Upload Center, which I didn't really want. There was no close button, but right-clicking the title bar and choosing Close worked.

I then went to launch Word so I could continue editing a document I had been working on earlier. It showed the standard Office 2013 blue solid rectangle with loading dots, then crashed almost immediately without showing a main window. I tried all the Office applications, and all of them crashed similarly. A bit of poking around with Visual Studio revealed that the crash was caused by a null pointer dereference.

My next shot at getting these programs to work was via the Windows compatibility options. I fiddled with the settings and the troubleshooter, and eventually discovered that the apps sort of work if and only if they're run in compatibility mode for Windows 7. I was then able to see their main screen. It looks fairly similar to Office 2013, but with more web-like style (imagine Office Online) and non-all-caps tab names. It also crashed after letting me look at it for five seconds, but it wasn't the same fatal error dialog ("would you like to debug this program?") as before. Rather, it said something along the lines of "PowerPoint ran into an error and needs to close" and offered a "Repair" option, which didn't seem to do anything besides wait two seconds and close the program. (I did get to continue interacting with the UI while said repairing was being done.)

I did some Internet searching on the problem and discovered that having vestigial parts of old Office installations may trip up Office 2016. So I went to Programs and Features and - lo and behold - there was still an entry for Office 2013. I clicked Uninstall on it... and it said it couldn't proceed because there was a newer version of Office there.

Great.

So I uninstalled Office 2016, then uninstalled Office 2013 (leaving behind a bunch of broken shortcuts), then rebooted, and installed Office 2016 again. This time I got no OneDrive errors, but the programs still didn't work. Same crashes and error dialogs as before.

I then resignedly removed the Office 2016 installation and reinstalled Office 2013. At least that still works. I'll keep an eye on Office 2016 development, and maybe try installing the current version in a Windows 10 VM.

Wednesday, June 10, 2015

Office 2016 Preview is Available

Previously only available to large businesses, the preview of Microsoft Office 2016 is now available to everybody. It's completely free, even if you don't have a licensed version of Office already. (Once the actual Office 2016 comes out, the preview will function like a trial version and expire.) You can download it with a full, permanent license through a personal Office 365 subscription or one from your enterprise.

Learn more and get it at Microsoft's announcement page.

Tuesday, June 9, 2015

DHCP on Monitorless Network Appliances

The Linksys LAPN600 I was waiting for arrived yesterday, and today I got to install and configure it. It is a wireless access point, a very fancy one by home user standards1. I was connecting it to a medium/smallish-size network that has a DHCP server assigning addresses in a fairly wide range (Class C subnet).

Now, this device has a default IP address, but it will grab an address from DHCP if possible. That made finding the web configuration very difficult - it has no monitor or numeric display, so there's no way to see its IP2. I didn't have a port scanner or network mapper on hand, so I started trying IP addresses in the DHCP range, one by one, in Chrome. I got tired of that after about 15 tries.

Using my very limited knowledge of VBScript, I threw together a script that opened a browser tab for every possible IP. I then hit the tab-close button like a madman until I saw the right login screen. That was kind of a neat trick, but it made me think that the whole DHCP-on-monitorless-devices thing is kind of a pain.

Wouldn't it be great if such devices had a miniature numeric display that told you its IP address? If that's too expensive, I would be fine with a little button that causes the power light to flash out the IP address in binary3, provided it did so slow enough that I could write the bits down. One could also imagine complicated "grab the network mask from DHCP and add a predefined host section to it" strategies.

Footnotes ("Fleex's Lab: now with footnotes!")
  1. It supports Power-over-Ethernet (which I had never used before), 802.1X supplication, RADIUS authentication, VLANs, 8 SSIDs, and lots of other nice stuff.
  2. I am aware that I could have checked the DHCP server's lease list. I did not have the password to that on hand; the person with access to that was not present. I am also aware that I could have plugged the device directly in to a computer and use its default IP. There was not a spare machine around with a free outlet space that I could see.
  3. Probably in Morse code. Guessing the length of a modest zero run would be about as bad as manually trying IPs in web browsers.

Sunday, June 7, 2015

BcdEdit: "The requested system device cannot be found"

Today I was wrestling a baffling error message displayed by the Windows bcdedit tool:
The store import operation has failed.
The requested system device cannot be found.
I had been trying to create a new BCD store and add a new OS installation to it. This same procedure had worked many times before in virtual machines, so I was very confused as to why it was failing here. (The hard drive did not become bootable; it didn't even show the Windows bootloader OS selection screen.)

It seems the problem was with my memory. Though I had created the partition and ImageX'ed the OS onto it, I had forgotten to mark the partition as active in DiskPart. Typing "active" at the DiskPart prompt marks the currently selected partition as active, making it eligible for booting. The disk then becomes bootable, as it has an active partition.

Thanks to this SuperUser question for reminding me that active is a thing. (Its answer also mentions a rare issue involving USB3 boot flash drives and Windows PE.)

Saturday, June 6, 2015

Just-in-time Active Directory Prestaging with WDS Admin Approval Mode

I have been experiencing issues with automated domain join - I don't want to place admin credentials in clear text, but the WDS standard join doesn't seem to be working with a specialize-pass unattend file. I also didn't want to manually prestage computer accounts, because I have a sizable quantity of computers, so manually creating a bunch of accounts and typing in GUIDs would be a pain.

I did some reading, and WDS has a neat mode in which machines are not able to PXE boot to that server until an administrator approves the machine. That approval creates a prestaged Active Directory account for that computer with the network boot GUID attribute automatically filled. That mode can be entered by configuring the PXE Response tab on the WDS server properties window.

Then, machines should be able to automatically join the domain with the name the administrator approves the machine for - no need to type out GUIDs.

Friday, June 5, 2015

FMod - v2.6.1

Today I ran some tests on Abiathar v2.6.1 to make sure that I hadn't missed any bugs. I found that the Tile Property Modifier was not actually showing the animation target highlight like it was supposed to, so that was a problem. I fixed it by reordering the ShowSelectPlane call and assignment of the selection rectangle; ShowSelectPlane clears the rectangle to prevent highlights from sticking around after the tool is canceled.

That was a fairly easy fix, and nothing else seemed to be wrong, so I recorded the video changelog and made the update live.

Something I forgot to mention in these posts is that I added "Enter ID" menu options to each plane's submenu under Plane. That option provides discoverability for new users (it's not obvious at all that right-clicking the selected tile picture lets you type a different tile ID) and creates a keyboard shortcut: Alt+{1, 2, 3} for the appropriate plane.

After the release, a community member informed me of some problems she encountered while linking audio files for Music Mappings. It turns out that one Keen audio editor (that was actually re-purposed from Wolfenstein 3D) has some bugs that cause it to create bogus chunks and blank songs. FleexCore didn't like those very much, so Abiathar threw an "Error loading audio files" dialog. I made it more forgiving, then gave her a new FMod.dll to try. It worked, and I'll include it in the next update - it's not that common of an issue, and also not really an Abiathar bug. But it does work fine in-game, so I made the patch available for manual download if people need it.

I also wrote a WLF to IMF converter for a newcomer to the PCKF IRC channel. It was a simple matter of dividing the delay on each note by 1.25.

Thursday, June 4, 2015

FMod - Hotkey Swap

I was looking over Abiathar v2.6.1 when I noticed that the hotkeys for the Row and Column Adjusters are really hard to remember. All the other tool shortcut keys have some reasonable mnemonic (to some degree), but I can never keep the adjuster keys straight. One is D and one is E, is all I can remember.

Then I noticed a brilliant possible mnemonic. The E key is right next the R key, in the same row. The D key is right next to the C key, in the (sort of) same column. I tried the mnemonic and... it was backwards. So I switched the hotkeys, and now they make sense. Sort of.

Wednesday, June 3, 2015

FMod - Small Improvements

Today I continued working on the v2.6.1 update to Abiathar. I remembered that the pulse mode checkbox in the status bar did not have its text aligned with the text of the labels in the status bar. I fiddled with Padding properties until I got that text in the right place; it needed to be 4 pixels lower than the default.

I added a configuration option that controls the visibility of the plane name labels. When they are not visible, the graphics-drawing panels gain that little bit of height back. Those plane state labels now have a background that lights up when their plane is active, each with a different color (shade of blue) that makes it easy to tell at a glance what planes are active.

Showing the new plane name labels
There had been some confusion in the community as to whether Lone Editing actually does anything. It does, but it only does things when the tile palette is switched, most easily done with the 7-9 keys. To make its workingness more obvious, I made it disable all planes except the plane whose palette was last viewed when it initially enabled.

I noticed a performance issue (very slow re-render) with tile palette graphics that are updated on mouse movement. Strangely, it only seems to be a problem when Simultaneous Tileset is on, and it only applies to the tile palette. This is super weird because it's more or less the same code path that's used to render in all of those situations. I even broke out Visual Studio's awesome performance profiling tools, but I still couldn't figure out why that one case was so slow. After some minimally effective flailing, I think I improved it a little, but not a lot, but it's not super noticeable/important anyway, so I'll deal with it later only if it presents itself as a more serious problem.

A crash occurred if the extreme left edge (as in the first pixel (not tile) in the row) was clicked in the tile palette. That's fixed now.

Finally, I started writing a new textual introduction to Abiathar to help new users get up to speed.

Tuesday, June 2, 2015

FMod - Reload Graphics Text Glitch Fix

I kind of got carried away researching the Therac-25 incidents, so not much got done today.

While doing some more testing for Abiathar v2.6.1, I noticed that the "Graphics reload in progress" text sometimes sticks around after Reload Graphics has completed. UpdateToolInfo is indeed called after the actual reloading, but sometimes WinForms decides to not actually repaint those labels. Adding a call to Refresh on both the relevant labels (LabelToolData and LabelCurTool) fixed the problem.

I am also considering a more obvious, glance-able visual indication of the plane states. I might as well make use of the plane name labels to provide a thick band of color when the plane is active. I'll implement that tomorrow and see if it's helpful. (I might also add a config option to remove those labels and reclaim that vertical space.)

Monday, June 1, 2015

FMod - v2.6

Today I fixed the small Find Highlight bug (in which it doesn't update after having been disabled, tiles changed, and then it being re-enabled) which I mentioned yesterday. I then recorded a video changelog (explaining and demonstrating the update's features) for last week's changes (v2.6) and put it up on YouTube.

After the release, I got some feedback, which prompted me to make a few changes. The layer boxes (that include the selected tile, the plane state, and the tile ID) are now spaced farther apart and there are now labels indicating the human-readable plane name (e.g. "Background"). There's now an actual checkbox for Find Highlight's pulse mode, and some separators in the status bar for easier reading. The H key (the hotkey for Find Highlight) is now a tri-state toggle: nothing → find highlight → highlight with pulse → nothing.

Those changes will be released at the next update, whenever that may be. (I'm waiting for something more substantial before making people wait for another 5MB download.)