]> 4ch.mooo.com Git - 16.git/blobdiff - 16/roads/ROADS.C
compy4 sync
[16.git] / 16 / roads / ROADS.C
diff --git a/16/roads/ROADS.C b/16/roads/ROADS.C
new file mode 100644 (file)
index 0000000..2d153c8
--- /dev/null
@@ -0,0 +1,330 @@
+#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