LEVEL_VERSION(1)
SET_GENERATE_SPEED(600)
COMPUTER_PLAYER(PLAYER2, ROAMING)
COMPUTER_PLAYER(PLAYER3, ROAMING)
COMPUTER_PLAYER(PLAYER4, ROAMING)
COMPUTER_PLAYER(PLAYER5, ROAMING)
COMPUTER_PLAYER(PLAYER6, ROAMING)
START_MONEY(ALL_PLAYERS, 2500)
MAX_CREATURES(ALL_PLAYERS, 15)

ALLY_PLAYERS(PLAYER2, PLAYER_GOOD, 1)
ALLY_PLAYERS(PLAYER3, PLAYER_GOOD, 1)
ALLY_PLAYERS(PLAYER4, PLAYER_GOOD, 1)
ALLY_PLAYERS(PLAYER6, PLAYER_GOOD, 1)
ALLY_PLAYERS(PLAYER2, PLAYER3, 1)
ALLY_PLAYERS(PLAYER2, PLAYER4, 1)
ALLY_PLAYERS(PLAYER2, PLAYER6, 1)
ALLY_PLAYERS(PLAYER3, PLAYER4, 1)
ALLY_PLAYERS(PLAYER3, PLAYER6, 1)
ALLY_PLAYERS(PLAYER4, PLAYER6, 1)

ADD_CREATURE_TO_POOL(FLY, 6)
ADD_CREATURE_TO_POOL(BUG, 6)
ADD_CREATURE_TO_POOL(DEMONSPAWN, 4)
ADD_CREATURE_TO_POOL(TROLL, 4)
ADD_CREATURE_TO_POOL(SPIDER, 4)
ADD_CREATURE_TO_POOL(HELL_HOUND, 4)
ADD_CREATURE_TO_POOL(TENTACLE, 20)
ADD_CREATURE_TO_POOL(SORCEROR, 5)
ADD_CREATURE_TO_POOL(ORC, 4)
ADD_CREATURE_TO_POOL(BILE_DEMON, 2)
ADD_CREATURE_TO_POOL(DRAGON, 2)
ADD_CREATURE_TO_POOL(DARK_MISTRESS, 2)

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

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

MAGIC_AVAILABLE(ALL_PLAYERS, POWER_HAND, 1, 1)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_SLAP, 1, 1)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_POSSESS, 1, 1)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_IMP, 1, 1)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_SPEED, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_OBEY, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_CALL_TO_ARMS, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_CONCEAL, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_HEAL_CREATURE, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_LIGHTNING, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_PROTECT, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_CHICKEN, 1, 0)
MAGIC_AVAILABLE(ALL_PLAYERS, POWER_DESTROY_HERO_GATES, 1, 0)
TUTORIAL_FLASH_BUTTON(32, -1)
TRAP_AVAILABLE(ALL_PLAYERS, POISON_GAS, 1, 0)
TRAP_AVAILABLE(ALL_PLAYERS, LIGHTNING, 1, 0)
TRAP_AVAILABLE(ALL_PLAYERS, LAVA, 1, 0)

DOOR_AVAILABLE(ALL_PLAYERS, STEEL, 1, 0)
DOOR_AVAILABLE(ALL_PLAYERS, SECRET, 1, 0)
SET_DOOR_CONFIGURATION(SECRET, ManufactureLevel, 2)
SET_DOOR_CONFIGURATION(STEEL, ManufactureLevel, 0)
SET_TRAP_CONFIGURATION(LAVA, ManufactureLevel, 2)

REM Parties
CREATE_PARTY(PARTYKING)
ADD_TO_PARTY(PARTYKING, KNIGHT, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYKING, BARBARIAN, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYKING, WITCH, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYKING, SAMURAI, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYKING, WIZARD, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYKING, FAIRY, 10, 1000, ATTACK_DUNGEON_HEART, 0)
CREATE_PARTY(PARTYQUEEN)
ADD_TO_PARTY(PARTYQUEEN, FAIRY, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYQUEEN, WITCH, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYQUEEN, WITCH, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYQUEEN, WITCH, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYQUEEN, FAIRY, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYQUEEN, FAIRY, 10, 1000, ATTACK_DUNGEON_HEART, 0)
CREATE_PARTY(PARTYCRUSHER)
ADD_TO_PARTY(PARTYCRUSHER, SAMURAI, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYCRUSHER, SAMURAI, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYCRUSHER, SAMURAI, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYCRUSHER, GIANT, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYCRUSHER, GIANT, 10, 1000, ATTACK_DUNGEON_HEART, 0)
ADD_TO_PARTY(PARTYCRUSHER, GIANT, 10, 1000, ATTACK_DUNGEON_HEART, 0)

