MongooseMod and Totestra

BTAxis

Chieftain
Joined
Dec 5, 2004
Messages
25
Hi.

I was trying to play the mod in combination with the Totestra mapscript, but unfortunately this makes Civ 4 crash (despite the fact that the mod is listed as compatible).

Is there any chance someone can provide a version of the mapscript that will work with the mod?
 
I was trying to play the mod in combination with the Totestra mapscript, but unfortunately this makes Civ 4 crash (despite the fact that the mod is listed as compatible).

That's either due to all the new terrain content I added in v4.1, OR it's due to me having renamed a couple of vanilla terrain objects in the XML at some point, which may not have been the smartest thing I've ever done since I never considered people trying to use outside mapscripts lol...

If you want to try a quick fix yourself, open the mapscript in any text editor, and search-replace all "TERRAIN_SNOW" to "TERRAIN_ICE", and all "FEATURE_ICE" to "FEATURE_SEA_ICE". That may or may not fix it.

If it doesn't, I can certainly go in and update it for you, but it's probably gonna be a few days before I have time, since I still need to work on the PlotGroup lag issue first. Thanks for your interest!
 
Please be aware however, that even if it DOES load, it won't use any of the non-vanilla Terrain or Feature types (which MM has a lot of now). That final, perfect, ideal solution requires changing the mapscript code itself.

The easiest starting point for doing that is probably the C2C version of Totestra, assuming such a thing exists, since C2C has a lot of the same custom map types as I do, but it still won't be an exact match.

Sorry about the renaming thing though - that's my fault!
 
I tried your suggested fix, but unfortunately no dice.

Ideally I suppose this script would be incorporated into PerfectMongoose, though I suspect that would be a boatload of work.
 
I tried your suggested fix, but unfortunately no dice.

Bah. Okay, I'll try to take a look as soon as I can. I'm just really hosed right now on multiple fronts, heh. Gimme a couple more days. :)

Ideally I suppose this script would be incorporated into PerfectMongoose, though I suspect that would be a boatload of work.

They are both full mapscripts, and all full mapscripts have 3 major components: Landmass (land/water shape, and Hill and Peak placement), Climate (Terrain types and Feature placement), and Misc Stuff (river and lake placement, resource placement, and player starting location placements and sweetening).

There's really no need to merge 2 different mapscripts unless you find one of them seriously lacking in one of these main areas. I wouldn't have time for such a project for quite a while anyway, but even if I did, I'd need to know more about specifically which Totestra elements you like, and which you prefer PM to handle. Just saying. ;)
 
Ah, I figured since Totestra is PW2 based it might have a lot in common with PerfectMongoose, but I guess that might have been a mistake.

The main thing I like about Totestra is the way it shapes the landmasses. It offers the user a little more control over that than PW2/3, and the end result tends to be a bit better than PW2 (I don't like PW3's land masses at all). I've also seen good looking river systems and deserts though.
 
Ah, I figured since Totestra is PW2 based it might have a lot in common with PerfectMongoose, but I guess that might have been a mistake.

PM is a highly-modified PW2, with the PW3 generators merged in. The merging isn't as long and painful as, say, merging K-Mod's AI code into a custom DLL *cough*, but it's definitely not an overnight project either.

The main thing I like about Totestra is the way it shapes the landmasses. It offers the user a little more control over that than PW2/3, and the end result tends to be a bit better than PW2 (I don't like PW3's land masses at all). I've also seen good looking river systems and deserts though.

Really? Hmm. I love PW3's landmasses lol, but I've never tried Totestra at all, so I could always end up changing my mind. :)

Adding only their landmass generator would probably not take too long, but it gets a lot thornier if I have to add any custom menus for it. Right now all my popup menus apply to all generator options, and I'd like to keep it that way.

That also begs the other question I asked earlier: What do you need PerfectMongoose for at all then? Just curious. :) Assuming I update Tostestra to fully support the mod, that is.
 
That also begs the other question I asked earlier: What do you need PerfectMongoose for at all then? Just curious. :) Assuming I update Tostestra to fully support the mod, that is.

I wouldn't. Like I said, I just figured it'd be easier to incorporate Totestra's routines with PerfectMongoose than to adapt Totestra itself to MongooseMod, but from what you said it sounds like I was wrong about that. If you do decide to update Totestra itself, PerfectMongoose is neither here nor there.
 
