Link Bar

Home | Games | Programming | Tutorials | Donate | Legal (These are mostly empty right now. Placeholders!)

warning code

This website contains adult content.

Wednesday, February 29, 2012

Day 13: TECS, Chapter 1, Part 2.

Zach gave me a suggestion that I thought would work.  After half an hour of Googling, it still did not work.  Back to the books!

I picked up exactly where I left off, on the testing scripts.  Here is a test script from the textbook (testing the Xor gate which I discussed yesterday):

load Xor.hdl,output-list a, b, out;   
set a 0, set b 0,   
eval, output;   
set a 0, set b 1,   
eval, output;   
set a 1, set b 0,   
eval, output;   
set a 1, set b 1,   
eval, output;
Oh, man.  This is easy, after understanding the chip itself!  Just load up the chip, specify what goes onto the output list (in this case, our values for a, b, and the evaluated outputs), then set a & b to all combinations they could be, evaluate the chip's function, and output it.  Like unto a pie.  Sure enough, we get:

a | b | out   
0 | 0 | 0   
0 | 1 | 1   
1 | 0 | 1   
1 | 1 | 0 
Hot cha.  What's next?

Next is what the chips are and how to build them.  Easy-peasy, quick an' breezy.  Well, up until we get to the 4-way 16-bit multiplexor, anyway.  The Alert Reader will recall that multiplexors gave me a small headache yesterday, but today I only got slightly narrowed eyes and increased attention.  Demultiplexors were a cinch after that; it's just the same thing, backwards!  Building these exclusively out of NAnd gates?  Ehh, not so much.

I just learned this yesterday.  Now you want me to build it with
two pop tabs and a paperclip?  CHALLENGE ACCEPTED.
(From The Elements of Computing Systems, by Noam Nisan & Shimon Schocker)

But that's the end of the chapter!  Now for the project:  build all the chips/gates mentioned in the chapter out of NAnd only (that would be Not, And, Or, Xor, Mux, DMux, Not16, And16, Or16, Mux16, Or8way, Mux4way16, Mux8way16, DMux4way, DMux8way).  If this were a real course, I'd have a week to do this, so let's see how I feel after doing Not, And, Or, Xor, and Mux.  Then I'll sleep on it and try the rest tomorrow.

Ready?  Go!

First up, Not via NAND.  Easy enough, right?
IN in;
OUT out;
PARTS:
Nand(a=in, b=in, out=out);
Ha ha, NAnd already does the heavy lifting for me!  Load the test script, and:  SUCCESS!  Now for And via NAnd.  Whoah, I almost thought I could just put a Not at the end, but herp-a-derp, that wouldn't work because NAnd isn't the...  Wait.  No, that's exactly what I want!
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=b, out=r1) //the R is for RESULT, get it?
Not(in=r1, out=out); //let's make it more explicit, shall we?
Nand(a=r1, b=r1, out=out);
Load the test script, make sure I didn't do anything stupid, and... SUCCESS!  I'm on a fuckin' roll!  Now for the inclusive Or.  This will require gymnastics...wait, no it won't, because I can just put Nots after a & b before they go into NAND, and poof!  Let's be super explicit again:
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=a, out=nota);
Nand(a=b, b=b, out=notb);
Nand(a=nota, b=notb, out=out);
Too sexy, too sexy!  This is going smoothly.  Now, I can't help cheating for Xor, since I was already given a diagram and the HDL for it; what I can help is whether I cheat further by simply copying, or instead translate the existing HDL into Super-Exciting Mega-Explicit NAnd-Only Language!  (I'm not shouting, the "!" is just part of the phrase.)  The tough part here is now no longer coming up with the HDL, but keeping my terms straight.  I'll make a new diagram and divide it up into three phases like the old one:  the Not phase, the And phase, and the Or phase, finally leading to the output.  Here it is:
I haven't felt this enlightened since I learned why
the square root of two is necessarily irrational.
Hey, r1 & r2 just get Not'ed twice - at the end of the And phase, and at the beginning of the Or phase - which means... carry the one... I can skip steps.  As long as I skip the right ones.  Now I'm actually learning!  Doing that, my new Optimized NAnd-Only Xor HDL is:
IN a, b;
OUT out;
PARTS:
Nand(a=a, b=a, out=nota);
Nand(a=b, b=b, out=notb);
Nand(a=a, b=notb, out=r1);
Nand(a=nota, b=b, out=r2);
Nand(a=r1, b=r2, out=out);
Instead of crossing my fingers, I'ma crack my knuckles.  Crackita-pop!  Plow!  Annnd... SUCCESS!  In the same number of lines of code as their original Xor gate, which needed Not, And, and Or!  HOO-HA!

Uh-oh.  Now for Mux.  OK, there's a reason I decided to make this the last one for the night, and it's not just that it's 10:22.  You're on a roll, just keep it going, man.  Think out loud.  Or on paper.  Erm, in type.  Whatever.  You've got your a in, your b in, and your selector, and the selector decides which input comes through.  I can do this.  Think of it in terms of the shortcuts, first.  Then blow it up into NAnd-Only, then simplify (if you can).  OK.

Dammit, now it's 10:42, and I've been staring at this for 20 minutes and thinking, "No, this won't work.  No, that won't work.  Shit, what am I gonna do?"  Urge... to cheat... rising... WAIT.  Re-draw the truth table so it's less confusing.  OK, now it looks like an Or for a & sel when sel=0, and it looks like an And for b & sel when sel=1.  Good, you can work with this.  Keep going.  All right, it can't trigger the And for b & sel when sel=0, so... run an And from sel & b (result:  selAndb).  Duh.  Keep going.  Run an Or from sel & a (result:  selOra).  Now we've got selAndb which gives b when sel=1 and 0 when sel=0; and we've got selOra which gives 1 when sel=1 and a when sel=0.  Good.  Paragraph break.

Now compare your "mini" truth tables with each other.  Wait.  Duh.  You're barking up the wrong tree here.  Stop trying to make it explicitly perform based on why you know it ought to go, and make it perform based on why it needs to go. Back up and brute force the fucker, then clean it up in post.  You'll be fine.  OK.  Start with sel&a&b=1.  Work up from there.  Run them all to And gates, then make those come out how they ought to do.  Then funnel them into bottlenecks so that you get what you need at the end.

