/* This is one of the oldest songs. I picked the random name "risen" and said to God "Oh, you're ambitious," thinking it was an epic name. He laughed and gave an epic song! */ <1>/* Graphics Not Rendered in HTML */ <2>/* Graphics Not Rendered in HTML */ <3>/* Graphics Not Rendered in HTML */ <4>/* Graphics Not Rendered in HTML */ F64 t0 = Beat; #define WING 24 #define BODY 8 U0 Bird(CDC *dc, F64 wing_theta) { CD3I32 p[3]; dc->color = WHITE; p[0].x = 0; p[0].y = 0; p[0].z = -BODY; p[1].x = 0; p[1].y = 0; p[1].z = BODY; p[2].x = -WING * Cos(wing_theta); p[2].y = -WING * Sin(wing_theta); p[2].z = 0; GrFillPoly3(dc, 3, p); p[0].x = 0; p[0].y = 0; p[0].z = -BODY; p[1].x = 0; p[1].y = 0; p[1].z = BODY; p[2].x = WING * Cos(wing_theta); p[2].y = -WING * Sin(wing_theta); p[2].z = 0; GrFillPoly3(dc, 3, p); dc->color = ROPF_DITHER + WHITE << 16 + LTGRAY; dc->thick = 3; GrLine3(dc, 0, 0, -BODY, 0, 0, BODY); } #define SCALE 115 #define ARM 112 #define CHAIN 100 #define CUP 28 #define TILT -.25 #define ARM_Y -(0.93 * CHAIN) #define ARM_Z -45 #define BIRDS_NUM 7 #define RANGE 40 F64 bx[BIRDS_NUM], by[BIRDS_NUM]; U0 DrawIt(CTask *task, CDC *dc) { I64 i; F64 theta, dt = Beat - t0, d_chain = Sin(pi / 64 * Sin(pi * dt / 4)) * CHAIN; if (t0) { DCDepthBufAlloc(dc); dc->flags |= DCF_TRANSFORMATION; Mat4x4IdentEqu(dc->r); dc->x = task->pix_width >> 1; dc->y = task->pix_height >> 1 - SCALE; dc->z = 3 * GR_Z_ALL >> 1; Mat4x4RotX(dc->r, TILT); Mat4x4RotZ(dc->r, pi / 64 * Sin(pi * dt / 4)); Sprite3(dc, 0, 0, 0, <3>); Mat4x4IdentEqu(dc->r); dc->x = task->pix_width >> 1 - ARM; dc->y = task->pix_height >> 1 - SCALE + CHAIN - d_chain; dc->z = 3 * GR_Z_ALL >> 1; Mat4x4RotX(dc->r, TILT + pi / 32 * Sin(pi * dt / 4)); Mat4x4RotY(dc->r, pi / 32 * Sin(pi * dt / 4)); Sprite3(dc, 0, 0, 0, <2>); Mat4x4IdentEqu(dc->r); Mat4x4RotX(dc->r, TILT); dc->color = BLACK; GrLine3(dc, 0, ARM_Y, ARM_Z, 0, 0, 0.707 * CUP); GrLine3(dc, 0, ARM_Y, ARM_Z, CUP, 0, -0.707 * CUP); GrLine3(dc, 0, ARM_Y, ARM_Z, -CUP, 0, -0.707 * CUP); Mat4x4IdentEqu(dc->r); dc->x = task->pix_width >> 1 + ARM; dc->y = task->pix_height >> 1 - SCALE + CHAIN + d_chain; dc->z = 3 * GR_Z_ALL >> 1; Mat4x4RotX(dc->r, TILT - pi / 32 * Sin(pi * dt / 4)); Mat4x4RotY(dc->r, -pi / 32 * Sin(pi * dt / 4)); Sprite3(dc, 0, 0, 0, <2>); Mat4x4IdentEqu(dc->r); Mat4x4RotX(dc->r, TILT); dc->color = BLACK; GrLine3(dc, 0, ARM_Y, ARM_Z, 0, 0, 0.707 * CUP); GrLine3(dc, 0, ARM_Y, ARM_Z, CUP, 0, -0.707 * CUP); GrLine3(dc, 0, ARM_Y, ARM_Z, -CUP, 0, -0.707 * CUP); Mat4x4IdentEqu(dc->r); dc->x = task->pix_width >> 1; dc->y = task->pix_height >> 1; dc->z = 3 * GR_Z_ALL >> 1; Mat4x4RotZ(dc->r, 0.6 - pi / 32 * Sin(pi * dt / 4)); Mat4x4RotX(dc->r, TILT - pi / 32 * Sin(pi * dt / 4)); Mat4x4RotY(dc->r, -pi / 32 * Sin(pi * dt / 4)); Sprite3(dc, 0, 0, 0, <4>); if (dt >= 12.0) { Mat4x4IdentEqu(dc->r); dc->x = task->pix_width >> 1; dc->y = task->pix_height >> 1; dc->z = GR_Z_ALL; Mat4x4Scale(dc->r, .5 + .04 * dt); Sprite3(dc, 0, 0, 0, <1>); } dc->y = task->pix_height + 60; for (i = 0; i < BIRDS_NUM; i++) { bx[i] = Clamp(bx[i] + 0.35 * SignI64(RandI16), -RANGE, RANGE); by[i] = Clamp(by[i] + 0.35 * SignI64(RandI16), -RANGE, RANGE); theta = pi / 2 * i / BIRDS_NUM + 0.2 * pi * dt + pi / 2; Mat4x4IdentEqu(dc->r); Mat4x4RotX(dc->r, pi / 2); Mat4x4RotZ(dc->r, theta); Mat4x4TranslationEqu(dc->r, 230 * Cos(theta) + bx[i], 230 * Sin(theta)+by[i], -(120 * i / BIRDS_NUM + 16 * dt)); Mat4x4RotX(dc->r, 0.45 * pi + pi); Bird(dc, Sin(2 * pi * dt + i * 2 * pi / BIRDS_NUM)); } } } U0 TOSTheme() { I64 i, old_update = gr.fp_final_screen_update; gr.fp_final_screen_update = NULL; t0 = 0; SettingsPush; //See SettingsPush AutoComplete; WinBorder; WinMax; WinVert(0, TEXT_ROWS - 1, Fs); DocCursor; DocClear; Fs->text_attr = LTCYAN << 4 + BLACK; Fs->draw_it = &DrawIt; Fs->task_end_cb = &SoundTaskEndCB; MusicSettingsReset; music.tempo = 2.85; music.stacatto_factor = 0.902; for (i = 0; i < BIRDS_NUM; i++) { bx[i] = RANGE * RandI16 / RANGE; by[i] = RANGE * RandI16 / RANGE; } try { "$BG+H,LTCYAN$"; Refresh(2); for (i = 0; i < 1; i++) { t0 = Beat; Play("5eDEqFFetEEFqDeCDDEetCGF"); Play("5eDEqFFetEEFqDeCDDEetCGF"); Play("5eDCqDE4eAA5etEEFEDG4B5DCqF"); Play("5eDCqDE4eAA5etEEFEDG4B5DCqF"); } Refresh(2); } catch PutExcept; SettingsPop; gr.fp_final_screen_update = old_update; } TOSTheme;