⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 轩辕2源代码.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -