Post by cobalt on May 13, 2021 13:04:35 GMT -5
So I've finally made it far enough to be able to start showing my work on my Phantasy Star I clone from the Sega Master System.
Walk the world of Palma!
What more can be said? Explore the over-world with out boundaries!
No collision checking in this version so walk where you want.
Marvel at the amazing animation!
Drool over the lush 16 color palette!
And be left Wanting More!
Seriously though, give it a try. What do you think?
Controls:
Arrow keys move character.
ESC key quits.
And as always don't forget to download the resource file attached.
and Subscribe, Like, Share and Comment below!
What more can be said? Explore the over-world with out boundaries!
No collision checking in this version so walk where you want.
Marvel at the amazing animation!
Drool over the lush 16 color palette!
And be left Wanting More!
Seriously though, give it a try. What do you think?
Controls:
Arrow keys move character.
ESC key quits.
And as always don't forget to download the resource file attached.
and Subscribe, Like, Share and Comment below!
'World of Palma; Exploration demo
'5/12/2021
'Collision checking OFF version
'Cobalt
TYPE WorldTiles
Id AS _UNSIGNED _BYTE
Is_Walkable AS _BYTE
Is_Animated AS _BYTE
Encounter_Group AS _BYTE 'what types of creature encounters possible
Is_Village AS _BYTE
Is_Cave AS _BYTE 'Covers all Cave-like locations
END TYPE
TYPE PlayerTemp
Wx AS INTEGER
Wy AS INTEGER
Tx AS _BYTE
Ty AS _BYTE
Fr AS _BYTE
END TYPE
SCREEN _NEWIMAGE(640, 480, 32)
DIM SHARED Map(128, 96) AS WorldTiles, P AS PlayerTemp
DIM SHARED char&, MapAni&, TileX2&, Temp&, frame%, FPSC%, g.facing AS _BYTE, g.moving AS _BYTE
DIM SHARED Conv&, AlisAnim(4) AS _BYTE
DIM SHARED AnimationOrder(3, 8) '8 frames for sync between Waves\marsh and Shore animations
Temp& = _NEWIMAGE(640, 480, 32)
MFI_Loader "PS_Overworld_test.MFI"
_CLEARCOLOR _RGB32(62), char&
'place the conveyor system in corect world location
CONST Conveyor_1_Pos_X = 32 * 73
CONST Conveyor_1_Pos_Y = 32 * 46 + 8
CONST Conveyor_2_Pos_X = 32 * 70 + 8
CONST Conveyor_2_Pos_Y = 32 * 49
CONST Conveyor_Frame_Speed = 2
'--------------------------------------------------
DATA 0,1,2,3,4,4,1,0: 'shore animation order
FOR i%% = 0 TO 7
READ AnimationOrder(1, i%%)
NEXT i%%
DATA 0,1,2,1: 'animation frame order
FOR i%% = 0 TO 3
READ AlisAnim(i%%)
NEXT i%%
CONST TRUE = -1, FALSE = NOT TRUE
CONST Default_Key_Right = 19712, Default_Key_Left = 19200, Default_Key_Up = 18432, Default_Key_Down = 20480
CONST Default_A_Button = 32, Default_B_Button = 13, Default_Start_Button = 65, Default_Select_Button = 66
CONST down = 0, up = 1, right = 2, left = 3
_SCREENMOVE 10, 10
T2! = _FREETIMER
ON TIMER(T2!, 1) FPS
TIMER(T2!) ON
Mapx% = 60
Mapy% = 40
P.Wx = 70
P.Wy = 45
DO
Map_Loader_tiled_Base P.Wx, P.Wy, P.Tx, P.Ty 'Mapx%, Mapy%, Playrx%, Playry%
_PRINTSTRING (0, 0), STR$(FPSC%), Temp&
_PRINTSTRING (48, 0), STR$(P.Wx), Temp&
_PRINTSTRING (96, 0), STR$(P.Wy), Temp&
Place_Alis
_PUTIMAGE , Temp&, _DISPLAY
frame% = frame% + 1
'-----------------Controls------------------
IF _KEYDOWN(Default_Key_Up) AND (NOT g.moving) THEN g.facing = up: g.moving = TRUE
IF _KEYDOWN(Default_Key_Left) AND (NOT g.moving) THEN g.facing = left: g.moving = TRUE
IF _KEYDOWN(Default_Key_Right) AND (NOT g.moving) THEN g.facing = right: g.moving = TRUE
IF _KEYDOWN(Default_Key_Down) AND (NOT g.moving) THEN g.facing = down: g.moving = TRUE
IF _KEYDOWN(27) THEN exitflag%% = -1
'--------------------------------------------
'----------------Movement--------------------
IF g.moving THEN
SELECT CASE g.facing
CASE up
P.Ty = P.Ty + 2
IF (ABS(P.Ty) MOD 32) = 0 THEN g.moving = FALSE: P.Wy = P.Wy - 1: P.Ty = 0
IF NOT _KEYDOWN(Default_Key_Up) THEN Ft%% = 0: P.Fr = 0 ELSE g.moving = TRUE
CASE down
P.Ty = P.Ty - 2
IF (P.Ty MOD 32) = 0 THEN g.moving = FALSE: P.Wy = P.Wy + 1: P.Ty = 0
IF NOT _KEYDOWN(Default_Key_Down) THEN Ft%% = 0: P.Fr = 0 ELSE g.moving = TRUE
CASE left
P.Tx = P.Tx + 2
IF (ABS(P.Tx) MOD 32) = 0 THEN g.moving = FALSE: P.Wx = P.Wx - 1: P.Tx = 0
IF NOT _KEYDOWN(Default_Key_Left) THEN Ft%% = 0: P.Fr = 0 ELSE g.moving = TRUE
CASE right
P.Tx = P.Tx - 2
IF (P.Tx MOD 32) = 0 THEN g.moving = FALSE: P.Wx = P.Wx + 1: P.Tx = 0
IF NOT _KEYDOWN(Default_Key_Right) THEN Ft%% = 0: P.Fr = 0 ELSE g.moving = TRUE
END SELECT
END IF
IF g.moving THEN Ft%% = Ft%% + 1
IF Ft%% = 8 THEN P.Fr = P.Fr + 1: Ft%% = 0
IF P.Fr = 4 THEN P.Fr = 0
'Correct for map wrap
IF P.Wx = 128 THEN P.Wx = 0
IF P.Wx = -1 THEN P.Wx = 127
IF P.Wy = 96 THEN P.Wy = 0
IF P.Wy = -1 THEN P.Wy = 95
'--------------------
_LIMIT 60
LOOP UNTIL exitflag%%
TIMER(T2!) OFF
SUB Map_Loader_tiled_Base (X1%, Y1%, Sx%, Sy%)
STATIC SubFrame(3) AS _BYTE, MainFrame(3) AS _BYTE, Triggered%%
FOR x% = -1 TO 20
FOR y% = -1 TO 15
mx% = X1% + x%
my% = Y1% + y%
'------Adjust for map wrap around------
IF mx% < 0 THEN mx% = 128 + mx% 'use addition cause mx% is a negative
IF mx% > 127 THEN mx% = mx% - 128
IF my% < 0 THEN my% = 96 + my% 'use addition cause my% is a negative
IF my% > 95 THEN my% = my% - 96
'--------------------------------------
'main map tiles
_PUTIMAGE (Sx% + x% * 32, Sy% + y% * 32)-STEP(31, 31), TileX2&, Temp&, (0 + Map(mx%, my%).Id * 34, 0)-STEP(31, 31)
'animated map tiles
IF Map(mx%, my%).Is_Animated THEN
SELECT CASE Map(mx%, my%).Id
CASE 1 TO 4 'waves
_PUTIMAGE (Sx% + x% * 32, Sy% + y% * 32)-STEP(31, 31), MapAni&, Temp&, (544 + MainFrame(1) * 34, 0)-STEP(31, 31)
CASE 21 TO 25 'marsh
_PUTIMAGE (Sx% + x% * 32, Sy% + y% * 32)-STEP(31, 31), MapAni&, Temp&, (544 + (Map(mx%, my%).Id - 21) * 34, 34 + MainFrame(1) * 34)-STEP(31, 31)
CASE 5 TO 20 'shore
_PUTIMAGE (Sx% + x% * 32, Sy% + y% * 32)-STEP(31, 31), MapAni&, Temp&, ((Map(mx%, my%).Id - 5) * 34, AnimationOrder(1, MainFrame(2)) * 34)-STEP(31, 31)
END SELECT
END IF
NEXT y%
NEXT x%
'Horizontal conveyor
_PUTIMAGE (Sx% + Conveyor_1_Pos_X - (X1% * 32), Sy% + Conveyor_1_Pos_Y - (Y1% * 32)), Conv&, Temp&, (0, 0 + (MainFrame(0) * 34))-STEP(255, 31)
'vertical conveyor
_PUTIMAGE (Sx% + Conveyor_2_Pos_X - (X1% * 32), Sy% + Conveyor_2_Pos_Y - (Y1% * 32)), Conv&, Temp&, (257 + (MainFrame(0) * 34), 0)-STEP(31, 223)
FOR i%% = 0 TO 2
SubFrame(i%%) = SubFrame(i%%) + 1
IF SubFrame(0) = 5 + Conveyor_Frame_Speed THEN MainFrame(0) = MainFrame(0) + Conveyor_Frame_Speed: SubFrame(0) = 0
IF SubFrame(1) = 16 THEN MainFrame(1) = MainFrame(1) + 1: SubFrame(1) = 0
IF SubFrame(2) = 24 THEN MainFrame(2) = MainFrame(2) + 1: SubFrame(2) = 0
NEXT i%%
IF MainFrame(0) = 8 THEN MainFrame(0) = 0
IF MainFrame(1) = 4 THEN MainFrame(1) = 0
IF MainFrame(2) = 8 THEN MainFrame(2) = 0
END SUB
SUB FPS
' STATIC LastCount%
FPSC% = frame%
frame% = 0
END SUB
SUB Place_Alis
IF NOT g.moving THEN
_PUTIMAGE (290, 210)-STEP(31, 45), char&, Temp&, (0 + 17 * g.facing, 120)-STEP(15, 22)
ELSE
_PUTIMAGE (290, 210)-STEP(31, 45), char&, Temp&, (68 + 51 * g.facing + AlisAnim(P.Fr) * 17, 120)-STEP(15, 22)
END IF
END SUB
SUB MFI_Loader (FN$)
DIM Size(128) AS LONG, FOffset(128) AS LONG
OPEN FN$ FOR BINARY AS #1
GET #1, , c~%% 'retrieve number of files
FOR I~%% = 1 TO c~%%
GET #1, , FOffset(I~%%)
GET #1, , Size(I~%%)
FOffset&(I~%%) = FOffset&(I~%%) + 1
NEXT I~%%
TileX2& = LoadGFX(FOffset(1), Size(1)) ' _LOADIMAGE("gfx\maps\PalmaTiles2x2.bmp", 32) '_NEWIMAGE(640, 480, 32)
Conv& = LoadGFX(FOffset(2), Size(2)) '_LOADIMAGE("gfx\maps\conveyoranim.bmp", 32) 'Conveyor
MapAni& = LoadGFX(FOffset(3), Size(3)) '_LOADIMAGE("gfx\maps\mapanimation.bmp", 32) 'Water, shore, and marsh frames
char& = LoadGFX(FOffset(4), Size(4)) '_LOADIMAGE("gfx\CharacterSheetC.png", 32) '
LoadData FOffset(5), Size(5)
CLOSE #1
IF _FILEEXISTS("temp.dat") THEN KILL "temp.dat"
END SUB
SUB LoadData (Foff&, Size&)
IF _FILEEXISTS("temp.dat") THEN KILL "temp.dat"
OPEN "temp.dat" FOR BINARY AS #3
dat$ = SPACE$(Size&)
GET #1, Foff&, dat$
PUT #3, , dat$
CLOSE #3
F1 = FREEFILE
OPEN "temp.dat" FOR BINARY AS #F1
' OPEN "PhantasyStarPalma2.Dat" FOR BINARY AS #1
GET #F1, , Map()
' CLOSE
CLOSE #F1
END SUB
REM '$include:'MFI_Loader2.bi'
FUNCTION LoadGFX& (Foff&, Size&)
IF _FILEEXISTS("temp.dat") THEN KILL "temp.dat"
OPEN "temp.dat" FOR BINARY AS #3
dat$ = SPACE$(Size&)
GET #1, Foff&, dat$
PUT #3, , dat$
CLOSE #3
LoadGFX& = _LOADIMAGE("temp.dat", 32)
END FUNCTION
FUNCTION LoadFFX& (Foff&, Size&, Fize%%)
IF _FILEEXISTS("temp.dat") THEN KILL "temp.dat"
OPEN "temp.dat" FOR BINARY AS #3
dat$ = SPACE$(Size&)
GET #1, Foff&, dat$
PUT #3, , dat$
CLOSE #3
LoadFFX& = _LOADFONT("temp.dat", Fize%%, "monospace")
END FUNCTION
FUNCTION LoadSFX& (Foff&, Size&)
IF _FILEEXISTS("temp.dat") THEN KILL "temp.dat"
OPEN "temp.dat" FOR BINARY AS #3
dat$ = SPACE$(Size&)
GET #1, Foff&, dat$
PUT #3, , dat$
CLOSE #3
LoadSFX& = _SNDOPEN("temp.dat")
END FUNCTION