]> 4ch.mooo.com Git - 16.git/blob - 16/roads/TILEIO.C
I found a thing
[16.git] / 16 / roads / TILEIO.C
1 #define TILEIO_C\r
2 \r
3 #include <fastgraf.h>\r
4 #include "roads.h"\r
5 #include "tiles.h" /* NEEDS ACCESS BECAUSE OF ANIMS */\r
6 \r
7 extern int far *topography;      /* BACKGROUND TILE LIST (ARRAY) */\r
8 extern int far *terrain;      /* FOREGROUND TILE LIST (ARRAY) */\r
9 extern struct ANIMATION *anim_list[ANIM_LIST_TOTAL];\r
10 \r
11 int view_x=0, view_y=0;        /* VIEW AREA (UPPER LEFT CORNER) */\r
12 int viewpage=0;                /* CURRENTLY VIEWED PAGE */\r
13 \r
14 /*\r
15  *\r
16  * Redraws the screen view area.  Returns 1 on successful scroll.\r
17  *\r
18  */\r
19 int redraw (int draw_type)\r
20 {\r
21     int new_draw_type;\r
22     int pageflip=1;\r
23 \r
24     switch (draw_type)\r
25     {\r
26         case NONFLIP_SCROLL_RIGHT:\r
27             new_draw_type=SCROLL_RIGHT; pageflip=0; break;\r
28         case NONFLIP_SCROLL_LEFT:\r
29             new_draw_type=SCROLL_LEFT; pageflip=0; break;\r
30         case NONFLIP_SCROLL_UP:\r
31             new_draw_type=SCROLL_UP; pageflip=0; break;\r
32         case NONFLIP_SCROLL_DOWN:\r
33             new_draw_type=SCROLL_DOWN; pageflip=0; break;\r
34         case NONFLIP_REFRESH:\r
35             new_draw_type=REFRESH; pageflip=0; break;\r
36         default:\r
37             new_draw_type=draw_type; break;\r
38     }\r
39 \r
40     switch (new_draw_type)\r
41         {\r
42         case REFRESH: /* Full Refresh */\r
43         place_tile_block (0, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
44         break;\r
45 \r
46         case SCROLL_UP:\r
47         if (view_y<=0) return 0; /* DON'T ALLOW TO SCROLL BEYOND WORLD */\r
48         view_y--;\r
49         fg_transfer (0, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
50         place_tile_block (0, 0, VIEW_WIDTH-1, 0);\r
51         break;\r
52 \r
53         case SCROLL_DOWN:\r
54         if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return 0; /* HEY! */\r
55         view_y++;\r
56         fg_transfer (0, SCREEN_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);\r
57         place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
58         break;\r
59 \r
60         case SCROLL_LEFT:\r
61         if (view_x<=0) return 0; /* DON'T ALLOW TO SCROLL BEYOND WORLD */\r
62         view_x--;\r
63         fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, 0, SCREEN_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
64         place_tile_block (0, 0, 0, VIEW_HEIGHT-1);\r
65         break;\r
66 \r
67         case SCROLL_RIGHT:\r
68         if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return 0; /* HEY! */\r
69         view_x++;\r
70         fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
71         place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
72         break;\r
73 \r
74         case SCROLL_UR:\r
75         if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return redraw (SCROLL_UP);\r
76         if (view_y<=0) return redraw(SCROLL_RIGHT);\r
77         view_y--;  view_x++;\r
78         fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
79         place_tile_block (0, 0, VIEW_WIDTH-1, 0);\r
80         place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
81         break;\r
82 \r
83         case SCROLL_DR:\r
84         if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return redraw(SCROLL_DOWN);\r
85         if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return redraw(SCROLL_RIGHT);\r
86         view_y++;  view_x++;\r
87         fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);\r
88         place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
89         place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
90         break;\r
91 \r
92         case SCROLL_DL:\r
93         if (view_x<=0) return redraw (SCROLL_DOWN);\r
94         if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return redraw(SCROLL_LEFT);\r
95         view_y++;  view_x--;\r
96         fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);\r
97         place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
98         place_tile_block (0, 0, 0, VIEW_HEIGHT-1);\r
99         break;\r
100 \r
101         case SCROLL_UL:\r
102         if (view_x<=0) return redraw (SCROLL_UP);\r
103         if (view_y<=0) return redraw (SCROLL_LEFT);\r
104         view_y--;  view_x--;\r
105         fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
106         place_tile_block (0, 0, VIEW_WIDTH-1, 0);\r
107         place_tile_block (0, 0, 0, VIEW_HEIGHT-1);\r
108         break;\r
109     }\r
110 \r
111     if (pageflip)\r
112     {\r
113         viewpage=!viewpage; /* SWAP PAGES */\r
114         fg_setvpage (viewpage);\r
115     }\r
116 \r
117     return 1; /* SUCCESSFUL SCROLL */\r
118 }\r
119 \r
120 /*\r
121  *\r
122  * Redraws a rectangular region of the active (!shown) page with tiles.\r
123  *\r
124  */\r
125 \r
126 void place_tile_block (int x1, int y1, int x2, int y2)\r
127 {\r
128     register int x, y;\r
129     int tile, a;\r
130 \r
131     for (y=view_y+y1; y<=view_y+y2; y++)\r
132     for (x=view_x+x1; x<=view_x+x2; x++)\r
133     {\r
134         tile=terrain[WORLD_TILE(x,y)];\r
135 \r
136             /* DON'T PLACE FOREGROUND IF EMPTY */\r
137         if (tile==EMPTY_TILE)\r
138             pagecopy_tile_op (topography[WORLD_TILE(x,y)],VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);\r
139 \r
140         else\r
141         {\r
142             if (is_anim(tile))\r
143             {\r
144                 a=0;\r
145                 while (anim_list[a]->anm!=tile) a++;\r
146                 tile=anim_list[a]->current;\r
147             }\r
148 \r
149             pagecopy_tile_op (topography[WORLD_TILE(x,y)], VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);\r
150             pagecopy_tile_tr (tile, VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);\r
151         }\r
152     }\r
153 }\r
154 \r
155 /*\r
156  *\r
157  * Updates on the visual page a single world tile.\r
158  *\r
159  */\r
160 void update_tile (int tile)\r
161 {\r
162     register int viewtile;\r
163 \r
164     if (!is_viewable (tile)) return; /* DO NOT UPDATE THE UNSEEN */\r
165 \r
166     viewtile=VIEW_TILE(WORLD_TILE_X(tile)-view_x,WORLD_TILE_Y(tile)-view_y);\r
167 \r
168     if (terrain[tile]==EMPTY_TILE)\r
169         pagecopy_tile_op (topography[tile], viewtile, TILEPAGE, viewpage);\r
170 \r
171     else\r
172     {\r
173         pagecopy_tile_op (topography[tile], MIXING_TILE, TILEPAGE, TILEPAGE);\r
174         pagecopy_tile_tr (terrain[tile], MIXING_TILE, TILEPAGE, TILEPAGE);\r
175         pagecopy_tile_op (MIXING_TILE, viewtile, TILEPAGE, viewpage);\r
176     }\r
177 }\r
178 \r