@ -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 |
@ -0,0 +1 @@ |
|||
Set KeyIsDown(KeyCode) to True |
@ -0,0 +1 @@ |
|||
Set KeyIsDown(KeyCode) to False |
@ -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 |
@ -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 |
@ -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 |
@ -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 |
@ -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 |
@ -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 |
@ -0,0 +1,4 @@ |
|||
Sub ResetClock: |
|||
Set LevelMinutes to 0 |
|||
Set LevelSeconds to 0 |
|||
Set LevelMilliseconds to 0 |
@ -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 |
@ -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 |
@ -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 |
@ -0,0 +1 @@ |
|||
Set IncreaseVelocity to the result of (u * t + 0.5 * g * t * t) * DimensionScaler |
@ -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 |
@ -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 |
@ -0,0 +1 @@ |
|||
Set PlayerState to 0 |
@ -0,0 +1 @@ |
|||
Set PlayerState to 2 |
@ -0,0 +1 @@ |
|||
Set PlayerState to 3 |
@ -0,0 +1 @@ |
|||
Set PlayerState to 1 |
@ -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 |
@ -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 |
After Width: | Height: | Size: 2.7 MiB |
After Width: | Height: | Size: 154 KiB |
After Width: | Height: | Size: 246 KiB |
After Width: | Height: | Size: 208 KiB |
After Width: | Height: | Size: 193 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 169 KiB |
After Width: | Height: | Size: 196 KiB |
After Width: | Height: | Size: 198 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 236 KiB |
After Width: | Height: | Size: 186 KiB |
After Width: | Height: | Size: 1003 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 1.5 KiB |
@ -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 |
@ -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 |
@ -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 |
@ -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 |
@ -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 |
Can't render this file because it has a wrong number of fields in line 55.
|
@ -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 |
@ -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 |
@ -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 |
@ -0,0 +1,5 @@ |
|||
"DJB",0,54,45 |
|||
"JJH",0,58,40 |
|||
"JJH",0,59,30 |
|||
"DJB",1,4,20 |
|||
"JJH",1,5,95 |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |