Sunday, March 27, 2011

プチコンでYOPPAL

その昔、MSXの雑誌「MSX・FAN」に載っていた「YOPPAL」というゲームの移植です。当時「酔っぱらいゲーム」みたいにいわれていたかと思います。
パレットをMSXっぽくしたり超低機能MML再生をつけたりしたので、それなりにそっくりになってるかと。

DSiへ移植されたYOPPALの図



操作:
Aボタンで上昇しますが、常に重力があり、離すと下へいきます。
左右で横移動しますが、慣性がかかっています。
緑色の線を操作し、右下の黄色のゴールへたどり着くことが目的です。
全7面、オールクリアで、エンディングデモとクリアまでにかかったTIMEを表示します。

---PRG:YOPPAL
‘*** YOPPAL for DSi ***
CLEAR
DIM P(14)

VISIBLE 1,1,1,1,1,1
CLS:GCLS:SPCLR
CHRINIT “BGF0”
CHRINIT “BGU3”
GOSUB @PALINIT
GOSUB @PALSET
CHRSET “BGU3”,0,”1571000055570000455500001451000000000000000000000000000000000000”
RESTORE @NOTEDAT:FOR I=0 TO 13:READ P(I):NEXT I
RESTORE @SCENEDAT:FOR I=1 TO 7:READ O$(I):NEXT I

@NEWGAME
O=1:U=0

@MAIN
 GCLS 0
 FOR I=0 TO 1
  FOR J=0 TO 63
   GPUTCHR J*4,I*180,”BGU3”,0,0,1
  NEXT
  FOR J=1 TO 44
   GPUTCHR I*252,J*4,”BGU3”,0,0,1
  NEXT
 NEXT

 A$=O$(O)
 FOR I=0 TO 3:B=VAL(“&H”+MID$(A$,I*2,2)):G=128
  FOR J=1 TO 6:iF B>=G THEN GOSUB @WALLTATE:B=B-G
  G=FLOOR(G/2):NEXT J
 NEXT I
 FOR I=0 TO 4:B=VAL(“&H”+MID$(A$,I*2+8,2)):G=128
  FOR J=1 TO 6:IF B>=G THEN GOSUB @WALLYOKO:B=B-G
  G=FLOOR(G/2):NEXT J
 NEXT I
 GFILL 252,148,255,179,10:’GOAL

 X=20:Y=164:Z=3.5:V=0:W=0:OX=X:OY=Y:GCOLOR 3:GPSET X,Y
 A$="SCENE["+STR$(O)+"]":GX=0:GY=185:GOSUB @GPRINT

 @PLAY
 B=BUTTON():S=B AND 15:U=U+1
 IF S AND 4 THEN V=V-0.5:IF V<=-Z THEN V=-Z
 IF S AND 8 THEN V=V+0.5:IF V>=Z THEN V=Z
 IF B AND 16 THEN W=W-2:IF W<-3 THEN W=-3
 W=W+1:IF W>3 THEN W=3
 X=X+V:Y=Y+W:I=GSPOIT(X,Y)
 GLINE OX,OY,X,Y:OX=X:OY=Y
 VSYNC 3
 IF I==0 OR I==3 GOTO @PLAY
 IF I==10 THEN P$=“O6CDEFC”:GOSUB @MML:O=O+1
 IF I!=10 THEN P$=“O5GFEDC”:GOSUB @MML
 IF O==8 GOTO @ALLCLEAR
GOTO @MAIN

@ALLCLEAR
A$=“:TIME[“+STR$(U)+”]”:GX=64:GY=185:GOSUB @GPRINT
P$=“DEGCDEGEDC”:GOSUB @MML
FOR I=0 TO 1
GLINE X,Y,RND(255),RND(184),RND(16)
I=BUTTON() AND 15 VSYNC 2
NEXT:GOTO @NEWGAME

@MML
‘OCTAVE=O3~O6
‘CDEFGABC,#
M=0
@MMLLOOP
ML=1
N=ASC(MID$(P$,M,1))-ASC(“A”)
NN$=“”:IF M<LEN(P$)-1 THEN NN$=MID$(P$,M+1,1)
IF NN$=“#” THEN ML=2:N=N+8
IF N==14 AND NN$=“” GOTO @NEXTMML
IF N==14 THEN ML=2:OCT=(VAL(NN$)-3)*4096-8192:GOTO @NEXTMML
@PLAYMML
BEEP 0,FLOOR(OCT+341.3*P(N)+0.5)
VSYNC 5
@NEXTMML
M=M+ML
IF M<LEN(P$) GOTO @MMLLOOP
RETURN

@GPRINT
FOR M=0 TO LEN(A$)-1
 GPUTCHR GX+M*8,GY,"BGF0",ASC(MID$(A$,M,1)),0,1
NEXT M:RETURN

@WALLYOKO
FOR W=0 TO 9
 GPUTCHR J*36+W*4,I*36+36,”BGU3”,0,0,1
NEXT W:RETURN

@WALLTATE
FOR W=0 TO 9
 GPUTCHR J*36,I*36+W*4,”BGU3”,0,0,1
NEXT W:RETURN

@PALINIT
FOR M=0 TO 15
 COLINIT “BG”,M
 COLINIT “SP”,M
 COLINIT “GRP”,M
NEXT M:RETURN

@PALSET
RESTORE @PALDAT
FOR M=0 TO 15:READ C$
 COLSET “BG”,M,C$
 COLSET “GRP”,M,C$
NEXT M:RETURN

@NOTEDAT
DATA 9,11,0,2,4,5,7
DATA 10,11,1,3,4,6,8

@PALDAT
DATA 000000,000000,24DB24,6DFF6D
DATA 2424FF,496DFF,B62424,49DBFF
DATA FF2424,FF6D6D,DBDB24,DBDB92
DATA 249224,DB49B6,B6B6B6,FFFFFF

@SCENEDAT
DATA 4450047C00FCFC
DATA 7C381C3E0084C4C080
DATA 7C3E4C980080A06444
DATA 7CF24C860008287050
DATA 64384C861094A47050
DATA 70EC5820081424AC94
DATA 1C6ED00840A0286CA4
---

もし奇特にも約140行を打ち込まれて、動かなかったり、変な動きをするようでしたら、DSからの転記ミスなので教えてください。
修正します m(_ _)m

※7/6 転記ミスがありましたので修正しました(´・ω・`)

2 comments:

  1. 入力してみましたが、転記ミスと想われる箇所が何箇所かありました。

    1.冒頭のCHRINITのリソース指定
    CHRINIT “BGF0” → CHRINIT “BGF0”
    CHRINIT “BGF3” → CHRINIT “BGU3”

    2.同じく冒頭のRESTORE直後のFORの最大値
    RESTORE @NOTEDAT:FOR I=0 TO 14 →
    RESTORE @NOTEDAT:FOR I=0 TO 13

    3.@PLAY中の下記IF文でシーンが+1されてない
    IF I==10 THEN P$=“O6CDEFC”:GOSUB @MML →
    IF I==10 THEN P$=“O6CDEFC”:GOSUB @MML:O=O+1

    4.@MMLLOOP中の下記IF文の条件式の不等号
    NN$=“”:IF M>LEN(P$)-1 THEN →
    NN$=“”:IF M<LEN(P$)-1 THEN

    ReplyDelete
  2. レス遅くなり申し訳ありません...
    チェックしてびっくりしましたが全くお書きのとおりでした。
    ご指摘ありがとうございました!

    ReplyDelete