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

📄 gameio.cpp

📁 轩辕2源代码.rar
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <dos.h>
//#include <lrtmsnd.h>

#include "ls.h"

short  LayerSizes[8]={ 320,480, 3200,2400, 1600,1200, 0,0 };
lenvironment    layer;
game_map        map;
RGB             pal0[256];
RGB             pal[256];
TACTOR          actor[MAX_ACTOR*2];
TVOC            voc;
TWORLD          world;
TEXPRESS        express;
char            msg[200]="ALL RIGHT";
RGB_MAP         rgb_map;
COLOR_MAP       color_map;
COLOR_MAP       light_map;
int             game_debug=0;
///////////////////////////////////////////////////////////////////////////
//     BASIC FUNCTIONS                                                   //
///////////////////////////////////////////////////////////////////////////
static int prepared=0;
static TlgSpiritLink *spirit_link[3]={ NULL, NULL, NULL };
short incx[4]={ 0, 0, -1, 1 }, incy[4]={ 1, -1, 0, 0 };
int   c_blue=90,c_red=25,c_green=202,c_white=13,c_dark=240,c_yellow=55;
int  map_sx;
int  map_sy;
int  game_delay=1193181/30;
void trans_counter(int c);
// int game_prepare()
// init the game
int game_prepare()
{ int i,j;
  char font[80],*p;
  extern int lm_volume_step;

  lm_volume_step=16;
  if (prepared) return 0;
  lt_install_timer();
  for (i=0,j=0;LayerSizes[i*2];i++)
      j+=layer.create(i,LayerSizes[i*2],LayerSizes[i*2+1]);
  if (j) {
    printf("Init surfaces error '%s'\n",lsys_message);
    return -1;
  } p=new char[4L*1024L*1024L];
  if (!p) {
    for (i=0;i<LMAX_LAYERS;i++) layer.destroy(i);
    printf("Not enough memory, you need 20MB\n");
    return -2;
  } delete p;
  lloadPal(pal0);
  for (i=0;i>-60;i--) {
    world.noop(game_delay*2/3);
    laddPal(i,pal0,pal);
    lsetPal(pal);
  }
  if (!lInitGraph(SVGA_VESA320X240)) {
     lCloseGraph();
     lInitGraph(SVGA_MODEX320X240);
  }
  lpDefaultPal(0);
  lloadPal(pal0);
  voc.init();
  layer.set_blitport(0,0,319,239,1,2);
  layer.set_blitport(0,0,319,239,0,0);
  layer.datas[0].key_color=0;
  layer.datas[1].key_color=0;
  layer.datas[2].key_color=0;
  layer.datas[0].x=0;
  layer.datas[1].y=0;
  game_getfname(NAME_FONT,0,font);
  lChineseLoad(font);
  if (world.map_loadpic()) return -3;
  lkInitKey();
  lk_emu_old9(1);
  game_clear_map();
  express.syspic_load();
  layer.active(0);
  lpCreateRgbTable(&rgb_map,pal0,trans_counter);
  lpCreateTransTable(&color_map,pal0,128,128,128,trans_counter);
  lpCreateLightTable(&light_map,pal0, 0,0,0,trans_counter);
  prepared=1;
  return 0;
}
void trans_counter(int c)
{ static int counter=1;
  int i,j,p;
  char line[20];
  lsetColor(c_white);
  lbar(0,0,200,9);
  lsetColor(c_blue);
  p=(counter++)*100/768;
  sprintf(line,"COLOR %d%%",p);
  louttextxy(50-strlen(line)*4,5,line);
  for (j=0;j<10;j++) for (i=0;i<p;i++) {
    if (lrpixel(i,j)==c_blue) c=c_white;
      else c=c_blue;
    lpixel(i,j,c);
  }
  lOutToScr(&layer.layers[0],0,0, 0,0,99,9);
  if (p==100) {
     delay(500);
     lClearSurface(&layer.layers[0],0);
     layer.blit_to_scr(0);
     delay(700);
  }
}
// close the game
int game_exit()
{ int i;
  if (!prepared) return 0;
  for (i=0;i<MAX_ACTOR;i++) actor[i].reset();
  express.syspic_free();
  lChineseUnLoad();
  lCloseGraph();
  lkRestKey();
  voc.rest();
  for (i=0;i<3;i++) layer.destroy(i);
  lt_remove_timer();
  prepared=0;
  return 0;
}
int game_reset_all(int _actor,int _map,int _layer,int _world)
{ int i;
  if (_actor>0) for (i=0;i<MAX_ACTOR;i++) actor[i].reset();
  if (_map>0) game_clear_map();
  if (_layer>0) {
     for (i=0;i<3;i++) {
       lClearSurface(&layer.layers[i],0);
       layer.datas[i].x=0;
       layer.datas[i].y=0;
     }
     layer.active(0);
  }
  if (_world>0) world.RESET();
  return 0;
}
TVOC::TVOC()
{ inst[0]=1;
  inst[1]=0;
  midi=NULL;
}
int TVOC::init()
{ int i,size;
  char name[80];
  FILE *f;
  if (game_debug) {
     f=fopen("LS.TXT","w");
     fclose(f);
  }
  if (inst[1]==1) inst[1]=(lk_sb_init(-1,-1,-1)==0)? 1 : 0;
  //if (inst[1]==2) inst[1]=(lrtm_init_digi())? 2 : 0;
  if (inst[0]) inst[0]=lmMidiInit(MIDI_ADLIB);
  lsSetMixer(255,255);
  music=-1;
  for (i=0;i<400;i++) debug_msg[i]=NULL;
  debug_p=0;
  for (i=0;i<MAX_SOUND;i++) {
    sound[i].data=NULL;
    game_getfname(NAME_WAVE,i,name);
    f=fopen(name,"rb");
    if (f) {
      fseek(f,0,SEEK_END);
      size=ftell(f);
      fseek(f,0,SEEK_SET);
      sound[i].data=new char[size];
      if (sound[i].data) {
         fseek(f,27,SEEK_SET);
         fread(sound[i].data,size-27,1,f);
         sound[i].len=size-27;
         sound[i].sample=11000;
      }
      fclose(f);
    }
  }
  return inst[0]+inst[1];
}
int TVOC::rest()
{ int i;
  if (inst[0]) lmMidiRest();
  if (inst[1]==1) lk_sb_rest();
  //if (inst[1]==2) lrtm_close_digi();
  for (i=0;i<MAX_SOUND;i++) {
      if (sound[i].data) delete sound[i].data;
      sound[i].data=NULL;
  }
  if (midi) lmDestroyMidi(midi);
  midi=NULL;
  return 0;
}
int TVOC::update()
{ //if (inst[1]==2) lrtm_update_sound();
  return 0;
}
TVOC::~TVOC()
{ int i;
  rest();
  for (i=0;i<400;i++)
    if (debug_msg[i]) delete debug_msg[i];
}
int TVOC::regist_msg(char *fmt,...)
{ static char line[600];
  FILE *f;
  va_list argptr;
  va_start(argptr,fmt);
  vsprintf(line,fmt,argptr);
  va_end(argptr);

  if (game_debug) {
    if (debug_p>0) f=fopen("ls.txt","a");
       else f=fopen("ls.txt","w");
    fprintf(f,"(%d) %s\n",debug_p,line);
    fclose(f);
  }
  if (debug_p>=400) return -1;
  debug_msg[debug_p]=new char [strlen(line)+2];
  strcpy(debug_msg[debug_p],line);
  debug_p++;
  return 0;
}
char *TVOC::get_msg(int i)
{ if (i<0||i>=debug_p) return NULL;
  return debug_msg[i];
}
int TVOC::playmidi(int song,int loop)
{ static char name[100];

  if (!inst[0]||song<0||song>100) {
     music=song;
     return -1;
  }
  game_getfname(NAME_MIDI,song,name);
  lmStopMidi();
  if (midi) lmDestroyMidi(midi);
  midi=lmLoadMidi(name,0);
  strcpy(msg,"PLAYING MIDI");
  if (midi) { lmMidiPlay(midi,loop); music=song; }
     else {
     	sprintf(msg,"CAN NOT LOAD %s",name);
     	regist_msg("%s",msg);
     }
  return 0;
}
int TVOC::stopmidi()
{ music=-1;
  if (!inst[0]) return -1;
  lmStopMidi();
  if (midi) lmDestroyMidi(midi);
  midi=NULL;
  return 0;
}
int TVOC::playdigi(int index)
{ if (index<0||index>=MAX_SOUND||inst[1]==0) return -1;
  if (sound[index].data==NULL) return -2;
  if (inst[1]==1) lk_sb_play(sound[index].data,sound[index].len,sound[index].sample);
  //if (inst[1]==2) lrtm_play_sample(sound[index].data,sound[index].len,1,255,sound[index].sample);
  return 0;
}
int TVOC::volume(int midivol,int digivol)
{ if (midivol>=0) ls_set_volume(-1,midivol);
  if (digivol>=0);
  return 0;
}
// TACTOR::load_dat(int id)
// load the actor data from a ixt file
int TACTOR::load_dat(int id_num)
{ char fname[80],*p,line[80];
  int  lencount,widcount,key_color=0,i,j,t;
  short len,wid,plen,pwid,mem=1,event=0;
  LSURFACE surface;
  static Tline fline;

  if (reset()) { strcpy(msg,"can not reset actor"); return -3; }
  game_getfname(NAME_ACTOR,id_num,fname);
  if (!fline.OpenFile(fname)) return -1;
  while (event==0)
   { if (!fline.GetLine(1)) event=-1;
     if (strcmp(fline.Word[0],"ACTOR")==0&&event==0)
        if (atoi(fline.Word[1])==id_num) event=1;
   }
  if (event!=1) {
     sprintf(msg,"NOT FIND ACTOR %d",id_num);
     fline.CloseFile();
     return -1;
  }
  for (event=1;event==1&&fline.GetLine(0);)
   { fline.CharacterCase(fline.Word[0],1);
     if (strcmp(fline.Word[0],"NAME")==0) fline.GetString(name,2);
     else if (strcmp(fline.Word[0],"PIC")==0)
      { game_getfname(NAME_ACTORPIC,atoi(fline.Word[2]),fname);
        p=lrPicFile(fname,0,NULL);
        if (p&&fline.WordCount>=7) {
           lencount=atoi(fline.Word[4]);
           widcount=atoi(fline.Word[6]);
           if (strcmp(fline.Word[8],"STARTPIXEL")==0) key_color=p[4];
           lgetSize(&len,&wid,p);
           lCreateSurface(len,wid,&surface,p+4,LSM_SHADOW);
           lActiveSurface(&surface);
           plen=len/lencount; pwid=wid/widcount;
           t=len*wid; for (i=0;i<t;i++) if (p[4+i]==key_color) p[4+i]=0;
           for (j=0,t=0,mem=1;j<widcount;j++) for (i=0;i<lencount;i++,t++) {
             pics[t]=new char[plen*pwid+8];
             if (pics[t]) lgetBlock(i*plen,j*pwid,(i+1)*plen-1,(j+1)*pwid-1,pics[t]);
             if (pics[t]) lsetHotXY(plen/2,pwid-1,pics[t]);
             else mem=0,event=-1;
           }
           lActiveSurface(NULL);
           lDeleteSurface(&surface);
           delete p;
        }  else event=-3;
      } else if (strcmp(fline.Word[0],"ATTRIBUTE")==0) {
          if ((fline.WordCount-2)%4==0) {
            for (i=2;i<fline.WordCount;i+=4) {
              fline.CharacterCase(fline.Word[i+1],1);
              if (strcmp(fline.Word[i+1],"MAXHP")==0) maxhp=atoi(fline.Word[i+2]);
              else if (strcmp(fline.Word[i+1],"MAXMP")==0) maxmp=atoi(fline.Word[i+2]);
              else if (strcmp(fline.Word[i+1],"AT")==0) at=atoi(fline.Word[i+2]);
              else if (strcmp(fline.Word[i+1],"DF")==0) df=atoi(fline.Word[i+2]);
              else if (strcmp(fline.Word[i+1],"SMART")==0) smart=atoi(fline.Word[i+2]);
            }
          } else event=-2;
      } else if (strcmp(fline.Word[0],"END")==0) event=0;
   }
  fline.CloseFile();
  switch (event)
   { case  0: strcpy(msg,"ALL RIGHT LOAD DATA"); id=id_num; break;
     case  1: strcpy(msg,"NOT FIND 'END'"); break;
     case -1: if (mem==0) strcpy(msg,"NO MEMORY FOR ACTOR PICS");
              if (mem==1) strcpy(msg,"Memory error");
              break;
     case -2: strcpy(msg,"BAD COMMAND IN THE 'ATTRIBUTE' LINE"); break;
     case -3: sprintf(msg,"ERROR OPEN PICTURE FILE %s",fname); break;
   }
  if (event) voc.regist_msg("%s",msg);
  return event;
}
TACTOR::TACTOR()
{ int i;
  for (i=0;i<30;i++) pics[i]=NULL;
  id=-1;
  reset();
}
int TACTOR::reset()
{ int i;
  for (i=0;i<30;i++) if (pics[i]) delete pics[i];
  for (i=0;i<30;i++) pics[i]=NULL;
  strcpy(name,"NONAME");
  if (id>=0)
    if (x>=0&&y>=0&&x<LMAP_MAX_LEN&&y<LMAP_MAX_WID) map.actor[x][y]=-1;
  id=-1;
  towards=0;
  command=ACTOR_WAITING;
  status=0;
  act_mode=0;
  x=y=0; wx=wy=0;
  walk_pic=0;
  move_data[0]=0;
  move_data[1]=SOUTH;
  maxhp=maxmp=at=df=0;
  hp=mp=smart=0;
  event_near=-1;
  event_callf=-1;
  event_calln=-1;
  act_speed=3;
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -