backport builds
[dosdemo] / src / screen.c
index 2b551f4..8069ce8 100644 (file)
@@ -4,6 +4,15 @@
 #include <assert.h>
 #include "screen.h"
 #include "demo.h"
+#include "gfxutil.h"
+#include "timer.h"
+
+#define DBG_SCRCHG \
+       do { \
+               dbg_curscr_name = cur->name ? cur->name : "<unknown>"; \
+               dbg_curscr_name_len = strlen(dbg_curscr_name); \
+               dbg_curscr_name_pos = 320 - dbg_curscr_name_len * 9; \
+       } while(0)
 
 struct screen *tunnel_screen(void);
 struct screen *fract_screen(void);
@@ -13,6 +22,13 @@ struct screen *plasma_screen(void);
 struct screen *bump_screen(void);
 struct screen *thunder_screen(void);
 struct screen *metaballs_screen(void);
+struct screen *greets_screen(void);
+struct screen *infcubes_screen(void);
+struct screen *hairball_screen(void);
+
+void start_loadscr(void);
+void end_loadscr(void);
+void loadscr(int n, int count);
 
 #define NUM_SCR 32
 static struct screen *scr[NUM_SCR];
@@ -21,10 +37,15 @@ static int num_screens;
 static struct screen *cur, *prev, *next;
 static long trans_start, trans_dur;
 
+const char *dbg_curscr_name;
+int dbg_curscr_name_len, dbg_curscr_name_pos;
+
 int scr_init(void)
 {
        int i, idx = 0;
 
+       start_loadscr();
+
        if(!(scr[idx++] = tunnel_screen())) {
                return -1;
        }
@@ -49,15 +70,27 @@ int scr_init(void)
        if(!(scr[idx++] = metaballs_screen())) {
                return -1;
        }
+       if(!(scr[idx++] = greets_screen())) {
+               return -1;
+       }
+       if(!(scr[idx++] = infcubes_screen())) {
+               return -1;
+       }
+       if(!(scr[idx++] = hairball_screen())) {
+               return -1;
+       }
        num_screens = idx;
 
        assert(num_screens <= NUM_SCR);
 
        for(i=0; i<num_screens; i++) {
+               loadscr(i, num_screens);
                if(scr[i]->init() == -1) {
                        return -1;
                }
        }
+
+       end_loadscr();
        return 0;
 }
 
@@ -80,13 +113,25 @@ void scr_update(void)
                        prev = 0;
                        cur = next;
                        next = 0;
+
+                       DBG_SCRCHG;
                }
        }
 }
 
+
 void scr_draw(void)
 {
-       if(cur) cur->draw();
+       if(cur) {
+               cur->draw();
+       }
+}
+
+void scr_keypress(int key)
+{
+       if(cur && cur->keypress) {
+               cur->keypress(key);
+       }
 }
 
 struct screen *scr_lookup(const char *name)
@@ -133,6 +178,54 @@ int scr_change(struct screen *s, long trans_time)
 
                cur = s;
                prev = 0;
+
+               DBG_SCRCHG;
        }
        return 0;
 }
+
+/* loading screen */
+extern uint16_t loading_pixels[];
+
+void start_loadscr(void)
+{
+       swap_buffers(loading_pixels);
+}
+
+#define SPLAT_X 288
+#define SPLAT_Y 104
+
+#define FING_X 217
+#define FING_LAST_X    291
+#define FING_Y 151
+#define FING_W 7
+#define FING_H 8
+
+void end_loadscr(void)
+{
+       blitfb(loading_pixels + SPLAT_Y * 320 + SPLAT_X, loading_pixels + 320 * 240, 32, 72, 32);
+       blit_key(loading_pixels + FING_Y * 320 + FING_LAST_X, 320, loading_pixels + 247 * 320 + 64,
+                       FING_W, FING_H, FING_W, 0);
+       swap_buffers(loading_pixels);
+       sleep_msec(300);
+}
+
+void loadscr(int n, int count)
+{
+       int xoffs = 75 * n / (count - 1);
+       static int prev_xoffs;
+       uint16_t *sptr, *dptr;
+
+       sptr = loading_pixels + 247 * 320 + 64;
+       dptr = loading_pixels + FING_Y * 320 + FING_X + prev_xoffs;
+
+       while(prev_xoffs < xoffs) {
+               blit_key(dptr, 320, sptr, FING_W, FING_H, FING_W, 0);
+               dptr++;
+               prev_xoffs++;
+       }
+
+       swap_buffers(loading_pixels);
+
+       /*sleep_msec(200);*/
+}