I wouldn't.

Awesome. ;) Yes, definitely MUCH easier to just update 'Tes. I'm kinda curious about it now that you've said how great it is, and even though it's a minor hit to my PM ego, it's a major boon to my full mod to have another mapscript on board.

So I'll definitely take a Turkey-Powered Blowtorch to the Tree of Map-Life, and see what I can carve up. :D I need to finish 4.1b first though.

My schedule is basically thus:

1) Finish all Civ4-related projects by March 18, 2014.
2) Play Diablo 3: Reaper of Souls with my friend, 24/7 for 6-12 months.
3) Play MGO3 in MGS5 on PS4, 24/7 for 3-5 years.
4) Start my own startup game company finally.

So... yeah. :p
 
OK, I'm finally playing Civ 4 again (I'm still playing that old Legends of Ancient Arabia mod for Warlords; one of these I may move on to Beyond the Sword and TAM [The Ancient Mediterranean] — I prefer “one culture or era” mods, especially ancient era, fantasy, or sci fi mods, over “kitchen sink” mods), so I’ve downgraded Totestra’s Mongoose Mod compatibility from YES to MAYBE.

In terms of Totestra offering more control over the world shape than Mongoose Mod, I wonder if the OP was referring to Totestra’s ability to change the map ratio, or its ability to change the number of continents a map typically has (or both).

Oh, yeah, one last thing: The most recent version of Mongoose Mod breaks when trying to generate a map in generic Civ4 (BTS 3.19). If Lunar Mongoose fixes that issue, he will probably make Totestra work in Mongoose Mod again.
 
Oh, yeah, one last thing: The most recent version of Mongoose Mod breaks when trying to generate a map in generic Civ4 (BTS 3.19). If Lunar Mongoose fixes that issue, he will probably make Totestra work in Mongoose Mod again.

Umm, sorry, but I don't understand what that means at all, lol. Are you talking about MongooseMod or PerfectMongoose?

I DID take a look at Totestra about 3 months ago, btw. Even though it's based on PW2, I couldn't get it to work in MM very easily, so I gave up for a while.

To be bluntly honest, I found your stated "I'm an old-school UNIX programmer and I'm going to do whatever I want and I don't care what anyone else thinks" attitude annoying, and more importantly, I found your code VERY sloppy and disorganized. Trying to sort through it was a bit of a nightmare.

I'll try again to convert your mapscript when I have time, but I didn't actually find much IN the Totestra code that set it apart from PW2, besides all the exposed control variables. Maybe I missed some things, but just from reading the file I honestly didn't see how it would generate significantly different and/or better maps.

I would certainly like to include it in my MM releases, but at the moment it is definitely NOT compatible.
 
Umm, sorry, but I don't understand what that means at all, lol. Are you talking about MongooseMod or PerfectMongoose?

Both. The latest PerfectMongoose only works with MongooseMod, which limits its utility compared to older versions of PerfectMongoose (which worked with unmodified CIV4).

To be bluntly honest, I found your stated "I'm an old-school UNIX programmer and I'm going to do whatever I want and I don't care what anyone else thinks" attitude annoying

Sigh. Here comes a two-person "staircase" flame war.

Welcome to the real world. There ain't no such thing as a free lunch. I do not owe you, or anyone else on the Internet, anything, and, since I am a professional programmer, I tend to not write a bunch of code these days unless there is money on the table.

While we're being bluntly honest here, I find it very annoying that, when you updated Mongoose Mod, you broke some stuff that worked in earlier versions of Mongoose. Third party map scripts, such as stock Perfect World and Totestra, used to work in your mod, but now are broken. This is what we professional software developers call a regression and it's considered bad coding to introduce them.

In addition, I find it annoying that you, after promising the community a new version of PM for generic Civ4, you just disappeared from the Civ4 community for months and your files fell off of the Internet; indeed, I was the one who made Perfect Mongoose for generic Civ4 available for download again. And, oh, PM for generic Civ still hasn't been updated since 2011 or 2012 even though you did promise to do so.

I found your code VERY sloppy and disorganized.

That's a subjective impression, and I beg to differ. Indeed, I'm really surprised you could not sort through my changes; they are pretty simple and straightforward.

I didn't actually find much IN the Totestra code that set it apart from PW2, besides all the exposed control variables. Maybe I missed some things, but just from reading the file I honestly didn't see how it would generate significantly different and/or better maps.

Exactly.

My goal with Totestra was to not greatly change PerfectWorld2; indeed, it can make the exact same maps PerfectWorld2 generates with a given seed. My goal was to make a bunch of parameters accessible to users who do not feel comfortable editing the Python file, and to fix a handful of bugs.

Totestra, puts a lot of parameters (that were at the beginning or elsewhere) in the initInGameOptions() function.

I only fixed a couple of issues Perfect World (and, the last version of Perfect Mongoose I have used) had:

  • There are no longer long strings of coastal mountains
  • The maps are now horizontally rotated so flat maps are less likely to have continents split. This can be changed with a parameter.
  • I have added a "service tag" label which has the map seed and parameters on a sign in the north of the map

The only way Totestra changes how the continents are made is by changing the size of the underlying height field. Since the code changes the size of the underlying height field, without changing the size of the virtual Teutonic plates, making the HM bigger results in more stringy maps with more islands.

There's also a ratio option, something Cephalo never made available to be easily modified, which can change the shape of the map (square, big square, 3:2 Earth-like map, 2:1 wide map, or even a 7:1 "ringworld" map).

Trying to sort through it was a bit of a nightmare.

I have attached a UNIX diff file comparing PerfectWorld2 2.06 to the final release of Totestra. It can also be viewed here:

http://samiam.org/Civ4/pw2-to-totestra-20120610.diff

The file is a standard UNIX diff file:

https://en.wikipedia.org/wiki/Diff

---

One last thing: I don't like it when things get tense like this, but I have a need to defend myself when attacked. There are a lot of emotionally immature people on the Internet, especially in the gaming community, who expect something for nothing, and have a temper tantrum like a little kid when you tell them "no". The only way I can keep my sanity is by establishing strong boundaries and letting people know that no means no.

You do not owe the original poster anything, and are under no obligation to make Totestra work with the current version of Perfect Mongoose, so don't stress over it.

Finally, I do appreciate you making Mongoose Mod and Perfect Mongoose available for free. That was a lot of work you did, without getting paid a single cent for your labor. While MM is not my cup of tea (it's a good mod, but I prefer total conversions over "kitchen sink" mods which cover all of history), it's a very good mod and it's obvious you have worked very hard making it.
 

Attachments

  • pw2-to-totestra-20120610.txt
    49.6 KB · Views: 138
Wow. That was a much bigger reply than I expected. :)

Sigh. Here comes a two-person "staircase" flame war.

Not at all. I said exactly what I wanted to say already, and I meant what I said. I have no need or desire to escalate it.

While we're being bluntly honest here, I find it very annoying that, when you updated Mongoose Mod, you broke some stuff that worked in earlier versions of Mongoose. Third party map scripts, such as stock Perfect World and Totestra, used to work in your mod, but now are broken. This is what we professional software developers call a regression and it's considered bad coding to introduce them.

In order to expand my water system in particular, this was unavoidable. I suppose I MIGHT have been able to keep the vanilla names in place and just add to them, but not having a full set of perfectly-matching name entries is not something my Asperger's-slash-OCD brain can handle.

I also renamed a few vanilla things like TERRAIN_SNOW to TERRAIN_ICE, and FEATURE_ICE to FEATURE_SEA_ICE, that were done for my own personal sanity, but in retrospect I will admit those have caused a lot of problems, heh.

Those may not be the ONLY things I did that broke vanilla mapscripts - I'm going from memory here. But regardless, even if a vanilla mapscript DOES "work" in MM, it's not going to work WELL without being specifically modified to support all the custom content. So while it may be a regression, it's not one that bothers me much. (Although "regression" sounds a bit overly formal in this context in my opinion; I tend to think of it more as a math term.)

I am not without credentials myself, btw. They are, of course, meaningless next to yours, since I've almost never been paid for anything I've done in my entire life, much to my eternal torment and dismay. But for what little it's worth, I have a Bachelor's in Computer Science from MIT, and I've been doing miscellaneous programming projects for over 15 years.


Good! I'm glad you find it annoying, since that is a highly appropriate reaction lol. I find it a bit annoying myself. Couple of points, though:

