Saturday, March 28, 2020

Something A Little different....The First Of The Romans

One on-going project I have at the moment (and one which is going to go on for quite a long time!), is painting up a lot of Warlord Early Imperial Romans. Not for me, I might add, but fun nonetheless. Here are the first 2 cohorts- eventually I'll have a couple of Legions worth + all the Auxilia to do. So, quite a bit.
I'm not doing this alone, thank God, but as part of a team of painters in order to accomplish this massive task.

I've always wanted to do an Early Imperial army, but have never actually got round to it, one of those situations common to just about every wargamer, we all have "those projects" I guess, so having the opportunity to paint one for someone else will hopefully get it out of my system.
Early Imperials have always been the "classic" Romans for me, Square Scutem, Lorica Segmentata, I suspect my like of them goes back to a bunch of Timpo figures I had when I was a youngster.
The Warlord figures have been around for while, go together fairly easily, choices of sword-arm or pilum, a few different head choices. The ones in the pictures are a mixture of the basic set and the set sold as "veterans" - these give you a few extra choices - different heads and helmets, and battered shields. All the veterans have the additional magnia sword- arm armour a few legionaires adopted for the Dacian wars. Fortunately these are indeed for the Dacian campaigns so they will fit right in.
                       There are a few extra metal command figures mixed in- manufacturer unknown.
Anyway, I'm enjoying doing these, which is probably just as well, seeing as there are a few to paint! It makes for a good diversion from the WWII projects which I'm also doing for myself.
        So thats a few Romans, Next up, I'll be showing some rather lovely Dacian tribesmen to oppose them

Grubby Old Grenzers

 Grenzer regts 16 and 17
So, June quickly draws to a close, not a bad month in the world of Austrians, despite a crippling work schedule (Sir Elton John and Lady Ga-Ga being demanding souls), nonetheless, I got over 90 figures whacked off. This included finishing the second 48 of Grenzer. This means I now have 96 of these critters, all with green facings. Subsquently I can use them either as 2 x 48 man units or as 3 x 32's which is some nice flexibility. Eventually I will add another 2 x 48, so will be able to field 4 x 48 or 6 x 32!
 32 man Grenze units are pretty weak in ITGM, which seems accurate.They fight and morale as militia - i.e only plus 1 for morale but they do fire as if they are veteran. So 48's can be a bit pokey in the right circumstances  (sat in a village is always a favourite) They are still a bit hopeless in woods though (move as militia) which doesn't seem quite right. I might need to think about this.
Front Rank officer throwing his weight around with his slimmer Connoissuer squaddies
I'm going back on track with painting line infantry next, this will be the seventh German btn, probably with pale grey facings. The first batch have just been undercoated and are awaiting the old Army Painter treatment.
After six months of not buying (m)any Napoleonic figures my purchasing gland has been getting twitchy. I've been checking out the Sash and Sabre range- I've got some samples on order from Old Glory UK, command for both line and grenadiers. Even if they are not quite what I'm after I'm sure they can be shoe'd into a unit somewhere. I'm over halfway with the line infantry, and will wind up with 16 btns of Germs and Hungarians....but it doesn't seem QUITE enough...so maybe a division of the S&S chaps would round off my army nicely. We'll see.
FR command, Connoiseur and Elite make up the rest
The other Company I've been looking at are Alban. While I like their infantry a lot, I don't think they will fit very well with the massed Elite units, which is a shame. However, the hussars they make look fabulous, and I don't think a cavalry unit will present the same asthetic problems. I don't have any Hussar figures yet at all (that may change very rapidly) but Austrians really should have plenty. I'd like to wind up with 3 units, and I might make them 48 man regts.
3 x 32 or 2 x 48...the choice is mine
Saddened to hear of the death of Paddy Griffith, I re-read his "Forwards into battle" recently. A fairly seminal work IMHO, one of those books that upset a few folk because it challenged the way they LIKED to think warfare was conducted, and arrived at conclusions which weren't cosy with their view. Part of what good historian should do.


Free Web Site Counter
Free Counter

Finished Ice Troll

   The big guy is done and ready to terrify the invaders of the lost frozen city...




Monday, March 23, 2020

1005, Stargunner!

Thank you to everyone for your patience waiting for this Stargunner episode. Of course, the research was all done the week before the episode was due out, then I got sick that weekend. So the lesson here is that procrastination is good. I have a lot of the research done for Infiltrate, so that will be out the week after Thanksgiving, and that will be the last game of the year. So if you have feedback for Infiltrate, please send it to 2600gamebygame@gmail.com by end of day November 25th.

I would like to thank everyone who donated to my Extra Life campaign as well as those of you who watched the live streams that I did. I raised $1500 for the Children's Hospital of Philadephia thanks to all of you. I got an email from Extra Life saying that I was in the top 30 earners for the hospital, which is great! I plan on doing it again next year, but I will be doing the two days in one weekend. I had fun playing the games, but I got a little frustrated towards the end of the second weekend. Sinistar is an extremely difficult game but I love it so much, for some reason.

Thank you all so much for watching, listening, and donating. I hope that all my American friends have a wonderful Thanksgiving.

Please donate to my Extra Life campaign!
Sean's Extra Life page
Andrew's Extra Life page
Rick's Extra Life page
Bryce's Extra Life page
Marc's Extra Life page
Stargunner on Random Terrain
Alex Leavens interview by Dan Gutman, Video Game Players magazine 11/83
Stargunner on Atari Protos
Video Game Update newsletter February 1983
Arcade Express newsletter January 3 1983
Arcade USA Atari Remote Control Joysticks

Friday, March 20, 2020

Reader Experience With 404S

There are many days when I don't feel like working on my project. I use this feeling to "productively procrastinate" on things that I've been wanting to do but haven't done yet. Earlier this week I decided to tackle two related problems:

  1. I want to know which pages are reachable from the home page. I can then review the ones that aren't reachable and consider adding them if they're finished.
  2. I want to make suggestions on the 404 page, but only to pages that are reachable from the home page. There are a whole bunch of random pages I have that aren't finished or useful, and I don't want to use those for suggestions.

To implement this, I parsed each page and found the links using a regular expression pattern and some quick-and-dirty code:

RE_anchor = re.compile(r'<a[^>]* href="([^"#]+)[^"]*"') def url_links_to(relativeurl, html_contents):     "Return the set of relative links from this page"     site = "https://www.redblobgames.com"     urls = []     for url in RE_anchor.findall(html_contents):         if url.find("mailto:") == 0: continue         url = urllib.parse.urljoin(site + relativeurl, url)         if not url.startswith(site): continue         url = url.replace(site, "")         if not (url.endswith(".html") or url.endswith("/")): continue         if url.endswith("/index.html"): url = url.replace("/index.html", "/")         if url == "/": url = "/index.html"         if url in urls: continue         urls.append(url)     return urls 

I then used depth first search to find all the pages reachable from the home page:

# link_map[url] = urls_links_to(url, contents of page) def all_reachable_pages(link_map):     "Return a list of all pages reachable from the home page"     frontier = ["/index.html"]     reached = set(frontier)     while frontier:         url = frontier.pop()         if url not in link_map:             print("WARNING: possible 404", url)             continue         for child in link_map[url]:             if child not in reached:                 frontier.append(child)                 reached.add(child)      return reached 

For part 1, I made a list of the reachable pages and I plan to review it periodically.

For part 2, I want help readers who encounter a 404 on my site. I looked through the 404 server logs to see what I might be able to help with. I found lots of bogus requests such as wpAdmin and other admin URLs (people trying to break into my server), and also lots of what seemed to be buggy crawlers. But I also found many URLs that seem to come from real humans. These seem to be either from copy/paste or forums automatically linkifying URLs:

The last one looks like a Markdown typo. There are also some that look like escaping/quoting errors:

All of these seem to have an unwanted suffix. I decided to implement a suggestion on the 404 page. I looked for a prefix of the non-matching URL that matched a valid URL. I picked the longest match:

const request = window.location.pathname; let bestUrl = ""; for (let url of urlsReachableFromHomePage) {     if (url.length > bestUrl.length         && request.slice(0, url.length) == url) {         bestUrl = url;     } } 

You can try it out by clicking on the broken links above.

This was a relatively low priority project but so satisfying.

Thursday, March 19, 2020

Testing Esoteric Lists: Gunny & Madrak2


Last night I was able to get an astounding two games in and as I was heading to my FLGS I decided I didn't want to just run the popular pairing of Madrak1 and Borka2, mainly because I've played a ton of Madrak1 already and while Borka2 is fairly new for me I have had a few rounds with him already.  I just wanted to try some lists that were of my own design that I thought were interesting and possibly strong.

So in I went with a "pairing" to put down into whoever I was playing against: Gunnbjorn and Madrak2.

