Warning: this is a long answer. It may take a while for some of the images to load. For those of you who don't like reading: The working .blend files are at the bottom of this answer.
Basic Mechanics
You first need an empty (named Arrow) to follow the mouse. This empty will add the buildings.
You will need a script like this.
from bge import logic
def main():
scene = logic.getCurrentScene()
cont = logic.getCurrentController()
mouse_over = cont.sensors["MouseOver"]
if mouse_over.positive and scene.objects["Arrow"]['ActiveYesNo?'] :
tracker = scene.objects["Arrow"]
tracker.worldPosition = mouse_over.hitPosition
tracker.worldPosition.z += 1
And use this on your empty.
That way your empty will always track to your mouse.
Now all you need to do is make it add the buildings when you click and it is in a valid position. You can do this by adding some more simple logic on your empty.
Now when the Boolean property OkSpot? is true, and the left mouse button is pressed, it will add your building object. however this doesn't help us much if there is nothing to toggle that property when the placement spot is valid.
Now when the arrow receives the message GoodSpot it will set the Boolean OkSpot? to true and, when the arrow receives the message BadSpot it will set the Boolean OkSpot? to false. Now we are done with the empty (named Arrow), but we now need something to send those messages.
We obviously need some sort of collision detector. In this case, a simple cube will work. Add a cube and parent it to your empty (named Arrow).
We need to edit the cube so that it is slightly above the ground.
Now when it is on the slightest slope, it will be colliding with the ground.
It is also important that you change your Collision object's collision type from static to sensor, because static objects can't detect collisions with other static objects and, I assume that your ground will be a static object. You also should set it's collision bounds to Box.
Now that we have our collision object detecting collisions properly, we still need it to send that information to the arrow. We can do this by using this logic setup.
Now we can test it. Everything should be working so far. the building we will be adding is just a cube for now.
The basic mechanics should be working now to place the buildings. skip to the end if you don't care about how your game looks.
If you want to be make it much more complicated, you can have two other no-collision duplicates of the building that will be added, one transparent green, and the other transparent red. (to show when the selection is valid.) Then you can make the arrow directly connected to the red and green objects telling it when the selection is or is not valid. TO make this simpler, first we should set the maximum draw type on your collision detector to wire. we also need to make it invisible.
Now if we look at the viewport, it should look like this.
Now we can add the red and green cubes. These are just graphics to make it look pretty and are actually irrelevant for the basic mechanics. The system already works fine (skip to the end if you don't need it to look good).
Now, both your red and green cubes should be no-collision and both parented to the main empty (still named Arrow).
Now all we need to do is make them toggle their visibility depending on whether or not the selection is valid. we can do this by adding two visibility actuators to both Cube Red and Cube Green then we need to add another property sensor on the empty (yes, it is still named Arrow) to detect when the Boolean OkSpot? is false.
If you don't like reading but are ok with pictures, skip this part.
we already have a property sensor to detect when it is true, so we can re-use that one. If we connect them to the appropriate visibility actuators on both cubes, it should change color accordingly. I have named the and controllers ok and not to make connecting them simpler. The and controller that is connected to the property sensor that detects when OkSpot? is true, receives a positive pulse when the arrow is in a valid spot. because we are going to use the green cube to show when the selection is valid, it should be visible when the selection is valid. the red cube should not be visible when the selection is valid. connect the other *and * controller to the visibility actuators that are still unused.
Now that everything is working, we can test it again.
Everything seems to be working fine.
We are now going to add the button to toggle on/off the build system. If you only want it to work and look cool, skip to the very end where the blend files are. Doing this will make a big mess of the logic, and I recommend also downloading the simplified blend so you can get an idea of how this works without the messy logic of the working one.
We can now add the button to turn on/off the arrow.
We need an overlay scene with a camera and a button. the button can be something fancy, or just a plane with logic.
Now we can go back to the main scene and add a scene actuator to one of the objects to add the HUD scene. It is true that you could put it on any one of your objects, But I usually add an empty and put it somewhere where it is easily accessible. This empty holds all of the Game start/end and Scene add/remove logic.
We also need the mouse to display. In newer versions, this is much easier than before.
Now we need to modify the logic on the original empty (still named Arrow). When logic starts to get this messy, you can un-check the check boxes to make editing easier.
Note that doing this also disables the logic bricks so be sure to re-enable them before testing.
From the newly added logic on the Arrow, now when you place a building, it will deactivate the arrow.
We need to add a way so that clicking the Build button on the HUD will activate it add a new one.
We should test it now to see if this part is working.
Don't forget to re-enable the logic that we un-checked
This part is working. However, we can still see the arrow if it isn't active. This can be fixed easily enough.
You need to significantly change the logic on your arrow to match this.
(Simplified)
(Expanded)
There are two blend files below. One is without that mess, one has it working.
We must test it again.
If you had any trouble following that, you can always look at, take apart, and/or modify the blend files.
Blend file without button to build (always has arrow active) - Logic is simple.
Blend file with button to build (Click button to activate arrow, click to place cube, clicking also deactivates arrow so you must click build button for each cube you want to add again) - full working demo. Logic is harder to understand.