Tuesday, December 8, 2009

Pre-production and planning your program

In a perfect world, time is not equal money, and you could have all the time in the world to finish your programs or projects. Sadly that’s not the case.


Its interesting looking at the ways we are able to create our programs, but which way is more efficient? There are two common styles that I’ve run into, one called iterative design, and the waterfall process. I’m not gonna lie I had to Google waterfall process, because I couldn’t remember what the process was called with pre-production and planning actually required. I prefer the waterfall process because it seems far more organized, and I’ll explain why.


I think as students, we’ve all experienced iterative design, so I’ll get to that later. The proper waterfall process would include analyzing your problem, designing your solution, creating your solution, to testing, implementing, and maintenance. I believe I’m also missing a step in between there somewhere. What I like about following these steps is that you can try and eliminate every possibility, every solution for every problem, just by analyzing and planning. By the time you get to create your program, you should know roughly what you need to cover before you run into another problem. This is not to say that if you plan, everything will go smoothly, as I am probably the biggest walking example of Murphy’s Law (“Anything that can go wrong will go wrong”). The goal is to cover as much of the base as you can.

We can relate this all to the SYS366 class we have, where we learn about business use cases, systems use cases, and so forth. We are pushed to try and understand the “bigger picture” when it comes to our programs and such affecting the rest of the business. The most useful thing to extract from this is the use case specifications we make in order to define what a system has control over. We plan out what it does, what it has control over, who uses it, and what kind of data is used.


Not only do we need to understand what we’re doing, we should also have a timeline, because as stated before, time is money. Organizing “milestones” allow you to gauge the progress of your project come production time. Obviously you want to build up to a milestone, so you can set smaller deadlines that affect the completion of a major aspect. From there you can set bigger goals, like Alpha, Beta, Final, and Gold stages. Without good time management and risk management at this step, you increase the chances of your program/project to blow up in your face. Trust me; I’ve witnessed it more than once before already!

And while you’re at it, you should be documenting E V E R Y T H I N G! The analysis, the design, the scheduling… everything! Another important point is that the documents should be readily available to any team member at any time. It’s easy to lose yourself while you’re coding or working on some aspect of the project, and the documentation allows you to go back and look at your specifications and other information. In a previous post I mentioned a Technical Design Document(TDD). In game design, not only is there a TDD, there’s also a Game Design Document(GDD) amongst a lot of other different documents. The GDD essentially holds everything together, and defines every aspect of the game, from programming, to art direction, audio guidelines… everything. The TDD is also included here, and it should describe programming conventions, any equations needed, all classes and functions needed… and so forth. The one that I “created” for our OOP344 project only had some programming conventions we wanted to implement. Even though we didn’t really use it very much, it’s good practice to keep tract of things like that. We don’t use the document, but I transferred it to our wiki page for easier access.


(On a side, I just made a sandwich consisting of 3 pork sausages, 1 fried egg, a leaf of lettuce, mayonnaise, ketchup, and relish. De-li-cious.)


I guess to conclude, I wanted to point out that the advantage of using the waterfall process is the ability to organize and delegate tasks much easier. It allows team members access to resources and documentation, and also allows them to be focused more on implementing rather than worry about the details in the background. As mentioned earlier, it gives the entire project a more evenly flow and direction. On the other hand, without great risk and time management, running into problems could create a disaster and create huge setbacks. With the sort of planning going into a project, there isn’t too much room for change.

Wednesday, November 25, 2009

Template Classes and Errors Galore

So I've been trying to create a template classed linked list in order to help with the IO_TextEdit class. What I didn't realize was how much I don't fully understand when it comes to templates. Either way, I've been working through most of the smaller issues with my code, and I hit a wall. I ran into an LNK2019: Unresolved External Symbol. After a lot of research, I read that if you split your template into a .h (header) file and a .cpp file, you need to include the header file AND the .cpp file! I originally had it all in one header file, but realized how hard it was to read and understand the code, so I split it once again.

Now onto the rest of the errors...

Saturday, November 14, 2009

Long Time no Blog

