ref: 8ca30e5e3fed97299bda16b4b366bbf6b3541ee9
dir: /fsm.intro.c/
#include <u.h> #include <libc.h> #include <thread.h> #include <draw.h> #include "dat.h" #include "fns.h" enum{ Ttext = 25, Tbg1scroll = 157, Tbg2scroll = 457, TshipΔx = 142, TshipΔy = 333, Tblink = 500, Tshiptravel = 10000, }; static char *curstr, *prompt; static int stri; static int steptc; static int canvmidx, canvmidy, promptΔx; static int scrollΔtc, scroll2Δtc, txtΔt; static void drawbg(void) { scrollpic(&pics[PCspace], tc / scrollΔtc); drawpic(canvmidx, canvmidy, &canvas); } static void drawprompt(void) { Pic *pp; pp = &pics[PCcur]; drawstr(canvmidx + canvas.w - 4 - strlen(prompt) * Vfntw, canvmidy + canvas.h - Vfnth, prompt); drawpic(Vcenterx + promptΔx - pp->w, canvmidy + canvas.h - 2 - pp->h, pp); } static void drawtarget(void) { int x, y; x = canvmidx + tc / TshipΔx; y = Vcentery + 22 - tc / TshipΔy; drawrect(x, y - 1, 10, 1, DShip); drawrect(x + 4, canvmidy, 1, y - canvmidy - 1, DShip); drawrect(x, y + 9, 10, 1, DShip); drawrect(x + 4, y + 9, 1, canvmidy + canvas.h - y - 9, DShip); if(x - 1 > canvmidx) drawrect(x - 1, y, 1, 10, DShip); drawrect(canvmidx, y + 4, x - 1 - canvmidx, 1, DShip); drawrect(x + 9, y, 1, 9, DShip); drawrect(x + 9, y + 4, canvmidx + canvas.w - x - 9, 1, DShip); } static void drawship(void) { drawpic(canvmidx + tc / TshipΔx, Vh / 2 + 22 - tc / TshipΔy, &pics[PCship]); } static void drawplanets(void) { drawpic(canvmidx, canvmidy, &pics[PCplanets]); } static void drawgrid(void) { scrollpic(&pics[PCgrid], tc / scroll2Δtc); drawpic(canvmidx, canvmidy, &canvas); } static void drawintrostr(void) { drawsubstr(canvmidx, canvmidy, curstr, curstr+stri); } static void intro3step(void) { int tc₁, tc₂; if(tc > Tshiptravel){ input(Kfire); return; } if(tc < steptc) return; drawbg(); drawgrid(); drawplanets(); drawship(); if((tc / Tblink & 1) == 0) drawtarget(); drawfb(); tc₁ = (tc / scrollΔtc + 1) * scrollΔtc; tc₂ = (tc / scroll2Δtc + 1) * scroll2Δtc; tc₁ = min(tc₁, tc₂); tc₂ = (tc / TshipΔx + 1) * TshipΔx; tc₁ = min(tc₁, tc₂); tc₂ = (tc / TshipΔy + 1) * TshipΔy; tc₁ = min(tc₁, tc₂); tc₂ = (tc / Tblink + 1) * Tblink; steptc = min(tc₁, tc₂); } static void scrollstep(void) { static int tc₁, tc₂; if(tc < steptc) return; if(tc >= tc₂ && stri < strlen(curstr)) stri++; drawbg(); drawintrostr(); drawprompt(); drawfb(); tc₁ = (tc / scrollΔtc + 1) * scrollΔtc; tc₂ = stri < strlen(curstr) ? (tc / txtΔt + 1) * txtΔt : scrollΔtc; steptc = min(tc₁, tc₂); } static void intro4step(void) { scrollstep(); } static void intro2step(void) { scrollstep(); } static void intro1step(void) { scrollstep(); } static void introkey(Rune k) { if(k != Kfire) return; if(stri < strlen(curstr)) stri = strlen(curstr); else if(step == intro1step){ setfsm(intro2step, introkey, 0); curstr = basestr[BSintro2]; stri = 0; steptc = 0; }else if(step == intro2step){ setfsm(intro3step, introkey, 1); scrollΔtc = Tbg2scroll; scroll2Δtc = Tbg1scroll; steptc = 0; }else if(step == intro3step){ setfsm(intro4step, introkey, 1); curstr = basestr[BSintro3]; prompt = basestr[BScontinue]; promptΔx = 8 - 4; scrollΔtc = Tbg1scroll; stri = 0; steptc = 0; }else enterloadmap(); } void enterintro(void) { canvas.w = pics[PCplanets].w; canvas.h = pics[PCplanets].h; canvmidx = Vcenterx - canvas.w / 2; canvmidy = Vcentery - canvas.h / 2; setfsm(intro1step, introkey, 1); curstr = basestr[BSintro1]; prompt = basestr[BSmore]; promptΔx = 36 - 30; scrollΔtc = Tbg1scroll; txtΔt = Ttext; steptc = 0; }