REVEAL_MAP_LOCATION(PLAYER0, PLAYER_GOOD, -1)
CONCEAL_MAP_RECT(PLAYER0,142, 286, 12, 5, 0)

SET_PLAYER_COLOR(PLAYER2, WHITE)
SET_PLAYER_COLOR(PLAYER3, WHITE)
SET_PLAYER_COLOR(PLAYER4, WHITE)
SET_PLAYER_COLOR(PLAYER6, WHITE)

IF(PLAYER0, FLAG2 == 0)
    NEXT_COMMAND_REUSABLE
    ZOOM_TO_LOCATION(PLAYER0, PLAYER0)
    SET_BOX_TOOLTIP(4, "Continue?")
    QUICK_INFORMATION(7, "Use the box to continue and start the level.", PLAYER0)
    QUICK_OBJECTIVE(5, "Hard times lie ahead, Keeper. The heroes of this realm have surrounded and besieged you, lurking around your domain. If we don't act soon, their reinforcements will arrive and slaughter us. On top of that, your Imps no longer obey you as they once did ,they demand more independence and won't even let you handle your own gold anymore. But all hope is not yet lost. If our mages can develop a spell to seal the heroes' gates and open the path to their heart, we may still claim victory. However, we will need a large number of mages to speed up the research. At least you won't have to worry about running out of Imps ,you'll never run short of them in this realm.", PLAYER0)
    IF(PLAYER0, BOX4_ACTIVATED == 1)
        SET_FLAG(PLAYER0, FLAG2, 1)
    ENDIF
ENDIF

IF(PLAYER0, FLAG2 == 1)
    IF(PLAYER0, FLAG1 == 0)
        REVEAL_MAP_LOCATION(PLAYER0, 23, -1)
        NEXT_COMMAND_REUSABLE
        ZOOM_TO_LOCATION(PLAYER0, 23)
        SET_BOX_TOOLTIP(3, "Continue?")
        QUICK_INFORMATION(3, "Scavenging in this realm carries the risk of luring in more than you'd like. The number of unusual eyes in the room gives a clue to how likely it is that a powerful enemy will be summoned with the next lure.", 23)
        IF(PLAYER0, BOX3_ACTIVATED == 1)
            ADD_CREATURE_TO_LEVEL(PLAYER_GOOD, AVATAR, 23, 1, 10, 0, JUMP)
            RUN_LUA_CODE("Scavenger_Mechanic_Instruction()")
            SET_TIMER(PLAYER0, TIMER3)
        ENDIF
    ENDIF
ENDIF
IF(PLAYER0, TIMER3 > 25)
    KILL_CREATURE(PLAYER_GOOD, AVATAR, ANYWHERE, 1)
    CHANGE_SLAB_TYPE(58, 94, HARD, FLOOR)
    SET_FLAG(PLAYER0, FLAG1, 1)
ENDIF

