Sponsored By

Newsletter #63 - Loradon Online Closed

Loradon Online has been closed, new forums, a glitch with rings in Volund, wallpaper rotation, sketches, and more.

Michael Grand, Blogger

March 7, 2010

8 Min Read


News

A new forum titled "Community Spotlight" has been added to the IfThen Software forums. Its purpose is to collect everyone's and anyone's contributions to the weekly community spotlight newsletter article. If you have anything you wish to contribute, please post it! Instructions are in the thread titled "What Is This For?". You will be credited for your contributions in the by-line for the article.

Loradon Online is officially closed. It has been a dead project without updates or support for roughly 4 years, and with Volund being in closed beta it is time to finally close the doors on Loradon. The Loradon Online forum has been turned into a read-only archive, so Loradon fans will still be able to look back on the history of our longest standing game.

Volund now has its own forum. The game has not yet been released to the public, but feel free to post in the forum with your thoughts, opinions, and theories. Some players are even starting up Volund guilds already.


From the Testers
Written by Jay

(Click to enlarge)

This image shows an example of bugged health and mana due to the rings.

Not much has happened in the past week of testing. Most of the testers (including myself) have been logging onto the game less than we have in previous weeks. However, there is one thing I'd like to write about: magical rings. There are currently three types of magical rings in the game, and each one has a different enhancement. One raises stamina, one raises mana, and one raises health (along with additional enhancements you'll have to wait to see).

There is, however, a problem with the rings. They are extremely bugged. By "bugged" I mean that there are several issues that they present when being worn. Depending on which ring is being used, some of the stats will appear to raise to unprecedented levels when in battle (e.g. the ring that raises health will appear to give you 15 maximum health sometimes when enemies attack you). However, these raises in stats do not actually occur (It might say you have 1,000 HP, but you would really have your current max which might be around 140-160).


From the Programmer
Written by Invisible

I ran into a problem with the garbage collection system's smart array. Given indices of certain types, the compiler was unable to figure out if it should use the default subscript operator or one which I defined. This issue was eventually fixed by overloading the subscript operator for every possible index type.

The previous weekend and the following Monday were rather busy for me since the Windows 7 beta which I had installed on my work machine was set to expire on the first of March. Thankfully, nothing was lost in the transfer back to Windows XP except movable applications in the task bar and automatic desktop wallpaper rotation. I can't really recover the first loss, but I started looking into ways to automatically change the desktop wallpaper. I finally settled on writing my own program to do it (how hard could it be?). That's when I found out that altering the desktop wallpaper is not exactly straight forward unless you know exactly what to look for.

There are a couple of ways to change the desktop wallpaper. The first method that I found was to use SystemParametersInfo() with SPI_SETDESKWALLPAPER. The problem with this method is that it only supports bitmaps.

The second method is to use the ActiveDesktop COM object. A code example is probably the best way to explain this, so here is the SetWallpaper() function which I created:

// Sets the desktop wallpaper using ActiveDesktop.
//
// Parameters
// a_szFile
// The path and name of the file which stores the image that is to be used as the desktop wallpaper. Common image formats may be used, including bmp, jpg, and png.
// a_dwStyle
// The wallpaper style. Possibly values: WPSTYLE_CENTER WPSTYLE_TILE WPSTYLE_STRETCH
//
// Return Value
// Returns true if the wallpaper was successfully changed, false otherwise.
bool SetWallpaper(char *a_szFile, DWORD a_dwStyle)
{
// Make sure that the pointer to the filepath string is valid.
if (a_szFile == NULL) return (false);

// Make sure that the wallpaper style is valid.
if ((a_dwStyle != WPSTYLE_CENTER) && (a_dwStyle != WPSTYLE_TILE) && (a_dwStyle != WPSTYLE_STRETCH)) return (false);

// Initialize COM.
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (FAILED(hr))
{
// COM could not be initialized, so return failure.
return (false);
}

// Create an instance of the active desktop COM object and retrieve an interface to the object.
IActiveDesktop *objActiveDesktop = NULL;
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void **)&objActiveDesktop);
if (FAILED(hr))
{
// Creating the active desktop COM object failed, so cleanup and return failure.
CoUninitialize();
return (false);
}

// The active desktop's SetWallpaper() function only accepts filename strings in wide character format. So we need to convert from the multibyte string to a wide character string.
WCHAR wszFile[MAX_PATH];
int iLen = MultiByteToWideChar(CP_ACP, 0, a_szFile, -1, wszFile, MAX_PATH);
if (iLen == 0)
{
// Converting the filepath string from multibyte to widecharacter failed, so cleanup and return failure.
objActiveDesktop->Release();
CoUninitialize();
return (false);
}

// Finally set the desktop wallpaper to the image in the file specified.
hr = objActiveDesktop->SetWallpaper(wszFile, 0);
if (FAILED(hr))
{
// Setting the desktop wallpaper failed, so cleanup and return failure.
objActiveDesktop->Release();
CoUninitialize();
return (false);
}

// Set the wallpaper style. The wallpaper can be stretched, centered, or tiled.
WALLPAPEROPT wallpaperOptions;
wallpaperOptions.dwSize = sizeof(WALLPAPEROPT);
wallpaperOptions.dwStyle = a_dwStyle;
hr = objActiveDesktop->SetWallpaperOptions(&wallpaperOptions, 0);
if (FAILED(hr))
{
// Setting the wallpaper style failed, so cleanup and return failure.
objActiveDesktop->Release();
CoUninitialize();
return (false);
}

// Save the changes. This will make the new wallpaper appear.
hr = objActiveDesktop->ApplyChanges(AD_APPLY_SAVE);
if (FAILED(hr))
{
// Saving the changes failed, so cleanup and return failure.
objActiveDesktop->Release();
CoUninitialize();
return (false);
}

// The wallpaper has been set successfully, so cleanup and return success.
objActiveDesktop->Release();
CoUninitialize();
return (true);
}

I have also released the wallpaper rotater, which you can download here: http://www.ifthensoftware.net/invisibleman/RotateWallpaper.zip Please read the included README.txt file before running the program!

I ran into a problem with atexit(). For some reason, the function I was giving to atexit() was not being called in the debug build. Suspecting the problem was with the project settings, I compared (using TortoiseMerge) the project against another one which worked correctly. Apparently the project's debug mode was using the multi-threaded runtime (/MTd) rather than the multi-threaded DLL runtime (/MDd). I would think that both should support atexit(), but it appears as though /MT doesn't.


Artist's Easel
Written by GreyKnight

iScribble Sketches #21

(Click to enlarge)

(Click to enlarge)


Community Spotlight

There is no community spotlight in this issue.

To contribute to future community spotlight articles, please visit this forum: http://www.ifthensoftware.net/forums/index.php?showforum=37


Funny Quote of the Week

Background information: Acaceol apparently trained a polar bear to spy on InvisibleMan.

pifreak: why is the ping so high?
Acaceol: Mountains
Acaceol: :/
InvisibleMan: Rats.
pifreak: The wires are chewed up?
Acaceol: I told you rats didn't conduct very quickly
InvisibleMan: Acaceol: Neither do polar bears :/
Acaceol: You can't patch cords with rats, use copper wire
Acaceol: I'd need a bit of capital to send robots to spy on you
Acaceol: Trained animals are easier
InvisibleMan: Well, all these trained animals are ending up as part of the phone line... Send a gold plated something next time
Acaceol: Hmm, maybe I'll send a bug d:
Acaceol: That'd be useful to have in the phone line
InvisibleMan: *ba-dum-dum tssh* :P

Read more about:

Blogs
Daily news, dev blogs, and stories from Game Developer straight to your inbox

You May Also Like