?? smbfunc.c
字號(hào):
{
if (keybuf[KEY_DOWN])
{
x_rect_fill(108,129,117,137,VisiblePageOffs,BACKGROUND);
numplayers=2;
}
if (keybuf[KEY_UP])
{
x_rect_fill(108,145,117,153,VisiblePageOffs,BACKGROUND);
numplayers=1;
}
if (numplayers==1)
offset=129;
else
offset=145;
x_line(110,offset,113,offset,21,VisiblePageOffs);
x_line(109,offset+1,114,offset+1,21,VisiblePageOffs);
x_line(109,offset+2,114,offset+2,21,VisiblePageOffs);
x_line(108,offset+3,115,offset+3,21,VisiblePageOffs);
x_line(108,offset+4,115,offset+4,21,VisiblePageOffs);
x_line(108,offset+5,115,offset+5,21,VisiblePageOffs);
x_put_pix(109,offset+6,VisiblePageOffs,21);
x_put_pix(114,offset+6,VisiblePageOffs,21);
x_line(110,offset+6,113,offset+6,20,VisiblePageOffs);
x_line(110,offset+7,113,offset+7,20,VisiblePageOffs);
}
return(numplayers);
}
//CHANGE COLORS FOR MARIO OR LUIGI///////////////////////////////////////////
void setcolors()
{
if (curplay==0)
{
setpalette(1,data.marioc[0]);
setpalette(2,data.marioc[1]);
}
else
{
setpalette(1,data.luigic[0]);
setpalette(2,data.luigic[1]);
}
}
void rotatepal(int *palloopp, colorpal *tempcp)
{
int palloop=*palloopp;
colorpal tempc=*tempcp;
int loop;
if (palloop>=16 && palloop%4==0)
{
if (palloop<=24)
{
tempc=data.palette[20];
data.palette[20]=data.palette[21];
data.palette[21]=data.palette[22];
data.palette[22]=data.palette[23];
data.palette[23]=tempc;
}
else
{
tempc=data.palette[23];
data.palette[23]=data.palette[22];
data.palette[22]=data.palette[21];
data.palette[21]=data.palette[20];
data.palette[20]=tempc;
}
for(loop=20;loop<=23;loop++)
setpalette(loop,data.palette[loop]);
if (palloop==36)
palloop=0;
}
palloop++;
*tempcp=tempc;
*palloopp=palloop;
}
void check_keybuf(int *movep, int *finishp, int *upp, int *downp, int *jumpp)
{
int move=*movep;
int finish=*finishp;
int up=*upp;
int down=*downp;
int jumploop=*jumpp;
if (keybuf[KEY_RIGHT] && !keybuf[KEY_LEFT])
{
if (keybuf[KEY_CTRL])
{
if (move<16)
move++;
}
else
{
if (move>8)
move--;
if (move<8)
move++;
}
if (landed) //(data.world[(marioy+1)/16][(mariox+player[curplay].screenx+8)/16]>26)
data.direction=0;
}
if (keybuf[KEY_LEFT] && !keybuf[KEY_RIGHT])
{
if (keybuf[KEY_CTRL])
{
if (move>-16)
move--;
}
else
{
if (move<-8)
move++;
if (move>-8)
move--;
}
if (landed) //(data.world[(marioy+1)/16][(mariox+player[curplay].screenx+8)/16]>26)
data.direction=1;
}
if (keybuf[KEY_ALT] && !down)
{
up=-17;
data.sprite=12;
jumploop++;
if (jumploop>10)
{
down=1;
jumploop=0;
}
}
if (keybuf[KEY_P])
{
graphstring(140,100,"Pause",TEXTCOLOR,VisiblePageOffs);
clear_key_buffer();
while(!keybuf[KEY_P]);
clear_key_buffer();
graphstring(140,100,"Pause",BACKGROUND,VisiblePageOffs);
}
if(keybuf[KEY_Q])
{
graphstring(130,100,"Quit(Y/N)",TEXTCOLOR,VisiblePageOffs);
clear_key_buffer();
while(!keybuf[KEY_Y] && !keybuf[KEY_N]);
if (keybuf[KEY_Y] && !keybuf[KEY_N])
finish=3;
clear_key_buffer();
graphstring(130,100,"Quit(Y/N)",BACKGROUND,VisiblePageOffs);
}
if ((!keybuf[KEY_RIGHT] && !keybuf[KEY_LEFT]) || (keybuf[KEY_RIGHT] && keybuf[KEY_LEFT]))
{
if (move>0)
move--;
if (move<0)
move++;
}
*movep=move;
*finishp=finish;
*upp=up;
*downp=down;
*jumpp=jumploop;
}
void animate_mario(int move)
{
if (landed)
{
if (data.sprite==10 && ((move>0 && data.direction==0) || (move<0 && data.direction==1)))
data.sprite=1;
if (move==0)
data.sprite=0;
if ((move>0 && data.direction==0) || (move<0 && data.direction==1))
{
if(abs(move)<16)
data.sprite++;
else
data.sprite+=2;
if (data.sprite>=10)
data.sprite=2;
}
if ((move>0 && data.direction==1) || (move<0 && data.direction==0))
data.sprite=10;
}
}
void move_mario(int *movep)
{
int move=*movep;
int loop1,loop2;
if (marioy>16)
{
if (move>0)
for (loop1=0;loop1<16;loop1++)
for (loop2=0;loop2<=move;loop2++)
if (data.world[(marioy-loop1)/16][(mariox+player[curplay].screenx+13+loop2/4)/16]>26)
move=loop2;
if (move<0)
for (loop1=0;loop1<16;loop1++)
for (loop2=0;loop2>=move;loop2--)
if (data.world[(marioy-loop1)/16][(mariox+player[curplay].screenx+2+loop2/4)/16]>26 || (mariox+loop1/2)<=0)
move=loop2;
}
if(mariox>100 && move>0)
player[curplay].screenx+=move/4;
else
if (mariox+move/4>0)
mariox+=move/4;
*movep=move;
}
void addcoin(int x, int y)
{
cointype *temp,*c;
c=bcoin;
while ((c->next)!=NULL)
c=c->next;
temp=(cointype *)malloc(sizeof(cointype));
temp->next=NULL;
temp->coinx=x;
temp->coiny=y;
temp->coinloop=-10;
temp->dy=0;
c->next=temp;
}
void removecoin()
{
cointype *temp;
cointype *c=bcoin;
temp=c->next;
c->next=c->next->next;
addscore(temp->coinx,temp->coiny,"200");
free(temp);
}
void drawcoin(int x)
{
cointype *c=bcoin;
int loop,num=0;
while ((c->next)!=NULL)
{
num++;
c=c->next;
}
c=bcoin;
for (loop=0;loop<num;loop++)
{
c=c->next;
if (((c->coinx)*16+32-x)>16)
x_put_masked_pbm((c->coinx)*16+32-x,(c->coiny)*16+c->dy,HiddenPageOffs,data.coin[abs((c->coinloop)%3)]);
c->coinloop++;
c->dy+=c->coinloop;
if (c->coinloop>=10)
removecoin();
}
}
void addscore(int x, int y, char *pscore)
{
scoretype *temp,*s;
s=bscore;
while ((s->next)!=NULL)
s=s->next;
temp=(scoretype *)malloc(sizeof(scoretype));
temp->next=NULL;
temp->scorex=x;
temp->scorey=y;
temp->scoreloop=0;
strcpy(temp->num,pscore);
s->next=temp;
}
void removescore()
{
scoretype *temp;
scoretype *s=bscore;
temp=s->next;
s->next=s->next->next;
free(temp);
}
void drawscore(int x)
{
scoretype *s=bscore;
while ((s->next)!=NULL)
{
s=s->next;
if (((s->scorex)*16+32-x)>16)
graphstring((s->scorex)*16+32-x,(s->scorey)*16+(s->scoreloop),s->num,TEXTCOLOR,HiddenPageOffs);
s->scoreloop--;
if (s->scoreloop<=-20)
removescore();
}
}
void exitgame()
{
int loop;
for (loop=0;loop<52;loop++)
farfree(data.block[loop]);
for (loop=0;loop<3;loop++)
farfree(data.coin[loop]);
free(bcoin);
free(bscore);
uninstall_new_key_handler();
x_remove_vsync_handler();
x_text_mode();
}
void check_jump(int *upp, int *downp, int *jumploopp)
{
int loop1,loop2;
int up=*upp;
int down=*downp;
int jumploop=*jumploopp;
loop1=3;
landed=0;
while (loop1<13 && landed==0)
{
if (data.world[(marioy+1)/16][(mariox+player[curplay].screenx+loop1)/16]>26)
landed=1;
else
landed=0;
loop1++;
}
if (!landed || marioy<16)
if (up<17)
up+=1;
if (up>0) //CHECK IF MARIO LANDED//
{
down=1;
loop1=marioy;
if (marioy<207)
{
while(loop1++<marioy+up/4)
{
for (loop2=3;loop2<14;loop2+=9)
if (data.world[loop1/16][(mariox+player[curplay].screenx+loop2)/16]>26)
{
marioy=loop1-1;
loop1=marioy+up/4;
loop2=13;
up=0;
down=0;
data.sprite=0;
}
}
}
marioy+=up/4;
}
if (up<0) //CHECK IF MARIO HIT A BLOCK/
{
if (!keybuf[KEY_ALT])
{
down=1;
jumploop=0;
}
loop1=marioy;
marioy+=up/4;
if (marioy>24)
{
while(loop1-->=marioy+up/4)
{
if(data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]>26 ||data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]==18)
{
marioy=loop1;
loop1=marioy+up/4-1;
up=-up;
down=1;
jumploop=0;
if (data.bumped[0]==0 && data.bumped[1]==0)
{
data.bumped[0]=(mariox+player[curplay].screenx+8)/16;
data.bumped[1]=marioy/16-1;
data.bumploop=-3;
}
}
if (data.world[loop1/16-1][(mariox+player[curplay].screenx+12)/16]>26 && data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]<26)
mariox-=1;
if (data.world[loop1/16-1][(mariox+player[curplay].screenx+3)/16]>26 && data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]<26)
mariox+=1;
}
}
}
*upp=up;
*downp=down;
*jumploopp=jumploop;
}
void check_blocks()
{
int bumpedblock=0;
if (data.world[(marioy-8)/16][(mariox+player[curplay].screenx+8)/16]==10)
{
data.world[(marioy-8)/16][(mariox+player[curplay].screenx+8)/16]=0;
player[curplay].score[0]+=200;
player[curplay].coins[0]++;
}
if (data.bumploop==-3)
{
bumpedblock=data.world[marioy/16-1][(mariox+player[curplay].screenx+8)/16];
switch (bumpedblock)
{
case 18:
case 28:
data.world[marioy/16-1][(mariox+player[curplay].screenx+8)/16]=27;
player[curplay].score[0]+=200;
player[curplay].coins[0]++;
addcoin(data.bumped[0],data.bumped[1]-1);
case 29:
if (data.world[data.bumped[1]-1][data.bumped[0]]==10)
{
data.world[data.bumped[1]-1][data.bumped[0]]=0;
player[curplay].score[0]+=200;
player[curplay].coins[0]++;
addcoin(data.bumped[0],data.bumped[1]-1);
}
break;
default:
data.bumped[0]=data.bumped[1]=0;
data.bumploop=0;
break;
}
}
if (player[curplay].coins[0]==100)
{
player[curplay].lives++;
player[curplay].coins[0]=0;
}
}
void check_finish(int *finishp)
//CHECK FOR END OF CURRENT PLAYER LOOP///////////////////////////////////////
{
int finish=*finishp;
if (marioy>=250)
finish=1;
if ((mariox+player[curplay].screenx+16)/16==data.maxlength-13)
finish=2;
if (times[0]==0)
finish=1;
*finishp=finish;
}
//END////////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -