- Joined
- Mar 15, 2019
- Messages
- 594
- Reaction score
- 500
- First Language
- English
- Primarily Uses
- RMMV
Latest Version: Cross Engine Alpha 0.20.06.26 Demo Project
What is Cross Engine?
Over the course of the last few months I've been working on my game, and I decided I wanted to combine Altimit Movement and Mog's Chrono Engine. Cross Engine is what I call the big pile of functions that makes both of them work together, giving both pixel movement and ABS mode.
It also includes bugfixes, and QoL features that came up when I was doing things (most of my notes to self thread is included). Basically, this is all stuff I found useful, and hope that other people will find useful as well.
Why's it called Cross Engine? Partially because it's a Cross-Compatible Engine for making games, but mostly because it's a followup to a beloved classic which killed off Chrono.
Compatibility Patches
Cross Engine now works with yanfly's itemcore, altimit movement, yanfly's item spawner, yanfly's doodads, and galv's camera plugin (the last of which is actually essential to avoiding event/doodad jitter).
Also, Ultra Mode 7.
PLUGIN ORDER:
LICENSE:
This is a cross compatibility patch, which means that it borrows heavily from the underlying plugins. Do whatever you want with my contributions, but don't take that as permission to violate any terms for the underlying plugins I'm stitching together. Use it commerically, noncommerically, as a basis for your own compatibility engine, whatever. Please credit.
CREDIT INSTRUCTIONS for using Cross Engine:
For Cross Engine specifically, credit 'Restart', and make sure you also credit Moghunter and Altimit Community Contributors for their massive contributions. Neither of those plugins' terms require it but I think they deserve it
.
DEMO CREDITS:
* Moghunter made the original Chrono Engine, as well as the original chrono engine demo which I'm including.
* The Altimit Community Contributors is the official copyright group listed for Altimit Movement, but I think we all know that it wouldn't have happened without Xilefian.
* Galv's Camera Plugin is included (with permission) in the bundle as well, because it's needed to control the unholy jitter this stack of plugins creates.
* Yanfly gave me permission to include some of the original code when making the YEP_EventSpawner compatibility patch.
What is Cross Engine?
Over the course of the last few months I've been working on my game, and I decided I wanted to combine Altimit Movement and Mog's Chrono Engine. Cross Engine is what I call the big pile of functions that makes both of them work together, giving both pixel movement and ABS mode.
It also includes bugfixes, and QoL features that came up when I was doing things (most of my notes to self thread is included). Basically, this is all stuff I found useful, and hope that other people will find useful as well.
Why's it called Cross Engine? Partially because it's a Cross-Compatible Engine for making games, but mostly because it's a followup to a beloved classic which killed off Chrono.
Compatibility Patches
Cross Engine now works with yanfly's itemcore, altimit movement, yanfly's item spawner, yanfly's doodads, and galv's camera plugin (the last of which is actually essential to avoiding event/doodad jitter).
Also, Ultra Mode 7.
8-directional, 2 directional, and 1-directional Spritesheets:
Sure, a lot of people have 8-directional spritesheets (and I support all the major formats), but how many people have ONE-directional spritesheets?
With Cross Engine, you can take any old image, give it a filename, and put it in.
Save it as $Angel(f1)(d1).png, and BAM, it's usable as an event. No mucking around in photoshop making a spritesheet with four versions of the same sprite.
But that's not all! I also added intelligent sprite flipping, as well. If you named that angel $Angel(f1)(d-1).png instead, it will flip to face left if it moves left, and flip to face right if it moves right.
Split poses and actions
One of the things really dragging down the pace of a chrono engine game is that characters were locked in place while they animated. I have changed the engine so now you have a separate 'pose duration' and 'act duration'. Pose duration means your character is playing an animation, act duration means they can't move or cast anything. I've also added a 'cooldown duration', which lets you move, but doesn't let you cast any abilities.
Intelligent Tag Parsing
1) Tags parse from right-to-left, instead of left-to-right. This seems super minor, but it means that if your base character sprite is $Harold(f4)(d8), and he has a casting pose "_casting(f8)(d1)", then the new spritesheet sizes will take precedence!
2) Filename Completion: Let's say your idle sprite for harold is "$Harold(f4)(d8)_idle(f1)(d1)". In base Chrono engine this would cause rpgmaker to screech to a halt, because it can't find "$Harold(f4)(d8)_idle".
However, upon starting up the game, Cross Engine makes a list of every file in your characters folder. When it checks for poses, it will first check for an exact match. If it doesn't get it, it will check to see if there's any longer versions of that filename. If it checks for "$Harold(f4)(d8)_idle", and can't find it, it will return "$Harold(f4)(d8)_idle(f1)(d1)".
What if there's no match at all? The event keeps its base sprite. In playtesting, it will whine about it in the console. No crashing.
3) Negative values are now allowed for x and y offsets.
Walking actions
You know how in megaman you can shoot your little gun and megaman keeps on walking? Using the tag (walking) will keep your character in the same part of the animation cycle when transitioning into the new pose. Practically speaking, that means you can do the megaman things. If the character isn't moving, it will fall back onto a _static pose, so you don't run in place whenever you shoot.
Standing Pose
One of the big constraints on having fluid animation in rmmv is that your walking frames have to include a static pose used for standing. If you define a 'standing' pose, your character will use that instead when they aren't moving. While you can technically do this with an idle pose, I wanted to have both in my project.
Faint Poses
Mog was going to implement faint/death poses distinct from damage poses, but didn't end up finishing it. I have an implementation of this, so you can have a robot get banged up a bit when it gets hit, then violently explode into a miserable pile of circuits when it dies.
Basic Preloader Function
One thing you'll notice using chrono engine is that whenever creatures change poses for the first time, you'll sometimes see a flicker as the file loads. I have added a function which preloads all poses for a creature. If you enter ImageManager.preloadPoses('Ralph'), it will find 'Ralph_attack', 'Ralph_defense', 'Ralph_is_unstoppable(F4)(d8)(s2)(x4)', et cetera, and preload them. This doesn't happen automatically - you have to invoke it each time you're worried about preloading.
New plugin command: disable_idleposes
Turns off idle poses. Good for cutscenes where characters mugging at the camera is unwanted. Turn them back on with enable_idleposes
Intelligent Rotations
Do you want a magic circle of spinning runes? I've got you covered. In chrono engine, rotations are around the bottom center of the sprite, wherever it is. In Cross Engine, the axis of rotation is the base of the event - the offsets you put into filenames, (y124) or (x12) or whatever, move the sprite without changing where rotations are - so if you have a 128 pixel tall wheel and put (y64) into the filename, rotating it will spin it!
I also have functions that let you tell an event to spin its sprite, and whether or not there's an angle it should stop at. So you can have a compass that always points at the player or at a monster or something.
And if you use the this.rotFaceTarg() function, your bullets will point to face the direction that they're going to move towards. In a move route, put it on the same line, directly after one of the motion-ordering commands (like rLoc, tLoc, shootForward, or shootPastPlayer)
A big pile of helper functions
I've got a bunch of functions with short names for stuff that I ended up doing often, like converting directions to vectors or angles, or making characters move in a specific direction. For instance, being able to type in tLoc(x,y) to get a character to move directly to the location x,y makes writing moveroutes and scripts a lot easier.
Sure, a lot of people have 8-directional spritesheets (and I support all the major formats), but how many people have ONE-directional spritesheets?
With Cross Engine, you can take any old image, give it a filename, and put it in.

