egg-dev
egg-dev
Making Games in Stupid Ways
6 posts
The Development Blog for Climb the Pyramid, a game developed entirely in Google Sheets and App Scripts. This is my first major coding project.
Don't wanna be here? Send us removal request.
egg-dev · 2 days ago
Text
When we talk about choice in games, we often have a very clear idea of what that means. Games like Mass Effect and Baulder's Gate go out of their way to make player choice valuable and important.
But where many of these kinds of games fail is when those choices aren't as impactful as we expect. Mass Effect 3 famously caused problems as all choices led to a single conclusion. The payoff fizzled out.
But the issue here is not that the game failed to make choices important, but their importance was oversold.
I recently played Final Fantasy 7: Rebirth, and I was blown away by the inclusion of a simple yet impact choice that deeply affected my time playing: I could disable the minimap.
When disabled, I felt more immersed in the world. I had to learn how to navigate. I got lost in areas where you are meant to get lost. I explored more. I followed instructions.
The true impact this choice had on me, however, was that it was a surprise. I was never told it was important.
When I talk about choice in games, this is what I mean. Unimportant moments that reflect my personality. Choosing which path to travel down a meaningless dirt road. Player choice matters most when it isn't important.
7 notes · View notes
egg-dev · 29 days ago
Text
I often talk about the value of collaborative storytelling in DnD. Its a very hard thing for a lot of people to full wrap their heads around. As DMs, we believe a huge part of our jobs is to construct a fully realised world and solve for every action our players can possibly think of. But the end result of this is, ironically, a stilted world with nowhere to go.
I recently finished up a session with my players. I like guest stars and magic items, so I brought in my old DM in as a PC who sells magical items. I asked her to construct a number of magic items with some broad specifications, but wanted no other involvement in their development. I wanted to be as surprised by the players when she showscased them.
There were a few reasons for this. 1) I would not make a bunch of broken items. I'm too close to the game. I gave her no context about the story outside of suggesting a single motif to design an item around for each player. I wanted some chaos to be added and for my players to be excited about these items. I wanted variables that I can't plan for that allowed for more engaging roleplay and improv on all our parts. 2) i'm not good at making magic items. My old DM was very, very good at it. So, I defered to her expertise. 3) I wanted to be just as surprised as the players and 4) It gave the guest star a central role in the session, as all eyes were drawn and focused on the excitement she brought.
This resulted in a very weird session with a lot of "you had to have planned that moments." I knew the guest star's character's ultimate goal for the session was to find a cowboy hat, and did my best to incorporate that in. The natural chaos of the session allowed for a number of variables that allowed for me to hook in that story beat and bring the themes of the session together.
For context: two of the items the guest star brought was a marble that could split into many smaller marbles and a gun that could ricochet its shots once per day. This session took place at night. The guest star's pop-up shop was set up along the main street of town.
When showcasing how the gun worked, she rolled really badly. I said that she fired the gun, and it richoted off three of the legs of the town's sherif's watchtower, waking her up and forcing the pop-up shop to move. Behind them was a delapodated school, so the guest star and the party moved to behind the school.
Once in the playground behind the school, the players made a perception check and spied a hat atop a flag pole on top of the school. The guest star, an angel (cant rememeber the official race name), tried to fly up but was stopped by some demonic barrier.
At this point, I had two hopes. First, the PC's would get the hat and use it as a bargaining chip to get a discount on the items. Second, that this barrier set up some suspicion around the school.
So one of the player's used their spider climbing to collect the hat and immediately gave it to the guest star. I'm worried now because this whole session has had no stakes, no conflict, nothing. So i say the hat is posessed. Upon picking it up, the player's bones rattle. Once at the bottom, it comes to life.
Now, i hate combat, and the campaign is on the goofier side. So, given we're in the playground, the hat falls to the ground, collects the marble item, draws a circle around it, and forces the players to play marbels.
The way i ran this was each player rolled initiative. This determined turn order. The only rule was that no one could cross the line and touch the marble. Players could roll dex to hit a marble in the circle with their own. On a 1-7, the player lost their marble and hit nothing. On a 8-14, the player would knock out a marble, but theirs would be stuck. On a 15-19, the player would knock the marble they hit and their original out, and on a 20, they'd knock their original, their intended target and another out.
Additionally, players fuck with the game however they want. One cast minor illusion to distract the hat with a sexy hat. Another used minor illusion to fake out the hat and stop it from cheating by producing multiple marbles. Our gunslinger, however, got a chance to use their new gun, as it had struck midnight since the last time gun was used.
In the process of hitting a nat 20 on their roll and firing a marble from the flintlock pistol (entirely coincidental) he launched 5 marbles from the ring. But by rolling a 1 on the final hit, lodged a marble in the dirt.
Finally, the hat went. It brought more marbles in and cast flesh-to-stone on the marbles to make them harder to hit.
Our guest star, however, enchanted their marble and caused an explosion that knocked the embedded marble from its trench.
In only one more round of the game, the players had won "all the marbles." They exorcised the hat, and the guest star went home happy.
I say all of this to show the impressive power of skeleton notes and the ability to be flexible. My plan going in was "players are gonna shop" and "give hat". That's it. The rest was a product of solving problems on the fly and the consequences of bad rolls. If i had made a concrete plan of attack and tried to railroad the players into that, then I would have shot myself in the foot. Either i would have too concrete of an idea, with no wiggle room, or I'd be disappointed when things didn't go my way. Which is the opposite of what the goal is.
When I played this session, i actually did and said very little. I gave the players a space to play in, and answered questions when asked. At the end of the day, the agency was on them. It allowed them to be a part of the world and feel like they're involved in its creation.
If i could offer any advice to new DMs, it would be to set a silly tone early. Plan a skeleton story. Allow yourself to retcon information you haven't shared yet. Build a foundation but let your players fill it
0 notes
egg-dev · 1 month ago
Text
The strength of certain evergreen board games, at its core, is flexibility. People often deride both dnd and monopoly as bad, albeit popular, examples of the genre. Now this isn't to say anything negative of game developers that try to iron out the less fun elements of both games, however their systems opporate such that you can meaningfully play those games while breaking rules or adapting house rules.
In truth, monopoly is just a board, pieces and a few rules on how the game should flow. What happens in between is ultimately made up and agreed upon by the players. The same is true of DnD. DnD is a very crunchy game, if you want it to be. You can ignore those elements and still play DnD.
However, other games like Catan require every rule to be followed in order for the game to be played. House rules are less common, and so the game is less evergreen.
The hallmark of a strong game with longevity isn't the absence of problems or boring parts, but the freedom to ignore them. To make the game your own
16 notes · View notes
egg-dev · 5 months ago
Text
So i have like no formal training in game development and so each phase of my development cycle is this strange combination of figuring out a solution to a problem and learning new elements of coding.
Part of what's nice about code is that it is, at its core, a language (yeah duh) and because of that, you really can combine it in whatever way you want. All you need to know are the moving parts and the kinds of connections you can make and it all has a habit of combing together.
Where I struggle most is degrees of abstraction. This is the space that leaves me the most blank faced. Often times I can hold one or two ideas in my head without understand how they practically function, but any more than that makes the entire house of cards collapse.
The first piece of code that truly left me stumped in this way was a function that would determine the absolute difference in values of two inputs. This was used to determine which direction the monsters would move in order to get closer to you.
Tumblr media
This is the current implementation. I needed to ask a much smarter friend of mine to help.
Loops are especially difficult for me because of this. In part, because I don't fully understand how they're structured and a lot of examples I've pulled from to learn about them were multiple degrees of abstraction deep.
I'm going to draw from the function used to find the position of a given value within the array. In practice, this is used to determine the position of a battle:
Tumblr media
When I first used this code, I really didn't understand how most of it worked. And you may notice this more as I talk about my code without proper terminology. At the time I used this code, I had never put anything in a function's '()'s. I didn't even know anything could go in there. So that took me a solid couple weeks to understand. In fact, it took maybe 3 or 4 additional features being written for it to sink in.
So you can understand how just this degree of complexity threw me off.
For the sake of any reader who doesn't understand how these work and feel (as I do) that all coding documentation is dogshit, the variables included in the '()'s are values which are defined at the time this function is run. So in the function below you can see I call this function as: "findValuePosition("E13:P24", "B")
(Well actually, I call it as 'findValuePosition(arenaArray, "B") in which 'arenaArray' is defined as "E13:P24". Are you starting to see the problem?)
In practice, what this does is allow for easy recycling of a function. If two functions are identical, except for one or two variables, you can use this way of building a function so you don't need two separate functions.
Tumblr media
Most of the basic code I've written up to this point, do not include parameters, let alone two.
Super handy. Super obtuse. This is apparently what coding is like.
The issue I then ran into is the compounding obtuseness of this in conjunction with a loop.
Loops are a kind of code you can run repeatedly on their own. You set base values, conditions and behaviours and the code will repeat. Forever. Unless you tell it to stop. Which you might not do, by accident, and it just does run forever.
I'm going to be real, I still only have a passing understanding of how the findValuePosition() loop works. I don't understand how the loop doesn't pass straight through the value its looking for. Or when each instances of looping runs. The timing of the whole operation completely goes over my head, but I understand enough of it to apply and reapply this concept as necessary.
Each time I implement a new loop I understand how it works a little bit better and even now, at the time of writing this, I have a more solid grasp of it than I did when first implementing it.
This is probably the strangest feature of coding. Things quickly go from nonsense to making a lot of sense and its never very clear when that line has been crossed.
Future Concepts
At this point you might be asking yourself why I even bother with this formula at all. The application of finding the coordinates of a fight in the game is limited. In fact, I'm confident nothing uses the output of this function anymore.
However, the value of this function is more about teaching me how to do something like this. It is the principle behind how the game can read its own visual output.
The weird thing about Google Sheets as a platform for game design is that it serves all game design functions within itself. The game is visually rendered in Google Sheets. The game's engine runs in Google Sheets.
It would be the equivalent of being able to store complex code into each pixel of a screen and being able to reference that data. Each cell serves the purpose of pixel, function and database.
In my instance, each cell which makes up the games' 12x12 grid is filled with code that is used to determine what to render based on the values it finds in the back end. But, in theory, you could write new sprites to each cell every update cycle, or reload the full code contained within.
As such, I have a prototype version of the game which uses screen scrolling. This may not be implemented due to various reasons but the principle is there and profound for a platform which still elicits shock when it and game design are mentioned in the same breath.
9 notes · View notes
egg-dev · 5 months ago
Text
Climb the Tower Alpha 0.1.3 is now playable
To play the game, follow the link below
No additional requirements should be needed to get the game working.
If you encounter any issues, please email [email protected]
Known Issues:
The game runs slowly. Its running in Google Sheets. This is fun but its not a high quality game engine. Please be patient, especially during your first run through the game.
Sometimes inputs are eaten and scripts fail to run. If several seconds have passed since you clicked a checkbox and it hasn't unchecked itself, feel free to uncheck and try again.
After defeating the Knight, the game will return to the normal enemy encounters. There is no further progress from this point yet.
Prospective features:
Currency and Shop System Armour and Weapons Tuned drop rates Multiple levels + Bosses Adjustable Arena Size to match levels/bosses
2 notes · View notes
egg-dev · 5 months ago
Text
Tumblr media
Climb the Tower is a rogue-like in early Alpha, developed in Google Sheets using App Scripts.
This blog serves as a Development diary for the game.
The ethos of the game is to develop a fun and engaging experience that can be played at work or during school in a format which is hard to notice.
As such, the game is freeware and I encourage people share it freely.
6 notes · View notes