|
@@ -1,307 +0,0 @@
|
|
|
-function buildMainRooms()
|
|
|
-{
|
|
|
- Struct.createSpecificRoom("aCEntrance").setName("start")
|
|
|
- .chain(Struct.createSpecificExit("decayingCells", "aCMidExit"))
|
|
|
- .chain(Struct.createSpecificExit("T_Roof", "aCEndExit").setName("mainExit"))
|
|
|
- .chain(Struct.createSpecificRoom("aCTeleportGate"))
|
|
|
- .chain(Struct.createSpecificExit("T_PrisonDepths", "aCEndRoom"));
|
|
|
-
|
|
|
- Struct.createShop(MerchantType.Weapons).branchBetween("start", "mainExit");
|
|
|
- Struct.createShop(MerchantType.Actives).setName("shop2").branchBetween("start", "mainExit");
|
|
|
- Struct.createRoomWithType("TeleportGate").addBefore("shop2");
|
|
|
-
|
|
|
- if(Random.isBelow(0.4)) {
|
|
|
- Struct.createRoomWithType("Treasure").branchBetween("start", "mainExit");
|
|
|
- }
|
|
|
- if(Random.isBelow(0.1)) {
|
|
|
- Struct.createShop(MerchantType.Weapons).branchBetween("start", "mainExit");
|
|
|
- }
|
|
|
- if(Random.isBelow(0.1)) {
|
|
|
- Struct.createShop(MerchantType.Heals).branchBetween("start", "mainExit");
|
|
|
- }
|
|
|
-
|
|
|
- //
|
|
|
-
|
|
|
- if(Random.isBelow(0.4)) {
|
|
|
- Struct.createSpecificRoom("aCMountainRight")
|
|
|
- .setName("cliffRight")
|
|
|
- .addBetween("start", "mainExit", 2);
|
|
|
- Struct.createSpecificRoom("aCMountainLeft")
|
|
|
- .setName("cliffMiddle")
|
|
|
- .addBefore("cliffRight");
|
|
|
- for(i in 0...2) {
|
|
|
- Struct.createRoomWithTypeFromGroup("Combat", "alaahCourtyardCommon")
|
|
|
- .addFlag(RoomFlag.Outside)
|
|
|
- .addBetween("cliffMiddle", "cliffRight");
|
|
|
- }
|
|
|
- Struct.createRoomWithTypeFromGroup("Teleport", "alaahCourtyardCommon")
|
|
|
- .addFlag(RoomFlag.Outside)
|
|
|
- .addBetween("cliffMiddle", "cliffRight");
|
|
|
- Struct.createSpecificRoom("aCMountainPrelude")
|
|
|
- .setName("cliffLeft")
|
|
|
- .addBefore("cliffMiddle");
|
|
|
- }
|
|
|
- else {
|
|
|
- Struct.createSpecificRoom("aCLadderGate")
|
|
|
- .setName("cliffRight")
|
|
|
- .addBetween("start", "mainExit", 2);
|
|
|
- Struct.createRoomWithTypeFromGroup("Trap_1", "alaahCourtyardCommon")
|
|
|
- .addFlag(RoomFlag.Outside)
|
|
|
- .setName("cliffLeft")
|
|
|
- .addBefore("cliffRight");
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // Struct.createExit("decayingCells")
|
|
|
- // .branchBetween("cliff", "mainExit")
|
|
|
- // .setName("decayingCells");
|
|
|
- // Struct.createRoomWithType("WallJumpGate")
|
|
|
- // .addBefore("decayingCells");
|
|
|
-
|
|
|
- Struct.createRoomWithTypeFromGroup("DualTreasure", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBetween("cliffRight", "mainExit");
|
|
|
- Struct.createRoomWithTypeFromGroup("HealPotion", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBetween("start", "cliffLeft");
|
|
|
- Struct.createRoomWithTypeFromGroup("CursedTreasure", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBetween("start", "cliffLeft");
|
|
|
-
|
|
|
- Struct.createSpecificRoom("aCEvilRoom")
|
|
|
- .addBetween("start", "cliffLeft", 1);
|
|
|
-
|
|
|
- for(i in 0...2) {
|
|
|
- if(Random.isBelow(0.8)) {
|
|
|
- Struct.createSpecificRoom("aCEvilRoomEvil")
|
|
|
- .addBetween("start", "cliffLeft", 1);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Struct.createSpecificRoom("aCMultiTreasure")
|
|
|
- .addBetween("start", "cliffLeft");
|
|
|
-
|
|
|
- var exit = Struct.getRoomByName("mainExit");
|
|
|
- var undergrounds = Struct.allRooms.filter(function(_room) return _room != exit && _room.isMainLevel() && !_room.isParentOf(exit) && !_room.isChildOf(exit));
|
|
|
- var mains = Struct.allRooms.filter(function(_room) return _room.parent != null && _room != exit && _room.isMainLevel() && _room.isParentOf(exit) && _room.childrenCount > 1);
|
|
|
-
|
|
|
- Struct.createRunicZDoor(Struct.createSpecificRoom("GenericZDoor_LR"), 1, undergrounds);
|
|
|
- Struct.createRunicZDoor(Struct.createRoomWithType("CellTreasure"), 2, undergrounds);
|
|
|
- Struct.createRunicZDoor(Struct.createRoomWithType("Treasure"), 3, undergrounds);
|
|
|
- Struct.createRunicZDoor(Struct.createRoomWithType("CursedTreasure"), 4, undergrounds);
|
|
|
- Struct.createRunicZDoor(Struct.createSpecificRoom("GenericZDoor_LR"), 4, undergrounds);
|
|
|
- Struct.createRunicZDoor(Struct.createSpecificRoom("GenericZDoor_LR"), 4, undergrounds);
|
|
|
-}
|
|
|
-
|
|
|
-function buildSecondaryRooms()
|
|
|
-{
|
|
|
- trace("buildSecondaryRooms");
|
|
|
- var exit = Struct.getRoomByName("mainExit");
|
|
|
- var mains = Struct.allRooms.filter(function(_room) return _room.parent != null && _room != exit && _room.isMainLevel() && _room.isParentOf(exit) && _room.childrenCount > 1);
|
|
|
- var mainsCopy = mains.copy();
|
|
|
- for(i in 0...4) {
|
|
|
- if(mainsCopy.length == 0) {
|
|
|
- mainsCopy = mains.copy();
|
|
|
- }
|
|
|
- Struct.createRoomWithTypeFromGroup("Combat", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore(Random.arraySplice(mainsCopy).getName());
|
|
|
- }
|
|
|
-
|
|
|
- Struct.createRoomWithTypeFromGroup("Combat", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore("mainExit");
|
|
|
-
|
|
|
- // Outside traps
|
|
|
- var rooms = Struct.allRooms.filter(function(_room) return _room.type == "Combat" && _room.hasFlag(RoomFlag.Outside));
|
|
|
- for(i in 0...Random.irange(2, 3)){
|
|
|
- Struct.createRoomWithTypeFromGroup("Trap_1", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore(Random.arraySplice(rooms).getName());
|
|
|
- }
|
|
|
-
|
|
|
- //Underground combat
|
|
|
- var branches = Struct.allRooms.filter(function(_room) return _room != exit && _room.isMainLevel() && !_room.isParentOf(exit) && !_room.isChildOf(exit));
|
|
|
- // for( i in 0...2){
|
|
|
- // Struct.createRoomWithType("Combat").addBefore(Random.arrayPick(branches).getName());
|
|
|
- // }
|
|
|
- // Struct.createRoomWithTypeFromGroup("Combat", "MinorSecret").addBefore(Random.arrayPick(branches).getName());
|
|
|
-
|
|
|
- //Underground traps
|
|
|
- for(i in 0...Random.irange(3, 5)) {
|
|
|
- Struct.createRoomWithTypeFromGroup("Trap_1", "CommonTraps").addBefore(Random.arrayPick(branches).getName());
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function addTeleports()
|
|
|
-{
|
|
|
- var exit = Struct.getRoomByName("mainExit");
|
|
|
- var rooms = Struct.allRooms.filter(function(_room) return _room.isMainLevel() );
|
|
|
-
|
|
|
- //Turn crosses into teleports
|
|
|
- for(room in rooms) {
|
|
|
- if( room.type == "Corridor" && room.isParentOf(exit) && room.childrenCount > 1 && room.calcTypeDistance("Teleport", true) > 1 ){
|
|
|
- room.setType("Teleport");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- var outRooms = Struct.allRooms.filter(function(_room) return _room.isMainLevel() && _room.parent != null && _room.isParentOf(exit) );
|
|
|
- Struct.createSpecificRoom("aCIsland")
|
|
|
- .addBefore(Random.arraySplice(outRooms).getName())
|
|
|
- .addZChild(Struct.createSpecificRoom("aCIslandInt"))
|
|
|
- .setName("desolate");
|
|
|
- Struct.createSpecificRoom("aCSecretStomp")
|
|
|
- .addBefore(Random.arraySplice(outRooms).getName());
|
|
|
- Struct.createSpecificRoom("aCSecretWallJump")
|
|
|
- .addBefore(Random.arraySplice(outRooms).getName());
|
|
|
- Struct.createSpecificRoom("aCSecretHouse")
|
|
|
- .addBefore(Random.arraySplice(outRooms).getName());
|
|
|
- Struct.createSpecificRoom("aCSecretFlower")
|
|
|
- .addBefore(Random.arraySplice(outRooms).getName());
|
|
|
-
|
|
|
- // Meta gates teleport
|
|
|
- for( room in rooms.filter(function(_room) return !_room.hasFlag(RoomFlag.Outside) && (_room.type == "WallJumpGate" || _room.type == "LadderGate" || _room.type == "TeleportGate" || _room.type == "BreakableGroundGate")) ){
|
|
|
- if( room.calcTypeDistance("Teleport", false) > 1 ){
|
|
|
- Struct.createTeleportBefore(room);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // more common teleports in the overworld
|
|
|
- for(room in rooms.filter(function(_room) return _room.hasFlag(RoomFlag.Outside) && _room.getName() != "cliffMiddle")) {
|
|
|
- if(room.calcTypeDistance("Teleport", true) > 3){
|
|
|
- Struct.createRoomWithType("Teleport").addFlag(RoomFlag.Outside).addBefore(room.getName());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Dead Ends
|
|
|
- var secondExit = Struct.getRoomByName("mainExit");
|
|
|
- for(room in rooms) {
|
|
|
- if(room.childrenCount == 0 && room != secondExit && room.calcTypeDistance("Teleport", true) > 1){
|
|
|
- Struct.createRoomWithType("Teleport").addBefore(room.getName());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // final tp
|
|
|
- if(exit.parent.type != "Teleport") {
|
|
|
- Struct.createRoomWithTypeFromGroup("Teleport", "Courtyard").addFlag(RoomFlag.Outside).addBefore(exit.getName());
|
|
|
- }
|
|
|
-
|
|
|
- if(Struct.getRoomByName("desolate").parent.type != "Teleport") {
|
|
|
- Struct.createRoomWithTypeFromGroup("Teleport", "Courtyard").addFlag(RoomFlag.Outside).addBefore("desolate");
|
|
|
- }
|
|
|
-
|
|
|
- var nodes = rooms.filter(function(_room) return _room.isMainLevel() && _room.hasFlag(RoomFlag.Outside));
|
|
|
- nodes.sort(function(a, b) return compare(a.spawnDistance, b.spawnDistance));
|
|
|
- for(n in nodes) {
|
|
|
- if(n.spawnDistance > 1 && n.prent != null && n.calcTypeDistance("Teleport", true) > 2 && n.getName() != "cliffMiddle") {
|
|
|
- if(n.hasFlag(RoomFlag.Outside)) {
|
|
|
- Struct.createRoomWithTypeFromGroup("Teleport", "Courtyard").addFlag(RoomFlag.Outside).addBefore(n.getName());
|
|
|
- }
|
|
|
- else {
|
|
|
- Struct.createRoomWithType("Teleport").addBefore(n.getName());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function buildTimedDoors()
|
|
|
-{
|
|
|
- var cliff = Struct.getRoomByName("cliffRight");
|
|
|
-
|
|
|
- // DecisionHelper doesn't appear in the docs
|
|
|
- // Refer to this:
|
|
|
- // https://github.com/deepnight/ld40-catsAreAssholes/blob/master/src/DecisionHelper.hx
|
|
|
- var dh = new DecisionHelper(Struct.allRooms);
|
|
|
-
|
|
|
- // Remove:
|
|
|
- // * not main level (zDoors)
|
|
|
- // although a zDoor timedoor would be cool
|
|
|
- // * not outside (underground)
|
|
|
- // * before the vine cliff
|
|
|
- dh.remove(function(_room) return !_room.isMainLevel() || !_room.hasFlag(RoomFlag.Outside) || _room.isParentOf(cliff));
|
|
|
-
|
|
|
- /// RoomNode::spawnDistance is nowhere to be found
|
|
|
- // So I have honestly no fucking idea what it does
|
|
|
- // But the previous line does the job well enough for the thing to work well
|
|
|
- dh.score(function(_room) return _room.spawnDistance <= 1 ? -4 : _room.spawnDistance >= 3 ? -10 : 0);
|
|
|
-
|
|
|
- // Randomly add +1 score to some rooms
|
|
|
- dh.score(function(_room) return Random.irange(0, 1));
|
|
|
-
|
|
|
- Struct.createTimedBranchBefore(dh.getBest());
|
|
|
-}
|
|
|
-
|
|
|
-function finalize()
|
|
|
-{
|
|
|
- var exit = Struct.getRoomByName("mainExit");
|
|
|
-
|
|
|
- for(room in Struct.allRooms){
|
|
|
- if((room.type == "Corridor" || room.type == "Teleport") && room.isParentOf(exit)){
|
|
|
- room.setGroup("alaahCourtyardCommon");
|
|
|
- room.addFlag(RoomFlag.Outside);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Add vertical elevator spacers
|
|
|
- for(room in Struct.allRooms.copy()){
|
|
|
- if(room != exit && room.isMainLevel() && ! room.isParentOf(exit) && room.parent != null && room.parent.isParentOf(exit)) {
|
|
|
- Struct.createRoomWithTypeFromGroup("Corridor", "CourtyardVerticalCorridor").addBefore(room.getName());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Switch useless corridors to Combat corridors
|
|
|
- for(room in Struct.allRooms){
|
|
|
- if( room.type == "Corridor" && room.hasFlag(RoomFlag.Outside) && room.childrenCount > 1 ){
|
|
|
- room.setType("Combat");
|
|
|
- room.setGroup("CourtyardCombatCorridor");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Except for one
|
|
|
- Struct.createRoomWithTypeFromGroup("Corridor", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore("mainExit");
|
|
|
-
|
|
|
- for(room in Struct.allRooms) {
|
|
|
- if(room.type == "TimedDoor" || room.type == "TimedTreasure"){
|
|
|
- room.setGroup("alaahCourtyardCommon");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Buyable cells
|
|
|
- if(Random.isBelow(0.25)){
|
|
|
- var branches = Struct.allRooms.filter(function(_room) return _room != exit && _room.isMainLevel() && !_room.isParentOf(exit) && !_room.isChildOf(exit) );
|
|
|
- if(branches.length > 0) {
|
|
|
- Struct.createRoomWithType("BuyableCells").addBefore(Random.arrayPick(branches).getName());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Horizontal overworld
|
|
|
- for(room in Struct.allRooms) {
|
|
|
- if(room.parent != null && room.hasFlag(RoomFlag.Outside)) {
|
|
|
- room.setConstraint(LinkConstraint.HorizontalSameDirOnly);
|
|
|
- room.setChildPriority(1);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-function buildMobRoster(_mobList)
|
|
|
-{
|
|
|
- addMobRosterFrom("PrisonCourtyard", _mobList);
|
|
|
-}
|
|
|
-
|
|
|
-function setLevelProps(_levelProps)
|
|
|
-{
|
|
|
- _levelProps.timedDoor = 4.5;
|
|
|
- _levelProps.timedGoldMul = 1.5;
|
|
|
- _levelProps.timedScrolls = 1;
|
|
|
- _levelProps.wind = -3.0;
|
|
|
- _levelProps.musicLoop = "music/Promenade.ogg";
|
|
|
-
|
|
|
- _levelProps.doorColor = 144411;
|
|
|
- _levelProps.zDoorColor = 144411;
|
|
|
- _levelProps.loadingColor = 1055263;
|
|
|
- _levelProps.loadingDescColor = 6652612;
|
|
|
-}
|
|
|
-
|
|
|
-function setLevelInfo(_levelInfo)
|
|
|
-{
|
|
|
- _levelInfo.baseLootLevel = 2;
|
|
|
- _levelInfo.baseMobTier = 2;
|
|
|
- _levelInfo.biome = "PrisonCourtyard2";
|
|
|
- _levelInfo.cellBonus = 0.0;
|
|
|
- _levelInfo.doubleUps = 0;
|
|
|
- _levelInfo.eliteRoomChance = 0.0;
|
|
|
- _levelInfo.eliteWanderChance = 1.0;
|
|
|
- _levelInfo.extraMobTier = 0;
|
|
|
- _levelInfo.flags = 13;
|
|
|
- _levelInfo.goldBonus = 0;
|
|
|
- _levelInfo.mobDensity = 3;
|
|
|
- _levelInfo.name = "Desolated Courtyard";
|
|
|
- _levelInfo.tripleUps = 2;
|
|
|
-}
|