Browse Source

Failed to realise that the code itself was absent from that last commit. Should now all be here.

main
Jo Jerrica Decker 7 years ago
parent
commit
8c8103b451
  1. 57
      Clocks.bas
  2. BIN
      Design/Game Specification.doc
  3. BIN
      Design/GameDescription.docx
  4. BIN
      Design/GameDesign.xlsx
  5. 1
      Design/Pseudocode/Form_frmGravity/Sub_Form_KeyDown.txt
  6. 1
      Design/Pseudocode/Form_frmGravity/Sub_Form_KeyUp.txt
  7. 38
      Design/Pseudocode/Form_frmGravity/Sub_Form_Load.txt
  8. 17
      Design/Pseudocode/Form_frmGravity/Sub_cmdHelp_Click.txt
  9. 18
      Design/Pseudocode/Form_frmGravity/Sub_cmdStart_Click.txt
  10. 39
      Design/Pseudocode/Form_frmGravity/Sub_cmdTopScores_Click.txt
  11. 72
      Design/Pseudocode/Form_frmGravity/Sub_tmrTimer_Timer.txt
  12. 38
      Design/Pseudocode/Module_Clocks/Sub_IncreaseClock.txt
  13. 4
      Design/Pseudocode/Module_Clocks/Sub_ResetClock.txt
  14. 14
      Design/Pseudocode/Module_HighScores/Sub_MoveName.txt
  15. 30
      Design/Pseudocode/Module_HighScores/Sub_WriteScore.txt
  16. 100
      Design/Pseudocode/Module_Levels/LoadLevel.txt
  17. 1
      Design/Pseudocode/Module_PlayerMovement/Function_IncreaseVelocity.txt
  18. 135
      Design/Pseudocode/Module_PlayerMovement/Sub_DropPlayer.txt
  19. 208
      Design/Pseudocode/Module_PlayerMovement/Sub_MovePlayer.txt
  20. 1
      Design/Pseudocode/Module_PlayerState/ResetPlayerState.txt
  21. 1
      Design/Pseudocode/Module_PlayerState/Sub_DazePlayer.txt
  22. 1
      Design/Pseudocode/Module_PlayerState/Sub_ShockPlayer.txt
  23. 1
      Design/Pseudocode/Module_PlayerState/Sub_WinLevel.txt
  24. 9
      Design/Pseudocode/Module_RobotMovement/Sub_CheckRobotContact.txt
  25. 150
      Design/Pseudocode/Module_RobotMovement/Sub_MoveBot.txt
  26. BIN
      Design/SpriteOutline.jpg
  27. BIN
      Design/Storyboard/1.png
  28. BIN
      Design/Storyboard/10.png
  29. BIN
      Design/Storyboard/11.png
  30. BIN
      Design/Storyboard/2.png
  31. BIN
      Design/Storyboard/3.png
  32. BIN
      Design/Storyboard/4.png
  33. BIN
      Design/Storyboard/5.png
  34. BIN
      Design/Storyboard/6.png
  35. BIN
      Design/Storyboard/7.png
  36. BIN
      Design/Storyboard/8.png
  37. BIN
      Design/Storyboard/9.png
  38. BIN
      Design/Storyboard/Storyboard.jpg
  39. BIN
      Design/StructureAndDesign.docx
  40. BIN
      Design/Testing/Improvement.docx
  41. BIN
      Design/Testing/Questionnaire.docx
  42. BIN
      Design/Testing/QuestionnaireResults.xlsx
  43. BIN
      Design/Testing/Test Log.xlsx
  44. BIN
      Design/TileCollision.xlsx
  45. BIN
      Design/Tiles/BlockSides.ods
  46. BIN
      Design/Tiles/BlockSides.xlsx
  47. BIN
      Design/Tiles/TileSet.png
  48. BIN
      Design/Tiles/TileSet.xcf
  49. BIN
      Design/Tiles/tilemapscreen.png
  50. BIN
      Design/Tiles/tilemapscreenshot.jpg
  51. BIN
      Design/Tiles/tilemapscreenshot.png
  52. BIN
      Design/UserGuide.docx
  53. 56
      Globals.bas
  54. 39
      Gravity.vbp
  55. 9
      Gravity.vbw
  56. 62
      HighScores.bas
  57. 136
      Levels.bas
  58. BIN
      Maps/Editor.xlsx
  59. 454
      Maps/Level.csv
  60. 466
      PlayerMovement.bas
  61. 20
      PlayerState.bas
  62. 269
      RobotMovement.bas
  63. 5
      Scores.txt
  64. BIN
      Sprites/BMPs/Bot_1_0_0.bmp
  65. BIN
      Sprites/BMPs/Bot_1_0_1.bmp
  66. BIN
      Sprites/BMPs/Bot_1_0_2.bmp
  67. BIN
      Sprites/BMPs/Bot_1_0_3.bmp
  68. BIN
      Sprites/BMPs/Bot_1_1_0.bmp
  69. BIN
      Sprites/BMPs/Bot_1_1_1.bmp
  70. BIN
      Sprites/BMPs/Bot_1_1_2.bmp
  71. BIN
      Sprites/BMPs/Bot_1_1_3.bmp
  72. BIN
      Sprites/BMPs/Bot_1_2_0.bmp
  73. BIN
      Sprites/BMPs/Bot_1_2_1.bmp
  74. BIN
      Sprites/BMPs/Bot_1_2_2.bmp
  75. BIN
      Sprites/BMPs/Bot_1_2_3.bmp
  76. BIN
      Sprites/BMPs/Bot_1_3_0.bmp
  77. BIN
      Sprites/BMPs/Bot_1_3_1.bmp
  78. BIN
      Sprites/BMPs/Bot_1_3_2.bmp
  79. BIN
      Sprites/BMPs/Bot_1_3_3.bmp
  80. BIN
      Sprites/BMPs/Bot_2_0_0.bmp
  81. BIN
      Sprites/BMPs/Bot_2_0_1.bmp
  82. BIN
      Sprites/BMPs/Bot_2_0_2.bmp
  83. BIN
      Sprites/BMPs/Bot_2_0_3.bmp
  84. BIN
      Sprites/BMPs/Bot_2_1_0.bmp
  85. BIN
      Sprites/BMPs/Bot_2_1_1.bmp
  86. BIN
      Sprites/BMPs/Bot_2_1_2.bmp
  87. BIN
      Sprites/BMPs/Bot_2_1_3.bmp
  88. BIN
      Sprites/BMPs/Bot_2_2_0.bmp
  89. BIN
      Sprites/BMPs/Bot_2_2_1.bmp
  90. BIN
      Sprites/BMPs/Bot_2_2_2.bmp
  91. BIN
      Sprites/BMPs/Bot_2_2_3.bmp
  92. BIN
      Sprites/BMPs/Bot_2_3_0.bmp
  93. BIN
      Sprites/BMPs/Bot_2_3_1.bmp
  94. BIN
      Sprites/BMPs/Bot_2_3_2.bmp
  95. BIN
      Sprites/BMPs/Bot_2_3_3.bmp
  96. BIN
      Sprites/BMPs/Character_Dazed_0_0.bmp
  97. BIN
      Sprites/BMPs/Character_Dazed_0_1.bmp
  98. BIN
      Sprites/BMPs/Character_Dazed_1_0.bmp
  99. BIN
      Sprites/BMPs/Character_Dazed_1_1.bmp
  100. BIN
      Sprites/BMPs/Character_Dazed_2_0.bmp

57
Clocks.bas

@ -0,0 +1,57 @@
Attribute VB_Name = "Clocks"
Dim TimerString As String
Public Sub IncreaseClock()
'Always tick up the milliseconds by five per frame.
LevelMilliseconds = LevelMilliseconds + 5
'When 100 milliseconds pass, a second passes.
If LevelMilliseconds >= 100 Then
LevelMilliseconds = 0
LevelSeconds = LevelSeconds + 1
End If
'When 60 seconds pass, a minute passes.
If LevelSeconds >= 60 Then
LevelSeconds = 0
LevelMinutes = LevelMinutes + 1
End If
'Restrict the timer to prevent an error (even though it would take 45 days to reach 65536 minutes).
If LevelMinutes >= 10000 Then
LevelMinutes = 10000
LevelSeconds = 0
LevelMilliseconds = 0
End If
'Construct a string containing the current timer.
'If any of the unit values are below 10, then add a leading zero to keep them 2 characters long.
TimerString = "Timer: "
If LevelMinutes < 10 Then
TimerString = TimerString & "0" & LevelMinutes & ":"
Else
TimerString = TimerString & LevelMinutes & ":"
End If
If LevelSeconds < 10 Then
TimerString = TimerString & "0" & LevelSeconds & ":"
Else
TimerString = TimerString & LevelSeconds & ":"
End If
If LevelMilliseconds < 10 Then
TimerString = TimerString & "0" & LevelMilliseconds
Else
TimerString = TimerString & LevelMilliseconds
End If
'Send the constructed string to the timer label.
frmGravity.lblTimer.Caption = TimerString
End Sub
Public Sub ResetClock()
LevelMinutes = 0
LevelSeconds = 0
LevelMilliseconds = 0
End Sub

BIN
Design/Game Specification.doc

Binary file not shown.

BIN
Design/GameDescription.docx

Binary file not shown.

BIN
Design/GameDesign.xlsx

Binary file not shown.

1
Design/Pseudocode/Form_frmGravity/Sub_Form_KeyDown.txt

@ -0,0 +1 @@
Set KeyIsDown(KeyCode) to True

1
Design/Pseudocode/Form_frmGravity/Sub_Form_KeyUp.txt

@ -0,0 +1 @@
Set KeyIsDown(KeyCode) to False

38
Design/Pseudocode/Form_frmGravity/Sub_Form_Load.txt

