Posts for Acmlm

1 2
6 7
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
It's not the fastest way to beat the game because it requires a potion first (and 150 rupees for a red potion in town), and even defeating Ganon without ACE is around 10 minutes ... but the 3 minute setup time for total control should be optimal as far as I know. As for how the glitch works: - $0010 is used for the game mode (menu screens, overworld, dungeon, etc.), and $0011 is generally used as a submode (transitions, parts of cutscenes or events, etc.) - Using a red potion sets both values to 0E 04 (during the life refill) then back, and opening the door changes only $0011 to 0C (normally giving 09 0C) - Doing both at the same time will first set 0E 04 then overwrite the second byte, resulting in 0E 0C which is out of range When the game is in that invalid mode, the code jumps to $00F8, which conveniently happens to store the last frame's player input (low byte, with the high byte at $00FA). So from there I execute 4C 00 42 (JMP $4200, leading to controller registers at $4218) and do whatever I want. Here I change variables and get sword 133 (which kills Ganon in one hit), then set up a warp to Ganon and return the game to a normal mode ($0010=11, like falling into a hole). I could also set $0010=19 to finish the game instantly or skip to credits, but where's the fun in that?
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Scepheo wrote:
I've watched the 100% run by Acmlm, but both his improvement to that and his any% good ending desync for me. I'd be willing to do a quick (YouTube?) encode of the 100% run though.
Just make sure to delete save.sav (in the game's folder) before running a movie file, since it keeps track of the collected gems and sets the game to time trial mode once completed ... Both runs still sync fine here, with the latest Hourglass (r81).
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
There's actually 3 possible goals for this game: (my vote would go to 100% too) - Any%, bad ending (the shortest, but doesn't even finish the game) - Any%, good ending (you can use another glitch to evert to 6-8 and 7-8, then access world 8 without all gems) - 100%, good ending (much more planning and running around yet still short) The evert glitch also makes world 8 much shorter and more interesting. I had test runs for both good endings (any% in 4:01, 100% in 9:27), and an unfinished improvement for 100% that would have been under 9 minutes ...
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
FatRatKnight wrote:
Unfortunately, we crashed into a pretty severe problem at the refight of that same boss. Namely, the lack of any decent RNGs within several hundred RNG-rolls. We couldn't get anything less than 8 sets of light-drops in decent time. So we took an alternate solution: Destroy those side minions. For whatever reason, destroying them prevents further light drops. Fun, no more need to manipulate that. No analysis was done for any other bosses, however. This is likely one area of improvement.
I dumped a list of all random sequences for boss 1 and miniboss 3, based on frame delays at the title screen then random rolls: http://acmlm.cjb.net:2/emu/nes/fceux/lua/rk-rnd.txt This run waited 8 frames at the title screen, giving a perfect miniboss 3 (no splitting) almost instantly and only 3 lamp falls at boss 1 soon after, but nothing good for channel 5 (which comes at about 330 rolls here). For my team's run, we also considered using this at first but then decided to wait 6 frames instead, giving the wanted results (3 falls and no split) significantly later but with much better luck for channel 5 (7 falls and still no split). I also looked at the few other things that use random values, but most of them aren't worth manipulating: - Each bird enemy (about 10 of them in channel 2 before the miniboss, a few more in channel 5) randomizes on spawn but doesn't seem to do anything with it - The second area in channel 5 (short with skateboarding enemies) spawns enemies at random intervals, ranging from 1 to 15 frames (around 15-20 times total) - Miniboss 2 throws either a green ball or small bomb at 50% chance each (we made it only throw bombs) - Boss 2, when defeated and exploding, randomizes 232 times - The gorilla picks a random X speed (from -2 to +2) on each jump - The final boss sometimes randomizes every frame, for a 1/512 chance (1/4 then 1/128) to drop a bomb There's at least 20 seconds of known improvements (mostly from skipping miniboss 2 in channel 5), and we'll eventually redo channel 5 properly to gain about that much, but it's a definite Yes vote until then (and congrats for finishing a good/submittable run in time)!
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
My desktop: (from November 2009 but still almost current, as it rarely ever changes) - Windows XP in French - Classic mode, with a custom scheme I've been using since 2002 - 32x32 tiled pattern, maybe boring but at least it doesn't distract me - Above HD resolution (1920x1200) + second screen (1280x1024) - A few icons in the top-left corner (My Computer, Recycle Bin, a few folders I left there), but rarely visible - Many of XP's icons replaced with older ones from Windows 2000 or MacOS 7-9 (or in that style) as I liked them better
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
1.73 had a completely new world 8, minor level/enemy changes, and replaced Cocoron's music with a weirder variant of it, but is mostly the same as 1.6 otherwise. I haven't played the older versions and they're not available from the homepage, so I can't tell for those ... "any%, good ending" being possible at all is a bug, also related to the odd deaths. If I'm at an evert point (from falling) when it goes back to "Ready!", the evert point stays active and I can evert up or down (but not both) anytime until I hit another evert point. I used the bug once to evert up to 8 (and reach world 8) without getting all gems, and again in world 8 as a shortcut.
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Eversion worked perfectly for me (version 1.73, Windows XP SP3), with default settings on Hourglass r4 (haven't tried the pause helper in newer revisions yet) ... I only had to disable multithreading to avoid random crashes when rerecording. It also runs at 50fps, not 60 as listed on that page. I already have 2 complete test runs of it (both improvable) as well, and they sync fine with r20 here: - "100%, good ending" in 9:27.04 - "any%, good ending" in 4:01.60
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
This one really emulates 3 different CPU's within each other, not just virtual machines or multiple operating systems: 6502 -> 68040 -> PowerPC -> x86 The emulated NES only runs at about half speed, but that's with a slow emulator that doesn't even run SMB1 properly ...
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Yeah, the O means "April Fools Edition", and it's really good at making joke runs, and like ... ok, that was just a dumb mistake, how about "eff see he you eks"?
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
I do like the idea of having a separate console encode for each of the runs that syncs, for showing they really work (SMB1 is a good start!), having 100% accurate video/sound + blurred pixels and NTSC effect, and looking the same as speedruns (but the new possibility of passing a TAS as a console speedrun is another story).
micro500 wrote:
Well, I did try Super Mario Bros 3. I discovered the console polls the controller twice a frame in that game, so I first had to adjust for that. I still had bad luck trying to get it to run. Sometimes it wouldn't even make it into the first level, sometimes it would make it halfway through the first level, and sometimes it failed somewhere in between. I'm not entirely sure what the problem is, I may give it a try again soon.
The NES has a little known bug with PCM that causes random Right button presses, so any game that uses PCM (like SMB3) needs to poll input multiple times (usually 2, but sometimes more) until the values match, to make sure it's getting the right input. Only Nestopia 1.40 and Nintendulator (0.975, but not 0.965) emulate this bug at all if even properly, and FCEUX 2.1.5 doesn't, so any game that uses PCM isn't likely to sync.
micro500 wrote:
I tried a few other games like Marble Madness, and didn't have too much luck with them either. Are there other games that are as well emulated or lacking a RNG like Super Mario Bros that I might have better luck with? I only went with SMB because people were talking about it being the most likely candidate for this to work.
Any that fits the following conditions: - No PCM (see above) - No lag during gameplay (where exactly NMI interrupts game code, and how often, depends on precise timing), although it might work if input polling isn't affected - No use of uninitialized variables unless it doesn't affect gameplay, but some games init the RAM on startup - Dragon Warrior 1 is a definite no, pausing on the world map runs a short randomize/input loop (until unpause) that needs perfect timing for luck manipulation to sync Some games with luck manipulation might still work, I'd say Tetris has pretty good odds ...
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
And here's mine: http://acmlm.org/tas/hominid/hominid.lua It shows hitboxes, enemy hit points, random increments, enemy locations (direction/distance) for 1-4 and 2-4, and of course things like shots and grenades, with an option to manually lock/increment the random value or set the weapon (for testing):
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Desktop, since March 2009: - Core 2 Quad Q9400 2.66GHz, overclocked to 3.00GHz - 4GB RAM (DDR3 1333MHz, running at 1200MHz), or 3.25GB on 32bit - ATI Radeon HD 4850 - 500GB hard disk (only 15% full) - 27" 1920x1200 + 19" 1280x1024 - Windows XP Pro SP3, 32bit Older desktop, December 2005: - Pentium IV 3.2GHz with HyperThreading - 3GB RAM (DDR PC3200) - Onboard video, downgraded from a dead Radeon X700 - 160GB hard disk - Windows XP Pro SP2, 32bit - Same 19" screen as above (shared), previously had both
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Xkeeper wrote:
Why not a screenshot that shows an L piece clearing 3? That would make it even more obvious something is quite wrong.
I'd go for this too, maybe one of those:
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
It had a few inaccuracies at first, and that's why I left a debug mode in ... that made it only simulate one case and show the turn order, moves, targets and damage (with misses and criticals), so I could see exactly where (and why) it was breaking. By the time I finished the run, it was 100% accurate (except for one minor thing, see below), at least for anything that could happen. The delays on cancel/restart were sometimes 1 less than predicted as well (never figured out why), so I had to skip combinations with any 0 delay (in case it'd be -1) For random battles, I had to give it the path and ground types (and surroundings when going for a specific battle, as it affects what I get), but it was also fully accurate, and even generated controller input to be pasted into the .fm2. It was also very fast, even the longest paths (100-200 steps) were almost instant. You can get the source code for both here, if you want to look at it. (might be a bit hard to follow, though ...)
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Dragon Warrior 1 reads player input in a small endless loop (86-87 times per frame) when paused on the map, and randomizes on each read, so midframe input would allow better luck manipulation. I haven't noticed any such case (or even checked) in other games, but that's still one more use for it ...
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
The whole Yuan Shao section where I destroy everything is one of my favorite parts that I've already rewatched several times, and instantly killing Yuan Shu was great, hehe (I wasn't even trying, the fastest manipulation I found just happened to do that). Ma Chao saying "Such a small army can't possibly defeat us" before the battle was fitting too, but even more before redoing it with Wen Hun (really!). Getting Huang Zhong on the way out would be about 2 seconds faster ... but he'd get Liu Feng's inventory instead of Guan Ping's, and I'd be missing the Silver Key until I get Wen Hun (right after I need it), so this won't work. (and I don't think I'd redo this all over again ...) In other news, it's raining heads again: Cao Pi defeated (3:54 ahead) With only Si Ma Yi left, this should be the last one before I finish and submit. Cao Pi's second battle was just about the hardest to manipulate, and I redid it a few times, but I finally got something that looked good (Lu Sun with 255 agility is definitely helping)! - I skipped the Crossbow, and got the Nu Long instead. This seemed to help a lot more than I expected, as it only took a few battles to regain the 17 seconds it cost, before even getting An Sha (and it's still useful after) - I get Tai Si Ci and Lu Sun a little farther than before (after Zhang Liao). There's a Wu encounter area just 2 steps out of the way, in a longer path that's much easier to manipulate with short delays, so it's faster there. I'm not so sure about the gains/losses from the other changes this caused (2 battles with less characters, no TP left for Ji Mian against Cao Pi 2), but it seems fine.
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Back to where I was, in Wu It did take another week as expected, but what I didn't expect was how many new changes I came up with, and how much more than 3 seconds I could gain: - First, I found out you don't have to talk to Xu Zhe outside of the castle (when he leaves) before warping away, which saved about 10 seconds - I got into Shu, then thought about going back a bit (again) and picking up Wen Hun on the way to Yuan Shao, since he has over 1000 HP (1449) and enough STR (190) to be useful. Getting him only took 13 seconds, that I had fully regained early in Shu (and it made the easiest part of the game even easier) - I was planning to switch him out for Zhao Yun after defeating Liu Zheng (when he'd finally reach 1000 HP), but instead dropped him for Ma Dai and kept Huang Zhong (who already had 1000 by then). Zhao Yun is better, but probably not enough to regain the time it'd take to switch ... I ended up gaining 38 seconds, and I'm now 3:01 ahead of my previous run!
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
http://acmlm.cjb.net:2/emu/nes/fceux/movies/Destiny%20of%20an%20Emperor%20%28U%29-2a.zip I got halfway into Wu (after getting Zhou Yu), 2 days ago ... but I then realized I wasted 3 seconds on menu controls I forgot to optimize (played in realtime) when buying the gullwings, all the way back in Chang Sha. It's not that bad of a loss (for a run of this length, and the potential improvements on luck manipulation still), but it's such an obvious mistake that I really can't keep it there ... I tried fixing it up, and even got the random number (32bit) and frame rule (16) to sync back (only losing 14 frames), but the timing would eventually go off by a few frames, causing a desync after the next 3 battles. So it looks like I'll be redoing everything from that point (almost 30 minutes), but I'll probably keep the same route changes: - I buy all 17 gullwings in one trip, instead of splitting it in 2 - I don't heal at all from there to Yuan Shao - I don't use the inn after Yan Yan either, but after Ma Chao (going into that fight with everyone near dead and still winning it was interesting) - Another I forgot to say earlier is that I picked up the Chi Tu Ma and gave it to Zhang Fei, since killing/weakening an enemy before his turn more often could save enough time. Later in the run, Zhang Fei's inventory will go to Lu Sun and give him 255 agility, which should make his 240 INT really useful for manipulating An Sha (+ turn order). Hopefully I'll be able to save a few more seconds from redoing it, but it'll probably take another week ...
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
I've been working on the improved run since then, currently at Jing Zhou just before fighting Huang Zhong and Wei Yan ... and 1:23 ahead of my earlier run so far. http://dehacked.2y.net/microstorage.php/info/1836707403/doae-new2a.fm2 Now I bruteforce the paths between battles to avoid any random encounters (I never waited more than 1 or 2 frames yet), and try a few different step delays before each battle (then bruteforce each case and pick the best one). Nearly every battle is a few seconds faster than before! I missed Fu Bing by 28 EXP this time, with absolutely minimal Rebel Forces, so it's definitely impossible to get that. I've also done a few route changes so far: - I skipped Huo Hu, which only costs 5 TP and a punching bag. The lowest my TP went before was 5, and I hardly lose any time from not having him, so this should be fine. - Since I don't get Huo Hu, I can use Lu Bu without dumping anyone - Yuan Shu isn't executed. This saves 5 seconds, and fighting him later (with Yuan Shao) won't cost that much. - Some weapons aren't given to the same characters.
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
I'm not exactly sure how much time will be gained, but probably a few minutes total ... I found a better way to manipulate battles fairly late in the run (that should gain up to a few seconds per battle), and can avoid battles better as well (but that'll only add up to a few seconds), but I don't think much else will change. Either way, I canceled this run now since the site (obviously) isn't closing and I'm about to start redoing it. The whole run took about a month to make, but half of it was the ASM work and coding, so it should go a little faster this time ...
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
After Cao Pi's defeat, at 1:14:57 (18:56 ahead) I spent last week figuring out how the random encounters worked, so I could bruteforce them as well:
Encounter chance per ground type:
  Bridge, castle: 0
  Grass, roads:   1/32
  Forest, caves:  1/16
  Hills:        1/8

