Ok, so there's two parts to this. There are a few ways to go about it, but without knowing if you have a grid or array system in place already, I'll be using the system condition Pick overlapping point
.
On clicked, if the cursor is not over a cannon, check the 8 spots around the clicked location to see if a cannon exists (9 really, just to make it easier to loop through, even though we already know there's no cannon where we clicked). We'll check each overlapping point for a cannon, and pick it if it's there. If there are any (picked count > 0), then place the cannon. We'll use a system for
loop for x and y location, from -1 to 1, multiplied by the width/height of the cannon (or your grid size basically) to go through each position. If there are no cannons picked/found, that means that was not a valid place to put a cannon and nothing happens.
+ Mouse: On Left button Clicked
+ Mouse: [X] Cursor is over Cannon
+ System: For "x" from -1 to 1
+ System: For "y" from -1 to 1
+ System: Pick Cannon overlapping (Mouse.X+LoopIndex("x")×Cannon.Width, Mouse.Y+LoopIndex("y")×Cannon.Height)
+ System: Cannon.PickedCount > 0
-> System: Create object Cannon on layer 0 at (Mouse.X, Mouse.Y), create hierarchy: False, template: ""
Instead of creating at mouse x and y you should use whatever snapping system you have to align it to your grid.
If there is already a cannon where we clicked, we will be (randomly I'm assuming?) placing a cannon in one of the 8 spots around it, that doesn't already have a cannon. We'll need local variables to keep track of which position we randomly chose, check those positions, and then only if it's valid place the cannon and stop the loop. There will also need to be a way to stop the loop if every spot around the clicked cannon is unavailable. This part is significantly more complicated, haven't quite got it working yet. Maybe using a permutation table with the advanced random plugin would be the cleanest way instead of just randomly picking spots around the target...
dropbox.com/scl/fi/mszw7bwp4vvglgmjo9siw/neighborcheckexample.c3p