OK, finally.  I got it.  It's 11:50, and I fucking got it.  First, I just did everything in terms of "and," "not," and "output" - not HDL-wise, just logic-wise.  Like, I wrote on a piece of paper:
s&a&b=1
s&a&~b=0
s&~a&b=1
...and so on.  Then I drew up HDL-like parsings of those functions, and tried to make them as similar as possible.  I noticed that I could capture three correct outputs with only (s*a)*b (call it x), four more with (s+a)*b (call it y), and the last one with (s+a)*~b (call it z).  (For the uninitiated, + = or, * = and, ~ = not.)  Then I drew up a truth table for s, a, b across from x, y, z, and also drew up the output.  I noticed that y predicted three of four outputs of 1, and z got the other one when s=0.  The x function was useless, so I discarded it, and made x':  y+(z*~s).  (Fun Fact:  I accomplished this step by folding over the s/a/b section, MAD Magazine fold-in style!  Now that's thinking outside the box!)  Finally, I drew up a schematic for a, b, and s inputs, into y and z functions using And, Or, and Not gates, then put it all through to the x' function, and that gives the output.  So we have:
IN a, b, sel;
OUT out;
PARTS:
Or (a=a, b=sel, out=sva);
And (a=sva, b=b, out=y); //these lines describe the y function
Not (in=b, out=notb);
And (a=sva, b=notb, out=z); //these lines describe the z function, and I can re-use sva from above
Not (in=sel, out=nots);
And (a=z, b=nots, out=zAndNots);
Or (a=y, b=zAndNots, out=out); //these three lines describe the x' function, which is just output
OK, let's see if that runs... SUCCESS!  Holy carp, that was insane.  OK, that's my proof of concept, now to break it down into NAnd-Only.  Picture first?  Picture first!
And to think, this is still the easy part...
Whoops, that "&s" at the bottom coming out of the first NAnd should read "~s"; and I need to label some results r1, r2, and r3; and I should also label that bit that comes out notzAndNots when you come anticlockwise around the lower-right corner.  Not taking another picture, though.  Now for code:
IN a, b, sel;
OUT out;
PARTS:
Nand (a=a, b=a, out=nota);
Nand (a=sel, b=sel, out=nots);
Nand (a=nota, b=nots, out=sva);
Nand (a=sva, b=b, out=r1);
Nand (a=r1, b=r1, out=y); //BAM!  That's y, now for z.
Nand (a=b, b=b, out=notb);
Nand (a=sva, b=notb, out=r2);
Nand (a=r2, b=r2, out=z); //Sweet.  Now to wrap it all up!
Nand (a=z, b=nots, out=r3);
Nand (a=r3, b=r3, out=zAndNots);
Nand (a=y, b=y, out=noty);
Nand (a=zAndNots, b=zAndNots, out=notzAndNots);
Nand (a=noty, b=notzAndNots, out=out); //done!
Plug & chug, and... BAM!  Success on the first try!  And it only took me - TWO AND A HALF HOURS?!  Whatever, I'm done now.  By the stars, I've got a lot to do tomorrow, though... I'm starting to see why hardware designers burn out and how programming conventions become insane.

Tuesday, February 28, 2012

Day 12: Poking around the internets.

Zach left a helpful link in a comment on yesterday's post, and after reading through the whole thing, I have a slightly clearer idea of what's going wrong.  See, line 187 says:
wcx.lpszClassName=WINDOWCLASS;
...and the error returned is:
error C2440: '=' : cannot convert from 'const char [7]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
So, OK, at least that's not gibberish to me any more.  And way, way back up in line 15, when I wrote:
#define WINDOWCLASS "Fetris"
...that must have made "WINDOWCLASS" into a constant.  OK.  And on line 187, I'm not certain what that "wcx" bit is all about, but "lpsz" means that I'm setting a long pointer to a null-terminated string - so it wants ASCII.  Right?  But... if it's trying to use a long pointer to a constant wide string... that means it wants Unicode.  So I'm telling the machine to do something with ASCII, and it's trying to do it in Unicode, and that's the problem?  I think so.