Number of enemies:
  2: 2/16
  3: 4/16
  4: 5/16
  5: 5/16

- 1/4 chance for the first enemy to be a general (1/2 in Shu and later)
- 1/4 chance for each following enemy to be a general, only when the previous enemy is
- Higher id generals have slightly higher odds to show up, since they're listed first and picked by [random % total in list]
- Enemy forces (rebel, pirate, etc.) depend on the ground types in the 3x3 area around you, but will always be rebel forces in Shu and later
Each step (except on ground types without random battles) also changes the random values, with different results depending on surrounding water/hills/mountains, so this could allow even better All-Out manipulation by trying different step delays before each battle ... but there's so many possible results that finding the best one would be just about impossible. Random battles could be avoided better as well, but bruteforcing every path in the game would be a lot of work for just a few frames each time ... So, with this, I got Zhou Yu with a single rebel force, only waiting a few frames. I also got Tai Si Ci and Lu Sun alone in one battle (about 1/10000 chance), with only 5 steps + 24 frames! I picked them up since they both have over 10000 HP and good stats, and will definitely be more useful than Ma Dai and Zhu Ge Liang. I eventually lose Yi Xin and Bei Ji, so the strategy usually goes like this: - Wipe rebel forces with All-Out, unless it takes too long - Use An Sha on each general (except immune ones) - If there's immune/untargeted enemies, use Ji Mian - To determine who does what, I go by agility rather than INT, since the turn order is harder to manipulate (and matters as much) than success rates (this is why I don't use Zhu Ge Liang's 255 INT, his agility is too low) Hong Shui does nice damage but takes too long compared to All-Out (or even Ji Mian when stopping rebel forces), even with how much defense they have now, so I didn't use it. That and TP is actually put to good use now with An Sha and Ji Mian, enough that I needed a refill on the way to Cao Pi.
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
Entered Jian An at 55:07, 15:20 ahead - I've tried both with and without Zhang Ren, and it's faster without, partly because I have to defeat Lu Bu (7003) before anyone else can show up - I finally used tactics for the first time, against Ma Chao. I froze everyone with Yi Xin (which I've just gotten after the previous battle) and boosted my top 2 attackers with Bei Ji, then destroyed them before they could even attack at all! I tried without tactics first and managed to win in 44 seconds (after hours of bruteforcing), but that was about 10 seconds slower (+ inn). - I used Yi Xin and Bei Ji against Liu Zheng too, but the gain was much smaller, like 2 seconds - I did it again against Fan Zhang, this time I really had to (yet the next battle with similar enemies was easy) - I also ran out of TP there (barely, and I did fine), but I could avoid that by not using any on Liu Zheng - I haven't used the inn at all since Yan Yan, only had a free HP refill (but not TP)
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
All the way up to Liu Kui in 40:25, now 13:14 ahead (the .fm2 is too big for the microstorage now ...) - Still 100% All-Out all the way and no tactician, even the "hard" Huang Zhong fight wasn't that bad (I gained a minute and half in that alone!) - I missed Fu Bing's TP gain by 50 EXP - I picked up Huang Zhong, since his higher HP and STR (from Guan Ping's) should save more time than it costs for the level ups. And I can replace him anyway later ... - I (unintentionally) made the Trident in Nan Yang reappear with the glitch, but it's no longer useful by the time I could pick it up (already got the swords) Now I'm wondering whether I should get Zhang Ren (and drop Zhou Cang on the way there), since he'd be great help until everyone passes 1000 (less STR, but much higher HP for damage and tanking) ... Yan Yan is about as good too, but wouldn't get as much use, especially with Ma Dai coming right after. I'm also not sure how much TP is really going to be needed later (for An Sha killing sprees mostly), since skipping Huo Hu would save some time, and I could maybe keep Zhu Ge Liang in reserve as well ... this would help figuring out the optimal character switching, too.
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
- Keeping Lu Bu in the reserve until Chang An was worth a try, and does give a much shorter path, but it was 144 frames slower (at the next battle) - I tried without Guan Ping and Lu Bu too (got Hua Xiong instead, which took 23 seconds), and was still 36 seconds ahead after defeating Dong Zhuo, but that'd be all lost on the way to Yuan Shu - If I go without Han Zhong, the only gain would be an additional open spot for Lu Bu (and another after he leaves) before dropping anyone, which still has to be done later ... so I'm not too sure I'd regain the 10 seconds lost earlier I ran into that tactic learning glitch when trying the "no Lu Bu" route, and the Club in Yang Zhou was gone ... I had to go back to Xu Rong's fight and manipulate Guan Yu's HP to drop to a specific value to avoid it, then it happened again with Dong Zhuo (2). But at least the earlier one up to Yuan Shu wasn't affected, and it looks like I'll be continuing from there after all. I cleared the unused player 2 input too (never realized that was there), just had to disable player 2 in Input.
Experienced Forum User, Published Author, Experienced player (532)
Joined: 11/14/2004
Posts: 169
Location: Mirabel, Québec, Canada
I gave it a try with Guan Ping + Lu Bu for now: Yuan Shao ambush at 22:00 At Yuan Shu's defeat, I'm now 9:35 ahead of the published run. And I've still never used tactics (or set a tactician), or even commands at all (except to use the Gemsword)! I've only used the inn 4 times so far, as well. But there's still a few minor mistakes I only realized later: - When I left Han Zhong to die in front, I should have put him in second instead, so I wouldn't have to pass the gold key and gemsword - I had to buy 2 gullwings and go back to Xu Zhou so I could make space for Lu Bu, but I'd have to either miss out on Huo Hu (and a TP gain) or dump Han Zhong earlier (before fighting Hua Xiong) to avoid that I'll have to try the alternatives later, but having Guan Ping and Lu Bu (full STR party) really helped ... if it's any hint, just by removing Lu Bu from the fight after using the Gemsword, I regained 15 seconds out of the 40 it cost to get him (+ 65 for Guan Ping). The manipulating went pretty well and really isn't hard most of the time, it usually goes like this: - Enter battle, savestate on the first frame I can do All-Out - Run the bruteforcing, until it finds a few winning combinations (doesn't take more than a few minutes unless the odds are too low) - Look deeper into the best ones to try improving more - If I need to save up HP for more battles, bruteforce again with "minimum HP" conditions and hope I can gain enough remaining HP without losing more than a few seconds - It also helps to run 2 instances of it trying different ranges or conditions, to speed it up - Before finding a winning combination, it checks for minimum enemy HP and shows how close it gets, which can be useful for harder battles to tell whether I have a chance - When it's really too hard or impossible, I can manipulate just a few turns at once with longer delays, minimizing damage or doing more to enemies, until I can finish it normally (that's how I managed to beat Zhang Jao without Han Zhong) You can see the whole thing in action here. It's not really user friendly (all hardcoded in and recompiled each time) and the code is a bit of a mess to look at, but it does in just a few minutes what no one would have the patience to do manually, hehe.
1 2
6 7