That first question can't be answered. It depends on your skills.
It seems to me that you allready have a good idea about what you'll need to do. Best is, depending on your experience, to start off with several smaller experiments in which you focus on a single element of the game, pretty much the things you've summed up allready. Then, if you know how you want to setup each element, you can bring everything together in the final endproject.
Firstly, I would look into types (Type). I suppose the field runners could best be types, as well as the bullets and the towers. Each type could have fields, such as these:
creeps
-x/y location
-type/sort/kind
-energy
bullets:
-x/y location
-dx/dy direction
towers
-x/y location
-type/sort/kind
-range
First goal would be to write the creeps, as a Type. They should be able to rotate, and walk from the left to the right of the screen. For rotating images, look for prerendered rotation, since b3d can't rotate 2d images realtime.
If you don't want to prerender, use 3d to simulate 2d. 3d objects can rotate realtime.
Collision detection might be an issue to look into. RectsOverlap should be sufficient, since you don't need pixel-perfect collisions.
So, alter the program so that you can delete enemies with the mouse.
Next would be, create bullets. You could write a program in which you can fire bullets with and from the mouse. If a bullet hits the enemy, it should be deleted.
It would be good to use Functions to create/update/draw each element. CreateBullet, UpdateAndDrawBullets, CreateEnemy, UpdateAndDrawEnemy. This will result in a more flexible and more readable program.
For the grid, you could use an array (Dim). The array can be used to check if a certain position is allready filled with something, and you can use it to let the field runners determine their route. Best is to look at the way to store Types into arrays. That way, you can immediately access the type instance that is on a certain x,y location.
To convert from mouse coords to grid coords, divide by the tilesize:
gx = mousex / 32
gy = mousey / 32
Due to the fact that integers are truncated (rounded to below) by default, the fractional part will dissapear, leaving the tile location.
The other way around, from tile to x,y:
screenx = gx * 32
screeny = gy * 32
For determining their route, I think that each enemy takes the shortest path to the endpoint, with the least danger possible.
You could create a 2d grid (array), and use a number that determines that danger level for each location. If a tower is placed, all grid tiles that are in it's firing range should increase their danger value. The stronger to tower, the bigger the increase should be.
By using that system, if two towers are near each other, all tiles that are in their overlapping firing range will automatically have a bigger danger level that tiles that are in the firing range of only one tower.
If tiles are not in any towers firing range, their danger level is zero.
A creep can than scan each vertical colomn and look for the tiles with the lowest danger value. If you combine that with the distance that such a tile has from the creeps position in the row on the left side of the row you are checking, it should be able to decide which route it should take. It would most likely come round to calculating a few possible routes, sorting them on their danger and length, and then choosing the first one. (The shortest and least dangerous)
0 0 0 0 1 0 0
0 0 0 1 2 1 0
start-> 0 1 0 0 1 0 0 ->finish
0 0 0 0 0 0 1
0 0 0 0 0 1 2
Upgrading, selling and dragging seem to me less relevant to the gameplay than bullets/enemies/towers. Same goes for the game menu.
In that sence, I'd suggest to start off with the basics, and upgrade the game when the basic layer is solid enough to build upon. You should prob. best not attempt to create the game in a linear way, I mean, in terms of the creation process the starting point is not the game menu, and the endpoint is not the gameover screen. The creation process should in my opinion start with the simplest form of the game, with one type of tower, one type of enemy and one type of bullet. Also it is a good idea to save each subversion under a different name as you go along.
Here is an example program that might be helpful:
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()
;starting pos
bx# = 400
by# = 300
Repeat
If MouseHit(1) Then
;choose new goal
aimx# = MouseX()
aimy# = MouseY()
;calculate distance = number of steps
dist# = Sqr((aimx - bx) ^ 2 + (aimy - by) ^ 2)
;calculate direction it should take pro step
dx# = (aimx# - bx#) / dist#
dy# = (aimy# - by#) / dist#
End If
;if there are steps to take
If dist# >= 1 Then
;decrease number of steps
dist# = dist# - 1
;take step in chosen direction
bx# = bx# + dx#
by# = by# + dy#
End If
Cls
;draw green oval at (bx,by)
Color 0, 255, 0
Oval bx - 5, by - 5, 11, 11
;draw red oval al (mousex,mousey)
Color 255, 0, 0
Oval MouseX() - 5, MouseY() - 5, 11, 11
;draw info text
Color 255, 255, 255
Text 0, 0, "click left mousebutton"
Text 0, 20, "dist = " + dist
Flip
;esc=exit
Until KeyHit(1)
End