rem Difficulty choice
IF(PLAYER0, FLAG1 == 1)
    IF(PLAYER_GOOD, FLAG2 == 0)
        QUICK_INFORMATION(4, "Choose your preferred difficulty setting.", 22)
        REVEAL_MAP_LOCATION(PLAYER0, 22, -1)
        NEXT_COMMAND_REUSABLE
        ZOOM_TO_LOCATION(PLAYER0, 22)
    ENDIF
    SET_BOX_TOOLTIP(0, "Difficult Easy: more time, less and weaker enemys, mostly ignoring you")
    IF(PLAYER0, BOX0_ACTIVATED == 1)
        RUN_LUA_CODE("Easy()")
        SET_FLAG(PLAYER_GOOD, FLAG2, 1)
    ENDIF
    SET_BOX_TOOLTIP(1, "Difficult Medium: default settings")
    IF(PLAYER0, BOX1_ACTIVATED == 1)
        RUN_LUA_CODE("Medium()")
        SET_FLAG(PLAYER_GOOD, FLAG2, 2)
    ENDIF
    SET_BOX_TOOLTIP(2, "Difficult Hard (untested): less time, more and stronger enemys")
    IF(PLAYER0, BOX2_ACTIVATED == 1)
        RUN_LUA_CODE("Hard()")
        SET_FLAG(PLAYER_GOOD, FLAG2, 3)
    ENDIF

    IF(PLAYER_GOOD, FLAG2 > 0)
        CHANGE_SLAB_TYPE(43, 92, HARD, MATCH)
        CHANGE_SLAB_TYPE(43, 98, HARD, MATCH)
        CHANGE_SLAB_TYPE(51, 92, HARD, MATCH)
        CHANGE_SLAB_TYPE(51, 98, HARD, MATCH)
        CHANGE_SLAB_TYPE(47, 93, HARD, FLOOR)
        CHANGE_SLAB_TYPE(41, 44, PRETTY_PATH, NONE)
        CHANGE_SLAB_TYPE(45, 48, PRETTY_PATH, NONE)
        CHANGE_SLAB_TYPE(41, 52, PRETTY_PATH, NONE)
        CHANGE_SLAB_TYPE(37, 48, PRETTY_PATH, NONE)
        SET_TIMER(PLAYER_GOOD, TIMER0)
        ZOOM_TO_LOCATION(PLAYER0, PLAYER0)
    ENDIF
    rem easy
    IF(PLAYER_GOOD, FLAG2 == 1)
        DISPLAY_COUNTDOWN(PLAYER_GOOD, TIMER0, 144000, 1)
        IF(PLAYER_GOOD, TIMER0 > 144000)
            SET_FLAG(PLAYER_GOOD, FLAG1, 1)
        ENDIF
    ENDIF
    rem medium
    IF(PLAYER_GOOD, FLAG2 == 2)
        DISPLAY_COUNTDOWN(PLAYER_GOOD, TIMER0, 72000, 1)
        IF(PLAYER_GOOD, TIMER0 > 72000)
            SET_FLAG(PLAYER_GOOD, FLAG1, 1)
        ENDIF
    ENDIF
    rem hard
    IF(PLAYER_GOOD, FLAG2 == 3)
        DISPLAY_COUNTDOWN(PLAYER_GOOD, TIMER0, 48000, 1)
        IF(PLAYER_GOOD, TIMER0 > 60000)
            SET_FLAG(PLAYER_GOOD, FLAG1, 1)
        ENDIF
    ENDIF
ENDIF

REM LOOSE CONDITIONS
IF(PLAYER_GOOD, FLAG1 == 1)
    IF(PLAYER0, FLAG0 != 1)
        QUICK_OBJECTIVE(1, "It's over. We didn't manage to us the spell in time. The Heroes will crush us", PLAYER_GOOD)
        ADD_PARTY_TO_LEVEL(PLAYER_GOOD, PARTYKING, -1, 1)
        ADD_PARTY_TO_LEVEL(PLAYER_GOOD, PARTYQUEEN, -1, 3)
        ADD_PARTY_TO_LEVEL(PLAYER_GOOD, PARTYCRUSHER, -1, 3)
        ADD_PARTY_TO_LEVEL(PLAYER_GOOD, PARTYQUEEN, -2, 4)
        ADD_PARTY_TO_LEVEL(PLAYER_GOOD, PARTYCRUSHER, -2, 4)
        ADD_PARTY_TO_LEVEL(PLAYER_GOOD, PARTYQUEEN, -3, 4)
        ADD_PARTY_TO_LEVEL(PLAYER_GOOD, PARTYCRUSHER, -3, 4)
        CHANGE_SLAB_TYPE(45, 25, PATH)
        SET_DOOR(UNLOCKED, 45, 25)
        RUN_LUA_CODE("LooseGame()")
        SET_TIMER(PLAYER0, TIMER1)
        IF(PLAYER0, TIMER1 > 100)
            USE_POWER_ON_PLAYERS_CREATURES(PLAYER0, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 9, 1)
        ENDIF
        IF(PLAYER0, TIMER1 > 200)
            USE_POWER_ON_PLAYERS_CREATURES(PLAYER0, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 9, 1)
        ENDIF
        IF(PLAYER0, TIMER1 > 300)
            USE_POWER_ON_PLAYERS_CREATURES(PLAYER0, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 9, 1)
        ENDIF
    ENDIF