I'll tackle each list and the match up in turn.

Gunny 

Trollblood - Gunny Goes North

Theme: Storm of the North
2 / 2 Free Cards     75 / 75 Army

Captain Gunnbjorn - WB: +28
-    Trollkin Runebearer - PC: 0
-    Dozer & Smigg - PC: 18 (Battlegroup Points Used: 18)
-    Dire Troll Bomber - PC: 19 (Battlegroup Points Used: 10)
-    Dire Troll Mauler - PC: 15

Hearthgut Hooch Hauler - PC: 18

Bog Trog Mist Speaker - PC: 4
Valka Curseborn, Chieftain of the North - PC: 0

Krielstone Bearer & Stone Scribes - Leader & 5 Grunts: 9
-    Stone Scribe Elder - PC: 3
Northkin Raiders - Leader & 9 Grunts: 15
Swamp Gobber Bellows Crew - Leader & 1 Grunt: 2

I was really excited about this list since it seems like it can clear a lot of infantry off the board or shoot a heavy off the table.  I've been dying to find a way to make the module of Hauler + Raiders work, and I feel giving them Snipe via Gunny or Grim2 is the way to really make them shine.

I put this pair up vs. my friend Brian who was coming back to playing Khador after 8 months of playing Circle and a lot of other games.  He had Butcher3 with Jacks Galore and a Zerkova 2 list with lots of Greylords and a smattering of Doom Reavers.  I really wanted to try Gunny and on discussion of the matchup it was clear that Zerkova 2 would get shot down pretty hard on the approach before she could really do any damage, plus most of my army is going to be Cold Immune, meaning he had to drop Butcher.  Madrak is probably the better Butcher3 drop, but I wanted to see how Gunny would match up.

Brian's list from memory was roughly:

Butcher 3
-Wardog
-Berserker
-Berserker
-Ruin
-Grolar

Forgeseer
-Behemoth

Forgeseer

Eliminators
Eliminators
Mechanics 

Brian won the roll off and elected to go first.  Scenario was Outlast.

After running his army into position up the field on turn 1, I replied by feating early to avoid the Behemoth clearing out swathes of my Raiders and running to be just out of Brian's threat ranges.

Thanks to Dozer's animus I was able to get lucky drifts/boosts onto one member of each unit of Eliminators and take their gang bonus off the table.  Still I was being a bit too timid by staying out of his threat ranges and I had blocked up my Hooch Hauler behind my Raiders making the order of activation awkward on this and the following turns.

On Brian's second turn he simply positions to threaten the entire zone and moves Butcher on to the central flag on his side. He moves Ruin into some rough ground for cover and positions both Argus centrally to threaten as well. 


On my second turn I decide that Ruin and both of the Argus must die to take away relentless charge from Butcher so I can use Rockwall to try and control him plus the drags.
 
I'm able to kill both Ruin and the Argus, but it takes literally everything my army has to do it with. I made a mistake and failed to contest Brian's flag and we both go up a point.  I use a Rockwall to prevent Butcher from being able to charge/move+impending doom any of my heavies in, so Brian elects to keep him on the flag for the turn and merely runs or sends in what Jacks he can to jam me up.  He does clear one zone and manages to score it however. Still, far too much of his force is out of threat ranges and his ranged attacks don't do too much work on the Raiders. 

At this point we start doing trades, and I'm able to tie the score on CP's, but I make a mistake with Gunny and move him too far forward to where he is in danger of the Butcher and I forgot to cast my Rockwall. I do end up decently ahead on Attrition, though Butcher can swing things back around had Brian not gone for an assassination. 

Sadly for Brian his dice manage to fail him completely and Butcher is left engaged with a Bomber and Gunny in melee and concedes based on the fact that Butcher has zero camp and will likely get splattered. 

In hindsight I should have lost this game on two fronts: First the assassination should have worked as a punish for my mistake, and second if Brian was simply more aggressive just running literally every Jack at my list, I don't think I'm able to effectively trade pieces and take what is necessary before the Butcher can come in and remove all threats to himself and then just seal the game from there. I'm sure if this wasn't his first game with Khador in 8 months I'd have been splattered pretty handily.

While I think the list seemed great on paper, it doesn't bring a lot of bodies to the game. Perhaps my feelings are colored by the matchup being bad overall and with better placement of the Raiders and Hauler I would have more game against other lists on the same scenario, but this will require testing and a skeptical eye to see how things are.


Madrak2
 
Trollblood - Madrak2 Toughallo

Theme: Band of Heroes
3 / 3 Free Cards     74 / 75 Army

Madrak Ironhide, World Ender - WB: +28
-    Trollkin Runebearer - PC: 0
-    Dire Troll Mauler - PC: 15 (Battlegroup Points Used: 15)
-    Dire Troll Bomber - PC: 19 (Battlegroup Points Used: 13)

Fell Caller Hero - PC: 0
Fell Caller Hero - PC: 0
Eilish Garrity, the Occultist - PC: 5

Krielstone Bearer & Stone Scribes - Leader & 5 Grunts: 9
-    Stone Scribe Elder - PC: 3
Trollkin Long Riders - Leader & 4 Grunts: 20
Trollkin Long Riders - Leader & 4 Grunts: 20
Kriel Warriors - Leader & 9 Grunts: 11

I was/am really excited about this Madrak2 list. My initial thoughts with the caster is to pretend I'm a MK2 Cryx player and jam in 2x Fennblades + 2x Kriel Warriors + solos and run screaming at my opponent.

Then I got to thinking about how while other warlocks can deliver units like the Long Riders, a unit I absolutely adore, no one really makes them hit any harder and while they're very strong, they're not going to just blow up a heavy without any buffs.  Plus the problem with a 40+ dude infantry swarm with Madrak2 is it lacks basically any relevant guns and it's not very hard for enemy shooting to continually clear off my infantry. Once the Fennblades have been hit, the Kriel Warriors will get out paced and likely shot up pretty hard.  This would turn things into a game of "Who won to go first".

With the Long Riders I should still be able to chew through enemy models and also withstand enough shooting to do serious damage once the lines meet.  Initially the list had two units of Kriel Warriors to back up the Long Riders, but I decided the list was susceptible to control and I threw Ellish in. With the extra points I upgraded my Earthborn to a Bomber to get some ranged presence which I really found to be helpful. 

I played this list into Sean, someone who I've met but haven't played against.  He dropped Skarre1 Dark Host into me:

Skarre1
-Scarlock
-Inflictor
-Stalker
-Stalker

Wraith Engine

Bane Riders
Bane Knights
Min Bane Warriors + CA

Darragh
Necrotech
Tartarus

Scenario was Standoff and Sean won the roll to go first.

This game ended up being a bit of a back and forth with some key positioning elements due to equivalent threat ranges on our Cav and my spacing models out properly to avoid a Stalker being able to kill multiple Long Riders without issue.

I won the game in the end, but part of that could have been due to the fact that Sean had deployed Darragh with the infantry units on the flank opposite the Bane Riders, so we shared a threat range rather than him having an advantage.  He also apparently didn't know that Long Riders could slam models, and so I was able to eliminate all of his Bane Riders in exchange for sacrificing only one of my Long Riders.  It should be noted that Blood Fury'd Bull Rush slams, when knocking the slam target into another model or terrain is very strong.   Still Sean was very careful to only feed me feated on Bane Knights for my feat turn, and spaced appropriately with his other units in reserve to prevent me from getting too far ahead on attrition. I suspect if we played again this game would be much tougher and far more favored to the player who wins the roll to go first based on how each of our lists were designed.

I know I could play this list in Storm of the North to get extra speed on my units, but I think having Band of Heroes for the extra 2" and Takedown/RFP is absolutely crucial in the meta ATM.  Right now Trolls are balanced in that we can either speed up our Long Riders or we can buff their damage, but we can't do both. I do think the unit has a lot of untapped potential, and since I own two units of them now, I want to experiment a lot with them.

Conclusions

After both games I am more optimistic about Madrak2's list than I am about Gunny.  I am not sure how I feel about leading with my Cav up front, but I do know that making Long Riders weapon masters makes it so that they can easily kill any heavy on the charge with the usual amount that can get into one via positioning rather than not.  They also are fairly well positioned to be able to handle infantry due to Bull Rush.

As for Gunny, I think he just needs more testing. It may well be that what I have is sufficient, but man does it ever feel like having just more units to be able to throw into zones is the way to go.  Melee also just feels much stronger than guns at being able to do what is necessary: Jam up and piece trade, so as to allow Trolls the ability to play the Attrition game we're supposed to be very good at.  Guns still have a lot of value, but it's more about being able to snipe out a key model in a zone or scalpel out an important support solo or CA/WA/etc.

