July Update

Dev preview is now open, explanations and game jams

Give Me Thatby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "We\u0027re open now. Anyone can go to the ", "attachment": {} }, { "type": "string", "attributes": { "href": "https://sbox.game/give-me-that" }, "string": "give-me-that", "attachment": {} }, { "type": "string", "attributes": {}, "string": " page and add s\u0026box to their steam account.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "I posted the link to the ", "attachment": {} }, { "type": "string", "attributes": { "href": "https://sbox.game/give-me-that" }, "string": "give-me-that", "attachment": {} }, { "type": "string", "attributes": {}, "string": " page last week, just on discord. I didn\u0027t think anyone would take that much notice. I thought people would share it with their friends that wanted to join their development teams.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "What happened is that ", "attachment": {} }, { "type": "string", "attributes": { "quote": true }, "string": "gmod 2 is ready", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0got posted everywhere, 50,000 people used the link, tried to play gmod 2 and got angry as fuck.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Disasterby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "The game side of things was not ready for this kind of scrutiny. Our lobby system had a bug where a lobby could get in a toxic state, where the game wouldn\u0027t load, leading to a black screen. This happened when the lobby host got swapped to a joining client,\u00A0 without any game info. Unfortunately I had written it so people auto joined the most populated lobby for a game - which ended up always being this toxic one with a bunch of people sitting at a black screen getting pissed off.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "When people got in a game they realised that most of them were spewing errors. When they joined a map they had no toolgun, or spawn menu.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "Fair to say we didn\u0027t leave them with a good impression.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Bright Sideby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "Finding and fixing these bugs had to happen eventually. And this enabled us to do that. It would have been great if we could have done it without leaving a sour taste in the mouths of so many people, but also without this amount of players this wouldn\u0027t have been possible.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "And this wasn\u0027t the only bug. The burst of usage helped us fix a bunch of other bugs too. And the backend didn\u0027t get overwhelmed, everything scaled up really well.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "And the thing that we\u0027ve been working on, the thing that has been our priority - the engine - has been praised a lot for how easy and straight forward it is to use.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "The worst part of any criticism is when you know it\u0027s true. And while a lot of the criticism was true, there were a lot of misunderstandings there, that I hope I can clear up in this post.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Explaining S&boxby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "For me, s\u0026box is about minimizing regret. Unity has been good to us, but I regret that we didn\u0027t always have our own engine being developed in the background. I regret that the Garry\u0027s Mod community mostly have to leave Garry\u0027s Mod if they want to make money from the things they create in it.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "So in my mind, s\u0026box is broken into 3 sections.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "The Engine", "attachment": {} } ], "attributes": [ "heading1" ], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "The engine is the core of it. If nothing else works - we have the engine. I would like Facepunch to have an engine that we can use to create our own games. One that isn\u0027t Unity. One that we fully control.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "It would be great if our work goes into improving our engine. I don\u0027t want to pay Unity $500k every year so I can then pay my own staff to optimize and fix their engine.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "The long term goal is to be making all of our games on s\u0026box, and to have expanded so the engine works on mobile/console/etc.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "The Platform", "attachment": {} } ], "attributes": [ "heading1" ], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "A Garry\u0027s Mod type platform, where there\u0027s a list of games and you can jump between them. But this time providing a way for the game developers to monetise.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "Monetisation needs to be handled carefully. Everything you download on ios/android app store turns out to require a subscription. Every roblox game is pay to win. We need to do better than that. Let people make money, but don\u0027t let it get predatory.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "For this to work we need games that get people sticking around. We\u0027re making games that will try to do that, and we\u0027ll be making an official sandbox mode too. We\u0027re also trying to encourage game creation by doing Game Jams.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Standalone", "attachment": {} } ], "attributes": [ "heading1" ], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "In Garry\u0027s Mod, if you made a popular game, the next step was to abandon the community and make a new version in Unity or Unreal. That fucking sucks.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "We want to let you use the s\u0026box engine to create games, export them, give them away for free or put them on Steam.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "We don\u0027t want the burden of collecting royalties or license fees. The platform and our own games should make us money. That should be our incentive. We shouldn\u0027t be taxing your hard work, because having you use our engine is of benefit to us. I would also like to offer some assurance, legally, that we can\u0027t change the rules further down the line, when we get jealous about how much money everyone is making.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "We obviously need officially Valve to say yes to this, but Valve are cool, they get it, I don\u0027t think they\u0027re gonna say no. They just need to know what they\u0027re saying yes to - so our aim is to put a demo together and see what we can do.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Game Jam 2by garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "The main criticism with the last game jam was that it was closed access. That was a valid criticism, but it was also on purpose. We wanted to code and test the contest system in a controlled manner.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "This time it\u0027s obviously open to everyone. The ", "attachment": {} }, { "type": "string", "attributes": { "href": "https://sbox.game/c/gamejam2" }, "string": "prize money pool is now \u00A340,000", "attachment": {} }, { "type": "string", "attributes": {}, "string": " - which is double the previous jam.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "I understand the concern that old games can be re-entered. Obviously the fact they\u0027ve worked on a game for 6 months vs your 30 days is going to be in our minds when reviewing them.. so don\u0027t worry about that.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "And ultimately - don\u0027t worry, this isn\u0027t the last game jam. Treat this as a warm up if you want to.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Dedicated Serverby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "The dedicated server work has begun, you will find a sbox-server.exe in the game folder now. This is a work in progress, and isn\u0027t fully functional right now. I feel like there\u0027s a few reasons people want a dedicated server right now, and I want to talk about them.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Monetisation", "attachment": {} } ], "attributes": [ "heading1" ], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "They maybe think that the only way to monetise their game is via a VIP system on a dedicated server. That\u0027s fine, but I view this as an old fashioned notion. We will provide other, better ways to monetise in the future.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Serverside Code", "attachment": {} } ], "attributes": [ "heading1" ], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "So maybe you\u0027re writing a gamemode and want to write into a database or something on your server, so the game is long lasting. You don\u0027t want people to get the database credentials. Yep. That\u0027s fine. I don\u0027t think we have a way for you to write serverside code right now though.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "I suspect though, that if you\u0027re running code on your server, it doesn\u0027t need to be sandboxed and whitelisted anymore. I suspect that by doing that you can do whatever you want - like read a config file, or environment variables, or load other assemblies. So I don\u0027t see this being a big problem, it\u0027s just a goal we need to reach.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Physics Updatesby Layla

[ { "text": [ { "type": "string", "attributes": {}, "string": "Source 2 uses an internal physics engine called Rubikon. S\u0026box now uses Box3D.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "This is still pretty much Rubikon, made by the same people but a version that we can get constant updates to. This has already proved valuable for getting quick bug fixes.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/66b186fc/3229/454c/9044/6e74956a8442.mp4", "href": "https://cdn.sbox.game/upload/b/66b186fc/3229/454c/9044/6e74956a8442.mp4", "url": "https://cdn.sbox.game/upload/b/66b186fc/3229/454c/9044/6e74956a8442.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/86e79904/3a81/4300/987e/0dbd6967240c.mp4", "href": "https://cdn.sbox.game/upload/b/86e79904/3a81/4300/987e/0dbd6967240c.mp4", "url": "https://cdn.sbox.game/upload/b/86e79904/3a81/4300/987e/0dbd6967240c.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} } ]

Standalone Exporterby alex

[ { "text": [ { "type": "string", "attributes": {}, "string": "We mentioned above our plans for s\u0026box - including the ability to export your game as its own executable.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "We\u0027ve been working hard on this. We have it at a point where you can export a game as its own executable, with its own steam app ID, with functional multiplayer, and without a s\u0026box requirement on the user\u0027s end.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "Standalone games support everything you\u0027d expect, including VR, local storage, and can have their whitelists disabled.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "The trade-off here is that standalone games have no access to the platform - which means you can\u0027t use our backend to load assets at runtime, or post scores to the backend leaderboard, etc.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "This is a super basic feature set and we\u0027ll obviously expand on this as time goes on.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/3164af58/1536/4592/b64f/97a07598b895.png", "href": "https://cdn.sbox.game/upload/b/3164af58/1536/4592/b64f/97a07598b895.png", "url": "https://cdn.sbox.game/upload/b/3164af58/1536/4592/b64f/97a07598b895.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} } ]

Indirect Lightingby Sam Pavlovic

[ { "text": [ { "type": "string", "attributes": {}, "string": "One of the most crucial aspects of creating an immersive scene is lighting, until now our Scene system had really flat lighting and some things would not show up as you were editing.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Lighting in the editor should now be much improved. Cubemaps and indirect lighting are generated in the Scene viewport as you work, so what you see is what you get.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/fb4a2f53/9d6d/476e/9602/239468a5978c.png", "href": "https://cdn.sbox.game/upload/b/fb4a2f53/9d6d/476e/9602/239468a5978c.png", "url": "https://cdn.sbox.game/upload/b/fb4a2f53/9d6d/476e/9602/239468a5978c.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "You shouldn\u0027t have to compile your map to see good lighting; you should be able to drop into a scene and see something nice right away.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/d5457dd8/a759/42db/a574/345c3ce1068f.png", "href": "https://cdn.sbox.game/upload/b/d5457dd8/a759/42db/a574/345c3ce1068f.png", "url": "https://cdn.sbox.game/upload/b/d5457dd8/a759/42db/a574/345c3ce1068f.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "The goal should be to make the editing experience as seamless and interactive as possible, yet not heavy on your system\u0027s resources.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "You can choose to have this calculated when the probe is dirty or even as a fully dynamic lighting solution, there\u0027s a test scene that showcases dynamic indirect lighting.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/4b5c04ef/36c8/4fa1/a8eb/c3e1a7061ab9.png", "href": "https://cdn.sbox.game/upload/b/4b5c04ef/36c8/4fa1/a8eb/c3e1a7061ab9.png", "url": "https://cdn.sbox.game/upload/b/4b5c04ef/36c8/4fa1/a8eb/c3e1a7061ab9.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": " ", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "This whole indirect lighting stuff applies for Volumetric Fog as well:", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/5724a040/f6bf/4262/bab1/7c5b908e385b.png", "href": "https://cdn.sbox.game/upload/b/5724a040/f6bf/4262/bab1/7c5b908e385b.png", "url": "https://cdn.sbox.game/upload/b/5724a040/f6bf/4262/bab1/7c5b908e385b.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/02022767/8c18/480b/9d34/0156b9a2aa8a.png", "href": "https://cdn.sbox.game/upload/b/02022767/8c18/480b/9d34/0156b9a2aa8a.png", "url": "https://cdn.sbox.game/upload/b/02022767/8c18/480b/9d34/0156b9a2aa8a.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Future", "attachment": {} } ], "attributes": [ "heading1" ], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "This solution currently works fine but doesn\u0027t have the granularity for fine details that VRAD3 or a full global illumination solution would give, that\u0027d be the next iteration.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "A lot of people have concerns for performance or that quality would not be as good as a baked lighting solution, being interactive doesn\u0027t mean we can\u0027t choose to precompute lighting, just that it shouldn\u0027t be a blocking step, and that the artist has full control if they want it dynamic.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "I\u0027d avoid traditional UV lightmaps in favor of a solution that\u0027s unified between objects, geometry and volumetrics and doesn\u0027t need artist input. There\u0027s been some good research done on DDGI and sparse voxel textures that strike a fine balance between performance, memory usage, and fidelity, which I\u0027m exploring next.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Citizen Removalby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "We hear you loud and clear. You hate the citizen player model. You hate their sausage head. You hate their round eyes.\u00A0 You hate their fat hands.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "We will be removing the citizen and replacing them with a generic humanoid character.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Terrainby matt

[ { "text": [ { "type": "string", "attributes": {}, "string": "We\u0027ve been progressing and iterating on Terrain, improving on the stability and user experience.. Our ultimate goal is to create something to allow large open worlds easily and procedurally.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "We\u0027ve recently added:", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0 \u2022 Box3D physics (faster, more stable)", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0 \u2022 Terrain Material physics (sand or grass would have different footsteps, bounciness, etc.)", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0 \u2022 Importing heightmaps and splatmaps", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0 \u2022 PBR materials with auto packing", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0 \u2022 Cloud Terrain Materials", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0 \u2022 Custom shader API and a material override", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0 \u2022 ", "attachment": {} }, { "type": "string", "attributes": { "href": "https://docs.facepunch.com/s/sbox-dev/doc/terrain-RoH8crPRmG" }, "string": "Documentation", "attachment": {} }, { "type": "string", "attributes": {}, "string": "!", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/4cb7ec10/8143/41a6/a3a3/c2b2c34c6cb7.png", "href": "https://cdn.sbox.game/upload/b/4cb7ec10/8143/41a6/a3a3/c2b2c34c6cb7.png", "url": "https://cdn.sbox.game/upload/b/4cb7ec10/8143/41a6/a3a3/c2b2c34c6cb7.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Height blending materials creates much more realistic blends between materials.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/f0704e74/b707/4535/aaea/c18150f77a6c.mp4", "href": "https://cdn.sbox.game/upload/b/f0704e74/b707/4535/aaea/c18150f77a6c.mp4", "url": "https://cdn.sbox.game/upload/b/f0704e74/b707/4535/aaea/c18150f77a6c.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Holes for caves.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/4e6cecaf/bb90/4cbc/b6a5/dc6c7c57eb1e.png", "href": "https://cdn.sbox.game/upload/b/4e6cecaf/bb90/4cbc/b6a5/dc6c7c57eb1e.png", "url": "https://cdn.sbox.game/upload/b/4e6cecaf/bb90/4cbc/b6a5/dc6c7c57eb1e.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "The most obvious thing that\u0027s missing right now is foliage, grass \u0026 trees. We\u0027re working on that now.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Reverse-Zby matt

[ { "text": [ { "type": "string", "attributes": {}, "string": "We\u0027ve implemented the Reverse-Z Depth Buffer technique, which is now standard in every game engine.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "This brings a massive improvement to depth buffer precision, drastically reducing z-fighting and allowing depth-based screen-space effects like SSR (Screen Space Reflections), SSAO (Screen Space Ambient Occlusion) to be much more accurate.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "This is essential as we push for the creation of larger open worlds in the engine.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Editor Keybindsby Carson

[ { "text": [ { "type": "string", "attributes": {}, "string": "You can now remap all of the Shortcuts in the Editor through the Preferences menu.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/3b134f1c/d3b8/4538/9519/8ab05a75519e.png", "href": "https://cdn.sbox.game/upload/b/3b134f1c/d3b8/4538/9519/8ab05a75519e.png", "url": "https://cdn.sbox.game/upload/b/3b134f1c/d3b8/4538/9519/8ab05a75519e.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "You can also create shortcuts for your own editor tools/libraries. Below is an example of how that is done. Adding or removing a shortcut attribute will register/unregister it appropriately when hotloading.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/86f13de4/2fb8/47e4/9621/1c1f668637b0.png", "href": "https://cdn.sbox.game/upload/b/86f13de4/2fb8/47e4/9621/1c1f668637b0.png", "url": "https://cdn.sbox.game/upload/b/86f13de4/2fb8/47e4/9621/1c1f668637b0.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} } ]

Model Animation Previewby Layla

[ { "text": [ { "type": "string", "attributes": {}, "string": "Model animation parameters can be previewed directly in the asset inspector. This is useful for seeing how a model is animated when you download one from asset party.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/bb34da6f/6b63/400d/a7d5/95ba5b89a422.mp4", "href": "https://cdn.sbox.game/upload/b/bb34da6f/6b63/400d/a7d5/95ba5b89a422.mp4", "url": "https://cdn.sbox.game/upload/b/bb34da6f/6b63/400d/a7d5/95ba5b89a422.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} } ]

Particle Improvementsby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "I\u0027ve been working with the community to improve our particle systems. A bunch of features have been added, like trail renderers, start delays, model renderer, light renderer, spin forces and pull forces.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/8903413d/d0b3/4e72/b55d/9ceb7b7e81d1.mp4", "href": "https://cdn.sbox.game/upload/b/8903413d/d0b3/4e72/b55d/9ceb7b7e81d1.mp4", "url": "https://cdn.sbox.game/upload/b/8903413d/d0b3/4e72/b55d/9ceb7b7e81d1.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} } ]

Benchmark Systemby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "I worry about performance regressions a lot. We should always be getting more performant, not less.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "So we made a benchmark system. It runs a bunch of tests on every version we build, and submits it to our backend. That way we can track the performance of each version, and see how it changed over time.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/77f7627e/a2b0/4b64/99b2/76668908362e.png", "href": "https://cdn.sbox.game/upload/b/77f7627e/a2b0/4b64/99b2/76668908362e.png", "url": "https://cdn.sbox.game/upload/b/77f7627e/a2b0/4b64/99b2/76668908362e.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "If performance has gotten worse, it\u0027s easy to go back and find the version that fucked it, and revert.\u00A0", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "If we\u0027re trying to make performance better, it\u0027s now provable whether that is working. You would be surprised how many optimization assumptions you make that change absolutely nothing.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/385578ae/49d1/4d2a/90f3/8f1ef153905e.png", "href": "https://cdn.sbox.game/upload/b/385578ae/49d1/4d2a/90f3/8f1ef153905e.png", "url": "https://cdn.sbox.game/upload/b/385578ae/49d1/4d2a/90f3/8f1ef153905e.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "We also get startup and shutdown times. Here you can see a simple cache in a low level system took startup time of our cubes scene from 9 seconds to 2 seconds.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/1eb7b8e3/548c/40a1/b6c2/e7a3cd6e5e1c.png", "href": "https://cdn.sbox.game/upload/b/1eb7b8e3/548c/40a1/b6c2/e7a3cd6e5e1c.png", "url": "https://cdn.sbox.game/upload/b/1eb7b8e3/548c/40a1/b6c2/e7a3cd6e5e1c.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "We get a bunch of lower level information. The garbage collector in modern c# isn\u0027t a load of shit like whatever Unity uses, but this shows us how many heap allocations of each object type were made in each test, too.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/9bd899c3/0cb5/4b93/a314/1f05b94cc799.png", "href": "https://cdn.sbox.game/upload/b/9bd899c3/0cb5/4b93/a314/1f05b94cc799.png", "url": "https://cdn.sbox.game/upload/b/9bd899c3/0cb5/4b93/a314/1f05b94cc799.png", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "You can run the benchmark by running benchmark.exe in your game folder. It\u0027s our intention that eventually all of your results will be listed on this site, which will let you track whether we\u0027ve made things better or worse, or how different hardware configs change things.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

VR - OpenXRby alex

[ { "text": [ { "type": "string", "attributes": {}, "string": "Our VR system now uses ", "attachment": {} }, { "type": "string", "attributes": { "href": "https://www.khronos.org/openxr/" }, "string": "OpenXR", "attachment": {} }, { "type": "string", "attributes": {}, "string": "\u00A0for its backend, rather than SteamVR.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "The main benefits to this are that we get loads of control over everything, we can expand our feature set much further, and we\u0027re able to support a much wider range of devices.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "There are no major changes to functionality on the user side right now - if VR worked for you before, it\u0027ll still work the same now.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Sprite Toolsby Carson

[ { "text": [ { "type": "string", "attributes": {}, "string": "We have been working on a\u00A0", "attachment": {} }, { "type": "string", "attributes": { "href": "https://sbox.game/facepunch/spritetools" }, "string": "2D Sprite Library", "attachment": {} }, { "type": "string", "attributes": {}, "string": " that allows you to create 2D Sprite Resources that hold individual animations each with their own Origin, Frame Rate, Broadcast Events, and Attachment Points.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/a8f6e084/a403/4014/814b/b4bb8fb7710d.mp4", "href": "https://cdn.sbox.game/upload/b/a8f6e084/a403/4014/814b/b4bb8fb7710d.mp4", "url": "https://cdn.sbox.game/upload/b/a8f6e084/a403/4014/814b/b4bb8fb7710d.mp4", "caption": null, "autoplay": false } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "I\u0027ve also made ", "attachment": {} }, { "type": "string", "attributes": { "href": "https://www.youtube.com/watch?v=1OI4kRBjaXM" }, "string": "a video", "attachment": {} }, { "type": "string", "attributes": {}, "string": " that shows how to get started with these tools so you can make some 2D games of your own. Here\u0027s an example of a project using these tools:", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/34c1c098/a553/4284/b51d/da7684d122ca.mp4", "href": "https://cdn.sbox.game/upload/b/34c1c098/a553/4284/b51d/da7684d122ca.mp4", "url": "https://cdn.sbox.game/upload/b/34c1c098/a553/4284/b51d/da7684d122ca.mp4", "caption": null, "autoplay": false } } ], "attributes": [], "htmlAttributes": {} } ]

Tileset Editorby Carson

[ { "text": [ { "type": "string", "attributes": {}, "string": "Within the 2D Sprite Tools, I\u0027ve been working on an editor that allows you to divide a sheet into a grid of tiles, and then quickly delete/move/resize them to fit your needs.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/d241360e/3105/421e/81a2/9d526f0b0e36.mp4", "href": "https://cdn.sbox.game/upload/b/d241360e/3105/421e/81a2/9d526f0b0e36.mp4", "url": "https://cdn.sbox.game/upload/b/d241360e/3105/421e/81a2/9d526f0b0e36.mp4", "caption": null, "autoplay": false } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "Once you have a 2D Tileset Resource you will then be able to select the Tileset Tool to create individual Layers (each with their own tileset if you wish) and Paint to them.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/9ebdaeb4/9d12/486a/818e/17b51c4bf708.mp4", "href": "https://cdn.sbox.game/upload/b/9ebdaeb4/9d12/486a/818e/17b51c4bf708.mp4", "url": "https://cdn.sbox.game/upload/b/9ebdaeb4/9d12/486a/818e/17b51c4bf708.mp4", "caption": null, "autoplay": false } } ], "attributes": [], "htmlAttributes": {} } ]

Pixelsby conna

[ { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/97bf38e4/663d/4146/9a61/0a77184cf00f.mp4", "href": "https://cdn.sbox.game/upload/b/97bf38e4/663d/4146/9a61/0a77184cf00f.mp4", "url": "https://cdn.sbox.game/upload/b/97bf38e4/663d/4146/9a61/0a77184cf00f.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "A chaotic pixel painting game where everyone can place one pixel every few seconds on a massive shared canvas.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Battlebugsby Carson

[ { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/530cf425/e73b/4319/86e3/988591f621c7.mp4", "href": "https://cdn.sbox.game/upload/b/530cf425/e73b/4319/86e3/988591f621c7.mp4", "url": "https://cdn.sbox.game/upload/b/530cf425/e73b/4319/86e3/988591f621c7.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "A brand new 1v1 turn-based strategy game where your goal is to destroy all enemy bugs by slowly revealing their positions on the board. The game is inspired by Battleship, but instead of attacking a specific cell by calling it out, players must launch physics based projectiles using different consumable attacks.\u00A0", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Nicked (HC1)by devultj

[ { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "image/png", "filename": "https://cdn.sbox.game/upload/b/6ce459c0/2278/4bc1/8050/bc432e975277.jpg", "href": "https://cdn.sbox.game/upload/b/6ce459c0/2278/4bc1/8050/bc432e975277.jpg", "url": "https://cdn.sbox.game/upload/b/6ce459c0/2278/4bc1/8050/bc432e975277.jpg", "caption": null } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "We developed a first-person shooter we initially developed in a week for a challenge. We have continued to develop and polish the game into a solid FPS framework.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "A sub-goal was to push the human characters, which we\u0027ll be improving on in the months to come.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "The source code is available on ", "attachment": {} }, { "type": "string", "attributes": { "href": "https://github.com/Facepunch/sbox-hc1" }, "string": "GitHub", "attachment": {} }, { "type": "string", "attributes": {}, "string": ".", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Sausage Survivorsby ryleigh

[ { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/59848b71/ece6/48e4/8f54/66789f2b1109.mp4", "href": "https://cdn.sbox.game/upload/b/59848b71/ece6/48e4/8f54/66789f2b1109.mp4", "url": "https://cdn.sbox.game/upload/b/59848b71/ece6/48e4/8f54/66789f2b1109.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "A top-down 2D roguelite inspired by Vampire Survivors. Originally made in the Entity system, the game has now been re-created using the 2D Sprite Tools.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Bomb Royaleby conna

[ { "text": [ { "type": "attachment", "attributes": {}, "attachment": { "contentType": "video/mp4", "filename": "https://cdn.sbox.game/upload/b/c6b55110/9194/444a/9972/21b71e340e00.mp4", "href": "https://cdn.sbox.game/upload/b/c6b55110/9194/444a/9972/21b71e340e00.mp4", "url": "https://cdn.sbox.game/upload/b/c6b55110/9194/444a/9972/21b71e340e00.mp4", "caption": null, "autoplay": true } } ], "attributes": [], "htmlAttributes": {} }, { "text": [ { "type": "string", "attributes": {}, "string": "A top-down bomb survival game where you must blow up your enemies and be the last man standing!", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]

Summaryby garry

[ { "text": [ { "type": "string", "attributes": {}, "string": "Lots of big, bold moves this month.\u00A0 Lots of plates spinning. It feels like sink or swim time for the platform. We either have to make it work, or give up on it. We\u0027re going to give it our best shot, but at the end of the day, if it doesn\u0027t work, then it doesn\u0027t work.", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": { "blockBreak": true }, "string": "\n", "attachment": {} }, { "type": "string", "attributes": {}, "string": "I am expecting August to be a quieter month. We have a hackweek, then I\u0027m on holiday for a week (so the team have a Holiday Challenge), then we have the gamejam ending.", "attachment": {} } ], "attributes": [], "htmlAttributes": {} } ]