PDA

View Full Version : Milestone 5



RonHiler
05-15-2008, 08:43 AM
Alright, time for a brand-spanking-new milestone thread!

To me, anyway, this is where things are going to start getting a bit more interesting. We're going to be doing the lion's-share of creating a world in this build, so it should be some good stuff.

This is the longest milestone to-date, with 24 entries in it. However, a whole lot of them are pretty trivial (there are a bunch that are nothing more than UI setup). So we'll see how it goes. I'm hoping this one isn't nearly as long as Milestone 4 was, in terms of coding time. But you know how that goes.

I spent the last couple of days going over the design doc, and I think it's ready to be posted, so I'll be doing that shortly. It's grown by another 3 pages, hehe. Not a lot of new text in this one, I just finished the list for M6 and added the list for M7, and did a bit of minor rewriting here and there. It didn't seem to me that we needed a lot to go ahead with M5 for this one, I did a lot of work on it between M3 and M4.

It also occurs to me I didn't post any screenshots for M4. So I'll go ahead and do that as well before I get started with the coding.

So here we go with another one!

RonHiler
05-19-2008, 08:55 AM
After finishing Milestone 4, I took a couple of days off before plunging back into the code (need to recharge my batteries with a little bit of downtime, after all, hehe).

I started M5 this morning. Just now I finished the 6th item on the list, out of 24. Now that's the kind of progress I like to see, fully one quarter of the milestone list finished in about two hours :)

Of course, it won't all go that fast, unfortunatley. There's some serious coding in this one to be done, but I think there's a solid plan in place to tackle even the more complex stuff. This may be the longest milestone (in terms of number of entries at 24) through the first 7 of them, but so far so good.

RonHiler
05-22-2008, 08:10 AM
Alright guys, I'm now a good chunk of the way through item 11 of M5, which at least numerically, puts us almost halfway through the milestone. So far so good. There hasn't been anything too difficult so far. I'm going to make a few internal changes to how race files are handled (as a part of item 11) which will also resolve one of our known issues from M4 (non-persistant race data in the race builder screen).

The devs over at DDO have just put Mod 7 on the public test server, and Mod 7 includes a new class (Monks). What that means is that I'm going to have to stop working on MD for the weekend and update the DDO character planner. Shouldn't take too terribly long, I'm thinking I should finish it over the weekend with a bit of work.

RonHiler
05-30-2008, 08:11 AM
Lest you guys think I've been slacking on MD while building my new rig and working on the DDO character planner update (which is done and in testing phase), I have in fact made progress. We've slowed down a bit on the milestone list, and I'm still working on Item 11, but that's because I detoured a little and decided to take care of one of our known issues, which was the non-persistant race data in the race design screen (I guess I mentioned I was going to deal with that in the last update).

Well, we now have persistant races. Yay! :) This was actually related to item 11 on the list, which is why I decided to tackle it now rather than later (I know adding a "Browse" button doesn't seem like it has anything to do with race data, but it does, in a somewhat roundabout way).

Anyway, all of this required fairly significant changes to the race desgin screen class, a whole new class for player data, and naturally changes to the new game design screen class (whcih, being brand new, is in a constant state of change anyway).

Hopefully by this weekend I will be swappinig all my development projects over to my new machine, which includes changing over to Vista x64. I hope this does not cause any new delays or problems, but it very well might. So keep your fingers crossed there.

RonHiler
06-03-2008, 08:54 AM
Hopefully by this weekend I will be swappinig all my development projects over to my new machine, which includes changing over to Vista x64. I hope this does not cause any new delays or problems, but it very well might. So keep your fingers crossed there.

Just to let y'all know, MD was transferred to the new OS with no ill effects. Well, there was ONE ill effect, but I de-illed it :)

Shane Christopher
06-04-2008, 10:49 AM
So when can we see the DX10 build?

Because you know.. everyone else is doing it... :rolleyes:

RonHiler
06-06-2008, 05:53 PM
So when can we see the DX10 build?

Let's see, what's the word I'm looking for?.....

Oh, yeah, "NEVER" lol. This game SO doesn't need DX10 level graphics :)

So I'm about done with item 11 on the milestone list. I had a devil of a time seperating the player data out of the race creation interface screen. It took me a couple of days to get save/load files working right again (which reminds me, saved race files from the M4 version are not going to be any good anymore, I changed a format on one of the entries to compress it). But all seems good now, I should finish 11 tomorrow (all that's left is to add a directory crawler and load the file up and display the race name). Should be a cakewalk at this point.

So, anyway, on to item 12.

RonHiler
06-16-2008, 08:54 AM
Finished through item 16 now, working on item 17, which is just the interface to allow you input your own random number seed (rather than use a true random one) if you desire.

Then it's on to world generation. It will be good to be doing something other than UI work for a little while :)

Shane Christopher
06-17-2008, 08:19 AM
World generation is always fun. As soon as I get my camera view controls finally worked out I'm going to go ahead and try and port some of my old generation code (or completely rewrite it probably) into my new project. Right now I'm just using terrain I made up in terragen to test with.

I'm having a hell of a lot of trouble with what should be a simple cosine operation getting the angle from a given cosine value. It refuses to give out the correct angle no matter what I try. The 3rd person camera can swing around a sphere around the player, you can change the radius of the view and swing it around and up and down with the mouse, everythings good until it gets to making sure it doesn't go through the ground.

I'm trying to get it to stop when it hits 10pts above the ground (roughly 10cm). I can make it stop but then when you keep moving the mouse down the pitch it is trying to get to keeps getting lower. The camera stays still but as soon as you try pitching up again it takes ages to get the pitch back to the value it was when it hit the ground. I've tried cacheing the pitch value when it hits the ground but then as soon as you start moving over different altitude terrain that can kick up a similiar problem.

What I really want is to be able to adjust the pitch to where the camera is actually at after every update. For some reason I just can't work out how to get the pitch. I have the cos value of the angle I'm looking for it's just when I put it through the Maths.Acos() function it comes out with something completely different then what I'm looking for.

RonHiler
06-29-2008, 11:53 AM
So I finished the initialization work today on the world builder. More or less, it's the same functions that we had in the old version of the program. One of the big reasons I was not happy with the old version was the amount of time it took to initialize the world.

Well, after doing quite a bit of work (both in terms of code cleanup and optimization), we now initialize everything in about 45 seconds. And that's on my laptop (which is a PoS) with a debug build and with quite a bit of debug output, which slows things down. So I'm pretty happy with it so far.

The world for the builder consists of a bit over 400,000 points (translated to a mercator projection, it comes in at about 500,000 or so). As I've said before, eventually each of those points will turn into an 8x8 grid of points for the game portion (which all together comes up with about 26.4 million points), so y'all should have plenty to explore :)

[edit] I want to stress for those that may not be clear, you aren't going to be running the world builder all that often. Only once at the beginning of a game (and then only by the host, not by the players). Since a typical game can last months, you won't be building worlds very much. 45 seconds is way too long a time to spend if we were having to do this every single time someone opened the game, but to me it's probably fine for the occassional new game build. Of course, we haven't yet started the iterations, which will take some amount of time as well. But to offset that, I expect that initial 45 seconds to be far reduced in a release build without all the OutputDebugString messages (of which there are about 520) and on a half decent computer. If we can keep the world building under 5 minutes, I will be happy with it (I'll try to get it less than that, we'll just have to see what happens).

Pix
06-30-2008, 07:20 AM
Remember, profile a release build to find the bottlenecks BEFORE you optimize. :)

RonHiler
06-30-2008, 10:22 AM
Remember, profile a release build to find the bottlenecks BEFORE you optimize. :)

Oh, I will :) I just caught some of the more obvious places to speed things up. I actually rewrote the neighbor calculation algorithm altogether to make it faster. The neighbor calculation routine runs 8 * 400,000 times, so it runs A LOT, heh. So any little speedup in that routine is a big deal in the final build.

For a bit there I was considering running it through once and saving the results to file, and then changing the code (through preprocessor macros) to load the file rather than do the actual calculations every time. I've almost decided against that though, because if I ever change anything (like the size of the world) it would have to be rerun to generate a new file, as opposed to right now where the data is generated on the fly.

I can't really do a real profile on it right now, since I'm on vacation (in Florida) and only have my laptop with me. So I'm not going to worry TOO much about performance until we get back.

I actually am pretty happy about another aspect. I said I took most of the code from the old version (which was the open source one), which is true. But in that code, there was quite a bit of fudging going on to make it work right. I've fixed all that, so now the code is cleaner (less special casing) which also makes it run faster.

Anyway, working on tectonics now. Fun stuff...

RonHiler
07-06-2008, 04:24 PM
Since last I posted, I have finished number 18 on the list (thus completing 1-18 now), have MOSTLY finished 19 (just a small bit of debugging left, it basically works) and MOSTLY finished 21 (although I changed it a bit, I'm not going to show 2 versions of the map. Just showing one version is slowing the process quite a lot already).

Because showing the map (which consists of printing 411,000 dots to the screen) is really slow (like about 2-3 seconds per frame), I've added a checkbox to turn off the map while building is going on. I'm also going to add an option to only update the map every few frames (from 1 to 20) so you can watch it while buidling but not slow the process down to a crawl.

After doing a bit more work, I've about decided we don't need to generate a Mercator at all, which is a whole chunk of initialization work that doesn't need to be done, so in actual fact, initialization will speed up even more, heh. I was only using it to help generate neighbor data, but it turns out I don't need it. I found a fast way to calculate them without it.

RonHiler
07-23-2008, 07:24 PM
Sorry for the lack of posting. There is news on this front. Soon. Hopefully tomorrow, with a bit of luck...

RonHiler
07-28-2008, 08:34 AM
I promised an update, didn't I?

Okay. Here is the deal. As some of you have probably guessed, we had a setback. The reason I went quiet is because I didn't want to post without putting up some good news, and unfortunately, all of it was bad for a while.

I don't want to get overly technical, and the entire issue is highly technical, but what it boiled down to was our North-South neighbor calculations were screwy. While they were right if you just take into account one row to the next, the issue was there was an accumulation of rounding errors, that, when put all together, caused a line that moved north to south (or south to north) to wander rather than move in a straight line. I'll post screenshots a bit later so you can see what I mean (maybe tonight, perhaps tomorrow, my time is pretty limited today).

I noticed a problem when the tectonic plates were creating. They weren't quite looking right. I tracked the issue down to the N-S neighbors. And of course neighbor calculations were several steps back from tectonic plate generation. So I had to backtrack a pretty good way.

Now I said there was good news. And that news is I straightened it all out (if you'll pardon the pun). At least, mostly. I'm still not 100% of the way there yet, and I'm still tweaking it here and there, but it's a ton better than it was, and I'm pretty sure I've got it solved now with just a couple of new changes. I branched the code a couple of times working out various things, and at this point I just have to put all the good parts together (and dump the bad parts) into a unified codebase, and I think we'll be all set.

I rewrote the algorithm for N-S neighbors four times, and each time involved quite a lot of bug killing, and then more debugging to see why the lines were still wandering (with each successive attempt, they wandered a bit less, and I figured out a bit more).

All of this, of course, relates back to our arch nemisis, the round world. Whenever anything really difficult comes along with regard to this program, it's always because of that round world thing. I totally understand why Civ uses cylinder :)

Anyway, the whole reason this is critical to get right (not just because of odd looking tectonic plates) is that eventually it will get to our pathing algorithms. They are going to use A*, and of course terriain costs will factor in and all that, but the starting point for A* (and all pathing algorithms for that matter) is a reliable shortest-distance path from A to B, and as it was, we didn't have that, we had a wandering path. So it's quite important to get this part correct right at the beginning.

So that's where things are at. I hope to wrap this up in the next couple of days or so. We'll see how things go, as always.

Strike
07-28-2008, 03:38 PM
Sounds about par for the course, then :)

If you don't want to get technical I won't push, but I like seeing details even if I don't fully understand 'em ;)

Glad to hear you're getting it figured out!

RonHiler
07-28-2008, 05:37 PM
If you don't want to get technical I won't push, but I like seeing details even if I don't fully understand 'em

I'd explain it better, but it really is SUPER technical. The best I can do is give a bit of a step-by-step, and this is still really a simplification:

1) Take any point on the map. Calcuate what it's east-to-west location is as if the map were a mercator map.

2) Move one row up on the map (let's presume we are moving south to north). Now look through those points and find the closest east-to-west value on the row. That's your northern neighbor for the point you just left.

3) Take your new point and get *it's* east-to-west value. Repeat from step 2.

Now, what happened was the point you moved to is has the *closest* east-to-west as the prior point. It's *close* to the first row point, but it's not the same, it's slightly different. When you move to the NEXT row, you have a whole different east-to-west point you are dealing with. When you get to the third row, you will get the point that is closest to the second row, but it won't necessarily be the closest point to the first row. And so on. As these rounding errors accumulated, you got wandering rather than a straight line (relative to a mercator map, on the mollewiede projection, you want smooth arcs depending on where you are in relation to the center column).

The solution was to relate everything to the equator row right from the start, which gives you a constant frame of reference. Sounds simple enough, but it turns out to be quite a bit of convoluted coding.

All this makes more sense with pictures. I didn't think to grab a screen of the strangeness of the tectonic plates, so I don't have a shot to show of those to show you.

But here is what the map looked like after the first pass at the N-S calculation algorithm, once I had first noticed the problem. This is a series of random points on the map which are then progressed to their neighbor to the north for a few iterations:

http://www.rjcyberware.com/md/screens/MapIssue.png

As you can see, it gets pretty bendy when you are near the middle.

Here it was again after the third time I rewrote the algorithm:

http://www.rjcyberware.com/md/screens/MapIssue2.png

Much better, but still a bit on the wanderish side.

I didn't take shots of algorithm 2 or 4, but you can imagine the progression :)

I'll post a shot when it's finished showing what ought to be perfect pathing.

The east-west neighbors always worked, but those are trivial. The northwest, northeast, southwest, southeast neighbors weren't quite right, but that was because the north-south was broken (the NW, NE, SW, SE calculations just move the test point to the east or west one point, then recursively call the same routine to find the north or south of that new point, so they're dependent on the primary directions to be right).

Shane Christopher
07-29-2008, 01:13 PM
But it looks quite nice :p

How about you assign each point on the map a correct longitude and latitude? That way say if you want to go 1 degree north and 1 degree west you can calculate the final point you would ideally want and get the closest equivalent pixel.

It still isn't perfect if you do that one at a time but say for instance if you want to move a long distance you would be able to get the final point with only the same incorrectness as when you get the point just one point away. The difficulty would come when you go to call each pixel that your path passes over for movement costs etc, some sort of sampling for each degree passed or however many pixels there are per degree. That might get complicated if that amount changes as you go away from the equator.

I made a very quick paint based image to try and explain:

http://i226.photobucket.com/albums/dd52/Dargish/hrm.jpg

Instead of polling each pixel as you go up you get the starting point in lat/long then the destination in lat/long. Then you can poll each pixel to get which is closest to each point. As you can see both situations will produce the same average accuracy.

Once you have the starting and ending point you can work down the 'line' between points and poll every certain distance and see if you've hit a new pixel yet, if you have then add it to the list of pixels your route travels over. I know the red line is straight but it shouldnt be so long as the proper lat/long coords are given to each pixel point. It would look more like the blue line or whatever is correct.

RonHiler
07-30-2008, 05:42 AM
A good thought, but the answer to your question is because all these values are pre-generated and stored. It would take too long to do the calcuations on the fly (which is what you'd have to do becasue you don't know your A and B points beforehand).

Consider that we need to run through hundreds of thousands of points (if not millions, in fact, it WILL be millions, since we're going to be iterating) to do world generation. We need every shortcut we can get or it's going to slow to a crawl. And that means pre-genned neighbor points.

But it's okay. I got it. I unified the branched programs and the resulting routine works to my satisfaction. We're down now to pixel level wandering, which is unavoidable, and further, will be unnoticable (for pathing, the other variances of A* such as terrain costs et al will have a much stronger effect on the results).

Although you do bring up a good point, the routines to this point don't care about shortest distance from A to B, they only care about what points are adjacent to what other points (which is all we need for world building). When we get to pathing, having adjacency information is good. But we'll also need distance information (i.e. what direction do go from A to get to B in the shortest possible time), and that we don't have. On a sphere, it's not the same calculations as it would be on a flat surface. I can see another potential boondoggle when we get to that stage of the coding.

Ah well, we'll cross that bridge when we come to it :)

I'll post another screen to show the final N-S routine and also to show an example with the tectonic plates done in the next day or so. Have to tweak a few things first.

Shane Christopher
07-30-2008, 09:58 AM
Ah I see, I was looking at it as more of a one or two path findings here and there. Not really suitable for world generation. Maybe it will help when you get to pathfinding for units.

Strike
07-30-2008, 03:18 PM
Thanks for the images, they do look rather nice. Except for the not-straight parts, of course :)

Glad to hear you got it fixed satisfactorily :)
Now I'm waiting to hear similar reports for the distance calculations. ;)

RonHiler
07-31-2008, 08:55 AM
Hehe, thanks Strike. We'll get to the distance calculations when we get to pathing, so there is a bit of time before we have to deal with that.

So I'm done. I finished this morning with the final tweaks, I individually tested all 8 neighbor directions and am happy with them, and I turned back on the tectonic plate assignments. Since that was the slowest part of the routine, I reworked it a bit and sped it up (instead of running through every point in the map looking for plate assignments, it stores those points that were last assigned and just runs through those to find the new points, MUCH faster, heh).

I'll post the new screenshots tonight.

Which means, after being bogged down in steps 18-19 for a while, they have been marked as done (as has step 21). We're now on to our last pre-iteration step, which is number 20, the wind assignments.

I have to admit, I'm a little worried about the iterations. Seeing how long it takes the program to run through all 400,000 points just one time (around 5-10 seconds for simple calculations), considering we have to run through the iterator a bunch of times and the calcuations within are not going to be all that simple, the iteration stage may take a while.

I'm going to do everything I can to make sure that every point on the map gets looked at only ONE time per iteration. If we start running multiple times through each point per iteration, we will end up in trouble. But it could be tough to do. We can't really do erosion until we do rainfall, and we can't do rainfall until we know where the water vapor is coming from from all the points around where we are looking.

I'll do my best.

RonHiler
07-31-2008, 03:22 PM
Alright, last shots of these.

This is the final version of the N-S routines in action:

http://www.rjcyberware.com/md/screens/MapIssue3.png

Still a tad bit of wander, but I think it's as good as I can get it (certainly it is good enough for the purposes we need it for).

and finally, here is the world with the tectonic plates assigned (one possible version anyway, out of a possible several million):

http://www.rjcyberware.com/md/screens/MapIssue4.png

From start to finish, it took 35 seconds to get to that point (on a debug build and my laptop computer, haven't timed it with the release build on the good system yet).

So up to there, anyway, things are in good shape.

RonHiler
08-07-2008, 09:09 AM
Alright gang, we have hotspots and we have wind. That finishes step 20, leaving us only three steps remaining (22-24). These are the beginning of the iteration steps.

Of those, 22 is trivial. 24 is simply checking for a volcanic event and adding topsoil and removing biomass should such an event occur, so it's almost as trivial as 22 is. The harder step will be 23, which is movement, and that will only be tricky right around the border areas. We'll see how it goes.

What do you guys think of volcanoes? Obviously they will affect elevation, but we have two different types, we have bedrock and topsoil. Should we add to both? Just to topsiol? Probably to both, I would guess. But in what ratio?

Strike
08-07-2008, 04:26 PM
Gah, I don't know if there's only one answer to your question....

It's been a while since I've taken any geology, but... lava flows would add to bedrock, and probably wipe out any topsoil (convert it all to bedrock?)
Ash clouds might count as topsoil, though, so it depends on what sort of eruption it is.

But if you don't want to get that complicated... pick something, I dunno, between 50% bedrock and 66% bedrock?

RonHiler
08-08-2008, 08:01 AM
Gah, I don't know if there's only one answer to your question....

Yeah, I know. In some cases a volcanic explosion can actually lower the immediate surrounding elevation. But I think in this case we're going to have to simplify that. We're in the iteration stage now, and everything has to be lightning quick. As it is, it's going to take longer than I want it to.

I'll give it some thought though. Maybe we can figure out a way to better model what happens and still have it be fast.


It's been a while since I've taken any geology, but... lava flows would add to bedrock, and probably wipe out any topsoil (convert it all to bedrock?)

Good point, I actually hadn't considered that. Seems reasonable to me. Anyone have any objections?


Ash clouds might count as topsoil, though, so it depends on what sort of eruption it is.
Yeah, that's what I was thinkiing, as far as the ash goes. And lava-flow is actually relatively soft rock (right?) so itself would be a source of topsoil. I think we model that by adding a certain amount of bedrock and a certain amount of topsoil upon an event.


But if you don't want to get that complicated... pick something, I dunno, between 50% bedrock and 66% bedrock?[/quote]

RonHiler
08-11-2008, 08:59 AM
Hey guys,

I'm sorry to report that I've hit another snag. Damn spherical world!

The adjacency information we have is good, certainly it was not a waste of time. We need to know the neighbors based on the cardinal directions so that the players can tell their stacks "Go south" and the like. So the pathing information we have is fine, and will certainly help us in the future.

However, it's not the information we need now. I believe I made an error in logic when I decided that the cardinal direction neighbors is what was needed. Consider:

Take some mass, like for instance Australia. Now move it south. Using the pathing we have set up, as Australia goes south, it will compress horizontally, until ultimately *every single point of the continent passes through the point that is the south pole*.

This is a natural effect. If you move south long enough, eventually you HAVE to hit the south pole, no matter where you started from. If two people begin at different locations but at the same lattitude line on the world and move south at the same speed, they will eventually collide at the pole.

Now obviously, that is clearly not what would happen (with respect to Australia compressing). If you took a single point on Australia and moved it directly south, then sure, that point would pass through the south pole. If all other points were moved along with the selected point (maintaining their relative distance), they in fact would NOT be moving south at all, but in some offset from south that would become more pronounced as you moved closer to the bottom of the world. In actual fact what we need to do is preserve that relative distance from the selected control point.

I need to give this some thought, and if you guys have any ideas, please do let me know. To be honest, I've been considering it for a couple of days now, and I'm floundering a bit.

Strike
08-12-2008, 07:35 PM
Oh, snark. Yeah, that would be a problem.

So I guess "move <point> <direction>" is the wrong paradigm.
"move <plate> <direction>" seems the next obvious option, but I'm not sure if the plates are defined well enough for this to work well.
Hm, actualyl that seems to be what you mentioned in your post; I guess I didn't read it thoroughly enough the first time.

Mm... This problem exists for any point moving away from the equator, and there is a similar expansion problem for any points moving /towards/ the equator.

So the math-intensive solution is to rotate the map such that the desired point is on the equator and will be travelling E or W, and then spin the world back to "normal" afterwards, but... that's just Ick, especially if you need to do it Lots (like you probably would).
That's the "move <point> [in one direction]" paradigm....


What I'd try to do first, if I can scribble out a quick & dirty algorthim...

Find the center of the plate/area to be moved.
Find all other points that need to move along with that point.
Get offsets (from the center) for each of those points.
Move the center.
Place the other points at their offsets from the center's new position.

And depending on the details you're doing, you should be able to assign landmass offset-tables once only, which should/could (maybe?) help a lot for speed in other areas.


If that's not how you need to move stuff around (it doesn't treat plate boundaries well, I realize) then explain that part again and I can take a stab at refining it :)

RonHiler
08-12-2008, 08:25 PM
Find the center of the plate/area to be moved.
Find all other points that need to move along with that point.
Get offsets (from the center) for each of those points.
Move the center.
Place the other points at their offsets from the center's new position.


Well done, Strike! You did better at this than I did, hehe.

That is, essentially, the solution. I have to say, I didn't come up with it. Floundering around trying to figure out, I decided to get some advice from someone a lot wiser on these matters than I am. So I asked a guy who has a serious web site on map projections for some help, and once I had described the problem to him, that's more or less the suggestion he arrived at as well.

We're going to give each plate a control point (this is easy, since each plate starts as a single point anyway). Every point on that plate will have an offset from the control point (this doesn't need to be a seperate variable, we can just use the difference between their latt/long values).

Then each plate (and there are only 10-20 of them) is going to get it's own offset value which will apply to every point on that plate. It's that offset value is the one we are going to change over time. [note that the plates themselves won't really move, only the land-features sitting on top of them, if a point falls off the edge of a plate due to it's offset, we know it hit a border, and can determine what to do with it from there].

Now, the tricky bit is that we can't offset in terms of latt/long, because we'd have exactly the same issue (all longitude lines also pass through both the poles, so if we say offset the points by a longitude of -74, we'd compress the area again).

Rather what we need is a vector (which gives us both direction and distance). We apply that vector to each point. And that, in a nutshell, should give us correct mass movement, keeping our areas correct.

The tricky bit there is there is some conversion work to take the initial latt/long, add the vector and get a new latt/long point. It seems like I should know how to do that, but the world curvature is throwing me off. I'm going to query our expert again on any tricks I might use to calculate the values we need.

Pix
08-13-2008, 07:52 AM
"Let's set the world on a sphere!"

RonHiler
08-13-2008, 07:58 AM
"Let's set the world on a sphere!"

ROTFLMAO! Famous last words :) God, I was naive back then.

RonHiler
08-13-2008, 12:29 PM
We have the calculations we need:

http://www.movable-type.co.uk/scripts/latlong.html

Scroll down to the "Destination point given distance and bearing from start point" part, maybe a quarter of the way down the page.

Ugly calculations, but they are what they are, what ya gonna do?

It's going to take some retooling (again, sigh) but I think a final solution is near.

RonHiler
08-14-2008, 09:46 AM
Alright guys, so I've branched the code again (because I don't want to lose what we've already done, I think it will be useful for both reference and for implementation of later stuff down the road). So we've got the old stuff all saved.

I've now ripped out pretty much all the world building code we had up to this point. I want to go at it from a fresh perspective without all the baggage that has been put into it. I think this is a good idea, since we are pretty much starting with a whole new direction.

As a side note, I really like the whole latitude/longitude thing (as opposed to the projected cartesian coordinate system we were using before), because, just by its inherent nature, it already simplifies a whole number of issues regarding map-wrapping that I had to deal with before.

Anyway, I will keep you guys updated. I think once we get this nailed down (and I'm pretty sure we are fairly close to that) it pretty much wraps up the issues with the round world (this system should also solve pathing that we were talking about earlier, and I don't see any other real complexities that would arise from the round world, at least not at this point).

If we can solve this, and the texture/memory issues (which I think we have a good plan for) and the file size issue, we're through what I consider to be the major *technical* hurdles of this game. The rest being programmatic hurdles, which I can deal with :)

Strike
08-14-2008, 04:22 PM
Ugly calculations, but they are what they are, what ya gonna do?


If I can count, there's 13 trig functions between those two equations.
Well, I'm glad you're the one doing this instead of me ;)

RonHiler
08-15-2008, 10:24 AM
Yeah, thanks :)

