OSDN Git Service

p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
[proj16/16.git] / src / 0croll.c
1 //#include "modex16.h"\r
2 #include "src/lib/16_vl.h"\r
3 #include "16/src/lib/bitmap.h"\r
4 #include <stdio.h>\r
5 #include <stdlib.h>\r
6 //#include "dos_kb.h"\r
7 #define SCREEN_WIDTH 320\r
8 #define SCREEN_HEIGHT 240\r
9 \r
10 //word far *clock= (word far*) 0x046C; /* 18.2hz clock */\r
11 \r
12 typedef struct {\r
13         bitmap_t *data;\r
14         word tileHeight;\r
15         word tileWidth;\r
16         unsigned int rows;\r
17         unsigned int cols;\r
18         unsigned int tilex,tiley; // tile position on the map\r
19 } otiles_t;\r
20 \r
21 \r
22 typedef struct {\r
23         byte    *data;\r
24         otiles_t *tiles;\r
25         int width;\r
26         int height;\r
27 } omap_t;\r
28 \r
29 \r
30 typedef struct {\r
31         omap_t *map;\r
32         page_t *page;\r
33         int tx; //???? appears to be the tile position on the viewable screen map\r
34         int ty; //???? appears to be the tile position on the viewable screen map\r
35         word dxThresh; //????\r
36         word dyThresh; //????\r
37 } omap_view_t;\r
38 \r
39 struct {\r
40         int tx; //player position on the viewable map\r
41         int ty; //player position on the viewable map\r
42 } player;\r
43 \r
44 \r
45 omap_t allocMap(int w, int h);\r
46 void oinitMap(omap_t *map);\r
47 void omapScrollRight(omap_view_t *mv, byte offset);\r
48 void omapScrollLeft(omap_view_t *mv, byte offest);\r
49 void omapScrollUp(omap_view_t *mv, byte offset);\r
50 void omapScrollDown(omap_view_t *mv, byte offset);\r
51 void omapGoTo(omap_view_t *mv, int tx, int ty);\r
52 void omapDrawTile(otiles_t *t, word i, page_t *page, word x, word y);\r
53 void omapDrawRow(omap_view_t *mv, int tx, int ty, word y);\r
54 void omapDrawCol(omap_view_t *mv, int tx, int ty, word x);\r
55 \r
56 //#define SWAP(a, b) tmp=a; a=b; b=tmp;\r
57 void main() {\r
58         static global_game_variables_t gvar;\r
59 //      int show1=1;\r
60 //      int tx, ty;\r
61 //      int x, y;\r
62         //int ch=0x0;\r
63 //      byte ch;\r
64 //      int q=0;\r
65         page_t screen;//,screen2;\r
66         omap_t map;\r
67         omap_view_t mv;//, mv2;\r
68         omap_view_t *draw;//, *show, *tmp;\r
69         byte *ptr;\r
70 \r
71         //default player position on the viewable map\r
72         player.tx = 10;\r
73         player.ty = 8;\r
74 \r
75 //      setkb(1);\r
76         IN_Startup(&gvar);\r
77         /* create the map */\r
78         map = allocMap(160,120); //20x15 is the resolution of the screen you can make omapS smaller than 20x15 but the null space needs to be drawn properly\r
79         oinitMap(&map);\r
80         mv.map = &map;\r
81 //      mv2.map = &map;\r
82 \r
83         /* draw the tiles */\r
84         ptr = map.data;\r
85         modexEnter(1, 1, &gvar);\r
86         screen = modexDefaultPage(&screen, &gvar);\r
87         screen.width += (TILEWH*2);\r
88         mv.page = &screen;\r
89         omapGoTo(&mv, 16, 16);\r
90 //      screen2=modexNextPage(mv.page);\r
91 //      mv2.page = &screen2;\r
92 //      omapGoTo(&mv2, 16, 16);\r
93 //      modexShowPage(mv.page);\r
94 \r
95         /* set up paging */\r
96 //      show = &mv;\r
97 //      draw = &mv2;\r
98         draw = &mv;\r
99 \r
100         //TODO: set player position data here according to the viewable map screen thingy\r
101 \r
102         while(!gvar.in.inst->Keyboard[sc_Escape]) {\r
103         //TODO: top left corner & bottem right corner of map veiw be set as map edge trigger since omapS are actually square\r
104         //to stop scrolling and have the player position data move to the edge of the screen with respect to the direction\r
105         //when player.tx or player.ty == 0 or player.tx == 20 or player.ty == 15 then stop because that is edge of map and you do not want to walk of the map\r
106         while(!gvar.in.inst->Keyboard[77]){\r
107 //              for(q=0; q<TILEWH; q++) {\r
108                 omapScrollRight(draw, 1);\r
109 //              modexShowPage(draw->page);\r
110 //              omapScrollRight(draw, 1);\r
111 //              SWAP(draw, show);\r
112 //              }\r
113         }\r
114 \r
115         while(!gvar.in.inst->Keyboard[75]){\r
116 //              for(q=0; q<TILEWH; q++) {\r
117                 omapScrollLeft(draw, 1);\r
118 //              modexShowPage(draw->page);\r
119 //              omapScrollLeft(show, 1);\r
120 //              SWAP(draw, show);\r
121 //              }\r
122         }\r
123 \r
124         while(!gvar.in.inst->Keyboard[80]){\r
125 //              for(q=0; q<TILEWH; q++) {\r
126                 omapScrollDown(draw, 1);\r
127 //              modexShowPage(draw->page);\r
128 //              omapScrollDown(show, 1);\r
129 //              SWAP(draw, show);\r
130 //              }\r
131         }\r
132 \r
133         while(!gvar.in.inst->Keyboard[72]){\r
134 //              for(q=0; q<TILEWH; q++) {\r
135                 omapScrollUp(draw, 1);\r
136 //              modexShowPage(draw->page);\r
137 //              omapScrollUp(show, 1);\r
138 //              SWAP(draw, show);\r
139 //              }\r
140         }\r
141 \r
142         //keyp(ch);\r
143         modexShowPage(draw->page);\r
144 \r
145         }\r
146 \r
147         modexLeave();\r
148 \r
149 //      setkb(0);\r
150         IN_Shutdown(&gvar);\r
151 }\r
152 \r
153 \r
154 omap_t\r
155 allocMap(int w, int h) {\r
156         omap_t result;\r
157 \r
158         result.width =w;\r
159         result.height=h;\r
160         result.data = malloc(sizeof(byte) * w * h);\r
161 \r
162         return result;\r
163 }\r
164 \r
165 \r
166 void\r
167 oinitMap(omap_t *map) {\r
168         /* just a place holder to fill out an alternating pattern */\r
169         int x, y;\r
170         int i;\r
171         int tile = 1;\r
172         map->tiles = malloc(sizeof(otiles_t));\r
173 \r
174         /* create the tile set */\r
175         map->tiles->data = malloc(sizeof(bitmap_t));\r
176         map->tiles->data->width = (TILEWH*2);\r
177         map->tiles->data->height= TILEWH;\r
178         map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
179         map->tiles->tileHeight = TILEWH;\r
180         map->tiles->tileWidth =TILEWH;\r
181         map->tiles->rows = 1;\r
182         map->tiles->cols = 2;\r
183 \r
184         i=0;\r
185         for(y=0; y<TILEWH; y++) {\r
186         for(x=0; x<(TILEWH*2); x++) {\r
187                 if(x<TILEWH)\r
188                   map->tiles->data->data[i] = 0x24;\r
189                 else\r
190                   map->tiles->data->data[i] = 0x34;\r
191                 i++;\r
192         }\r
193         }\r
194 \r
195         i=0;\r
196         for(y=0; y<map->height; y++) {\r
197                 for(x=0; x<map->width; x++) {\r
198                         map->data[i] = tile;\r
199                         tile = tile ? 0 : 1;\r
200                         i++;\r
201                 }\r
202                 tile = tile ? 0 : 1;\r
203         }\r
204 }\r
205 \r
206 \r
207 void\r
208 omapScrollRight(omap_view_t *mv, byte offset) {\r
209         word x;//, y;  /* coordinate for drawing */\r
210 \r
211         /* increment the pixel position and update the page */\r
212         mv->page->dx += offset;\r
213 \r
214         /* check to see if this changes the tile */\r
215         if(mv->page->dx >= mv->dxThresh ) {\r
216         /* go forward one tile */\r
217         mv->tx++;\r
218         /* Snap the origin forward */\r
219         mv->page->data += 4;\r
220         mv->page->dx = mv->map->tiles->tileWidth;\r
221 \r
222 \r
223         /* draw the next column */\r
224         x= SCREEN_WIDTH + mv->map->tiles->tileWidth;\r
225                 omapDrawCol(mv, mv->tx + 20 , mv->ty-1, x);\r
226         }\r
227 }\r
228 \r
229 \r
230 void\r
231 omapScrollLeft(omap_view_t *mv, byte offset) {\r
232         //word x, y;  /* coordinate for drawing */\r
233 \r
234         /* increment the pixel position and update the page */\r
235         mv->page->dx -= offset;\r
236 \r
237         /* check to see if this changes the tile */\r
238         if(mv->page->dx == 0) {\r
239         /* go backward one tile */\r
240         mv->tx--;\r
241 \r
242         /* Snap the origin backward */\r
243         mv->page->data -= 4;\r
244         mv->page->dx = mv->map->tiles->tileWidth;\r
245 \r
246         /* draw the next column */\r
247                 omapDrawCol(mv, mv->tx-1, mv->ty-1, 0);\r
248         }\r
249 }\r
250 \r
251 \r
252 void\r
253 omapScrollUp(omap_view_t *mv, byte offset) {\r
254         word /*x,*/ y;  /* coordinate for drawing */\r
255 \r
256         /* increment the pixel position and update the page */\r
257         mv->page->dy -= offset;\r
258 \r
259         /* check to see if this changes the tile */\r
260         if(mv->page->dy == 0 ) {\r
261         /* go down one tile */\r
262         mv->ty--;\r
263         /* Snap the origin downward */\r
264         mv->page->data -= mv->page->width*4;\r
265         mv->page->dy = mv->map->tiles->tileHeight;\r
266 \r
267 \r
268         /* draw the next row */\r
269         y= 0;\r
270                 omapDrawRow(mv, mv->tx-1 , mv->ty-1, y);\r
271         }\r
272 }\r
273 \r
274 \r
275 void\r
276 omapScrollDown(omap_view_t *mv, byte offset) {\r
277         word /*x,*/ y;  /* coordinate for drawing */\r
278 \r
279         /* increment the pixel position and update the page */\r
280         mv->page->dy += offset;\r
281 \r
282         /* check to see if this changes the tile */\r
283         if(mv->page->dy >= mv->dyThresh ) {\r
284         /* go down one tile */\r
285         mv->ty++;\r
286         /* Snap the origin downward */\r
287         mv->page->data += mv->page->width*4;\r
288         mv->page->dy = mv->map->tiles->tileHeight;\r
289 \r
290 \r
291         /* draw the next row */\r
292         y= SCREEN_HEIGHT + mv->map->tiles->tileHeight;\r
293                 omapDrawRow(mv, mv->tx-1 , mv->ty+15, y);\r
294         }\r
295 \r
296 }\r
297 \r
298 \r
299 void\r
300 omapGoTo(omap_view_t *mv, int tx, int ty) {\r
301         int /*px,*/ py;\r
302         unsigned int i;\r
303 \r
304         /* set up the coordinates */\r
305         mv->tx = tx;\r
306         mv->ty = ty;\r
307         mv->page->dx = mv->map->tiles->tileWidth;\r
308         mv->page->dy = mv->map->tiles->tileHeight;\r
309 \r
310         /* set up the thresholds */\r
311         mv->dxThresh = mv->map->tiles->tileWidth * 2;\r
312         mv->dyThresh = mv->map->tiles->tileHeight * 2;\r
313 \r
314         /* draw the tiles */\r
315         modexClearRegion(mv->page, 0, 0, mv->page->width, mv->page->height, 0);\r
316         py=0;\r
317         i=mv->ty * mv->map->width + mv->tx;\r
318         for(ty=mv->ty-1; py < SCREEN_HEIGHT+mv->dyThresh && ty < mv->map->height; ty++, py+=mv->map->tiles->tileHeight) {\r
319                 omapDrawRow(mv, tx-1, ty, py);\r
320         i+=mv->map->width - tx;\r
321         }\r
322 }\r
323 \r
324 \r
325 void\r
326 omapDrawTile(otiles_t *t, word i, page_t *page, word x, word y) {\r
327         word rx;\r
328         word ry;\r
329         rx = (i % t->cols) * t->tileWidth;\r
330         ry = (i / t->cols) * t->tileHeight;\r
331         modexDrawBmpRegion(page, x, y, rx, ry, t->tileWidth, t->tileHeight, t->data);\r
332 }\r
333 \r
334 \r
335 void\r
336 omapDrawRow(omap_view_t *mv, int tx, int ty, word y) {\r
337         word x;\r
338         int i;\r
339 \r
340         /* the position within the map array */\r
341         i=ty * mv->map->width + tx;\r
342         for(x=0; x<SCREEN_WIDTH+mv->dxThresh && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
343         if(i>=0) {\r
344                 /* we are in the map, so copy! */\r
345                 omapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
346         }\r
347         i++; /* next! */\r
348         }\r
349 }\r
350 \r
351 \r
352 void\r
353 omapDrawCol(omap_view_t *mv, int tx, int ty, word x) {\r
354         int y;\r
355         int i;\r
356 \r
357         /* location in the map array */\r
358         i=ty * mv->map->width + tx;\r
359 \r
360         /* We'll copy all of the columns in the screen,\r
361            i + 1 row above and one below */\r
362         for(y=0; y<SCREEN_HEIGHT+mv->dyThresh && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
363         if(i>=0) {\r
364                 /* we are in the map, so copy away! */\r
365                 omapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
366         }\r
367         i += mv->map->width;\r
368         }\r
369 }\r