Still, I really want to find a way to make the Hauler + Raider package work well, it just seems like it should be so good on paper. I believe Grim2 is the next place to look with them, but I'm having trouble rounding out a SotN list that I like that includes that module.

Model For The Good Store

"And here is where we thought about putting in a cafe."

This business is one of constant brainstorming for the successful. For most stores, which I will maintain are not very good (fight me), the answer to all questions is often doing the thing you're doing now, but better. More inventory, better trained staff, better events, an improvement process and an upgraded look. Most stores don't need a cafe to be relevant.

They should know by looking around where they could spend the time or money. You could expand and upgrade for quite some time, really, but most stores struggle on a daily basis and never get the chance. It's the curse of under capitalization in a low barrier to entry market. Often it's not even about money.

Visit enough stores and there are simple improvements that just take elbow grease. For many it's as simple as picking up the trash you can see when you look in the window, or re-arranging the product on the damn shelves. Basic retail. Problems I saw throughout Pennsylvania and New York this month. One or two of those stores ran a super tight operation on what you could tell was a low budget operation. One was scrappy and organized and had family and part time staff stocking shelves on a Sunday. That made me happy.

The idea we need to diversify into some new business model is compelling, mostly because successful business owners look for trouble. We want new problems to solve, not the same old problems. I preach how a Unique Value Proposition, over time, eventually becomes only a Useful Value Proposition and then No Value Proposition.

The next thing is a real struggle. But I'm also thinking now that running a really, really good retail model that focuses on serving the community can be Unique. I'm loathe to say this, really, because most of my peers think very highly of themselves. Most store owners think their stores are much better than they actually are. This is often because we don't know how to measure. We don't know how to look at our stores with clear eyes. Most store owners often don't get outside of their local bubble (why I like to visit stores). We also can't even decide what good is.

Get a dozen game store owners together (if you can decide what that means) and they'll argue, Clintonesque style, about the meaning of the word good. Good for one is the most profitable, while other owners will argue that stores aesthetic hold it back from that desired profitability. Some will claim they only meant to serve a small market when they made their polarizing choices. Good to you may just mean a steady paycheck.

The debate about Wizards of the Coast Premium stores elucidated much of this. Other people, not even store owners, are telling you what they believe is good, with rewards attached. Store owners hate this. Try to help one of these store owners with their problems and they will quickly produce reasons for why they do a thing badly. Alright, alright. Maybe you need a cafe after all. I should mention Premium rewards a type of existing store and there are plenty of good stores that don't meet that criteria. It doesn't make them less good.  All Premium stores should be good (a debate in itself), but not all good stores are Premium.

This leads up to my visit with Millennium Games in Rochester New York this week. It's an example of doing the standard model, for a long time, really, really, well. It's notable to me because it's a large store that clearly engages in best practices and a constant improvement process, rather than some unique, large store model. Also, when I say standard model, I'm talking about a basket of game retail best practices, since baseline game stores, as I've postulated, kind of suck.

Millennium is unique as a large store because most large stores appear to have teleported from the past, their inventory, and unique practices, not particularly replicable intact. Other stores appear to have been built from whole cloth with buckets full of money. Millennium is a best practices store, only much, much bigger. As I can't time travel and I don't have buckets of money, this is compelling as a model.

As you walk in, it looks brand new, because they have a process and budget for constant improvement. The retail space is vast and the game space comfortable. There are about 100 photos on my Facebook author page (please subscribe). If I sound like I'm heaping on praise, it's because it's a model for the future, unlike other big stores which are great, but mostly as interesting anomalies. Millennium got there by doing the thing, year after year, only better each time. It's the same thing I do at a smaller scale, and you might be doing. That gives me hope both for myself and for retailers in this trade.

Suck Less

Burned Out Of Warmaster Dwarves

I'd like to finish the basing on the Dwarves as well as their artillery before the end of the year but I'm burnt out on them for now. I headed back to the Void Spinners (third times the charm) and finish 2 of them. I hope to finish the third, touch-up the black highlights and de-gloss them this weekend.

Epic Eldar Void Spinners Epic Eldar Void Spinner Array

This is what I managed to get done last week before Fall In! I finished the skin and hair on the dwarves, and got them on bases along with the ballast. The decals didn't end up working out, they printed poorly and I found myself touching them up far too much. I scrapped the idea and painted simple patterns on the shields to differentiate the Warriors. I'll got back and match the shield pattens on the banners as well.

Warmaster Dwarves Warmaster Dwarf Warrior Command Warmaster Dwarf Warrior Command Warmaster Dwarf Thunderers Warmaster Dwarf Long Beard Hero Warmaster Dwarf Thunderer Hero Warmaster Dwarf Anvil of Doom (+2)

The general still is a work-in-progress, I'm converting him up along with an unreleased musician. I did manage to get some good decal prints for him and the Anvil, they'll be the only two in the army.

Warmaster Dwarf General (sans General)

Monday, March 16, 2020

Ep 30: Talking History Is Live!

Ep 30: Talking history
This episode is being released on December 7th, 2017. On this date, 76 years ago, naval aviators of the Imperial Japanese Navy attacked United States forces stationed in Hawaii. This led to the US's involvement in the second world war. Please join me in a moment of silence in remembrance of those who died during the war, as well as those who survived the war and have since passed.
Join the conversation at https://theveteranwargamer.blogspot.com, email theveteranwargamer@gmail.com, Twitter @veteranwargamer
Try Audible for your free audiobook credit by going to http://audibletrial.com/tvwg
Music courtesy bensound.com. Recorded with zencastr.com. Edited with Audacity. Make your town beautiful; get a haircut.

Sunday, March 15, 2020

Beat The Price Increase

The new pricing structure takes effect on February 15th. We are offering up to a 30% discount our current off MSRP until that date.
Most items will see a 5% to 8% increase and a few specific items will be higher.
If you have an item or two that has been on your bucket list, this might be a good time to blow the dust off the list.

 (from prior post)
We started down the road to manufacturing plastic kits in 2012, a lot has happened since then. I have seen shipping prices nearly double, WGF has ceased to be our distributor and we have taken over that aspect of operations. We now purchase our kits from WGF China directly.
We recently place two restock orders to bring our stock levels back on par, the shipping costs have been an eye opener. In many cases shipping from China to the US was more than the actual cost to manufacture a kit. Some kits needed to be brought in line with their cost of production. This price increase was as minimal as we could make it most items will see an increase of 5% to 8% with some more drastic adjustments to kits that were selling into distribution at a lower than delivered cost to us.
To maintain the health of DreamForge-Games it has become clear that we will need to implement a price increase, effective February 15th2016
 
 Mark Mondragon
DreamForge-Games

Thursday, March 5, 2020

(205) Download Limbo Full Game Full Version For Pc

(205 MB) Download Limbo Full Game Full Version For Pc



Screenshot



System Requirements of Limbo

  • Operating System: Windows XP/ Windows Vista/ Windows 7/ Windows 8 and 8.1
  • CPU: Pentium 4 2GHz processor
  • RAM: 512MB.
  • Hard Disk Space: 185MB.








TOP 10 MOVIES OF 2019


The new year is here, and so Top 10 season is upon us. The tradition is to rank media in a seemingly arbitrary fashion so here's my oh-so personal list of moves faves that came out 2019. What will be number 1? Read on to find out...

Read more »

Black Mesa Review - A Masterful Remake That Improves Upon A Classic - Eurogamer

Black Mesa review - a masterful remake that improves upon a classic

Wednesday, March 4, 2020

Geographic Variation In The Pocket Gopher, Cratogeomys Castanops, In Coahuila,

Geographic Variation in the Pocket Gopher, Cratogeomys castanops, in Coahuila,

Brainstorming With Reversal

In the previous two posts I described how I sometimes approach a problem by trying to arrange it into a matrix. Sometimes that doesn't work and I instead try to look at the problem backwards. As an example, consider procedural map generation. I often start with a noise function, adding octaves, adjusting parameters, and adding layers. I'm doing this because I'm looking for maps with certain properties.

Map of a procedurally generated island

It's fine to start by playing with parameters, but the parameter space is rather large, and it's unclear whether I'll actually find the parameters that best match what I want. Instead, after playing around a bit, I stop and think in the opposite order: if I can describe what I want, it might help be find the parameters.

This is actually the motivation I was taught for algebra. Given an equation like 5x² + 8x - 21 = 0, what is x? When I didn't know algebra, I would've solved this by trying a bunch of values for x, jumping randomly at first, then adjusting it once I felt I was getting close. Algebra gives us the tool to go in the other direction. Instead of guessing at answers, it gives me tools (factoring, or the quadratic equations, or Newton's iterative root finding) that I can use to more intelligently find the values of x (-3 or 7/5).

I feel like I often am in that same situation with programming. For procedural map generation, after tweaking parameters for a while, I stopped to list some things I wanted for the game worlds in one project:

  1. Players should start far apart on the beach.
  2. Players should move uphill as they level up.
  3. Players shouldn't reach the edge of the map.
  4. Players should join into groups as they increase in level.
  5. Beaches should have easy monsters without much variation.
  6. Midlands should have a wide variety of monsters of medium difficulty.
  7. Highlands should have hard "boss" monsters.
  8. There should be some landmark to help players stay at the same difficulty level, and another landmark to help players go up or down in difficulty level.

That list led to some constraints:

  1. The game worlds should be islands with a lot of coastline and a small peak in the center.
  2. Elevation should match monster difficulty.
  3. Low and high elevation should have less biome variation than middle elevations.
  4. Roads should stay at a fixed difficulty level.
  5. Rivers should flow from high to low elevation, and give players a way to navigate up/down.

The constraints then led me to design the map generator. This led to a much better set of maps than the ones I got by tweaking parameters like I usually do. And the resulting article has gotten lots of people interested in Voronoi-based maps.

Another example is unit tests. I'm supposed to come up with a list of examples to test. For example, for hexagonal grids I might think of testing that add(Hex(1, 2), Hex(3, 4)) == Hex(4, 6) . Then I might remember to test zeros: add(Hex(0, 1), Hex(7, 9)) == Hex(7, 10). Then I might remember to test negative numbers too: add(Hex(-3, 4) + Hex(7, -8)) == Hex(4, -4). Ok, great, I have a few unit tests.

If I think more about this, what I really am testing is add(Hex(A, B), Hex(C, D)) == Hex(A+C, B+D). I came up with the three examples based on this general rule. I'm working backwards from this rule to come up with the unit tests. If I can directly encode this rule into the test system, I can have the system itself work backwards to come with the instances to test. This is called "property based testing". (Also see: metamorphic testing)

Another example is constraint solvers. In these systems you describe what you want in the output, and the system comes up with a way to satisfy the constraints. From the Procedural Content Generation Book, chapter 8:

In the constructive methods of Chapter 3 and the fractal and noise methods of Chapter 4, we can produce different kinds of output by tweaking the algorithms until we're satisfied with their output. But if we know what properties we'd like generated content to have, it can be more convenient to directly specify what we want, and then have a general algorithm find content meeting our criteria.

In Answer Set Programming, explored in that book, you describe the structure of what you're working with (tiles are floors or walls, and the tiles are adjacent to each other), the structure of solutions you're looking for (a dungeon is a bunch of connected tiles with a start and an end), and the properties of the solutions (side passages should be at most 5 rooms, there are 1 or 2 loops, there are three henchmen to defeat before you reach the boss). The system then comes up with possible solutions and lets you decide what to do with them.

A recent constraint solver got a lot of attention because of its cool name and demos: Wave Function Collapse. You give it example images to tell it what the constraints on adjacent tiles are, and then it comes up with more examples that match your given patterns. There's a paper, WaveFunctionCollapse is Constraint Solving in the Wild, that describes how it works:

Operationally, WFC implements a non-backtracking, greedy search method. This paper examines WFC as an instance of constraint solving methods.

I done much with constraint solvers yet. As with Algebra, there's a lot for me to learn before I can them effectively.

Another example is when I made a spaceship where you could drag the thrusters to wherever you wanted, and the system would figure out which thrusters to fire when you pressed W, A, S, D, Q, E. For example, in this spaceship:

Example spaceship from a project of mine in 2009

If you want to go forwards, you'd fire the two rear thrusters. If you want to rotate left, you'd fire the rear right thruster and the front left thruster. I tried to solve this by having the system try lots of parameters:

Possible movements of spaceship

It worked, but it wasn't great. I realized later that this too is another instance of where working backwards would have helped. It turns out the movement of the spaceships could be described by a linear constraint system. Had I realized it, I could've used an existing library that solves the constraints exactly, instead of my trial-and-error approach coming up with an approximation.

Yet another example is the G9.js project, which lets you drag the outputs of some function around on the screen, and it will figure out how to change the inputs to match your desired output. The demos of G9.js are great! Be sure to uncomment the "uncomment the following line" on the Rings demo.

Sometimes it's useful to think about a problem in reverse. I often find that it gives me better solutions than if I only consider the forward direction.