Double Jump Bugzy (MSX) by Kaido Kotoni
A downloadable game
I used DeepL and Google Translate.
The creator is Japanese, and we would appreciate your understanding.
----- Double Jump Bugzy -----
-- Overview
I had never made a game with 10 lines. This is my first challenge.
I decided to take on this challenge myself, as the "10 lines hero" has become a very popular topic in Japan in 2021.
It's a simple game, but I hope you enjoy it.
-- Entry Sheet
Entry to
"12th Edition of BASIC 10 Liner Contest"
- Category
EXTREME-256
- System requirement
All national MSX systems.
For PAL system users, replace "TIME/60" with "TIME/50" in line 190.
- Files
DJB.dsk
Disk images that can be used with openMSX / blueMSX / webMSX.
DJB.cas
Tape images that can be used with openMSX / blueMSX / webMSX.
DJB.bas
A program file in ASCII format.
ReadMe_DJB-jp.txt
ReadMe in Japanese.
ReadMe_DJB-en.txt
Translation into English was done using DeepL and Google Translate.
ScreenShot_DJB.gif
Screen capture image.
-- Story
I'm DJ-Bugzy the rabbit.
I don't know why, but I've been being chased by ghosts for a while!
I barely boarded the raft, but he's still chasing me!
Anyway, I must escape from the ghosts!
-- How to Play
- Cursor keys / Joystick
Move DJ-Bugzy left or right.
He cannot stop suddenly. Watch your speed!
- Spacebar / Joystick 1 button
The rabbit can jump, which is its specialty.
He can double jump, just like his name says DJ. Amazing!
Control DJ-Bugzy to avoid falling off the raft.
Every 100 points, the raft is broken and shortened.
After 600 points, the ghosts get tired. ...Are ghosts tired?
After 1000 points, a boat landing will appear on the far right. Jump on it and you're clear!
-- Aim for the high score!
- Scratch Bonus
He's a DJ so he's good at scratching too!
You will receive a scratch bonus if you graze the ghost. High score if it continues to be grazed in succession.
- Burst Bonus
If you continue the scratch bonus 10 times, you will receive a burst bonus of 50 points, which will make the ghosts pop.
Bursts can follow. Punish the ghosts!
- Wall Kick Bonus
When it touches the wall on either side, it bounces back and 50 points are awarded.
If you're cornered by a ghost, kick the wall to avoid it!
-- Play style
- Time Attack
Aim for the fastest time to clear. First of all, let's cut 60 seconds.
- High-score Attack
When you arrive at the boat landing, don't clear the boat and keep teasing the ghost.
How many points can you get?
-- Source code
100 DEFINTA-Y:SCREEN1,1,0:COLOR15,5,3:WIDTH32:KEYOFF:VPOKE760,248:VPOKE8203,105:FORI=0TO47:VPOKE14336+I,VAL("&H"+MID$("387CAEAEFE7C391E1C3E75757F3E9C788CD078ACAEFFFF6C42663C5A5AFFFF66310B1E3575FFFF360066FFFF5A5E3CE7",I*2+1,2)):NEXT:H=RND(-TIME):ZH=99.99 110 DEFFNS(P)=STICK(0)+STICK(1):DEFFNT(P)=-STRIG(0)-STRIG(1):DEFFNV(P)=VPEEK(6753+P/8):ZT=0:SB=0:SC=-1:SN=0:S=0:T=0:X=120:Y=96:XX=0:YY=4:C=15:F=2:EX=RND(1)*240:EY=60:SX=0:SY=0:EM=6:EC=11:TX=8:TN=0:B=16:PUT SPRITE0,(X,Y),C,3:PUT SPRITE1,(0,208) 120 FOR I=0 TO 1:I=-(FNT(0)=0):NEXT:CLS:PRINT USING" HIGH##### / TIME###.##s";H;ZH:PRINT " ==== Double Jump Buggzy ====":PRINT:FOR I=0 TO 1:I=FNT(0):PRINT SPC(9);"Press trigger!";CHR$(13);SPC(31);CHR$(13);:NEXT:TIME=0 130 SC=SC+1:IF SC>=SN THEN SN=SN+100:LOCATE12,5:PRINT"LEVEL";INT(SN/100);:PLAY"T255V13O7L32EDCB":B=B+(SN<1001):TX=TX+1:T$=" "+STRING$(B,95)+" ":EC=11+2*(SN>500)+(SN>1001):EM=EM+(SN>500):IF EM<1 THEN EM=8:LOCATE28,18:PRINT"I";:LOCATE28,19:PRINT"####"; 140 SX=SX+SGN(X-EX)+(ABS(SX)>=EM)*SGN(SX):EX=EX+SX:SY=SY+SGN(Y-EY)+(ABS(SY)>=EM)*SGN(SY):EY=EY+SY:PUT SPRITE1,(EX,EY),EC,-(SX>0):LOCATETX/2,19:PRINT T$;:TX=TX-SGN(TX-TN):IF TX=TN THEN TN=RND(1)*34 150 IF (ABS(X-EX)<13 AND ABS(Y-EY)<13) THEN SB=SB-(SB<10):SY=-(SY*(SB<10))+SGN(Y-EY)*(10*(SB=10)):C=7+(SB=10):SC=SC+SB*2-50*(SB=10):SOUND4,0:SOUND5,3+(SB=10):SOUND10,14 ELSE SB=SB+(SB>0):C=15:SOUND10,0 160 S=FNS(0):T=FNT(0)*(T=0):XX=XX+((S=7)-(S=3))*2-SGN(XX):X=X+XX*2:IF T AND F<2 THEN F=F+1:YY=-7:SOUND2,0:SOUND3,1:SOUND9,16:SOUND13,1 170 LOCATE0,22:IF (X<0) OR (X>239) THEN XX=-SGN(XX)*12:X=-(X>128)*239:SC=SC+50:SOUND2,0:SOUND3,2:SOUND9,16:SOUND13,1 ELSE IF F THEN Y=Y+YY:YY=YY+1:IF Y>134 THEN Y=134:F=0:SOUND11,0:SOUND12,24:SOUND2,0:SOUND3,6:SOUND9,16:SOUND13,1 180 PUT SPRITE0,(X,Y),C,SGN(XX)+3:ZT=TIME/60:IF(ABS(X-EX)<6 AND ABS(Y-EY)<6) OR (F=0 AND (FNV(X)=32)) THEN SOUND10,0:PUT SPRITE0,(X,Y),14,5:PRINT STRING$(14,10)+STRING$(32,94)+STRING$(2,10):LOCATE11,9:PRINT"GAME OVER":FOR I=0 TO 1:I=FNT(0):NEXT:GOTO110 190 H=-(H<=SC)*SC-(H>SC)*H:PRINT USING"SCORE##### SB## Time###.##s";SC;SB;ZT;:IF F=0 AND (FNV(X)=35) THEN FOR I=0 TO 1:LOCATE0,9:PRINT SPC(31);CHR$(13);" Congratulations! You escaped!";:I=FNT(0):NEXT:ZH=-(ZH<=ZT)*ZH-(ZH>ZT)*ZT:GOTO 110 ELSE 130
-- Description
There is nothing difficult about it.
It makes heavy use of logic operations, but if you have ever programmed on MSX, you should be able to understand it without difficulty.
Under these conditions, we have no choice but to prioritize keeping it to 10 lines rather than efficiency and readability.
No forced omission of characters, such as omitting the semicolon in PRINT, is used. Spaces are also inserted whenever possible.
I don't think we use variables without initializing them (assuming 0), but only T$ is done in the main loop.
- Variable
I Generic Loop Index
H high score
ZH record time
ZT Time Calculation Work
SB Scratch Count
SC score
SN 次のレベルアップスコア
S,T Next Level Up Score
X,Y DJ-Bugzy Position
XX,YY DJ-Bugzy Movement
C DJ-Bugzy display color
F Number of jumps
EX,EY ghost Position
SX,SY ghost Movement
EM Maximum speed of ghost
EC Ghost display color
T$ Raft String
TX Raft position
TN Target position of the raft
B Raft Size
- Line 100
DEFINTA-Y:
A-Y numeric variables to be integer type.
SCREEN1,1,0:COLOR15,5,3:WIDTH32:KEYOFF:
Screen initialization.
VPOKE760,248:VPOKE8203,105:
Set the character of the raft.
FORI=0TO47:VPOKE14336+I,VAL("&H"+MID$("387CAEAEFE7C391E1C3E75757F3E9C788CD078ACAEFFFF6C42663C5A5AFFFF66310B1E3575FFFF360066FFFF5A5E3CE7",I*2+1,2)):NEXT:
Sprite defined.
0 - ghost Left
1 - Right
2 - DJ-Bugzy Left
3 - Center
4 - Right
5 - Miss
H=RND(-TIME):
High score is used for random value initialization.
The "H" can be 0 or 1. Since the score cannot be less than 1, well, it doesn't matter, does it?
ZH=99.99
Initialize the fastest time.
- Line 110
DEFFNS(P)=STICK(0)+STICK(1):DEFFNT(P)=-STRIG(0)-STRIG(1):
Function definition of control input. Parameter P is dummy.
DEFFNV(P)=VPEEK(6753+P/8):
Function to read the character at the feet.
ZT=0:SB=0:SC=-1:SN=0:S=0:T=0:X=120:Y=96:XX=0:YY=4:C=15:F=2:EX=RND(1)*240:EY=60:SX=0:SY=0:EM=6:EC=11:TX=8:TN=0:B=16:
Initialize variables.
PUT SPRITE0,(X,Y),C,3:PUT SPRITE1,(0,208)
Show sprites on the title screen.
- Line 120
FOR I=0 TO 1:I=-(FNT(0)=0):NEXT:
Stops as long as the button is pressed.
Avoid accidentally skipping the title screen when the game is over or cleared.
CLS:PRINT USING" HIGH##### / TIME###.##s";H;ZH:PRINT " ==== Double Jump Buggzy ====":PRINT:
Displays high score, fastest clear time, and title screen.
FOR I=0 TO 1:I=FNT(0):PRINT SPC(9);"Press trigger!";CHR$(13);SPC(31);CHR$(13);:NEXT:
Press trigger!
TIME=0
Initialize in-game time.
- Line 130
SC=SC+1:
Score +1.
IF SC>=SN THEN
If your score exceeds your level-up score
SN=SN+100:
Next level up score +100.
You will always come here first. This is where the raft's initial settings and levels can be displayed.
LOCATE12,5:PRINT"LEVEL";INT(SN/100);:
Displays the current level.
PLAY"T255V13O7L32EDCB":
Play the level-up sound effect.
B=B+(SN<1001):
Raft length, -1 to level 10.
TX=TX+1:
Raft position +1 so that raft garbage is not displayed.
T$=" "+STRING$(B,95)+" ":
Create a string of rafts.
EC=11+2*(SN>500)+(SN>1001):
Set the color of the ghost.
EM=EM+(SN>500):
After level 6, the speed of the ghost is -1.
IF EM<1 THEN EM=8:LOCATE28,18:PRINT"I";:LOCATE28,19:PRINT"####";
When the speed of the ghost reaches 0, set the speed back to 8 and display the boat landing.
- Line 140
SX=SX+SGN(X-EX)+(ABS(SX)>=EM)*SGN(SX):EX=EX+SX:SY=SY+SGN(Y-EY)+(ABS(SY)>=EM)*SGN(SY):EY=EY+SY:
Calculate the speed at which the ghost moves and its position.
PUT SPRITE1,(EX,EY),EC,-(SX>0):
Show ghosts.
LOCATETX/2,19:PRINT T$;:
Show rafts.
TX=TX-SGN(TX-TN):
Move the raft.
IF TX=TN THEN TN=RND(1)*34
When the raft reaches the target position, a new target position is set.
- Line 150
IF (ABS(X-EX)<13 AND ABS(Y-EY)<13) THEN
If you graze a ghost
SB=SB-(SB<10):
Scratch bonus +1.
SY=-(SY*(SB<10))+SGN(Y-EY)*(10*(SB=10)):
After 10 consecutive scratch bonuses, a burst is triggered and the ghost is popped.
C=7+(SB=10):
After 10 consecutive scratch bonuses, the burst color is set.
SC=SC+SB*2-50*(SB=10):
Scratch and burst bonuses are added.
SOUND4,0:SOUND5,3+(SB=10):SOUND10,14
Scratch and burst bonus sound effects.
ELSE
Unless it was grazed by a ghost.
SB=SB+(SB>0):C=15:SOUND10,0
Scratch Bonus to -1, color to normal color, and stop Scratch Bonus sound effect.
- Line 160
S=FNS(0):T=FNT(0)*(T=0):
Control Input.
To make it easier to do double jumps, trigger input should not accept continuous input.
XX=XX+((S=7)-(S=3))*2-SGN(XX):X=X+XX*2:
DJ-Bugzy lateral movement calculation.
IF T AND F<2 THEN
If there is a trigger input and the number of jumps is within 2
F=F+1:YY=-7:
Set the number of jumps to +1. Set the amount of jump movement.
SOUND2,0:SOUND3,1:SOUND9,16:SOUND13,1
Jumping sound effects.
- Line 170
LOCATE0,22:
Set the cursor position for the fall direction in line 180 and the score display in line 190.
IF (X<0) OR (X>239) THEN
If you are in contact with a wall on either side
XX=-SGN(XX)*12:X=-(X>128)*239:
It bounces in the opposite direction.
SC=SC+50:
50 wall kick bonus points.
SOUND2,0:SOUND3,2:SOUND9,16:SOUND13,1
Wall kicking sound effect.
ELSE IF F THEN
If you are not in contact with a wall and are jumping
Y=Y+YY:YY=YY+1:
DJ-Bugzy's jump-movement calculations.
IF Y>134 THEN
If DJ-Bugzy is positioned at the height of the raft
Y=134:F=0:
Set to raft height. Reset the number of jumps.
SOUND11,0:SOUND12,24:SOUND2,0:SOUND3,6:SOUND9,16:SOUND13,1
Landing sound effect.
The envelope is set here. Since it starts in the air, the landing event always comes first.
- Line 180
PUT SPRITE0,(X,Y),C,SGN(XX)+3:
Show DJ-Bugzy.
ZT=TIME/60:
Calculate the time.
IF(ABS(X-EX)<6 AND ABS(Y-EY)<6) OR (F=0 AND (FNV(X)=32)) THEN
If you are in contact with a ghost or your feet are blank.
SOUND10,0:
Stop scratch bonus sound effect.
PUT SPRITE0,(X,Y),14,5:
DJ-Bugzy's Missing Character Display.
PRINT STRING$(14,10)+STRING$(32,94)+STRING$(2,10):
Falling direction.
LOCATE11,9:PRINT"GAME OVER":
Game Over Display.
FOR I=0 TO 1:I=FNT(0):NEXT:
Wait until trigger input is received.
GOTO110
Return to the title screen.
- Line 190
H=-(H<=SC)*SC-(H>SC)*H:
High score updated.
PRINT USING"SCORE##### SB## Time###.##s";SC;SB;ZT;:
Displays scores, scratch bonuses, and times.
IF F=0 AND (FNV(X)=35) THEN
When you land at the boat landing.
FOR I=0 TO 1:LOCATE0,9:PRINT SPC(31);CHR$(13);" Congratulations! You escaped!";:I=FNT(0):NEXT:
Clear screen is displayed and waits until trigger input is received.
ZH=-(ZH<=ZT)*ZH-(ZH>ZT)*ZT:
Updated clear time.
GOTO 110
Return to the title screen.
ELSE 130
Repeat the main loop.
-- Afterword
I moved to assembler rather quickly, so this is the first time I have used so many BASIC logic operations.
We feel that the limit of 10 lines is more stringent than the limit of one screen.
I was reminded that the "Program Pochette" and "MSX FAN" single-screen programs were well thought out.
We were particular about having a title, game over, and clear screen, and at least two play styles.
Simply put, we need four loops: title, game-over, clear, game-main.
Make it in 10 lines !? I can do it !...
I thought it was seriously impossible to include the title screen until the last minute, but I managed to do it.
We tried to make it possible to play in two different styles: time attack and score attack.
We didn't want the game to be a monotonous dodging game, so we added a SHMUP flavor of scratch and burst.
To make scratching enjoyable, the ghosts are set to be quite lenient in their hit detection.
I did not have to give up joystick input. For MSX games, you don't want to remove joystick support.
The only thing I wanted to do was to make the game speed a bit faster, but then maybe I should already develop it in assembler.
The letter "Y" on the clear screen is now the same color as the raft.
Only one byte of the underscore is rewritten to make it a raft. It would be covered with the letter Y, but I cannot find any other suitable letter.
There aren't many characters common to MSX in all countries. Well, please excuse me for saying that it is such a production.
If you have any feedback, please visit my video account.
Thank you very much.
(Explanation for non-Japanese)
"Program Pochette" and "MSX FAN"
An amateur computer magazine sold in Japan in the 1980s.
A single-screen program is a program designed to fit into 40x24 characters when a List is displayed.
-- About me
This application was created by Kaido Kotoni.
Home page
YouTube
https://www.youtube.com/channel/UC5egj_wXPhi8UQgg8xNPNKw
Nico Nico Douga
Status | Released |
Author | BASIC 10Liner |
Genre | Action |
Tags | 8-Bit, basic, basic10liner, MSX |
Download
Install instructions
-- Startup
- Disk <DJB.dsk>
LOAD "DJB.BAS"
RUN
- Tape <DJB.cas>
CLOAD
RUN
Both have the same content.
Operation has been confirmed with openMSX / blueMSX / webMSX.
Leave a comment
Log in with itch.io to leave a comment.