Honestly, this blogging thing is hard. I can't keep up with it, and I never know what to write. Anyways the other day I decided to do up a document with all of my groups programming standards. We tried to define these in the very first meeting. Through a bit of arguing and what not, we decided on a couple base rules like the ANSI standard and what not. We also personalized it a bit, although I'm sure it can't be that different from other standards. Anyways, I called the document a Technical Design Document(TDD), because in my IADT days, that's what we made. Usually, a TDD would consist of the a short description of the project, the team members involved and their contact information, a detailed look at the standards, and practically everything else described, like classes, functions... the list goes on. It's supposed to be gigantic, and in good practice this document should be done in pre-production, before even the first line of code is written. It's a guideline essentially.

I put the TDD I made on our SVN, and I ported it all onto our wiki page. I noticed that you can't just copy and paste the darn thing from a word document, or it'll royally screw up the wiki. It adds this odd line above everything, and some of the regular tags for wiki don't work. BUT if you just save it, and then go back into edit, you can just delete the weird line at the top and go back to editing a wiki like you normally would.

A couple things I learned while writing the wiki:

= blah = - Heading 1
== blah == - Heading 2
=== blah === - Heading 3
[mailto: victor.vy.tran@gmail.com Email] - Adds an email link called Email that links to my email
<pre> </pre> - makes a block for code (Courier New, grey highlighting, extra spacing)

Thursday, October 22, 2009

Colour Me Impressed



It's been a couple weeks now and I've been kinda creeping this kid. I don't remember how I got to his videos but I'm glad I did. His name is Sungha Jung, and he's amazing playing the guitar. He's 12, and he started playing when he was 9 by choice. Now people around the world know of him because of his Youtube videos. By browsing his website, I found out that he's started to compose his own songs, not formally (on paper), but just through feel.

It's just impressive because he's young, he's great at what he does, and he's totally into it. By watching the videos you know he's in the zone when he's playing. I'm used to seeing kids that are forced by their parents to learn an instrument and they end up hating it, then regretting later on that they didn't continue with it *coughcoughmecough*. I think the biggest difference with Jung is that he chose to. Which is great for someone so young.

I just found out he has two-hundred-and-eleven videos posted on Youtube, all of him playing. And he's sponsored now. W o w.

Thursday, October 15, 2009

Assignment 1 ... Done!

Cooooool... So I couldn't figure out why my laptop (Running Windows 7 RC1) wouldn't allow me to use the bcc32 command in the prompt. I thought it was a Windows 7 problem. Then I looked closer to what I put into the Environment Variables under path. I had a SPACE between ; and C:\Borland...!

Anyways, I didn't think that I could actually change anything in the as1tester file, but I found out in class that I could fix it. Borland likes it when ever function that doesn't take in paramaters to have (void) in it. VCC doesn't care about that. If you fix all of those in your ciol.c and your as1tester.c, you still get warnings, but not enough to create an error. Just run as1tester.exe afterwards and you're good to go!

So, in Tester...
int Yes(void);

int welcome(void);
int test1(void);
int test2(void);
int test3(void);
int test4(void);
int test5(void);
int test6(void);
int test7(void);
int test8(void);
int test9(void);
int test10(void);

int main(void);


and in ciol.c:

void io_init(void)
void io_end(void)
void io_flush(void)
int io_getch(void)
int io_rows(void)
int io_cols(void)
void io_clrscr(void)


I didn't just change the prototypes, I changed it where the functions were defined as well, just to be sure. And there you have it!

Assignment 1 is AMAZING!

This post is far too long. No one's gonna read it and I know it!

A-mazing. Just look at the beauty of it. It's as if Picasso graced his paintbrush on this magnificent program! -Oh wait, it doesn't work? Shucks!

Finally I've been able to completely pass all the tests for Assignment 1 on Visual Studio. Just now I compiled on Linux or Matrix as well. Works fine. I had to make some dirty fixes here and there, but I'll try and clean it up tomorrow - Oh wait, it IS tomorrow...