ENDIF

REM Win Conditions
rem custom power effects
IF(PLAYER0, FLAG0 == 1)
    QUICK_OBJECTIVE(6, "The spell turned out to be even more powerful than we had hoped. Now destroy their heart and reclaim this realm!", PLAYER_GOOD)
    SET_TIMER(PLAYER0, TIMER0)
    HIDE_TIMER
    DISPLAY_COUNTDOWN(PLAYER_GOOD, TIMER0, 1, 0)
    HIDE_HERO_GATE(1, 1)
    USE_POWER_AT_LOCATION(PLAYER0, -1, POWER_CAVE_IN, 9, 1)
    IF(PLAYER0, TIMER0 > 40)
        HIDE_HERO_GATE(2, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -2, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER2, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 5, 1)
    ENDIF
    IF(PLAYER0, TIMER0 > 80)
        HIDE_HERO_GATE(3, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -3, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER3, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 5, 1)
    ENDIF
    IF(PLAYER0, TIMER0 > 120)
        HIDE_HERO_GATE(4, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -4, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER4, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 5, 1)
    ENDIF
    IF(PLAYER0, TIMER0 > 160)
        HIDE_HERO_GATE(5, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -5, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER3, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 5, 1)
    ENDIF
    IF(PLAYER0, TIMER0 > 200)
        HIDE_HERO_GATE(6, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -6, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER4, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 5, 1)
    ENDIF
    IF(PLAYER0, TIMER0 > 240)
        HIDE_HERO_GATE(7, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -7, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER6, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 9, 1)
    ENDIF
    IF(PLAYER0, TIMER0 > 280)
        HIDE_HERO_GATE(8, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -8, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER_GOOD, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 9, 1)
    ENDIF
    IF(PLAYER0, TIMER0 > 320)
        HIDE_HERO_GATE(9, 1)
        USE_POWER_AT_LOCATION(PLAYER0, -9, POWER_CAVE_IN, 9, 1)
        USE_POWER_ON_PLAYERS_CREATURES(PLAYER2, ANY_CREATURE, PLAYER0, POWER_LIGHTNING, 5, 1)
    ENDIF
    USE_POWER_AT_POS(PLAYER0, 136, 76, POWER_DESTROY_WALLS, 7, 1)
    MAGIC_AVAILABLE(PLAYER0, POWER_DESTROY_HERO_GATES, 0, 0)
ENDIF

rem---
IF(PLAYER_GOOD, DUNGEON_DESTROYED == 1)
    WIN_GAME
ENDIF



REM custom rules
SET_HAND_RULE(PLAYER0, IMP, RULE0, DENY, ALWAYS)

IF(PLAYER0, VAMPIRE == 0)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(BodiesForVampire, 4)
ENDIF
IF(PLAYER0, VAMPIRE == 1)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(BodiesForVampire, 5)
ENDIF
IF(PLAYER0, VAMPIRE == 2)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(BodiesForVampire, 6)
ENDIF
IF(PLAYER0, VAMPIRE == 3)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(BodiesForVampire, 7)
ENDIF
IF(PLAYER0, VAMPIRE == 4)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(BodiesForVampire, 8)
ENDIF
IF(PLAYER0, VAMPIRE == 5)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(BodiesForVampire, 255)
ENDIF

IF(PLAYER0, GHOST > 4)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(GhostConvertChance, 0)
ENDIF
IF(PLAYER0, SKELETON > 4)
    NEXT_COMMAND_REUSABLE
    SET_GAME_RULE(PrisonSkeletonChance, 0)
ENDIF

REM Neutral Library
IF_SLAB_TYPE(71, 76, PRETTY_PATH)
    CHANGE_SLAB_OWNER(73, 76, PLAYER0)
    QUICK_INFORMATION(2, "We found another Library!", 9)
ENDIF


REM IMP Respanw
SET_TIMER(PLAYER0, TIMER2)
IF(PLAYER0, TIMER2 > 300)
    IF(PLAYER0, IMP < 5)
        NEXT_COMMAND_REUSABLE
        ADD_CREATURE_TO_LEVEL(PLAYER0, IMP, PLAYER0, 1, 1, 0, JUMP)
    ENDIF
    NEXT_COMMAND_REUSABLE
    SET_TIMER(PLAYER0, TIMER2)
ENDIF