1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin/Revolution gx demo
3   File:     G2D-testLevel1.c (Test of 2D API by Paul Donnelly, Dec. 1999)
4 
5   Copyright 1998-2006 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12  *---------------------------------------------------------------------------*/
13 
14 #include <stdio.h>
15 #include "G2D-test.h"
16 
17 /*---------------------------------------------------------------------------*
18    Defines
19  *---------------------------------------------------------------------------*/
20 #define WIDTH_LYR1        128
21 #define HALF_WIDTH_LYR1    64
22 #define HMASK_LYR1        127
23 #define HSHIFT_LYR1         7
24 #define HEIGHT_LYR1        64
25 #define HALF_HEIGHT_LYR1   32
26 #define VMASK_LYR1         63
27 #define VSHIFT_LYR1         6
28 
29 #define TILE_WIDTH_LYR1    32
30 #define TILE_HSHIFT_LYR1    5
31 #define TILE_HEIGHT_LYR1   32
32 #define TILE_VSHIFT_LYR1    5
33 
34 #define WIDTH_LYR2          8
35 #define HALF_WIDTH_LYR2     4
36 #define HMASK_LYR2          7
37 #define HSHIFT_LYR2         3
38 #define HEIGHT_LYR2         8
39 #define HALF_HEIGHT_LYR2    4
40 #define VMASK_LYR2          7
41 #define VSHIFT_LYR2         3
42 
43 #define TILE_WIDTH_LYR2   256
44 #define TILE_HSHIFT_LYR2    8
45 #define TILE_HEIGHT_LYR2  128
46 #define TILE_VSHIFT_LYR2    7
47 
48 
49 #define WORLD_WIDTH      (WIDTH_LYR1 * TILE_WIDTH_LYR1)
50 #define WORLD_HEIGHT     (HEIGHT_LYR1 * TILE_HEIGHT_LYR1)
51 
52 #define NUM_TILES_LYR1         95
53 #define NUM_TILES_LYR2          2
54 
55 #define NUM_MATERIALS_LYR1      4
56 #define NUM_MATERIALS_LYR2      2
57 
58 /*---------------------------------------------------------------------------*
59    Global Variables and Data
60  *---------------------------------------------------------------------------*/
61 
62 static unsigned char map1[WIDTH_LYR1 * HEIGHT_LYR1] =
63 {
64     "6aT..............46a..............P.13jTPEIOL0LT..1222222222DC222222222223j......P.4C2222222222222223j1222222222222222DC2222222D"
65     "6aT..............13j..............P.dfiTPK0KHJGSV.decccccccco6bcccccccccchi......P.46bcccccccccccccchidecccccccccccccco6bcccccco"
66     "6aT..............dfi..............XNNNNWPHIG0EIOT...........46a............../0/.P.46a...79n.....................79n..46aMNNNO.4"
67     "6aT.....................................XOEJFK0KT...........46a..79n......../0/0/P.46a...4Bp888;<=++>?()++,-:8888A6m..13jT...P.4"
68     "6aT......................................PL0LHIGT...........46a.7ABqn.......0/0/0P.46a...4C2222yz{uu|}@tuuvwx2222D6a..dfiT...P.4"
69     "6aT......................................PHJGMNNW...........46a.1DC3l......./0/0/P.46a...13gcccccccccc_`cccccccccr3jMNNNNW...P.4"
70     "6aT......................................XNNNW..............46a.dr3si......../0/.P.46a...dfiMNNNNNNNNNNNNNNNNNNO.dfiT........P.4"
71     "6aT.........................EF..............................46a..dfi.URRRRRRRRRRRQ.46aMNNNNNW..................XNNNNW........P.4"
72     "6aT.......................EIGK..............................46a......P.............46aT......................................P.4"
73     "6aT.......................HJIG...........URRRRRV............13j......P.788888888888A6aT.............................URRRRV...P.4"
74     "6aT......................................P.....T............dfi......P.4C222222222223jT.............................P....T...P.4"
75     "6aT......................................P.789nT..........URRRRRRRRRRQ.46bcccccccccchiT....................URV......P.79nT...P.4"
76     "6aT......................................P.456mT..........P............46aMNNNNNNNNNNNW...................UQ0SV.....P.46mT...P.4"
77     "6aT......................................P.456aT..........P.78888888888A6aT.....................URV.......P0/0T.....P.46aT...P.4"
78     "6aT.................................URRRRQ.456aSRRRRV.....P.4C22222222223jT....................UQ0SV......XO0MW.....P.46aT...P.4"
79     "6aT.................................P......456a.....T.....P.46bccccccccchiT....................P0/0T..URV..XNW......P.46aT...P.4"
80     "6aT.................................P.78888A5Bp8889nT.....P.46aMNNNNNNNNNNW....................XO0MW.UQ0SV..........P.46aT...P.4"
81     "6aT...................0.0.0.0.0.....P.4555555555556mT.....P.13jT................................XNW..P0/0T..........P.46aT...P.4"
82     "6aT.................................P.12222D5C22223jT.....P.dfiT.....................................XO0MW..........P.46aT...P.4"
83     "6aT...................0.0.0.0.0.....P.deccco56bccchiT.....P....T......................................XNW...........P.46aT...P.4"
84     "6aT.................................XNNNNO.456aMNNNNW.....P.79nT....................................................P.46aT...P.4"
85     "6aT...................0.0.0.0.0..........P.456aT..........P.46mT.......................................URV..........P.46aT...P.4"
86     "6aT......................................P.456aT..........P.46aT......................................UQ0SV.........P.46aT...P.4"
87     "6aT...................0.0.0.0.0..........P.123jT..........P.46aT......................................P0/0T.........P.46aT...P.4"
88     "6aT......................................P.dehiT..........P.46aT......................................XO0MW.........P.46aT...P.4"
89     "6aT...................0.0.0.0.0..........XNNNNNW..........P.46aT.......................................XNW..........P.46aT...P.4"
90     "6aSRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQ.46aT....................................................P.46aT...P.4"
91     "6a..........................................................46aT.URRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRV..........P.46aT...P.4"
92     "Bp888888888888888888888;<=++>?!n.... ()++,-:8888888888888888A6aT.P0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0T..........P.46aT...P.4"
93     "C2222222222222222222222yz{uu|}$%....#@tuuvwx222222222222222223jT.P/...................................../T..........P.46aT...P.4"
94     "6bcccccccccccccccccccccccccccc_'....d&`cccccccccccccccccccccchiT.P0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0T........URQ.46aT...P.4"
95     "6aMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNW.XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNW........P...46aT...P.4"
96     "3jT...............................................................................................................P.78A6aT...P.1"
97     "fiT...............................................................................................................P.1223jT...P.d"
98     "NNW..............................................................................URRRRV...........................P.dechiT...XNN"
99     ".................................................................................P....T...........................XNNNNNNW......"
100     ".................................................................................P.79nT........................................."
101     ".................................................................................P.46mT........................................."
102     ".................................................................................P.46aT...........URRRV........................."
103     "...............................URRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRV................P.46aT........URRQEJFT...........URRRRRRV......"
104     "RRV............................P................................SRRRRRRRRRRRRRRRRQ.46aT........PEIOL0LT...........P......T...URR"
105     "..T............................P.788888888888888888888888888889n...................46aT........PK0KHJGSV..........P.7889nT...P.."
106     "9nT............................P.1222222222222222222222222222DBp888;<=+>?()+,-:8888A6aT........PHIG0EIOT..........P.12D6mT...P.7"
107     "6mT..............79n...........P.deccccccccccccccccccccccccccoC2222yz{u|}@tuvwx222223jT........XOEJFK0KT..........P.deo6aT...P.4"
108     "6aT...........79n13l79n........XNNNNNNNNNNNNNNNNNNNNNNNNNNNO.46bccccccccc_`ccccccccchiT.........PL0LHIGT..........XNO.46aT...P.4"
109     "6aT........79n13ldfi13l79n.................................P.46aMNNNNNNNNNNNNNNNNNNNNNW.........PHJGMNNW............P.13jT...P.4"
110     "6aT........13ldfi !ndfi13l.................................P.46aT...............................XNNNW...............P.dfiT...P.4"
111     "6aT........dfi !n#$% !ndfi.................................P.46aT...................................................XNNNNW...P.4"
112     "6aT........ !n#$%d&'#$% !n.................................P.46aT............................................................P.4"
113     "6aT.....79n#$%d&'...d&'#$%79n..............................P.46aT............................................................P.4"
114     "6aT.....46md&'...*.....d&'46m..............................P.46aT............................................................P.4"
115     "6aT.....13j !n......... !n13j..............................P.46aT............................................................P.4"
116     "6aT.....dfi#$% !n... !n#$%dfi..............................P.46aT............................................................P.4"
117     "6aT........d&'#$% !n#$%d&'.................................P.13jT.......79n...........EFEFEF.................................P.4"
118     "6aT........79nd&'#$%d&'79n.................................P.dfiT.......46m...........KHGHGK.................................P.4"
119     "6aT........13l79nd&'79n13l..............0.0.0.0.0..........XNNNNW.......46a...........HFEFEG.................................P.4"
120     "6aT........dfi13l79n13ldfi..............................................46a...........0HGHG0.................................P.4"
121     "6aT...........dfi46mdfi.................0...0...0.79n...................46a......................URRRRRRRRRRRRRRV............P.4"
122     "6aSRRRRRRRRRRRRV.46aURRRRRRRRRRRRRRRRRRV..........46m...................46a......................P..............T............P.4"
123     "6a.............T.46aP..................T0.0.0.0.0.46a........ !n........46a......................P.78888889n.79nT............P.4"
124     "Bp88888;<=+>?!nT.46aP. ()+,-:888888889nT..........46a........#$%........46a......................P.4C2222D6m.46mT............P.4"
125     "C222222yz{u|}$%T.46aP.#@tuvwx2222222D6mT..........46a........d&'........46a......URRRRRRRRRRRRRRRQ.46bcccr3j.46aSRRRRRRRRRRRRQ.4"
126     "6bccccccccccc_'T.46aP.d&`ccccccccccco6aT...URRRV..46a...................46a......P.................46a79ndfi.46a...............4"
127     "6aMNNNNNNNNNNNNW.46aXNNNNNNNNNNNNNO.46aTURRQEJFT..4Bp8888888888888888888A6a......P.7888888888888888A6a4Bp8888ABp888888888888888A"
128 };
129 
130 static u16 map2[] =
131 {
132     0,0,0,0,0,0,0,0,
133     0,0,0,0,1,0,0,0,
134     0,0,1,0,0,0,0,0,
135     0,0,0,0,0,0,0,0,
136     0,0,0,0,0,0,1,0,
137     0,0,0,0,0,0,0,0,
138     0,1,0,0,1,0,0,0,
139     0,0,0,0,0,0,0,0,
140 };
141 
142 static G2DTileDesc tileDescLyr1[NUM_TILES_LYR1] =
143 {
144 //  M   S   T   CI    User     // M=Material  (S,T) = Tex Coords  -or-
145 //  M   R   G   B     Data     // CI = Color Index  -or-  (R,G,B) = RGB8 Color
146     1,  8,  8,  0,   0,1,0,0,  // ' ': Solo Tower
147     1,  9,  8,  0,   3,1,0,0,  // '!': Solo Tower
148     0,  0,  0,  0,   0,0,0,0,  // '"':
149     1,  8,  9,  0,   1,1,0,0,  // '#': Solo Tower
150     1,  9,  9,  0,   2,1,0,0,  // '$': Solo Tower
151     1, 10,  9,  0,   0,0,0,0,  // '%': Solo Tower
152     1,  9, 10,  0,   0,0,0,0,  // '&': Solo Tower
153     1, 10, 10,  0,   0,0,0,0,  // ''': Solo Tower
154     1,  1, 11,  0,   0,2,0,0,  // '(': Solo Tower
155     1,  2, 11,  0,   0,2,0,0,  // ')': Raised
156     0,  0,  0,  0,   0,0,0,0,  // '*': Starting position
157     1,  3, 11,  0,   0,2,0,0,  // '+': Raised
158     1,  4, 11,  0,   0,2,0,0,  // ',': Raised
159     1,  5, 11,  0,   0,2,0,0,  // '-': Raised
160     0,  0,  0,  1,   0,0,0,0,  // '.': Basic tile (colored)
161     1,  4,  9,  0,   0,0,0,0,  // '/': Inverse Bump
162     1,  1,  9,  0,   0,0,0,0,  // '0': Bump
163     1,  0,  5,  0,   1,1,0,0,  // '1': Bottom Left
164     1,  1,  5,  0,   2,2,0,0,  // '2': Bottom
165     1,  5,  5,  0,   2,1,0,0,  // '3': Bottom Right
166     1,  0,  4,  0,   1,2,0,0,  // '4': Left
167     1,  4,  4,  2,   0,3,0,0,  // '5': Mid
168     1,  5,  4,  0,   3,2,0,0,  // '6': Right
169     1,  0,  0,  0,   0,1,0,0,  // '7': Top Left
170     1,  1,  0,  0,   0,2,0,0,  // '8': Top
171     1,  5,  0,  0,   3,1,0,0,  // '9': Top Right
172     1,  6, 11,  0,   0,2,0,0,  // ':': Raised
173     1,  7, 11,  0,   0,2,0,0,  // ';': Raised
174     1,  8, 11,  0,   0,2,0,0,  // '<': Raised
175     1,  9, 11,  0,   0,2,0,0,  // '=': Raised
176     1, 10, 11,  0,   0,2,0,0,  // '>': Raised
177     1, 11, 11,  0,   0,2,0,0,  // '?': Raised
178     1,  1, 12,  0,   2,2,0,0,  // '@': Raised
179     1,  3,  4,  0,   0,3,0,0,  // 'A': Inner TL
180     1,  1,  4,  0,   3,3,0,0,  // 'B': Inner TR
181     1,  1,  1,  0,   2,3,0,0,  // 'C': Inner BR
182     1,  4,  1,  0,   1,3,0,0,  // 'D': Inner BL
183 
184     1,  0,  8,  1,   0,0,0,0,  // 'E': Floor Marking
185     1,  2,  8,  0,   0,0,0,0,  // 'F': Floor Marking
186     1,  2, 10,  0,   0,0,0,0,  // 'G': Floor Marking
187     1,  0, 10,  0,   0,0,0,0,  // 'H': Floor Marking
188     1,  1,  8,  0,   0,0,0,0,  // 'I': Floor Marking
189     1,  1, 10,  0,   0,0,0,0,  // 'J': Floor Marking
190     1,  2,  9,  0,   0,0,0,0,  // 'K': Floor Marking
191     1,  0,  9,  0,   0,0,0,0,  // 'L': Floor Marking
192     1,  3,  8,  0,   0,0,0,0,  // 'M': Floor Marking
193     1,  4,  8,  0,   0,0,0,0,  // 'N': Floor Marking
194     1,  5,  8,  0,   0,0,0,0,  // 'O': Floor Marking
195     1,  5,  9,  0,   0,0,0,0,  // 'P': Floor Marking
196     1,  5, 10,  0,   0,0,0,0,  // 'Q': Floor Marking
197     1,  4, 10,  0,   0,0,0,0,  // 'R': Floor Marking
198     1,  3, 10,  0,   0,0,0,0,  // 'S': Floor Marking
199     1,  3,  9,  0,   0,0,0,0,  // 'T': Floor Marking
200     1,  6,  8,  0,   0,0,0,0,  // 'U': Floor Marking
201     1,  7,  8,  0,   0,0,0,0,  // 'V': Floor Marking
202     1,  7,  9,  0,   0,0,0,0,  // 'W': Floor Marking
203     1,  6,  9,  0,   0,0,0,0,  // 'X': Floor Marking
204     0,  0,  0,  0,   0,0,0,0,  // 'Y':
205     0,  0,  0,  0,   0,0,0,0,  // 'Z':
206     0,  0,  0,  0,   0,0,0,0,  // '[':
207     0,  0,  0,  0,   0,0,0,0,  // '\':
208     0,  0,  0,  0,   0,0,0,0,  // ']':
209     0,  0,  0,  0,   0,0,0,0,  // '^':
210     1, 12, 13,  0,   0,0,0,0,  // '_': Shadow
211     1,  2, 13,  0,   0,0,0,0,  // '`': Shadow
212 
213     1,  2,  3,  0,   0,0,0,0,  // 'a': Shadow
214     1,  2,  2,  0,   0,0,0,0,  // 'b': Shadow
215     1,  3,  2,  0,   0,0,0,0,  // 'c': Shadow
216     1,  0,  6,  0,   0,0,0,0,  // 'd': Shadow
217     1,  1,  6,  0,   0,0,0,0,  // 'e': Shadow
218     1,  3,  7,  0,   0,0,0,0,  // 'f': Shadow
219     1,  4,  6,  0,   0,0,0,0,  // 'g': Shadow
220     1,  5,  6,  0,   0,0,0,0,  // 'h': Shadow
221     1,  6,  6,  0,   0,0,0,0,  // 'i': Shadow
222     1,  6,  5,  0,   0,0,0,0,  // 'j': Shadow
223     1,  6,  4,  0,   0,0,0,0,  // 'k': Shadow
224     1,  7,  3,  0,   0,0,0,0,  // 'l': Shadow
225     1,  6,  1,  0,   0,0,0,0,  // 'm': Shadow
226     1,  6,  0,  0,   0,0,0,0,  // 'n': Shadow
227     1,  4,  2,  0,   1,2,0,0,  // 'o': Left Shadow
228     1,  2,  4,  0,   0,2,0,0,  // 'p': Top Shadow
229     1,  6,  2,  0,   3,1,0,0,  // 'q': TR Shadow
230     1,  2,  6,  0,   1,1,0,0,  // 'r': BL Shadow
231     1, 12,  9,  0,   0,0,0,0,  // 's': Shadow
232 
233     1,  2, 12,  0,   2,2,0,0,  // 't': Raised
234     1,  3, 12,  0,   2,2,0,0,  // 'u': Raised
235     1,  4, 12,  0,   2,2,0,0,  // 'v': Raised
236     1,  5, 12,  0,   2,2,0,0,  // 'w': Raised
237     1,  6, 12,  0,   2,2,0,0,  // 'x': Raised
238     1,  7, 12,  0,   2,2,0,0,  // 'y': Raised
239     1,  8, 12,  0,   2,2,0,0,  // 'z': Raised
240     1,  9, 12,  0,   2,2,0,0,  // '{': Raised
241     1, 10, 12,  0,   2,2,0,0,  // '|': Raised
242     1, 11, 12,  0,   2,2,0,0,  // '}': Raised
243     0,  0,  0,  0,   0,0,0,0,  // '~': Raised
244 };
245 
246 const char sUsedTiles[] = " !#$%&'()+,-:;<=>?@tuvwxyz{|}_`./0789632145ABCDEFGHIJKLMNOPQRSTUVWXabcdefghijklmnopqrs";
247 
248 static G2DTileDesc tileDescLyr2[NUM_TILES_LYR2] =
249 {
250 //  M   S   T   CI    User      // M=Material  (S,T) = Tex Coords  -or-
251 //      R   G   B     Data      // CI = Color Index  -or-  (R,G,B) = RGB8 Color
252     0,  0,  0,  0,    0,0,0,0,  // Basic Tile (empty)
253     1,  0,  0,  0,    0,0,0,0,  // Cloud
254 };
255 
256 static GXTexObj toTilesRGB_1;
257 static GXTexObj toCloudRGBA8_1;
258 
259 static u8 ColorRGBA8[] ATTRIBUTE_ALIGN(32) =
260 {//   R    G    B    A
261       0,   0,   0,   0,
262      81, 102, 116, 255,
263     101,   0, 238, 255,
264 };
265 
266 static GXColor CloudTint = { 0xc0, 0xc0, 0xf0, 0xff };
267 
268 static G2DMatDesc matDescLyr1[NUM_MATERIALS_LYR1] =
269 {//                            Material      Texture           Color
270  //Data     Category            Color        Object         Lookup Table
271     0,   G2D_CTG_RGBA_INDEX8,   NULL,         NULL,          ColorRGBA8,
272 //  0,   G2D_CTG_RGB_DIRECT,   NULL,         NULL,          ColorRGBA8,
273     0,   G2D_CTG_TEXTURE,       NULL,       &toTilesRGB_1,     NULL,
274 };
275 
276 static G2DMatDesc matDescLyr2[NUM_MATERIALS_LYR2] =
277 {//                            Material      Texture           Color
278  //Data     Category            Color        Object         Lookup Table
279     0,   G2D_CTG_EMPTY,          NULL,        NULL,             NULL,
280     0,   G2D_CTG_TEXTURE,    &CloudTint,     &toCloudRGBA8_1,   NULL,
281 };
282 
283 G2DLayer lyrBack;       // Background layer
284 G2DLayer lyrFront;      // Foreground layer
285 
286 static void MapInit( void );
287 
288 /*---------------------------------------------------------------------------*
289     Name:           MapInit
290 
291     Description:    Initialize the position of the ship from the map
292 
293     Arguments:      none
294     Returns:        none
295  *---------------------------------------------------------------------------*/
MapInit(void)296 static void MapInit( void )
297 {
298     s32 nI, nJ;
299 
300     G2DInitWorld( WORLD_WIDTH, WORLD_HEIGHT );
301     G2DSetViewport( 0, 0, MY_SCREEN_WIDTH, MY_SCREEN_HEIGHT );
302 
303 #ifdef _EDITOR
304     {
305         /* Load edits from map */
306 
307         FILE *fpMap = fopen("map.c", "r");
308         s32 nC;
309 
310         if ((s32)fpMap > 0)
311         {
312             nC=fgetc(fpMap);
313 
314             for (nJ=0; nJ<HEIGHT_LYR1; nJ++)
315             {
316                 for(; (nC=='"') || (nC<' '); nC=fgetc(fpMap))
317                 {
318                 }
319 
320                 for (nI=0; nI<WIDTH_LYR1; nI++)
321                 {
322                     map1[(nJ<<HSHIFT_LYR1)+nI] = (u8)nC;
323                     nC=fgetc(fpMap);
324                 }
325             }
326             fclose(fpMap);
327         }
328     }
329 #endif // ifdef _EDITOR
330 
331     for (nJ=0; nJ<HEIGHT_LYR1; nJ++)
332     {
333         for (nI=0; nI<WIDTH_LYR1; nI++)
334         {
335             if (map1[(nJ<<HSHIFT_LYR1)+nI] == '*')
336             {
337                 nStartIdx = (nJ<<HSHIFT_LYR1)+nI;
338                 map1[nStartIdx] = '.';
339                 poShip.rPosX = (f32)(nI<<TILE_HSHIFT_LYR1);  // Initial world position (in pixels)
340                 poShip.rPosY = (f32)(nJ<<TILE_VSHIFT_LYR1);
341             }
342             map1[(nJ<<HSHIFT_LYR1)+nI] -= ' ';
343         }
344     }
345 }
346 
InitLevel1(TPLPalettePtr * tpl)347 void InitLevel1( TPLPalettePtr *tpl )
348 {
349     // Set up all textures for bilinear interpolation
350 
351     // Tiles
352     TPLGetGXTexObjFromPalette(*tpl, &toTilesRGB_1, 0);
353     GXInitTexObjLOD( &toTilesRGB_1,
354         GX_LINEAR, GX_LINEAR, 0.0F, 0.0F, 0.0F,
355         GX_FALSE, GX_FALSE, GX_ANISO_1 );
356 
357     // Cloud
358     TPLGetGXTexObjFromPalette(*tpl, &toCloudRGBA8_1, 1);
359     GXInitTexObjLOD( &toCloudRGBA8_1,
360         GX_LINEAR, GX_LINEAR, 0.0F, 0.0F, 0.0F,
361         GX_FALSE, GX_FALSE, GX_ANISO_1 );
362 
363     lyrBack.map            = map1;               // Map of tile indices
364     lyrBack.nHS            = HSHIFT_LYR1;        // Horizontal Shift (Width of layer = 1<<nHS)
365     lyrBack.nVS            = VSHIFT_LYR1;        // Vertical Shift (Height of layer = 1<<nVS)
366     lyrBack.nBPI           = 1;                  // Bytes per Index (1,2)
367     lyrBack.nTileWidth     = TILE_WIDTH_LYR1;    // Width of tiles in pixels (should be >=16, power of 2)
368     lyrBack.nTileHeight    = TILE_HEIGHT_LYR1;   // Height of tiles in pixels (should be >=16, power of 2)
369     lyrBack.bWrap          = TRUE;               // Whether layer wraps or not
370     lyrBack.nNumMaterials  = NUM_MATERIALS_LYR1; // Number of materials
371     lyrBack.tileDesc       = tileDescLyr1;       // Tile Descriptor Table
372     lyrBack.matDesc        = matDescLyr1;        // Material Descriptor Table
373 
374     lyrFront.map           = map2;               // Map of tile indices
375     lyrFront.nHS           = HSHIFT_LYR2;        // Horizontal Shift (Width of layer = 1<<nHS)
376     lyrFront.nVS           = VSHIFT_LYR2;        // Vertical Shift (Height of layer = 1<<nVS)
377     lyrFront.nBPI          = 2;                  // Bytes per Index (1,2)
378     lyrFront.nTileWidth    = TILE_WIDTH_LYR2;    // Width of tiles in pixels (should be >=16, power of 2)
379     lyrFront.nTileHeight   = TILE_HEIGHT_LYR2;   // Height of tiles in pixels (should be >=16, power of 2)
380     lyrFront.bWrap         = TRUE;               // Whether layer wraps or not
381     lyrFront.nNumMaterials = NUM_MATERIALS_LYR2; // Number of materials
382     lyrFront.tileDesc      = tileDescLyr2;       // Tile Descriptor Table
383     lyrFront.matDesc       = matDescLyr2;        // Material Descriptor Table
384 
385     MapInit();
386 }
387