Pillars of Eternity: A Practical Guide to Cheat Engine (Part Two)

Part Two: Under the Hood

Today, we're going to cover what a program actually is.

Yesterday, in part one, we covered finding a value, so let's talk about what a value is.

You might remember that, when we went looking for values, Cheat Engine gave us a list of stuff that looked like this:

Why does it give us these addresses? What is significant about those random strings of numbers and sometimes-letters-but-only-some-letters?

What those addresses represent is the series of bytes the program uses to refer to when it needs a particular piece of memory. In yesterday's exercise, the address that referred to the number of level 1 spells that we had cast looked like this:

19.PNG

However, if you were to repeat this exercise today, or after you've restarted the game, you'll find different addresses:

20.PNG
21.PNG
 I put in so much work for my readers.

I put in so much work for my readers.

This is because, when a program asks for memory, the computer just hands over whatever memory it happens to have available. It's not guaranteed to be in one particular place - the promise your computer makes is "Here's an address with the amount of memory that you need, and it will always be at that address until you tell me you don't need it anymore." 

Now, that's an oversimplification; the process more or less asks your computer for whole gigantic bricks of memory and takes from that as needed. However, that still results in essentially random addresses - you can read more about it here, as this is not just a process-centric problem, but is endemic to anything on computers that uses memory.

So now you're probably wondering, well, how do cheat tables work then? Because Cheat Tables always point to the "right" value. 

Well...

 OK, maybe it wasn't THAT much work.

OK, maybe it wasn't THAT much work.

Here we see that I have a thing labeled "pointerscan result", and a P-> with an address after it. And that thing is one of the most fundamental building blocks of programming.

Let's take a step back.

Code - everything on a computer - at its most basic level can be represented by 0s and 1s. You probably knew that. But what does that really mean? You're probably imagining something like the Matrix.

 Don't pretend you weren't.

Don't pretend you weren't.

Except with like, 0s and 1s, right? It's a lot simpler than that. 

Do you remember really basic codes? Like, transpose a letter one letter to the right. So "BUTTS" because "CVUUT". Pretty easy, right?

This is, essentially, what a program is. The computer has a manual for what every number means. So, if we make our own little psuedo-computer here...

"0" means "read the equation after this"
"1" means "write the answer to the previously read equation"

So then I can write:

0 2+2
1

And you know to write "4".

But what if I want to add a new command, "2", that doubles the previously read equation? Computers are just 0s and 1s, right? Well, how do you think we represented 2 + 2 above?

In a computer, this would look more like:

0000 0010 0010
0001

And instead of "4", it writes 0100.

I'm not here to write a full guide to binary, so here's the Wikipedia link. Go learn yourself. Oh, and binary can be translated really easily to hexadecimal, so that's why addresses are those strings of numbers / letters. 

So basically, we have a way to tell the computer to do things in binary. If you're interested in why binary is so good for computers, you can read about transistors right here. The tl;dr is that hardware does on (1) and off (0) real well, but not much in-between. This basically translates to how software works because it has to be physically represented on hardware to do... well, to exist, really. (For more fun, read about how computers handle decimal numbers here!)

We also need a way to tell computers how to remember things. There's no point in having a command like "write the result of the last equation" if the computer doesn't remember what that was, right? 

So let's update what our 0000 command means: Read the equation and put the result of it into register A. A register is just a chunk of memory.

Now, we can take the same "program" as before...

0000 0010 0010
0001

But, after it runs the first command, now register A will have the value "0100". That also updated our 0001 command - now, it means write the value of register A. (You may be wondering what the value of register A was BEFORE the 0000 command. The answer is, it depends.)

 Pictured above: what register A was before the 0000 command

Pictured above: what register A was before the 0000 command

If you've never programmed before, that joke might take you a bit to get. Come back in a few months and you'll appreciate it.

This is pretty long, but we're almost done. Bear with me here.

Let's add a new command: 0010 ("2" in binary). This command means "write the value from the first address given to the second". Furthermore, let's pretend we have 8 registers, labeled 0000 - 1000. Finally, I'm going to update command 0001 to mean "write the value of the given address".

Try to figure out what the program below is doing before you read the explanation:

0000 0010 0010
0010 0000 0001
0001 0001

