Uploading final version

This commit is contained in:
JJFlash 2022-11-01 08:37:14 +01:00
parent ab78d63bcc
commit c9e9021b71
5 changed files with 633 additions and 458 deletions

Binary file not shown.

202
inc_monster.bas Normal file
View File

@ -0,0 +1,202 @@
Const MASK_SUBGROUP = 8 '0000 1000
Const MASK_WALK_LOWHALF = 24 '0001 1000
Dim SHARED bMonster_Col as BYTE
Dim SHARED bMonster_Row as BYTE
Dim bMonster_Direction as BYTE
Dim bMonster_Lag as BYTE
Dim bMonster_PreviousTile as BYTE
Dim SHARED bMonster_SpeedUpMode as BYTE
Dim bMonster_MarkingMode as BYTE
Dim bMonster_DelayFrame as BYTE
Dim bMonster_Distance_TurnONSpeedUp as BYTE
Dim bMonster_Distance_TurnOFFSpeedUp as BYTE
Dim bManhattanDistance as BYTE
declare sub monsterMovement() STATIC
sub initMonster() SHARED STATIC
bMonsterIsOn = FALSE
if bSkillLevel < 8 then
bTreasuresToActivateMonster = 8 - bSkillLevel
end if
bMonster_Col = 1
bMonster_Row = 1
bMonster_Direction = EAST
bMonster_Lag = 10
bMonster_PreviousTile = SPACE
bMonster_SpeedUpMode = FALSE
bMonster_MarkingMode = FALSE
if bSkillLevel < 16 then
bMonster_Distance_TurnONSpeedUp = 21 - bSkillLevel 'minimum: 6
bMonster_Distance_TurnOFFSpeedUp = 12 - shr(bSkillLevel, 1) 'minimum: 5
end if
bMonster_DelayFrame = 9 '= Lag - 1
VOICE 2 OFF TONE 256 WAVE NOISE ADSR 0, 0, VOI2_S, VOI2_R 'monster sound
'~ textat 33, 3, " "
'~ textat 33, 4, " "
'~ textat 33, 21, " "
end sub
sub handleMonster() SHARED STATIC
Dim bMoveFrame as BYTE
bManhattanDistance = myByteABS(bPlayer_Row - bMonster_Row) + myByteABS(bPlayer_Col - bMonster_Col)
'~ textat 33, 21, str$(bManhattanDistance) + " ", 11 'dark gray
if bManhattanDistance > bMonster_Distance_TurnONSpeedUp then
bMonster_SpeedUpMode = TRUE
else
if bManhattanDistance < bMonster_Distance_TurnOFFSpeedUp then
if bMonster_SpeedUpMode then
if bMonster_Lag > 1 then
bMonster_Lag = bMonster_Lag - 1
textat 33, 20, 11 - bMonster_Lag, 2 'red
end if
bMonster_SpeedUpMode = FALSE
VOICE 2 TONE 256 ADSR 0, 0, VOI2_S, VOI2_R
end if
end if
end if
if bMonster_SpeedUpMode then
VOICE 2 TONE shl(cword(bManhattanDistance), 8) ADSR 0, 0, 2, VOI2_R
call monsterMovement()
exit sub
end if
if bMonster_DelayFrame then
bMonster_DelayFrame = bMonster_DelayFrame - 1
if bMonster_DelayFrame = 0 then bMoveFrame = bSkillLevel
else
call monsterMovement()
if bMoveFrame then bMoveFrame = bMoveFrame - 1
if bMoveFrame = 0 then bMonster_DelayFrame = bMonster_Lag - 1
end if
'~ textat 33, 3, str$(bMonster_DelayFrame), 10 'light red
'~ textat 33, 4, str$(bMoveFrame) + " ", 13 'light green
end sub
sub monsterMovement() STATIC
Const MINUS_ONE = 255
Dim wPeekingLocation as WORD
Dim bMonster_PreviousColour as BYTE
Dim bTravelingDirection as BYTE
Dim bThisTileDistance as BYTE
Dim bClosestDistance as BYTE
Dim bThisTileRow as BYTE
Dim bThisTileCol as BYTE
Dim bClosestTileDirection as BYTE
Dim bPeekedDirection as BYTE FAST
Dim bWalkableDirections(4) as BYTE '0...3
Dim bWalkableDirections_Count as BYTE FAST
Dim bTrailDirections(4) as BYTE '0...3
Dim bTrailDirections_Count as BYTE FAST
'------------------------------------------------
wPeekingLocation = scrAddrCache(bMonster_Row) + bMonster_Col
bTravelingDirection = bMonster_Direction
bWalkableDirections_Count = MINUS_ONE
bTrailDirections_Count = MINUS_ONE
bClosestDistance = 255
bMonster_Direction = (bMonster_Direction - 1) AND 3 'starting from the Monster's right (going clockwise)
For bPeekedDirection = 1 to 4
bPeekedTileContent = peek(wPeekingLocation + iDirections(bMonster_Direction))
if (bPeekedTileContent AND MASK_ALL) = GROUP_CREATURES then bExitEvent = EVENT_PLAYER_CAUGHT : exit for 'Gotcha, Player!!
if (bPeekedTileContent AND MASK_WALK_LOWHALF) = GROUP_WALKABLE then
if bPeekedTileContent = TRAIL then
bWalkableDirections_Count = bWalkableDirections_Count + 1
bTrailDirections_Count = bTrailDirections_Count + 1
bTrailDirections(bTrailDirections_Count) = bMonster_Direction
else
if bPeekedDirection < 4 then 'ignoring the opposite travelled direction!
bWalkableDirections_Count = bWalkableDirections_Count + 1
bWalkableDirections(bWalkableDirections_Count) = bMonster_Direction
'ALSO, find the closest tile to the player...
bThisTileRow = bMonster_Row : bThisTileCol = bMonster_Col
if (bMonster_Direction AND 1) then 'odd number, vertical direction
bThisTileRow = bMonster_Row + cbyte(SGN(iDirections(bMonster_Direction)))
else 'even number, horizontal direction
bThisTileCol = bMonster_Col + cbyte(iDirections(bMonster_Direction))
end if
bThisTileDistance = myByteABS(bPlayer_Row - bThisTileRow) + myByteABS(bPlayer_Col - bThisTileCol)
if bThisTileDistance < bClosestDistance then
bClosestDistance = bThisTileDistance
bClosestTileDirection = bMonster_Direction
end if
end if
end if
end if
bMonster_Direction = (bMonster_Direction + 1) AND 3 'now going counter-clockwise
next bPeekedDirection
if bExitEvent = EVENT_NONE then
if bTrailDirections_Count <> MINUS_ONE then
bMonster_Direction = bTrailDirections(myRandom(bTrailDirections_Count, 3))
else
if bWalkableDirections_Count = MINUS_ONE then
bMonster_Direction = (bTravelingDirection + 2) AND 3 'go to the opposite direction and start marking tiles
bMonster_MarkingMode = TRUE
else
if bWalkableDirections_Count = 2 then 'if there are *three* walkable tiles...
bWalkableDirections_Count = bWalkableDirections_Count + 1
bWalkableDirections(bWalkableDirections_Count) = bClosestTileDirection
end if
bMonster_Direction = bWalkableDirections(myRandom(bWalkableDirections_Count, 3))
end if
end if
if bWalkableDirections_Count AND (bWalkableDirections_Count <> MINUS_ONE) then bMonster_MarkingMode = FALSE 'if there are at least *two* walkable tiles...
end if
'------------------------DRAW-------------------------------------------
if (bMonster_PreviousTile AND MASK_ALL) <> GROUP_TREASURE then
bMonster_PreviousTile = SPACE
end if
if bMonster_MarkingMode then
bMonster_PreviousTile = bMonster_PreviousTile OR MASK_SUBGROUP
end if
charat bMonster_Col, bMonster_Row, bMonster_PreviousTile, bMonster_PreviousColour
bMonster_PreviousTile = peek(wPeekingLocation + iDirections(bMonster_Direction))
bMonster_PreviousColour = peek(VIC_COLOR_OFFSET + wPeekingLocation + iDirections(bMonster_Direction))
if (bMonster_Direction AND 1) then 'odd number, vertical direction
bMonster_Row = bMonster_Row + cbyte(SGN(iDirections(bMonster_Direction)))
else 'even number, horizontal direction
bMonster_Col = bMonster_Col + cbyte(iDirections(bMonster_Direction))
end if
charat bMonster_Col, bMonster_Row, MONSTER, 2 'red
VOICE 2 ON
'debug code right after -DRAW-
'~ for bMonsterDebug as BYTE = 0 to 3
'~ textat 33, 2 + bMonsterDebug, " "
'~ next bMonsterDebug
'~ if bWalkableDirections_Count <> MINUS_ONE then
'~ for bMonsterDebug as BYTE = 0 to bWalkableDirections_Count
'~ if bWalkableDirections(bMonsterDebug) = bMonster_Direction then
'~ textat 33, 2 + bMonsterDebug, str$(bWalkableDirections(bMonsterDebug)), 1 'white
'~ else
'~ textat 33, 2 + bMonsterDebug, str$(bWalkableDirections(bMonsterDebug)), 11 'gray
'~ end if
'~ next bMonsterDebug
'~ end if
end sub

