
LEVEL_VERSION(1)
SET_GENERATE_SPEED(400)

REM -- If no player detected, enable AI.
IF(PLAYER_GOOD,GAME_TURN > 100)
    IF(PLAYER0,VIEW_TYPE == 0)
        COMPUTER_PLAYER(PLAYER0,0)
    ENDIF
    IF(PLAYER1,VIEW_TYPE == 0)
        COMPUTER_PLAYER(PLAYER1,0)
    ENDIF
    IF(PLAYER2,VIEW_TYPE == 0)
        COMPUTER_PLAYER(PLAYER2,0)
    ENDIF
    IF(PLAYER3,VIEW_TYPE == 0)
        COMPUTER_PLAYER(PLAYER3,0)
    ENDIF
ENDIF
REM -- Player Black is just a less ugly neutral player. We set him to roaming to remove the room flames.
COMPUTER_PLAYER(PLAYER5,ROAMING)

MAX_CREATURES(ALL_PLAYERS,40)
START_MONEY(ALL_PLAYERS,3000)
SET_GAME_RULE(GLOBALAMBIENTLIGHT,16)
SET_GAME_RULE(DISPLAYPORTALLIMIT,1)

ADD_CREATURE_TO_POOL(FLY,20)
ADD_CREATURE_TO_POOL(BUG,20)
ADD_CREATURE_TO_POOL(SPIDER,20)
ADD_CREATURE_TO_POOL(DEMONSPAWN,20)
ADD_CREATURE_TO_POOL(SORCEROR,20)
ADD_CREATURE_TO_POOL(DRUID,20)
ADD_CREATURE_TO_POOL(TROLL,20)
ADD_CREATURE_TO_POOL(BILE_DEMON,20)
ADD_CREATURE_TO_POOL(DARK_MISTRESS,20)
ADD_CREATURE_TO_POOL(DRAGON,20)
ADD_CREATURE_TO_POOL(HELL_HOUND,20)
ADD_CREATURE_TO_POOL(TENTACLE,20)
ADD_CREATURE_TO_POOL(ORC,20)
ADD_CREATURE_TO_POOL(MAIDEN,20)

CREATURE_AVAILABLE(ALL_PLAYERS,FLY,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,BUG,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,SPIDER,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,DEMONSPAWN,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,SORCEROR,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,DRUID,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,TROLL,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,BILE_DEMON,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,DARK_MISTRESS,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,DRAGON,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,HELL_HOUND,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,TENTACLE,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,ORC,1,1)
CREATURE_AVAILABLE(ALL_PLAYERS,MAIDEN,1,1)

MAGIC_AVAILABLE(ALL_PLAYERS,POWER_OBEY,1,1)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_IMP,1,1)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_SIGHT,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_CALL_TO_ARMS,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_CAVE_IN,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_HEAL_CREATURE,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_HOLD_AUDIENCE,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_CHICKEN,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_SPEED,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_LIGHTNING,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_CONCEAL,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_PROTECT,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_DISEASE,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_DESTROY_WALLS,1,0)
MAGIC_AVAILABLE(ALL_PLAYERS,POWER_ARMAGEDDON,1,0)

ROOM_AVAILABLE(ALL_PLAYERS,TREASURE,1,1)
ROOM_AVAILABLE(ALL_PLAYERS,LAIR,1,1)
ROOM_AVAILABLE(ALL_PLAYERS,GARDEN,1,1)
ROOM_AVAILABLE(ALL_PLAYERS,RESEARCH,1,1)
ROOM_AVAILABLE(ALL_PLAYERS,TRAINING,1,1)
ROOM_AVAILABLE(ALL_PLAYERS,BRIDGE,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,GUARD_POST,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,WORKSHOP,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,BARRACKS,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,PRISON,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,TORTURE,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,TEMPLE,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,GRAVEYARD,1,0)
ROOM_AVAILABLE(ALL_PLAYERS,SCAVENGER,1,0)

TRAP_AVAILABLE(ALL_PLAYERS,ALARM,1,0)
TRAP_AVAILABLE(ALL_PLAYERS,POISON_GAS,1,0)
TRAP_AVAILABLE(ALL_PLAYERS,LIGHTNING,1,0)
TRAP_AVAILABLE(ALL_PLAYERS,WORD_OF_POWER,1,0)
TRAP_AVAILABLE(ALL_PLAYERS,LAVA,1,0)
TRAP_AVAILABLE(ALL_PLAYERS,SENTRY,1,0)

DOOR_AVAILABLE(ALL_PLAYERS,WOOD,1,0)
DOOR_AVAILABLE(ALL_PLAYERS,BRACED,1,0)
DOOR_AVAILABLE(ALL_PLAYERS,STEEL,1,0)
DOOR_AVAILABLE(ALL_PLAYERS,MAGIC,1,0)
DOOR_AVAILABLE(ALL_PLAYERS,SECRET,1,0)


REM -- Win Condition
REM -- We check for game_turn because AIs are only assigned at turn 100.
IF(PLAYER_GOOD,GAME_TURN > 200)
    IF(PLAYER0,ALL_DUNGEONS_DESTROYED == 1)
        WIN_GAME
    ENDIF
    IF(PLAYER1,ALL_DUNGEONS_DESTROYED == 1)
        WIN_GAME
    ENDIF
    IF(PLAYER2,ALL_DUNGEONS_DESTROYED == 1)
        WIN_GAME
    ENDIF
    IF(PLAYER3,ALL_DUNGEONS_DESTROYED == 1)
        WIN_GAME
    ENDIF
ENDIF


REM -- Lock player character while level slabs and lag settles.
REM -- Countdown for player regaining control.
IF(PLAYER_GOOD,FLAG1 == 0)
    NEXT_COMMAND_REUSABLE
    ZOOM_TO_LOCATION(PLAYER0,PLAYER0)
    NEXT_COMMAND_REUSABLE
    ZOOM_TO_LOCATION(PLAYER1,PLAYER1)
    NEXT_COMMAND_REUSABLE
    ZOOM_TO_LOCATION(PLAYER2,PLAYER2)
    NEXT_COMMAND_REUSABLE
    ZOOM_TO_LOCATION(PLAYER3,PLAYER3)
ENDIF
IF(PLAYER0,GAME_TURN > 225)
    CLEAR_MESSAGE(0)
    QUICK_MESSAGE(5,"3..",TIME)
ENDIF
IF(PLAYER0,GAME_TURN > 250)
    CLEAR_MESSAGE(0)
    QUICK_MESSAGE(6,"2..",TIME)
ENDIF
IF(PLAYER0,GAME_TURN > 275)
    CLEAR_MESSAGE(0)
    QUICK_MESSAGE(7,"1..",TIME)
ENDIF
IF(PLAYER0,GAME_TURN > 300)
    CLEAR_MESSAGE(0)
    SET_FLAG(PLAYER_GOOD,FLAG1,1)
    SET_TIMER(PLAYER_GOOD,TIMER0)
ENDIF


REM -- Spawn player imps when level actually 'starts'. Six imps each.
IF(PLAYER_GOOD,FLAG1 == 1)
    IF(PLAYER_GOOD,TIMER0 > 10)
        IF(PLAYER_GOOD,FLAG2 < 6)
            NEXT_COMMAND_REUSABLE
            USE_POWER_AT_LOCATION(PLAYER0,PLAYER0,POWER_IMP,1,1)
            NEXT_COMMAND_REUSABLE
            USE_POWER_AT_LOCATION(PLAYER1,PLAYER1,POWER_IMP,1,1)
            NEXT_COMMAND_REUSABLE
            USE_POWER_AT_LOCATION(PLAYER2,PLAYER2,POWER_IMP,1,1)
            NEXT_COMMAND_REUSABLE
            USE_POWER_AT_LOCATION(PLAYER3,PLAYER3,POWER_IMP,1,1)
            NEXT_COMMAND_REUSABLE
            ADD_TO_FLAG(PLAYER_GOOD,FLAG2,1)
            NEXT_COMMAND_REUSABLE
            SET_TIMER(PLAYER_GOOD,TIMER0)
        ENDIF
    ENDIF
ENDIF


REM -- Randomly picks between 'maps'.
IF(PLAYER0,GAME_TURN > 100)
    RANDOMISE_FLAG(PLAYER_GOOD,FLAG0,4)
ENDIF


REM -- Ochre Halls
IF(PLAYER_GOOD,FLAG0 == 1)
    QUICK_MESSAGE(1,"Ochre Halls",POWER_CAVE_IN)
    SET_TEXTURE(ALL_PLAYERS,LATERITE_CAVERN)
    REM -- PLAYER0
    CHANGE_SLAB_TYPE(22,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(18,25,PATH,MATCH)
    REM -- PLAYER1
    CHANGE_SLAB_TYPE(62,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(66,25,PATH,MATCH)
    REM -- PLAYER2
    CHANGE_SLAB_TYPE(18,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(22,69,PATH,MATCH)
    REM -- PLAYER3
    CHANGE_SLAB_TYPE(66,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(62,69,PATH,MATCH)
    REM -- MAP CENTER
    CHANGE_SLAB_TYPE(42,42,LAVA,MATCH)
ENDIF


REM -- The Muck
IF(PLAYER_GOOD,FLAG0 == 2)
    QUICK_MESSAGE(2,"The Muck",BRIDGE)
    SET_TEXTURE(ALL_PLAYERS,SWAMP_SERPENT)
    REM -- PLAYER0
    CHANGE_SLAB_TYPE(20,14,WATER,MATCH)
    CHANGE_SLAB_TYPE(14,20,WATER,MATCH)
    CHANGE_SLAB_TYPE(26,20,WATER,MATCH)
    CHANGE_SLAB_TYPE(20,26,WATER,MATCH)
    CHANGE_SLAB_TYPE(19,19,WATER,MATCH)
    CHANGE_SLAB_TYPE(22,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(18,25,PATH,MATCH)
    REM -- PLAYER1
    CHANGE_SLAB_TYPE(64,14,WATER,MATCH)
    CHANGE_SLAB_TYPE(64,26,WATER,MATCH)
    CHANGE_SLAB_TYPE(58,20,WATER,MATCH)
    CHANGE_SLAB_TYPE(70,20,WATER,MATCH)
    CHANGE_SLAB_TYPE(65,19,WATER,MATCH)
    CHANGE_SLAB_TYPE(62,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(66,25,PATH,MATCH)
    REM -- PLAYER2
    CHANGE_SLAB_TYPE(20,58,WATER,MATCH)
    CHANGE_SLAB_TYPE(20,70,WATER,MATCH)
    CHANGE_SLAB_TYPE(14,64,WATER,MATCH)
    CHANGE_SLAB_TYPE(26,64,WATER,MATCH)
    CHANGE_SLAB_TYPE(19,65,WATER,MATCH)
    CHANGE_SLAB_TYPE(18,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(22,69,PATH,MATCH)
    REM -- PLAYER3
    CHANGE_SLAB_TYPE(64,58,WATER,MATCH)
    CHANGE_SLAB_TYPE(58,64,WATER,MATCH)
    CHANGE_SLAB_TYPE(70,64,WATER,MATCH)
    CHANGE_SLAB_TYPE(64,70,WATER,MATCH)
    CHANGE_SLAB_TYPE(65,65,WATER,MATCH)
    CHANGE_SLAB_TYPE(66,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(62,69,PATH,MATCH)
    REM -- MAP CENTER
    CHANGE_SLAB_TYPE(42,42,WATER,MATCH)
ENDIF


REM -- Cold Day In Hell
IF(PLAYER_GOOD,FLAG0 == 3)
    QUICK_MESSAGE(3,"Cold Day In Hell",HAILSTORM)
    SET_TEXTURE(ALL_PLAYERS,WINTER)
    REM -- PLAYER0
    CHANGE_SLAB_TYPE(20,14,LAVA,MATCH)
    CHANGE_SLAB_TYPE(14,20,LAVA,MATCH)
    CHANGE_SLAB_TYPE(26,20,LAVA,MATCH)
    CHANGE_SLAB_TYPE(20,26,LAVA,MATCH)
    CHANGE_SLAB_TYPE(19,19,LAVA,MATCH)
    CHANGE_SLAB_TYPE(22,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(18,25,PATH,MATCH)
    REM -- PLAYER1
    CHANGE_SLAB_TYPE(64,14,LAVA,MATCH)
    CHANGE_SLAB_TYPE(64,26,LAVA,MATCH)
    CHANGE_SLAB_TYPE(58,20,LAVA,MATCH)
    CHANGE_SLAB_TYPE(70,20,LAVA,MATCH)
    CHANGE_SLAB_TYPE(65,19,LAVA,MATCH)
    CHANGE_SLAB_TYPE(62,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(66,25,PATH,MATCH)
    REM -- PLAYER2
    CHANGE_SLAB_TYPE(20,58,LAVA,MATCH)
    CHANGE_SLAB_TYPE(20,70,LAVA,MATCH)
    CHANGE_SLAB_TYPE(14,64,LAVA,MATCH)
    CHANGE_SLAB_TYPE(26,64,LAVA,MATCH)
    CHANGE_SLAB_TYPE(19,65,LAVA,MATCH)
    CHANGE_SLAB_TYPE(18,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(22,69,PATH,MATCH)
    REM -- PLAYER3
    CHANGE_SLAB_TYPE(64,58,LAVA,MATCH)
    CHANGE_SLAB_TYPE(58,64,LAVA,MATCH)
    CHANGE_SLAB_TYPE(70,64,LAVA,MATCH)
    CHANGE_SLAB_TYPE(64,70,LAVA,MATCH)
    CHANGE_SLAB_TYPE(65,65,LAVA,MATCH)
    CHANGE_SLAB_TYPE(66,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(62,69,PATH,MATCH)
    REM -- MAP CENTER
    CHANGE_SLAB_TYPE(42,42,LAVA,MATCH)
ENDIF


IF(PLAYER_GOOD,FLAG0 == 4)
    QUICK_MESSAGE(4,"Magma Pit",FLAME_BREATH)
    SET_TEXTURE(ALL_PLAYERS,LAVA_CAVERN)
    REM -- PLAYER0
    CHANGE_SLAB_TYPE(19,19,LAVA,MATCH)
    CHANGE_SLAB_TYPE(22,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(18,25,PATH,MATCH)
    REM -- PLAYER1
    CHANGE_SLAB_TYPE(65,19,LAVA,MATCH)
    CHANGE_SLAB_TYPE(62,15,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,18,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,22,PATH,MATCH)
    CHANGE_SLAB_TYPE(66,25,PATH,MATCH)
    REM -- PLAYER2
    CHANGE_SLAB_TYPE(19,65,LAVA,MATCH)
    CHANGE_SLAB_TYPE(18,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(15,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(25,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(22,69,PATH,MATCH)
    REM -- PLAYER3
    CHANGE_SLAB_TYPE(65,65,LAVA,MATCH)
    CHANGE_SLAB_TYPE(66,59,PATH,MATCH)
    CHANGE_SLAB_TYPE(59,66,PATH,MATCH)
    CHANGE_SLAB_TYPE(69,62,PATH,MATCH)
    CHANGE_SLAB_TYPE(62,69,PATH,MATCH)
    REM -- MAP CENTER
    CHANGE_SLAB_TYPE(42,42,LAVA,MATCH)
ENDIF


REM -- Known Issues
REM -- Change Slab Type does not play nicely with cut corners. I could fix it by using change_slab_match on the imp rock, but it's just not worth the effort.
REM -- Change Slab Type means I can't place effect generators except through script. Not gonna bother doing that either.
REM -- Change Slab Type doesn't randomize lava tiles, so the lava will look a lot 'rockier' than pre-placed lava does.