Did you figure it out?

Are you sure?

Did you even try?

I'm on to you. 

...

 Bringin' this meme back.

Bringin' this meme back.

Ok ok, here's what it's doing:

register A = 2+2
register B = register A
"4"

Hey! Now you understand the fundamentals of how a computer functions.

What if we wanted to store the value of a register in a register, though? Well, we can already do that - above, we indexed the value of each register to 0000 - 1000, right? So it's literally as simple as saying "interpret the value of this register as a register". We could call that command 0011 ("3") if you wanted to.

That's a pointer. Literally just a chunk of memory that has the address of another chunk of memory.

 Get it? Because it points to another ad-... nevermind.

Get it? Because it points to another ad-... nevermind.

The next part of this guide is going to cover pointer scanning and why that works. But, if this is the first time you've heard of what a pointer is, or really understood what a program is... Take some time to let it settle in your mind. Understanding these concepts is essential to following what's going on in the pointer scanning, as well as taking things further: code injection and whatnot. 

Besides, there's no rush. It's not like computers are gonna go anywhere.

Pillars of Eternity: A Practical Guide to Cheat Engine (Part One)

Recently, I used Cheat Engine to hack Pillars of Eternity so that I could have infinite spells. In a later blog post, I'm going to explain why I did this and how it vastly improved the game experience for me. However, I noticed that most guides to Cheat Engine are terrible, so I'm going to write my own. It'll be in three parts - part one will cover finding values. Part two will explain the concept of a pointer, and talk about what a program actually is. Part three will be a practical guide to using pointer scanning and writing a script to inject code into the game's assembly (part three may actually be parts three and four at this rate, haha.)

This is part one.

I do recommend reading through this guide in full once BEFORE following along with it. A lot of things are likely to differ if you are not working with Pillars of Eternity.

Part One: Finding a Value with Cheat Engine

Let's open up Cheat Engine! And Pillars of Eternity (though, this could be any game of your choice).

 At the bottom, you'll see a tool labeled "ST", this is the snipping tool that I'll be using for screenshots. It's bundled with every copy of Windows and it's a fantastic tool, you should use it.

At the bottom, you'll see a tool labeled "ST", this is the snipping tool that I'll be using for screenshots. It's bundled with every copy of Windows and it's a fantastic tool, you should use it.

Click the button that's circled in the image above - this opens up a list of processes to attach Cheat Engine to.

Click on your game (labeled "1" above) and then click Open (labeled "2" above).

3.PNG

Now Cheat Engine is attached to your game's process.  You can verify this by looking at the name of the process in the area highlighted above. If it's not right, close and reopen Cheat Engine and try again.

We'll get to what "attached to your game's process" actually means in part two.

For now, we're just going to figure out how to find a value - in this case, we're going to find the number of level 1 spells we can cast in Pillars of Eternity. So, now switch to your game and, you'll have to use your best judgement here, but you'll need to be able to freely modify the value you're looking for. For our example, I have a level 1 spell I can cast freely whenever, so I'm going to use that.

 Don't worry about anything in this screenshot except for the number circled in red.

Don't worry about anything in this screenshot except for the number circled in red.

We can see above that I have four level one spells to cast. Let's go back over to Cheat Engine...

 DON'T TOUCH ANYTHING NOT HIGHLIGHTED

DON'T TOUCH ANYTHING NOT HIGHLIGHTED

There's a couple things going on up there. First of all, in the "Value" input box, we're going to input the initial value of what we're looking for - in this case, it's the number "4". There are two other input values to look at here - one is "Scan Type", and one is "Value Type".

"Scan Type" basically tells Cheat Engine how to use the value you give it to look for values in your game. In this case, "Exact Value" means "When you scan, look for EXACTLY the value 4". Let's leave it at "Exact Value" for now.

"Value Type" tells Cheat Engine what the number you're looking for looks like. How do you know that? Well, you don't. Unless you're the one that wrote the game. But, you can make an educated guess - most times, for a PC game, whole numbers are going to be 4 bytes (what's called an "int" by programmers). For numbers that have decimals, you'll want to set this to "float" or "double".

For this value, let's start with 4 bytes.

When your values are all set correctly, click "First Scan".

 Oh yeah, we can narrow this down from ONE MILLION results. Thanks Cheat Engine.

Oh yeah, we can narrow this down from ONE MILLION results. Thanks Cheat Engine.

The results look more intimidating than they really are. Let's talk about what Cheat Engine just did. It basically scanned all of the memory in use by the game and found literally all of the 4 byte memory pieces that have the value 4. There's a lot of them, if you can't tell. Games use a lot of memory.

In the leftmost column, you can see the memory address. This is how the game knows where that value lives in the computer's memory. Anytime the game asks for... um, "000800EC", it gets back the value in that piece of memory. In this case, it would give back the value 4, but it could be anything. The middle column shows you the value of that piece of memory in this frame. That is what the value is at the very moment in time. The rightmost column shows you the value of that piece of memory in the last frame. For example...

 One down, 1,864,839 to go.

One down, 1,864,839 to go.

Address 512023C0 is NOT our level 1 spell count. 

For our next step, we're going to change the value we're looking for - in this case, we're going to cast a level 1 spell, changing our value from 4 to 3. So, first go in game and cast a spell...

 OMG the number went down!!!!

OMG the number went down!!!!

Then go back to Cheat Engine...

Change the value you're looking for to 3 and click "Next Scan".

Hey, look at that, we've gone from over a million results to about two thousand. That's still too much to sort through manually, but we can keep repeating the process just the same - changing the value in game, then doing another scan for the new value in Cheat Engine.

If you're following along in Pillars of Eternity and repeat that process, what you'll eventually find is...

Zero results. Now, this is definitely a common thing that happens when you're trying to find a particular value in a particular game. There are a few possibilities here:

1) You messed up somewhere along the line. I did this a lot, in my early days of using Cheat Engine. No shame, it's a complex tool. You'll want to get comfortable finding values in games before you do more with Cheat Engine. It's not very intuitive and it's all downhill from here. This might be you, so repeat these steps a few times just to be sure.

2) The value is not a 4 byte number. This is less common nowadays than it used to be, I think, especially for PC games. There's enough memory space available that most numbers will be 4 bytes, but there are memory optimizations that COULD be made to compress how much memory each value is taking up that would reduce it from 4 bytes to 1 or 2 bytes. 

3) The value is not being tracked how you think it is being tracked. What this means is sort of vague - basically the programmer decided, for whatever reason, to count differently than you're counting. In this SPECIFIC case, the programmer of the game decided to count spell casts up from 0, meaning that what you're seeing in the UI of PoE above is the value (4 - N), where N is the number of spells of that level you have cast. 

I am a programmer, but I made the above mistake when trying to find this value at first and thought it would be a good demonstration of how using Cheat Engine effectively is much like reverse engineering, and by extension, requires that you get into the mindset of the programmer that wrote the game. In this case, I figured it out by talking it over with my more-experience programmer significant other, who, once he heard the design of the game, pointed out that it would be easier to count up from 0, instead of down from whatever the arbitrary number of spells for that tier was. While we might disagree that one method is easier than another, he was indeed correct that the programmer of Pillars of Eternity decided to implement it that way. 

So if we repeat our value finding process, but this time, we find it with the paradigm in mind that the value will count up from 0...

[NOTE: Starting a search for a value from 0 is a bad idea, just because there are SO MANY zero values in memory. If you can avoid starting from 0, I really recommend you do.]

There we go. That looks a lot better. From here, it's relatively safe to just try to change the values, then look in game and see if the value you're trying to modify changed. To do that, double click all of the remaining values...

That will add the addresses to the highlighted box on the bottom. From there, you can double click one of the values on the right there...

 The value is negative because anything above 4 will probably just show as "0".

The value is negative because anything above 4 will probably just show as "0".

So here's what my values were after I changed them. Uh, the one that's listed as 4294967286 is the one I set to -10. Negative numbers look a little odd when they're in a computer, you can read more about it here. Let's go back to PoE and see what changed...

Oh look, the correct value was the one we set to -10 (4 - -10 = 14).

Sometimes values won't reflect their changes immediately - money is a common one. You set the money to 10000 and it doesn't change. Well, make sure you try to get some money in game to cause it to update before you throw your work out the window. It may be that the UI doesn't update until it is triggered to by an event, such as a PlayerPickedUpMoney event. That said, if it STILL does not contain your change, you probably haven't found the right value and need to restart the process.

And that's how you find a value. It's tough, but far from impossible. Like I said before, I would get comfortable with finding values before moving on to later sections of the guide.

In the next part, we'll talk about what those addresses are and what a program actually is.

Spider Inquisition

Let me tell you a story today about the Spider Inquistion.

Spider Inquisition was a spider that lived in our house. I named him as such, because he lived right above the garbage disposal switch, and I would never expect him when I reached over. But, since he was otherwise a quiet guest, and continued living there despite me clumsily colliding with his web, I tolerated his presence for a while.

After a few weeks of this, I decided I ought to move him out so we could stop being in each other's space. However, I botched the move attempt and he escaped into cabinetry for a time. I thought he had found another place to call home.

One day, out of the blue, he returned! To his usual spot that I never expect him in, in front of the garbage disposal switch. I had grown to miss him since the attempted move and welcomed his return.

That was until today, where I spotted a suspicious bundle in his web. This brought two surprises to me: one, that Spider Inquisition is actually a girl spider; two, that Spider Inquisition, in her wild days away from the web, had gotten knocked up and brought her kids back here.

Not particularly wanting to house 100-400 spider babies, I decided to look into my options using the internet. Where I found that my dear roommate, Spider Inquisition, was going to die soon. My heart broke.

In my grief, my fear of the house being overrun by baby spiders left me, and I swore to take care of them as well as I could. I moved her and her egg bundle outside (because that fear returned quickly) and placed a fly trap nearby I made of a jar, some plastic wrap, and apple cider vinegar. This should provide an adequate food supply for the baby spiders.

But I must say, I did not expect to feel so heartbroken, and yet, so happy, to find a spider egg bundle in my home. I hope Spider Inquisition finds a peaceful resting place and that her babies are numerous and prosperous.

RIP Spider Inquisition. I'll never expect you again.

The Death of Success

It's been a while since my "I feel accomplished and therefore unmotivated" post. 

In case you're wondering, no, I did not stop playing Gungeon. 

I love playing Gungeon.

In fact, here are some of the things I achieved since then:

  • Beat the 5th Floor Boss for the first time
  • Killed a past for the first time
  • Killed the four Gungeoneer's pasts
  • Unlocked a secret character
  • Killed three Jammed bosses
  • Did a blessed run
  • Did a cursed run
  • Got a rainbow chest
  • Got a glitched chest (I didn't win but I found one, OK?)

And more, but I wanted to keep the list short.

I worked through the sort of "regression of success" feeling. I played and died and died and died to get myself over it, usually in really dumb ways. Out loud, I frequently mentioned how much I sucked and questioned what I was doing with my life. But sometimes, in between all the dying, I managed another achievement, and then another. It's almost like all of those dumb deaths... contributed to my being able to get those achievements. Like I learned from them and improved

Feel free to take a second to catch up. I still don't understand it.

There are still things to do, but I've accomplished the main objective of the game - everything else is gravy. And, honestly, if there was a point I was going to stop playing, I figured it would be now, when I've sort of "seen everything". 

But I haven't. I still boot it up. Hell, I'll boot up a cursed run and die on the first floor again. It makes me happy. Sure, I could make it to the end and beat the boss, but it's not about that anymore.

Wait. Did you hear that?

It's not about winning.

Honestly, I'm dumbstruck by that statement. Like, full on, spaced out, staring at the keyboard, dumbstruck. 

Can I make myself think that way about everything? 

Should I?

Should I work on my game projects like I've already shipped Minecraft? Should I apply to jobs like I've already got two dozen jobs lined up?

It's hard to discard the very real feelings of desperation and desolation. Bills need to be paid, and there are only so many jobs one can apply for before feeling like the lack of responses reflects on themselves. Yet, at the same time, my gut tells me this is exactly what I should do; always play as if you're at full health in Gungeon, even on your last heart - nothing causes you to die as quickly as losing your nerve (a beautiful run where I ruined it by doing just that comes to mind).

That level of confidence is terrifying. Maybe because I'll fail and realize that I was never competent all along.

Ha. This is sounding familiar.

I don't have an answer for you. I'm really exhausted thinking about it, actually. I want to try it. I want it to be true. And even failure aside, I'm equally scared of becoming overconfident and ignorant of my flaws. 

But that's silly, right? That wouldn't happen to someone as rigorously self-introspective as me, right?

...

existential crisis intensifies

Believeability in Games

People talk about "immersion" all the time. It's hard enough to quantify as it is, but I think some people use it to talk about "flow" or just how much their mind is "in the game", so to speak, as well. There's another aspect of it I'd like to talk about, which I'll be calling "believeability". 

Believeability, as we'll define it here, is the quality of how believable it is that a person or thing is behaving in the way it's behaving. For example, picture a big hungry dog and a steak - the dog is almost certainly going to eat the steak, right? It would be fairly unbelievable to see a dog and a steak and see the dog, for instance, sit on it. Or flee in fear of the steak. You'd think that there was something very wrong with the steak or the dog.

Well, I've noticed that something I don't hear or read about very often is this trait of believeability in games. I'd like to expressly bring it up, because I was wondering why it is that Enter the Gungeon so forcefully grabbed me and refused to let go, even though roguelikes are far from my preferred genre of game (for example, I found Binding of Isaac dissatisfying and FTL abhorrently frustrating). And I think that believeability is a big part of it.

In fact, I can point at a lot of my favorite games, and the most common thing they have is that I find the main characters (and supporting characters, if present) extremely believeable. 

Now, if you're going to take any of these examples and say, "BUT I DISAGREE", at least recognize that this is believeable in my opinion. Your opinion is probably different. I just wanted to recognize this as a thing that should be talked about. 

We'll start with a good example: Enter the Gungeon! Despite its silly nature and torrent of puns (The Gungeon? The Gundead? Bullet Kin?), the game feels very believeable to me, not in the sense that it feels like something that could really exist, but its something that could really exist in that universe. We're not given a lot of information about the world, but it's believeable that, in this universe where there is a dgungeon that contains a Gun That Can Kill The Past, there are people who would trade eternity in there for a chance to fire the gun. And you play as those people, and you can imagine them as people in this extraordinary situation, and you can imagine their thoughts as they die, over and over again, for a chance to change the past.

To clarify, I'm not saying believeability is a measure of something's ability to be believed as according to the rules of reality as we know it, but rather, it is the ability to be believed according to the rules defined by the world the thing is in. To go back to our example, the dog sitting on the steak is unbelieveable in our world, but perhaps there is a world where a mischievous rat steals things that are left alone for too long, so the dog sits on the steak to keep the rat from taking it. Or it flees in fear, because there is a terrible creature that often masquerades as steak.

Yeah alright, that analogy wasn't very believeable, but hopefully you see my point.

Let's talk about a poor example of believeability: Guild Wars 2. Believeability is actually a really difficult thing for MMOs, so hopefully my ArenaNet friends can forgive me for picking on their game - it's quite understandable that this is a problem! 

While trying to find a class that felt both fun to play and didn't grow old when I mastered the core loop of abilities, I created a human thief. I've always liked thief characters, Garrote from Thief is an awesome example (the old Thief, not the new one). In fact, that would be another good example of believeability, but I digress.

I created a human thief, and experienced a large sense of dissonance as I played through the personal story. For background, every race has its own personal story that you play through, with a few nuances decided by your unique character. However, the overarching themes are largely the same within a race - a human elementalist is going to have a very similar story to a human thief. In the human storyline, your character starts by deciding to shed their ordinary citizen's life to save a city under siege.

Yeah.

It doesn't help that I chose the "Street Rat" background - I was a thief, after all - and my character would, bare minimum, take advantage of the chaos to steal a bunch of shit, and also probably be bitterly satisfied that the people content to let her starve are now getting trodden upon. Nevermind taking orders from some sergeant that, in all likelihood, she'd probably had some unfavorable run-ins with in the past. 

Now, I understand that Guild Wars 2 is a high-fantasy setting, and to their credit, it does seem like the storyline picks up after that. However, I had already been rudely booted out of the experience before I had even gotten into it. There were other contributing factors (the fact I was already largely bored of the game didn't help) but that's the factor that was most striking by far.

Alright, I feel like I've written a lot about this now, so I'll go with one last good example of believeability: Tales of Berseria. JRPGs and story-heavy games are probably their own post, but one of the things I found really enjoyable about it is how believeable the protagonist is. She's on a quest for revenge to avenge the murder of her little brother and, in the process, does some fucked up shit. And it's awesome, because for that character, who has essentially gone mad from being stuck in a prison for three years to ruminate on just how much she wants revenge, it totally makes sense. I might, personally, disagree with her decisions, but at least I can see why she decided them. I was never left thinking "yeah that's totally out of character", and it's great.

Hopefully, you found this to be a new way to introspect and think about games. How do the games you like rate in believeability? Is it an important factor to you? Regardless of your answers, I hope this gives you new information about your favorite games and why you like them.

Destiny gets an honorable mention here, because the storyline leaves much to be desired and it's a little unfair to pick on it on top of that. But I rolled a very butch looking mercenary with a goddamn skull tattoo on her face and was IMMEDIATELY thrust into a goody-two-shoes adventure to save the world. It was actually sort of humorous, in retrospect.

Gungeon to the Head

I reached Floor 4 in the Gungeon.

I have no idea what to do with my life anymore.

I feel accomplished. I feel like I did something

It's hard to feel motivated when you feel like you've done something. This is another thing I struggle with. Once you push past the first 10% of a project, it's easy to stop at 50% and be like, "Eh, I'm done."

This is my brain finally getting a hit of joy and acceptance after the repeated, self-inflicted doses of criticism, self-hatred, and dejection. Maybe that's the real problem.

It's hard for me to go back into the Gungeon now. I haven't touched it since I hit the fourth floor. Part of it is coasting on the achievement, but part of it is also looking briefly ahead and seeing the even deeper plunge into failure and the accompanying mental self-flagellation. 

I was contemplating how to get around this, when my significant other made a joke about a gun (sorry, love, I can't remember exactly what you said) and tripped my memory of this Cracked article. The long-and-short of it (you should just read it, it's a good article) is that people do things because they 1) "want" to do it (where want is being willing to put time, effort, sweat, and blood into it) and 2) the consequences of not doing it are worse than doing it (they have an invisible gun to their head).

Now, if I went my whole life without beating Gungeon, I wouldn't be that heartbroken. It's a good game, but that's all it is, it's a game. I'd be much sadder if I neglected some of the other things I do with my life instead (writing this blog, for instance). But if our motivation equation looks something like this:

motivation = RewardForDoingTheThing + ConsequencesForNotDoingTheThing - ConsequencesOfDoingTheThing

Then my RewardForDoingTheThing is low (Reaching Floor 5 would be pretty sweet, but is relatively unimportant), my ConsequencesForNotDoingTheThing is low (well, if I don't do it, it's not that big of a loss). But my ConsequencesOfDoingTheThing is pretty high, so now I'm unmotivated to do it, because I know that the next time I play and die on Floor 2 again, I'm going to be right back in that shitty place and my brain's going to show up and say, "See, reaching Floor 4 was a fluke and you're actually a failure."

It seems that, after my attempts to work through my own discouraging, I've hit a point where it's spiked up due to my accomplishments. Due to my Fixed mindset, I don't want to proceed and prove that it actually was a fluke. Whereas, if I believed that traits were malleable and that I've gotten better but I'm still not the best, I could handle the early floor deaths without it crippling me.

"There's always a thing I can get better at." That's what I should be thinking - and keeping the metaphorical gun... geon to my head. For this, and everything else I want to be great at.

...

Usually, if you can push through a big spike like this, it's all downhill from there... Right?

Man, reprogramming your brain is hard...

Fixed vs Growth Mindsets - An Experiment in Gungeoneering

I've had a few blogs that I couldn't stick with, namely because they'd be single topic novelty blogs. So this time, I'm going to try to write somewhat consistently, but the topic's gonna be whatever I want it to be. 

