Multimedia Fusion 3
From FusionWiki
This page should have a nice plan for what Multimedia Fusion 3 might ideally be like. When editing this page, remember we're aiming for a tight, modular, extensible program, so don't just pile on feature requests. Most functionality that can be left to extensions should be left to extensions - that's what they're there for.
Legacy Support
A forum poll revealed that 71% of users (128 surveyed) would prefer a clean design and new features over legacy support for old MFA/CCA/GAM files. This means by majority vote, one of the following must happen:
1) Legacy support should be dropped in MMF3. Things like "Lives" and "Score" could be dropped, and replaced with tutorials on how to use Global Values for the same purpose. This will result in a much thinner, cleaner and easier to maintain product.
2) Legacy support should still exist, but instead of being in the core itself, should instead be implemented through an importer. The importer could convert the old file to the new format while attempting to keep it functional as best as possible through the new system.
Application General
Custom Frame Transitions
Currently in mmf2 you can only use the default transitions for frame fade in and fade out. In MMF3 It would be nice if users could make their own custom transitions to use for 'fade in and fade out'
About tab properties
The About properties tab on the application has an Information section where you can specify the Author, Copyright, AboutBox Text, Description, Company and Version. Could a copy of these be added to the settings in MMF so the user can specify the default values to use every time a new application is created? Most of the time you would want the same values in these fields.
Updated Folder System
The folder system is very useful but if updated with sub folders it could be much more useful. Sub folders would allow for more organized sorting of graphics for example if you had many different tiles for example.
Updated Layer System
Layers are very useful but to use them with the event editor you need to use objects. There should be a way to access them from events as default built into the main event options. Another useful thing for layers would be to allow alpha channels for each also available to be edited with events.
Internal Variable Management
Currently, MMF2 uses 32-bit signed integers and doubles for storing variables. However, extensions cannot get these doubles due to parameters being passed to extensions as doubles converted to floats converted to longs, then the extension converts the longs back to floats. When it returns, it must convert the floats back to longs, then MMF2 converts the longs to floats to doubles. While the conversion between integer types and floating point types is not a major problem, the loss of accuracy between float and double conversion is. To solve this problem, MMF3 should use signed 64 bit integers instead of 32 bit integers. This will allow the full 8 bytes of either the double or the 64 bit integer to be passed to and from extensions. Not only will integer types have a much larger range, extensions will be able to get, manage, and return doubles in full precision.
Other OS support
It would be nice if MMF3 will support other systems like MacOS or Linux. Although it work pretty smooth on wine, the native version would be great. This way there will be possible to make games in seconds on linux too (without playing with winecfg and wonder why HWA don't work correctly)
Extensions
Container/SDK
The extension (including edittime data like the information, menu content and images) should be contained in a SINGLE archive with an XML file, and all the different versions of the extension for different runtimes. This would make it easy to have SWF/Java only extensions without touching C++. The C++ runtime extension SDK should look like the Java and Flash SDKs, and the edittime SDK should be separate.
Event based extensions could also be contained in this container format, thus looking identical to normal extensions, although coded in events and runtime independent. Many of the current extensions and movements could be implemented as event based extensions.
All SDKs should ensure the exposed internal structures and interfaces are documented well so as to make development easier and to not require trial-and-error experiments or unreliable code. In addition, they should expose as many of these structures as safely possible to allow more flexibility and capability in extension design.
All floating-point communication between the application and extensions should be done through double-precision floats and at no time should these be converted to single-precision before reaching either, as is apparently the current behavior.
Hooks
Alongside actions, conditions and expressions, extensions should be able to hook/override MMF3's behaviour. Extensions like PMO or Iso Grid could be rewritten using this functionality, for example:
You drop the "iso grid" plugin in your frame, and it immediately adds "native" support for the Z Coordinate. This way, X and Y coordinates are automatically translated to isometric X and Y coordinates instead of the common X and Y coordinates we are used to. This eliminates the need for manually coding an iso platformer from scratch, since things will be done much more intuitively. It would also change how directions work, perhaps even modifying the "8 directions" window to something that better reflects the iso nature.
You drop the move safely 2 extension to your frame, which reconfigures the way collisions are handled in that frame, giving you the functionality of the extension while being completely transparent to the user.
Built In Updater And Management
Rather than needing 3rd party tools MMF3 should include a way to download and update new extensions directly within the program. This could be linked to some sort of API or website system that developers can easily add new versions to and these are hosted by clickteam so they are always available and easy to find for users.
As well as a updater there should also be some form of management system that would allow users to add extensions to a favorites folder for example to instantly find again, search features, custom tags and notes/descriptions and it could also have more advanced sorting by date, name and developer etc.
Global Resources
MMF already includes some support for making certain things global, however this could be vastly expanded. In particular, the ability for qualifiers to be global and allowed in behaviors would be a considerable improvement in application development, especially those such as engines which benefit from code reuse.
Better would be if all data in MMF (where it makes sense) would be global. For example, animations would not be tied to a single object but could rather be shared between completely unrelated objects just by referencing the global database. Functionality to create local copies of this data (for when you don't want modifications to one set of objects to affect others) would also be useful. Similarly, behaviors would no longer be bound to specific objects but could be shared between objects as well.
MMF3 could introduce two built-in object references to make the above easy to use:
- A "self" reference, which is the object running code at that point in time
- An "other" reference, which contains one or more objects and is usable at certain points in the program, such as during collisions. It can also be used by, for example, Object A in order to retrieve Object B which had executed code affecting Object A (such as Object B calling a "destroy" action on Object A).
However, these would depend on improvements made to the object selection system in order to make their effects easily predictable and reliable. Qualifiers allow some of the above functionality but again are not global, apply only to objects within that qualifier, and occasionally have unpredictable selection behavior. Improving MMF's object interactions in this way would substantially increase the power of its object system.
Global icon identifier
In the object shelf of the frame editor, add some sort of indicator (eg: an icon or a red border) on any objects that are marked as global objects similar to the way objects with behaviours are marked.
Global Editor
Add a new window for the Frame editor that works like the object shelf but shows only global objects in the application.
o Allow any object to be dragged out from this window into a frame to put a copy of that global object in to the frame.
o Likewise, dragging a non-global object from a frame into this global window would convert the object into a global object.
o The global flag in the properties should remain, this global window is just to speed things up (so you don’t have to hunt around other frames to find a global object) and also serves as a list of what objects you have defined as global.
Object Behavior
Default Movements
Some of Multimedia Fusion 2's Default movements are in really bad shape. Most are very buggy and are hard to work with especially the default platform movement. In Multimedia Fusion 3 there should be a tremendous improvement to the default movements so that they will be almost bug free and very easy to use. Also, in MMF3 there should be an option to use two default movements at the same time.
Pathfinding
MMF3 should have a movement that allows active objects to find paths around obstacles to get to a particular object or place.
Bouncing Ball
Currently in MMF2, objects with the bouncing ball movement will travel in random directions and bounce off walls with a user defined speed, however the problem with this is, the movement is not pixel perfect, which means the ball can get stuck in walls sometimes and can cause serious problems in some games. This can cause problems specifically when a ball is moving at high speeds. In MMF3 this problem should be fixed and the bouncing ball should have a 'if stuck' algorithm if the ball happens to get stuck in a wall. The new method should happen like this.
1. If the ball gets stuck in a wall like this.
2. The ball should calculate the nearest open area where there are no walls. In this case the nearest open space is to the left of the ball.
3. The ball should NOT move to the top of the object if it gets stuck in a wall, because this could also cause serious problem within a game.
The moving out of wall if a ball is stuck process should happen immediately. With no delay or lag if possible.
Eight Directions
Right now in MMF2, the eight directional movement works fine, except when using a stop action along with a collision with backdrop condition. If you have an active object, and it has eight directional movement attached to it, and you add a event that reads:
Active collides with the background
- Stop
The active will appear to be bouncing continuously with the wall every time it collides with it. This problem should be addressed in MMF3, and the fix should make the Active come to a complete stop with no bouncing motion added to it.
Another Problem with the eight directions movement is that, if a object that has eight directional movement and it gets stuck in a wall.
It will be stuck there forever. In MMF3, eight directional movement should use the same 'if stuck' algorithm as the bouncing ball movement, described above.
Platform Movement
In MMF2, the default platform movement is horrible to use and it should be discarded entirely. In MMF3, the Platform movement object extension (PMO) should become its replacement. In addition to being its replacement the PMO should have some major improvements like:
- Easy support for moving platforms of any directions
- A on slope condition that could indicate if an object is on a slope or not. This could be useful for objects that need a animation for walking on slopes.
- Customizable gravity. You should be able to change the x and y gravity. (Useful for objects that walk on ceilings, wind effects that push the character etc..)
- Use the same 'if stuck' algorithm as the bouncing ball movement, described above.
Racecar Movement
The race car movement should also be discarded and replaced by the 'Advanced Race Car 2 object' extension made by Lior Halphon. - do not agree, all movements should remain (would be nice to see improved, eg: skidding on this one) but advanced movements should be added and this would be a good category for it.
Pinball Movement
In MMF2 the pinball movement has the same 'if stuck' problem as the bouncing ball movement. It should also use the new 'if stuck' method that the bouncing ball uses described above
Spaceship Movement
Add a maximum speed.
NEW: Computer controlled platform movement
Computer controlled platform movement – Like the current platform movement but takes no input from the player. The computer controlled object will walk over the scenery and have conditions to test for things such as reached end of a platform, is falling, etc. Actions could include Jump, turn around, wait in position for some time, allow fall off edges /auto turn around etc.
Path Movement
Path movement – new editor, show multiple paths (and allow repositioning in editor for testing). Allow branching nodes. Grid option for placing nodes. Add curved line support. Nice to have: Allow editing / viewing of the path movement in the frame editor directly for a selected object.
Hardcoding
Maybe a way to solve some or all those problems would be to make all movements open, and done in events. This way, no movements would be harcoded, and MMF3 could still ship with some standard movements (but redone in click form) - and the user could fix and adapt the movements him/herself.
Positions
Position of objects should be through floating point numbers, preferably double-precision floats. Most movements use floating point internally, and since most custom movements use alterable values as stand-ins for the real object position, so it makes sense to change this over - especially if movements are no longer hardcoded for MMF3.
Physics
MMF2 currently does not have a default physics engine, or a way to natively handle physics. In MMF3, a Box2D-based physics engine should be inbuilt. The hook idea would probably solve this problem.
Object hierarchy solution
Creating an object hierarchy of linked objects that can be manipulated is not easy in MMF, even with some excellent extensions. A cool way to solve this and add more functionality would be to allow a frame to be created where objects and events can be programmed as normal. Then a new object called Complex Object which is a little like a cross between an event behavior and a sub app, could be added to any other frame. The object would select a frame to use as it's base frame. The object would then show the contents of it's base frame but be treating in the current frame as just one object. When the application is run, the events from the base frame would be combined with the current frame (like event behaviors). Conditions in the current frame could be used against the complex object, such as collision tests. This would allow you, for example, to make a Boss character with moving parts and its own behaviors defined in the base frame, to be used with ease in any other frames and treated there as one object.
Collision Masks
Active objects in MMF3 should have their own customizable collision mask with individual hotspots. This would prevent users from having to use a active object for collisions and a active object for a sprite.
Vector collision masks would be nice, that way the collision of a "ball" object could actually be circular and it could bounce correctly off of any angle of surface.
Dynamic alterable values
Rather than having a set list of values from A-Z, allow the user to add the alterable values/strings to the object himself - that way every alterable value is known by the user and can have as many or as little of them as he wants per object.
Every object/extension should have alterable values and strings. The user should decide which objects get to have alt values and strings, not the extension/object developer (or be mandatory for all objects).
Behaviours and Qualifiers
Change how behaviors and qualifiers work. Instead, an inheritance system would be implemented.
Say you want to create an orc warrior for your RPG
How it is done now
You create an active object. It has two qualifiers, "enemies" and "1" (because we cannot rename qualifiers, ideally it would be "enemies" and "orc")
Because it has the "enemy" qualifier, it knows it has a health bar, and it knows when it takes damage. Because it has a "1" qualifier, it knows it is agressive, strong and shouts orcish stuff at the player. Everything else has to be copied manually.
How it should be done
The enemy inherits (as in: copy) the set of properties and behaviors from the class enemy (so it has a health bar, knows it is supposed to attack the player, etc), inherits the properties and behaviors from the class "orc", some P&B from the class "aggressive", some P&B from the class "melee" and so on and so forth. This way, you can create an orc warrior that just has a different sprite, while the programming is automatically inherited. This also opens up the possibility to create various orc warriors (fast orc warrior, strong orc warrior, orc warrior lvl 2, or warrior hard difficulty) from the same blueprint. You could have infinite classes, and your code could be reused for other games.
Qualifiers and Alterable Values
If all objects of a certain qualifier all have "Alterable Value A" as "health", then the qualifier's alterable value "health" should at least be able to be called using "health".
Change Qualifiers at Runtime
This would be most useful for people creating Beat-em-Ups. You could code for the Player Qualifier and the Enemy Qualifier independantly and then at runtime choose which qualifier to apply to an Object.
For example a Beat-em-Up player select screen. Player selects Good Guy, add Player Qualifier to Good Guy object and add Enemy Qualifier to everything else. Now your selected player has the correct control system which you coded in.
String Objects
- String objects need alterable strings and values. This has been requested endlessly.
- String objects need the SemiTrans() property/expression. This may be achievable in MMF2, but I am unsure if it will be added.
- When creating an active from a string object, the string object should put each of its paragraphs into the active object as different frames. This would be extremely useful in eliminating the tedious task of either creating them one by one or drawing them all in the image editor then finally doing the alpha channel.
Static Objects
There should be two types of objects: Static and dynamic. In MMF2, all objects are dynamic - Static objects are not visible in the frame editor but appear in the object list. It is not possible to create them at runtime and you cannot put two of them in one frame. This should improve the performance without removing any crucial features. There aren't many (if any) situations where you'd need multiple Window Control objects, for example.
Expression Editor
- The syntax should be changed. Instead of X("Active"), it should be Active.X - this would make expressions much more readable, and allow for intellisense including alterable values, expressions, and expression parameters for all objects and extensions. ReadInteger("BinaryArray", 0) would become BinaryArray.ReadInteger(0), with a list of the expressions and alterable strings/values of Binary Array shown upon typing the dot, and the list of parameters (only "Index" for this expression) shown upon typing the opening bracket.
- A macro system should be implemented, similar to #define in C++. For example, Sine(Value, CycleLength, Minimum, Maximum) could be defined to Minimum+((1+sin(Value/CycleLength*6.283185307179586476925286766559))/2)*(Maximum-Minimum), and then the Sine function could be used in an expression, expanding to the full formula at build time.
- To replace the Immediate If object, it should be possible to use logical operators in expressions (which either return 0 or 1). Plus, the ?: operator (Condition ? ValueIfTrue : ValueIfFalse), known from languages like C++ should be available as well.
- Division should be performed using floating point all the time, not just when ".0" is in the expression. Too many new users are tripped up by this. The old behaviour could be preserved as a different operator, e.g. "div" or the other slash "\".
- Escape sequences should be used, like \" instead of the silly "" to include a quote in a string. All escape sequences could be supported that way (like \n for a newline, \x01 for a 01 byte..)
Event Editor
Comments
Users should have the ability to add comments to actions and expressions.
Sub events
Just like subgroups but with events. For example, I'd like to wrap a whole lot of different events within a single "Alterable Value A of Active = 1" event to make that series of different events only apply to Actives with which alterable value A's are set to 1. In other words, the filter from the parent event is kept and used in all sub-events so the check never needs to be repeated.
Find and Replace
The ability to find and replace code by other code should be added. We could explore expressions or actions.
ForEach condition
A “ForEach” condition that works as a fast loop on the specified object. IE: adding a ForEach “Active 1” condition to events would run a fastloop on each individual instance of “Active 1” and apply the actions on them. Could be combined with other conditions, eg: ForEach “Active 1” + Where “Active 1” alterable value a = 1. Also this could be used on objects that do not have alterable values.
o Note that the “ForEach” can be done now in MMF but requires many conditions to set up… ie: Spread a value action to give each active object a unique number, then start a fastloop, then two conditions are required, 1- for the fastloop condition and 2-for Alterable value = Current loop index.
Object Selection
Something needs to be done about they way objects are selected in a condition/event.
Perhaps a submenu of conditions for an object might make it clearer, eg.
'Select By' -> -'Alterable value a ==' etc -'Object in play area' etc
Something that would make it obvious as to why using 'compare two general values' won't work, but 'compare alterable value a to a value' will.
Recursion needs to work from fastloops, saves confusion. I don't see why that change shouldn't be made, except for legacy reasons.
Perhaps the Debugger should display info about the selected objects during recurring actions.
The functionality of the Select object should be inbuilt.
Else-ifs and Elses
Else-ifs and elses should be integrated into MMF3, because they make code simpler and shorter.
Frame Editor
Interface changes
Have a split view of the events (on top) and the frame editor (below) including the option for live view, running the frame inside this split view. Similar to the recent Dreamweaver interface.
Global event editor button
Buttons to access the Global event editor alongside the Storyboard, Frame, Event editor buttons.
Scrolling
In the frame editor, the display should use the scrolling coefficients. Right now it is nearly impossible for users to place backgrounds so they will show up at specific locations when you run it at runtime. Doing this (in the frame editor) allows you to scroll to any location and then place objects where they should show up in-game relative to your other layers.
This might even remove the need for virtual width/height and wrapping altogether since you can simply just resize your quick backdrops so that they extend all the way to the other side of the frame (with the scrolling coefficients taken into account).
New Create Backdrop-type option
When right click and choose Create - Backdrop object on an active object, one background object is created using the first frame of the default animation. Would like another menu option added: Create - Expand as backdrop objects. This would create a background object out of every frame in a selected animation / direction (the user would have to specify which animation and direction to use).
Object label position
When an object is selected, the instance number and layer is displayed over the top of the object. If the object is small, this label can obscure it completely. Could a preference be adding to the settings to:
- Choose where the label is positioned (eg: top left, Above, Below, Left, Right, etc). Above would place the label above the object rather than over it.
- A setting that would only show the label when holding a key, eg: Ctrl or Shift.
Quick access to Event behaviors
When right clicking on an active object add a Behaviour menu option with sub menu items for each behaviour that is on this active object. Clicking these would take you to the event behaviour editor.
More sort by options
In the frame's object shelf, would be good to have more sorting options. For example, to be able to sort by (or group by even) Globals and objects with behaviors.
Behavior Editor
Please, make it not clear the undo history whenever the game is tested. It's awfully annoying.
New: Instance behaviors
A new Behaviour event type – An Instance Behaviour. When creating a new behaviour on an object choose to create either the standard event behaviour or an instance event behaviour. The Instance event behaviour works the same as a standard behaviour, but each event is automatically (and invisibly) tagged with the “ForEach” condition, so all events will be executed against each instance of the object the behaviour is attached to using a fastloop.
It will only select the instance that is running it. For example, when the behavior says that it should select a random direction every four seconds, that random direction could be different for all instances.
Animation Editor
Some improvements to the animation editor would be appropriate.
Import tilestrips
Ability to import standard tilestrips for animations – ie: a grid of 32x32 blocks arranged in, for example, 4 columns and 3 rows = 12 frames of animation. This method would not be able to set the hotspot or action spot (default to top left) but is a big advantage for compatibility with other graphics packages (eg: Graphics Gale, Photoshop).
- Import a tilestrip via the normal import button in the picture editor. Allow user to specify the number of frames to import and the height and width of the frames.
- Import a tilestrip via copy & paste (eg: Ctrl+Shift+V for tilestrip import) – ask how many frames to import, width and hieght and place them in individual frames from the current selected position.
Export tilestrips
Ability to export frames of animation from the picture editor, this is important to allow graphics to be edited in other applications such as Photoshop for example
- Export in MMF’s format (bounding boxes with the action spot and hotspot)
- Export in the tilestrip format (ask how many columns and rows)
Vector Images
As MMF now supports Flash export, it would be desirable to include native SVG support for this runtime. Compatibility with an open vector format such as SVG is desired so users can interact with MMF3 using open source vector images program.
Interface
The cancel button could be moved further from the OK button. Alternately, a confirmation dialog could pop up. The list of animations would also do well with a 'New' button at the bottom, to save for right clicking and a way to go to the next/previous frame using hotkeys (this would save time when positioning action points and hot spots)
Points
An object should support more than one action point. I don't think this needs further explaining.
Swatches
We could have a customisable set of colors that can be changed at edit time. It would be useful for using a particular color scheme, as you could have a few different colors and lighter and darker variations of them. An additional feature would be to allow you, in the event editor, to change the hue of a set of swatches. This means you could replace the blue color with a red one and have the darker shades change with it, making different color variations easy.
Grid
A toggleable grid could be introduced to improve precision in pixel art. Additionally, it could be custom tailored to an individual's color preferences. A semi-transparent column and row highlight could be added as well.
Layers
Multiple layers would work wonders for artists trying to do large works. The different body parts of a character, for example, could be on separate layers, and then moved around separately for animating.
Opacity
Allow the user to draw with opacity in the transparent parts of the images - so they don't have to go to the alpha channel.
Hardware-acceleration
Using the advantages of HWA
HWA is based on Direct3D, an API that is used for almost all major 3D games on Windows. It is known for providing a wide range of features to create complex and realistic video games. However, MMF2 does not utilize all of these. Currently, there is no way to rotate objects or frames along their X and Y axis. Even though MMF2 supports pixel shaders, vertex shaders, however, are not supported. These can be used to modify the three vertices of a triangle - Each object in MMF2 HWA consists of 2 triangles (1 quad). Also, there is no way to move an object along the Z axis. You could easily create nice zoom and depth effects with this feature.
A step away from the default runtime
Most games rely on hardware-acceleration nowadays. The graphics standards become higher every day, and there is no way to keep up with them without using HWA.
HWA should be a major part of MMF2, not just a separate EXE. It should be integrated. Even nowadays, many people use HWA for their games - For example Luor or Saira.
The display modes like DirectX and Direct3D 8 should be removed, because they are deprecated/useless and a waste of time to maintain.
Effect Stacking
One feature that is useful for HWA is a way to use multiple effects in combination for a single element. Even though HWA now allows many more things to be done this limitation means you have to workaround this using other methods like combining effects with code for example so there is a big limitation on what can be done still.