I finally got something fixed that had been bugging me forever. We had a fencepost error in the world array creation routines. We needed 512 rows (numbered 0-511) with varying amounts of points in each row (1024 points at the equator). But ideally, the first and last row would both have 1 point in them. That was never the case before, the first row had one point, but the last row always had 90 (and it wasn't an easy fix, there was all sorts of math involved). Which meant the South Pole always consisted of 90 points. Nothing game breaking, but always something that irritated me.

Well, now we have it just the way I want it. So we're already better :)



Debug Output: Row Number: 0, Num Points In Row: 1, Circumference: 0 Process MDestiny.exe (2112)
Debug Output: Row Number: 1, Num Points In Row: 91, Circumference: 90.5095 Process MDestiny.exe (2112)
Debug Output: Row Number: 2, Num Points In Row: 128, Circumference: 127.874 Process MDestiny.exe (2112)
Debug Output: Row Number: 3, Num Points In Row: 156, Circumference: 156.459 Process MDestiny.exe (2112)
Debug Output: Row Number: 4, Num Points In Row: 180, Circumference: 180.486 Process MDestiny.exe (2112)
Debug Output: Row Number: 5, Num Points In Row: 202, Circumference: 201.59 Process MDestiny.exe (2112)
Debug Output: Row Number: 6, Num Points In Row: 221, Circumference: 220.613 Process MDestiny.exe (2112)
Debug Output: Row Number: 7, Num Points In Row: 238, Circumference: 238.053 Process MDestiny.exe (2112)
Debug Output: Row Number: 8, Num Points In Row: 254, Circumference: 254.237 Process MDestiny.exe (2112)
Debug Output: Row Number: 9, Num Points In Row: 269, Circumference: 269.39 Process MDestiny.exe (2112)
Debug Output: Row Number: 10, Num Points In Row: 284, Circumference: 283.679 Process MDestiny.exe (2112)
Debug Output: Row Number: 11, Num Points In Row: 297, Circumference: 297.228 Process MDestiny.exe (2112)
Debug Output: Row Number: 12, Num Points In Row: 310, Circumference: 310.134 Process MDestiny.exe (2112)
Debug Output: Row Number: 13, Num Points In Row: 322, Circumference: 322.474 Process MDestiny.exe (2112)
Debug Output: Row Number: 14, Num Points In Row: 334, Circumference: 334.311 Process MDestiny.exe (2112)
Debug Output: Row Number: 15, Num Points In Row: 346, Circumference: 345.697 Process MDestiny.exe (2112)
Debug Output: Row Number: 16, Num Points In Row: 357, Circumference: 356.674 Process MDestiny.exe (2112)
Debug Output: Row Number: 17, Num Points In Row: 367, Circumference: 367.28 Process MDestiny.exe (2112)
Debug Output: Row Number: 18, Num Points In Row: 378, Circumference: 377.545 Process MDestiny.exe (2112)
Debug Output: Row Number: 19, Num Points In Row: 387, Circumference: 387.497 Process MDestiny.exe (2112)
Debug Output: Row Number: 20, Num Points In Row: 397, Circumference: 397.159 Process MDestiny.exe (2112)
Debug Output: Row Number: 21, Num Points In Row: 407, Circumference: 406.553 Process MDestiny.exe (2112)
Debug Output: Row Number: 22, Num Points In Row: 416, Circumference: 415.695 Process MDestiny.exe (2112)
Debug Output: Row Number: 23, Num Points In Row: 425, Circumference: 424.603 Process MDestiny.exe (2112)
Debug Output: Row Number: 24, Num Points In Row: 433, Circumference: 433.291 Process MDestiny.exe (2112)
Debug Output: Row Number: 25, Num Points In Row: 442, Circumference: 441.771 Process MDestiny.exe (2112)
Debug Output: Row Number: 26, Num Points In Row: 450, Circumference: 450.056 Process MDestiny.exe (2112)
Debug Output: Row Number: 27, Num Points In Row: 458, Circumference: 458.156 Process MDestiny.exe (2112)
Debug Output: Row Number: 28, Num Points In Row: 466, Circumference: 466.081 Process MDestiny.exe (2112)
Debug Output: Row Number: 29, Num Points In Row: 474, Circumference: 473.84 Process MDestiny.exe (2112)
Debug Output: Row Number: 30, Num Points In Row: 481, Circumference: 481.44 Process MDestiny.exe (2112)
Debug Output: Row Number: 31, Num Points In Row: 489, Circumference: 488.889 Process MDestiny.exe (2112)
Debug Output: Row Number: 32, Num Points In Row: 496, Circumference: 496.194 Process MDestiny.exe (2112)
Debug Output: Row Number: 33, Num Points In Row: 503, Circumference: 503.362 Process MDestiny.exe (2112)
Debug Output: Row Number: 34, Num Points In Row: 510, Circumference: 510.397 Process MDestiny.exe (2112)
Debug Output: Row Number: 35, Num Points In Row: 517, Circumference: 517.305 Process MDestiny.exe (2112)
Debug Output: Row Number: 36, Num Points In Row: 524, Circumference: 524.092 Process MDestiny.exe (2112)
Debug Output: Row Number: 37, Num Points In Row: 531, Circumference: 530.761 Process MDestiny.exe (2112)
Debug Output: Row Number: 38, Num Points In Row: 537, Circumference: 537.318 Process MDestiny.exe (2112)
Debug Output: Row Number: 39, Num Points In Row: 544, Circumference: 543.766 Process MDestiny.exe (2112)
Debug Output: Row Number: 40, Num Points In Row: 550, Circumference: 550.11 Process MDestiny.exe (2112)
Debug Output: Row Number: 41, Num Points In Row: 556, Circumference: 556.352 Process MDestiny.exe (2112)
Debug Output: Row Number: 42, Num Points In Row: 562, Circumference: 562.497 Process MDestiny.exe (2112)
Debug Output: Row Number: 43, Num Points In Row: 569, Circumference: 568.547 Process MDestiny.exe (2112)
Debug Output: Row Number: 44, Num Points In Row: 575, Circumference: 574.505 Process MDestiny.exe (2112)
Debug Output: Row Number: 45, Num Points In Row: 580, Circumference: 580.374 Process MDestiny.exe (2112)
Debug Output: Row Number: 46, Num Points In Row: 586, Circumference: 586.158 Process MDestiny.exe (2112)
Debug Output: Row Number: 47, Num Points In Row: 592, Circumference: 591.857 Process MDestiny.exe (2112)
Debug Output: Row Number: 48, Num Points In Row: 597, Circumference: 597.476 Process MDestiny.exe (2112)
Debug Output: Row Number: 49, Num Points In Row: 603, Circumference: 603.015 Process MDestiny.exe (2112)
Debug Output: Row Number: 50, Num Points In Row: 608, Circumference: 608.478 Process MDestiny.exe (2112)
Debug Output: Row Number: 51, Num Points In Row: 614, Circumference: 613.865 Process MDestiny.exe (2112)
Debug Output: Row Number: 52, Num Points In Row: 619, Circumference: 619.18 Process MDestiny.exe (2112)
Debug Output: Row Number: 53, Num Points In Row: 624, Circumference: 624.424 Process MDestiny.exe (2112)
Debug Output: Row Number: 54, Num Points In Row: 630, Circumference: 629.599 Process MDestiny.exe (2112)
Debug Output: Row Number: 55, Num Points In Row: 635, Circumference: 634.706 Process MDestiny.exe (2112)
Debug Output: Row Number: 56, Num Points In Row: 640, Circumference: 639.748 Process MDestiny.exe (2112)
Debug Output: Row Number: 57, Num Points In Row: 645, Circumference: 644.725 Process MDestiny.exe (2112)
Debug Output: Row Number: 58, Num Points In Row: 650, Circumference: 649.639 Process MDestiny.exe (2112)
Debug Output: Row Number: 59, Num Points In Row: 654, Circumference: 654.492 Process MDestiny.exe (2112)
Debug Output: Row Number: 60, Num Points In Row: 659, Circumference: 659.285 Process MDestiny.exe (2112)
Debug Output: Row Number: 61, Num Points In Row: 664, Circumference: 664.019 Process MDestiny.exe (2112)
Debug Output: Row Number: 62, Num Points In Row: 669, Circumference: 668.695 Process MDestiny.exe (2112)
Debug Output: Row Number: 63, Num Points In Row: 673, Circumference: 673.315 Process MDestiny.exe (2112)
Debug Output: Row Number: 64, Num Points In Row: 678, Circumference: 677.88 Process MDestiny.exe (2112)
Debug Output: Row Number: 65, Num Points In Row: 682, Circumference: 682.391 Process MDestiny.exe (2112)
Debug Output: Row Number: 66, Num Points In Row: 687, Circumference: 686.849 Process MDestiny.exe (2112)
Debug Output: Row Number: 67, Num Points In Row: 691, Circumference: 691.255 Process MDestiny.exe (2112)
Debug Output: Row Number: 68, Num Points In Row: 696, Circumference: 695.609 Process MDestiny.exe (2112)
Debug Output: Row Number: 69, Num Points In Row: 700, Circumference: 699.914 Process MDestiny.exe (2112)
Debug Output: Row Number: 70, Num Points In Row: 704, Circumference: 704.17 Process MDestiny.exe (2112)
Debug Output: Row Number: 71, Num Points In Row: 708, Circumference: 708.377 Process MDestiny.exe (2112)
Debug Output: Row Number: 72, Num Points In Row: 713, Circumference: 712.537 Process MDestiny.exe (2112)
Debug Output: Row Number: 73, Num Points In Row: 717, Circumference: 716.651 Process MDestiny.exe (2112)
Debug Output: Row Number: 74, Num Points In Row: 721, Circumference: 720.719 Process MDestiny.exe (2112)
Debug Output: Row Number: 75, Num Points In Row: 725, Circumference: 724.741 Process MDestiny.exe (2112)
Debug Output: Row Number: 76, Num Points In Row: 729, Circumference: 728.72 Process MDestiny.exe (2112)
Debug Output: Row Number: 77, Num Points In Row: 733, Circumference: 732.655 Process MDestiny.exe (2112)
Debug Output: Row Number: 78, Num Points In Row: 737, Circumference: 736.547 Process MDestiny.exe (2112)
Debug Output: Row Number: 79, Num Points In Row: 740, Circumference: 740.397 Process MDestiny.exe (2112)
Debug Output: Row Number: 80, Num Points In Row: 744, Circumference: 744.205 Process MDestiny.exe (2112)
Debug Output: Row Number: 81, Num Points In Row: 748, Circumference: 747.973 Process MDestiny.exe (2112)
Debug Output: Row Number: 82, Num Points In Row: 752, Circumference: 751.7 Process MDestiny.exe (2112)
Debug Output: Row Number: 83, Num Points In Row: 755, Circumference: 755.388 Process MDestiny.exe (2112)
Debug Output: Row Number: 84, Num Points In Row: 759, Circumference: 759.037 Process MDestiny.exe (2112)
Debug Output: Row Number: 85, Num Points In Row: 763, Circumference: 762.647 Process MDestiny.exe (2112)
Debug Output: Row Number: 86, Num Points In Row: 766, Circumference: 766.219 Process MDestiny.exe (2112)
Debug Output: Row Number: 87, Num Points In Row: 770, Circumference: 769.754 Process MDestiny.exe (2112)
Debug Output: Row Number: 88, Num Points In Row: 773, Circumference: 773.251 Process MDestiny.exe (2112)
Debug Output: Row Number: 89, Num Points In Row: 777, Circumference: 776.713 Process MDestiny.exe (2112)
Debug Output: Row Number: 90, Num Points In Row: 780, Circumference: 780.138 Process MDestiny.exe (2112)
Debug Output: Row Number: 91, Num Points In Row: 784, Circumference: 783.528 Process MDestiny.exe (2112)
Debug Output: Row Number: 92, Num Points In Row: 787, Circumference: 786.883 Process MDestiny.exe (2112)
Debug Output: Row Number: 93, Num Points In Row: 790, Circumference: 790.203 Process MDestiny.exe (2112)
Debug Output: Row Number: 94, Num Points In Row: 793, Circumference: 793.489 Process MDestiny.exe (2112)
Debug Output: Row Number: 95, Num Points In Row: 797, Circumference: 796.742 Process MDestiny.exe (2112)
Debug Output: Row Number: 96, Num Points In Row: 800, Circumference: 799.961 Process MDestiny.exe (2112)
Debug Output: Row Number: 97, Num Points In Row: 803, Circumference: 803.147 Process MDestiny.exe (2112)
Debug Output: Row Number: 98, Num Points In Row: 806, Circumference: 806.301 Process MDestiny.exe (2112)
Debug Output: Row Number: 99, Num Points In Row: 809, Circumference: 809.423 Process MDestiny.exe (2112)
Debug Output: Row Number: 100, Num Points In Row: 813, Circumference: 812.513 Process MDestiny.exe (2112)
Debug Output: Row Number: 101, Num Points In Row: 816, Circumference: 815.571 Process MDestiny.exe (2112)
Debug Output: Row Number: 102, Num Points In Row: 819, Circumference: 818.598 Process MDestiny.exe (2112)
Debug Output: Row Number: 103, Num Points In Row: 822, Circumference: 821.595 Process MDestiny.exe (2112)
Debug Output: Row Number: 104, Num Points In Row: 825, Circumference: 824.561 Process MDestiny.exe (2112)
Debug Output: Row Number: 105, Num Points In Row: 827, Circumference: 827.498 Process MDestiny.exe (2112)
Debug Output: Row Number: 106, Num Points In Row: 830, Circumference: 830.404 Process MDestiny.exe (2112)
Debug Output: Row Number: 107, Num Points In Row: 833, Circumference: 833.282 Process MDestiny.exe (2112)
Debug Output: Row Number: 108, Num Points In Row: 836, Circumference: 836.13 Process MDestiny.exe (2112)
Debug Output: Row Number: 109, Num Points In Row: 839, Circumference: 838.949 Process MDestiny.exe (2112)
Debug Output: Row Number: 110, Num Points In Row: 842, Circumference: 841.739 Process MDestiny.exe (2112)
Debug Output: Row Number: 111, Num Points In Row: 845, Circumference: 844.502 Process MDestiny.exe (2112)
Debug Output: Row Number: 112, Num Points In Row: 847, Circumference: 847.236 Process MDestiny.exe (2112)
Debug Output: Row Number: 113, Num Points In Row: 850, Circumference: 849.943 Process MDestiny.exe (2112)
Debug Output: Row Number: 114, Num Points In Row: 853, Circumference: 852.622 Process MDestiny.exe (2112)
Debug Output: Row Number: 115, Num Points In Row: 855, Circumference: 855.275 Process MDestiny.exe (2112)
Debug Output: Row Number: 116, Num Points In Row: 858, Circumference: 857.9 Process MDestiny.exe (2112)
Debug Output: Row Number: 117, Num Points In Row: 860, Circumference: 860.499 Process MDestiny.exe (2112)
Debug Output: Row Number: 118, Num Points In Row: 863, Circumference: 863.071 Process MDestiny.exe (2112)
Debug Output: Row Number: 119, Num Points In Row: 866, Circumference: 865.617 Process MDestiny.exe (2112)
Debug Output: Row Number: 120, Num Points In Row: 868, Circumference: 868.137 Process MDestiny.exe (2112)
Debug Output: Row Number: 121, Num Points In Row: 871, Circumference: 870.631 Process MDestiny.exe (2112)
Debug Output: Row Number: 122, Num Points In Row: 873, Circumference: 873.1 Process MDestiny.exe (2112)
Debug Output: Row Number: 123, Num Points In Row: 876, Circumference: 875.543 Process MDestiny.exe (2112)
Debug Output: Row Number: 124, Num Points In Row: 878, Circumference: 877.961 Process MDestiny.exe (2112)
Debug Output: Row Number: 125, Num Points In Row: 880, Circumference: 880.355 Process MDestiny.exe (2112)
Debug Output: Row Number: 126, Num Points In Row: 883, Circumference: 882.724 Process MDestiny.exe (2112)
Debug Output: Row Number: 127, Num Points In Row: 885, Circumference: 885.068 Process MDestiny.exe (2112)
Debug Output: Row Number: 128, Num Points In Row: 887, Circumference: 887.388 Process MDestiny.exe (2112)
Debug Output: Row Number: 129, Num Points In Row: 890, Circumference: 889.684 Process MDestiny.exe (2112)
Debug Output: Row Number: 130, Num Points In Row: 892, Circumference: 891.956 Process MDestiny.exe (2112)
Debug Output: Row Number: 131, Num Points In Row: 894, Circumference: 894.204 Process MDestiny.exe (2112)
Debug Output: Row Number: 132, Num Points In Row: 896, Circumference: 896.428 Process MDestiny.exe (2112)
Debug Output: Row Number: 133, Num Points In Row: 899, Circumference: 898.63 Process MDestiny.exe (2112)
Debug Output: Row Number: 134, Num Points In Row: 901, Circumference: 900.808 Process MDestiny.exe (2112)
Debug Output: Row Number: 135, Num Points In Row: 903, Circumference: 902.963 Process MDestiny.exe (2112)
Debug Output: Row Number: 136, Num Points In Row: 905, Circumference: 905.095 Process MDestiny.exe (2112)
Debug Output: Row Number: 137, Num Points In Row: 907, Circumference: 907.204 Process MDestiny.exe (2112)
Debug Output: Row Number: 138, Num Points In Row: 909, Circumference: 909.291 Process MDestiny.exe (2112)
Debug Output: Row Number: 139, Num Points In Row: 911, Circumference: 911.356 Process MDestiny.exe (2112)
Debug Output: Row Number: 140, Num Points In Row: 913, Circumference: 913.398 Process MDestiny.exe (2112)
Debug Output: Row Number: 141, Num Points In Row: 915, Circumference: 915.418 Process MDestiny.exe (2112)
Debug Output: Row Number: 142, Num Points In Row: 917, Circumference: 917.416 Process MDestiny.exe (2112)
Debug Output: Row Number: 143, Num Points In Row: 919, Circumference: 919.392 Process MDestiny.exe (2112)
Debug Output: Row Number: 144, Num Points In Row: 921, Circumference: 921.347 Process MDestiny.exe (2112)
Debug Output: Row Number: 145, Num Points In Row: 923, Circumference: 923.28 Process MDestiny.exe (2112)
Debug Output: Row Number: 146, Num Points In Row: 925, Circumference: 925.192 Process MDestiny.exe (2112)
Debug Output: Row Number: 147, Num Points In Row: 927, Circumference: 927.082 Process MDestiny.exe (2112)
Debug Output: Row Number: 148, Num Points In Row: 929, Circumference: 928.952 Process MDestiny.exe (2112)
Debug Output: Row Number: 149, Num Points In Row: 931, Circumference: 930.8 Process MDestiny.exe (2112)
Debug Output: Row Number: 150, Num Points In Row: 933, Circumference: 932.628 Process MDestiny.exe (2112)
Debug Output: Row Number: 151, Num Points In Row: 934, Circumference: 934.434 Process MDestiny.exe (2112)
Debug Output: Row Number: 152, Num Points In Row: 936, Circumference: 936.22 Process MDestiny.exe (2112)
Debug Output: Row Number: 153, Num Points In Row: 938, Circumference: 937.986 Process MDestiny.exe (2112)
Debug Output: Row Number: 154, Num Points In Row: 940, Circumference: 939.731 Process MDestiny.exe (2112)
Debug Output: Row Number: 155, Num Points In Row: 941, Circumference: 941.456 Process MDestiny.exe (2112)
Debug Output: Row Number: 156, Num Points In Row: 943, Circumference: 943.16 Process MDestiny.exe (2112)
Debug Output: Row Number: 157, Num Points In Row: 945, Circumference: 944.845 Process MDestiny.exe (2112)
Debug Output: Row Number: 158, Num Points In Row: 947, Circumference: 946.509 Process MDestiny.exe (2112)
Debug Output: Row Number: 159, Num Points In Row: 948, Circumference: 948.154 Process MDestiny.exe (2112)
Debug Output: Row Number: 160, Num Points In Row: 950, Circumference: 949.779 Process MDestiny.exe (2112)
Debug Output: Row Number: 161, Num Points In Row: 951, Circumference: 951.384 Process MDestiny.exe (2112)
Debug Output: Row Number: 162, Num Points In Row: 953, Circumference: 952.97 Process MDestiny.exe (2112)
Debug Output: Row Number: 163, Num Points In Row: 955, Circumference: 954.536 Process MDestiny.exe (2112)
Debug Output: Row Number: 164, Num Points In Row: 956, Circumference: 956.083 Process MDestiny.exe (2112)
Debug Output: Row Number: 165, Num Points In Row: 958, Circumference: 957.611 Process MDestiny.exe (2112)
Debug Output: Row Number: 166, Num Points In Row: 959, Circumference: 959.119 Process MDestiny.exe (2112)
Debug Output: Row Number: 167, Num Points In Row: 961, Circumference: 960.608 Process MDestiny.exe (2112)
Debug Output: Row Number: 168, Num Points In Row: 962, Circumference: 962.079 Process MDestiny.exe (2112)
Debug Output: Row Number: 169, Num Points In Row: 964, Circumference: 963.53 Process MDestiny.exe (2112)
Debug Output: Row Number: 170, Num Points In Row: 965, Circumference: 964.963 Process MDestiny.exe (2112)
Debug Output: Row Number: 171, Num Points In Row: 966, Circumference: 966.377 Process MDestiny.exe (2112)
Debug Output: Row Number: 172, Num Points In Row: 968, Circumference: 967.772 Process MDestiny.exe (2112)
Debug Output: Row Number: 173, Num Points In Row: 969, Circumference: 969.149 Process MDestiny.exe (2112)
Debug Output: Row Number: 174, Num Points In Row: 971, Circumference: 970.507 Process MDestiny.exe (2112)
Debug Output: Row Number: 175, Num Points In Row: 972, Circumference: 971.846 Process MDestiny.exe (2112)
Debug Output: Row Number: 176, Num Points In Row: 973, Circumference: 973.168 Process MDestiny.exe (2112)
Debug Output: Row Number: 177, Num Points In Row: 974, Circumference: 974.471 Process MDestiny.exe (2112)
Debug Output: Row Number: 178, Num Points In Row: 976, Circumference: 975.756 Process MDestiny.exe (2112)
Debug Output: Row Number: 179, Num Points In Row: 977, Circumference: 977.022 Process MDestiny.exe (2112)
Debug Output: Row Number: 180, Num Points In Row: 978, Circumference: 978.271 Process MDestiny.exe (2112)
Debug Output: Row Number: 181, Num Points In Row: 980, Circumference: 979.502 Process MDestiny.exe (2112)
Debug Output: Row Number: 182, Num Points In Row: 981, Circumference: 980.714 Process MDestiny.exe (2112)
Debug Output: Row Number: 183, Num Points In Row: 982, Circumference: 981.909 Process MDestiny.exe (2112)
Debug Output: Row Number: 184, Num Points In Row: 983, Circumference: 983.086 Process MDestiny.exe (2112)
Debug Output: Row Number: 185, Num Points In Row: 984, Circumference: 984.246 Process MDestiny.exe (2112)
Debug Output: Row Number: 186, Num Points In Row: 985, Circumference: 985.388 Process MDestiny.exe (2112)
Debug Output: Row Number: 187, Num Points In Row: 987, Circumference: 986.512 Process MDestiny.exe (2112)
Debug Output: Row Number: 188, Num Points In Row: 988, Circumference: 987.618 Process MDestiny.exe (2112)
Debug Output: Row Number: 189, Num Points In Row: 989, Circumference: 988.707 Process MDestiny.exe (2112)
Debug Output: Row Number: 190, Num Points In Row: 990, Circumference: 989.779 Process MDestiny.exe (2112)
Debug Output: Row Number: 191, Num Points In Row: 991, Circumference: 990.833 Process MDestiny.exe (2112)
Debug Output: Row Number: 192, Num Points In Row: 992, Circumference: 991.87 Process MDestiny.exe (2112)
Debug Output: Row Number: 193, Num Points In Row: 993, Circumference: 992.89 Process MDestiny.exe (2112)
Debug Output: Row Number: 194, Num Points In Row: 994, Circumference: 993.893 Process MDestiny.exe (2112)
Debug Output: Row Number: 195, Num Points In Row: 995, Circumference: 994.878 Process MDestiny.exe (2112)
Debug Output: Row Number: 196, Num Points In Row: 996, Circumference: 995.846 Process MDestiny.exe (2112)
Debug Output: Row Number: 197, Num Points In Row: 997, Circumference: 996.797 Process MDestiny.exe (2112)
Debug Output: Row Number: 198, Num Points In Row: 998, Circumference: 997.732 Process MDestiny.exe (2112)
Debug Output: Row Number: 199, Num Points In Row: 999, Circumference: 998.649 Process MDestiny.exe (2112)
Debug Output: Row Number: 200, Num Points In Row: 1000, Circumference: 999.549 Process MDestiny.exe (2112)
Debug Output: Row Number: 201, Num Points In Row: 1000, Circumference: 1000.43 Process MDestiny.exe (2112)
Debug Output: Row Number: 202, Num Points In Row: 1001, Circumference: 1001.3 Process MDestiny.exe (2112)
Debug Output: Row Number: 203, Num Points In Row: 1002, Circumference: 1002.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 204, Num Points In Row: 1003, Circumference: 1002.98 Process MDestiny.exe (2112)
Debug Output: Row Number: 205, Num Points In Row: 1004, Circumference: 1003.8 Process MDestiny.exe (2112)
Debug Output: Row Number: 206, Num Points In Row: 1005, Circumference: 1004.6 Process MDestiny.exe (2112)
Debug Output: Row Number: 207, Num Points In Row: 1005, Circumference: 1005.38 Process MDestiny.exe (2112)
Debug Output: Row Number: 208, Num Points In Row: 1006, Circumference: 1006.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 209, Num Points In Row: 1007, Circumference: 1006.9 Process MDestiny.exe (2112)
Debug Output: Row Number: 210, Num Points In Row: 1008, Circumference: 1007.63 Process MDestiny.exe (2112)
Debug Output: Row Number: 211, Num Points In Row: 1008, Circumference: 1008.35 Process MDestiny.exe (2112)
Debug Output: Row Number: 212, Num Points In Row: 1009, Circumference: 1009.05 Process MDestiny.exe (2112)
Debug Output: Row Number: 213, Num Points In Row: 1010, Circumference: 1009.73 Process MDestiny.exe (2112)
Debug Output: Row Number: 214, Num Points In Row: 1010, Circumference: 1010.4 Process MDestiny.exe (2112)
Debug Output: Row Number: 215, Num Points In Row: 1011, Circumference: 1011.05 Process MDestiny.exe (2112)
Debug Output: Row Number: 216, Num Points In Row: 1012, Circumference: 1011.69 Process MDestiny.exe (2112)
Debug Output: Row Number: 217, Num Points In Row: 1012, Circumference: 1012.31 Process MDestiny.exe (2112)
Debug Output: Row Number: 218, Num Points In Row: 1013, Circumference: 1012.91 Process MDestiny.exe (2112)
Debug Output: Row Number: 219, Num Points In Row: 1013, Circumference: 1013.5 Process MDestiny.exe (2112)
Debug Output: Row Number: 220, Num Points In Row: 1014, Circumference: 1014.07 Process MDestiny.exe (2112)
Debug Output: Row Number: 221, Num Points In Row: 1015, Circumference: 1014.62 Process MDestiny.exe (2112)
Debug Output: Row Number: 222, Num Points In Row: 1015, Circumference: 1015.16 Process MDestiny.exe (2112)
Debug Output: Row Number: 223, Num Points In Row: 1016, Circumference: 1015.68 Process MDestiny.exe (2112)
Debug Output: Row Number: 224, Num Points In Row: 1016, Circumference: 1016.19 Process MDestiny.exe (2112)
Debug Output: Row Number: 225, Num Points In Row: 1017, Circumference: 1016.68 Process MDestiny.exe (2112)
Debug Output: Row Number: 226, Num Points In Row: 1017, Circumference: 1017.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 227, Num Points In Row: 1018, Circumference: 1017.61 Process MDestiny.exe (2112)
Debug Output: Row Number: 228, Num Points In Row: 1018, Circumference: 1018.05 Process MDestiny.exe (2112)
Debug Output: Row Number: 229, Num Points In Row: 1018, Circumference: 1018.48 Process MDestiny.exe (2112)
Debug Output: Row Number: 230, Num Points In Row: 1019, Circumference: 1018.89 Process MDestiny.exe (2112)
Debug Output: Row Number: 231, Num Points In Row: 1019, Circumference: 1019.28 Process MDestiny.exe (2112)
Debug Output: Row Number: 232, Num Points In Row: 1020, Circumference: 1019.66 Process MDestiny.exe (2112)
Debug Output: Row Number: 233, Num Points In Row: 1020, Circumference: 1020.02 Process MDestiny.exe (2112)
Debug Output: Row Number: 234, Num Points In Row: 1020, Circumference: 1020.37 Process MDestiny.exe (2112)
Debug Output: Row Number: 235, Num Points In Row: 1021, Circumference: 1020.7 Process MDestiny.exe (2112)
Debug Output: Row Number: 236, Num Points In Row: 1021, Circumference: 1021.01 Process MDestiny.exe (2112)
Debug Output: Row Number: 237, Num Points In Row: 1021, Circumference: 1021.31 Process MDestiny.exe (2112)
Debug Output: Row Number: 238, Num Points In Row: 1022, Circumference: 1021.6 Process MDestiny.exe (2112)
Debug Output: Row Number: 239, Num Points In Row: 1022, Circumference: 1021.86 Process MDestiny.exe (2112)
Debug Output: Row Number: 240, Num Points In Row: 1022, Circumference: 1022.11 Process MDestiny.exe (2112)
Debug Output: Row Number: 241, Num Points In Row: 1022, Circumference: 1022.35 Process MDestiny.exe (2112)
Debug Output: Row Number: 242, Num Points In Row: 1023, Circumference: 1022.57 Process MDestiny.exe (2112)
Debug Output: Row Number: 243, Num Points In Row: 1023, Circumference: 1022.77 Process MDestiny.exe (2112)
Debug Output: Row Number: 244, Num Points In Row: 1023, Circumference: 1022.96 Process MDestiny.exe (2112)
Debug Output: Row Number: 245, Num Points In Row: 1023, Circumference: 1023.13 Process MDestiny.exe (2112)
Debug Output: Row Number: 246, Num Points In Row: 1023, Circumference: 1023.29 Process MDestiny.exe (2112)
Debug Output: Row Number: 247, Num Points In Row: 1023, Circumference: 1023.43 Process MDestiny.exe (2112)
Debug Output: Row Number: 248, Num Points In Row: 1024, Circumference: 1023.56 Process MDestiny.exe (2112)
Debug Output: Row Number: 249, Num Points In Row: 1024, Circumference: 1023.67 Process MDestiny.exe (2112)
Debug Output: Row Number: 250, Num Points In Row: 1024, Circumference: 1023.76 Process MDestiny.exe (2112)
Debug Output: Row Number: 251, Num Points In Row: 1024, Circumference: 1023.84 Process MDestiny.exe (2112)
Debug Output: Row Number: 252, Num Points In Row: 1024, Circumference: 1023.9 Process MDestiny.exe (2112)
Debug Output: Row Number: 253, Num Points In Row: 1024, Circumference: 1023.95 Process MDestiny.exe (2112)
Debug Output: Row Number: 254, Num Points In Row: 1024, Circumference: 1023.98 Process MDestiny.exe (2112)
Debug Output: Row Number: 255, Num Points In Row: 1024, Circumference: 1024 Process MDestiny.exe (2112)
Debug Output: Row Number: 256, Num Points In Row: 1024, Circumference: 1024 Process MDestiny.exe (2112)
Debug Output: Row Number: 257, Num Points In Row: 1024, Circumference: 1023.98 Process MDestiny.exe (2112)
Debug Output: Row Number: 258, Num Points In Row: 1024, Circumference: 1023.95 Process MDestiny.exe (2112)
Debug Output: Row Number: 259, Num Points In Row: 1024, Circumference: 1023.9 Process MDestiny.exe (2112)
Debug Output: Row Number: 260, Num Points In Row: 1024, Circumference: 1023.84 Process MDestiny.exe (2112)
Debug Output: Row Number: 261, Num Points In Row: 1024, Circumference: 1023.76 Process MDestiny.exe (2112)
Debug Output: Row Number: 262, Num Points In Row: 1024, Circumference: 1023.67 Process MDestiny.exe (2112)
Debug Output: Row Number: 263, Num Points In Row: 1024, Circumference: 1023.56 Process MDestiny.exe (2112)
Debug Output: Row Number: 264, Num Points In Row: 1023, Circumference: 1023.43 Process MDestiny.exe (2112)
Debug Output: Row Number: 265, Num Points In Row: 1023, Circumference: 1023.29 Process MDestiny.exe (2112)
Debug Output: Row Number: 266, Num Points In Row: 1023, Circumference: 1023.14 Process MDestiny.exe (2112)
Debug Output: Row Number: 267, Num Points In Row: 1023, Circumference: 1022.96 Process MDestiny.exe (2112)
Debug Output: Row Number: 268, Num Points In Row: 1023, Circumference: 1022.77 Process MDestiny.exe (2112)
Debug Output: Row Number: 269, Num Points In Row: 1023, Circumference: 1022.57 Process MDestiny.exe (2112)
Debug Output: Row Number: 270, Num Points In Row: 1022, Circumference: 1022.35 Process MDestiny.exe (2112)
Debug Output: Row Number: 271, Num Points In Row: 1022, Circumference: 1022.11 Process MDestiny.exe (2112)
Debug Output: Row Number: 272, Num Points In Row: 1022, Circumference: 1021.86 Process MDestiny.exe (2112)
Debug Output: Row Number: 273, Num Points In Row: 1022, Circumference: 1021.6 Process MDestiny.exe (2112)
Debug Output: Row Number: 274, Num Points In Row: 1021, Circumference: 1021.31 Process MDestiny.exe (2112)
Debug Output: Row Number: 275, Num Points In Row: 1021, Circumference: 1021.01 Process MDestiny.exe (2112)
Debug Output: Row Number: 276, Num Points In Row: 1021, Circumference: 1020.7 Process MDestiny.exe (2112)
Debug Output: Row Number: 277, Num Points In Row: 1020, Circumference: 1020.37 Process MDestiny.exe (2112)
Debug Output: Row Number: 278, Num Points In Row: 1020, Circumference: 1020.02 Process MDestiny.exe (2112)
Debug Output: Row Number: 279, Num Points In Row: 1020, Circumference: 1019.66 Process MDestiny.exe (2112)
Debug Output: Row Number: 280, Num Points In Row: 1019, Circumference: 1019.28 Process MDestiny.exe (2112)
Debug Output: Row Number: 281, Num Points In Row: 1019, Circumference: 1018.89 Process MDestiny.exe (2112)
Debug Output: Row Number: 282, Num Points In Row: 1018, Circumference: 1018.48 Process MDestiny.exe (2112)
Debug Output: Row Number: 283, Num Points In Row: 1018, Circumference: 1018.05 Process MDestiny.exe (2112)
Debug Output: Row Number: 284, Num Points In Row: 1018, Circumference: 1017.61 Process MDestiny.exe (2112)
Debug Output: Row Number: 285, Num Points In Row: 1017, Circumference: 1017.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 286, Num Points In Row: 1017, Circumference: 1016.68 Process MDestiny.exe (2112)
Debug Output: Row Number: 287, Num Points In Row: 1016, Circumference: 1016.19 Process MDestiny.exe (2112)
Debug Output: Row Number: 288, Num Points In Row: 1016, Circumference: 1015.68 Process MDestiny.exe (2112)
Debug Output: Row Number: 289, Num Points In Row: 1015, Circumference: 1015.16 Process MDestiny.exe (2112)
Debug Output: Row Number: 290, Num Points In Row: 1015, Circumference: 1014.62 Process MDestiny.exe (2112)
Debug Output: Row Number: 291, Num Points In Row: 1014, Circumference: 1014.07 Process MDestiny.exe (2112)
Debug Output: Row Number: 292, Num Points In Row: 1013, Circumference: 1013.5 Process MDestiny.exe (2112)
Debug Output: Row Number: 293, Num Points In Row: 1013, Circumference: 1012.91 Process MDestiny.exe (2112)
Debug Output: Row Number: 294, Num Points In Row: 1012, Circumference: 1012.31 Process MDestiny.exe (2112)
Debug Output: Row Number: 295, Num Points In Row: 1012, Circumference: 1011.69 Process MDestiny.exe (2112)
Debug Output: Row Number: 296, Num Points In Row: 1011, Circumference: 1011.05 Process MDestiny.exe (2112)
Debug Output: Row Number: 297, Num Points In Row: 1010, Circumference: 1010.4 Process MDestiny.exe (2112)
Debug Output: Row Number: 298, Num Points In Row: 1010, Circumference: 1009.73 Process MDestiny.exe (2112)
Debug Output: Row Number: 299, Num Points In Row: 1009, Circumference: 1009.05 Process MDestiny.exe (2112)
Debug Output: Row Number: 300, Num Points In Row: 1008, Circumference: 1008.35 Process MDestiny.exe (2112)
Debug Output: Row Number: 301, Num Points In Row: 1008, Circumference: 1007.63 Process MDestiny.exe (2112)
Debug Output: Row Number: 302, Num Points In Row: 1007, Circumference: 1006.9 Process MDestiny.exe (2112)
Debug Output: Row Number: 303, Num Points In Row: 1006, Circumference: 1006.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 304, Num Points In Row: 1005, Circumference: 1005.38 Process MDestiny.exe (2112)
Debug Output: Row Number: 305, Num Points In Row: 1005, Circumference: 1004.6 Process MDestiny.exe (2112)
Debug Output: Row Number: 306, Num Points In Row: 1004, Circumference: 1003.8 Process MDestiny.exe (2112)
Debug Output: Row Number: 307, Num Points In Row: 1003, Circumference: 1002.98 Process MDestiny.exe (2112)
Debug Output: Row Number: 308, Num Points In Row: 1002, Circumference: 1002.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 309, Num Points In Row: 1001, Circumference: 1001.3 Process MDestiny.exe (2112)
Debug Output: Row Number: 310, Num Points In Row: 1000, Circumference: 1000.43 Process MDestiny.exe (2112)
Debug Output: Row Number: 311, Num Points In Row: 1000, Circumference: 999.55 Process MDestiny.exe (2112)
Debug Output: Row Number: 312, Num Points In Row: 999, Circumference: 998.65 Process MDestiny.exe (2112)
Debug Output: Row Number: 313, Num Points In Row: 998, Circumference: 997.732 Process MDestiny.exe (2112)
Debug Output: Row Number: 314, Num Points In Row: 997, Circumference: 996.798 Process MDestiny.exe (2112)
Debug Output: Row Number: 315, Num Points In Row: 996, Circumference: 995.847 Process MDestiny.exe (2112)
Debug Output: Row Number: 316, Num Points In Row: 995, Circumference: 994.879 Process MDestiny.exe (2112)
Debug Output: Row Number: 317, Num Points In Row: 994, Circumference: 993.894 Process MDestiny.exe (2112)
Debug Output: Row Number: 318, Num Points In Row: 993, Circumference: 992.891 Process MDestiny.exe (2112)
Debug Output: Row Number: 319, Num Points In Row: 992, Circumference: 991.871 Process MDestiny.exe (2112)
Debug Output: Row Number: 320, Num Points In Row: 991, Circumference: 990.834 Process MDestiny.exe (2112)
Debug Output: Row Number: 321, Num Points In Row: 990, Circumference: 989.78 Process MDestiny.exe (2112)
Debug Output: Row Number: 322, Num Points In Row: 989, Circumference: 988.708 Process MDestiny.exe (2112)
Debug Output: Row Number: 323, Num Points In Row: 988, Circumference: 987.619 Process MDestiny.exe (2112)
Debug Output: Row Number: 324, Num Points In Row: 987, Circumference: 986.513 Process MDestiny.exe (2112)
Debug Output: Row Number: 325, Num Points In Row: 985, Circumference: 985.389 Process MDestiny.exe (2112)
Debug Output: Row Number: 326, Num Points In Row: 984, Circumference: 984.247 Process MDestiny.exe (2112)
Debug Output: Row Number: 327, Num Points In Row: 983, Circumference: 983.088 Process MDestiny.exe (2112)
Debug Output: Row Number: 328, Num Points In Row: 982, Circumference: 981.911 Process MDestiny.exe (2112)
Debug Output: Row Number: 329, Num Points In Row: 981, Circumference: 980.716 Process MDestiny.exe (2112)
Debug Output: Row Number: 330, Num Points In Row: 980, Circumference: 979.503 Process MDestiny.exe (2112)
Debug Output: Row Number: 331, Num Points In Row: 978, Circumference: 978.272 Process MDestiny.exe (2112)
Debug Output: Row Number: 332, Num Points In Row: 977, Circumference: 977.024 Process MDestiny.exe (2112)
Debug Output: Row Number: 333, Num Points In Row: 976, Circumference: 975.757 Process MDestiny.exe (2112)
Debug Output: Row Number: 334, Num Points In Row: 974, Circumference: 974.472 Process MDestiny.exe (2112)
Debug Output: Row Number: 335, Num Points In Row: 973, Circumference: 973.169 Process MDestiny.exe (2112)
Debug Output: Row Number: 336, Num Points In Row: 972, Circumference: 971.848 Process MDestiny.exe (2112)
Debug Output: Row Number: 337, Num Points In Row: 971, Circumference: 970.508 Process MDestiny.exe (2112)
Debug Output: Row Number: 338, Num Points In Row: 969, Circumference: 969.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 339, Num Points In Row: 968, Circumference: 967.773 Process MDestiny.exe (2112)
Debug Output: Row Number: 340, Num Points In Row: 966, Circumference: 966.378 Process MDestiny.exe (2112)
Debug Output: Row Number: 341, Num Points In Row: 965, Circumference: 964.964 Process MDestiny.exe (2112)
Debug Output: Row Number: 342, Num Points In Row: 964, Circumference: 963.532 Process MDestiny.exe (2112)
Debug Output: Row Number: 343, Num Points In Row: 962, Circumference: 962.08 Process MDestiny.exe (2112)
Debug Output: Row Number: 344, Num Points In Row: 961, Circumference: 960.61 Process MDestiny.exe (2112)
Debug Output: Row Number: 345, Num Points In Row: 959, Circumference: 959.121 Process MDestiny.exe (2112)
Debug Output: Row Number: 346, Num Points In Row: 958, Circumference: 957.612 Process MDestiny.exe (2112)
Debug Output: Row Number: 347, Num Points In Row: 956, Circumference: 956.085 Process MDestiny.exe (2112)
Debug Output: Row Number: 348, Num Points In Row: 955, Circumference: 954.538 Process MDestiny.exe (2112)
Debug Output: Row Number: 349, Num Points In Row: 953, Circumference: 952.972 Process MDestiny.exe (2112)
Debug Output: Row Number: 350, Num Points In Row: 951, Circumference: 951.386 Process MDestiny.exe (2112)
Debug Output: Row Number: 351, Num Points In Row: 950, Circumference: 949.78 Process MDestiny.exe (2112)
Debug Output: Row Number: 352, Num Points In Row: 948, Circumference: 948.156 Process MDestiny.exe (2112)
Debug Output: Row Number: 353, Num Points In Row: 947, Circumference: 946.511 Process MDestiny.exe (2112)
Debug Output: Row Number: 354, Num Points In Row: 945, Circumference: 944.846 Process MDestiny.exe (2112)
Debug Output: Row Number: 355, Num Points In Row: 943, Circumference: 943.162 Process MDestiny.exe (2112)
Debug Output: Row Number: 356, Num Points In Row: 941, Circumference: 941.457 Process MDestiny.exe (2112)
Debug Output: Row Number: 357, Num Points In Row: 940, Circumference: 939.733 Process MDestiny.exe (2112)
Debug Output: Row Number: 358, Num Points In Row: 938, Circumference: 937.987 Process MDestiny.exe (2112)
Debug Output: Row Number: 359, Num Points In Row: 936, Circumference: 936.222 Process MDestiny.exe (2112)
Debug Output: Row Number: 360, Num Points In Row: 934, Circumference: 934.436 Process MDestiny.exe (2112)
Debug Output: Row Number: 361, Num Points In Row: 933, Circumference: 932.629 Process MDestiny.exe (2112)
Debug Output: Row Number: 362, Num Points In Row: 931, Circumference: 930.802 Process MDestiny.exe (2112)
Debug Output: Row Number: 363, Num Points In Row: 929, Circumference: 928.953 Process MDestiny.exe (2112)
Debug Output: Row Number: 364, Num Points In Row: 927, Circumference: 927.084 Process MDestiny.exe (2112)
Debug Output: Row Number: 365, Num Points In Row: 925, Circumference: 925.194 Process MDestiny.exe (2112)
Debug Output: Row Number: 366, Num Points In Row: 923, Circumference: 923.282 Process MDestiny.exe (2112)
Debug Output: Row Number: 367, Num Points In Row: 921, Circumference: 921.349 Process MDestiny.exe (2112)
Debug Output: Row Number: 368, Num Points In Row: 919, Circumference: 919.394 Process MDestiny.exe (2112)
Debug Output: Row Number: 369, Num Points In Row: 917, Circumference: 917.418 Process MDestiny.exe (2112)
Debug Output: Row Number: 370, Num Points In Row: 915, Circumference: 915.42 Process MDestiny.exe (2112)
Debug Output: Row Number: 371, Num Points In Row: 913, Circumference: 913.4 Process MDestiny.exe (2112)
Debug Output: Row Number: 372, Num Points In Row: 911, Circumference: 911.358 Process MDestiny.exe (2112)
Debug Output: Row Number: 373, Num Points In Row: 909, Circumference: 909.293 Process MDestiny.exe (2112)
Debug Output: Row Number: 374, Num Points In Row: 907, Circumference: 907.206 Process MDestiny.exe (2112)
Debug Output: Row Number: 375, Num Points In Row: 905, Circumference: 905.097 Process MDestiny.exe (2112)
Debug Output: Row Number: 376, Num Points In Row: 903, Circumference: 902.965 Process MDestiny.exe (2112)
Debug Output: Row Number: 377, Num Points In Row: 901, Circumference: 900.81 Process MDestiny.exe (2112)
Debug Output: Row Number: 378, Num Points In Row: 899, Circumference: 898.632 Process MDestiny.exe (2112)
Debug Output: Row Number: 379, Num Points In Row: 896, Circumference: 896.43 Process MDestiny.exe (2112)
Debug Output: Row Number: 380, Num Points In Row: 894, Circumference: 894.206 Process MDestiny.exe (2112)
Debug Output: Row Number: 381, Num Points In Row: 892, Circumference: 891.958 Process MDestiny.exe (2112)
Debug Output: Row Number: 382, Num Points In Row: 890, Circumference: 889.686 Process MDestiny.exe (2112)
Debug Output: Row Number: 383, Num Points In Row: 887, Circumference: 887.39 Process MDestiny.exe (2112)
Debug Output: Row Number: 384, Num Points In Row: 885, Circumference: 885.07 Process MDestiny.exe (2112)
Debug Output: Row Number: 385, Num Points In Row: 883, Circumference: 882.726 Process MDestiny.exe (2112)
Debug Output: Row Number: 386, Num Points In Row: 880, Circumference: 880.357 Process MDestiny.exe (2112)
Debug Output: Row Number: 387, Num Points In Row: 878, Circumference: 877.964 Process MDestiny.exe (2112)
Debug Output: Row Number: 388, Num Points In Row: 876, Circumference: 875.546 Process MDestiny.exe (2112)
Debug Output: Row Number: 389, Num Points In Row: 873, Circumference: 873.102 Process MDestiny.exe (2112)
Debug Output: Row Number: 390, Num Points In Row: 871, Circumference: 870.633 Process MDestiny.exe (2112)
Debug Output: Row Number: 391, Num Points In Row: 868, Circumference: 868.139 Process MDestiny.exe (2112)
Debug Output: Row Number: 392, Num Points In Row: 866, Circumference: 865.619 Process MDestiny.exe (2112)
Debug Output: Row Number: 393, Num Points In Row: 863, Circumference: 863.073 Process MDestiny.exe (2112)
Debug Output: Row Number: 394, Num Points In Row: 861, Circumference: 860.501 Process MDestiny.exe (2112)
Debug Output: Row Number: 395, Num Points In Row: 858, Circumference: 857.902 Process MDestiny.exe (2112)
Debug Output: Row Number: 396, Num Points In Row: 855, Circumference: 855.277 Process MDestiny.exe (2112)
Debug Output: Row Number: 397, Num Points In Row: 853, Circumference: 852.625 Process MDestiny.exe (2112)
Debug Output: Row Number: 398, Num Points In Row: 850, Circumference: 849.946 Process MDestiny.exe (2112)
Debug Output: Row Number: 399, Num Points In Row: 847, Circumference: 847.239 Process MDestiny.exe (2112)
Debug Output: Row Number: 400, Num Points In Row: 845, Circumference: 844.505 Process MDestiny.exe (2112)
Debug Output: Row Number: 401, Num Points In Row: 842, Circumference: 841.742 Process MDestiny.exe (2112)
Debug Output: Row Number: 402, Num Points In Row: 839, Circumference: 838.952 Process MDestiny.exe (2112)
Debug Output: Row Number: 403, Num Points In Row: 836, Circumference: 836.132 Process MDestiny.exe (2112)
Debug Output: Row Number: 404, Num Points In Row: 833, Circumference: 833.284 Process MDestiny.exe (2112)
Debug Output: Row Number: 405, Num Points In Row: 830, Circumference: 830.407 Process MDestiny.exe (2112)
Debug Output: Row Number: 406, Num Points In Row: 828, Circumference: 827.501 Process MDestiny.exe (2112)
Debug Output: Row Number: 407, Num Points In Row: 825, Circumference: 824.564 Process MDestiny.exe (2112)
Debug Output: Row Number: 408, Num Points In Row: 822, Circumference: 821.598 Process MDestiny.exe (2112)
Debug Output: Row Number: 409, Num Points In Row: 819, Circumference: 818.601 Process MDestiny.exe (2112)
Debug Output: Row Number: 410, Num Points In Row: 816, Circumference: 815.574 Process MDestiny.exe (2112)
Debug Output: Row Number: 411, Num Points In Row: 813, Circumference: 812.515 Process MDestiny.exe (2112)
Debug Output: Row Number: 412, Num Points In Row: 809, Circumference: 809.425 Process MDestiny.exe (2112)
Debug Output: Row Number: 413, Num Points In Row: 806, Circumference: 806.304 Process MDestiny.exe (2112)
Debug Output: Row Number: 414, Num Points In Row: 803, Circumference: 803.15 Process MDestiny.exe (2112)
Debug Output: Row Number: 415, Num Points In Row: 800, Circumference: 799.963 Process MDestiny.exe (2112)
Debug Output: Row Number: 416, Num Points In Row: 797, Circumference: 796.744 Process MDestiny.exe (2112)
Debug Output: Row Number: 417, Num Points In Row: 793, Circumference: 793.492 Process MDestiny.exe (2112)
Debug Output: Row Number: 418, Num Points In Row: 790, Circumference: 790.206 Process MDestiny.exe (2112)
Debug Output: Row Number: 419, Num Points In Row: 787, Circumference: 786.885 Process MDestiny.exe (2112)
Debug Output: Row Number: 420, Num Points In Row: 784, Circumference: 783.53 Process MDestiny.exe (2112)
Debug Output: Row Number: 421, Num Points In Row: 780, Circumference: 780.14 Process MDestiny.exe (2112)
Debug Output: Row Number: 422, Num Points In Row: 777, Circumference: 776.715 Process MDestiny.exe (2112)
Debug Output: Row Number: 423, Num Points In Row: 773, Circumference: 773.253 Process MDestiny.exe (2112)
Debug Output: Row Number: 424, Num Points In Row: 770, Circumference: 769.756 Process MDestiny.exe (2112)
Debug Output: Row Number: 425, Num Points In Row: 766, Circumference: 766.221 Process MDestiny.exe (2112)
Debug Output: Row Number: 426, Num Points In Row: 763, Circumference: 762.649 Process MDestiny.exe (2112)
Debug Output: Row Number: 427, Num Points In Row: 759, Circumference: 759.038 Process MDestiny.exe (2112)
Debug Output: Row Number: 428, Num Points In Row: 755, Circumference: 755.39 Process MDestiny.exe (2112)
Debug Output: Row Number: 429, Num Points In Row: 752, Circumference: 751.702 Process MDestiny.exe (2112)
Debug Output: Row Number: 430, Num Points In Row: 748, Circumference: 747.975 Process MDestiny.exe (2112)
Debug Output: Row Number: 431, Num Points In Row: 744, Circumference: 744.207 Process MDestiny.exe (2112)
Debug Output: Row Number: 432, Num Points In Row: 740, Circumference: 740.398 Process MDestiny.exe (2112)
Debug Output: Row Number: 433, Num Points In Row: 737, Circumference: 736.548 Process MDestiny.exe (2112)
Debug Output: Row Number: 434, Num Points In Row: 733, Circumference: 732.656 Process MDestiny.exe (2112)
Debug Output: Row Number: 435, Num Points In Row: 729, Circumference: 728.721 Process MDestiny.exe (2112)
Debug Output: Row Number: 436, Num Points In Row: 725, Circumference: 724.743 Process MDestiny.exe (2112)
Debug Output: Row Number: 437, Num Points In Row: 721, Circumference: 720.72 Process MDestiny.exe (2112)
Debug Output: Row Number: 438, Num Points In Row: 717, Circumference: 716.652 Process MDestiny.exe (2112)
Debug Output: Row Number: 439, Num Points In Row: 713, Circumference: 712.539 Process MDestiny.exe (2112)
Debug Output: Row Number: 440, Num Points In Row: 708, Circumference: 708.378 Process MDestiny.exe (2112)
Debug Output: Row Number: 441, Num Points In Row: 704, Circumference: 704.171 Process MDestiny.exe (2112)
Debug Output: Row Number: 442, Num Points In Row: 700, Circumference: 699.915 Process MDestiny.exe (2112)
Debug Output: Row Number: 443, Num Points In Row: 696, Circumference: 695.61 Process MDestiny.exe (2112)
Debug Output: Row Number: 444, Num Points In Row: 691, Circumference: 691.255 Process MDestiny.exe (2112)
Debug Output: Row Number: 445, Num Points In Row: 687, Circumference: 686.849 Process MDestiny.exe (2112)
Debug Output: Row Number: 446, Num Points In Row: 682, Circumference: 682.392 Process MDestiny.exe (2112)
Debug Output: Row Number: 447, Num Points In Row: 678, Circumference: 677.881 Process MDestiny.exe (2112)
Debug Output: Row Number: 448, Num Points In Row: 673, Circumference: 673.316 Process MDestiny.exe (2112)
Debug Output: Row Number: 449, Num Points In Row: 669, Circumference: 668.695 Process MDestiny.exe (2112)
Debug Output: Row Number: 450, Num Points In Row: 664, Circumference: 664.019 Process MDestiny.exe (2112)
Debug Output: Row Number: 451, Num Points In Row: 659, Circumference: 659.285 Process MDestiny.exe (2112)
Debug Output: Row Number: 452, Num Points In Row: 654, Circumference: 654.492 Process MDestiny.exe (2112)
Debug Output: Row Number: 453, Num Points In Row: 650, Circumference: 649.639 Process MDestiny.exe (2112)
Debug Output: Row Number: 454, Num Points In Row: 645, Circumference: 644.725 Process MDestiny.exe (2112)
Debug Output: Row Number: 455, Num Points In Row: 640, Circumference: 639.748 Process MDestiny.exe (2112)
Debug Output: Row Number: 456, Num Points In Row: 635, Circumference: 634.706 Process MDestiny.exe (2112)
Debug Output: Row Number: 457, Num Points In Row: 630, Circumference: 629.599 Process MDestiny.exe (2112)
Debug Output: Row Number: 458, Num Points In Row: 624, Circumference: 624.424 Process MDestiny.exe (2112)
Debug Output: Row Number: 459, Num Points In Row: 619, Circumference: 619.18 Process MDestiny.exe (2112)
Debug Output: Row Number: 460, Num Points In Row: 614, Circumference: 613.865 Process MDestiny.exe (2112)
Debug Output: Row Number: 461, Num Points In Row: 608, Circumference: 608.477 Process MDestiny.exe (2112)
Debug Output: Row Number: 462, Num Points In Row: 603, Circumference: 603.014 Process MDestiny.exe (2112)
Debug Output: Row Number: 463, Num Points In Row: 597, Circumference: 597.475 Process MDestiny.exe (2112)
Debug Output: Row Number: 464, Num Points In Row: 592, Circumference: 591.856 Process MDestiny.exe (2112)
Debug Output: Row Number: 465, Num Points In Row: 586, Circumference: 586.156 Process MDestiny.exe (2112)
Debug Output: Row Number: 466, Num Points In Row: 580, Circumference: 580.373 Process MDestiny.exe (2112)
Debug Output: Row Number: 467, Num Points In Row: 575, Circumference: 574.504 Process MDestiny.exe (2112)
Debug Output: Row Number: 468, Num Points In Row: 569, Circumference: 568.545 Process MDestiny.exe (2112)
Debug Output: Row Number: 469, Num Points In Row: 562, Circumference: 562.495 Process MDestiny.exe (2112)
Debug Output: Row Number: 470, Num Points In Row: 556, Circumference: 556.35 Process MDestiny.exe (2112)
Debug Output: Row Number: 471, Num Points In Row: 550, Circumference: 550.108 Process MDestiny.exe (2112)
Debug Output: Row Number: 472, Num Points In Row: 544, Circumference: 543.764 Process MDestiny.exe (2112)
Debug Output: Row Number: 473, Num Points In Row: 537, Circumference: 537.316 Process MDestiny.exe (2112)
Debug Output: Row Number: 474, Num Points In Row: 531, Circumference: 530.759 Process MDestiny.exe (2112)
Debug Output: Row Number: 475, Num Points In Row: 524, Circumference: 524.089 Process MDestiny.exe (2112)
Debug Output: Row Number: 476, Num Points In Row: 517, Circumference: 517.302 Process MDestiny.exe (2112)
Debug Output: Row Number: 477, Num Points In Row: 510, Circumference: 510.393 Process MDestiny.exe (2112)
Debug Output: Row Number: 478, Num Points In Row: 503, Circumference: 503.358 Process MDestiny.exe (2112)
Debug Output: Row Number: 479, Num Points In Row: 496, Circumference: 496.191 Process MDestiny.exe (2112)
Debug Output: Row Number: 480, Num Points In Row: 489, Circumference: 488.886 Process MDestiny.exe (2112)
Debug Output: Row Number: 481, Num Points In Row: 481, Circumference: 481.436 Process MDestiny.exe (2112)
Debug Output: Row Number: 482, Num Points In Row: 474, Circumference: 473.836 Process MDestiny.exe (2112)
Debug Output: Row Number: 483, Num Points In Row: 466, Circumference: 466.077 Process MDestiny.exe (2112)
Debug Output: Row Number: 484, Num Points In Row: 458, Circumference: 458.151 Process MDestiny.exe (2112)
Debug Output: Row Number: 485, Num Points In Row: 450, Circumference: 450.051 Process MDestiny.exe (2112)
Debug Output: Row Number: 486, Num Points In Row: 442, Circumference: 441.766 Process MDestiny.exe (2112)
Debug Output: Row Number: 487, Num Points In Row: 433, Circumference: 433.285 Process MDestiny.exe (2112)
Debug Output: Row Number: 488, Num Points In Row: 425, Circumference: 424.597 Process MDestiny.exe (2112)
Debug Output: Row Number: 489, Num Points In Row: 416, Circumference: 415.689 Process MDestiny.exe (2112)
Debug Output: Row Number: 490, Num Points In Row: 407, Circumference: 406.546 Process MDestiny.exe (2112)
Debug Output: Row Number: 491, Num Points In Row: 397, Circumference: 397.153 Process MDestiny.exe (2112)
Debug Output: Row Number: 492, Num Points In Row: 387, Circumference: 387.49 Process MDestiny.exe (2112)
Debug Output: Row Number: 493, Num Points In Row: 378, Circumference: 377.538 Process MDestiny.exe (2112)
Debug Output: Row Number: 494, Num Points In Row: 367, Circumference: 367.272 Process MDestiny.exe (2112)
Debug Output: Row Number: 495, Num Points In Row: 357, Circumference: 356.665 Process MDestiny.exe (2112)
Debug Output: Row Number: 496, Num Points In Row: 346, Circumference: 345.688 Process MDestiny.exe (2112)
Debug Output: Row Number: 497, Num Points In Row: 334, Circumference: 334.302 Process MDestiny.exe (2112)
Debug Output: Row Number: 498, Num Points In Row: 322, Circumference: 322.464 Process MDestiny.exe (2112)
Debug Output: Row Number: 499, Num Points In Row: 310, Circumference: 310.123 Process MDestiny.exe (2112)
Debug Output: Row Number: 500, Num Points In Row: 297, Circumference: 297.216 Process MDestiny.exe (2112)
Debug Output: Row Number: 501, Num Points In Row: 284, Circumference: 283.667 Process MDestiny.exe (2112)
Debug Output: Row Number: 502, Num Points In Row: 269, Circumference: 269.377 Process MDestiny.exe (2112)
Debug Output: Row Number: 503, Num Points In Row: 254, Circumference: 254.222 Process MDestiny.exe (2112)
Debug Output: Row Number: 504, Num Points In Row: 238, Circumference: 238.036 Process MDestiny.exe (2112)
Debug Output: Row Number: 505, Num Points In Row: 221, Circumference: 220.595 Process MDestiny.exe (2112)
Debug Output: Row Number: 506, Num Points In Row: 202, Circumference: 201.57 Process MDestiny.exe (2112)
Debug Output: Row Number: 507, Num Points In Row: 180, Circumference: 180.462 Process MDestiny.exe (2112)
Debug Output: Row Number: 508, Num Points In Row: 156, Circumference: 156.431 Process MDestiny.exe (2112)
Debug Output: Row Number: 509, Num Points In Row: 128, Circumference: 127.84 Process MDestiny.exe (2112)
Debug Output: Row Number: 510, Num Points In Row: 90, Circumference: 90.459 Process MDestiny.exe (2112)
Debug Output: Row Number: 511, Num Points In Row: 1 Process MDestiny.exe (2112)


Debug Output: Total Points: 410939 Process MDestiny.exe (2112)

RonHiler
08-20-2008, 10:38 AM
Progress is being made.

All points now have a latitude range and a longitude range. Also, I just finished the routine that takes any lat/long pair and returns an index into the worldpoint array. What is awesome about that is that everything is done by calculation. There are no searches involved (which is how it was done before) with the neighbors stuff.

I had all kinds of tricks I was using to speed up the searches, but when you are searching through 400,000 points and doing it many many times, it's going to be a bottleneck no matter what you do.

Now it's lightning fast as compared to before.

Another upgrade is we are no longer limited to cardinal directions. Whereas previously we had 8 neighbor values per point, and could only move in one of those 8 directions, now we have NO neighbor values, but rather a starting lat/long pair, a bearing, and a distance, from which we calculate a new lat/long pair, which then gets fed to the routine above to give us a specific point in the array. We can now freely move around the map, which is pretty cool.

So things so far are looking good. I'm much happier with the code. It's cleaner and simpler, and a lot faster than previously. And, more importantly, it should work, hehe. No area deformations is the ultimate goal here.

Strike
08-21-2008, 05:16 PM
Awesome indeed ^_^

So what else still needs done... just testing it?

RonHiler
08-21-2008, 06:22 PM
Next will be a lot of testing. I put in those nasty equations that calculate a new lat/long pair based on starting point, direction, and bearing, then fed those to the routine to return an index point.

I'm going to test the heck out of that to make sure it works with all the possible wrapping around that could happen. Once I'm satisfied with that, I redo the plate assignment routine (it worked with the Neighbors, so now I'll have to rewrite it to use bearings/distance), and at that point we'll pretty much be where we were, except hopefully this time with a working system that will allow us to move terrain features around with no deformations.

RonHiler
08-26-2008, 09:53 AM
Some (perhaps) interesting statistics for those of you who like this sort of thing:



DD Start Code Start Code Completion Coding Days Total Days
M1 7/1/2007 7/23/2007 10/4/2007 73 95
M2 10/4/2007 10/15/2007 11/3/2007 19 30
M3 11/3/2007 11/7/2007 12/22/2007 45 49
M4 12/22/2007 2/4/2008 5/13/2008 99 143
M5 5/13/2008 5/19/2008 8/25/2008 98 104
average 67 84

DD: Design Doc
Total Days: Day of Milestone Completion – Day of Prior Milestone Completion
Coding Days: Day of Milestone Completion – Day of coding start


This assumes I finished M5 yesterday, which of course is untrue. I do expect it will get finished soonish, but certainly not yesterday :) I just put the value in there to complete the table. So on average, it has been 84 days between releases, 67 of which were days spent coding.

Now, I hope these long coding times are the exception rather than the norm. I was hoping for a much faster release schedule than we've had. And I do think some of the more difficult aspects of the program were front-loaded, so perhaps our averages will begin to come down a bit.

Some good progress has been made on the M5 front. I've finished testing the routine I talked about earlier (Given a start lat/long, a bearing, and a distance, what is the new lat/long?). I wrote a companion routine to that (given two lat/long pairs, what this the bearing and distance between them?).

I tested these two routines with about 5000 random points, bearings, and distances. Given those, I fed them into the first routine, giving us a calculated lat/long. I then fed the starting lat/long and ending lat/long into the second routine, which should give us the original bearing and distance back.

Which it did. The returned bearing was +/- 0.00008 (range of 0->2PI) of the original, while the returned distance was +/- 0.00016 (range of 0->100) of the original. So we're good there.

What this all means is that we are ready for things to move around. I have to rewrite the routine to assign every point on the map to a particular tectonic plate (since before it was being done by neighbors, and we no longer have those). Once that is done, we're ready to get into the iterations (since the hotspots and wind direction routines will change very little if at all).

RonHiler
08-28-2008, 11:22 AM
Hey gang,

I know I've been posting a lot on the trials and tribulations of M5. I want to keep you in the loop on this, since it's been a troublesome build, full of setbacks and delays. Don't lose hope, things are looking better than ever right now.

I am done with all the pre-iteration tweaking, having gone over the hotspot and wind routines this morning. What that means is we are now back to where we were some weeks ago when I began thinking seriously about the iteration part of the process and realized we were screwed ;)

