📄 script.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 + -