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

📄 main.cpp

📁 一个RPG术语查询器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -