テトリス


テトリス
無印SPALM用

plg <-という名前のソース

w=width h=height mx=10 my=20 sz=10
ox=(w-sz*mx)/2 oy=sz*2 rsp=sz*3
ks=(2<<15)+(2<<4) kt=2 kh=2<<16
kr=(2<<13)+(2<<5) kl=(2<<12)+(2<<3)
kb=(2<<11)+(2<<1) kd=(2<<14)+(2<<7)

@(cl,-1,0x00BFFF,0x005FFF,0xFF20FF,0xFF8000,0x00DF00,0xFF3F3F,0xFFDF00,0xFAFAFA)
@(cl1,-1,0x007FFF,0x0037BF,0xBF37BF,0xBF5F1F,0x00BF00,0xDF0000,0xF0C800,0xEFEFEF)
@(scp,100,300,500,800,800,1200,1600)
@(sct,"Single","Double","Triple","Tetris","T-spin Single","T-spin Double","T-spin Triple")
@(zero,"","0","00","000","0000","00000","000000","0000000")

@(a,0,1,1,0,1)@(b,0,0,-1,2,2)
@(a1,-1,1,1,-1)@(a2,1,1,-1,-1)
@(b1,1,-1,1,-1)
@(c,0,-2,1,-2,1)@(d,0,0,0,1,-2)
@(c1,1,1,-1,-1)@(c2,0,1,-1,-1)
@(c3,1,-1,-1,1)@(c4,1,0,0,0)
@(d1,1,-1,1,1)@(d2,0,-1,1,1)
@(d3,-1,-1,-1,1)@(d4,-1,0,0,0)
for(i=0;i-4;++i){for(j=0;j-5;++j){
srx0[0][i][j]=a[j]*a1[i]
srx0[1][i][j]=a[j]*a2[i]
sry0[0][i][j]=sry0[1][i][j]=b[j]*b1[i]
srx1[0][i][j]=(j?c[j]*c1[i]+c2[i]:0;)
srx1[1][i][j]=(j?c[j]*c3[i]+c4[i]:0;) sry1[0][i][j]=(j&4?d[j]*d1[i]+d2[i]:0;) sry1[1][i][j]=(j&4?d[j]*d3[i]+d4[i]:0;)
}}

lock()
makeimg(bu,mx*sz+2,h)

for(i=0;i-9;++i){
makeimg(bl[i],sz,sz)trgt(bl[i])
col(cl[i])frect(0,0,sz,sz)
col(cl1[i])rect(-1,-1,sz,sz)
}

makeimg(title,w,h)trgt(title)
clear(0,0,w,h)
col(0)setfont("S")
text("TETRiS",w/2,h/4,1|16)
text("push select to start",w/2,h/2,1|16)
text("push 0 to end",w/2,h/2+sthigh,1|16)
trgt(off)
unlock(0)

func cell(fx,fy){ return (fx>=0)&(fx<mx)&(fy<my)?strat(yl[fx],fy+5):8; }
func drawtm(f,fx,fy,fsz){if(f){
col(cl[f--])

fa=(3+(!f||(f==6)))*fsz/2
fox=fx-fa foy=fy-fa

frect(fox+fsz,foy+fsz,fsz,fsz)
frect(fox+fsz*((f==4)?0:2;),foy+fsz,fsz,fsz)
if(f>3){fa=fsz*((f==6)?2:0;)
frect(fox+((f&1)?0:fsz;),foy+fa,fsz,fsz)
frect(fox+fsz*((f&1)?1:2;),foy+fa,fsz,fsz)
}else{
frect(fox,foy+fsz,fsz,fsz)
if(f){
 frect(fox+fsz*(f-1),foy,fsz,fsz)
}else{
 frect(fox+fsz*3,foy+fsz,fsz,fsz)
}
}
}}

func init(){
lock()
trgt(bu)
clear(0,0,w,h)
col(0)rect(0,oy-1,mx*sz+1,my*sz+1)
trgt(off)

clear(0,0,w,h)
unlock(0)

lv=keyflg=1
sp=max(1,sz*3-(lv*3*sz/15))
st=ln=sc=key=htm=0
for(i=0;i-mx;++i){yl[i]="8"
for(j=-5;j-my;++j){
 xl[j]=0 yl[i]=0.yl[i]
}
}
for(rdtm="0123456",i=0;i-3;++i){
stc[i]=strat(rdtm,a=abs(rand)%strlen(rdtm))
rdtm=substr(rdtm,0,a).substr(rdtm,a+1)
}
}

func inittm(f){
x=3 y=-3 yy=sp-1 rf=ry=tmr=tsf=0 ++tm
tmsz=2+(!f||(f==6))
tmx[0]=tmy[0]=tmy[1]=1
tmx[1]=((f==4)?0:2;)
if(f>3){
tmx[2]=tmx[3]=((f&1)?0:1;) ++tmx[3]
tmy[2]=tmy[3]=((f==6)?2:0;)
}else{
tmx[2]=0 tmy[2]=1f?(tmx[3]=f-1,tmy[3]=0):(tmx[3]=3,tmy[3]=1);
}
}

ここから本体