main.hx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. function buildMainRooms()
  2. {
  3. Struct.createSpecificRoom("aCEntrance").setName("start")
  4. .chain(Struct.createSpecificExit("decayingCells", "aCMidExit"))
  5. .chain(Struct.createSpecificExit("T_Roof", "aCEndExit").setName("mainExit"))
  6. .chain(Struct.createSpecificRoom("aCTeleportGate"))
  7. .chain(Struct.createSpecificExit("T_PrisonDepths", "aCEndRoom"));
  8. Struct.createShop(MerchantType.Weapons).branchBetween("start", "mainExit");
  9. Struct.createShop(MerchantType.Actives).setName("shop2").branchBetween("start", "mainExit");
  10. Struct.createRoomWithType("TeleportGate").addBefore("shop2");
  11. if(Random.isBelow(0.4)) {
  12. Struct.createRoomWithType("Treasure").branchBetween("start", "mainExit");
  13. }
  14. if(Random.isBelow(0.1)) {
  15. Struct.createShop(MerchantType.Weapons).branchBetween("start", "mainExit");
  16. }
  17. if(Random.isBelow(0.1)) {
  18. Struct.createShop(MerchantType.Heals).branchBetween("start", "mainExit");
  19. }
  20. //
  21. if(Random.isBelow(0.4)) {
  22. Struct.createSpecificRoom("aCMountainRight")
  23. .setName("cliffRight")
  24. .addBetween("start", "mainExit", 2);
  25. Struct.createSpecificRoom("aCMountainLeft")
  26. .setName("cliffMiddle")
  27. .addBefore("cliffRight");
  28. for(i in 0...2) {
  29. Struct.createRoomWithTypeFromGroup("Combat", "alaahCourtyardCommon")
  30. .addFlag(RoomFlag.Outside)
  31. .addBetween("cliffMiddle", "cliffRight");
  32. }
  33. Struct.createRoomWithTypeFromGroup("Teleport", "alaahCourtyardCommon")
  34. .addFlag(RoomFlag.Outside)
  35. .addBetween("cliffMiddle", "cliffRight");
  36. Struct.createSpecificRoom("aCMountainPrelude")
  37. .setName("cliffLeft")
  38. .addBefore("cliffMiddle");
  39. }
  40. else {
  41. Struct.createSpecificRoom("aCLadderGate")
  42. .setName("cliffRight")
  43. .addBetween("start", "mainExit", 2);
  44. Struct.createRoomWithTypeFromGroup("Trap_1", "alaahCourtyardCommon")
  45. .addFlag(RoomFlag.Outside)
  46. .setName("cliffLeft")
  47. .addBefore("cliffRight");
  48. }
  49. // Struct.createExit("decayingCells")
  50. // .branchBetween("cliff", "mainExit")
  51. // .setName("decayingCells");
  52. // Struct.createRoomWithType("WallJumpGate")
  53. // .addBefore("decayingCells");
  54. Struct.createRoomWithTypeFromGroup("DualTreasure", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBetween("cliffRight", "mainExit");
  55. Struct.createRoomWithTypeFromGroup("HealPotion", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBetween("start", "cliffLeft");
  56. Struct.createRoomWithTypeFromGroup("CursedTreasure", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBetween("start", "cliffLeft");
  57. Struct.createSpecificRoom("aCEvilRoom")
  58. .addBetween("start", "cliffLeft", 1);
  59. for(i in 0...2) {
  60. if(Random.isBelow(0.8)) {
  61. Struct.createSpecificRoom("aCEvilRoomEvil")
  62. .addBetween("start", "cliffLeft", 1);
  63. }
  64. }
  65. Struct.createSpecificRoom("aCMultiTreasure")
  66. .addBetween("start", "cliffLeft");
  67. var exit = Struct.getRoomByName("mainExit");
  68. var undergrounds = Struct.allRooms.filter(function(_room) return _room != exit && _room.isMainLevel() && !_room.isParentOf(exit) && !_room.isChildOf(exit));
  69. var mains = Struct.allRooms.filter(function(_room) return _room.parent != null && _room != exit && _room.isMainLevel() && _room.isParentOf(exit) && _room.childrenCount > 1);
  70. Struct.createRunicZDoor(Struct.createSpecificRoom("GenericZDoor_LR"), 1, undergrounds);
  71. Struct.createRunicZDoor(Struct.createRoomWithType("CellTreasure"), 2, undergrounds);
  72. Struct.createRunicZDoor(Struct.createRoomWithType("Treasure"), 3, undergrounds);
  73. Struct.createRunicZDoor(Struct.createRoomWithType("CursedTreasure"), 4, undergrounds);
  74. Struct.createRunicZDoor(Struct.createSpecificRoom("GenericZDoor_LR"), 4, undergrounds);
  75. Struct.createRunicZDoor(Struct.createSpecificRoom("GenericZDoor_LR"), 4, undergrounds);
  76. }
  77. function buildSecondaryRooms()
  78. {
  79. trace("buildSecondaryRooms");
  80. var exit = Struct.getRoomByName("mainExit");
  81. var mains = Struct.allRooms.filter(function(_room) return _room.parent != null && _room != exit && _room.isMainLevel() && _room.isParentOf(exit) && _room.childrenCount > 1);
  82. var mainsCopy = mains.copy();
  83. for(i in 0...4) {
  84. if(mainsCopy.length == 0) {
  85. mainsCopy = mains.copy();
  86. }
  87. Struct.createRoomWithTypeFromGroup("Combat", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore(Random.arraySplice(mainsCopy).getName());
  88. }
  89. Struct.createRoomWithTypeFromGroup("Combat", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore("mainExit");
  90. // Outside traps
  91. var rooms = Struct.allRooms.filter(function(_room) return _room.type == "Combat" && _room.hasFlag(RoomFlag.Outside));
  92. for(i in 0...Random.irange(2, 3)){
  93. Struct.createRoomWithTypeFromGroup("Trap_1", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore(Random.arraySplice(rooms).getName());
  94. }
  95. //Underground combat
  96. var branches = Struct.allRooms.filter(function(_room) return _room != exit && _room.isMainLevel() && !_room.isParentOf(exit) && !_room.isChildOf(exit));
  97. // for( i in 0...2){
  98. // Struct.createRoomWithType("Combat").addBefore(Random.arrayPick(branches).getName());
  99. // }
  100. // Struct.createRoomWithTypeFromGroup("Combat", "MinorSecret").addBefore(Random.arrayPick(branches).getName());
  101. //Underground traps
  102. for(i in 0...Random.irange(3, 5)) {
  103. Struct.createRoomWithTypeFromGroup("Trap_1", "CommonTraps").addBefore(Random.arrayPick(branches).getName());
  104. }
  105. }
  106. function addTeleports()
  107. {
  108. var exit = Struct.getRoomByName("mainExit");
  109. var rooms = Struct.allRooms.filter(function(_room) return _room.isMainLevel() );
  110. //Turn crosses into teleports
  111. for(room in rooms) {
  112. if( room.type == "Corridor" && room.isParentOf(exit) && room.childrenCount > 1 && room.calcTypeDistance("Teleport", true) > 1 ){
  113. room.setType("Teleport");
  114. }
  115. }
  116. var outRooms = Struct.allRooms.filter(function(_room) return _room.isMainLevel() && _room.parent != null && _room.isParentOf(exit) );
  117. Struct.createSpecificRoom("aCIsland")
  118. .addBefore(Random.arraySplice(outRooms).getName())
  119. .addZChild(Struct.createSpecificRoom("aCIslandInt"))
  120. .setName("desolate");
  121. Struct.createSpecificRoom("aCSecretStomp")
  122. .addBefore(Random.arraySplice(outRooms).getName());
  123. Struct.createSpecificRoom("aCSecretWallJump")
  124. .addBefore(Random.arraySplice(outRooms).getName());
  125. Struct.createSpecificRoom("aCSecretHouse")
  126. .addBefore(Random.arraySplice(outRooms).getName());
  127. Struct.createSpecificRoom("aCSecretFlower")
  128. .addBefore(Random.arraySplice(outRooms).getName());
  129. // Meta gates teleport
  130. for( room in rooms.filter(function(_room) return !_room.hasFlag(RoomFlag.Outside) && (_room.type == "WallJumpGate" || _room.type == "LadderGate" || _room.type == "TeleportGate" || _room.type == "BreakableGroundGate")) ){
  131. if( room.calcTypeDistance("Teleport", false) > 1 ){
  132. Struct.createTeleportBefore(room);
  133. }
  134. }
  135. // more common teleports in the overworld
  136. for(room in rooms.filter(function(_room) return _room.hasFlag(RoomFlag.Outside) && _room.getName() != "cliffMiddle")) {
  137. if(room.calcTypeDistance("Teleport", true) > 3){
  138. Struct.createRoomWithType("Teleport").addFlag(RoomFlag.Outside).addBefore(room.getName());
  139. }
  140. }
  141. // Dead Ends
  142. var secondExit = Struct.getRoomByName("mainExit");
  143. for(room in rooms) {
  144. if(room.childrenCount == 0 && room != secondExit && room.calcTypeDistance("Teleport", true) > 1){
  145. Struct.createRoomWithType("Teleport").addBefore(room.getName());
  146. }
  147. }
  148. // final tp
  149. if(exit.parent.type != "Teleport") {
  150. Struct.createRoomWithTypeFromGroup("Teleport", "Courtyard").addFlag(RoomFlag.Outside).addBefore(exit.getName());
  151. }
  152. if(Struct.getRoomByName("desolate").parent.type != "Teleport") {
  153. Struct.createRoomWithTypeFromGroup("Teleport", "Courtyard").addFlag(RoomFlag.Outside).addBefore("desolate");
  154. }
  155. var nodes = rooms.filter(function(_room) return _room.isMainLevel() && _room.hasFlag(RoomFlag.Outside));
  156. nodes.sort(function(a, b) return compare(a.spawnDistance, b.spawnDistance));
  157. for(n in nodes) {
  158. if(n.spawnDistance > 1 && n.prent != null && n.calcTypeDistance("Teleport", true) > 2 && n.getName() != "cliffMiddle") {
  159. if(n.hasFlag(RoomFlag.Outside)) {
  160. Struct.createRoomWithTypeFromGroup("Teleport", "Courtyard").addFlag(RoomFlag.Outside).addBefore(n.getName());
  161. }
  162. else {
  163. Struct.createRoomWithType("Teleport").addBefore(n.getName());
  164. }
  165. }
  166. }
  167. }
  168. function buildTimedDoors()
  169. {
  170. var cliff = Struct.getRoomByName("cliffRight");
  171. // DecisionHelper doesn't appear in the docs
  172. // Refer to this:
  173. // https://github.com/deepnight/ld40-catsAreAssholes/blob/master/src/DecisionHelper.hx
  174. var dh = new DecisionHelper(Struct.allRooms);
  175. // Remove:
  176. // * not main level (zDoors)
  177. // although a zDoor timedoor would be cool
  178. // * not outside (underground)
  179. // * before the vine cliff
  180. dh.remove(function(_room) return !_room.isMainLevel() || !_room.hasFlag(RoomFlag.Outside) || _room.isParentOf(cliff));
  181. /// RoomNode::spawnDistance is nowhere to be found
  182. // So I have honestly no fucking idea what it does
  183. // But the previous line does the job well enough for the thing to work well
  184. dh.score(function(_room) return _room.spawnDistance <= 1 ? -4 : _room.spawnDistance >= 3 ? -10 : 0);
  185. // Randomly add +1 score to some rooms
  186. dh.score(function(_room) return Random.irange(0, 1));
  187. Struct.createTimedBranchBefore(dh.getBest());
  188. }
  189. function finalize()
  190. {
  191. var exit = Struct.getRoomByName("mainExit");
  192. for(room in Struct.allRooms){
  193. if((room.type == "Corridor" || room.type == "Teleport") && room.isParentOf(exit)){
  194. room.setGroup("alaahCourtyardCommon");
  195. room.addFlag(RoomFlag.Outside);
  196. }
  197. }
  198. // Add vertical elevator spacers
  199. for(room in Struct.allRooms.copy()){
  200. if(room != exit && room.isMainLevel() && ! room.isParentOf(exit) && room.parent != null && room.parent.isParentOf(exit)) {
  201. Struct.createRoomWithTypeFromGroup("Corridor", "CourtyardVerticalCorridor").addBefore(room.getName());
  202. }
  203. }
  204. // Switch useless corridors to Combat corridors
  205. for(room in Struct.allRooms){
  206. if( room.type == "Corridor" && room.hasFlag(RoomFlag.Outside) && room.childrenCount > 1 ){
  207. room.setType("Combat");
  208. room.setGroup("CourtyardCombatCorridor");
  209. }
  210. }
  211. // Except for one
  212. Struct.createRoomWithTypeFromGroup("Corridor", "alaahCourtyardCommon").addFlag(RoomFlag.Outside).addBefore("mainExit");
  213. for(room in Struct.allRooms) {
  214. if(room.type == "TimedDoor" || room.type == "TimedTreasure"){
  215. room.setGroup("alaahCourtyardCommon");
  216. }
  217. }
  218. // Buyable cells
  219. if(Random.isBelow(0.25)){
  220. var branches = Struct.allRooms.filter(function(_room) return _room != exit && _room.isMainLevel() && !_room.isParentOf(exit) && !_room.isChildOf(exit) );
  221. if(branches.length > 0) {
  222. Struct.createRoomWithType("BuyableCells").addBefore(Random.arrayPick(branches).getName());
  223. }
  224. }
  225. // Horizontal overworld
  226. for(room in Struct.allRooms) {
  227. if(room.parent != null && room.hasFlag(RoomFlag.Outside)) {
  228. room.setConstraint(LinkConstraint.HorizontalSameDirOnly);
  229. room.setChildPriority(1);
  230. }
  231. }
  232. }
  233. function buildMobRoster(_mobList)
  234. {
  235. addMobRosterFrom("PrisonCourtyard", _mobList);
  236. }
  237. function setLevelProps(_levelProps)
  238. {
  239. _levelProps.timedDoor = 4.5;
  240. _levelProps.timedGoldMul = 1.5;
  241. _levelProps.timedScrolls = 1;
  242. _levelProps.wind = -3.0;
  243. _levelProps.musicLoop = "music/Promenade.ogg";
  244. _levelProps.doorColor = 144411;
  245. _levelProps.zDoorColor = 144411;
  246. _levelProps.loadingColor = 1055263;
  247. _levelProps.loadingDescColor = 6652612;
  248. }
  249. function setLevelInfo(_levelInfo)
  250. {
  251. _levelInfo.baseLootLevel = 2;
  252. _levelInfo.baseMobTier = 2;
  253. _levelInfo.biome = "PrisonCourtyard2";
  254. _levelInfo.cellBonus = 0.0;
  255. _levelInfo.doubleUps = 0;
  256. _levelInfo.eliteRoomChance = 0.0;
  257. _levelInfo.eliteWanderChance = 1.0;
  258. _levelInfo.extraMobTier = 0;
  259. _levelInfo.flags = 13;
  260. _levelInfo.goldBonus = 0;
  261. _levelInfo.mobDensity = 3;
  262. _levelInfo.name = "Desolated Courtyard";
  263. _levelInfo.tripleUps = 2;
  264. }