Charles Max_Wood:
Hey everybody and welcome back to another episode of the Ruby Rogues Podcast. This week on our panel, we have Valentino Stoll.
Valentino_Stoll:
And now...
Charles Max_Wood:
We also have Luke Stutters.
Luke_Stutters:
Hello.
Charles Max_Wood:
I'm Charles Max Wood from Top End Devs, and we have a special guest this week. It's Amir Rajan. Amir, welcome back.
Amir_Rajan:
Happy to be back. It's been a while. I think it's been at least a few years now.
Charles Max_Wood:
Yeah, you're gonna make me go look it up, aren't you?
Amir_Rajan:
I'm going to make you go look it up.
Charles Max_Wood:
Yeah, it's been a while, but yeah, what's new with you?
Amir_Rajan:
Let's see, we'll survive the apocalypse. So that's always a good thing. And I'm still doing game development. So that part hasn't changed. And of course, with Dragon Ruby, we just celebrated our three-year anniversary of the product. So
Charles Max_Wood:
Nice.
Amir_Rajan:
that would be the new thing. That would be the new thing. Everything else is same old, same old, which is a good thing.
Charles Max_Wood:
Yeah, so the episode that I'm finding is episode 333, which was back in 2017, about this time of year, 2017. Back when it was still Ruby Motion. I think you had just taken it over and, yeah,
Amir_Rajan:
Yeah, and we still
Charles Max_Wood:
we're
Amir_Rajan:
have
Charles Max_Wood:
doing all the things.
Amir_Rajan:
a RubyMotion. Well, so Dragon Ruby, the naming things, naming things,
Charles Max_Wood:
Right?
Amir_Rajan:
it's the worst. So the company and the LLP is called Dragon Ruby, and then
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
RubyMotion is a Dragon Ruby product, and GameToolkit is a Dragon Ruby product. It's just really annoying to say Dragon Ruby, RubyMotion.
Charles Max_Wood:
Ah, okay.
Amir_Rajan:
But yeah, so it's Dragon Ruby, GameToolkit, Dragon Ruby, Ruby Motion. And hopefully some rebranding on Ruby Motion will happen. It'll potentially be called App Toolkit. But it's
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
one of those things that's like, all right, now I gotta buy a domain and all those. So
Charles Max_Wood:
Right?
Amir_Rajan:
it's just Ruby Motion, but Ruby Motion's still around. And then we added this additional product being Game Toolkit.
Charles Max_Wood:
Okay, that makes sense. My son wants to be a game developer, so this may be a way that we do it. I don't know.
Amir_Rajan:
Oh, yeah. It's actually worked pretty well with workshops and young kids because
Charles Max_Wood:
Yeah.
Amir_Rajan:
everything's hot-loaded. So
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
instead of going through the fundamentals of, OK, here's how you type an if statement and all the boring stuff, you just bring up one of the sample apps I usually recommend, Flappy Dragon, and just bring it up and start tweaking the values and just see how things change. And I think younger audiences, even older ones, I mean, it's just great to have that feature. engage with that because they'll say, oh, what if I change the gravity from 9.2 to 15? What happens? And
Charles Max_Wood:
Right.
Amir_Rajan:
seeing that update live, it's just a really great feeling. So I think you'll
Charles Max_Wood:
Yep.
Amir_Rajan:
have a good time with it.
Charles Max_Wood:
Yeah, he's been taking programming classes at the high school and they have a game development
Amir_Rajan:
You're welcome.
Charles Max_Wood:
class and so I think they're teaching him C sharp and unity.
Amir_Rajan:
Yep, that's usually the standard. Don't do it. It's horrible.
Charles Max_Wood:
Ha ha ha!
Amir_Rajan:
It's so horrible. But we can go into the motivation and all that stuff in a little bit, but it's
Charles Max_Wood:
Yeah.
Amir_Rajan:
rough.
Valentino_Stoll:
say I downloaded that Flappy Dragon game and it ran no problem. It was really cool.
Amir_Rajan:
Yeah,
Valentino_Stoll:
So
Amir_Rajan:
and.
Valentino_Stoll:
kudos. I mean it's not often you can just download something and
Amir_Rajan:
and double
Valentino_Stoll:
you know
Amir_Rajan:
click
Valentino_Stoll:
that's
Amir_Rajan:
it and
Valentino_Stoll:
very
Amir_Rajan:
it worked.
Valentino_Stoll:
complicated. It just works.
Amir_Rajan:
Yes. Yeah. And, and that was like one of the biggest motivators that I had was that you unzip the file and just double click the runtime and, and it starts up. It's zero dependency. It was just, it feels so good to
Charles Max_Wood:
Oh
Amir_Rajan:
be able
Charles Max_Wood:
nice.
Amir_Rajan:
to do that. And you're just like, wait, that's it. It's like, yeah, you just double. And it runs on, uh, we have it completely cross platform and we made sure to make, to make sure that it ran on Raspberry Pis.
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
and stuff, you get your kid a tiny Raspberry Pi computer, and it can run Dragon Ruby. It's really important to us, so I'm really happy that that just kind of worked for you.
Charles Max_Wood:
Nice. So it sounds like it's kind of easy to get started, but let's just
Amir_Rajan:
Mm-hmm.
Charles Max_Wood:
back up for the people who haven't heard from you in four years,
Amir_Rajan:
Right.
Charles Max_Wood:
or are new to the Ruby community and just haven't run across RemuOcean or Dragon Ruby. You wanna kind of give the, I guess, the elevator pitch or the five second, hey, what is this thing that we're talking about?
Amir_Rajan:
Right. And I think that would really help. So Dragon Ruby is a custom Ruby runtime that is completely cross-platform and zero dependency. So the idea there is that you are able to get up and running using the Ruby programming language and build, you can build applications, I guess. They're a little bit more boring than video games, but it lets you build cross-platform video games and deploy cross-platform. iOS, Android, web, PC, Mac, Linux, console, all the things. So it's a super, super lean, refined runtime or runtime and machinery that allows you to use Ruby for video game development. And that's what Dragon Ruby is.
Charles Max_Wood:
Awesome. So you build apps like you would think of just an app, right, with input fields and whatever it does. And you can also build
Amir_Rajan:
Right?
Charles Max_Wood:
video games.
Amir_Rajan:
Totally, yes.
Charles Max_Wood:
And you said it's cross-platform so I can run it on my phone, I can run it on my computer, wherever I want.
Amir_Rajan:
Yep, phone, iOS and Android, PC, Mac, Linux. You can do a web build, so WASM is a target export, and
Charles Max_Wood:
Oh
Amir_Rajan:
the
Charles Max_Wood:
nice.
Amir_Rajan:
consoles, because I have a video game on the Nintendo Switch that uses Dragon Ruby. So you can deploy the consoles, and it all just works. And
Charles Max_Wood:
Nice,
Amir_Rajan:
that
Charles Max_Wood:
and
Amir_Rajan:
was
Charles Max_Wood:
you have
Amir_Rajan:
the
Charles Max_Wood:
a-
Amir_Rajan:
most important part, yeah. Just to make it work
Charles Max_Wood:
Yeah,
Amir_Rajan:
everywhere.
Charles Max_Wood:
I guess the other the other pieces is, you know, when we were talking, yeah, my son's learning C sharp and unity at school. So I mean, that gives you like physics engines and, you know, some 3D capabilities and, you know, stuff like that. So you can do all that in Dragon Ruby as well.
Amir_Rajan:
That's a great question. So with regards to what Dragon Ruby's specialization is, 2D games. So
Charles Max_Wood:
Okay.
Amir_Rajan:
if you want the lean, mean, it just works kind of experience for 2D games, there's no competition with regards to between Dragon Ruby and Unity. Now, the interesting thing is that when the Oculus Quest came out, we started thinking about, well, how do we transition into this 3D world? like the existing desktop 3D market is kind of oversaturated. I mean, there's a lot of
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
competition there. And personally, Unreal, they eat their own dog food. It's a phenomenal engine. It's just great. So like the 3D space, I think, the contenders, specifically with Unreal, it didn't make a lot of sense for us to go into that space. But the interesting thing was that when I got my Oculus Quest I bet do any of you have a VR device or Oculus?
Charles Max_Wood:
Yeah, we have two oculuses here.
Amir_Rajan:
It's magical. It was so magical.
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
And I was like, oh my gosh, you know what? You know what would be awesome? If we could build VR games using Ruby and have it hot loaded to the device and just kind of work. Not a AAA title. I'm just an indie dev, like one guy, but I wanna build
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
Space Invaders in VR and have the enemies come towards me. Is that something I can do? So our 3D offering ends up being skip desktop 3D completely, and we just went straight to VR. So it's still in its early phases, and we've got quite a few sample apps out there. But it brings the, I guess, the barrier to entry down so low where if you know how to build a 2D game with Dragon Ruby, you add a Z to your sprite properties or your primitive properties,
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
and suddenly you have a 2D object that can be turned and manipulated in 3D space. And it's just phenomenal from that perspective. But yeah, the short answer, 2D games, no competition. VR, if you want to jump into VR without any of that intimidation, Dragon Ruby is the way to do it.
Valentino_Stoll:
So Amir, how does that work?
Amir_Rajan:
How does
Charles Max_Wood:
Ha
Amir_Rajan:
that
Charles Max_Wood:
ha ha
Amir_Rajan:
work?
Charles Max_Wood:
ha!
Amir_Rajan:
Holy
Valentino_Stoll:
Like
Amir_Rajan:
crap.
Valentino_Stoll:
how do you get Ruby to run, let's say specifically
Amir_Rajan:
Yes.
Valentino_Stoll:
for VR, right? Like if we're working on the Oculus platform, like how does that process work? Is it easy? I can't imagine it is.
Amir_Rajan:
This is like the rest of the owl, right? So it's complicated. But I think it's really interesting to talk about because it kind of reframes some of the terms that we use that developers use with regards to comparing languages and runtimes. And so roll up your sleeves, let's get into some of the technical stuff, I guess. All right, so when I initially talked about Dragon Ruby, I said that it's a runtime. is that when people talk about a language and we say, oh, I use Ruby, we usually mean Ruby language spec 3.0 plus on the C Ruby runtime. That's kind
Charles Max_Wood:
Right.
Amir_Rajan:
of what we're abbreviating and saying. And so when someone says, oh, I do game development with Unity, you're using the C sharp 6. The six-out-of-all language is phenomenal. Unity butchers it. I'm gonna rag on Unity throughout this podcast. I'm sorry.
Charles Max_Wood:
That's fine.
Amir_Rajan:
It's my favorite thing to pick on. But they're on the C-sharp language spec and the Unity runtime. So, and Unity was originally based off of the Mono runtime, and then it
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
diverged and they created their own extensions and stuff. So that's kind of the caveat when I talk about and then the runtime. So then now the question is like, how do you make a runtime and how does it work cross platform? Well, that was the thing is that when you have the language specification, the CRuby runtime, I think it recently got WASM capabilities, but it wasn't something that supported WASM. And I imagine it'd be really difficult to get it to work on iOS and Android. I couldn't get it working on console, primarily because
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
there's an assumption that the executing process are PC, Mac, and Linux, right? The
Charles Max_Wood:
Right.
Amir_Rajan:
Nintendo Switch OS is not, does not have the same OS infrastructure that these other operating systems have. So you have the dependency as that runtime, even though it's Ruby. So what we ended up doing was like, okay, well, how can we make this cross platform? And our entry point was actually mRuby. runtime, embedded Ruby runtime, which is phenomenal because it doesn't have any dependencies on the operating system. So with that kind of isolated Ruby implementation that can just be invoked from any C library or C executable, we started with that and then expanded around that to say, okay, now can we make a truly cross platform access and truly cross platform rendering engine and truly cross platform IO and what does that look like. So that was that's where a lot of our work was. So we we took mruby as an initial starting point and then fleshed out that outer shell to make it usable across all these different environments. Now the good thing there is that when it comes to cross platform multimedia there's a library out there that already does this stuff and it's called lib sdl simple direct media layer. our hard dependency, instead of being standard libraries across each specific OS, we take a hard dependency on libSDL and use that facade to execute, render, and do all the things across all these different environments. So during the porting of the Nintendo Switch stuff, I hacked something together. And then Ryan C. Gordon, he's Ickles on Twitter. He's like the SDL guy. on a Steam game on Linux, chances are he's probably helped port that specific game over. So he's pretty much a juggernaut in that industry. And during the switchboard, I was like, hey, this is my crazy idea. What do you think? He's never used Ruby. He's like, let's do it. So I brought him on as a partner. And he's a core maintainer and core contributor to STL. And now he's part of Dragon Ruby itself. kind of what, and then I said, hey, figure this out. And he figured out the details of it. And then I handled the interrupt between mruby and libSDL. So he handled the layer from the OS to SDL, make sure all that stuff works. And I handled the layer from SDL up into Ruby. And that's kind
Charles Max_Wood:
My brain's
Amir_Rajan:
of how,
Charles Max_Wood:
still going, I can write Switch games.
Amir_Rajan:
yeah,
Charles Max_Wood:
But that's cool.
Amir_Rajan:
you can write, you can write Nintendo. The beauty of it is that you write it on your machine, one single code base, it will run everywhere. And
Charles Max_Wood:
So.
Amir_Rajan:
that was really important to me because at this point I have like six or seven games out there. And the upkeep is so difficult. Like every year a new iOS device comes out or a new Android device comes out or a new console. And just dealing with all the vendor fragmentation, it was just, games because I was so busy with the upkeep. And that's when I said, OK, I need to take a pause for literally three years to try to solve this problem so I can continue doing what I love and building video games. So of course, yeah, it's like, hey, I'm just going to write the game engine. Forget it. Let's just do that. And so as the saying goes, we do these things not because they were easy, but because we thought they were easy. we are. So
Charles Max_Wood:
That's just,
Amir_Rajan:
that's how you
Charles Max_Wood:
it's
Amir_Rajan:
build
Charles Max_Wood:
so
Amir_Rajan:
a runtime.
Charles Max_Wood:
cool.
Amir_Rajan:
That's how
Charles Max_Wood:
So.
Amir_Rajan:
you build a runtime.
Charles Max_Wood:
So video game platforms, just a sec, because you mentioned like the desktop platforms and the mobile platforms, but can
Amir_Rajan:
Mm-hmm.
Charles Max_Wood:
you run it on like Xbox or PlayStation or any of those as well?
Amir_Rajan:
Totally. Yep. Absolutely. You need to have, you need to sign your NDAs and you have to have like the dev kids and stuff. But once we verify it, you're ready to rock. And the reason it's so easy for me to say, yeah, it's going to work. It goes back to that explanation. So our runtime is embedded. And the layer
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
around the runtime that handles all the multimedia is libSTL. And
Charles Max_Wood:
Alright.
Amir_Rajan:
like Valve uses this. The entire Steam client is built in libSTL. So this thing, that library is just, that we're taking. So we basically said, okay, if we were gonna do Ruby all over again, what dependency do we take on at the OS level? And
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
our air quotes correct answer is libSDL. And that's what solves, that's what solved our cross platform challenges.
Valentino_Stoll:
That's so cool. I have so many follow ups, but I'm going to try and focus them.
Charles Max_Wood:
I don't,
Valentino_Stoll:
What's yours?
Charles Max_Wood:
if y'all don't see me for a month.
Valentino_Stoll:
I mean, yeah, I totally want to start making a ton of games now, right?
Charles Max_Wood:
Uh-huh.
Amir_Rajan:
So
Valentino_Stoll:
But
Amir_Rajan:
you can actually go to fiddle.dragrangruby.org. And it's got a code editor and a window that's 16 by 9, but it's 160 pixels by 90 pixels. And
Charles Max_Wood:
Oh wow.
Amir_Rajan:
you can just type, hello world. There's a hello world that loads up. And you save, and it runs. It loads in the environment. And it's wild. It's completely crazy that I just that just kind of works. And one of the tutorials is there's like a jump tutorial. And the last one is like you fly through space. And it does kind of like a parallax view of flying through space. And it just all works in the browser. And it's.
Valentino_Stoll:
That's awesome. That's the WASM stuff that's
Amir_Rajan:
Yeah,
Valentino_Stoll:
running
Amir_Rajan:
that's
Valentino_Stoll:
up.
Amir_Rajan:
the wisdom stuff. Yep.
Valentino_Stoll:
Oh, that's so cool. So what's your experience like working with mRuby? I'll admit my experience is pretty limited to like just making some LEDs blink on the Raspberry Pi.
Charles Max_Wood:
Mm-hmm.
Valentino_Stoll:
But...
Amir_Rajan:
Yeah, so the caveat, and this goes back to the idea of like, so what is the runtime, right? So the mruby runtime, it doesn't have all the things that the Ruby runtime would have. Example would be, I guess, UUIDs are like for base64 encoding, you can't run Rails on it because it doesn't have all the out of process communications that you have there. But the core standard lib pretty freaking fleshed out. And as far as the compiler options, you can, there's enough configuration in there where you can turn the dial between super lightweight and I'm running on a machine that can, you know, have a bigger like memory stack and object heap and all that good stuff. So we took the mruby, initial mruby configuration and was like, well, on anything leaner than maybe a raspberry pi. So we can turn a lot of these dials up. So, and we just kind of did that. We just turned up a lot of those dials. And then for things that, we did additional optimizations to like the threading model and just the whole like event loop. So Dragon Ruby actually has an event loop similar to Node.js. So instead of having threads that you initialize, you do an async call. re-entrancy of the message pump, you pull to see if that specific action is completed. So that's like a difference, right? So what's so different about mruby versus dragonruby? Well, dragonruby has a message pump, an event loop that mruby doesn't have, right? So those are kind of some of the interesting nuances there, but we turned all those dials up tuning specifically with rendering and libSTL. And we're to a point where, like, I'll post a YouTube link to y'all, but I do a demo where I render 20,000 sprites on the screen. And it's like they fly up into the right, like, a starry night thing. And then I do the same thing in Unity. See, there I go picking on Unity again.
Charles Max_Wood:
Ha
Amir_Rajan:
And
Charles Max_Wood:
ha ha ha ha!
Amir_Rajan:
Unity gets like eight frames a second. frames a second. So
Charles Max_Wood:
Oh wow.
Amir_Rajan:
it's fast. And you'll always hear, well, Ruby is slow. And just to beat that dead horse, a language can't be slow.
Charles Max_Wood:
Yeah.
Amir_Rajan:
A runtime can be slow. But a language is a language spec. So...
Luke_Stutters:
Have you tried JavaScript?
Amir_Rajan:
Have I tried JavaScript? So there is a C Sharp implementation that I think is called sharp.js from back in the day. And that's a common thing I bring up. It's like, well, OK, so if I write this program in sharp.js, write it in.NET Core, and then write it in Mono, aren't they all C Sharp? Aren't they all going to be fast? It's like, well, no, this other thing is going to be slower. And that's like the aha moment.
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
your runtime is bloated, it's got a lot of, it's heavyweight. And it had to be because
Luke_Stutters:
to jump
Amir_Rajan:
of,
Luke_Stutters:
on this unity thing
Amir_Rajan:
yeah.
Luke_Stutters:
because my brother is right now building a game in unity and it's not going very well so I've been trying to get
Amir_Rajan:
chart.
Luke_Stutters:
him to move absolutely true and I need some like tangible reasons why he needs to move because he's not really worried about performance this really simple educational game you know but he's using the C sharp stuff as we say so
Amir_Rajan:
Right.
Luke_Stutters:
how can I sell this to him as an existing Unity developer.
Amir_Rajan:
So I think the biggest, so historically over this three year period I've gotten a lot of these questions and initially I started with objective stuff like oh it's faster, da da da da da, and give all these different reasons on the performance and everything and it never works. So I think, so over time what I found out was that the best thing I can say is if you're at a studio, getting overworked and underpaid to work on someone else's dreams, learn Unity.
Charles Max_Wood:
Ooh, sign me up.
Amir_Rajan:
That's the best thing to do. It's 100% true, right? If that's what you want, if you want to be in the industry, work 80 hours a week, get underpaid, and then get laid off after the release of the game, use Unity. And if you want a fighting chance yourself as a one to two person team and actually have a chance of it releasing and making even a small amount of sustainable income, you have to use DragonRuby because that is my business model. That's how I survive, right? It's these micro teams and I can't afford to have to deal with cross-platform issues. I don't have the capital. I can't throw money and bodies at a problem. to use an engine that understands that and doesn't put me in that position. And Dragon Ruby is that engine. So if you're a brother, I think, you said I was your brother or friend, your brother,
Luke_Stutters:
This is my
Amir_Rajan:
if
Luke_Stutters:
brother,
Amir_Rajan:
he wants to,
Luke_Stutters:
yeah, this is my real
Amir_Rajan:
yeah,
Luke_Stutters:
life
Amir_Rajan:
if he
Luke_Stutters:
brother.
Amir_Rajan:
wants this educational
Luke_Stutters:
He's doing it for
Amir_Rajan:
game,
Luke_Stutters:
real.
Amir_Rajan:
yeah, if he wants this educational game to actually release and run from day one on everything that he wants to run it on, I mean, Dragon Ruby is your best bet. And then we have got our community discord and I'm there and I'm there to help, right? I'm there to help anyone that's in the same shoes that I'm in. And I think
Valentino_Stoll:
I would.
Amir_Rajan:
that drives the point home much more than the objective aspects of it.
Valentino_Stoll:
I love that. I'm totally on board with this thinking too.
Amir_Rajan:
Mm-hmm.
Valentino_Stoll:
I'd love to dive in more on the why not Unity because
Amir_Rajan:
Mm hmm.
Valentino_Stoll:
historically I think a lot of people are attracted to Unity primarily for their physics engine, right? That just comes built in.
Charles Max_Wood:
Mm-hmm.
Valentino_Stoll:
What is Dragon Ruby doing that can also like give that, you know, feature set that a lot of people do?
Amir_Rajan:
So here's the plot twist. And you can try it yourself. Nobody uses the built-in physics engine. Nobody that has a real game out there uses the built-in physics engine. They just don't do it. So Celeste, hand-rolled physics engine. their physics engine. They did not use the built-in stuff. And what happens is you use the built-in stuff, and then you find that it doesn't work. You have clipping issues. There's inconsistent. There's non-deterministic simulation as far as taking an input and then making the collision actually work. That doesn't work. And then the complexity is there. So you've got, I want Mario to jump up and down. And that's it. So I've got a vector for the power in the x and y direction, gravity, and drag. I don't have to set restitution, elasticity, apply all these different meshes and materials to it to do something. So there's this aspect of this massive complexity just trying to understand how to use the physics engine in itself. I think for 3D games, it makes total sense. You need to have those facilities in place, and it's probably worth the effort. For 2D games, it's just not worth it. So the built-in physics engine, you go on Twitch, find some random streamer that's doing Unity, and has gotten pretty far in the game, and ask them if they use the built-in physics engine. The answer is always going to be no. It just doesn't work. So this is a little checkbox.
Charles Max_Wood:
Ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha
Amir_Rajan:
So what does Dragon Ruby do? It's a silly little checkbox. It's like, check this box. We have a physics engine. It does not work. But it's there. And so what Dragon Ruby does is that we don't have a built-in physics engine, but we have, I think, like, at this point, 15, 20 sample apps that show different facets of physics. So
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
what does ball physics look like? How do you do simulate, you know, bouncing ball? What does axis-align bounding box collision look like? What does physics for a platformer look like? What does physics look like for a vertical platformer? All those, like, what does rope physics look like? We've got a game that simulates, like, ninja rope. It's called Klepto Frog. And you're a frog that steals mugs every night. And then every morning, the people come back to the office and have to take the mugs back out of your little aquarium place. So and use your tongue as a swinging mechanism. So we've got all these, like, in Flappy Dragon, as you know, you've got your flying physics and gravity
Charles Max_Wood:
Right.
Amir_Rajan:
physics there. What we're trying to, what I'm trying to frame it as is that you've got this game that you want to try to build and here's a starting point for the concepts that you need to understand to build that kind of, that specific type of physics experience. And then from there it's tweaking, it's expanding, and making it feel good for what you're trying to build up. And it's worked really well for us. If you want, there's something called Chipmunk 2D, which is a C-based physics library. And so you'll need an ND license or above for using C extensions, but any physics engine out there that is written in, that's written in C and C++ can be integrated into Dragon Ruby as a foreign function interface. So if you wanna bring in Chipmunk 2D or, I think Box2D is Java, but Chipmunk 2D is my go-to if you really wanna do some crazy physics stuff. But you bring it in, expose those bindings to Ruby, got your physics engine at that point. But
Valentino_Stoll:
That's awesome.
Amir_Rajan:
that's, that's how we do it. The built-in
Valentino_Stoll:
Yeah,
Amir_Rajan:
physics
Valentino_Stoll:
I mean
Amir_Rajan:
engine
Valentino_Stoll:
I.
Amir_Rajan:
does
Charles Max_Wood:
Thanks for watching!
Amir_Rajan:
not work people. I promise.
Valentino_Stoll:
How is your performance using FFI? It is have you notice any likes? You know resource bogged down, especially
Amir_Rajan:
Thanks for watching!
Valentino_Stoll:
on like Raspberry Pi as an example.
Amir_Rajan:
So that's the interesting thing about mruby and cruby is that all the core Ruby classes are form function interfaces, right? They're all written in C. So FFI is just, is basically saying, I'm gonna implement this Ruby object in C as opposed to plain old Ruby. So the FFI is really fast because it's intrinsic to the entire language itself. And then as far as generating those bindings, we've got a CLI tool that will generate your Ruby bindings for you and expose it as a Ruby class that you can interact with. So that's one of the niceties that we added to, instead of having to manually construct your Ruby objects using the mruby API. We provide a means where you point it to a header file and it's able to generate your Ruby bindings. findings for you.
Valentino_Stoll:
So I'm curious what you're doing in Dragon Ruby, maybe specifically, that makes FFI kind of safe. Because I thought there was like kind of some thread safety issues in using FFI. Is there something
Amir_Rajan:
Right.
Valentino_Stoll:
you're doing special? I know you talked briefly about how you're handling those async calls. Is there anything beyond that maybe?
Amir_Rajan:
Yeah. I think that's the linchpin as far as the async
Charles Max_Wood:
Thanks for watching!
Amir_Rajan:
calls, was that our eventing model, you basically had a time slice. So your simulation and your game loop runs at 60 hertz. we fire up the VM, invoke the tick, the entry point, which is tick, and you get to do whatever you want within that time slice. You can go over, but at that point, you're basically stalling your game. So once that time slice is done, it basically, air quotes, shuts down, and then the rest of the world, the rest of the C world does its thing. we know our synchronization point. It's at the beginning of, it's at the re-entrancy of that VM loop. And that simplified a lot of things. So there's never a situation where a C struct is interacting with a Ruby object effectively at the same time. And it just kind of worked. Yeah.
Valentino_Stoll:
I never thought of it that way because you're right, game development is frame by frame. You have a very
Amir_Rajan:
It
Valentino_Stoll:
specific
Amir_Rajan:
is. Yep.
Valentino_Stoll:
allotment and time-based entry points.
Amir_Rajan:
Yep.
Valentino_Stoll:
It simplifies the whole system at that point.
Amir_Rajan:
It does. And
Valentino_Stoll:
So how much have you augmented mruby to handle that? Is it a lot of upkeep to deal with that kind of process?
Amir_Rajan:
Yeah, so the upkeep is there. So to briefly talk about some of the niceties of the event loop is that we can aggressively GC because of that same reason. Because at the beginning of that entrance, we can do a major GC event. before we delegate to your game. So that synchronization point is really awesome. We can do a lot of cool things there. Aside from that, yeah, the upkeep. So the Ruby code base is about, I think, 12 to 13 lines of code for the runtime. And after this three year period, the customizations we've added on top of it that. And yeah. So we've doubled, air quotes doubled the size of the runtime. Generally, we try not to touch the Ruby runtime itself, so we can always rebase and merge and kind of pull in their changes. We made some small tweaks to how hashes work to make them a little bit more performant. Pushing those changes upstream is a little bit trickier because not entirely applicable to the greater mRuby world. But for the context of what we're working on, it made sense to say we're always going to interact with the symbol, and we're always going to interact with this facet of the hash data structure or the array data structure. So we'll do a custom patch in our runtime to do that. But yeah, the maintenance is there. And thankfully, it's not a conflict of maintenance So it's just we've added stuff to it. And it didn't start off at 20,000 lines. It was like, oh, this is just a really small extension. This is going to be great. We can totally do this. And here we are three years later with double the code base. But yeah, it's one of those things where you just, it builds up over time and it's valuable. Just makes, they're good changes.
Charles Max_Wood:
I don't know how much longer I can wait. How do I start? Like, how do I start building my game? Right. You know, or if I sit down with my son, right. So, um, when he says he wants to be a video game developer, what he means is he wants to be Toby Fox, just being absolutely clear. I don't know if you all know who he is. Uh, he wrote, he made Undertale. Which, and,
Amir_Rajan:
Mm-hmm.
Charles Max_Wood:
and it's a 2d game, right? You move your character
Amir_Rajan:
Yeah.
Charles Max_Wood:
around. Right. So I'm,
Amir_Rajan:
Yep.
Charles Max_Wood:
I'm sitting here thinking this is the stuff he wants to make, right? He wants to. make
Amir_Rajan:
Yep.
Charles Max_Wood:
a funny, quirky story like Undertale or what's the sequel to it? Deltarune. He wants to make
Amir_Rajan:
Okay.
Charles Max_Wood:
those games, right? And I'm sitting here thinking this would be fun, right? It'd also be fun to like, you know, I can see myself building a game where you have to go like navigate office politics as a developer or something. Yeah, I don't know, you know, do an Undertale that's a developer game or something. But
Amir_Rajan:
Right.
Charles Max_Wood:
you know, all these things kind of come together. But how do I start? what do I
Amir_Rajan:
I
Charles Max_Wood:
do
Amir_Rajan:
got it for
Charles Max_Wood:
and what
Amir_Rajan:
you.
Charles Max_Wood:
do I have to have in place in order to make it work?
Amir_Rajan:
You got it. So you download the zip,
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
you double click to unzip it, and
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
then you double click dragging Ruby EXE and you're up and running. Okay?
Charles Max_Wood:
Okay, what
Amir_Rajan:
So
Charles Max_Wood:
if I'm on a Mac?
Amir_Rajan:
you unzip,
Charles Max_Wood:
Ha
Amir_Rajan:
you go
Charles Max_Wood:
ha.
Amir_Rajan:
into the folder, double click, and you're
Charles Max_Wood:
Uh
Amir_Rajan:
up and
Charles Max_Wood:
huh.
Amir_Rajan:
running. Guess
Charles Max_Wood:
Okay.
Amir_Rajan:
what Linux is unzip, then you have to go into the CLI and then do chmod plus x, and then you're up and running.
Charles Max_Wood:
Okay.
Amir_Rajan:
But that's really it. So after
Charles Max_Wood:
That's.
Amir_Rajan:
you're up and running, there's a sample app called under genre RPG underscore top down. And there are two sample apps that demonstrate how to do a top down RPG with map collision
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
movement around the map. And if you enter a specific area, So it kind of shows you air quotes eventing. But I posted a link to that. And if you go to top down starting point and look at the source code, I think you'll find it really approachable.
Charles Max_Wood:
So I guess, because I'm thinking like, you know, I have to put all my assets in place and I've got to do all this stuff in order to make the game work. But effectively what you're telling me is that you've already kind of given me the framework for, you know,
Amir_Rajan:
Yes.
Charles Max_Wood:
if I want to do a side scroll or a what top to bottom scroll, I don't know. I don't know the lingo,
Amir_Rajan:
Yep.
Charles Max_Wood:
but, you know, or a top down game, which is what we're talking about here with, you know, navigating the map, kind of like Zelda, right?
Amir_Rajan:
Exactly, yeah.
Charles Max_Wood:
And so, From there, I can start to modify the map.
Amir_Rajan:
Right.
Charles Max_Wood:
I can modify the interactions. I can figure out, you know, oh, they walked through a door. Now I got to do this.
Amir_Rajan:
Correct.
Charles Max_Wood:
And that's all in place. So it's kind of like, I want a web app. I'm going to do Rails new,
Amir_Rajan:
Right.
Charles Max_Wood:
except that, you know, it sounds like this actually gives me a little bit more because I come out with a functional framework that I don't even have to do the scaffold in order to see a page, right?
Amir_Rajan:
Right.
Charles Max_Wood:
interactions.
Amir_Rajan:
Exactly. That and there's precanned sprites in there. So we've got square circles, triangles, hexagons,
Charles Max_Wood:
Right.
Amir_Rajan:
and the deploy template, they're under the sprites directory. So roi gbiv. And if you want to render a square, it's just sprites forward slash square forward slash blue.png.
Charles Max_Wood:
Right.
Amir_Rajan:
And then you can replace the asset later. So
Charles Max_Wood:
Right.
Amir_Rajan:
those play
Charles Max_Wood:
Or I can
Amir_Rajan:
that.
Charles Max_Wood:
put my own assets in that are
Amir_Rajan:
Yep.
Charles Max_Wood:
thischaracter.png or whatever.
Amir_Rajan:
Exactly. And that's one aspect of building games and why Ruby is so wonderful for this world is that you don't know what you're building yet. I don't know the structure of this. I don't know the types.
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
I don't know what properties I'm going to have. I don't know if the HP exists on the armor or if the armor is a container for slots that have material that has HP mechanisms in there. type language, the language is asking you, tell me what this looks like right now. And I think for like maybe a checking application or banking software, that world is predefined. I could see like a transfer or transaction being something that you can predefine and have work. But in this world of like artistic medium and games, Ruby feels so good because you just, you can start with dictionaries and arrays and say, I don't know what my things look like. tuples and your dictionaries. And then you start, maybe say, well, maybe I can do an open struct for this property because it's kind of getting some form and function, and then evolve to a class later. And I think
Charles Max_Wood:
All right, so,
Amir_Rajan:
that's so
Charles Max_Wood:
oh, go
Amir_Rajan:
beautiful.
Charles Max_Wood:
ahead.
Amir_Rajan:
That's a beautiful aspect of it. So with those precanned sprites and these precanned starting points, let's you have that spark of inspiration and immediately start to experiment and see if there's something there without having the stuff up front. Yeah.
Charles Max_Wood:
So that's the other question, because you keep talking about, this is so nice in Ruby. This is so nice in Ruby. And I remember way back in the day when I was trying RubyMotion. And I might have this confused with something else, but I think it was RubyMotion. The API was basically, I'm writing Objective-C Ruby style. Right?
Amir_Rajan:
Right, exactly.
Charles Max_Wood:
You know, it was, I'm going to call this exact function that has a really freaking long name. You know? And it's going to do the iOS thing. Has that changed? I mean, it sounds like what you're telling me is that this is gonna look a whole lot like my Ruby and a whole lot less like Apple's Ruby.
Amir_Rajan:
Right, so that poly, so the, the mruby, the mruby layer provides us the polyfill to
Charles Max_Wood:
Right.
Amir_Rajan:
basically give us, because with RubyMotion, find all, we had to extend the framework and say, patch it, redirect
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
to, delegate to this, you know, objective C function. So, mruby provides us the polyfill that says, okay, if we don't have the native function to support this in our runtime, we can always fall back to the mruby function. So that transition is, that strategic, it was exactly for that reason. So we could position ourselves to slowly bring or like 1.8, I think M-Ruby's ISO standard is like 1.8. It's got ISO 1.8 standard lib. So as long as it's in there, you'll have access to it in M-Ruby. And then from there, we can slowly push down to the native level for whatever we feel needs that extra boost in performance. But yeah,
Charles Max_Wood:
So what
Amir_Rajan:
your
Charles Max_Wood:
you're.
Amir_Rajan:
Ruby is gonna look like Ruby.
Charles Max_Wood:
So if I need an interaction from the,
Amir_Rajan:
you
Charles Max_Wood:
and I guess if it's cross platform, you're not, yeah, you're not directly mapping over to Objective-C or something, but
Amir_Rajan:
Correct.
Charles Max_Wood:
I guess, yeah, my question is then if I need to interact with the OS, then you've got that poly-filled for desktop for, you know, whatever, right? And so
Amir_Rajan:
Yep. Yep. So instead of using file.write.
Charles Max_Wood:
I'm gonna, it's gonna be move, yeah, move underscore left instead
Amir_Rajan:
you
Charles Max_Wood:
of move, object to the left
Amir_Rajan:
Right.
Charles Max_Wood:
in, yeah.
Amir_Rajan:
With x, with y, with, yeah,
Charles Max_Wood:
Yeah,
Amir_Rajan:
exactly.
Charles Max_Wood:
uh-huh, yep, okay.
Amir_Rajan:
Yep. And so other facets of it is that, like, file.read and write, we have our own file read write APIs. We have XML parsing built in. So you don't install Nocoguri because you can't.
Charles Max_Wood:
All right.
Amir_Rajan:
Because of all the external dependencies and native C extensions. So we have XML. built in with the async model, same thing with JSON. So
Charles Max_Wood:
about databases.
Amir_Rajan:
all those thing, databases, no databases at this point. You can write a C extension if you want to, or bring in SQLite as your C extension
Charles Max_Wood:
Okay.
Amir_Rajan:
and expose that through FFI. But file IOs there. So you
Charles Max_Wood:
Okay.
Amir_Rajan:
say file.write, and then you can write your data file itself. And surprisingly, that's how a lot of game devs as far as like saving they just serialize it to JSON and then
Charles Max_Wood:
Yeah.
Amir_Rajan:
you know deserialize it and pull it out.
Charles Max_Wood:
As long as it's not too big, I would assume that'd be pretty fast.
Amir_Rajan:
Oh, yeah. Yeah. Yeah, I think a darkroom, I had like the ASCII map itself had 3,600. It was a XY 3,600 thing of grid. And it persists to just extremely fast and pulls it out. So you can have pretty big game state. If you're dealing with millions of records, then yeah, I'd probably say, OK, talk with me. Let's figure
Charles Max_Wood:
Yeah.
Amir_Rajan:
out what SQL solution we need to put in there. But yeah, we try to abstract all that so you don't have to worry about it.
Charles Max_Wood:
device.
Amir_Rajan:
Yes.
Valentino_Stoll:
So if I'm developing a game in Dragon Ruby, what is... Like if I wanted to like take advantage of the next platform version, right? Like what's that upgrade process look like? Is there a waiting period? Like how long until I can take advantage of that, right?
Amir_Rajan:
So the Indie and Pro license, which is Indie gives you C extensions and Pro gives you Oculus Quest, iOS, and Android. You just bump up the license tier and that's it. And you're done. So if you've got the mobile device and you've got your Apple Developer account or your Android device, you download the new binary. you will see the Android and iOS payloads there for you to do whatever you'd like with, and VR payloads.
Charles Max_Wood:
How does the licensing work? Is it per developer, per year, per game, per?
Amir_Rajan:
Per developer, no commissions, no royalties per developer. Install it on however many systems you have.
Charles Max_Wood:
and you pay once.
Amir_Rajan:
And the standard license one time, the NDN Pro are subscription-based because we have
Charles Max_Wood:
Okay,
Amir_Rajan:
to keep updated. We
Charles Max_Wood:
now
Amir_Rajan:
have
Charles Max_Wood:
that
Amir_Rajan:
to
Charles Max_Wood:
makes sense.
Amir_Rajan:
every iOS and Android release, you got to deal with it. And the thing is, is like from my perspective, there's two aspects to it. someone out financially. So like we've got in our bylaws or in our product page, we say if you can't afford the license, just email me and I'll set you up. Like it's just that simple. Now, if you're gainfully employed making, you know,
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
above six figures, you will pay for this thing. Right.
Charles Max_Wood:
Right.
Amir_Rajan:
It's like $7 a month for like an indie license. You're gonna pay for it. And our target price is less than a Netflix subscription. That's kind of how That's kind of how we frame it. And I've had people actually push back and say, well, can I pay when I make money? And I go, well, do you have hobbies? And they go, yeah, I do woodworking. How much have you spent on your,
Charles Max_Wood:
Hahaha,
Amir_Rajan:
just your handsaws?
Charles Max_Wood:
right?
Amir_Rajan:
And it's like, oh, I've got this like really cool, like $5,000, et cetera. It's like, you could buy a 60 year license with $5,000.
Valentino_Stoll:
I think of what some people spend on keyboards and toward Dragon Ruby.
Charles Max_Wood:
Yeah.
Amir_Rajan:
I
Valentino_Stoll:
Look at that.
Amir_Rajan:
have gone broke working on keyboards. My wallet is in pain because of it. And I've never made any money off of it, but I've never said, maybe if I sell a keyboard, will I put it in there? But yeah, I think it's a phenomenal hobby to really get into, and it's so cheap. It's a wonderful medium.
Valentino_Stoll:
I wanted to talk a little bit about all the sample apps and everything
Amir_Rajan:
Mm-hmm.
Valentino_Stoll:
and
Amir_Rajan:
Mm-hmm.
Valentino_Stoll:
maybe kind of like more of the tutorial side and like getting started with Dragon Ruby. Because way back when, when I was trying to get into game development, I came across this guy that had a site called Cartoon Smart. And basically he was an animator and he worked in Flash. And so for a while he had like just sold Flash games and you could like take all the sprites that he had make them into a different game that you wanted.
Amir_Rajan:
Right.
Valentino_Stoll:
And now he's made a kind of platform, unfortunately based on Unity, where you can basically like kind of download a test app and make some tweaks to it, similar to how you can with Dragon Ruby, but it's much more like handholding, like this is kind of like a course, here are the steps at each phase. Do you have anything like that planned or are there other people kind of offering that kind of thing you can point people to?
Amir_Rajan:
Yep, so we've got the sample apps, and we've got the documentation, which is docs.dragonruby.org. All that is available locally also, so all the documentation's inside of the zip file. And used in the documentation, we actually do, we've got like a series of recommendations of how to approach it. and it's really great because Ryan does it and he doesn't have Ruby experience. So he's over there like, how the hell do I do this? And he could code circles around anyone and see, but it's great watching him use Ruby. It makes me happy that even he is productive in the environment. And so we've got school.draggonruby.org, which is your kind of like walkthrough type of tutorial. that, yeah, I'm going to make sure that is actually the URL. That is not the URL. It's in the docs. Let me go to the docs real quick. Ah, dragonruby.school. See, I knew it. And so that's your official training video. And the approach we were taking as far as the company organization is that we're worried about the engine and making sure we're going to do that one thing well. And we leave everything else to collaborations externally. So we rely heavily on the community, the Discord server, and say, if you want xyz to exist, have the power to make that exist. So Lori Olson, who's a longtime Ruby
Charles Max_Wood:
I love
Amir_Rajan:
motion,
Charles Max_Wood:
Lori,
Amir_Rajan:
Dragon
Charles Max_Wood:
she's
Amir_Rajan:
Ruby,
Charles Max_Wood:
awesome.
Amir_Rajan:
and she was like, yeah, I want to do a training video. And this stuff, I'm like, done. So she handles the training video. She's in the docs. And that's taken care of. So Valentina, this idea of the asset store, if you want to create that asset pack that I will make sure, I want to support you to make sure it happens, right? Because that's things that I don't have to do. It's like, please,
Charles Max_Wood:
Yep.
Amir_Rajan:
please keep, let us do the things that we do well. And then that's one of the aspects of the community too, is that there's a lot of people that are really good with Ruby in the community, and there are a lot of newcomers. So it's beautiful to see the magic again in other people's eyes, because we've used Ruby for so long, we kind of have like lost that magic.
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
just jumping on and they're like, this language is so amazing. And you get, you get a, what's it called? You get to be that thing where you get the feeling because they're having the feeling or yeah, you get to feel the magic too, because you're like, he's feeling the magic, so that makes me feel good and it makes me reminiscent of that. So the, the community is probably one of the strongest, strongest things about, about Dragon Ruby is that people just help each other. Minus one is there. We've added another one called Keefoss, which means keep it fun and stupid. So build games, don't build boring line of business applications with Dragon Ruby. Just enjoy, experiment, have fun, help each other. So it's kind of our stopgap and how we approach a lot of that stuff.
Luke_Stutters:
You get to code vicariously might be the word.
Amir_Rajan:
Yes. It's so much fun. Like, you don't have to worry about, oh, do
Charles Max_Wood:
you
Amir_Rajan:
I need to create a 15-layer file structure and 50 classes to do this enterprise
Charles Max_Wood:
Ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha
Amir_Rajan:
TM thing? It's like one file, main.rb, put all your code in there, see
Charles Max_Wood:
Yeah.
Amir_Rajan:
if it feels good, and then evolve and expand from there. But it's a really intoxicating experience, and it feels good. It feels really good.
Valentino_Stoll:
I will say opening up that Flappy Dragon example, it was surprising how small it was and so easy to read. So huge kudos to you there.
Amir_Rajan:
Yeah, I don't have time.
Valentino_Stoll:
Ha!
Amir_Rajan:
I don't have the dev hours to build. I got to build quickly.
Valentino_Stoll:
So
Amir_Rajan:
I
Valentino_Stoll:
my
Amir_Rajan:
got to build
Valentino_Stoll:
one
Amir_Rajan:
lots of
Valentino_Stoll:
huge
Amir_Rajan:
games quickly.
Valentino_Stoll:
follow-up
Amir_Rajan:
Mm-hmm.
Valentino_Stoll:
here is like... It would be great to have like some kind of
Amir_Rajan:
you
Valentino_Stoll:
editor, right? Or like UI, like almost flash-esque of the, you know,
Amir_Rajan:
Mm-hmm.
Valentino_Stoll:
the old days. Are there any like plans for that? Or are you focusing specifically on the game engine? Are you hoping that kind of the community evolves this kind of overall
Amir_Rajan:
So
Valentino_Stoll:
environment?
Amir_Rajan:
here's the pro tip. You will outgrow any editor that's baked into a game engine. So this is that same Twitch thing. Go to Twitch and watch people use the scene editor in Unity. And then while they're coming, ask them, why didn't you put that one thing in the scene editor and why are you doing it programmatically now? Oh, because the scene editor doesn't allow for this dynamic emitter to exist, and it's too hard to get the node IRK. So I have to do that part programmatically. And so you outgrow whatever editor that ships with your game engine as the IDE. So what we do instead is we have a heads-up display. So if you bring up the Flappy Dragon game and press tilde, it brings down the Quake console. it brings down a Quake console and you can invoke Ruby right there inside
Valentino_Stoll:
Wow,
Amir_Rajan:
of that
Valentino_Stoll:
that
Amir_Rajan:
thing.
Valentino_Stoll:
is so cool.
Charles Max_Wood:
Ha ha!
Valentino_Stoll:
I
Amir_Rajan:
and
Valentino_Stoll:
have it open now. That's awesome.
Amir_Rajan:
And type 1 plus 2, and it'll say 3. It's the greatest thing. And so you have introspection into your entire game state from that console. And on top of that, you can invoke any function. So you're like, oh, I need to spawn an enemy over here. Well, you just type it in and spawn the enemy. And the thing is that the console itself is written in Dragon Ruby, and it's open source under MIT license. So you can extend your console to be
Charles Max_Wood:
Oh nice.
Amir_Rajan:
exactly what you want it to be. And the thing is that because it uses all the same concepts that are in the game engine, you're not mentally shifting. Like the Unity scene editor, you have to now go into the IDE extension world, but that's not the case for us. So you've got that entry point with the heads up display to quickly put functions in and do all that cool stuff. And then you've got the source code as a reference implementation. And then on top of that, we've got sample apps how to create stage editors. So you go into god mode, and it changes the idea to where you can put your collision maps and all that good stuff in there. And then that persists immediately to disk live, and you keep playing your game. So we try to position you to never, as your game gets more complex, we don't want you to go slower. Because when you go slower, then you And we want your engine or your game to grow with the IDE tools themselves. And historically, you always see some successful platformer do all those cool things, and then they add the stage editor after the fact. And it's like, why did you do that? Why is the stage editor coming at the end, as opposed to hand-in-hand with the creation of your game? reposition things.
Valentino_Stoll:
So I've got a quick question, and this
Amir_Rajan:
Yep.
Valentino_Stoll:
may be stupid, but are you able to modify the game as you're playing it on a regular device?
Amir_Rajan:
Yes. Yes, it hot loads
Valentino_Stoll:
If
Amir_Rajan:
to iOS.
Valentino_Stoll:
I allow, yeah, oh
Charles Max_Wood:
Haha
Valentino_Stoll:
my gosh, that's so cool. I
Amir_Rajan:
We
Valentino_Stoll:
just
Amir_Rajan:
heart
Valentino_Stoll:
say
Amir_Rajan:
load.
Valentino_Stoll:
that because there are so many apps, right? I've seen a whole new set of games come out recently where they're
Amir_Rajan:
Thank
Valentino_Stoll:
very
Amir_Rajan:
you.
Valentino_Stoll:
hacker-esque, they call them, right? That allow you to
Amir_Rajan:
Yep.
Valentino_Stoll:
kind of code in the game,
Amir_Rajan:
Yep.
Valentino_Stoll:
walk the character walks up to a computer, opens up a console and they can have like, they could try and do stuff like a regular terminal, right?
Amir_Rajan:
Yeah,
Valentino_Stoll:
That's so cool. Like I can
Amir_Rajan:
we
Valentino_Stoll:
totally
Amir_Rajan:
hard load
Valentino_Stoll:
imagine,
Amir_Rajan:
to devices.
Valentino_Stoll:
totally imagine a game where you can make the game by playing the game.
Amir_Rajan:
Yeah, so one of the community members actually made an editor using the editor that they were building. So they got it to a point where it was functional, where they could type and move arrow keys around. And then they loaded the source code for the editor and started editing it with the... Yeah, it was... Yes, we've had shaking of heads, but it was great.
Charles Max_Wood:
hahahaha
Valentino_Stoll:
That is so funny.
Charles Max_Wood:
But you can disable the console, right? When you release
Amir_Rajan:
Nope.
Charles Max_Wood:
the game.
Amir_Rajan:
Well, you can if you want. But as an indie, your lifeblood is people being able to mod your game. That is
Charles Max_Wood:
Oh,
Amir_Rajan:
your lifeblood.
Charles Max_Wood:
fair.
Luke_Stutters:
Ah.
Charles Max_Wood:
Yep. That
Amir_Rajan:
And
Charles Max_Wood:
is
Amir_Rajan:
Quake
Charles Max_Wood:
so true.
Amir_Rajan:
3, Quake 3 doesn't has a console. Borderlands has a console. Into the Breach on the Nintendo Switch exposes a console. So this heads up display, this console, Let them hack. Let them explore. Let them
Charles Max_Wood:
I, yeah, I guess I don't
Amir_Rajan:
build
Charles Max_Wood:
care
Amir_Rajan:
out your
Charles Max_Wood:
if
Amir_Rajan:
game.
Charles Max_Wood:
they
Amir_Rajan:
Yeah.
Charles Max_Wood:
quote unquote cheat.
Amir_Rajan:
Yeah,
Charles Max_Wood:
Yeah. Who cares?
Amir_Rajan:
it's their game. Who cares? Yep. And it's a beautiful thing. And that's how you build that community around your game and give it that longevity. Because people will, yeah, they'll just create mods. And you just say, here, do it. Explore, grow, make fun things,
Charles Max_Wood:
That's awesome.
Amir_Rajan:
make stupid things. Yeah. It's a different mindset because I originally thought that too. It's like, oh, you can disable it if you want, but I'd recommend don't do it. Just put the thing out there and let other people enjoy that thing that you built. It's a good feeling.
Valentino_Stoll:
So I noticed on the Dragon Ruby site you have this Discord server, which I actually, you know, when I went in to try these games out, joined, and it's very active, it's great. Where do you suggest people go for tutorials like diving in outside of the Discord? Is there other sites they should track to follow updates
Luke_Stutters:
I was just
Valentino_Stoll:
and stuff?
Luke_Stutters:
about to ask the same question. My version of this is, is there a book? Because I'm old, I'm going gray, I like to have a map in the afternoons. Is there a book? I remember there was a Rebemotion book, which I bought,
Amir_Rajan:
Yeah.
Luke_Stutters:
the Play Also book. Is there a Dragon Ruby book for us old timers?
Amir_Rajan:
There is there isn't a book because you haven't written it yet.
Luke_Stutters:
DAAA
Charles Max_Wood:
Ha ha ha ha ha!
Amir_Rajan:
So there's something called, there's a Pico, Pico-8, have you heard of that fantasy console? So there's something called a Picozine, and it did phenomenally well. So if you type in like Pico-Zine, and it's this like digital book that someone wrote about Pico-8. And the format, it alludes to like a wise poignant, I can never
Charles Max_Wood:
No
Amir_Rajan:
say that word.
Charles Max_Wood:
poignant.
Amir_Rajan:
Guide, Wise Guide, yeah, Poignant,
Charles Max_Wood:
Yeah.
Amir_Rajan:
there we go. I always try to pronounce the G. Wise Poignant Guide to Ruby, but the Picozine has this retro aspect where you get those coding magazines, and you take them, and you write the code themselves. But I would love for someone to create a Dragon Ruby zine and then promote that, elevate you, so you've got some new stuff coming to you, you know, help inspire other people. But
Luke_Stutters:
This
Amir_Rajan:
aside
Luke_Stutters:
is how
Amir_Rajan:
from
Luke_Stutters:
I learned
Amir_Rajan:
that,
Luke_Stutters:
to code
Amir_Rajan:
yep.
Luke_Stutters:
in the 80s, was the typing in games and then modeling them. So this
Amir_Rajan:
Yeah.
Luke_Stutters:
is very close
Amir_Rajan:
And I think
Luke_Stutters:
to
Amir_Rajan:
it's
Luke_Stutters:
my
Amir_Rajan:
endearing.
Luke_Stutters:
heart. I'm not sure I can.
Amir_Rajan:
Yeah. And as far as the docs, you've got docs.dragonrooiby.org. For the sample apps, what I usually recommend is just do the sample apps in order, because they're ordered by easiest to most complex. So if you like just reading API docs, they're available there. You've got the heads-up display to do whatever class.methods, and you've got all that introspection built in. go through the sample apps and kind of one-on-one do that or dragonruby.school
Luke_Stutters:
So what
Amir_Rajan:
Bye-Yah.
Luke_Stutters:
is the best game? What is the best game? I don't mean your favorite, I mean the best.
Amir_Rajan:
The best Dragon Ruby game?
Luke_Stutters:
Best Dragonery game? What's the best one?
Amir_Rajan:
And I can't say any of my own, right?
Luke_Stutters:
Well, no, you can. I mean, you can.
Amir_Rajan:
Okay.
Luke_Stutters:
I mean, I'm not dark and something very
Amir_Rajan:
So
Luke_Stutters:
popular.
Amir_Rajan:
it's like, wow, I can't say no. As far as most successful games, I have the most successful games on Dragon Ruby. I'm probably
Luke_Stutters:
Right?
Amir_Rajan:
the most successful Ruby game developer in the entire world, because I'm probably the only one. But aside from that, there's a lot of on the website, dragonruby.org, if you go to the showcase, there's a lot of games on there that are made with Dragon Ruby that are available on itch and you're putting me on the spot because I know the game, I know like the playing of the game and I can't remember the name of it. But it was actually built during, for a game jam. So someone put it together for the boss battle game jam. And that game is pretty fantastic. And it was some of the community members that put that together. But I'll share the link to that specific game itself. But the art was good, the controls were beautiful. Music is great. It's just a really great game.
Charles Max_Wood:
Cool. So what is itch.io? I just have to ask.
Amir_Rajan:
So itch.io is kind of your, you know how you do mixtapes or like SoundCloud, it's kind of like
Charles Max_Wood:
Uh-huh.
Amir_Rajan:
your mixtape SoundCloud for video games. So
Charles Max_Wood:
Okay.
Amir_Rajan:
it makes it trivial to upload your games on there. You can monetize them. We actually sell the standard license on itch itself to just be part of that community and to get the organic visibility there. Steam requires you to do a lot of things to get a single game out there. Itch removes all that. It's like, put the game out, sell
Charles Max_Wood:
Okay.
Amir_Rajan:
it, give us a cut if you want. You can set how much money you give back to them. And it's a really nice, it's a really great model. But yeah, it's kind of like Steam, but for that indie world.
Luke_Stutters:
Was it Decaf Dungeon?
Amir_Rajan:
Is it? I don't think it's Decaf Dungeon, but that does sound like a game that someone would make with Dragon Ruby. But there's so many games on there. Oh, Duelist, that was it. That's the name of the game. So Duelist came out of a boss battle game jam. And basically, the idea of the game jam is that you create a boss, and you have to beat that boss. And they just did a phenomenal job with it. For that game jam, I created Broad Sword of Justice. So that's another playable, ridiculous title that you can play. But yeah, that would be my game pick.
Charles Max_Wood:
Very cool. All right, well, yeah, let's get to picks, because, yeah, I have other
Amir_Rajan:
It is
Charles Max_Wood:
things
Amir_Rajan:
time.
Charles Max_Wood:
to do today. Yeah. Valentino,
Amir_Rajan:
you
Charles Max_Wood:
what are your picks?
Valentino_Stoll:
I just got a new Apple Watch, the Ultra, and
Amir_Rajan:
I'm sorry, I'm sorry.
Valentino_Stoll:
I'm just loving it.
Amir_Rajan:
I'm sorry, I'm sorry.
Valentino_Stoll:
I love the... my
Amir_Rajan:
I'm sorry, I'm sorry.
Valentino_Stoll:
old watch didn't have an always on display,
Amir_Rajan:
I'm sorry, I'm sorry.
Valentino_Stoll:
and so like so annoying to just look down and then have to raise your arm, which I know
Charles Max_Wood:
Mm.
Valentino_Stoll:
that you know some of the semi-newer ones already had this, but it's just so great to just be able to look down and like know what direction
Charles Max_Wood:
Yeah, raising
Amir_Rajan:
Back
Charles Max_Wood:
your
Amir_Rajan:
in the
Charles Max_Wood:
arm,
Amir_Rajan:
90s,
Charles Max_Wood:
that's
Amir_Rajan:
they
Charles Max_Wood:
rough.
Amir_Rajan:
had something like that.
Valentino_Stoll:
Yeah. Ha ha ha.
Amir_Rajan:
Didn't the 90s have always-on watches? I vaguely remember
Valentino_Stoll:
I mean,
Amir_Rajan:
that.
Valentino_Stoll:
I don't know. Mine were always those like Cassia ones that were digital. So like if the sun hit it the wrong way, you had
Amir_Rajan:
Yeah,
Valentino_Stoll:
to
Amir_Rajan:
you
Valentino_Stoll:
raise
Amir_Rajan:
never,
Valentino_Stoll:
it
Amir_Rajan:
you
Valentino_Stoll:
up
Amir_Rajan:
couldn't
Valentino_Stoll:
anyway.
Amir_Rajan:
see it
Valentino_Stoll:
So,
Amir_Rajan:
yet.
Charles Max_Wood:
Yeah.
Valentino_Stoll:
so I guess like in a way I have the same watch.
Amir_Rajan:
Hehehe
Valentino_Stoll:
I had had the same watch.
Amir_Rajan:
Thanks for watching!
Charles Max_Wood:
Nice.
Valentino_Stoll:
That's it for me.
Charles Max_Wood:
Okay, Luke, what are your picks?
Luke_Stutters:
I was gonna pick UTM for Mac last week. I got one of the new ARM-based Mac laptops and I couldn't get any of my stuff to run until I installed UTM, stands for Universal Touring Machine. It's completely changed the way
Amir_Rajan:
you
Luke_Stutters:
I use the machine. So UTM is free, it's based on the Queenie backend. And given what we've been talking about, I would like to pick a couple of things which is just amazing for hardware hacking. He's got a video on his new
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
hackable mechanical
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
keyboard called the Myrage
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
3
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
and another video on his
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
head mounted display.
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
Speaking of a HUD, this is a real-life
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
head mounted
Amir_Rajan:
I'm not sure if you can hear me.
Luke_Stutters:
display based on an Epson pair of kind of smart video glasses. So those are my picks for this week.
Charles Max_Wood:
Awesome. I'm gonna throw out a few picks. Now I've been traveling so I haven't been playing a whole bunch of board games So I think I'm just gonna repick one that my wife and I played last night We do a date every week and We decided to just play board games for our date this week. So we played King of Tokyo if you've played that it's pretty simple.
Amir_Rajan:
I'm not sure if I'm going to be able to do this.
Charles Max_Wood:
I I'll admit I destroyed her
Amir_Rajan:
I'm not sure if I'm going to be able to do this.
Charles Max_Wood:
both times. We played it and then we played legendary Marvel legendary
Amir_Rajan:
I'm not sure if I'm going to be able to do this.
Charles Max_Wood:
So just to kind of
Amir_Rajan:
I'm not sure if I'm going to be able to do this.
Charles Max_Wood:
give a little bit of background on these games.
Amir_Rajan:
I'm not sure if I'm going to be able to do this.
Charles Max_Wood:
King of Tokyo
Amir_Rajan:
I'm not sure if I'm going to be able to do this. I'm not sure if I'm going to be able to do this. I'm not sure if I'm going to be able to do this. I'm not sure if I'm going to be able to do this.
Charles Max_Wood:
is a dice game. You roll the dice if you attack the person. If you hit the person in Tokyo, they can leave Tokyo and you go into Tokyo. You can't heal when you're in Tokyo. You can get cards to give you special abilities. And anyway, it's a ton of fun. Let me pull up Board Game Geek real quick so I can tell you the weight on that one. It's a game that I can play with my kids, so it's not that involved. There is a sequel to it, this King of New York, and I didn't like it as much. King of Tokyo has a weight of 1.49. It says it's 30 minutes playing time. Yeah, the first game I beat her in like 10 minutes. And it was just, you know, sometimes it's just the way it goes with your roles and the way you get things going. But yeah, so Marvel Legendary is, it's a card game. And it comes with a game board so you can place the cards on it where it goes. It's a deck building game though. And we have a whole bunch of expansions for it. It's a lot of fun too. It's weight on board game geek is 2.43. And yeah, so we just, that randomly chooses cards from the expansions that you select. So, you know, and then it says, so it says, here's the mastermind you're fighting, here's the scheme you're trying to overcome. You tell it how many players, you tell it which expansions you wanna pull heroes from and masterminds from. And then, yeah, it does what we found because we used to like turn them all on, right? And so you get like this weird mix of heroes. What we found is that the different expansions are made to work together in a lot of ways and so Kind of the magic mix is about two expansions because you get five heroes or six heroes depending on how many How many people are playing but it's it's a lot of fun some of the masterminds are really freaking hard and some of them aren't But you kind of get a feel for how that works and it's it's it's a fun fun fun game So I'm gonna pick those Um, and then I'm starting a new podcast, uh, about careers. It's actually called command your coding career. Um, and the reason is, is because, uh, I, I opened up a while back an opportunity for people to come to me for coaching where I would just help them with what I mean, technical stuff, career stuff. And I had people coming to me over and over and over and over again, basically saying, how do I get to the next stage of my career, right? Whether they're juniors and trying to become seniors. I had a number of seniors who were basically coming to me and saying, I want to start podcasting because the next stage of my career seems to be helping people or making a difference this way, that way, or the other way. A few people wanted to start a podcast or something else so that they could sell courses and stuff like that, which is a place I'm going to now. So I started this podcast and I'm just going to answer a lot of the questions that I've been getting on these calls. So it's, hey, I'm struggling with this at work. I'll just talk through it. Probably tell a few stories from my past, my background, but one thing that came out of it was that I'm also putting together freebies and helps for people. And so by the time this goes out, you'll be able to get this. I was working on it right before the show and I should have it up here within an hour or so. But if you go to topendevs.com slash resume, I'm starting off with resume stuff I've had a lot of people just, I'm not getting interviews. And then I look at their resume and I'm like, well, your, your resume isn't formatted in a way that helps the employer know that they want you. So, um, you can get my resume. Um, and I think it actually has my email address on it. I took my cell phone number off it, sorry. Um, but you can get, uh, you can get it at topendevs.com slash resume and it will, you just enter your email address and then you'll get a copy of it. straightforward how that all works. But what I'm hoping to do is, you know, then I can help people with cover letters, or maybe I can help people with, I keep going to interviews and it's not working right. And so maybe I'll put together some videos of mock interviews or things like that. Right. And so I really do want to help people through this. I've also been working in a contract and I'm looking for ways to kind of reduce my dependency on but I'm going to give a ton of crap away for free because I just, I feel like there's a lot of people out there that need help and I don't necessarily want you to have to pay to get what you need, but I also have to make a living. And so however I wind up splitting the differences kind of the way that'll go. But yeah, for now, if you want the resume, go to topendevs.com slash resume. And then the last thing I'm going to throw out there is Rails, a remote conference, putting that together, it's going to be in February. So if you want to submit a talk, submit a talk. buy a ticket, you can buy a ticket. And yeah, I'm really looking forward to some of the interactions there. I'm pretty heavily committed to not just doing like a series of videos. What I want is I want kind of a place where people can go and interact. So I've been looking at a couple of platforms that effectively let you walk around the expo floor slash interaction area. And if you get close to a group of people talking, you can join it and, you know, join in, you know, put together there's some birds of a feather. I mean, you know, that for me is the magic of going to a conference. And so if I can replicate some of that in the meantime, you know, that's something that I wanna do. And I have other plans, but I think that's kind of the, the next big lift for what we're doing is, yeah, putting that out and helping folks out. And then, yeah, that's pretty much all of my picks. Amir, what are your picks?
Amir_Rajan:
All right, so my picks are actually all book related. They're all books that I've listened to, just eat up audible all the time.
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
So the first one is Project Hail Mary. It's
Charles Max_Wood:
Oh, that was so good.
Amir_Rajan:
so good, good, good.
Charles Max_Wood:
Yeah.
Amir_Rajan:
Very good.
Charles Max_Wood:
Yeah.
Amir_Rajan:
It's a great read. The Martian sub-pick
Charles Max_Wood:
Yep.
Amir_Rajan:
is by the same guy that did The Martian. Another great book is We Are Legion, We Are Bob. And it's a three, four book series. And it's about a software dev who sells his company and then signs up to be cryogenically frozen in the event of death so that he can be brought back and live for him immortally. And signs up, immediately gets hit by a car and killed, and wakes up 150 years later to be commissioned to as a von Neumann probe that goes into space and expands out.
Charles Max_Wood:
Oh,
Amir_Rajan:
It
Charles Max_Wood:
interesting.
Amir_Rajan:
is hilarious. It's a funny book. It's ridiculous. And it's got a kind of like Hitchhiker's Guide to the Galaxy vibe in some places, just the humor in there. And so that's a good book. And then it's four books series. And then the final pick that I have is three. It's a three book series called the broken earth. So the first book in that series is called The Fifth Season. And it's more of a fantasy book and it kind of explores like this post-apocalyptic world where like the entire earth has been brought back into kind of like Pangaea, the Pangaea continent,
Charles Max_Wood:
Mm-hmm.
Amir_Rajan:
and kind of talks about, I don't want to give any spoilers, but it talks about what went down and how they're And there's this like, the fifth season is the season that occasionally comes where there's a ton of like volcanic eruptions and it covers the cloud and soot and then people have to like survive with store caches and everything's in disarray. And, yeah. And so they, it's a three book series that goes into the exploration of how all that gets fixed. It's a very sad book. It's like a very like, bittersweet, you know,
Charles Max_Wood:
Mm.
Amir_Rajan:
serious, serious book. Those are my three book picks.
Charles Max_Wood:
Awesome. Yeah, I really loved Hail Mary. I didn't pick it up for a long time because I listened to The Martian, I really enjoyed it. And then I picked up Artemis and I didn't like that book
Amir_Rajan:
I did
Charles Max_Wood:
at all.
Amir_Rajan:
not like Artemis either. It was okay, but yeah.
Charles Max_Wood:
Yeah. But
Amir_Rajan:
Hail
Charles Max_Wood:
I
Amir_Rajan:
Mary was great.
Charles Max_Wood:
was looking for a sci-fi book and I was like, I'll give it a shot. And I really enjoyed it.
Amir_Rajan:
We are Legion. We are Legion. We
Charles Max_Wood:
Oh.
Amir_Rajan:
are Bob. You will absolutely love it.
Charles Max_Wood:
I'll have to check it out. All right, cool. People want to connect with you online or if you have any other last minute kind of, here's where I kind of live online. Where
Amir_Rajan:
I'm on
Charles Max_Wood:
do
Amir_Rajan:
Twitter.
Charles Max_Wood:
people go?
Amir_Rajan:
I'm on Twitter. You can find me on the Discord server for DragonRuby, discord.dragonruby.org, and email ar at amirrajohn.net. So
Charles Max_Wood:
All right.
Amir_Rajan:
all things are open.
Charles Max_Wood:
Sounds good. All right, well, thanks
Amir_Rajan:
Thank you.
Charles Max_Wood:
for coming. This was awesome. I seriously, I'm just like, I have stuff I got to work on, but I might just not sleep so I can write games.
Amir_Rajan:
Just play. Just
Charles Max_Wood:
Yeah.
Amir_Rajan:
open it up, double click, and
Charles Max_Wood:
Yeah.
Amir_Rajan:
try something. And just get that magic
Charles Max_Wood:
Yep.
Amir_Rajan:
back. Feel happy again.
Charles Max_Wood:
Yeah.
Amir_Rajan:
No more enterprise coding. I'm not allowing you to do that after hours anymore.
Charles Max_Wood:
Okay. All right.
Amir_Rajan:
You're like, done.
Charles Max_Wood:
Yeah.