예제 #1
0
파일: lock.c 프로젝트: mortehu/cantera-lock
void LOCK_init(void) {
  struct FONT_Data* font;
  int ch;

  FONT_Init();
  GLYPH_Init();

  if (!(font = FONT_Load("Bitstream Vera Sans Mono", 18, 100)))
    errx(EXIT_FAILURE, "Failed to load font \"Arial\"");

  for (ch = ' '; ch <= '~'; ++ch) {
    struct FONT_Glyph* glyph;

    if (!(glyph = FONT_GlyphForCharacter(font, ch)))
      fprintf(stderr, "Failed to get glyph for '%d'", ch);

    GLYPH_Add(ch, glyph);

    free(glyph);
  }

  FONT_Free(font);
  GLYPH_UpdateTexture();

  begin_lock = time(0);

  hide_hud = begin_lock + 60;
}
예제 #2
0
PUBLIC void INTRO_DoGreets(void) {
    dword page;
    int i;
    int loops, f, prevnf;
    StarGenFunc sf;
    int starsv = 1, gentime;
    int CosTb[CTABLEW*2], SinTb[CTABLEW*2];
    sint32 angle, va;
    int NDots = MAXDOTS;
    sint32 destsv = 100;
    sint32 destva = 200;

    DotPlanes[0] = NEW(MAXDOTS*sizeof(*DotPlanes[0])*4);
    if (DotPlanes[0] == NULL)
        return;
    DotPlanes[1] = DotPlanes[0] + MAXDOTS;
    DotPlanes[2] = DotPlanes[1] + MAXDOTS;
    DotPlanes[3] = DotPlanes[2] + MAXDOTS;
    AddTbl = NEW(sizeof(*AddTbl)*200);
    if (AddTbl == NULL) {
        DISPOSE(DotPlanes[0]);
        return;
    }
    for (i = 0; i < 200; i++)
        AddTbl[i] = 80*i;
    Stars = NEW(MAXDOTS*sizeof(*Stars));
    if (Stars == NULL) {
        DISPOSE(AddTbl);
        DISPOSE(DotPlanes[0]);
        return;
    }
    InvTbl = NEW(ZRANGE*sizeof(*InvTbl));
    if (InvTbl == NULL) {
        DISPOSE(Stars);
        DISPOSE(AddTbl);
        DISPOSE(DotPlanes[0]);
        return;
    }
    for (i = 0; i < ZRANGE; i++)
        InvTbl[i] = (1 << 30)/(ZMIN+i);

    FONT_Load(&Font, "fontgrt.fnt");
    printf("Font height %d\n", Font.height);

    LLS_Init(LLSM_DIRECT, LLSVM_MODEY);
    VGA_ZeroPalette();
    memset(VGA800x80, 0, 65536);

    for (i = 0; i < 16; i++)
        VGA_PutColor(i, i*4, i*4, i*4);
    for (i = 0; i < 16; i++)
        VGA_PutColor(i+16, 16+3*i, i*2, 0);
    for (i = 0; i < 16; i++)
        VGA_PutColor(i+32, 0, 2*i, 16+i*2);

    sf = AddStar5;
    gentime = 4*70;

    for (i = 0; i < MAXDOTS; i++) {
        Stars[i].z = RND_GetNum() % ZRANGE + ZMIN;
        sf(Stars + i);
    }

    prevnf = 1;
    Pos = 0;
    angle = 0;
    va = 0;
    page = 0;
    loops = 0;
    f = 0;
    LLK_LastScan = 0;
    while (LLK_LastScan != kESC) {
        int nf;

        if (LLK_Keys[kT]) VGA_SetBorder(63, 0, 0);
        if (LLK_Keys[kUARROW])
            starsv++;
        if (LLK_Keys[kDARROW])
            starsv--;
        if (LLK_Keys[kLARROW])
            va--;
        if (LLK_Keys[kRARROW])
            va++;

        if (LLK_Keys[k1] && SIZEARRAY(StarGen) > 0)
            sf = StarGen[0];
        if (LLK_Keys[k2] && SIZEARRAY(StarGen) > 1)
            sf = StarGen[1];
        if (LLK_Keys[k3] && SIZEARRAY(StarGen) > 2)
            sf = StarGen[2];
        if (LLK_Keys[k4] && SIZEARRAY(StarGen) > 3)
            sf = StarGen[3];
        if (LLK_Keys[k5] && SIZEARRAY(StarGen) > 4)
            sf = StarGen[4];

        angle += va;
        GenTables(CosTb, SinTb, angle);

        page = (page + 80*200);
        if (page >= 4*80*200)
            page = 0;

        VGA_SetPlanes(0x0F);
        memset(VGA800x80[0] + page, 0, 80*200);
        InitDotPlanes();
        {
            PStar ps;
            ps = Stars;
            for (i = 0; i < NDots; i++, ps++) {
                int x, y, c;
                sint32 z;

                z = InvTbl[ps->z-ZMIN];
                x = CTABLEW + FPMult(2*ps->x, z);
                if (x < 0 || x >= (CTABLEW*2)) {
/*
                    if (starsv > 0) {
                        ps->z = ZMAX - RND_GetNum()%1024;
                        sf(ps);
                    }
*/
                } else {
                    y = CTABLEW + FPMult(2*ps->y, z);
                    if (y < 0 || y >= (CTABLEW*2)) {
/*
                        if (starsv > 0) {
                            ps->z = ZMAX - RND_GetNum()%1024;
                            sf(ps);
                        }
*/
                    } else {
                        int rx, ry;
                        rx = 160 + (CosTb[x] + SinTb[y])/4;
                        ry = 100 + (CosTb[y] - SinTb[x])/4;
                        if (rx >= 0 && rx < 320 && ry >= 0 && ry < 200) {
                            if (ps->z < (ZMIN+ZRANGE/2))
                                c = 15;
                            else
                                c = 15 - (ps->z-ZMIN-ZRANGE/2)*16/(ZRANGE/2);
                            AddDot(rx, ry, c);
                        }
                    }
                }
                ps->z -= starsv;
                if (ps->z < ZMIN) {
                    ps->z = ZMAX - RND_GetNum()%1024;
                    sf(ps);
                } else if (ps->z > ZMAX) {
                    ps->z = ZMIN + RND_GetNum()%1024;
                    sf(ps);
                }
            }
        }
        Pos += starsv;
        DumpDots(page);

        if (f > 1*70) {
            Write(page, 0, 0, "Greets from Jare to", 16);
//            if (f & 128)
            {
                Write(page, 0,  60, "All my friends and", 32);
                Write(page, 0, 100, "everyone in the scene", 32);
            }
        }

        if (starsv < destsv)      starsv++;
        else if (starsv > destsv) starsv--;
        else {
            destsv = RND_GetNum()%200 - 100;
            destsv = Sgn(destsv)*200 + destsv;
        }
        if (va < destva)          va++;
        else if (va > destva)     va--;
        else {
            destva = RND_GetNum()%200 - 100;
            destva = Sgn(destva)*100 + destva;
        }

        if (gentime-- <= 0) {
            gentime = 70 + RND_GetNum()%200;
            sf = StarGen[RND_GetNum()%SIZEARRAY(StarGen)];
        }

        VBL_ChangePage(page);
        VGA_SetBorder(0, 0, 0);
        nf = VBL_VSync(1);
        if (NDots > MAXDOTS/10 && nf > 1 && prevnf > 1)
            NDots = NDots - NDots/16;
        else if (NDots < MAXDOTS && nf == 1 && prevnf == 1) {
            NDots = NDots + NDots/64;
            if (NDots > MAXDOTS)
                NDots = MAXDOTS;
        }
        prevnf = nf;
        f += nf;
        loops++;
    }

    FONT_End(&Font);
    DISPOSE(InvTbl);
    DISPOSE(Stars);
    DISPOSE(AddTbl);
    DISPOSE(DotPlanes[0]);

    LLS_Init(LLSM_VIRTUAL, LLSVM_MODE13);
    VBL_ChangePage(0);
    VGA_ZeroPalette();
    VBL_ZeroPalette();
    VGA_SetPlanes(0x0F);
    memset(VGA800x80[0], 0, 65536);
    VBL_VSync(0);
    VBL_VSync(2);
}