1) MongooseMod was developed so I could play it. I have no interest in playing any other form of Civ; MM is my sole focus. I have a (very) low opinion of the quality of the pure-vanilla Civ4 game, so anything that is made for it, like PM, is done solely as a courtesy to the community, and out of a feeling of obligation to support the masses and other mod-makers, from my point of view.

2) As you know, I am ALSO not being paid for anything I do on here. ;) Therefore, my priorities are not changed from their natural states.

3) I've been on this site, AND actively contributing content in a large variety of significant ways, since 2006. I feel I've earned the right to disappear for months at a time if I want or need to.

4) Just because I haven't updated Vanilla PM for several years, doesn't automatically mean I'm NEVER going to get around to it.

That's a subjective impression, and I beg to differ. Indeed, I'm really surprised you could not sort through my changes; they are pretty simple and straightforward.

Maybe it's just an issue with the source material; PW2 itself was also a mess, if I remember correctly. But to the extent my memory is accurate from 3 months ago, I stand by my assessment 100%. I specifically remember thinking to myself at the time: "I seriously cannot believe he got this to work at all."

It may also be worth noting that, back when I was in college, I was around a large number of people who favored UNIX and LINUX, and even a few who were off-the-deep-end-obsessed with those damned things. I never understood the appeal. Not one bit.

My goal with Totestra was to not greatly change PerfectWorld2; indeed, it can make the exact same maps PerfectWorld2 generates with a given seed.

Now that you mention it, I do remember that specific statement from your Totestra thread. :)

I have attached a UNIX diff file comparing PerfectWorld2 2.06 to the final release of Totestra. It can also be viewed here:

I'm fine with WinMerge, but thanks. ;) Believe me, I diff'd the HELL out of it back when I was trying for several days to get it to work in MongooseMod. In the future when I try again, I'm planning to take a different approach, which is to diff it against PW2, then manually copy things into PM's "PW2 Mode" code one at a time. I'm not looking forward to it.

One last thing: I don't like it when things get tense like this, but I have a need to defend myself when attacked.

I wouldn't call it an attack. I was specifically responding to a statement you made in your Totestra thread. I was paraphrasing from memory because I'm REALLY busy right now.

You do not owe the original poster anything, and are under no obligation to make Totestra work with the current version of Perfect Mongoose, so don't stress over it.

That's not actually true. If I want MongooseMod to be the best mod it can be, then I have to add full support for popular mapscripts like yours.

Finally, I do appreciate you making Mongoose Mod and Perfect Mongoose available for free. That was a lot of work you did, without getting paid a single cent for your labor. While MM is not my cup of tea (it's a good mod, but I prefer total conversions over "kitchen sink" mods which cover all of history), it's a very good mod and it's obvious you have worked very hard making it.

Thanks. I do appreciate being appreciated. :)
 
OK, I'm back. First, I have something which I think will be useful in terms of porting map scripts to Mongoose Mod: A UNIX Unified diff file comparing all of the map scripts you modified against their “generic” form. + at the beginning of a line in the diff file means it was removed from the generic Civ4 map script when made in to a Mongoose map script; - at the beginning of a line in the diff file means it was added to the map script to make it a Mongoose map script. (I should have done it the other way around, but oh well)

A - line followed by a + line means: This line was changed; + is the old vanilla/Warlords/BTS map script line and - is the new Mongoose line.

Now, looking at these, the major changes seem to be:

  • The addition of WorldSizeTypes.WORLDSIZE_ENORMOUS_MONGOOSE (bigger than huge) and WorldSizeTypes.WORLDSIZE_PLANETARY_MONGOOSE (bigger than enormous Mongoose)
  • TERRAIN_SNOW is replaced with TERRAIN_ICE

So, let me make those changes to Totestra and see how it runs in Mongoose mod...
and it still crashes!

OK, we're a little closer to getting Totestra to run in Mongoose 4.1.
 

Attachments

  • mongoose.mapscript.changes.txt
    54.3 KB · Views: 141
OK, here’s how the log loks in Vanilla BTS where it successfully makes a map:

Code:
Random seed (Using Python rands) for this map is     3400107713828395

Keep a note of this; I like this map a lot and it's the kind of map I've been trying to have PW generate for weeks. Finally generated it when I had it make a map to troubleshoot the MM crash.

Anyway, here's the relevant part for our crash:

Code:
Adding Terrain

Finished generating terrain types.

Adding Rivers

Adding Lakes

