I don't want to take anything away from your very calid point about arrays - but on a tangent mention a cuple of techniques I use to overcome the problem with using the 'old' way.

Björnke von Gierke wrote:
I am constantly trying out systems for games, among other things making maps. I have made a couple such test map stacks since spring, and started with 2.9, then switched to the 3.0 beta. For those game maps, I had chosen to use a 2d Cartesian coordinate system with square fields, like a checkers board. Normally I'd start out with a fancy new idea to scroll a map view, or how to speed certain animation things up (As rev is horribly slow with setting more then 100 objects visuals at the same time). So a common map might look like this in data:
...
Where 0 would be ocean, and 1 would be land. The problem of course would arise if I added another map feature, like player token positions, roads, cities, climate zones, whatever. Such an array might then look like this (example is with items, normally i'd use lines):

Array[1,1] = 1, savannah, bottom, village
Array[1,2] = 1, desert, , , settler_1
Array[1,3] = 0,,,, ship_2
...
Array[100,100] = 0

Now to read/populate that I'd normally just do: "put "topleft" into item 3 of Array[x,y]". Normally by now I'd have the idea to add plant cover. I could add it as a fifth item, but that would not be the correct place (should be before roads, after terraintype). The place is important because it's easier to remember there, and because I have no way to identify which item is what otherwise. To enter a new item in between, I'd need to look at all my existing code, and change the items around (with great chances of entering something wrong, or overlooking a number). Now the same with multiple arrays (hierarchical representation):
What I often do for this kind of situation is define a set of constants

constant cLand = 1, cTerrain=2, cRoad=3, cCity=4
Now this is self explanatory, just look at the keys and know what's there. No need to depend on a mental ordered model, and adding other information is dead simple, existing code that does not need that information will just ignore additional keys (if it was done in anticipation of that). So this form of data allows me to change my map much easier, and therefore increase my productive output.
The constants provide some of this advantage, but still requires the set of constants to be replicated in each script (i.e. use script-local rather than handler-local constants). Sometimes (but not often enough :-), I go to the trouble of adding a global variable to hold a version number for the constants, and then check against it (and, oviously, increment the version number each time I make *any* change to the list of constants).

global gMapConstantsVersion
constant cMapConstantVersion=1, cMapLandOrSea=1, cMapTerrain=2, ...

on openCard
if gMapConstantVersion is an integer then #already defined - check it matches ...
     if gMapVersionConstant <> cMapConstantVersion then
         # explode
    end if
 else
     put cMapVersionConstant into gMapVersionConstant
 end if
end openCard

and a similar test in 'enough' places to detect problems.

I really wish we had either 'global constant's, or an 'include file' mechanism to fix this in a better way.


The other technique I use (particularly when I have CSV or TSV files to play with) is to have a list of then item names somewhere (e.g. in the first line of the TSV file), and use those ....

global cOffsets
...

repeat for each item tItem in theLine
  add 1 to tCount
  put tCount into cOffsets[tItem]
end repeat

and then I can do

put village into item cOffsets['town'] of Array[x,y]

Not as tidy - but very helpful if the data format is defined by someone else.

-- Alex.
_______________________________________________
use-revolution mailing list
use-revolution@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to