Impact

This forum is read only and just serves as an archive. If you have any questions, please post them on github.com/phoboslab/impact

1 decade ago by drhayes

I've been trying to blog about my RPG-ish project and the useful stuff I'm writing to get it out the door.

Here&039;s the post about what I'm calling <1>. It's my attempt to stop littering my code with #if (timeElapsed > 32) ... type code to provide scripted entity behaviors. There's an associated event chain GitHub repo.

I've also started working on the Sublime Text 2 ImpactJS plugin. It's available through Package Control (you're using Package Control, right?). I tend to update the plugin when it solves an immediate need of mine; if you think feature X would be useful then please file an issue and I'll see what I can do.

1 decade ago by mimik

sublime plugin? Thats awesome!

1 decade ago by bitmapshades

looks like just the thing I need for making scripted events which is awesome!

1 decade ago by taddeimania

I used entity chains in my feb 1gam and I am so glad I did. It made scripted events so much easier. Even optimized certain game state checks to not do calculations every update loop. Your code is clear and has tests. Two thumbs up.

1 decade ago by drhayes

Fantastico! Glad to hear it. Got any suggestions for improvements? I was going to add orUntil which takes a function and interrupts a wait.

1 decade ago by fulvio

@drhayes: EventChain sounds brilliant and I might use it in my game :)

I implemented it in the following way for my player class just to test it out:

update: function() {
    var cx = this.pos.x + 10;
    var cy = this.pos.y;
    var chain = new EventChain()
        .wait(2)            // Wait for 10 seconds.
        .then(function() {  // Then spawn an entity.
            ig.game.spawnEntity('EntityCoin', cx, cy);
            console.log('Coin spawned at [X: ' + cx + ', Y: ' + cy + ']');
        }).repeat(3)        // Repeat that 3 times.
        .wait(2)            // Wait some more.
        .then(function() {  // Then spawn a different entity.
            ig.game.spawnEntity('EntityPotion', cx, cy);
            console.log('Potion spawned at [X: ' + cx + ', Y: ' + cy + ']');
    }).repeat();            // Repeat the whole thing forever.

    this.parent();
}

Unfortunately it doesn't seem to be doing anything. Have I missed something?

1 decade ago by drhayes

@fulvio: Yup. Try moving that chain instantiation to your init method.

init: function() {
// ...
this.chain = EventChain()
   .wait(2)
   // etc...
},

update: function() {
   this.chain();
}

You&039;ll have to move the #cx and cy around, maybe make the chain reference this. I was thinking about changing it to take a reference on creation to set the context to run all those functions in so this works within them; that would make your case much easier.

1 decade ago by fulvio

@drhayes Ahh, that makes much more sense. Thanks, working great now!

1 decade ago by taddeimania

Drhayes: I do have some ideas. Keep your eyes open for a pull request :)

1 decade ago by fulvio

@drhayes: EventChain is bloody impressive. I removed countless amounts of code where I was using delays, stages, spawning, etc all over the place. Now I just throw an EventChain into the init() and trigger it from the update() and BANG!

Props to you for creating that function. Good work!

1 decade ago by drhayes

@taddeimania: Great! It'd be my second pull request ever.

1 decade ago by Neeko

This is almost embarrassing to ask, but how do you include the EventChain in your entity? I understand how to setup the actual chain in the init function, but how do you include the reference to the EventChain function in eventChain.js?

Edit: Solved. From the Impact documentation,

The name of a Module directly corresponds to its file location and name. E.g. the file lib/mygame/my-file.js must define a module with the name 'mygame.my-file', so it can be properly loaded from other Modules.


eventChain.js defines its module as

ig.module(
  'game.system.eventChain'
)

so I added eventChain.js to my lib/game/system directory, and in main.js, I added

.requires(
    // Requiring other modules...
    'game.system.eventChain'
)

Being global, I can then call EventChain from my player entity, as documented

this.chain = EventChain(this) //etc...

1 decade ago by fulvio

The way I use EventChain is like the following:

.requires(
    // Requiring other modules...
    'game.system.eventChain'
)

Then inside your Entity:

text: "foo",
moreText: "bar",
activateEventChain: false,
chain: null,
init: function(x, y, settings) {
    ...

    var self = this;
    this.chain = new EventChain()
        .wait(0.5).then(function() {
            console.log(self.text);
        }).wait(0.5).then(function() {
            console.log(self.moreText);
        }).repeat();
},
update: function() {
    if (this.activateEventChain) {
        this.chain();
    }

    this.parent();
}

You should see a "foo" and then "bar" repeat in the console.

1 decade ago by drhayes

I'll update the documentation to include an "Install" section to clear it up, too.

1 decade ago by drhayes

I added a new method called waitForAnimation so you can pause your chain while an animation completes.

You can give it a particular animation or you can just check the current one.

Let me know if it's useful or if you have any questions.

1 decade ago by Neeko

Very nice drhayes, thank you! I actually came across this scenario the other day and used a wait() in the middle of the chain to wait for the animation to play, like so

this.deathEventChain = EventChain(this)
                .then(function() {
                    this.deathFx.play();
                    this.currentAnim = this.anims.dead.rewind();
                })
                .wait(1)
                .then(this.kill)
                .repeat();

Of course, hard coding the number of seconds to wait for each type of animation isn&039;t an elegant solution at all. Thanks again for adding #waitForAnimation!

1 decade ago by Joncom

Installed the Sublime Text 2 plugin and restarted the app. Don&039;t seem to see any differences, such as auto-completion for #entity.health or really anything that wasn't already showing up before the install. Anybody got the Sublime Text 2 plugin working?

1 decade ago by drhayes

You shouldn't have to restart. Are you using Package Control to install?

The plugin doesn't immediately change the syntax to ImpactJS for any JS files. I couldn't come up with a way to detect whether or not you're editing an Impact game reliably from the path alone so you have to do it manually.

If you launch the command window (SHIFT+COMMAND+P on a Mac) and type "impactjs" the only choice should be "Set Syntax: ImpactJS". See if that helps.

Incidentally, a recent pull request added the ability to mixin your own EventChain methods.

1 decade ago by stahlmanDesign

@drhayes I just set up Event Chain and it works great.

Another way it can be used is as a mood manager. Imagine a zombie that gets hungry and seeks food for a while, then sleeps... or a normal character that wanders and then changes into a werewolf... then back to normal, etc.

I'll be watching to see if you add any further developments like the mixin.

1 decade ago by drhayes

Thanks! I never would have thought of the mixin myself; that came from a contributor.

You should check out my state machine plugin: https://github.com/drhayes/impactjs-statemachine

I'm using it for AI in the RPGish thing I'm working on to track aggro, etc... event chains definitely help with the transitions. ( =
Page 1 of 1
« first « previous next › last »