Attempt to rush an RPG

After reading an article on GameDev about a guy who managed to build an RPG in 40 hours, I decided I’d try my hand at doing an RPG 40 hours too, but in C#. So I started to write the first code on Saturday. After 10 hours of gruelling crunch and brainstorming, I was overwhelmed and realized that I had neither the skill nor discipline to actually make it in 40 hours. I didn’t even have the energy left to write a blog post about the start, much less record the process of doing it. However, I did get to the stage where I had a map and a character walking around somewhat and had a basic dialog system in place, but with no inventory, no stats, no objects, just character and some boring dialog box.

Thanks to the start however, I’ve now found myself with a half-complete RPG engine. I will upload an update sometime soon. Everything used to make the game is just the .NET framework and C# that comes with Visual Studio Express. Perhaps I should try going on for another 30 hours and see how far I can get…

Posted in Programming | Leave a comment

Putting a separator between your elements

Often when I’m programming, I’ll need to list a bunch of stuff and put commas between them. Like this:

1,2,3,4,5

Usually, this is what I, and most of my colleagues do:

            List nums = new List();
            for (int i = 0; i < 5; i++)
            {
                nums.Add(i);
            }

            string msg = "";
            bool first = true;
            foreach (int num in nums)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    msg += ",";
                }
                msg += num.ToString();
            }

After reading Eric Lippert's little article about the horrid-seeming problem of commas and lists, I noticed him mentioning the method

String.Join

.

Needless to say, I went and tried it, and found that I could do the equivalent of the above, like this:

            List nums = new List();
            for (int i = 0; i < 5; i++)
            {
                nums.Add(i);
            }

            string msg = string.Join(",", nums.Select(x => x.ToString()).ToArray());
            Console.WriteLine(msg);

Its kinda amazing how after coding in C# for a good year now that I haven't noticed the existence of such a method.

Okay, the lambda expression seems a bit messy with all the parens and all, but you get the idea. Still, its a lot better than writing a loop and having the evil "first" variable which kinda clutters the whole thing. Does anyone know an even better way of doing this?

Update: and for my answer to Eric's next post:

    string msg = "{";
    IEnumerable s = something;

    string[] arr = s.ToArray();

    if (arr.Length > 1)
    {
        string[] ar2 = {
                   string.Join(", ", arr, 0, arr.Length - 1 ),
                    arr[arr.Length - 1]
               };

        msg += string.Join(" and ", ar2);
    }
    else if (arr.Length == 1) msg += arr[0];

    msg += "}";
Posted in Programming | Tagged , , , | 1 Comment

GIS data for topography and shorelines and more

I’ve found a site recently that provides data for free on the world’s shorelines and topography. They have got other datasets too that aren’t as complete, but would probably be of interest to those of you who wish to do research on it. For me, when I look at data like this I get the itch to write programs that process and present it. I might just do that eventually. *keeps a note to self*

Posted in Random | 1 Comment

Updated the b_pool!

I’ve updated the b_pool again! This one has got some new features such as string functions (not yet complete) and a new b_resize function, which basically acts the same as realloc, except that if you are resizing the last block created on the pool, it will resize it without freeing. This makes it a lot faster and is perfect for string functions. I haven’t tested it yet and its too late at night for me to test it. If anyone would be so keen to write some tests that will break the b_resize function?

Posted in Programming | Leave a comment

Requesting Code Review

So I’ve been working on a memory pool lately as a hobby project, and I’ve come across some things that I haven’t found a solution that would satisfy my gut yet. But, after reading this:

I started to realize that since I’m already on the internet, why not have people examine my code instead? To that effect, I’m asking everyone who’s not afraid of C and actually reads this blog to comment on my code. It can be found here:

http://bazaar.launchpad.net/~davidsiaw/bpool/trunk/annotate/head%3A/b_pool//b_pool.c

This is the center of the code development at the moment. I’ll add more comments later on how the pool is actually supposed to work. I’d like to know if there are any bad practices catchable from the outset. Thanks!

Posted in Programming | Leave a comment

A resource pool implementation

After some interesting discussion with a friend, I’ve decided to try my hand at coding a resource pool like Apache’s APR pools. I’m gonna call my pool b_pool, which stands for bunny pool.

Its not going to be a copy of APR pools however, it will just by my idea of what a pool should be like. It will be able handle not only memory, but file handles, socket descriptors and other shared system resources and manage them. Thus, instead of calling it just a memory pool, I call it a resource pool.

You can check it out from LaunchPad using Bazaar version control.

bzr branch lp:~davidsiaw/bpool/trunk

Currently the only way to build bpool is by using Visual Studio 2008. I’ll check in some autogen scripts sometime later this week. Or someone can help me write a temporary makefile that I can merge into the tree ^_^.

This resource pool is meant to be used inside a subsystem that has a limited lifetime, but uses memory in a complex enough way to make tracking the lifetimes of objects allocated inside it difficult. The idea of a pool is that you create a pool just before you run the subsystem, and the subsystem will use the pool to allocate memory and other resources, in other words, allocate resources inside the pool. When the subsystem is no longer needed, the pool is destroyed, taking along with it all the resources it was used to allocate. The subsystem has the freedom to free memory if it wants to, or it can allocate memory to be used at a later time.

The b_pool is still in its infancy and I still have a lot of things I want to add to it such as string manipulation functions that use the b_pool, which would be tremendously useful if used together with a subsystem that uses strings a lot.

How do you use the pool?

Well right now there’s only one way to use it, and it can only pool memory at the moment. In order to create a pool, simply create a variable to hold a pointer to the pool and call b_create_pool

