Complete.Org: Mailing Lists: Archives: freeciv-dev: October 2001:
[Freeciv-Dev] Re: topology patches
Home

[Freeciv-Dev] Re: topology patches

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: jdorje@xxxxxxxxxxxxxxxxxxxxx
Cc: freeciv-dev <freeciv-dev@xxxxxxxxxxx>
Subject: [Freeciv-Dev] Re: topology patches
From: Raimar Falke <hawk@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 29 Oct 2001 10:47:43 +0100
Reply-to: rf13@xxxxxxxxxxxxxxxxxxxxxx

On Sun, Oct 28, 2001 at 06:34:01PM -0500, Jason Dorje Short wrote:
> "Ross W. Wetmore" wrote:
> > 
> > At 04:46 AM 01/10/27 -0400, Jason Dorje Short wrote:
> > >I have the following topology patches prepared or planned.  All of them
> > >are relatively small.
> > >
> > >check_map_pos : this doesn't deal specifically with topologies but it's
> > >the same code that's being affected.  Since it's a pretty
> > >straightforward change and one that we should have in CVS for as much
> > >time as possible before the next release, this should get first billing.
> > >
> > >rand_pos: this creates a rand_pos function in mapgen.c.  It's a small
> > >issue, but it's been argued liberally: what form should rand_pos take?
> > 
> > Drop it ... it is far too restrictive or expensive an interface to use
> > for most cases and its presence will result in bad abuse. When you want
> > this particular limited functionality it is trivial to code.
> 
> This is one such change.  The random position code will fault if used in
> a different topology.
> 
> Really, I'm caring less and less about what form rand_pos takes.  If you
> want it to be topology-dependent, so be it.  But the fact remains that
> code like:
> 
>   x = myrand(map.xsize);
>   y = myrand(map.ysize);
> 
> must be replaced by something like
> 
>   rand_pos(&x, &y);
> 
> and code like
> 
>   x = myrand(map.xsize);
>   y = 1 + myrand(map.ysize-2);
> 
> must be replaced by some sort of similar code.  Options include
> 
>   do {
>     rand_pos(&x, &y);
>   } while(y == 0 || y == map.ysize-1);
> 
> or
> 
>   rand_pos_checked(x, y, y >= 1 && y < map.ysize-1);
> 
> or even the topology-dependent version
> 

>   rand_pos(x, y, 1, map.ysize-2);

I would vote for this. Make it local to mapgen if this is
possible. And provide a generic one.

> At this point, take your pick.  But something like this must be done or
> we cannot move forward with map generation (we can still have alternate
> topologies, it just won't be possible to make random maps for them).
> 
> (Oh, and it's not just random generation that requires this.  There is
> core code that does it too - for instance barbarian generation, nuclear
> winter, and global warming - but they generally take the first form.)
> 
> If I provide that only makes changes of the first form and leave the
> rest of mapgen alone for now, would that be acceptable?
> 
> > >map_iterate: this changes the map iteration loops to use
> > >regular_map_pos_is_normal.  It is currently being held up (I believe) by
> > >several factors: (1) regular_map_pos_is_normal overlaps with rand_pos,
> > >(2) there was some thought of removing print_landarea_map in game.c, (3)
> > >Ross isn't happy with the form of many of the loops.  I'll propose an
> > >"updated" version of this shortly, though.
> > 
> > regular_map_pos_is_normal() is a very confused concept. I think you need
> > to review the topology RFC before adding such things to the code base.
> 
> I only see two options on this front:
> 

> #define whole_map_iterate(x, y)
>   for (y=0; y<=map.ysize; y++)
>     for (x=0; x<=map.xsize; x++)
>       if (regular_map_pos_is_normal(x, y)) {

I'm still for this one.

> or
> 
> #define whole_map_iterate(x, y)
>   for (y=get_map_y0(); y <= get_map_ymax(); y++)
>     for (x=get_map_x0(y); x <= get_map_xmax(y); x++) {
> 
> The second one might be more efficient (depending on how the topology
> functions get_map_[xy][0|max] are implemented), but doesn't allow easy
> handling of non-normal coordinates, will lead to exceptionally obtuse
> code (in the topology functions) for some topologies, and (most
> importantly) restricts usable topologies to only convex ones (I believe
> that is the correct terminology).
> 
> The current code will definitely not work here; it is not
> topology-dependent.  All regular coordinates are not normal (are not
> within N(0, 0)).
> 
> > >mapgen: (not yet proposed) this updates all of mapgen to be
> > >topology-independent.  It uses distance_from_pole,
> > >distance_from_[north|south]_pole, and (possibly) distance_from_edge to
> > >do the map computations.  rand_pos needs to be dealt with first, though.
> > 
> > No. Write a new map_generator if you want to do such things. Leave the
> > current ones alone for the forseeable future except for minor changes
> > to make sure they don't fault if used in various topologies they are
> > checked and registerd to support.
> 
> These are exactly the types of changes I'm talking about.  In addition
> to the rand_pos changes above (which assure that a generated random
> position is normal), the changes I'm talking about replace "y" with
> "distance_from_north_pole()", "map.ysize-1-y" with
> "distance_from_south_pole()", and "map.ysize" by
> "total_polar_distance()".  These changes are not intrusive, and every
> one of them makes mapgen (IMO) more clean and readable.  Without these
> changes, it will again be impossible to do any random map generation for
> general topologies.  

> We definitely do not want to have to write a new
> map generator for each topology when the existing ones will do a
> minimally adequate job of providing a basic one.

Ross was talking about a new generator which takes all the topologies
we are talking about into account. This one would general from the
start. I have no idea how much work it is to change the current ones
compared to the work for the new one.

> > >diff_map_pos: (not yet proposed) this introduces a function,
> > >diff_map_pos (or similar naming) that determines the difference between
> > >two map positions.  It will be necessary for straightest_direction,
> > >dir_ok, is_cardinal_move, [xy]dist, and other GOTO code to be
> > >topology-independent.
> > 
> > These functions currently exist ... use them. Don't proliferate more
> > noise.
> 
> diff_map_pos must replace the current xdist and ydist, and must be used
> as a backend for other similar functions like map_distance,
> real_map_distance, and sq_map_distance.  I see no other viable
> alternative.
> 
> xdist/ydist and these other functions all assume wrapping occurs along
> the X and Y axes.  This is not the case in general; diff_map_pos
> abstracts this problem away behind the topology interface.
> 
> Really, this change is pretty small and straightforward (although I
> thought some of the other changes were, too...:-).  If we bog down on
> other fronts, I'll go ahead and submit this patch (which I've been
> working on and testing), since it's independent of most other changes. 
> I'd rather avoid having too many patches in the queue at once, though
> (there are a fair number already).

I agree with you Jason, that a generic method for this is needed.

> > >misc_topology: (not yet proposed) miscellaneous cleanups may include
> > >moving map_adjust_[xy] into client-only code, removing any remaining
> > >topology-dependent code, etc.
> > 
> > It may not be necessary to remove things. Isolate them as (documented)
> > special cases if they are only used (safely) in special case code. Replace
> > only that which is being used for the general flow path or causes faults.
> 
> Sorry; by "remove" I mean "fix".  The problem here generally isn't
> fixing the code but tracking it down.  Once we're at that stage I'll do
> a serious review and search for remaining topology-dependent code.
> 
> > >At that point, we should have a topology-independent server (well, OK
> > >probably not...it's hard to verify such things...).  We can then move on
> > >to the client.  This will be a bigger job, depending on how much cleanup
> > >we want to do in the process, but at least we can do some testing as we
> > >go along.
> > 
> > Get the basic model right for the server part. Note it really only uses
> > game or map coordinates, and thus is not really that tricky. Accept a
> > limited set of current implementations to back the model interfaces, and
> > don't worry about over generalization below the model interface, i.e. a
> > switch function, or virtual function indirection based on map_type index
> > to handle case specific details should be fine.
> 
> I don't completely understand you here.  What is a "game" coordinate? 
> When you say "current implementations", what are you talking about
> implementing - topologies or core code?
> 
> In general, I'm not too concerned with this step as yet.  I'd like to
> get the code to a much more topology-independent state before working up
> any more patches to provide alternate topologies.  I've already made
> such changes, but the patch is so interwoven with core code changes that
> it is monolithic and not very useful.  (I've been thinking of making a
> local CVS repository to do such changes, and perhaps I will, but that
> doesn't really change things too much since the diffs won't be very
> useful against the real CVS tree.)

        Raimar

-- 
 email: rf13@xxxxxxxxxxxxxxxxx
  reality.sys corrupt. Reboot Universe? (y,n,q)


[Prev in Thread] Current Thread [Next in Thread]