Stories

Likely Story RPG – A Lesson in Async

This RPG maker game was developed in 2017 by myself and my brother. It was briefly available on the Windows Store and Google Play until 2019 when it was removed. Now you can try it here for free. We made it as an experiment to see if we could build a whole game in a few weeks. It ended up taking months due to a Javascript bug in RPG Maker MV’s engine.

I discovered the bug and reported it, but nobody could determine a fix. One day I stumbled on the answer, the engine was expecting calls asynchronously but the actual Async flag was set to “off.” Once I flipped that boolean value, the app ran in Windows Store and Android deployments flawlessly.

I uninstalled Unity, let’s go Godot

Recently Unity has fallen out of favor with software developers. No, let me rephrase, they screwed up big time. If you missed the news then let me just say that the board and CEO made a pricing change that was communicated in the most damaging way possible to gamers, developers and publishers trust in Unity.

Now, I’m usually one to ignore the news, videos of train wrecks, and other sensational trends. This time I couldn’t look away. I think because a few months ago, a co-developer and I decided to throw all our chips into Godot. I had previous Unity experience for developing games and he did not, but the wealth of material out there to pick it up is staggering compared to Godot.

What made our decision back then was the open source factor. We knew we could learn any software we wanted, but we loved the open source model of Godot. We believe in open source as a great tool in the short term, but also a catalyst for true societal impact and growth in the long term.

Now, learning Godot hasn’t been easy, but it has been fun. For example, I come from a C# background and love the LINQ framework. So when approaching a problem of how to store modeled data in Godot and retrieve or modify it, I was thrilled to learn about Resources and Dictionaries.

I’ll share an example from our game in development now, which is inspired by Tamagotchi and Drug Wars (PC).

Image depicting the Tamagotchi toy from https://www.prnewswire.com/news-releases/the-original-tamagotchi-now-available-online-and-in-stores-300721910.html

When instantiating a new vendor in our transaction system, there needed to be random price fluctuations for the items being sold. It also required flexibility for future items to be added. Godot uses GDscript, which is loosely connected to C++, but also has indentation-based syntax we find in Python. Below I can walk you through how this code snippet solves that problem and meets requirements.

@export var inventory_data: InventoryData
const stock_inventory: Resource = preload("res://Scripts/inventory/instances/vendor.tres")
var random = RandomNumberGenerator.new()

func populate_vendor_inv_data() -> InventoryData:
	random.randomize()
	var new_inventory = stock_inventory.duplicate(true)
	var loop = 0
	for slot in new_inventory.slot_datas:
		slot.item_data = item_list[loop]
		slot.quantity = random.randi_range(1,99)
		item_list[loop].price = random.randi_range(item_list[loop].priceMin, item_list[loop].priceMax)
		loop +=1
	return new_inventory	

const item_list:Array[ItemData] = [
	preload("res://Scripts/item/items/item1.tres"),
	preload("res://Scripts/item/items/item2.tres"),
	preload("res://Scripts/item/items/item3.tres"),
	preload("res://Scripts/item/items/item4.tres"),
	preload("res://Scripts/item/items/item5.tres"),
	preload("res://Scripts/item/items/item6.tres")
]

Firstly on line one you’re seeing a reference to a class called InventoryData. That’s defined in a separate script and functions as a model for the inventory itself. This is based on a great tutorial that goes in depth into how to create your own inventory: https://www.youtube.com/watch?v=V79YabQZC1s&t=3155s

Next, we had created a resource file in our project named “vendor.tres” which contained the basic inventory a standard vendor would start with. Since we don’t want vendors to always carry stock items, we need further logic below. My solution here was to create a function that would return six items of random pricing based on the individual min/max those items could go.

If you remember Drug Wars on PC or Palm Pilot (yes I remember those), it had a minimum and maximum price that each drug could be bought or sold for. So in our GDscript, we instantiate a random generator, then create our populate_vendor_inv_data() function. You’ll notice the -> expression which may appear to be a lambda, but is actually just signifying this function will return your defined type. Here we defined our class “InventoryData,” but you could have used any type either built in or that you had defined.

The next couple of lines deal specifically with resources in Godot. We must create a duplicate of the original, otherwise it will not instantiate and will always remain null. The use of a for loop allows me to grow this in the future and I may refactor, but for now we want to use the counter to match our below array’s index location. So the loop counter is declared, then we run our for loop and define our items.

The next few lines are a little project specific, but essentially they are setting the properties of the items. In my case, there are slot level properties to define, such as quantity and item_data; but, there are also item properties to define, like the price of each item. There is a hierarchy of inheritance going on here that looks like this: InventoryData > SlotData > ItemData.

Using that we can see that when the loop defines the price, it is digging all the way into the item level to find those priceMin and priceMax variables.

What I loved about this solution was obviously that it worked, but also that I can refactor later when I want to add dozens or hundreds of items. I can also expand it to include new slot level or item level properties and define those, such as the rarity of the items or the floor or ceiling being modified.

I would love to say that this game is ready to ship, but it is still very much under development. Subscribe to the newsletter if you want to stay informed on progress, and feel free to reach out using the contact form. I would love to chat and help with your project or see your game built in Godot.

Disney Coaster (1993) – PC Review

If you ever went to an amusement park as a child you remember with joy those moments spent riding roller coasters and waiting in lines with nothing but your anxiety and a severe sunburn to comfort you. Maybe you remember laying down to sleep after a long day of amusement, feeling the rush of crazy inversions and steeply angled hills in your gut like heavily greased food that won’t let go.

Maybe you never went so you don’t know what I’m talking about. I have a message for you: you’re an adult now so go have some childish fun at Disney World or Cedar Point or Hershey Park or whatever park is most economically efficient for you and your household unit.

If money is a concern, then I understand and I’m here to help. All you need is a personal computer that can run the DOS operating system, or a little know how and a program called DOSBox.

Now that you are armed with knowledge and 30-year old technology, you can play the Disney classic video game, Coaster. Or if you feel too mature to build and ride thrilling roller coasters in a video game from the 90s, perhaps you could teach the game to your child instead. I used to play the crap out of this when I was a kid, so you might get some quiet time in your home.

Summary

This is one of those games that google doesn’t know much about. That makes me feel old because it reminds me that I grew up without internet being ubiquitous and google knowing everything. In this case it was a good thing because I had to learn DOS, and I had to learn the controls in Coaster so I could build amazing rides and completely blow away the critics.

I should explain this game. You can either design, or ride roller coasters with a 3D interface and mouse and keyboard controls. Designing allows you to choose the track pieces and their orientation on three axes, depending on the piece. You can add loops, corkscrews, lift pieces, brakes, acceleration and even different gravity types and upstops. The designing portion of the game is educational because it requires an understanding of gravity, spatial awareness and a knowledge of measurements. The riding part of the game is just pure fun.

The nostalgic perspective

I created more than a dozen tracks in my pursuit of the perfect scoring coaster when I was young. I learned what each of the six critics liked about riding coasters and tried to apply their specifications in my designs. Does that sound like fun?

Ok it sounds more like work, but I found it fun. I always liked building and designing things because I felt a sense of accomplishment seeing the finished product. Maybe that’s why this game was fulfilling. Much like today’s achievement or trophy points on Xbox Live or Sony Entertainment Network (formerly Playstation Network), the game’s critics reward you by scoring higher for better designed coasters.

Of course, I also like seeing things break or be destroyed, so I liked watching the crash dummies die a horrible death when I built an unfinished or unsafe coaster.

The now perspective

There are a few undesirable traits to this Disney published game. 1. You need special knowledge to get it running, or an old computer running MS-DOS. 2. I found only two meaningful google entries relating to this game, and I was lucky to have found anything at all. 3. The animation isn’t as smooth as I’d like it to be. 4. The sound is outdated.

I want to move past those negatives because I still think this game merits a second look, and I don’t think it is finished contributing to society. I believe that this game is an excellent choice for parents to teach to their kids if they show any interest in building things. Even if that doesn’t happen, I must say that I enjoyed playing it again and building a new coaster from scratch. Watching the critics ride it and score me in the top ten was just a bonus.

Final thoughts

Ultimately, I’ve decided I’m going to use this game as an educational tool for when I have kids. But you shouldn’t write it off as a do-not-play for yourself either, especially if you think design, architecture, creativity or amusement parks are some of your favorite things. You now know more about Disney Coaster (1993) than the wikipedia page can tell you.

You are smarter than the internet.

Learn To Do What You Love

As far back as I can remember I’ve loved socializing with anyone and everyone around games. I remember being scared senseless playing Myst on PC in the dark with my brother. I remember connecting two computers via COM cable to play Star Trek Armada. I remember organizing Halo Lan tournaments for my friends.

That last one didn’t work too well.

These social events or hangouts had a common thread, I was the setup and IT guy for all of them. I didn’t even realize it was a skill until my early 20s when people started paying me to fix their computers. I just loved to get the games going, that was my passion then. Thinking back my perspective was hilarious. I thought it was odd that people wanted to pay me to do something so easy and fun.

No doubt you’ve met someone like this or you are this person. Maybe you’re the card maker in your family, or the baker for every event. “Why do they keep asking for my cookies?” Hint: because yours are the best, wink wink.

Mmmm, Ginger Snaps. One of my favorites!

I don’t mean browser cookies either, although I can certainly tell you about those if you’re curious. No, I have realized my journey brought me to a place where I can choose to do something I like and get paid for doing it. Hopefully it doesn’t take you nearly as long to learn as it took me. Let me try to help you get to the heart of my understanding.

How to do what you love

I have grown a lot and spent time trying to discern what I actually love doing. I can’t say I had a process other than just observation and discussion. Here’s what that looked like for me. The last several times I organized another Lan party, or worked on a difficult technology or software issue, I asked myself what I was enjoying about it. Maybe to simplify further, just pay attention whether you have a smile plastered on your face. Then ask yourself, why do I have a smile plastered on my face right now?

Observation

It may not be easy for everyone to discover the why behind their happy moments, so let me help you find what you love. Observe and ask some basic journalistic questions when you’re engaging in an activity that felt good to you.

What was I doing?

For example, I might be plugging in an ethernet cable and ask myself, what was I doing that I enjoyed? The answer, definitely not the actual plugging in of the ethernet cable. That would be like saying I loved picking up scrap from construction job sites, or taking the trash out when I worked at Starbucks. So if I felt happy while plugging in that cable, what’s really going on here?

Who was it for?

I was plugging in the cable for my friends, and they benefitted from my work. See, I am the kind of person who loves to give and serve others. When I do that I feel most fulfilled. I have also always been good at puzzles, and some people don’t like those. So if I can be the guy that solves the technology puzzle to bring joy to the whole group, I’ll gladly do it.

How long could I do that?

Now you know a little more, maybe you’ve always loved performing. You could be a comedian, or singer, or just a public speaker. Maybe it’s the thrill of adventure and always being surprised that makes you eager to go hiking to new places or trying new coffee places everywhere you go. So ask yourself now, how long could I do that? The answer should be near enough to forever, or it may not be something you truly love. Of course, everyone shifts over time and you may fall out of love with something specific, like Beanie Babies (goodbye old friends). It pays to remember the joy doesn’t come from the conduit of your passion.

My conduit has always been technology, and that has changed dramatically in my lifetime. No that doesn’t bring me joy. I used to think getting the latest tech gadget would bring me joy. Now I realize it was not getting the a new tech gadget I found joy from, it was sharing my experience with others. Your conduit could be similar, like your crafts, your followers, or your book collection.

The conduit brings you what you love

Don’t let the conduit fool you into the trap of thinking it can bring you the joy of fulfillment in what you do. Think of it as if you were carrying your own child on a wagon. Is the wagon bringing you joy? No, it is merely carrying someone that you love. Don’t fall in love with the wagon, it will eventually break or fail or get lost. It can be upgraded to a new one or it can be re-invented.

For me, I realized that I had been studying a book my whole life that held the secret to this, The Bible. In it there are very obvious themes where material objects and wealth are not found to satisfy. In the end, we will look back on our lives and see our joy came from another source entirely. I strongly recommend you find what that source could be, before you waste any more of your life not knowing.

Discussion

So observation helps, but what if you’re just completely stumped? Not to worry! When you discuss what you’ve observed with others, you will get additional perspective to help round out your theories about what brings you joy when you do it.

I mean, here’s a thought, if you’ve ever heard someone say to you one of the following phrases, you might want to consider some observation.

“Wow it looks like you’re enjoying yourself.”

“You seem like yourself again.”

“I can see you’re really enjoying this.”

When you meet these people who observe you and see the love of what you do all over you, ask them about it. If you haven’t met any lately, hello, my name is Micah. Nice to meet you! Send me a note on the contact page or comment below and I will gladly discuss this with you.

Where in the World Is Carmen Sandiego?

Editor’s note: I originally authored and published the below post on a now defunct site called “The Cool Ship.” Enjoy this reprised content!

There is a simple question that keeps me up at night, gives me chills and causes me to break out in random cold sweats, where in the world is Carmen Sandiego? You have asked yourself the same thing many times I’m sure, so to put all our minds at ease, I tried the classic educational crime puzzle game (enough adjectives for you?), Where In the World is Carmen Sandiego?

Summary

The objective is to use your crime solving skills and position with Interpol to seek out and apprehend international thieves, but the point of the game is to teach kids geography. Now you might say, why would I play a game based on middle school geography that requires a textbook as reference? Because now I have google, and Carmen Sandiego needs to be stopped. She can’t just be left alone to steal anything she wants, that devious femme fatale!

The problem with this game is I might have acquired knowledge of basic geography and history trivia while playing. The benefit of this game is I can apply my new knowledge to Trivial Pursuit, a game I am pitifully bad at playing. I would rather dig a four foot trench by hand than learn trivia, but somehow playing this game I don’t mind so much. Maybe that’s because I love a good puzzle.

Qualification: it’s an ok puzzle game, but not great because adults may find it too easy. Technically though it was made for children, and since I no longer have the palpable, developing mind I had when I was 8, I shouldn’t be too quick to judge. I will say that I have never forgotten what it was like tracking down the notorious Carmen Sandiego, or the annoying theme song from the tv series.

The nostalgic perspective

My parents must have been laughing their heads off that I played this game as much as I did. I never liked school, but they tricked me into learning through an addictive game with simple gameplay and an engaging story. Poor, witless me, I invested hours into catching the bad guys, and I remember leafing through that textbook disguised as a game manual for the answers to the trivia so I could get promotions in the game.

Did you notice how much that sounds like in-game achievements? That’s quite modern for being a game from the early 90s isn’t it?

The now perspective

I’ll be honest, I mostly remembered trying to catch Carmen Sandiego, but until I played this retro title I forgot about some of the details. For instance, did you know the game introduces young minds to the concept of a victory condition, but it doesn’t punish you for losing? So you flubbed your case because you blew all your travel money visiting Paris, Istanbul and Mexico City? No big deal, here’s another case.

Those morally depraved thieves are always lifting priceless items, so you will never run out of opportunities to track them down one by one and lock them up. They also leave behind a trail about as inconspicuous as a stolen credit card making thousand dollar charges in a busy mall. You know you’re on their trail because one of their henchmen walks slowly across your screen looking obvious, wearing a burglar hat and sneaking appropriately.

If that’s not obvious enough, when you get close to apprehending your suspect, the people you interview start telling you to watch your step and a dagger gets thrown at a wall, presumably to scare you off. I’m not scared, I have a gun. In the game I mean. Not in real life. So far what I’ve learned is that criminals are dumb, they fly everywhere, and if one throws a knife at you start shooting.

Now where is that darn Carmen Sandiego?

Final thoughts

If I had never played the Carmen Sandiego games as a kid, I don’t think I would have tried them again at my age. Then again, if I had never played them back then I wouldn’t have done so well in middle school at Geography. In fact, if I remember right, I thought that class was fun. So Carmen Sandiego really is evil because she steals stuff, AND she made me enjoy education. Curse you seductive woman in a red trench coat!

Before you play this game, ask yourself, do I enjoy playing old games even if they require critical thinking and my full attention? If you answered yes, and you don’t mind being smarter than a 5th grader through the use of google, you should dive into this series of classics. If you answered no, download it anyway so your kids can play it. Take if from me, they’ll never even know they were learning stuff.

Links:

http://www.abandonia.com/en/games/13/Where+in+the+World+is+Carmen+Sandiego.html

Teach to learn

Back in the winter of 2020, a great man took me to brunch to ask me to join the youth leader volunteers at our church. At the time, I didn’t think I had much to offer a group of middle schoolers navigating through one of the toughest times in their lives. I don’t remember much about the conversation itself, but I distinctly remember the feeling that he was willing to take a chance having me on the team. If he could take that chance, I supposed I could also and I accepted.

Truthfully he was just the catalyst for something that had been orchestrated for a long time. I’ll never forget over ten years ago when one of my mentors bluntly told me she thought I should be teaching. I didn’t laugh then and there, she was like my second mom after all. I did tell her though she was mistaken. And yet, here I am years later and she was definitely right. I’m sure God has a sense of humor and He is laughing at my inability to accept reality.

Looking back on all of it, I absolutely don’t regret putting myself in a place where I can mentor youth between grades 3 to 8 on a regular cadence. Additionally, any chance to teach is an amazing opportunity. Is it scary? Yes. Is it daunting not knowing how you’ll be perceived, received, or possibly overwhelmed? Yes. Was any of that ever in my control before? No. See the thing is I remember middle school, and they still haven’t really invented a fool proof way to navigate that path. That’s where we come in as those who’ve gone before.

