Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 16 Nov 2009
Offline Last Active Aug 27 2014 12:12 PM

Topics I've Started

Rapture - Open-source 2D Isometric ARPG

27 August 2014 - 11:37 AM

Hello there, I'm eezstreet. For the past 8 months, I have been working on my own isometric ARPG from scratch. Currently there's nothing more to show than concepts and programmer art, but you can chalk this up to a lack of artists - I've been going it alone for the moment. ;) Haven't found much in the way of artists using the classified section, but I'm remaining hopeful that I'll find someone soon.


My game is titled Rapture. My main source of inspiration is Diablo II. Although there are new games like Path of Exile, Diablo III, and Torchlight, I never felt like there was a true spiritual successor to the game. I've decided to go back to the game's roots and focus more on RPG elements instead of a loot-n-grind experience. In the game, you'll travel across a nightmarish, post-biblical-apocalyptic Earth, which is now being ravaged by demons. Your goal is to either ascend to heaven or defend mankind as it forges a new beginning.


For right now, there is no lighting, sound, or multiplayer, but they are all planned. Currently I am working on learning some OpenGL so I can simulate 3D lighting and optimize the renderer even further. I really want to focus on having an engrossing and engaging world, as I feel that's where many of the "Diablo-clones" fail. I aspire to inspire horror, fear, and disgust in those who are brave enough to complete the game. smile.png


Here is a few gameplay screenshots, from a debug build of the game:




Here is a concept of an area which was drawn up for me:



The engine was built in C++ and is using SDL. I've open-sourced the game under the GPL (currently have to apply the license though!). If anyone wants to help out with the art, feel free to shoot me an email (eezstreet at live dot com). Anyone can clone/fork my repo here:



Engine stats-

- SDL-based rendering

- C++ powered engine, uses JSON data files which can integrate into UI

- Priority-based error logging and message dispatch system

- Multiple file searchpaths

- Codebase split between engine and gamecode, can run "programs" (games/editors) from DLL files using import/export system

- Uses render-to-texture exclusively; capable of displaying hundreds of objects onscreen without cracking 100 FPS

- UI is done in HTML/CSS/Javascript

- Modular renderer

- Designed from the ground-up with mods in mind

- (Able to be rather easily ported to) Linux and Mac

- Ingame console with cvars and commands a la Quake 3 or Unreal Engine. Supports Unix-style copy/paste (select to copy, right click to paste)


Feel free to use it as a framework for your own iso 2D projects or anything, as long as you adhere to the GPL I don't really care.

Don't think I'm handling objects properly...

05 February 2014 - 07:51 PM

So here's the rub. I'm working on a json/angelscript combo system as part of weapon design. The JSON defining the script block and function to call, which uses the signature "void call(gentity_t@)". The problem is, I'm not sure if I'm handling the object correctly. gentity_t is just a simple struct (but it isn't asOBJ_POD as it contains pointers to some other things within). The script will modify certain aspects of the gentity_t, which is meant to be passed in as a pointer, as well as execute several global functions which take the gentity_t as an argument.


Right, so here's how I'm registering my object:

scrpEngine->RegisterObjectType("gentity_t", sizeof(gentity_t), asOBJ_REF | asOBJ_NOCOUNT);

and here's how I'm calling the script:

bool TryNewDempRoutine(gentity_t *ent) {
    if(ent->s.weapon != WP_DEMP2) {
        return false;
    G_ExecuteASVoid("void DEMP2Test(gentity_t@ ent)", 1, ent);
    return true;

(here's G_ExecuteASVoid: )

void G_ExecuteASVoid(const char* funcDeclaration, int numArgs, ...) {
    string s = funcDeclaration;
    auto paramStart = s.find_first_of('(')+1;
    auto paramEnd = s.find_last_of(')')-paramStart;
    string params = s.substr(paramStart, paramEnd);
    vector<string> arguments;

    asIScriptFunction *func = scrpEngine->GetModule(0)->GetFunctionByDecl(funcDeclaration);
    auto argSplitter = params.find_first_of(',');
    while(argSplitter != params.npos) {
        string thisArgument = params.substr(0, argSplitter-1);
        argSplitter = params.find_first_of(',')+1;

    va_list        argptr;
    va_start(argptr, numArgs);

    void* arg;
    for(int i = 2; i < numArgs+2; i++) {
        arg = va_arg(argptr, void*);
        AS_SetArgBasedOnType(&arg, arguments.at(i-2), i-2);

Here's my angelscript file:

void FireDemp2(gentity_t@ ent) {
    vec3_t start;
    int damage = GetWeaponDamage(WP_DEMP2);
    VectorCopy(wpMuzzle, start);    // Copy value of wpMuzzle to start
    WP_TraceSetStart(ent, start, vec3_origin, vec3_origin);
    gentity_t@ missile = CreateMissile(start, wpFwd, 1800, 10000, ent);
    missile.s.weapon = WP_DEMP2;
    VectorSet( missile.maxs, 2.0, 2.0, 2.0 );
    VectorScale( missile.maxs, -1, missile.mins );
    missile.damage = damage;
    missile.dflags = 128; // Lazy, don't feel like creating an enum for this right now
    missile.methodOfDeath = 12; // Also lazy and don't feel like creating an enum for this right now either
    missile.clipmask = 263041; // BLARGH SO MUCH TO DO OMG

void DEMP2Test(gentity_t@ ent) {

    // Increase number of shots fired (for loading screen statistics
    // From our viewangles, generate three vectors -> wpFwd, wpVright, wpUp (all are global)
    AngleVectors(ent.client.ps.viewangles, wpFwd, wpVright, wpUp);
    // Given the three vectors, calculate our muzzle point and stuff it into wpMuzzle (also global)
    CalcMuzzlePoint(ent, wpFwd, wpVright, wpUp, wpMuzzle, 0);
    // Call our funtion which fires the DEMP2

The script only gets as far as "test2" before it fails on CalcMuzzlePoint, that function being a global function:

void CalcMuzzlePoint( gentity_t *const ent, vec3_t wpFwd, vec3_t right, vec3_t wpUp, vec3_t muzzlePoint, float lead_in )
scrpEngine->RegisterGlobalFunction("void CalcMuzzlePoint(gentity_t@ ent, vec3_t fwd, vec3_t right, vec3_t up, vec3_t muzzle, float lead_in)", asFUNCTION(CalculateMuzzlePoint_AS), asCALL_CDECL);

I suspect that I'm doing this completely wrong and that maybe I should be using something like CScriptHandle, but I'm not too sure where to go with this.

gameswf and rendering to a texture

29 January 2013 - 08:44 PM

So I have a bit of a problem...

I'm reverse engineering a game (a Quake 3 derivitve, if that helps) to allow an SWF to be used in place of a texture and I need to use gameswf as a renderer which binds a texture, and then uses glTexSubImage2D to draw the rendered swf as a subimage. Unfortunately, I know only very little about OpenGL, and how gameswf interacts with it. I believe that gameswf doesn't store the bitmap data needed for glTexSubImage2D when rendering using the OpenGL renderer.


If anyone could help, that would be great!