Event System like RPG Maker?

Started by
12 comments, last by Khatharr 11 years, 1 month ago

I had been making an event system, things are fine, my code work fine, but now i stuck on a conceptual idea

how would i implement the conditional branch dynamically?

I cant seem to find a good way to code it that make use efficiently of space, and having multiple if at once

So far, the best thing that i could come up with was to have an int* ConditionBranch[somenumber] , which when checked, if it return a value that isnt zero, it will point to a Condition (assuming a class Condition that was declared as Condition myCondition[somenumber]). But, if i do it like that, then there would only be 1 if, (because it only check for 1 thing at a time).

I cant figure out a way to code it so that it allow an else statement, else if statement

any help would be appreciated.

Advertisement

Do you have RMXP or RMVX?

You can look at the interpreter class to see how Enterbrain did it. It's not very efficient, but the general structure is there.

void hurrrrrrrr() {__asm sub [ebp+4],5;}

There are ten kinds of people in this world: those who understand binary and those who don't.

Do you have RMXP or RMVX?

You can look at the interpreter class to see how Enterbrain did it. It's not very efficient, but the general structure is there.

Arent RMXP and RMVX have the same type of event system (i mean its basic structure is there)

And that is actually a really good idea. I never thought about take a look at their scripting engine about the part where they do the event system

But if anyone have any advice to give on this i would love to hear it

Nearly every game has a similar event system, not just RPGs.

Effectively it is something along these lines:

class EventManager {
RegisterListener (event, delegate)
UnregisterListener (event, delegate)
ProcessEvent( event, parameters)
}

Various objects register to listen for specific events. When the event happens, the details are sent to the event manager, which in turn forwards it on to all listeners who are interested.

There are variations, of course. You can add additional variations that limit event handling to a radius of the object, or limit it to a specific actor or target, or limit it to some other specific parameter. These serve as optimizations and don't really impact the core functionality.

The exact details of what you do within your callback delegate is up to you. That includes choosing one of several random sub-events, as your post asks.

Nearly every game has a similar event system, not just RPGs.

Effectively it is something along these lines:

class EventManager {
RegisterListener (event, delegate)
UnregisterListener (event, delegate)
ProcessEvent( event, parameters)
}

Various objects register to listen for specific events. When the event happens, the details are sent to the event manager, which in turn forwards it on to all listeners who are interested.

There are variations, of course. You can add additional variations that limit event handling to a radius of the object, or limit it to a specific actor or target, or limit it to some other specific parameter. These serve as optimizations and don't really impact the core functionality.

The exact details of what you do within your callback delegate is up to you. That includes choosing one of several random sub-events, as your post asks.

can you please explain a bit more detail?

can you please explain a bit more detail?

So, you have an "event", which is just an id to distinguish between events. It can be an enum, #DEFINE'd ints, hashed strings, whatever.

You also have a "delegate", which is the code that should be executed when the event happens. Delegates in C++ (which is what I assume you're using) are a pretty big topic, so I'll link you to the stackoverflow question What is a C++ delegate?

Lets say you have a class that keeps track of the player's score, and whenever an enemy is killed, the score should increase by the enemy's point value.

Pseudocode would look like this:

class ScoreTracker
{
    class EnemyKilledDelegate : Delegate
    {
       int totalPoints;

       virtual void operator()(void* data)
       {
           totalPoints = (int*)data;
       }
    }

    ScoreTracker()
    {
        //...
        EventManager* mgr;
        EnemyKilledDelegate* del;
        mgr.RegisterListener("EnemyKilled", del);
        //...
    }
}
The event manager would then keep some sort of dictionary to call the delegates when the event occurs:

class EventManager
{
    map<string, vector<Delegate*>*> eventMap;  // map strings to (pointers to (vector of pointers to delegates))
    RegisterListener(string event, Delegate* delegate)
    {
        // get the vector of delegates for the event (or create a new one)
        vector<Delegate>* eventListeners = eventMap.getOrCreate(event);
        eventListeners.add(delegate);    // add the delegate
    }

    ProcessEvent(string event, void* data)
    {
        // get the vector of delegates for the event (or create a new one)
        vector<Delegate>* eventListeners = eventMap.getOrCreate(event);

        foreach(Delegate* del in eventListeners)   // loop through and call each delegate
        {
            (*del)(data);
        }
    }
}
And finally, to fire an event:

class Enemy
{
    int pointValue;

    Die()
    {
        //...
        EventManager* mgr;
        mgr.ProcessEvent("EnemyKilled", &pointValue);
        //...
    }
}


Do you have RMXP or RMVX?

You can look at the interpreter class to see how Enterbrain did it. It's not very efficient, but the general structure is there.


Arent RMXP and RMVX have the same type of event system (i mean its basic structure is there)

And that is actually a really good idea. I never thought about take a look at their scripting engine about the part where they do the event system

But if anyone have any advice to give on this i would love to hear it



The whole of the event updating system is implemented between the Event class and the Interpreter class. When an event updates it just hands each line of its commands (in a symbolic format) into the Interpreter instance one at a time until it reaches the end of the list.

You others, while your points are certainly valid, in RPG Maker 'Event' is the term used for 'Entity'. He's asking about how to structure a configurable Entity AI system.

">


It's a pretty crazy implementation. The IDE basically packages the listed commands into an array of objects. The objects have a command ID number and whatever arguments are provided. This gets marshalled into the game package to be loaded by the Ruby interpreter at runtime. It's basically a script engine on top of a script engine on top of DX9.

The Interpreter class is an enormous monster of a thing that IIRC is more or less stateless. It's just a huge collection of methods named 'CommandXXX(arg, arg)' where XXX is the matching command ID number from the IDE.

Just to make sure that everything is as confusing as possible, the engine uses entities to drive things like cut-scenes as well. You can create a non-collidable 'Event' with no sprite and set it to trigger whatever behavior you want using the same system as an 'Event' like a treasure chest or NPC.

Honestly, I'm not sure what OP is up to overall. If he's trying to make an RMXP clone then that's how they went about it. If he's just trying to make an RPG then it may be worth using a less convoluted system. The RMXP method is flexible for content creation, but it's slow as hell and extremely clumsy to modify.

Anyway, he's talking about customizable entity AI management, not 'events' in the normal sense of the word.
void hurrrrrrrr() {__asm sub [ebp+4],5;}

There are ten kinds of people in this world: those who understand binary and those who don't.

Do you have RMXP or RMVX?

You can look at the interpreter class to see how Enterbrain did it. It's not very efficient, but the general structure is there.


Arent RMXP and RMVX have the same type of event system (i mean its basic structure is there)

And that is actually a really good idea. I never thought about take a look at their scripting engine about the part where they do the event system

But if anyone have any advice to give on this i would love to hear it


The whole of the event updating system is implemented between the Event class and the Interpreter class. When an event updates it just hands each line of its commands (in a symbolic format) into the Interpreter instance one at a time until it reaches the end of the list.

You others, while your points are certainly valid, in RPG Maker 'Event' is the term used for 'Entity'. He's asking about how to structure a configurable Entity AI system.

">


It's a pretty crazy implementation. The IDE basically packages the listed commands into an array of objects. The objects have a command ID number and whatever arguments are provided. This gets marshalled into the game package to be loaded by the Ruby interpreter at runtime. It's basically a script engine on top of a script engine on top of DX9.

The Interpreter class is an enormous monster of a thing that IIRC is more or less stateless. It's just a huge collection of methods named 'CommandXXX(arg, arg)' where XXX is the matching command ID number from the IDE.

Just to make sure that everything is as confusing as possible, the engine uses entities to drive things like cut-scenes as well. You can create a non-collidable 'Event' with no sprite and set it to trigger whatever behavior you want using the same system as an 'Event' like a treasure chest or NPC.

Honestly, I'm not sure what OP is up to overall. If he's trying to make an RMXP clone then that's how they went about it. If he's just trying to make an RPG then it may be worth using a less convoluted system. The RMXP method is flexible for content creation, but it's slow as hell and extremely clumsy to modify.

Anyway, he's talking about customizable entity AI management, not 'events' in the normal sense of the word.

^This guy

he know what im talking about :D

But sadly that is what im trying to achieve - an RPG Maker event system clone

Now to the concept, how do i do the event system condition branch... That is the only part that i have problem on at the moment.

But yeah i realized, in the end it all up to scripting. I believe i have to sort of code a "script" reader, where u can just have the { and } to state whenever there is a condition.

But again, if you have any advice/help i would definately appreciate it

Did you look at the Interpreter and Event classes yet? It's been quite a while, but IIRC the Interpreter used Ruby procs to transfer control.

Are you really sure you want to do it the way Enterbrain did? It's pretty Ruby dependent.

I'm still not clear on whether you're making a game or an RPGMaker clone.
void hurrrrrrrr() {__asm sub [ebp+4],5;}

There are ten kinds of people in this world: those who understand binary and those who don't.

Did you look at the Interpreter and Event classes yet? It's been quite a while, but IIRC the Interpreter used Ruby procs to transfer control.

Are you really sure you want to do it the way Enterbrain did? It's pretty Ruby dependent.

I'm still not clear on whether you're making a game or an RPGMaker clone.

Yes, I had look at the interpreter and the event class already

but i was thinking about taking some compiler book (aka the dragon book) and start reading

then at one point i will implement a scripting engine that apparently will do the condition branch work for me

aka the event system will be a scripting engine. where u have file 1.eventfile (is a text file filled with script)

so yeah i dont think it will be a RPG Maker event system clone, but i will try my best to do as good as their event system

This topic is closed to new replies.

Advertisement