When I am designing and creating and programming a game. I tend to find that it takes a really long time. Yes, I am only doing this in my spare time, and yes when I am drained after a day at work I am unable to code. Still I really want to try and get 4 games out a year. That doesn't seem too much to ask does it?
So instead of keep fighting this losing battle I have with games taking more time than I want (no, I won't rush them or release them when they are not ready!). I have decided to adjust my course a little. It is a sensible decision really. I still want to do 4 games, but what if I make every other game an App or simple game. A game that has very low graphic intensity (I find anything with graphics makes it take twice as long to develop).
So from now on I am going to try this new theory out. Which will give me approximately 6 months per real game and overlay those with two small games/apps.
Brilliant eh!
Laters
Da Voodoochief
Friday, September 27, 2013
Wednesday, September 25, 2013
Don't Hide ya IAP
I read this article the other day on Gamasutra called 'Make Purchasing Present' by Ethan Levy. I found it to be obvious and also revealing. It was obvious that all the shops you ever go in try to show you their wares, as that is how they exist. Selling you stuff allows them to continue in business. They are not shy about selling you stuff, and they should be. The same goes for IAP in my humble opinion.
What was revealing was the way I felt about the IAP. In some ways putting it on the back shelf. Not exactly hidden, but no fanfare or billboards were around it either. I really think I felt a little embarrassed by the fact I had IAP in my game. Well no more, this game has been designed with the idea of IAP for cosmetic changes to the game and a quicker way to purchase all the in game ship upgrades. I am not going to be embarrassed that people are so used to free that they don't even want to spend a measly 1 freakin dollar to purchase my game. So if this is the way it is, then so be it. I will offer what I believe to be great value per item and then let the public decided on it's value or not, with their wallets, like in a real shop.
So after reading this article my mind is changed and I think in a good way. All you blanket nay sayers on IAP can just keep on bleating, but in the end you are going to have to deal with the way the world in selling games is changing, well has been changing for several years now. So for me, I am stepping forward the best way I feel I can, and will try to do my best for making enough money to cover this games costs, or maybe the next one, meanwhile giving good value to my customers.
I will also add banners, not intrusive per say, but at the end of a level I will display the odd quick buy banner for the player to see that this stuff exists and YES, you can buy it if you want. I feel it is a little like the displays at the counters of the local Vons. Hopefully I can sell some of my Candy :)
Laters
Da Voodoochief
What was revealing was the way I felt about the IAP. In some ways putting it on the back shelf. Not exactly hidden, but no fanfare or billboards were around it either. I really think I felt a little embarrassed by the fact I had IAP in my game. Well no more, this game has been designed with the idea of IAP for cosmetic changes to the game and a quicker way to purchase all the in game ship upgrades. I am not going to be embarrassed that people are so used to free that they don't even want to spend a measly 1 freakin dollar to purchase my game. So if this is the way it is, then so be it. I will offer what I believe to be great value per item and then let the public decided on it's value or not, with their wallets, like in a real shop.
So after reading this article my mind is changed and I think in a good way. All you blanket nay sayers on IAP can just keep on bleating, but in the end you are going to have to deal with the way the world in selling games is changing, well has been changing for several years now. So for me, I am stepping forward the best way I feel I can, and will try to do my best for making enough money to cover this games costs, or maybe the next one, meanwhile giving good value to my customers.
I will also add banners, not intrusive per say, but at the end of a level I will display the odd quick buy banner for the player to see that this stuff exists and YES, you can buy it if you want. I feel it is a little like the displays at the counters of the local Vons. Hopefully I can sell some of my Candy :)
Laters
Da Voodoochief
Monday, September 23, 2013
GameCenter Marmalade Code in a Class
Here is my gamecenter code that works from within the Marmalade SDK. I hope you programmers can find aspects of this useful. I basically took the example that Marmalade supplies and then converted the aspects I wanted into a class.
Good luck,
Da Voodoochief
GameCenter.h
#if !defined(_CGAMECENTER_H_)
#define _CGAMECENTER_H_
#include "s3eIOSGameCenter.h"
#include "s3eIOSIAd.h"
extern bool gAuthenticated;
extern char gUserName[S3E_IOSGAMECENTER_STRING_MAX];
extern int gGameCenterState; // useful for debugging
class cGameCenter
{
public:
int g_NumFriendsFound;
char** g_FriendIDs;
s3eIOSGameCenterVoiceChat* g_VoiceChat;
//-------------------------------------------------------
cGameCenter() {
gAuthenticated = false;
strcpy (&gUserName[S3E_IOSGAMECENTER_STRING_MAX], "Unknown");
g_NumFriendsFound = 0;
g_FriendIDs = NULL;
g_VoiceChat = NULL;
gGameCenterState = 0;
};
static void LoadAchievementsCallback(s3eIOSGameCenterAchievementList* list);
static void ReportAchievementCallback(s3eIOSGameCenterError* error);
static void LoadAchievementInfoCallback(s3eIOSGameCenterAchievementInfoList* list);
void GetMyAchievementsHandler();
void GetAchievementsHandler();
void ReportAchievementHandler();
void GameCenter_DisplayAchievements();
// static void GetPlayersCallback(s3eIOSGameCenterPlayerInfo* playersInfo);
static void AuthenticationCallback(s3eIOSGameCenterError* error, void* userData);
void AuthenticateLocalHandler();
void GameCenterRegister();
static void GameCenter_ReportScoreCallback(s3eIOSGameCenterError* error);
void GameCenter_ReportScore(int _score, int _level);
void GameCenter_DisplayLeaderboard();
};
#endif
GameCenter.cpp
#include "Game1.h"
//-------------------------------------------------------
int gGameCenterState = 0; // useful for debugging
bool gAuthenticated = false;
char gUserName[S3E_IOSGAMECENTER_STRING_MAX];
//-------------------------------------------------------
// Callback functions to report authentication, matchmaking, data events, etc...
/*void cGameCenter::GetPlayersCallback(s3eIOSGameCenterPlayerInfo* playersInfo)
{
if (playersInfo->m_Error != S3E_IOSGAMECENTER_ERR_NONE)
{
// AppendMessageColour(RED, "Get players info error: %s", ErrorAsString(playersInfo->m_Error));
return;
}
if (!playersInfo->m_PlayerCount)
{
// AppendMessage("`x996666Error? ReceivedPlayers callback indicates no players!");
return;
}
for (int i = 0; i < playersInfo->m_PlayerCount; i++)
{
s3eIOSGameCenterPlayer* player = playersInfo->m_Players[i];
// NB: GetString only guarantees the string will stay valid until the next call to GetString
// so we have to copy it if calling more than once and expecting it to persist
char alias[S3E_IOSGAMECENTER_STRING_MAX];
strcpy(alias, s3eIOSGameCenterPlayerGetString(player, S3E_IOSGAMECENTER_PLAYER_ALIAS));
// printPlayerInfo(alias,
// s3eIOSGameCenterPlayerGetString(player, S3E_IOSGAMECENTER_PLAYER_ID),
// false, 0,
// s3eIOSGameCenterPlayerGetInt(player, S3E_IOSGAMECENTER_PLAYER_IS_FRIEND) == 1);
}
s3eIOSGameCenterReleasePlayers(playersInfo->m_Players, playersInfo->m_PlayerCount);
}
*/
//---------------------
void cGameCenter::AuthenticationCallback(s3eIOSGameCenterError* error, void* userData)
{
gGameCenterState++;
if (*error != S3E_IOSGAMECENTER_ERR_NONE)
{
// AppendMessageColour(RED, "Authentication Error: %s", ErrorAsString(*error));
// debugBGColor = 0x0000ff00; // red
// updateBGColor();
gAuthenticated = false;
return;
}
gAuthenticated = true;
const char* alias = s3eIOSGameCenterGetString(S3E_IOSGAMECENTER_LOCAL_PLAYER_ALIAS);
// debugBGColor = 0x00ff0000; // green
// updateBGColor();
if (strlen(alias) > 0)
strcpy(gUserName, alias);
else
strcpy(gUserName, "!user alias error!");
// AppendMessageColour(BLUE, "---------------------------------------------------");
// printPlayerInfo(g_UserName,
// s3eIOSGameCenterGetString(S3E_IOSGAMECENTER_LOCAL_PLAYER_ID),
// true, s3eIOSGameCenterGetInt(S3E_IOSGAMECENTER_LOCAL_PLAYER_IS_UNDERAGE));
// AppendMessageColour(GREEN, "Local player authenticated:");
// AppendMessageColour(BLUE, "---------------------------------------------------");
// s3eIOSGameCenterSetInviteHandler(InviteCallback);
}
// Authenticate local player - prerequisite for other funcs to be used
void cGameCenter::AuthenticateLocalHandler()
{
// Start new attempt
// AppendMessageColour(BLUE, "%suthenticating local player...", g_Authenticated ? "Re-a" : "A");
// debugBGColor = 0xff000000; // green
// updateBGColor();
gGameCenterState++;
if (!gAuthenticated)
gAuthenticated = s3eIOSGameCenterGetInt(S3E_IOSGAMECENTER_LOCAL_PLAYER_IS_AUTHENTICATED) ? true : false;
if (gAuthenticated)
{
// AppendMessageColour(GREEN, "Authenticated! (player already logged-in)");
// debugBGColor = 0x00ff0000; // green
// updateBGColor();
return;
}
s3eIOSGameCenterAuthenticate(AuthenticationCallback, NULL);
}
void cGameCenter::GameCenterRegister()
{
gGameCenterState = 0;
if (!s3eIOSGameCenterAvailable())
{
debugBGColor = 0x0000ff00; // red
updateBGColor();
s3eDebugErrorShow(S3E_MESSAGE_CONTINUE, "GameCenter extension not found");
s3eDeviceExit(1);
}
AuthenticateLocalHandler();
}
//---------------------
// Achievements
void cGameCenter::ReportAchievementCallback(s3eIOSGameCenterError* error)
{
// if (*error != S3E_IOSGAMECENTER_ERR_NONE)
// AppendMessageColour(RED, "Achievement Report Failed: %s", ErrorAsString(*error));
// else
// AppendMessageColour(GREEN, "Achievement Reported Successfully");
}
void cGameCenter::LoadAchievementsCallback(s3eIOSGameCenterAchievementList* list)
{
for (int i = 0; i < list->m_AchievementCount; i++)
{
s3eIOSGameCenterAchievement* info = &list->m_Achievements[i];
// AppendMessage(" %s : %d", info->m_Identifier, info->m_PercentComplete);
}
// AppendMessage("Got %d achievements", list->m_AchievementCount);
// AppendMessageColour(BLUE, "---------------------------------------------------");
}
void cGameCenter::LoadAchievementInfoCallback(s3eIOSGameCenterAchievementInfoList* list)
{
for (int i = 0; i < list->m_AchievementCount; i++)
{
s3eIOSGameCenterAchievementInfo* info = &list->m_Achievements[i];
// AppendMessage(" desc2: %s", info->m_UnachievedDescription);
// AppendMessage(" desc: %s", info->m_AchievedDescription);
// AppendMessage(" %s : %d : %s", info->m_Identifier, info->m_MaxPoints,info->m_Title);
}
// AppendMessage("Got %d possible achievements", list->m_AchievementCount);
// AppendMessageColour(BLUE, "---------------------------------------------------");
}
void cGameCenter::GetMyAchievementsHandler()
{
s3eIOSGameCenterLoadAchievements(LoadAchievementsCallback);
}
void cGameCenter::GetAchievementsHandler()
{
s3eIOSGameCenterLoadAchievementInfo(LoadAchievementInfoCallback);
}
void cGameCenter::ReportAchievementHandler()
{
char name[255];
const char* tmp = s3eOSReadStringUTF8("Enter achievement name:");
strcpy(name, tmp);
const char* valueStr = s3eOSReadStringUTF8("Percent Complete:", S3E_OSREADSTRING_FLAG_NUMBER);
int value = atoi(valueStr);
s3eIOSGameCenterReportAchievement(name, value, ReportAchievementCallback);
}
void cGameCenter::GameCenter_DisplayAchievements()
{
if (s3eIOSGameCenterAchievementsShowGUI() == S3E_RESULT_ERROR)
return; // error'd out
}
//------------------
// Leaderboards
void cGameCenter::GameCenter_ReportScoreCallback(s3eIOSGameCenterError* error)
{
if (*error != S3E_IOSGAMECENTER_ERR_NONE) {
// all bad
if (*error == S3E_IOSGAMECENTER_ERR_COMMUNICATIONS_FAILURE)
return;
} else {
// all good
}
}
void cGameCenter::GameCenter_ReportScore(int _score, int _level)
{
// const char* scoreStr = s3eOSReadStringUTF8("What Score?", S3E_OSREADSTRING_FLAG_NUMBER);
// int score = atoi(scoreStr);
char category[20]; //s3eOSReadStringUTF8("Category (SI_LB01)");
sprintf(category, "SI_LB%02d", _level);
s3eIOSGameCenterReportScore(_score, category, GameCenter_ReportScoreCallback);
}
void cGameCenter::GameCenter_DisplayLeaderboard()
{
const char* category = "SI_LB00"; //s3eOSReadStringUTF8("Category (SI_LB01)"); // enter a name of the LB
if (s3eIOSGameCenterLeaderboardShowGUI(category, S3E_IOSGAMECENTER_PLAYER_SCOPE_ALL_TIME) == S3E_RESULT_ERROR)
return;
}
Good luck,
Da Voodoochief
GameCenter.h
#if !defined(_CGAMECENTER_H_)
#define _CGAMECENTER_H_
#include "s3eIOSGameCenter.h"
#include "s3eIOSIAd.h"
extern bool gAuthenticated;
extern char gUserName[S3E_IOSGAMECENTER_STRING_MAX];
extern int gGameCenterState; // useful for debugging
class cGameCenter
{
public:
int g_NumFriendsFound;
char** g_FriendIDs;
s3eIOSGameCenterVoiceChat* g_VoiceChat;
//-------------------------------------------------------
cGameCenter() {
gAuthenticated = false;
strcpy (&gUserName[S3E_IOSGAMECENTER_STRING_MAX], "Unknown");
g_NumFriendsFound = 0;
g_FriendIDs = NULL;
g_VoiceChat = NULL;
gGameCenterState = 0;
};
static void LoadAchievementsCallback(s3eIOSGameCenterAchievementList* list);
static void ReportAchievementCallback(s3eIOSGameCenterError* error);
static void LoadAchievementInfoCallback(s3eIOSGameCenterAchievementInfoList* list);
void GetMyAchievementsHandler();
void GetAchievementsHandler();
void ReportAchievementHandler();
void GameCenter_DisplayAchievements();
// static void GetPlayersCallback(s3eIOSGameCenterPlayerInfo* playersInfo);
static void AuthenticationCallback(s3eIOSGameCenterError* error, void* userData);
void AuthenticateLocalHandler();
void GameCenterRegister();
static void GameCenter_ReportScoreCallback(s3eIOSGameCenterError* error);
void GameCenter_ReportScore(int _score, int _level);
void GameCenter_DisplayLeaderboard();
};
#endif
GameCenter.cpp
#include "Game1.h"
//-------------------------------------------------------
int gGameCenterState = 0; // useful for debugging
bool gAuthenticated = false;
char gUserName[S3E_IOSGAMECENTER_STRING_MAX];
//-------------------------------------------------------
// Callback functions to report authentication, matchmaking, data events, etc...
/*void cGameCenter::GetPlayersCallback(s3eIOSGameCenterPlayerInfo* playersInfo)
{
if (playersInfo->m_Error != S3E_IOSGAMECENTER_ERR_NONE)
{
// AppendMessageColour(RED, "Get players info error: %s", ErrorAsString(playersInfo->m_Error));
return;
}
if (!playersInfo->m_PlayerCount)
{
// AppendMessage("`x996666Error? ReceivedPlayers callback indicates no players!");
return;
}
for (int i = 0; i < playersInfo->m_PlayerCount; i++)
{
s3eIOSGameCenterPlayer* player = playersInfo->m_Players[i];
// NB: GetString only guarantees the string will stay valid until the next call to GetString
// so we have to copy it if calling more than once and expecting it to persist
char alias[S3E_IOSGAMECENTER_STRING_MAX];
strcpy(alias, s3eIOSGameCenterPlayerGetString(player, S3E_IOSGAMECENTER_PLAYER_ALIAS));
// printPlayerInfo(alias,
// s3eIOSGameCenterPlayerGetString(player, S3E_IOSGAMECENTER_PLAYER_ID),
// false, 0,
// s3eIOSGameCenterPlayerGetInt(player, S3E_IOSGAMECENTER_PLAYER_IS_FRIEND) == 1);
}
s3eIOSGameCenterReleasePlayers(playersInfo->m_Players, playersInfo->m_PlayerCount);
}
*/
//---------------------
void cGameCenter::AuthenticationCallback(s3eIOSGameCenterError* error, void* userData)
{
gGameCenterState++;
if (*error != S3E_IOSGAMECENTER_ERR_NONE)
{
// AppendMessageColour(RED, "Authentication Error: %s", ErrorAsString(*error));
// debugBGColor = 0x0000ff00; // red
// updateBGColor();
gAuthenticated = false;
return;
}
gAuthenticated = true;
const char* alias = s3eIOSGameCenterGetString(S3E_IOSGAMECENTER_LOCAL_PLAYER_ALIAS);
// debugBGColor = 0x00ff0000; // green
// updateBGColor();
if (strlen(alias) > 0)
strcpy(gUserName, alias);
else
strcpy(gUserName, "!user alias error!");
// AppendMessageColour(BLUE, "---------------------------------------------------");
// printPlayerInfo(g_UserName,
// s3eIOSGameCenterGetString(S3E_IOSGAMECENTER_LOCAL_PLAYER_ID),
// true, s3eIOSGameCenterGetInt(S3E_IOSGAMECENTER_LOCAL_PLAYER_IS_UNDERAGE));
// AppendMessageColour(GREEN, "Local player authenticated:");
// AppendMessageColour(BLUE, "---------------------------------------------------");
// s3eIOSGameCenterSetInviteHandler(InviteCallback);
}
// Authenticate local player - prerequisite for other funcs to be used
void cGameCenter::AuthenticateLocalHandler()
{
// Start new attempt
// AppendMessageColour(BLUE, "%suthenticating local player...", g_Authenticated ? "Re-a" : "A");
// debugBGColor = 0xff000000; // green
// updateBGColor();
gGameCenterState++;
if (!gAuthenticated)
gAuthenticated = s3eIOSGameCenterGetInt(S3E_IOSGAMECENTER_LOCAL_PLAYER_IS_AUTHENTICATED) ? true : false;
if (gAuthenticated)
{
// AppendMessageColour(GREEN, "Authenticated! (player already logged-in)");
// debugBGColor = 0x00ff0000; // green
// updateBGColor();
return;
}
s3eIOSGameCenterAuthenticate(AuthenticationCallback, NULL);
}
void cGameCenter::GameCenterRegister()
{
gGameCenterState = 0;
if (!s3eIOSGameCenterAvailable())
{
debugBGColor = 0x0000ff00; // red
updateBGColor();
s3eDebugErrorShow(S3E_MESSAGE_CONTINUE, "GameCenter extension not found");
s3eDeviceExit(1);
}
AuthenticateLocalHandler();
}
//---------------------
// Achievements
void cGameCenter::ReportAchievementCallback(s3eIOSGameCenterError* error)
{
// if (*error != S3E_IOSGAMECENTER_ERR_NONE)
// AppendMessageColour(RED, "Achievement Report Failed: %s", ErrorAsString(*error));
// else
// AppendMessageColour(GREEN, "Achievement Reported Successfully");
}
void cGameCenter::LoadAchievementsCallback(s3eIOSGameCenterAchievementList* list)
{
for (int i = 0; i < list->m_AchievementCount; i++)
{
s3eIOSGameCenterAchievement* info = &list->m_Achievements[i];
// AppendMessage(" %s : %d", info->m_Identifier, info->m_PercentComplete);
}
// AppendMessage("Got %d achievements", list->m_AchievementCount);
// AppendMessageColour(BLUE, "---------------------------------------------------");
}
void cGameCenter::LoadAchievementInfoCallback(s3eIOSGameCenterAchievementInfoList* list)
{
for (int i = 0; i < list->m_AchievementCount; i++)
{
s3eIOSGameCenterAchievementInfo* info = &list->m_Achievements[i];
// AppendMessage(" desc2: %s", info->m_UnachievedDescription);
// AppendMessage(" desc: %s", info->m_AchievedDescription);
// AppendMessage(" %s : %d : %s", info->m_Identifier, info->m_MaxPoints,info->m_Title);
}
// AppendMessage("Got %d possible achievements", list->m_AchievementCount);
// AppendMessageColour(BLUE, "---------------------------------------------------");
}
void cGameCenter::GetMyAchievementsHandler()
{
s3eIOSGameCenterLoadAchievements(LoadAchievementsCallback);
}
void cGameCenter::GetAchievementsHandler()
{
s3eIOSGameCenterLoadAchievementInfo(LoadAchievementInfoCallback);
}
void cGameCenter::ReportAchievementHandler()
{
char name[255];
const char* tmp = s3eOSReadStringUTF8("Enter achievement name:");
strcpy(name, tmp);
const char* valueStr = s3eOSReadStringUTF8("Percent Complete:", S3E_OSREADSTRING_FLAG_NUMBER);
int value = atoi(valueStr);
s3eIOSGameCenterReportAchievement(name, value, ReportAchievementCallback);
}
void cGameCenter::GameCenter_DisplayAchievements()
{
if (s3eIOSGameCenterAchievementsShowGUI() == S3E_RESULT_ERROR)
return; // error'd out
}
//------------------
// Leaderboards
void cGameCenter::GameCenter_ReportScoreCallback(s3eIOSGameCenterError* error)
{
if (*error != S3E_IOSGAMECENTER_ERR_NONE) {
// all bad
if (*error == S3E_IOSGAMECENTER_ERR_COMMUNICATIONS_FAILURE)
return;
} else {
// all good
}
}
void cGameCenter::GameCenter_ReportScore(int _score, int _level)
{
// const char* scoreStr = s3eOSReadStringUTF8("What Score?", S3E_OSREADSTRING_FLAG_NUMBER);
// int score = atoi(scoreStr);
char category[20]; //s3eOSReadStringUTF8("Category (SI_LB01)");
sprintf(category, "SI_LB%02d", _level);
s3eIOSGameCenterReportScore(_score, category, GameCenter_ReportScoreCallback);
}
void cGameCenter::GameCenter_DisplayLeaderboard()
{
const char* category = "SI_LB00"; //s3eOSReadStringUTF8("Category (SI_LB01)"); // enter a name of the LB
if (s3eIOSGameCenterLeaderboardShowGUI(category, S3E_IOSGAMECENTER_PLAYER_SCOPE_ALL_TIME) == S3E_RESULT_ERROR)
return;
}
Thursday, September 19, 2013
iOS IAP Obtaining Multiple Products Info
I have been doing some coding and researching the iOS In App Purchasing. I set up my code to loop through all the product IDs I had set up in the Manage app section of iTunes Connect. I wasn't certain however if this was the way to make it work. Seemed a little silly to ask for product information multiple times, yet I was ok with it. that was ok, until I noticed that the call to get the product information had a number on the end asking for number of product Ids sent in the first parameter which was a char **.
So then I recoded my game to send in all the product IDs as a batch. The only thing was the callback that receives the information seemed only to handle the information coming back as a singular entity. Nowhere could I find a reference as to how this is supposed to work. So I used logic to decide that the information must come back a single product at a time, even when asked for as a bundle.
So the last few days I have been playing with this idea and last night I was in fact able to prove that it does indeed work in that way. So now I ask in a bundle and process my results within the callback, and then I copy the relevant information to my shop packages array for displaying to the player.
It is all working really well, and apart from some reformatting of the shop screen I am very close to actually attempting a purchase of one of my products. Very exciting indeed.
Laters
Da Voodoochief
So then I recoded my game to send in all the product IDs as a batch. The only thing was the callback that receives the information seemed only to handle the information coming back as a singular entity. Nowhere could I find a reference as to how this is supposed to work. So I used logic to decide that the information must come back a single product at a time, even when asked for as a bundle.
So the last few days I have been playing with this idea and last night I was in fact able to prove that it does indeed work in that way. So now I ask in a bundle and process my results within the callback, and then I copy the relevant information to my shop packages array for displaying to the player.
It is all working really well, and apart from some reformatting of the shop screen I am very close to actually attempting a purchase of one of my products. Very exciting indeed.
Laters
Da Voodoochief
Wednesday, September 18, 2013
The Toll of Expense or Doom
I cannot believe it, but somehow a whole year has nearly passed by since I purchased my 500 dollar license with Marmalade. Of course I had a paying gig that allowed me to buy that one without dipping into my own pocket. This time round I am not in such a position, so what should I do?
Each day I sign in and build my latest creation I get a warning saying how many days left are on my License. I know it ends at the end of September and I have to admit to feeling sad about the fact it is expiring. I will most likely go with the 150 dollar license next. After all I was not able to put out nearly as many games as I had hoped I would. In fact with that License I only put out two childrens apps(A Day at the Zoo and 5 Golden Coins) and though I have Hoopfighter done, it is not yet released. Which might be an issue if I don't have a license when they finally want to release it.
I know other Indie developers go through this same thought process each year. Which license should I buy and what level of license. I really like the Marmalade code base, even if some is broken (which SDK isn't without its problems eh). Still I will be sad when it goes.
Laters
Da Voodoochief
Each day I sign in and build my latest creation I get a warning saying how many days left are on my License. I know it ends at the end of September and I have to admit to feeling sad about the fact it is expiring. I will most likely go with the 150 dollar license next. After all I was not able to put out nearly as many games as I had hoped I would. In fact with that License I only put out two childrens apps(A Day at the Zoo and 5 Golden Coins) and though I have Hoopfighter done, it is not yet released. Which might be an issue if I don't have a license when they finally want to release it.
I know other Indie developers go through this same thought process each year. Which license should I buy and what level of license. I really like the Marmalade code base, even if some is broken (which SDK isn't without its problems eh). Still I will be sad when it goes.
Laters
Da Voodoochief
Monday, September 16, 2013
Scoreloop is still Rockin
A year and a half ago I put into one of my games 'Hot Chicks the Card Game' the Scoreloop backend. I really wanted high scores and maybe more later. So I looked around and asked in twitter what people thought I should use as a solution. I got recommended a few different systems, and yet Scoreloop seemed so easy, AND was already available as an extension to Marmalade (the extension is actually by Scoreloop I believe). So I figured how hard could it be, well it was pretty easy to get in and working, and it is STILL working today, a year and a half of no modifications by me. It is still working hard recording scores from new and also experienced players alike.
So I visited the Scoreloop - Hot Chicks high score table to take a look at it. Below is what I see.
As you can see there are now 7403 registered scores.. Woohoo, and still coming in at about 13 new ones a day. I only wish I had got scoreloop in the game when it was first released. I know this number would have been more than 10K by now (I believe there were nearly 5K downloads of version 1).
The other thing that astounds me is just how high a set of scores can be obtained in this game. 8K, are ya kiddin me? I cannot make it past 4.5k myself.
Still, it is gratifying beyond words to see some dedication like this in one of my games. Makes me want to write more, and ALL of them will have High Scores in them.
Laters
Da Voodoochief
So I visited the Scoreloop - Hot Chicks high score table to take a look at it. Below is what I see.
As you can see there are now 7403 registered scores.. Woohoo, and still coming in at about 13 new ones a day. I only wish I had got scoreloop in the game when it was first released. I know this number would have been more than 10K by now (I believe there were nearly 5K downloads of version 1).
The other thing that astounds me is just how high a set of scores can be obtained in this game. 8K, are ya kiddin me? I cannot make it past 4.5k myself.
Still, it is gratifying beyond words to see some dedication like this in one of my games. Makes me want to write more, and ALL of them will have High Scores in them.
Laters
Da Voodoochief
Wednesday, September 11, 2013
It's 9/11 and ya know what that means
It's my birthday!
I know today has other less celebratory awareness in peoples consciences. However I was born on this day 48 years ago.. so in my mind I have precedence.
48 years ago.. wow. Time has flown by. I was 15 when I was making and publishing my first games. Text adventures for the zx80/1 and then onto the Commodore Vic20. So long ago in numbers, seems like yesterday in my brain.
This means I have now been publishing a wide variety of games for 33 years. 33 years is also an astounding number of course. The most amazing thing is that I still have such passion and drive to create and develop more games. I wonder where it all comes from? It is still good to be passionate about games, even though when I was in my early twenties we never thought this game creation lark would last beyond me getting to maybe 30 years old.
How wrong I was (gladly).
I have a busy day ahead of me, at work, running the kids around for boy scouts and my daughters in a new YAE play in T.O. So gotta go there also tonight. I am hopeful that sometime late this evening I can simply sit and marvel at my age with a nice calming drink in hand.
Take care out there!
Da Voodoochief
I know today has other less celebratory awareness in peoples consciences. However I was born on this day 48 years ago.. so in my mind I have precedence.
48 years ago.. wow. Time has flown by. I was 15 when I was making and publishing my first games. Text adventures for the zx80/1 and then onto the Commodore Vic20. So long ago in numbers, seems like yesterday in my brain.
This means I have now been publishing a wide variety of games for 33 years. 33 years is also an astounding number of course. The most amazing thing is that I still have such passion and drive to create and develop more games. I wonder where it all comes from? It is still good to be passionate about games, even though when I was in my early twenties we never thought this game creation lark would last beyond me getting to maybe 30 years old.
How wrong I was (gladly).
I have a busy day ahead of me, at work, running the kids around for boy scouts and my daughters in a new YAE play in T.O. So gotta go there also tonight. I am hopeful that sometime late this evening I can simply sit and marvel at my age with a nice calming drink in hand.
Take care out there!
Da Voodoochief
Subscribe to:
Posts (Atom)