So, the crash happens not in the python code, but after this code is run:

Code:
def generateTerrainTypes():
    NiTextOut("Generating Terrain  ...")
    print "Adding Terrain"
    gc = CyGlobalContext()
    terrainDesert = gc.getInfoTypeForString("TERRAIN_DESERT")
    terrainPlains = gc.getInfoTypeForString("TERRAIN_PLAINS")
    terrainIce = gc.getInfoTypeForString("TERRAIN_ICE")
    terrainTundra = gc.getInfoTypeForString("TERRAIN_TUNDRA")
    terrainGrass = gc.getInfoTypeForString("TERRAIN_GRASS")
    terrainHill = gc.getInfoTypeForString("TERRAIN_HILL")
    terrainCoast = gc.getInfoTypeForString("TERRAIN_COAST")
    terrainOcean = gc.getInfoTypeForString("TERRAIN_OCEAN")
    terrainPeak = gc.getInfoTypeForString("TERRAIN_PEAK")

    terrainTypes = [0]*(mc.width*mc.height)
    for i in range(mc.width*mc.height):
        if sm.terrainMap[i] == mc.OCEAN:
            terrainTypes[i] = terrainOcean
        elif sm.terrainMap[i] == mc.COAST:
            terrainTypes[i] = terrainCoast
        elif sm.terrainMap[i] == mc.DESERT:
            terrainTypes[i] = terrainDesert
        elif sm.terrainMap[i] == mc.PLAINS:
            terrainTypes[i] = terrainPlains
        elif sm.terrainMap[i] == mc.GRASS:
            terrainTypes[i] = terrainGrass
        elif sm.terrainMap[i] == mc.TUNDRA:
            terrainTypes[i] = terrainTundra
        elif sm.terrainMap[i] == mc.SNOW:
            terrainTypes[i] = terrainIce
    print "Finished generating terrain types."
    return terrainTypes

and before this code is run:

Code:
def addRivers():
    NiTextOut("Adding Rivers....")
    print "Adding Rivers"
[...]

My thought: Let’s remove terrain types until MM stops crashing.
 
As a point of comparison, here's the PM code that does the same thing:

Code:
def generateTerrainTypes():
        print "========================"
        print "Generating Terrain Types"
        print "========================"
        if mc.LandmassGenerator == 2:
                em = e2
        else:
                em = e3
        gc = CyGlobalContext()
        iLush       = gc.getInfoTypeForString("TERRAIN_LUSH")
        iGrass      = gc.getInfoTypeForString("TERRAIN_GRASS")
        iMarsh      = gc.getInfoTypeForString("TERRAIN_MARSH")
        iPlains     = gc.getInfoTypeForString("TERRAIN_PLAINS")
        iRocky      = gc.getInfoTypeForString("TERRAIN_ROCKY")
        iDryLake    = gc.getInfoTypeForString("TERRAIN_DRY_LAKE")
        iDesert     = gc.getInfoTypeForString("TERRAIN_DESERT")
        iDunes      = gc.getInfoTypeForString("TERRAIN_DUNES")
        iTundra     = gc.getInfoTypeForString("TERRAIN_TUNDRA")
        iPermafrost = gc.getInfoTypeForString("TERRAIN_PERMAFROST")
        iIce        = gc.getInfoTypeForString("TERRAIN_ICE")
        iCoast      = gc.getInfoTypeForString("TERRAIN_TROPICAL_COAST")
        iSea        = gc.getInfoTypeForString("TERRAIN_TROPICAL_SEA")
        iOcean      = gc.getInfoTypeForString("TERRAIN_TROPICAL_OCEAN")
        terrainTypes = [0] * em.length
        for i in range(em.length):
                if tm.tData[i] >= mc.OCEAN   and tm.tData[i] <= mc.OCEAN + 3:
                        terrainTypes[i] = iOcean + (tm.tData[i] - mc.OCEAN)
                elif tm.tData[i] >= mc.SEA   and tm.tData[i] <= mc.SEA   + 3:
                        terrainTypes[i] = iSea   + (tm.tData[i] - mc.SEA)
                elif tm.tData[i] >= mc.COAST and tm.tData[i] <= mc.COAST + 3:
                        terrainTypes[i] = iCoast + (tm.tData[i] - mc.COAST)
                elif tm.tData[i] == mc.GRASS:
                        terrainTypes[i] = iGrass
                elif tm.tData[i] == mc.PLAINS:
                        terrainTypes[i] = iPlains
                elif tm.tData[i] == mc.TUNDRA:
                        terrainTypes[i] = iTundra
                elif tm.tData[i] == mc.ICE:
                        terrainTypes[i] = iIce
                elif tm.tData[i] == mc.DESERT:
                        terrainTypes[i] = iDesert
                elif tm.tData[i] == mc.PERMAFROST:
                        terrainTypes[i] = iPermafrost
                elif tm.tData[i] == mc.ROCKY:
                        terrainTypes[i] = iRocky
                elif tm.tData[i] == mc.MARSH:
                        terrainTypes[i] = iMarsh
                elif tm.tData[i] == mc.DUNES:
                        terrainTypes[i] = iDunes
                elif tm.tData[i] == mc.DRY_LAKE:
                        terrainTypes[i] = iDryLake
                elif tm.tData[i] == mc.LUSH:
                        terrainTypes[i] = iLush
        return terrainTypes
 
