Isle of Eros: Dev Journal #2
Added 2025-10-22 10:00:14 +0000 UTCThis time, I'm talking about Locations in the game (and, by extension, its predecessor ).
I guess the obvious place to start is with what a "location" is. It may seem like a dumb thing to wonder about, but it's a little trickier in practice.
First, there's no inherent thing in Twine/Harlowe (the program/language I use) called a location. The closest thing is the basic building block of a Twine story: the passage. Passages are pretty much any screen in the game. It's a lot more complicated (or can be, depending on code), but whenever you click one of those little choice buttons at the bottom of a page, you are going to a new Passage within the game.
When I map out a game like this, I generally create a single passage for a location, with sub-passages for most of the little interactive elements or dialogues.
In Enter the Expansion Mansion, this was pretty easy. A new room is a new location, is a new passage. If you want to investigate the "Boobifier 3000" sitting in the "Example room" (not real things in the game, FYI), then you click a button that says something like "Investigate the boob enhancement device" and then BAM! you're in a whole new passage. Once you're done, you'll click a button that says "Continue exploring the Example room."
On my end, this will look like a connection between passages within Twine, such that there's an arrow pointing from the "Example room" passage to the "Boobifier 3000" passage and back.
In the game, however, you're still in that same room. The same location. You never left the room, even though you just switched passages.
I've made this idea of locations a bit more explicit in Isle of Eros because I wanted players to more easily keep track of where they are. To that end, you've likely noticed the location header. This is the bold text at the top of each passage that tells you you're in "Eros's Grotto" or on the "Calm Beach."
For those interested, there's a simple bit of Harlowe code I use to pull this off, and here it is:
{
|location>[
(text-size: 1.5)+(text-style: "bold")[$currentlocation]
<br>
---
]
}
{
(set: $currentlocation to "Location Name")
(rerun: ?location)
}
In the game, the above code is split across two separate passages, with the top being on a universal "Header" passage that runs its code on every single passage, every single time. The lower part is unique to each passage, with the "Location Name" being switched out depending on, well, the name of the current location.
For those unfamiliar with Harlowe code, this code means every page will have a large, bold bit of text that is whatever is held (set) in the $currentlocation variable. Whenever you go somewhere new, the passage will set that variable to a new name, then it will rerun the header passage's ?location code (called a "hook" in Harlowe terms), which means the text at the top that's always there will realign to the name of your "current location." All this happens before you ever even see the passage you're moving to.
Riveting, I know.
The outcome of this is I don't have to worry about naming the location on every single passage. If you're hanging around somewhere and chatting with a character or investigating stuff (like inside the workshop, for example), then I can just ignore the location name. It'll stay put until you leave and go to a new location, where I can make sure it's renamed and rerun.
As nice as that is, the real innovation in locations this time around is a much bigger deal: tags.
In Twine, you can tag every single passage with default or custom tags. That "header" passage I mentioned? It has the (shockingly named) header tag, which is a default tag that causes it to be run before every passage. That's also where other code lives, like the stuff that creates the Save/Load/Info buttons in the sidebar.
I used mostly just default tags in Enter the Expansion Mansion, but for this game, I've started getting more comfortable with custom tags. The biggest ones are "indoor/outdoor" which will be important in a much later update and a set for the passage's environment: "beach/jungle/rocky/etc." These let me vary the text I pull from other passages (more on that in the next Dev Journal), so that I can directly reference the environment.
Here's an example of what that code looks like:
(cond:
(passage: )'s tags contains "Beach",
"to your knees on the beach's warm sand",
(passage: )'s tags contains "Rocky",
"back to sit on a nearby hunk of smooth stone",
(passage: )'s tags contains "Jungle",
"to your knees on the soft soil and scattered leaves of the jungle floor with a light, rustling crunch"
)
This bit of code checks the passage's custom tags for one of the environmental indicators to know which bit of prose to plug in so I don't have to write something boring like "you drop to your knees where you stand." I can actually tell you how your character is interacting with the world, regardless of where you are in that world.
And that's about all I have to say on Locations in Isle of Eros for now. I'm sure there's more I could say, but I've still got plenty of locations that need to be filled to the brim with boob and more!
Next time, I'll be talking (as mentioned above) about pulling text from one passage to another. If that doesn't sound super exciting to you, then you might like to know that this little trick is something I use mostly for the game's breast expansion sequences!
If you enjoyed this second Dev Journal, let me know with a like or comment. As long as there's interest, I'm happy to keep writing them while I have topics to write about. Also, please let me know specifically if you like seeing the actual code from the game pulled out like this for examples. It's pretty easy to do, so I'll gladly keep doing it if there's an audience.