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; }
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); }