All RPGs and Storygames by Tod Foley are now available at DrivethruRPG and RPGnow. Bring these games to your table!
Sometimes you play one of those games that’s just so good, you can’t stop talking about it. I’ve already written several articles inspired by the Tales from the Loop game I played, and so has my fellow gnome Wen — and here, at the end of the campaign, is one more. A tribute to the intensity, the feels, the fun, and the amazing experience we all had, if you will: here are three important lessons I learned (or relearned) from the end of that campaign. To preface these lessons — Tales from the Loop is a wonderful game! If you have played it in setting, you will probably notice my stories from this campaign bear little resemblance to the book. We riffed a lot and for this return to our characters didn’t wait for Things from the Flood. We just fast forwarded everything 10 years, played a round of Microscope to fill in the timeline, and jumped back into a world with aliens, cloning, and time travel technology.1. You shouldn’t always have a sequel.
That game was good. It was the kind of good you never want to end. I could have played that game into eternity, but…by the time we got to eternity, it wouldn’t have been the same game anymore. Despite my desire to continue playing out Stacie and her terribly messy love and life situation, there is a point where it would become boring. Routine. No longer shocking, fascinating, and surrounded with questions. The end of this campaign was bittersweet to be sure — some lived, some died, relationships ended — but we know how their stories will go. All the major questions have been answered (yes, Stacie ends up with Harrison, yes, she will eventually have to kill him). I want more…but I shouldn’t have more. This story is complete, and like any good story, it has an end point. I want more…but I shouldn’t have more. This story is complete, and like any good story, it has an end point.
Ending on wanting more is a lesson we learn again and again in this age of sequels and trilogies that were only intended to ever have one movie or one season — the sequels are rarely as good. So I’m happy to leave our wayward band of time travelers in their alternate past. The world is an absolute disaster, but the questions we started with about all our characters are answered brilliantly. It’s time to bid them goodbye.2. Just because it’s crazy doesn’t mean it’s not deathly serious.
I run crazy games all the time, and I love them! My games hit a level of crazy that’s very silly because they aren’t serious. (See: The Art of the Off the Wall Con Game) The thing with games that go a bit crazy like that is that they are frequently unsustainable, because you can’t keep raising the levels forever. The thing with this game was that while the level of crazy started…well, pretty off the wall, the emotional intensity started lower and built beautifully over the course of our sessions. The plot twisted into a roiling mass of time travel and time loop events, but the true drama was ours, our kids from part one, ten years later, just trying to figure out how to be themselves and grow up in a world that couldn’t let them be normal. And sure, things were seriously all over the place — but we were absolutely and completely committed to the emotional play of our PCs. Sometimes we laughed a lot, but those meta moments were interspersed with scenes worthy of Oscars dealing with difficult decisions and trust. Trying to describe the events of this game is definitely one of those narratives that gives gaming stories a bad name (you simply had to be there), but there wasn’t an in game moment that wasn’t worthy of the kind of apocalyptic time travel epic it became.
Knowing that there is a safe space to revoke your consent in play if something goes too far means we can be much more willing as a group to see just how far we can go. Having a culture of safety and trust with the people that you play with is storytelling magic. Games with anything goes kinds of plots can be functionally covered in knives from a safety perspective because everyone can drive the story and we are always reaching for the next level, to go further. Knowing that there is a safe space to revoke your consent in play if something goes too far means we can be much more willing as a group to see just how far we can go. I feel unbelievably privileged to play with these folks and have that space, where we can just keep pushing things harder and see what happens.3. Music is not the enemy.
I am not always a fan of background music in games. Frequently I find it distracting and often not on the right tone for whatever is happening in game right now. It can be technically challenging and slightly disjointed as a GM to try to manage keeping up with music and making it match the current mood — it’s like improvisational sound design, which is a lot of extra cognitive load.
In this game, our GM Quincy used music so brilliantly I don’t even have words.
The songs that we each selected as representative of our characters when we recreated their 90s selves came back to haunt our much wiser, much worse for wear selves as we concluded the campaign, creating a brilliant circle and a reminder of where we’d started before our timeline went to hell in a handbasket. Halfway through a scene of me telling my fiance that I didn’t want to marry him after all, quiet in the background comes up the song I chose so many weeks before: Don’t Speak (No Doubt). Perfection incarnate. I am rethinking my feelings about using music in my games, because intentional, specific music for those moments is truly magical.
It was truly a pleasure, Tales from the Loop. Perhaps someday we’ll visit you again.
Do you have those games that left strong memories for you? Did they end at the right time, or go on too long? Did you learn anything from the way they ended?
I used to draw a lot. I never thought of myself as a good artist, but I felt like I had a knack for replicating images, so I turned into a game. I’d say, “let’s see if I can take this small cell from my favorite comic and blow it up into a larger version of itself.” Take this for example:
Alita as drawn by Amy
It came as no surprise to me when I became obsessed with creating responsively pixel perfect websites that represented our talented design team’s work precisely. There was a problem, however. Up until recently front end developers didn’t have a great way to create responsive grids, so we used the tools that we had readily available to us. For example, if you intend to bake chocolate chip cookies with carob, the result is going to be wildly different than if you used chocolate chips! (Carob is never a replacement for chocolate, I don’t care what you say…)
Let’s review our options in the evolutionary order we received them:
- Tables: Tables were originally intended for tabular data created through HTML and nothing more.
- Floats: Since the web was inspired by print, floats were created to successfully wrap text around images. Floats used with inline elements, and specified widths and gutters, have been used for years to create grids. In addition, all browsers support floats. The problem, however, is they can be complex, prone to break, and often contain tricky clearing and nth item margin removal between responsive breakpoints. In other words, it’s a lot of work.
- Flexbox: As browsers became more supportive of flexbox, many of us got tremendously excited. Flexbox was designed with rows and columns in mind, including created elements within rows and columns that have equal heights and widths. Vertical centering has never been easier, but that’s a whole other blog post. Flex-wrap made it possible for front end devs to create grids using flexbox, so we kissed floated grids goodbye.
- Grid Layout: Low and behold, a CSS solution made with grid styling in mind - finally! As soon as this became widely browser compatible, I jumped at the opportunity to add this to a brand new project implementation.
First things first… after being part of a handful of new site builds from start to finish, it quickly became apparent how important establishing global site containers were at the foundational level. That’s when I created this visual guide:
- The Full Screen width is as far as the screen allows. This assumes the site could stretch to infinity, if we had a screen that would allow for that. But we don’t. So, the site boundaries need to be established to something more reasonable.
- The Site Max Width limits how wide the website itself is willing to stretch. In the instance I’ll be talking about, a width of 3000px was set on the <body> tag and centered using margin-left: auto; and margin-right: auto;. Full-site width elements would live here including but not limited to background images that stretch the full width of the site.
- The Content Side Padding always exists, regardless of device. It creates left/right spacing in between elements we don’t want touching the very edge of the screen, and the edge of screen itself. An example of this would be text elements.
- The Grid area is where design-determined columns start and end. Designers typically imagine 12-columns when crafting websites, though the total columns can vary. Planning the full grid area pixel width with a designer right at the beginning is crucial for creating precisely planned grid walls, and perfectly centered elements. Grid Layout also makes creating sidebars super easy to create and maintain as well.
In order to make Grid Layout compatible with IE, it was necessary to add a polyfill to the project. We’re using npm, so a dependency was added like so to the package.json file, and npm update was run to update the package-lock.json file.
Next up, create the grid:
You’re going to see a lot of Sass variables in these code examples, so this might provide a bit of context. (Note: This is a simplified version. This project in particular has 4 grid columns on mobile, and 16 on extra large screens. There were a number of media queries needed to be taken into account too):
After creating the global grid, it dawned on me that I could create a visual grid fairly easily so my team and I could check our work against the exact line assignments. The idea came to me after I saw my teammate, Marlene, apply a Neat (of Bourbon and Neat CSS libraries) visual-grid to a previous project. So, I added a bit of markup to the html.html.twig template:
My tech lead, Maria, loved the idea so she came up with a quick way for us to see the visual grid using a preprocess hook in the .theme file. All the team needed to do was apply ?show-grid=1 to the end of any of the site’s urls to check our work and see if it lined up:
Of course, it had to inherit the overall .grid properties (code shown above), in addition to containing its own unique styling, in order to superimpose the visual grid over the top of the entire page.
The visual grid looked like this when we were working on our project:
Given that applying CSS Grid Layout to a project was a new experience for me and my team, a couple things needed to happen:
- Create documentation
- Meet with the team to explain how I’ve setup the project,
- Encourage innovation and communication, and
- Go over the documentation
- Encourage updates to the documentation when new tools have been created, and report back to the rest of the team
It was important for the team to know my intentions for applying the horizontal containers and the use of CSS Grid Layout, and to admit that this is new territory and I was relying on all of us to be on the same page, applying the tools in the same way, and finding ways to make our jobs easier and more efficient.
Initially, we started using CSS Grid Layout for specifically layout purposes of an element’s parent wrapper. We are all well versed in Flexbox now, so we applied Flexbox on the child element rows like so:
Later, I discovered a way to generically place child elements into a grid parent without needing to assign each child element a place inside the grid. Check out my Codepen example to see how this might work.
Many of the elements on the site needed grid to be applied first. However these elements needed to be centered as well, like the elements in the screenshot above. CSS Grid Layout comes with a property grid-column that takes two arguments: 1. a start column and 2. an end column. It needed to be IE compatible, so I whipped up this little mixin:
It took my team some acclimating to enter start and end column values for every element in every breakpoint necessary. Admittedly, it was a bit of a mind-bender at times. This especially took some getting used to since applying grid to a parent element will render all its children into a single column out of the box. It wasn’t long before this grid centering code appeared in the project, thanks to innovative thinking from Maria, Marlene, and Jules:
With that, a themer simply enters how many columns the centered element is wide and how many columns exist on the grid at that breakpoint. Voila, centered grid elements in no time flat!
I could go on and on, there’s so much to share. Though designs may have adjusted slightly over the course of the project, the layout and overall elements largely stayed the same. My ultimate goal was to create an exact replication of our designer, Vicki’s, beautiful work. But, I couldn’t do this all by myself. I needed my teammates to be on the same page. And, that they were! Here’s an example of a page I did very little work on. This is also an example of using CSS Grid Layout with a sidebar element with a 12-column across element in the middle of listing items that needed to be placed in fewer columns. One of these screenshots is the design and one is the live site. Can you tell which is which?
This whole experience truly was a team effort. The code snippets I’ve shared with you did not look like that at the beginning. They evolved overtime, and have grown much more beyond the foundation I originally envisioned. To my surprise, my team got so excited about these tools of precision that they helped produce robust mixins, setting global spacing variables. Say our designer wants to change the gutter from 16px to 20px. No problem, change the $grid-gutter variable and all of the elements across the site just fall in line. No more changing every spacing instance of every element across the site. Goodbye frustration, hello efficiency and perfection!
So, if you find you’re as obsessed as I am with creating a pixel perfect responsive experience for your websites, or if you simply want to start using CSS Grid Layout with purpose in your next project, please feel free to adapt these tools into your practice.
Thanks for taking this journey with me, and I hope you look forward to the next blog posts of this series where my teammates discuss other problems we solved in this implementation. Isn’t nerding out with other passionate people the best?!
This week's highlights include a fascinating documentary on fighting game stalwarts Team Spooky, a hyper-analytical look at the top idle game mechanics, & lots more. ...