@ -0,0 +1,38 @@
For GravDir is between 0 and 3
Set PlayerIdle(GravDir) to "Sprites/Character_Idle_" & GravDir & ".gif"
For PlayerWalkFrame is between 0 and 5
Set PlayerWalk(GravDir, PlayerWalkFrame) to "Sprites/Character_Walk_" & GravDir & "_" & PlayerWalkFrame & ".gif"
Next
For PlayerOtherFrame is between 0 and 1
Set PlayerShock(GravDir, PlayerWalkFrame) to "Sprites/Character_Shock_" & GravDir & "_" & PlayerOtherFrame & ".gif"
Set PlayerDazed(GravDir, PlayerWalkFrame) to "Sprites/Character_Dazed_" & GravDir & "_" & PlayerOtherFrame & ".gif"
Next
For RobotFrame is between 0 and 3
For Robot is between 0 and 1
Set RobotWalk(Robot, GravDir, RobotFrame) to "Sprites/Character_Shock_" & GravDir & "_" & PlayerOtherFrame & ".gif"
Next
Next
Next
For Tile is between 0 and 15
Set TileTable(Tile) to "Tiles/Tile_" & Tile & ".gif"
Next
Set ShockTile to "Tiles/Tile_Shock.gif"
Set StartTile to "Tiles/Tile_Start.gif"
Set FinishTile to "Tiles/Tile_Finish.gif"
Set Level to 0
Call the procedure LoadLevel with the parameter "Title"
Set cmdState to visible
Set cmdHelp to visible
Set cmdTopScores to visible
Set txtPlayerNane to visible
Set tmrTimer to disabled
Set the interval of tmrTimer to the result of 1000 / 20

17
Design/Pseudocode/Form_frmGravity/Sub_cmdHelp_Click.txt

@ -0,0 +1,17 @@
If picHelp is not visible then
Set picScores to not visible
Set picHelp to visible
Clear picHelp
Open "Help.txt" for reading, as file 1
While not at the end of file
Read a line from file 1 and pass it to HelpLine
print HelpLine to picHelp
Loop
Close file 1
Else
Set picHelp to not visible
End If

18
Design/Pseudocode/Form_frmGravity/Sub_cmdStart_Click.txt

@ -0,0 +1,18 @@
Set PlayerName to the uppercase equivalent of the contents of txtPlayerName
If PlayerName is not blank then
Set tmrTimer to enabled
Set picHelp to not visible
Set picScores to not visible
Set cmdHelp to not visible
Set cmdTopScores to not visible
Set txtPlayerName to not visible
Set cmdStart to not visible
Call the procedure ResetClock
Call the procedure LoadLevel with the parameter "Lab"
Set PlayerRetries to 3
Set the caption of lblRetries to "Retries: " & PlayerRetries
End if

39
Design/Pseudocode/Form_frmGravity/Sub_cmdTopScores_Click.txt

@ -0,0 +1,39 @@
If picScores is not visible then
Set picHelp to not visible
Set picScores to visible
Clear picScores
Print "===THE FASTEST TIMES===" to picScores
Print "" to picScores
Open "Scores.txt" for reading, as file 1
While not at the end of file
Read a line from file 1 and pass it to TopName, TopMinute, TopSecond, TopMillisecond
Set TopTime to a blank string
If TopMinute is less than 10 then
Set TopTime to TopTime & "0" & TopMinute & ":"
Else
Set TopTime to TopTime & TopMinute & ":"
End If
If TopSecond is less than 10 then
Set TopTime to TopTime & "0" & TopSecond & ":"
Else
Set TopTime to TopTime & TopMinute & ":"
End If
If TopMillisecond is less than 10 then
Set TopTime to TopTime & "0" & TopMillisecond
Else
Set TopTime to TopTime & TopMillisecond
End If
Print TopName, TopTime to picScores
Loop
Close file 1
Else
set picScores to not visible
End If

72
Design/Pseudocode/Form_frmGravity/Sub_tmrTimer_Timer.txt

@ -0,0 +1,72 @@
If PlayerState is equal to 0 then
Call the procedure MovePlayer
Increase TickCount by 1
Set PlayerFallSpeed to the result of calling the function IncreaseVelocity with the parameters 0, 10, TickCount, 0.4
If PlayerFallSpeed is greater than 30 then
Set PlayerFallSpeed to 30
Decrease TickCount by 1
End If
Call the procedure DropPlayer
Call the procedure MoveBot
Call the procedure CheckRobotContact
Set imgPlayer.Left to the result of PlayerPos(0) - imgPlayer.Width / 2
Set imgPlayer.Top to the result of PlayerPos(1) - imgPlayer.Height / 2
For a is between 0 and 1
set imgRobot(a).Left to the result of RobotPos(a, 0) - imgRobot.Width / 2
set imgRobot(a).Top to the result of RobotPos(a, 1) - imgRobot.Height / 2
Next
Call the procedure IncreaseClock
ElseIf PlayerState is equal to 1 then
Increase ReportTimer by 1
Set the caption of lblLevelName to "Level Complete!"
If ReportTimer is greater than or equal to 90 then
Increase Level by 1
If Level is greater than or equal to 100 then
Call the procedure Form_Load
ElseIf Level is greater than or equal to 4 then
Set Level to 101
Call the procedure LoadLevel with the parameter "Win"
Call the procedure PlayerStates.WinLevel
Call the procedure WriteScore
Else
Call the procedure LoadLevel with the parameter "Lab"
End If
End If
ElseIf PlayerState is greater than or equal to 2 then
Increase ReportTimer by 1
Increase PlayerAnim by 1
If PlayerAnim is greater than 1 then
Set PlayerAnim to 0
End If
If PlayerState is equal to 2 then
Set the caption of lblLevelName to "Oof!"
Load the file in PlayerDazed(PlayerGravityDir, PlayerAnim) into imgPlayer.Picture
Else
Set the caption of lblLevelName to "Don't take me, Robro!"
Load the file in PlayerShock(PlayerGravityDir, PlayerAnim) into imgPlayer.Picture
End If
If ReportTimer is greater than or equal to 90 then
If PlayerRetries is greater than 0 then
Decrease PlayerRetries by 1
Set the caption of lvlRetries to "Retries: " & PlayerRetries
Call the procedure LoadLevel with the parameter "Lab"
Else
Call the procedure Form_Load
End If
End If
End If

38
Design/Pseudocode/Module_Clocks/Sub_IncreaseClock.txt

@ -0,0 +1,38 @@
Increase LevelMilliseconds by 5
If LevelMilliseconds is greater than or equal to 100 then
Set LevelMilliseconds to 0
Increase LevelSeconds by 1
End If
If LevelSeconds is greater than or equal to 60 then
Set LevelSeconds to 0
Increase LevelMinutes by 1
End If
If LevelMinutes is greater than or equal to 10000 then
Set LevelMinutes to 10000
Set LevelSeconds to 0
Set LevelMilliseconds to 0
End If
Set TimerString to "Timer: "
If LevelMinutes is less than 10 then
Set TimerString to TimerString & "0" & LevelMinutes & ":"
Else
Set TimerString to TimerString & LevelMinutes & ":"
End If
If LevelSeconds is less than 10 then
Set TimerString to TimerString & "0" & LevelSeconds & ":"
Else
Set TimerString to TimerString & LevelSeconds & ":"
End If
If LevelMilliseconds is less than 10 then
Set TimerString to TimerString & "0" & LevelMilliseconds
Else
Set TimerString to TimerString & LevelMilliseconds
End If
Set the caption of frmGravity.lblTimer to TimerString

4
Design/Pseudocode/Module_Clocks/Sub_ResetClock.txt

@ -0,0 +1,4 @@
Sub ResetClock:
Set LevelMinutes to 0
Set LevelSeconds to 0
Set LevelMilliseconds to 0

14
Design/Pseudocode/Module_HighScores/Sub_MoveName.txt

@ -0,0 +1,14 @@
Set TempName to TopName(ScoreLine - 1)
Set TempMinute to TopMinute(ScoreLine - 1)
Set TempSecond to TopSecond(ScoreLine - 1)
Set TempMillisecond to TopMillisecond(ScoreLine - 1)
Set TopName(ScoreLine - 1) to TopName(ScoreLine)
Set TopMinutes(ScoreLine - 1) to TopMinute(ScoreLine)
Set TopSecond(ScoreLine - 1) to TopSecond(ScoreLine)
Set TopMillisecond(ScoreLine - 1) to TopMillisecond(ScoreLine)
Set TopName(ScoreLine) to TempName
Set TopMinute(ScoreLine) to TempMinute
Set TopSecond(ScoreLine) to TempSecond
Set TopMillisecond(ScoreLine) to TempMillisecond

30
Design/Pseudocode/Module_HighScores/Sub_WriteScore.txt

@ -0,0 +1,30 @@
Open "Scores.txt" for reading, as file 1
Set LineCounter to 0
While not at end of file
Read a line from file 1 and pass its values to TopName(LineCounter), TopMinute(LineCounter), TopSecond(LineCounter), TopMillisecond(LineCounter)
Increase LineCounter by 1
Loop
Close file 1
Set TopName(5) to PlayerName
Set TopMinute(5) to LevelMinutes
Set TopSecond(5) to LevelSeconds
Set TopMillisecond(5) to LevelMilliseconds
For LineCounter is between 5 to 1, stepping back 1
Set TotalMilliseconds(0) to the result of ((((TopMinute(LineCounter - 1) / 100000000) * 60 + (TopSecond(LineCounter - 1) / 100000000)) * 100) + (TopMillisecond(LineCounter - 1)) / 100000000)
Set TotalMilliseconds(1) to the result of (((TopMinute(LineCounter) / 100000000) * 60 + (TopSecond(LineCounter) / 100000000)) * 100) + (TopMillisecond(LineCounter)) / 100000000)
If TotalMilliseconds(1) is less than TotalMilliseconds(0) then
Call the procedure MoveName with the parameter LineCounter
End If
Next
Open "Scores.txt" for writing, as file 2
For LineCounter is between 0 to 4
Write TopName(LineCounter), TopMinute(LineCounter), TopSecond(LineCounter), TopMillisecond(LineCounter) to file 2
Next
Close file 2

100
Design/Pseudocode/Module_Levels/LoadLevel.txt

@ -0,0 +1,100 @@
Open "Maps/" & Pack & "_" & Level & ".lvl" for reading, as file 1
Read a line from file 1 and pass its value to LevelName
Read a line from file 1 and pass its values to PlayerPos(0), PlayerPos(1), PlayerGravityDir
Read a line from file 1 and pass its values to RobotPos(0, 0), RobotPos(0, 1), RobotDir(0), RobotFacing(0)
Read a line from file 1 and pass its values to RobotPos(1, 0), RobotPos(1, 1), RobotDir(1), RobotFacing(1)
For y is between 0 to 17
For x is between 0 to 24
Read a line from file 1 and pass its value to Map(x, y)
Next
Next
Close file 1
Set the caption of frmGravity.lblLevelName to LevelName
Set PlayerPos(0) to the result of PlayerPos(0) * 32 + 16
Set PlayerPos(1) to the result of PlayerPos(1) * 32 + 16
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Set frmGravity.imgPlayer.Left to the result of PlayerPos(0) - frmGravity.imgPlayer.Width / 2
Set frmGravity.imgPlayer.Top to the result of PlayerPos(1) - frmGravity.imgPlayer.Height / 2
For a is between 0 and 1
Set RobotPos(a, 0) to the result of RobotPos(a, 0) * 32 + 16
Set RobotPos(a, 1) to the result of RobotPos(a, 1) * 32 + 16
Set frmGravity.imgRobot(a).Left to the result of RobotPos(a, 0) - frmGravity.imgRobot(a).Width / 2
Set frmGravity.imgRobot(a).Top to the result of RobotPos(a, 1) - frmGravity.imgRobot(a).Height / 2
If RobotFacing(a) is equal to 0 then
Set RobotAnim(a) to 0
Else
Set RobotAnim to 3
End If
Load RobotWalk(a, RobotDir(a), RobotAnim(a)) into the picture of frmGravity.imgRobot(a)
Set RobotAnimLoaded to True
Next
For y is between 0 and 17
For x is between 0 to 24
If Map(x, y) is equal to 1 then
Set Border to 0
If y - 1 is greater than or equal to 0 then
If Map(x, y - 1) is not equal to 1 then
Increase Border by 1
End If
End If
If x + 1 is less than or equal to 24 then
If Map(x + 1, y) is not equal to 1 then
Increase Border by 2
End If
End If
If y + 1 is less than or equal to 17 then
If Map(x, y + 1) is not equal to 1 then
Increase Border by 4
End If
End If
If x - 1 is greater than or equal to 0 then
If Map(x - 1, y) is not equal to 1 then
Increase Border by 8
End If
End If
Load TileTable(Border) into the picture of frmGravity.imgRegion(x + (25 * y))
ElseIf Map(x, y) is equal to 2 then
Load ShockTile into the picture of frmGravity.imgRegion(x + (25 * y))
ElseIf Map(x, y) is equal to 3 then
Load StartTile into the picture of frmGravity.imgRegion(x + (25 * y))
ElseIf Map(x, y) is equal to 4 then
Load FinishTile into the picture of frmGravity.imgRegion(x + (25 * y))
Else
Clear the picture of frmGravity.imgRegion(x + (25 * y))
End If
Set frmGravity.imgRegion(x + (25 * y)).Left to the result of 32 * x
Set frmGravity.imgRegion(x + (25 * y)).Top to the result of 32 * y
Next
Next
Load PlayerIdle(PlayerGravityDir)) into the picture of frmGravity.imgPlayer
Call the procedure PlayerStates.ResetPlayerState
Set PlayerAnim to 3
Set PlayerAnimSequence to 1
Set ReportTimer to 0

1
Design/Pseudocode/Module_PlayerMovement/Function_IncreaseVelocity.txt

@ -0,0 +1 @@
Set IncreaseVelocity to the result of (u * t + 0.5 * g * t * t) * DimensionScaler

135
Design/Pseudocode/Module_PlayerMovement/Sub_DropPlayer.txt

@ -0,0 +1,135 @@
If PlayerGravityDir is equal to 0 then
Set FutureRegion(0, 0) to the integer result of (PlayerPos(0) - 8) / 32
Set FutureRegion(0, 1) to the integer result of (PlayerPos(0) + 7) / 32
Set FutureRegion(1, 0) to the integer result of (PlayerPos(1) - PlayerFallSpeed - 17) / 32
If FutureRegion(1, 0) is greater than or equal to 0 then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is greater than or equal to 1
or Map(FutureRegion(0, 1), FutureRegion(1, 0)) is greater than or equal to 1 then
Set PlayerPos(1) to the result of (FutureRegion(1, 0) + 1) * 32 + 16
Set TickCount to 0
If the absolute result of PlayerPos(1) - PlayerFallOrigin(1) is greater than 80 then
Call the procedure PlayerStates.DazePlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 2
or Map(FutureRegion(0, 1), FutureRegion(1, 0)) is equal to 2 Then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 4
or Map(FutureRegion(0, 1), FutureRegion(1, 0)) is equal to 4 Then
Call the procedure PlayerStates.WinLevel
End If
Set PlayerFallSpeed to 0
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Else
Set PlayerPos(1) to the integer result of PlayerPos(1) - PlayerFallSpeed
End If
End If
End If
If PlayerGravityDir is equal to 1 then
Set FutureRegion(0, 0) to the integer result of (PlayerPos(0) + PlayerFallSpeed + 16) / 32
Set FutureRegion(1, 0) to the integer result of (PlayerPos(1) - 8) / 32
Set FutureRegion(1, 1) to the integer result of (PlayerPos(1) + 7) / 32
If FutureRegion(0, 0) is less than or equal to 24 then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is greater than or equal to 1
or Map(FutureRegion(0, 0), FutureRegion(1, 1)) is greater than or equal to 1 then
Set PlayerPos(0) to the result of FutureRegion(0, 0) * 32 - 16
Set TickCount to 0
If the absolute result of PlayerPos(0) - PlayerFallOrigin(0) is greater than 80 then
Call the procedure PlayerStates.DazePlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 2
or Map(FutureRegion(0, 0), FutureRegion(1, 1)) is equal to 2 Then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 4
or Map(FutureRegion(0, 0), FutureRegion(1, 1)) is equal to 4 Then
Call the procedure PlayerStates.WinLevel
End If
Set PlayerFallSpeed to 0
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Else
Set PlayerPos(0) to the integer result of PlayerPos(0) - PlayerFallSpeed
End If
End If
End If
If PlayerGravityDir is equal to 2 then
Set FutureRegion(0, 0) to the integer result of (PlayerPos(0) - 8) / 32
Set FutureRegion(0, 1) to the integer result of (PlayerPos(0) + 7) / 32
Set FutureRegion(1, 0) to the integer result of (PlayerPos(1) + PlayerFallSpeed + 16) / 32
If FutureRegion(1, 0) is less than or equal to 18 then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is greater than or equal to 1
or Map(FutureRegion(0, 1), FutureRegion(1, 0)) is greater than or equal to 1 then
Set PlayerPos(1) to the result of FutureRegion(1, 0) * 32 - 16
Set TickCount to 0
If the absolute result of PlayerPos(1) - PlayerFallOrigin(1) is greater than 80 then
Call the procedure PlayerStates.DazePlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 2
or Map(FutureRegion(0, 1), FutureRegion(1, 0)) is equal to 2 Then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 4
or Map(FutureRegion(0, 1), FutureRegion(1, 0)) is equal to 4 Then
Call the procedure PlayerStates.WinLevel
End If
Set PlayerFallSpeed to 0
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Else
Set PlayerPos(1) to the integer result of PlayerPos(1) + PlayerFallSpeed
End If
End If
End If
If PlayerGravityDir is equal to 3 then
Set FutureRegion(0, 0) to the integer result of (PlayerPos(0) - PlayerFallSpeed - 17) / 32
Set FutureRegion(1, 0) to the integer result of (PlayerPos(1) - 8) / 32
Set FutureRegion(1, 1) to the integer result of (PlayerPos(1) + 7) / 32
If FutureRegion(0, 0) is greater than or equal to 0 then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is greater than or equal to 1
or Map(FutureRegion(0, 0), FutureRegion(1, 1)) is greater than or equal to 1 then
Set PlayerPos(0) to the result of (FutureRegion(0, 0) + 1) * 32 + 16
Set TickCount to 0
If the absolute result of PlayerPos(0) - PlayerFallOrigin(0) is greater than 80 then
Call the procedure PlayerStates.DazePlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 2
or Map(FutureRegion(0, 0), FutureRegion(1, 1)) is equal to 2 Then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) is equal to 4
or Map(FutureRegion(0, 0), FutureRegion(1, 1)) is equal to 4 Then
Call the procedure PlayerStates.WinLevel
End If
Set PlayerFallSpeed to 0
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Else
Set PlayerPos(0) to the integer result of PlayerPos(0) - PlayerFallSpeed
End If
End If
End If

208
Design/Pseudocode/Module_PlayerMovement/Sub_MovePlayer.txt

