📄 game.cpp
字号:
for (i=0;i<7;i++) louttextxy(tx[i],ty[i],text[i]);
express.scr_save();
game_blit(-1,1);
while (game_key(0));
while (lkpressed()) lkgetch(0);
for (i=0,ok=0,draw=1;ok==0;)
{ if (draw) {
express.scr_restore();
lputSpirit(tx[i]+8,ty[i]+24,express.syspic.LpcImage[17]);
game_getfname(NAME_SAVE,i,name);
place[0]=0; maxlevel=0;
if ((f=fopen(name,"rb")))
{ fseek(f,8,SEEK_SET);
fread(&maxlevel,4,1,f);
fread(place,1,80,f);
fclose(f);
exist=1;
} else exist=0;
louttextxy(tx[8],ty[8],place);
sprintf(place,"%d",maxlevel);
louttextxy(tx[7],ty[7],place);
game_blit(-1,1);
draw=0;
}
while (!lkpressed()) world.noop(game_delay);
lkgetch(&k);
switch (k)
{ case KEY_LEFT: if (--i<0) i=0; draw=1; break;
case KEY_RIGHT: if (++i>=5) i=4; draw=1; break;
case KEY_ESC:
case KEY_ALT: ok=-1; break;
case KEY_SPACE:
case KEY_ENTER:
case KEY_CTRL: ok=1;
if (save==0&&exist==0) ok=0;
break;
}
}
while (game_key(0)||game_key(1)) world.noop(game_delay);
if (ok<0) return -1;
if (!mode) return i;
if (save) world.SAVE_GAME(i);
else world.LOAD_GAME(i);
return 0;
}
int GAME::GameStatusView()
{ static char text[20][40];
char *ptext[20],i;
int add_at=0,add_df=0,actor_id;
actor_id=express.actor_choice();
if (actor_id<0) return 0;
sprintf(text[0],"*%s",ac[actor_id].name);
sprintf(text[1],"");
sprintf(text[2],"*等级程度:$%d",ac[actor_id].level);
sprintf(text[3],"*经验数值:$%d/%d",ac[actor_id].exp,exps[ac[actor_id].level+1]);
sprintf(text[4],"*生命值:$%d/%d",ac[actor_id].hp,ac[actor_id].mhp);
sprintf(text[5],"*魔法值:$%d/%d",ac[actor_id].mp,ac[actor_id].mmp);
if (ac[actor_id].cloth>=0) {
add_at+=express.goods_dat[ac[actor_id].cloth].ahp;
add_df+=express.goods_dat[ac[actor_id].cloth].dmp;
}
if (ac[actor_id].weapon>=0) {
add_at+=express.goods_dat[ac[actor_id].weapon].ahp;
add_df+=express.goods_dat[ac[actor_id].weapon].dmp;
}
sprintf(text[6],"*攻 击:$%d*+~%d",ac[actor_id].at,add_at);
sprintf(text[7],"*防 御:$%d*+~%d",ac[actor_id].df,add_df);
sprintf(text[8],"*敏捷度:$%d",ac[actor_id].smt);
strcpy(text[15],"无"); if (ac[actor_id].cloth>=0) strcpy(text[15],express.goods_dat[ac[actor_id].cloth].name);
strcpy(text[16],"无"); if (ac[actor_id].weapon>=0) strcpy(text[16],express.goods_dat[ac[actor_id].weapon].name);
sprintf(text[9],"*身 穿:$%s",text[15]);
sprintf(text[10],"*手 持:$%s",text[16]);
for (i=0;i<16;i++) ptext[i]=text[i];
express.menu_choice(11,ptext,1,actor_id,c_green);
return 0;
}
int random1(int size)
{ unsigned long t,time;
_disable();
outp(0x43,0);
t=inp(0x40);
t+=(inp(0x40)<<8);
t=0xffff^t;
_enable();
time=(clock()<<16)+t;
return (time^0xffffffff)%size;
}
int GAME::FightStart(int enemy)
{ int aci[8],ac_count;
int i,j,k,t,x,levelup=0;
int save_music=voc.music;
int result,r,g,b;
char line[2048];
FIGHT_DAT fight;
static char bitmap[320*240+8];
static char dark[320*240+8];
static char save[320*240+8];
RGB black_white[256];
extern char *text_game_over[];
extern int fade_view(int,int,char*);
exps[99]=0xfffff;
for (i=0;i<4;i++) aci[i]=-1;
for (i=0,j=0,ac_count=0;i<3;i++) {
k=game_findactor(i);
if (k>=0) aci[j++]=i, ac_count++;
}
for (i=0;i<8;i++) {
fight.actor[i]=-1;
fight.enemy[i]=-1;
fight.mhp[i]=-1; fight.mmp[i]=-1; fight.at[i]=-1;
fight.df[i]=-1; fight.sm[i]=-1; fight.hp[i]=-1;
fight.mp[i]=-1; fight.exp[i]=-1; fight.lev[i]=-1;
}
for(i=0;i<3;i++) fight.enemy_x[i]=-1;
fight.actor_num=ac_count;
for (i=0;i<ac_count;i++) {
t=aci[i];
fight.actor[i]=t;
fight.mhp[i]=ac[t].mhp;
fight.mmp[i]=ac[t].mmp;
fight.hp[i]=ac[t].hp;
fight.mp[i]=ac[t].mp;
fight.sm[i]=ac[t].smt;
fight.exp[i]=ac[t].exp;
fight.lev[i]=ac[t].level;
fight.at[i]=ac[t].at;
fight.df[i]=ac[t].df;
fight.mg_num[i]=0;
if (ac[t].weapon>=0) {
fight.at[i]+=express.goods_dat[ac[t].weapon].ahp;
fight.df[i]+=express.goods_dat[ac[t].weapon].dmp;
}
if (LGAME.ac[t].cloth>=0) {
fight.at[i]+=express.goods_dat[ac[t].cloth].ahp;
fight.df[i]+=express.goods_dat[ac[t].cloth].dmp;
}
}
fight.music=14;
fight.place=0;
fight.money=0;
if (enemy>=0) {
fight.enemy_num=1;
fight.enemy[0]=enemy;
} else {
if (world.data[1][700]==0) return 0;
k=random1(world.data[1][700])+1; j=k;
if (j>3) j=random1(3)+1;
for (i=0;i<j;i++) fight.enemy[i]=world.data[1][701+random1(k)];
fight.enemy_num=j;
}
switch (fight.enemy_num)
{ case 1: fight.enemy_x[0]=1; break;
case 2: fight.enemy_x[0]=0; fight.enemy_x[1]=2; break;
case 3: fight.enemy_x[0]=1; fight.enemy_x[1]=0;
fight.enemy_x[2]=2; break;
}
lActiveSurface(NULL);
lgetBlock(0,0,319,239,save);
// --------> fight todo
layer.active(0);
lgetBlock(0,0,319,239,bitmap);
lsetColor(240);
lbar(0,0,319,239);
lgetBlock(0,0,319,239,dark);
for (i=0,j=2;i<360;i+=j,j++) {
world.noop(game_delay);
memset(layer.layers[0].memory,0,320*240);
if (i<320) lputBlock(i,0,bitmap);
if (i<320) lgPutMapImage(-i,0,bitmap,&color_map);
if (i<320) lgPutMapImage(320-i,0,dark,&color_map);
game_blit(-1,1);
}
while (game_key(0)||game_key(1));
while (lkpressed()) lkgetch(NULL);
result=start_fight(&fight);
if (result!=1) {
voc.playmidi(15,0);
lloadPal(black_white);
lloadPal(pal);
for (i=0;i<256;i++) {
r=black_white[i].r;
g=black_white[i].g;
b=black_white[i].b;
j=(r*30+g*59+b*11)/100;
black_white[i].r=j;
black_white[i].g=j;
black_white[i].b=j;
}
world.noop(game_delay*90);
lActiveSurface(NULL);
lgetBlock(0,0,319,239,bitmap);
layer.active(0);
for (i=0,k=0;k<63;k++)
{ world.noop(game_delay);
memset(layer.layers[0].memory,0,320*240);
lgPutImage(0,0,319-(320*i/100),239-(240*i/100),bitmap);
lchgPal(1,pal,black_white);
lsetPal(pal);
game_blit(-1,1);
if (i<50) i++;
}
lActiveSurface(NULL);
for (i=0;i<5;i++) {
fade_view(170,8+i*24,text_game_over[i]);
world.noop(game_delay*60);
}
memset(layer.layers[0].memory,0,320*240);
world.noop(game_delay*30*2);
memset(pal,0,768);
lsetPal(pal);
layer.active(0);
world.looping=2;
return FALSE;
}
LGAME.money+=fight.money;
for (i=0;i<ac_count;i++) {
t=aci[i];
ac[t].exp=fight.exp[i];
ac[t].hp=fight.hp[i];
ac[t].mp=fight.mp[i];
j=GetLevel(fight.exp[i])-ac[t].level;
ac[t].level=GetLevel(fight.exp[i]);
if (j>0) {
for (x=0;x<j;x++) {
ac[t].mhp=ac[t].mhp*12/10+4;
ac[t].mmp=ac[t].mmp*12/10+4;
ac[t].at=ac[t].at*14/10+1;
ac[t].df=ac[t].df*12/10+1;
ac[t].smt=ac[t].smt*12/10+1;
}
ac[t].hp=ac[t].mhp;
ac[t].mp=ac[t].mmp;
levelup++;
}
}
sprintf(line,"水平升级 %d点",levelup);
if (levelup>0) express.out_say(6,0,line);
// ------> todo
voc.playmidi(save_music,1);
lActiveSurface(NULL);
lputBlock(0,0,dark);
laddPal(-64,pal0,pal);
lsetPal(pal);
lputBlock(0,0,save);
layer.active(0);
for (i=-63;i<=0;i++) {
world.noop(game_delay/2);
laddPal(i,pal0,pal);
lsetPal(pal);
}
lputBlock(0,0,save);
lsetPal(pal0);
return TRUE;
}
///////////////////////////////////////////////////////////////////////////
int TEXPRESS::buy_sell(short *things,int sell)
{ int i,j,count,ok;
static char names[100][400];
static char scr[320*240+100];
char money[200],*p[100];
short x=24,y=130,k;
layer.active(0);
lgetBlock(0,0,319,239,scr);
while (game_key(0)||game_key(1)) world.noop(0);
while (lkpressed()) lkgetch(0);
for (i=0,count=0;things[i]>=0;i++,count++)
{ p[i]=names[i];
sprintf(names[i],"*%s ",goods_dat[things[i]].name);
sprintf(money,"%d",goods_dat[things[i]].buy);
for (j=0;j<6;j++) names[i][13+j]=money[j];
names[i][12]='$';
}
for (ok=0;ok==0;)
{ i=menu_choice(count,p,0,-1,0,75,36);
if (i<0) ok=1;
else if (i<count) {
k=things[i];
out_say(6,0,goods_dat[k].inst);
if (yes_no()) {
if (LGAME.money<goods_dat[k].buy)
out_say(6,0,"你的钱不够");
else {
LGAME.money-=goods_dat[k].buy;
LGAME.goods_add(k,1);
}
}
} else voc.regist_msg("ERROR BUY");
}
layer.active(0);
lputBlock(0,0,scr);
game_blit(-1,1);
while (game_key(0)||game_key(1)) world.noop(0);
while (lkpressed()) lkgetch(0);
if (!sell) return 0;
out_say(6,0,"要卖东西吗?");
if (!yes_no()) return 0;
lputBlock(0,0,scr);
game_blit(-1,1);
for (ok=0;ok==0;)
{ i=goods_choice(0,0);
k=LGAME.goods[i];
if (i>=0&&k>=0)
{ j=goods_dat[k].sell;
if (j>0) {
sprintf(money,"%s能卖 %d文钱",goods_dat[k].name,goods_dat[k].sell);
out_say(6,0,money);
if (yes_no())
{ LGAME.goods_add(k,0);
LGAME.money+=goods_dat[k].sell;
}
} else out_say(6,0,"此物不可卖");
} else ok=1;
}
lputBlock(0,0,scr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -