diff --git a/CHANGELOG.md b/CHANGELOG.md
index ce22544..f94bece 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,18 @@
-# What's New in Version 1.1.1
+# What's New in Version 1.2.0
+
+### Entrance Shuffle BETA
+Entrance tracking has been added. This is a BETA release of the feature. As such, not everything has been tested and your feedback is encouraged.
+
+When creating a new game you can select an option for Entrance Shuffle. You can find out more on the [FAQ page](https://github.com/thecodeflayer/alttp-tracker/blob/master/FAQ.md#entrance-shuffle-settings).
+
+### Enhancements and Bug Fixes
+
+- Game Edit settings UI has been updated.
+- "Back History" is now cleared periodically when navigating to the maps. This should reduce some issues that can appear when the "Back History" gets too large.
+
+---
+
+## What's New in Version 1.1.1
### Location Item Requirements Modal
Required items for locations can now be shown by "long pressing" on the location.
@@ -12,8 +26,6 @@ Required items for locations can now be shown by "long pressing" on the location
- Fixed issue with item counts in various item shuffle modes. Items should now add up correctly.
- Location list views now have a sleeker UI.
----
-
## What's New in Version 1.1.0
### Retro Game Mode
diff --git a/FAQ.md b/FAQ.md
index 3b68594..f231be2 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -5,6 +5,7 @@ A compendium of Frequently Asked Questions and documentation about the tracker.
### Contents
- [General Questions](#general-questions)
+ - [Why do keys decrement (count down) on the Dungeons Screen?](#why-do-keys-decrement-count-down-on-the-dungeons-screen)
- [I clicked on items, but the item count doesn't increase. Why?](#i-clicked-on-items-but-the-item-count-doesnt-increase-why)
- [Can I quickly navigate between the light world and dark world maps?](#can-i-quickly-navigate-between-the-light-world-and-dark-world-maps)
- [How do I see what items are required for a location or dungeon access?](#how-do-i-see-what-items-are-required-for-a-location-or-dungeon-access)
@@ -14,6 +15,7 @@ A compendium of Frequently Asked Questions and documentation about the tracker.
- [New Game Settings](#new-game-settings)
- [Game Mode Settings](#game-mode-settings)
- [Item Shuffle Settings](#item-shuffle-settings)
+ - [Entrance Shuffle Settings](#entrance-shuffle-settings)
- [Goal Settings](#goal-settings)
- [Crystals for Ganon and Ganon's Tower](#crystals-for-ganon-and-ganons-tower)
- [Troubleshooting](#troubleshooting)
@@ -21,6 +23,15 @@ A compendium of Frequently Asked Questions and documentation about the tracker.
## General Questions
+#### Why do keys decrement (count down) on the Dungeons Screen?
+
+In standard item shuffle mode, the default setting, key counts start with the maximum number of keys found in that dungeon and clicking decrements the count.
+This is to help new randomizer players by making it obvious how many keys are available in each dungeon.
+
+In other item shuffle modes, Keysanity for example, the key counter starts at zero and increments from there. You can set the item shuffle settings when creating a new game.
+
+More information on item shuffle setting can be found [here](#item-shuffle-settings).
+
#### I clicked on items, but the item count doesn't increase. Why?
There are several items that contribute to the count that are not present on the items screen (rupees, hearts, arrows etc.).
@@ -37,7 +48,7 @@ Yes! You can double-tap the map to toggle between worlds at the same position an
#### A location should/should not be accessible with the items I have! What gives?
If you've found an issue with location logic please please submit an [issue](https://github.com/thecodeflayer/alttp-tracker/issues)!
-In coding location logic I attempted to follow the randomizer logic as closely as possible. I have even done several runs to manuall test
+In coding location logic I attempted to follow the randomizer logic as closely as possible. I have even done several runs to manually test
the logic and have implemented unit tests using the tests from the randomizer as a guide.
That said, there still may be placed that have been missed and I welcome your feedback.
@@ -54,7 +65,7 @@ If you feel there is an error in item counts, please file an [issue](https://git
#### Why are you not on the Play Store?
The short version is "I'm trying."
-The Play Store has very strict policies regarding popular IPs. Navigating this has proven to be a challenge. I will continue to pursue publication on the play store. Meanwhile, I'm hosting here for immidiate access. I'll continue distributing from Github as the update process for the Play Store is also slow and will always be behind what I can distribute here.
+The Play Store has very strict policies regarding popular IPs. Navigating this has proven to be a challenge. I will continue to pursue publication on the play store. Meanwhile, I'm hosting here for immediate access. I'll continue distributing from Github as the update process for the Play Store is also slow and will always be behind what I can distribute here.
## New Game Settings
@@ -84,7 +95,7 @@ The primary effect this has on the tracker is the number of available chests and
Additionally, the total number of items on the Items screen will change depending on the Item Shuffle option chosen.
**NOTE**
-Location logic in the app assumes that you have the required big and small keys to access an area. There is an open question [here](https://github.com/thecodeflayer/alttp-tracker/issues/39) about whether to add big keys to the location logic. Feel free to add your opinion on the matter there.
+Location logic in the app assumes that you have the required big and small keys to access an area. There is an open question [here](https://github.com/thecodeflayer/alttp-tracker/issues/39) about whether to add big keys to the location logic. Feel free to add your opinion on the matter.
To learn more about the randomizer options for item shuffle please read Item Settings > Dungeon Item Shuffle section of
[alttpr.com/en/options](https://alttpr.com/en/options).
@@ -124,6 +135,52 @@ In this mode small keys will increment from zero. Note that, like the Maps, Comp
The small key counter reflects all the small keys in the dungeon whether they are in a chest, a drop or from pots.
To increment item count when you find a small key in a chest you should click the chest icon to decrement the chest count.
+### Entrance Shuffle Settings
+
+Entrance shuffle adds the option of tracking how overworld entrances (and their underworld/interior counterparts) are linked.
+You can link entrances a variety of ways and you have the option to quickly mark entrances as junk, dark caves or even add "pins" to the location
+to help you remember to revisit the location later.
+
+Learn about the randomizer's entrance shuffle options under the Entrance Shuffle section of [alttpr.com/en/options](https://alttpr.com/en/options)
+
+_NOTE:_ This is a BETA feature and additional enhancements will be added in the future.
+
+**None**
+
+Entrances are not shuffled and have no effect on tracker functionality. Entrance tracking is disabled.
+
+**Simple, Restricted, Full, Crossed**
+
+Entrances are shuffled and the option to track entrances is enabled on the Light World and Dark World maps.
+Tap the Map icon to toggle to tracking entrances, a Door icon will appear.
+Tapping an entrance will open that entrance's links. Tap on the appropriate link text, then select the link you would like to create.
+
+Example: You enter Blind's Hideout and discover it links to Eastern Palace. You can then follow these steps to track the link:
+
+- Tap Blind's Hideout from the map
+- Tap "Entering Blind's Hideout overworld door leads to ???"
+- Tap Light World > Dungeons > Eastern Palace
+- The link is now created. Additionally the corresponding links will also be created on the linked location.
+
+Once links are created you can quickly navigate from the Entrance Links screen using the arrow icons.
+
+Entrance options are dictated based on the entrance shuffle option selected and align with the available options for that mode.
+
+For example, Simple mode will limit options based on several criteria, giving you limited options for each entrance type while Full will have quite a few more entrance options but require extra navigation steps to limit the selection.
+
+There is also some automatic handling of entrance linking depending on the mode. For example, linking a hole entrance will automatically link the hole exit as well in all modes but Insanity.
+
+**Insanity**
+
+This mode functions the same way as the previous modes with the difference of how exit links are handled.
+Since Insanity mode in the randomizer allows for exiting a location to take you to a different location than from where you entered, exit links are not automatically created.
+The exception to this is single entrance caves, they will be linked back to the overworld entrance location since this is what the randomizer supports.
+
+**Location Validation and Entrance Shuffle**
+
+Location validation logic is currently disabled if Entrance Shuffle is set to any option other than None. All locations will appear as available.
+In the future I may update the validation logic to support Entrance Shuffle but this will take some time.
+
### Goal Settings
Learn about the randomizer's game goals under the Goal section of [alttpr.com/en/options](https://alttpr.com/en/options)
@@ -152,7 +209,7 @@ Triforce count is displayed and can be incremented on the Items screen.
### Crystals for Ganon and Ganon's Tower
-Sliders to set the Crystal requirement for Ganon's Tower and to access Ganon. The counts are displayed, and also editable on the Items screen.
+Sliders to set the Crystal requirement for Ganon's Tower and to access Ganon. The counts are displayed and editable from the Items screen.
## Troubleshooting
Sometimes you run into problems. If the solution isn't here or doesn't work please file an [issue](https://github.com/thecodeflayer/alttp-tracker/issues).
diff --git a/README.md b/README.md
index 4d33430..fb288d8 100644
--- a/README.md
+++ b/README.md
@@ -3,8 +3,10 @@
# alttp-tracker
A mobile app for tracking ALTTP randomizer runs. You can track items collected, dungeon items and bosses and view available locations on the Light World and Dark World maps.
-The tracker currently supports Standard, Inverted and Retro modes and is geared towards new players who are learning.
-A number of game goals are also supported such as Defeat Ganon, Triforce Hunt and Pedestal Goal to name a few.
+The tracker currently supports [Standard, Inverted and Retro](https://github.com/thecodeflayer/alttp-tracker/blob/master/FAQ.md#game-mode-settings) modes and is geared towards new players who are learning.
+[Game Goals](https://github.com/thecodeflayer/alttp-tracker/blob/master/FAQ.md#goal-settings) are also supported such as Defeat Ganon, Triforce Hunt and Pedestal Goal to name a few.
+
+[Entrance Shuffle BETA](https://github.com/thecodeflayer/alttp-tracker/blob/master/FAQ.md#entrance-shuffle-settings) support has recently been added!
## Supported Platforms
Currently, I'm only building APKs for Android. I still need to figure out how to build for iOS.
diff --git a/app/_global_vars.scss b/app/_global_vars.scss
index 0fd005a..cd7e5b3 100644
--- a/app/_global_vars.scss
+++ b/app/_global_vars.scss
@@ -10,10 +10,14 @@ $empty-bg: #868585;
$empty-border: #616161;
$empty-btn-border: #4c4c4c;
-$highlight-bg:forestgreen;
+$highlight-bg: #228b22;
$highlight-border: #175c17;
$highlight-btn-border: #124912;
+$ugly-bg: #b18400;
+$ugly-border: #745700;
+$ugly-btn-border: #5e3800;
+
$standard-font-color:#ffffff;
$clicked-font-color: #e3e3e3;
diff --git a/app/app.scss b/app/app.scss
index f00333a..f3a4fd1 100644
--- a/app/app.scss
+++ b/app/app.scss
@@ -39,6 +39,11 @@ Button:active{
border-color: $highlight-btn-border;
color: $standard-font-color;
}
+ &.ugly {
+ background-color: $ugly-border;
+ border-color: $ugly-btn-border;
+ color: $standard-font-color;
+ }
&.padded {
width:90%;
magin-top:5;
@@ -109,6 +114,16 @@ Button:active{
border-color: black;
background-color: red;
}
+.locale-junk {
+ border-width: 3;
+ border-color:black;
+ background-color: #dede01;
+}
+.locale-dark {
+ border-width: 3;
+ border-color: black;
+ background-color: #929292;
+}
.center-key {
border-width: 3;
border-color: black;
diff --git a/app/components/entrance/EntranceEditor.vue b/app/components/entrance/EntranceEditor.vue
new file mode 100644
index 0000000..aecd65e
--- /dev/null
+++ b/app/components/entrance/EntranceEditor.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/entrance/EntranceLanding.vue b/app/components/entrance/EntranceLanding.vue
new file mode 100644
index 0000000..cce69f5
--- /dev/null
+++ b/app/components/entrance/EntranceLanding.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/game/GameEditEmpty.vue b/app/components/game/GameEditEmpty.vue
index 3504422..a53ca24 100644
--- a/app/components/game/GameEditEmpty.vue
+++ b/app/components/game/GameEditEmpty.vue
@@ -6,21 +6,51 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -75,12 +105,21 @@
itemShuffleOptions = GameSaveHelper.itemShuffleOptions;
itemShuffleKeys = Object.keys(GameSaveHelper.itemShuffleOptions);
+ entranceShuffleOptions = GameSaveHelper.entranceShuffleOptions;
+ entranceShuffleKeys = Object.keys(GameSaveHelper.entranceShuffleOptions);
goalOptions = GameSaveHelper.goalOptions;
goalKeys = Object.keys(GameSaveHelper.goalOptions);
game = this.$modelManager.editGame;
gameModes = Object.keys(GameSaveHelper.labels);
gameModeLabels = GameSaveHelper.labels;
+ accordion = {
+ gameMode:false,
+ itemShuffle:false,
+ entranceShuffle:false,
+ goal:false
+ }
+
created() {
this.checkEmptyGameState();
}
@@ -89,19 +128,23 @@
if (!this.game.itemShuffle || !this.game.gameMode || !this.game.goal) {
return;
}
- this.$modelManager.createGame(this.game.id, this.game.itemShuffle, this.game.gameMode, this.game.goal, this.game.triforceGoal, this.game.openGT, this.game.openGanon);
+ this.$modelManager.createGame(this.game.id, this.game.itemShuffle, this.game.gameMode, this.game.goal, this.game.triforceGoal, this.game.openGT, this.game.openGanon, this.game.entranceShuffle);
this.game = this.$modelManager.editGame;
- this.$navigateTo(GameEditValid);
+ this.$navigateTo(GameEditValid, {clearHistory:true});
}
cancel() {
- this.$navigateTo(SaveList);
+ this.$navigateTo(SaveList, {clearHistory:true});
}
clickItemShuffle(id) {
this.game.itemShuffle = id;
}
+ clickEntranceShuffle(id) {
+ this.game.entranceShuffle = id;
+ }
+
clickGameMode(id) {
this.game.gameMode = id;
}
@@ -122,6 +165,10 @@
return this.game.itemShuffle === key ? '~/img/checked.png' : '~/img/unchecked.png';
}
+ getEntranceShuffleCheckImage(key) {
+ return this.game.entranceShuffle === key ? '~/img/checked.png' : '~/img/unchecked.png';
+ }
+
getGameModeCheckImage(key) {
return this.game.gameMode === key ? '~/img/checked.png' : '~/img/unchecked.png';
}
@@ -137,9 +184,14 @@
sliderChangeGanon(val) {
this.game.openGanon = val.value;
}
+ toggleAcc(key){
+ this.accordion[key] = !this.accordion[key];
+ }
}
diff --git a/app/components/game/GameEditInvalid.vue b/app/components/game/GameEditInvalid.vue
index d94736b..858eaa5 100644
--- a/app/components/game/GameEditInvalid.vue
+++ b/app/components/game/GameEditInvalid.vue
@@ -6,6 +6,7 @@
+
Delete
diff --git a/app/components/game/GameEditLoaded.vue b/app/components/game/GameEditLoaded.vue
index b41fd19..f9cb43a 100644
--- a/app/components/game/GameEditLoaded.vue
+++ b/app/components/game/GameEditLoaded.vue
@@ -6,11 +6,14 @@
+
Reset Items
Reset Dungeons
Reset Map
+ Reset Entrances
Back
diff --git a/app/components/game/GameEditModal.vue b/app/components/game/GameEditModal.vue
index 4d42c79..7281179 100644
--- a/app/components/game/GameEditModal.vue
+++ b/app/components/game/GameEditModal.vue
@@ -13,6 +13,9 @@
+
OK
@@ -45,6 +48,8 @@
this.resetDungeons();
} else if (this.modalAction === 'resetMap') {
this.resetMap();
+ } else if(this.modalAction === 'resetEntrances') {
+ this.resetEntrances();
}
}
this['$modal'].close(doAction ? this.modalAction : 'cancel');
@@ -66,6 +71,10 @@
resetMap() {
this.$modelManager.resetMap();
}
+
+ resetEntrances() {
+ this.$modelManager.resetEntrances();
+ }
}
diff --git a/app/components/game/GameEditValid.vue b/app/components/game/GameEditValid.vue
index 879bfb1..ea4d25d 100644
--- a/app/components/game/GameEditValid.vue
+++ b/app/components/game/GameEditValid.vue
@@ -6,6 +6,7 @@
+
Load Game
@@ -24,6 +25,7 @@
import SaveList from '@/components/game/SaveList.vue';
import GameEditModal from '@/components/game/GameEditModal.vue';
import {GameSaveHelper} from '@/utils/GameSaveHelper';
+ import DarkMap from '@/components/map/DarkMap.vue';
@Component
export default class GameEditValid extends Vue {
@@ -31,22 +33,23 @@
allowDelete = this.$modelManager.allowGameDelete();
game = this.$modelManager.editGame;
itemShuffleOptions = GameSaveHelper.itemShuffleOptions;
+ entranceShuffleOptions = GameSaveHelper.entranceShuffleOptions;
goalOptions = GameSaveHelper.goalOptions;
async openModal() {
const retval = await this.$showModal(GameEditModal, {props:{modalAction:'deleteGame'}});
if(retval !== 'cancel') {
- this.$navigateTo(SaveList);
+ this.$navigateTo(SaveList, {clearHistory:true});
}
}
loadGame() {
this.$modelManager.loadGame(this.game.id);
- this.$navigateTo(SaveList);
+ this.$navigateTo(SaveList, {clearHistory:true});
}
cancel() {
- this.$navigateTo(SaveList);
+ this.$navigateTo(SaveList, {clearHistory:true});
}
}
diff --git a/app/components/game/SaveList.vue b/app/components/game/SaveList.vue
index 2f9a36e..4ecc978 100644
--- a/app/components/game/SaveList.vue
+++ b/app/components/game/SaveList.vue
@@ -17,6 +17,7 @@
+
@@ -40,6 +41,7 @@
export default class SaveList extends Vue {
gameSaves = GameSaveHelper.parseGameSaves(this.$modelManager);
itemShuffleOptions = GameSaveHelper.itemShuffleOptions;
+ entranceShuffleOptions = GameSaveHelper.entranceShuffleOptions;
goalOptions = GameSaveHelper.goalOptions;
mounted() {
diff --git a/app/components/map/DarkMap.vue b/app/components/map/DarkMap.vue
index fd9f2fc..9ab7b98 100644
--- a/app/components/map/DarkMap.vue
+++ b/app/components/map/DarkMap.vue
@@ -4,14 +4,16 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
@@ -67,15 +120,20 @@
diff --git a/app/components/map/LightMap.vue b/app/components/map/LightMap.vue
index 565ebdd..8fbfe01 100644
--- a/app/components/map/LightMap.vue
+++ b/app/components/map/LightMap.vue
@@ -4,14 +4,16 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
@@ -67,15 +120,20 @@
diff --git a/app/components/map/ShowModeToggle.vue b/app/components/map/ShowModeToggle.vue
new file mode 100644
index 0000000..e89e6c4
--- /dev/null
+++ b/app/components/map/ShowModeToggle.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/default-objects/DefaultEntrances.ts b/app/default-objects/DefaultEntrances.ts
new file mode 100644
index 0000000..d19c2f8
--- /dev/null
+++ b/app/default-objects/DefaultEntrances.ts
@@ -0,0 +1,70 @@
+import {StaticEntrancesLW} from '@/entrance/StaticEntrancesLW';
+import {StaticEntrancesDW} from '@/entrance/StaticEntrancesDW';
+
+export class DefaultEntrances {
+ version = '0.0.1';
+ data: DefaultEntranceData;
+ toJSONString():string {
+ return JSON.stringify(this);
+ }
+ static fromJSON(str: string):DefaultEntrances{
+ const obj = JSON.parse(str);
+ const retval = new DefaultEntrances();
+ retval.version = obj.version;
+ retval.data = DefaultEntranceData.fromObject(obj.data);
+ return retval;
+ }
+}
+export class DefaultEntranceData {
+ constructor() {
+ const slw = new StaticEntrancesLW();
+ const sdw = new StaticEntrancesDW();
+ let keys = Object.keys(slw);
+ for(const key of keys){
+ this[key] = new EntranceObj(key, slw[key].isHole);
+ }
+ keys = Object.keys(sdw);
+ for(const key of keys){
+ this[key] = new EntranceObj(key, sdw[key].isHole);
+ }
+ }
+ getCopy(): DefaultEntranceData {
+ return JSON.parse(JSON.stringify(this));
+ }
+ static fromObject(obj:any) :DefaultEntranceData {
+ const data = new DefaultEntranceData();
+ const keys = Object.keys(data);
+ for(const key of keys){
+ if(obj[key]!==undefined) {
+ data[key].setFromObject(obj[key]);
+ }
+ }
+ return data;
+ }
+}
+export class EntranceObj {
+ id:string;
+ enterLink: string;
+ exitLink: string;
+ enterLinkedTo: string;
+ exitLinkedTo: string;
+ isHoleFM: boolean;
+ pin:string;
+ constructor(id: string, isHoleFM: boolean) {
+ this.id = id;
+ this.isHoleFM = isHoleFM;
+ this.enterLink = undefined;
+ this.exitLink = undefined;
+ this.enterLinkedTo = undefined;
+ this.exitLinkedTo = undefined;
+ this.pin = undefined;
+ }
+ setFromObject(obj: any): void {
+ const keys = Object.keys(this);
+ for(const key of keys){
+ if(obj[key]!==undefined) {
+ this[key] = obj[key];
+ }
+ }
+ }
+}
diff --git a/app/default-objects/DefaultGameSaves.ts b/app/default-objects/DefaultGameSaves.ts
index bbee947..1b3358d 100644
--- a/app/default-objects/DefaultGameSaves.ts
+++ b/app/default-objects/DefaultGameSaves.ts
@@ -4,6 +4,8 @@ import {IDefaultMapData} from '@/default-objects/DefaultMap';
import {DefaultSettings, DefaultSettingsData} from '@/default-objects/DefaultSettings';
import {InvertedMapData} from '@/default-objects/InvertedDefaultMap';
import {StandardDefaultMap, StandardMapData} from '@/default-objects/StandardDefaultMap';
+import {DefaultEntranceData, DefaultEntrances} from '@/default-objects/DefaultEntrances';
+import {GameSaveHelper} from '@/utils/GameSaveHelper';
export class DefaultGameSaves {
version = '0.0.1';
@@ -50,6 +52,7 @@ export class Game {
settings:DefaultSettingsData;
timestamp = undefined;
versions: GameVersions;
+ entrances: DefaultEntranceData;
static fromObject(obj:any):Game{
const game = new Game();
if(obj.timestamp){
@@ -59,11 +62,13 @@ export class Game {
game.dungeons = obj.dungeons ? DefaultDungeonsData.fromObject(obj.dungeons) : new DefaultDungeonsData();
game.map = obj.map ? (game.settings.gameMode === 'inverted' ? InvertedMapData.fromObject(obj.map) : StandardMapData.fromObject(obj.map) )
: (game.settings.gameMode === 'inverted' ? new InvertedMapData() : new StandardMapData());
+ game.entrances = game.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id ? undefined : DefaultEntranceData.fromObject(obj.entrances);
game.versions = new GameVersions(
(obj.versions && obj.versions.items) ? obj.versions.items : new DefaultItems().version,
(obj.versions && obj.versions.dungeons) ? obj.versions.dungeons : new DefaultDungeons().version,
(obj.versions && obj.versions.map) ? obj.versions.map : new StandardDefaultMap().version,
- (obj.versions && obj.versions.settings) ? obj.versions.items : new DefaultSettings().version,
+ (obj.versions && obj.versions.settings) ? obj.versions.settings : new DefaultSettings().version,
+ (obj.versions && obj.versions.entrances) ? obj.versions.entrances : new DefaultEntrances().version
);
}
return game;
@@ -75,10 +80,12 @@ export class GameVersions {
dungeons: string;
map: string;
settings: string;
- constructor(items: string, dungeons: string, map: string, settings: string) {
+ entrances: string;
+ constructor(items: string, dungeons: string, map: string, settings: string, entrances: string) {
this.items = items;
this.dungeons = dungeons;
this.map = map;
this.settings = settings;
+ this.entrances = entrances;
}
}
diff --git a/app/default-objects/DefaultMap.ts b/app/default-objects/DefaultMap.ts
index 2f1dfd6..85169f6 100644
--- a/app/default-objects/DefaultMap.ts
+++ b/app/default-objects/DefaultMap.ts
@@ -36,6 +36,7 @@ export class MapWorld {
y = 0;
centerKey = undefined;
centerShopKey = undefined;
+ centerEntranceKey = undefined;
scrollY = 0;
filterList = 0;
locations = {};
diff --git a/app/default-objects/DefaultSettings.ts b/app/default-objects/DefaultSettings.ts
index 5a05513..03a03bf 100644
--- a/app/default-objects/DefaultSettings.ts
+++ b/app/default-objects/DefaultSettings.ts
@@ -23,6 +23,7 @@ export class DefaultSettingsData {
openGanon = 7;
triforceGoal = 20;
triforceCount = 0;
+ entranceShuffle = 'none';
static fromObject(obj:any):DefaultSettingsData {
const data = new DefaultSettingsData();
diff --git a/app/entrance/StaticEntrancesDW.ts b/app/entrance/StaticEntrancesDW.ts
new file mode 100644
index 0000000..a6666a9
--- /dev/null
+++ b/app/entrance/StaticEntrancesDW.ts
@@ -0,0 +1,460 @@
+export class StaticEntrancesDW {
+ /** DUNGEONS **/
+ skullWoodsFinalSection = { //skullWoodsFinalSectionExit
+ x: 58, y: 77,
+ isSingleEntranceDungeon: true,
+ name: 'Skull Woods Final Section',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsFinalSection.png',
+ intImg: '~/img/interior/skullWoodsFinalSection.png',
+ };
+ thievesTown = { //thievesTownExit
+ x: 187, y: 730,
+ isSingleEntranceDungeon: true,
+ name: 'Thieves Town',
+ region: 'dungeon',
+ extImg: '~/img/entrance/thievesTown.png',
+ intImg: '~/img/interior/thievesTown.png',
+ };
+ miseryMire = { //miseryMireExit
+ x: 111, y: 1209,
+ isSingleEntranceDungeon: true,
+ name: 'Misery Mire',
+ region: 'dungeon',
+ extImg: '~/img/entrance/miseryMire.png',
+ intImg: '~/img/interior/miseryMire.png',
+ };
+ swampPalace = { //swampPalaceExit
+ x: 703, y: 1406,
+ isSingleEntranceDungeon: true,
+ name: 'Swamp Palace',
+ region: 'dungeon',
+ extImg: '~/img/entrance/swampPalace.png',
+ intImg: '~/img/interior/swampPalace.png',
+ };
+ icePalace = { //icePalaceExit
+ x: 1195, y: 1294,
+ isSingleEntranceDungeon: true,
+ name: 'Ice Palace',
+ region: 'dungeon',
+ extImg: '~/img/entrance/icePalace.png',
+ intImg: '~/img/interior/icePalace.png',
+ };
+ turtleRock = { //turtleRockExitFront
+ x: 1412, y: 124,
+ isMultiEntranceDungeon: true,
+ multiDir:'south',
+ multiLinks:{west:'darkDeathMtnLedgeWest', north:'darkDeathMtnLedgeEast', east:'turtleRockIsolatedLedgeEntrance'},
+ name: 'Turtle Rock',
+ region: 'dungeon',
+ extImg: '~/img/entrance/turtleRock.png',
+ intImg: '~/img/interior/turtleRock.png',
+ };
+ darkDeathMtnLedgeWest = { //turtleRockExitWest
+ x: 1195, y: 140,
+ isMultiEntranceDungeon: true,
+ multiDir:'west',
+ multiLinks:{south:'turtleRock', north:'darkDeathMtnLedgeEast', east:'turtleRockIsolatedLedgeEntrance'},
+ name: 'Dark Death Mountain Ledge (West)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/darkDeathMtnLedgeWest.png',
+ intImg: '~/img/interior/darkDeathMtnLedgeWest.png',
+ };
+ darkDeathMtnLedgeEast = { //turtleRockExitEast
+ x: 1266, y: 140,
+ multiDir:'north',
+ multiLinks:{west:'darkDeathMtnLedgeWest', south:'turtleRock', east:'turtleRockIsolatedLedgeEntrance'},
+ isMultiEntranceDungeon: true,
+ name: 'Dark Death Mountain Ledge (East)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/darkDeathMtnLedgeEast.png',
+ intImg: '~/img/interior/darkDeathMtnLedgeEast.png',
+ };
+ turtleRockIsolatedLedgeEntrance = { //turtleRockIsolatedLedgeExit
+ x: 1231, y: 173,
+ multiDir:'east',
+ multiLinks:{west:'darkDeathMtnLedgeWest', north:'darkDeathMtnLedgeEast', south:'turtleRock'},
+ isMultiEntranceDungeon: true,
+ name: 'Turtle Rock Isolated Ledge Entrance',
+ region: 'dungeon',
+ extImg: '~/img/entrance/turtleRockIsolatedLedgeEntrance.png',
+ intImg: '~/img/interior/turtleRockIsolatedLedgeEntrance.png',
+ };
+ palaceOfDarkness = { //palaceOfDarknessExit
+ x: 1439, y: 592,
+ isSingleEntranceDungeon: true,
+ name: 'Palace of Darkness',
+ region: 'dungeon',
+ extImg: '~/img/entrance/palaceOfDarkness.png',
+ intImg: '~/img/interior/palaceOfDarkness.png',
+ };
+ ganonTower = { //ganonTowerExit
+ x: 844, y: 30,
+ isSingleEntranceDungeon: true,
+ name: 'Ganon\'s Tower',
+ region: 'dungeon',
+ extImg: '~/img/entrance/ganonTower.png',
+ intImg: '~/img/interior/ganonTower.png',
+ };
+ /** DEATH MOUNTAIN **/
+ darkDeathMtnFairy = { //darkDeathMtnHealerFairy
+ x: 609, y: 287,
+ isSingleCave: true,
+ name: 'Dark Death Mountain Fairy',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/darkDeathMtnFairy.png',
+ intImg:'~/img/interior/singleFairyCave.png',
+ }
+ spikeCave = {
+ x: 862, y: 221,
+ isSingleCave: true,
+ name: 'Spike Cave',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/spikeCave.png',
+ intImg: '~/img/interior/spikeCave.png',
+ };
+ hookshotCaveBackEntrance = { //hookshotCaveExitNorth
+ x: 1201, y: 24,
+ isMultiCave: true,
+ name: 'Hookshot Cave Back Entrance',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/hookshotCaveBackEntrance.png',
+ intImg: '~/img/interior/hookshotCaveBackEntrance.png',
+ }
+ hookshotCave = { //hookshotCaveExitSouth
+ x: 1248, y: 99,
+ isMultiCave: true,
+ name: 'Hookshot Cave',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/hookshotCave.png',
+ intImg: '~/img/interior/hookshotCave.png',
+ }
+ caveShopDarkDeathMtn = {
+ x: 1266, y: 222,
+ isSingleCave: true,
+ name: 'Cave Shop (Dark Death Mountain)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/superBunnyCaveBottom.png',
+ intImg: '~/img/interior/caveShopDarkDeathMtn.png',
+ }
+ superBunnyCaveTop = { //superBunnyCaveExitTop
+ x: 1289, y: 97,
+ isMultiCave: true,
+ name: 'Superbunny Cave (Top)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/superBunnyCaveTop.png',
+ intImg: '~/img/interior/superBunnyCaveTop.png',
+ }
+ superBunnyCaveBottom = { //superBunnyCaveExitBottom
+ x: 1283, y: 221,
+ isMultiCave: true,
+ name: 'Superbunny Cave (Bottom)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/superBunnyCaveBottom.png',
+ intImg: '~/img/interior/superBunnyCaveBottom.png',
+ };
+ /** NORTH WEST **/
+ darkWorldLumberjackShop = {
+ x: 504, y: 88,
+ isSingleCave: true,
+ name: 'Dark World Lumberjack Shop',
+ region: 'northwest',
+ extImg: '~/img/entrance/darkWorldLumberjackShop.png',
+ intImg: '~/img/interior/darkWorldLumberjackShop.png',
+ }
+ bumperCaveTop = { //bumperCaveExitTop
+ x: 539, y: 233,
+ isMultiCave: true,
+ name: 'Bumper Cave (Top)',
+ region: 'northwest',
+ extImg: '~/img/entrance/bumperCave.png',
+ intImg: '~/img/interior/bumperCaveTop.png',
+ }
+ bumperCaveBottom = { //bumperCaveExitBottom
+ x: 533, y: 267,
+ isMultiCave: true,
+ name: 'Bumper Cave (Bottom)',
+ region: 'northwest',
+ extImg: '~/img/entrance/bumperCave.png',
+ intImg: '~/img/interior/bumperCaveBottom.png',
+ };
+ fortuneTellerDark = {
+ x: 281, y: 487,
+ isSingleCave: true,
+ name: 'Fortune Teller (Dark)',
+ region: 'northwest',
+ extImg: '~/img/entrance/fortuneTellerDark.png',
+ intImg: '~/img/interior/fortuneTellerDark.png',
+ }
+ redShieldShop = {
+ x: 498, y: 691,
+ isSingleCave: true,
+ name: 'Red Shield Shop',
+ region: 'northwest',
+ extImg: '~/img/entrance/redShieldShop.png',
+ intImg: '~/img/interior/redShieldShop.png',
+ }
+ darkSanctuaryHint = {
+ x: 692, y: 416,
+ isSingleCave: true,
+ name: 'Dark Sanctuary Hint',
+ region: 'northwest',
+ extImg: '~/img/entrance/darkSanctuaryHint.png',
+ intImg: '~/img/interior/darkSanctuaryHint.png',
+ }
+ /** VILLAGE **/
+ chestGame = {
+ x: 76, y: 702,
+ isSingleCave: true,
+ name: 'Chest Game',
+ region: 'village',
+ extImg: '~/img/entrance/chestGame.png',
+ intImg: '~/img/interior/chestGame.png',
+ }
+ cShapedHouse = {
+ x: 310, y: 726,
+ isSingleCave: true,
+ name: 'C-Shaped House',
+ region: 'village',
+ extImg: '~/img/entrance/cShapedHouse.png',
+ intImg: '~/img/interior/cShapedHouse.png',
+ }
+ darkWorldShop = {
+ x: 304, y: 802,
+ isSingleCave: true,
+ name: 'Dark World Outcast Shop',
+ region: 'village',
+ extImg: '~/img/entrance/darkWorldShop.png',
+ intImg: '~/img/interior/darkWorldShop.png',
+ }
+ brewery = {
+ x: 163, y: 878,
+ isSingleCave: true,
+ name: 'Brewery',
+ region: 'village',
+ extImg: '~/img/entrance/brewery.png',
+ intImg: '~/img/interior/brewery.png',
+ }
+ darkWorldHammerPegCave = {
+ x: 474, y: 908,
+ isSingleCave: true,
+ name: 'Dark World Hammer Peg Cave',
+ region: 'village',
+ extImg: '~/img/entrance/darkWorldHammerPegCave.png',
+ intImg: '~/img/interior/darkWorldHammerPegCave.png',
+ }
+ archeryGame = {
+ x: 322, y: 1055,
+ isSingleCave: true,
+ name: 'Archery Game',
+ region: 'village',
+ extImg: '~/img/entrance/archeryGame.png',
+ intImg: '~/img/interior/archeryGame.png',
+ }
+ /** MIRE **/
+ mireShed = {
+ x: 59, y: 1205,
+ isSingleCave: true,
+ name: 'Mire Shed',
+ region: 'mire',
+ extImg: '~/img/entrance/mireShed.png',
+ intImg: '~/img/interior/mireShed.png',
+ }
+ mireFairy = { //mireHealerFairy
+ x: 164, y: 1202,
+ isSingleCave: true,
+ name: 'Mire Fairy', //'Dark Desert Fairy'
+ region: 'mire',
+ extImg: '~/img/entrance/mireFairy.png',
+ intImg:'~/img/interior/singleFairyCave.png',
+ }
+ mireHint = {
+ x: 298, y: 1241,
+ isSingleCave: true,
+ name: 'Mire Hint', //'Dark Desert Hint'
+ region: 'mire',
+ extImg: '~/img/entrance/mireHint.png',
+ intImg: '~/img/interior/mireHint.png',
+ }
+ /** SOUTH **/
+ bonkFairyDark = { //swampHealerFairy
+ x: 709, y: 977,
+ isSingleCave: true,
+ name: 'Bonk Fairy (Dark)',
+ region: 'south',
+ extImg: '~/img/entrance/bonkFairyDark.png',
+ intImg: '~/img/interior/bonkFairyLight.png',
+ }
+ bigBombShop = {
+ x: 820, y: 1036,
+ isSingleCave: true,
+ name: 'Big Bomb Shop',
+ region: 'south',
+ extImg: '~/img/entrance/bigBombShop.png',
+ intImg: '~/img/interior/bigBombShop.png',
+ }
+ hypeCave = {
+ x: 896, y: 1168,
+ isSingleCave: true,
+ name: 'Hype Cave',
+ region: 'south',
+ extImg: '~/img/entrance/hypeCave.png',
+ intImg: '~/img/interior/hypeCave.png',
+ }
+ darkLakeHyliaShop = {
+ x: 972, y: 1207,
+ isSingleCave: true,
+ name: 'Dark Lake Hylia Shop',
+ region: 'south',
+ extImg: '~/img/entrance/darkLakeHyliaShop.png',
+ intImg: '~/img/interior/darkWorldPotionShop.png',
+ }
+ darkLakeHyliaLedgeFairy = { //darkLakeHyliaLedgeHealerFairy
+ x: 1342, y: 1158,
+ isSingleCave: true,
+ name: 'Dark Lake Hylia Ledge Fairy',
+ region: 'south',
+ extImg: '~/img/entrance/darkLakeHyliaLedge.png',
+ intImg: '~/img/interior/singleFairyCave.png',
+ }
+ darkLakeHyliaLedgeHint = {
+ x: 1353, y: 1178,
+ isSingleCave: true,
+ name: 'Dark Lake Hylia Ledge Hint',
+ region: 'south',
+ extImg: '~/img/entrance/darkLakeHyliaLedge.png',
+ intImg: '~/img/interior/darkLakeHyliaLedgeHint.png',
+ }
+ darkLakeHyliaSpikeCave = {
+ x: 1371, y: 1158,
+ isSingleCave: true,
+ name: 'Dark Lake Hylia Ledge Spike Cave',
+ region: 'south',
+ extImg: '~/img/entrance/darkLakeHyliaLedge.png',
+ intImg: '~/img/interior/darkLakeHyliaSpikeCave.png',
+ }
+ /** NORTH EAST **/
+ pyramidHole = { //pyramid //not sure how this one is handled
+ x: 747, y: 612,
+ isHole: true,
+ holeLink: 'pyramidEntrance',
+ name: 'Pyramid Hole',
+ region: 'northeast',
+ extImg: '~/img/entrance/pyramidHole.png',
+ intImg: '~/img/interior/pyramidHole.png',
+ };
+ pyramidEntrance = { //pyramidExit
+ x: 650, y: 732,
+ isHoleExit: true,
+ holeLink: 'pyramidHole',
+ name: 'Pyramid Entrance',
+ region: 'northeast',
+ extImg: '~/img/entrance/pyramidEntrance.png',
+ intImg: '~/img/interior/pyramidEntrance.png',
+ }
+ pyramidFairy = { //TODO: only item in Singe_Cave_Doors in code, need to investigate.
+ x: 703, y: 731,
+ isSingleCave: true,
+ name: 'Pyramid Fairy',
+ region: 'northeast',
+ extImg: '~/img/entrance/pyramidFairy.png',
+ intImg: '~/img/interior/pyramidFairy.png',
+ };
+ darkWorldPotionShop = {
+ x: 1207, y: 509,
+ isSingleCave: true,
+ name: 'Dark World Potion Shop',
+ region: 'northeast',
+ extImg: '~/img/entrance/darkWorldPotionShop.png',
+ intImg: '~/img/interior/darkWorldPotionShop.png',
+ }
+ darkLakeHyliaFairy = { //darkLakeHyliaHealerFairy
+ x: 1236, y: 972,
+ isSingleCave: true,
+ name: 'Dark Lake Hylia Fairy',
+ region: 'northeast',
+ extImg: '~/img/entrance/darkLakeHyliaFairy.png',
+ intImg:'~/img/interior/singleFairyCave.png',
+ }
+ palaceOfDarknessHint = {
+ x: 1274, y: 758,
+ isSingleCave: true,
+ name: 'Palace of Darkness Hint',
+ region: 'northeast',
+ extImg: '~/img/entrance/palaceOfDarknessHint.png',
+ intImg: '~/img/interior/palaceOfDarknessHint.png',
+ }
+ eastDarkWorldHint = {
+ x: 1470, y: 1054,
+ isSingleCave: true,
+ name: 'East Dark World Hint',
+ region: 'northeast',
+ extImg: '~/img/entrance/eastDarkWorldHint.png',
+ intImg: '~/img/interior/eastDarkWorldHint.png',
+ };
+ /** SKULL WOODS **/
+ skullWoodsSecondSectionDoorWest = { //skullWoodsSecondSectionExitWest
+ x: 88, y: 196,
+ isHoleExit: true,
+ isSkullWoods: true,
+ name: 'Skull Woods Second Section Door (West)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsSecondSectionDoorWest.png',
+ intImg: '~/img/interior/skullWoodsSecondSectionDoorWest.png',
+ };
+ skullWoodsSecondSectionDoorEast = { //skullWoodsSecondSectionExitEast
+ x: 217, y: 221,
+ isHoleExit: true,
+ isSkullWoods: true,
+ name: 'Skull Woods Second Section Door (East)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsSecondSectionDoorEast.png',
+ intImg: '~/img/interior/skullWoodsSecondSectionDoorEast.png',
+ };
+ skullWoodsFirstSectionDoor = { //skullWoodsFirstSectionExit
+ x: 275, y: 224,
+ isHoleExit: true,
+ isSkullWoods: true,
+ name: 'Skull Woods First Section Door',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsFirstSectionDoor.png',
+ intImg: '~/img/interior/skullWoodsFirstSectionDoor.png',
+ };
+ //HOLES
+ skullWoodsFirstSectionHoleWest = {
+ x: 293, y: 252,
+ isHole: true,
+ isSkullWoods: true,
+ name: 'Skull Woods First Section Hole (West)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsFirstSectionHoleWest.png',
+ intImg: '~/img/interior/skullWoodsFirstSectionHoleWest.png',
+ };
+ skullWoodsFirstSectionHoleEast = {
+ x: 234, y: 263,
+ isHole: true,
+ isSkullWoods: true,
+ name: 'Skull Woods First Section Hole (East)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsFirstSectionHoleEast.png',
+ intImg: '~/img/interior/skullWoodsFirstSectionHoleEast.png',
+ };
+ skullWoodsFirstSectionHoleNorth = {
+ x: 284, y: 197,
+ isHole: true,
+ isSkullWoods: true,
+ name: 'Skull Woods First Section Hole (North)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsFirstSectionHoleNorth.png',
+ intImg: '~/img/interior/skullWoodsFirstSectionHoleNorth.png',
+ };
+ skullWoodsSecondSectionHole = {
+ x: 181, y: 135,
+ isHole: true,
+ isSkullWoods: true,
+ name: 'Skull Woods Second Section Hole',
+ region: 'dungeon',
+ extImg: '~/img/entrance/skullWoodsSecondSectionHole.png',
+ intImg: '~/img/interior/skullWoodsSecondSectionHole.png',
+ };
+}
diff --git a/app/entrance/StaticEntrancesLW.ts b/app/entrance/StaticEntrancesLW.ts
new file mode 100644
index 0000000..43125d0
--- /dev/null
+++ b/app/entrance/StaticEntrancesLW.ts
@@ -0,0 +1,724 @@
+export class StaticEntrancesLW {
+ /** DUNGEONS **/
+ desertPalaceWest = { //desertPalaceExitWest
+ x: 53, y: 1193,
+ isMultiEntranceDungeon: true,
+ multiDir:'west',
+ multiLinks:{north:'desertPalaceNorth', south:'desertPalaceSouth', east:'desertPalaceEast'},
+ name: 'Desert Palace Entrance (West)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/desertPalaceWest.png',
+ intImg: '~/img/interior/desertPalaceWest.png',
+ }
+ desertPalaceNorth = { //desertPalaceExitNorth
+ x: 111, y: 1154,
+ isMultiEntranceDungeon: true,
+ multiDir:'north',
+ multiLinks:{west:'desertPalaceWest', south:'desertPalaceSouth', east:'desertPalaceEast'},
+ name: 'Desert Palace Entrance (North)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/desertPalaceNorth.png',
+ intImg: '~/img/interior/desertPalaceNorth.png',
+ };
+ desertPalaceSouth = { //desertPalaceExitSouth
+ x:111, y:1197,
+ isMultiEntranceDungeon: true,
+ multiDir:'south',
+ multiLinks:{north:'desertPalaceNorth', west:'desertPalaceWest', east:'desertPalaceEast'},
+ name: 'Desert Palace Entrance (South)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/desertPalaceSouth.png',
+ intImg: '~/img/interior/desertPalaceSouth.png',
+ }
+ desertPalaceEast = { //desertPalaceExitEast
+ x: 169, y: 1193,
+ isMultiEntranceDungeon: true,
+ multiDir:'east',
+ multiLinks:{north:'desertPalaceNorth', south:'desertPalaceSouth', west:'desertPalaceWest'},
+ name: 'Desert Palace Entrance (East)',
+ region: 'dungeon',
+ extImg: '~/img/entrance/desertPalaceEast.png',
+ intImg: '~/img/interior/desertPalaceEast.png',
+ }
+ towerOfHera = { //towerOfHeraExit
+ x: 841, y: 53,
+ isSingleEntranceDungeon: true,
+ name: 'Tower of Hera',
+ region: 'dungeon',
+ extImg:'~/img/entrance/towerOfHera.png',
+ intImg:'~/img/interior/towerOfHera.png',
+ };
+ agaTower = { //agaTowerExit
+ x: 750, y: 602,
+ isMultiEntranceDungeon: true,
+ multiDir:'north',
+ multiLinks:{west:'hyruleCastleWest', south:'hyruleCastleSouth', east:'hyruleCastleEast'},
+ name: 'Agahnim\'s Tower',
+ region: 'dungeon',
+ extImg: '~/img/entrance/agaTower.png',
+ intImg: '~/img/interior/agaTower.png',
+ };
+ easternPalace = {//easternPalaceExit
+ x: 1438, y: 585,
+ isSingleEntranceDungeon: true,
+ name: 'Eastern Palace',
+ region: 'dungeon',
+ extImg:'~/img/entrance/easternPalace.png',
+ intImg:'~/img/interior/easternPalace.png',
+ };
+ /** NORTH WEST **/
+ lostWoodsGamble = {
+ x: 278, y: 24,
+ isSingleCave: true,
+ name: 'Lost Woods Gamble',
+ region: 'northwest',
+ extImg: '~/img/entrance/lostWoodsGamble.png',
+ intImg: '~/img/interior/lostWoodsGamble.png',
+ junk:true,
+ };
+ lumberjackTreeTree = { //lumberjackTreeTop
+ isHole: true,
+ holeLink: 'lumberjackTreeCave',
+ x: 451, y: 111,
+ name: 'Lumberjack Tree Drop',
+ region: 'northwest',
+ extImg:'~/img/entrance/lumberjackTreeTree.png',
+ intImg:'~/img/interior/lumberjackTreeTree.png',
+ }
+ lumberjackTreeCave = { //lumberjackTreeExit
+ x: 498, y: 52,
+ isHoleExit: true,
+ holeLink: 'lumberjackTreeTree',
+ name: 'Lumberjack Tree Cave',
+ region: 'northwest',
+ extImg: '~/img/entrance/lumberjackTreeCave.png',
+ intImg: '~/img/interior/lumberjackTreeCave.png',
+ };
+ lumberjackHouse = {
+ x:503, y:94,
+ isSingleCave: true,
+ name: 'Lumberjack House',
+ region: 'northwest',
+ junk: true,
+ extImg: '~/img/entrance/lumberjackHouse.png',
+ intImg: '~/img/interior/lumberjackHouse.png',
+ }
+ lostWoodsHideoutDrop = { //lostWoodsHideoutTop
+ x: 284, y: 196,
+ isHole:true,
+ holeLink:'lostWoodsHideoutStump',
+ name: 'Lost Woods Hideout Drop',
+ region: 'northwest',
+ extImg: '~/img/entrance/lostWoodsHideout.png',
+ intImg: '~/img/interior/lostWoodsHideoutDrop.png',
+ };
+ lostWoodsHideoutStump = { //lostWoodsHideoutExit
+ x: 275, y: 227,
+ isHoleExit: true,
+ holeLink: 'lostWoodsHideoutDrop',
+ name: 'Lost Woods Hideout Stump',
+ region: 'northwest',
+ extImg: '~/img/entrance/lostWoodsHideout.png',
+ intImg: '~/img/interior/lostWoodsHideoutStump.png',
+ };
+ deathMtnReturnCaveWest = { //deathMtnReturnCaveExitWest
+ x: 539, y: 233,
+ isMultiCave: true,
+ name: 'Death Mountain Return Cave (West)',
+ region: 'northwest',
+ extImg:'~/img/entrance/deathMtnReturnCaveWest.png',
+ intImg:'~/img/interior/deathMtnReturnCaveWest.png',
+ }
+ oldManCaveWest = { //oldManCaveExitWest
+ x: 532, y: 263,
+ isMultiCave: true,
+ name: 'Old Man Cave (West)',
+ region: 'northwest',
+ extImg: '~/img/entrance/oldManCaveWest.png',
+ intImg: '~/img/interior/oldManCaveWest.png',
+ }
+ fortuneTellerLight = {
+ x: 281, y: 484,
+ isSingleCave: true,
+ name: 'Fortune Teller (Light)',
+ region: 'northwest',
+ junk: true,
+ extImg: '~/img/entrance/fortuneTellerLight.png',
+ intImg: '~/img/interior/fortuneTellerLight.png',
+ }
+ bonkRockCave = {
+ x:585, y:437,
+ isSingleCave: true,
+ name: 'Bonk Rock Cave',
+ region: 'northwest',
+ extImg: '~/img/entrance/bonkRockCave.png',
+ intImg: '~/img/interior/bonkRockCave.png',
+ }
+ sanctuary = { //sanctuaryExit
+ x: 692, y: 406,
+ isHoleExit: true,
+ holeLink: 'sanctuaryGrave',
+ name: 'Sanctuary',
+ region: 'northwest',
+ extImg:'~/img/entrance/sanctuary.png',
+ intImg:'~/img/interior/sanctuary.png',
+ };
+ sanctuaryGrave = {
+ x:778, y:439,
+ isHole: true,
+ holeLink: 'sanctuary',
+ name: 'Sanctuary Grave',
+ region: 'northwest',
+ extImg:'~/img/entrance/sanctuaryGrave.png',
+ intImg:'~/img/interior/sanctuaryGrave.png',
+ }
+ graveyardCave = {
+ x: 855, y: 415,
+ isSingleCave: true,
+ name: 'Graveyard Cave',
+ region: 'northwest',
+ extImg:'~/img/entrance/graveyardCave.png',
+ intImg:'~/img/interior/graveyardCave.png',
+ }
+ kingsGrave = {
+ x: 902, y: 445,
+ isSingleCave: true,
+ name: 'Kings Grave',
+ region: 'northwest',
+ extImg: '~/img/entrance/kingsGrave.png',
+ intImg: '~/img/interior/kingsGrave.png',
+ };
+ northFairyCaveDrop = {
+ x: 964, y: 465,
+ isHole:true,
+ holeLink: 'northFairyCave',
+ name: 'North Fairy Cave Drop',
+ region: 'northwest',
+ extImg:'~/img/entrance/northFairyCave.png',
+ intImg:'~/img/interior/northFairyCaveDrop.png',
+ }
+ northFairyCave = { //northFairyCaveExit
+ x: 1002, y: 415,
+ isHoleExit: true,
+ holeLink: 'northFairyCaveDrop',
+ region: 'northwest',
+ name: 'North Fairy Cave',
+ extImg:'~/img/entrance/northFairyCave.png',
+ intImg:'~/img/interior/northFairyCave.png',
+ };
+ /** DEATH MTN **/
+ deathMtnReturnCaveEast = { //deathMtnReturnCaveExitEast
+ x: 582, y: 209,
+ isLWDM:true,
+ name: 'Death Mountain Return Cave (East)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/deathMtnReturnCaveEast.png',
+ intImg: '~/img/interior/deathMtnReturnCaveEast.png',
+ };
+ oldManCaveEast = { //oldManCaveExitEast
+ x: 609, y: 286,
+ isLWDM:true,
+ name: 'Old Man Cave (East)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/oldManCaveEast.png',
+ intImg: '~/img/interior/oldManCaveEast.png',
+ };
+ spectacleRockCave = { //spectacleRockCaveExit
+ x: 686, y: 209,
+ isLWDM:true,
+ name: 'Spectacle Rock Cave',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/spectacleRockCave.png',
+ intImg: '~/img/interior/spectacleRockCave.png',
+ }
+ spectacleRockCavePeak = { //spectacleRockCaveExitPeak
+ x: 733, y: 156,
+ isLWDM:true,
+ name: 'Spectacle Rock Cave Peak',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/spectacleRockCavePeak.png',
+ intImg: '~/img/interior/spectacleRockCavePeak.png',
+ }
+ spectacleRockCaveBottom = { //spectacleRockCaveTop ?!?
+ x: 733, y: 220,
+ isLWDM:true,
+ name: 'Spectacle Rock Cave (Bottom)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/spectacleRockCaveBottom.png',
+ intImg: '~/img/interior/spectacleRockCaveBottom.png',
+ };
+ oldManHouseBottom = { //oldManHouseExitBottom
+ x: 674, y: 354,
+ isLWDM:true,
+ name: 'Old Man House (Bottom)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/oldManHouseBottom.png',
+ intImg: '~/img/interior/oldManHouseBottom.png',
+ };
+ oldManHouseTop = { //oldManHouseExitTop
+ x: 802, y: 245,
+ isLWDM:true,
+ name: 'Old Man House (Top)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/oldManHouseTop.png',
+ intImg: '~/img/interior/oldManHouseTop.png',
+ };
+ spiralCave = { //spiralCaveExit
+ x: 1195, y: 140,
+ isLWDM:true,
+ name: 'Spiral Cave',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/spiralCave.png',
+ intImg: '~/img/interior/spiralCave.png',
+ };
+ spiralCaveBottom = { //spiralCaveExitTop ?!?
+ x: 1201, y: 197,
+ isLWDM:true,
+ name: 'Spiral Cave (Bottom)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/spiralCaveBottom.png',
+ intImg: '~/img/interior/spiralCaveBottom.png',
+ }
+ fairyAscensionCaveTop = { //fairyAscensionCaveExitTop
+ x: 1230, y: 173,
+ isLWDM:true,
+ name: 'Fairy Ascension Cave (Top)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/fairyAscensionCaveTop.png',
+ intImg: '~/img/interior/fairyAscensionCaveTop.png',
+ };
+ fairyAscensionCaveBottom = { //fairyAscensionCaveExitBottom
+ x: 1230, y: 208,
+ isLWDM:true,
+ name: 'Fairy Ascension Cave (Bottom)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/fairyAscensionCaveBottom.png',
+ intImg: '~/img/interior/fairyAscensionCaveBottom.png',
+ };
+ mimicCave = {
+ x:1266, y:140,
+ isSingleCave: true,
+ name: 'Mimic Cave',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/mimicCave.png',
+ intImg: '~/img/interior/mimicCave.png',
+ }
+ hookshotFairy = {
+ x:1266, y:221,
+ isSingleCave: true,
+ name: 'Hookshot Fairy',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/hookshotFairy.png',
+ intImg: '~/img/interior/hookshotFairy.png',
+ }
+ paradoxCaveTop = { //paradoxCaveExitTop
+ x: 1288, y: 98,
+ isLWDM:true,
+ name: 'Paradox Cave (Top)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/paradoxCaveTop.png',
+ intImg: '~/img/interior/paradoxCaveTop.png',
+ };
+ paradoxCaveMiddle = { //paradoxCaveExitMiddle
+ x: 1283, y: 221,
+ isLWDM:true,
+ name: 'Paradox Cave (Middle)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/hookshotFairy.png',
+ intImg: '~/img/interior/paradoxCaveMiddle.png',
+ };
+ paradoxCaveBottom = { //paradoxCaveExitBottom
+ x: 1295, y: 326,
+ isLWDM:true,
+ name: 'Paradox Cave (Bottom)',
+ region: 'deathmtn',
+ extImg: '~/img/entrance/paradoxCaveBottom.png',
+ intImg: '~/img/interior/paradoxCaveBottom.png',
+ };
+ /** KAKARIKO **/
+ kakarikoWellDrop = { //kakarikoWellTop
+ x: 35, y: 638,
+ isHole:true,
+ holeLink: 'kakarikoWellCave',
+ name: 'Kakariko Well Drop',
+ region: 'kakariko',
+ extImg:'~/img/entrance/kakarikoWell.png',
+ intImg:'~/img/interior/kakarikoWellDrop.png',
+ };
+ kakarikoWellCave = { //kakarikoWellExit
+ x: 70, y: 644,
+ isHoleExit: true,
+ holeLink: 'kakarikoWellDrop',
+ name: 'Kakariko Well Cave',
+ region: 'kakariko',
+ extImg:'~/img/entrance/kakarikoWell.png',
+ intImg:'~/img/interior/kakarikoWellCave.png',
+ };
+ blindsHideout = {
+ x: 193, y: 632,
+ isSingleCave: true,
+ name: 'Blind\'s Hideout',
+ region: 'kakariko',
+ extImg: '~/img/entrance/blindsHideout.png',
+ intImg: '~/img/interior/blindsHideout.png',
+ };
+ elderHouseWest = { //elderHouseExitWest
+ x: 223, y: 633,
+ isMultiCave: true,
+ name: 'Elder House (West)',
+ region: 'kakariko',
+ extImg:'~/img/entrance/elderHouse.png',
+ intImg:'~/img/interior/elderHouseWest.png',
+ };
+ elderHouseEast = { //elderHouseExitEast
+ x: 258, y: 633,
+ isMultiCave: true,
+ name: 'Elder House (East)',
+ region: 'kakariko',
+ extImg:'~/img/entrance/elderHouse.png',
+ intImg:'~/img/interior/elderHouseEast.png',
+ };
+ snitchLadyWest = {
+ x: 76, y: 703,
+ isSingleCave: true,
+ name: 'Snitch Lady (West)',
+ region: 'kakariko',
+ extImg: '~/img/entrance/snitchLadyWest.png',
+ intImg: '~/img/interior/snitchLadyWest.png',
+ }
+ snitchLadyEast = {
+ x: 310, y: 726,
+ isSingleCave: true,
+ name: 'Snitch Lady (East)',
+ region: 'kakariko',
+ extImg: '~/img/entrance/snitchLadyEast.png',
+ intImg: '~/img/interior/snitchLadyEast.png',
+ }
+ chickenHut = {
+ x: 146, y: 814,
+ isSingleCave: true,
+ name: 'Chicken Hut',
+ region: 'kakariko',
+ extImg:'~/img/entrance/chickenHut.png',
+ intImg:'~/img/interior/chickenHut.png',
+ };
+ sickKidsHouse = {
+ x: 234, y: 808,
+ isSingleCave: true,
+ name: 'Sick Kid\'s House',
+ region: 'kakariko',
+ extImg: '~/img/entrance/sickKidsHouse.png',
+ intImg: '~/img/interior/sickKidsHouse.png',
+ };
+ bushCoveredHouse = {
+ x: 304, y: 801,
+ isSingleCave: true,
+ name: 'Bush Covered House',
+ region: 'kakariko',
+ extImg: '~/img/entrance/bushCoveredHouse.png',
+ intImg: '~/img/interior/bushCoveredHouse.png',
+ }
+ blacksmithsHut = {
+ x: 456, y: 801,
+ isSingleCave: true,
+ name: 'Blacksmith\'s Hut',
+ region: 'kakariko',
+ extImg: '~/img/entrance/blacksmithsHut.png',
+ intImg: '~/img/interior/blacksmithsHut.png',
+ };
+ batCaveDrop = { //batCaveRight
+ x: 497, y: 843,
+ isHole:true,
+ holeLink: 'batCaveCave',
+ name: 'Bat Cave Drop',
+ region: 'kakariko',
+ extImg: '~/img/entrance/batCave.png',
+ intImg: '~/img/interior/batCaveDrop.png',
+ };
+ batCaveCave = { //batCaveExit
+ x: 464, y: 837,
+ isHoleExit: true,
+ holeLink: 'batCaveDrop',
+ name: 'Bat Cave Exit',
+ region: 'kakariko',
+ extImg: '~/img/entrance/batCave.png',
+ intImg: '~/img/interior/batCaveCave.png',
+ };
+ lightWorldBombHut = {
+ x: 41, y: 895,
+ isSingleCave: true,
+ name: 'Light World Bomb Hut',
+ region: 'kakariko',
+ extImg: '~/img/entrance/lightWorldBombHut.png',
+ intImg: '~/img/interior/lightWorldBombHut.png',
+ }
+ kakarikoShop = {
+ x: 163, y: 879,
+ isSingleCave: true,
+ name: 'Kakariko Shop',
+ region: 'kakariko',
+ extImg: '~/img/entrance/kakarikoShop.png',
+ intImg: '~/img/interior/kakarikoShop.png',
+ }
+ tavernFront = {
+ x: 240, y: 896,
+ isSingleCave: true,
+ name: 'Tavern (Front)',
+ region: 'kakariko',
+ extImg: '~/img/entrance/tavern.png',
+ intImg: '~/img/interior/tavern.png',
+ }
+ library = {
+ x:243, y:990,
+ isSingleCave: true,
+ name: 'Library',
+ region: 'kakariko',
+ extImg:'~/img/entrance/library.png',
+ intImg:'~/img/interior/library.png',
+ }
+ twoBrothersHouseWest = { //twoBrothersHouseExitWest
+ x: 163, y: 1077,
+ isMultiCave: true,
+ name: 'Two Brothers House (West)',
+ region: 'kakariko',
+ extImg: '~/img/entrance/twoBrothersHouse.png',
+ intImg: '~/img/interior/twoBrothersHouseWest.png',
+ };
+ twoBrothersHouseEast = { //twoBrothersHouseExitEast
+ x: 210, y: 1077,
+ isMultiCave: true,
+ name: 'Two Brothers House (East)',
+ region: 'kakariko',
+ extImg: '~/img/entrance/twoBrothersHouse.png',
+ intImg: '~/img/interior/twoBrothersHouseEast.png',
+ };
+ kakarikoGambleGame = {
+ x:322, y:1054,
+ isSingleCave: true,
+ name: 'Kakariko Gamble Game',
+ region: 'kakariko',
+ extImg: '~/img/entrance/kakarikoGambleGame.png',
+ intImg: '~/img/interior/kakarikoGambleGame.png',
+ }
+ /** DESERT **/
+ checkerboardCave = {
+ x: 263, y: 1165,
+ isSingleCave: true,
+ name: 'Checkerboard Cave',
+ region: 'desert',
+ extImg:'~/img/entrance/checkerboardCave.png',
+ intImg:'~/img/interior/checkerboardCave.png',
+ }
+ aginahsCave = {
+ x: 298, y: 1241,
+ isSingleCave: true,
+ name: 'Aginah\'s Cave',
+ region: 'desert',
+ extImg:'~/img/entrance/aginahsCave.png',
+ intImg:'~/img/interior/aginahsCave.png',
+ }
+ desertFairy = { //desertHealerFairy
+ x: 416, y: 1342,
+ isSingleCave: true,
+ name: 'Desert Fairy',
+ region: 'desert',
+ extImg:'~/img/entrance/desertFairy.png',
+ intImg:'~/img/interior/singleFairyCave.png',
+ }
+ fiftyRupeeCave = {
+ x:468, y:1434,
+ isSingleCave: true,
+ name: '50 Rupee Cave',
+ region: 'desert',
+ extImg:'~/img/entrance/fiftyRupeeCave.png',
+ intImg:'~/img/interior/fiftyRupeeCave.png',
+ }
+ /** SOUTH **/
+ cave45 = {
+ x: 399, y: 1240,
+ isSingleCave: true,
+ name: 'Cave 45',
+ region: 'south',
+ extImg: '~/img/entrance/cave45.png',
+ intImg: '~/img/interior/cave45.png',
+ }
+ dam = {
+ x: 703, y: 1405,
+ isSingleCave: true,
+ name: 'Dam',
+ region: 'south',
+ extImg: '~/img/entrance/dam.png',
+ intImg: '~/img/interior/dam.png',
+ }
+ bonkFairyLight = {
+ x: 709, y: 978,
+ isSingleCave: true,
+ name: 'Bonk Fairy (Light)',
+ region: 'south',
+ extImg:'~/img/entrance/bonkFairyLight.png',
+ intImg:'~/img/interior/bonkFairyLight.png',
+ };
+ linksHouse = {
+ x: 820, y: 1036,
+ isSingleCave: true,
+ name: 'Link\'s House',
+ region: 'south',
+ extImg: '~/img/entrance/linksHouse.png',
+ intImg: '~/img/interior/linksHouse.png',
+ }
+ lightHypeFairy = {
+ x: 896, y: 1171,
+ isSingleCave: true,
+ name: 'Light Hype Fairy',
+ region: 'south',
+ extImg:'~/img/entrance/lightHypeFairy.png',
+ intImg:'~/img/interior/singleFairyCave.png',
+ }
+ lakeHyliaFortuneTeller = {
+ x:973, y:1206,
+ isSingleCave: true,
+ name: 'Lake Hylia Fortune Teller',
+ region: 'south',
+ extImg: '~/img/entrance/lakeHyliaFortuneTeller.png',
+ intImg: '~/img/interior/fortuneTellerLight.png',
+ }
+ caveShopLakeHylia = {
+ x: 1089, y: 1152,
+ isSingleCave: true,
+ name: 'Cave Shop (Lake Hylia)',
+ region: 'south',
+ extImg: '~/img/entrance/caveShopLakeHylia.png',
+ intImg: '~/img/interior/caveShopLakeHylia.png',
+ }
+ miniMoldormCave = {
+ x: 978, y: 1412,
+ isSingleCave: true,
+ name: 'Mini Moldorm Cave',
+ region: 'south',
+ extImg:'~/img/entrance/miniMoldormCave.png',
+ intImg:'~/img/interior/miniMoldormCave.png',
+ }
+ capacityUpgrade = {
+ x: 1189, y: 1282,
+ isSingleCave: true,
+ name: 'Capacity Upgrade',
+ region: 'south',
+ extImg:'~/img/entrance/capacityUpgrade.png',
+ intImg:'~/img/interior/capacityUpgrade.png',
+ }
+ iceRodCave = {
+ x:1342, y:1160,
+ isSingleCave: true,
+ name: 'Ice Rod Cave',
+ region: 'south',
+ extImg: '~/img/entrance/lakeHyliaLedge.png',
+ intImg: '~/img/interior/iceRodCave.png',
+ }
+ twentyRupeeCave = {
+ x:1353, y:1177,
+ isSingleCave: true,
+ name: '20 Rupee Cave',
+ region: 'south',
+ extImg: '~/img/entrance/lakeHyliaLedge.png',
+ intImg: '~/img/interior/twentyRupeeCave.png',
+ }
+ goodBeeCave = {
+ x:1371, y:1160,
+ isSingleCave: true,
+ name: 'Good Bee Cave',
+ region: 'south',
+ extImg: '~/img/entrance/lakeHyliaLedge.png',
+ intImg: '~/img/interior/iceRodCave.png',
+ }
+ /** HYRULE CASTLE **/
+ hyruleCastleWest = { //hyruleCastleExitWest
+ x: 674, y: 584,
+ isMultiEntranceDungeon: true,
+ multiDir:'west',
+ multiLinks:{north:'agaTower', south:'hyruleCastleSouth', east:'hyruleCastleEast'},
+ name: 'Hyrule Castle Entrance (West)',
+ region: 'castle',
+ extImg: '~/img/entrance/hyruleCastleWest.png',
+ intImg: '~/img/interior/hyruleCastleWest.png',
+ };
+ hyruleCastleSouth = { //hyruleCastleExitSouth
+ x: 750, y: 662,
+ isMultiEntranceDungeon: true,
+ multiDir:'south',
+ multiLinks:{north:'agaTower', west:'hyruleCastleWest', east:'hyruleCastleEast'},
+ name: 'Hyrule Castle Entrance (South)',
+ region: 'castle',
+ extImg: '~/img/entrance/hyruleCastleSouth.png',
+ intImg: '~/img/interior/hyruleCastleSouth.png',
+ }
+ hyruleCastleEast = { //hyruleCastleExitEast
+ x: 825, y: 584,
+ isMultiEntranceDungeon: true,
+ multiDir:'east',
+ multiLinks:{north:'agaTower', south:'hyruleCastleSouth', west:'hyruleCastleWest'},
+ name: 'Hyrule Castle Entrance (East)',
+ region: 'castle',
+ extImg: '~/img/entrance/hyruleCastleEast.png',
+ intImg: '~/img/interior/hyruleCastleEast.png',
+ };
+ hyruleCastleSecretEntranceDrop = { //hyruleCastleSecretEntranceExit
+ x: 893, y: 623,
+ isHole:true,
+ holeLink: 'hyruleCastleSecretEntranceStairs',
+ name: 'Hyrule Castle Secret Entrance Drop',
+ extImg: '~/img/entrance/hyruleCastleSecretEntranceDrop.png',
+ intImg: '~/img/interior/hyruleCastleSecretEntranceDrop.png',
+ region: 'castle',
+ };
+ hyruleCastleSecretEntranceStairs = { //hyruleCastleSecretEntrance
+ x: 826, y: 643,
+ isHoleExit: true,
+ holeLink: 'hyruleCastleSecretEntranceDrop',
+ region: 'castle',
+ extImg: '~/img/entrance/hyruleCastleSecretEntranceStairs.png',
+ intImg: '~/img/interior/hyruleCastleSecretEntranceStairs.png',
+ name: 'Hyrule Castle Secret Entrance Stairs',
+ };
+ /** NORTH EAST **/
+ waterfallOfWishing = {
+ x: 1351, y: 206,
+ isSingleCave: true,
+ name: 'Waterfall of Wishing',
+ region: 'northeast',
+ extImg:'~/img/entrance/waterfallOfWishing.png',
+ intImg:'~/img/interior/waterfallOfWishing.png',
+ }
+ potionShop = {
+ x:1201, y:502,
+ isSingleCave: true,
+ name: 'Potion Shop',
+ region: 'northeast',
+ extImg:'~/img/entrance/potionShop.png',
+ intImg:'~/img/interior/potionShop.png',
+ }
+ sahasrahlasHut = {
+ x: 1215, y: 683,
+ isSingleCave: true,
+ name: 'Sahasrahla\'s Hut',
+ region: 'northeast',
+ extImg: '~/img/entrance/sahasrahlasHut.png',
+ intImg: '~/img/interior/sahasrahlasHut.png',
+ };
+ lakeHyliaFairy = {
+ x: 1237, y: 973,
+ isSingleCave: true,
+ name: 'Lake Hylia Fairy',
+ region: 'northeast',
+ extImg:'~/img/entrance/lakeHyliaFairy.png',
+ intImg:'~/img/interior/singleFairyCave.png',
+ }
+ longFairyCave = {
+ x:1471, y:1053,
+ isSingleCave: true,
+ name: 'Long Fairy Cave',
+ region: 'northeast',
+ extImg:'~/img/entrance/longFairyCave.png',
+ intImg:'~/img/interior/longFairyCave.png',
+ }
+}
+
diff --git a/app/img/chest-disabled.png b/app/img/chest-disabled.png
new file mode 100644
index 0000000..53db7b3
Binary files /dev/null and b/app/img/chest-disabled.png differ
diff --git a/app/img/enter-hole.png b/app/img/enter-hole.png
new file mode 100644
index 0000000..1c961eb
Binary files /dev/null and b/app/img/enter-hole.png differ
diff --git a/app/img/enter-link-alt.png b/app/img/enter-link-alt.png
new file mode 100644
index 0000000..29a40a9
Binary files /dev/null and b/app/img/enter-link-alt.png differ
diff --git a/app/img/enter-link.png b/app/img/enter-link.png
new file mode 100644
index 0000000..307fc65
Binary files /dev/null and b/app/img/enter-link.png differ
diff --git a/app/img/enter-linked-hole.png b/app/img/enter-linked-hole.png
new file mode 100644
index 0000000..c5d8079
Binary files /dev/null and b/app/img/enter-linked-hole.png differ
diff --git a/app/img/enter-linked-to-alt.png b/app/img/enter-linked-to-alt.png
new file mode 100644
index 0000000..afe75de
Binary files /dev/null and b/app/img/enter-linked-to-alt.png differ
diff --git a/app/img/enter-linked-to.png b/app/img/enter-linked-to.png
new file mode 100644
index 0000000..b7f9c80
Binary files /dev/null and b/app/img/enter-linked-to.png differ
diff --git a/app/img/entrance.png b/app/img/entrance.png
new file mode 100644
index 0000000..8a03b91
Binary files /dev/null and b/app/img/entrance.png differ
diff --git a/app/img/entrance/agaTower.png b/app/img/entrance/agaTower.png
new file mode 100644
index 0000000..9fd4145
Binary files /dev/null and b/app/img/entrance/agaTower.png differ
diff --git a/app/img/entrance/aginahsCave.png b/app/img/entrance/aginahsCave.png
new file mode 100644
index 0000000..851ec12
Binary files /dev/null and b/app/img/entrance/aginahsCave.png differ
diff --git a/app/img/entrance/archeryGame.png b/app/img/entrance/archeryGame.png
new file mode 100644
index 0000000..c3df98c
Binary files /dev/null and b/app/img/entrance/archeryGame.png differ
diff --git a/app/img/entrance/batCave.png b/app/img/entrance/batCave.png
new file mode 100644
index 0000000..4117929
Binary files /dev/null and b/app/img/entrance/batCave.png differ
diff --git a/app/img/entrance/bigBombShop.png b/app/img/entrance/bigBombShop.png
new file mode 100644
index 0000000..cf8dda9
Binary files /dev/null and b/app/img/entrance/bigBombShop.png differ
diff --git a/app/img/entrance/blacksmithsHut.png b/app/img/entrance/blacksmithsHut.png
new file mode 100644
index 0000000..5cb19e0
Binary files /dev/null and b/app/img/entrance/blacksmithsHut.png differ
diff --git a/app/img/entrance/blindsHideout.png b/app/img/entrance/blindsHideout.png
new file mode 100644
index 0000000..c0d8734
Binary files /dev/null and b/app/img/entrance/blindsHideout.png differ
diff --git a/app/img/entrance/bonkFairyDark.png b/app/img/entrance/bonkFairyDark.png
new file mode 100644
index 0000000..00dd436
Binary files /dev/null and b/app/img/entrance/bonkFairyDark.png differ
diff --git a/app/img/entrance/bonkFairyLight.png b/app/img/entrance/bonkFairyLight.png
new file mode 100644
index 0000000..5fe8696
Binary files /dev/null and b/app/img/entrance/bonkFairyLight.png differ
diff --git a/app/img/entrance/bonkRockCave.png b/app/img/entrance/bonkRockCave.png
new file mode 100644
index 0000000..99c95fb
Binary files /dev/null and b/app/img/entrance/bonkRockCave.png differ
diff --git a/app/img/entrance/brewery.png b/app/img/entrance/brewery.png
new file mode 100644
index 0000000..5714a8d
Binary files /dev/null and b/app/img/entrance/brewery.png differ
diff --git a/app/img/entrance/bumperCave.png b/app/img/entrance/bumperCave.png
new file mode 100644
index 0000000..3f07b42
Binary files /dev/null and b/app/img/entrance/bumperCave.png differ
diff --git a/app/img/entrance/bushCoveredHouse.png b/app/img/entrance/bushCoveredHouse.png
new file mode 100644
index 0000000..cc1d944
Binary files /dev/null and b/app/img/entrance/bushCoveredHouse.png differ
diff --git a/app/img/entrance/cShapedHouse.png b/app/img/entrance/cShapedHouse.png
new file mode 100644
index 0000000..00c751f
Binary files /dev/null and b/app/img/entrance/cShapedHouse.png differ
diff --git a/app/img/entrance/capacityUpgrade.png b/app/img/entrance/capacityUpgrade.png
new file mode 100644
index 0000000..28a51e0
Binary files /dev/null and b/app/img/entrance/capacityUpgrade.png differ
diff --git a/app/img/entrance/cave45.png b/app/img/entrance/cave45.png
new file mode 100644
index 0000000..f2aba63
Binary files /dev/null and b/app/img/entrance/cave45.png differ
diff --git a/app/img/entrance/caveShopLakeHylia.png b/app/img/entrance/caveShopLakeHylia.png
new file mode 100644
index 0000000..fa7b2af
Binary files /dev/null and b/app/img/entrance/caveShopLakeHylia.png differ
diff --git a/app/img/entrance/checkerboardCave.png b/app/img/entrance/checkerboardCave.png
new file mode 100644
index 0000000..a14b744
Binary files /dev/null and b/app/img/entrance/checkerboardCave.png differ
diff --git a/app/img/entrance/chestGame.png b/app/img/entrance/chestGame.png
new file mode 100644
index 0000000..16abdc6
Binary files /dev/null and b/app/img/entrance/chestGame.png differ
diff --git a/app/img/entrance/chickenHut.png b/app/img/entrance/chickenHut.png
new file mode 100644
index 0000000..f45b71c
Binary files /dev/null and b/app/img/entrance/chickenHut.png differ
diff --git a/app/img/entrance/dam.png b/app/img/entrance/dam.png
new file mode 100644
index 0000000..6dcdc86
Binary files /dev/null and b/app/img/entrance/dam.png differ
diff --git a/app/img/entrance/darkDeathMtnFairy.png b/app/img/entrance/darkDeathMtnFairy.png
new file mode 100644
index 0000000..7b9f449
Binary files /dev/null and b/app/img/entrance/darkDeathMtnFairy.png differ
diff --git a/app/img/entrance/darkDeathMtnLedgeEast.png b/app/img/entrance/darkDeathMtnLedgeEast.png
new file mode 100644
index 0000000..3348b9e
Binary files /dev/null and b/app/img/entrance/darkDeathMtnLedgeEast.png differ
diff --git a/app/img/entrance/darkDeathMtnLedgeWest.png b/app/img/entrance/darkDeathMtnLedgeWest.png
new file mode 100644
index 0000000..695e79e
Binary files /dev/null and b/app/img/entrance/darkDeathMtnLedgeWest.png differ
diff --git a/app/img/entrance/darkLakeHyliaFairy.png b/app/img/entrance/darkLakeHyliaFairy.png
new file mode 100644
index 0000000..dce0a8c
Binary files /dev/null and b/app/img/entrance/darkLakeHyliaFairy.png differ
diff --git a/app/img/entrance/darkLakeHyliaLedge.png b/app/img/entrance/darkLakeHyliaLedge.png
new file mode 100644
index 0000000..54319f1
Binary files /dev/null and b/app/img/entrance/darkLakeHyliaLedge.png differ
diff --git a/app/img/entrance/darkLakeHyliaShop.png b/app/img/entrance/darkLakeHyliaShop.png
new file mode 100644
index 0000000..d8cd1a9
Binary files /dev/null and b/app/img/entrance/darkLakeHyliaShop.png differ
diff --git a/app/img/entrance/darkSanctuaryHint.png b/app/img/entrance/darkSanctuaryHint.png
new file mode 100644
index 0000000..18562e9
Binary files /dev/null and b/app/img/entrance/darkSanctuaryHint.png differ
diff --git a/app/img/entrance/darkWorldHammerPegCave.png b/app/img/entrance/darkWorldHammerPegCave.png
new file mode 100644
index 0000000..35ab50d
Binary files /dev/null and b/app/img/entrance/darkWorldHammerPegCave.png differ
diff --git a/app/img/entrance/darkWorldLumberjackShop.png b/app/img/entrance/darkWorldLumberjackShop.png
new file mode 100644
index 0000000..3bd85c6
Binary files /dev/null and b/app/img/entrance/darkWorldLumberjackShop.png differ
diff --git a/app/img/entrance/darkWorldPotionShop.png b/app/img/entrance/darkWorldPotionShop.png
new file mode 100644
index 0000000..cbff098
Binary files /dev/null and b/app/img/entrance/darkWorldPotionShop.png differ
diff --git a/app/img/entrance/darkWorldShop.png b/app/img/entrance/darkWorldShop.png
new file mode 100644
index 0000000..8614543
Binary files /dev/null and b/app/img/entrance/darkWorldShop.png differ
diff --git a/app/img/entrance/deathMtnReturnCaveEast.png b/app/img/entrance/deathMtnReturnCaveEast.png
new file mode 100644
index 0000000..0a0609c
Binary files /dev/null and b/app/img/entrance/deathMtnReturnCaveEast.png differ
diff --git a/app/img/entrance/deathMtnReturnCaveWest.png b/app/img/entrance/deathMtnReturnCaveWest.png
new file mode 100644
index 0000000..b13761c
Binary files /dev/null and b/app/img/entrance/deathMtnReturnCaveWest.png differ
diff --git a/app/img/entrance/desertFairy.png b/app/img/entrance/desertFairy.png
new file mode 100644
index 0000000..455fc9c
Binary files /dev/null and b/app/img/entrance/desertFairy.png differ
diff --git a/app/img/entrance/desertPalaceEast.png b/app/img/entrance/desertPalaceEast.png
new file mode 100644
index 0000000..878be53
Binary files /dev/null and b/app/img/entrance/desertPalaceEast.png differ
diff --git a/app/img/entrance/desertPalaceNorth.png b/app/img/entrance/desertPalaceNorth.png
new file mode 100644
index 0000000..81969e9
Binary files /dev/null and b/app/img/entrance/desertPalaceNorth.png differ
diff --git a/app/img/entrance/desertPalaceSouth.png b/app/img/entrance/desertPalaceSouth.png
new file mode 100644
index 0000000..7e53e6a
Binary files /dev/null and b/app/img/entrance/desertPalaceSouth.png differ
diff --git a/app/img/entrance/desertPalaceWest.png b/app/img/entrance/desertPalaceWest.png
new file mode 100644
index 0000000..0390b0e
Binary files /dev/null and b/app/img/entrance/desertPalaceWest.png differ
diff --git a/app/img/entrance/eastDarkWorldHint.png b/app/img/entrance/eastDarkWorldHint.png
new file mode 100644
index 0000000..7d97f58
Binary files /dev/null and b/app/img/entrance/eastDarkWorldHint.png differ
diff --git a/app/img/entrance/easternPalace.png b/app/img/entrance/easternPalace.png
new file mode 100644
index 0000000..36c7892
Binary files /dev/null and b/app/img/entrance/easternPalace.png differ
diff --git a/app/img/entrance/elderHouse.png b/app/img/entrance/elderHouse.png
new file mode 100644
index 0000000..f493fda
Binary files /dev/null and b/app/img/entrance/elderHouse.png differ
diff --git a/app/img/entrance/fairyAscensionCaveBottom.png b/app/img/entrance/fairyAscensionCaveBottom.png
new file mode 100644
index 0000000..b042e18
Binary files /dev/null and b/app/img/entrance/fairyAscensionCaveBottom.png differ
diff --git a/app/img/entrance/fairyAscensionCaveTop.png b/app/img/entrance/fairyAscensionCaveTop.png
new file mode 100644
index 0000000..3a98b28
Binary files /dev/null and b/app/img/entrance/fairyAscensionCaveTop.png differ
diff --git a/app/img/entrance/fiftyRupeeCave.png b/app/img/entrance/fiftyRupeeCave.png
new file mode 100644
index 0000000..8af9f63
Binary files /dev/null and b/app/img/entrance/fiftyRupeeCave.png differ
diff --git a/app/img/entrance/fortuneTellerDark.png b/app/img/entrance/fortuneTellerDark.png
new file mode 100644
index 0000000..093cb4e
Binary files /dev/null and b/app/img/entrance/fortuneTellerDark.png differ
diff --git a/app/img/entrance/fortuneTellerLight.png b/app/img/entrance/fortuneTellerLight.png
new file mode 100644
index 0000000..66a3755
Binary files /dev/null and b/app/img/entrance/fortuneTellerLight.png differ
diff --git a/app/img/entrance/ganonTower.png b/app/img/entrance/ganonTower.png
new file mode 100644
index 0000000..85aa94c
Binary files /dev/null and b/app/img/entrance/ganonTower.png differ
diff --git a/app/img/entrance/graveyardCave.png b/app/img/entrance/graveyardCave.png
new file mode 100644
index 0000000..db4f344
Binary files /dev/null and b/app/img/entrance/graveyardCave.png differ
diff --git a/app/img/entrance/hookshotCave.png b/app/img/entrance/hookshotCave.png
new file mode 100644
index 0000000..4b6da07
Binary files /dev/null and b/app/img/entrance/hookshotCave.png differ
diff --git a/app/img/entrance/hookshotCaveBackEntrance.png b/app/img/entrance/hookshotCaveBackEntrance.png
new file mode 100644
index 0000000..4281fca
Binary files /dev/null and b/app/img/entrance/hookshotCaveBackEntrance.png differ
diff --git a/app/img/entrance/hookshotFairy.png b/app/img/entrance/hookshotFairy.png
new file mode 100644
index 0000000..b05e60f
Binary files /dev/null and b/app/img/entrance/hookshotFairy.png differ
diff --git a/app/img/entrance/hypeCave.png b/app/img/entrance/hypeCave.png
new file mode 100644
index 0000000..ba370fd
Binary files /dev/null and b/app/img/entrance/hypeCave.png differ
diff --git a/app/img/entrance/hyruleCastleEast.png b/app/img/entrance/hyruleCastleEast.png
new file mode 100644
index 0000000..481b993
Binary files /dev/null and b/app/img/entrance/hyruleCastleEast.png differ
diff --git a/app/img/entrance/hyruleCastleSecretEntranceDrop.png b/app/img/entrance/hyruleCastleSecretEntranceDrop.png
new file mode 100644
index 0000000..2ebfb52
Binary files /dev/null and b/app/img/entrance/hyruleCastleSecretEntranceDrop.png differ
diff --git a/app/img/entrance/hyruleCastleSecretEntranceStairs.png b/app/img/entrance/hyruleCastleSecretEntranceStairs.png
new file mode 100644
index 0000000..eb46740
Binary files /dev/null and b/app/img/entrance/hyruleCastleSecretEntranceStairs.png differ
diff --git a/app/img/entrance/hyruleCastleSouth.png b/app/img/entrance/hyruleCastleSouth.png
new file mode 100644
index 0000000..540e2c2
Binary files /dev/null and b/app/img/entrance/hyruleCastleSouth.png differ
diff --git a/app/img/entrance/hyruleCastleWest.png b/app/img/entrance/hyruleCastleWest.png
new file mode 100644
index 0000000..f2fd538
Binary files /dev/null and b/app/img/entrance/hyruleCastleWest.png differ
diff --git a/app/img/entrance/icePalace.png b/app/img/entrance/icePalace.png
new file mode 100644
index 0000000..d0fc52a
Binary files /dev/null and b/app/img/entrance/icePalace.png differ
diff --git a/app/img/entrance/kakarikoGambleGame.png b/app/img/entrance/kakarikoGambleGame.png
new file mode 100644
index 0000000..46ef329
Binary files /dev/null and b/app/img/entrance/kakarikoGambleGame.png differ
diff --git a/app/img/entrance/kakarikoShop.png b/app/img/entrance/kakarikoShop.png
new file mode 100644
index 0000000..e2f01ce
Binary files /dev/null and b/app/img/entrance/kakarikoShop.png differ
diff --git a/app/img/entrance/kakarikoWell.png b/app/img/entrance/kakarikoWell.png
new file mode 100644
index 0000000..100bfa7
Binary files /dev/null and b/app/img/entrance/kakarikoWell.png differ
diff --git a/app/img/entrance/kingsGrave.png b/app/img/entrance/kingsGrave.png
new file mode 100644
index 0000000..d5656ca
Binary files /dev/null and b/app/img/entrance/kingsGrave.png differ
diff --git a/app/img/entrance/lakeHyliaFairy.png b/app/img/entrance/lakeHyliaFairy.png
new file mode 100644
index 0000000..c7331f7
Binary files /dev/null and b/app/img/entrance/lakeHyliaFairy.png differ
diff --git a/app/img/entrance/lakeHyliaFortuneTeller.png b/app/img/entrance/lakeHyliaFortuneTeller.png
new file mode 100644
index 0000000..462828f
Binary files /dev/null and b/app/img/entrance/lakeHyliaFortuneTeller.png differ
diff --git a/app/img/entrance/lakeHyliaLedge.png b/app/img/entrance/lakeHyliaLedge.png
new file mode 100644
index 0000000..8ef8e87
Binary files /dev/null and b/app/img/entrance/lakeHyliaLedge.png differ
diff --git a/app/img/entrance/library.png b/app/img/entrance/library.png
new file mode 100644
index 0000000..cc2aba3
Binary files /dev/null and b/app/img/entrance/library.png differ
diff --git a/app/img/entrance/lightHypeFairy.png b/app/img/entrance/lightHypeFairy.png
new file mode 100644
index 0000000..879ebca
Binary files /dev/null and b/app/img/entrance/lightHypeFairy.png differ
diff --git a/app/img/entrance/lightWorldBombHut.png b/app/img/entrance/lightWorldBombHut.png
new file mode 100644
index 0000000..b32dd6c
Binary files /dev/null and b/app/img/entrance/lightWorldBombHut.png differ
diff --git a/app/img/entrance/linksHouse.png b/app/img/entrance/linksHouse.png
new file mode 100644
index 0000000..78754cd
Binary files /dev/null and b/app/img/entrance/linksHouse.png differ
diff --git a/app/img/entrance/longFairyCave.png b/app/img/entrance/longFairyCave.png
new file mode 100644
index 0000000..a8c9765
Binary files /dev/null and b/app/img/entrance/longFairyCave.png differ
diff --git a/app/img/entrance/lostWoodsGamble.png b/app/img/entrance/lostWoodsGamble.png
new file mode 100644
index 0000000..6ec0c93
Binary files /dev/null and b/app/img/entrance/lostWoodsGamble.png differ
diff --git a/app/img/entrance/lostWoodsHideout.png b/app/img/entrance/lostWoodsHideout.png
new file mode 100644
index 0000000..53bf9b2
Binary files /dev/null and b/app/img/entrance/lostWoodsHideout.png differ
diff --git a/app/img/entrance/lumberjackHouse.png b/app/img/entrance/lumberjackHouse.png
new file mode 100644
index 0000000..508b9dc
Binary files /dev/null and b/app/img/entrance/lumberjackHouse.png differ
diff --git a/app/img/entrance/lumberjackTreeCave.png b/app/img/entrance/lumberjackTreeCave.png
new file mode 100644
index 0000000..2080d5b
Binary files /dev/null and b/app/img/entrance/lumberjackTreeCave.png differ
diff --git a/app/img/entrance/lumberjackTreeTree.png b/app/img/entrance/lumberjackTreeTree.png
new file mode 100644
index 0000000..683c073
Binary files /dev/null and b/app/img/entrance/lumberjackTreeTree.png differ
diff --git a/app/img/entrance/mimicCave.png b/app/img/entrance/mimicCave.png
new file mode 100644
index 0000000..0bbfa80
Binary files /dev/null and b/app/img/entrance/mimicCave.png differ
diff --git a/app/img/entrance/miniMoldormCave.png b/app/img/entrance/miniMoldormCave.png
new file mode 100644
index 0000000..fbeb875
Binary files /dev/null and b/app/img/entrance/miniMoldormCave.png differ
diff --git a/app/img/entrance/mireFairy.png b/app/img/entrance/mireFairy.png
new file mode 100644
index 0000000..7b51801
Binary files /dev/null and b/app/img/entrance/mireFairy.png differ
diff --git a/app/img/entrance/mireHint.png b/app/img/entrance/mireHint.png
new file mode 100644
index 0000000..5400377
Binary files /dev/null and b/app/img/entrance/mireHint.png differ
diff --git a/app/img/entrance/mireShed.png b/app/img/entrance/mireShed.png
new file mode 100644
index 0000000..81931ed
Binary files /dev/null and b/app/img/entrance/mireShed.png differ
diff --git a/app/img/entrance/miseryMire.png b/app/img/entrance/miseryMire.png
new file mode 100644
index 0000000..c61f703
Binary files /dev/null and b/app/img/entrance/miseryMire.png differ
diff --git a/app/img/entrance/northFairyCave.png b/app/img/entrance/northFairyCave.png
new file mode 100644
index 0000000..3a3b949
Binary files /dev/null and b/app/img/entrance/northFairyCave.png differ
diff --git a/app/img/entrance/oldManCaveEast.png b/app/img/entrance/oldManCaveEast.png
new file mode 100644
index 0000000..12a53af
Binary files /dev/null and b/app/img/entrance/oldManCaveEast.png differ
diff --git a/app/img/entrance/oldManCaveWest.png b/app/img/entrance/oldManCaveWest.png
new file mode 100644
index 0000000..96d8c2d
Binary files /dev/null and b/app/img/entrance/oldManCaveWest.png differ
diff --git a/app/img/entrance/oldManHouseBottom.png b/app/img/entrance/oldManHouseBottom.png
new file mode 100644
index 0000000..93f119e
Binary files /dev/null and b/app/img/entrance/oldManHouseBottom.png differ
diff --git a/app/img/entrance/oldManHouseTop.png b/app/img/entrance/oldManHouseTop.png
new file mode 100644
index 0000000..22bc10f
Binary files /dev/null and b/app/img/entrance/oldManHouseTop.png differ
diff --git a/app/img/entrance/palaceOfDarkness.png b/app/img/entrance/palaceOfDarkness.png
new file mode 100644
index 0000000..485e7f3
Binary files /dev/null and b/app/img/entrance/palaceOfDarkness.png differ
diff --git a/app/img/entrance/palaceOfDarknessHint.png b/app/img/entrance/palaceOfDarknessHint.png
new file mode 100644
index 0000000..05b35b0
Binary files /dev/null and b/app/img/entrance/palaceOfDarknessHint.png differ
diff --git a/app/img/entrance/paradoxCaveBottom.png b/app/img/entrance/paradoxCaveBottom.png
new file mode 100644
index 0000000..61585de
Binary files /dev/null and b/app/img/entrance/paradoxCaveBottom.png differ
diff --git a/app/img/entrance/paradoxCaveTop.png b/app/img/entrance/paradoxCaveTop.png
new file mode 100644
index 0000000..385b555
Binary files /dev/null and b/app/img/entrance/paradoxCaveTop.png differ
diff --git a/app/img/entrance/potionShop.png b/app/img/entrance/potionShop.png
new file mode 100644
index 0000000..ba2a796
Binary files /dev/null and b/app/img/entrance/potionShop.png differ
diff --git a/app/img/entrance/pyramidEntrance.png b/app/img/entrance/pyramidEntrance.png
new file mode 100644
index 0000000..772ca98
Binary files /dev/null and b/app/img/entrance/pyramidEntrance.png differ
diff --git a/app/img/entrance/pyramidFairy.png b/app/img/entrance/pyramidFairy.png
new file mode 100644
index 0000000..f67962d
Binary files /dev/null and b/app/img/entrance/pyramidFairy.png differ
diff --git a/app/img/entrance/pyramidHole.png b/app/img/entrance/pyramidHole.png
new file mode 100644
index 0000000..e0dff9a
Binary files /dev/null and b/app/img/entrance/pyramidHole.png differ
diff --git a/app/img/entrance/redShieldShop.png b/app/img/entrance/redShieldShop.png
new file mode 100644
index 0000000..db0b5cf
Binary files /dev/null and b/app/img/entrance/redShieldShop.png differ
diff --git a/app/img/entrance/sahasrahlasHut.png b/app/img/entrance/sahasrahlasHut.png
new file mode 100644
index 0000000..d1491f6
Binary files /dev/null and b/app/img/entrance/sahasrahlasHut.png differ
diff --git a/app/img/entrance/sanctuary.png b/app/img/entrance/sanctuary.png
new file mode 100644
index 0000000..4f86c30
Binary files /dev/null and b/app/img/entrance/sanctuary.png differ
diff --git a/app/img/entrance/sanctuaryGrave.png b/app/img/entrance/sanctuaryGrave.png
new file mode 100644
index 0000000..a6c7815
Binary files /dev/null and b/app/img/entrance/sanctuaryGrave.png differ
diff --git a/app/img/entrance/sewerDrop.png b/app/img/entrance/sewerDrop.png
new file mode 100644
index 0000000..80c8da5
Binary files /dev/null and b/app/img/entrance/sewerDrop.png differ
diff --git a/app/img/entrance/sickKidsHouse.png b/app/img/entrance/sickKidsHouse.png
new file mode 100644
index 0000000..72d45cc
Binary files /dev/null and b/app/img/entrance/sickKidsHouse.png differ
diff --git a/app/img/entrance/skullWoodsFinalSection.png b/app/img/entrance/skullWoodsFinalSection.png
new file mode 100644
index 0000000..92fd061
Binary files /dev/null and b/app/img/entrance/skullWoodsFinalSection.png differ
diff --git a/app/img/entrance/skullWoodsFirstSectionDoor.png b/app/img/entrance/skullWoodsFirstSectionDoor.png
new file mode 100644
index 0000000..b362ed8
Binary files /dev/null and b/app/img/entrance/skullWoodsFirstSectionDoor.png differ
diff --git a/app/img/entrance/skullWoodsFirstSectionHoleEast.png b/app/img/entrance/skullWoodsFirstSectionHoleEast.png
new file mode 100644
index 0000000..79a575a
Binary files /dev/null and b/app/img/entrance/skullWoodsFirstSectionHoleEast.png differ
diff --git a/app/img/entrance/skullWoodsFirstSectionHoleNorth.png b/app/img/entrance/skullWoodsFirstSectionHoleNorth.png
new file mode 100644
index 0000000..462e0f5
Binary files /dev/null and b/app/img/entrance/skullWoodsFirstSectionHoleNorth.png differ
diff --git a/app/img/entrance/skullWoodsFirstSectionHoleWest.png b/app/img/entrance/skullWoodsFirstSectionHoleWest.png
new file mode 100644
index 0000000..027ea33
Binary files /dev/null and b/app/img/entrance/skullWoodsFirstSectionHoleWest.png differ
diff --git a/app/img/entrance/skullWoodsSecondSectionDoorEast.png b/app/img/entrance/skullWoodsSecondSectionDoorEast.png
new file mode 100644
index 0000000..8bc3e15
Binary files /dev/null and b/app/img/entrance/skullWoodsSecondSectionDoorEast.png differ
diff --git a/app/img/entrance/skullWoodsSecondSectionDoorWest.png b/app/img/entrance/skullWoodsSecondSectionDoorWest.png
new file mode 100644
index 0000000..e00a30d
Binary files /dev/null and b/app/img/entrance/skullWoodsSecondSectionDoorWest.png differ
diff --git a/app/img/entrance/skullWoodsSecondSectionHole.png b/app/img/entrance/skullWoodsSecondSectionHole.png
new file mode 100644
index 0000000..5b9393a
Binary files /dev/null and b/app/img/entrance/skullWoodsSecondSectionHole.png differ
diff --git a/app/img/entrance/snitchLadyEast.png b/app/img/entrance/snitchLadyEast.png
new file mode 100644
index 0000000..6e45d34
Binary files /dev/null and b/app/img/entrance/snitchLadyEast.png differ
diff --git a/app/img/entrance/snitchLadyWest.png b/app/img/entrance/snitchLadyWest.png
new file mode 100644
index 0000000..8b219ad
Binary files /dev/null and b/app/img/entrance/snitchLadyWest.png differ
diff --git a/app/img/entrance/spectacleRockCave.png b/app/img/entrance/spectacleRockCave.png
new file mode 100644
index 0000000..1cb6c68
Binary files /dev/null and b/app/img/entrance/spectacleRockCave.png differ
diff --git a/app/img/entrance/spectacleRockCaveBottom.png b/app/img/entrance/spectacleRockCaveBottom.png
new file mode 100644
index 0000000..c5e4bb6
Binary files /dev/null and b/app/img/entrance/spectacleRockCaveBottom.png differ
diff --git a/app/img/entrance/spectacleRockCavePeak.png b/app/img/entrance/spectacleRockCavePeak.png
new file mode 100644
index 0000000..2c4d56c
Binary files /dev/null and b/app/img/entrance/spectacleRockCavePeak.png differ
diff --git a/app/img/entrance/spikeCave.png b/app/img/entrance/spikeCave.png
new file mode 100644
index 0000000..24c9bf8
Binary files /dev/null and b/app/img/entrance/spikeCave.png differ
diff --git a/app/img/entrance/spiralCave.png b/app/img/entrance/spiralCave.png
new file mode 100644
index 0000000..32de6ad
Binary files /dev/null and b/app/img/entrance/spiralCave.png differ
diff --git a/app/img/entrance/spiralCaveBottom.png b/app/img/entrance/spiralCaveBottom.png
new file mode 100644
index 0000000..a4d1438
Binary files /dev/null and b/app/img/entrance/spiralCaveBottom.png differ
diff --git a/app/img/entrance/superBunnyCaveBottom.png b/app/img/entrance/superBunnyCaveBottom.png
new file mode 100644
index 0000000..c4b61d0
Binary files /dev/null and b/app/img/entrance/superBunnyCaveBottom.png differ
diff --git a/app/img/entrance/superBunnyCaveTop.png b/app/img/entrance/superBunnyCaveTop.png
new file mode 100644
index 0000000..90ac828
Binary files /dev/null and b/app/img/entrance/superBunnyCaveTop.png differ
diff --git a/app/img/entrance/swampPalace.png b/app/img/entrance/swampPalace.png
new file mode 100644
index 0000000..905f26c
Binary files /dev/null and b/app/img/entrance/swampPalace.png differ
diff --git a/app/img/entrance/tavern.png b/app/img/entrance/tavern.png
new file mode 100644
index 0000000..db85f48
Binary files /dev/null and b/app/img/entrance/tavern.png differ
diff --git a/app/img/entrance/thievesTown.png b/app/img/entrance/thievesTown.png
new file mode 100644
index 0000000..bc9a2bf
Binary files /dev/null and b/app/img/entrance/thievesTown.png differ
diff --git a/app/img/entrance/towerOfHera.png b/app/img/entrance/towerOfHera.png
new file mode 100644
index 0000000..b576e60
Binary files /dev/null and b/app/img/entrance/towerOfHera.png differ
diff --git a/app/img/entrance/turtleRock.png b/app/img/entrance/turtleRock.png
new file mode 100644
index 0000000..229ecc0
Binary files /dev/null and b/app/img/entrance/turtleRock.png differ
diff --git a/app/img/entrance/turtleRockIsolatedLedgeEntrance.png b/app/img/entrance/turtleRockIsolatedLedgeEntrance.png
new file mode 100644
index 0000000..354a375
Binary files /dev/null and b/app/img/entrance/turtleRockIsolatedLedgeEntrance.png differ
diff --git a/app/img/entrance/twoBrothersHouse.png b/app/img/entrance/twoBrothersHouse.png
new file mode 100644
index 0000000..bd6ed73
Binary files /dev/null and b/app/img/entrance/twoBrothersHouse.png differ
diff --git a/app/img/entrance/unimportant.png b/app/img/entrance/unimportant.png
new file mode 100644
index 0000000..cbfa2d8
Binary files /dev/null and b/app/img/entrance/unimportant.png differ
diff --git a/app/img/entrance/waterfallOfWishing.png b/app/img/entrance/waterfallOfWishing.png
new file mode 100644
index 0000000..667d844
Binary files /dev/null and b/app/img/entrance/waterfallOfWishing.png differ
diff --git a/app/img/exit-link-alt.png b/app/img/exit-link-alt.png
new file mode 100644
index 0000000..9ee1d3b
Binary files /dev/null and b/app/img/exit-link-alt.png differ
diff --git a/app/img/exit-link.png b/app/img/exit-link.png
new file mode 100644
index 0000000..df22a4a
Binary files /dev/null and b/app/img/exit-link.png differ
diff --git a/app/img/exit-linked-to-alt.png b/app/img/exit-linked-to-alt.png
new file mode 100644
index 0000000..f67f227
Binary files /dev/null and b/app/img/exit-linked-to-alt.png differ
diff --git a/app/img/exit-linked-to.png b/app/img/exit-linked-to.png
new file mode 100644
index 0000000..1d79c87
Binary files /dev/null and b/app/img/exit-linked-to.png differ
diff --git a/app/img/fairy-disabled.png b/app/img/fairy-disabled.png
new file mode 100644
index 0000000..71c9c08
Binary files /dev/null and b/app/img/fairy-disabled.png differ
diff --git a/app/img/ganon-disabled.png b/app/img/ganon-disabled.png
new file mode 100644
index 0000000..921643d
Binary files /dev/null and b/app/img/ganon-disabled.png differ
diff --git a/app/img/interior/agaTower.png b/app/img/interior/agaTower.png
new file mode 100644
index 0000000..2d54ad7
Binary files /dev/null and b/app/img/interior/agaTower.png differ
diff --git a/app/img/interior/aginahsCave.png b/app/img/interior/aginahsCave.png
new file mode 100644
index 0000000..eeec2ef
Binary files /dev/null and b/app/img/interior/aginahsCave.png differ
diff --git a/app/img/interior/archeryGame.png b/app/img/interior/archeryGame.png
new file mode 100644
index 0000000..ed92c5b
Binary files /dev/null and b/app/img/interior/archeryGame.png differ
diff --git a/app/img/interior/batCaveCave.png b/app/img/interior/batCaveCave.png
new file mode 100644
index 0000000..f156911
Binary files /dev/null and b/app/img/interior/batCaveCave.png differ
diff --git a/app/img/interior/batCaveDrop.png b/app/img/interior/batCaveDrop.png
new file mode 100644
index 0000000..79198ab
Binary files /dev/null and b/app/img/interior/batCaveDrop.png differ
diff --git a/app/img/interior/bigBombShop.png b/app/img/interior/bigBombShop.png
new file mode 100644
index 0000000..9989e7b
Binary files /dev/null and b/app/img/interior/bigBombShop.png differ
diff --git a/app/img/interior/blacksmithsHut.png b/app/img/interior/blacksmithsHut.png
new file mode 100644
index 0000000..7914792
Binary files /dev/null and b/app/img/interior/blacksmithsHut.png differ
diff --git a/app/img/interior/blindsHideout.png b/app/img/interior/blindsHideout.png
new file mode 100644
index 0000000..4ec0d7a
Binary files /dev/null and b/app/img/interior/blindsHideout.png differ
diff --git a/app/img/interior/bonkFairyLight.png b/app/img/interior/bonkFairyLight.png
new file mode 100644
index 0000000..552f32a
Binary files /dev/null and b/app/img/interior/bonkFairyLight.png differ
diff --git a/app/img/interior/bonkRockCave.png b/app/img/interior/bonkRockCave.png
new file mode 100644
index 0000000..bbe952a
Binary files /dev/null and b/app/img/interior/bonkRockCave.png differ
diff --git a/app/img/interior/brewery.png b/app/img/interior/brewery.png
new file mode 100644
index 0000000..3e6c40d
Binary files /dev/null and b/app/img/interior/brewery.png differ
diff --git a/app/img/interior/bumperCaveBottom.png b/app/img/interior/bumperCaveBottom.png
new file mode 100644
index 0000000..8b07421
Binary files /dev/null and b/app/img/interior/bumperCaveBottom.png differ
diff --git a/app/img/interior/bumperCaveTop.png b/app/img/interior/bumperCaveTop.png
new file mode 100644
index 0000000..616e393
Binary files /dev/null and b/app/img/interior/bumperCaveTop.png differ
diff --git a/app/img/interior/bushCoveredHouse.png b/app/img/interior/bushCoveredHouse.png
new file mode 100644
index 0000000..85d7a8c
Binary files /dev/null and b/app/img/interior/bushCoveredHouse.png differ
diff --git a/app/img/interior/cShapedHouse.png b/app/img/interior/cShapedHouse.png
new file mode 100644
index 0000000..dd685a8
Binary files /dev/null and b/app/img/interior/cShapedHouse.png differ
diff --git a/app/img/interior/capacityUpgrade.png b/app/img/interior/capacityUpgrade.png
new file mode 100644
index 0000000..d385a38
Binary files /dev/null and b/app/img/interior/capacityUpgrade.png differ
diff --git a/app/img/interior/cave45.png b/app/img/interior/cave45.png
new file mode 100644
index 0000000..791a63c
Binary files /dev/null and b/app/img/interior/cave45.png differ
diff --git a/app/img/interior/caveShopDarkDeathMtn.png b/app/img/interior/caveShopDarkDeathMtn.png
new file mode 100644
index 0000000..58aa6a4
Binary files /dev/null and b/app/img/interior/caveShopDarkDeathMtn.png differ
diff --git a/app/img/interior/caveShopLakeHylia.png b/app/img/interior/caveShopLakeHylia.png
new file mode 100644
index 0000000..d612546
Binary files /dev/null and b/app/img/interior/caveShopLakeHylia.png differ
diff --git a/app/img/interior/checkerboardCave.png b/app/img/interior/checkerboardCave.png
new file mode 100644
index 0000000..73981f3
Binary files /dev/null and b/app/img/interior/checkerboardCave.png differ
diff --git a/app/img/interior/chestGame.png b/app/img/interior/chestGame.png
new file mode 100644
index 0000000..c90204d
Binary files /dev/null and b/app/img/interior/chestGame.png differ
diff --git a/app/img/interior/chickenHut.png b/app/img/interior/chickenHut.png
new file mode 100644
index 0000000..960acfd
Binary files /dev/null and b/app/img/interior/chickenHut.png differ
diff --git a/app/img/interior/dam.png b/app/img/interior/dam.png
new file mode 100644
index 0000000..7b5ebf4
Binary files /dev/null and b/app/img/interior/dam.png differ
diff --git a/app/img/interior/darkCave.png b/app/img/interior/darkCave.png
new file mode 100644
index 0000000..e9bacf9
Binary files /dev/null and b/app/img/interior/darkCave.png differ
diff --git a/app/img/interior/darkDeathMtnLedgeEast.png b/app/img/interior/darkDeathMtnLedgeEast.png
new file mode 100644
index 0000000..2ceafdd
Binary files /dev/null and b/app/img/interior/darkDeathMtnLedgeEast.png differ
diff --git a/app/img/interior/darkDeathMtnLedgeWest.png b/app/img/interior/darkDeathMtnLedgeWest.png
new file mode 100644
index 0000000..d3cd564
Binary files /dev/null and b/app/img/interior/darkDeathMtnLedgeWest.png differ
diff --git a/app/img/interior/darkLakeHyliaLedgeHint.png b/app/img/interior/darkLakeHyliaLedgeHint.png
new file mode 100644
index 0000000..82be725
Binary files /dev/null and b/app/img/interior/darkLakeHyliaLedgeHint.png differ
diff --git a/app/img/interior/darkLakeHyliaSpikeCave.png b/app/img/interior/darkLakeHyliaSpikeCave.png
new file mode 100644
index 0000000..d7eed69
Binary files /dev/null and b/app/img/interior/darkLakeHyliaSpikeCave.png differ
diff --git a/app/img/interior/darkSanctuaryHint.png b/app/img/interior/darkSanctuaryHint.png
new file mode 100644
index 0000000..f1fbab4
Binary files /dev/null and b/app/img/interior/darkSanctuaryHint.png differ
diff --git a/app/img/interior/darkWorldHammerPegCave.png b/app/img/interior/darkWorldHammerPegCave.png
new file mode 100644
index 0000000..4fd76e6
Binary files /dev/null and b/app/img/interior/darkWorldHammerPegCave.png differ
diff --git a/app/img/interior/darkWorldLumberjackShop.png b/app/img/interior/darkWorldLumberjackShop.png
new file mode 100644
index 0000000..91a8ce6
Binary files /dev/null and b/app/img/interior/darkWorldLumberjackShop.png differ
diff --git a/app/img/interior/darkWorldPotionShop.png b/app/img/interior/darkWorldPotionShop.png
new file mode 100644
index 0000000..379a229
Binary files /dev/null and b/app/img/interior/darkWorldPotionShop.png differ
diff --git a/app/img/interior/darkWorldShop.png b/app/img/interior/darkWorldShop.png
new file mode 100644
index 0000000..382ae94
Binary files /dev/null and b/app/img/interior/darkWorldShop.png differ
diff --git a/app/img/interior/deathMtnReturnCaveEast.png b/app/img/interior/deathMtnReturnCaveEast.png
new file mode 100644
index 0000000..05f8c95
Binary files /dev/null and b/app/img/interior/deathMtnReturnCaveEast.png differ
diff --git a/app/img/interior/deathMtnReturnCaveWest.png b/app/img/interior/deathMtnReturnCaveWest.png
new file mode 100644
index 0000000..919a43d
Binary files /dev/null and b/app/img/interior/deathMtnReturnCaveWest.png differ
diff --git a/app/img/interior/desertPalaceEast.png b/app/img/interior/desertPalaceEast.png
new file mode 100644
index 0000000..dcb970e
Binary files /dev/null and b/app/img/interior/desertPalaceEast.png differ
diff --git a/app/img/interior/desertPalaceNorth.png b/app/img/interior/desertPalaceNorth.png
new file mode 100644
index 0000000..1326b74
Binary files /dev/null and b/app/img/interior/desertPalaceNorth.png differ
diff --git a/app/img/interior/desertPalaceSouth.png b/app/img/interior/desertPalaceSouth.png
new file mode 100644
index 0000000..c36c8cb
Binary files /dev/null and b/app/img/interior/desertPalaceSouth.png differ
diff --git a/app/img/interior/desertPalaceWest.png b/app/img/interior/desertPalaceWest.png
new file mode 100644
index 0000000..9745a11
Binary files /dev/null and b/app/img/interior/desertPalaceWest.png differ
diff --git a/app/img/interior/eastDarkWorldHint.png b/app/img/interior/eastDarkWorldHint.png
new file mode 100644
index 0000000..9eb816c
Binary files /dev/null and b/app/img/interior/eastDarkWorldHint.png differ
diff --git a/app/img/interior/easternPalace.png b/app/img/interior/easternPalace.png
new file mode 100644
index 0000000..03b785b
Binary files /dev/null and b/app/img/interior/easternPalace.png differ
diff --git a/app/img/interior/elderHouseEast.png b/app/img/interior/elderHouseEast.png
new file mode 100644
index 0000000..c705ad5
Binary files /dev/null and b/app/img/interior/elderHouseEast.png differ
diff --git a/app/img/interior/elderHouseWest.png b/app/img/interior/elderHouseWest.png
new file mode 100644
index 0000000..424ee61
Binary files /dev/null and b/app/img/interior/elderHouseWest.png differ
diff --git a/app/img/interior/fairyAscensionCaveBottom.png b/app/img/interior/fairyAscensionCaveBottom.png
new file mode 100644
index 0000000..801c9d5
Binary files /dev/null and b/app/img/interior/fairyAscensionCaveBottom.png differ
diff --git a/app/img/interior/fairyAscensionCaveTop.png b/app/img/interior/fairyAscensionCaveTop.png
new file mode 100644
index 0000000..27afea8
Binary files /dev/null and b/app/img/interior/fairyAscensionCaveTop.png differ
diff --git a/app/img/interior/fiftyRupeeCave.png b/app/img/interior/fiftyRupeeCave.png
new file mode 100644
index 0000000..acf8dcb
Binary files /dev/null and b/app/img/interior/fiftyRupeeCave.png differ
diff --git a/app/img/interior/fortuneTellerDark.png b/app/img/interior/fortuneTellerDark.png
new file mode 100644
index 0000000..906a9d5
Binary files /dev/null and b/app/img/interior/fortuneTellerDark.png differ
diff --git a/app/img/interior/fortuneTellerLight.png b/app/img/interior/fortuneTellerLight.png
new file mode 100644
index 0000000..6571573
Binary files /dev/null and b/app/img/interior/fortuneTellerLight.png differ
diff --git a/app/img/interior/ganonTower.png b/app/img/interior/ganonTower.png
new file mode 100644
index 0000000..ec38c9e
Binary files /dev/null and b/app/img/interior/ganonTower.png differ
diff --git a/app/img/interior/graveyardCave.png b/app/img/interior/graveyardCave.png
new file mode 100644
index 0000000..25d1fbb
Binary files /dev/null and b/app/img/interior/graveyardCave.png differ
diff --git a/app/img/interior/hookshotCave.png b/app/img/interior/hookshotCave.png
new file mode 100644
index 0000000..dddc4a2
Binary files /dev/null and b/app/img/interior/hookshotCave.png differ
diff --git a/app/img/interior/hookshotCaveBackEntrance.png b/app/img/interior/hookshotCaveBackEntrance.png
new file mode 100644
index 0000000..1c87ca5
Binary files /dev/null and b/app/img/interior/hookshotCaveBackEntrance.png differ
diff --git a/app/img/interior/hookshotFairy.png b/app/img/interior/hookshotFairy.png
new file mode 100644
index 0000000..69bde49
Binary files /dev/null and b/app/img/interior/hookshotFairy.png differ
diff --git a/app/img/interior/hypeCave.png b/app/img/interior/hypeCave.png
new file mode 100644
index 0000000..e927a5a
Binary files /dev/null and b/app/img/interior/hypeCave.png differ
diff --git a/app/img/interior/hyruleCastleEast.png b/app/img/interior/hyruleCastleEast.png
new file mode 100644
index 0000000..d4e44f7
Binary files /dev/null and b/app/img/interior/hyruleCastleEast.png differ
diff --git a/app/img/interior/hyruleCastleSecretEntranceDrop.png b/app/img/interior/hyruleCastleSecretEntranceDrop.png
new file mode 100644
index 0000000..5b65475
Binary files /dev/null and b/app/img/interior/hyruleCastleSecretEntranceDrop.png differ
diff --git a/app/img/interior/hyruleCastleSecretEntranceStairs.png b/app/img/interior/hyruleCastleSecretEntranceStairs.png
new file mode 100644
index 0000000..d8c8b25
Binary files /dev/null and b/app/img/interior/hyruleCastleSecretEntranceStairs.png differ
diff --git a/app/img/interior/hyruleCastleSouth.png b/app/img/interior/hyruleCastleSouth.png
new file mode 100644
index 0000000..2717800
Binary files /dev/null and b/app/img/interior/hyruleCastleSouth.png differ
diff --git a/app/img/interior/hyruleCastleWest.png b/app/img/interior/hyruleCastleWest.png
new file mode 100644
index 0000000..64bdaa7
Binary files /dev/null and b/app/img/interior/hyruleCastleWest.png differ
diff --git a/app/img/interior/icePalace.png b/app/img/interior/icePalace.png
new file mode 100644
index 0000000..60a25e7
Binary files /dev/null and b/app/img/interior/icePalace.png differ
diff --git a/app/img/interior/iceRodCave.png b/app/img/interior/iceRodCave.png
new file mode 100644
index 0000000..1c4b59e
Binary files /dev/null and b/app/img/interior/iceRodCave.png differ
diff --git a/app/img/interior/junkCave.png b/app/img/interior/junkCave.png
new file mode 100644
index 0000000..d304dfa
Binary files /dev/null and b/app/img/interior/junkCave.png differ
diff --git a/app/img/interior/kakarikoGambleGame.png b/app/img/interior/kakarikoGambleGame.png
new file mode 100644
index 0000000..f3c2fda
Binary files /dev/null and b/app/img/interior/kakarikoGambleGame.png differ
diff --git a/app/img/interior/kakarikoShop.png b/app/img/interior/kakarikoShop.png
new file mode 100644
index 0000000..23c337d
Binary files /dev/null and b/app/img/interior/kakarikoShop.png differ
diff --git a/app/img/interior/kakarikoWellCave.png b/app/img/interior/kakarikoWellCave.png
new file mode 100644
index 0000000..66e6de0
Binary files /dev/null and b/app/img/interior/kakarikoWellCave.png differ
diff --git a/app/img/interior/kakarikoWellDrop.png b/app/img/interior/kakarikoWellDrop.png
new file mode 100644
index 0000000..867dc11
Binary files /dev/null and b/app/img/interior/kakarikoWellDrop.png differ
diff --git a/app/img/interior/kingsGrave.png b/app/img/interior/kingsGrave.png
new file mode 100644
index 0000000..e2c3775
Binary files /dev/null and b/app/img/interior/kingsGrave.png differ
diff --git a/app/img/interior/library.png b/app/img/interior/library.png
new file mode 100644
index 0000000..dce5745
Binary files /dev/null and b/app/img/interior/library.png differ
diff --git a/app/img/interior/lightWorldBombHut.png b/app/img/interior/lightWorldBombHut.png
new file mode 100644
index 0000000..1dde570
Binary files /dev/null and b/app/img/interior/lightWorldBombHut.png differ
diff --git a/app/img/interior/linksHouse.png b/app/img/interior/linksHouse.png
new file mode 100644
index 0000000..3859307
Binary files /dev/null and b/app/img/interior/linksHouse.png differ
diff --git a/app/img/interior/longFairyCave.png b/app/img/interior/longFairyCave.png
new file mode 100644
index 0000000..1e29d37
Binary files /dev/null and b/app/img/interior/longFairyCave.png differ
diff --git a/app/img/interior/lostWoodsGamble.png b/app/img/interior/lostWoodsGamble.png
new file mode 100644
index 0000000..c256d6c
Binary files /dev/null and b/app/img/interior/lostWoodsGamble.png differ
diff --git a/app/img/interior/lostWoodsHideoutDrop.png b/app/img/interior/lostWoodsHideoutDrop.png
new file mode 100644
index 0000000..893427c
Binary files /dev/null and b/app/img/interior/lostWoodsHideoutDrop.png differ
diff --git a/app/img/interior/lostWoodsHideoutStump.png b/app/img/interior/lostWoodsHideoutStump.png
new file mode 100644
index 0000000..964d8db
Binary files /dev/null and b/app/img/interior/lostWoodsHideoutStump.png differ
diff --git a/app/img/interior/lumberjackHouse.png b/app/img/interior/lumberjackHouse.png
new file mode 100644
index 0000000..cd9d0d9
Binary files /dev/null and b/app/img/interior/lumberjackHouse.png differ
diff --git a/app/img/interior/lumberjackTreeCave.png b/app/img/interior/lumberjackTreeCave.png
new file mode 100644
index 0000000..45c4dff
Binary files /dev/null and b/app/img/interior/lumberjackTreeCave.png differ
diff --git a/app/img/interior/lumberjackTreeTree.png b/app/img/interior/lumberjackTreeTree.png
new file mode 100644
index 0000000..f802894
Binary files /dev/null and b/app/img/interior/lumberjackTreeTree.png differ
diff --git a/app/img/interior/mimicCave.png b/app/img/interior/mimicCave.png
new file mode 100644
index 0000000..c360b20
Binary files /dev/null and b/app/img/interior/mimicCave.png differ
diff --git a/app/img/interior/miniMoldormCave.png b/app/img/interior/miniMoldormCave.png
new file mode 100644
index 0000000..f30d5ae
Binary files /dev/null and b/app/img/interior/miniMoldormCave.png differ
diff --git a/app/img/interior/mireHint.png b/app/img/interior/mireHint.png
new file mode 100644
index 0000000..cbcc74d
Binary files /dev/null and b/app/img/interior/mireHint.png differ
diff --git a/app/img/interior/mireShed.png b/app/img/interior/mireShed.png
new file mode 100644
index 0000000..5967483
Binary files /dev/null and b/app/img/interior/mireShed.png differ
diff --git a/app/img/interior/miseryMire.png b/app/img/interior/miseryMire.png
new file mode 100644
index 0000000..8588f4d
Binary files /dev/null and b/app/img/interior/miseryMire.png differ
diff --git a/app/img/interior/northFairyCave.png b/app/img/interior/northFairyCave.png
new file mode 100644
index 0000000..5705408
Binary files /dev/null and b/app/img/interior/northFairyCave.png differ
diff --git a/app/img/interior/northFairyCaveDrop.png b/app/img/interior/northFairyCaveDrop.png
new file mode 100644
index 0000000..0230489
Binary files /dev/null and b/app/img/interior/northFairyCaveDrop.png differ
diff --git a/app/img/interior/oldManCaveEast.png b/app/img/interior/oldManCaveEast.png
new file mode 100644
index 0000000..710db76
Binary files /dev/null and b/app/img/interior/oldManCaveEast.png differ
diff --git a/app/img/interior/oldManCaveWest.png b/app/img/interior/oldManCaveWest.png
new file mode 100644
index 0000000..abaa862
Binary files /dev/null and b/app/img/interior/oldManCaveWest.png differ
diff --git a/app/img/interior/oldManHouseBottom.png b/app/img/interior/oldManHouseBottom.png
new file mode 100644
index 0000000..22cbc32
Binary files /dev/null and b/app/img/interior/oldManHouseBottom.png differ
diff --git a/app/img/interior/oldManHouseTop.png b/app/img/interior/oldManHouseTop.png
new file mode 100644
index 0000000..d2d1de5
Binary files /dev/null and b/app/img/interior/oldManHouseTop.png differ
diff --git a/app/img/interior/palaceOfDarkness.png b/app/img/interior/palaceOfDarkness.png
new file mode 100644
index 0000000..5845c9d
Binary files /dev/null and b/app/img/interior/palaceOfDarkness.png differ
diff --git a/app/img/interior/palaceOfDarknessHint.png b/app/img/interior/palaceOfDarknessHint.png
new file mode 100644
index 0000000..2511cc2
Binary files /dev/null and b/app/img/interior/palaceOfDarknessHint.png differ
diff --git a/app/img/interior/paradoxCaveBottom.png b/app/img/interior/paradoxCaveBottom.png
new file mode 100644
index 0000000..5bb447e
Binary files /dev/null and b/app/img/interior/paradoxCaveBottom.png differ
diff --git a/app/img/interior/paradoxCaveMiddle.png b/app/img/interior/paradoxCaveMiddle.png
new file mode 100644
index 0000000..a122607
Binary files /dev/null and b/app/img/interior/paradoxCaveMiddle.png differ
diff --git a/app/img/interior/paradoxCaveTop.png b/app/img/interior/paradoxCaveTop.png
new file mode 100644
index 0000000..6e32287
Binary files /dev/null and b/app/img/interior/paradoxCaveTop.png differ
diff --git a/app/img/interior/potionShop.png b/app/img/interior/potionShop.png
new file mode 100644
index 0000000..5de4e8b
Binary files /dev/null and b/app/img/interior/potionShop.png differ
diff --git a/app/img/interior/pyramidEntrance.png b/app/img/interior/pyramidEntrance.png
new file mode 100644
index 0000000..8cac3e7
Binary files /dev/null and b/app/img/interior/pyramidEntrance.png differ
diff --git a/app/img/interior/pyramidFairy.png b/app/img/interior/pyramidFairy.png
new file mode 100644
index 0000000..1e0241f
Binary files /dev/null and b/app/img/interior/pyramidFairy.png differ
diff --git a/app/img/interior/pyramidHole.png b/app/img/interior/pyramidHole.png
new file mode 100644
index 0000000..17e78f2
Binary files /dev/null and b/app/img/interior/pyramidHole.png differ
diff --git a/app/img/interior/redShieldShop.png b/app/img/interior/redShieldShop.png
new file mode 100644
index 0000000..f0fece9
Binary files /dev/null and b/app/img/interior/redShieldShop.png differ
diff --git a/app/img/interior/sahasrahlasHut.png b/app/img/interior/sahasrahlasHut.png
new file mode 100644
index 0000000..67872dd
Binary files /dev/null and b/app/img/interior/sahasrahlasHut.png differ
diff --git a/app/img/interior/sanctuary.png b/app/img/interior/sanctuary.png
new file mode 100644
index 0000000..c76cecd
Binary files /dev/null and b/app/img/interior/sanctuary.png differ
diff --git a/app/img/interior/sanctuaryGrave.png b/app/img/interior/sanctuaryGrave.png
new file mode 100644
index 0000000..a3e1f55
Binary files /dev/null and b/app/img/interior/sanctuaryGrave.png differ
diff --git a/app/img/interior/sickKidsHouse.png b/app/img/interior/sickKidsHouse.png
new file mode 100644
index 0000000..cb2e0f7
Binary files /dev/null and b/app/img/interior/sickKidsHouse.png differ
diff --git a/app/img/interior/singleFairyCave.png b/app/img/interior/singleFairyCave.png
new file mode 100644
index 0000000..a9f3c40
Binary files /dev/null and b/app/img/interior/singleFairyCave.png differ
diff --git a/app/img/interior/skullWoodsFinalSection.png b/app/img/interior/skullWoodsFinalSection.png
new file mode 100644
index 0000000..940f304
Binary files /dev/null and b/app/img/interior/skullWoodsFinalSection.png differ
diff --git a/app/img/interior/skullWoodsFirstSectionDoor.png b/app/img/interior/skullWoodsFirstSectionDoor.png
new file mode 100644
index 0000000..4312d4b
Binary files /dev/null and b/app/img/interior/skullWoodsFirstSectionDoor.png differ
diff --git a/app/img/interior/skullWoodsFirstSectionHoleEast.png b/app/img/interior/skullWoodsFirstSectionHoleEast.png
new file mode 100644
index 0000000..2178442
Binary files /dev/null and b/app/img/interior/skullWoodsFirstSectionHoleEast.png differ
diff --git a/app/img/interior/skullWoodsFirstSectionHoleNorth.png b/app/img/interior/skullWoodsFirstSectionHoleNorth.png
new file mode 100644
index 0000000..12094b9
Binary files /dev/null and b/app/img/interior/skullWoodsFirstSectionHoleNorth.png differ
diff --git a/app/img/interior/skullWoodsFirstSectionHoleWest.png b/app/img/interior/skullWoodsFirstSectionHoleWest.png
new file mode 100644
index 0000000..6be8ff5
Binary files /dev/null and b/app/img/interior/skullWoodsFirstSectionHoleWest.png differ
diff --git a/app/img/interior/skullWoodsSecondSectionDoorEast.png b/app/img/interior/skullWoodsSecondSectionDoorEast.png
new file mode 100644
index 0000000..ce08345
Binary files /dev/null and b/app/img/interior/skullWoodsSecondSectionDoorEast.png differ
diff --git a/app/img/interior/skullWoodsSecondSectionDoorWest.png b/app/img/interior/skullWoodsSecondSectionDoorWest.png
new file mode 100644
index 0000000..b360a0b
Binary files /dev/null and b/app/img/interior/skullWoodsSecondSectionDoorWest.png differ
diff --git a/app/img/interior/skullWoodsSecondSectionHole.png b/app/img/interior/skullWoodsSecondSectionHole.png
new file mode 100644
index 0000000..5cd42d1
Binary files /dev/null and b/app/img/interior/skullWoodsSecondSectionHole.png differ
diff --git a/app/img/interior/snitchLadyEast.png b/app/img/interior/snitchLadyEast.png
new file mode 100644
index 0000000..69b8d51
Binary files /dev/null and b/app/img/interior/snitchLadyEast.png differ
diff --git a/app/img/interior/snitchLadyWest.png b/app/img/interior/snitchLadyWest.png
new file mode 100644
index 0000000..72a9072
Binary files /dev/null and b/app/img/interior/snitchLadyWest.png differ
diff --git a/app/img/interior/spectacleRockCave.png b/app/img/interior/spectacleRockCave.png
new file mode 100644
index 0000000..d9e8b72
Binary files /dev/null and b/app/img/interior/spectacleRockCave.png differ
diff --git a/app/img/interior/spectacleRockCaveBottom.png b/app/img/interior/spectacleRockCaveBottom.png
new file mode 100644
index 0000000..b7efc5e
Binary files /dev/null and b/app/img/interior/spectacleRockCaveBottom.png differ
diff --git a/app/img/interior/spectacleRockCavePeak.png b/app/img/interior/spectacleRockCavePeak.png
new file mode 100644
index 0000000..426ea5f
Binary files /dev/null and b/app/img/interior/spectacleRockCavePeak.png differ
diff --git a/app/img/interior/spikeCave.png b/app/img/interior/spikeCave.png
new file mode 100644
index 0000000..1c24b3a
Binary files /dev/null and b/app/img/interior/spikeCave.png differ
diff --git a/app/img/interior/spiralCave.png b/app/img/interior/spiralCave.png
new file mode 100644
index 0000000..4688444
Binary files /dev/null and b/app/img/interior/spiralCave.png differ
diff --git a/app/img/interior/spiralCaveBottom.png b/app/img/interior/spiralCaveBottom.png
new file mode 100644
index 0000000..7abef14
Binary files /dev/null and b/app/img/interior/spiralCaveBottom.png differ
diff --git a/app/img/interior/superBunnyCaveBottom.png b/app/img/interior/superBunnyCaveBottom.png
new file mode 100644
index 0000000..438c8e9
Binary files /dev/null and b/app/img/interior/superBunnyCaveBottom.png differ
diff --git a/app/img/interior/superBunnyCaveTop.png b/app/img/interior/superBunnyCaveTop.png
new file mode 100644
index 0000000..eedcc1d
Binary files /dev/null and b/app/img/interior/superBunnyCaveTop.png differ
diff --git a/app/img/interior/swampPalace.png b/app/img/interior/swampPalace.png
new file mode 100644
index 0000000..af2d97e
Binary files /dev/null and b/app/img/interior/swampPalace.png differ
diff --git a/app/img/interior/tavern.png b/app/img/interior/tavern.png
new file mode 100644
index 0000000..24d729d
Binary files /dev/null and b/app/img/interior/tavern.png differ
diff --git a/app/img/interior/thievesTown.png b/app/img/interior/thievesTown.png
new file mode 100644
index 0000000..40c53b8
Binary files /dev/null and b/app/img/interior/thievesTown.png differ
diff --git a/app/img/interior/towerOfHera.png b/app/img/interior/towerOfHera.png
new file mode 100644
index 0000000..6148f78
Binary files /dev/null and b/app/img/interior/towerOfHera.png differ
diff --git a/app/img/interior/turtleRock.png b/app/img/interior/turtleRock.png
new file mode 100644
index 0000000..5e4e7bd
Binary files /dev/null and b/app/img/interior/turtleRock.png differ
diff --git a/app/img/interior/turtleRockIsolatedLedgeEntrance.png b/app/img/interior/turtleRockIsolatedLedgeEntrance.png
new file mode 100644
index 0000000..d778b67
Binary files /dev/null and b/app/img/interior/turtleRockIsolatedLedgeEntrance.png differ
diff --git a/app/img/interior/twentyRupeeCave.png b/app/img/interior/twentyRupeeCave.png
new file mode 100644
index 0000000..1284936
Binary files /dev/null and b/app/img/interior/twentyRupeeCave.png differ
diff --git a/app/img/interior/twoBrothersHouseEast.png b/app/img/interior/twoBrothersHouseEast.png
new file mode 100644
index 0000000..04557db
Binary files /dev/null and b/app/img/interior/twoBrothersHouseEast.png differ
diff --git a/app/img/interior/twoBrothersHouseWest.png b/app/img/interior/twoBrothersHouseWest.png
new file mode 100644
index 0000000..3330ec2
Binary files /dev/null and b/app/img/interior/twoBrothersHouseWest.png differ
diff --git a/app/img/interior/waterfallOfWishing.png b/app/img/interior/waterfallOfWishing.png
new file mode 100644
index 0000000..3e4d5d1
Binary files /dev/null and b/app/img/interior/waterfallOfWishing.png differ
diff --git a/app/img/shop-disabled.png b/app/img/shop-disabled.png
new file mode 100644
index 0000000..d1b60b3
Binary files /dev/null and b/app/img/shop-disabled.png differ
diff --git a/app/img/tiny-dn.png b/app/img/tiny-dn.png
new file mode 100644
index 0000000..a8eec54
Binary files /dev/null and b/app/img/tiny-dn.png differ
diff --git a/app/img/tiny-up.png b/app/img/tiny-up.png
new file mode 100644
index 0000000..4046e17
Binary files /dev/null and b/app/img/tiny-up.png differ
diff --git a/app/inverted/InvertedStaticMapDW.ts b/app/inverted/InvertedStaticMapDW.ts
index 75228e4..6423ddd 100644
--- a/app/inverted/InvertedStaticMapDW.ts
+++ b/app/inverted/InvertedStaticMapDW.ts
@@ -5,6 +5,9 @@ export class InvertedStaticMapDW {
req:[[InvertedRegionHelper.reqDeathMtnEastDW]],
validate(items, dungeons){
return InvertedRegionHelper.deathMtnEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hookshotCave = {x: 1247, y: 99, title: 'Hookshot Cave', itemCount: 4,
req:[
@@ -13,6 +16,9 @@ export class InvertedStaticMapDW {
],
validate(items, dungeons){
return (items.hookshot || items.boots) && InvertedRegionHelper.deathMtnEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spikeCave = {x: 862, y: 221, title: 'Spike Cave', itemCount: 1,
req:[
@@ -25,20 +31,32 @@ export class InvertedStaticMapDW {
return (items.jar > 0 || items.halfmagic) && items.hammer
&& items.glove>0 && (items.cape || items.bluecane)
&& InvertedRegionHelper.deathMtnWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
catfish = {x: 1341, y: 257, title: 'Catfish', itemCount: 1,
req:[['items/glove1', InvertedRegionHelper.reqNorthEastDW]],
validate(items, dungeons){
return items.glove > 0 && InvertedRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
linkHouse = {x:820, y:1037, title:'Link\'s House', itemCount: 1,
req:[], validate(items, dungeons) {
return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pyramid = {x: 870, y: 670, title: 'Pyramid', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthEastDW]],
validate(items, dungeons){
return InvertedRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pyramidFairy = {x: 703, y: 733, title: 'Pyramid Fairy', itemCount: 2,
req:[['dungeons/crystal4~', 'dungeons/crystal4', 'items/mirror1', InvertedRegionHelper.reqNorthEastDW]],
@@ -51,21 +69,33 @@ export class InvertedStaticMapDW {
}
}
return c === 2 && items.mirror && InvertedRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
brewery = {x: 163, y: 878, title: 'Brewery', itemCount: 1,
req:[['items/bombs1']],
validate(items, dungeons){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
cShapeHouse = {x: 310, y: 726, title: 'C-Shaped House', itemCount: 1,
req:[],
validate(items, dungeons){
return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
chestGame = {x: 76, y: 702, title: 'Chest Game', itemCount: 1,
req:[],
validate(items, dungeons){
return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hammerPegs = {x: 474, y: 908, title: 'Hammer Pegs', itemCount: 1,
req:[
@@ -75,6 +105,9 @@ export class InvertedStaticMapDW {
validate(items, dungeons){
return items.hammer && (items.glove === 2
|| (items.mirror && InvertedRegionHelper.northWestLW(items, dungeons)));
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
oldMan = {x: 532, y: 268, title: 'Rescue Old Man', itemCount: 1,
req:[
@@ -85,6 +118,9 @@ export class InvertedStaticMapDW {
return items.lantern
&& ((items.glove > 0 && InvertedRegionHelper.northWestDW(items, dungeons))
|| InvertedRegionHelper.deathMtnWestDW(items, dungeons));
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
blacksmith = {x: 223, y: 994, title: 'Blacksmith', itemCount: 1,
req:[
@@ -93,6 +129,9 @@ export class InvertedStaticMapDW {
],
validate(items, dungeons) {
return (items.glove === 2 || items.mirror) && InvertedRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
purpleChest = {x: 457, y: 802, title: 'Purple Chest', itemCount: 1,
@@ -103,25 +142,40 @@ export class InvertedStaticMapDW {
validate(items, dungeons){
return ((items.glove === 2 || items.mirror) && InvertedRegionHelper.northWestLW(items, dungeons))
&& InvertedRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hypeCave = {x: 896, y: 1168, title: 'Hype Cave', itemCount: 5,
req:[['items/bombs1']],
validate(items, dungeons){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
stumpy = {x: 463, y: 1024, title: 'Stumpy', itemCount: 1,
req:[],
validate(items, dungeons){
return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
diggingGame = {x: 85, y: 1043, title: 'Digging Game', itemCount: 1,
req:[],
validate(items, dungeons){
return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
mireShed = {x: 59, y: 1205, title: 'Mire Shed', itemCount: 2,
req:[[InvertedRegionHelper.reqMireDW]],
validate(items, dungeons){
return InvertedRegionHelper.mireDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
}
diff --git a/app/inverted/InvertedStaticMapDungeonsDW.ts b/app/inverted/InvertedStaticMapDungeonsDW.ts
index c466fda..cc93534 100644
--- a/app/inverted/InvertedStaticMapDungeonsDW.ts
+++ b/app/inverted/InvertedStaticMapDungeonsDW.ts
@@ -8,6 +8,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.hammer && items.bow > 0 && items.lantern && InvertedRegionHelper.northEastDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[InvertedRegionHelper.reqNorthEastDW]],
reqBoss:[['items/hammer1', 'items/bow1', 'items/lantern1', InvertedRegionHelper.reqNorthEastDW]]
}; // palace of darkness
@@ -18,6 +24,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.flippers && items.moonpearl && items.mirror && items.hookshot && items.hammer && InvertedRegionHelper.southDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/flippers1', 'items/moonpearl1', 'items/mirror1']],
reqBoss:[['items/flippers1', 'items/moonpearl1', 'items/mirror1', 'items/hookshot1', 'items/hammer1']]
}; // swamp palace
@@ -28,6 +40,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.firerod && InvertedRegionHelper.northWestDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[],
reqBoss:[['items/firerod1']]
}; // skull woods
@@ -38,6 +56,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return InvertedRegionHelper.northWestDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[],
reqBoss:[]
}; // thieves town
@@ -48,6 +72,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.hammer && items.glove > 0 && (items.firerod || items.bombos) && items.flippers && InvertedRegionHelper.southDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[
['items/flippers1', 'items/firerod1'],
['items/flippers1', 'items/bombos1']
@@ -64,6 +94,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.redcane && items.lantern && InvertedRegionHelper.mm(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[InvertedRegionHelper.reqMm]],
reqBoss:[['items/redcane1', 'items/lantern1', InvertedRegionHelper.reqMm]]
}; // misery mire
@@ -74,6 +110,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.firerod && items.icerod && InvertedRegionHelper.tr(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[InvertedRegionHelper.reqTr]],
reqBoss:[['items/firerod1', 'items/icerod1', InvertedRegionHelper.reqTr]]
}; // turtle rock
@@ -84,6 +126,12 @@ export class InvertedStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.lantern && (items.sword > 0 || items.net) && InvertedRegionHelper.deathMtnEastDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[InvertedRegionHelper.reqDeathMtnEastDW]],
reqBoss:[
['items/lantern1', InvertedRegionHelper.reqDeathMtnEastDW, 'items/sword1'],
diff --git a/app/inverted/InvertedStaticMapDungeonsLW.ts b/app/inverted/InvertedStaticMapDungeonsLW.ts
index 1e3a4cd..5311bca 100644
--- a/app/inverted/InvertedStaticMapDungeonsLW.ts
+++ b/app/inverted/InvertedStaticMapDungeonsLW.ts
@@ -9,6 +9,12 @@ export class InvertedStaticMapDungeonsLW {
return items.moonpearl && InvertedRegionHelper.northEastLW(items, dungeons)
&& items.bow > 0 && (items.lantern || items.firerod);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/moonpearl1', InvertedRegionHelper.reqNorthEastLW]],
reqBoss:[
['items/moonpearl1', InvertedRegionHelper.reqNorthEastLW, 'items/bow1', 'items/lantern1'],
@@ -24,6 +30,12 @@ export class InvertedStaticMapDungeonsLW {
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.book
&& items.glove > 0 && (items.lantern || items.firerod);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/book1', 'items/moonpearl1', InvertedRegionHelper.reqSouthLW]],
reqBoss:[
['items/book1', 'items/moonpearl1', InvertedRegionHelper.reqSouthLW, 'items/glove1', 'items/lantern1'],
@@ -37,6 +49,12 @@ export class InvertedStaticMapDungeonsLW {
validateBoss(items, dungeons){
return InvertedRegionHelper.toh(items, dungeons) && items.moonpearl;
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/moonpearl1', InvertedRegionHelper.reqToh]],
reqBoss:[['items/moonpearl1', InvertedRegionHelper.reqToh]]
};
@@ -49,6 +67,12 @@ export class InvertedStaticMapDungeonsLW {
&& (items.lantern || items.firerod) && items.hookshot
&& InvertedRegionHelper.gt(items, dungeons, settings);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[InvertedRegionHelper.reqGt]],
reqBoss:[
['items/bow1', 'items/hookshot1', InvertedRegionHelper.reqGt, 'items/sword1', 'items/lantern1'],
diff --git a/app/inverted/InvertedStaticMapLW.ts b/app/inverted/InvertedStaticMapLW.ts
index ba54e00..351788d 100644
--- a/app/inverted/InvertedStaticMapLW.ts
+++ b/app/inverted/InvertedStaticMapLW.ts
@@ -4,20 +4,32 @@ export class InvertedStaticMapLW {
uncle = {x:894, y:624, title:'Inverted Uncle', itemCount: 1,
req:[['items/moonpearl1', InvertedRegionHelper.reqNorthEastLW]], validate(items, dungeons) {
return items.moonpearl && InvertedRegionHelper.northEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
secretPassage = {x:826, y:644, title:'Secret Passage', itemCount: 1,
req:[['items/moonpearl1', InvertedRegionHelper.reqNorthEastLW]], validate(items, dungeons) {
return items.moonpearl && InvertedRegionHelper.northEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
backOfEscape = {x:778, y:439, title:'Escape',
itemCount: 5, req:[['items/moonpearl1', 'items/glove1', InvertedRegionHelper.reqNorthEastLW]],
validate(items, dungeons) {
return InvertedRegionHelper.northEastLW(items, dungeons) && items.moonpearl && items.glove > 0;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
sahashralaHut = {x:1216, y:660, title:'Sahashrala\'s Hut', itemCount: 3,
req: [['items/moonpearl1', 'items/bombs1', InvertedRegionHelper.reqNorthEastLW]],
validate(items, dungeons) {
return InvertedRegionHelper.northEastLW(items, dungeons) && items.moonpearl && items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
sahashrala = {x:1216, y:680, title:'Sahashrala', itemCount: 1,
@@ -32,12 +44,18 @@ export class InvertedStaticMapLW {
}
}
return retval && InvertedRegionHelper.northEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
potionShop = {x:1201, y:502, title:'Potion Shop', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthEastLW, 'items/mushroom1', 'items/moonpearl1']],
validate(items, dungeons){
return items.mushroom && InvertedRegionHelper.northEastLW(items, dungeons) && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
zora = {x:1457, y:187, title:'King Zora (500 Rupees)', itemCount: 1,
req:[
@@ -47,17 +65,26 @@ export class InvertedStaticMapLW {
validate(items, dungeons){
return InvertedRegionHelper.northEastLW(items, dungeons) && items.moonpearl
&& (items.glove > 0 || items.flippers);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
zoraLedge = {x:1427, y:187, title:'Zora Ledge', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthEastLW, 'items/moonpearl1', 'items/flippers1']],
validate(items, dungeons){
return InvertedRegionHelper.northEastLW(items, dungeons) && items.moonpearl && items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
waterfallFairy = {x:1350, y:208, title:'Waterfall Fairy', itemCount: 2,
req:[[InvertedRegionHelper.reqNorthEastLW, 'items/moonpearl1', 'items/flippers1']],
validate(items, dungeons){
return InvertedRegionHelper.northEastLW(items, dungeons) && items.moonpearl && items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pedestal = {x:62, y:74, title:'Master Sword Pedestal', itemCount: 1,
req:[['crystal-green', 'crystal-red', 'crystal-blue', InvertedRegionHelper.reqNorthWestLW]],
@@ -73,6 +100,9 @@ export class InvertedStaticMapLW {
}
}
return InvertedRegionHelper.northWestLW(items, dungeons) && rb === 2 && g;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
kingTomb = {x: 902, y: 444, title:'King\'s Tomb', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/boots1', 'items/moonpearl1', 'items/glove2']],
@@ -80,183 +110,291 @@ export class InvertedStaticMapLW {
return InvertedRegionHelper.northWestLW(items, dungeons)
&& items.boots && items.moonpearl
&& items.glove === 2;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
tavern = {x: 240, y:850, title:'Kakariko Tavern', itemCount: 1,
req:[['items/moonpearl1', InvertedRegionHelper.reqNorthWestLW]],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
chickenHut = {x: 146, y:814, title:'Chicken Hut', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && items.moonpearl && items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
well = {x: 38, y:639, title:'Kakariko Well', itemCount: 5,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && items.moonpearl && items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
blindhouse = {x: 193, y:632, title:'Blind\'s House', itemCount: 5,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && items.moonpearl && items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pegasusRock = {x:595, y:440, title:'Pegasus Rocks', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1', 'items/boots1']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && items.moonpearl && items.boots;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
bottleMerchant = {x:144, y:698, title:'Bottle Merchant (100 Rupees)', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW]], validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
magicBat = {x:486, y:844, title:'Magic Bat', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1', 'items/hammer1', 'items/powder1']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons)
&& items.hammer && items.powder && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
sickKid = {x:234, y:807, title:'Sick Kid', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/jar1']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && items.jar > 0;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwHideout = {x:283, y:194, title:'Lost Woods Hideout', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1']],
validate(items, dungeons){
return items.moonpearl && InvertedRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
lumberjackTree = {x:450, y:110, title:'Lumberjack Tree', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1', 'items/boots1', 'dungeons/aga_boss0']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && dungeons.aga.boss && items.boots && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
graveyardLedge = {x:855, y:416, title:'Graveyard Ledge', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return items.moonpearl && items.bombs && InvertedRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwMushroom = {x:185, y:135, title:'Lost Woods Mushroom Location', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthWestLW, 'items/moonpearl1']],
validate(items, dungeons){
return InvertedRegionHelper.northWestLW(items, dungeons) && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
floodChest = {x:703, y:1405, title:'Floodgate Chest', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
floodTreasure = {x:677, y:1394, title:'Floodgate Sunken Treasure', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1']], validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
sanctuary = {x:691, y:410, title:'Sanctuary', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthEastLW, 'items/moonpearl1']], validate(items, dungeons){
return items.moonpearl && InvertedRegionHelper.northEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
aginahCave = {x:298, y:1242, title:'Aginah Cave', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
moldormCave = {x:978, y:1412, title:'Mini-Moldorm Cave', itemCount: 5,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
iceRodCave = {x:1342, y:1160, title:'Ice Rod Cave', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hobo = {x:1059, y:1045, title:'Hobo Under the Bridge', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/flippers1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
bombosTablet = {x:328, y:1380, title:'Bombos Tablet', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/book1', 'items/sword2']],
validate(items, dungeons){
return items.book && items.sword > 1 && InvertedRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
cave45 = {x:399, y:1242, title:'Cave 45', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
checkerCave = {x:263, y:1165, title:'Checkerboard Cave', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/glove1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.glove>0;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
library = {x:243, y:990, title:'Library', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/boots1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.boots;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
mazeRace = {x:148, y:1080, title:'Maze Race', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
desertLedge = {x:38, y:1375, title:'Desert Ledge', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/book1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.book;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lakeIsland = {x:1091, y:1244, title:'Lake Hylia Island', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/flippers1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
fluteSpot = {x:435, y:992, title:'Flute Spot', itemCount: 1,
req:[[InvertedRegionHelper.reqSouthLW, 'items/moonpearl1', 'items/shovel1']],
validate(items, dungeons){
return InvertedRegionHelper.southLW(items, dungeons) && items.moonpearl && items.shovel;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
bumperCave = {x:532, y:268, title:'Bumper Cave', itemCount: 1,
req:[[InvertedRegionHelper.reqNorthEastLW, 'items/moonpearl1', 'items/cape1', 'items/mirror1']],
validate(items, dungeons){
return items.cape && items.moonpearl && items.mirror && InvertedRegionHelper.northEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spectacleRockCave = {x:732, y:220, title:'Spectacle Rock Cave', itemCount: 1,
req:[[InvertedRegionHelper.reqDeathMtnWestLW]],
validate(items, dungeons){
return InvertedRegionHelper.deathMtnWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
etherTablet = {x:630, y:28, title:'Ether Tablet', itemCount: 1,
req:[[InvertedRegionHelper.reqToh && 'items/book1','items/sword2', 'items/hammer1']],
validate(items, dungeons){
return items.moonpearl && InvertedRegionHelper.toh(items, dungeons)
&& items.book && items.sword > 1 && items.hammer;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spectacleRock = {x:761, y:121, title:'Spectacle Rock', itemCount: 1,
req:[[InvertedRegionHelper.reqDeathMtnEastLW, 'items/hammer1', 'items/moonpearl1']],
validate(items, dungeons){
return items.hammer && items.moonpearl && InvertedRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spiralCave = {x:1195, y:140, title:'Spiral Cave', itemCount: 1,
req:[[InvertedRegionHelper.reqDeathMtnEastLW, 'items/moonpearl1']],
validate(items, dungeons){
return items.moonpearl && InvertedRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
mimicCave = {x:1266, y:140, title:'Mimic Cave', itemCount: 1,
req:[[InvertedRegionHelper.reqDeathMtnEastLW, 'items/hammer1', 'items/moonpearl1']],
validate(items, dungeons){
return items.hammer && items.moonpearl && InvertedRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
paradoxCave = {x:1283, y:222, title:'Paradox Cave', itemCount: 7,
req:[[InvertedRegionHelper.reqDeathMtnEastLW, 'items/moonpearl1', 'items/bombs1']],
validate(items, dungeons){
return items.moonpearl && InvertedRegionHelper.deathMtnEastLW(items, dungeons)
&& items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
floatingIsland = {x:1220, y:26, title:'Floating Island', itemCount: 1,
req:[[InvertedRegionHelper.reqDeathMtnEastLW]],
validate(items, dungeons){
return InvertedRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
}
diff --git a/app/retro/RetroStaticMapDungeonsDW.ts b/app/retro/RetroStaticMapDungeonsDW.ts
index 060c35f..e0e6443 100644
--- a/app/retro/RetroStaticMapDungeonsDW.ts
+++ b/app/retro/RetroStaticMapDungeonsDW.ts
@@ -11,6 +11,12 @@ export class RetroStaticMapDungeonsDW extends StandardStaticMapDungeonsDW{
return items.hammer && items.moonpearl && (items.bow > 0 && items.quiver)
&& (items.lantern || items.firerod) && RetroRegionHelper.northEastDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/moonpearl1', StandardRegionHelper.reqNorthEastDW]],
reqBoss:[
['items/hammer1', 'items/moonpearl1', 'items/bow1', 'items/quiver1', StandardRegionHelper.reqNorthEastDW, 'items/lantern1'],
@@ -26,6 +32,12 @@ export class RetroStaticMapDungeonsDW extends StandardStaticMapDungeonsDW{
&& (items.lantern || items.firerod) && items.hookshot
&& RetroRegionHelper.gt(items, dungeons, settings);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[StandardRegionHelper.reqGt]],
reqBoss:[
['items/bow1', 'items/quiver1', 'items/hookshot1', StandardRegionHelper.reqGt, 'items/sword1', 'items/lantern1'],
diff --git a/app/retro/RetroStaticMapDungeonsLW.ts b/app/retro/RetroStaticMapDungeonsLW.ts
index c284ad8..f2c76c9 100644
--- a/app/retro/RetroStaticMapDungeonsLW.ts
+++ b/app/retro/RetroStaticMapDungeonsLW.ts
@@ -9,6 +9,12 @@ export class RetroStaticMapDungeonsLW extends StandardStaticMapDungeonsLW{
validateBoss(items){
return (items.bow > 0 && items.quiver) && (items.lantern || items.firerod);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[],
reqBoss:[
['items/bow1', 'items/quiver1', 'items/lantern1'],
diff --git a/app/retro/RetroStaticMapShopsDW.ts b/app/retro/RetroStaticMapShopsDW.ts
index 2996464..b692147 100644
--- a/app/retro/RetroStaticMapShopsDW.ts
+++ b/app/retro/RetroStaticMapShopsDW.ts
@@ -5,38 +5,65 @@ export class RetroStaticMapShopsDW implements IStaticMapShopsDW{
dwFortuneTeller = {x:281, y:487, title:'Fortune Teller',
takeAny: true, req:[[RetroRegionHelper.reqNorthWestDW]], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
archeryGame = {x:322, y:1055, title:'Archery Game',
takeAny: true, req:[[RetroRegionHelper.reqNorthWestDW]], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwSanctuaryHint = {x:692, y:416, title:'Dark Sanctuary Hint',
takeAny: true, req:[[RetroRegionHelper.reqNorthWestDW]], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwBonkFairy = {x:709, y:977, title:'Dark Bonk Fairy',
takeAny: true, req:[['items/boots1', 'items/moonpearl1', RetroRegionHelper.reqSouthDW]], validate(items, dungeons): boolean{
return items.boots && items.moonpearl && RetroRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwDesertFairy = {x:164, y:1202, title:'Mire Fairy',
takeAny: true, req:[['items/moonpearl1', RetroRegionHelper.reqMireDW]], validate(items, dungeons): boolean{
return items.moonpearl && RetroRegionHelper.mireDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwDesertHint = {x:298, y:1241, title:'Mire Hint',
takeAny: true, req:[['items/moonpearl1', RetroRegionHelper.reqMireDW]], validate(items, dungeons): boolean{
return items.moonpearl && RetroRegionHelper.mireDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwLakeHyliaFairy = {x:1236, y:972, title:'Dark Lake Hylia Fairy',
takeAny: true, req:[[RetroRegionHelper.reqNorthEastDW]], validate(items, dungeons): boolean{
return RetroRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
podHint = {x:1274, y:758, title:'Palace of Darkness Hint',
takeAny: true, req:[['items/moonpearl1', RetroRegionHelper.reqNorthEastDW]], validate(items, dungeons): boolean{
return items.moonpearl && RetroRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwEastHint = {x:1470, y:1054, title:'East Dark World Hint',
takeAny: true, req:[['items/moonpearl1', RetroRegionHelper.reqNorthEastDW]], validate(items, dungeons): boolean{
return items.moonpearl && RetroRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwLakeLedgeFairy = {x:1342, y:1158, title:'Lake Hylia Ledge Fairy',
takeAny: true, req:[
@@ -44,18 +71,30 @@ export class RetroStaticMapShopsDW implements IStaticMapShopsDW{
['items/moonpearl1', 'items/flippers1', 'items/boots1', RetroRegionHelper.reqSouthDW]
], validate(items, dungeons): boolean{
return items.moonpearl && items.flippers && (items.bombs || items.boots) && RetroRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwLakeLedgeSpikeCave = {x:1371, y:1158, title:'Lake Hylia Ledge Spike Cave',
takeAny: true, req:[['items/moonpearl1', 'items/flippers1', RetroRegionHelper.reqSouthDW]], validate(items, dungeons): boolean{
return items.moonpearl && items.flippers && RetroRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwLakeLedgeHint = {x:1353, y:1178, title:'Laky Hylia Ledge Hint',
takeAny: true, req:[['items/moonpearl1', 'items/flippers1', RetroRegionHelper.reqSouthDW]], validate(items, dungeons): boolean{
return items.moonpearl && items.flippers && RetroRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwDeathMtnFairy = {x:609, y:287, title:'Dark Death Mountain Fairy',
takeAny: true, req:[['items/moonpearl1', RetroRegionHelper.reqDeathMtnWestLW]], validate(items, dungeons): boolean{
return items.moonpearl && RetroRegionHelper.deathMtnWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
//shops
dwPotionShop = {x:1207, y:509, title:'Dark Potion Shop',
@@ -65,26 +104,43 @@ export class RetroStaticMapShopsDW implements IStaticMapShopsDW{
['items/glove1', RetroRegionHelper.reqNorthEastDW],
], validate(items, dungeons): boolean{
return (items.hammer || items.flippers || items.glove > 0) && RetroRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
- dwForestShop = {x:498, y:691, title:'Dark Forest Shop',
+ dwForestShop = {x:498, y:691, title:'Red Shield Shop',
takeAny: false, req:[[RetroRegionHelper.reqNorthWestDW]], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwLumberjackHutShop = {x:504, y:88, title:'Lumberjack Hut',
takeAny: false, req:[[RetroRegionHelper.reqNorthWestDW]], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwLakeHyliaShop = {x:972, y:1207, title:'Dark Lake Hylia Shop',
takeAny: false, req:[[RetroRegionHelper.reqSouthDW]], validate(items, dungeons): boolean{
return RetroRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwOutcastShop = {x:304, y:802, title:'Outcast Shop',
takeAny: false, req:[['items/hammer1', 'items/moonpearl1', RetroRegionHelper.reqNorthWestDW]], validate(items, dungeons): boolean{
return items.hammer && items.moonpearl && RetroRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
dwDeathMtnShop = {x:1266, y:222, title:'Dark Death Mountain Shop',
takeAny: false, req:[['items/moonpearl1', RetroRegionHelper.reqDeathMtnEastLW]], validate(items, dungeons): boolean{
return items.moonpearl && RetroRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
-
}
diff --git a/app/retro/RetroStaticMapShopsLW.ts b/app/retro/RetroStaticMapShopsLW.ts
index 723d38f..0e606f6 100644
--- a/app/retro/RetroStaticMapShopsLW.ts
+++ b/app/retro/RetroStaticMapShopsLW.ts
@@ -5,78 +5,135 @@ export class RetroStaticMapShopsLW implements IStaticMapShopsLW{
lumberjackHouse = {x:503, y:94, title:'Lumberjack\'s House',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lostWoodsGamble = {x:278, y:23, title:'Lost Woods Gamble',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwFortuneTeller = {x:281, y:485, title:'Fortune Teller',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
snitchLadyWest = {x:76, y:703, title:'Snitch Lady West',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
snitchLadyEast = {x:310, y:727, title:'Snitch Lady East',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
bushCoveredHouse = {x:305, y:802, title:'Bush Covered House',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
bombHut ={x:41, y:897, title:'Bomb Hut',
takeAny: true, req:[['items/bombs1']], validate(items, dungeons): boolean{
return items.bombs && RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
kakarikoGambleGame = {x:322, y:1054, title:'Kakariko Gamble Game',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwBonkFairy = {x:710, y:979, title:'Bonk Fairy',
takeAny: true, req:[['items/bombs1']], validate(items, dungeons): boolean{
return items.boots && RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
desertFairy = {x:416, y:1340, title:'Desert Fairy',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
fiftyRupeeCave = {x:468, y:1434, title:'50 Rupee Cave',
takeAny: true, req:[['items/glove1']], validate(items, dungeons): boolean{
return items.glove > 0 && RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwHypeFairy = {x:896, y:1172, title:'Hype Fairy',
takeAny: true, req:[['items/bombs1']], validate(items, dungeons): boolean{
return items.bombs && RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwLakeHyliaFortuneTeller = {x:973, y:1206, title:'Lake Hylia Fortune Teller',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwLakeHyliaFairy = {x:1236, y:972, title:'Lake Hylia Fairy',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
longFairyCave = {x:1471, y:1053, title:'Long Fairy Cave',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.northEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
goodBeeCave = {x:1371, y:1160, title:'Good Bee Cave',
takeAny: true, req:[], validate(items, dungeons): boolean{
return RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
twentyRupeeCave = {x:1353, y:1177, title:'20 Rupee Cave',
takeAny: true, req:[['items/glove1']], validate(items, dungeons): boolean{
return items.glove > 0 && RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
capacityUpgrade = {x:1189, y:1282, title:'Capacity Upgrade',
takeAny: true, req:[['items/flippers1']], validate(items, dungeons): boolean{
return items.flippers && RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}}
hookshotFairy = {x:1266, y:221, title:'Hookshot Fairy',
takeAny: true, req:[[RetroRegionHelper.reqDeathMtnEastLW]], validate(items, dungeons): boolean{
return RetroRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
// shops
@@ -84,16 +141,24 @@ export class RetroStaticMapShopsLW implements IStaticMapShopsLW{
takeAny: false, req:[],
validate(items, dungeons): boolean{
return RetroRegionHelper.northWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwLakeHyliaShop = {x:1090, y:1153, title:'Lake Hylia Shop',
takeAny: false, req:[],
validate(items, dungeons): boolean{
return RetroRegionHelper.southLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lwDeathMtnShop = {x:1283, y:221, title:'Death Mountain Shop',
takeAny: false, req:[['items/bombs1', RetroRegionHelper.reqDeathMtnEastLW]],
validate(items, dungeons): boolean{
return items.bombs && RetroRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
-
}
diff --git a/app/standard/StandardStaticMapDW.ts b/app/standard/StandardStaticMapDW.ts
index 9ab99a4..f1138ec 100644
--- a/app/standard/StandardStaticMapDW.ts
+++ b/app/standard/StandardStaticMapDW.ts
@@ -5,6 +5,9 @@ export class StandardStaticMapDW {
req:[['items/moonpearl1', StandardRegionHelper.reqDeathMtnEastLW]],
validate(items, dungeons){
return items.moonpearl && StandardRegionHelper.deathMtnEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hookshotCave = {x: 1247, y: 99, title: 'Hookshot Cave', itemCount: 4,
req:[
@@ -13,6 +16,9 @@ export class StandardStaticMapDW {
],
validate(items, dungeons){
return (items.hookshot || items.boots) && items.moonpearl && StandardRegionHelper.deathMtnEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spikeCave = {x: 862, y: 221, title: 'Spike Cave', itemCount: 1,
req:[
@@ -25,16 +31,25 @@ export class StandardStaticMapDW {
return (items.jar > 0 || items.halfmagic) && items.hammer
&& items.glove>0 && items.moonpearl && (items.cape || items.bluecane)
&& StandardRegionHelper.deathMtnWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
catfish = {x: 1341, y: 257, title: 'Catfish', itemCount: 1,
req:[['items/moonpearl1', 'items/glove1', StandardRegionHelper.reqNorthEastDW]],
validate(items, dungeons){
return items.moonpearl && items.glove > 0 && StandardRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pyramid = {x: 870, y: 670, title: 'Pyramid', itemCount: 1,
req:[[StandardRegionHelper.reqNorthEastDW]],
validate(items, dungeons){
return StandardRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pyramidFairy = {x: 703, y: 733, title: 'Pyramid Fairy', itemCount: 2,
req:[
@@ -52,63 +67,99 @@ export class StandardStaticMapDW {
return c === 2 && StandardRegionHelper.southDW(items, dungeons)
&& ((items.hammer && items.moonpearl)
|| (items.mirror && dungeons.aga.boss));
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
brewery = {x: 163, y: 878, title: 'Brewery', itemCount: 1,
req:[['items/bombs1', 'items/moonpearl1', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.bombs && items.moonpearl && StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
cShapeHouse = {x: 310, y: 726, title: 'C-Shaped House', itemCount: 1,
req:[['items/moonpearl1', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.moonpearl && StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
chestGame = {x: 76, y: 702, title: 'Chest Game', itemCount: 1,
req:[['items/moonpearl1', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.moonpearl && StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hammerPegs = {x: 474, y: 908, title: 'Hammer Pegs', itemCount: 1,
req:[['items/moonpearl1', 'items/hammer1', 'items/glove2', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.moonpearl && items.hammer && items.glove === 2 && StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
bumperCave = {x: 532, y: 268, title: '​Bumper Cave', itemCount: 1,
req:[['items/moonpearl1', 'items/glove1', 'items/cape1', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.moonpearl && items.glove > 0 && items.cape
&&StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
blacksmith = {x: 223, y: 994, title: 'Blacksmith', itemCount: 1,
req:[['items/moonpearl1', 'items/glove2', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.moonpearl && items.glove === 2
&& StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
purpleChest = {x: 457, y: 802, title: 'Purple Chest', itemCount: 1,
req:[['items/moonpearl1', 'items/glove2', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.moonpearl && items.glove === 2
&& StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hypeCave = {x: 896, y: 1168, title: 'Hype Cave', itemCount: 5,
req:[['items/moonpearl1', 'items/bombs1', StandardRegionHelper.reqSouthDW]],
validate(items, dungeons){
return items.moonpearl && items.bombs && StandardRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
stumpy = {x: 463, y: 1024, title: 'Stumpy', itemCount: 1,
req:[['items/moonpearl1', StandardRegionHelper.reqSouthDW]],
validate(items, dungeons){
return items.moonpearl && StandardRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
diggingGame = {x: 85, y: 1043, title: 'Digging Game', itemCount: 1,
req:[['items/moonpearl1', StandardRegionHelper.reqSouthDW]],
validate(items, dungeons){
return items.moonpearl && StandardRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
mireShed = {x: 59, y: 1205, title: 'Mire Shed', itemCount: 2,
req:[['items/moonpearl1', StandardRegionHelper.reqMireDW]],
validate(items, dungeons){
return items.moonpearl && StandardRegionHelper.mireDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
}
diff --git a/app/standard/StandardStaticMapDungeonsDW.ts b/app/standard/StandardStaticMapDungeonsDW.ts
index 8f98a8e..d38f114 100644
--- a/app/standard/StandardStaticMapDungeonsDW.ts
+++ b/app/standard/StandardStaticMapDungeonsDW.ts
@@ -9,6 +9,12 @@ export class StandardStaticMapDungeonsDW {
return items.hammer && items.moonpearl && items.bow > 0
&& (items.lantern || items.firerod) && StandardRegionHelper.northEastDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/moonpearl1', StandardRegionHelper.reqNorthEastDW]],
reqBoss:[
['items/hammer1', 'items/moonpearl1', 'items/bow1', StandardRegionHelper.reqNorthEastDW, 'items/lantern1'],
@@ -22,6 +28,12 @@ export class StandardStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.flippers && items.moonpearl && items.mirror && items.hookshot && items.hammer && StandardRegionHelper.southDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/flippers1', 'items/moonpearl1', 'items/mirror1', StandardRegionHelper.reqSouthDW]],
reqBoss:[['items/flippers1', 'items/moonpearl1', 'items/mirror1', 'items/hookshot1', 'items/hammer1', StandardRegionHelper.reqSouthDW]]
}; // swamp palace
@@ -32,6 +44,12 @@ export class StandardStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.moonpearl && items.firerod && StandardRegionHelper.northWestDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/moonpearl1', StandardRegionHelper.reqNorthWestDW]],
reqBoss:[['items/moonpearl1', 'items/firerod1', StandardRegionHelper.reqNorthWestDW]]
}; // skull woods
@@ -42,6 +60,12 @@ export class StandardStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.moonpearl && StandardRegionHelper.northWestDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/moonpearl1', StandardRegionHelper.reqNorthWestDW]],
reqBoss:[['items/moonpearl1', StandardRegionHelper.reqNorthWestDW]]
}; // thieves town
@@ -52,6 +76,12 @@ export class StandardStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.hammer && items.glove === 2 && (items.firerod || items.bombos) && items.moonpearl && items.flippers && StandardRegionHelper.southDW(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[
['items/moonpearl1', 'items/glove2', 'items/flippers1', StandardRegionHelper.reqSouthDW, 'items/firerod1'],
['items/moonpearl1', 'items/glove2', 'items/flippers1', StandardRegionHelper.reqSouthDW, 'items/bombos1']
@@ -68,6 +98,12 @@ export class StandardStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.redcane && items.lantern && StandardRegionHelper.mm(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[StandardRegionHelper.reqMm]],
reqBoss:[['items/redcane1', 'items/lantern1', StandardRegionHelper.reqMm]]
}; // misery mire
@@ -78,6 +114,12 @@ export class StandardStaticMapDungeonsDW {
validateBoss(items, dungeons){
return items.firerod && items.icerod && StandardRegionHelper.tr(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[StandardRegionHelper.reqTr]],
reqBoss:[['items/firerod1', 'items/icerod1', StandardRegionHelper.reqTr]]
}; // turtle rock
@@ -90,6 +132,12 @@ export class StandardStaticMapDungeonsDW {
&& (items.lantern || items.firerod) && items.hookshot
&& StandardRegionHelper.gt(items, dungeons, settings);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[StandardRegionHelper.reqGt]],
reqBoss:[
['items/bow1', 'items/hookshot1', StandardRegionHelper.reqGt, 'items/sword1', 'items/lantern1'],
diff --git a/app/standard/StandardStaticMapDungeonsLW.ts b/app/standard/StandardStaticMapDungeonsLW.ts
index 02d762d..fe7bc3b 100644
--- a/app/standard/StandardStaticMapDungeonsLW.ts
+++ b/app/standard/StandardStaticMapDungeonsLW.ts
@@ -8,6 +8,12 @@ export class StandardStaticMapDungeonsLW {
validateBoss(items){
return items.bow > 0 && (items.lantern || items.firerod);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[],
reqBoss:[
['items/bow1', 'items/lantern1'],
@@ -23,6 +29,12 @@ export class StandardStaticMapDungeonsLW {
&& (items.glove > 0 || (items.mirror && StandardRegionHelper.mireDW(items, dungeons)))
&& (items.lantern || items.firerod);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[StandardRegionHelper.reqDp]],
reqBoss:[
['items/book1', 'items/glove1', 'items/lantern1'],
@@ -38,6 +50,12 @@ export class StandardStaticMapDungeonsLW {
validateBoss(items, dungeons){
return StandardRegionHelper.toh(items, dungeons);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[[StandardRegionHelper.reqToh]],
reqBoss:[[StandardRegionHelper.reqToh]]
};
@@ -48,6 +66,12 @@ export class StandardStaticMapDungeonsLW {
validateBoss(items){
return items.lantern && (items.cape || items.sword > 1) && (items.sword > 0 || items.net);
},
+ validateEntrance(items, dungeons, entrances, settings){
+ return true;
+ },
+ validateBossEntrance(items, dungeons, entrances, settings) {
+ return true;
+ },
req:[['items/cape1'], ['items/sword2']],
reqBoss:[
['items/lantern1', 'items/sword2'],
diff --git a/app/standard/StandardStaticMapLW.ts b/app/standard/StandardStaticMapLW.ts
index 7c639a3..756bb83 100644
--- a/app/standard/StandardStaticMapLW.ts
+++ b/app/standard/StandardStaticMapLW.ts
@@ -1,21 +1,37 @@
import {StandardRegionHelper} from '@/standard/StandardRegionHelper';
export class StandardStaticMapLW {
- uncle = {x:894, y:624, title:'Uncle', itemCount: 1, req:[], validate(items, dungeons) {
- return true;
- }};
- secretPassage = {x:826, y:644, title:'Secret Passage', itemCount: 1, req:[], validate(items, dungeons) {
- return true;
- }};
+ uncle = {x:894, y:624, title:'Uncle', itemCount: 1, req:[],
+ validate(items, dungeons) {
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }
+ };
+ secretPassage = {x:826, y:644, title:'Secret Passage', itemCount: 1, req:[],
+ validate(items, dungeons) {
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }
+ };
backOfEscape = {x:778, y:439, title:'Escape',
itemCount: 5, req:[['items/glove1']],
validate(items, dungeons) {
return items.glove > 0;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
sahashralaHut = {x:1216, y:660, title:'Sahashrala\'s Hut', itemCount: 3,
req: [['items/bombs1']],
validate(items, dungeons) {
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
sahashrala = {x:1216, y:680, title:'Sahashrala', itemCount: 1,
@@ -30,28 +46,43 @@ export class StandardStaticMapLW {
}
}
return retval;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
potionShop = {x:1201, y:502, title:'Potion Shop', itemCount: 1,
req:[['items/mushroom1']],
validate(items){
return items.mushroom;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
zora = {x:1457, y:187, title:'King Zora (500 Rupees)', itemCount: 1,
req:[['items/glove1'], ['items/flippers1']],
validate(items){
return items.glove > 0 || items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}
};
zoraLedge = {x:1427, y:187, title:'Zora Ledge', itemCount: 1,
req:[['items/flippers1']],
validate(items){
return items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
waterfallFairy = {x:1350, y:208, title:'Waterfall Fairy', itemCount: 2,
req:[['items/flippers1']],
validate(items){
return items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pedestal = {x:62, y:74, title:'Master Sword Pedestal', itemCount: 1,
req:[['crystal-green', 'crystal-blue', 'crystal-red']],
@@ -67,6 +98,9 @@ export class StandardStaticMapLW {
}
}
return rb === 2 && g;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
kingTomb = {x: 902, y: 444, title:'King\'s Tomb', itemCount: 1,
req:[
@@ -77,29 +111,55 @@ export class StandardStaticMapLW {
return items.boots
&& (items.glove === 2
|| (items.mirror && StandardRegionHelper.northWestDW(items, dungeons)) && items.moonpearl);
- }};
- tavern = {x: 240, y:850, title:'Kakariko Tavern', itemCount: 1, req:[], validate(){
- return true;
- }};
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ tavern = {x: 240, y:850, title:'Kakariko Tavern', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }
+ };
chickenHut = {x: 146, y:814, title:'Chicken Hut', itemCount: 1,
- req:[['items/bombs1']], validate(items){
+ req:[['items/bombs1']],
+ validate(items){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
well = {x: 38, y:639, title:'Kakariko Well', itemCount: 5,
- req:[['items/bombs1']], validate(items){
+ req:[['items/bombs1']],
+ validate(items){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
blindhouse = {x: 193, y:632, title:'Blind\'s House', itemCount: 5,
req:[['items/bombs1']], validate(items){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
pegasusRock = {x:595, y:440, title:'Pegasus Rocks', itemCount: 1,
req:[['items/boots1']], validate(items){
return items.boots;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ bottleMerchant = {x:144, y:698, title:'Bottle Merchant (100 Rupees)', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
- bottleMerchant = {x:144, y:698, title:'Bottle Merchant (100 Rupees)', itemCount: 1, req:[], validate(){
- return true;
- }};
magicBat = {x:486, y:844, title:'Magic Bat', itemCount: 1,
req:[
['items/powder1', 'items/hammer1'],
@@ -110,130 +170,227 @@ export class StandardStaticMapLW {
(items.hammer
|| (items.mirror && items.moonpearl
&& (items.glove === 2 && StandardRegionHelper.northWestDW(items, dungeons))));
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
sickKid = {x:234, y:807, title:'Sick Kid', itemCount: 1,
req:[['items/jar1']], validate(items){
return items.jar > 0;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ lwHideout = {x:283, y:194, title:'Lost Woods Hideout', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
- lwHideout = {x:283, y:194, title:'Lost Woods Hideout', itemCount: 1, req:[], validate(){
- return true;
- }};
lumberjackTree = {x:450, y:110, title:'Lumberjack Tree', itemCount: 1,
- req:[['dungeons/aga_boss0', 'items/boots1']], validate(items, dungeons){
+ req:[['dungeons/aga_boss0', 'items/boots1']],
+ validate(items, dungeons){
return dungeons.aga.boss && items.boots;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
graveyardLedge = {x:855, y:416, title:'Graveyard Ledge', itemCount: 1,
req:[['items/mirror1', 'items/moonpearl1', StandardRegionHelper.reqNorthWestDW]],
validate(items, dungeons){
return items.mirror && items.moonpearl && StandardRegionHelper.northWestDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ lwMushroom = {x:185, y:135, title:'Lost Woods Mushroom Location', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ floodChest = {x:703, y:1405, title:'Floodgate Chest', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ floodTreasure = {x:677, y:1394, title:'Floodgate Sunken Treasure', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ linkHouse = {x:820, y:1037, title:'Link\'s House', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
+ }};
+ sanctuary = {x:691, y:410, title:'Sanctuary', itemCount: 1, req:[],
+ validate(){
+ return true;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
- lwMushroom = {x:185, y:135, title:'Lost Woods Mushroom Location', itemCount: 1, req:[], validate(){
- return true;
- }};
- floodChest = {x:703, y:1405, title:'Floodgate Chest', itemCount: 1, req:[], validate(){
- return true;
- }};
- floodTreasure = {x:677, y:1394, title:'Floodgate Sunken Treasure', itemCount: 1, req:[], validate(){
- return true;
- }};
- linkHouse = {x:820, y:1037, title:'Link\'s House', itemCount: 1, req:[], validate(){
- return true;
- }};
- sanctuary = {x:691, y:410, title:'Sanctuary', itemCount: 1, req:[], validate(){
- return true;
- }};
aginahCave = {x:298, y:1242, title:'Aginah Cave', itemCount: 1,
req:[['items/bombs1']], validate(items){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
moldormCave = {x:978, y:1412, title:'Mini-Moldorm Cave', itemCount: 5,
req:[['items/bombs1']], validate(items){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
iceRodCave = {x:1342, y:1160, title:'Ice Rod Cave', itemCount: 1,
req:[['items/bombs1']], validate(items){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
hobo = {x:1059, y:1045, title:'Hobo Under the Bridge', itemCount: 1,
req:[['items/flippers1']], validate(items){
return items.flippers;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
bombosTablet = {x:328, y:1380, title:'Bombos Tablet', itemCount: 1,
req:[['items/book1', 'items/sword2', 'items/mirror1', StandardRegionHelper.reqSouthDW]],
validate(items, dungeons){
return items.book && items.sword > 1 && items.mirror && StandardRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
cave45 = {x:399, y:1242, title:'Cave 45', itemCount: 1,
req:[['items/mirror1', StandardRegionHelper.reqSouthDW]],
validate(items, dungeons){
return items.mirror && StandardRegionHelper.southDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
checkerCave = {x:263, y:1165, title:'Checkerboard Cave', itemCount: 1,
req:[['items/mirror1', StandardRegionHelper.reqMireDW]],
validate(items, dungeons){
return items.mirror && StandardRegionHelper.mireDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
library = {x:243, y:990, title:'Library', itemCount: 1,
req:[['items/boots1']], validate(items){
return items.boots;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
mazeRace = {x:148, y:1080, title:'Maze Race', itemCount: 1,
req:[['items/bombs1']], validate(items){
return items.bombs;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
desertLedge = {x:38, y:1375, title:'Desert Ledge', itemCount: 1,
req:[['items/book1', 'or', 'items/mirror1', 'items/glove2', 'items/flute1']],
validate(items, dungeons){
return StandardRegionHelper.dp(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
lakeIsland = {x:1091, y:1244, title:'Lake Hylia Island', itemCount: 1,
req:[['items/mirror1', 'items/flippers1', 'items/moonpearl1', StandardRegionHelper.reqNorthEastDW]],
validate(items, dungeons){
return items.mirror && items.flippers && items.moonpearl && StandardRegionHelper.northEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
fluteSpot = {x:435, y:992, title:'Flute Spot', itemCount: 1,
req:[['items/shovel1']], validate(items){
return items.shovel;
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
oldMan = {x:609, y:286, title:'Rescue Old Man', itemCount: 1,
req:[['items/lantern1', StandardRegionHelper.reqDeathMtnWestLW]],
validate(items, dungeons){
return items.lantern && StandardRegionHelper.deathMtnWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spectacleRockCave = {x:732, y:220, title:'Spectacle Rock Cave', itemCount: 1,
req:[[StandardRegionHelper.reqDeathMtnWestLW]],
validate(items, dungeons){
return StandardRegionHelper.deathMtnWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
etherTablet = {x:630, y:28, title:'Ether Tablet', itemCount: 1,
req:[['items/book1', 'items/sword2', StandardRegionHelper.reqToh]],
validate(items, dungeons){
return items.book && items.sword > 1 && StandardRegionHelper.toh(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spectacleRock = {x:761, y:121, title:'Spectacle Rock', itemCount: 1,
req:[['items/mirror1', StandardRegionHelper.reqDeathMtnWestLW]],
validate(items, dungeons){
return items.mirror && StandardRegionHelper.deathMtnWestLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
spiralCave = {x:1195, y:140, title:'Spiral Cave', itemCount: 1,
req:[[StandardRegionHelper.reqDeathMtnEastLW]],
validate(items, dungeons){
return StandardRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
mimicCave = {x:1266, y:140, title:'Mimic Cave', itemCount: 1,
req:[['items/hammer1', 'items/mirror1', StandardRegionHelper.reqTr]],
validate(items, dungeons){
return items.hammer && items.mirror && StandardRegionHelper.tr(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
paradoxCave = {x:1283, y:222, title:'Paradox Cave', itemCount: 7,
req:[[StandardRegionHelper.reqDeathMtnEastLW]],
validate(items, dungeons){
return StandardRegionHelper.deathMtnEastLW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}};
floatingIsland = {x:1220, y:26, title:'Floating Island', itemCount: 1,
req:[['items/mirror1', 'items/bombs1', 'items/glove1', StandardRegionHelper.reqDeathMtnEastLW]],
validate(items, dungeons){
return items.mirror && items.bombs && items.glove > 0
&& StandardRegionHelper.deathMtnEastDW(items, dungeons);
+ },
+ validateEntrance(items, dungeons, entrances){
+ return true;
}}
}
diff --git a/app/utils/EntranceHelper.ts b/app/utils/EntranceHelper.ts
new file mode 100644
index 0000000..fe9bad9
--- /dev/null
+++ b/app/utils/EntranceHelper.ts
@@ -0,0 +1,685 @@
+import {ModelManager} from '@/utils/ModelManager';
+import {StaticObjectLoader} from '@/utils/StaticObjectLoader';
+import {GameSaveHelper} from '@/utils/GameSaveHelper';
+
+export class EntranceHelper {
+ sol: StaticObjectLoader;
+ modelManager: ModelManager;
+ lwEntranceKeys: Array;
+ dwEntranceKeys: Array;
+ lwStaticEntrances: any;
+ dwStaticEntrances: any;
+ dwIndex: number;
+ allKeys: Array;
+ logicTextColors = {
+ basic:'#FFFFFF',
+ entrance:'#01a0a0',
+ unknown:'#FF0000',
+ known:'#2aa52a',
+ junk: '#ffb700'
+ };
+
+ static junkLinks = ['junkCave', 'darkCave'];
+ static junkLinkObjects = {
+ junkCave:{id:'junkCave', name: 'Junk Cave', intImg:'~/img/interior/junkCave.png', extImg:'~/img/interior/junkCave.png'},
+ darkCave:{id:'darkCave', name: 'Unknown Dark Cave', intImg:'~/img/interior/darkCave.png', extImg:'~/img/interior/darkCave.png'}
+ };
+
+ constructor(sol, modelManager) {
+ this.sol = sol;
+ this.modelManager = modelManager;
+ this.lwStaticEntrances = this.sol.getStaticEntrancesLW(this.modelManager.getEntranceShuffleMode());
+ this.dwStaticEntrances = this.sol.getStaticEntrancesDW(this.modelManager.getEntranceShuffleMode());
+ this.lwEntranceKeys = Object.keys(this.lwStaticEntrances);
+ this.dwEntranceKeys = Object.keys(this.dwStaticEntrances);
+ this.dwIndex = this.lwEntranceKeys.length;
+ this.allKeys = this.lwEntranceKeys.concat(this.dwEntranceKeys);
+ }
+
+ getReverseAction(action) {
+ return action === 'enterLink' ? 'enterLinkedTo'
+ : action === 'exitLink' ? 'exitLinkedTo'
+ : action === 'enterLinkedTo' ? 'enterLink' : 'exitLink';
+ }
+
+ createLinkR(fromLink:string, toLink: string, action: string) {
+ console.log('from', fromLink, 'to', toLink, 'action', action);
+ if (this.modelManager.entrances[fromLink][action] === toLink){
+ console.log('already set, exiting');
+ return; //already set
+ }
+ const reverseAction = this.getReverseAction(action);
+ //clean up fromLink existing links
+ if (toLink !== undefined && this.modelManager.entrances[fromLink][action] && this.modelManager.entrances[fromLink][action] !== toLink) {
+ const oldToLink = this.modelManager.entrances[fromLink][action];
+ //manually clean up junk cave since that's easier than looping through everything.
+ if(EntranceHelper.junkLinks.indexOf(oldToLink)>-1) {
+ this.modelManager.entrances[fromLink].enterLink = this.modelManager.entrances[fromLink].enterLink === 'junkCave'
+ ? undefined : this.modelManager.entrances[fromLink].enterLink;
+ this.modelManager.entrances[fromLink].exitLinkedTo = this.modelManager.entrances[fromLink].exitLinkedTo === 'junkCave'
+ ? undefined : this.modelManager.entrances[fromLink].enterLink;
+ } else {
+ //remove existing oldToLink
+ this.createLinkR(oldToLink, undefined, reverseAction);
+ }
+ }
+ const retval = this.modelManager.entrances[fromLink][action] = toLink;
+ console.log('setting', fromLink, action, toLink);
+ //link back
+ if ((this.modelManager.settings.entranceShuffle !== GameSaveHelper.entranceShuffleOptions.insanity.id || this.getStaticEntrance(fromLink).isSingleCave)
+ && (action === 'exitLink' || action === 'enterLinkedTo')) {
+ const caveAction = action === 'exitLink' ? 'enterLinkedTo' : 'exitLink';
+ //check if already linked
+ if (this.modelManager.entrances[fromLink][caveAction] && this.modelManager.entrances[fromLink][caveAction] !== toLink) {
+ this.createLinkR(fromLink, undefined, caveAction);
+ }
+ this.createLinkR(fromLink, toLink, caveAction);
+ }
+ //handle holes/hole exit links
+ if(this.modelManager.settings.entranceShuffle !== GameSaveHelper.entranceShuffleOptions.insanity.id
+ && (this.getStaticEntrance(fromLink).isHole || this.getStaticEntrance(fromLink).isHoleExit) && this.getStaticEntrance(fromLink).holeLink) {
+ const holeLinkFrom = this.getStaticEntrance(fromLink).holeLink;
+ const holeLinkTo = this.getStaticEntrance(toLink).holeLink;
+ this.createLinkR(holeLinkFrom, holeLinkTo, action);
+ }
+ //handle multi entrance dungeons
+ if((this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.restricted.id || this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.simple.id)
+ && this.getStaticEntrance(fromLink).isMultiEntranceDungeon) {
+ const keys = Object.keys(this.getStaticEntrance(fromLink).multiLinks);
+ for(const key of keys){
+ this.createLinkR(this.getStaticEntrance(fromLink).multiLinks[key], this.getStaticEntrance(toLink).multiLinks[key], action);
+ }
+ }
+ //handle junk links
+ if((toLink==='junkCave' || (toLink === 'darkCave' && this.modelManager.settings.entranceShuffle !== GameSaveHelper.entranceShuffleOptions.insanity.id))
+ && (action ==='enterLink' || action === 'exitLinkedTo')){
+ const junkAction = action === 'enterLink' ? 'exitLinkedTo' : 'enterLink';
+ this.createLinkR(fromLink, toLink, junkAction);
+ }
+ if(toLink && EntranceHelper.junkLinks.indexOf(toLink)<0){
+ this.createLinkR(toLink, fromLink, reverseAction);
+ }
+ return retval;
+ }
+
+ getStaticEntrance(id) {
+ return id
+ ? EntranceHelper.junkLinks.indexOf(id)>-1 ? EntranceHelper.junkLinkObjects[id]
+ : (this.allKeys.indexOf(id)>=this.dwIndex ? this.dwStaticEntrances[id] : this.lwStaticEntrances[id] ) : {name:'???'};
+ }
+ getEntrance(id) {
+ return this.modelManager.entrances[id];
+ }
+ getAvailableLinks(entrance, action, path = [], alreadyLinked=false):Array {
+ const retval = [];
+ let showAlreadyLinked = false;
+ if(entrance.isHoleExit && entrance.isSkullWoods) {
+ const keys = Object.keys(this.dwStaticEntrances);
+
+ for(const key of keys) {
+ if(this.dwStaticEntrances[key].isHoleExit && this.dwStaticEntrances[key].isSkullWoods && (!!this.modelManager.entrances[key][action] === alreadyLinked)){
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!this.dwStaticEntrances[key].isHole,
+ isHoleExit:!!this.dwStaticEntrances[key].isHoleExit,
+ isSkullWoods:!!this.dwStaticEntrances[key].isSkullWoods,
+ name:this.dwStaticEntrances[key].name,
+ intImg:this.dwStaticEntrances[key].intImg,
+ extImg:this.dwStaticEntrances[key].extImg,
+ junk:!!this.dwStaticEntrances[key].junk
+ }
+ );
+ } else if(this.dwStaticEntrances[key].isHoleExit && this.dwStaticEntrances[key].isSkullWoods && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked) {
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(entrance.isHole && entrance.isSkullWoods && this.modelManager.settings.entranceShuffle !== GameSaveHelper.entranceShuffleOptions.insanity.id) {
+ const keys = Object.keys(this.dwStaticEntrances);
+ for(const key of keys) {
+ if(this.dwStaticEntrances[key].isHole && this.dwStaticEntrances[key].isSkullWoods && (!!this.modelManager.entrances[key][action] === alreadyLinked)){
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!this.dwStaticEntrances[key].isHole,
+ isHoleExit:!!this.dwStaticEntrances[key].isHoleExit,
+ isSkullWoods:!!this.dwStaticEntrances[key].isSkullWoods,
+ name:this.dwStaticEntrances[key].name,
+ intImg:this.dwStaticEntrances[key].intImg,
+ extImg:this.dwStaticEntrances[key].extImg,
+ junk:!!this.dwStaticEntrances[key].junk
+ }
+ );
+ } else if(this.dwStaticEntrances[key].isHole && this.dwStaticEntrances[key].isSkullWoods && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked) {
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(entrance.isHole && this.modelManager.settings.entranceShuffle !== GameSaveHelper.entranceShuffleOptions.insanity.id) {
+ const keys = Object.keys(this.lwStaticEntrances).concat(Object.keys(this.dwStaticEntrances));
+ for(const key of keys){
+ const e = this.getStaticEntrance(key);
+ if(e.isHole && !e.isSkullWoods && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if (e.isHole && !e.isSkullWoods && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(entrance.isHoleExit && this.modelManager.settings.entranceShuffle !== GameSaveHelper.entranceShuffleOptions.insanity.id){
+ const keys = Object.keys(this.lwStaticEntrances).concat(Object.keys(this.dwStaticEntrances));
+ for(const key of keys){
+ const e = this.getStaticEntrance(key);
+ if(e.isHoleExit && !e.isSkullWoods && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if (e.isHoleExit && !e.isSkullWoods && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(entrance.isSingleEntranceDungeon
+ && (this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.restricted.id || this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.simple.id)) {
+ const keys = Object.keys(this.lwStaticEntrances).concat(Object.keys(this.dwStaticEntrances));
+ for(const key of keys){
+ const e = this.getStaticEntrance(key);
+ if(e.isSingleEntranceDungeon && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if (e.isSingleEntranceDungeon && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(entrance.isMultiEntranceDungeon
+ && (this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.restricted.id || this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.simple.id)) {
+ const keys = Object.keys(this.lwStaticEntrances).concat(Object.keys(this.dwStaticEntrances));
+ for(const key of keys){
+ const e = this.getStaticEntrance(key);
+ if(e.isMultiEntranceDungeon && entrance.multiDir === e.multiDir && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if (e.isMultiEntranceDungeon && entrance.multiDir === e.multiDir && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.simple.id) {
+ if(entrance.isLWDM) {
+ const keys = Object.keys(this.lwStaticEntrances).concat(Object.keys(this.dwStaticEntrances));
+ for(const key of keys){
+ const e = this.getStaticEntrance(key);
+ if(e.isLWDM && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if (e.isLWDM && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(path.length === 0) {
+ retval.push({isLink:false, klass:'standard', id:'lightworld', name:'Light World'});
+ retval.push({isLink:false, klass:'standard', id:'darkworld', name:'Dark World'});
+ if(action === 'enterLinkedTo') {
+ if(entrance.isSingleCave) {
+ retval.push({isLink:true, klass:'ugly', id:'junkCave', name: 'Junk Cave', extImg:'~/img/interior/junkCave.png'});
+ }
+ retval.push({isLink:true, klass:'ugly', id:'darkCave', name: 'Unknown Dark Cave', extImg:'~/img/interior/darkCave.png'});
+ }
+ } else if(path.length === 1 && entrance.isMultiCave) {
+ const keys = path[0] === 'lightworld' ? Object.keys(this.lwStaticEntrances) : Object.keys(this.dwStaticEntrances);
+ for(const key of keys){
+ const e = this.getStaticEntrance(key);
+ if(e.isMultiCave && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if (e.isMultiCave && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(path.length === 1 && path[0] === 'lightworld') {
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'kakariko', name:'Kakariko'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'Desert and South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'North East'});
+ } else if(path.length === 1 && path[0] === 'darkworld') {
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'village', name:'Village of Outcasts'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'Mire and North East'});
+ } else if(path.length === 2) {
+ const keys = path[0] === 'lightworld' ? Object.keys(this.lwStaticEntrances) : Object.keys(this.dwStaticEntrances);
+ for(const key of keys) {
+ const e = this.getStaticEntrance(key);
+ if(e.isSingleCave
+ && (e.region === path[1] || (e.region === 'mire' && path[1] === 'northeast') || (e.region === 'desert' && path[1] === 'south'))
+ && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if(e.isSingleCave
+ && (e.region === path[1] || (e.region === 'mire' && path[1] === 'northeast') || (e.region === 'desert' && path[1] === 'south'))
+ && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ }
+ } else if(this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.restricted.id) {
+ if(path.length === 0) {
+ retval.push({isLink:false, klass:'standard', id:'lightworld', name:'Light World'});
+ retval.push({isLink:false, klass:'standard', id:'darkworld', name:'Dark World'});
+ if(action === 'enterLinkedTo') {
+ retval.push({isLink:true, klass:'ugly', id:'junkCave', name: 'Junk Cave', extImg:'~/img/interior/junkCave.png'});
+ retval.push({isLink:true, klass:'ugly', id:'darkCave', name: 'Unknown Dark Cave', extImg:'~/img/interior/darkCave.png'});
+ }
+ } else if(path.length === 1 && path[0] === 'lightworld') {
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'kakariko', name:'Kakariko'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'Desert and South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'North East'});
+ } else if(path.length === 1 && path[0] === 'darkworld') {
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'village', name:'Village of Outcasts'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'Mire and North East'});
+ } else if(path.length === 2) {
+ const keys = path[0] === 'lightworld' ? Object.keys(this.lwStaticEntrances) : Object.keys(this.dwStaticEntrances);
+ for(const key of keys) {
+ const e = this.getStaticEntrance(key);
+ if(!(e.isHole || e.isHoleExit)
+ && (e.region === path[1] || (e.region === 'mire' && path[1] === 'northeast') || (e.region === 'desert' && path[1] === 'south'))
+ && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if(!(e.isHole || e.isHoleExit)
+ && (e.region === path[1] || (e.region === 'mire' && path[1] === 'northeast') || (e.region === 'desert' && path[1] === 'south'))
+ && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ }
+ } else if(this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.crossed.id || this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.full.id) {
+ if(path.length === 0) {
+ retval.push({isLink:false, klass:'standard', id:'lightworld', name:'Light World'});
+ retval.push({isLink:false, klass:'standard', id:'darkworld', name:'Dark World'});
+ if(action === 'enterLinkedTo') {
+ retval.push({isLink:true, klass:'ugly', id:'junkCave', name: 'Junk Cave', extImg:'~/img/interior/junkCave.png'});
+ retval.push({isLink:true, klass:'ugly', id:'darkCave', name: 'Unknown Dark Cave', extImg:'~/img/interior/darkCave.png'});
+ }
+ } else if(path.length === 1 && path[0] === 'lightworld') {
+ retval.push({isLink:false, klass:'standard', id:'dungeon', name:'Dungeons'});
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'kakariko', name:'Kakariko'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'Desert and South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'Hyrule Castle and North East'});
+ } else if(path.length === 1 && path[0] === 'darkworld') {
+ retval.push({isLink:false, klass:'standard', id:'dungeon', name:'Dungeons'});
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'village', name:'Village of Outcasts'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'Mire and North East'});
+ } else if(path.length === 2) {
+ const keys = path[0] === 'lightworld' ? Object.keys(this.lwStaticEntrances) : Object.keys(this.dwStaticEntrances);
+ for(const key of keys) {
+ const e = this.getStaticEntrance(key);
+ if(!(e.isHole || e.isHoleExit)
+ && (e.region === path[1] || ((e.region === 'mire' || e.region === 'castle') || (e.region === 'desert' && path[1] === 'south') && path[1] === 'northeast'))
+ && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if(!(e.isHole || e.isHoleExit)
+ && (e.region === path[1] || ((e.region === 'mire' || e.region === 'castle') || (e.region === 'desert' && path[1] === 'south') && path[1] === 'northeast'))
+ && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ }
+ } else if(this.modelManager.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.insanity.id) {
+ if(entrance.isHole) {
+ const keys = Object.keys(this.lwStaticEntrances).concat(Object.keys(this.dwStaticEntrances));
+ for(const key of keys){
+ const e = this.getStaticEntrance(key);
+ if(e.isHole && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if (e.isHole && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ } else if(path.length === 0) {
+ retval.push({isLink:false, klass:'standard', id:'lightworld', name:'Light World'});
+ retval.push({isLink:false, klass:'standard', id:'darkworld', name:'Dark World'});
+ if(action === 'enterLinkedTo') {
+ retval.push({isLink:true, klass:'ugly', id:'junkCave', name: 'Junk Cave', extImg:'~/img/interior/junkCave.png'});
+ retval.push({isLink:true, klass:'ugly', id:'darkCave', name: 'Unknown Dark Cave', extImg:'~/img/interior/darkCave.png'});
+ }
+ } else if(path.length === 1 && path[0] === 'lightworld') {
+ retval.push({isLink:false, klass:'standard', id:'dungeon', name:'Dungeons'});
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'kakariko', name:'Kakariko'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'Desert and South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'Hyrule Castle and North East'});
+ retval.push({isLink:false, klass:'standard', id:'holeExits', name:'Hole Exits'});
+ } else if(path.length === 1 && path[0] === 'darkworld') {
+ retval.push({isLink:false, klass:'standard', id:'dungeon', name:'Dungeons'});
+ retval.push({isLink:false, klass:'standard', id:'deathmtn', name:'Death Mountain'});
+ retval.push({isLink:false, klass:'standard', id:'village', name:'Village of Outcasts'});
+ retval.push({isLink:false, klass:'standard', id:'northwest', name:'North West'});
+ retval.push({isLink:false, klass:'standard', id:'south', name:'South'});
+ retval.push({isLink:false, klass:'standard', id:'northeast', name:'Mire and North East'});
+ retval.push({isLink:false, klass:'standard', id:'holeExits', name:'Hole Exits'});
+ } else if(path.length === 2) {
+ const keys = path[0] === 'lightworld' ? Object.keys(this.lwStaticEntrances) : Object.keys(this.dwStaticEntrances);
+ for(const key of keys) {
+ const e = this.getStaticEntrance(key);
+ if(!(e.isHole || e.isSkullWoods && e.isHoleExit)
+ && (e.region === path[1] || ((e.region === 'mire' || e.region === 'castle') && path[1] === 'northeast') || (e.region === 'desert' && path[1] === 'south') || (e.isHoleExit && path[1] ==='holeExits'))
+ && (!!this.modelManager.entrances[key][action] === alreadyLinked)) {
+ retval.push(
+ {
+ isLink: true,
+ klass: 'standard',
+ id:key,
+ isHole:!!e.isHole,
+ isHoleExit:!!e.isHoleExit,
+ isSkullWoods:!!e.isSkullWoods,
+ name:e.name,
+ intImg:e.intImg,
+ extImg:e.extImg,
+ junk:!!e.junk
+ }
+ );
+ } else if(!(e.isHole || (e.isSkullWoods && e.isHoleExit))
+ && (e.region === path[1] || ((e.region === 'mire' || e.region === 'castle') && path[1] === 'northeast') || (e.region === 'desert' && path[1] === 'south') || (e.isHoleExit && path[1] === 'holeExits'))
+ && (!!this.modelManager.entrances[key][action] !== alreadyLinked)) {
+ showAlreadyLinked = true;
+ }
+ }
+ if(!alreadyLinked && showAlreadyLinked){
+ retval.push({
+ isLink:false,
+ klass: 'danger',
+ id:'alreadyLinked',
+ name: 'Previously Linked'
+ });
+ }
+ }
+ }
+ return retval;
+ }
+
+ isKeyDarkWorld(key) {
+ return this.allKeys.indexOf(key)>=this.dwIndex;
+ }
+ getLogicText(staticEntrance, staticLink, action){
+ if(!staticEntrance || !staticLink) {
+ return '';
+ }
+ if(staticEntrance.isHole && action === 'enterLink') {
+ return [{text:'Falling in ', color:this.logicTextColors.basic},
+ {text:staticEntrance.name, color:this.logicTextColors.entrance},
+ {text:' overworld hole leads to ', color:this.logicTextColors.basic},
+ {text:staticLink.name, color:staticLink.region?this.logicTextColors.known: EntranceHelper.junkLinks.indexOf(staticLink.id)>-1 ? this.logicTextColors.junk : this.logicTextColors.unknown}];
+ } else if(action === 'enterLink') {
+ return [{text:'Entering ', color:this.logicTextColors.basic},
+ {text:staticEntrance.name, color:this.logicTextColors.entrance},
+ {text:' overworld door leads to ', color:this.logicTextColors.basic},
+ {text:staticLink.name, color:staticLink.region?this.logicTextColors.known:EntranceHelper.junkLinks.indexOf(staticLink.id)>-1 ? this.logicTextColors.junk :this.logicTextColors.unknown}];
+ } else if(action === 'exitLink') {
+ return [{text:'Exiting ', color:this.logicTextColors.basic},
+ {text:staticEntrance.name, color:this.logicTextColors.entrance},
+ {text:' leads to ', color:this.logicTextColors.basic},
+ {text:staticLink.name, color:staticLink.region?this.logicTextColors.known:EntranceHelper.junkLinks.indexOf(staticLink.id)>-1 ? this.logicTextColors.junk :this.logicTextColors.unknown},
+ {text:' overworld door', color:this.logicTextColors.basic}];
+ } else if(staticEntrance.isHole && action === 'enterLinkedTo') {
+ return [{text:'Falling in ', color:this.logicTextColors.basic},
+ {text:staticLink.name, color:staticLink.region?this.logicTextColors.known:EntranceHelper.junkLinks.indexOf(staticLink.id)>-1 ? this.logicTextColors.junk :this.logicTextColors.unknown},
+ {text:' overworld hole leads to ', color:this.logicTextColors.basic},
+ {text:staticEntrance.name, color:this.logicTextColors.entrance}];
+ } else if(action === 'enterLinkedTo') {
+ return [{text:'Entering ', color:this.logicTextColors.basic},
+ {text:staticLink.name, color:staticLink.region?this.logicTextColors.known:EntranceHelper.junkLinks.indexOf(staticLink.id)>-1 ? this.logicTextColors.junk :this.logicTextColors.unknown},
+ {text:' overworld door leads to ', color:this.logicTextColors.basic},
+ {text:staticEntrance.name, color:this.logicTextColors.entrance}];
+ } else {
+ return [{text:'Exiting ', color:this.logicTextColors.basic},
+ {text:staticLink.name, color:staticLink.region?this.logicTextColors.known:EntranceHelper.junkLinks.indexOf(staticLink.id)>-1 ? this.logicTextColors.junk :this.logicTextColors.unknown},
+ {text:' leads to ', color:this.logicTextColors.basic},
+ {text:staticEntrance.name, color:this.logicTextColors.entrance},
+ {text:' overworld door', color:this.logicTextColors.basic}];
+ }
+ }
+ static getPinSource(pin){
+ return pin === 'moonpearl' ? '~/img/items/moonpearl1.png'
+ : pin === 'mirror' ? '~/img/items/mirror1.png'
+ : pin === 'crystal' ? '~/img/dungeons/crystal3.png'
+ : pin === 'ganon' ? '~/img/items/ganon.png'
+ :pin === 'chest' ? '~/img/chest.png'
+ : pin === 'glove' ? '~/img/items/glove2.png'
+ : pin === 'flute' ? '~/img/items/flute1.png'
+ : pin === 'shovel' ? '~/img/items/shovel1.png'
+ : pin === 'fairy' ? '~/img/navbar/home.png'
+ : pin === 'shop' ? '~/img/shopLW.png' : '~/img/dungeons/blank.png';
+ }
+}
diff --git a/app/utils/GameSaveHelper.ts b/app/utils/GameSaveHelper.ts
index dc9b06a..7bd3618 100644
--- a/app/utils/GameSaveHelper.ts
+++ b/app/utils/GameSaveHelper.ts
@@ -22,6 +22,32 @@ export class GameSaveHelper {
label: 'Keysanity'
}
}
+ static entranceShuffleOptions = {
+ none: {
+ id: 'none',
+ label: 'None'
+ },
+ simple: {
+ id: 'simple',
+ label: 'Simple - BETA'
+ },
+ restricted: {
+ id: 'restricted',
+ label: 'Restricted - BETA'
+ },
+ full: {
+ id: 'full',
+ label: 'Full - BETA'
+ },
+ crossed: {
+ id: 'crossed',
+ label: 'Crossed - BETA'
+ },
+ insanity: {
+ id: 'insanity',
+ label: 'Insanity - BETA'
+ }
+ }
static goalOptions = {
ganon: {
id: 'ganon',
@@ -59,7 +85,7 @@ export class GameSaveHelper {
undefined,
undefined,
undefined,
- 20, 7, 7);
+ 20, 7, 7, 'none');
if(modelManager.gameSaves[key].timestamp){
g.timestamp = this.parseDate(modelManager.gameSaves[key].timestamp);
g.valid = modelManager.validateGame(modelManager.gameSaves[key]);
@@ -70,6 +96,7 @@ export class GameSaveHelper {
g.triforceGoal = modelManager.gameSaves[key].settings.triforceGoal;
g.openGT = modelManager.gameSaves[key].settings.openGT;
g.openGanon = modelManager.gameSaves[key].settings.openGanon;
+ g.entranceShuffle = this.entranceShuffleOptions[modelManager.gameSaves[key].settings.entranceShuffle].id;
}
retval[key]=g;
i++;
@@ -102,8 +129,9 @@ export class GameEditObj {
triforceGoal: number;
openGT: number;
openGanon: number;
+ entranceShuffle: string;
constructor(id: string, name: string, timestamp: string, valid: boolean, loaded: boolean,
- gameMode: string, itemShuffle: string, goal: string, triforceGoal: number, openGT: number, openGanon: number) {
+ gameMode: string, itemShuffle: string, goal: string, triforceGoal: number, openGT: number, openGanon: number, entranceShuffle: string) {
this.id = id;
this.name = name;
this.timestamp = timestamp;
@@ -115,5 +143,6 @@ export class GameEditObj {
this.triforceGoal = triforceGoal;
this.openGT = openGT;
this.openGanon = openGanon;
+ this.entranceShuffle = entranceShuffle;
}
}
diff --git a/app/utils/ModelManager.ts b/app/utils/ModelManager.ts
index ca81499..bed251d 100644
--- a/app/utils/ModelManager.ts
+++ b/app/utils/ModelManager.ts
@@ -15,6 +15,8 @@ import {InvertedDefaultMap, InvertedMapData} from '@/default-objects/InvertedDef
import {IDefaultMapData} from '@/default-objects/DefaultMap';
import {DefaultGameSaves, DefaultGameSavesData, GameVersions, Game} from '@/default-objects/DefaultGameSaves';
import {RetroDefaultMap, RetroMapData} from '@/default-objects/RetroDefaultMap';
+import {DefaultEntranceData, DefaultEntrances} from '@/default-objects/DefaultEntrances';
+import {EntranceHelper} from '@/utils/EntranceHelper';
export class ModelManager {
items: DefaultItemsData;
@@ -23,6 +25,7 @@ export class ModelManager {
settings: DefaultSettingsData;
gameSaves: DefaultGameSavesData;
editGame: GameEditObj;
+ entrances: DefaultEntranceData;
appVersion = '1.1.1';
itemsVersion = '0.0.1';
@@ -30,6 +33,7 @@ export class ModelManager {
mapVersion = '0.0.1';
settingsVersion = '0.0.1';
gameSavesVersion = '0.0.1';
+ entrancesVersion = '0.0.1';
sol: StaticObjectLoader;
@@ -40,6 +44,7 @@ export class ModelManager {
this.items = this.validateItemsFromStorage();
this.dungeons = this.validateDungeonsFromStorage();
this.map = this.validateMapFromStorage();
+ this.entrances = this.validateEntrancesFromStorage();
this.initEmptyGameSave();
}
@@ -85,6 +90,31 @@ export class ModelManager {
return retval;
}
+ validateEntrancesFromStorage() :DefaultEntranceData {
+ if(this.settings.entranceShuffle === undefined || this.settings.entranceShuffle === 'none'){
+ console.log('No entrances required. Setting to undefined.');
+ return undefined;
+ }
+ let retval = new DefaultEntranceData();
+ let stored = undefined;
+ if (hasKey('entrances')) {
+ try {
+ stored = DefaultEntrances.fromJSON(getString('entrances'));
+ if (stored.version && stored.version === this.entrancesVersion) {
+ retval = stored.data;
+ console.log('successfully got entrances from storage!');
+ } else {
+ console.log('entrances versions do not match got:', stored.version, 'wanted:', this.dungeonsVersion);
+ }
+ } catch (err) {
+ console.error('error getting entrances from storage', err);
+ }
+ } else {
+ console.log('no entrances found in storage, loading default');
+ }
+ return retval;
+ }
+
validateMapFromStorage() :IDefaultMapData{
let retval = this.settings.gameMode == this.sol.RETRO ? new RetroMapData()
: this.settings.gameMode == this.sol.INVERTED ? new InvertedMapData()
@@ -304,24 +334,50 @@ export class ModelManager {
const lskeys = Object.keys(this.sol.getStaticMapShopsLW(this.settings.gameMode));
const dskeys = Object.keys(this.sol.getStaticMapShopsDW(this.settings.gameMode));
for (const key of lkeys) {
- this.map.lightworld.locations[key].klass = this.sol.getStaticMapLW(this.settings.gameMode)[key].validate(this.items, this.dungeons) ? 'locale-green' : 'locale-red';
+ if(this.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id) {
+ this.map.lightworld.locations[key].klass = this.sol.getStaticMapLW(this.settings.gameMode)[key].validate(this.items, this.dungeons) ? 'locale-green' : 'locale-red';
+ } else {
+ this.map.lightworld.locations[key].klass = this.sol.getStaticMapLW(this.settings.gameMode)[key].validateEntrance(this.items, this.dungeons, this.entrances) ? 'locale-green' : 'locale-red';
+ }
}
for (const key of ldkeys) {
- this.map.lightworld.dungeons[key].klass = this.sol.getStaticMapDungeonsLW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
- this.map.lightworld.bosses[key].klass = this.sol.getStaticMapDungeonsLW(this.settings.gameMode)[key].validateBoss(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ if(this.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id) {
+ this.map.lightworld.dungeons[key].klass = this.sol.getStaticMapDungeonsLW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ this.map.lightworld.bosses[key].klass = this.sol.getStaticMapDungeonsLW(this.settings.gameMode)[key].validateBoss(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ } else {
+ this.map.lightworld.dungeons[key].klass = this.sol.getStaticMapDungeonsLW(this.settings.gameMode)[key].validateEntrance(this.items, this.dungeons, this.entrances, this.settings) ? 'locale-green' : 'locale-red';
+ this.map.lightworld.bosses[key].klass = this.sol.getStaticMapDungeonsLW(this.settings.gameMode)[key].validateBossEntrance(this.items, this.dungeons, this.entrances, this.settings) ? 'locale-green' : 'locale-red';
+ }
}
for (const key of dkeys) {
- this.map.darkworld.locations[key].klass = this.sol.getStaticMapDW(this.settings.gameMode)[key].validate(this.items, this.dungeons) ? 'locale-green' : 'locale-red';
+ if(this.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id) {
+ this.map.darkworld.locations[key].klass = this.sol.getStaticMapDW(this.settings.gameMode)[key].validate(this.items, this.dungeons) ? 'locale-green' : 'locale-red';
+ } else {
+ this.map.darkworld.locations[key].klass = this.sol.getStaticMapDW(this.settings.gameMode)[key].validateEntrance(this.items, this.dungeons, this.entrances) ? 'locale-green' : 'locale-red';
+ }
}
for (const key of ddkeys) {
- this.map.darkworld.dungeons[key].klass = this.sol.getStaticMapDungeonsDW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
- this.map.darkworld.bosses[key].klass = this.sol.getStaticMapDungeonsDW(this.settings.gameMode)[key].validateBoss(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ if(this.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id) {
+ this.map.darkworld.dungeons[key].klass = this.sol.getStaticMapDungeonsDW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ this.map.darkworld.bosses[key].klass = this.sol.getStaticMapDungeonsDW(this.settings.gameMode)[key].validateBoss(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ } else {
+ this.map.darkworld.dungeons[key].klass = this.sol.getStaticMapDungeonsDW(this.settings.gameMode)[key].validateEntrance(this.items, this.dungeons, this.entrances, this.settings) ? 'locale-green' : 'locale-red';
+ this.map.darkworld.bosses[key].klass = this.sol.getStaticMapDungeonsDW(this.settings.gameMode)[key].validateBossEntrance(this.items, this.dungeons, this.entrances, this.settings) ? 'locale-green' : 'locale-red';
+ }
}
for(const key of lskeys) {
- this.map.lightworld.shops[key].klass = this.sol.getStaticMapShopsLW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ if(this.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id) {
+ this.map.lightworld.shops[key].klass = this.sol.getStaticMapShopsLW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ } else {
+ this.map.lightworld.shops[key].klass = this.sol.getStaticMapShopsLW(this.settings.gameMode)[key].validateEntrance(this.items, this.dungeons, this.entrances, this.settings) ? 'locale-green' : 'locale-red';
+ }
}
for(const key of dskeys) {
- this.map.darkworld.shops[key].klass = this.sol.getStaticMapShopsDW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ if(this.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id) {
+ this.map.darkworld.shops[key].klass = this.sol.getStaticMapShopsDW(this.settings.gameMode)[key].validate(this.items, this.dungeons, this.settings) ? 'locale-green' : 'locale-red';
+ } else {
+ this.map.darkworld.shops[key].klass = this.sol.getStaticMapShopsDW(this.settings.gameMode)[key].validateEntrance(this.items, this.dungeons, this.entrances, this.settings) ? 'locale-green' : 'locale-red';
+ }
}
}
@@ -356,9 +412,9 @@ export class ModelManager {
}
}
- createGame(id :string, itemShuffle: string, gameMode: string, goal: string, triforceGoal: number, openGT: number, openGanon:number) :void{
- console.log(id, itemShuffle, gameMode, goal);
- if (!id || !itemShuffle || !gameMode || !goal) {
+ createGame(id :string, itemShuffle: string, gameMode: string, goal: string, triforceGoal: number, openGT: number, openGanon:number, entranceShuffle: string) :void{
+ console.log(id, itemShuffle, entranceShuffle, gameMode, goal);
+ if (!id || !itemShuffle || !gameMode || !goal || !entranceShuffle) {
throw new Error('create game failed!');
}
const game = new Game();
@@ -372,7 +428,8 @@ export class ModelManager {
this.itemsVersion,
this.dungeonsVersion,
this.mapVersion,
- this.settingsVersion);
+ this.settingsVersion,
+ this.entrancesVersion);
game.settings.gameSlot = id;
game.settings.itemShuffle = itemShuffle;
game.settings.gameMode = gameMode;
@@ -380,6 +437,7 @@ export class ModelManager {
game.settings.triforceGoal = triforceGoal;
game.settings.openGT = openGT;
game.settings.openGanon = openGanon;
+ game.settings.entranceShuffle = entranceShuffle;
const staticDungeons = this.sol.getStaticDungeons(game.settings.gameMode, game.settings.itemShuffle);
const keys = Object.keys(game.dungeons);
for (const key of keys) {
@@ -388,6 +446,7 @@ export class ModelManager {
}
this.gameSaves[id] = game;
const d = new DefaultGameSaves();
+ game.entrances = game.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id ? undefined : new DefaultEntranceData();
d.data = this.gameSaves;
setString('gameSaves', d.toJSONString());
this.editGame = GameSaveHelper.parseGameSaves(this)[id];
@@ -404,6 +463,7 @@ export class ModelManager {
: StandardMapData.fromObject(this.gameSaves[id].map);
this.dungeons = DefaultDungeonsData.fromObject(this.gameSaves[id].dungeons);
this.items = DefaultItemsData.fromObject(this.gameSaves[id].items);
+ this.entrances = this.settings.entranceShuffle === GameSaveHelper.entranceShuffleOptions.none.id ? undefined : DefaultEntranceData.fromObject(this.gameSaves[id].entrances);
this.saveSettings();
this.saveCurrentGame();
}
@@ -437,13 +497,15 @@ export class ModelManager {
this.gameSaves[game].items = this.items.getCopy();
this.gameSaves[game].dungeons = this.dungeons.getCopy();
this.gameSaves[game].map = this.map.getCopy();
+ this.gameSaves[game].entrances = this.entrances ? this.entrances.getCopy() : undefined;
this.gameSaves[game].settings = this.settings.getCopy();
this.gameSaves[game].timestamp = Date.now();
this.gameSaves[game].versions = new GameVersions(
this.itemsVersion,
this.dungeonsVersion,
this.mapVersion,
- this.settingsVersion
+ this.settingsVersion,
+ this.entrancesVersion
);
const d = new DefaultGameSaves();
d.data = this.gameSaves;
@@ -451,6 +513,7 @@ export class ModelManager {
this.saveItems(true);
this.saveDungeons(true);
this.saveMap(true);
+ this.saveEntrances(true);
setString('gameSaves', d.toJSONString());
}
@@ -467,4 +530,28 @@ export class ModelManager {
this.saveCurrentGame();
}
}
+ isEntrancesEnabled() :boolean {
+ return this.settings.entranceShuffle !== GameSaveHelper.entranceShuffleOptions.none.id;
+ }
+ getEntranceShuffleMode() :string {
+ return this.settings.entranceShuffle;
+ }
+ getAllEntrances() :DefaultEntranceData{
+ return this.entrances.getCopy();
+ }
+ saveEntrances(skipGameSave?:boolean) {
+ if(this.settings.entranceShuffle == GameSaveHelper.entranceShuffleOptions.none.id){
+ return;
+ }
+ const d = new DefaultEntrances();
+ d.data = this.entrances.getCopy();
+ setString('entrances', d.toJSONString());
+ if(!skipGameSave){
+ this.saveCurrentGame();
+ }
+ }
+ resetEntrances(){
+ this.entrances = new DefaultEntranceData();
+ this.saveEntrances();
+ }
}
diff --git a/app/utils/StaticObjectLoader.ts b/app/utils/StaticObjectLoader.ts
index 355dd4e..1dc320d 100644
--- a/app/utils/StaticObjectLoader.ts
+++ b/app/utils/StaticObjectLoader.ts
@@ -20,6 +20,9 @@ import {RetroStaticDungeons} from '@/retro/RetroStaticDungeons';
import {RetroStaticItems} from '@/retro/RetroStaticItems';
import {RetroStaticMapShopsLW} from '@/retro/RetroStaticMapShopsLW';
import {RetroStaticMapShopsDW} from '@/retro/RetroStaticMapShopsDW';
+import {GameSaveHelper} from '@/utils/GameSaveHelper';
+import {StaticEntrancesLW} from '@/entrance/StaticEntrancesLW';
+import {StaticEntrancesDW} from '@/entrance/StaticEntrancesDW';
export class StaticObjectLoader {
STANDARD = 'standard';
@@ -167,4 +170,24 @@ export class StaticObjectLoader {
return {};
}
}
+ getStaticEntrancesLW(es) {
+ if(!es) {
+ throw new Error('entrance shuffle not provided');
+ }
+ if(es === GameSaveHelper.entranceShuffleOptions.none.id){
+ return {};
+ } else {
+ return new StaticEntrancesLW();
+ }
+ }
+ getStaticEntrancesDW(es) {
+ if(!es) {
+ throw new Error('entrance shuffle not provided');
+ }
+ if(es === GameSaveHelper.entranceShuffleOptions.none.id){
+ return {};
+ } else {
+ return new StaticEntrancesDW();
+ }
+ }
}
diff --git a/app/vue-extend.ts b/app/vue-extend.ts
index 41caa0b..d9dea14 100644
--- a/app/vue-extend.ts
+++ b/app/vue-extend.ts
@@ -5,6 +5,7 @@ import {StaticObjectLoader} from '@/utils/StaticObjectLoader';
declare module 'vue-property-decorator' {
interface Vue {
$navigateTo(...args: any[]);
+ $navigateBack(...args: any[]);
$showModal(...args: any[]);
$closeModal(...args: any[]);
$modelManager: ModelManager;
diff --git a/assets/EG2_map.png b/assets/EG2_map.png
new file mode 100644
index 0000000..2dd8600
Binary files /dev/null and b/assets/EG2_map.png differ
diff --git a/assets/full.png b/assets/full.png
new file mode 100644
index 0000000..b4b957b
Binary files /dev/null and b/assets/full.png differ