I've been worrying incessantly about Co-op placements, my resume/cover letter, and interviews (the one I was most excited about was the one with RIM...), it's been feeling a bit cramped. Since I haven't really been active in posting on my blog (I'm still not used to it, but I should think of it like writing a much more detailed log sheet), I'm gonna run through a bunch of things I ran into since I started this assignment.


The code below is something I started off with in the io_edit function. It was being used to do editing when hitting characters, with insert mode on. Picture the text editor that you use or the email application you use to send out an email. By default on a Windows machine, typing would actually insert letters. To me this is natural, but it's something you have to think about when you're making a text editor from scratch like this.
Here's an example:

ABCD| EFGH.

If you hit a couple letters when your cursor(|) is after the D, you'd get:

ABCDKJL| EFGH.

To do that in a program, you'd have to break it down. The line you have with the text is stored in a string. If you tried to just insert something into a string, it wouldn't work. Later on we'd probably use a stack or queue structure but it's not available to us at this point. My first thought was to make a for loop that stored each element of the string into a backup string called "stored" (clever hunh?). Then later on I'd put it all back with another for loop, after inserting the character needed. Like so:

for (i = 0; i < fieldlen; i++){
stored[i] = str[*offset + *curpos + i];
}

str[*offset + *curpos] = key;

for (j = 0; j < fieldlen; j++){
str[*offset + *curpos + j] = stored[j];
}

After writing it, I realized that there's probably a more efficient way of doing this, but I couldn't think of it. Chi figured out a way. He decided to go backwards. Hunh. I totally didn't think of that. Basically what he did was shift each element one over, one by one, backwards, through a for loop. Cool stuff. It's more efficient because it eliminates an extra for loop!

for (i = maxdatalen; i < ((*curpos) + (*offset)); i--){
str[i] = str[i - 1];
}

I noticed a lot of people were having trouble with the pointers we were using like *offset and *curpos. I can't remember which sections of code people were using them for (I think it was the flags and whatnot), but they weren't using the little "*" so their values never updated. Some tried having some variables with and some without "*", and that threw the compiler off and gave a bunch of errors.

There was also something that was bothering me last week. A line in the Assignment 1 specifications for io_edit had a little line in italics that read:

If any of insertmode, curpos or offset is NULL then a local integer variable will be used instead. If local variables are used for any of insertmode, curpos, or offset, the default values will be 1, 0, and 0 respectively.

Nifty little line here. I remember trying to figure out how to do this, and I was ... actually it's almost 4AM and I really don't remember anything at this time of the day ... but yeah, I couldn't figure it out! I do remember struggling with it however. I knew that I needed local variables. So I set them: int i_mode, int c, int o (Yes, creative. I know.) But how do I actually get them to update?? A question for Fardad for sure. Good thing I asked. He pointed me into the direction of pointer use and how pointers point to the information stored(No pun intended - Oh who am I kidding?). If you use an "&", the pointer would then point to that variable's address! After a bit of tinkering to fully understand it, I came up with:

offset = &o;
curpos = &c;
insertmode = &i_mode;

Works perfectly!

Now, for the tests that we had to run, I realized that a lot of things weren't too clear. Especially with things like the ESCAPE key. The Escape key, if IsTextEditor is 1, should just set done = 1. If IsTextEditor is 1 however, your program needs to revert to the original state. Meaning everything you changed when you entered io_edit needs to be reset! I had to get someone from irc to help me out with that one. There were others but my tired eyes can't stay open and my brain isn't functioning either.

I also noticed on Istessema's blog as I was writing this has a peculiar error that I also ran into:

/tmp/ccbFpdaq.o: In function `io_display‘:
ciol.c:(.text+0×16b): undefined reference to `putch’
collect2: ld returned 1 exit status

The solution for this is to change the putch to io_putch. Simple as that. io_putch calls putch!

Anyways, right now I have to figure out Borland. It doesn't work at all. I remember someone saying that we had to change something with the includes (windows.h and conio.h)... but I couldn't remember what it was. I wish I logged stuff on irc. Also, I looked through the green book and I didn't find anything in there either. What I did find was on Denny's blog he pointed out that any function that didn't have any parameters had to have (void) in it. Else it would give more warnings. So I've cut all of those out of my ciol.c. And there's still more! So many more that my console window will not show it all despite me setting the buffer to 100 lines!! Here are the errors I caught(Best of all they're mostly in testmain which is provided to us!):