b_pool* pool;
b_create_pool(&pool);

When you are sure you are finished with it, you call

b_destroy_pool(pool);

This frees all the memory allocated in the pool.

In order for the subsystem to allocate memory in the pool, it needs to call the function b_alloc, which is basically a replacement for malloc, but it is used slightly differently.

void mysubsystem(b_pool* pool)
{
char* mem1;
b_alloc(pool, &mem1, 50);
}

b_alloc takes 3 parameters, it takes the pointer to the pool, a reference to the pointer to memory that it will assign to, and the size of memory requested. b_alloc will then fill in the pointer with an address where the requested memory has been prepared. It returns a number too, 0 for success and anything else for fail. I might add an enumeration later.

If you so wish to free the memory because you know you are finished with it, you can use

b_free(pool, mem);

Similar to free() in libc, b_free frees up memory to be allocated by somebody else again. Although this is optional as long as you destroy the pool when your subsystem has done its job, this is useful whenever you want to keep the memory usage to a minimum constantly, which is the case in memory-constrained environments like mobile phones.

So whats the difference between using a memory pool and malloc to allocate memory? Isn’t it just putting a big malloc and free around a set of function calls? It may seem absurd and unuseful on the outset, but the only rule you must definitely observe when using a pool is that you must Never make a global pool in your application, because that’s what your application address space already is. Essentially, yes. It is putting a big malloc and free around a set of function calls. But the usage of memory is simplified in the sense that you can ignore having to worry about trying to reuse memory that isn’t used anymore inside your subsystem, or resizing the amount of memory you allocated for your subsystem in order to let it store more data. All you need to do is ask for memory, which is one less worry in a low-level language.

It is also faster to have a userland routine manage your memory for you, since it does not incur the cost of changing privilege levels, which is expensive on most CPU architectures, and is required whenever you want to ask the OS to reserve memory for you. Eventually I will create more routines to allow the registration of destructors, deep copiers for other kinds of custom resources into the pool. I am also thinking of turning it into a layer over a set of OS resource requesting functions, so one can write subsystems that are platform-independant, and all one needs to do to use a subsystem on another platform is to implement the b_pool for that platform and use the subsystem.

So, have fun with experimenting with it and tell me what you think about it, or even, tell me your idea of what you think a resource pool should be like!

Posted in Programming | 1 Comment

Let’s write asm!

Today I was asked by a friend to help with his programming assignment. His program needs to take in a number and output the prime factors of the number. For example, 60 = (2^2)(3^1)(5^1)

So after trying to explain the problem to him, I decided to try writing it myself in C. Of course, he wrote his own version in Java.
Continue reading

Posted in Programming | Leave a comment

What’s your favorite language?

A friend asked me what my favorite language is today, and showed me a page about parallels drawn between computer languages and religons. I told him I didn’t have a favorite language anymore. I did once upon a time, and that language was C++. But the reason it was my favorite language was because it was the only language I knew at the time. Well, not really, I knew 1 other language, PHP, but I didn’t use it much, so it was still C++.

Now, after working for about a year now, I realized that different languages are useful for different things, much like a hammer is useful for hammering nails, but not a screwdriver. The theory is that you can use a screwdriver to hammer nails too, but it wouldn’t be as effective as a hammer. The same thing applies to languages. C is good for writing OSes, and making some really fast code, but if you really don’t care and just want a script that reads a bunch of files and makes a list of filenames and e-mails it to someone, you could just use Python. Going by that analogy, you could think of each language you know as a tool in your toolbox, and the time you take to learn those languages is as well invested as the money you use to buy your hammer and sickle.

Most people have a favorite language because of the same reason I once did, because its the only language they know well. But, sometimes it may be the language of choice for what they do too. Favoritism is something I can’t really find in the languages I know now. Perhaps there would be a language that would intrigue me enough someday to make me a believer of a favorite again?

Posted in Programming | 1 Comment

WordLaunch update

Some personal problems this week have delayed development but I’m not one with a faint heart! This week’s project is still going. Here is version 0.1! It allows you to edit your pages, and it probably still needs a lot of work before its any good at solving my rant that started this project, but I guess this is a start.

Here’s a video on what the program currently does:

[flashvideo filename=/wp-content/uploads/2008/11/wordlaunch-01.flv /]

(not the best video in the world, but it should illustrate what you should be clicking =P)
Theres no audio in this video, so don’t worry about letting your boss hear it =)

In order to compile this project, you will need Visual Studio 2008 and the .NET framework (duh). Also, you’ll need to unzip xulrunner into a folder and place it in the same directory as the binary.

Since not everyone has the priviledge of having a MSFT compiler, I’m also providing binaries as a download. But I won’t be responsible if they so happen to be dodgy.

Binaries

Sources

I used some libraries in this program so some credits are in order:
1. XML-RPC Library courtesy of Cook Computing
2. XULRunner courtesy of Mozilla
3. Thanks to Joseph Scott for his documentation of the XML-RPC WordPress interface.

Posted in Programming | 2 Comments

This week’s project: Project WordLaunch

After having some browser issues, I found that I wasn’t really happy with the way WordPress let me go about managing my pages. It was difficult to set the parent-child relationships between pages and doing massive changes. What I started to look around for was a blogging client that would allow me to perform all the changes I wanted on my computer, natively, and then upload the changes to WordPress. Unfortunately, I wasn’t able to find any such thing. So I decided to comb through WordPress’s XML RPC API, and start looking for ways to implement such a client.

Posted in Programming | 1 Comment