Quick answer: Room Creation Code runs after instance Create events. Read shared values in Room Start event, or use global variables set before room entry.

A level’s Room Creation Code sets level_difficulty. An enemy’s Create event reads level_difficulty for spawning health — undefined error. Order of execution: instance Create runs first.

The Order

  1. Game enters the room.
  2. Each instance’s Create event runs (in placement order).
  3. Room Creation Code runs.
  4. Game Start (first room only).
  5. Room Start (every room).

Variables set in step 3 aren’t visible in step 2.

Fix 1: Use Room Start

// Enemy Create event
hp = 10;   // safe default

// Enemy Room Start event
hp = global.level_difficulty * 10;   // now Room Creation Code finished

Read in Room Start. By then, Room Creation Code has completed.

Fix 2: Global Set Before Room

If the value is known before entering:

// in previous room or menu
global.level_difficulty = 3;
room_goto(rm_level);

Globals persist across rooms. Read from Create event of next room’s instances; they pre-existed.

Fix 3: Controller Object

Place a controller instance first in room (lowest depth, or first in instance list). Its Create event sets up variables that other instances read:

// obj_levelController Create
global.level_difficulty = choose(1, 2, 3);

// obj_enemy Create
hp = global.level_difficulty * 10;

Place controller before enemies in the instance order (drag in room editor). It runs first.

Verifying

Enter the room repeatedly. Enemies spawn with expected HP. No undefined errors in compile output. Each room can override globals if needed.

“Event order is fixed. Either prepare values before, or read in a later event.”

For complex rooms, document the dependency chain in code comments — future-you will thank past-you when adding a new instance.