Skip to content

Commit

Permalink
Deploying to gh-pages from @ 3bd2ba9 🚀
Browse files Browse the repository at this point in the history
  • Loading branch information
kuviman committed Aug 23, 2024
1 parent 4e22fa2 commit 536ef41
Show file tree
Hide file tree
Showing 11 changed files with 183 additions and 111 deletions.
6 changes: 3 additions & 3 deletions bevy-jam/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ <h2 id="intro">Intro</h2>
<h2 id="day-1">Day 1</h2>
<p>On day 1 we were starting out with bevy for the first time ever, so we went ahead and read the bevy book. Surprisingly it was very short.</p>
<p>One of the first things to notice was very long compilation time.
Which wouldn't really matter too much for me since building of the dependencies is only supposed to happen once. But, almost every time I added a new dependency to the project (like <code>bevy_rapier</code> or <code>bevy_ecs_ldtk</code>) it was recompiling the entire world from scratch again, making me wait for 20 minutes which made me not want to add new dependencies ever even if I would benefit from them. It would be faster if I didn't use <code>--jobs 2</code> for compilation, but that would cause unpleasant lagging of the system.</p>
Which wouldnt really matter too much for me since building of the dependencies is only supposed to happen once. But, almost every time I added a new dependency to the project (like <code>bevy_rapier</code> or <code>bevy_ecs_ldtk</code>) it was recompiling the entire world from scratch again, making me wait for 20 minutes which made me not want to add new dependencies ever even if I would benefit from them. It would be faster if I didn't use <code>--jobs 2</code> for compilation, but that would cause unpleasant lagging of the system.</p>
<p>Also dynamic linking was set up from beginning, like shown in the book.
But I was getting a lot of linker errors (about unresolved symbols) from time to time for some reason. Only full recompilation was solving that issue, so we ended up using regular static linking instead which made us wait for 20-40 secs for every small change in game code.</p>
<p>Using <a href="https://trunkrs.dev/">trunk</a> was really nice, the only issue with it was making it work using relative urls for itch/github pages: <a href="https://github.com/thedodd/trunk/issues/395">issue #395</a></p>
Expand All @@ -110,7 +110,7 @@ <h2 id="physics">Physics</h2>
<h2 id="ldtk">Ldtk</h2>
<p>In order to make levels we decided to try out <a href="https://ldtk.io/">LDTK</a>.
We never used it before but heard good things about it, and there was an existing <a href="https://crates.io/crates/bevy_ecs_ldtk">plugin for bevy</a>.</p>
<p>It was very simple to load the level tilemap and have it drawn on the screen (although initially I had to realize that I should not put my camera at z=0).</p>
<p>It was very simple to load the level tilemap and have it drawn on the screen (although initially I had to realise that I should not put my camera at z=0).</p>
<p>For spawning the entities &amp; int grid cells <code>bevy_ecs_ldtk</code> uses the derive macro approach which I was not really a big fan of.
I think it would be easier to use if instead of writing logic in derive attributes I could simple use any regular Rust function/closure returning a bundle, so like instead of:</p>
<pre data-lang="rs" style="background-color:#2b303b;color:#c0c5ce;" class="language-rs "><code class="language-rs" data-lang="rs"><span>app.register_ldtk_entity::&lt;PlayerBundle&gt;(&quot;</span><span style="color:#a3be8c;">Player</span><span>&quot;)
Expand All @@ -129,7 +129,7 @@ <h2 id="ldtk">Ldtk</h2>
<p>One of the examples involved combining tiles together if they form a line, but that was still not good enough, so we had to implement another way of spawning the colliders.</p>
<p>The way it worked was spawning a polyline for every tile, and then despawning a segment if it was present twice - which means that the segment is between two tiles.</p>
<p>One other thing I missed from <code>bevy_ecs_ldtk</code> was registering int cells by name instead of by actual int value, since there is an option to specify names in ldtk itself.</p>
<!-- cheeseburger -->
<!-- cheeseburge -->
<h2 id="rewrite-from-scratch">Rewrite from scratch</h2>
<p>So, at some point, we had working level loading, working physics with jump and slide side effects. But the game was not fun to play, it was very hard to control your character. So we needed to think about how to change the gameplay.</p>
<p>We had a couple ideas, but the one we decided to try out was removing the physics aspect of the game completely and turning it into a &quot;turn based&quot; puzzle game instead.</p>
Expand Down
106 changes: 0 additions & 106 deletions builds/index.html

This file was deleted.

2 changes: 1 addition & 1 deletion search_index.en.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
<loc>https://linksider.kuviman.com/bevy-jam/</loc>
</url>
<url>
<loc>https://linksider.kuviman.com/builds/</loc>
<loc>https://linksider.kuviman.com/steam-announcement/</loc>
</url>
</urlset>
Binary file added steam-announcement/bevyjamresults.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added steam-announcement/editor.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
178 changes: 178 additions & 0 deletions steam-announcement/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>

















<title>LinkSider</title>

<meta name="title" content="LinkSider">

<meta name="description" content="Puzzle Game">
<meta name="generator" content="Zola v0.16.1">

<meta property="og:type" content="website">
<meta property="og:url" content="https://linksider.kuviman.com/steam-announcement/">
<meta property="og:site_name" content="LinkSider">
<meta property="og:title" content="LinkSider">
<meta property="og:description" content="Puzzle Game">




<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://linksider.kuviman.com/steam-announcement/">
<meta property="twitter:title" content="LinkSider">
<meta property="twitter:description" content="Puzzle Game">



