So, our goal for this episode is to get water functioning.  For our water implementation, we'll just make another
rectangle (they're very useful shapes, aren't they?) to represent a body of water.  Our initial set up for water
is just like that of ice, so let's go ahead and set up a body of water.

Declarations:
    Dim Waters As ArrayList
    'Holds all of the bodies of water in the level.
    Dim Water As Rectangle
    'Holds the location of a body of water.
    Dim WaterBrsh As Brush
    'The color of the water.
Initialization:
        WaterBrsh = New SolidBrush(Color.FromArgb(128, 200, 255, 230))
        'Very clear water.

        Waters = New ArrayList
        'Create the list of all waters.
        Water = New Rectangle(3200, 250, 400, 300)
        Waters.Add(Water)
        'Add this new water to the list of all water.
Drawing the water - note that it is mostly just replacing all "Ice" with "Water", but I also deleted the border drawing portion.
        For Each Water In Waters
            Water.Offset(-ScreenLeft, -ScreenTop)
            GFX.FillRectangle(WaterBrsh, Water)
            Water.Offset(ScreenLeft, ScreenTop)
            'Draws the water.
        Next
Now for the character's interface with the water. First, we have to plan out all of the behaviors of the player moving into and out of the water. So, we'll definitely need a variable that states if the player is in the water (InWater).
    Dim InWater As Boolean
    'Is the player swimming?
So, when the player jumps into the water, a wet impulse will slow down the player's falling speed. Also, in real life, terminal velocity is VERY low in water, but we can screw around a little bit so the user won't have to wait for hours on end for the player to fall to the bottom of a pool. Also, due to the water, walking movement speed will be reduced. Jumping speed will also be reduced, but, due to time reasons, we don't need to reduce these to very low values. The InWater check will have to appear in many places. The only thing that we will ignore is ice that is under water - walkable ice surfaces are usually not underwater due to ice floating to the top. The next obstacle is to define exactly when the player is "in the water" - clearly standing on an object on top of the surface of the water is not 'in' the water. For a realistic "in the water" point, we'll use regular rectangular checks, but add that the middle of the player must be in the rectangle. This will also leave the ability to do that funny effect seen in some games with water on the ceiling and the player literally falling out of the water. For swimming, we can just make the player jump an infinite number of times while underwater. The check if the player is in the water goes after moving left, moving right, or while jumping (moving left and right have only the Do Loop and initialization, the pair of Do Loops in the If and Else are so that we don't continue jumping into the water while in the water:
                LV = 0
                'Initialize these values.
                If InWater Then
                    InWater = False
                    'Initialize these values.
                    Do
                        Water = DirectCast(Waters.Item(LV), Rectangle)
                        Water.Y += HALFHEIGHT
                        Water.Height -= HALFHEIGHT
                        'This adjustment is necessary for walking so that the player doesn't walk to the edge of the water
                        'and suddenly be in water.
                        If PlayerLoc.IntersectsWith(Water) Then
                            InWater = True
                        End If
                        LV += 1
                    Loop Until LV = Waters.Count OrElse InWater = True
                Else
                    Do
                        Water = DirectCast(Waters.Item(LV), Rectangle)
                        Water.Y += HALFHEIGHT
                        Water.Height -= HALFHEIGHT
                        'This adjustment is necessary for walking so that the player doesn't walk to the edge of the water
                        'and suddenly be in water.
                        If PlayerLoc.IntersectsWith(Water) Then
                            InWater = True
                            'Move the player to the edge of this wall.
                            PlayerVeloc >>= 2
                            'Wet impulse, we've splashed into the water (play splash sound effect here).
                        End If
                        LV += 1
                    Loop Until LV = Waters.Count OrElse InWater = True
                End If
You may be thinking that I could have done this with a For Loop? I could have, but then, I'd have to exit the loop, which is not good. And, they have yet to support a Do Each statement, which would work wonders here. When walking underwater, movement is halved:
                    ElseIf InWater Then
                        PlayerLoc.Offset(-(MOVESPEED >> 2) - (MOVESPEED >> 1), 0)
                        'Halfspeed underwater.

                    ElseIf InWater Then
                        PlayerLoc.Offset(-(MOVESPEED >> 1), 0)
                        'Halfspeed underwater

                    ElseIf InWater Then
                        PlayerLoc.Offset((MOVESPEED >> 2) + (MOVESPEED >> 1), 0)
                        'Halfspeed underwater.

                    ElseIf InWater Then
                        PlayerLoc.Offset(MOVESPEED >> 1, 0)
                        'Halfspeed underwater.
Some constants that we'll need to use to implement our features:
    Const SUBTERMINAL As Integer = TERMINALVELOCITY * 3 \ 4
    'The maximum velocity that the character reaches while falling underwater.
    Const SUBGRAVITY As Integer = GRAVITY \ 2
    'Underwater acceleration factor ... how much the speed changes at each tick while falling underwater.
    Const SUBGRAVITYTH As Integer = SUBGRAVITY * 3 >> 1
    'This represents how much the player moved due to underwater acceleration.
    Const SUBINITIALVELOCITY As Integer = SBARINITIALVELOCITY * 3 \ 4
    'The initial velocity for the player's jump using space bar underwater.
    Const SUBLOWJUMPVELOCITY As Integer = LOWJUMPVELOCITY * 3 \ 4
    'Initial velocity for a low jump underwater.
Modification to the falling and terminal velocity check while IsJumping:
                If InWater Then
                    PlayerLoc.Offset(0, PlayerVeloc + SUBGRAVITY >> 1)
                    'dD (.OffSet) = Vo (PlayerVeloc) + 0.5 * A (GRAVITY >> 1)
                    PlayerVeloc += SUBGRAVITY
                    'dV = (PlayerVeloc +=) A (GRAVITY)
                    'Moves the character according to its velocity, gravity, and location.

                    If PlayerVeloc >= SUBTERMINAL Then  'We're in TV.
                        PlayerVeloc = SUBTERMINAL  'Limit the velocity.
                    End If
                Else
                    PlayerLoc.Offset(0, PlayerVeloc + GRAVITY >> 1)
                    'dD (.OffSet) = Vo (PlayerVeloc) + 0.5 * A (GRAVITY >> 1)
                    PlayerVeloc += GRAVITY
                    'dV = (PlayerVeloc +=) A (GRAVITY)
                    'Moves the character according to its velocity, gravity, and location.

                    If PlayerVeloc >= TERMINALVELOCITY Then  'We're in TV.
                        PlayerVeloc = TERMINALVELOCITY  'Limit the velocity.
                    End If
                End If
And jumping with the space bar:
            If InWater Then
                IsJumping = True
                'The jump is initialized.
                MobileIndex = -1
                'We are not standing on anything now, because we are jumping.


                If GoDown Then
                    PlayerVeloc = Me.SUBLOWJUMPVELOCITY
                    'Use low jump velocity if down is pressed.
                Else
                    PlayerVeloc = Me.SUBINITIALVELOCITY
                    'Use space bar initial velocity.

                End If
And you should have fully functioning water! (On a side note: I was extremely happy to know that I made all of this successfully with no bugs on the first try.) Now, if you want to do something silly, like put lava underwater, go ahead, at least, with working water, you're in business! Download