WackyToaster's Forum Posts

  • I think right now the ideal approach to working with AI is to simply also be capable yourself and just use it as a supplementary tool. If you just mindlessly copy the code it spews out you're not gonna get far, and you learn nothing from it. I don't need AI to produce code for me that works perfectly with constructs API. I can just get a basic idea of the logic that I need and adapt it to the API myself or translate it into what the code would look like with events (Constructs events are quite close to javascript in the end).

  • > Detect "holes" in the floor with a raycast.

    > wackytoaster.at/parachute/enemyturnaround.c3p

    Construct 2 doesn't have these Line of Sight parameters. :(

    Do you know what the alternative would be in C2 to replace them?

    You can sort of replace raycasts with sprites and just check "is overlapping ground"

  • Detect "holes" in the floor with a raycast.

    wackytoaster.at/parachute/enemyturnaround.c3p

  • It's useful for general scripting questions, but Construct-specific stuff it gets wrong.

  • Well yeah, like that you have direct access to the class without having to import, but I'd say it's kind of dirty to program it like that hehe. At least to me it makes sense to have it organized that way. Just as an example:

    import * as Player from "./player.js";
    

    Now I have the Player Module, which can include more than just the player itself. It could also contain, say, the camera and the player weapon, which kind of make sense to be part of the player Module. Like so:

    runtime.objects.player.setInstanceClass(Player.Player);
    runtime.objects.camera.setInstanceClass(Player.Camera);
    runtime.objects.sword.setInstanceClass(Player.Sword);
    

    So everything regarding the player will be inside one separate file. And the setInstanceClass can happen only in one file in one place. So if something goes wrong or I have to add another instance class, I know exactly where to look.

    I write plenty of dirty code btw. but I still try to keep it minimal and do regular cleanups. There's nothing wrong with dirty code to a degree. Be more like Balatro-dev and less like Yandere-dev. Both have "dirty" code but Balatro is printing infinite money and yandere simulator still isn't finished (it's been 11 years)

  • You need to export the class and

    runtime.objects.plr.setInstanceClass(plr.plr);
    

    the first plr is the module, the second plr is the class.

  • Well the Pin behavior is at least (sort of) deprecated in favor of hierarchies. so I understand there not being an API.

    Things that I have in my events are currently:

    "Draw on tilemap with brush" since this is not available in js out of the box. I know it's possible to do bitwise operations blablabla but as you said: why bother, it already exists, just make a lil function to call.

    "Recreate initial objects" which is also not available in scripting. I specifically need it to load template layouts, which was added a while back. I don't even think there is a way to do this in js at all. I can get the ILayout but that doesn't help since there's no access to the initial instances. So I'd somehow have to do some weird workaround like go to the layout, store the instances, go back, then create them... or just do a lil function call.

    It's really not that big of a deal in most cases, but that said, I'd still prefer just having these options available in scripting directly. Now that I think about it, I should probably also just add feature requests for these too but I don't wanna spam so many feature requests either :V

  • Here's the basic code for it with the same particles attracting and different particles repelling.

    wackytoaster.at/parachute/particleslifesimulation.c3p

    I do want to point out though that this is computationally really bad, the performance is terrible. It will probably be ok if you just wanna play around with a few hundred particles at most, play around a bit. I've done similar projects like that before and just kept it within the limitations.

    If you really wanna go ham:

    1. You'd want to get rid of box2D and instead use your own calculations for the particles. They won't need a lot for that, probably just a movement vector and radius. That would get rid of the extra bloat that box2D adds that doesn't matter for this simulation.

    2. You will still be limited very quickly by how fast CPUs and javascript are, generally. If you really wanna do this at any greater scale, you'll have to do the same thing as the guy in the video, which is to do the calculations on the GPU instead. This is possible with webGPU but will require javascript and webGPU knowledge. Maybe you can get by with some library like turbo.js.org but I have not tested it at all.

    Good luck.

  • Well no, like the link I posted... You just open steam://store/1607720 in your browser and it will ask you to open it in steam. I'm assuming this should also work just the same with the overlay api, or in fact even better because it's using the steam browser protocol.

    SteamOverlayAPI.OpenURL("steam://store/1607720");

    You can try right now. Just paste the link into the adress bar and hit enter.

  • It's actually easy, it's just a special link that looks like this

    steam://store/1607720
    

    You just have to replace the number with the id of your game.

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • Alright thx, feature request it is. The workaround is ok, but I always set out to do a game and make it "javascript only" just to end up back in the event sheet for random reasons. Either be it workarounds, missing APIs (or intentionally left out) or simply convenience with some things. Not a bad thing per se but not exactly what I plan, haha.

  • Setting the z order is done with the actions "Move to top" "Move to bottom" "move to object"

    There is also a specific "Sort Z order" system action that sorts based on an instance variable.

  • I know saying this isn't exactly helpful but this error quite directly tells the user what the problem is and how they can fix it. Is that... not good enough?

    I'd assume the Internationalization support is used by constructs build-in Internationalization plugin. Did you use that plugin? Either way Construct probably checks for support and if it isn't supported, shows this error. It's kinda weird though that only a recent update has caused this error to show up, considering the internationalization plugin has been implemented for a good while now.

  • Is there a non-silly way to get a canvas snapshot in script? Am I overlooking something? Specifically I wanna load it into a sprite, and currently I have to do a whole bunch of ??? to get the blob. I cannot access the snapshot directly in script but I also cannot hand it off via a variable because these don't support blob urls.

    await runtime.callFunction("snapshot");
    let response = await fetch(this.snap);
    this.snap = await response.blob();
    const img = runtime.objects.transitionSprite.getFirstInstance();
    await img.replaceCurrentAnimationFrame(this.snap);
    

    I've also tried to use new URL(this.snap) in hope to get an URL which does seem to work but it then fails at img.replaceCurrentAnimationFrame() due to wrong type. Further I've tried to directly access the context of the c3canvas but that also wasn't exactly working, I didn't spend too much time on it since I expect this to be hacky anyway.

    On a sidenote, since we're talking canvas snapshot: Is there a good way to snapshot only some layers? I know I can briefly hide the stuff I don't wanna snapshot (e.g. UI) but since snapshot is async it will cause the UI to flicker which isn't exactly neat. Not sure if there's any workaround for that.

  • There's a possibility it's locked or on a locked layer. You can try checking it in the instances bar. Menu > View > Bars > Instances bar.