Wii SpaceBubble 0.94

This evening SpaceBubble 0.94 is released by PlaatSoft. The following changes were made:

17-02-2010 Version 0.94
GUI:
– Improve game settings screen.
– Added donate screen.
– Update main menu screen information.
– Improve bubble graphics.
Core:
– Extend user name from 3 to 6 characters.
– Default user name is based on Wii nickname.
– Increase http buffer size from 8kb to 10kb.
General:
– Added source code to Google Code Repository
– Added source code documentation (Javadoc style).
– Added Doxygen (automatic documentation generation tool) config file.
– Build game with devkitPPC r19 compiler.

Download

Click here for more information and the download link.

Wii RedSquare 0.95

This evening RedSquare 0.95 for Nintendo Wii is released by PlaatSoft. The following changes were made:

11-02-2010 Version 0.95
GUI:
– Added Wii DVD light effects to game.
– Improve game settings screen.
– Added donate screen.
– Added scrollbar to highscore and release notes screens.
– The 100ste highest local scores are showed.
– The 40ste highest today and global high scores are showed.
– Added to most screens network status information.
Core:
– Extend user name from 3 to 6 characters.
– Default user name is based on Wii nickname.
– Increase http buffer size from 8kb to 10kb.
– Bug fix: Http thread memory cleanup was not correctly executed.
General:
– Added source code to Google Code repository.
– Added source code documentation (Javadoc style).
– With the doxygen tool the documentation can be generated.
– Build game with devkitPPC r19 compiler.

If anybody has a good idea how to improve this game, please post a comment

Wii TowerDefense 0.94

PlaatSoft has released TowerDefense v0.94. The following changes were made:

05-02-2010 Version 0.94
GUI:
– Improve video initialization.
– Overall FPS has improved 50 percent. Thanks Crayon.
– Lots of other small GUI changes.
Core:
– Mixed the weapon fire mode a little bit more!
– Nuke is 500 dollar cheaper!
– Increase http buffer size to 10Kb.
General:
– Added inline source code remarks in javadoc style.
– Use Doxygen (windows tool) to create HTML source code documentation.
– Use GrrLib 4.2.1 BETA library (Now native FreeType support available).
– Build game with devkitPPC r19 compiler.

Download

Click here for more information and the download link.

Wii KnightsQuest 0.1

Hello everybody,

Because TowerDefense is almost finished i have started a new project. This week I have decided to create KnightsQuest. KnightsQuest is a strategic game. The goal is to build up an empire and destroy all other kingdoms. If you have conquered the hole world you have won. The graphics engine will be based on the GRRLIB library. I hope that round the summer holidays the first beta release will be available.

04-02-2010 Version 0.1

  • GUI:
    • General GUI basis.
  • Core:
    • Use GRRLIB 4.2.1 (beta) as graphical render engine.
    • Use libfat v1.0.6 as disk access engine
    • Use libmxml v2.6 library as xml engine
    • Use libogc v1.8.0 library as Wii interface engine
  • General:
    • Started programming in C++.
    • Setup basic directory structure for new project.
    • Store source code in Google code SVN repository.
    • Build game with devkitPPC r19 compiler.

    Download

    Click here for more information and the download link.

Wii firmware upgrade 3.0e->4.2e

This evening I have upgraded my friends Wii firmware from version 3.0e to 4.2e. Before I upgraded the Wii firmware I first installed the Homebrew channel (1.0.6) and hidden DVDx channel with the Bannerbomb exploit. This hack is really easy. It took my only 5 minutes to complete all steps. After that I successful upgraded the Wii firmware to 4.2e and installed all (new) available Nintendo channels through the Wii shopping channel. This took about 45 minutes.

Conclusion: Installing the Homebrew and DVDx channel was never so easy. I hope lots of other Wii owners will upgrade there Wii and will explore the world of free Homebrew software. 😀

Source code documentation

Latest week I have added to all my Wii projects extra source code documentation based on javadoc notation style. With doxygen (Doxygen is a documentation system for C++, C, Java, Objective-C, and lots of other programming languages) i have created HTML documentation. This documentation is added to the Google SVN repositories. I hope this will help you to understand the source code better.

Ohloh membership

Hi, As you maybe already notest i have joined the Ohloh community. Some kind of Facebook community for open source projects. Most large open source projects (for example Firefox, Gcc, Bash, subversion, Apache, etc.) have joined this great community. It would be really nice that you give me some credits for my work in this community. So if you like the developed software, join the ohloh community and click on the “I USE THIS” button located on the detail project pages. 😆

Many thanks in advance.

Wii TowerDefense 0.93

PlaatSoft has released TowerDefense v0.93. The following changes were made:

22-01-2010 Version 0.93
GUI:
– Added weapon fire mode information on weapon help screen.
– Improve weapon reload delay initialisation.
– Added donate screen.
– Bugfix: Weapon fire sprites were 22 degree misaligned.
Core:
– Introduce different weapon fire modes.
– Fire at enemy in range nearest to base (Gun / Rifle)
– Fire at enemy in range with highest energy level (Cannon / Missile)
– Fire at fastest enemy in range (Laser / Nuke)
– Rebalance weapon specifications. Mix features more!
– Optimised some draw methods for beter performance. Thanks Crayon.
General:
– Build game with devkitPPC r19 compiler.

Wii TowerDefense 0.92

PlaatSoft has released TowerDefense v0.92. The following changes were made:

16-01-2010 Version 0.92
GUI:
– Added 6 animated weapons. Thanks Applicant!
– Improve enemy animated sprite frame sequence.
– Improve help and level select screens.
– Lots of other small changes.
Core:
– Weapons now fire on strongest enemy in range.
– Increase bonus money when wave is cleared.
– Increase initial weapon power.
– Decrease weapon prices.
– Added weapon sell functionality with minus button.
– User initials are now default based on Wii nickname.
– Bugfix: Monsters can not be shooted before launch.
– Build game with devkitPPC r19 compiler.

GRRLIB 4.2.X Freetype support

In this post i have add information how to add freetype library support to the GRRLIB 4.2.X library

GRRLIB_free_print.h

void GRRLIB_InitFreetype();

void GRRLIB_initTexture(void);

void GRRLIB_Printf2(	int x, 
							int y, 
							const char *string, 
							unsigned int fontSize, 
							int color); 

GRRLIB_texImg* GRRLIB_GetTexture(void);

GRRLIB_free_print.c

#include <malloc.h>
#include <stdarg.h>
#include <stdio.h>

#include <grrlib.h>

#include <ft2build.h> /* I presume you have freetype for the Wii installed */
#include FT_FREETYPE_H

#include "font_ttf.h"

static FT_Library ftLibrary;
static FT_Face ftFace;

void *fontTempLayer=NULL;
void *fontTexture=NULL;
GRRLIB_texImg image;

extern  Mtx                  GXmodelView2D;

/* Static function prototypes */
static void BitmapTo4x4RGBA(const unsigned char *src, void *dst, const unsigned int width, const unsigned int height);
static bool BlitGlyph(FT_Bitmap *bitmap, int offset, int top, int color) ;

void GRRLIB_InitFreetype(void) 
{
	unsigned int error = FT_Init_FreeType(&ftLibrary);
	if (error) 
	{
		exit(0);
	}

	error = FT_New_Memory_Face(ftLibrary, font_ttf, font_ttf_size, 0, &ftFace);
	if (error == FT_Err_Unknown_File_Format) 
	{
		exit(0);
	} 
	else if (error) 
	{
		/* Some other error */
		exit(0);
	}
}

void GRRLIB_initTexture(void)
{
   // Clear previous video frame buffer
   if (fontTexture!=NULL) free(fontTexture);

   fontTempLayer = (void*) calloc(1, 640 * 528 * 4);

   if (fontTempLayer == NULL) 
   {
	  /* Oops! Something went wrong! */
	  exit(0);
   }
}

void GRRLIB_Printf2(int x, int y, const char *string, unsigned int fontSize, int color) 
{
	unsigned int error = 0;
	int penX = 0;
	int penY = fontSize;
	FT_GlyphSlot slot = ftFace->glyph;
	FT_UInt glyphIndex = 0;
	FT_UInt previousGlyph = 0;
	FT_Bool hasKerning = FT_HAS_KERNING(ftFace);

    error = FT_Set_Pixel_Sizes(ftFace, 0, fontSize);
	if (error) 
	{
		/* Failed to set the font size to the requested size. 
		 * You probably should set a default size or something. 
		 * I'll leave that up to the reader. */
		 FT_Set_Pixel_Sizes(ftFace, 0, 12);
	}
	
	/* Convert the string to UTF32 */
	size_t length = strlen(string);
	wchar_t *utf32 = (wchar_t*)malloc(length * sizeof(wchar_t)); 
	length = mbstowcs(utf32, string, length);
	
	/* Loop over each character, drawing it on to the 4, until the 
	 * end of the string is reached, or until the pixel width is too wide */
	unsigned int loop = 0;
	for (loop = 0; loop < length; ++loop)
    {
		glyphIndex = FT_Get_Char_Index(ftFace, utf32[ loop ]);
		
		/* To the best of my knowledge, none of the other freetype 
		 * implementations use kerning, so my method ends up looking
		 * slightly better :) */
		if (hasKerning && previousGlyph && glyphIndex) 
		{
			FT_Vector delta;
			FT_Get_Kerning(ftFace, previousGlyph, glyphIndex, FT_KERNING_DEFAULT, &delta);
			penX += delta.x >> 6;
		}
	
		error = FT_Load_Glyph(ftFace, glyphIndex, FT_LOAD_RENDER);
		if (error)
        {
			/* Whoops, something went wrong trying to load the glyph 
			 * for this character... you should handle this better */
			continue;
		}
	
		if (BlitGlyph(&slot->bitmap, penX + slot->bitmap_left+x, penY - slot->bitmap_top+y, color) == true) 
		{
			/* The glyph was successfully blitted to the buffer, move the pen forwards */
			penX += slot->advance.x >> 6;
			previousGlyph = glyphIndex;
		} 
		else 
		{
			/* BlitGlyph returned false, the line must be full */
			free(utf32);
			return;
		}
	}

	free(utf32);
}

/* Returns true if the character was draw on to the buffer, false if otherwise */
bool BlitGlyph(FT_Bitmap *bitmap, int offset, int top, int color) 
{
	int bitmapWidth = bitmap->width;
	int bitmapHeight = bitmap->rows;

	if (offset + bitmapWidth > 640) 
	{
		/* Drawing this character would over run the buffer, so don't draw it */
		return false;
	}

	/* Draw the glyph onto the buffer, blitting from the bottom up */
	/* CREDIT: Derived from a function by DragonMinded */
	unsigned char *p = fontTempLayer;
	unsigned int y = 0;
	for (y = 0; y < bitmapHeight; ++y) 
	{
		int sywidth = y * bitmapWidth;
		int dywidth = (y + top) * 640;

		unsigned int column = 0;
		for (column = 0; column < bitmapWidth; ++column)
        {
			unsigned int srcloc = column + sywidth;
			unsigned int dstloc = ((column + offset) + dywidth) << 2;
			
			/* Copy the alpha value for this pixel into the texture buffer */
			p[ dstloc + 0 ] = (color & 0xff);
			p[ dstloc + 1 ] = ((color >> 8) & 0xff);
			p[ dstloc + 2 ] = ((color >> 16) & 0xff);
			p[ dstloc + 3 ] = (bitmap->buffer[ srcloc ]);
		}
	}
	
	return true;
}

/* Render the text string to a 4x4RGBA texture, return a pointer to this texture */
GRRLIB_texImg* GRRLIB_GetTexture(void) 
{
	/* Create a new buffer, this time to hold the final texture 
	 * in a format suitable for the Wii */
	fontTexture = memalign(32, 640 * 528 * 4);

	/* Convert the RGBA temp buffer to a format usuable by GX */
	BitmapTo4x4RGBA(fontTempLayer, fontTexture, 640, 528);
	DCFlushRange(fontTexture, 640 * 528 * 4);

	/* The temp buffer is no longer required */
	free(fontTempLayer);
	image.data=fontTexture;
	image.w=640;
	image.h=528;
	
	return &image;
}

void BitmapTo4x4RGBA(const unsigned char *src, void *dst, const unsigned int width, const unsigned int height)
{
	unsigned int block = 0;
	unsigned int i = 0;
	unsigned int c = 0;
	unsigned int ar = 0;
	unsigned int gb = 0;
	unsigned char *p = (unsigned char*)dst;

	for (block = 0; block < height; block += 4) {
		for (i = 0; i < width; i += 4) {
			/* Alpha and Red */
			for (c = 0; c < 4; ++c) {
				for (ar = 0; ar < 4; ++ar) {
					/* Alpha pixels */
					*p++ = src[(((i + ar) + ((block + c) * width)) * 4) + 3];
					/* Red pixels */	
					*p++ = src[((i + ar) + ((block + c) * width)) * 4];
				}
			}
			
			/* Green and Blue */
			for (c = 0; c < 4; ++c) {
				for (gb = 0; gb < 4; ++gb) {
					/* Green pixels */
					*p++ = src[(((i + gb) + ((block + c) * width)) * 4) + 1];
					/* Blue pixels */
					*p++ = src[(((i + gb) + ((block + c) * width)) * 4) + 2];
				}
			}
		} /* i */
	} /* block */
}

Wii trace module

To debug better a Wii application / game i have created a trace C++ module with is logging trace event to file. Please checkout the following code. I hope it benefit someone!

trace.h

#ifndef TRACE_H
#define TRACE_H

class Trace
{
  private:
	FILE * fp;
	char * getDate();

  public:
  	// Constructor & Destructor
	Trace();
 	~Trace();
	
	// Methodes
	int open(const char *filename);
	int event( const char *functionName, int threadNr, const char *event, ...);
	int eventRaw( char character);
	int close();
};

#endif

trace.cpp

#include <stdio.h>
#include <gccore.h>
#include <ogcsys.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ogcsys.h>
#include <stdarg.h>
#include <time.h>

#include "trace.h"

// Enable / Disable trace file functionality
bool traceOn = false;

// ------------------------------
// Constructor
// ------------------------------

Trace::Trace()
{
	fp=NULL;
}

// ------------------------------
// Destructor
// ------------------------------

Trace::~Trace()
{
  close();
}

// ------------------------------
// Methods
// ------------------------------

// Open trace file
int Trace::open(const char *filename)
{
   int returnValue=0;
   
   if (!traceOn) return -1;
         
   if((fp=fopen(filename, "wb"))==NULL) 
   {
      printf("Error: Cannot open trace file.\n");
      returnValue=-2;
   }   
   return returnValue;
}


// Close trace file
int Trace::close()
{
   int returnValue=0;
   
   if (fp!=NULL)
   {
       fclose(fp);
   }	
   return returnValue;
}


// Create trace timestamp
char * Trace::getDate()
{
  struct tm *now = NULL;
  time_t time_value = 0;
  static char buf[ 128 ] ;
  
  // Clear memory  
  memset(buf, sizeof(buf), 0x00);
  
  /* Get time value */
  time_value = time(NULL);          
  
  /* Get time and date structure */
  now = localtime(&time_value);     

  // Create time stamp
  sprintf(buf,"%02d-%02d-%04d %02d:%02d:%02d",
	now->tm_mday, now->tm_mon+1, now->tm_year+1900, 
	now->tm_hour,now->tm_min,now->tm_sec);
	
  return buf;
}

// Save trace event in trace file
int Trace::event( const char *functionName, int threadNr, const char *event, ...)
{
   int returnValue=0;
   char buf[ MAX_LEN ];
   
   // Clear memory  
   memset(buf, MAX_LEN, 0x00);
   
   if (!traceOn) return -1;
   
   // Expend event string
   va_list list;
   va_start(list, event );
   vsprintf(buf, event, list);
   
   if (fp!=NULL)
   {
      // Save string to file
	  fprintf(fp,"%s [thread%d-%s] %s\n",getDate(), threadNr, functionName, buf); 
	  fflush(fp); 
   }
   
   return returnValue;
}


// Save trace event in trace file
int Trace::eventRaw( char character)
{
   int returnValue=0;
   
   if (!traceOn) return -1;
     
   if (fp!=NULL)
   {
      // Save string to file
	  fprintf(fp,"%c",character); 
	  fflush(fp); 
   }
   
   return returnValue;
}

Wii RedSquare 0.94

This evening RedSquare 0.94 for Nitendo Wii is released by PlaatSoft. The following changes were made:

11-01-2010 Version 0.94
– Added improve score calculation.
– Added extra help screen.
– Improve webservice call to store high score.
– Added support for 60HZ (640×480) TV mode.
– Use libogc 1.8.1 library as Wii interface engine.
– Use GRRLIB v4.2.0 as graphical engine.
– Build game with devkitPPC r19 compiler.

If anybody has a good idea how to improve this game, please post a comment

Wii TowerDefense 0.91

PlaatSoft has released TowerDefense v0.91. The following changes were made:

09-01-2010 Version 0.91
GUI:
– Added 25 animated enemy sprites. Thanks Applicant!
– Added game setting screen.
– Added intro screen 3
– Improve winter theme sprites.
– Improve first help screen.
– Improve main menu screen.
– Lots of other small GUI changes.
Core:
– Make game harder to play!
– Less start money.
– Enemy minimum / maximum speed depend on wave nr.
– Increase weapon prices.
– Increase maximum concurrent monsters in action.
– Decrease weapons effective range.
– Build game with devkitPPC r19 compiler.

Wii SpaceBubble 0.93

This evening SpaceBubble 0.93 is released by PlaatSoft. The following changes were made:

08-01-2010 Version 0.93
– Improve main menu screen.
– Added 60Hz (640×480) TV Mode support.
– Increase local highscore list to maximum 100 entries.
– Store current game score in highscore area also when game is quited.
– Added extra help screen with WiiMote control information.
– Use GRRLIB v4.2.0 library as graphical engine.
– Use libogc v1.8.1 library as Wii interface engine.
– Build game with devkitPPC r19 compiler.

If anybody has a good idea how to improve this game, please post a comment

Progress report TowerDefense

Hi everybody, Here a small update about the continues development of TowerDefense. On this moment Appliciant is designing new animated enemy and weapon sprites for the game. If all the enemies and weapons are ready i will bring out the next major release. To give your some idea were it is going too, check out the following art drawing. In the mean time if there are any bugs or new ideas please post them below!

Wii TowerDefense 0.90

PlaatSoft has released TowerDefense v0.90. The following changes were made:

02-01-2010 Version 0.90
GUI:
– Improve background images.
– Remove some english typos.
– Improve first intro screen.
– Added WiiMote control help screen.
Core:
– Improve first music track.
– Enable B button for faster building.
– Enable left and right button for faster weapon type selection.
– Build game with devkitPPC r19 compiler.