OK, I have hacked generateTerrainTypes() to only generate plains terrain, which slows down when it crashes. It now crashes after this:

Code:
No room at all found for BONUS_WHEAT!!!

No room at all found for BONUS_INCENSE!!!

number of map areas = 42

len(areaOldWorld) = 42

It's crashing when trying to start players, so let me find out exactly which terrain type makes the closed-source MM dll crash (Any particular reason why this source code is secret?)
 
OK, one final note before I leave for the weekend.

Here is the Totestra Python script line which crashes in Mongoose Mod:

Code:
areas = CvMapGeneratorUtil.getAreas()
[...]
startArea = StartingArea(areas[i].getID())

Now, looking at PM, getID() shouldn't crash...but it does in MM with Totestra modified to generate what may be agreeable terrain (Lunar Mongoose: Since I don't have the source code, tell me: What does generateTerrainTypes() need to return to make MM happy?).

Anyway, I'm out for the weekend and I may ... or may not, depending on how I feel, continue to look at this next week.
 
Wow, I TOTALLY didn't expect all this! Given that I was, admittedly, a little harsh on you out of the blue like that, heh. Thanks very much for your help, vktj!

(Any particular reason why this source code is secret?)

Lol I should put this in the main Sticky thread since it keeps coming up... The main reason is that this mod, and the DLL more than any other single part of it, is the single biggest greatest most-important thing I've ever done or made in my life thus far. I feel the quality of the work is equal to or greater than what the average professional programmer does, and I strongly resent the fact that they get paid huge amounts of money in their happy wonderful lives while I sit here and get nothing. I'm well aware that I CAN'T get paid for Civ4 work specifically, and that would be fine if I had a real job like everyone else. But given that I don't, never have, and almost certainly never will have one, I feel a VERY strong obligation to protect the only thing I have to cling on to. (To be honest, if it were possible to keep the ENTIRE mod closed and not just the DLL code, then I would be doing that.)

If someone WERE ever to hire me with a semi-appropriate salary (entry-level is fine but I'm worth more than minimum wage!), then I would happily release my source code on here the next day. Seriously, I would. The only problem is, that's never going to happen, sigh.

There's also a secondary reason, which is that I've had a HECK of a lot of trouble getting credit for most of the stuff I've done and contributed on this site over the years. I consider it a MAJOR victory that I'm mentioned in the Better BTS AI source code AT ALL. I made a major bugfix to the vanilla code that became part of the Warlords 2.0.8 official patch, but it "wasn't significant enough" for being named, I was told. (Yeah right.) I was the one who heavily rewrote the Sevopedia after BTS came out so people could use it again, and even though it's since been updated further by others, I never get any credit for that. I did a massive amount of icon work in MongooseMod a long time ago that got picked up by the other big mods, and there are still traces of it in C2C now, but I couldn't even convince some of the modders that my claim was true at all, despite having an old screenshot. (I've since been documenting all my new icon-usage ideas in text form in forum posts here so I have date-stamped proof. It's a waste of time to bother of course, but I don't care - I'm doing it out of pure stubbornness and revenge.)

---

Anywho, I'll try to answer your question soon. (The Doctor Who premiere is on shortly, and I have a few other things I have to do as well, but I'm definitely going to get some Civ work done tonight!)
 
Top Bottom