Warning W8065 testmain.c 122: Call to function 'test7' with no prototype in function main
Warning W8065 testmain.c 126: Call to function 'test8' with no prototype in function main
Warning W8065 testmain.c 129: Call to function 'test9' with no prototype in function main
Warning W8065 testmain.c 133: Call to function 'test10' with no prototype in function main
Warning W8065 testmain.c 140: Call to function 'io_clrscr' with no prototype in function main
Warning W8065 testmain.c 152: Call to function 'io_getch' with no prototype in function main
Warning W8065 testmain.c 153: Call to function 'io_end' with no prototype in function main
Warning W8004 testmain.c 72: 'ok' is assigned a value that is never used in function main
Warning W8065 testmain.c 171: Call to function 'io_clrscr' with no prototype in function test10
Warning W8065 testmain.c 182: Call to function 'io_getch' with no prototype in function test10
Warning W8065 testmain.c 184: Call to function 'io_clrscr' with no prototype in function test10
Warning W8065 testmain.c 186: Call to function 'Yes' with no prototype in function test10
Warning W8060 testmain.c 205: Possibly incorrect assignment in function resetStr
Warning W8065 testmain.c 290: Call to function 'io_getch' with no prototype in function pause
Warning W8065 testmain.c 301: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 314: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 328: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 343: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 357: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 371: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 385: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 399: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 413: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 427: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 442: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 450: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 457: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 465: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 472: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 480: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 487: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 495: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 502: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 510: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 517: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 525: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 527: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 529: Call to function 'io_getch' with no prototype in function test9
Warning W8065 testmain.c 536: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 551: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 565: Call to function 'io_clrscr' with no prototype in function test9
Warning W8065 testmain.c 580: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 588: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 595: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 603: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 610: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 618: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 625: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 633: 'jump' is assigned a value that is never used in function test9
Warning W8065 testmain.c 640: Call to function 'io_clrscr' with no prototype in function test9
Warning W8004 testmain.c 648: 'jump' is assigned a value that is never used in function test9
Warning W8004 testmain.c 299: 'ok' is assigned a value that is never used in function test9
Warning W8065 testmain.c 661: Call to function 'io_clrscr' with no prototype in function test8
Warning W8065 testmain.c 701: Call to function 'Yes' with no prototype in function test8
Warning W8065 testmain.c 709: Call to function 'io_clrscr' with no prototype in function test7
Warning W8065 testmain.c 749: Call to function 'Yes' with no prototype in function test7
Warning W8065 testmain.c 758: Call to function 'io_clrscr' with no prototype in function test6
Warning W8065 testmain.c 795: Call to function 'Yes' with no prototype in function test6
Warning W8065 testmain.c 799: Call to function 'io_clrscr' with no prototype in function test5
Warning W8065 testmain.c 808: Call to function 'io_rows' with no prototype in function test5
Warning W8065 testmain.c 811: Call to function 'Yes' with no prototype in function test5
Warning W8065 testmain.c 815: Call to function 'io_clrscr' with no prototype in function test4
Warning W8065 testmain.c 824: Call to function 'io_rows' with no prototype in function test4
Warning W8065 testmain.c 827: Call to function 'Yes' with no prototype in function test4
Warning W8065 testmain.c 832: Call to function 'io_clrscr' with no prototype in function test3
Warning W8065 testmain.c 869: Call to function 'io_rows' with no prototype in function test3
Warning W8065 testmain.c 870: Call to function 'Yes' with no prototype in function test3
Warning W8065 testmain.c 880: Call to function 'io_clrscr' with no prototype in function test2
Warning W8065 testmain.c 884: Call to function 'io_getch' with no prototype in function test2
Warning W8065 testmain.c 885: Call to function 'io_clrscr' with no prototype in function test2
Warning W8065 testmain.c 889: Call to function 'io_getch' with no prototype in function test2
Warning W8065 testmain.c 894: Call to function 'io_rows' with no prototype in function test2
Warning W8065 testmain.c 894: Call to function 'io_cols' with no prototype in function test2
Warning W8065 testmain.c 909: Call to function 'io_cols' with no prototype in function test2
Warning W8065 testmain.c 909: Call to function 'io_rows' with no prototype in function test2
Warning W8065 testmain.c 933: Call to function 'io_clrscr' with no prototype in function test2
Warning W8065 testmain.c 937: Call to function 'Yes' with no prototype in function test2
Warning W8004 testmain.c 884: 'key' is assigned a value that is never used in function test2
Warning W8065 testmain.c 942: Call to function 'io_clrscr' with no prototype in function test1
Warning W8065 testmain.c 949: Call to function 'io_rows' with no prototype in function test1
Warning W8065 testmain.c 951: Call to function 'io_cols' with no prototype in function test1
Warning W8065 testmain.c 953: Call to function 'io_rows' with no prototype in function test1
Warning W8065 testmain.c 953: Call to function 'io_cols' with no prototype in function test1
Warning W8065 testmain.c 955: Call to function 'Yes' with no prototype in function test1
Warning W8065 testmain.c 961: Call to function 'io_clrscr' with no prototype in function welcome
Warning W8065 testmain.c 971: Call to function 'Yes' with no prototype in function welcome
Warning W8065 testmain.c 977: Call to function 'io_getch' with no prototype in function Yes
Warning W8065 testmain.c 982: Call to function 'io_getch' with no prototype in function Escape
Error E2228 testmain.c 982: Too many error or warning messages in function Escape
*** 1 errors in Compile ***
ciol.c:
Warning W8065 ciol.c 177: Call to function 'io_clrscr' with no prototype in function io_end
Warning W8019 ciol.c 352: Code has no effect in function io_edit
Warning W8004 ciol.c 290: 'len' is assigned a value that is never used in function io_edit
Warning W8004 ciol.c 286: 'i' is assigned a value that is never used in function io_edit
Warning W8004 ciol.c 604: 'i' is assigned a value that is never used in function io_displayMenuItem
Warning W8057 ciol.c 666: Parameter 'format' is never used in function io_menuItem
Warning W8057 ciol.c 666: Parameter 'len' is never used in function io_menuItem

Saturday, September 26, 2009

io_display Challenge

So the new challenge posted here asks us to try and cut the io_display function down to a single line. I've been staring at the original code for a while now, and I don't quite see a logical way to shrink it. Sure I could use "?" to replace the if statements and what not, but what is the benefit of doing such a thing? It makes the code much harder to read and understand, and as Fardad explained in class, using "?" and such doesn't optimize the code, it just makes it shorter.

So then I started thinking pointers, and the pointing to pointers thing we just learned about in Thursday's class. I took a look at the str pointer, and two functions used in io_display(io_putstr and io_putch). I thought of eliminating the use of io_putstr and replacing it with something like **str = *str, but totally forgot that the function passes in a const char* and cannot be modified for the sole purpose that I'm trying to display, not change the actual variable. Then I thought, "What's the point of doing this?" I'm not shortening the code in this approach at all. The io_putstr and io_putch call up their respective functions to make it work, so there's no real point in eliminating the use of a function!

I also thought about declaring the int i in the for loop used, but I remembered this must be in C, not C++, and I also realized that there were two for loops dependent on the same value of i.

What I DID notice, however, was that I could eliminate the second for loop by including just using an if (?) while figuring out whether you want a character to be printed to the screen or a space. Other than that, here's my code. I tried making the if...else statement using "?" but it wouldn't let me put the for loop and the int i portion in it. Oh well, here's my code, and no, I didn't put it all on one line to make it ridiculously hard to read!

void io_display(const char *str, int row, int col, int len){
  io_move(row, col);
  if(len <= 0)
   io_putstr(str);
  else{
   int i;
   for(i=0;i<len;i++){
    io_putch(str[i] ? str[i] : ' ');
   }
  }
}

Monday, September 21, 2009

Challenge #1

***Originally posted on the 19th***

Challenge: write this function without using any library functions; void GetInt(char *strint, int val); this function gets an integer value and converts it to a string ("strint")

Here is my solution to the challenge posted here. I've solved it for when the integer is a single digit.

void GetInt(char *strint, int val);

int main(){
char c;
int val = 1;
GetInt(&c, val);
printf("%c %d\n", c, val);
}

void GetInt(char *strint, int val){
*strint = val + '0';
}

To explain, we learned in OOP244 that to convert a string to an integer for the ISBN to be validated, we needed to subtract a zero character ('0'), from the string. I haven't looked at anyone's code yet, but I think this is the shortest way to do this.

Edit:

I'm trying to go with the simplest route here. The current strategy is to break down the number from the ten thousands place to the ones place, and put it back into the c-style string.

void GetInt(char *strint, int val){
strint[0] = val / 10000 + '0';
strint[1] = (val % 10000) / 1000 + '0';
strint[2] = (val % 1000) / 100 + '0';
strint[3] = (val % 100) / 10 + '0';
strint[4] = (val % 10) + '0';
printf("%c%c%c%c%c", strint[0], strint[1], strint[2], strint[3], strint[4]);
}


I'm building this in VC++, and currently I'm getting an error: Run-time Check Error #2: Stack around the variable 'c' was corrupted. You can see my main() above. I couldn't quite figure it out. Now, if I were to take out the strint[4] line, the code seems to work. There's also probably a cleaner solution out there, and I'll check it out after I get back from work tonight.

Edit 2:

This is my current code, I've sort of given up on changing a number with more that 4 digits. Chi mentions here that I suggested typecasting. I tried it out, and it seems like it only works for single digits, like my first solution. It's literallly one line,
*strint = (char)val;

Anyways, my solution is below. Probably not the best way to do it.

void GetInt(char *strint, int val){
strint[0] = (val % 10000) / 1000 + '0';
strint[1] = (val % 1000) / 100 + '0';
strint[2] = (val % 100) / 10 + '0';
strint[3] = (val % 10) + '0';
printf("%c%c%c%c%c", strint[0], strint[1], strint[2], strint[3]);
}

Edit 3:

Ok, so I figured out my problem. When I initialized c, I didn't make it an array to store everything, therefore creating my stack error. Here's the full solution for up to a 5-digit integer, because maximum for an int by default is 5 digits.

int main(){
char* c[5];
int val = 17288;
GetInt(&c, val);
printf("%s", c);
}

void GetInt(char *strint, int val){
strint[0] = val / 10000 + '0';
strint[1] = (val % 10000) / 1000 + '0';
strint[2] = (val % 1000) / 100 + '0';
strint[3] = (val % 100) / 10 + '0';
strint[4] = (val % 10) + '0';
strint[5] = '\0';
}

Tuesday, September 8, 2009

PS3 Braid Theme by Non-Other-Than-Myself



Download this theme here. (On the PS3 Browser, press triangle on the link and go down to File>Save Target As)

So much for doing nothing! Here's a release of the Braid theme I've been working on. It took me about 5 days of thinking and doing. It wasn't as hard as I thought it'd be to be honest. This theme includes:

- Backgrounds from Worlds 2, 4, 5, 6 and the title screen (3 was bright yellow and I cut it out because it made reading text a tad on the uncomfortable side)
- Sound effects from the in game menu in Braid
- Icons from the Braid world, most of which I edited to fit the theme. Most of the icons beneath the main ones are not from the game, but are from the basic PS3 theme made to fit.

Overall I'm pretty happy with this. My still-new PS3 Slim is donning this Braid theme with pride. Here's to Braid coming to the PS3.

Oh, below is a video walkthrough of the theme in action. Mind you I took this video with my Pentax S60, which is 6.0MP and it doesn't do the theme justice, but what can you do? That's right! Give me a new one Absolutely nothing!

Blog is Up!

Finally! After all of f-i-v-e whole minutes it took to create this blog, it's finally up! Phew, what a relief!

I guess this blog is to keep track of my daily doings, especially when it comes to programming.

Now I can go on to doing... absolutely nothing!