@ -0,0 +1,208 @@
Load PlayerIdle(PlayerGravityDir) into the picture of frmGravity.imgPlayer
If PlayerFallSpeed is equal to 0 then
If PlayerGravityDir is equal to 0 or 2 then
If KeyIsDown(vbKeyD) is equal to True then
Set FutureRegion(0) to the integer result of (PlayerPos(0) + 5 + 8) / 32)
Set FutureRegion(1) to the integer result of PlayerPos(1) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1 then
Set PlayerPos(0) to the result of FutureRegion(0) * 32 - 8
If Map(FutureRegion(0), FutureRegion(1)) is equal to 2 then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0), FutureRegion(1)) is equal to 4 then
Call the procedure PlayerStates.WinLevel
End If
Else
Increase PlayerPos(0) by 5
End If
If PlayerAnim is less than 3 then
Set PlayerAnim to 3
Set PlayerAnimSequence to 1
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 0 then
Decrease PlayerAnim by 1
If PlayerAnim is equal to 3 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 1 then
Increase PlayerAnim by 1
If PlayerAnim is equal to 5 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
End If
If KeyIsDown(vbKeyA) is equal to True then
Set FutureRegion(0) to the integer result of (PlayerPos(0) - 5 - 8) / 32)
Set FutureRegion(1) to the integer result of PlayerPos(1) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1 then
Set PlayerPos(0) to the result of FutureRegion(0) * 32 + 8
If Map(FutureRegion(0), FutureRegion(1)) is equal to 2 then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0), FutureRegion(1)) is equal to 4 then
Call the procedure PlayerStates.WinLevel
End If
Else
Decrease PlayerPos(0) by 5
End If
If PlayerAnim is greater than 2 then
Set PlayerAnim to 2
Set PlayerAnimSequence to 1
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 0 then
Increase PlayerAnim by 1
If PlayerAnim is equal to 2 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 1 then
Decrease PlayerAnim by 1
If PlayerAnim is equal to 0 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
End If
End If
If PlayerGravityDir is equal to 1 or 3 then
If KeyIsDown(vbKeyS) is equal to True then
Set FutureRegion(0) to the integer result of PlayerPos(0) / 32
Set FutureRegion(1) to the integer result of (PlayerPos(1) + 5 + 8) / 32)
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1 then
Set PlayerPos(1) to the result of FutureRegion(1) * 32 - 8
If Map(FutureRegion(0), FutureRegion(1)) is equal to 2 then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0), FutureRegion(1)) is equal to 4 then
Call the procedure PlayerStates.WinLevel
End If
Else
Increase PlayerPos(1) by 5
End If
If PlayerAnim is less than 3 then
Set PlayerAnim to 3
Set PlayerAnimSequence to 1
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 0 then
Decrease PlayerAnim by 1
If PlayerAnim is equal to 3 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 1 then
Increase PlayerAnim by 1
If PlayerAnim is equal to 5 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
End If
If KeyIsDown(vbKeyW) is equal to True then
Set FutureRegion(0) to the integer result of PlayerPos(0) / 32
Set FutureRegion(1) to the integer result of (PlayerPos(1) - 5 - 8) / 32)
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1 then
Set PlayerPos(1) to the result of FutureRegion(1) * 32 + 8
If Map(FutureRegion(0), FutureRegion(1)) is equal to 2 then
Call the procedure PlayerStates.ShockPlayer
End If
If Map(FutureRegion(0), FutureRegion(1)) is equal to 4 then
Call the procedure PlayerStates.WinLevel
End If
Else
Decrease PlayerPos(1) by 5
End If
If PlayerAnim is greater than 2 then
Set PlayerAnim to 2
Set PlayerAnimSequence to 1
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 0 then
Increase PlayerAnim by 1
If PlayerAnim is equal to 2 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
If PlayerAnimSequence is equal to 1 then
Decrease PlayerAnim by 1
If PlayerAnim is equal to 0 then
Set PlayerAnimSequence to 0
End If
Set PlayerAnimLoaded to False
End If
End If
End If
If KeyIsDown(vbKeyUp) is equal to True then
Set PlayerGravityDir to 0
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Load PlayerIdle(0) into the picture of frmGravity.imgPlayer
End If
If KeyIsDown(vbKeyRight) is equal to True then
Set PlayerGravityDir to 1
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Load PlayerIdle(1) into the picture of frmGravity.imgPlayer
End If
If KeyIsDown(vbKeyDown) is equal to True then
Set PlayerGravityDir to 2
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Load PlayerIdle(2) into the picture of frmGravity.imgPlayer
End If
If KeyIsDown(vbKeyLeft) is equal to True then
Set PlayerGravityDir to 3
Set PlayerFallOrigin(0) to PlayerPos(0)
Set PlayerFallOrigin(1) to PlayerPos(1)
Load PlayerIdle(3) into the picture of frmGravity.imgPlayer
End If
End If
If PlayerAnimLoaded is equal to False then
Load PlayerWalk(PlayerGravityDir, PlayerAnim) into the picture of frmGravity.imgPlayer
Set PlayerAnimLoaded to True
End If

1
Design/Pseudocode/Module_PlayerState/ResetPlayerState.txt

@ -0,0 +1 @@
Set PlayerState to 0

1
Design/Pseudocode/Module_PlayerState/Sub_DazePlayer.txt

@ -0,0 +1 @@
Set PlayerState to 2

1
Design/Pseudocode/Module_PlayerState/Sub_ShockPlayer.txt

@ -0,0 +1 @@
Set PlayerState to 3

1
Design/Pseudocode/Module_PlayerState/Sub_WinLevel.txt

@ -0,0 +1 @@
Set PlayerState to 1

9
Design/Pseudocode/Module_RobotMovement/Sub_CheckRobotContact.txt

@ -0,0 +1,9 @@
For a is between 0 to 1
If the absolute result of PlayerPos(0) - RobotPos(a, 0) is less than or equal to
the result of frmGravity.imgPlayer.Width / 2 + frmGravity.imgRobot(a).Width / 2 then
If the absolute result of PlayerPos(1) - RobotPos(a, 0) is less than or equal to
the result of frmGravity.imgPlayer.Height / 2 + frmGravity.imgRobot(a).Height / 2 then
Call the procedure PlayerStates.ShockPlayer
End If
End If
Next

150
Design/Pseudocode/Module_RobotMovement/Sub_MoveBot.txt

@ -0,0 +1,150 @@
For a is between 0 and 1
If RobotDir(a) is equal to 0 then
If RobotFacing(a) is equal to then
If RobotAnim(a) is greater than 0 then
Decrease RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of (RobotPos(a, 0) + 5 + (8 * (a + 1))) / 32
Set FutureRegion(1) to the integer result of RobotPos(a, 1) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
or Map(FutureRegion(0), FutureRegion(1) - 1) is not equal to 1 then
Set RobotPos(a, 0) to the result of FutureRegion(0) * 32 - (8 * (a + 1))
Set RobotFacing(a) to 1
Else
Increase RobotPos(a, 0) by 2
End If
End If
Else
If RobotAnim(a) is less than 3 then
Increase RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of (RobotPos(a, 0) - 5 - (8 * (a + 1))) / 32
Set FutureRegion(1) to the integer result of RobotPos(a, 1) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
of Map(FutureRegion(0), FutureRegion(1) - 1) is not equal to 1 then
Set RobotPos(a, 0) to the result of (FutureRegion(0) + 1) * 32 + (8 * (a + 1))
Set RobotFacing(a) to 0
Else
Decrease RobotPos(a, 0) by 2
End If
End If
End If
End If
If RobotDir(a) is equal to 1 then
If RobotFacing(a) is equal to then
If RobotAnim(a) is greater than 0 then
Decrease RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of RobotPos(a, 0) / 32
Set FutureRegion(1) to the integer result of (RobotPos(a, 1) + 5 + (8 * (a + 1))) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
or Map(FutureRegion(0) + 1, FutureRegion(1)) is not equal to 1 then
Set RobotPos(a, 1) to the result of FutureRegion(1) * 32 - (8 * (a + 1))
Set RobotFacing(a) to 1
Else
Increase RobotPos(a, 1) by 2
End If
End If
Else
If RobotAnim(a) is less than 3 then
Increase RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of RobotPos(a, 0) / 32
Set FutureRegion(1) to the integer result of (RobotPos(a, 1) - 5 - (8 * (a + 1))) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
of Map(FutureRegion(0) + 1, FutureRegion(1)) is not equal to 1 then
Set RobotPos(a, 1) to the result of (FutureRegion(1) + 1) * 32 + (8 * (a + 1))
Set RobotFacing(a) to 0
Else
Decrease RobotPos(a, 1) by 2
End If
End If
End If
End If
If RobotDir(a) is equal to 2 then
If RobotFacing(a) is equal to then
If RobotAnim(a) is greater than 0 then
Decrease RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of (RobotPos(a, 0) - 5 - (8 * (a + 1))) / 32
Set FutureRegion(1) to the integer result of RobotPos(a, 1) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
or Map(FutureRegion(0), FutureRegion(1) + 1) is not equal to 1 then
Set RobotPos(a, 0) to the result of (FutureRegion(0) + 1) * 32 + (8 * (a + 1))
Set RobotFacing(a) to 1
Else
Decrease RobotPos(a, 0) by 2
End If
End If
Else
If RobotAnim(a) is less than 3 then
Increase RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of (RobotPos(a, 0) + 5 + (8 * (a + 1))) / 32
Set FutureRegion(1) to the integer result of RobotPos(a, 1) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
of Map(FutureRegion(0), FutureRegion(1) + 1) is not equal to 1 then
Set RobotPos(a, 0) to the result of FutureRegion(0) * 32 - (8 * (a + 1))
Set RobotFacing(a) to 0
Else
Increase RobotPos(a, 0) by 2
End If
End If
End If
End If
If RobotDir(a) is equal to 3 then
If RobotFacing(a) is equal to then
If RobotAnim(a) is greater than 0 then
Decrease RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of RobotPos(a, 0) / 32
Set FutureRegion(1) to the integer result of (RobotPos(a, 1) - 5 - (8 * (a + 1))) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
or Map(FutureRegion(0) - 1, FutureRegion(1)) is not equal to 1 then
Set RobotPos(a, 1) to the result of (FutureRegion(1) + 1) * 32 + (8 * (a + 1))
Set RobotFacing(a) to 1
Else
Decrease RobotPos(a, 1) by 2
End If
End If
Else
If RobotAnim(a) is less than 3 then
Increase RobotAnim(a) by 1
Set RobotAnimLoaded to False
Else
Set FutureRegion(0) to the integer result of RobotPos(a, 0) / 32
Set FutureRegion(1) to the integer result of (RobotPos(a, 1) + 5 + (8 * (a + 1))) / 32
If Map(FutureRegion(0), FutureRegion(1)) is greater than or equal to 1
of Map(FutureRegion(0) - 1, FutureRegion(1)) is not equal to 1 then
Set RobotPos(a, 1) to the result of FutureRegion(1) * 32 - (8 * (a + 1))
Set RobotFacing(a) to 0
Else
Increase RobotPos(a, 1) by 2
End If
End If
End If
End If
If RobotAnimLoaded is equal to False then
Load RobotWalk(a, RobotDir(a), RobotAnim(a))
Set RobotAnimLoaded to True
End If
Next