The difference between then and now is that I am now 100% confident that we can move around on our world without area deformations, which is critical to the iteration process.

I do have some screenshots to show you guys, and they are pretty interesting. I'll post them tonight and go over them so you know what you are looking at.

I added back in the neighbor calculation routines that I had removed before. I found that when I was doing tectonic plate assignment, border flagging, and wind assignment stuff, I was constantly having to find adjacent points. That is easy to do with our routine using lat/long pairs, distance, and bearing, but it is a lot of trig every time you run that routine, and when you have to go through the entire map (400,000+ points) and each point needs 8 adjacent point calculations, it was slowing things down. So instead I put back in the neighbors, calcuated it one time, and then just used those calculated points whenever I needed an adjacent point.

That's not to say we can't still use our other routine to get a point. Any time I need a point that is not adjacent (e.g. with a distance > 1), I can plug it in to that routine and find the daughter point, so we have the best of both worlds now. In fact, I do that with hotspots (each hotspot consists of anywhere from 1 to 9 individual volcanos, so you get a parent point, then a set of random distances (0-30) and bearings which gives each daughter spot).

The one downside is that the neighbor calculations part takes longer than it did before, but that's because the calculations are much more complex (and of course, now they are right, whereas before they were not, I'll show you why when I post the screenshots later on).

