※第三回プチコン大喜利応募作品
画面内に、トランポリンみたいに跳ねられる四角いパネルが散らばっているので、上手く跳ね上がって、どんどん画面手前方向に進んでください。There are square panels around you, You must jump on them and go up.
50枚おきに青いパネルが現れ、それで飛び跳ねることでレベルが上がっていきます。A blue panel will appear every 50 panels. A level is cleared if you jump on it.
パネルに乗り損なって下まで落下してしまうとゲームオーバーです。The game is over if you miss the panel and fall toward bottom.
タイトル画面では、何かボタン(ABXY)を押すことでゲームを開始します。画面中央の魔法使いの女の子を十字キーかスライドパッドで上下左右に操作します。You can start the game by any button (ABXY). You can move the character by circle pad or D-pad.
ゲーム中は、何かボタンを押すとポーズができます。もう一度押すと解除できます。You can pause and resume the game by any button during the game.
ゲームオーバーになってしまったら、何かボタンを押すことでゲームを再挑戦できます。You can retry the game by any button after the game is over.
| BR,BV,BW | プレイヤーの移動量 |
| BT | ボタンの状態 |
| BX,BY | スライドパッドの入力量 |
| F$ | 現在のレベルで出現するパネルの種類 |
| FB,FE | リングバッファ制御用インデックス番号 |
| FC[] | パネルの色 |
| FH[] | 何枚目のパネルか |
| FM | プレイヤーが跳ねたパネルのインデックス番号 |
| FS | パネルの大きさ |
| FT[] | パネルの種類 (1:橙 2:緑 3:黄 4:茶 5:青) |
| FU | 奥行き移動量 |
| FV[],FW[] | パネルの移動量 など |
| FX[],FY[],FZ[] | パネルの位置 |
| LV | 現在のレベル-1 |
| LX[],LY[],LZ[] | 白いドットの位置 |
| PA | プレイヤーキャラのアニメーション制御用 |
| PF | ゲームの状態 (0:通常 1:レベル開始前 2:レベルクリア直後 3:ゲームオーバー) |
| PH | 到達したパネルの枚数 |
| PX,PY,PZ | 基準位置に対するプレイヤーの相対位置 |
| VX,VY,VZ | スクロール量 |
'
' TXT:HOPPER Programmed by OBONO
'
DIM FX[10],FY[10],FZ[10],FT[10]
DIM FH[10],FV[10],FW[10],FC[6]
DIM LX[50],LY[50],LZ[50]
GOSUB @IN:GOSUB @TI:GOSUB @SI:GOSUB @GS
' GAME MANAGEMENT
@GM
STICK OUT BX,BY:BT=BUTTON()
GOSUB @PM:GOSUB @FL
IF FU>0 && FM>=0 THEN GOSUB @PS
IF FZ[FB]<PZ THEN GOSUB @GV
GOSUB @SM:GOSUB @GD:VSYNC 1
IF BT AND 240 THEN
IF !PF THEN GOSUB @GZ
IF PF==3 && PA>=120 THEN GOSUB @GS
ENDIF
GOTO @GM
@GS ' START GAME
LV=0:PX=0:PY=0:PZ=0:PF=0:PH=0:PA=0:'FU=0
GOSUB @FI
SPSET 60,6
BGCLR 0:BGSTR 0,10,9,"READY":BEEP 32
RETURN
@GD ' DRAW CHARACTERS
FOR I=0 TO 9
IF FT[I] THEN
U=(I==FM)*FU*4
X=(RND(3)-1)*U:Y=(RND(3)-1)*U
IF FT[I]==3 THEN S=FW[I] ELSE S=2
SPOFS3D I,FX[I]+X,FY[I]+Y,FZ[I],S
ENDIF
NEXT
FOR I=0 TO 49
SPOFS3D I+10,LX[I],LY[I],LZ[I],1
NEXT
SPOFS3D 60,PX,PY,PZ,1
RETURN
@GZ ' PAUSE & RESUME GAME
BGSTR 0,10,9,"PAUSE":BGMVOL 32:BEEP 3
FOR I=0 TO 2
WHILE !(BUTTON() AND 240)==I MOD 2
VSYNC 1
WEND
NEXT
BGSTR 0,10,9," ":BGMVOL 64
RETURN
@GV ' GAME OVER
IF !PF THEN
PA=0:PF=3
SPCHR 60,11:SPANIM 60,"R",-90,360,0
SPSTART 60:BGMSTOP:BEEP 14
ENDIF
PA=PA+1
IF PA==120 THEN
BGMPLAY 6
BGSTR 0,8,3,"game over"
BGSTR 0,5,11,"push any button"
ENDIF
RETURN
' CONTROL PLAYER
@PM ' MOVE PLAYER
VX=-PX/4:VY=-PY/4:FU=FU+(FU<4)/16
IF FU<0 THEN VZ=-PZ/2 ELSE VZ=-PZ-FU
IF !PF || PF==3 THEN
BV=((BT AND 8)/8-(BT AND 4)/4)*4+BX*5
BW=((BT AND 2)/2-(BT AND 1) )*4-BY*5
BR=SQR(BV*BV+BW*BW)
IF BR>4 THEN BV=BV*4/BR:BW=BW*4/BR
ELSE
BV=0:BW=0:BR=0
ENDIF
PX=PX+VX+BV:PY=PY+VY+BW:PZ=PZ+VZ+FU
IF FU>-3 && PF!=3 THEN
IF PA!=0 && BR<2 THEN SPCHR 60,6:PA=0
IF PA!=1 && BR>=2 THEN
SPANIM 60,"I",4,6,4,7,4,8,4,9,0
SPSTART 60:PA=1
ENDIF
ENDIF
RETURN
@PS ' BOUND PLAYER
PH=MAX(PH,FH[FM]):BGSTR 0,7,1,STR$(PH)
PA=2:SPCHR 60,10:T=FT[FM]
IF T==3 THEN FV[FM]=1
IF T==5 THEN
LV=LV+1:FU=-6:PF=2:BGMSTOP:BEEP 5
BGSTR 0,8,3,"excellent"
BGSTR 0,5,11,"try next level{"
ELSE
FU=-4:BEEP 8
IF PF THEN
PF=0:BGCLR 0
BGSTR 0,1,1,"FLOOR "+STR$(PH)
BGSTR 0,17,13,"LEVEL "+STR$(LV+1)
BGMPLAY (LV MOD 3+1)*8+(LV MOD 3==2)*3
ENDIF
ENDIF
RETURN
' CONTROL FLOORS
@FL
IF FU>0 THEN FM=-1:IF PF==2 THEN GOSUB @FI
FOR I=0 TO 9
IF FT[I] THEN GOSUB @FM
NEXT
IF !PF&&FT[FE]!=5&&FZ[FE]>-12 THEN GOSUB @FN
IF FB!=FE && FZ[FB]>256 THEN GOSUB @FR
RETURN
@FI ' SETUP LEVEL
F$="1"*(LV<6)
IF LV AND 1 THEN F$=F$+"2"
IF LV AND 2 THEN F$=F$+"3"
IF LV AND 4 || LV==8 THEN F$=F$+"4"
FOR I=0 TO 9:FT[I]=0:NEXT
FX[0]=PX:FY[0]=PY:FZ[0]=256:FS=64-LV*4
FH[0]=LV*50:FT[0]=1:FB=0:FE=0:PF=1
GPAGE 0,4:GFILL 0,448,384,512,0
FOR I=1 TO 5
X=I*64:S=32-FS/(2+(I==4)*2)
GFILL X+S,448+S,X+63-S,512-S,FC[I]
FOR J=S TO S+4
C=192-ABS(J-S-2)*64
GBOX X+J,448+J,X+63-J,512-J,RGB(C,C,C)
NEXT
NEXT
SPSET 0,1
RETURN
@FM ' MOVE FLOOR
X=FX[I]+VX:Y=FY[I]+VY:Z=FZ[I]+VZ
V=FV[I]:W=FW[I]:T=FT[I]:S=FS/(1+(T==4))
IF T==2 THEN X=X+V:Y=Y+W
IF T==3 THEN
IF V THEN FW[I]=W-(W>0)/16:S=0
IF Z<-12 THEN FV[I]=0:FW[I]=2
ENDIF
FX[I]=X+((X<-256)-(X>256))*512
FY[I]=Y+((Y<-256)-(Y>256))*512
FZ[I]=Z
IF FU>0 && PZ-FU<Z && PZ>=Z THEN
IF MAX(ABS(X-PX),ABS(Y-PY))<S THEN
FM=I:PZ=Z-1/16
ENDIF
ENDIF
RETURN
@FN ' NEW FLOOR
Z=FZ[FE]-32-LV*2:H=FH[FE]+1
T=VAL(MID$(F$,RND(LEN(F$)),1))
IF LV<11 && H MOD 50==0 THEN T=5
FE=(FE+1)MOD 10
FX[FE]=RNDF()*512-256:FY[FE]=RNDF()*512-256
FZ[FE]=Z:FH[FE]=H:FT[FE]=T:FV[FE]=0:FW[FE]=0
IF T==2 THEN
D=RNDF()*PI()*2:R=2+LV/8
FV[FE]=COS(D)*R:FW[FE]=SIN(D)*R
ENDIF
SPSET FE,T:IF T==3 THEN FW[FE]=2
RETURN
@FR ' REMOVE FLOOR
FT[FB]=0:SPCLR FB:FB=(FB+1)MOD 10
RETURN
' CONTROL BACKGROUND DOTS
@SI ' INITIALIZE
FOR I=0 TO 49
LX[I]=RNDF()*512-256:LY[I]=RNDF()*512-256
LZ[I]=RND(268)-12
SPSET I+10,1462:SPHOME I+10,8,8
NEXT
RETURN
@SM ' MOVE DOTS
FOR I=0 TO 49
X=LX[I]:Y=LY[I]:Z=LZ[I]
LX[I]=X+VX+((X<-256)-(X>256))*512
LY[I]=Y+VY+((Y<-256)-(Y>256))*512
LZ[I]=Z+VZ+((Z<-12 )-(Z>256))*268
NEXT
RETURN
' INITIALIZE
@IN
ACLS:BACKCOLOR RGB(32,96,0)
DEF SPOFS3D _I,_X,_Y,_Z,_S
DIM _Q,_C
_Q=4:IF _Z>-12 THEN _Q=1/(1+_Z/16)
_C=MAX(ABS(_X),ABS(_Y),_Z)
_C=MIN((256-_C)*4,256+_Z*24,255)
IF _I==60 THEN _C=255 'TRICK!
IF _C>0 && _S>0 THEN
SPOFS _I,_X*_Q+200,_Y*_Q+120,_Z*4-192
SPSCALE _I,_S*_Q,_S*_Q
SPCOLOR _I,RGB(_C,255,255,255)
SPSHOW _I
ELSE
SPHIDE _I
ENDIF
END
DEF BGSTR _P,_X,_Y,_S$
DIM _I,_S
FOR _I=0 TO LEN(_S$)-1
_S=ASC(MID$(_S$,_I,1))
BGPUT _P,_X,_Y,_S:_X=_X+1
NEXT
END
FOR I=1 TO 5
READ FC[I]:SPDEF I,I*64,448,64,64,32,32,0
NEXT
FOR I=0 TO 1
SPDEF 6+I*2,176,144,16,16,8,8,I*8+1
SPDEF 7+I*2,192,144,16,16,8,8,I*8+1
SPDEF 10+I,80+I*32,272,16,16,8,8
NEXT
GPAGE 0,5:GCOPY 16,32,431,47,16,48,1
GCOPY 16,16,31,31,432,48,1
FOR Y=16 TO 63
C=&HFFFFFFFF-(Y>47)*&HFF-(Y MOD 16)*&H800
FOR X=0 TO 511
GPSET X,Y,GSPOIT(X,Y) AND C
NEXT:NEXT
RETURN
@TI ' TITLE SCREEN
BGSTR 1,8,7,"HOPPER 3D"
BGHOME 1,200,120:F=1:Z=291:U=0:BEEP 6
WHILE F || !(BUTTON() AND 240)
S=4/(1+Z/16):BGSCALE 1,S,S
BGOFS 1,200,120,Z*4-192:Z=Z+U:U=U-1/16
IF Z<=0 THEN
U=2
IF F THEN
FOR I=0 TO 4
READ X,Y,C,S$:LOCATE X,Y:COLOR C:PRINT S$
NEXT
BGSTR 0,5,12,"push any button":F=0:BEEP 55
ENDIF
ENDIF
VSYNC 1
WEND
BGCLR 1:CLS
RETURN
' DATA
DATA &HFFFFC040,&HFF40E040,&HFFFFFF00
DATA &HFFE06020,&HFFA0A0FF
DATA 22,17,15,"in Petit Computer 3"
DATA 17,20,7,"- How to play -"
DATA 15,22,7," Move Pause"
DATA 10,27,5,"2014.11.21 Programmed by OBONO"
DATA 11,28,5,"http://d.hatena.ne.jp/OBONO/"
' EOF