BIN
Design/SpriteOutline.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

BIN
Design/Storyboard/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
Design/Storyboard/10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

BIN
Design/Storyboard/11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

BIN
Design/Storyboard/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

BIN
Design/Storyboard/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
Design/Storyboard/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
Design/Storyboard/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
Design/Storyboard/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
Design/Storyboard/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

BIN
Design/Storyboard/8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

BIN
Design/Storyboard/9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
Design/Storyboard/Storyboard.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 KiB

BIN
Design/StructureAndDesign.docx

Binary file not shown.

BIN
Design/Testing/Improvement.docx

Binary file not shown.

BIN
Design/Testing/Questionnaire.docx

Binary file not shown.

BIN
Design/Testing/QuestionnaireResults.xlsx

Binary file not shown.

BIN
Design/Testing/Test Log.xlsx

Binary file not shown.

BIN
Design/TileCollision.xlsx

Binary file not shown.

BIN
Design/Tiles/BlockSides.ods

Binary file not shown.

BIN
Design/Tiles/BlockSides.xlsx

Binary file not shown.

BIN
Design/Tiles/TileSet.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
Design/Tiles/TileSet.xcf

Binary file not shown.

BIN
Design/Tiles/tilemapscreen.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
Design/Tiles/tilemapscreenshot.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
Design/Tiles/tilemapscreenshot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
Design/UserGuide.docx

Binary file not shown.

56
Globals.bas

@ -0,0 +1,56 @@
Attribute VB_Name = "Globals"
'Stores the states of each available key on a keyboard (whether it is pressed or not).
Global KeyIsDown(255) As Boolean
'Timers.
Global ReportTimer As Integer 'Dictates the length of time in which failure and success messages are displayed.
Global TickCount As Integer 'Used in physics calculations.
'Array into which map data is read from a file.
Global Map(0 To 24, 0 To 17) As Integer
'Level number and the name loaded from the map file.
Global Level As Integer
Global LevelName As String
'Stores the file names and locations of the player's animation frames.
Global PlayerIdle(0 To 3) As String
Global PlayerWalk(0 To 3, 0 To 5) As String
Global PlayerDazed(0 To 3, 0 To 1) As String
Global PlayerShock(0 To 3, 0 To 1) As String
'Player position and gravity, initilally loaded from the map file.
Global PlayerName As String 'Player's name for scoreboard purposes. Will be restricted to 3 characters.
Global PlayerPos(0 To 1) As Integer 'Player's current position. Index 0 is the X coordinate, while 1 is Y.
Global PlayerFallOrigin(0 To 1) As Integer 'Point from which the player starts falling. Used to determine falling distance.
Global PlayerGravityDir As Integer 'Direction of the player's current gravity pull.
Global PlayerFallSpeed As Integer 'Player's fall speed. Gradually increases from zero to 30.
Global PlayerState As Byte 'Determines whether the player has been shocked, dazed or has completed the level.
Global PlayerAnim As Byte 'Player's current animation frame.
Global PlayerAnimSequence As Byte 'Determines the playback sequence of the player's animation frames.
Global PlayerAnimLoaded As Boolean 'Prevents the game from needlessly loading an animation frame that has already been loaded.
Global PlayerRetries As Byte 'The number of lives the player gets.
'Stores the time taken to complete a level.
Global LevelMinutes As Integer
Global LevelSeconds As Integer
Global LevelMilliseconds As Integer
'Stores the filenames and locations of each robot's animation frames.
Global RobotWalk(0 To 1, 0 To 3, 0 To 3) As String
'Robot positions and gravity, initally loaded from the map file.
Global RobotPos(0 To 1, 0 To 1) As Integer 'Robot's current position.
Global RobotDir(0 To 1) As Integer 'Robot's gravitational direction.
Global RobotFacing(0 To 1) As Byte 'Direction in which the robot faces.
Global RobotAnim(0 To 1) As Integer 'Robot's current animation frame.
Global RobotAnimLoaded As Boolean 'Prevents the game from needlessly loading an animation frame that has already been loaded.
'Used in calculations to determine the necessary border for each tile.
Global Border As Integer
'Stores the filenames of each sprite and tile.
Global TileTable(0 To 15) As String
Global ShockTile As String
Global StartTile As String
Global FinishTile As String

39
Gravity.vbp

@ -0,0 +1,39 @@
Type=Exe
Form=frmGravity.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\Windows\SysWOW64\stdole2.tlb#OLE Automation
Form=frmDebug.frm
Module=PlayerStates; PlayerState.bas
Module=PlayerMovement; PlayerMovement.bas
Module=Levels; Levels.bas
Module=Globals; Globals.bas
Module=RobotMovement; RobotMovement.bas
Module=Clocks; Clocks.bas
Module=HighScores; HighScores.bas
IconForm="frmGravity"
Startup="frmGravity"
HelpFile=""
ExeName32="Turvy_Final.exe"
Command32=""
Name="Gravity"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

9
Gravity.vbw

@ -0,0 +1,9 @@
frmGravity = 7, 28, 910, 545, , 25, 25, 928, 542, C
frmDebug = 25, 25, 928, 542, I, 50, 50, 953, 567, C
PlayerStates = 50, 50, 953, 567,
PlayerMovement = 125, 125, 1028, 642,
Levels = 0, 0, 903, 647,
Globals = 50, 50, 953, 567,
RobotMovement = 25, 25, 928, 542,
Clocks = 200, 0, 1103, 767,
HighScores = 175, 175, 1083, 692, Z

62
HighScores.bas

@ -0,0 +1,62 @@
Attribute VB_Name = "HighScores"
Dim TopName(0 To 5) As String
Dim TopMinute(0 To 5) As Integer
Dim TopSecond(0 To 5) As Integer
Dim TopMillisecond(0 To 5) As Integer
Dim TempName As String
Dim TempMinute, TempSecond, TempMillisecond As Integer
Public Sub WriteScore()
Dim TotalMilliseconds(0 To 1) As Single
Dim LineCounter As Integer
Open "Scores.txt" For Input As #1
LineCounter = 0
Do While Not EOF(1)
Input #1, TopName(LineCounter), TopMinute(LineCounter), TopSecond(LineCounter), TopMillisecond(LineCounter)
LineCounter = LineCounter + 1
Loop
Close #1
TopName(5) = PlayerName
TopMinute(5) = LevelMinutes
TopSecond(5) = LevelSeconds
TopMillisecond(5) = LevelMilliseconds
For LineCounter = 5 To 1 Step -1
TotalMilliseconds(0) = ((((TopMinute(LineCounter - 1) / 100000000) * 60 + (TopSecond(LineCounter - 1) / 100000000)) * 100) + (TopMillisecond(LineCounter - 1)) / 100000000)
TotalMilliseconds(1) = ((((TopMinute(LineCounter) / 100000000) * 60 + (TopSecond(LineCounter) / 100000000)) * 100) + (TopMillisecond(LineCounter)) / 100000000)
If TotalMilliseconds(1) < TotalMilliseconds(0) Then
Call MoveName(LineCounter)
End If
Next LineCounter
Open "Scores.txt" For Output As #2
For LineCounter = 0 To 4
Write #2, TopName(LineCounter), TopMinute(LineCounter), TopSecond(LineCounter), TopMillisecond(LineCounter)
Next LineCounter
Close #2
End Sub
Public Sub MoveName(ScoreLine As Integer)
TempName = TopName(ScoreLine - 1)
TempMinute = TopMinute(ScoreLine - 1)
TempSecond = TopSecond(ScoreLine - 1)
TempMillisecond = TopMillisecond(ScoreLine - 1)
TopName(ScoreLine - 1) = TopName(ScoreLine)
TopMinute(ScoreLine - 1) = TopMinute(ScoreLine)
TopSecond(ScoreLine - 1) = TopSecond(ScoreLine)
TopMillisecond(ScoreLine - 1) = TopMillisecond(ScoreLine)
TopName(ScoreLine) = TempName
TopMinute(ScoreLine) = TempMinute
TopSecond(ScoreLine) = TempSecond
TopMillisecond(ScoreLine) = TempMillisecond
End Sub

136
Levels.bas

