Sorry, but this project has been postponed for a little while while I experiment with different game development ideas. This project is not dead, but is taking a backseat indefinitely.OpenRPG Project (and RGame)
Introduction
A while back, I decided that RMXP was inadequate. That's not to say it's not good; it and RGSS are some of the best RAD tools I've seen, easiest to use, and well-implemented. However, there are a lot of shortcomings to it -- among these are the lack of extensibility and basic functions in RGSS (such as gradients), very few filetypes supported, no embedded video, no 3D support, etc. In addition, it's Windows-only -- something I can't stand, since I love messing around with RGSS, but I also love only using Linux or Mac OS X.
So, what to do? It's not like there are any decent alternatives to it that actually replicate all of the features, let alone have compatibility. Well, how about this:
I rewrite it. As open source software. And thus, the concept for OpenRPG (and RGame) was born.
Note that this project is only for UNIX-buffs, devs and those interested in making feature suggestions and submitting ideas. If that doesn't include, please get out, and avoid saying anything negative, no matter who you are.
DetailsOpenRPG
Let's start with OpenRPG, which is a replacement for RMXP (and possibly VX later on.) I've decided that it will not be a program itself; it will be an open source project, with libraries and official editors based on these. I've divided the project into the following sections so far:
OpenRPG-Core: This handles all of the core functionality that is needed for things like opening/editing OpenRPG-supported files, using markup-style formats for it, and certain technology that no editor or engine can possibly go without. It's library will be lib-openrpg-core, and will be the first implemented.
OpenRPG-Auxillary: Holds supplements to the core; this will probably include things such as RMXP Marshal support. Library is lib-openrpg-aux.
OpenRPG-Extending: Extension stuff. Library is lib-openrpg-ext.
The default format will be XML + Zlib deflation; for example, here is a mockup of how a script archive would look inflated:
The First Ever Script Archive (Now in Convenient XML Format!): ShowHide
<archive type="scripts">
<script>
<name>Blah, The First Script I decided to write as a boy</name>
<version>1.00</version>
<author>Dennis M. Ritchie</author>
<about>I wrote this at the age of 8; soon, I was discovered by a small phone company in the Northeastern US and drafted by them to be a developer.</about>
<content>
STDOUT.print("Well, uhh... BLAH.")
</content>
</script>
</archive>
It would then be compressed using Zlib (
http://zlib.com/, I believe).
RGame
This is the main project I've been working on, and I've rewritten it around four times now (I'm not that good at C++ dev yet). It is meant to be a replacement for RGSS1, implementing embedded Ruby with full API compatibility. For now, it is based on SDL (
http://libsdl.org/), and will be fully cross platform.
Code Excerpts
/*
* register.h
* RGame
*
* Created by Collin Wright on 2/26/09.
* Copyright 2009 Collin Wright. All rights reserved.
*
*/
#include <stdexcept>
#include <vector>
class Register {
private:
std::vector<void *> ptrs; // array of pointers; core of class
int seek // finds the index of the first pointer
// in the array that can be used
()
{
// iterates through array and checks for NULL
for ( int i = 0; i < ptrs.size(); ++i ) { if ( ptrs.at(i) == NULL ) return i; }
return -1; // returns -1 if there is no available pointer
}
public:
int assign // stores a pointer in the first available slot;
// if no room, resizes array to accomodate
( void *ptr )
{
int i = seek(); // finds the index of the first avaible space
// if there is space, store and return index; if there isn't,
// then it resizes and calls itself recursively.
if ( i != -1 ) {
ptrs.at(i) = ptr;
return i;
} else {
ptrs.resize( ptrs.size() + (ptrs.size() * .1) );
return assign(ptr);
}
}
void free // techincally doesn't "free" anything; it just sets an index back to NULL
// this should be called after actually freeing the pointer
( int loc )
{
try {
ptrs.at(loc) == NULL; // set to NULL
} catch (std::out_of_range o) {
std::cout << "!" << "\t" << "::" << "\t" << "Oops: " << o.what() << std::endl;
}
}
void *refer // gets the ponter stored at loc
( int loc )
{
try {
return ptrs.at(loc); // return pointer at loc
} catch (std::out_of_range o) {
std::cout << "!" << "\t" << "::" << "\t" << "Oops: " << o.what() << std::endl;
return NULL; // ensure that NULL is returned
}
}
Register
(int s = 32)
{
ptrs.resize(s); // set the array to proper size and initialize
}
~Register
()
{
}
};