diff --git a/29_day/Makefile b/29_day/Makefile index 1963c4e..f92b3d5 100644 --- a/29_day/Makefile +++ b/29_day/Makefile @@ -22,7 +22,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ beepdown/beepdown.hrb color/color.hrb color2/color2.hrb \ sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \ type/type.hrb iroha/iroha.hrb chklang/chklang.hrb \ - notrec/notrec.hrb bball/bball.hrb + notrec/notrec.hrb bball/bball.hrb invader/invader.hrb $(EDIMG) imgin:../z_tools/fdimg0at.tek \ wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \ copy from:haribote/haribote.sys to:@: \ @@ -53,6 +53,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \ copy from:euc.txt to:@: \ copy from:notrec/notrec.hrb to:@: \ copy from:bball/bball.hrb to:@: \ + copy from:invader/invader.hrb to:@: \ copy from:nihongo/nihongo.fnt to:@: \ imgout:haribote.img @@ -94,6 +95,7 @@ full : $(MAKE) -C chklang $(MAKE) -C notrec $(MAKE) -C bball + $(MAKE) -C invader $(MAKE) haribote.img run_full : @@ -143,6 +145,7 @@ clean_full : $(MAKE) -C chklang clean $(MAKE) -C notrec clean $(MAKE) -C bball clean + $(MAKE) -C invader clean src_only_full : $(MAKE) -C haribote src_only @@ -171,6 +174,7 @@ src_only_full : $(MAKE) -C chklang src_only $(MAKE) -C notrec src_only $(MAKE) -C bball src_only + $(MAKE) -C invader src_only -$(DEL) haribote.img refresh : diff --git a/29_day/invader/!cons_9x.bat b/29_day/invader/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/invader/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/invader/!cons_nt.bat b/29_day/invader/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/invader/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/invader/Makefile b/29_day/invader/Makefile new file mode 100644 index 0000000..a60ffdb --- /dev/null +++ b/29_day/invader/Makefile @@ -0,0 +1,5 @@ +APP = invader +STACK = 90k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/invader/invader.c b/29_day/invader/invader.c new file mode 100644 index 0000000..d26d3b1 --- /dev/null +++ b/29_day/invader/invader.c @@ -0,0 +1,281 @@ +#include /* sprintf */ +#include /* strlen */ +#include "apilib.h" + +void putstr(int win, char *winbuf, int x, int y, int col, unsigned char *s); +void wait(int i, int timer, char *keyflag); + +static unsigned char charset[16 * 8] = { + + /* invader(0) */ + 0x00, 0x00, 0x00, 0x43, 0x5f, 0x5f, 0x5f, 0x7f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x20, 0x3f, 0x00, + + /* invader(1) */ + 0x00, 0x0f, 0x7f, 0xff, 0xcf, 0xcf, 0xcf, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x00, + + /* invader(2) */ + 0x00, 0xf0, 0xfe, 0xff, 0xf3, 0xf3, 0xf3, 0xff, + 0xff, 0x07, 0xff, 0xff, 0x03, 0x03, 0x03, 0x00, + + /* invader(3) */ + 0x00, 0x00, 0x00, 0xc2, 0xfa, 0xfa, 0xfa, 0xfe, + 0xf8, 0xf8, 0xf8, 0xf8, 0x00, 0x04, 0xfc, 0x00, + + /* fighter(0) */ + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x43, 0x47, 0x4f, 0x5f, 0x7f, 0x7f, 0x00, + + /* fighter(1) */ + 0x18, 0x7e, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, + 0xff, 0xff, 0xe7, 0xe7, 0xe7, 0xe7, 0xff, 0x00, + + /* fighter(2) */ + 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0xc2, 0xe2, 0xf2, 0xfa, 0xfe, 0xfe, 0x00, + + /* laser */ + 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00 +}; +/* invader:"abcd", fighter:"efg", laser:"h" */ + +void HariMain(void) +{ + /* + fx:自机的x坐标(fighter_x) + lx,ly:等离子炮弹的坐标(laser_x,laser_y) + ix,iy:外星人群的坐标(invaders_x,in-vaders_y) + idir:外星人群的移动方向(invaders_direc-tion) + laserwait:等离子炮弹的剩余充电时间 + movewait:当这个变量变为0时外星人群前进一步 + movewait0:movewait的初始值(消灭30只敌人后减少) + invline:外星人群的行数(invaders_line) + score:当前得分 + high:最高得分 + point:得分的增加量(奖金的单价?) + invstr:将外星人群的状态显示为字符串的变量 + */ + + int win, timer, i, j, fx, laserwait, lx = 0, ly; + int ix, iy, movewait0, movewait, idir; + int invline, score, high, point; + char winbuf[336 * 261], invstr[32 * 6], s[12], keyflag[4], *p; + static char invstr0[32] = " abcd abcd abcd abcd abcd "; + + win = api_openwin(winbuf, 336, 261, -1, "invader"); + api_boxfilwin(win, 6, 27, 329, 254, 0); + timer = api_alloctimer(); + api_inittimer(timer, 128); + + high = 0; + putstr(win, winbuf, 22, 0, 7, "HIGH:00000000"); + +restart: + score = 0; + point = 1; + putstr(win, winbuf, 4, 0, 7, "SCORE:00000000"); + movewait0 = 20; + fx = 18; + putstr(win, winbuf, fx, 13, 6, "efg"); + wait(100, timer, keyflag); + +next_group: + wait(100, timer, keyflag); + ix = 7; + iy = 1; + invline = 6; + for (i = 0; i < 6; i++) { + for (j = 0; j < 27; j++) { + invstr[i * 32 + j] = invstr0[j]; + } + putstr(win, winbuf, ix, iy + i, 2, invstr + i * 32); + } + keyflag[0] = 0; + keyflag[1] = 0; + keyflag[2] = 0; + + ly = 0; /*不显示*/ + laserwait = 0; + movewait = movewait0; + idir = +1; + wait(100, timer, keyflag); + + for (;;) { + if (laserwait != 0) { + laserwait--; + keyflag[2 /* space */] = 0; + } + + wait(4, timer, keyflag); + + /*自机的处理*/ + if (keyflag[0 /* left */] != 0 && fx > 0) { + fx--; + putstr(win, winbuf, fx, 13, 6, "efg "); + keyflag[0 /* left */] = 0; + } + if (keyflag[1 /* right */] != 0 && fx < 37) { + putstr(win, winbuf, fx, 13, 6, " efg"); + fx++; + keyflag[1 /* right */] = 0; + } + if (keyflag[2 /* space */] != 0 && laserwait == 0) { + laserwait = 15; + lx = fx + 1; + ly = 13; + } + + /*外星人移动*/ + if (movewait != 0) { + movewait--; + } else { + movewait = movewait0; + if (ix + idir > 14 || ix + idir < 0) { + if (iy + invline == 13) { + break; /* GAME OVER */ + } + idir = - idir; + putstr(win, winbuf, ix + 1, iy, 0, " "); + iy++; + } else { + ix += idir; + } + for (i = 0; i < invline; i++) { + putstr(win, winbuf, ix, iy + i, 2, invstr + i * 32); + } + } + + /*炮弹处理*/ + if (ly > 0) { + if (ly < 13) { + if (ix < lx && lx < ix + 25 && iy <= ly && ly < iy + invline) { + putstr(win, winbuf, ix, ly, 2, invstr + (ly - iy) * 32); + } else { + putstr(win, winbuf, lx, ly, 0, " "); + } + } + ly--; + if (ly > 0) { + putstr(win, winbuf, lx, ly, 3, "h"); + } else { + point -= 10; + if (point <= 0) { + point = 1; + } + } + if (ix < lx && lx < ix + 25 && iy <= ly && ly < iy + invline) { + p = invstr + (ly - iy) * 32 + (lx - ix); + if (*p != ' ') { + /* hit ! */ + score += point; + point++; + sprintf(s, "%08d", score); + putstr(win, winbuf, 10, 0, 7, s); + if (high < score) { + high = score; + putstr(win, winbuf, 27, 0, 7, s); + } + for (p--; *p != ' '; p--) { } + for (i = 1; i < 5; i++) { + p[i] = ' '; + } + putstr(win, winbuf, ix, ly, 2, invstr + (ly - iy) * 32); + for (; invline > 0; invline--) { + for (p = invstr + (invline - 1) * 32; *p != 0; p++) { + if (*p != ' ') { + goto alive; + } + } + } + /*全部消灭*/ + movewait0 -= movewait0 / 3; + goto next_group; + alive: + ly = 0; + } + } + } + } + + /* GAME OVER */ + putstr(win, winbuf, 15, 6, 1, "GAME OVER"); + wait(0, timer, keyflag); + for (i = 1; i < 14; i++) { + putstr(win, winbuf, 0, i, 0, " "); + } + goto restart; +} + +void putstr(int win, char *winbuf, int x, int y, int col, unsigned char *s) +{ + int c, x0, i; + char *p, *q, t[2]; + x = x * 8 + 8; + y = y * 16 + 29; + x0 = x; + i = strlen(s); /*计算s的字符数*/ + api_boxfilwin(win + 1, x, y, x + i * 8 - 1, y + 15, 0); + q = winbuf + y * 336; + t[1] = 0; + for (;;) { + c = *s; + if (c == 0) { + break; + } + if (c != ' ') { + if ('a' <= c && c <= 'h') { + p = charset + 16 * (c - 'a'); + q += x; + for (i = 0; i < 16; i++) { + if ((p[i] & 0x80) != 0) { q[0] = col; } + if ((p[i] & 0x40) != 0) { q[1] = col; } + if ((p[i] & 0x20) != 0) { q[2] = col; } + if ((p[i] & 0x10) != 0) { q[3] = col; } + if ((p[i] & 0x08) != 0) { q[4] = col; } + if ((p[i] & 0x04) != 0) { q[5] = col; } + if ((p[i] & 0x02) != 0) { q[6] = col; } + if ((p[i] & 0x01) != 0) { q[7] = col; } + q += 336; + } + q -= 336 * 16 + x; + } else { + t[0] = *s; + api_putstrwin(win + 1, x, y, col, 1, t); + } + } + s++; + x += 8; + } + api_refreshwin(win, x0, y, x, y + 16); + return; +} + +void wait(int i, int timer, char *keyflag) +{ + int j; + if (i > 0) { + /*等待一段时间*/ + api_settimer(timer, i); + i = 128; + } else { + i = 0x0a; /* Enter */ + } + for (;;) { + j = api_getkey(1); + if (i == j) { + break; + } + if (j == '4') { + keyflag[0 /* left */] = 1; + } + if (j == '6') { + keyflag[1 /* right */] = 1; + } + if (j == ' ') { + keyflag[2 /* space */] = 1; + } + } + return; +} diff --git a/29_day/invader/make.bat b/29_day/invader/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/invader/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file