On the upside, I am now much more confident that the iteration process won't take as long as I feared. There won't be any super complex calculations going on there, really just a bunch of moving data around. In that respect it is most similar to the wind direction setup routine, which runs in about 5 seconds (which is one time through the map). And that itself is getting a lot of it's overhead from the fact that the routine is getting called over 500 times (so there is function-calling overhead there). The iteration loop won't get called once per row (as the wind does) but rather once per iteration, so we already have less initial overhead. So we'll see how that goes. Ideally, I'd like to do at least 100 iterations. The real key to this is to make sure we don't go over the map any more than once per iteration. If we can pull that off, I think we'll be okay.

Also, as a side effect of all this new work, we inadvertantly solved the issue I said we would put off until later, which is pathing. So when the time comes, down the road when we need to work on moving stacks of units around, the most difficult part of that (which is being on a round world) has been solved.

So all is good. We are moving on to the last three steps in the milestone. We're going to be putting this one behind us pretty soon now, I think.

RonHiler
08-28-2008, 05:04 PM
Okay guys, a few shots to share:

This (below) is one I wanted to give you real quick. It's not particularly relevant to anything, except check out the picure perfect pathing. This is a side effect of using the lat/long system over the neighbor system we had before.


http://www.rjcyberware.com/md/screens/MapIssue4a.png

