#include #include "pad.h" #define SKYMAN 0x80100000 #define BACK 0x80103000 #define W_ADDR 0x80130000 #define CLOUD 0x80134000 #define STAR 0x80136000 #define BG_ADD 0x80137000 #define BG_DOWN 0x80158000 GsOT ot[2],stot[2]; GsOT_TAG ottag[2][1<<9]; PACKET pack[2][24*6000]; GsRVIEW2 view,second; GsF_LIGHT light; GsDOBJ2 skymo,muno,clo[10],sto[25]; GsCOORDINATE2 smanc,munc,clc[10],stc[25]; MATRIX tmpmat,tmpw; SVECTOR rot,srot; GsSPRITE back; GsFOGPARAM fog; static void init_model(GsCOORDINATE2 *objWorld,GsDOBJ2 *object,u_long *addr); static void init_view(); static void init_light(); static void init_play(); void init_back(); static void padproc(); static void animate(); void load_image(u_long addr); void play(); void title(); int ab,r=1,cd,vm=0,VS; u_long pad; static u_long oldpad; static int rots=0,zpos=ONE/2; main() { int o; SetVideoMode(MODE_PAL); for(o=0;o<2;o++){ ot[o].length=9; stot[o].length=9; ot[o].org=ottag[o]; stot[o].org=ottag[o]; } GsInitGraph(512,256,0|1,1,0); GsDefDispBuff(0,0,0,256); GsInit3D(); Init_Pad(); init_view(); init_light(); init_play(); init_back(); while(r!=0){ //printf("VS=%d\n",VS); ab=GsGetActiveBuff(); GsSetWorkBase((PACKET *)pack[ab]); GsClearOt(0,0,&ot[ab]); GsClearOt(0,0,&stot[ab]); switch(r){ case 1: title(); break; case 2: play(); break; } } return (0); } static void init_model(GsCOORDINATE2 *objWorld,GsDOBJ2 *object,u_long *addr) { addr++; GsMapModelingData(addr); GsInitCoordinate2(WORLD,objWorld); addr+=2; GsLinkObject4((u_long)addr,object,0); object->coord2=objWorld; object->attribute=(1<<9); } static void init_view() { GsSetProjection(600); view.vpx = 0; view.vpy = -18000; view.vpz = 50; view.vrx = 0; view.vry = 0; view.vrz = 0; view.rz = 0; view.super = &smanc; GsSetRefView2(&view); } static void init_light() { light.vx =120; light.vy = 100; light.vz = -100; light.r=light.g=light.b=255; GsSetFlatLight(0,&light); GsSetAmbient(ONE/4,ONE/4,ONE/4); GsSetLightMode(0); fog.dqa = -7500; fog.dqb = 1.25*4096*4096; fog.rfc =200; fog.gfc =200; fog.bfc =200; GsSetLightMode(1); GsSetFogParam(&fog); } static void init_play() { VECTOR scale; vm=0; load_image(BG_ADD); load_image(BG_DOWN); scale.vx=ONE*12; scale.vy=ONE*6;scale.vz=ONE*12; init_model(&smanc,&skymo,(u_long *)SKYMAN); init_model(&munc,&muno,(u_long *)W_ADDR); for(cd=0;cd<10;cd++){ init_model(&clc[cd],&clo[cd],(u_long *)CLOUD); clo[cd].attribute=(0<<9); } for(cd=0;cd<25;cd++){ init_model(&stc[cd],&sto[cd],(u_long *)STAR); sto[cd].attribute=(0<<9)+(1<<6); } skymo.attribute=(0<<9); smanc.coord.t[1]=-80000; ScaleMatrix(&munc.coord,&scale); muno.attribute=(3<<9)+(1<<6); clc[0].coord.t[0]=2000; clc[0].coord.t[1]=-55000;clc[0].coord.t[2]=-500; clc[1].coord.t[0]=1000; clc[1].coord.t[1]=-50000;clc[1].coord.t[2]=-250; clc[2].coord.t[0]=0; clc[2].coord.t[1]=-45000;clc[2].coord.t[2]=0; clc[3].coord.t[0]=-1000; clc[3].coord.t[1]=-35000;clc[3].coord.t[2]=250; clc[4].coord.t[0]=-2000; clc[4].coord.t[1]=-30000;clc[4].coord.t[2]=500; clc[5].coord.t[0]=-1500; clc[5].coord.t[1]=-25000;clc[5].coord.t[2]=-400; clc[6].coord.t[0]=-500; clc[6].coord.t[1]=-65000;clc[6].coord.t[2]=100; clc[7].coord.t[0]=500; clc[7].coord.t[1]=-55000;clc[7].coord.t[2]=-200; clc[8].coord.t[0]=1500; clc[8].coord.t[1]=-55000;clc[8].coord.t[2]=500; clc[9].coord.t[0]=-2000; clc[9].coord.t[1]=-35000;clc[9].coord.t[2]=-500; for(cd=0;cd<10;cd++)clc[cd].flg=0; srot.vx=ONE/4; stc[0].coord.t[0]=3000;stc[0].coord.t[1]=-60000;stc[0].coord.t[2]=5000; stc[1].coord.t[0]=1500; stc[1].coord.t[1]=-50000;stc[1].coord.t[2]=0; stc[2].coord.t[0]=0; stc[2].coord.t[1]=-45000;stc[2].coord.t[2]=-5000; stc[3].coord.t[0]=-1500; stc[3].coord.t[1]=-35000;stc[3].coord.t[2]=-3000; stc[4].coord.t[0]=-3000; stc[4].coord.t[1]=-30000;stc[4].coord.t[2]=3000; stc[5].coord.t[0]=5000; stc[5].coord.t[1]=-55000;stc[5].coord.t[2]=0; stc[6].coord.t[0]=2500; stc[6].coord.t[1]=-35000;stc[6].coord.t[2]=2500; stc[7].coord.t[0]=0; stc[7].coord.t[1]=-45000;stc[7].coord.t[2]=100; stc[8].coord.t[0]=-2500; stc[8].coord.t[1]=-60000;stc[8].coord.t[2]=-1000; stc[9].coord.t[0]=5000; stc[9].coord.t[1]=-38000;stc[9].coord.t[2]=1000; stc[10].coord.t[0]=-4500; stc[10].coord.t[1]=-49000;stc[10].coord.t[2]=500; stc[11].coord.t[0]=500; stc[11].coord.t[1]=-33000;stc[11].coord.t[2]=-1500; stc[12].coord.t[0]=-3500; stc[12].coord.t[1]=-22000;stc[12].coord.t[2]=1100; stc[13].coord.t[0]=4500; stc[13].coord.t[1]=-25000;stc[13].coord.t[2]=500; stc[14].coord.t[0]=2100; stc[14].coord.t[1]=-28000;stc[14].coord.t[2]=-1100; stc[15].coord.t[0]=0; stc[15].coord.t[1]=-19000;stc[16].coord.t[2]=3200; stc[16].coord.t[0]=-2100; stc[16].coord.t[1]=-13000;stc[17].coord.t[2]=200; stc[17].coord.t[0]=-4500; stc[17].coord.t[1]=-17000;stc[18].coord.t[2]=-3200; stc[18].coord.t[0]=5500; stc[18].coord.t[1]=-39000;stc[18].coord.t[2]=-1700; stc[19].coord.t[0]=2250; stc[19].coord.t[1]=-15000;stc[19].coord.t[2]=-200; stc[20].coord.t[0]=100; stc[20].coord.t[1]=-5000;stc[20].coord.t[2]=3000; stc[21].coord.t[0]=-2250; stc[21].coord.t[1]=-9000;stc[21].coord.t[2]=-300; stc[22].coord.t[0]=-5500; stc[22].coord.t[1]=-10000;stc[22].coord.t[2]=-3000; stc[23].coord.t[0]=3200; stc[23].coord.t[1]=-8500;stc[23].coord.t[2]=800; stc[24].coord.t[0]=1600; stc[24].coord.t[1]=-11500;stc[24].coord.t[2]=-800; for(cd=0;cd<25;cd++){ RotMatrix(&srot,&stc[cd].coord); stc[cd].flg=0; } munc.flg=0; smanc.flg=0; GsSetRefView2(&view); rot.vx=0; } static void padproc() { PadRead(); pad=GetPadInfo(PAD1); if(pad & PADR1){ if(oldpad!=pad)vm=0; } if(pad & PADL1){ if(oldpad!=pad)vm=1; } if(rot.vx<1024){ if(pad & PADLup){ rot.vx+=16; view.vpy-=100; } } if(rot.vx>0){ if(pad & PADLdown){ rot.vx-=16; view.vpy+=100; } } if(pad & PADLleft){ smanc.coord.t[0]+=20; if(rots<512)rots+=16; } else{ if(rots>0)rots-=16; } if(pad & PADLright){ smanc.coord.t[0]-=20; if(rots>-512)rots-=16; } else{ if(rots<0)rots+=16; } if(pad & PADselect)r=0; rot.vz=rots; oldpad=pad; } static void animate() { RotMatrix(&rot,&smanc.coord); if(smanc.coord.t[1]munc.coord.t[2])){ init_back(); r=1; } smanc.flg=0; view.vpx = smanc.coord.t[0]; view.vpy = smanc.coord.t[1]-4000; view.vpz = smanc.coord.t[2]+50; //srot.vx+=ONE/12; srot.vx+=ONE/12; //for(cd=0;cd<25;cd++)RotMatrix(&srot,&stc[cd].coord); if(smanc.coord.t[1]>-25000)vm=1; for(cd=0;cd<10;cd++){ clc[cd].coord.t[0]+=3; if(clc[cd].coord.t[0]>smanc.coord.t[0]+3000)clc[cd].coord.t[0]=smanc.coord.t[0]-3000; clc[cd].flg=0; } view.vrx = smanc.coord.t[0]; view.vry = smanc.coord.t[1]; view.vrz = smanc.coord.t[2]; view.rz = 0; view.super = WORLD; second.vpx=-1000;second.vpy=-25000;second.vpz=-5000; second.vrx=smanc.coord.t[0];second.vry=smanc.coord.t[1];second.vrz=smanc.coord.t[2]; second.rz=0; second.super=WORLD; } void load_image(u_long addr) { RECT rect; GsIMAGE img; GsGetTimInfo((u_long*)(addr+4),&img); rect.x=img.px; rect.y=img.py; rect.w=img.pw; rect.h=img.ph; LoadImage(&rect,img.pixel); if((img.pmode>>3)&0x01){ rect.x=img.cx; rect.y=img.cy; rect.w=img.cw; rect.h=img.ch; LoadImage(&rect,img.clut); } } void init_back() { zpos=ONE/2; load_image(BACK); back.attribute=(2<<24); back.x=back.y=0; back.w=back.h=256; back.tpage=GetTPage(2,0,512,0); back.mx=back.my=128; back.r=back.g=back.b=128; back.scalex=back.scaley=zpos; } void title() { if(zpos<(ONE+ONE))zpos+=16; if((zpos>(ONE+ONE/2))||(zpos==(ONE+ONE/2))){ init_play(); r=2; } back.scalex=zpos*1.6; back.scaley=zpos; GsSortSprite(&back,&ot[ab],0); DrawSync(0); VSync(-1); GsSwapDispBuff(); GsSortClear(0,0,55,&ot[ab]); GsDrawOt(&stot[ab]); GsDrawOt(&ot[ab]); } void play() { padproc(); animate(); if(vm==0)GsSetRefView2(&view); if(vm==1)GsSetRefView2(&second); for(cd=0;cd<10;cd++){ GsGetLws(clo[cd].coord2, &tmpw, &tmpmat); GsSetLightMatrix(&tmpw); GsSetLsMatrix(&tmpmat); GsSortObject4(&clo[cd],&ot[ab],5,(u_long*)getScratchAddr(0)); } /*for(cd=0;cd<25;cd++){ GsGetLws(sto[cd].coord2, &tmpw, &tmpmat); GsSetLightMatrix(&tmpw); GsSetLsMatrix(&tmpmat); GsSortObject4(&sto[cd],&stot[ab],5,(u_long*)getScratchAddr(0)); }*/ GsGetLws(muno.coord2, &tmpw, &tmpmat); GsSetLightMatrix(&tmpw); GsSetLsMatrix(&tmpmat); GsSortObject4(&muno,&ot[ab],5,(u_long*)getScratchAddr(0)); GsGetLws(skymo.coord2,&tmpw,&tmpmat); GsSetLightMatrix(&tmpw); GsSetLsMatrix(&tmpmat); GsSortObject4(&skymo,&ot[ab],5,(u_long*)getScratchAddr(0)); DrawSync(0); VSync(-5); GsSwapDispBuff(); GsSortClear(0,0,55,&ot[ab]); GsDrawOt(&ot[ab]); GsDrawOt(&stot[ab]); }