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

📄 script.c

📁 GBA游戏程序
💻 C
字号:
//////////////////////////////////////////////////////////////////////////
#include "common.h" 
#include "story.h" 
#include "demo.h"
//#include "minigame.h"
//#include "gfx.h"
#include "script.h"
extern const u16 pal[256];
static u32 curScene,curFaceL,curFaceR;
u16 str,_loop,waitcntr;
u32 temp;
char dtxt1[23],dtxt2[23];
inline u16 getLen(char* s){
	u16 l=0;
	while (*s++) l++;
	l=l>>1;
	return l;
}  
void savedata(u32 title,u16 pos,LPGAMEDATA g);
void showdialog(char* s,u8 col,u16 sx,u16* box);
void wait4key();
//////////////////////////////////////////////////////////////////////////
//minigames
//////////////////////////////////////////////////////////////////////////
//funcs
void RunScript(u16 curCmd,unsigned long g){
	u16* _oamd=OAMDATA;
	u16 r,g,b,rgb;
	u16* buf;
	u16 cp[256];
	u8 bGrey=false;
	LPGAMEDATA curGamedata=(LPGAMEDATA)g;
	InitializeSprites();
	CopyOAM();
	for(_loop=0;_loop<64;_loop++) _oamd[_loop]=wait_gfx[_loop];	
	u16 p=curCmd;
	u32 cmd; 
	while(cmd=story[p++]){
		switch(cmd){
		case LOADSCENE:
			curScene=story[p++];
			BltTo(curScene,VRAM_BASE,0,0,240,120,0);
			BltTo(curFaceL,VRAM_BASE,0,112,40,48,0);
			BltTo(curFaceR,VRAM_BASE,200,112,40,48,0);break;
		case LEFTCHAR:
			curFaceL=story[p++]; if(!curFaceL) break;
			BltTo(curFaceL,VRAM_BASE,0,112,40,48,0);break;
		case RIGHTCHAR:
			curFaceR=story[p++]; if(!curFaceR) break;
			BltTo(curFaceR,VRAM_BASE,200,112,40,48,0);break;
		case ENDSCENE:
			curScene=story[p++];
			curFaceL=story[p++];
			curFaceR=story[p++];
			switch(story[p++]){
			case 0: clearPalette();break;
			case 1: DoScreenFadeOut();break;
			} 
			break;  
		case DLG_LEFT: 
		//	BltTo(dlgr_gfx,VRAM_BASE,40,120,160,40,0);
			BltTo(curFaceL,VRAM_BASE,0,112,40,48,0);
			if(curFaceR) BltTo(mask_gfx,VRAM_BASE,200,112,40,48,true);
			showdialog(stringtable[story[p++]],70,44,dlgr_gfx);break;
		case DLG_RIGHT:
		//	BltTo(dlgl_gfx,VRAM_BASE,40,120,160,40,0);
			BltTo(curFaceR,VRAM_BASE,200,112,40,48,0);
			if(curFaceL) BltTo(mask_gfx,VRAM_BASE,0,112,40,48,true);			
			showdialog(stringtable[story[p++]],48,60,dlgl_gfx);break;			
		case DLG_BOTH:
		//	BltTo(dlgb_gfx,VRAM_BASE,40,120,160,40,0);
			BltTo(curFaceR,VRAM_BASE,200,112,40,48,0);
			BltTo(curFaceL,VRAM_BASE,0,112,40,48,0);			
			showdialog(stringtable[story[p++]],120,52,dlgb_gfx);break;			
		case DLG_OFFSCR:
		//	BltTo(dlgn_gfx,VRAM_BASE,40,120,160,40,0);
			if(curFaceL) BltTo(mask_gfx,VRAM_BASE,0,112,40,48,true);			
			if(curFaceR) BltTo(mask_gfx,VRAM_BASE,200,112,40,48,true);			
			showdialog(stringtable[story[p++]],255,52,dlgn_gfx);break;			
		case BEGINSCENE:
			clearPalette();
			for(_loop=0;_loop<19200;_loop++) VRAM_BASE[_loop]=0xeaea;
			BltTo(curScene,VRAM_BASE,0,0,240,120,0);
			BltTo(curFaceL,VRAM_BASE,0,112,40,48,0);
			BltTo(curFaceR,VRAM_BASE,200,112,40,48,0);
			switch(story[p++]){
			case 0: setpallete(bGrey);break;
			case 1:
				if(bGrey){
				for(_loop=0;_loop<256;_loop++){
					getRGB(r,g,b,pal[_loop]);
					rgb=(r+g+b)/3;
					cp[_loop]=RGB(rgb,rgb,rgb);
				}
				DoScreenFadeIn(cp);break;}else{
					DoScreenFadeIn(pal);
				}
			} break;
		case MINIGAME:
			switch (story[p++]){
			case 1:  dstreet(); break;
			} 
			InitializeSprites();
			CopyOAM();
			for(_loop=0;_loop<64;_loop++) _oamd[_loop]=wait_gfx[_loop];	break; 
		case SAVEPOINT: savedata(story[p++],p,curGamedata);break;
		case SHOWTITLE:
			str=story[p++]; clearPalette();
			for(_loop=0;_loop<19200;_loop++) VRAM_BASE[_loop]=0;
			DrawText(stringtable[str],120-8*getLen(stringtable[str]),75,255);
			DoScreenFadeIn(pal); temp=0;
w:		UPDATA_INPUT();
		if(PRESS_ONCE(KEY_A)||temp++>200000){DoScreenFadeOut(); break;}
			goto w;
		case WAIT:
			WaitTime(0,story[p++]);break;
		case SHAKE:
			buf=malloc(240*160/2);
			for(_loop=0;_loop<19200;_loop++) buf[_loop]=VRAM_BASE[_loop];
			for(_loop=story[p++];_loop>0;_loop--){
				WaitTime(0,200);
				WaitVBlank();
				DMA_Copy(3,buf,VRAM_BASE+480,19200,DMA_16NOW);
				WaitTime(0,200);
				WaitVBlank();
				DMA_Copy(3,buf,VRAM_BASE,19200,DMA_16NOW);				
			}
			clearPalette();
			for(_loop=0;_loop<19200;_loop++)VRAM_BASE[_loop]=buf[_loop];
			setpallete(bGrey);
			free(buf);
			break;
		case GREY:
			bGrey=true;
			setpallete(bGrey);
			break;
		case COLOR:
			bGrey=false;
			setpallete(bGrey);
			break;
		default:
			DrawText("未知指令",120,80,50);
			savelong(0,p);
			break;
		} 
	}
} 
void showdialog(char* s,u8 col,u16 sx,u16* box){
	char* pos=s;
	u16 x,y;
	while (getLen(pos)>22){
		BltTo(box,VRAM_BASE,40,120,160,40,0);		
		for(_loop=0;_loop<22;_loop++) dtxt1[_loop]=*pos++; dtxt1[22]=0;
		for(_loop=0;_loop<22;_loop++) dtxt2[_loop]=*pos++; dtxt2[22]=0;
		DrawTextB(dtxt1,sx,128,col);
		DrawTextB(dtxt2,sx,142,col);
		wait4key();
	} 
	if(getLen(pos)>10){
		BltTo(box,VRAM_BASE,40,120,160,40,0);		
		for(_loop=0;_loop<22;_loop++) dtxt1[_loop]=*pos++; dtxt1[22]=0;
		for(_loop=0;_loop<22;_loop++) dtxt2[_loop]=*pos++;dtxt2[22]=0;
	//	for(;_loop<20;_loop+=2) {dtxt2[_loop]=161;dtxt2[_loop+1]=227;}dtxt2[20]=0;
		DrawTextB(dtxt1,sx,128,col);
		DrawTextB(dtxt2,sx,142,col);
		wait4key();
	}
	else{
		BltTo(box,VRAM_BASE,40,120,160,40,0);		
		for(_loop=0;_loop<22;_loop++) dtxt1[_loop]=*pos++; dtxt1[22]=0;
			DrawTextB(dtxt1,sx,128,col);
			wait4key();		  
	}
} 
void wait4key(){ 
	sprites[0].attribute0=COLOR_256| TALL | 154;
	sprites[0].attribute1=SIZE_8| 110;
	sprites[0].attribute2=512|PRIORITY(0);
	CopyOAM();
	waitcntr=0;
	u16	t=20; 
	UPDATA_INPUT();
	while(!PRESS_ONCE(KEY_A)){
		WaitVSync();
		waitcntr++;
		if(waitcntr%20) {t=-t;sprites[0].attribute0=COLOR_256|TALL| (174+t);}
		CopyOAM();
		UPDATA_INPUT();
	}
	sprites[0].attribute0=COLOR_256|TALL|190;
	CopyOAM();
}
void savedata(u32 title,u16 pos,LPGAMEDATA g){
	g->nSaveCount++;
	g->nPos=pos;
	g->title=title;
	savebyte(0,g->nSaveCount);
	saveshort(1,g->nPos);
	savelong(3,g->title);
	savelong(7,(unsigned long)g);
}

⌨️ 快捷键说明

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