📄 main.cpp
字号:
clear_bitmap(vidbuffer[page_num]);
if(editortoggle==0) DrawGame(camera.x,camera.y,dirtytiles,FastTile);
else DrawEditor(camera.x,camera.y,dirtytiles,FastTile);
DrawObjects(camera.x,camera.y,FastTile, editortoggle);
if(scenario_loaded > oframes) DrawScenarioTitle();
if(osynchframes>count)
{
ofps = oframes - olast;
olast = oframes;
fps=frames;
frames=0;
count=osynchframes+60;
}
char tehframe[256];
sprintf(tehframe,"ENTITIES %i FPS",ofps);
PrintMessageText(tehframe,0,464,1);
sprintf(tehframe,"Rendering %i FPS",fps);
PrintMessageText(tehframe,0,472,1);
RenderBox();
if(editortoggle) Editor();
release_bitmap(vidbuffer[page_num]);
if(gravyhack==0)
{
//JOONARBEEN WAS HERE
if(vertsync==1)
{
show_video_bitmap(vidbuffer[page_num]);
page_num = 1-page_num;
}
else blit(vidbuffer[page_num],screen,0,0,0,0,SCREEN_W,SCREEN_H);
}
else
{
blit(vidbuffer[page_num],screen,0,0,0,0,640,480);
if(vertsync==1) vsync();
}
//MessageBox(NULL,"Frame Drawn","Frame Drawn",MB_OK);
++frames;
if(fps>50) yield_timeslice();
}
struct YSORTER
{
int y;
int ohandle;
};
int compare (const void * a, const void * b)
{
return ((YSORTER*)a)->y - ((YSORTER*)b)->y;
}
void DrawObjects(int x, int y, BITMAP *MyTiles, int editortoggle)
{
int dtilex=x/32,dtiley=y/32;
int drawy,drawx;
int til,til2;
int ttil,ttil2,ttil3;
int odrawx;
int odrawy;
int drawlayer1,drawlayer2,drawlayer3;
int testobj;
int offsetx=-(x&31),blahy=-(y&31);
int startx,sy,ex,ey;
int jigx,jigy;
int sorter;
YSORTER sorted[objectmax];
for(sorter=0;sorter<objectmax;++sorter)
{
sorted[sorter].y = OBJECTS[sorter].y;
sorted[sorter].ohandle = sorter;
}
qsort (sorted, objectmax, sizeof(YSORTER), compare);
for(sorter=0;sorter<objectmax;++sorter)
{
testobj = sorted[sorter].ohandle;
if(OBJECTS[testobj].operational==1)
{
drawx=(OBJECTS[testobj].x-camera.x);
drawy=(OBJECTS[testobj].y-camera.y);
if (OBJECTS[testobj].spr>-1) masked_blit(FastObject[OBJECTS[testobj].spr], vidbuffer[page_num], 64*(OBJECTS[testobj].steps/16&3),OBJECTS[testobj].face*64,drawx-32,drawy-48,64,64);
else masked_blit(FastTile, vidbuffer[page_num], (-OBJECTS[testobj].spr&15)<<5, ((-OBJECTS[testobj].spr)/16)<<5,drawx-16,drawy-16, 32, 32);
if(editortoggle)
{
char buf[15];
rect(vidbuffer[page_num], drawx-OBJECTS[testobj].sizex,drawy-OBJECTS[testobj].sizey, drawx+OBJECTS[testobj].sizex,drawy+OBJECTS[testobj].sizey, 0xFFFFFF);
sprintf(buf,"%i",testobj);
PrintMessageText(buf,drawx,drawy,1);
sprintf(buf,"x1:%i y1:%i",OBJECTS[testobj].x-OBJECTS[testobj].sizex,OBJECTS[testobj].y-OBJECTS[testobj].sizey);
PrintMessageText(buf,drawx,drawy+8,1);
sprintf(buf,"x2:%i y2:%i",OBJECTS[testobj].x+OBJECTS[testobj].sizex,OBJECTS[testobj].y+OBJECTS[testobj].sizey);
PrintMessageText(buf,drawx,drawy+16,1);
}
startx=(OBJECTS[testobj].x-31)/32;
sy=(OBJECTS[testobj].y-63)/32;
ex=(OBJECTS[testobj].x+63)/32;
ey=(OBJECTS[testobj].y+31)/32;
for(til=sy;til<=ey;til++)
{
for(til2=startx;til2<=ex;til2++)
{
drawlayer1=map.map[til][til2];
drawlayer2=drawlayer1&255;
if(tileanimation[drawlayer2].frames != -1) ttil3+=(oframes >> tileanimation[drawlayer2].delayframes) & tileanimation[drawlayer2].frames;
drawlayer3=drawlayer2&15;
ttil=map.map2[til][til2];
ttil3=ttil&255;
if(tileanimation[ttil3].frames != -1) ttil3+=(oframes >> tileanimation[ttil3].delayframes) & tileanimation[ttil3].frames;
ttil2=ttil3&15;
if(drawlayer1>512)
{
masked_blit(FastTile, vidbuffer[page_num], drawlayer3*32, (drawlayer2/16)*32,offsetx+((til2-dtilex)*32),blahy+((til-dtiley)*32), 32, 32);
if (ttil>512) masked_blit(FastTile, vidbuffer[page_num], ttil2*32, (ttil3/16)*32,offsetx+((til2-dtilex)*32),blahy+((til-dtiley)*32), 32, 32);
}
if(ttil>512)
{
if (ttil>0 && ttil>512) masked_blit(FastTile, vidbuffer[page_num], ttil2*32, (ttil3/16)*32,offsetx+((til2-dtilex)*32),blahy+((til-dtiley)*32), 32, 32);
}
}
}
}
}
for(testobj=0;testobj<objectmax;++testobj)
{
drawx=(OBJECTS[testobj].x-camera.x);
drawy=(OBJECTS[testobj].y-camera.y);
if (OBJECTS[testobj].mutterdelay>-1 && OBJECTS[testobj].operational!=0)
{
if(OBJECTS[testobj].mutter!=NULL && textbox.status==0)
{
if(OBJECTS[testobj].spr>-1) PrintMessageText(OBJECTS[testobj].mutter,drawx + 16 - strlen(OBJECTS[testobj].mutter)*4,drawy-48,1);
else PrintMessageText(OBJECTS[testobj].mutter,drawx + 16 - strlen(OBJECTS[testobj].mutter)*4,drawy-24,1);
}
}
}
}
void DrawGame(int x,int y, BITMAP *Vbuffer,BITMAP *MyTiles)
{
int dtilex=x/32,dtiley=y/32;
int drawy,drawx;
int fx,fy;
int til,til2,til3;
int ttil,ttil2,ttil3;
for(drawy=0;drawy<16;++drawy)
{
for(drawx=0;drawx<21;++drawx)
{
fy=drawy+dtiley;
fx=drawx+dtilex;
til=map.map[fy][fx] & 255;
if(tileanimation[til].frames != -1)
til+=(oframes >> tileanimation[til].delayframes) & tileanimation[til].frames;
til3=map.map[fy][fx];
ttil3=map.map2[fy][fx] & 255;
if(tileanimation[ttil3].frames != -1) ttil3+=(oframes >> tileanimation[ttil3].delayframes) & tileanimation[ttil3].frames;
ttil=map.map2[fy][fx];
til2=til&15;
ttil2=ttil3&15;
if (til!=drawn[drawx][drawy] || ttil3!=drawn2[drawx][drawy])
{
fx=drawx<<5;
fy=drawy<<5;
if((til3<512 && ttil>512) || (til3<512 && ttil<512) || (til3>512 && ttil>512))
{
blit(MyTiles, Vbuffer, (til2)<<5, (til/16)<<5,fx,fy, 32, 32);
if (ttil>0 || ttil>512) masked_blit(MyTiles, Vbuffer, (ttil2)<<5, (ttil3/16)<<5,fx,fy, 32, 32);
drawn2[drawx][drawy]=ttil3;
drawn[drawx][drawy]=til;
}
if(til3>512 && ttil<512)
{
blit(MyTiles, Vbuffer, (ttil2)<<5, (ttil3/16)<<5,fx,fy, 32, 32);
masked_blit(MyTiles, Vbuffer, (til2)<<5, (til/16)<<5,fx,fy, 32, 32);
drawn2[drawx][drawy]=ttil3;
drawn[drawx][drawy]=til;
}
}
}
}
int blitx=(camera.x&31);
int blity=(camera.y&31);
blit(Vbuffer,vidbuffer[page_num],blitx,blity,0,0,640,480);
}
void DrawEditor(int x,int y, BITMAP *Vbuffer,BITMAP *MyTiles)
{
int dtilex=x/32,dtiley=y/32;
int drawy,drawx;
int fx,fy;
int til,til2,til3;
int ttil,ttil2;
for(drawy=0;drawy<16;++drawy)
{
for(drawx=0;drawx<21;++drawx)
{
fy=drawy+dtiley;
fx=drawx+dtilex;
til=map.map[fy][fx];
til3=til&255;
ttil=map.map2[fy][fx]&255;
if(tileanimation[til3].frames != -1) til3+=(oframes >> tileanimation[til3].delayframes) & tileanimation[til].frames;
til2=til3&15;
ttil2=ttil&15;
if (til!=drawn[drawx][drawy] || ttil!=drawn2[drawx][drawy])
{
fx=drawx*32;
fy=drawy*32;
if (drawlayer[0]==1)
{
blit(MyTiles, Vbuffer, til2*32, (til3/16)*32,fx,fy, 32, 32);
}
else
{
rectfill(Vbuffer, fx, fy, fx+31, fy+31, 0);
}
if((til>255 && til<512) || til>767)
{
if (drawlayer[0]==1) masked_blit(SolidTile, Vbuffer, 0, 0,fx,fy, 32, 32);
}
if (drawlayer[1]==1 && ttil>0) masked_blit(MyTiles, Vbuffer, ttil2*32, (ttil/16)*32,fx,fy, 32, 32);
drawn2[drawx][drawy]=ttil;
drawn[drawx][drawy]=til;
}
}
}
int blitx=(camera.x&31);
int blity=(camera.y&31);
blit(Vbuffer,vidbuffer[page_num],blitx,blity,0,0,640,480);
}
void AddObject(char *name, int handle, char *sprite, int shandle, char *binary, int sx, int sy, int px, int py)
{
char loader[256];
int spritehandle = handle;
if(sprite!=NULL)
{
sprintf(loader,"objects/images/%s",sprite);
BITMAP *mytest3;
mytest3=load_bmp(loader,pal);
blit(mytest3,FastObject[handle],0,0,0,0,384,384);
destroy_bitmap(mytest3);
}
else spritehandle = shandle;
sprintf(loader,"objects/%s",binary);
OBJECTS[handle].SetVM(name,loader,OBJECTS,objectmax);
OBJECTS[handle].SetExecutionRate(100000,100);
OBJECTS[handle].SetData(px,py,spritehandle,handle, sx, sy);
OBJECTS[handle].SetEnvironment(&map);
OBJECTS[handle].api.install("killself",killself);
OBJECTS[handle].api.install("scenario",api_scenario);
OBJECTS[handle].api.install("getkey",getkey);
OBJECTS[handle].api.install("move",move);
OBJECTS[handle].api.install("random",random);
OBJECTS[handle].api.install("installmessage",installmessage);
OBJECTS[handle].api.install("mutter",mutter);
OBJECTS[handle].api.install("say",say);
OBJECTS[handle].api.install("playwav",playwav);
OBJECTS[handle].api.install("talk",talk);
OBJECTS[handle].api.install("ENDOFSEARCH",api_empty);
}
void SignalScenario(char *pscenario,int warpx, int warpy)
{
swapper.swapnow = 1;
strcpy(swapper.name,pscenario);
swapper.warpx = warpx;
swapper.warpy = warpy;
}
void flush_scenario()
{
char mad_deleter[31337];
int deleteobjects;
gamelog.write("Destroying object surfaces...");
for( deleteobjects = 0 ; deleteobjects < objectmax ; ++deleteobjects )
{
destroy_bitmap( FastObject[deleteobjects] );
OBJECTS[deleteobjects].audio.end();
}
delete[] OBJECTS;
delete[] FastObject;
sprintf(mad_deleter,"Flushing %s scenario...",current_physical_scenario);
gamelog.write(mad_deleter);
gamelog.write("Writing map...");
sprintf(mad_deleter,"autosave/%s/%s.map",current_physical_scenario,current_physical_scenario);
gamelog.write(mad_deleter);
PACKFILE *mapload;
mapload = pack_fopen(mad_deleter, "w" );
if(mapload!=NULL)
{
for(int i=0;i<90;++i)
{
for(int j=0;j<90;++j)
{
pack_iputl((long)map.map[j][i], mapload);
pack_iputl((long)map.map2[j][i], mapload);
}
}
pack_fclose( mapload );
}
else
{
// MessageBox(win_get_window(),"Error opening map to write scenario//secret//secret.map","OMG ERROR",MB_OK);
}
if(ffover!=NULL) destroy_midi( ffover );
scenario_loaded = 0;
}
void LoadScenario(char *scenario)
{
map.scale=32;
map.sizex=90;
map.sizey=90;
objectfocus= 0;
textbox.status=0;
count=osynchframes;
syncedtimer=osynchframes;
currmousez=0;
currtile=0;
int framedat;
for(framedat=0;framedat<256;framedat++)
{
tileanimation[framedat].frames=-1;
tileanimation[framedat].delayframes=0;
}
GRPGLOG object_log;
gamelog.write("Setting up map...");
int x,y;
for(y=0;y<16;y++)
{
for(x=0;x<21;x++)
{
drawn[x][y]=-1;
drawn2[x][y]=-1;
}
}
gamelog.write("Done!");
char fileloading[256];
sprintf(fileloading,"scenario/%s/%s.bmp",scenario,scenario);
BITMAP *scenario_tiles=load_bmp(fileloading,NULL);
if(scenario_tiles!=NULL)
{
blit(scenario_tiles,FastTile,0,0,0,0,512,512);
destroy_bitmap(scenario_tiles);
}
PACKFILE *mapload;
sprintf(fileloading,"scenario/%s/%s.map",scenario,scenario);
mapload = pack_fopen( fileloading , "r" );
if(mapload!=NULL)
{
for(int i=0;i<90;++i)
{
for(int j=0;j<90;++j)
{
map.map[j][i] = (int)pack_igetl(mapload);
map.map2[j][i] = (int)pack_igetl(mapload);
}
}
pack_fclose( mapload );
}
else
{
// MessageBox(win_get_window(),"Error opening map to write scenario//secret//secret.map","OMG ERROR",MB_OK);
}
sprintf(fileloading,"scenario/%s/%s.mid",scenario,scenario);
ffover=load_midi(fileloading);
if(ffover!=NULL) play_midi(ffover, 1);
for(x=208;x<253;x+=4)
{
tileanimation[x].frames=3;
tileanimation[x].delayframes=3; //Effective divide by 8
}
char ibuffer[65536];
char obuffer[65536];
std::ifstream scenario_def;
std::ifstream scenario_prep;
objectmax=0;
object_log.start("object.log");
sprintf(fileloading,"scenario/%s/%s.def",scenario,scenario);
scenario_prep.open(fileloading);
if(scenario_prep)
{
while(scenario_prep.eof()!=1)
{
scenario_prep.getline(ibuffer,65536);
++objectmax;
}
scenario_prep.close();
}
if(objectmax>0)
{
OBJECTS = new ENTITY[objectmax];
BITMAP **Test = new BITMAP*[objectmax];
FastObject=Test;
for(int i=0;i<objectmax;++i)
{
if(gravyhack == 0)
{
FastObject[i]=create_video_bitmap(384,384);
if(FastObject[i]==NULL) FastObject[i]=create_system_bitmap(384,384);
}
else FastObject[i]=create_system_bitmap(384,384);
}
sprintf(fileloading,"scenario/%s/%s.def",scenario,scenario);
scenario_def.open(fileloading);
if(scenario_def)
{
scenario_def.getline(ibuffer,65536);
strcpy(current_scenario,ibuffer);
while(scenario_def.eof()!=1)
{
scenario_def.getline(ibuffer,65536);
object_log.write(ibuffer);
if(database.query(ibuffer,obuffer,65536)!=1337)
{
gamelog.write("Object Fail!");
}
}
scenario_def.close();
}
sprintf(ibuffer,"Objects %i", objectmax);
object_log.write(ibuffer);
object_log.end();
}
camera.x=OBJECTS[objectfocus].x-304;
camera.y=OBJECTS[objectfocus].y-224;
if (camera.x>2208) camera.x=2208;
if (camera.y>2368) camera.y=2368;
if (camera.x<0) camera.x=0;
if (camera.y<0) camera.y=0;
strcpy(current_physical_scenario,scenario);
scenario_loaded = oframes + 400;
//JOONARBEEN WAS HERE
}
int main(int argc, char *argv[])
{
//comment this out? :D
fullscreen=1;
if(argc>1)
{
while(argc>1)
{
if(argv[argc-1]!=NULL)
{
//gamelog.write(argv[1]);
if(strcmp(argv[argc-1],"-w")==0) fullscreen=0;
if(strcmp(argv[argc-1],"-v")==0) vertsync=1;
}
--argc;
}
}
int AllegroInitFlag = allegro_init();
gamelog.start("grpg.log");
gamelog.write("gRPG gamelog, I hope this works!");
gamelog.write("============================");
gamelog.write("Trying to start timer...");
install_timer();
gamelog.write("Timer Started!");
gamelog.write("Initializing surfaces and sound...");
InitGame();
gamelog.write("Initializing Done!");
gamelog.write("Trying to lock gRPG synch timer...");
LOCK_VARIABLE(synchobjects);
LOCK_FUNCTION(syncher);
install_int_ex(syncher, BPS_TO_TIMER(60));
gamelog.write("Locked!");
//SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS);
gamelog.write("Loading scenario...");
LoadScenario( "secret");
gamelog.write("Loaded! Setup is done, let's hope we don't crash!");
do
{
MainGameLoop();
} while( key[KEY_ESC] == 0 && DIE==0);
CleanUp();
return 0;
}
END_OF_MAIN()
//omgrofl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -