#78: How I built an entire game and toolchain 100% in Python Transcript
00:00 What kind of applications can you build with Python?
00:02 You hear me featuring many people on this show that build websites, web services, or some data science-driven application.
00:09 Of course, all of those are wonderful, but I know many of you have dreamed of building a game.
00:13 In this episode, I'm interviewing Joseph Charlin.
00:16 He created the game Epicos and the entire toolchain to build it in Python.
00:21 He has a great story about how he came across Python, why he decided to use it in his game,
00:26 and advice he has for anyone out there taking on a large project like this.
00:30 This is Talk Python to Me, episode 78, recorded September 24th, 2016.
00:53 Welcome to Talk Python to Me, a weekly podcast on Python, the language, the libraries, the ecosystem, and the personalities.
01:07 This is your host, Michael Kennedy.
01:09 Follow me on Twitter, where I'm @mkennedy.
01:11 Keep up with the show and listen to past episodes at talkpython.fm, and follow the show on Twitter via at Talk Python.
01:19 Hey, everyone.
01:20 As always, thank you so much for listening.
01:22 I think we have an interesting look inside a really cool project by Joseph this week,
01:26 so I hope you enjoy the episode.
01:28 He talks about the game that he built and the whole toolchain and how he used Python to do it.
01:33 And he and I talked after the show and decided it would be really great to give away some copies of his game.
01:39 As always, if you want to win something from the show, you have to be a friend of the show.
01:44 Super easy.
01:45 Just visit talkpython.fm, click on friends of the show in the nav bar, enter your email address, boom, we're friends.
01:51 Well, we're already friends.
01:53 You're listening to the show, right?
01:54 So thank you so much.
01:54 But officially, to win, you've got to be a friend of the show, so give me an email address so I can hopefully pull it out and send you one of the games.
02:02 Hope you enjoy the episode.
02:03 Let's hear from Joseph.
02:04 Joseph, welcome to the show.
02:08 I'm super excited to talk about how you built your game in Python.
02:11 And not just your game, but your entire toolchain.
02:14 And the story of how you did this and your journey is super interesting, and I'm looking forward to sharing with everyone.
02:20 Yeah, it was really fun.
02:22 And thanks for having me on the show.
02:24 I think it'll be fun to talk about it.
02:26 Yeah, I definitely will.
02:27 And you're welcome.
02:27 So before we get into the story of Epicos and your game and things like that, let's talk about your history.
02:35 Like, how did you get into programming?
02:36 So strangely, I didn't actually have a computer to program on growing up, like a lot of my friends who are also programmers.
02:44 But when I started going to college, actually, my dad bought me a computer.
02:49 And as a kind of random thing, I took intro to computer programming course in college.
02:58 It was totally random.
02:59 I was supposed to be, you know, I was in pre-architecture major, right?
03:03 So I wasn't doing anything related to programming.
03:06 And I took this programming course, and I was like, this is what I want to do for the rest of my life.
03:12 All I want to do is program.
03:14 This is it.
03:16 And I had to switch to computer science.
03:20 And I knew, you know, there were a lot of math prerequisites that were going to be new.
03:24 And I was like, I'll just do it.
03:25 I don't care.
03:26 I'm going to study hard.
03:27 I'm going to learn everything.
03:28 I'm not one of these guys who's been programming their whole life or whatever.
03:32 That's great if, you know, if you have that.
03:35 That's awesome.
03:36 But not me.
03:38 I learned in college.
03:39 And my express goal was always to program video games.
03:42 I love video games.
03:44 Had a NES growing up.
03:45 Most of my favorite games are NES games, I would say.
03:48 But that got me into the games.
03:51 And when I was programming in college, I always wanted to make games out of my programs.
03:56 So I was learning stuff like DirectX.
04:01 I was trying to learn stuff for game programming.
04:04 I was making little games all the time in college.
04:07 That's really cool.
04:08 That's kind of how I got into programming.
04:10 I think a lot of us can relate to this feeling of like, once you discover programming, you're like, this is what I want to do.
04:16 I still remember one of my very first paid outside of university jobs was working on 3D visualization software doing C++ and OpenGL.
04:29 And I was just thinking, you know, my first day, first week at work, I'm like, this is it.
04:33 Like, my life is perfect.
04:35 I'm sitting here doing like OpenGL and programming.
04:38 And oh my gosh, this is so amazing.
04:40 I was just thrilled.
04:42 So you've done a lot of C++ programming as DirectX and probably OpenGL as well and all the major game engines.
04:49 That's kind of what you do for your day job, right?
04:52 Yeah.
04:52 I mean, I'm not an indie dev during the day.
04:55 I'm a programmer.
04:57 I do game stuff.
04:59 So I've been in the games industry about 10 years.
05:02 I've shipped three or four titles.
05:05 If you count expansion packs, I don't know.
05:07 Three or four.
05:08 Any major ones that we probably played if we're into games?
05:11 I shipped a few mediocre console titles.
05:15 I mean, they weren't bad.
05:16 I liked them, but probably nothing too big.
05:19 Okay.
05:20 And then I went and I started working at ArenaNet, which makes Guild Wars.
05:25 So Guild Wars 2, I worked on.
05:27 I would love to take credit for a lot of the things in Guild Wars 2, but I can't.
05:31 I only joined a year before they shipped.
05:33 You know, I tried to help out before shipping, but like, obviously, the lion's share of the credit for this game doesn't go to me.
05:41 And there's a lot of programmers here.
05:43 The major games have an incredible number of developers and artists and team members.
05:48 It's not a one-person deal to ship games these days, is it?
05:52 It's really huge.
05:53 ArenaNet isn't super big like EA or anything, which makes it nice, actually.
05:58 But there's a lot of people you're working with.
06:01 And the key thing ArenaNet actually let me do was, in most games industry jobs, you're working like, it's not a 9-to-5 thing, right?
06:09 You're working 12, 14 hours a day.
06:11 You can't make a side project, right?
06:14 You have to go home and sleep, right?
06:16 Or go home and drink so that you can get over working 14 hours and then go to sleep.
06:21 And that's it.
06:23 You can't do that.
06:23 Once I started working at this new job at a more responsible company, plug for Internet, basically, it is.
06:31 They actually make sure that there's no real overtime there.
06:35 So I came home, and I was like, wow, I should be programming.
06:38 And that's kind of how the game started getting made.
06:41 That's great.
06:43 That's great.
06:44 So we'll talk about how you're using Python in your game in a moment.
06:48 But why don't you tell the story of how you got into Python and why you thought it might be interesting for a game in the first place?
06:55 You know, I don't know if I'm exactly 100% Python programmer.
07:00 I like Python.
07:00 I'm really a C programmer.
07:02 Most of my work is in C++, but I prefer C-style stuff with a little C++ thrown in.
07:10 I'm not, you know, going off the deep end with all the C++ features.
07:15 It's a good language.
07:17 I like it a lot.
07:18 It's my first language to see.
07:19 So obviously, it's like your first language always has a special place in your heart, no matter who you are, I think.
07:26 At work, I had to fix a bug, which happened to be in Python.
07:32 I think an artist had made a script in Python.
07:35 And it was a good script.
07:36 It had a bug in it.
07:38 And I fixed it.
07:39 And I fixed it.
07:40 After learning a little bit of Python, like, think about maybe like a couple hours, Python gave me enough ammo to kind of fix a rudimentary bug.
07:50 So if you're getting into Python, it's not too bad if you're a C programmer already.
07:54 But then I was looking at this language.
07:57 I was like, huh, I wonder what you can do with this thing.
07:59 Because I'm thinking about it as a C programmer, really.
08:02 I'm thinking about Python as a C guy.
08:04 Like, oh, this looks like it'll save me some time.
08:07 Maybe I don't have to declare things.
08:10 You know, I don't have to put together all the nuts and bolts of the program as much.
08:15 And I took it home.
08:16 And I wrote a C program.
08:19 You know, I wrote a program in C.
08:21 I can't remember what it was.
08:23 I think I had to automate some process I was working on.
08:26 And then as a challenge, I wrote it in Python.
08:29 So in C, it was 300 lines of code.
08:33 And I'm making up the lines.
08:34 I don't remember exactly how many lines it was.
08:36 Let's say it was 300 lines of code.
08:38 In Python, it was like 100 lines of code.
08:43 My first Python program, you know, 100 lines of code instead of 300.
08:47 And I'm thinking, wow, this is pretty great.
08:50 I had to write.
08:52 That's a nice improvement.
08:53 A third the amount of code.
08:55 That's cool.
08:56 And then I was looking at it more.
08:58 Like, okay, let me learn more Python.
08:59 So this is, you know, learning almost no Python.
09:02 I got a third out.
09:03 That's great.
09:04 Because less code, you know, if you know as a coder, less code means less bugs, right?
09:10 You don't want to write things in as long way as possible.
09:13 That's it.
09:14 So less code, less bugs, great.
09:17 And then I started learning more Python.
09:18 I was like, wow, I can get this down to 50 lines.
09:21 And I learned more.
09:22 It's like, I can get this down to 25 lines.
09:24 Learn more Python.
09:26 Learn about how the sorting works, the data structures, all the stuff that I just normally
09:30 manually code or use some library for, which tends to be verbose in C++.
09:36 And then, oh, wait, it's 20 lines of code.
09:39 Wait, it's 10 lines of code.
09:41 And I'm sitting here with 10 lines of code instead of 300 lines of code.
09:44 10 lines of expressive code instead of 300 lines of nuts and bolts and a little bit of
09:50 expressivity somewhere in there.
09:52 And I'm like, I could probably write this thing in a couple lines, but it would be really
09:57 ugly code.
09:58 So I'm going to leave it at whatever it was, 25 or 15 lines of code.
10:02 That experience was the one which convinced me, wow, Python, there's something to this
10:08 language.
10:09 Granted, I haven't done a lot with scripting languages.
10:12 I'm a C person.
10:13 So people tell me, well, you can do this.
10:16 So with this, you can do this.
10:18 Okay, maybe they're right.
10:19 But for me, I learned at Python, this exact experience was what got me into Python.
10:25 And that totally convinced me there's something to this language.
10:29 That is a really cool story.
10:30 I wish you had kept all the versions of code.
10:33 We could put them up as like GitHub gists or something like that.
10:36 But still, the story is great.
10:39 And I think a lot of times you'll hear people say, well, I like this language because it's
10:44 dynamic and it doesn't have types.
10:46 Or I like this language because it doesn't require compiling like C does or something.
10:50 But I think what was really cool about your story is it really highlights what's truly
10:55 cool about languages like Python and especially Python is that whether or not you compile those
11:02 25 lines, it is a much better experience.
11:05 What you can do and the way you put these, the standard library together and the packages
11:11 and all sorts of stuff.
11:12 It's great.
11:12 Yeah, I totally agree.
11:14 I don't want to put words in the mouth of the devs of Python.
11:17 But I think the point of the language is just to be expressive.
11:21 So you'll write, normally you'll write code and there's a lot of boilerplate code.
11:26 There's a little bit of code that carries the intent of what you actually wanted to do.
11:32 And in Python, it's like the code that expresses what you wanted to do is the code, more or less.
11:37 Yeah, you had a cool thing where you said, you're talking about an algorithm, the A-star
11:42 path navigation algorithm in a Reddit post that we'll get to talking about.
11:46 And you said, here, look, Wikipedia is describing the algorithm in words and basically pseudocode.
11:52 Drop this into Python.
11:53 How much work would it be to just make it execute, basically?
11:56 Which is really nice, I think.
11:58 It's amazing.
11:58 Like, I copy-pasted some pseudocode into the Python editor.
12:02 I changed, I think, the equals signs, right?
12:04 And the pseudocode is different than the equals signs of Python.
12:07 And then it worked.
12:08 And I was like, I don't have to write A-star now.
12:10 That's awesome.
12:11 Cool.
12:13 So let's talk about your...
12:13 It is like, I can't even believe it worked.
12:15 Yeah.
12:16 That's really, really cool.
12:18 So let's talk about your game.
12:20 What's it called?
12:20 Oh, sure.
12:21 Epicos is the game.
12:22 E-P-I-K-O-S.
12:25 It's the Greek word for epic.
12:27 Oh, nice.
12:28 And it's a game I wanted to make for a number of years.
12:33 Even in college, I wanted to make this game.
12:37 But once I started working in the games industry, of course, I didn't have time because of the hours.
12:43 But then I eventually had time.
12:45 I got to a more responsible company.
12:50 The game is pretty retro.
12:55 It's hard to say that in a world where pretty much every game claims to be retro these days.
13:02 Yeah.
13:03 It definitely has a retro feel.
13:05 I'll vouch for you.
13:06 It does have a retro feel.
13:07 And it's a visual RPG where it's...
13:11 I don't know.
13:11 I feel kind of like it's a simplified Legends of Zelda type game maybe a little bit.
13:17 Like it has that kind of feel of playing.
13:19 It might feel that way.
13:20 I feel actually it's a combo of Ultima and Final Fantasy, probably four.
13:26 Probably a combo of Ultima four and Final Fantasy four.
13:31 So like Ultima, you have interesting property that the more...
13:36 The faster you input on your keyboard, the faster the game runs.
13:40 No games, even if they claim to be retro, no games have this property anymore.
13:44 But in the 80s, a lot of games had this property.
13:46 If you type fast, the game went fast.
13:49 And if you type slow, the game went slow.
13:50 And if you left, the game didn't do anything at all.
13:53 And whereas nowadays, even the turn-based games, it doesn't matter how fast you go.
13:57 So they're very slow because you have to wait for the AI to think.
14:01 And you have to wait for all these stupid animations you don't even care about to finish playing.
14:05 And all these sound effects you get over with.
14:08 And you just want to play the game.
14:09 But the game is so enamored with its own wonderful effects, it won't even let you play it.
14:15 And plus the AI is typically not written efficiently.
14:18 Which my AI isn't any...
14:21 You know, it does stuff.
14:23 But think about it.
14:24 It's in Python.
14:24 I mean, that's like 500 times slower than C.
14:27 And the game runs that frame, right?
14:29 So it's possible to do.
14:31 That's awesome.
14:32 And it's all about designing it in the right way, right?
14:35 I mean, it's the trade-offs you make.
14:36 Like you said...
14:37 Yeah, absolutely.
14:37 Stay away from the crazy animations.
14:39 And guess what?
14:40 You can go through the steps faster.
14:42 That's cool.
14:43 Yeah, everything runs really fast.
14:44 On your website, you have a place where you say...
14:48 You talk about the outstanding features of the game.
14:51 Can you maybe highlight some of those?
14:52 It has a very original mythology.
14:55 There's a website called Indie Overlook.
14:58 I want to plug.
14:59 They did a review of my game.
15:01 They got the idea of the feeling of mythology and lore is a key part to the game.
15:07 And also, they were critical of some aspects of the game, which I totally agree with.
15:11 Like, I agree with what they liked about it and what they didn't like about it.
15:15 So Indie Overlook.
15:16 Check them out.
15:17 And the original world and story is one of the main things.
15:22 So basically, everything you see in the game has a lot of backstory and thought behind it.
15:27 And I'm thinking about Lord of the Rings, right?
15:29 Because if you read Tolkien, he won't say, oh, and they passed a hill.
15:33 He'll say, well, this hill, you know, once upon a time, there was a kingdom on the hill.
15:37 And before that, there was this other kingdom on the hill.
15:40 And before that, the elves were on the hill.
15:41 And before that, this happened.
15:42 And the hill, you know, he's thinking about not the world in terms of the static thing,
15:47 but all these layers of history that happened.
15:49 Mythology, really.
15:51 I tried to kind of, like, put that feeling into everything.
15:54 Everything had ancient roots in my world.
15:57 Ancient roots.
15:58 And you can find out about it via conversation, but you also can find ancient tablets that you can get translated by bards.
16:07 You can read more about it.
16:09 You can also skip this part of the game if you're not a lore guy, if you just like tactical RPG and story.
16:14 That's cool.
16:15 That part's optional.
16:17 But it's a pretty original world.
16:18 The characters are pretty original.
16:20 The story's totally new.
16:21 So that was the idea with the first bullet there.
16:25 Nice.
16:26 Turn-based combat was another goal of mine.
16:29 I like turn-based combat.
16:30 I feel like in the U.S., not many games are made with turn-based combat.
16:35 Definitely not a lot of big games.
16:38 Would you say it's more of, like, a Japanese style?
16:40 I would definitely say Japan has us on this one, right?
16:45 And I happen to like the turn-based stuff.
16:48 Maybe it's subjective.
16:49 I feel like it's a little more thoughtful.
16:51 But I like real-time sometimes, too.
16:54 So I think they're both valid game systems.
16:57 I just happen to like turn-based better.
16:59 And it's pretty unrepresented these days.
17:02 Although, if you go back to the 80s, real-time is pretty unrepresented.
17:05 Because real-time was just harder to do, I imagine.
17:08 Yeah.
17:09 Absolutely.
17:10 I think it started out as a requirement, right?
17:12 I mean, in the early games.
17:14 Yeah, pretty much.
17:15 You didn't have the same environment.
17:17 Okay.
17:17 Pretty much.
17:18 And the idea of the turn-based-ness of this game is that it'll run as fast as you need it to.
17:23 And if you go back and you play Ultima IV, which you should, it's great.
17:26 If you get good at that game, you can start inputting commands as fast as your fingers can type.
17:30 And the game will just go.
17:31 And that's the idea of my game.
17:33 Like, if you can think and you know what all the moves in the strategic combat are,
17:38 you can just play it and it'll be fast and it'll be fun because you're doing it so fast.
17:42 That's a fun feeling.
17:43 That's a good, it's kind of a natural high to be doing things fast.
17:47 I think StarCraft players can tell you, you know, it's a lot of fun to move your pieces around fast.
17:54 Or if you want to be more thoughtful, just slow down.
17:56 And the game runs as fast basically as you need it to.
18:01 And another thing that's fun about the combat is that A-Star algorithm that we mentioned earlier
18:06 controls how, of course, all the monsters pass and stuff.
18:11 What I wanted to do was have A-Star control their decisions, but I never got that done.
18:16 So you can use A-Star not only to pass spatially, but you can pass through decisions.
18:22 Like, they could say, what's my goal?
18:23 To kill the player.
18:24 Okay.
18:25 What different actions can I do?
18:27 And almost use those as spatial locations in A-Star.
18:31 But I didn't do that.
18:31 Oh, wow.
18:32 I see.
18:32 I hadn't really considered applying the algorithm that way.
18:34 But if you've got, like, a decision tree that has different outcomes, you can use it.
18:39 Yeah.
18:39 To sort of put that together.
18:40 Okay.
18:40 Interesting.
18:41 It's super cool.
18:42 It's called planning, I believe.
18:44 I had a friend who told me about it.
18:46 I didn't come up with it.
18:47 Yeah, that's cool.
18:48 And I get to implement that.
18:50 But that would be a future work for you guys at home.
18:54 Each character, of course, has unique abilities in this game.
18:58 So I wanted to avoid some of the common pitfalls of RPGs.
19:02 Like, you have to level up and stuff like that.
19:04 And you have to grind and all that stuff.
19:06 Yeah.
19:07 And then combat's impossible to balance, right?
19:10 Because now you got to level 10.
19:12 Well, the enemies are balanced for level 3.
19:14 Well, how did you know that?
19:15 Or maybe you're level 2 and the enemies are too hard.
19:17 Well, how fun?
19:18 That's not fun.
19:19 So basically, if you think of a game like Advance Wars.
19:22 Have you played Advance Wars?
19:25 I haven't played it.
19:26 No, sorry.
19:26 How about Fire Emblem?
19:28 No, I haven't played games for a little while.
19:31 I used to play tons, but I haven't played them for a while.
19:33 Oh, my God.
19:34 Oh, my God.
19:35 This guy works too hard.
19:36 Okay.
19:37 There's these great turn-based games, Fire Emblem and Advance Wars.
19:41 And they're all Game Boy Advance games, I think.
19:44 They're still making them now, some of them.
19:46 They're all perfectly balanced because there's no levels or XP.
19:50 And basically, they just lay out a scenario and you have to fight through it.
19:54 And they all work.
19:56 That's kind of the goal with the different characters and their different abilities with me.
19:59 So there's no XP, but I can balance encounters perfectly because, or as hard as I wanted to make them, at least.
20:08 Basically, I set down the characters and I set down all the monsters and I know their stats exactly and all their abilities.
20:14 And each of the characters have different ways to solve problems.
20:17 Like, you got your tank guy who can deal damage and receive damage.
20:23 And you have characters with really different AOEs.
20:26 And you have a character who can set traps.
20:28 Yeah, nice.
20:29 A character who has more, like, utility stuff.
20:31 So different abilities have to complement each other.
20:35 Sure.
20:35 And I like the way that you balanced it because that is one of the hardest parts of creating a game.
20:40 It's creating it in a way that is challenging but not frustrating.
20:44 And I think that's really, really, really cool.
20:46 I totally agree.
20:48 This portion of Talk Python Deme is brought to you by Hired.
21:02 Hired is the platform for top Python developer jobs.
21:05 Create your profile and instantly get access to 3,500 companies who will work to compete with you.
21:10 Take it from one of Hired's users who recently got a job and said, I had my first offer on Thursday after going live on Monday and I ended up getting eight offers in total.
21:18 I've worked with recruiters in the past, but they've always been pretty hit and miss.
21:21 I tried LinkedIn, but I found Hired to be the best.
21:24 I really like knowing the salary up front.
21:26 Privacy was also a huge seller for me.
21:29 Sounds awesome, doesn't it?
21:30 Well, wait until you hear about the sign-in bonus.
21:32 Everyone who accepts a job from Hired gets $1,000 sign-in bonus.
21:36 And as Talk Python listeners, it gets way sweeter.
21:38 Use the link Hired.com slash Talk Python to me and Hired will double the signing bonus to $2,000.
21:44 Opportunities knocking.
21:45 Visit Hired.com slash Talk Python to me and answer the door.
21:49 Let's talk about your Reddit post.
21:57 So you wrote a post on Reddit that was super popular.
22:01 You wrote it and the title was, How I Built an Entire Game and Tool Chain 100% in Python Using Pygame.
22:10 And it got 894, more than that, over 894 upvotes.
22:14 I know.
22:15 I was so excited.
22:16 People love their Python.
22:18 What can I say?
22:19 I love it too.
22:21 Well, you know what I think is interesting is, like, if you said, if you wrote a post that said,
22:25 how I created an entire game world in C++ or how I did it all in Objective-C and I put it on the iPad,
22:33 it's like, well, okay, yeah, that's what people do.
22:36 Yeah, that's very normal.
22:40 It's that people love Python and experiences like you're having are just pushing it just a little bit out of its comfort zone of building data-driven web apps and data science tooling and things like that.
22:51 And I think it really unleashes the creativity and, you know, the idea is like, oh, I could do that too in Python.
22:58 How cool.
22:59 You're absolutely right.
23:00 And you absolutely can do that.
23:02 Like, Python is, as long as you keep the scope of your game down, something simple like I did, it is totally very well-equipped to help you write your game.
23:11 And it feels like an act of expression rather than an act of hooking boilerplate, you know, layers of code together.
23:19 Yeah.
23:20 You're actually, you feel like you're writing a game again.
23:23 You write less so that the joy is more apparent, maybe?
23:26 Yeah, you write less and you write the stuff that has the logic bits that are game bits.
23:32 Basically.
23:32 And it's quite a good experience.
23:35 I recommend picking up Pygame.
23:37 And even if you want to make Pong, you know, just make something.
23:40 It can be fun.
23:40 Okay.
23:41 Interesting.
23:41 So we talked about why you got interested in Python and why you thought it was really cool.
23:46 But what made you say, okay, I can actually use Python to write this game before you had the experience of doing it?
23:53 Well, I didn't know.
23:54 I didn't know.
23:55 So I wrote, first I wrote that little program.
23:58 I can't even remember what I did.
23:59 I need to automate some process.
24:01 And I wrote it in Python.
24:02 I was like, oh, that's really impressive.
24:03 I wrote it in so few lines of code.
24:05 Next, I said, well, you know, I love 16 color graphics.
24:09 You know, real 80s style stuff.
24:11 Most people, it's like they're trying to be retro, but they kind of push it past what retro actually would have done, which is fine.
24:17 But I actually wanted true, like, 16 color stuff.
24:21 So I wrote a paint program in Python.
24:23 And this paint program could only paint 16 colors.
24:27 And it would also allow you to animate your sprites and stuff like that.
24:31 And after I wrote this paint program, it was an experiment.
24:33 I didn't know I was going to write the whole game.
24:35 It's like, you know, I'll start.
24:36 I'll write a paint program.
24:37 And after I wrote the paint program, I was like, you know what?
24:41 I'm going to write a map editor.
24:43 And I think I'm going to probably write a whole game.
24:45 So kind of a long way of answering your question.
24:49 Yeah, I know.
24:49 It's like you just said, well, maybe it's possible.
24:52 Let's see.
24:52 And let's get started.
24:53 Yeah.
24:54 Yeah.
24:54 That's what it was.
24:55 So the first thing that you said, well, if I'm going to create this world that we described
24:58 in the beginning, and it's going to be this retro world with 16-bit and this kind of music
25:05 and so on, you said, all right, the first thing I'm going to need to be able to do is
25:09 basically issue commands to the game engine or the tool chain and so on.
25:15 So you built basically a command line interface or almost like a REPL, like a console for your
25:24 set of tools and your game, right?
25:26 Yes.
25:27 And I would recommend doing so for anyone, any hobbyist.
25:30 Basically, even before the paint program, you know, I knew if I was going to write any tools,
25:35 I would need to be able to issue commands for it.
25:38 And there's UI toolkits out there and you can use whatever you want.
25:43 But I wanted real fast iteration.
25:45 And there's really nothing as fast as typing.
25:48 I mean, mousing around, picking stuff off menus, not really that fast and not really that flexible.
25:54 And every time you want to add something to your menu, you have to deal with all that UI work.
26:00 Whereas the old school style typing, you can add a new command to your program pretty easily.
26:05 I wrote this little console in Pygame that all that you do was type into the console and you
26:11 could hit enter or, you know, delete, you know, whatever you want in terms of that.
26:15 And that was it.
26:16 It didn't do anything in and of itself.
26:18 But every other tool I made and the game itself, if you play it, will use it.
26:23 So if you play the game, on the very bottom of the game screen, you see things printing out like,
26:27 oh, you move north or, oh, you talk to this guy and it'll print out.
26:30 That's all the console.
26:31 It's working.
26:32 It asks you, do you want to save?
26:34 Yes or no?
26:35 You know?
26:35 Yeah.
26:36 Oh, that's cool.
26:36 It's still doing its job.
26:37 It's a hard worker.
26:38 Oh, that's, yeah.
26:40 That's really cool that you get to, you reuse it even into the gameplay.
26:43 That's great.
26:44 So you have this paint program.
26:45 Yeah, you have the paint program.
26:46 And because it's really 16-bit, there's like 16 choices for colors.
26:51 So you click on the color you want and then you've got kind of a square.
26:54 And it's almost like building icons, I felt like.
26:58 It kind of felt like an icon editor because the size and resolution of things.
27:03 You also had a map editor.
27:05 And I thought the map editor was pretty cool.
27:06 That was also in Pi Game, right?
27:08 Yeah, I have that open right here.
27:10 So the paint program was 16 colors.
27:13 So more like 4-bit, even before 16.
27:15 Yeah, right.
27:17 Of course, yeah.
27:18 16-bit.
27:18 16-color 4-bit, yeah.
27:20 I think the graphics are about the year 1984 with this game.
27:23 So quite a bit before Super NES and those things.
27:27 Pretty retro.
27:27 The map editor was next.
27:30 And of course, now that I had the ability to paint tiles, basically, laying out the tiles gives you a map.
27:38 And at the bottom of my map editor was our friend the console.
27:41 And at the side, I made a palette of different tiles you could choose from.
27:46 Of course, I ended up writing, painting quite a lot of tiles for the game.
27:51 It ended up being kind of my hobby.
27:53 I don't know exactly how many, but I'm going to open the folder of game assets.
27:58 And I'll tell you how many things I made with this paint program.
28:01 Sure.
28:01 Okay, 826 items were made with this paint program.
28:06 Like little wolves and brick walls and stone walls and water.
28:10 And by the way, this is kind of a visual thing that we're doing over audio, which is tough.
28:15 But in the Reddit post as well as in the show notes, you can link to the screenshots for all these tools that Joseph built and so on.
28:23 So you'll be able to pull them up.
28:24 Yeah, please go ahead and check out that Reddit post.
28:27 It has a screenshot of this map editor.
28:30 Although it's a pretty basic map editor.
28:32 It's definitely something you can consider writing yourself.
28:35 Even if it's just for educational purposes, it's fun to write a map editor, right?
28:40 Yeah, for sure.
28:40 And to save load, I used Pickle.
28:43 So it's just, I mean, Pickle, you know, obviously it's not 100% secure.
28:47 If someone gives you a Pickle file and you open it, it might blow your computer up.
28:51 But, you know, don't do that.
28:52 And you're okay.
28:53 Yeah.
28:54 I didn't write any saving and loading code at all for this program.
28:58 I just used Pickle.
28:59 I was just like, whatever.
29:00 Yeah, just basically take the memory structure of the Python objects and just stash them binary to disk and then pull them back up, right?
29:08 That's more or less the idea.
29:09 Yeah, it's perfectly fast for a game like this, right?
29:12 It's perfectly fine.
29:14 And if you write a lot of games, you know saving and loading is a thing.
29:18 I mean, you have to deal with it.
29:19 And I just pickled a bunch of Python dictionaries.
29:22 And the first thing in the dictionary was the version, right?
29:24 Okay, this is version 1.0 of my save.
29:27 And the reason versioning is important is because, say, I passed the game and I did patch the game.
29:32 You want to up version everyone's save files.
29:35 You don't want to have people have to start over because you decided to drop a new version.
29:41 And even for me, when I'm debbing it, I mean, there's probably like seven or eight versions of the saves.
29:45 I don't want to have to remake all my saves.
29:49 So it's important that your save loader be able to filter up old versions of saves, even from the very beginning.
29:54 So I can take a, you know, three-year-old version of Epicos and just load up the characters from it and play the game.
30:01 And that's just all using Python dictionaries.
30:03 First thing in the dictionary is a version.
30:05 And then everything else is, you know, what characters you talk to, what items you had, where you are in the world.
30:10 Yeah, okay.
30:11 And the map editor uses the same tech as the game, so pickling and unpickling.
30:15 And I think I did some light compression because the map's got a little too big for pickle to handle.
30:19 So I compressed before I pickled.
30:22 But it's all in the realm of Python.
30:24 No C stuff is going on here at all.
30:28 And the map editor, basically, it lets you choose what category of object you want.
30:33 So I grouped things, like you can work on natural objects or things in doors or things in caves or monsters or whatever you want to work.
30:42 And you just paint them out with the mouse.
30:44 This tool does use the mouse.
30:45 I feel like for painting, the mouse is a great tool.
30:48 And it lets you zoom in and out with the wheel and all that stuff.
30:52 Yeah, it makes a lot of sense.
30:52 So this world is pretty immense and you can walk around from place to place.
30:57 Did you, like, sketch this out on paper?
31:01 Like, how did you go to designing, like, the larger world and then connecting it to what you actually do in the tools, like in the editor?
31:08 I did sketch the world out on paper.
31:10 But for the tools, first I sort of, like, I still wasn't totally convinced.
31:14 Like, oh, can I build this whole game?
31:16 So I just made a little house in the map editor, right?
31:19 A little house with some windows.
31:21 So I have a little fireplace and some candles.
31:24 And if you play the game, this is where the game starts.
31:27 So the first scene you'll see is this house.
31:29 But interestingly, that's the first map I made.
31:33 And I just made a little house for fun.
31:38 And after I made that, I was pretty convinced I could make a big world.
31:42 You know, I made some other medium-sized things first.
31:45 I didn't go for the overworld.
31:46 I made some towns, which are, like, you know, bigger than the house, but not really huge.
31:53 And then I decided to make the game world.
31:56 And as you said, I sketched it out on paper.
31:58 I planned the whole game out.
32:00 So if you can imagine, I wrote a plot.
32:02 So I knew where everything had to be roughly.
32:07 This is impossible in a game with multiple people programming it or designing it because, you know, different people come up with different things, which is fine.
32:15 But if you're doing a one-man show like I did, you can plan stuff out and you can stick to your plan if you force yourself hard enough.
32:22 And then it's all planned out.
32:23 So you can kind of almost sketch it on a paper and stick with that sketch.
32:28 And I think I still have the paper around here, but I'm not going to look for it.
32:31 Yeah, sure.
32:31 That's really cool.
32:32 You know, for the whole time.
32:33 Nice.
32:33 So we talked a little bit about some of the things in the game in terms of the algorithms and what it took to build, like how you save and load, the A-star algorithm for Path and AI.
32:45 But can we maybe talk about in general, like, what's it like to write a game for Pygame?
32:51 I've looked at Pygame a little bit.
32:52 I haven't really written too many games.
32:54 The last time I wrote something, it was 3D and then OpenGL.
32:57 And it was more of a simulation than a game for something I was actually working on at a job.
33:03 Oh, wow.
33:04 Yeah.
33:05 So I remember what it's like to write those types of things in, say, C++ and OpenGL or DirectX.
33:12 You know, you've got kind of like an animation loop.
33:14 You run your AI step.
33:15 You run a rendering step.
33:18 You do very, you know, process input.
33:20 Like, what does it look like to write in Pygame?
33:22 Like, how does that compare?
33:24 It's very simple, actually.
33:26 It's good or bad, depending on how you use it.
33:29 So Pygame is simple.
33:31 It doesn't give you much.
33:33 So scope your project to playing to Pygame's strength, and you'll be very happy.
33:38 If you scope your project to trying to do things Pygame can't do, don't use Pygame.
33:43 You'll be less happy.
33:45 Basically, it gives you, yeah, you have to, you know, you have to use, you know, I wanted to use Pygame because it was pure Python.
33:52 What the code looks like is you're pretty much normal game loop controls everything.
33:57 So in most 3D games or other games I've worked at, you know, at some point in the program, there's a loop, and the loop does something on the, something like, take input from, you know, first part of the loop.
34:09 Take input from the keyboard or from the mouse or controller.
34:12 Second part of the loop.
34:14 Draw the screen.
34:15 Third part of the loop.
34:17 Run all the AI for all the characters.
34:20 And then you're done, and then it loops again, and it draws the next frame of the game.
34:24 And this is more or less how a lot of games are written.
34:28 Of course, you could say, oh, what about networking and all these other features?
34:32 Yeah, sure.
34:33 I mean, that could be in the loop or probably not.
34:36 It's probably interrupt-driven or some other messaging system.
34:39 But for me, it was basically a very simple game loop.
34:43 Take input.
34:44 Draw the screen.
34:46 Run the AI.
34:47 That's it.
34:48 And drawing the screen, of course, I'm not sure if any of those bits you want me to elaborate on,
34:53 but that's generally what the game loop should look like for Pygame, I would say.
34:57 Yeah, I think that's, I mean, we don't want to go too deep in code on audio, but at the same time,
35:03 I want to give people a sense for what does it look like?
35:06 What pieces do you put in there, and what pieces does the framework itself, what does Pygame itself support, you know?
35:13 So, yeah, that's really cool.
35:15 You know, you talked about making a plan.
35:18 It lets you draw sprites, and that's it.
35:20 That's all it does.
35:21 Sprite goes here, sprite goes there.
35:23 Awesome.
35:23 Yeah, so one thing that I thought was interesting that you talked about.
35:27 Yeah, that's all it does, literally.
35:28 Yeah, one thing you talked about I thought was interesting and really a powerful message was how long it took you
35:35 and sort of your process for getting the game done, right?
35:39 I mean, this is a lot of stuff.
35:40 You're building a lot of apps.
35:41 You're building a console system.
35:42 You're building a paint program, a map editor, file format, AI.
35:46 I mean, there's a lot of things to do just to have the game, and then you've got to, like, build websites and market it.
35:52 So why don't you tell us about how long it took and kind of, like, how you stayed on track?
35:57 It took, I think, about two years to make the game.
36:00 I was also working a full-time job during this.
36:04 Yeah, that's a lot of work.
36:05 No excuses.
36:06 I'm working.
36:06 I can't do it.
36:07 You can do it.
36:07 I don't know.
36:07 You just can't do it.
36:08 Yeah, I mean, if you come home, like, on any project, if...
36:11 Well, I'm working, but it's work.
36:12 Yeah, absolutely.
36:13 On a project like that, if you say, look, I'm going to take and just dedicate an hour a day.
36:18 Maybe not every single day will that work, but if your plan is, I'm just going to do a little bit every day, you know, you can do it, I think,
36:26 is maybe one of the messages that you were carrying there.
36:29 Yeah, yeah, absolutely.
36:30 You can totally do it.
36:31 Do what I did.
36:31 Say, I'm going to program my Python for 15 minutes today.
36:35 Just 15 minutes.
36:36 Then you can probably do that.
36:38 And then even if you're scared or you're having creative block, just do that.
36:42 And then next day you have to say, well, now I have to do 20 minutes.
36:46 And eventually you can see where this is going.
36:49 Pretty soon you're doing it for an hour a week.
36:52 You can just do it for an hour for a couple weeks and then two hours.
36:55 Once you're at two hours, you're done.
36:56 Just do it two hours a day.
36:58 And if you're in that habit of doing two hours a day, you'll want to do it more because you'll be in such a good habit
37:04 that over the weekends you'll do six or seven hours, right?
37:07 If you have whatever D&D with your friends, you go over to your friend's house and play D&D.
37:11 Don't just lock yourself in your room and only program Python.
37:15 But you'll want to program a lot if you're in a good habit because it'll just be normal for you.
37:21 It won't be weird.
37:21 You have to get over it not being normal.
37:23 Yeah, you do have to make a habit out of it.
37:25 I think that's important.
37:27 Whether it's a game or a website you're trying to launch or an app or anything, right?
37:31 But if you're going to create something that is long-term like this, you definitely have to make it a habit.
37:35 And I also think seeing success encourages you to keep going because you're excited.
37:40 You're like, look what I did last week.
37:42 I'm going to totally do this.
37:43 Think how far it'll be next week, right?
37:45 And you just keep going.
37:45 Yeah, absolutely.
37:46 If you don't see any fun stuff coming out of it, it can feel really burdensome.
37:51 So start with something small.
37:53 Start with your paint program.
37:54 Don't start with the whole game.
37:55 And then at least you can say, well, I made a paint program.
37:58 Even if that's all you do and that's as far as you get before giving up, at least you have that.
38:03 Yeah, that's really cool.
38:05 You also talked a little bit about running into bottlenecks and helping yourself get over those.
38:10 What are some of the bottlenecks that you hit trying to go through this project?
38:14 Well, none of it really had to do with Python, luckily.
38:17 So there's that.
38:18 And the Python code never got complicated.
38:21 Never got boilerplate-y.
38:23 It was always small and trim.
38:25 The main bottleneck for Epicos specifically was I never wrote a tool for the cinematics.
38:32 So for the non-interactive conversations.
38:36 So if you've ever played Final Fantasy, one of the early ones, like four or five, people talk to each other.
38:43 And it's totally scripted.
38:44 And it's fun to watch.
38:46 I wanted a real bit of that experience in my game.
38:49 And I thought, oh, there's only going to be a few of these conversations in the game.
38:53 And then there ended up being like, you know, hundreds.
38:56 And basically, like, probably, like, if you imagine the game took two years, like, a fourth of that is probably writing these cinematic scripts.
39:08 And they just got more and more and more complicated because I would always try to do better, right?
39:12 I would say, well, I did that before.
39:14 I have to do better.
39:15 This script has to have an earthquake in it.
39:16 Or it has to have a new font show up magically.
39:19 You never saw this font before.
39:21 And it's going to look really magical.
39:22 Or this, you know, this one has to start playing sounds.
39:26 And then I have scripts that are playing sound.
39:28 I'm like, well, now I have to add sounds to all my previous ones.
39:31 Or they sound dumb.
39:32 You know, they feel dumb because I'm like, where is the sound?
39:34 So I basically ended up writing this scripting language that sits on top of Python to do all my cinematics.
39:40 And it worked.
39:42 Like, it chipped.
39:44 But it was just not ideal.
39:45 And what I should have done was write something like almost a movie editor.
39:50 Or you can imagine, like, a tool where you would scrub through a scene.
39:55 Right.
39:55 It was almost a multi-track thing.
39:57 Kind of like animating it mild.
39:59 Yeah.
39:59 Yeah, absolutely.
40:00 Exactly.
40:01 Like track editing.
40:02 And I should have done that.
40:04 And I didn't.
40:05 So I think the lesson is make sure you have the tools before you dive in too deeply.
40:10 Right.
40:11 I did that mostly.
40:12 And I didn't do it enough.
40:13 Yeah.
40:14 So one thing that I think is interesting, shifting gears a little bit, you built your game and you want to get it to people.
40:20 Yeah.
40:21 One thing I think is interesting that is more difficult than it should be in Python.
40:26 And there's interesting projects working on it.
40:28 You use some that we're talking about and we will.
40:30 There's as well as some others.
40:33 Is getting your Python code in your application sent to somebody who can run it like an application rather than like, here's a bunch of scripts.
40:44 Make sure you have these packages installed.
40:45 Yeah.
40:46 Right.
40:46 So how do you go about shipping and packaging up the game?
40:49 So I tried everything.
40:51 And the answer was this was a pretty technically challenging thing.
40:55 It wasn't just your typical happy Python coding.
40:58 It was just like, oh, how am I going to do this?
41:00 I tried kind of everything.
41:01 And what I ended up using was I couldn't get Py2EXU to work, which is people's normal route.
41:09 You know, let me open up my little script.
41:11 Yeah.
41:11 One of the other projects that comes to mind that I think is interesting is the Beware project.
41:17 And they're working on ways to package up apps that work good for OS X, for Linux, for Windows, things like that.
41:26 And so, but this is a new project coming along.
41:29 I think we'll get there.
41:30 But it's definitely a place where it's more challenging to, you know, create a thing that you deliver with no assumption of Python or anything.
41:38 It's hard.
41:39 I had to use something called PyInstaller.
41:41 So, go, if you grab that, I'm telling you right here, it will work with PyGame.
41:46 I believe Python 2.exe either doesn't work with PyGame or you have to spend, you know, days and days to get it to work and it's not really worth your time.
41:57 So, I would say PyInstaller.
41:59 Now, if you read that Reddit post, people will make better suggestions than PyInstaller, which is some of the beauty of Reddit, right?
42:06 So, there's even better options out there if you read the post.
42:09 But if you don't read the post, PyInstaller will work for you.
42:13 And running that, basically, I was able to make my Python scripts into an .exe and then it was simply a matter of packing up the art assets with those.
42:24 So, I have a distribution script, which I recommend everyone make.
42:29 And basically, when you double-click on this script, it takes all your code and it builds in .exe and it builds in even an installer.
42:36 So, basically, then you can give that to your friends rather than giving them a bunch of source code.
42:42 That's right.
42:42 I mean, on one hand, you've got to package up the Python game so it runs.
42:46 But then you also have to package up that plus the assets into like an installer.
42:50 So, an MSI on Windows, a PKG on OS X or something like this, right?
42:56 So, it's not just one layer.
42:58 It's several layers.
42:59 Yeah, that takes time.
42:59 Yeah, definitely.
43:00 That's work.
43:01 It's frustrating work as well, I think, because you have the thing you're trying to give to people finished.
43:07 But you can't give it to them until you go through like this other step of like polishing this delivery.
43:12 Exactly that.
43:13 And it's different on every platform, of course.
43:16 The good news on Linux is you assume people can unzip, you know, a TAR file.
43:21 So, I just give a TAR file.
43:22 Because I don't think Linux guys want an installer.
43:25 Say, I want it in this directory here.
43:27 It's like, okay, here you go.
43:28 But I think Windows is a little bit more like different barrier of entry.
43:33 So, you want to double click on it and it installs somewhere.
43:37 You can say where that is or not, you know.
43:40 Yeah, exactly.
43:40 And I recommend not doing any tricks like with the registry like most programs do you install.
43:46 Like in my program, if you delete it, it's gone.
43:49 It's off your computer.
43:50 If you move it, it'll still work.
43:52 It doesn't need to know where it was installed to.
43:53 Very old school.
43:54 Yeah, yeah.
43:55 Definitely no registry and none of that stuff in Windows, which just makes your life hard.
43:59 So, it runs on Windows and it runs on Linux according to your website.
44:05 But if I recall correctly, I played your game on OS X.
44:08 So, is it also supported on OS X?
44:10 Or did I get the Linux version somehow?
44:14 Some people have figured out to run it on OS X.
44:18 And they've done it via like a Linux emulator or Windows emulator.
44:23 They've tried, you know, different things.
44:26 And this is not officially supported.
44:28 So, one guy sent in a crash report.
44:31 I was like, oh, I'll look at it.
44:32 But I don't have a Mac.
44:33 I don't know if I can do this for that system.
44:37 So, you might be able to get it to run on OS.
44:41 But there's no guarantees.
44:42 Okay.
44:42 Interesting.
44:43 So, I would say Linux and Windows are the most main platforms.
44:47 And if sales pick up and it makes sense for me to do a Mac, I'll go out and buy a Mac.
44:52 I can't run it in VirtualBox.
44:54 I don't think it's supported in VirtualBox.
44:57 Right.
44:58 So, I can't just emulate a Mac.
45:00 You know, it's possible that I ran it on Windows 10 in parallels on my Mac.
45:05 It's possible.
45:06 It will work on Windows 10.
45:07 Yeah, yeah.
45:07 Okay.
45:07 Interesting.
45:08 It will definitely work, guys.
45:10 Cool.
45:11 Cool.
45:11 And the Linux port took only a day.
45:14 So, if you think about like Python, one of its strengths is it pretty much will run anywhere.
45:20 So, you know, Linux port, I had some capitalizations in some of my file names I had to fix.
45:25 And, of course, you have to totally redo the distribution and, you know, the thing that makes an EXE.
45:31 That doesn't work at all the same way on Linux.
45:34 But besides that stuff, the game should run really easy.
45:37 And one thing to keep in mind with Pygame is most 3D applications don't work through a VirtualBox.
45:43 But Pygame does.
45:44 So, you can even be having your Windows system open and open a VirtualBox with Pygame in it.
45:51 And it will work fine.
45:52 So, you can dev for Linux and Windows at the same time.
45:55 It would be quite nice.
45:56 Oh, that is nice.
45:57 Yeah, you don't have to dual boot or anything crazy like that.
45:59 Yep.
46:13 We all want to ship our software faster, respond to user requests quicker, and build an edge on the competition.
46:19 But the faster you go, the more likely a bug or issue will slip by and cause your users grief.
46:24 I have the same trade-offs with my Talk Python websites and infrastructure.
46:27 That's why I use SnapCI.
46:29 Every time I check in at GitHub, SnapCI springs into action.
46:33 A clean copy of code is pulled from GitHub.
46:35 A Python 3 virtual environment is created.
46:37 All the packages and dependencies are installed.
46:39 The unit tests are run.
46:40 Finally, I'm notified in Slack and a menu bar on my Mac about the outcome.
46:44 That way, I know it's safe to ship a shiny new version of my web app.
46:48 Ship your software faster with a 30-day free trial at snap.ci slash talkpython.
47:01 Could you build a 3D game, a Pi game?
47:04 Nope.
47:04 It's all about 2D sprites.
47:06 3D, it's all about 2D.
47:08 If you want, you're going to have to go into the Pi GL stuff, which is fine.
47:11 Don't forget, you know, devs at home here, like, 99% of games' problems arise because they're in 3D.
47:20 Everything is just much more complicated than 3D.
47:23 And I love 3D.
47:24 I do it at work.
47:25 But for a side project, be careful about 3D.
47:29 Unless you want something that looks like Minecraft, very simple.
47:32 You know, be very careful about 3D.
47:34 Pi game avoids a lot of these problems by being 2D.
47:37 Yeah, that's great.
47:38 Yeah, I've done a few major things in 3D.
47:40 And there's so, so many little catch-ups and hang-ups you can get caught on.
47:46 It's like, why don't I see this?
47:48 Well, I drew it, you know, clockwise versus counterclockwise.
47:51 Now, it's invisible because from the wrong direction.
47:54 It's just like, ah, gosh.
47:56 It's really complicated and it's really a career.
48:00 You know, doing 3D is really a total career and there's specialists who deal with that.
48:04 It's really, it's really a lot of work.
48:07 It's amazing.
48:07 But my game, no.
48:08 Yeah, to make it look, yeah, to make it look professional, it's really, really hard.
48:13 Okay, that's interesting.
48:14 Yeah.
48:15 You know, one thing I wanted to give a shout-out about, have you seen the movie, Indie Game?
48:20 Indie Game, the movie?
48:21 No, I haven't.
48:22 People should check out Indie Game, the movie.
48:24 It's really interesting.
48:25 It's not quite the same story as your story because you had a full-time job and you're doing this sort of as a side project, which is, I think, a really cool thing to do.
48:35 These guys, they spent like two years working on these indie retro games and it kind of takes you through their journey.
48:41 But it's also more similar than it is different to this.
48:44 So if you're looking for a good documentary about this kind of stuff, check out Indie Game, the movie.
48:48 That one's a good one.
48:49 That sounds pretty rad.
48:50 Yeah.
48:50 Most indie game guys still have studios with, you know, five, six people in them.
48:55 What's weird about my project is I just did it myself because my game is just so retro and so unique.
49:02 Because I tried for years to convince artists to help me and programmers to help me.
49:08 And they're like, what?
49:08 You want to write a game that's like actually using 80s era technology?
49:13 You must be nuts.
49:14 Nobody would help me write this game.
49:17 So eventually I said, look, I have to write it myself.
49:19 And at that time, Python came along.
49:21 I was like, this is how I'm writing this game.
49:24 Python is the way to go.
49:25 That's really cool they lined up that way.
49:27 Great.
49:28 Yeah, I think we should probably leave it there.
49:29 We're kind of getting long on time.
49:31 But before I let you go, let me ask you two questions.
49:33 I always ask them, I guess.
49:34 You must have come across some interesting PyPI packages that you could use to make your game work.
49:41 I mean, PyGame among them probably, right?
49:43 What one's your favorite that you feel like you want to tell people about they maybe don't know about?
49:48 I want to plug PyGame and Pickle.
49:50 Those are super cool.
49:51 PyGame and Pickle.
49:53 Check them out if you're new to Python.
49:54 They're really cool.
49:55 Okay.
49:56 Excellent.
49:57 Excellent.
49:58 And when you write Python code, what editor did you use?
50:00 I used Notepad.
50:02 Wow.
50:03 Okay.
50:03 Awesome.
50:04 You were being serious about the retro.
50:08 Notepad++ to be exact.
50:09 Yeah, yeah.
50:09 Because you got to have some.
50:10 I'm serious.
50:11 I'm a serious guy.
50:12 Notepad++, by the way.
50:13 Not just Notepad.
50:14 Yeah, yeah, yeah.
50:15 Cool.
50:15 It's a little bit better.
50:16 Yeah, I know.
50:17 Of course.
50:17 It has to understand, you know, tabs don't.
50:19 Tabs mean spaces.
50:19 Things like that, right?
50:20 Okay.
50:22 Yeah, yeah, yeah.
50:23 Awesome.
50:23 All right.
50:24 Well, Joseph, this was a really fun story.
50:26 And thank you for giving us a look inside.
50:28 What you built and how you built it.
50:30 How about a final call to action?
50:32 If people are excited about your project, how do they check it out?
50:35 What do they do?
50:35 So you can go to epicosrpg.com.
50:38 And there's links to how you can buy it at itch.io.
50:42 If you want to buy it too there, you can follow me on Twitter.
50:46 I'm JJC Coder.
50:47 I'm JJC Coder.
50:47 And I would love to hear from everyone whether or not you played the game.
50:51 Even if you didn't like the game.
50:52 I'd like to hear what you didn't like about the game.
50:55 And if you liked the game, I would like to hear what you liked about the game.
50:58 Game is moddable.
50:59 So I want to see people's...
51:01 It's a little bit moddable.
51:02 So I want to see people's alternative tile sets.
51:04 I saw quite a few good ones already.
51:06 So I want you guys to make tiles, make the game look like you want it to make.
51:11 Maybe you don't want it to be 16 colors.
51:12 Maybe you want 128 colors.
51:15 Go for it.
51:16 You know, I want to see what you make.
51:17 Awesome.
51:17 All right.
51:19 Well, thank you so much for being on the show.
51:20 It was a fun conversation.
51:21 Thanks.
51:22 This was really great.
51:23 Yeah, you bet.
51:23 Good luck.
51:23 Thanks.
51:24 Bye-bye.
51:24 This has been another episode of Talk Python to Me.
51:28 Hired wants to help you find your next big thing.
51:31 Visit Hired.com slash Talk Python to Me to get five or more offers with salary and equity
51:36 presented right up front and a special listener signing bonus of $2,000.
51:40 SnapCI is modern, continuous integration and delivery.
51:44 Build, test, and deploy your code directly from GitHub.
51:47 All in your browser with debugging, Docker, and parallels included.
51:50 Try them for free at snap.ci slash Talk Python.
51:53 Are you or a colleague trying to learn Python?
51:56 Have you tried books and videos that just left you bored by covering topics point by point?
52:01 Well, check out my online course, Python Jumpstart by Building 10 Apps at
52:05 talkpython.fm/course to experience a more engaging way to learn Python.
52:09 And if you're looking for something a little more advanced, try my Write Pythonic Code course at talkpython.fm/pythonic.
52:16 You can find the link from this episode at talkpython.fm/episodes slash show slash 78.
52:23 Be sure to subscribe to the show.
52:25 Open your favorite podcatcher and search for Python.
52:28 We should be right at the top.
52:29 You can also find the iTunes feed at /itunes, Google Play feed at /play,
52:34 and direct RSS feed at /rss on talkpython.fm.
52:39 Our theme music is Developers, Developers, Developers by Corey Smith, who goes by Smix.
52:43 Corey just recently started selling his tracks on iTunes, so I recommend you check it out at
52:48 talkpython.fm/music.
52:50 You can browse his tracks he has for sale on iTunes and listen to the full length version of the theme song.
52:55 This is your host, Michael Kennedy.
52:57 Thanks so much for listening.
52:59 I really appreciate it.
53:00 Smix, let's get out of here.
53:02 Stay tuned.
53:24 you you Thank you.