📄 gameio.cpp
字号:
#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 + -