In the course of discussing new mechanics for first-person shooters, my lovely aunt linked me to an LP (Let's Play) of a game called "Enter the Gungeon". I watched the first video and soon became enamored. One $15 Steam purchase later and... 

Well, I died. I died a lot.

Coincidentally, I've been trying to finish a book called "Thanks for the Feedback", because it is actually my wonderful SO's book that I stole and want to return at some point. It's a great management book, but also full of surprisingly applicable general life advice, one piece of which covers the topic of Fixed vs Growth mindsets.

The Fixed vs Growth mindset is, in pretty high level terms, the idea of whether a person's attributes are fixed from birth (like height) or are malleable and, in particular, capable of improvement (like the ability to do a pushup). Sometimes, it's with regard to things like physical strength, but most of the time it's in regard to less... flattering traits. Things like the ability to do math or puzzle solving, the ability to receive feedback, or, most relevantly, the ability to play a video game well.

Now, you may not know me, so I'll briefly explain the kind of person I am: I'm pretty stoic, laid back, easy going, and I try not to let anything get to me. On my best days, most everything will roll off my back with a lighthearted joke. And, on my best days, any failure on my part will be met the same way. 

As you may have guessed, not every day is one of my best days. I've always struggled with the idea that your traits are fixed - you're smart or you're not, you're a winner or a loser - and I have a mean competitive streak that I do my damnedest to never let see to the light of day.

Returning to dying and dying a lot: you know, I'm really quite good at Dark Souls. In fact, I consider myself quite good at video games in general. But I could barely manage to make past the first level of Enter the Gungeon.

Not past the first boss. Not even to the boss.

I played a round. Died. Played another. Died again. Promptly quit before I played again and then destroyed my very expensive and totally innocent laptop.

I returned to the LP linked above frothing with rage. I seethed with jealousy at the speaker's display of skill, seemingly effortlessly breezing through the levels and stomping the bosses. I didn't watch too much further, I didn't want to get too many spoilers. Or so that's what I told myself.

Eventually, I came back to it. I had a craving for Gungeoneering that wouldn't be satiated by capitulation to the game's difficulty. Each death or two, I would have to force back the frustration in my throat and turn the game off to do something else. But I kept coming back.

Then I read that chapter, about Fixed vs Growth mindsets. And, in particular, reflected on a friend's ability to celebrate every small victory, no matter how insignificant. I decided that, in order to be the most effective person I could be, I ought to have that trait. I ought to be resilient to failure and celebratory of each and every trivial victory.

If this were a Hollywood movie, this would be the part where I have a short training montage and then you see me 100%-ing Enter the Gungeon. Well, this is a blog post, not a movie. Instead of dying partway through the first level, or at the first boss, I now usually die at the second boss.

Progress. :thumbs-up emoji:

That last sentence was a little sarcastic. Let's try again. Since I started playing, I have:

  • Rescued that couple on the second level
  • Killed one of the first-level bosses without taking any damage, and got my first Master Round
  • Got enough shells to buy the Prime Primer (I died before I could buy it, but I had the shells!)
  • Killed the second floor boss and made it to the third level (once)

Additionally, when I die, I try to pick out things I did well in that run, even if it's just stuff I now consider "baseline". Here's some examples of things I've thought and things I'm trying to prefer thinking:

  • "I can't believe I died at X again!" -> "I gotta be careful of X enemy / environmental hazard."
  • "I'm never going to get past this level." -> "I should keep a closer eye on my character and focus on dodging."
  • "That LPer has the best RNG luck, it's not fair." -> "I should watch how he's using the environment and the guns he gets."
  • "I hate this game, it sucks and I should never play it again." -> "I hate this game, it sucks and I should never play it again."

Obviously, I'm not a master at this. This game is just agonizing to play - it brings me back to the first few times I played Dark Souls and literally had to be hand held to not scream and/or cry when I played it. And every inch of me is telling me to uninstall this game and never breathe a word of its existence to anyone else. 

But I'm not gonna do it. I'm gonna keep playing it and feeling this agonizing failure, over and over, until it finally stops being agonizing. Because nothing in life has held me back as much as a fear of failure. 

And, of all the things that are fixed about me, this fixed mindset ain't one of 'em.

I heard this great quote on the radio earlier today. I think it's relevant, and I'd like to close this blog post on it:

"Don't waste your time on jealousy. Sometimes you're ahead, sometimes you're behind. The race is long and, in the end, it's only with yourself.

But trust me on the sunscreen."

Originally by Mary Schmich, later on to be used as song lyrics by Baz Luhrmann