[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]

    {
    From: Bschor@vms.cis.pitt.edu

    > Now the problem. "Seek(F, I)" will only take ONE integer at a time!!
    > Naturally I need two. I'm trying to run it so that at each virtual
    > "square" a user can define a different message, monster, etc. And the
    > file i'm writing to must be able to define between X & Y, [(1,2) for
    > example], or both of them togeter [E.G. Two steps to the right, two steps
    > forward = (2,2)]. HOW DO I DO THIS???

    If I understand the question correctly, you are asking how to map a
    two-dimensional structure (a 2-D map of your world) into a 1-dimensional
    data structure (a file).  Ah, my ancient Fortran knowledge does come in
    useful ...

    The following works for arrays of any dimension, though you need to
    have the array size fixed.  Suppose you have dimensioned World into R rows,
    C columns, and L layers (I'm doing 3-D, just to show how it can be done).
    To make it all very clear, I'll define the world as either a 3-D or linear
    structure, using the Pascal Variant Record type.
    }

    CONST
     rows = 30;
     columns = 40;
     layers = 5;
     rooms = 6000; { rows * columns * layers }
    TYPE
     rowtype = 1 .. rows;
     columntype = 1 .. columns;
     layertype = 1 .. layers;
     roomnumbertype = 1 .. rooms;
     roomtype = RECORD
     { you define as needed }
     END;
     worldtype = RECORD
     CASE (d3, d1) of
     d3 : (spatial: ARRAY [layertype, rowtype, columntype] OF roomtype);
     d1 : (linear : ARRAY [roomnumbertype] OF roomtype);
     END;
    {
         Basically, you determine an order you wish to store the data.  Suppose
    you say "Start with the first layer, the first row, the first column.
    March across the columns, then move down a row and repeat across the
    columns; when you finish a layer, move down to the next layer and repeat".

         Clearly Layer 1, Row 1, Column C maps to Room C.  Since each row has
    "columns" columns, then the mapping of Layer 1, Row R, Column C is to
    Room (R-1)*columns + C.  The full mapping is --
    }
      FUNCTION roomnumber (layer : layertype; row : rowtype;
       column : columntype) : roomnumbertype;

      BEGIN   { roomnumber }
       roomnumber := column + pred(row)*columns + pred(layer)*columns*rows
      END;

    {     Note you can also map in the other direction:}

      FUNCTION layer (roomnumber : roomnumbertype) : layertype;

      BEGIN   { layer }
       layer := succ (pred(roomnumber) DIV (columns * rows))
      END;

      FUNCTION row (roomnumber : roomnumbertype) : rowtype;

      BEGIN   { row }
       row := succ ((pred(roomnumber) MOD (columns * rows)) DIV columns)
      END;

      FUNCTION column (roomnumber : roomnumbertype) : columntype;

      BEGIN   { column }
       column := succ (pred(roomnumber) MOD columns)
      END;

    {
         Putting it all together, suppose you have a room, "room", with room
    number "roomnumber", that you want to put into the world.
    }
     VAR world : worldtype;
         room : roomtype;
         roomnumber : roomnumbertype;

     WITH world DO
      BEGIN
       spatial[layer(roomnumber), row(roomnumber), column(roomnumber)] := room
      END;
    {
         The above fragment stores a room into the three-dimensional world.
    Of course, if you know the room number (which we do), you can also simply
    }

     WITH world DO linear[roomnumber] := room
    {
         For the original question, note that the "roomnumber" function gives
    you the record number for the Seek procedure (you may need to offset by 1,
    depending on how Seek is implemented ...).
    }

[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]