@ -0,0 +1,136 @@
Attribute VB_Name = "Levels"
Public Sub LoadLevel(Pack As String)
'Open the correct level file based on the variables Pack and Level.
Open "Maps/" & Pack & "_" & Level & ".lvl" For Input As 1
'Read the level name and character positions.
Input #1, LevelName
Input #1, PlayerPos(0), PlayerPos(1), PlayerGravityDir
Input #1, RobotPos(0, 0), RobotPos(0, 1), RobotDir(0), RobotFacing(0)
Input #1, RobotPos(1, 0), RobotPos(1, 1), RobotDir(1), RobotFacing(1)
'Read the map layout into the Map array.
For y = 0 To 17
For x = 0 To 24
Input #1, Map(x, y)
Next x
Next y
'Close the file.
Close #1
'Pass the level name to the level name label at the bottom of the screen.
frmGravity.lblLevelName.Caption = LevelName
'The player and robot positions on file only relates to its grid reference rather than actual pixel position.
'Convert the player position to pixel position, ensuring she stays in the middle of her starting block.
PlayerPos(0) = PlayerPos(0) * 32 + 16
PlayerPos(1) = PlayerPos(1) * 32 + 16
'Set the player's fall origin to their current position.
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
'Set the player object on screen to match their starting position on file.
frmGravity.imgPlayer.Left = PlayerPos(0) - frmGravity.imgPlayer.Width / 2
frmGravity.imgPlayer.Top = PlayerPos(1) - frmGravity.imgPlayer.Height / 2
For a = 0 To 1
'Convert the robot positions to pixel positions.
RobotPos(a, 0) = RobotPos(a, 0) * 32 + 16
RobotPos(a, 1) = RobotPos(a, 1) * 32 + 16
'Set the robot objects on screen to match their starting positions on file.
frmGravity.imgRobot(a).Left = RobotPos(a, 0) - frmGravity.imgRobot(a).Width / 2
frmGravity.imgRobot(a).Top = RobotPos(a, 1) - frmGravity.imgRobot(a).Height / 2
'Select the correct animation frame based on which direction they are facing.
If RobotFacing(a) = 0 Then
RobotAnim(a) = 0
Else
RobotAnim(a) = 3
End If
'Load that animation frame.
frmGravity.imgRobot(a).Picture = LoadPicture(RobotWalk(a, RobotDir(a), RobotAnim(a)))
RobotAnimLoaded = True
Next a
For y = 0 To 17
For x = 0 To 24
'If the current block is 1 then calculate the correct tile to use, otherwise just reset it to a
'blank space.
If Map(x, y) = 1 Then
'Set border to zero. This will be incremented based on the empty space surrounding it, and
'used to select the correct tile image.
Border = 0
'Determine the border of each tile by checking for adjacent tiles that are set to empty space.
'Is there empty space above it?
If y - 1 >= 0 Then
If Not Map(x, y - 1) = 1 Then
Border = Border + 1
End If
End If
'To the right?
If x + 1 <= 24 Then
If Not Map(x + 1, y) = 1 Then
Border = Border + 2
End If
End If
'Below?
If y + 1 <= 17 Then
If Not Map(x, y + 1) = 1 Then
Border = Border + 4
End If
End If
'To the left?
If x - 1 >= 0 Then
If Not Map(x - 1, y) = 1 Then
Border = Border + 8
End If
End If
'Load the correct tile image into the current block.
frmGravity.imgRegion((1 * x) + (25 * y)).Picture = LoadPicture(TileTable(Border))
'If the current block number is 2 then load a shock tile in its place.
ElseIf Map(x, y) = 2 Then
frmGravity.imgRegion((1 * x) + (25 * y)).Picture = LoadPicture(ShockTile)
'If the current block number is 3 then load a start/entry tile in its place.
ElseIf Map(x, y) = 3 Then
frmGravity.imgRegion((1 * x) + (25 * y)).Picture = LoadPicture(StartTile)
'If the current block number is 3 then load a finish/exit tile in its place.
ElseIf Map(x, y) = 4 Then
frmGravity.imgRegion((1 * x) + (25 * y)).Picture = LoadPicture(FinishTile)
'If the current block number is 0 then it is empty space and no image shouls be loaded. Reset the block to empty space.
Else
frmGravity.imgRegion((1 * x) + (25 * y)).Picture = LoadPicture("")
End If
'Position the tile at its appropriate coordinates on the form.
frmGravity.imgRegion((1 * x) + (25 * y)).Left = 32 * x
frmGravity.imgRegion((1 * x) + (25 * y)).Top = 32 * y
Next x
Next y
'Load the idle image appropriate to their gravitational direction.
frmGravity.imgPlayer.Picture = LoadPicture(PlayerIdle(PlayerGravityDir))
'Reset the player's current state, walk animation frame, playback sequence and the timer for success/fail reports.
PlayerStates.ResetPlayerState
PlayerAnim = 3
PlayerAnimSequence = 1
ReportTimer = 0
End Sub

BIN
Maps/Editor.xlsx

Binary file not shown.

454
Maps/Level.csv

@ -0,0 +1,454 @@
Freedom!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
3,14,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
8,16,2,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
8,4,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Can't render this file because it has a wrong number of fields in line 55.

466
PlayerMovement.bas