I don't know how to fix that, though.  Either I need to do something different in the WinMain function (which I'm not sure what that would be), or I need to change my definition up at the top (and I'm not sure how I ought to do that).  Well, this is what I get for using someone's code from over eight years ago.  And holy carp, I spent over half an hour just typing out the above.  Well, more like five minutes typing and revising it, and 25 minutes cradling my head trying to sort everything out.  This is in addition to the hour I spent poking and prodding and reading and trying to make it work.  And I'm still probably missing something (like a real programming course).  Fine.

I'm going to play around with that NAND to Tetris thing.

Got the hardware simulator running after installing the 64-bit version of Java (had to consult their forums to find out I needed to do that - apparently the version I had before wasn't good enough).  Got the Hardware Simulator running, and figured out how to load and test gates/chips in it.  Nice.  Project 00 complete, on to Chapter 1!

I started flipping through the slides for the lecture, figuring I'd read the chapter after I got an idea of what I'll be learning.  Right away, multiplexers stumped me (well, on slide 9 of 24, anyway).  I could not for the life of me figure out what was going on in that truth table.  Wikipedia to the rescue!  (By the way, is Wikipedia being wonky for anyone else lately?)  Man, multiplexers are easy once you know that the selector picks which input gets to be translated into output!  (I did not know that more than five minutes ago.)  The rest of the slide show was easy after that - but now I have to basically re-learn all of my logic using NAND only, which is doable, but confusing.  Whatever, that's the point of the exercise.

Reading the chapter itself, I further learned what the "canonical representation" of a Boolean function is (it's the inclusive disjunction of all the possible values which yield "true" on the truth table).  I've also got the hardware description language (HDL) down.  See, twenty minutes ago, this was gibberish to me:
/* Xor (exclusive or) gate:If a<>b out=1 else out=0. */  
CHIP Xor {
IN a, b;
OUT out;
PARTS:
Not(in=a, out=nota);
Not(in=b, out=notb);
And(a=a, b=notb, out=w1);
And(a=nota, b=b, out=w2);
Or(a=w1, b=w2, out=out);
}
But now I get it!  See:
/* Xor (exclusive or) gate:
If a<>b out=1 else out=0. */
CHIP Xor { //we have a chip, called "Xor"
IN a, b; // it has inputs "a" and "b"
OUT out; // it has output "out"
PARTS: // these are its parts
Not(in=a, out=nota); // A "not" gate with input from a, outputting to "nota"
Not(in=b, out=notb); // A "not" gate with input from b, outputting to "notb"
And(a=a, b=notb, out=w1); // An "and" gate with input from a and notb, outputting to "w1"
And(a=nota, b=b, out=w2); // An "and" gate with input from nota and b, outputting to "w2"
Or(a=w1, b=w2, out=out); // An "or" gate with input from w1 and w2, outputting to "out"
}
I feel smarter already!

OK, I've been doing this for hours, I'm halfway through the first chapter, and this is like a week's worth of work anyway.  My brain is full.  G'night, everybody!

Monday, February 27, 2012

Day 11: Fetris bug-huntin'.

Before I dive into the "actual" errors, I decided to fix the "pretend" errors (i.e. the errors caused by my human error, like typos).  In addition to the errors I found last week, I found one case of necessary capitalization, one case of extra comma (which caused three other syntax errors in the same line), one case of super-exciting extra "}", and one case of a comma that should'a been a semicolon.

I take solace in the fact that I was able to solve my own syntax errors (which were the larger portion of the errors generated) simply by looking at them.  I said, "Oh, that's obviously what's causing the problem," attempted to compile it once again, and BAM!  Error gone!  There was one case where I put a 1 (one) instead of an l (lower-case L), but... look, they look the same.  I would say to them, "You want an ice cream cone?"  Both of them say, "Yes."  Everything that got more complicated than that, I checked against the original post, and yeah:  did it exactly like he said (except for the one part where I kinda-sorta skipped a line).

I am unlikely to get support from Evil_Greven himself on this, but that's OK.  It wouldn't be a learning experience without like six bajillion hurdles.  My high school chemistry teacher, Dr. Landorf, once gave us a universal problem-solving method.  I forget most of it, but the two parts that stuck with me were:  "A problem is not when you simply have to get from A to B.  A problem is when you have to get from A to B and have no idea how.  Otherwise you merely have a number crunch," and, "When you  can't find the solution to a problem, start at the answer and derive the question."  I couldn't find the list itself on the internet (this was a handout from before the internet was everywhere, and apparently drew from several sources), but I did find a really great joke while I was looking:
A mechanical engineer, an electrical engineer, and a software engineer are in a car that breaks down.  The mechanical engineer says, "Maybe is's a stuck valve."  The electical engineer says, "Maybe it's a dead battery."  The software engineer says, "I know. Let's all get out and get back in again, and see if that fixes it."
BWAHAHA!  Oh, what a groaner!  Love it!  OK, so I've now got it down to three errors:

1>------ Build started: Project: Fetris, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\users\d\documents\visual studio 2010\projects\fetris\fetris\main.cpp(187): error C2440: '=' : cannot convert from 'const char [7]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\users\d\documents\visual studio 2010\projects\fetris\fetris\main.cpp(196): error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [7]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\users\d\documents\visual studio 2010\projects\fetris\fetris\main.cpp(260): error C2664: 'BitMapObject::Load' : cannot convert parameter 2 from 'const char [11]' to 'LPCTSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>  BitMapObject.cpp
1>  Generating Code...
Much more manageable than the two dozen I had on Friday.  I can handle this.  I think.  I Googled the first error, in accordance with the prophecy (the prophecy is "JFGI") and found this thread, which led me to this other thread., which led me to this excellent article.  The article is called "Making Wrong Code Look Wrong," and the author goes on about the true history of Hungarian notation (which I did not know was a thing until today) and how to be your own best friend with your programming conventions.  Since one of my errors from this very day was an extra "}" nestled amongst some 50 lines of nested "how to make teh bloxxxorz," I really wish that Evil_Greven had followed rule 5:  "Don't put closing braces more than one screen away from the matching opening brace."  It would've been gallons easier to spot that extra brace, had he done so.  But no worries!  I learned a valuable lesson.  And I bookmarked that guy's blog, because it's rad as Hell.


OK, so the guy in thread number two said that I could either switch the compiler settings to multibyte character set, or use unicode strings instead (the recommended option).  I can't find that option after combing through them all, and I don't know how to make it unicode compliant quite yet, so I'm calling it a night.  It's quarter after ten, I have learned some things and done some things, and I'm happy.


For now.

Sunday, February 26, 2012

Down the Rabbit Hole...

I started reading the textbook for The Elements of Computing Systems, it's very accessible and I recommend it to anyone who wants to know more about how computers work.  Here's their course map:
From The Elements of Computing Systems, by Noam Nisan & Shimon
Schocker (free online course) http://www1.idc.ac.il/tecs/book/preface.pdf

I just read through the preface & introduction, and I can't wait to get started!  I'm already learning new things, like the different levels of abstraction (as represented in the image above, and the text block below) that really go on inside the box.  I used to think that you just had your programming language, which was made "binary compatible" (whatever that would mean) by the compiler (whatever that did), and the computer ran on binary.  Well, binary and smoke (if you let the smoke out, the computer stops working).  Lo and behold, the introduction comes to the rescue, curing me of my misconceptions:
If you have taken any programming course, you’ve probably encountered something like the program below early in your education. This particular program is written in Jack—a simple high-level language that has a conventional object-based syntax.
// First example in Programming 101:
class Main {
function void main() {
do Output.printString("Hello World");
do Output.println(); // New line.
return;
}
}
Trivial programs like Hello World are deceptively simple. Did you ever think about what it takes to actually run such a program on a computer? Let’s look under the hood. For starters, note that the program is nothing more than a bunch of dead characters stored in a text file. Thus, the first thing we must do is parse this text, uncover its semantics, and reexpress it in some low-level language understood by our computer. The result of this elaborate translation process, known as compilation, will be yet another text file, containing machine-level code. Of course machine language is also an abstraction—an agreed upon set of binary codes. In order to make this abstract formalism concrete, it must be realized by some hardware architecture. And this architecture, in turn, is implemented by a certain chip set—registers, memory units, ALU, and so on. Now, every one of these hardware devices is constructed from an integrated package of elementary logic gates. And these gates, in turn, can be built from primitive gates like Nand and Nor. Of course every one of these gates consists of several switching devices, typically implemented by transistors. And each transistor is made of— Well, we won’t go further than that, because that’s where computer science ends and physics starts.
Computers are like way faster than I ever realized.  Also, no wonder my framerate starts chugging when I jack up the draw distance.

I also read the tutorial on the hardware simulator, and the lecture notes on the introduction.  I'm calling it:  my brain is officially full.  Project 00 can wait until, I dunno, whenever I get sick of trying to fix Fetris.  Catch you crazy cats later.

Friday, February 24, 2012

Day 10: FETRIS (work in progress)

I went through Evil_Greven's tutorial on how to build a Tetris clone in an hour with C++.  I followed his instructions using Microsoft Visual Studio 2008 Express.  I'm much less intimidated by C++ now than I was two days ago, but I feel like I'm back in the 5th grade again, learning Spanish for the first time.  "Yeah, I know what 'buenos días' means.  'Pantalones?'  Oh, man, this is gonna be easy.  Wait, why is N-yay a totally different letter from N-eh?"  Seriously, you guys, for the longest time I thought that "vedevaca" was the name of the letter, not just "veh" - I didn't learn about "b de burro" until I was in freakin' high school.  Same with "y griega," I didn't know it was as opposed to "i latina" until I dated a girl from Uruguay and she told me.

I guess what I'm saying is, I need to date a programmer now.  No, that is not the most cynical use of dating ever.  But, uhh... I can't come up with a more cynical one.  Because I'm so totally not cynical.  Double-promise.

Anyway, I got through with no problem, except that VC was telling me that I hadn't declared shit which I had so too declared, just look.  But whatever, I didn't let it bother me, and I kept on chugging through.  I would highlight everything that turned blue and hit F1 to bring up the help, and read through those articles.  This made it take like three hours instead of one, but that's OK.  Then I went to compile it at the end, and that's when shit hit the fan.

As my grandma would say, "Errors out the yin-yang."  Yes, my grandma talks like that.  No, it's not cool if you say that while being under 70 years old.  Yes, that's a moving target; it won't be cool for 70-year-olds to talk like that when you're 70.  Modern medicine has made it culturally impossible for us to be ironic by speaking in the fashion of young people when we are in fact old people.  And no, current old people do not suffer from this flaw in our age-based system of behavioral standards.  But hey, that's what you get for longevity.  Stupid double-standards.

ANYWAY.

I dutifully read the errors and went to the lines of code where they allegedly occurred.  Ahh, shit, I forgot a "( )".  Oh, damn, a legit typo; must'a fat-fingered it.  Whoops, left out a semicolon!  And... that... I can't...
fetris\main.cpp(187): error C2440: '=' : cannot convert from 'const char [7]' to 'LPCWSTR'
What the blue fuck does that mean?  OK, let's go to line 187:
wcx.lpszClassName=WINDOWCLASS;
Right.  And what did Evil_Greven say to do here?
wcx.lpszClassName=WINDOWCLASS;
All right.  Double-check each and every character, and... yup, that's exactly the same.  And what other sage advice does VC have to give me on this?
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Ohhhhh-kayyyyy... I know what that means and everything.  And I've got 21 more errors to go.  That's not bad, for over 600 lines of code on my first day.  Wait.  Hold on.  Remember Alexander the Great.


This tutorial was written in 2003.  This might be nobody's mistake, just a case of mismatched standards.  Maybe.  But if it is Evil_Greven's mistake, it's almost certainly beyond my ken to fix it now.  Dammit.  I really wanted to play my very own Fetris.  I even made the bitmap for the blocks!

Whatever, I'm putting this aside for now.  I'll come back to it over the weekend and see what else I can learn.  It's not like those errors are going anywhere, right?  Besides, there's nothing like fixing a broke-ass machine to get you familiar with its workings.  But for now, I'm done with this.  You get the Tetris God:


Also, you should check out Hatetris.  Because I just bet you're a masochist.

Thursday, February 23, 2012

Day 9: The Alexandrian Solution

After reading some more about the Playskool programming that is RPGcode, I grew despondent at the idea that anything I learn here is going to need to be re-learned or un-learned whenever I get my Big Boy programming in gear - because some things will work and some things won't, and I'll probably have to learn which is which one by one.  Hmm... let me think for two seconds here.

OK, I'm not doing that.

So has all this been a waste of time?  Absolutely not.  I've learned a lot in the last eight days, not only due to the reading I've been doing but also by playing around with things.  I now have a much clearer picture of what goes into a video game.  Look, here it is:

Green means "I get it."  Purple/Blue means I'm fuzzy on it.
Red & gold mean I'm fucking clueless.

So yeah.  There's this big, mysterious hurdle right there in the  middle, and it turns out it's the part that actually holds everything together.

I don't know how to untie this Gordian knot - at least not in any way that I would consider to be an effective use of my time - so I'ma straight-up cut the fucker in half.  I'm just gonna learn how to program.  It's a valuable skill, it will help me accomplish my goals, and it's bound to be less time in the long run.  I feel farther from finished game, but I know I'm closer to good game, and that's better to my mind.  However, this means that my daily progress is going to be much less interesting.  Actually, looking back... maybe not.

I'll probably also be able to research the things I'm interested in more directly, and take better advantage of Stack Exchange.  We'll see how this goes.

...ahem.

Doop a doot doo.

What?  You're still here?  Oh, right.  Progress.  Y'know, that thing I said I'd do a little bit of every weekday.


There was a minor tab explosion and I took a walk around the internet.  I learned a little bit o' FORTRAN way back when I was doing undergrad theoretical physics research (ugh, I let the professors write my bio and now it's stuck like that forever... that's what I get, I guess), so this shouldn't be too difficult.  Although I bet it'll be much harder than writing a program that brute-forces a square root approximation and laughs at you if you enter 1 or 0.  From poking around the 'tubes, it's looking like my best bet is C++.  Python seems easier, but I'll just have to learn C++ after it, anyway; and I bet I can learn Python faster after C++ than the other way 'round.  DarkBASIC could also be easy, there's a free version that runs only on ads, but I have little mini-versions of the same issues I've got with Python, and I don't want to wind up in any kind of legal limbo if I actually make something salable (or just have to do it all over in C++ anyway, which may or may not be worse).  Anyway, here's the best of what I've read today:

  • Stack Exchange:  What are good games to "earn your wings" with?  Several perspectives on how to go about learning game development from scratch.  Lots of agreement, and well-articulated disagreement.
  • The Game Programming Wiki:  Beginner FAQ.  More grounding on exactly what the Hell I'm getting myself into.  Getting many sides of the same issue is really helpful; repeatedly seeing the same ideas reinforces those ideas, and also "filters" some of the mere opinionating because it isn't repeated.
  • TGC:  Newsletter.  These guys sell software (they made DarkBASIC), which does not interest me.  But they have a newsletter, which does interest me.  So I signed up for it.  Hope that doesn't bite me in the ass... now I just gotta make sure I read it.
  • Nisan & Schocken:  The Elements of Computing Systems.  Zach once explained to me how computers work at the transistor level.  I understood that part.  I then asked him how you get from "physical logic gate" to "game on screen," and I was unable to comprehend his explanations (due in no small part to the fact that we were drinking that night).  This is a course on pretty much exactly that.  I now have great weekend filler for twelve weeks!  (Fourteen, if I stretch it.)  Here's a sweet video with one of the authors explaining what the book/course are about in more depth:


At Zach's behest, I also downloaded everything I need (I hope?) to use C# for xna.  That's gonna be my fallback if I suck so bad at C++ that I hate it.

Wednesday, February 22, 2012

Day 8: More book-learning.

Seriously, you guys.  I am thoroughly convinced that making a game takes forever and is impossible.

I got program vectors on the board, and I got NPC sprites on the board near the program vectors, but obviously they won't just go, I have to tell them to go and when to stop and blah blah blah.

I need to learn more programming, is what I'm saying.

So I looked up the section on vectors for more precise instructions, and it tells me to write things like "playerPath(variant handle, int flags, ...)" and "itemPath(variant handle, int flags, ...)" and expects me to know how to use RPGCode already (which borrows from programming languages I also don't know).  Fine.  I know when I'm in over my head, so I went to the RPGCode section to find something on "make sprite follow path vector."  This section is written by Occasionally_Correct, who you may remember from that useful tutorial I read on Day 4.  But the topic headings look like this:

  • Language Features
  • Basics
  • Program Flow
  • Creating Functions
  • Scope
  • Error Handling
  • Reserved Variables and Constants
  • Function Reference
  • Object Oriented Coding
  • Old vs. New
  • Methods and Using
  • Overloading Operators
  • Copy Constructors
  • Polymorphism

OK.  So.  None of those is on assigning an NPC to a path vector.  And in case you can't tell, this is not how I learn things.  I don't do well with things like "basics" and "principles" unless what I'm learning is something simple and limited, like playing cards, and I can immediately do a bunch of trial and error.  You get two through ten, then these three "face" cards (King beats Queen beats Jack beats Ten, and so on), and an Ace which can be high or low or both depending on the game.  That's it.  That I can learn with basics an' shit.  This is like nailing Jell-O to a wall:  you tell me something and I listen, but it's boring, and when I finally understand the second boring thing then I've already forgotten all about the first boring thing.  I can never learn exciting things this way, because I can't remember all those boring things all at once.  I need to start with an exciting thing, pre-formed and ready for dissection, and just use it first.  Then when whatever it does isn't good enough for me any more, I learn one boring piece of that exciting thing at a time, and tweak it into oblivion until I get what I want out of it (or at least have a more robust understanding of what I can/can't get out of it).  That way I can do something exciting, even if I'm doing it poorly, but I have practical knowledge straight out the gate and a way to branch out.  Then when I've amassed enough exciting things (or at least enough facets of the one exciting thing), that's when I'll grasp the basics in a broad-based way.

I want to be clear here that I'm not saying the guide is bad.  It's actually very good, but it doesn't fit me.  It's like a well-made tuxedo that's two sizes too small:  I can't fit it on and it looks like crap if I force it, even though it's evident that serious craftsmanship went into its design and manufacture.  What I'm saying is, this guide's start point is my end-point.  This guide wants to go backwards through my learning curve.  The cheek!


It's like I want the internet, but I have a textbook.  Yes, I can use the textbook; but the internet would work so much faster!  Whatever.  If this were easy, there's be zillions more shitty games out there.  There's nothing else really to do at this point, since I can't execute the other game features I want without learning everything about coding.  I guess I ought to keep working on the first game, then.  So fiiiiine, I'll reeeeead the tutooooorial, and probably like three others too.  Even though they put me to sleep because they start with things I don't care about and work up, rather than starting with things I do care about and working out.  Although I suppose it would be really hard to write a guide centered around "what I care about."

So that's what I've been doing today.  Found another good tutorial by this guy Marz, so hopefully that should mean "game updates" and not "learning updates" tomorrow.  I don't think you guys wanna hear about what variables and functions and arguments all are, anyway.

Tuesday, February 21, 2012

Day 7: Two steps forward, one step back.

I figured out how to do graphical and waypoint vectors, the other two kinds of vectors besides collision and programming.  I couldn't quite figure out how to get vector intersection (where your character is opaque when its collision box is outside of the vector, and can go in front of or behind it) instead of frame intersection (where your character is always behind, as though the object is "above" your character); the user's guide mentions their existence and then tells you to click an option that is not actually represented in the user interface.  I bet I'm going to feel really, really dumb when I do finally find that sucker.

On the plus side, I found out how to load programs upon entering a board.  You see, under the board's properties, there's a little section that allows you to load a program to activate upon entering the board.

I got the structure of a board intro here.  I'm angry at vectors right now, so I'll add NPCs & shit tomorrow.

Today's just one of them "do one thing" days, I guess.

Monday, February 20, 2012

Day 6: Taking things in a new direction...

So Saturday evening, after mailing books to prisoners & teaching seniors to use Facebook, I was walking home thinking about game stuff.  I thought, "I should see if I can make something game-ish with what I've got now," since the toolkit comes with a battle system.  It would be good practice!  And I thought, "Hmm... I could do that torus world thing I wanted to do, keep things nice and simple."

Oh!  Hey!  I could do it like a ring world, just one continuous strip.  Play around with how big I can practically make the boards.  Ugh, now all I can think about is Halo.  No way I'll be able to make something like that with this.

Fuck it, make everyone cats.  That'll do it.  Even the aliens:  small, medium, large, and extra-large.  They're, uhh, directed by a coven of witch-cats.  They're the Coven Cat Fleet.  Yeah.  And the human resistance relies on... Sergeant Scritches.  OK, so Sergeant Scritches goes off on this ring world, and he has to, like fight guys.  With a gun.  He can also use nunchuks, but they're terrible.  I don't know.  But he has to find a bunch of... hoops jump through, like... no, fuck it, just find the hoops and literally jump through them and magic happens.  That's enough to learn how to make the event happen, you can make it fancy later.

OK, so you travel ring world, you kill the Coven Cats, you find better nunchuks, and... I dunno, gain the ability to dual wield.  How can you heal?  Cats eat fish.  Mine for fish.  Wait, that's taken, isn't it?  Look, maybe he came up with that, but you can't copyright turning people into cats.  Or shooting barrels for lutefisk.

What'll I call it?  Something like Halo, but definitely not Halo.  Oh.  Oh, yeah.

Hula.

OK, so I made a little sketch:

A quick sketch after making a little mock-up of the original Halo box art.

I gave myself too much room just to write "Hoop-Jumping Revolved," so I added "It Done Did" and it just kinda stuck.  I played around more in GIMP, too.  I'm still in my finger-paint stage, but soon I'll have some nice, starry backgrounds to load my tilesets over...


Mm-mm.  That's some good GIMP practice, right there.

There was a point there where my screen looked like this:

Ingredients:  Kittens, Samus, Chief.  Put in blender.
Use "chop" setting for chunky, purée for smooth.

Before I get too far on this, though, I need to make a decision.  Green or orange?

Sgt. Scritches can dress for many occasions.

I mean, I like green and all.  But orange is the color of awesome.  Maybe if I make it darker?  I don't know.

Also, because I think everything needs a minimalist poster:

Saturday, February 18, 2012

Conversation with an Industry Insider!


Dear My Adoring Public,
This past week, I had a conversation with my friend Zach Lome, who is awesome and a really cool guy.  He has also worked on Real Life video games in the past, and lent me his insight during a conversation we had recently.  I'm sharing that insight with you, My Adoring Public, both for your benefit and so that I can remember it later.  Cheers!

T:  OK, so I accept that I will have to start everything over at least six times on this project.  But what would you recommend I learn more about first, now that I have the game running?  Should I build more world, work on combat, make menus and items, set levels…  If the whole team had to work on one thing at a time, what would they tackle first?

Z:  The first thing to tackle in game design is just that:  the design of the game.  Step one, write down (no programming!) how you want the mechanics to work.  Step two, create tools that let you implement your design.  Step three, use your tools to generate the scenario the user interacts with.  Step four, figure out whether or not the mechanics you designed are fun and engaging.  If you write a lot of flexibility in your game engine, you should be able to tweak variables and info without having to do a lot of extra coding.

T:  OK, I wrote two pages in Word about what I want there to be buttons for and how to interact with things, so that’s at least a start on the design document.  Step two is where you lose me, I have no idea how to get started on the “create tools” part, but step three is exactly what I want to do to those tools and I can picture a sort of tech demo in my head.  I’ll worry about step four after I have something at all functional.  I guess right now I need a clearer idea of what actual work I’m going to be doing in step two, so I know how much detail to use in step one.  What should I be Googling?

Z:  [REDACTED FOR GOVERNMENT SECRETS.]

T:  HOT CHA!

Z:  doo hoo hoo,hello hello!  This will be much easier. I can type faster and [REDACTED FOR PUBLIC HEALTH BENEFIT.] <_<


Z:  okay so when I said 'make tools' that's really more of a build-from-the-ground-up thing. Since you're using RPG Maker that's sort of… done already.  the problem is, I've never used RPG Maker, so I'm not entirely certain how much flexibility it offers in terms of implementing what you want.

T:  rpgtoolkit, actually. Those are two distinct things, it turns out.  I was surprised.

Z:  ah

T:  But yeah, they got forums and everything. And I see from having done the quick-start tutorial what sorts of things there are to do, I just have no idea what part of the game I want to make more of first.  But for when I do eventually make my own game-making engine, that's what I would be doing? Basically coding a program that enables me to edit the game?

Z:  so the way I would suggest doing it is pretty much what I texted: first, figure out how you want the game to be played. Determine every individual action a player can take (pick up an item, drop an item, fight a monster, use an ability on a monster, defeat a monster, recover loot from a monster, talk to an npc, hit an npc, flee from battle, exist in a cutscene, etc.)  Split things up into distinct sections of functionality — don't worry about story or art or music, but consider whether or not you'll need to do particular things with story or art or music (do you want a certain sound effect to be able to play when a text box pops up? make sure you have some way to do that).  And then what I do is just go from easiest to hardest in terms of functionality implementation.  So the easiest is having a guy that walks around.  But to do that there's gotta be the map, so you need to be able to generate a map.  So once you can make a map you have the guy walk around on it… what does walking entail?  There has to be input from the controls, animation, and probably a sound effect  once you have all of those implemented look at how you can extend it — collision detection for instance.

T:  OK. Wow. Crazy. OK, so make more land, make more mans, make more stuffs, make more menus. Yeah, I got the animation and was able to work the controls.

Z:  What kind of things can the user collide into?  Is there a difference between colliding with a wall and colliding with an NPC?  What does an NPC detail?  Let things spiral out of control naturally.  :)  Always focus on functionality though. if you've got a good list of what you want things to end up looking like then you won't suffer from feature bloat.

T:  Right on. OK, well I won't [CENSORED FOR EXTREME OBSCENITY.], but you've given me a lot to work on and think about. Thanks for your help!

Z:  S'all good :)    It's a bit harder in some ways when you're using an already-written toolkit, because you're limited by what the toolkit can do.  But it's also easier because you don't have to know C++ or C# and you don't have to write your OWN toolkits :)  

T:  Right.  I’ll do that later.  For now, I want to learn somebody else’s tools so that I have better ideas when I build my own.

Full Disclosure:  I sent an email to Zach, asking the following:
Dear Zachary,May I post our conversation from the other day to my blog?  I shall redact the parts about [REDACTED FOR PARENTALLY EMBARRASSING INFORMATION].  Well, one of them.  I'll censor the [CENSORED FOR ABSURDLY SPECIFIC PORNOGRAPHY].  For adult content, you see.
He replied:
Oh, absolutely! Feel free to take any ramblings I have and reprint them. You have my explicit permission unless otherwise stated by me during the course of the conversation to repost anything I say.
Feel free to print this out, laminate it, and frame it. As you do.

Friday, February 17, 2012

Day 5: Rocking Hard

I feel good about today.  I figured out some more about "if," "else," "elseif," and nested conditionals.  I doubled the size of the game world again - nay, more than doubled it, but I'm just going to keep track of how many times I double it since that time I said I wouldn't until 1,000 (or 1,024, to be precise).  The first couple days are easy, but those last few days?  Bite me.  Who wants to bet me on when I fall off the ball?  (Pro Tip:  I have pretty good control over when I fall off the ball... but it will probably be before 1,024 boards...)

To keep track, today I'm due for eight boards, and I have eleven.  So here is the whole game world, in all its glory:

I don't need to tell you guys to click for huge any more, do I?

I spent quite some time in GIMP, arranging all those screenies for you, my adoring public.  (Adoring!  ADORING, I SAY!)  Don't expect me to put that kind of effort in every time I've got a significant update - no, I made a separate layer for each board so that I can move all the pieces around like a game of Carcassonne, so updating the world with future boards will be easy as pie.  Which is actually kinda hard, if you ask me.  I mean, you need to make the crust, and have a tin or a baking dish that's at least vaguely pie-shaped, and you need your filling, then the top, and the top has to be pinched around to the crust (unless you're making one of those pies, in which case you can jolly well fuck off!), then you need to bake it at the right temperature for the right time which are interdependent variables, and when it's out it might have to sit...  But then you can eat that pie, and it is delicious.

A video game is a lot like a pie.  It has many pieces that come together into a delicious whole, unless it's a Zelda game for the CD-i, and it's hard to make one unless you know the whole process yourself or a faceless conglomerate hires you to do one monkey-stupid part day-in and day-out until you retire.  Not that I'm cynical or anything.

ANYWAY.  New features:

  • Trespassing upon the farmer's meager field of flowers now gives the option to fight him or converse with him.  Fighting results in the farmer's swift and sure surrender; conversation results in quickly smoothing things over.  (The farmer still complains of further trespasses, whether you trounce him or smooth-talk him.  Deal.)
  • That board (up in the game world) between the farmer's meager field of flowers and the road into the woods?  Yeah, that's the "plains," and it was always there - but in previous iterations it could only be accessed by travelling East from the road (because I didn't set up the board links right), and then you could go further East back to the farmer's meager field of flowers or West whence you came.  Now I know how the Lost Woods was made in the original Legend of Zelda game.  By extension, I now know how to make cube-world, knot-world, and even torus-world.  Inside or outside.  Because I have many skills and powers of a geometer.
  • The plains have their own music!  NOTHING ELSE DOES, except for the title and start screens.
  • Boards in all their 640x480 glory!  Plains 001, Forest 003, Forest 004, Forest 005, Forest 006, Forest 007, and Forest 008.


Bugs:

  • If you try to go from screen A into screen B where the "joint" would cause you to step over a collision vector on screen B (see figure 1), you just kinda... walk... off... into Never Never Land.  I need to not make this a feature of my own proprietary game making software, if I ever get around to doing that.



Figure 1:  Attempting to screen transition from any of the arrows results in travelling off-screen.
By now you should know that you can click for huge.  I'm not telling you any more.

I'll have a bonus "interview" with an industry insider over the weekend, then we'll see what I've done by Monday evening.  I'm thinking... umm... sprite sheets.  Or scenery tilesets.  Something artsy-fartsy to get my mind off of all this programming stuff.  Either that, or more behind-the-scenes programming, where it's easy to make boring progress which is difficult to sex up into an update.  Not that I'm cynical or anything.

Thursday, February 16, 2012

Day 4: When progress doesn't feel like progress...

...you write it down so you can see how far you've come later.

I changed the menu options while poking around in the "start" program.  I still have no clear idea of what it is about where I put that text which makes it begin a game, or why the "cursor" is a finger and not an arrow, or how I could change it to an arrow.  But eventually, I will be familiar with this.

Instead of "Test Game," the top left displays "Practice Makes Perfect."
Starting options now read differently.  Cursor is still a finger.
Click for huge!

Two more boards!  Game world doubled again!  You can even walk from the first one all the way to the last one.  Complete with collision and program vectors, which I can now program to do one thing once, and then do another thing, thanks to Occasionally_Correct's tutorial.  Behold, our meager flower field farmer complains not once, but twice at how the player doth trample upon his flow'ry field:

Click for huge!

Beyond the farmer's flower field, the entrance to the forest.

The road doesn't go very far in this direction...

I also figured out how to edit tilesets... and broke all my boards in the process.  But fixed them!  I also got in some good tutorials on Creating and Using a Sprite Base (six parts in there, so far).

There!  I feel much better, now.  A noob I was, and a noob I remain, but today I still made progress.

Things I still want to do:

  • Move message windows around the screen.
  • Display an image after beginning a new game (with the "start" program?).
  • Make text appear upon that image.
  • Make a message window pop up when appearing on the first board.
  • Make only one button close that window - otherwise the move keys close it!
  • Make the farmer move to the player as part of the trespass program.
  • Give the player the option to talk or initiate combat.
  • Make dialogue options.
  • Make combat.  (UGH.)
  • Make the farmer's door work.
  • Make the farmer's house interior work.
  • Add under vectors to trees.
  • ...something with layers.
It looks so big and scary like that.  And combat is going to blow up into like a million things.  Whatever, I'll still take it one step at a time.

Wednesday, February 15, 2012

Day 3: 100% game world growth!

Today I read more tutorials, but I'm still a ways from knowing how all the different pieces go together.  This was really, really helpful.  I seem to have my work cut out for me.  Surprise?

I did make progress, however!  I cracked open the "start" program, so I now have a slightly sharper idea of what's going on under the hood when I see this on the screen:
Click for huge!
And I even made it say my own thing when you pick "New Game"!

Click for huge!

I made vectors visible to ease testing.  When you collide with the mountains on the North side of the screen, you tell yourself not to go into the mountains.  You can also move with either the mouse or WASD (in eight directions!)

Click for huge!

And I made a whole second screen!  This DOUBLES the size of the game world!  There's even a farmer who complains if you trespass upon his meager field of flowers:

Click for huge!

Why, at this rate of growth, in only ten days I'll have a thousand game boards!  Give or take.  No promises.  Actually, that's not going to happen.

Still, slow and steady wins the race, as they say.  Whoever they are.

Tuesday, February 14, 2012

Day 2: It's alive! ALIVE!

Ha ha, I got it working!  And I feel like a super noob, too.  All I had to do was run toolkit3, the actual program, in administrator mode... and also run trans3 (which does the whole preview thing, from what I can gather) in administrator mode, and end the rundll process which was magically preventing toolkit3 from running my game through trans3.  I guess.  But after poking around the internet and trying fixes, that's the one that worked.

Rather than keep working on the jank-ass slightly-modified demo I was working on, I decided to do everything over more or less how I had done it before.  For practice, you see.  Things went a lot faster the second time through, and I made a few slight improvements as well.  I even got the NPC to ask for my name!  Check it out:

Click for huge!

OK, now that I know how to do all that... let's make MOAR GAEM!

Monday, February 13, 2012

Day 1: Minor Progress, Major Frustration

I feel more frustrated than I feel accomplished right now.  I know, in my head, that the frustration is temporary and the accomplishments are cumulative:  I learned the rudiments of scripting and how to program an event, and I technically have something that ought to be playable (but in a very "we're running the editor" sort of way). See, here's my starting board:


Click for huge!

But I had to qualify that statement about playability because I can't get the game to test.  The very helpful tutorial tells me to click the green arrow to test the game, and I click the green arrow to test the game... and nothing happens.  I tried making the game into an executable file, and it wouldn't run.  Or maybe it ran but did nothing (after several tries at double-clicking it, I found a bunch of processes running in the Task Manager that were suspiciously doing nothing).  Not even the demo game runs.

Y'know what?  Fuggit.  I learned how to script events, place interactable items (of which NPCs are a subset, apparently), and place the player starting location.  Getting something to run is tomorrow's task.  Let's hope my Google-Fu is strong enough...

Sunday, February 12, 2012

Day 0: Lots of Book Learning

It's about 10:30 now, I should be getting to bed soon.  So what have I accomplished today?  I've read many pages of text, and saved many files among various folders.  A whole lot of tedium in the actual doing of it, but it looks like a much more respectable list when I itemize it:

  • I learned how to make the "game" itself.
  • I learned how to make a "board" to walk around on.
  • I learned how to make "vectors" on the board which will denote collision areas.
  • I learned how to make walking animations for characters.
  • I started reading up on how to code scripted events.

That's... phew.  Four things done, and one thing started.


Only a bazillion to go!

So what kind of game will this be, anyway?

After poking around the internet and looking at different ways of making games, I've decided on how the game is going to be.  At least at first.  I had this naïve fantasy of creating a text-based adventure which involved into a text-based adventure with graphics which evolved into a turn-based RPG which blah blah blah, but that unsurprisingly turns out to be more trouble than it's worth.  To strike a balance between "hitting the ground running" and "learning video games from the ground up," I'm going to be using RPG Toolkit to create something that runs about like Chrono Trigger.  I figure that if a finished product ends up looking even that good, I'll be happy.  I'll also work on, ahem, "backwards compatibility" sometimes if I hit a brick wall, and maybe step back to text-based adventures if I'm unsure of how to move forward with my real project but I still want to learn something about video games that day.

OK, so the goals are:

  • A top-down 2-D RPG with turn-based battle mechanics.
  • Battles will take place "in the world" like Chrono Trigger (as opposed to having their own screens, like in Final Fantasy's SNES incarnations).
  • Main focus will be on story - how things go in the world based on how the player resolves conflicts.

This last point is probably the most defining feature of the game.  Sure, the player will be able to kill his/her way through the game; but the main character will pretty much be able to take combat for granted.  "Combat" itself I want to be just one of multiple ways to resolve conflicts; other ways would be avoiding conflict with stealth, or deterring it with crowd control (CC) effects.

To explain this with an example (half for you, half for me), let's say a soldier is standing guard to the drawbridge of the castle we need to enter.  The main character could certainly storm the gates by approaching the soldier with a weapon at the ready.  But a professional soldier might be able to kill one of the main character's companions before he was dispatched.  So the player may also choose to seek an alternate entrance, to attempt to bribe the guard, or - if negotiations break down and combat ensues anyway - to use CC on him for a couple turns until he doesn't feel like fighting any more.

But that's a little far off right now.  At first, I have a feeling I'll be concentrating on things like "can I walk in the world" and "does the man fall down when he has zero HP?"  That's just where I want things to go eventually, but I think I can use successive approximation to bridge just about every gap there is in between.

OK, let's warm up RPG Toolkit and see what kind of damage I can do!

Edit:  You guys, vectors are complicated.
So I fell asleep at my desk.  But I did learn how to make straight lines, and I also learned some basics. And I applied them to make this:



Not the greatest.  But it's something, and I learned it.  OK, on to other things, I've got a whole day ahead of me here!

Edit:  Ooh, just found this.  Reading time.

Double Edit:  That article confirmed a lot of what I had expected out of this project:

  • Making a game is difficult and complicated.
  • It will be awful at first.
  • It's doable as long as I apply myself and make regular incremental progress.

Saturday, February 11, 2012

Well, I've already found a beginner tutorial!  It's described as "somewhat rude. Perhaps the exact right frame of mind which to approach GIMP with though, at least the first few times," but it's probably exactly what I need at this level of noobishness.  Let's make some straight lines.

What's this about?

Dear The Internet,
I'm a bright guy. I catch on quick to things. I never quite manage to be the best at them, but I'm at least competent at anything I've set my mind to learn how to do. So... I wanna make a video game.

This video game is going to be terrible at first. Truly awful. But I shall learn with the internet and make it better and better, and document this gradual evolution in blog form, for all to see. I shall do all this because I have a plan, that plan is in terms of achievable commitments, and each step is something productive that I'll be able to care about.

So this is part introduction, part open letter to the public, part business plan, and part memo to myself. Monday through Friday, between 5 and 8 pm, I'm going to either look up something about video gamery, or I'm going to work on something related to my video game. Before midnight, I'll have a post up on this blog about what I learned and/or did. The going may be slow at first, but the progress will be cumulative and I'll be making it regularly. Every time I have something approximating a "level" or "chapter" or anything that has a clear beginning/middle/end, I'll find a way to make it available to the internet somehow or another. Even if I have to email it to people one at a time.

During the day Monday through Friday, I'm looking for a job. Whenever I get one, however long that takes, I'm going to reduce my output to Mondays and Fridays, giving me the work week to make one and the weekend to make one. I'll make more if I can, but I'll make at least two every week. If I'm not working on it twice a week, it's not my hobby any more and I've given up. The least I can do is wrap up what I did each time to publicly document my progress.

I'm also going to make what I call the Twenty Dollar Millionaire Promise. Until or unless I have a million dollars, anyone who gives me twenty dollars can have free access to all results of this project, except of course selling them to other people for your own profit. Unless you do work for me, I guess. Then you can totally have a share in how things come out, because you put your own creativity into it. Oh, but if you just give me advice in the comments or say, "You should do this, that, or the other," I'll take it as friendly advice freely given. Or constructive criticism, at the firmest. Any firmer and you're just being a dick, so please don't.

I'm going to have to put a warning on my front page about adult content, I guess. That will be priority number one. Then I'm going to look up how to make a video game: I've Googled it and have some promising-looking results. Anyway, selling "everything forever" for twenty bucks is a low entry point, which means I'll be selling bits and pieces of this game for even tinier amounts. If I can figure out how to set it up, I'll sell it for fifty cents when it's text-based. A dollar if I ever make it a side-scroller. Two dollars if I ever get it to the level of The Legend of Zelda: A Link to the Past. Let's see... five dollars if I get it to Doom-ish quality (that third dimension is a pain), but four if we only get to the Legend of Mana 21/2 -D phase. For ten dollars, you'll get something Morrowind-ish, I suppose, and if I can make something as expansive and detailed as Morrowind all by myself, then I'll be very happy with myself. After I make a million dollars, well, you'll probably have to pay retail price for a finished product. Because if I haven't made a finished product with a million dollars, then damn, what the Hell have I been doing?

So that's my plan. Wish me well, folks! I'm going to spend the rest of the weekend diving into this, and we'll see how things go between now and Monday.

- T