--- /dev/null
+#define ROADS_C\r
+\r
+#include <fastgraf.h>\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+#include <time.h> /* FOR RANDOM */\r
+#include "roads.h"\r
+#include "tiles.h" /* DUE TO R AND C CHEATS */\r
+#include "fx.h" /* FOR FADING STUFF */\r
+#include "version.h" /* INFO ON THIS VERSION */\r
+#include "keys.h" /* KEY AND SCANCODE DEFINITIONS */\r
+\r
+extern int far *topography; /* BACKGROUND TILE LIST (ARRAY) */\r
+extern int far *terrain; /* FOREGROUND TILE LIST (ARRAY) */\r
+extern int view_x, view_y; /* VIEW AREA (UPPER LEFT CORNER) */\r
+extern int viewpage; /* CURRENTLY VIEWED PAGE */\r
+extern int world_type; /* TENDENCY TO GRASS */\r
+\r
+extern int edgemode; /* BLOCKY GRASS/DIRT OR EDGED? */\r
+extern int animatemode;\r
+extern int frogmode;\r
+extern int frogwatchmode;\r
+\r
+int keyboardmode=0;\r
+\r
+/* PROTOTYPES FOR INTERNAL FUNCTIONS */\r
+void time_test (void);\r
+void cheat (int type);\r
+void toggle_mode (int type);\r
+void make_world (int type);\r
+void view_tile_page (void);\r
+void move_view (void);\r
+int keycheck (void);\r
+void init_all (void);\r
+void gogofrog (void);\r
+\r
+#pragma argsused\r
+void main (int argc, char *argv[])\r
+{\r
+ char quitting_time=0; /* QUIT PROGRAM LOOP */\r
+\r
+ printf (HEADER);\r
+\r
+ if (argc>1)\r
+ {\r
+ printf (KEY_HELP);\r
+ exit (2);\r
+ }\r
+\r
+ printf ("Loading ... [Escape quits] ... [Type ROADS /? for more keys!]\n");\r
+ init_all(); /* INITIALIZE ALL SYSTEMS */\r
+\r
+ while (!quitting_time) /* LOOP FOREVER */\r
+ {\r
+ quitting_time=keycheck(); /* CHECK FOR REGULAR KEYS */\r
+ if (animatemode) animate(); /* PERFORM ALL ANIMATIONS */\r
+ }\r
+\r
+ program_shutdown("Thank you for running ROADS!", 0);\r
+}\r
+\r
+#define TIMETEST_LENGTH 10 /* TIME TEST LENGTH IN SECONDS */\r
+\r
+/*\r
+ *\r
+ * Performs time testing to try and guess a FPS.\r
+ *\r
+ */\r
+void time_test (void)\r
+{\r
+ int x, dir;\r
+ long end_time;\r
+ int frames_shown[2];\r
+\r
+ for (x=0; x<2; x++) /* TEST TWICE, ONCE WITH ANIMATION */\r
+ {\r
+ while (redraw(SCROLL_UL)); /* SCROLL UPPER LEFT TO START */\r
+ fg_music ("L64FAC.AE.B$");\r
+ frames_shown[x]=0; dir=0;\r
+ end_time=TIMETEST_LENGTH*182/10;\r
+ end_time+=fg_getclock();\r
+\r
+ while (fg_getclock()<end_time)\r
+ {\r
+ frames_shown[x]++;\r
+\r
+ switch (dir)\r
+ {\r
+ case 0: if (!redraw (SCROLL_DR )) dir++; break;\r
+ case 1: if (!redraw (SCROLL_UP )) dir++; break;\r
+ case 2: if (!redraw (SCROLL_DL )) dir++; break;\r
+ case 3: if (!redraw (SCROLL_RIGHT)) dir++; break;\r
+ case 4: if (!redraw (SCROLL_UL )) dir++; break;\r
+ case 5: if (!redraw (SCROLL_DOWN )) dir++; break;\r
+ case 6: if (!redraw (SCROLL_UR )) dir++; break;\r
+ case 7: if (!redraw (SCROLL_LEFT )) dir=0; break;\r
+ }\r
+\r
+ if (x==0) animate(); /* ANIMATION ON FIRST TEST ONLY */\r
+ }\r
+ }\r
+\r
+ program_shutdown ("",-1); /* DON'T EXIT YET */\r
+ printf ("%d Frames in %i seconds (%i FPS) with animation\n",\r
+ frames_shown[0], TIMETEST_LENGTH, frames_shown[0]/TIMETEST_LENGTH);\r
+ printf ("%d Frames in %i seconds (%i FPS) without animation\n",\r
+ frames_shown[1], TIMETEST_LENGTH, frames_shown[1]/TIMETEST_LENGTH);\r
+ exit (0);\r
+}\r
+\r
+/*\r
+ *\r
+ * Turns on cheats (fills screen with anims for testing)\r
+ *\r
+ */\r
+void cheat (int type)\r
+{\r
+ register int x;\r
+\r
+ if (type==0)\r
+ {\r
+ fade_out_all();\r
+ for (x=0; x<WORLD_TILES_TOTAL; x++)\r
+ terrain[x]=ANM_FIRE;\r
+ redraw(REFRESH);\r
+ animatewhilefading=0;\r
+ fade_in_all();\r
+ animatewhilefading=1;\r
+ }\r
+\r
+ else if (type==1)\r
+ {\r
+ fade_out_all();\r
+ for (x=0; x<WORLD_TILES_TOTAL; x++)\r
+ if (!isroad(terrain[x])) terrain[x]=ANM_FIRE;\r
+ redraw(REFRESH);\r
+ animatewhilefading=0; /* DON'T ANIMATE IN FADES -- TOO MANY ANIMS! */\r
+ fade_in_all();\r
+ animatewhilefading=1;\r
+ }\r
+}\r
+\r
+/*\r
+ *\r
+ * Toggles modes on and off (animation, edging, etc.)\r
+ *\r
+ */\r
+void toggle_mode (int type)\r
+{\r
+ if (type==0)\r
+ {\r
+ animatemode=!animatemode;\r
+ fg_music ("L64G.AG.A$");\r
+ }\r
+\r
+ else if (type==1)\r
+ {\r
+ edgemode=!edgemode;\r
+ fg_music ("S1L20B..G..F..$");\r
+ if (edgemode)\r
+ {\r
+ add_dirt_edges();\r
+ redraw(REFRESH);\r
+ }\r
+ }\r
+ else if (type==2)\r
+ {\r
+ keyboardmode=!keyboardmode;\r
+ fg_music ("L40BABAGFG.$");\r
+ }\r
+ else if (type==3)\r
+ {\r
+ frogwatchmode=!frogwatchmode;\r
+ fg_music ("O1L30D.ED.A$");\r
+ }\r
+}\r
+\r
+/*\r
+ *\r
+ * Initializes the world, foreground and/or background.\r
+ *\r
+ */\r
+void make_world (int type)\r
+{\r
+ if (type==0)\r
+ {\r
+ fade_out_all();\r
+ init_world();\r
+ redraw(REFRESH);\r
+ fade_in_all();\r
+ }\r
+\r
+ else if (type==1)\r
+ {\r
+ init_background();\r
+ redraw(REFRESH);\r
+ }\r
+\r
+ else if (type==2)\r
+ {\r
+ init_foreground();\r
+ redraw(REFRESH);\r
+ }\r
+}\r
+\r
+/*\r
+ *\r
+ * Shows the contents of the tile page. Hit any key to fade back.\r
+ *\r
+ */\r
+void view_tile_page (void)\r
+{\r
+ char key1, key2;\r
+\r
+ fade_out_all();\r
+ fg_setvpage (TILEPAGE);\r
+ fade_in_all();\r
+\r
+ fg_kbinit(0);\r
+\r
+ do {\r
+ fg_intkey (&key1, &key2);\r
+ animate();\r
+ } while (!(key1+key2)); /* DO LOOP WHILE KEYS ARE NOT HIT */\r
+\r
+ fg_kbinit(1);\r
+\r
+ fade_out_all();\r
+ fg_setvpage (viewpage);\r
+ fade_in_all();\r
+}\r
+\r
+/*\r
+ *\r
+ * Scans for arrow keys and scrolls the view area in reaction to them.\r
+ *\r
+ */\r
+void move_view (void)\r
+{\r
+ static char left=0, right=0, up=0, down=0; /* KEYBOARD VARS */\r
+\r
+ /* CHECK FOR ARROWS BEING PRESSED */\r
+ if (fg_kbtest(SCAN_RIGHT)) right++; else right=0;\r
+ if (fg_kbtest(SCAN_LEFT)) left++; else left=0;\r
+ if (fg_kbtest(SCAN_UP)) up++; else up=0;\r
+ if (fg_kbtest(SCAN_DOWN)) down++; else down=0;\r
+\r
+ /* MAKE SURE COUNTERS DON'T GO TOO HIGH */\r
+ if (right>100) right=100;\r
+ if (left>100) left=100;\r
+ if (up>100) up=100;\r
+ if (down>100) down=100;\r
+\r
+ /* IF "TAP" KEYBOARD MODE IS ON, DON'T MOVE UNTIL KEYS RELEASED */\r
+ if (keyboardmode && (right>1 || left>1 || up>1 || down>1)) return;\r
+\r
+ /* MOVE, CHECKING FOR DIAGONAL MOVEMENT FIRST */\r
+ if (up && right) redraw (SCROLL_UR);\r
+ else if (down && left) redraw (SCROLL_DL);\r
+ else if (up && left) redraw (SCROLL_UL);\r
+ else if (down && right) redraw (SCROLL_DR);\r
+ else if (right) redraw (SCROLL_RIGHT);\r
+ else if (left) redraw (SCROLL_LEFT);\r
+ else if (up) redraw (SCROLL_UP);\r
+ else if (down) redraw (SCROLL_DOWN);\r
+}\r
+\r
+/*\r
+ *\r
+ * Initializes all systems and brings display up.\r
+ *\r
+ */\r
+void init_all (void)\r
+{\r
+ fg_kbinit(1); /* LATCH LOW-LEVEL KEYBOARD HANDLER */\r
+ randomize(); /* ALLOW RANDOMIZATIONS */\r
+\r
+ init_anim(); /* CALL BEFORE WORLD CREATION */\r
+ init_data(); /* CALL BEFORE WORLD CREATION */\r
+ init_world(); /* RANDOMIZE THE WORLD */\r
+ init_video(); /* SET OUR VIDEO MODE ETC. */\r
+\r
+ fade_init(); /* ALLOW FADING */\r
+ fade_blackout(); /* SET ALL COLORS TO BLACK */\r
+ redraw(REFRESH); /* DRAW THE SCREEN (UNSEEN) */\r
+ fade_in_all(); /* FADE IN SCREEN */\r
+}\r
+\r
+/*\r
+ *\r
+ * Keycheck checks all keys and reacts upon them.\r
+ * Returns 1 if a key has indicated the user has requested to quit.\r
+ *\r
+ */\r
+int keycheck (void)\r
+{\r
+ if (fg_kbtest(SCAN_T)) time_test();\r
+ if (fg_kbtest(SCAN_C)) cheat (0);\r
+ if (fg_kbtest(SCAN_R)) cheat (1);\r
+ if (fg_kbtest(SCAN_A)) toggle_mode(0);\r
+ if (fg_kbtest(SCAN_E)) toggle_mode(1);\r
+ if (fg_kbtest(SCAN_K)) toggle_mode(2);\r
+ if (fg_kbtest(SCAN_W)) toggle_mode(3);\r
+ if (fg_kbtest(SCAN_F))\r
+ {\r
+ fg_music ("L50O4BAFDEF.$");\r
+ switch (frogmode)\r
+ {\r
+ case 1: frogmode=2; break;\r
+ case 3: frogmode=0; break;\r
+ }\r
+ }\r
+ if (fg_kbtest(SCAN_G)) /* RERANDOMIZE GRASS/DIRT TENDENCY */\r
+ {\r
+ world_type=random(100);\r
+ fg_music ("S1L20C..B..A..$");\r
+ }\r
+ if (fg_kbtest(SCAN_SPACE)) make_world (0);\r
+ if (fg_kbtest(SCAN_B)) make_world (1);\r
+ if (fg_kbtest(SCAN_ENTER)) make_world (2);\r
+ if (fg_kbtest(SCAN_S)) view_tile_page();\r
+\r
+ move_view(); /* RESPOND TO ARROW KEYS MOVING VIEW */\r
+\r
+ if (fg_kbtest(SCAN_ESC) || fg_kbtest(SCAN_Q)) /* ESCAPE TO QUIT */\r
+ return 1;\r
+\r
+ return 0;\r
+}\r
+\r