@ -0,0 +1,466 @@
Attribute VB_Name = "PlayerMovement"
'Increases the velocity of the player's fall.
Public Function IncreaseVelocity(u As Integer, g As Integer, t As Integer, DimensionScaler As Single)
IncreaseVelocity = (u * t + 0.5 * g * t * t) * DimensionScaler
End Function
Public Sub MovePlayer()
'Used to determine where the player's position in be next, and whether it will place them in collision with a solid tile.
Dim FutureRegion(0 To 1) As Integer
'Sets the current animation frame to their idle stance.
frmGravity.imgPlayer.Picture = LoadPicture(PlayerIdle(PlayerGravityDir))
If PlayerFallSpeed = 0 Then
'If the character's gravity direction is up or down, then she can only move left or right.
If PlayerGravityDir = 0 Or PlayerGravityDir = 2 Then
'If D is pressed...
If KeyIsDown(vbKeyD) = True Then
'Determine where the player's right edge will be.
FutureRegion(0) = Int((PlayerPos(0) + 5 + 8) / 32)
FutureRegion(1) = Int(PlayerPos(1) / 32)
'If the player's right edge will land within a solid tile, place the player exactly adjacent to the block instead.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Then
PlayerPos(0) = FutureRegion(0) * 32 - 8
'If that tile is a shock tile, shock the player.
If Map(FutureRegion(0), FutureRegion(1)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'If that tile is an exit tile, the player has completed the level.
If Map(FutureRegion(0), FutureRegion(1)) = 4 Then
Call PlayerStates.WinLevel
End If
'If the player's right edge is not going to collide with a solid tile, simply move them along.
Else
PlayerPos(0) = PlayerPos(0) + 5
End If
'Ensure the player animation only displays the right-walking frames.
If PlayerAnim < 3 Then
PlayerAnim = 3
PlayerAnimSequence = 1
PlayerAnimLoaded = False
End If
'Alternate between animation sequences when those sequences reach their first or last frames.
If PlayerAnimSequence = 0 Then
PlayerAnim = PlayerAnim - 1
If PlayerAnim = 3 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
If PlayerAnimSequence = 1 Then
PlayerAnim = PlayerAnim + 1
If PlayerAnim = 5 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
End If
'If A is pressed...
If KeyIsDown(vbKeyA) = True Then
'Determine where the player's left edge will be.
FutureRegion(0) = Int((PlayerPos(0) - 5 - 8) / 32)
FutureRegion(1) = Int(PlayerPos(1) / 32)
'If the player's left edge will land within a solid tile, place the player exactly adjacent to the block instead.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Then
PlayerPos(0) = (FutureRegion(0) + 1) * 32 + 8
'If that tile is a shock tile, shock the player.
If Map(FutureRegion(0), FutureRegion(1)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'If that tile is an exit tile, the player has completed the level.
If Map(FutureRegion(0), FutureRegion(1)) = 4 Then
Call PlayerStates.WinLevel
End If
'If the player's left edge is not going to collide with a solid tile, simply move them along.
Else
PlayerPos(0) = PlayerPos(0) - 5
End If
'Ensure the player animation only displays the left-walking frames.
If PlayerAnim > 2 Then
PlayerAnim = 2
PlayerAnimSequence = 1
PlayerAnimLoaded = False
End If
'Alternate between animation sequences when those sequences reach their first or last frames.
If PlayerAnimSequence = 0 Then
PlayerAnim = PlayerAnim + 1
If PlayerAnim = 2 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
If PlayerAnimSequence = 1 Then
PlayerAnim = PlayerAnim - 1
If PlayerAnim = 0 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
End If
End If
'If the character's gravity direction is left or right, then she can only move up or down.
If PlayerGravityDir = 1 Or PlayerGravityDir = 3 Then
'If S is pressed...
If KeyIsDown(vbKeyS) = True Then
'Determine where the player's bottom edge will be.
FutureRegion(0) = Int(PlayerPos(0) / 32)
FutureRegion(1) = Int((PlayerPos(1) + 5 + 8) / 32)
'If the player's bottom edge will land within a solid tile, place the player exactly adjacent to the block instead.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Then
PlayerPos(1) = FutureRegion(1) * 32 - 8
'If that tile is a shock tile, shock the player.
If Map(FutureRegion(0), FutureRegion(1)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'If that tile is an exit tile, the player has completed the level.
If Map(FutureRegion(0), FutureRegion(1)) = 4 Then
Call PlayerStates.WinLevel
End If
'If the player's bottom edge is not going to collide with a solid tile, simply move them along.
Else
PlayerPos(1) = PlayerPos(1) + 5
End If
'Ensure the player animation only displays the downward-walking frames.
If PlayerAnim < 3 Then
PlayerAnim = 3
PlayerAnimSequence = 1
PlayerAnimLoaded = False
End If
'Alternate between animation sequences when those sequences reach their first or last frames.
If PlayerAnimSequence = 0 Then
PlayerAnim = PlayerAnim - 1
If PlayerAnim = 3 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
If PlayerAnimSequence = 1 Then
PlayerAnim = PlayerAnim + 1
If PlayerAnim = 5 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
End If
'If W is pressed...
If KeyIsDown(vbKeyW) = True Then
'Determine where the player's top edge will be.
FutureRegion(0) = Int(PlayerPos(0) / 32)
FutureRegion(1) = Int((PlayerPos(1) - 5 - 8) / 32)
'If the player's top edge will land within a solid tile, place the player exactly adjacent to the block instead.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Then
PlayerPos(1) = (FutureRegion(1) + 1) * 32 + 8
'If that tile is a shock tile, shock the player.
If Map(FutureRegion(0), FutureRegion(1)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'If that tile is an exit tile, the player has completed the level.
If Map(FutureRegion(0), FutureRegion(1)) = 4 Then
Call PlayerStates.WinLevel
End If
'If the player's top edge is not going to collide with a solid tile, simply move them along.
Else
PlayerPos(1) = PlayerPos(1) - 5
End If
'Ensure the player animation only displays the upward-walking frames.
If PlayerAnim > 2 Then
PlayerAnim = 2
PlayerAnimSequence = 1
PlayerAnimLoaded = False
End If
'Alternate between animation sequences when those sequences reach their first or last frames.
If PlayerAnimSequence = 0 Then
PlayerAnim = PlayerAnim + 1
If PlayerAnim = 2 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
If PlayerAnimSequence = 1 Then
PlayerAnim = PlayerAnim - 1
If PlayerAnim = 0 Then
PlayerAnimSequence = 0
End If
PlayerAnimLoaded = False
End If
End If
End If
'If an arrow key is pressed, the player's gravity direction changes, their fall origin is reset to their
'position at the time of the change and a sprite image corresponding to that direction is loaded.
If KeyIsDown(vbKeyUp) = True Then
PlayerGravityDir = 0
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
frmGravity.imgPlayer.Picture = LoadPicture(PlayerIdle(0))
End If
If KeyIsDown(vbKeyRight) = True Then
PlayerGravityDir = 1
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
frmGravity.imgPlayer.Picture = LoadPicture(PlayerIdle(1))
End If
If KeyIsDown(vbKeyDown) = True Then
PlayerGravityDir = 2
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
frmGravity.imgPlayer.Picture = LoadPicture(PlayerIdle(2))
End If
If KeyIsDown(vbKeyLeft) = True Then
PlayerGravityDir = 3
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
frmGravity.imgPlayer.Picture = LoadPicture(PlayerIdle(3))
End If
End If
'If the current animation frame has not been loaded, then do so.
If PlayerAnimLoaded = False Then
frmGravity.imgPlayer.Picture = LoadPicture(PlayerWalk(PlayerGravityDir, PlayerAnim))
PlayerAnimLoaded = True
End If
End Sub
Public Sub DropPlayer()
'Used to determine where the player's position in be next, and whether it will place them in collision with a solid tile.
Dim FutureRegion(0 To 1, 0 To 1) As Integer
'If the player's gravity is up...
If PlayerGravityDir = 0 Then
'Determine the future location of the player's top side, and their left and right sides.
FutureRegion(0, 0) = Int((PlayerPos(0) - 8) / 32)
FutureRegion(0, 1) = Int((PlayerPos(0) + 7) / 32)
FutureRegion(1, 0) = Int((PlayerPos(1) - PlayerFallSpeed - 17) / 32)
'If the top edge collides with a solid block (by checking both the left and right ends of that side)...
If FutureRegion(1, 0) >= 0 Then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) >= 1 Or Map(FutureRegion(0, 1), FutureRegion(1, 0)) >= 1 Then
'Position the player exactly adjactent to that block and reset TickCount.
PlayerPos(1) = (FutureRegion(1, 0) + 1) * 32 + 16
TickCount = 0
'If the player has fallen more than two blocks, daze them.
If Abs(PlayerPos(1) - PlayerFallOrigin(1)) > 80 Then
Call PlayerStates.DazePlayer
End If
'If the block is a shock tile, shock the player.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 2 Or Map(FutureRegion(0, 1), FutureRegion(1, 0)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'If the block is an exit gate, the player has completed the level.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 4 Or Map(FutureRegion(0, 1), FutureRegion(1, 0)) = 4 Then
Call PlayerStates.WinLevel
End If
'Reset the player's fall speed and fall origin.
PlayerFallSpeed = 0
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
'Otherwise just drop the player by the value of their fall speed.
Else
PlayerPos(1) = Int(PlayerPos(1) - PlayerFallSpeed)
End If
End If
End If
'If the player's gravity is right...
If PlayerGravityDir = 1 Then
'Determine the future location of the player's right side, and their top and bottom sides.
FutureRegion(0, 0) = Int((PlayerPos(0) + PlayerFallSpeed + 16) / 32)
FutureRegion(1, 0) = Int((PlayerPos(1) - 8) / 32)
FutureRegion(1, 1) = Int((PlayerPos(1) + 7) / 32)
'If the right edge collides with a solid block (by checking both the top and bottom ends of that side)...
If FutureRegion(0, 0) <= 24 Then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) >= 1 Or Map(FutureRegion(0, 0), FutureRegion(1, 1)) >= 1 Then
'Position the player exactly adjactent to that block and reset TickCount.
PlayerPos(0) = FutureRegion(0, 0) * 32 - 16
TickCount = 0
'If the player has fallen more than two blocks, daze them.
If Abs(PlayerPos(0) - PlayerFallOrigin(0)) > 80 Then
Call PlayerStates.DazePlayer
End If
'If the block is a shock tile, shock the player.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 2 Or Map(FutureRegion(0, 0), FutureRegion(1, 1)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'If the block is an exit gate, the player has completed the level.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 4 Or Map(FutureRegion(0, 0), FutureRegion(1, 1)) = 4 Then
Call PlayerStates.WinLevel
End If
'Reset the player's fall speed and fall origin.
PlayerFallSpeed = 0
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
'Otherwise just drop the player by the value of their fall speed.
Else
PlayerPos(0) = Int(PlayerPos(0) + PlayerFallSpeed)
End If
End If
End If
If PlayerGravityDir = 2 Then
'Determine the future location of the player's bottom side, and their left and right sides.
FutureRegion(0, 0) = Int((PlayerPos(0) - 8) / 32)
FutureRegion(0, 1) = Int((PlayerPos(0) + 7) / 32)
FutureRegion(1, 0) = Int((PlayerPos(1) + PlayerFallSpeed + 16) / 32)
'If the bottom edge collides with a solid block (by checking both the left and right ends of that side)...
If FutureRegion(1, 0) < 18 Then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) >= 1 Or Map(FutureRegion(0, 1), FutureRegion(1, 0)) >= 1 Then
'Position the player exactly adjactent to that block and reset TickCount.
PlayerPos(1) = FutureRegion(1, 0) * 32 - 16
TickCount = 0
'If the player has fallen more than two blocks, daze them.
If Abs(PlayerPos(1) - PlayerFallOrigin(1)) > 80 Then
Call PlayerStates.DazePlayer
End If
'If the block is a shock tile, shock the player.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 2 Or Map(FutureRegion(0, 1), FutureRegion(1, 0)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'If the block is an exit gate, the player has completed the level.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 4 Or Map(FutureRegion(0, 1), FutureRegion(1, 0)) = 4 Then
Call PlayerStates.WinLevel
End If
'Reset the player's fall speed and fall origin.
PlayerFallSpeed = 0
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
'Otherwise just drop the player by the value of their fall speed.
Else
PlayerPos(1) = Int(PlayerPos(1) + PlayerFallSpeed)
End If
End If
End If
If PlayerGravityDir = 3 Then
'Determine the future location of the player's left side, and their top and bottom sides.
FutureRegion(0, 0) = Int((PlayerPos(0) - PlayerFallSpeed - 17) / 32)
FutureRegion(1, 0) = Int((PlayerPos(1) - 8) / 32)
FutureRegion(1, 1) = Int((PlayerPos(1) + 7) / 32)
'If the left edge collides with a solid block (by checking both the top and bottom ends of that side)...
If FutureRegion(0, 0) >= 0 Then
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) >= 1 Or Map(FutureRegion(0, 0), FutureRegion(1, 1)) >= 1 Then
'Position the player exactly adjactent to that block and reset TickCount.
PlayerPos(0) = (FutureRegion(0, 0) + 1) * 32 + 16
TickCount = 0
'If the player has fallen more than two blocks, daze them.
If Abs(PlayerPos(0) - PlayerFallOrigin(0)) > 80 Then
Call PlayerStates.DazePlayer
End If
'If the block is a shock tile, shock the player.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 2 Or Map(FutureRegion(0, 0), FutureRegion(1, 1)) = 2 Then
Call PlayerStates.ShockPlayer
End If
'Reset the player's fall speed and fall origin.
If Map(FutureRegion(0, 0), FutureRegion(1, 0)) = 4 Or Map(FutureRegion(0, 0), FutureRegion(1, 1)) = 4 Then
Call PlayerStates.WinLevel
End If
'Reset the player's fall speed and fall origin.
PlayerFallSpeed = 0
PlayerFallOrigin(0) = PlayerPos(0)
PlayerFallOrigin(1) = PlayerPos(1)
'Otherwise just drop the player by the value of their fall speed.
Else
PlayerPos(0) = Int(PlayerPos(0) - PlayerFallSpeed)
End If
End If
End If
'Various variables displayed for debugging purposes.
'DebugText = ""
'DebugText = DebugText & "Player X: " & PlayerPos(0)
'DebugText = DebugText & Chr(13) & "Player Y: " & PlayerPos(1)
'DebugText = DebugText & Chr(13) & "Gravity: " & PlayerGravityDir
'DebugText = DebugText & Chr(13) & "Fall Dist X: " & PlayerPos(0) - PlayerFallOrigin(0)
'DebugText = DebugText & Chr(13) & "Fall Dist X: " & PlayerPos(1) - PlayerFallOrigin(1)
'DebugText = DebugText & Chr(13) & "Region X: " & Int(PlayerPos(0) / 32)
'DebugText = DebugText & Chr(13) & "Future X: " & FutureRegion(0, 0)
'DebugText = DebugText & Chr(13) & "Region Y: " & Int(PlayerPos(1) / 32)
'DebugText = DebugText & Chr(13) & "Future Y: " & FutureRegion(1, 0)
'DebugText = DebugText & Chr(13) & "Player State: " & PlayerState
'DebugText = DebugText & Chr(13) & Len(Str(LevelMinutes)) & " " & LevelMinutes
'DebugText = DebugText & Chr(13) & Len(Str(LevelSeconds))
'DebugText = DebugText & Chr(13) & Len(Str(LevelMilliseconds))
'frmDebug.lblDebug.Caption = DebugText
End Sub