Save it as $Angel(f1)(d1).png, and BAM, it's usable as an event. No mucking around in photoshop making a spritesheet with four versions of the same sprite.
But that's not all! I also added intelligent sprite flipping, as well. If you named that angel $Angel(f1)(d-1).png instead, it will flip to face left if it moves left, and flip to face right if it moves right.
Split poses and actions
One of the things really dragging down the pace of a chrono engine game is that characters were locked in place while they animated. I have changed the engine so now you have a separate 'pose duration' and 'act duration'. Pose duration means your character is playing an animation, act duration means they can't move or cast anything. I've also added a 'cooldown duration', which lets you move, but doesn't let you cast any abilities.
Intelligent Tag Parsing
1) Tags parse from right-to-left, instead of left-to-right. This seems super minor, but it means that if your base character sprite is $Harold(f4)(d8), and he has a casting pose "_casting(f8)(d1)", then the new spritesheet sizes will take precedence!
2) Filename Completion: Let's say your idle sprite for harold is "$Harold(f4)(d8)_idle(f1)(d1)". In base Chrono engine this would cause rpgmaker to screech to a halt, because it can't find "$Harold(f4)(d8)_idle".
However, upon starting up the game, Cross Engine makes a list of every file in your characters folder. When it checks for poses, it will first check for an exact match. If it doesn't get it, it will check to see if there's any longer versions of that filename. If it checks for "$Harold(f4)(d8)_idle", and can't find it, it will return "$Harold(f4)(d8)_idle(f1)(d1)".
What if there's no match at all? The event keeps its base sprite. In playtesting, it will whine about it in the console. No crashing.
3) Negative values are now allowed for x and y offsets.
Walking actions
You know how in megaman you can shoot your little gun and megaman keeps on walking? Using the tag (walking) will keep your character in the same part of the animation cycle when transitioning into the new pose. Practically speaking, that means you can do the megaman things. If the character isn't moving, it will fall back onto a _static pose, so you don't run in place whenever you shoot.
Standing Pose
One of the big constraints on having fluid animation in rmmv is that your walking frames have to include a static pose used for standing. If you define a 'standing' pose, your character will use that instead when they aren't moving. While you can technically do this with an idle pose, I wanted to have both in my project.
Faint Poses
Mog was going to implement faint/death poses distinct from damage poses, but didn't end up finishing it. I have an implementation of this, so you can have a robot get banged up a bit when it gets hit, then violently explode into a miserable pile of circuits when it dies.
Basic Preloader Function
One thing you'll notice using chrono engine is that whenever creatures change poses for the first time, you'll sometimes see a flicker as the file loads. I have added a function which preloads all poses for a creature. If you enter ImageManager.preloadPoses('Ralph'), it will find 'Ralph_attack', 'Ralph_defense', 'Ralph_is_unstoppable(F4)(d8)(s2)(x4)', et cetera, and preload them. This doesn't happen automatically - you have to invoke it each time you're worried about preloading.
New plugin command: disable_idleposes
Turns off idle poses. Good for cutscenes where characters mugging at the camera is unwanted. Turn them back on with enable_idleposes
Intelligent Rotations
Do you want a magic circle of spinning runes? I've got you covered. In chrono engine, rotations are around the bottom center of the sprite, wherever it is. In Cross Engine, the axis of rotation is the base of the event - the offsets you put into filenames, (y124) or (x12) or whatever, move the sprite without changing where rotations are - so if you have a 128 pixel tall wheel and put (y64) into the filename, rotating it will spin it!
I also have functions that let you tell an event to spin its sprite, and whether or not there's an angle it should stop at. So you can have a compass that always points at the player or at a monster or something.
And if you use the this.rotFaceTarg() function, your bullets will point to face the direction that they're going to move towards. In a move route, put it on the same line, directly after one of the motion-ordering commands (like rLoc, tLoc, shootForward, or shootPastPlayer)
A big pile of helper functions
I've got a bunch of functions with short names for stuff that I ended up doing often, like converting directions to vectors or angles, or making characters move in a specific direction. For instance, being able to type in tLoc(x,y) to get a character to move directly to the location x,y makes writing moveroutes and scripts a lot easier.
Just like the Chrono Engine which preceded it, you're best off starting with the working demo project and building outwards. The cross engine plugin itself should be reasonably drop-in for an existing Chrono Engine project, but I honestly haven't tried it.
1) Will you make a compatibility patch for (this random plugin)?
If I end up using that plugin in my game, yes. Otherwise probably not, there's a lot of plugins out there.
2) I have a compatibility patch for chrono engine and (some plugin) - will you add it?
If it doesn't break anything, sure.
3) I have a bug report!
If it's in ABS mode, upload either a minimal test case or a bugfix.
4) What if I'm reporting a bug that isn't in ABS Mode?
We've moved on past Chrono Engine. This is the sequel, Cross Engine. Chrono died in the timeskip. It's sad but we all have to live with it. You can report Chrono bugs but I probably won't do anything about it.
4) But what if I have a bugfix for a bug in Chrono mode.
Oh well in that case, sure. Just because I don't care about poor dead Chrono doesn't mean other people don't.
5) I'm using yanfly item core with this and I'm just getting a 'cancel' beep when I try to use a sword or my shield isn't working or whatever
Turn on midgame note parsing.
6) What are the future plans?
I'll keep adding features that I personally find useful, and fix bugs I encounter.
7) I want to take cross engine and make my own thing based on it.
Go ahead, just credit with a linkback, and stick a link in this thread to wherever your project is.
If I end up using that plugin in my game, yes. Otherwise probably not, there's a lot of plugins out there.
2) I have a compatibility patch for chrono engine and (some plugin) - will you add it?
If it doesn't break anything, sure.
3) I have a bug report!
If it's in ABS mode, upload either a minimal test case or a bugfix.
4) What if I'm reporting a bug that isn't in ABS Mode?
We've moved on past Chrono Engine. This is the sequel, Cross Engine. Chrono died in the timeskip. It's sad but we all have to live with it. You can report Chrono bugs but I probably won't do anything about it.
4) But what if I have a bugfix for a bug in Chrono mode.
Oh well in that case, sure. Just because I don't care about poor dead Chrono doesn't mean other people don't.
5) I'm using yanfly item core with this and I'm just getting a 'cancel' beep when I try to use a sword or my shield isn't working or whatever
Turn on midgame note parsing.
6) What are the future plans?
I'll keep adding features that I personally find useful, and fix bugs I encounter.
7) I want to take cross engine and make my own thing based on it.
Go ahead, just credit with a linkback, and stick a link in this thread to wherever your project is.
PLUGIN ORDER:
This is from the demo project, but I'm putting this here as well

LICENSE:
This is a cross compatibility patch, which means that it borrows heavily from the underlying plugins. Do whatever you want with my contributions, but don't take that as permission to violate any terms for the underlying plugins I'm stitching together. Use it commerically, noncommerically, as a basis for your own compatibility engine, whatever. Please credit.
CREDIT INSTRUCTIONS for using Cross Engine:
For Cross Engine specifically, credit 'Restart', and make sure you also credit Moghunter and Altimit Community Contributors for their massive contributions. Neither of those plugins' terms require it but I think they deserve it
DEMO CREDITS:
* Moghunter made the original Chrono Engine, as well as the original chrono engine demo which I'm including.
* The Altimit Community Contributors is the official copyright group listed for Altimit Movement, but I think we all know that it wouldn't have happened without Xilefian.
* Galv's Camera Plugin is included (with permission) in the bundle as well, because it's needed to control the unholy jitter this stack of plugins creates.
* Yanfly gave me permission to include some of the original code when making the YEP_EventSpawner compatibility patch.
Last edited: