awarmenhoven's Forum Posts

  • 11 posts
  • Heya,

    put Calligraphic Dragon on Play store a few days ago:

    play.google.com/store/apps/details

  • Try Construct 3

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

    Try Now Construct 3 users don't see these ads
  • Whiteclaws: lol, will keep it in mind for a next release, subtitled 'Duke Nukem and his snake'... ;)

  • GeometriX: thanks for the comment.

    • Points sound, agreed. Am stil thinking on what should be there.
    • Borders... well, I was thinking about doing the bamboo in detail, but that would have given me too many collision points in the polygon. Am still thinking on how to better that.
    • Pickups at the edge... yes, that will change.
    • The titles are meant to be 'semi' wise without taking itself too seriously :)
  • Heya, thanks for the kind comments.

    It is now also available on Android:

    play.google.com/store/apps/details

    The hidden quests... well, since we are amongst devs here I can shed a secret :) :

    Level 1,3,5: length of dragon, head to all 4 winds, number of points earned, amount of strokes

    Level 2: length, strokes, points, 5 circles (any which way) around the spot.

    Level 4: length, strokes, points, 2 pickups in each corner

  • Hello,

    wanted to show off my first trial with Construct 2: Calligraphic Dragon

    warmenhoven.co/construct/dragon

    <img src="http://www.warmenhoven.co/construct/dragon/screenshot01_s.png" border="0" />

    <img src="http://www.warmenhoven.co/construct/dragon/screenshot02_s.png" border="0" />

    <img src="http://www.warmenhoven.co/construct/dragon/screenshot03_s.png" border="0" />

    Hope you have some fun with it as I had a lot of fun making it with C2!

    With kind regards,

                     Adrianus Warmenhoven

  • austin That kind of explains :)

    Thanks for the reply.

  • austin

    I seem to have trouble getting the Clay.io ads working on CocoonJS.

    The main Clay.io plugin works fine (leaderboards etc.) but not the ads.

    Is there anything I should add to the zip (like with the main plugin) before I send it off to ludei?

  • my email addy is not hidden it is to be found at warmenhoven.co/contact (I do this in the form of a link as that page has a spamtrap and so my email address is not out in the open).

    Now, as for your comment on derailing; let's use email after this.

    And as for your comment on frameworks: I rather not use existing code as that tends to give bloat, lag and bugs. But the main core of messaging, scaling, clustering and all that large scale stuff is almost boilerplate for me as I have an extensive library.

    I just finished up making it so that I can have any number of clients, any number of controllers and any number of physical servers, so that is taken care of :)

    We should rather talk about the object/communication/plugin/usability design and I think we can have good banters on that :)

  • Update:

    Well, I modified the websocket plugin a bit and fired up the server. It works pretty smoothly with queues and other parallelism-stuff in place so it can be scaled across multiple servers.

    Now to make multiplayer easier to build, I think the plugin should have a few more actions, conditions and expressions specifically geared towards mp. So I want to recode it to a specific multiplayer plugin.

    In the text below, the GUID's are client-specific(!). This means the server will translate them for each user transparently, but they will be different for each client. The reason for this is that a client can not subscribe to channels that are not available to him and guessing will not do him any good.

    Things that I came up with on the top of my head are:

    Actions (client):

    • "Connect", param is API key, param is hostname/url: To connect to the server and to differentiate which game should be matched up with which controller/session manager (the API key is different for each type but consistent amongst all clients)
    • "Set Nickname": just a label that can be shared with other players instead of the GUID
    • "Subscribe Channel", param is channel GUID (will get to that in expressions): subscribes to messages from a specific channel. A channel is nothing more than an identifier to a specific stream of messages. Like a forum-thread, a mailinglist or an IRC channel. You should be able to use more than one channel if games have 'friend chat' or 'allied chat vs foe chat'. But also you can use channels to prioritize message handling (doing all the movement messages as fast as possible, doing the chat messages just once in a while).
    • "Unsubscribe Channel", param is channel GUID: obviously you may want to quit a game or turn off the chatter from others.
    • "Send Chat", param is channel GUID, param is message: I think it is best to have different message-types, so the server (and your controlling C2 code) can differentiate and process accordingly. Basically the server could ignore everything but game-specific messages and have all other types be rerouted blindly.
    • "Send Command", param is channel GUID, param is message: this message type is for things like store/save/pause/taunt/give/take etc. type of messages. They are ingame but not necessary realtime
    • "Send Realtime", param is channel GUID, param is message. These messages should be processed with the highest priority.

    Maybe things like "Send Object", param is channel GUID, param is instance should be added so you can pick an instance and send the whole coordinates, velocity, behaviour params etc. directly to the server... have to think about it.

    Actions (server):

    • "Connect", param is API key, param is hostname/url: To connect to the server and to differentiate which game should be matched up with which controller/session manager.

    It is important to understand that there need to be two server projects: 1 is the controller that basically handles all the boring lobby/matchup etc. code. The other gets started every time a new session starts and this is the one that handles the game and the players.

    • Create Session, param is GUID: This tells the server to fire up a new controller and hand the GUID to it.
    • Create Channel, param is name, param is type: You should be able to create global channels (i.e. for a lobby or for messages across sessions, moderator chat etc.) and session channels. Session channels will be created per session (duh) and global channels only once.
    • Allow Channel, param is channel name(!), param is client GUID, param is R,W or RW: You should be able to mute clients or maybe you want the input on 1 channel and have the output on a different one so you can make life easier when copy/pasting event sheets.
    • Forbid Channel, param is channel name, param is client GUID: Almost the inverse of the above, but not quite.
    • Set Messagetype Policy, param is channel name, param is messagetype, param is policy (passthrough, block, handle): If the policy is passthrough then the messages will never arrive at your server Construct 2 code but be rebroadcasted to every client in the channel. Handy for chat or if you want clients to handle messages. Block is if you don't want events to happen for your server code.
    • Disconnect Client, param is client GUID: closes the connection to the client.

    Conditions (client):

    • "On Chat message", "On Command message", "On Realtime message": Conditions are true if 1 or more messages for these have arrived. Probably should handle the messages in a for each loop except for the realtime (as a backlog may cause more delay, so realtime messages that are not processed before the next one arrives maybe should be dropped... have to think about this as well)
    • "On Subscribe success", "On Subscribe fail": When a subscribe to a channel succeeds or fails.
    • "On Send error": if a message sending has failed.

    Conditions (server):

    • "On client connect": whenever a new client arrives (maybe needs a client object....need to think about this)
    • "On client disconnect": If a client connection drops or the client just quits the game. Your code should then decide whether the game can continue (if it is a MMORPG type) or if it should quit (if it is a 2-player card game).
    • "On Chat message", "On Command message", "On Realtime message": Conditions are true if 1 or more messages for these have arrived. Probably should handle the messages in a for each loop except for the realtime (as a backlog may cause more delay, so realtime messages that are not processed before the next one arrives maybe should be dropped... have to think about this as well)
    • "On Send error": if a message sending has failed.
    • "On Session Ended": If a session has finished.

    This is just a scrapbook list of things that, in my opinion should be available and which make it possible to handle a Construct cluster as a service.

    Let me know if you can think of others or better ones. I will think about the expressions as well.

    With kind regards,

                     Adrianus Warmenhoven

  • Ok, let me see what we can whip up in the coming time.

    It would be a bit more complicated than only a websocket rerouting messages.

    We would add message-queues and a few commands so the controller can tell the server software (native binaries, no interpreted languages like .Net, Java or PHP) to handle some cases autonomously for performance.

    Also there would need to be some provision for spawning new processes and commands for booting/blocking users.

    I think a 'server' plugin and a 'client' plugin would make things easier for the developers in that you then can have events like 'on new client connect', 'on new session created' etc...

    The client plugin then can have events like 'on joining new session' etc...

    The biggest fun will be to make it scalable and performant. But then again, that *is* what I do for a living :)

    if you want to have a banter on this; let me know. I am going ahead with this, but maybe we can find a good modus operandi so you can still quit your current daytime job, or at least make a nice extra from it :)

    With kind regards,

                      Adrianus

  • Hello,

    please scroll down if you would like to have a service where you can just upload your zip file from construct and then have it run as a multiplayer server.

    I have spent some time thinking about this and there is a way to use construct to develop a multi-player server without coding anything else.

    If you want it to scale to hundreds and even thousands of simultaneous sessions, then even that is possible, but it would not be the cheapest of solutions when it comes to cost-of-ownership.

    But for a few simultaneous sessions with about 8 users it roughly comes down to this:

    • Get a server (I can also explain how P2P would be possible but that is a bit more involved. Also, a server is easier to use if you want to prevent cheating).
    • Either install a specific server that listens for websockets and that can forward specific messages to specific clients (I have made a PoC for myself in Go) or use something like

      gist.github.com/bradleywright/1021082 in a plugin or CallJS call.

    For the server you have a layout that connects to the websocket and listens for any incoming message as forwarded by the proxy.

    Each client (game/enduser) connects to the websocket and announces itself using a GUID (or login/password or somesuch)

    The server 'layout' then 'routes' this client to a 'room' or 'session' (i.e. giving it a GUID as session id).

    The client now uses that session to message the other clients, all through the session 'layout' in the server.

    This involves having at least 2 processes at the server side: the 'entry' or 'router' part and the 'session' or 'room' part.

    If you want as much control over the game as possible then have the clients only send the inputs ('key down', 'mouse clicked at x,y') and have the server 'play' the game using constructs events, collisions etc. and send the x,y, effects, instances created/destroyed back to the client.

    You would use the node-webkit combo to run the 'room'/'game' at the server side.

    The overhead is then, of course, a new process per session.

    For a headless server (i.e. one in a datacenter with no graphics/output) you would use something like xvfb.

    What I am wondering is if there is an interest in having this as a service.

    Basically, you would upload the generated zip file and then your server runs.

    The service would take care of the scaling (which can be handled quite nicely actually, if you code some extra things in there).

    A development setup would be possible by having your own layout connect to the dev websocket so you can see your code running.

    But, as I am a nice guy with quite some room in my datacenter but I am not wealthy enough to just run something large without having some remuneration going towards the cost of running something like that, I am wondering *if* and if yes *how much* would you be willing to pay for a service like that and in what form (i.e. per session played, fixed amount per month for a maximum of X sessions, etc...)

    Basically, if I have the idea that such an endeavour could cover running costs then I would be willing to get my team cracking and build a 'Construct 2 Server Service'.

    Let me know what you think.

    With kind regards,

                       Adrianus Warmenhoven

  • 11 posts