20
PlayerState.bas

@ -0,0 +1,20 @@
Attribute VB_Name = "PlayerStates"
'Player state for when the player comes into contact with a robot or shock tile.
Public Sub ShockPlayer()
PlayerState = 3
End Sub
'Player state for when the player falls too far.
Public Sub DazePlayer()
PlayerState = 2
End Sub
'Player state for when the player successfully reaches the exit.
Public Sub WinLevel()
PlayerState = 1
End Sub
'Resets the player state to normal.
Public Sub ResetPlayerState()
PlayerState = 0
End Sub

269
RobotMovement.bas

@ -0,0 +1,269 @@
Attribute VB_Name = "RobotMovement"
Public Sub MoveBot()
'Determine the future location of the robots.
Dim FutureRegion(0 To 1) As Integer
For a = 0 To 1
'If the robot is set to face its relative left...
If RobotDir(a) = 0 Then
If RobotFacing(a) = 0 Then
'If the robot's animation frame is not 0 then decrement that value by 1 (moving it closer to 0).
If RobotAnim(a) > 0 Then
RobotAnim(a) = RobotAnim(a) - 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int((RobotPos(a, 0) + 5 + (8 * (a + 1))) / 32)
FutureRegion(1) = Int(RobotPos(a, 1) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Or Not Map(FutureRegion(0), FutureRegion(1) - 1) = 1 Then
RobotPos(a, 0) = FutureRegion(0) * 32 - (8 * (a + 1))
RobotFacing(a) = 1
'Otherwise just move the robot along its path.
Else
RobotPos(a, 0) = RobotPos(a, 0) + 2
End If
End If
'If it's set to face its relative right...
Else
'If the robot's animation frame is not 3 then increment that value by 1 (moving it closer to 3).
If RobotAnim(a) < 3 Then
RobotAnim(a) = RobotAnim(a) + 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int((RobotPos(a, 0) - 5 - (8 * (a + 1))) / 32)
FutureRegion(1) = Int(RobotPos(a, 1) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Or Not Map(FutureRegion(0), FutureRegion(1) - 1) = 1 Then
RobotPos(a, 0) = (FutureRegion(0) + 1) * 32 + (8 * (a + 1))
RobotFacing(a) = 0
'Otherwise just move the robot along its path.
Else
RobotPos(a, 0) = RobotPos(a, 0) - 2
End If
End If
End If
End If
'If the robot is set to face its relative left...
If RobotDir(a) = 1 Then
If RobotFacing(a) = 0 Then
'If the robot's animation frame is not 0 then decrement that value by 1 (moving it closer to 0).
If RobotAnim(a) > 0 Then
RobotAnim(a) = RobotAnim(a) - 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int(RobotPos(a, 0) / 32)
FutureRegion(1) = Int((RobotPos(a, 1) + 5 + (8 * (a + 1))) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Or Not Map(FutureRegion(0) + 1, FutureRegion(1)) = 1 Then
RobotPos(a, 1) = FutureRegion(1) * 32 - (8 * (a + 1))
RobotFacing(a) = 1
'Otherwise just move the robot along its path.
Else
RobotPos(a, 1) = RobotPos(a, 1) + 2
End If
End If
'If it's set to face its relative right...
Else
'If the robot's animation frame is not 3 then increment that value by 1 (moving it closer to 3).
If RobotAnim(a) < 3 Then
RobotAnim(a) = RobotAnim(a) + 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int(RobotPos(a, 0) / 32)
FutureRegion(1) = Int((RobotPos(a, 1) - 5 - (8 * (a + 1))) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) >= 1 Or Not Map(FutureRegion(0) + 1, FutureRegion(1)) = 1 Then
RobotPos(a, 1) = (FutureRegion(1) + 1) * 32 + (8 * (a + 1))
RobotFacing(a) = 0
'Otherwise just move the robot along its path.
Else
RobotPos(a, 1) = RobotPos(a, 1) - 2
End If
End If
End If
End If
'If the robot is set to face its relative left...
If RobotDir(a) = 2 Then
If RobotFacing(a) = 0 Then
'If the robot's animation frame is not 0 then decrement that value by 1 (moving it closer to 0).
If RobotAnim(a) > 0 Then
RobotAnim(a) = RobotAnim(a) - 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int((RobotPos(a, 0) - 5 - (8 * (a + 1))) / 32)
FutureRegion(1) = Int(RobotPos(a, 1) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) = 1 Or Not Map(FutureRegion(0), FutureRegion(1) + 1) = 1 Then
RobotPos(a, 0) = (FutureRegion(0) + 1) * 32 + (8 * (a + 1))
RobotFacing(a) = 1
'Otherwise just move the robot along its path.
Else
RobotPos(a, 0) = RobotPos(a, 0) - 2
End If
End If
'If it's set to face its relative right...
Else
'If the robot's animation frame is not 3 then increment that value by 1 (moving it closer to 3).
If RobotAnim(a) < 3 Then
RobotAnim(a) = RobotAnim(a) + 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int((RobotPos(a, 0) + 5 + (8 * (a + 1))) / 32)
FutureRegion(1) = Int(RobotPos(a, 1) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) = 1 Or Not Map(FutureRegion(0), FutureRegion(1) + 1) = 1 Then
RobotPos(a, 0) = (FutureRegion(0)) * 32 - (8 * (a + 1))
RobotFacing(a) = 0
'Otherwise just move the robot along its path.
Else
RobotPos(a, 0) = RobotPos(a, 0) + 2
End If
End If
End If
End If
'If the robot is set to face its relative left...
If RobotDir(a) = 3 Then
If RobotFacing(a) = 0 Then
'If the robot's animation frame is not 0 then decrement that value by 1 (moving it closer to 0).
If RobotAnim(a) > 0 Then
RobotAnim(a) = RobotAnim(a) - 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int(RobotPos(a, 0) / 32)
FutureRegion(1) = Int((RobotPos(a, 1) - 5 - (8 * (a + 1))) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) = 1 Or Not Map(FutureRegion(0) - 1, FutureRegion(1)) = 1 Then
RobotPos(a, 1) = (FutureRegion(1) + 1) * 32 + (8 * (a + 1))
RobotFacing(a) = 1
'Otherwise just move the robot along its path.
Else
RobotPos(a, 1) = RobotPos(a, 1) - 2
End If
End If
'If it's set to face its relative right...
Else
'If the robot's animation frame is not 3 then increment that value by 1 (moving it closer to 3).
If RobotAnim(a) < 3 Then
RobotAnim(a) = RobotAnim(a) + 1
RobotAnimLoaded = False
'Otherwise...
Else
'Determine where the robot's next position will be.
FutureRegion(0) = Int(RobotPos(a, 0) / 32)
FutureRegion(1) = Int((RobotPos(a, 1) + 5 + (8 * (a + 1))) / 32)
'If the robot is going to collide with a solid block or enter a block region with empty space below it,
'then place the robot directly adjacent to that block and flip the robot's facing direction.
If Map(FutureRegion(0), FutureRegion(1)) = 1 Or Not Map(FutureRegion(0) - 1, FutureRegion(1)) = 1 Then
RobotPos(a, 1) = FutureRegion(1) * 32 - (8 * (a + 1))
RobotFacing(a) = 0
'Otherwise just move the robot along its path.
Else
RobotPos(a, 1) = RobotPos(a, 1) + 2
End If
End If
End If
End If
'If the current animation frame has not been loaded yet, do so.
If RobotAnimLoaded = False Then
frmGravity.imgRobot(a).Picture = LoadPicture(RobotWalk(a, RobotDir(a), RobotAnim(a)))
RobotAnimLoaded = True
End If
Next a
End Sub
Public Sub CheckRobotContact()
For a = 0 To 1
'If the difference between the player's position and that of the robot is equal to their half-widths combined and
'half-heights combined, then shock the player.
If Abs(PlayerPos(0) - RobotPos(a, 0)) <= frmGravity.imgPlayer.Width / 2 + frmGravity.imgRobot(a).Width / 2 Then
If Abs(PlayerPos(1) - RobotPos(a, 1)) <= frmGravity.imgPlayer.Height / 2 + frmGravity.imgRobot(a).Height / 2 Then
Call PlayerStates.ShockPlayer
End If
End If
Next a
End Sub

5
Scores.txt

@ -0,0 +1,5 @@
"DJB",0,54,45
"JJH",0,58,40
"JJH",0,59,30
"DJB",1,4,20
"JJH",1,5,95

BIN
Sprites/BMPs/Bot_1_0_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_0_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_0_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_0_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_1_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_1_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_1_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_1_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_2_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_2_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_2_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_2_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_3_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_3_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_3_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_1_3_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Bot_2_0_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_0_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_0_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_0_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_1_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_1_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_1_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_1_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_2_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_2_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_2_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_2_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_3_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_3_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_3_2.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Bot_2_3_3.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
Sprites/BMPs/Character_Dazed_0_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Character_Dazed_0_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Character_Dazed_1_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Character_Dazed_1_1.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
Sprites/BMPs/Character_Dazed_2_0.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save