<link rel="canonical" href="https://linksider.kuviman.com/steam-announcement/">

<script type="application/ld+json">
{
"description":"Puzzle Game",
"url":"https://linksider.kuviman.com/steam-announcement/",
"@type":"WebSite",
"headline":"LinkSider",
"name":"LinkSider",

"@context":"https://schema.org"
}
</script>



<link rel="stylesheet" href="https://linksider.kuviman.com/style.css"/>

</head>
<body theme="auto">
<div class="w">
<header>


<p><a href="&#x2F;steam-announcement&#x2F;..">..</a>&#x2F;steam-announcement&#x2F;</p>

<h1></h1>

</header>
<main class="page-content" aria-label="Content">

<h1 id="linksider-is-coming-to-steam">Linksider is coming to Steam</h1>
<!-- <img class="hero" src="..&#x2F;logo.png"></img>
-->
<p>Hello!</p>
<p>Linksider is a puzzle game that was originally made for <a href="https://itch.io/jam/bevy-jam-3/results">Bevy Jam 3</a> (and took #1).
After spending more than a year porting, rewriting,
and iterating over the initial gamejam version,
Linksider is coming to Steam!</p>
<p><a href="https://store.steampowered.com/app/2995150/Linksider/"><strong>You can wishlist it now</strong></a></p>
<p><iframe src="https://www.youtube.com/embed/z5RePgXW5yM"
style="width: 640px; height:360px;" frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" webkitallowfullscreen
mozallowfullscreen allowfullscreen>
</iframe>
<em style="display: inline-block;">Linksider trailer</em></p>
<h2 id="jam-version">Jam version</h2>
<p><img class="hero" src="bevyjamresults.png"></img>

<em style="display: inline-block;">bevy jam results</em></p>
<p>If you didn't play the jam version, you can do so on <a href="https://kuviman.itch.io/linksider">itch.io</a>.</p>
<p>A lot of changes happened since then, which I describe shortly in this blog post.</p>
<h2 id="custom-game-engine">Custom game engine</h2>
<p>The game was initially written in <a href="https://bevyengine.org/">The Bevy Engine</a>.
However, shortly after the jam we made the decision to rewrite it from scratch,
using a <a href="https://geng.kuviman.com/">custom game engine</a> (still in Rust 🦀).
It was probably the lack of experience with ECS
(Entity Component System) frameworks
made it challenging to maintain the Bevy-based code.
Post-rewrite, managing the codebase became significantly easier.</p>
<h2 id="in-game-level-editor">In-game level editor</h2>
<p>Another thing that we quickly decided to write ourselves instead of using existing tool was the level editor.
During the jam we were using <a href="https://ldtk.io/">LDTK</a>,
but having a dedicated level editor allowed us to have features not possible otherwise, for example, attaching side effects to different sides of entities.</p>
<p><img class="hero" src="editor.gif"></img>

<em style="display: inline-block;">in-game level editor</em></p>
<h2 id="reworked-game-mechanics">Reworked game mechanics</h2>
<p>Now, to the actually new features of the game.</p>
<p>Pretty much every single game mechanic was reimagined to make the game more intuitive.</p>
<p><img class="hero" src="oldnewjump.gif"></img>

<em style="display: inline-block;">Old jump vs new jump</em></p>
<p>And, of course we also introduced a bunch of new things.</p>
<p>The biggest change to the game logic is that it is no longer a turn based game,
since multiple entities can now potentially move at the same time.
Also, different moves can now take different amount of time.
This allows us to have, for example, acceleration when falling,
making the game feel like it actually has physics,
although we are still working on an integer grid.</p>
<p><img class="hero" src="portalmomentum.gif"></img>

<em style="display: inline-block;">Momentum when jumping through portal</em></p>
<h2 id="undo-redo">Undo/redo</h2>
<p>Since the game is no longer turn based,
implementing an undo functionality
(which we didnt have in the jam version)
was non trivial.</p>
<p>So, the way we store history is by having snapshots of the game states
at important moments - when a move starts, or when a move ends.
The game state itself contains information about all the currently happening moves,
which we can interpolate in order to render the game.</p>
<p><img class="hero" src="undoredo.gif"></img>

<em style="display: inline-block;">Undo&#x2F;redo</em></p>
<!-- ## Level selection
The jam version worked by putting you in the game directly,
and you solved puzzles one by one,
without the ability to go back or skip levels.
In the new version of the game we now have proper level selection.
This was one of the hardest things for us,
we went through multiple completely different designs for it. -->
<h2 id="so-release-when">So release when?</h2>
<p>We are working towards figuring out when the game will actually be released, but its not ready yet.</p>
<p>Hopefully we can get it released this year.</p>
<p>Our first priority is a Steam release,
but the game is also already working on Android,
and eventually we plan to figure out how to build for iOS, too.</p>
<p><a href="https://store.steampowered.com/app/2995150/Linksider/">WISHLIST THE GAME NOW</a>
to get notified about the release when it happens. ❤️</p>
<p><img src="https://linksider.kuviman.com/steam-announcement/wishlist.png" alt="wishlist" /></p>




<ul>

</ul>


</main>
<footer>


</footer>
</div>
</body>
</html>

Binary file added steam-announcement/oldnewjump.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added steam-announcement/portalmomentum.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added steam-announcement/undoredo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added steam-announcement/wishlist.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 536ef41

Please sign in to comment.