RafaelMatos's Forum Posts

    I'll advise my clients and the users of my addons to keep using the last version supporting SDK 1 so i'll still be able to help them to achieve their vision and to develop powerful tools for them.

    The addons i made for private use + all the addons the community made are worth about 4-5 years of vanilla update at the pace features targeting actual gamedev are pushed. (Not even counting all the very specific addons I made to target my own production needs, just speaking about stuff that feels Vanilla here).

    => The tradeoff is not worth it even if some top suggestions requested for many years like Hierarchy View, Better 3D or Family Inheritance gets added in the upcoming years - which i doubt, it would still not worth dropping the modularity/flexibility Addon SDK1 allows, all the custom features already made by 3rd party devs and the fact I know i can implement almost anything I want when i need it.

    Overall it really hurts my faith in the engine, as such unilateral decisions hurting gamedevs subscribers keeps happening again and again and i'm not confortable with the feeling i don't have any ownership over my own work, so i'll keep digging in the free Open Source alternatives, made by gamedevs for gamedevs, that are growing at light speed in term of popularity/features/resources such as Godot (for full desktop/console/mobile games) and GDevelop (for little no-code/web games). It's disheartening but it just feels too risky to bet long term in C3.

    Overboy Since I use all your addons from itch, I think I'll just stop updating C3 very soon =/

  • Well... that depends...

    It isn't so much about complex ai at this point, its about the need to abstract the complexity of the character handlers.

    I'll lay it out as best I can.

    In monogame with c# or in unity, you can create a framework of components that interact with each other with no performance concern. The framework that allows you to create a component based, dynamic set of character handlers in c# will involve very little overhead and running 1000 objects with that behavior with be nothing if more than a fraction of 1 percent of the cpu usage. But the same thing in c3 has tremendous overhead, without even considering adding the actual gameplay functionality and logic (like collision solving). You can already have a project running at 60-80% load with just an empty framework. As great as the event sheet/sol paradigm is, it is aweful for handing instance specific logic, when those instances must refer dynamically to other instances of unknown type. It also doesn't hadnle functions very well either. You end up with alot of ForEach Object loops, and pick another object by UID, loops. Each blank event in the event sheet has an overhead to simply iterate. Doing a forEach (1000 objects -> set variable) will basically have the overhead of processing 1000 events. While a pickAll (1000 objects -> set variable), will only have the overhead of processing one event, with an internal engine side loop to iterate the objects. The latter event is WAY faster than the former, but because we have no way of dynamically referencing other objects other than UID picking, you have to run for each loops whereever. You can create hierarchies, but if the dynamic reference is to external objects, again, you have to end up picking by uid. Sorry for the block, hopefully that all makes sense.

    The only viable way I have found is to take as much of the framework and put it into behaviors. this way you can minimize the need to refer to uid compound objects and foreachloops. But, behaviors don't take to each other very well. Scirra made behaviors like Solid and Platformer "Cheat" by having an internal engine link between the two, that you can't create because you can't extend the engine. And, since behaviors can't be extended things can get tricky there as well.

    Every Character has a number of required components. They need to know their physical state (on the ground, touching a wall, in the water, etc...), handle collisions and resolve physical overlaps, handle command inputs (move up, do thingA, etc).

    The most complex character would be something like this:

    State data: Up, down, left, right, surounding surfaceangles, water(full submerged, surface, ankledeep), edgeleft, edgeright, and a few others for testing passthrough.

    Colliders: head, foot, sides, high sides, collection, hit, + a few

    Each one of those colliders or state checks is going to require a collision check. From there, the most complicated characters with have 20+ input commands to track. Each of those needs to be buffered from frame to frame for allowing combos, etc...

    Now comes the list of potential "Characterhandlers" (routines that control how the character moves). These are conditionally applied based on input/commands and the particular state of the character. these Handlers are basically treated as abilities, with their data being stored as modifiable stats (such as lateralAcceleration)

    Ontop of that, each character has an inventory of abilities/items. With those abilities come stats that can be dynamically altered by other characters, weapons, etc...

    If you make every entity a family that handles all of the above, you get 95% more features than any entity needs. A character doesn't need the stat "acceleration", if it never accelerates. It doesn't need a state check for bonking its head, if it never can bonk its head. And so on... If you put it all in one behavior, that one behavior is also overkill for 90% of objects- and also requires a large amount of back and forth with ACES to communicate effectively with other interacting behaviors.

    The ai for all these guys is pretty dumb and basic. The issue is that a rocket, dumb as it is, is carrying fuel, is flammable, has a steering behavior with a homing ai, a number of stats such as armor, fuel capacity, etc... If the rocket was launched from a weapon that confers other abilities or stats. So a rocket, isn't always the same rocket in the game.

    And the reason to have a 1000? Because... its like vampire survivor. Not like the game, just the fact that there are alot of baddies and bullets

    Overboy 's addons help alot with instance picking. Check his itch for more info

  • These disappointments would be avoided if Scirra had a better communication about their own releases. Don't get me wrong, but Scirra's weakness has always been communication. For instance, poor video presentation about the changes, basically an amateur video, meaning you just start recording your screen and start talking superficially about the changes. The Construct is not even in full screen sometimes which makes it harder to see. Seeing your desktop is not very proffesional as well, you know

    Not to mention the business communication/marketing. But I won't extend myself much more about this as this topic is not about this subject. I just ask Scirra to read this as a critic coming from someone that hopes all the best for the company.

  • Scirra could you just implement a Hierarchy View instead of spending too much time on Flowchart if all issues raised won't be solved and it's just meant to be a data structure.

    Because I'd rather do my branching systems by creating parent/child relationshop between Objects (that would be my "Nodes") with all the features they already have (multiple families / instance variables / Custom Actions/ templates / User-friendly pick child condition / Find all Refs etc...) to create my Dialogue or Behavior trees. All we need is a cool Hierarchy View that would also be useful :

    - for anything related to Hierarchy : to create relationship via drag an drop, visualize them without green arrows on layout

    - for any workflow involving finding/selecting instances on a layout : find instance via search bar, selecting instance without worrying about Zorder/Unlocked Layer ect..., organize stuff easily

    https://construct23.ideas.aha.io/ideas/C23-I-61

    ☝☝☝

  • This way you're doing you'll always add the player name at index 0. You may want to use Push instead, just don't forget to verify if this player is already in the list or not, for that you can use the array action Contains Value.

  • Here's an event based way

    https://www.dropbox.com/scl/fi/0zafmr4lyclg3mmcodkea/hex2color.c3p?rlkey=6ird9o8ud8opsp2k3v7chtb3x&dl=1

    Thank you Rojo, this is super helpful! ❤️

  • You do not have permission to view this post

  • It seams quite powerful. Some of these use cases you mentioned can still be done with vanilla c3 features but others are quite difficult or impossible to achieve. How is it integrated with the engine? Is it like the Utils? Relying on this just to be broken after some construct's update is always a concern about plugins/behaviors in general

  • I think I know what Overboy means and I'm pretty dumb with programming. Correct if I'm wrong but a good example of this is Godot's custom signals + autoload(singleton) and the possibility to assign this trigger to any block without caring who is listening and who is calling and to assign parameters/objects. However, I want to say this respectfully: through all these years I always have had the impression that Scirra should literally use other game engines more to know why some features are so important but somehow is treated like a minor thing because sometimes feels like Construct is more of a general purpose software than a game engine due to the, perhaps, the lack of a proper game engine experience and its needs

  • This plugin does exactly that and more

  • Overboy Hello mate. I just wanted to address some issues. Utils.remap and Utils.o are freezing C3 for me and the array as a behavior is creating a bunch of them. I have no events, I just added it to the object. Here is the print

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • > Does it have autocomplete for existing keys?

    RafaelMatos

    As the Dictionnaries and Arrays Objects you're using, it doesn't have autocomplete for existing keys by default. (This would be impossible to achieve in Construct 3 for any kind of Data Plugin/Behaviors)

    However, I have included my favorite tips and tricks in the example .c3p provided in the Addon Pack.

    One of them is to use Constant Global String Variable as your Keys, especially the keys that you know that you'll use a lot :

    • This way you'll get autocompletion
    • If you want to reorganize or rename your Data/Properties later, it will auto-update everywhere, you won't have to manually edit everything one by one .
    • Also you can Right-Click > Find all references of that global variable easily to find every single place in Eventsheets where you used that Key
    • (Of course, you can also use Local String Variables if you only need that key in a specific scope, for example if all my Inventory Logic is under the same "Inventory" Group in my Eventsheet, i would use local variable instead)

    That's exactly what I do and I actually wanted to avoid this extra work somehow XD. Thanks for the quick response.

  • RafaelMatos

    Yes JSON+ would definitely help for that purpose, not only because it would be far easier and efficient to pick and to use, but also thanks to all the enhancements that are provided in JSON+ and listed in the addon page.

    As I explained 2 messages above, it allow you to nest any amount of data under the same behavior. You could replace most if not all your Arrays and Dictionarries with a single JSON+ Object or Behavior if it makes sense in your Project.

    You can create/nest JSON arrays at any Path and JSON+ comes with handy Quality of Life enhancements and ACES for Arrays.

    Does it have autocomplete for existing keys?

  • Overboy Thanks for the explanation

  • I'm not sure how UID to everything works. If I don't ever mention the object/family how would I know/ensure the UID is the one I need? Kinda confused about this tool's proposition. Prints of a more practical use cases would help a lot to know upfront. I'm tempting to buy it because instance picking can be quite troublesome and repetitive, even using functions in order to not repeat some of the picking process can be weird to work with but still too much work when you need more complex instance picking. The per class family limitation is also not so convenient.

    I'm considering buying the JSON+ too because I just use array/dictionary for every piece of data. My process to get all the data without too extensive expressions is to initially feed all data into an array and then, a one time event which pass all this data to the family instance variable. The data would be accessed using global variables for the coordinates in order to not hardcode it. Without this, I'd have to mention the array using variables for the coordinates every time I need to get some data and this process seams too ineffective but that's the only way I found to mix the use of a powerful data management and the accessibility of instance variable and avoiding extensive calls.