97
inc_player.bas Normal file
View File

@ -0,0 +1,97 @@
SHARED Const PLAYER = 64
SHARED Const PLAYER_ALT = 65
Const PLAYER_LEFT = 66
Const MASK_TREASURE_GOLD = 247 '1111 0111
Const MASK_TILE = 7 '0000 0111
SHARED Const EAST = 0
Const NORTH = 1
Const WEST = 2
Const SOUTH = 3
Dim SHARED bPlayer_Col as BYTE
Dim SHARED bPlayer_Row as BYTE
Dim SHARED bPlayer_FacingCharacter as BYTE
Dim bPlayerDirection as BYTE
declare function playerMoved as BYTE () STATIC
sub initPlayer() SHARED STATIC
bPlayer_Col = 1
bPlayer_Row = 1
bPlayer_FacingCharacter = PLAYER
VOICE 1 TONE 256 PULSE 1536 WAVE PULSE ADSR 0, 0, VOI1_S, VOI1_R OFF 'player sound
end sub
sub playerMovement() SHARED STATIC
bJoystick2 = peek( $DC00) XOR 127
if (bJoystick2 AND 1) then
bPlayerDirection = NORTH
if playerMoved() then exit sub
else
if (bJoystick2 AND 2) then
bPlayerDirection = SOUTH
if playerMoved() then exit sub
end if
end if
if (bJoystick2 AND 4) then
bPlayerDirection = WEST
bPlayer_FacingCharacter = PLAYER_LEFT
if playerMoved() then exit sub
else
if (bJoystick2 AND 8) then
bPlayerDirection = EAST
bPlayer_FacingCharacter = PLAYER
if playerMoved() then exit sub
end if
end if
end sub
function playerMoved as BYTE () STATIC
Dim wScoreTable(5) as WORD @loc_wScoreTable
loc_wScoreTable:
DATA AS WORD 10, 20, 30, 50, 500
bPeekedTileContent = peek(scrAddrCache(bPlayer_Row) + bPlayer_Col + iDirections(bPlayerDirection))
if (bPeekedTileContent AND MASK_ALL) = GROUP_CREATURES then 'Player bumped into Monster!
charat bPlayer_Col, bPlayer_Row, SPACE
bExitEvent = EVENT_PLAYER_CAUGHT
return TRUE
end if
if (bPeekedTileContent AND MASK_WALKABLE) = GROUP_WALKABLE then
charat bPlayer_Col, bPlayer_Row, TRAIL, 11 'dark grey
VOICE 1 ON
if (bPlayerDirection AND 1) then 'odd number, vertical direction
bPlayer_Row = bPlayer_Row + cbyte(SGN(iDirections(bPlayerDirection)))
else 'even number, horizontal direction
bPlayer_Col = bPlayer_Col + cbyte(iDirections(bPlayerDirection))
end if
charat bPlayer_Col, bPlayer_Row, bPlayer_FacingCharacter, 13 'light green
if (bPeekedTileContent AND MASK_ALL) = GROUP_TREASURE Then
bTreasuresCollected = bTreasuresCollected + 1
if bTreasuresCollected = bTreasuresToActivateMonster then bMonsterIsOn = TRUE
if (bPeekedTileContent AND MASK_TREASURE_GOLD) = TREASURE_GOLD then 'both non-marked and marked gold!
bGoldNotCollected = FALSE : bSoundTimer_GoldTaken = 28
else
bSoundTimer_TreasureTaken = 7
end if
wScore = wScore + wScoreTable( (bPeekedTileContent AND MASK_TILE) )
textat 33, 15, wScore, 10 'light red
if bTreasuresCollected = bTreasuresToOpenDoor then call openDoorAnimation()
else
if bPeekedTileContent = DOOR_OPEN then bExitEvent = EVENT_PLAYER_EXITED
end if
return TRUE
end if
return FALSE
end function

File diff suppressed because it is too large Load Diff

Binary file not shown.