Browse Source

v2.4 scripts

Allah 6 years ago
parent
commit
da794c1243
2 changed files with 424 additions and 0 deletions
  1. 117 0
      Scripts/Struct/decayingCells.hx
  2. 307 0
      Scripts/Struct/main.hx

+ 117 - 0
Scripts/Struct/decayingCells.hx

@@ -0,0 +1,117 @@
+function buildMainRooms()
+{
+    Struct.createSpecificRoom("PrisonFlaskRoom").setName("start")
+    .chain(Struct.createSpecificRoom("PerkShop").setName("perk"))
+    .chain(Struct.createSpecificRoom("PrisonMonsterDoor").setName("monster"))
+    .chain(Struct.createSpecificExit("T_PrisonDepths", "aPDangerousExit").setName("mainExit"));
+
+    Struct.createRoomWithType("BuyableTreasure")
+        .addBefore("mainExit");
+    Struct.createRoomWithType("WallJumpGate")
+        .addBefore("mainExit");
+    Struct.createSpecificRoom("ChristmasGift")
+        .addBefore("mainExit");
+    Struct.createSpecificRoom("Pokeball")
+        .addBefore("mainExit");
+    Struct.createSpecificRoom("aPMoreEasyGetItem")
+        .branchBetween("monster", "mainExit")
+        .setName("moreeasy");
+
+    Struct.createShop().branchBetween("monster", "mainExit");
+    Struct.createRoomWithType("Treasure").branchBetween("monster", "mainExit");
+    Struct.createRunicZDoor(Struct.createRoomWithType("Treasure"), 3, Struct.allRooms);
+    Struct.createRunicZDoor(Struct.createRoomWithType("Treasure"), 1, Struct.allRooms);
+}
+
+function buildSecondaryRooms()
+{
+    trace("buildSecondaryRooms");
+    var exit = Struct.getRoomByName("mainExit");
+    var mains = Struct.allRooms.filter(function(_room) return _room.parent != null &&
+    _room.parent != Struct.getRoomByName("start") &&
+    _room.parent != Struct.getRoomByName("perk") &&
+    _room.parent != Struct.getRoomByName("monster") &&
+    _room != exit && _room.isMainLevel() && _room.isParentOf(exit) && _room.childrenCount > 1);
+    var mainsCopy = mains.copy();
+    for(i in 0...Random.irange(1, 4)) {
+        if(mainsCopy.length == 0) {
+            mainsCopy = mains.copy();
+        }
+        Struct.createRoomWithTypeFromGroup("Combat", "Prison").addBefore(Random.arraySplice(mainsCopy).getName());
+    }
+    for(i in 0...2) {
+        Struct.createRoomWithTypeFromGroup("Combat", "Prison").addBefore("mainExit");
+    }
+}
+
+function addTeleports()
+{
+    var rooms = Struct.allRooms.filter(function(_room) return _room.isMainLevel() );
+    var exit = Struct.getRoomByName("mainExit");
+
+    for(room in rooms) {
+        if( room.type == "Corridor" && room.childrenCount > 1 && room.calcTypeDistance("Teleport", true) > 1 ){
+            room.setType("Teleport");
+        }
+    }
+    for(room in rooms) {
+        if(room.calcTypeDistance("Teleport", true) > 2){
+            Struct.createRoomWithType("Teleport").addBefore(room.getName());
+        }
+    }
+}
+
+function buildTimedDoors()
+{
+    var dh = new DecisionHelper(Struct.allRooms);
+    dh.score(function(_room) return _room.spawnDistance <= 5 ? -4 : _room.spawnDistance >= 8 ? -10 : 0);
+    dh.score(function(_room) return Random.irange(0, 1));
+
+    Struct.createTimedBranchBefore(dh.getBest());
+}
+
+function finalize()
+{
+    Struct.createRoomWithType("TeleportGate")
+        .addBefore("mainExit");
+
+    Struct.createSpecificRoom("aPRollZone")
+        .addBefore("moreeasy");
+}
+function buildMobRoster(_mobList)
+{
+    addMobRosterFrom("PrisonStart", _mobList);
+}
+
+function setLevelProps(_levelProps)
+{
+    setLevelPropsFrom("PrisonStart", _levelProps);
+    _levelProps.timedDoor = 8.0;
+    _levelProps.timedGoldMul = 2.0;
+    _levelProps.timedScrolls = 1;
+    _levelProps.wind = 0.0;
+    _levelProps.musicIntro = "music/prisonstart_loop.ogg";
+    _levelProps.musicLoop = "music/prisonstart_loop.ogg";
+
+    _levelProps.doorColor = 11278336;
+    _levelProps.zDoorColor = 11278336;
+    _levelProps.loadingColor = 2491170;
+    _levelProps.loadingDescColor = 6652612;
+}
+
+function setLevelInfo(_levelInfo){
+    setLevelInfoFrom("PrisonStart", _levelInfo);
+    _levelInfo.baseLootLevel = 3;
+    _levelInfo.baseMobTier = 5;
+    _levelInfo.biome = "PrisonStart";
+    _levelInfo.cellBonus = 0.0;
+    _levelInfo.doubleUps = 1;
+    _levelInfo.eliteRoomChance = 1.0;
+    _levelInfo.eliteWanderChance = 1.0;
+    _levelInfo.extraMobTier = 0;
+    _levelInfo.flags = 1;
+    _levelInfo.goldBonus = 0;
+    _levelInfo.mobDensity = 1.3;
+    _levelInfo.name = "Decaying Cells";
+    _levelInfo.tripleUps = 2;
+}

+ 307 - 0
Scripts/Struct/main.hx

@@ -0,0 +1,307 @@
+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;
+}