Alright, something a bit more relevant. There are 5 random points on the map (it's a total coincidence that two pairs of them are so close to the same longitude like they are), which are then extended N, S, E, and W. Now N and S are probably about what you would expect, but E and W might look odd to you. What those lines are are segments of the greatcircle connecting the endpoints. A greatcircle (if you don't already know) is the circle that runs through any two points on a sphere and also through the center point of the sphere (basically, a greatcircle will ALWAYS cut a sphere into two equal hemispheres). The shortest distance between any two points on a sphere is always along the greatcircle path (and there is exactly ONE greatcircle path for any two points unless those two points happen to be anti-polar or degenerate).

It may not look like the line is the shortest distance between those points, but that's just an effect of the projection. If it was on a sphere that you could turn, you would see that it is true.

Contrast this to previous versions where the E-W lines were straight. That was one place where I went wrong, and part of the reason we were having issues.

You may also be able to tell that the northernmost point is handling running through the N-pole and then back south perfectly, without any special handling on my part.

http://www.rjcyberware.com/md/screens/MapIssue5.png

Alright, next two shots are more realistic. These are actually the random points used for seeding the tectonic plates. Only instead of allowing the plates to form, I told them to go N-S-E-W instead (much like the shot above). It's essentially the same thing, only with a lot more points than before.

http://www.rjcyberware.com/md/screens/MapIssue6.png

http://www.rjcyberware.com/md/screens/MapIssue7.png

Okay, last shot. This is one I took this morning. It's one with a fully formed tectonic plate set (each plate has it's own color). The borders between plates were flagged and are drawn in black. Those are going to be areas of somewhat higher volcanic activity.

It might be a bit hard to see, but if you look close you will also notice clusters of red dots. Those are hotspots, which will be quite active volcanicly.

http://www.rjcyberware.com/md/screens/MapIssue8.png

So that's that. The next challenge (and final one for this milestone) is handling point movement. And mostly that's done (it's all wrapped up in the routines that have been written already). The only real question is how to handle point data when it hits the edge of a plate (remember, the plate borders themselves are *mostly* not going to move[1], only the features on top of those plates will shift. Which means we have to figure out what to do with those features once they fall off the edge of the plate).

[1] That's not 100% true, a plate border can move a bit. It happens when two plates are moving in the same direction and happen to move at the same time. Rather than having a constructive or destructive edge they move together, in which case I will move the borders.

Pix
08-29-2008, 03:06 PM
I added back in the neighbor calculation routines that I had removed before. I found that when I was doing tectonic plate assignment, border flagging, and wind assignment stuff, I was constantly having to find adjacent points. That is easy to do with our routine using lat/long pairs, distance, and bearing, but it is a lot of trig every time you run that routine, and when you have to go through the entire map (400,000+ points) and each point needs 8 adjacent point calculations, it was slowing things down. So instead I put back in the neighbors, calcuated it one time, and then just used those calculated points whenever I needed an adjacent point.


Lookup tables FTW!

RonHiler
08-29-2008, 04:20 PM
Lookup tables FTW!

Aye :)

I think I may cluster the hotspots a bit more by dropping their max distance from the parent point. They're a tad too spread out, I think.

Strike
08-30-2008, 01:04 PM
Also, re: hotspots -- are they expected to be so close to plate boundaries?

I'm only used to them being talked about in the middle of plates; I'm not sure if that's because they're only interesting then, or if that's where they are expected to be.

At least one of the green plates had hotspots nearer the plate boundary than I'd expect, but if you're finre with it then I'll shut up. It's not like you're trying to build fullscale simulation after all ;)


The rest of it looks good, glad to see it finally working :) :)

RonHiler
08-30-2008, 02:29 PM
Hmmm, I don't know of anything that prevents them from being near border areas. But then, I hardly know everything there is to know about hotspots, either :)

RonHiler
09-08-2008, 09:10 AM
Hey guys,

Sorry for the quietness. I have to admit, I took a bit of time off. For two reasons.

One was we hit one of those wierd areas where I just finished something incredibly complex and draining (namely, the distance/bearing routines, which took several iterations to finally get right), and found I didn't have the motivation to move on. I've talked about this effect before. I think it has something to do with the fact that you got something really hard to work right, and you don't want to break it by moving on to the next thing. But of course, to do the next thing you MUST break the program, hehe. There's probably a name for it. Anyway, it takes a bit of effort to get over that hump, and I had to build up for it :)

And the second reason was I wanted to think about the next step for a bit, which is the whole "Move plates" step (number 23 out of 24 in our current milestone). Now, this is not nearly as trivial as you might think. Ultimatley, every point on the map has to have *exactly* one corresponding data set. But with the way plates move around, it's possible (in fact, it's by design) that some points may end up with two or more data sets that want to end up at the same place, or some places were NO data sets want to be[1].

The trick here is to get everyone moved, and then resolve these conflicts. And of course, we have to do this without going over the map more than once (as we're in the iteration stage).

When multiple data points want to go to a single map spot, what you have is a converging border. What happens depends on the relative densities between the two (or more) converging plates. We will either destory one of the datasets (in the case of differing densities) or fold the conflicting points back on each other (in the case of equal densities).

When we have a point on the map that has no corresponding dataset, what you have is a divergent border. In such a case, we'll add a new dataset basing it's elevation on the points that are around it (making it slightly lower).

I'm part way through this routine, and so far it is working well. I changed the map drawer to draw colors based on elevation, so now we have oceans and landmasses. Pretty cool. As I haven't yet put in erosion or really any form of elevation changing, there are abrupt borders between the plates. Much of Milestone 6 will be all about mitigating abrupt cliff edges :)

I think Milestone 6 will actually be relatively easy in comparison to this one. For one thing, it has half the number of steps. For another, the majority of it is all about moving around water and topsoil and causing erosion and so on. Nothing complicated in terms of algorithms like M5 has.

[1] Do you guys know what I mean by "data sets"? It's the data associated with a point on the map. Top soil, elevation, biomass, and so on. I have divorced this data from each point on the map so that it can easily be moved around (in fact, it won't move at all, the drawing routines use "references" which get updated, which makes the whole thing a bit faster than if we were constantly moving around data).

Strike
09-08-2008, 04:20 PM
And the second reason was I wanted to think about the next step for a bit, which is the whole "Move plates" step (number 23 out of 24 in our current milestone). Now, this is not nearly as trivial as you might think. Ultimatley, every point on the map has to have *exactly* one corresponding data set. But with the way plates move around, it's possible (in fact, it's by design) that some points may end up with two or more data sets that want to end up at the same place, or some places were NO data sets want to be[1].


I was actually wondering about this a little, earlier today. Subduction zones and... whatever the other things are called. And also the "earthquake zones" on the sliding-sideways edges. I'm glad you've addressed it already as I didn't come up with anything amazing, myself ;)
[Wow, my geology jargon is rusty!]



I think Milestone 6 will actually be relatively easy in comparison to this one. For one thing, it has half the number of steps. For another, the majority of it is all about moving around water and topsoil and causing erosion and so on. Nothing complicated in terms of algorithms like M5 has.


:: grins ::
So, of course, I look forward to seeing what wonderful new problem you find in "moving [stuff] around". :p
(Sorry, had to say it! :D )

RonHiler
09-09-2008, 07:43 AM
I was actually wondering about this a little, earlier today. Subduction zones and... whatever the other things are called. And also the "earthquake zones" on the sliding-sideways edges. I'm glad you've addressed it already as I didn't come up with anything amazing, myself ;)
[Wow, my geology jargon is rusty!]

Hehe. If you need a few reminders, I've found this page to be of use during my research:

http://en.wikipedia.org/wiki/Plate_tectonics

Wiki knows everything :) I used a few others, but this was my go-to page.


So, of course, I look forward to seeing what wonderful new problem you find in "moving [stuff] around". :p
(Sorry, had to say it! :D )

Yeah, heh. I do believe, though, that I stacked all the *really* difficult stuff into M5. The initial idea was to split the work of world-building into two milestones, but somehow M5 ended up with the lion's-share of the hard stuff.

M6 will have a lot of trial and error, I think. I won't know going into it exactly how much bedrock-topsoil conversion there should be due to running water, or how much biomass to add/subtract due to various conditions, and so on. It'll be a lot of tweaking back and forth until things look right.

If we get into any trouble in M6, it will probably be in the last third of the milestone (steps 8-12). Terrain assignment hasn't been defined yet (I'll try to do as much of that as I can during the DD phase before we start coding). Resources and Player starting points are going to be dependent on surrounding conditions and distances from each other, so there is a bit of algorithmic work to do there, but nothing I'm *too* worried about. Steps 11 and 12 are file stuff, and that actually is my biggest concern. If we get bogged down at all, I'm guessing that's where it's going to happen.

RonHiler
09-15-2008, 09:43 AM
Hey guys, just a quick update.

I did put in the movement routines last week. I switched back over to a tectonic plate display and watched the plates move, and it was pretty dang cool! I'm totally happy with how the plates are shifting around. It's kind of fun to watch, hehe (yeah, I'm easily amused :) ).

Now, this is without any conflict resolution (by which, I mean points that either have too many data references or don't have any data references). I then put in the routines to index those conflict points as the loop was going over the last week.

The idea here is to try to keep from running through the map point more than once per iteration.

However, in doing so, things slowed WAY WAY down. All that checking the points and adding them to an orphan or multi-parent index list, and then taking them back off again if they self resolve during the loop takes up a lot of time. We went from running through each iteration in 5-10 seconds (without the conflict indexing) to taking up to a minute per iteration, which is totally unacceptable.

I think I might be trying to be too clever for my own good.

As much as I hate to do it, I think we may be better off going through the map twice per iteration. The second time will just check for conflicts and resolve them. That way we can directly check the reference point and see if it has too many points (or not enough) and lose all the indexing and de-indexing.

I'm going to give it a try and see what happens. The wind assignment routine (which runs through the entire map once) is quick (and it does some calculating), so perhaps it won't be so expensive. In any event, it has to be less expensive than what I tried so far :) We'll see how it goes...

RonHiler
09-24-2008, 07:23 AM
Okay, it's been about a week, so it's that time again :)

Things are going along pretty well. I was actually hoping there would be a release this week, but as it's already wednesday, and I'm going to be on a plane tonight (which means I lose the entire day and part of tomorrow), it's most likely not going to happen. But we are that close. Next week is looking pretty good right now. No promises, of course :)

I put a timer on the iteration routine and had it average over a number of iterations. This is opposed to me watching the second hand of the clock as it was running and trying to estimate times. As it turns out, the more iterations go through, the faster the routine runs. I don't really know why that ought to be the case. Vectors would cause that if they had to relocate (until they hit the size where they are big enough), but I'm pre-reserving the space for the vectors, so they shouldn't be causing any slowness in the first set of iterations. I don't know why this effect is happening. I do have a couple of Int vectors that hit about 2000 entries per loop that I'm not pre-reserving space for, but even if they are relocating several times, it would really only be during the first loop (as they stay right around that point throughout). I'll keep messing around with it, just because it bugs me, but it's not all that big of a deal.

What else?

Oh, you guys might know that I have a class called WorldBuilderPointClass. This class is almost a glorified structure (it does have a couple of routines in it, but not many). It's job, mainly, is to hold data on each individual point on the world. There is another sister class called WorldBuilderClass, and that's the workhorse. It keeps a vector of the first class consisting of some 400,000 points.

WorldBuilderPointClass is actually serving double duty. On the one hand, each one of these corresponds to one point on the map. On the other hand, each one also corresponds to one set of data (elevation, tectonic plate index, and so on). The two are entirely seperate things.

You might ask why not use two different sets of classes, then? It's a memory consideration. Having 400,000 points is already expensive. Having 2x400,000 points starts getting ridiculous (and yeah, I know it doesn't really *double* the memory requirement, not even close, but still, I don't want to increase the memory hit for the world builder any more than I already have to, at this point, it's about maxed out).

Of course, the two functions have to be connected, and they are connected through two variables in the WorldBuilderPointClass called DataReferencePointFrom and DataReferencePointTo.

DataReferencePointFrom is from the perspective of the map point. You know a particular point on the map and you go to this variable (which is an int) to get the index of the point that carries its data. So for instance, if you want to draw point 126 to the screen. You know where to draw this on the screen, because point 126 has it's screen coordinates in the class (WorldBuilderPoint[126].MapCoordX and MapCoordY). You go to WorldBuilderPoint[126].DataReferencePointFrom and grab that value. Suppose it is 1456. You then get the data you need to draw the point from that value, e.g. WorldBuilderPoint[1456].Elevation. It turns out that DataReferencePointFrom needs to be a vector of int values, since during the process of moving around plates, there could be more than one data point trying to fit into a single map point (this is then handled during the conflict resolution phase so that ultimately, by the end of the iteration, every single point has a exactly one DataReferencePointFrom value, but until we get there, we need to keep track of every point that *wants* to come to this map point).

The opposite of this is the value DataReferencePointTo. This is from the perspective of the data. You know you want to use the data from some point, where on the map does it get drawn? This value will tell you. So as per the case above, the WorldBuilderPoint[1456].DataReferencePointTo variable will hold 126. This is an int value (not a vector of ints). There is always 1 map-point per data-point (although sometimes it can drop to 0 when we destroy a point during conflict resolution, it always eventually goes back up to 1 by the end of the iteration).

Basically what these are are double linked lists.

So why do I tell you all this? Because it leads to some tricky indirection. For instance, when updating the tectonic borders, I need to find the neighbors of a particular data point in order to set them as border values. This is the routine I used (and it's not even done yet, I have to do a bit more bounds checking before it's finished):

void WorldBuilderClass::SetTectonicBorderCluster(int DataPoint)
{
int MapPoint;

MapPoint = WorldBuilderPoint[DataPoint].DataReferencePointTo;
WorldBuilderPoint[DataPoint].TectonicPlateBorder = true;
for (unsigned int i=0; i<8; i++)
{
if (WorldBuilderPoint[WorldBuilderPoint[MapPoint].NeighborPoint[i]].DataReferencePointFrom.size() == 1)
WorldBuilderPoint[WorldBuilderPoint[WorldBuilderPoint[MapPoint].NeighborPoint[i]].DataReferencePointFrom[0]].TectonicPlateBorder = true;
}
}

pretty messy, huh? It's easy to make a mistake and difficult to figure it out. I'm probably going to break this up into more easily digestable bits. That will slow the routine down, but the optimizer will fix that, so that part doesn't worry me.

Speaking of speed, I am using a particular seed for the routines to remove the random element (so I can better gauge the time values). At the moment, after 10 iterations (using the debug build, so no compiler optimizations), the routine runs in 17.4 seconds/iteration on the slowest system I could find. On the laptop, it's at 12.9 seconds/iteration. I haven't yet tested it on my good computer (I just put in the timer, and I haven't been home yet, that is what the plane is for tonight, heh). So far not too bad. Of couse, that's subject to change, especially since I'm still messing around with borders.

So there's your "quick" update, hehe.

Pix
09-25-2008, 06:56 AM
zomg. you must be able to do something with templates or something to hide a little of that.

RonHiler
09-25-2008, 08:12 AM
Oh, don't worry Pix, that's just a first pass. You know how I am about readability :)

RonHiler
10-01-2008, 08:24 AM
Hey guys,

I still think we are looking good for a release this week, albiet the end of the week. This weekend is a pretty good bet, presuming nothing goes wrong.

Things are going along swimmingly. I'm about done resolving conflicts where there are multiple data points trying to go to the same map point, which is the harder of the two conflict types to resolve.

The ONE thing that may flummox me is when we reach the resolution of the map points that have no data points. At that stage, what SHOULD happen is that we have an equal number of map points with no data points to data points with no map points.

The former are created by the initial plate movement routines. We generally end up with about 2000 of them after any given iteration. The latter are created during resolution of the multiple data points trying to get to one map point. Ultimately, we always end up with a single data point/map point, with all the other contenders for the map point being destroyed (i.e. they become data points that have no corresponding map point).

What that means is you have an area on the map where two plates have moved apart, creating a hole. There is no data point for that hole, so we take a data point that was previously destroyed (by subduction generally), reset it's data, and put it in that hole.

Those two numbers HAVE to be equal. If they are not, something is wrong :)

Quick note: I ran a test with my slowest computer (which is very old, probably slower than any computer you guys would have). In debug build, 19.5 seconds/iteration after 10 iterations. In release build, 11.5 seconds/iteration after 10 iterations (using the same random number seed).

This is without the conflict resolution routines running, so those are not final numbers. Still, I'm happy with that. So far so good.

So anyway, unless I come back saying things will be delayed, we should be putting this milestone behind us in the next few days :D

RonHiler
10-01-2008, 12:29 PM
Hmmm, allow me to clarify, since there seems to be some confusion.

I know some of you already know this, but to others it may not be quite so clear what is going on here.

Nothing I am doing in Milestone 5 will affect gameplay, other than you will have a world to play on (which, ultimately, is the goal of M5/M6).

So when I say "11.5 seconds/iteration", that DOES NOT mean it will take 12 seconds to draw each frame while you are playing the game. When you are playing, the game should be fast and responsive, with very little wait time (there may be an occassional hitch here and there while the game "builds" textures, but I'll be doing my best to keep that to a minimum).

The times I am talking about are for *world building*. When you create a new game, and are going to be the host, you need to collect from your players their race files, then you build a world for them to play on. The computer will handle this for you, of course, you will just need to plug in a few parameters.

This process will take a bit of time. How much time is still up in the air, and I'm doing my best to keep it managable. But it's going to be a situation where you start up the builder and then go grab a cup of coffee or something. It'll take at least a few minutes to get a believable world put together.

Once the world is built, you will be playing on it for some time (if you are playing a PBEM game, this could be months!). And of course, if you are just being a player (not the host), you don't have to go through it at all, your host will do it for you and you'll get a world to play on (so one person has to do the world building for each game, which could include as many as 20 people (or less)).

So it's not like this is a process you will have to go through a lot.

I'm not a big fan of the amount of time this process takes. If I had my way, we would build a world in 5 seconds. But there's too much data flowing around to allow for that. Getting together a good looking planet is no small task, and I'm afraid given the scale we're working with it's going to take a few minutes.

Anyway, the bottom line is you don't have to worry about the times with regards to actually playing the game. When you are playing, things should be pretty fast.

Innocence
10-01-2008, 11:02 PM
This process will take a bit of time. How much time is still up in the air, and I'm doing my best to keep it managable.Surely optimizing world build time is a task for a much later milestone. Don't get too hung up on getting it perfect right away - being a perfectionist myself I know how easy it is to pour endless hours into something that actually provides very little value here and now, and which you might even redo completely before the game's done... in six months :)

(yes I'm still alive :rolleyes:)

RonHiler
10-02-2008, 07:40 AM
Hey Jorn, welcome back! :)

The answer to your question is both yes and no.

These milestones are meant to encompass self-contained portions of the program. The idea being that once a milestone is complete, there will be no need to go back to that particular portion of the code ever again, it's done.

In reality of course, that's nonsense. There may be bugs brought to light during testing that forces me to return to old code. Or I may run across something in another milestone that triggers a lightbulb that says "hey, that would work great in the world building code". Or I may deliberately leave parts of it unfinished pending gameplay testing for balance reasons.

But for the most part, once I finish this, I want it to be complete. It's pretty difficult to remember every aspect of your code even when you are working on it. Once you leave a section for something else, that becomes orders of magnitude harder. Even with my insistance on highly readable code, it's a pretty tough thing to do to try to go back to old code and fix/change/optimize something. I feel like it's always best to try to do it while you are there.

All that being said, I have no doubt that I will probably return to this code in the future to try to shave a bit of time off the routines. There is something to be said about having a fresh pair of eyes look at the code (even if it's just the same eyes looking later).

A good example of all this is the movie player from Milestone 1. I still have a gut feeling there is something wrong in that code. Those are highly complex routines (hooking Direct3D into DirectPlay is surprisingly difficult, and involves all sorts of multithreading and customized modules). It took me a long time to get that working, and I'm going to have to dig through it all again at some point. So even though it's "done" and theoretically I should never have to look at it again, I'm eventually going to have to.

Innocence
10-02-2008, 08:25 AM
Hey Jorn, welcome back! :)Oh I'm here reading a bit from time to time, although it's been a while since I've written anything :)

The idea being that once a milestone is complete, there will be no need to go back to that particular portion of the code ever again, it's done.
In reality of course, that's nonsenseLOL, that line of writing reminds me of the very last Blackadder WWI episode:

Captain Blackadder: You see, Baldrick, in order to prevent war in Europe, two superblocs developed: us, the French and the Russians on one side, and the Germans and Austro-Hungary on the other. The idea was to have two vast opposing armies, each acting as the other's deterrent. That way there could never be a war.
Private Baldrick: But, this is a sort of a war, isn't it, sir?
Captain Blackadder: Yes, that's right. You see, there was a tiny flaw in the plan.
Private Baldrick: What was that, sir?
Captain Blackadder: It was bollocks.


I didn't know large-scale programming was done that way, largely because I'm not a programmer :) I write scripts for Windows automation and such, nothing as large as actual programs

