📄 game.cpp
字号:
#include "ls.h"
#include "internal.h"
#include <process.h>
#include <time.h>
///////////////////////////////////////////////////////////////////////////
int exps[100]={0,0,20,50,80,100,150,200,280,400,500,650,840,1190,1280,
1570,1800,2400,999999};
GAME LGAME;
int GAME::GetLevel(int exp)
{ int i;
for (i=0;exp>=exps[i+1]&&i<90;i++);
return i;
}
GAME::GAME()
{ map=-1;
title[0]=title[1]=0;
title[2]=title[3]=0;
}
GAME::~GAME()
{
}
int GAME::DataReset()
{ int i,j;
money=0;
chapter=0;
for (i=0;i<6;i++) actor[i].reset();
for (i=0;i<4;i++) actor[i].load_dat(i);
for (i=0;i<4;i++) {
ac[i].id=actor[i].id;
ac[i].at=actor[i].at;
ac[i].df=actor[i].df;
ac[i].mhp=ac[i].hp=actor[i].maxhp;
ac[i].mmp=ac[i].mp=actor[i].maxmp;
ac[i].smt=actor[i].smart;
ac[i].f=0; ac[i].exp=0; ac[i].level=1;
ac[i].cloth=-1; ac[i].weapon=-1;
for (j=0;j<20;j++) ac[i].magic[j]=-1;
strcpy(ac[i].name,actor[i].name);
actor[i].reset();
}
for (i=0;i<MAX_GOODS+2;i++) goods[i]=-1;
game_reset_all(1,1,1,1);
world.smooth=0;
return 0;
}
int GAME::goods_find(int g)
{ int i,j;
for (i=0,j=-1;i<MAX_GOODS;i++) if (goods[i]==g) j=i;
return j;
}
int GAME::goods_add(int g,int mode)
{ int i,j,error=0;
switch (mode)
{ case 1: for (i=0;i<MAX_GOODS&&goods[i]!=-1;i++);
if (i==MAX_GOODS) error=-1;
else goods[i]=g;
break;
default: i=goods_find(g);
if (i<0||i>=MAX_GOODS) { error=-2; break; }
for (j=i;j<MAX_GOODS;j++) goods[j]=goods[j+1];
break;
}
return error;
}
int GAME::goods_use(int index,int actor_id)
{ int i,j,g,swap;
if (index<0||index>=MAX_GOODS) {
voc.regist_msg("ERROR GOODS USE");
return -1;
}
if (goods[index]<0) return -2;
g=goods[index]; i=game_findactor(actor_id);
if (express.goods_dat[g].mode==3||express.goods_dat[g].mode==4) return 1;
if (i<0) return 2;
switch (express.goods_dat[g].mode)
{ case 0: ac[actor_id].hp+=express.goods_dat[g].ahp;
ac[actor_id].mp+=express.goods_dat[g].dmp;
if (ac[actor_id].hp<0) ac[actor_id].hp=0;
if (ac[actor_id].mp<0) ac[actor_id].mp=0;
if (ac[actor_id].hp>ac[actor_id].mhp) ac[actor_id].hp=ac[actor_id].mhp;
if (ac[actor_id].mp>ac[actor_id].mmp) ac[actor_id].mp=ac[actor_id].mmp;
for (i=index;i<MAX_GOODS;i++) goods[i]=goods[i+1];
break;
case 1: swap=ac[actor_id].cloth;
ac[actor_id].cloth=g;
if (swap<0) {
for (i=index;i<MAX_GOODS;i++) goods[i]=goods[i+1];
} else goods[index]=swap;
break;
case 2: swap=ac[actor_id].weapon;
ac[actor_id].weapon=g;
if (swap<0) {
for (i=index;i<MAX_GOODS;i++) goods[i]=goods[i+1];
} else goods[index]=swap;
break;
}
return 0;
}
int GAME::GameInit()
{ if (game_prepare()) GameHalt(-1,"game init failed");
return 0;
}
int GAME::GameExit()
{ return game_exit();
}
int GAME::GameHalt(int code,char *message)
{ game_exit();
printf("%s\n",message);
exit(code);
return 0;
}
int GAME::GameStart()
{ int result,i,ok,j,choice;
int y_list[4],x_list[4];
char text[4][20]={"新的故事","旧的存档", "游戏介绍","退 出"};
char key_flag;
GameMovie();
world.color_change=1;
for (ok=0;ok==0;)
{ memset(pal,0,256*3);
lsetPal(pal);
if (voc.music!=0) voc.playmidi(0,1);
layer.active(0);
lClearSurface(&layer.layers[0],0);
lputBlock(0,0,title);
game_blit(-1,1);
lActiveSurface(NULL);
for (i=0;i<4;i++) {
x_list[i]=160-4*strlen(text[i]);
y_list[i]=171+i*18;
lsetColor(c_white);
if (i==0) lsetColor(c_yellow);
louttextxy(x_list[i],y_list[i],text[i]);
}
for (i=-63;i<1;i++) {
world.noop(game_delay/2);
laddPal(i,pal0,pal);
lsetPal(pal);
}
for (j=0,choice=0,key_flag=0;j==0;)
{ world.noop(game_delay);
if (choice<0) choice=0;
if (choice>3) choice=3;
for (i=0;i<4;i++) {
lsetColor(c_white);
if (i==choice) lsetColor(255);
louttextxy(x_list[i],y_list[i],text[i]);
}
if (!lKeyOn(KEY_UP)&&!lKeyOn(KEY_DOWN)&&!game_key(0)) key_flag=1;
if (key_flag&&lKeyOn(KEY_UP))
{ key_flag=0;
if (--choice<0) choice=0;
}
if (key_flag&&lKeyOn(KEY_DOWN))
{ key_flag=0;
if (++choice>3) choice=3;
}
if (key_flag&&game_key(0)) j=1;
}
lloadPal(pal);
voc.playdigi(2);
world.color_change=0;
for (i=0;i<30;i++) {
world.noop(game_delay/2);
ldecPal(1,pal);
ldecPal(1,pal);
lsetPal(pal);
} world.color_change=1;
game_reset_all(-1,-1,1,-1);
game_blit(1,1);
lsetPal(pal0);
switch (choice)
{ case 0: MovieNew(); world.START_GAME(-1); break;
case 1: i=SaveLoad(0,0);
if (i>=0) { voc.playdigi(2); world.START_GAME(i); }
break;
case 2: MovieAbout(); break;
case 3: ok=1; break;
}
}
return 0;
}
extern char *text_game_story[];
extern char *text_game_about[];
int GAME::GameControl()
{ static int key_free=0;
short i,j,k,ok;
short startx=80,starty=80;
short main_box=5;
short buy[10]={ 1,2,3,4,5,-1 };
short pos[16]={ 36,28, 36,46, 36,68, 36,90, 36,120 };
char *item[8]={ "读 取","存 档","故事简介","游戏关于","退出这里" };
char line[80];
if (!game_key(1)) {
key_free=1;
return 0;
}
if (!key_free) return 0;
key_free=0;
express.movie(0);
for (j=0,ok=0,k=0;ok==0;)
{ world.noop(game_delay);
if (game_key(0)==0&&game_key(1)==0) key_free=1;
if (key_free&&game_key(1)) key_free=0, ok=-1;
if (key_free&&game_key(0)) key_free=0, ok=1;
if (key_free&&lKeyOn(KEY_UP)) key_free=0, j=0;
if (key_free&&lKeyOn(KEY_DOWN)) key_free=0, j=1;
if (key_free&&lKeyOn(KEY_LEFT)) key_free=0, j=2;
if (key_free&&lKeyOn(KEY_RIGHT)) key_free=0, j=3;
express.scr_restore();
if (ok!=1) express.put_button(startx,starty,0,-1-j);
else { express.put_button(startx,starty,0,1+j);
game_blit(-1,1);
world.noop(game_delay*2);
express.scr_restore();
express.put_button(startx,starty,0,-1-j);
game_blit(-1,1);
world.noop(game_delay*4);
}
game_blit(-1,1);
}
key_free=0;
if (ok<0) return 0;
switch (j)
{ case 0: express.movie(2);
layer.active(0);
lsetColor(c_dark);
for (i=0;i<main_box;i++) {
if (i>0) pos[i*2+1]=pos[1]+i*22;
if (i==main_box-1) pos[i*2+1]=135;
lsetColor(c_dark);
lsetColor(c_dark);
louttextxy(pos[i*2]+express.main_bx,pos[i*2+1]+express.main_by,item[i]);
}
express.scr_save();
for (i=0,ok=0;ok==0;)
{ world.noop(game_delay);
if (game_key(0)==0&&game_key(1)==0&&
lKeyOn(KEY_UP)==0&&lKeyOn(KEY_DOWN)==0) key_free=1;
if (key_free&&lKeyOn(KEY_UP)) key_free=0, i--;
if (key_free&&lKeyOn(KEY_DOWN)) key_free=0, i++;
if (i<0) i=0; if (i>=main_box) i=main_box-1;
if (key_free&&game_key(0)) key_free=0, ok=1;
if (key_free&&game_key(1)) key_free=0, ok=-1;
express.scr_restore();
express.put_selector(pos[0]+express.main_bx+32,pos[i*2+1]+express.main_by-1,116);
game_blit(-1,1);
}
if (ok<0) break;
switch (i)
{ case 0: SaveLoad(0,1); break;
case 1: SaveLoad(1,1); break;
case 2: TellText(text_game_story); break;
case 3: TellText(text_game_about); break;
case 4: if (express.yes_no()) world.looping=0;
break;
}
break;
case 1: GameStatusView(); break;
case 2: break;
case 3: express.goods_choice(1,1); break;
}
key_free=0;
return 0;
}
int GAME::TellText(char *text[])
{ int x=(320-8*34)/2,y=20;
int key=0,texty=230,i,j,ok;
int cut_y1=y+20;
int cut_y2=y+6*34-20;
int line,endy;
layer.active(0);
lBlitFast(&layer.layers[0],0,240, 0,0,319,239,&layer.layers[0],0);
express.put_box(x,y+240,8,6);
for (i=0,line=0;text[i];i++,line++);
endy=-line*20+30;
for (ok=0,key=0;ok==0;texty--)
{ lBlitFast(&layer.layers[0],0,0, 0,240,319,479,&layer.layers[0],0);
for (i=0;text[i];i++) {
j=texty+i*20;
lsetColor(c_dark);
if (j<230) louttextxy(x+14,j,text[i]);
}
lBlitFast(&layer.layers[0],0,0, 0,240,319,240+cut_y1,&layer.layers[0],0);
lBlitFast(&layer.layers[0],0,cut_y2, 0,240+cut_y2,319,479,&layer.layers[0],0);
game_blit(-1,1);
world.noop(game_delay*3);
if (!game_key(0)) key=1;
if (key==1&&game_key(0)) ok=1;
if (texty<endy) ok=1;
}
layer.active(0);
return 0;
}
int GAME::SaveLoad(int save,int mode)
{ int i,ok,maxlevel,draw;
short x=24,y=130,k;
short len,wid;
char place[90];
char name[90];
char *text[10]={ "一","二","三","四","五","等 级:","记录位置:" };
int tx[10];
int ty[10];
int exist;
FILE *f;
layer.active(0);
express.put_box(x,y,8,3);
for (i=0;i<5;i++) tx[i]=x+30+i*32,ty[i]=y+24;
tx[5]=tx[6]=tx[0];
ty[7]=ty[5]=ty[0]+34;
ty[8]=ty[6]=ty[5]+17;
tx[7]=tx[8]=tx[5]+70;
lsetColor(c_dark);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -