Jump to content

  • Log In with Google      Sign In   
  • Create Account


Event System like RPG Maker?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
13 replies to this topic

#1 ComposerCookie   Members   -  Reputation: 109

Like
0Likes
Like

Posted 13 February 2013 - 09:53 PM

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.



Sponsor:

#2 Khatharr   Crossbones+   -  Reputation: 2959

Like
0Likes
Like

Posted 13 February 2013 - 10:34 PM

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.

#3 ComposerCookie   Members   -  Reputation: 109

Like
0Likes
Like

Posted 14 February 2013 - 05:45 AM

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



#4 frob   Moderators   -  Reputation: 20189

Like
3Likes
Like

Posted 14 February 2013 - 06:06 AM

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.
Check out my personal indie blog at bryanwagstaff.com.

#5 ComposerCookie   Members   -  Reputation: 109

Like
0Likes
Like

Posted 14 February 2013 - 06:27 AM

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?



#6 turch   Members   -  Reputation: 590

Like
2Likes
Like

Posted 14 February 2013 - 10:24 AM

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);
        //...
    }
}

Edited by turch, 14 February 2013 - 10:39 AM.


#7 Khatharr   Crossbones+   -  Reputation: 2959

Like
1Likes
Like

Posted 14 February 2013 - 05:08 PM


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.

#8 ComposerCookie   Members   -  Reputation: 109

Like
0Likes
Like

Posted 14 February 2013 - 05:46 PM

 

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



#9 Khatharr   Crossbones+   -  Reputation: 2959

Like
0Likes
Like

Posted 15 February 2013 - 03:59 AM

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.

#10 ComposerCookie   Members   -  Reputation: 109

Like
0Likes
Like

Posted 15 February 2013 - 09:04 AM

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



#11 Khatharr   Crossbones+   -  Reputation: 2959

Like
0Likes
Like

Posted 15 February 2013 - 10:30 PM

If you're just looking to script behavior why not just embed a scripting language?

Ruby is a bit of a pain in the ass to embed, but others, such as Lua, can be pretty straightforward.

I think I still have a Ruby embed at home in my archives though, so if you're interested I can upload it for you.
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.

#12 Satharis   Members   -  Reputation: 949

Like
0Likes
Like

Posted 16 February 2013 - 06:26 AM

If you're just looking to script behavior why not just embed a scripting language?

Ruby is a bit of a pain in the ass to embed, but others, such as Lua, can be pretty straightforward.

I think I still have a Ruby embed at home in my archives though, so if you're interested I can upload it for you.

This, literally.

 

If you want conditional branches and event behavior like RMXP you're either gonna end up copying most of their convuluted code to basically recreate a scripting system. You would probably fare way better just embedding an actual scripting language and using that. Faster, more powerful, more to the point.



#13 ComposerCookie   Members   -  Reputation: 109

Like
0Likes
Like

Posted 16 February 2013 - 09:27 PM

To be honest I have no knowledge of embedding scripting engine or doing script.

 

So im just doing whatever i can do for now



#14 Khatharr   Crossbones+   -  Reputation: 2959

Like
0Likes
Like

Posted 19 February 2013 - 03:11 AM

If you can write C++ then you should have no trouble picking up a scripting language. Scripting languages are designed with the goal of making it quick and easy to write and change high level code. Lua is a good place to start.


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.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS