# Putting a condition onto an action?

Get help using Construct 2

### » Thu Oct 31, 2013 8:30 pm

I'm new to Construct 2 and I'm making a maze based game with enemy sprites. I want to have them randomly generate at the start of the layout. But by doing that they often generate in the middle of a wall and get stuck. I also want them to never generate within line of sight of the player. How to I tell it to randomly generate an object at any location on the layout, but never in a wall or in line of sight? Thank you.
B
5
S
1
Posts: 6
Reputation: 424

### » Thu Oct 31, 2013 9:42 pm

edit: if you want a less scientific solution, you could for example write your action like this:

localvar = 0
while
localvar=0: spawn enemy at x = floor(random(gridsize+1))*tilesize y = floor(random(gridsize+1))*tilesize
-- (invert) enemy overlaps wallsprite AND distance enemy-player > x: set localvar=1
-- else: destroy enemy

Depends how you handle your maze generation pretty much.
Example:

and you've put your maze information in an array.
1, 2, 3... are X.
A, B, C... are Y.
Grey = walls, the value of the array at this (X,Y)-position will be 1.
White = ways, the value of the array at this (X,Y)-position will be 0.
Red = vision, the value of the array at this (X,Y)-position will be 2.

Then upon enemy creation you would only allow enemies to spawn on tiles where the corresponding array value is 0.

How to get there?
- The first two (way and walls) are straight forward - when you generate your maze you can input this data into the array.
- now the red squares:
* a for loop exploring into each direction starting from the player position P would do the trick. Set the values to two and stop the loop once it hits a wall (don't set that value to two).
* if you don't wanna spawn enemies near your player, set all array values that are 0 and within +-x of your player's X and Y to 2.

After that use a while loop with local variables, where you roll a random number for x and y, the number going from 0 to your gridsize in x or y. Then you check if the array is 0 for that x and y. If yes: spawn the enemy at x*tilesize,y*tilesize and stop the loop (by setting your while-condition to false). If no (= else), it will loop again.

Once you've successfully spawned your enemy, use array: for each element AND array.curvalue = 2: set array at (array.curx, array.cury) to 0.mindfaQ2013-10-31 21:52:28
Visual Novel 'Engine' in 100 Events
if you ever have to choose between buying Construct 2 on scirra.com or on Steam, read this: Review
B
22
S
9
G
1
Posts: 788
Reputation: 3,788