Thursday, October 6, 2022

The Unprecedented BSU participation in Ludum Dare 51

Over a year ago, I started up a Discord called "Ball State University Game Design & Development." It's a slowly growing community that includes students, staff, faculty, and alumni. It's mostly quiet, but we sometimes talk about games or game design. I also gives me a place to post about opportunities and encourage participation in them. I hope we are starting to see some fruits from this effort since last weekend we had an unprecedented number of BSU-affiliated people participate in Ludum Dare 51. This included one alumnus and four students. 

I wrote about my project and my sons' projects two days ago. Here are links to the other projects I know of that came from BSU. If you know of more, let me know, and I will add them to my list!

I am hopeful that this is positive momentum and that we'll get even more in the future. The Fall Ludum Dare tends to come at the best time. It's a couple of weeks in the semester, so I can encourage students and even incentivize their participation. For example, my CS222 students can earn an achievement by participating in a jam (although none did, as far as I know), and I gave my CS315 students the option to do Ludum Dare instead of their normal weekly work. The next Ludum Dare is in January before the semester starts, which means more people may have free time, but there's no opportunity for in-person nor course-based encouragement. The Spring one tends to fall right before final exams, when students are overwhelmed with work, though I tend to be in a mode where I'm just answering questions and waiting for projects to come in. This pushes me slightly back in the direction of hosting a local jam in Spring. We'll see how the semester goes!

Tuesday, October 4, 2022

Ludum Dare 51: Base Defense (plus four games from the boys)

In today's blog post, I share the experiences that my sons and I had participating in Ludum Dare 51. Each section starts with the name of the game, and this is followed by a link and then the creator's reflection. Enjoy!

My Game: Base Defense

This past weekend was Ludum Dare 51, the latest instance of what might be my favorite jam. What I love about the traditional Ludum Dare "compo" event is that each person handcrafts a game in 48 hours based on a shared theme. That creator does the art, the music, the programming, the writing, and the sound effects, and so everything that comes out of the Ludum Dare compo is wonderfully unique. There's an unadulterated bit of each creator within each game.

The theme was "Every 10 Seconds." I prefer themes that evoke an aesthetic rather than those that almost demand a mechanic. I did my voting before the jam, and so at some point one simply has to live with the results. As I contemplated the theme, I considered other constraints: What kinds of games have I wanted to make lately? What technology have I wanted to explore? I quickly narrowed my focus to making a tower defense game in 3D using Godot Engine. I've never made a tower defense game, but I've long wanted to. My game programming students elected to having a project in 3D, but I've really only built one 3D experience in Godot

My original idea was that new waves of enemies would come every ten seconds, but as I tinkered with the core game loop, I realized two problems with this. One is that creating different kinds of enemies, enough to call it a "wave," was possibly out of scope. The other was that ten seconds is actually a really long time when you're waiting for something to happen in a videogame. I decided to pivot on the integration of the theme and, instead, to have the player lose a random turret every ten seconds. This way, there's a constant pressure on the player to keep building and to stay aware of the board.

The result is Base Defense. You can check it out on the Ludum Dare page which links to the Web build as well as the native clients for Windows and Linux.

I'm happy with how it turned out. I had originally hoped to add more interesting enemy models than just colored spheres, and it clearly calls out for different kinds of turrets or defenses. Both of these features hit the chopping block pretty early. The end of the game is still actually a placeholder from when I got the original loop working, but you know, old memes are the best memes. The one thing I really wanted to add that didn't fit into the schedule was that meteors destroy not just a random target but also adjacent ones, recursively. I think this would have been a really fun way to force players to spread out their defenses, and I also think it would have made it less likely that someone can set up an unstoppable defense force. Yes, if you have the right combination of luck, patience, and skill, you can get the game into a state where there's no way for the enemies to win and you can accumulate points forever. I haven't gotten this, but I've seen my son do it. The positive side of this though is that the game is engaging enough to get someone to want to reach that goal, which is pretty good for a jam game.

Speaking of sons, all four of my boys created their own games for Ludum Dare 51. I asked each one to write a little reflection about the experience that I can share here. The older two boys have their ldjam.com accounts, and so I have linked to their project pages. The younger two boys do not have such accounts, so I've linked directly to Web builds where you can try the games. In each case, the creator's reflection follows the game link. Thanks for checking it out! I'll be sure to share any feedback here with the guys.

#1 Son: Shifting Dungeons

Check it out at the Ludum Dare site.

Shifting Dungeons is not my best game jam project. It’s not really fun. I think that is at least partially because the game does not require many (if any) interesting choices. Once you’ve figured out the strategy, you can win almost every time without needing much skill.

I did enjoy using shaders for the glow effects and styling the UI, and I am happy with the overall color scheme. At one point, I realized that the walls and floor were a cold grey instead of a brownish-yellow grey, and once I fixed that, everything looked a lot better. I also liked the way I organized the attack functionality in the player. When you press a button, it calls an attack function that then calls another function to resolve the appropriate effect.

I learned (not in this project, but recently) that enumerations really just assign names to positive integers, which is very useful for a wide variety of things. In this project, I used enums to distinguish types of attacks and different wall tiles.

Next time, I would like to try to make a more technically interesting game. Nothing in this project was new or unusual, which made it rather uninteresting to build. I also might not make a 2.5-d project next time, since it makes the artwork much harder to draw.

Anyway, thanks for playing my game, and please leave any suggestions you have about ways to improve it!

#2 Son: You vs. the Clock Featuring the Narrator

Check it out at the Ludum Dare site.

This year’s theme for Ludum Dare was “every ten seconds”. In my game, you have ten seconds of life to get as far as you can. The game is text-driven using Dialogic, partially because I wanted to practice my typing skills but also because I know very little Gd script.

I learned how to connect Dialogic to the script, which is how I got the timer, points, and duck to work. I wish I had had the time to add a timer that might make the connection to the theme a bit more clear by visualizing the ten-second countdown.

#3 Son: 10 Second Bomb

Play online now.

Hi, I made 10 Second Bomb, using Construct 2 (free edition) game engine. My idea was that every ten seconds a random tile would explode, like you've seen (or will see) in my game. I did not know how to do that, so my brother taught me about global variables and we could use that to fix our problem. Once I knew how to use global variables, making the player get bombs and the score tracker were easy to code.

Then came the timers (boom tile and new bomb). After I made those, I made the different screens (lose, win, main, start, and rules). I met most of my goals, although if you lose and then you play again and win, you have to click through both the win and lose screens. I don’t know why that happens, so if you do please let me know.

I learned some new things, like how to use global variables. I hope you enjoy (or have enjoyed) my game!

Thanks for reading!

#4 Son: Tim the Hunter

Play online now.

Hi, my game is “Tim the Hunter” in Construct. My idea was every ten seconds enemies shoot, and spawners make new enemies. If you get shot you die.

It was hard to make the coding. At first, you couldn’t move because the gun was stopping you from moving. Then I made the gun be able to move with Tim. I figured that out on my own. I also learned how to make text follow the screen. The point tracker used to not move with Tim, so the text would go offscreen. My brother helped me make the text move with Tim so that the player could see the points no matter where they went. If you press enter to play again, the music will play twice. I didn’t want it to do that, but I didn’t know how to make it stop.

I was happy with Tim’s costume. The bowler hat and overcoat and tie were fancy.





Story: you were hunting when a tornado and you landed on a floating island.

Tuesday, September 27, 2022

Making Truffles

Many years ago, if memory serves me right, my mother-in-law sent me a link to an easy truffle recipe. My oldest kids were pretty young at the time, so this may have been eight or ten years ago. I've used that recipe for years to intermittently make simple chocolate truffles. My two favorite flavors are orange cardamom and mocha. Both are a simple matter of simmering flavorings in the cream, the former using decorticated cardamom and fresh or dried orange peel, and the latter using ground decaf coffee.

I used that recipe for years. For a long time, I could Google for "easy truffle recipe," and there it was. A few years ago, it became a little harder to find, as more and more similar pages and videos showed up in my search results. At this point, I think the original page is simply gone. I could never remember who hosted it; I would recognize it by the prose, layout, and images.

It's really not that complicated, though, and I realize the main thing I needed the recipe for was ratio between cream and chocolate. Last night's searching resulted in my reading more about this ratio. Hungry Happenings has a good explanation, and I'll just summarize here, for my future recollection, this idea:

2:1 Chocolate to Cream Ratio

That's really all I need to know. My old recipe used volumetric measurements of cream and weight measurements of chocolate, which made it harder to remember. The weight ratio is much easier to remember as well as being easy to execute with the kitchen scale.

How do I do it? Heat up the cream, but don't let it boil. Put flavorings in. If they need to simmer, let them simmer for 10-20 minutes. Weigh chocolate chips into a measuring cup. (Yes, the fancy people say not to use chocolate chips, but you know what? It's easy. My truffles are not silky smooth, but I don't mind a rustic truffle.) Pour the cream over the chips and stir it up to make the ganache. Pour it into a broad, flat container, and put this in the freezer for 20-30 minutes to cool. Prep some kind of toppings, like cocoa powder or chopped nuts. Gather children with nominally clean hands. Use a little spoon or scooper to portion out roundish blobs of chocolate, drop into the topping bowls, and let the kids roll them around to coat. Family fun!

Last night, the younger boys and I made a batch for my wife's birthday week. We made a wonderful discovery. One of the recipes I found suggested trying vanilla or almond extract as a flavoring agent, so I looked around the baking supplies. I came across something I don't remember seeing before: a flavoring called fiori di Sicilia. We popped off the top to check it out, and we were wowed by the wonder smell. We put a teaspoon into our 4 oz. of cream. For toppings, we used cocoa powder and crushed pecans. They turned out amazing. The fiori di Sicilia gives a complex citrus flavor, just the right amount for chocolate.

So there you go. It's all story and only an implicit recipe, but I do feel like I leveled up in my trufflemaking last night. No longer bound to an arcane combination of cups and ounces, nor to others' recommendations for flavorings, I am now free to truffle away.



Monday, September 5, 2022

Students' Analog vs Video Game Critical Analyses: A matter of experience and vocabulary... or perhaps of pride?

The students in my game design class just finished studying MDA as an analytical lens and then writing critical analyses of games following Schreiber's recommendations. I advised them, for both exercises, to choose small, simple, analog games, cautioning them that contemporary videogames are games-of-games that are hard to analyze this way when you are just getting started. As one might expect, many students disregarded my caution, although I did not know that at the time of our last class meeting. During that meeting, I had them get into small groups to talk about their analyses and then to share some highlights with the whole group. 

One of small groups happened to have two people who analyzed digital games and one who analyzed an analog game. The interesting finding they shared with the group was that it was easier to analyze the video game than the analog game. This surprised me, in part because at the time I didn't realize how many people had failed to take my advice. I pointed out that there were at least two possible interpretations of their experience: one is that there is an inherent difference between video games and analog games in this regard, and the other is that they have less vocabulary for analyzing analog games. Either one is interesting from a scholarly point of view, and even at the time, I hypothesized that the latter was the case. Two students' hands shot up to further this discussion, but we had to move on: we were veering off topic on a day that had already been way out in the weeds.

After having read all of their analyses, I see that there's a third option: that they simply did a bad job. Turns out that this is the case. Almost none of the students who analyzed video games performed anything like a successful analysis, not in the format they were given. They woefully underestimated such aspects as the resources being used, the state of the game, and the way it is played. For example, none of the students who analyzed video games talked about what players actually do, what actions they perform as part of the core game loop. Rather, they painted with broad brushes, saying things like, to fabricate an example, "The player moves Mario to the end of the level." While that is true, it is hardly an analysis. The state issue struck me as particularly interesting since so many of my students are Computer Science majors. I pointed out to them in my comments that the state of the game consists of those data that you would have to save so that you could load the game later. None of them came close to this understanding, many talking about "state" as if it dealt with the screens of the game: you're either choosing a level or playing a level, to continue the example.

When this kind of thing happens, I am left wondering, "What happened?" and "What now?" A majority of students did not follow my advice and then did a substandard job. I hope that they can learn something from this experience. However, what they learn is about hubris rather than about critical analysis, and I would ideally like them to learn both. This particular class does not have a resubmission policy, and I'm wondering if that is a reasonable thing to add. Resbumissions are convenient for the students, but they lead to more work for the professor and, every time I've used them, worse work by the students. That is, a student who knows they can resubmit later can just submit something poorly the first time, which the professor then still has to grade. The ideal thing would be for a student who did badly on the assignment the first time to recognize this as a deficit and then dedicate themselves to learning the content anyway, but alas, our university systems seem set up contrary to endorsing such virtue.

Tuesday, August 30, 2022

CS315 Game programming project report failure and recovery

A few weeks ago, I wrote about how I removed a cyclic dependency from my CS315 class by moving the project report from a git repository to a GitHub wiki. This solution was clear, simple, and wrong. It turns out that GitHub wikis are only available to public repositories when using GitHub Free. Over the weekend, a student working on the first project reached out to me, pointing out that the wiki feature didn't seem to be available. I confirmed the problem and set about seeking a new solution.

After some consideration, I decided the simplest solution was to remove the checklist item that says that a student has submitted their work on time. This item was the crux of the problem, since it forced someone to either leave it unchecked at the time of submission or to check it prematurely. I did not want to change actual course policy, however, so I had to add a general clause stating that work has to be turned in by the deadline to receive credit. This is a little less elegant, since now a student's grade is determined by a combination of checklist items and a general policy. However, it's a familiar kind of policy, and so I hope students don't mind the inconsistency.

It turns out, this is actually a change in policy, although I didn't think about it until writing this blog post. Previously, someone could use a Save Point to resubmit work that was late, since the deadline itself was in the checklist. Now that it is not in the checklist, the course plan gives students no option to earn credit for submitting late work. This was not quite my intention, since the whole idea of having a Save Point is to deal with unforeseen circumstances, and such circumstances do sometimes lead to the inability to submit work on time. I suppose I better get back to editing the course plan to add another general rule, that Save Points can additionally be used to submit work late. That is even more inconsistent and inelegant, but I have not found another approach to fill the bill.

Incidentally, the first "easy" solution I came up with was to have students just submit two things on Canvas: a link to their repository and a separate project report. Unfortunately, Canvas does not seem to support this. Even though the teacher's interface makes it look like you can require a student to submit both items, what students see is that they can only submit one or the other.

Thursday, August 18, 2022

Summer Course Revisions: CS222 Advanced Programming

It has been a little wobbly here due to my teaching schedule changing, as discussed in my previous post. Because one of my courses didn't make enrollment, it looked like I was on deck to teach my department's CS200 Computers and Society course, which is a university Tier 2 core curriculum course in the natural sciences domain. I've never taught it, but it sounded like it could be an interesting challenge. I started doing some prep work on it, and then I was notified that a colleague was willing to swap a section of CS222 with CS200. CS222 is a course I designed, teach regularly, and love to teach. Also, that CS200 course was scheduled right before my other two back-to-back courses, and so it would have had me teaching continuously from 12:30 to 5:00 on Tuesdays and Thursdays. Thanks to the generosity of my colleague, I am now scheduled to teach CS222 MWF instead of that CS200 class, which is one that he has prepped and taught regularly.

This all happened two days ago. Now, the easy thing to do would be to just copy over my Spring CS222 plans, change some dates, and be ready to go. This is not my way. Regular readers may recall that I ended my reflection on Spring's section by putting forward the proposal of changing the technology that I use to teach CS222. This has been on my mind intermittently over the summer, especially as I spent several weeks exploring game design ideas in Flutter. Pushing aside lingering doubts, I began to design the course with this new technology foundation, and today, I published my plan for the first several weeks.

Obviously, the most important transition has to do with getting the students up to speed with Flutter and Dart. The truth is that they have come in with fairly weak understanding of Java anyway, and so rebooting their language learning experience may have a net benefit. The documentation at flutter.dev is excellent, and you can see on the course plan that I am having them complete several standard Flutter and Dart tutorials and codelabs.

The most important factor here is time. Knowing that they will all have to be going through these beginners' steps means that I am accounting for it in my expected weekly commitment. A few things that I had them do in Java have been pulled out, such as the GradeTool refactoring exercise. One thing that really excites me is that students will be running into higher-order functions and stream processing earlier and more consistently. It is to Dart's benefit that it doesn't carry all the baggage that Java does. I was excited to find the iterable collections codelab as a great example for helping novice programmers understand how this works.

I have started a sample solution to my traditional two-week project assignment and, based on that, traced backward what kinds of things I need to introduce in class in the first three weeks. That is, I have developed a running example in class that, I think, will prepare them to build up a version of the two-week project that is essentially the same as what my students have done with Java and JavaFX in the past. 

I do not expect their reading of Clean Code to be significantly hampered by changing the language of teaching. The examples in the book are all in Java, but I don't think the students ever spent a lot of time with the examples anyway. The prose mostly stands on its own. Indeed, in my ten or so years teaching CS222, I don't remember a student ever referencing or asking about a code example in the book.

Today, I recorded and published my first tutorial video based on the stack of Android Studio, Flutter, and git. I hope to make a few more tutorial videos during the semester based on the kinds of questions my students have or difficulties they encounter. 

I'll be sure to write more about this transition in the future, certainly in my end-of-semester reflection if not before. In the meantime, if you have questions, comments, or suggestions, please feel free to share them in the comments or to email me.

Monday, August 15, 2022

Summer Course Revisions: CS215 Introduction to Game Design

I know what you're thinking. Planning for the Fall already? The trouble is that I was scheduled to teach the new capstone course for the Game Design & Development concentration in the CS department even though this semester will be the first time anyone can actually declare that concentration. We were given orders to try to get students graduating from the new concentrations as soon as possible. Unfortunately, advising didn't push students into this course, and it wasn't in the system when they picked their courses, so that course is critically underenrolled. On paper, I'm still scheduled to teach it, but it will almost certainly be cancelled.

This is relevant because that capstone course was supposed to be the locus for a community-engaged immersive learning project. We always had the back-up plan, though, which was to put that collaboration into the academic year structure I have been using, splitting the project across CS215 Introduction to Game Design and CS490 Software Production Studio. Given the enrollment in that capstone course, I went ahead and "finalized" the plans for an immersive game design class.

The good news is that this is how I have been teaching the course for a while now, and it has been successful overall. I modified the project schedule to include the exercises from Justin Gary's Think Like a Game Designer, which I wrote about earlier this summer (12). I also had to modify the schedule to allow for some of the conference travel I have this semester. I put up the course site today, which has public plans for the first four weeks of the semester. I have the rest planned but have not yet formally published them, waiting until I have a chance to get to know these students a bit.

Because the enrollment in CS215 is a bit higher than I have had in the past, I have moved away from in-class poster presentations. I really like having students present posters, but it doesn't scale to over 15 or so students. I tinkered with the idea of breaking them up into an A and B group and alternating posters and conventional submissions, but this got too awkward. Instead, I'm asking them to put their work on Canvas discussion boards. My plan is to combine small group discussion with random (or intentional) selection of submissions for brief presentation. There are a lot of interesting things that come up during poster presentations, and I am hoping this will still allow those to emerge through the discussions.