The idea of mentoring others doesn’t just apply to volunteering with youth though. I have found the same effects occur in all areas of my life as with teaching the middle schoolers. The most potent effect is that I learn more through teaching than the ones being taught. I’ve adopted this as a philosophy and approach to teaching that helps keep me humble and able to listen while I teach.

How important could it be though to expect to learn when teaching? I know all of us have sat in some kind of training, even if you have to go back to high school. Think back on your favorite teachers either in school or later in life. Did they listen to you, or did they merely impress you with their utter genius? Anecdotally of course, I tend to believe the teachers who listen and care make the best examples. This leads me to three conclusions (you always have to have three): We learn through teaching, everyone is a learner, some are just further in the process, and learners just want to be heard and understood.

I’m a complete layman in the teaching game, so my approach has always been that I have much to learn about it. In fact I have the honor of volunteering alongside people who are actual elementary education graduates with jobs teaching in schools in the area. What nonsense would it be if I engaged in conversation with them assuming I know more than they do? So my teach to learn philosophy guided me to ask them for advice. You know what they often say? Be a good listener.

But hang on, you ask, aren’t you the one standing up in front of the kids doing all the talking? Yes, but you need to build rapport, you need to connect with your audience. Remember your favorite teachers in your life. They listened to you and were open minded about what you had to say. This is my approach, I am ready to learn through teaching.

In my time over the past few years doing this I have learned more about myself. I learned how to grow my own study habits in lesson planning. I learned what behaviors are easy for me to address in a classroom setting, and which are more difficult. I learned that I need a lot of aid to remember names and which faces they go with. I learned that time in the classroom is probably not when the most memorable learning occurs, but rather it happens in the relationship building outside the classroom at youth activities or as you are living life alongside each other.

Throughout I hope the thread of humility is abounding in what I’m saying, because we are all learners. Not a single one of us on this planet has achieved a level of learning so beyond everyone else that we can claim to have “made it.” So we are all learners, but some of us are further along in the process. Humility is the entry point to start at, and I like to think the teachers farther along have grown in patience and wisdom. That is why I am always asking them for advice!

If you’re going to teach someone else, anyone else, knowledge you have obtained, you’re not going to relate it well unless you can be humble, patient, and good at listening. This is why I said learners just want to be heard and understood. You see you may have a willing audience, or you may have a few in your midst that don’t want to learn. Maybe they had a bad day, a bad month, maybe a bad life. They brought that with them, and until they met you it is possible they didn’t have a role model.

Yes you could be the one chance some people have at a good teacher. Isn’t that scary? I did say it was, can’t say I didn’t warn you. If you think the best option is to impress them with how smart you are, guess what, everyone else already tried that.

I have a friend who teaches special needs kids in high school, and he has a great mentality about everyone who crosses the threshold of his classroom. He builds an agreement with his students that they must stay engaged in learning while with him. In return, he will listen to them, pour into them and try to help them every way he can. If they try to disrupt that, they effectually break their contract with him and he no longer needs to hold up his end.

On the face that sounds unfair, but to the kids in his class who still want to learn, it isn’t. And he says that in most cases where he applies this philosophy, the ones who come not wanting to learn eventually see the benefit to keeping the contract since any other effort on their part is a waste of their own time. Kids are smarter than we often give them credit for aren’t they?

This same methodology can apply in a lot of life, and that’s why we depend so much on contracts in business and legal matters. My good friend himself has often admitted that he has a lot to learn, and he’s not done thoroughly developing his methodology. What a true servant though to take on some of the toughest students and seek the best way to help them learn! He is further along on the journey than many I have met, and yet he’s not done either.

My personal hope is to one day come back to this post and have a whole new perspective. Though much changes in life, I see that one of the most fulfilling ways I spend my time is in teaching others. I would be a fool to stop doing that, and a fool to ever think I’ve “made it.” I’ll continue learning, teaching, and growing in wisdom, and surely I’ll come back here someday and think how differently I might write this post.

What’s your perspective? Add your thoughts in the comments below!

About | Contact

I am a software developer eager to take on new challenges and find new puzzles to solve. My recent experience includes developing a C# console game similar to the classic Drug Wars. I also developed a RESTful .net Entity Framework API for a financial company in the mortgage space.

You can find me in these spaces:

LinkedIn https://www.linkedin.com/in/micmancg/
GitHub https://github.com/cunningorb

Please enable JavaScript in your browser to complete this form.
Name