"NOBODY expects the Spanish Inquisition!Hehe yes, "Trouble at'mill!"

RonHiler
10-02-2008, 09:53 AM
Heh, yeah, that's the beauty of OOP programming. Everything, if coded properly, is it's own self contained unit with very specific communication routines to the outside world (i.e. other units).

So I just now finished the last of the routines to handle multiple data points running into the same map point (with all the associated point destructions and elevation changes).

Here is what I got from the debug output (for the first iteration)



Debug Output: Iteration: 0, Average Time Passed: 28.2669, Points Moved: 158318, Num NoRef Points: 2097, Num MultiRef Points: 0, Num Data Points No Map Point: 2097 Process MDestiny.exe (3152)


Here's the important bits:

Num NoRef Points: 2097

and....wait for it......

Num Data Points No Map Point: 2097

Whoohoooo! Snoopy victory dance!

It was critically important that those numbers be the same after taking care of all the multi-reference points (which are now at 0). If they hadn't been the same, I would have had NO idea how to fix it, hehe.

So that's it. That was the last of the scary bits. Now it's just a matter of plugging in the data points with no map point into the map points with no data points and resetting the data points' data values, and we should be good.

That should give us a lock for this weekend, as far as I can tell. There's nothing else I can think of that might delay things. I have to take care of the above issue, and then make the volcanos go off. But at this point that's all trivial.

This horrendous milestone that has just kicked my ass is finallly coming to an end :)

RonHiler
10-04-2008, 03:27 PM
Update:

I've been working all day on the game. Some parts have gone well, others not so much. I added a radiobutton to allow you to select plate or elevation views of the map, the routines to select the number of iterations is done, and about a dozen other minor things, all of which fall under the catagory of "cleanup before release".

Everything is finished excpet two things. One is volcanoes and the resulting spreading around of elevation and topsoil. I expect that to be fairly trivial.

The other is a particularly tenacious bug that is causing me no end of grief. I've killed it at least twice today, and yet even after satisfying myself it was gone (and ripping down all the debugging code), it keeps coming back after a while. It's actually quite annoying. It has to do with points on the map not appearing where they ought to be. I have a feeling the linked lists are not staying synched. I'm going to put in some debugging routines to test them after each iteration to make sure the points are where they are supposed to be.

Anyway, I'm done for today. I'm pretty well burned out right now, so I'll pick back up on it tomorrow.

So the deal is this. It's possible I will find and kill this last bug in a half an hour tomorrow. If so (or even if it takes a few hours), we should be good for a release. If it takes me all day (or longer) to finallly track this one down, well, then we won't make it. It all pretty much hinges on this last bug.

RonHiler
10-05-2008, 11:47 AM
Well gang, bad news, I'm afraid.

Not gonna happen today.

The issue is this: You cannot make changes to the world in an iteration, and have those changes affect other changes downstream of the iteration.

For example, if I change the elevation of point 25 from 0 to -50, and then later on change the elevation of point 30 based on the points around it (which does happen), and point 25 happens to be one of those points, then you need to use the original value of 0 for point 25 rather than the new value of -50. Otherwise you are skewing the value of point 30, which in turn could skew the values of other points downstream.

When you get to the NEXT iteration, then the new value at point 25 becomes valid for changing the map, but it can't be valid for the purposes of changing the map in the same iteration where it was changed.

That's just one example (elevation). There are others, and ultimately there will be even more as we get into M6. What you really need is a snapshot of the world before any changes are made, and base the changes on that snapshot. But you can't do it by copying the data, because that's 400,000 points worth of data.

Anyway, that's what is happening. Since the iteration goes from the North pole down to the South pole, by the time you hit the south pole points, the data was so skewed it became nonsense. Now, I wasn't totally unaware of this effect when I started the coding, and I took steps to prevent it. But they aren't working real well.

The bottom line is I'm going to have to retool the routines a bit in order to record changes that *need* to happen (and then apply them at the end of the iteration), rather than apply the changes and try to work around them while in the iteration.

Now, that's not difficult at all. But it's not trivial either. It'll take me a couple of days or so to set up, and then a bit more time to apply the code to it.

Sorry about the delay. This Milestone is going to be a bear right down to the bitter end :)

Pix
10-06-2008, 07:40 AM
Do you actually need a data set that large? Could you maybe cut the number of points and then interpolate?

I have no idea how much effort it would be to do, but an interesting idea just occurred to me: instead of mapping so many points out, I wonder if you could map paths describing the boundaries of climate zones and/or countours.

Pix
10-06-2008, 07:47 AM
You know, the cheesy, low-tech way of making the system more responsive during iterations is to call ::Yield() periodically.

RonHiler
10-06-2008, 08:26 AM
Do you actually need a data set that large? Could you maybe cut the number of points and then interpolate?
We're already going to be interpolating by a factor of 8 (each direction) for the final world map. Too much interpolation will lead to its own set of issues, and I don't want to go any higher than 8x8.


You know, the cheesy, low-tech way of making the system more responsive during iterations is to call ::Yield() periodically.

Huh, I was unaware of that command. I'll check that out, thanks.

Pix
10-06-2008, 09:22 AM
::Yield()

Huh, I was unaware of that command. I'll check that out, thanks.

It's not a panacea; in particular, it can open you up to reentrancy issues. But for something that's destined to be removed anyway...

RonHiler
10-11-2008, 07:30 AM
The M5 release will be either today or tomorrow.

The map is behaiving better, though still not perfect. I think there is still some wierdness going on with the elevations. But we do have a whole second cycle on this system with M6. So as much as I would like to make it perfect right now, I don't want to delay the release any more than I already have.

RonHiler
10-11-2008, 02:52 PM
Milestone 5 has been released.

I've decided to punt the volcanos to M6. I don't want to complicate elevations until I'm more satisfied they are doing what they are supposed to be doing. And there's still some weirdness going on there.

Also, the world map checkbox will automatically check to ON when the process enters the iteration stage. You can, of course, turn it back off again whenever you like.

Let me know if there are any issues. Especially let me know if you find a bug.

Shane Christopher
10-13-2008, 02:52 AM
I'll check it out this afternoon :)

RonHiler
10-21-2008, 07:42 AM
Man, it got quiet here after the release of M5. Is everyone so busy playing the game they don't have time to post anymore? :)

I'll start up an M6 thread soon.

Pix
10-21-2008, 09:08 AM
I'm too busy to have even had a chance to download it yet. Maybe by this weekend...

Strike
10-21-2008, 08:50 PM
I tried it on my Ancient Tech machine and it didn't like me... what are the tech requirements again? :)

I'll also try it on a WinXP machine I just recently got if I get a chance.

RonHiler
10-22-2008, 06:16 AM
I tried it on my Ancient Tech machine and it didn't like me... what are the tech requirements again? :)
Does your AT machine has DirectX 9.0c installed? That's the main requirement ATM. As long as it has that, the game *should* run. Memory would be an issue once you hit the world builder section, but even then, if you run out of memory, the OS would start dumping to the hard drive. So it wouldn't run well, but it would still run.

And as I said in the release notes, I've noticed on slower machines the startup movie has trouble playing. If you get a black screen when you start up, just hit a key to skip it, that would take you to the main menu.

Strike
10-23-2008, 11:54 AM
DirectX 9.0c check.

It says CG32.DLL is missing. (Very missing, in fact, as it can't be found at all on my HD.)

Some quick research implies that it has something to do with CodeGuard, which is something that Borland uses... which is what you're compiling with, rgiht Ron?

So this might just be a compilation-target issue instead of something wrong on my end, for once ;)

RonHiler
10-23-2008, 02:11 PM
DirectX 9.0c check.

It says CG32.DLL is missing. (Very missing, in fact, as it can't be found at all on my HD.)

Some quick research implies that it has something to do with CodeGuard, which is something that Borland uses... which is what you're compiling with, rgiht Ron?

So this might just be a compilation-target issue instead of something wrong on my end, for once ;)

Uh oh. Anyone else have this problem? I'll check the compilation settings. Code Guard is supposed to turn itself off with a release build, but there is a way to override it. I wonder if I accidentally left it on.

I'll check it out, we may have a new release to remove this dependancy.

RonHiler
10-24-2008, 06:44 AM
Alright, I just checked it out. You are correct, Strike, the CG dll is related to CodeGuard, and it got left on even with the release build. So basically no one has been able to run M5. That's depressing.

I'll be more carefull about turning off that dependency in the future. I thought compiling in release mode would do it automatically (and normally it would, but apparently I over-rode that at some point).

I'll put up a new version of M5 without the dependency tonight.

Shane Christopher
10-24-2008, 10:20 AM
Gah.. completely forgot to actually download it. Just shows how college this year is treating me.

Was missing CG32.dll, downloading it now from here:

http://www.nodevice.com/dll/cg32_dll/item3695.html

Got it working, upon map creation it came up with "Codeguard detected errors" This was at the very end after the Indeces were set and it had just reached 100%

Shane Christopher
10-24-2008, 10:39 AM
It seems to be working now this time.

I have it set to show elevation instead of tectonic plates. I also havent played around with the race editor beforehand this time either.

RonHiler
10-24-2008, 01:11 PM
I don't suppose you happened to make a note of the seed value on the one that crashed, did you?

That's a good point, I ought to write that value into the log file. That way it'd be there even if the user doesn't write it down.

RonHiler
10-24-2008, 05:22 PM
A replacement build has been uploaded to the server. Pick it up in the usual place on the download page.

If you are unsure if you are running the newest build, run the game in Windowed Mode and check the title across the top of the window. It should say "Manifest Destiny - Version 0.200.m5.r2".

I'll try to remember to put that across the menu screen so you can see it in fullscreen mode as well, so you don't have to change over to windowed mode to see what version you are running. I'll do that for the M6 release.

Let me know if there are any other issues, gang.

Shane Christopher
10-25-2008, 07:04 AM
No I didn't get the seed number. It was at the end of the first phase. The second time it built perfectly. Assuming it's normal for the map to just disappear afterwards?

Strike
10-26-2008, 03:36 PM
OK, mine is still buggy, but It's Different This Time! ^_^

I get a popup grey window, then it goes to (black) fullscreen mode and fiddles with the resolution or something... then it drops out of fullscreen nicely and I get the following error box:
Unable to create Direct3D Device Direct3DClass::InitD#D(): Invalid call - D3DERR_INVALIDCALL

And then I get this (Win98) error window dump:
MDESTINY caused an invalid page fault in
module MDESTINY.EXE at 017f:0048235f.
Registers:
EAX=00000000 CS=017f EIP=0048235f EFLGS=00010246
EBX=005257c8 SS=0187 ESP=009bfc4c EBP=009bfc60
ECX=01723d08 DS=0187 ESI=00000000 FS=714f
EDX=009bfc90 ES=0187 EDI=0174411c GS=0000
Bytes at CS:EIP:
8b 10 ff 92 f0 00 00 00 8b 0b 51 e8 a1 e1 fa ff
Stack dump:
00000000 0174411c 017428a0 0174411c 009bfc48 009bfcb4 00481cdb 0174411c 00000001 00000500 00000400 00000000 00000016 00000000 00000000 00000320

(I actually get that error three times before it stays gone.)

Log attached. Will reboot later tonight and see if it works better then; I can replicate the bug but now it's not going to fullscreen mode at all.

RonHiler
10-27-2008, 06:17 AM
Okay, thanks Strike, I'll take a look at it. I've glanced at it briefly, and I have a thought, but I want to look over the log a bit more before I get into any details.

You ARE using DirectX9.0c, right?

And did M4 work for you okay? This is a new symptom from M5, yes?

Strike
10-27-2008, 01:34 PM
Um... The last version that I can find is M2 :: embarrassed ::

dxdiag reports version 9.0c (4.09.0000.0904); if there's anything more specific you need me to check let me know.

Tried it again today after a fresh reboot and it didn't switch to fullscreen, still got the error three times before it would go away.

RonHiler
10-28-2008, 07:48 AM
Okay Strike, I've taken a look. Here's the problem:

[2.84658]Unable to Create Direct3D Device Direct3DClass::InitD3D(): Invalid call - D3DERR_INVALIDCALL

Not a ton of help, unfortunately. Stupid "Invalid Call" is by far the most useless D3D error message in existance. But if your device isn't being created, the program will definitely not work, heh. At least we know where the root problem is.

Couple of questions:

[0.251834]Keyboard Device Acquired DirectInputClass::InitDirectInput()
[2.5224]Direct3D Object Created Direct3DClass::Enum()


This may not be relevant, but if there's something in the log I don't understand, it may give us a clue (or it may not). There's over a two second dealy here. I don't see that delay in any of my other log files. Any ideas why that might have happened?

[2.84658]Unable to Create Direct3D Device Direct3DClass::InitD3D(): Invalid call - D3DERR_INVALIDCALL
[267.012]


This is the other one. Right after the failed call, there is almost a five minute delay! Was the program stopped for an error box and you didn't see it for a while perhaps?

You might try to delete your ini file and see what happens (it's in the main directory and is called MDestiny.ini). Don't worry, it'll come back (if the program doesn't find it, it will create a default one for you. I don't even ship one with the published build, so everyone always creates one the first time they run).

So I take it that M2 worked okay for you. If you have the time, it would be useful to know when this issue cropped up. On the download page are all the previous versions. Grab M3 and/or M4 and see if they work or if you get the same problems. If you have a chance.

Your DX version is good, so no worries there.

Strike
10-28-2008, 11:10 AM
OK, deleted the log & ini files & ran it again.
No obvious changes; pasting relevant lines from the new log file:


[0.381006]Keyboard Device Acquired DirectInputClass::InitDirectInput()
[1.05554]Direct3D Object Created Direct3DClass::Enum()

Still almost a second delay there. Need me to run it some more times and get some sort of average from my machine?


[1.51619]Unable to Create Direct3D Device Direct3DClass::InitD3D(): Invalid call - D3DERR_INVALIDCALL
[3.54029]

I probably left the error box up while I was copying the dump from it into my post. This time I guess it took me 2 seconds to realize I was supposed to close the box, and then click on the "close" button. Guess I'm not completely awake right now ;)

I'll check back in later this week with reports on the last couple versions.

RonHiler
10-28-2008, 03:38 PM
Still almost a second delay there. Need me to run it some more times and get some sort of average from my machine?


Nah, upon further review, there is a delay there even on my machine, although not generally as much as that.

[0.270967]Keyboard Device Acquired DirectInputClass::InitDirectInput()
[0.30022]Direct3D Object Created Direct3DClass::Enum()

Which is 0.03 seconds (which is pretty long for a single call, so there is definitely some behind the scenes work going on there). It's probably video card dependent on how long that takes. I'm going to assume it's normal for right now.

Strike
11-02-2008, 01:16 PM
OK, went back and re-tested the other milestones:

M1 gives me a "A required DLL file, cc3260.dll, was not found." error.

M2 and upwards give the same error I posted earlier for M5. Lemme know if you want error logs from any of those.

So maybe it is my machine after all? I've only got 16MB vid-card memory.... (told ya this thing was ancient... the vid-card is the oldest piece of tech in it that still gets used)

RonHiler
11-02-2008, 03:44 PM
I'll take a closer look at your video card cap dump and see what I can find. I'm sure the log files in the older versions are all going to say the same thing.

The bummer about the game crashing is that the logger can't finish out of the log file, which means I can't open it in Word, which is really what it was designed for. It's much easier to read when its got all of its line breaks and is color coded, heh.

16MB might be the issue. I'll look at the code and see what I have in there as far as reserving memory. It could be you are just running out of vid memory. Not sure why it would crash at device creation, though.

Pix
11-03-2008, 07:09 AM
The bummer about the game crashing is that the logger can't finish out of the log file, which means I can't open it in Word, which is really what it was designed for. It's much easier to read when its got all of its line breaks and is color coded, heh.


colored log files? Geez. At any rate, you could try flushing the stream after every write if you don't mind some performance issues. Or write a second process that acts as a log sink; the game process could use IPC to send log messages to the second process. That way it wouldn't die when the game crashes. :)