simplified page routing logic for devlog; restored year/date structure
This commit is contained in:
87
src/routes/projects/projectn5/devlog/2025/0203.md
Normal file
87
src/routes/projects/projectn5/devlog/2025/0203.md
Normal file
@@ -0,0 +1,87 @@
|
||||
While I've been busy working on another game with friends lately, I've managed to almost completely finish Laura. Here's what I've achieved!
|
||||
|
||||
## Visual Personality Adjustment
|
||||
|
||||
As promised before, I've worked on Laura's head a bit more. Her full face shield has been replaced with a face mask / respirator covering only the bottom half of her face. Also, I finally got the hair into a state I'm actually happy with. Here's a comparison:
|
||||
|
||||
<div class="horizontally-centre-aligned">
|
||||
<img src="../20241222/laura-hair-flat-new-3.webp" alt="The old protagonist's head with green clothing and full-face mask">
|
||||
<img src="laura-head-new.webp" alt="The new protagonist Laura's head with red clothing, a half-face mask. The character now has a brown left eye, a mechanical right eye, and eyebrows, as well as bangs">
|
||||
</div>
|
||||
|
||||
The eyes took some work to get right, but I'm pretty happy with the current result. They're not proper eyeballs, but instead they're embedded into the head, which visually isn't significant because the flat shading would hide these details anyway. She has a brown left eye with a small sparkle, as well as a right eye replacement. This implies that Laura sustained further damage to the right side of her body, which necessitated replacement of her eye in addition to her right arm.
|
||||
|
||||
It's actually the result of UV unwrapping her model. Previously, every colour was its own material, which I wanted to change by switching to a texture atlas. Initially, of course, the UVs were a bit messed up, which resulted in this look:
|
||||
|
||||

|
||||
|
||||
I still think this looks kind of cool.
|
||||
|
||||
### New Hair 💇♀️
|
||||
|
||||
Her hair is now not a cohesive mesh anymore, but rather made up of something between 15 and 20 individual strands using custom normals to get a flat look. It also has a faint gradient, changing from a brighter colour at the top to a darker shade at the bottom.
|
||||
|
||||
I added earrings too:
|
||||
|
||||

|
||||
|
||||
Just some small metallic rings that I thought looked cool. For positioning these correctly, I hid Laura's back hair at one point, which gave me the idea to model a ponytail / tied-up alternative hair look for Laura. I think it'd look really cool. I haven't created this yet, but I've laid some groundwork to make it work:
|
||||
|
||||
Laura's hair is now separate from her main mesh. The main mesh is rigged using a metarig generated through Rigify, whereas the hair has a manually-created armature. Also, the hair is split into the front part and the back part, separated by the hair band (which is part of the main mesh). This allows me to replace the flowing back hair with a ponytail easily in-engine without swapping out the entire character.
|
||||
|
||||
This is pretty cool, because I can now create scenes for each hairstyle, set them up with [jiggle bones](/projects/projectn5/devlog/20241222/) to create flowing hair, and essentially add a toggle to switch between them in-game!
|
||||
|
||||
## Rigging and Using Blender's Rigify
|
||||
|
||||
Rigify is really cool for rigging characters easily. However, you need to know some things that I didn't before you start using it:
|
||||
|
||||
- When adding a Rigify armature to the scene, do not parent the rig to the model. You need to place the rig as intended, then click on "Generate rig", and then parent the new armature with the mesh and weight paint that way. I made the mistake of weight painting before generating the rig, which isn't transferrable because the metarig adds extra bones which require individual weight painting (e.g. the thighs being made up of two bones instead of just one).
|
||||
- Know how to switch between forward kinematics (FK) and inverse kinematics (IK). At the top right of the editor, there'll be a window with a slider to switch between FK and IK, as well as buttons to transfer an FK pose to IK and vice-versa. Don't be confused if posing a specific control doesn't work – you might need to switch to FK or IK, respectively.
|
||||
|
||||
## Facial Animations and Shape Keys
|
||||
|
||||
## Animation and Framerate
|
||||
|
||||
I've been playing around with the idea of using a lower framerate for the animations. I got the idea from [Noodle's video on animation](https://www.youtube.com/watch?v=_KRb_qV9P4g). Not sure whether I'll go through with this, but if I do, I think I'll go with 15fps or 20fps animation, since that's easily implementable a 60fps environment.
|
||||
|
||||
I already adjusted the jiggle bone script, which was easy to do since it runs in Godot's `_physics_process(delta)` function. This runs 60 times per second, so having code run only 15 times per second, for example, is as easy as wrapping the code in question in `if Engine.get_physics_frames() % 4 == 0:`, which makes a code block run only once every 4 frames – 60fps/4 == 15fps.
|
||||
|
||||
## Laura In-Engine
|
||||
|
||||
Since the shader I'm using in Blender is quite different from the one I am planning to use in Godot, here's a shot of Laura with the Godot shader:
|
||||
|
||||

|
||||
|
||||
I've been thinking of adding an option (perhaps as a cheat code) to change her outfit's colour – hair band, sweatshirt, and the rings on her right prosthetic fingers. I first didn't know how to implement this, but now that I've learnt a bit on how to use shaders, I think this could be achieved with a custom UV mask and a parameter that determines at which position the UV is sampled from – the UV would then contain several colour options.
|
||||
|
||||
## Some Funny Pictures
|
||||
|
||||
<div class="horizontally-centre-aligned">
|
||||
<img src="ok.webp" alt="An OK hand">
|
||||
<img src="dance.webp" alt="Laura flailing her arms">
|
||||
<img src="naruto.webp" alt="Laura naturo-running">
|
||||
</div>
|
||||
|
||||
<div class="horizontally-centre-aligned">
|
||||
<img src="shock.webp" alt="Laura's face looking shocked">
|
||||
<img src="reprehension.webp" alt="Laura's face looking astonished">
|
||||
<img src="disgust.webp" alt="Laura's face looking disgusted">
|
||||
</div>
|
||||
|
||||
## The Future of this Devlog
|
||||
|
||||
I feel that this blog-like format makes me think that the content here should be educational; that someone may read this and learn from it. It's likely not the case, but either way, perhaps it would make sense to limit the progress updates to a mere "here's what I made!" and only a little bit of background, if it's interesting.
|
||||
|
||||
Most times, I find myself struggling to explain my progress anyway, mostly since I'm learning as I go and because I publish progress updates pretty rarely. For example, I added eyes to Laura's model on 2025-01-01, there's no way I'll remember everything I did and thought of over a month ago.
|
||||
|
||||
Switching to a more short-form content format might help in publishing updates more regularly, and being more in the style of: "hey look at this cool thing I made!" It would also focus on visual changes, possibly helping me to keep a better schedule, merely because I can see my progress more steadily and be motivated more frequently.
|
||||
|
||||
I've been thinking of creating an Instagram account for that – though I despise Meta (and Instagram by extension). It feels like a decent platform for my idea, though: presenting progress mostly through visuals. I also know more people who are on Instagram who may follow my progress... maybe. Bluesky *may* be an option, though it's more text-focussed and more short-form than Instagram.
|
||||
|
||||
Either way, I'd lose out on the progress I've already shared here.
|
||||
|
||||
Or maybe I just don't share my stuff at all and don't stress out about it lol, no one's seeing this anyway and I'm not a social media person anyway.
|
||||
|
||||
idk
|
||||
|
||||
Maybe it's time to change the format of the devlog on this website?
|
||||
166
src/routes/projects/projectn5/devlog/2025/0316.md
Normal file
166
src/routes/projects/projectn5/devlog/2025/0316.md
Normal file
@@ -0,0 +1,166 @@
|
||||
<script lang="ts">
|
||||
import Video from "$lib/video.svelte";
|
||||
</script>
|
||||
|
||||
I've been making a lot of progress in a lot of different areas, so I won't be able to elaborate on every little detail, but I'll focus on more major things. Excited to share what I've been working on!
|
||||
|
||||
## Introducing: Laura
|
||||
|
||||

|
||||
|
||||
Laura is finally, *FINALLY* a playable character in the game!! I cannot overstate how cool this is. To finally see the character I've been creating for actual MONTHS in my game is HUGE.
|
||||
|
||||
As you can see in the screenshot above, Laura has a toon shader applied – it's [this one again](https://godotengine.org/asset-library/asset/1900).
|
||||
|
||||
With the implementation of Laura came some other changes as well. The over-the-shoulder camera had already been adjusted to fly over the character's left shoulder, but now Laura also holds the weapon in her left hand. Plus, the camera was changed, because Laura is smaller than the chunky robot I had in her place before.
|
||||
|
||||
<img src="laura-spinning.gif" style="max-width: 400px; object-fit: cover;" alt="Laura moving in a circle on top of a box">
|
||||
|
||||
I even added swooshy hair using the JiggleBones plugin, though I've already removed that plugin from the project, which I'll elaborate on later.
|
||||
|
||||
<Video src="hair-swoosh.mp4" />
|
||||
|
||||
I was also able to implement `LookAtModifier3D` to make Laura look at any enemy she's targetting. In the video, however, you can also notice that Laura's irises don't follow her head. That's a bug and it'll be fixed soon-ish.
|
||||
|
||||
<Video src="look-at.mp4" />
|
||||
|
||||
### ...and I'm not happy about it?
|
||||
|
||||
I want to change Laura.
|
||||
|
||||
While I'm super happy that I was able to create a relatively decent mesh (topology-wise) that even animates fairly alright, I think Laura in her current form is boring. She *is* meant to be a 'regular girl' just being thrown into this dystopian world and unfamiliar (combat) situations, but... it doesn't have to mean that she has to look boring. Consider her clothes in particular; right now, her clothes are straight, clean, uneventful, and it's even worse on the back (where you, as the player, will consistently see her), since I've primarily focussed on modelling her from the front. There's *nothing* interesting in the back, by which I mean something akin to Ratchet carrying Clank on his back, Banjo carrying Kazooie, or even just a neat backpack or belt.
|
||||
|
||||
I think Laura (being born in the 28th century) should look more futuristic, more interesting, and just overall more unique! I also want to make changes to aspects such as her hair, because while I have found out how to animate it in-game, it looks pretty unappealing. Plus, laying the back hair was kind of difficult; making it follow the flow of her shoulders meant that it would not deform properly when running. Making it straight would mean it clips through her torso when standing still. I *do* have an idea for how to fix that – by modelling it straight and then placing a capsule as collision shape for the `SpringBoneSimulator3D` – but this didn't even exist when I modelled Laura.
|
||||
|
||||
Also, I think I want to go with [tied-up hair](/projects/projectn5/devlog/20250203) instead. Not only does it animate much easier without clipping, but it'll give Laura a more unique silhouette, I believe!
|
||||
|
||||
I've been doing some sketching in a new B5-sized (much better size than A5 for sketches, I reckon) notebook, and I'm quite excited for this.
|
||||
|
||||
While I do wonder whether I'll be able to successfully execute upon my ideas, I believe that I'll be able to create something quite cool. Not only do I now have plenty of experience creating a character, but I'm also not creating one from literally nothing anymore. I have the current Laura model as a base to work off of – though I likely will not recycle many parts, since I want to make improvements to the mesh and loop cuts for better bends. I also have ***ideas!*** I was struggling *so hard* to come up with ideas for Laura before, *especially* concerning her clothes!
|
||||
|
||||
I am confident that Laura 2.0 will be awesome.
|
||||
|
||||
## New Firepower
|
||||
|
||||
I added two new weapons to the game! Neither one currently has a proper model, being relegated to primitive shapes, so they're not worth showing, BUT I'm quite happy about the fact I've been able to implement their basic functionality already.
|
||||
|
||||
### Igniter / Flamethrower
|
||||
|
||||
The Igniter is a flamethrower with a rapid firing rate. Here is it in action:
|
||||
|
||||
<Video src="106.mp4" />
|
||||
|
||||
The particle effect is a single .webp that was originally meant to have a blur effect, but I used Alpha Scissoring as the transparency mode in the `StandardMaterial3D` and kind of liked the effect, so I kept it. The fire effect is BY NO MEANS finished though.
|
||||
|
||||
I was initially writing custom logic for the Igniter, which, as you will see, I wasn't super fond of, though I later was able to reel back the project and integrate it into automatic3.gd quite nicely. There's still a remainder of custom logic for the sfx, since the audio for the Igniter loops instead of one-off firing, but I think that can be integrated into the regular sfx script as well.
|
||||
|
||||
I've been meaning to implement the Igniter for a while, because I thought a flamethrower could be a neat addition to the roster, but given the direction I've been meaning to take the game's story, I think a flamethrower is unsuitable and overly brutal, especially considering that Laura's is supposed to be a 'regular girl' thrown into this ruined world. Expecting her to use a flamethrower doesn't match her character, I find.
|
||||
|
||||
Then again, you could say the same thing about the other weapons, but I think they can work better as strategic items rather than merciless killing devices.
|
||||
|
||||
This, by the way, also means that the arena will likely not make it into the final game, unless I integrate it on the premise of, for example, it serving as a colosseum of sorts where Laura can become a gladiator and risk her life for a reward.
|
||||
|
||||
### Unnamed Rifle
|
||||
|
||||
The second weapon I've added is a rifle-type weapon! Whether it'll just be a rifle or a *sniper* rifle, I haven't decided yet.
|
||||
|
||||
<Video src="107.mp4" />
|
||||
|
||||
This rifle, unlike the Igniter, fits the ideas I've had for the story much better. I can imagine Laura using this as a long-range weapon from behind covers, possibly paired with a sliding mechanic that allows her to quickly and stealthily move between hiding spots, leaning over them to take shots... could be cool.
|
||||
|
||||
The projectile ray takes a while to spawn after pressing the fire button. This happens because the projectile uses a `RayCast3D` to register a collision with a prop or an enemy so that the projectile stops exactly where the hit occurred instead of extending further. The `RayCast3D`, however, takes a while to process collisions after being moved, so the projectile overall has 3 frames of buffer time between being created and visibly appearing to calculate its end position. This creates a short delay. Not sure 1. whether I'll fix it, and 2. how I'd fix it, though I assume it would require some reworking and potentially scrapping the `RayCast3D` idea.
|
||||
|
||||
The projectile also... doesn't exactly hit where the crosshair is pointing. I'm pretty sure this has to do with the `RayCast3D` responsible for finding the collision point being attached to the player instead of the camera (which I've intentionally changed very recently – it used to be attached to the camera!), so it doesn't actually point where the crosshair is pointing. I'll get around to it eventually.
|
||||
|
||||
The good news: it has nothing to do with the rifle, so the rifle isn't broken. The bad news: it affects every weapon, so technically, all weapons are broken.
|
||||
|
||||
### Item Preview Window
|
||||
|
||||
I upgraded the item preview window slightly. Previously, the weapons just spun aimlessly, but now they can be tilted using the right analogue stick or the mouse to gaze upon them better! It's a small change but I'm proud of it, so here it is:
|
||||
|
||||
<Video src="item-preview.mp4" />
|
||||
|
||||
I also fixed a long-running bug where the `DirectionalLight3D` of this preview would cast light on the gameplay world. This was caused by the preview being in the same physical space as the rest of the world (unavoidable) and being on the same visual layer (totally avoidable). I changed the layers, adjusted the light so that it doesn't contribute to the sky (very important with a shader that takes the scene's main light into consideration!), and it relieved a great headache that caused oddities such as two specular highlights on every model that received light.
|
||||
|
||||
### Please Appreciate These Wonderful Temporary Weapon Icons
|
||||
|
||||
<div class="horizontally-centre-aligned">
|
||||
<img src="104-icon.webp" alt="An icon for a rocket launcher that looks like a sperm">
|
||||
<img src="106-icon.webp" alt="A primitive flame as an icon for a flame thrower">
|
||||
<img src="107-icon.webp" alt="A hand-drawn crosshair serving as an icon for a rifle">
|
||||
<img src="108-icon.webp" alt="The words 'VENOM' as an icon for the weapon of that name">
|
||||
</div>
|
||||
|
||||
## Grand Code Overhaul
|
||||
|
||||
In (re)starting work on my game, I've been confronted with a lot of... *legacy code?* Lots of code that I was unhappy with, at the very least.
|
||||
|
||||
I've found that a lot of the code I've written – which at this point is up to 1.5 years old – isn't really up to par with what I want to write. It's inflexible, verbose, doesn't always follow standards and best practices, and overall really needed some overhauling. So, I've been doing just that.
|
||||
|
||||
I simplified logic, standardised scenes and code for game objects that share logic, implemented both inheritance and component-based designs where appropriate, and just yesterday, I've moved the code for fading in/out a black screen as well as the message handler displaying text such as "Collected 12 N5 Blaster ammo" and "Open vendor" into autoloads – I learned *this morning* that autoloads can be full scenes (.tscn) instead of just code (.gd). It makes a lot of sense, retrospectively, but now I'm just happy to have simplified some areas where I was unnecessarily passing references. For instance, displaying a text such as "Collected ammo" required the node response for collecting that ammo to have had a reference to the player, who in turn had a reference to the message handler and thus could display messages. This approach was overly convoluted.
|
||||
|
||||
### Godot 4.4 Changes
|
||||
|
||||
If you haven't heard, Godot 4.4 is out! And that meant quite a few changes for my game:
|
||||
|
||||
[Jolt is now integrated into the engine!](https://github.com/godotengine/godot/pull/99895) Since my use of the physics engine is relatively basic and does not rely on Jolt features that haven't been implemented in the engine yet, I switched immediately and was able to remove a dependency. The work that went into this is insane, I recommend checking out the pull request.
|
||||
|
||||
Godot 4.4 added a new node called [`SpringBoneSimulator3D`](https://docs.godotengine.org/en/stable/classes/class_springbonesimulator3d.html), which can be used for jiggle physics in a similar manner to [JiggleBones](https://godotengine.org/asset-library/asset/1595). I replaced my JiggleBones implementation with `SpringBoneSimulator3D` and was thus able to remove another dependency. I like the `SpringBoneSimulator3D` setup better, though I'm not as happy with the current result. I'll have to spend more time tweaking it and learning how to use it properly; it involves a bit more setup than JiggleBones, but it's more reliable, especially since it has better support for collision shapes (JiggleBones only supports spheres, but it's very rudimentary support, and they have to be sized way larger than expected to work at all. It's very unreliable. [`SpringBoneCollision3D`](https://docs.godotengine.org/en/stable/classes/class_springbonecollision3d.html#class-springbonecollision3d) works *so much better* and supports capsules and planes as well).
|
||||
|
||||
Physics interpolation is now available for 3D, which fixed [an issue that caused nodes tracked with a Phantom Camera to jitter](https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do).
|
||||
|
||||
Godot has typed `Dictionary` support in `@export` properties now, which in *my world* is a **huge** deal. It means you can do `@export var dict: Dictionary[int, String]` and dynamically add to the Dictionary in the inspector. This, of course, allows for custom `Resource`s as well. I use this, for example, in the item statistics, where I have a `Dictionary` holding item statistics as a custom `Resource` associated with the item's ID. This `Resource` has nested `Resource`s for individual weapon levels. It's *so* cool! I'm disproportionately happy about this change.
|
||||
|
||||
### $
|
||||
|
||||
Yesterday, I replaced a lot of $ node references with `@export` properties for performance reasons. I watched [this video](https://www.youtube.com/watch?v=fb68YXIBinc) on node retrieval, where I found out that $ references are inefficient. I then thought about this, and... yeah, that makes sense. $ is just a short-hand for `get_node()`, which means that, in a `_process()` context, I'm calling `get_node()` potentially 60 times a second – every time I use it. Considering this *massive* performance implication, I refactored a lot of code and created loads more `@export` references. They're easier to manage in case of moving or renaming nodes, anyway.
|
||||
|
||||
### Weapon Code
|
||||
|
||||
The weapons received some of the biggest changes. Previously, I had a bunch of different classes for a base weapon, semiauto, automatic, and thrower weapon (the last one being a semiauto weapon that fires in an arc), and they all kind of did similar things. I first used inheritance, then switched to a component-based design, where I still needed more boilerplate than I was comfortable with. The thrower in particular copied all the code from the other weapon types, just with changed logic for the projectile path.
|
||||
|
||||
It was a mess. It's all overhauled now.
|
||||
|
||||
There's `weapon3.gd`, which is the base weapon class for all weapons, inheriting from `item.gd`. Then, there are `semiauto3.gd` and `automatic3.gd`, which implement only the functions to determine what happens when the player presses and releases the shoot button – one of them fires once, the other one repeatedly.
|
||||
|
||||
Notice there's no `thrower3.gd`? It's unnecessary. The logic for the arc has moved into the projectile. Why would the weapon be responsible, I asked myself, considering that the throwers otherwise acted identically to the semiauto weapons. I also moved a lot more properties away from the weapons; damage and speed, among other things, have been moved to the projectile. AoE damage and radius, for example, have been moved into the explosion that's spawned by the projectile upon impact. I've generally moved properties to where they're needed instead of bunching them all up at the weapon and then sending them over via long and unnecessary functions. Like, for example, a function that spawned the projectile, which used to look like this: `start_moving(direction: Vector3, ramp_up_speed: float, damage: float, explosion_resource: PackedScene) -> void`
|
||||
|
||||
## My Enemies Follow Me Wherever I Go
|
||||
|
||||
The enemies have pathfinding now implemented! I used Godot's `NavigationRegion` to create a mesh the enemies can traverse. Since they all inherit from `StairsCharacter` – a class I once downloaded to deal with stair stepping for `CharacterController3D`s – they can traverse the world about as easily as the player. It works super well! I was able to piece it together quite quickly, after a friend of mine figured out how to implement navigation in another game we're working on together.
|
||||
|
||||
<Video src="enemy-stairs.mp4" />
|
||||
|
||||
## Story Changes
|
||||
|
||||
I have some minor ideas for where I want the story to head in.
|
||||
|
||||
### Where the Game is Headed Gameplay-Wise
|
||||
|
||||
When I showed the Laura model to a friend recently, they noted how she doesn't look like she belongs in a shooter, but more of a puzzle-type game. I think that incorporating some elements of that sort could be quite cool, actually; solving problems to uncover the mystery of what happened to Laura's world.
|
||||
|
||||
That's the general idea.
|
||||
|
||||
### How (Many) Weapons Will Play Into It
|
||||
|
||||
Heading into this direction means that a large arsenal makes less sense. While I do still want to have combat elements, I've considered reducing the amount of weapons from 12 (which was even as high as 16 way earlier) to 8 or even just 4.
|
||||
|
||||
The amount of weapons in the game also impacts UI: having 8 weapons total would warrant a quick select, like the one currently implemented – though I'd probably make it look a bit more similar to Ratchet: Gladiator, where it is displayed in the upper left corner of the screen. 4 weapons total might instead be served through selection via the d-pad (or numbers 1-4 on the keyboard), though.
|
||||
|
||||
## A Notebook for My Thoughts
|
||||
|
||||
I bought a new notebook recently! While I had a notebook before – a [green A5 notebook](https://www.thalia.de/shop/home/artikeldetails/A1071363499) with dotted pages by Share – it was filling up with notes from university, internships, and other miscellaneous things I didn't want to clutter my project notebook with.
|
||||
|
||||
I switched to a [black B5 notebook](https://www.thalia.de/shop/home/artikeldetails/A1071895735), also with dotted pages, by Plan A. This cost me a lot less than a Leuchtturm1917 B5 notebook (like 60% cheaper) and still totally serves my needs. I like the B5 format, it's just a fantastic size. It's bigger than A5, which allows for more expression, details, and overall just breathing space on the pages, but it's also not as big as A4, which would be unwieldy. B5 is a superb format for my sketch notebooks; can recommend.
|
||||
|
||||
## Bluesky
|
||||
|
||||
I have a [Bluesky](https://bsky.app/profile/denizk0461.bsky.social) account now!
|
||||
|
||||
I've been eyeing the platform for a while now, but lately I've noticed that quite a few people I enjoy following have Bluesky presences. Plus there are other cool people there, as well as the Feed feature where I can, for example, see all Godot-related content. I've created an account with the idea of potentially posting some of my gamedev progress on there, though I have not yet shared anything. Still figuring out social media; while I grew up during the rise of social media (on mobile phones in particular), I've never really been into them quite as much as others have.
|
||||
|
||||
Maybe this'll be different though, seen as I have a relatively specific goal here. We'll see!
|
||||
|
||||
## Addendum
|
||||
|
||||
Sorry for the walls of text! I've really just been working more on backend stuff than visually interesting things, mostly to clean up the project, but also because I feel that's my strength. I'm super good at programming expandable, relatively easy to maintain code, at least in comparison to my artistic skills. However, I'm *absolutely* working on story, visuals, more weapon, and of course Laura 2.0, so hopefully I'll have more to show for in the coming weeks and months!!
|
||||
84
src/routes/projects/projectn5/devlog/2025/0427.md
Normal file
84
src/routes/projects/projectn5/devlog/2025/0427.md
Normal file
@@ -0,0 +1,84 @@
|
||||
## Current Progress
|
||||
|
||||
As promised, I've been working on Laura v2 – which has now become v4. On the right is the current/soon-to-be previous model of Laura, on the left is my current progress on her new model!
|
||||
|
||||
<img src="laura-comparison.webp" alt="Laura's old model on the right, Laura's new model on the left">
|
||||
|
||||
(By the way, the left picture is the most recent version of the model. Other pictures on this page will be older and may have some slightly different details!)
|
||||
|
||||
### New and Improved
|
||||
|
||||
Notable differences are:
|
||||
|
||||
- Laura wears a cropped zip-up hoodie with a more saturated colour than before, and a black shirt underneath. Her clothes are generally fairly similar between versions, though her dimensions and especially the topology are quite different and optimised.
|
||||
- Her shoulder area was a previous pain point of mine – notice the completely smooth transition from neck to arms in the right model. In the new version, her shoulders have been given much more shape.
|
||||
- Her hoodie's colour is more saturated than before. The comparison here is not quite fair, since the left is an image from Blender and the second is from Godot, thus impacting how the colours look since there are different shaders used, but the idea still stands.
|
||||
- Her hair is tied-up in a ponytail, which not only looks cooler, but is also way easier to animate, imo.
|
||||
- Her eyes have been refined in shape and her lashes/eyeliner have been extended to wrap around her eyes more, which, in my opinion, looks quite a lot sharper than before.
|
||||
- Her eyes have been socketed in a different way. Previously, they were flat faces directly behind her irises, but now they're much more recessed, which likely/hopefully won't be visible using flat shading. I also edited the normals to look less like the sclera is recessed. I'm hoping this'll make animating easier, since the irises can now move more freely without clipping into the sclera.
|
||||
|
||||

|
||||
|
||||
### Things to Work On
|
||||
|
||||
Parts that have not yet received much attention are:
|
||||
|
||||
- Her trousers, which have received a general shape, but no details.
|
||||
- Her belt, oxygen mask, and left hand, which are mostly copied over and adjusted to not look completely out of place.
|
||||
- The shoes, which are placeholders.
|
||||
- The right arm, which is notably present in the picture, but nowhere near finalised and to be attached.
|
||||
- Her hair, which is present only in a basic shape to serve as a placeholder for what I have planned.
|
||||
- I might add her hair band back.
|
||||
|
||||
|
||||
### Further Thoughts on Modelling
|
||||
|
||||
This model is supposed to look more dynamic and lively than the previous one. I want to more granularly animate the hair by adding more bones to individual strands. I'll also add bones for the hood so that it can bounce up and down when running. I'm also considering adding bones to allow the sleeves and trouser legs to move slightly, though I'm not sure if I'd be able to make that look good, so I'm keeping this idea in the 'optional' pile for now.
|
||||
|
||||
I think what helped with modelling this time around was that I let go of the notion that Laura should be a low-poly character. I started out that way when I was modelling v1 but then I changed my mind, which created some problems, I find. This time, I still don't want to go crazy with tris, but it's not as much of an issue to me. At one point I even intended to subdivide her entire model by 1 level to smoothen some rough edges and overall make the model a bit more polished, but I discarded that idea yesterday.
|
||||
|
||||
### The Eternal Hair Struggle
|
||||
|
||||
I've [struggled with hair before](/projects/projectn5/devlog/20241222/), and it's not gotten *much* better. Check out Laura's current ponytail:
|
||||
|
||||

|
||||
|
||||
Looks like a banana!
|
||||
|
||||
I think my next try will be to polymodel strands of hair out of subdivided planes. It'll increase the poly count quite significantly, but it's a trade-off I'm willing to make for hair that'll look better and flow (animate) much more nicely!
|
||||
|
||||
### wdym v4?
|
||||
|
||||
The current version of Laura is based on the following sketches:
|
||||
|
||||

|
||||
|
||||
<img class="inline-img-left" src="laura-v2.webp" alt="Laura v2 wearing a top with puffed-up sleeves">
|
||||
|
||||
I worked with these sketches to create the first remodel of Laura. Originally, I was decently happy with the result, though her sleeves seemed boring – just ballooning and lacking an interesting shape.
|
||||
|
||||
<img class="inline-img-right" src="laura-v3.webp" alt="Laura v3 wearing a black dress and a red longsleeve underneath">
|
||||
|
||||
I had quite a few ideas to improve the current and rather boring Laura model. At the centre of the remodelling was keeping Laura's character but giving it more edge through a more unique silhouette. I wanted to accomplish this by adding textures and detail, layering clothes, and giving more shape to her.
|
||||
|
||||
Eventually, I had a different vision for Laura, though. This time, she would wear a dress with a long-sleeve shirt beneath. I liked this idea because it showed off the shape of her legs more, whereas the previous idea would hide them inside of straight-cut trousers. It would just look more interesting, I felt. I was also inspired by some 3D models I saw on Pinterest.
|
||||
|
||||
While I generally liked the idea, there were two major problems: firstly, I felt I wasn't really able to execute the idea in a way that I found fitting. Secondly – and this plays into the first aspect – the model didn't look as mature as I liked. Partially in its style, but also in its execution.
|
||||
|
||||
This v3 of Laura was then superseded by another Laura, which essentially went back to the previously style, though I used v3 as a base due to some improvements I made on the model. Thus the new version is now called v4.
|
||||
|
||||
Notice how specifically her head and the prosthetic aren't present in the v2 screenshot – those were v3 additions.
|
||||
|
||||
## Prosthetic Implications
|
||||
|
||||
I'm changing Laura's amputation from its previous below-the-elbow cutoff to above-the-elbow. This is mostly a stylistic change, because it means her elbow will be a mechanical replacement as well, and that might look cool, I think.
|
||||
|
||||
I've also been thinking about how her prosthetic could play into the story. A while back, I watched [this video](https://www.youtube.com/watch?v=jZfgQTC9CEA) by champutee on arm amputee representation in video games. Admittedly, I feel I'll likely fall into quite the same categories in some ways, making Laura's prosthetic so advanced that it'll more or less serve as a perfect replacement for her organic arm. I had a potentially neat idea that would impact gameplay, though.
|
||||
|
||||
### Difficulty Scaling
|
||||
|
||||
At one point in the game, Laura could lose function of her prosthetic entirely and be forced to continue without being able to use it. This would reflect in gameplay especially because Laura would then be unable to use any two-handed items, which will include a majority of her weapons as well.
|
||||
|
||||
Laura will likely have something between 4 and 8 weapons available to her. I'm thinking that some will be two-handed from the start (including her main rifle), and some will level-up from one-handed to two-handed or dual-handed (for example, a blaster in each hand). This would mean that more advanced players who progress quicker and manage to level up their weapons early (through XP, collectibles, or purchases, I've not decided) will face a greater challenge, since more of their weapons will be levelled up to their two-handed versions, thus making a larger part of their arsenal unavailable for this part of the game.
|
||||
|
||||
In my teacher training, we call this type of catering to different skill sets *differentiation (Differenzierung)*!
|
||||
55
src/routes/projects/projectn5/devlog/2025/0523.md
Normal file
55
src/routes/projects/projectn5/devlog/2025/0523.md
Normal file
@@ -0,0 +1,55 @@
|
||||
20 months after starting *Project N5*, I decided to restart the project. In fact, a friend of mine assumed I'd do it all the way back in December 2023! Initially, I resisted, though I toyed with the idea for quite a while, before finally deciding that this is best for the project last Friday (**2025-05-16**).
|
||||
|
||||
## Why?
|
||||
|
||||
There are two main reasons for starting the project from scratch again.
|
||||
|
||||
### I Improved
|
||||
|
||||
The first reason is simple: I improved as a programmer.
|
||||
|
||||
Back when I started *Project N5*, I had never actually used Godot before. This project was my first experience developing in Godot, and to a greater extent, my first attempt at making a full-scale game! I set out a huge goal for myself, though I welcomed the challenge.
|
||||
|
||||
With stagnation in my progress especially in the summer of 2024, I felt I outgrew the project's codebase in some way. Also adding to that is the fact that I was working on [another game](/projects/#projektike) with two friends, where I had to write clean solutions and well-structured code to keep the project modular (especially during the stage where we hadn't quite figured out where to take the project) and understandable for the others. This resulted in me learning the ropes of Godot and GDScript much more than I had before.
|
||||
|
||||
I initially tried to tackle the issue by refactoring the codebase of *Project N5*. Even though I made significant progress, I later felt that the codebase was flawed from the core. I felt this way especially while I was recently trying to implement a new weapon – what a hassle that was!
|
||||
|
||||
Which leads nicely into my second reason...
|
||||
|
||||
### The Project Changed
|
||||
|
||||
For quite a while after I started *Project N5*, I didn't know where to take the project. In fact, I was stuck at the idea of a robot protagonist for *such a long time!* Laura only came to mind [much later](/projects/projectn5/devlog/20241127/). With her, however, my ideas for the project started to change slightly.
|
||||
|
||||
Don't get me wrong – the essence of the game is probably still pretty much intact. However, I want to make the game a little less combat-focussed, which meant that especially the weapon structure I had built up made no sense anymore. I built the system specifically so I could implement as many different weapons as I liked. Recently, though, I decided that 4 is enough, which made the grand system redundant.
|
||||
|
||||
Add to this the fact that, with a lesser focus on combat, an [arena](/projects/projectn5/devlog/20240324/) made *no sense at all!*
|
||||
|
||||
Trying to bodge my old codebase – "Altlasten mit sich tragen", as one would say in German – felt wasteful.
|
||||
|
||||
## The Current State of the New Project
|
||||
|
||||
Considering I started one week ago, I'm doing decently well:
|
||||
|
||||

|
||||
|
||||
What you can see here is my new Laura model (not yet finished!), with a partially-applied toon shader and an outline shader on top. The UI elements include a health counter (on top), a money counter (bottom right), a placeholder for the popup menu(s), a crosshair in the middle of the screen (the dot), and an aim helper texture also in the middle of the screen (the cross). The two boxes represent enemies, not in function, but in their physics layers and in targetability.
|
||||
|
||||
There are a lot of improvements: targets, for example, are now not defined by a special node setup, but rather by aTarget prefab, which can easily be positioned anywhere (enemy or environment) and be used to guide player projectiles.
|
||||
|
||||
The code is also *so much more streamlined...* I put many elements into their own components to avoid cluttering theplayer.gd script with an overwhelming amount of responsibilities. That way, what was previously a 300+ line script handling player movement, aim direction, messages, equipping items, interacting with objects etc. is now a lean 50+ line script (although ofc not everything from the previous project is implemented here yet, such as the vendor interactions). Anything that's not directly related to the player has its own component script to keep things separated as much as possible. Currently, there is also no singletonSignalBus routing wildly between any and all nodes. Instead, signals are just defined in their components and connected directly to only the components needing them. This also means that components only take care of tasks that are explicitly meant for them; the guns, for example, no longer calculate the position which the projectile is flying towards. Instead, they can now simply retrieve an aim direction from theAimManager, requiring much less code in each weapon. Everything's so clean and I love it.
|
||||
|
||||
### The New Weapon Arsenal
|
||||
|
||||
Check out the new weapons:
|
||||
|
||||

|
||||
|
||||
With these, and with the UI in the previous screenshot, you may have noticed a theme: I'm putting less time into temporary assets. While nice to play around with, it's unnecessary to spend an hour designing a UI element when I already know I'll 100% replace it down the line. Thus, most elements are either entirely simplistic (text, primitive MeshInstance3D, etc.), or just very simple textures.
|
||||
|
||||
## Continuing
|
||||
|
||||
Progress has been quick, which I really liked. It felt as if project development picked up again. Of course, a lot of this has to do with the fact that I'm just programming things I've already once programmed, so I have to put less time into coming up with ideas and can instead solely focus on the implementation. However, I feel that this cleaner codebase will allow me to expand much more easily and develop a less bug-ridden game than if I had simply continued with the old codebase.
|
||||
|
||||
I'm happy I took this step!
|
||||
|
||||

|
||||
109
src/routes/projects/projectn5/devlog/2025/0713.md
Normal file
109
src/routes/projects/projectn5/devlog/2025/0713.md
Normal file
@@ -0,0 +1,109 @@
|
||||
<script lang="ts">
|
||||
import Video from "$lib/video.svelte";
|
||||
</script>
|
||||
|
||||
*Why are we still here? Just to suffer?*
|
||||
|
||||
Note: the screenshots here are covering almost 3 months of work, and they're not in chronological order either. Some details from older versions that are intended to be kept will be missing in newer versions.
|
||||
|
||||
## Mesh Improvements
|
||||
### Skull Remeshing
|
||||
|
||||
When I was at uni recently, I decided to recreate Laura's head from scratch. The intention was to clean up the messy topology and just make it look a bit better. This time around, I didn't use a sphere as the base, but rather started from a single vertex and extruded out vertices manually to tailor it exactly to what I wanted. Here's the result, which I'm actually quite proud of:
|
||||
|
||||
<Video src="headmesh.mp4" />
|
||||
|
||||
Compare this to the old head mesh:
|
||||
|
||||

|
||||
|
||||
The old head was quite messy in topology; it's an artifact from Laura v1. There, I initially designed the head to not have any kind of face, but later I added eyes, a nose, refined the eye shape, and most recently, I added some shape around the eyes (the eyes are inset a bit and the eyebrows are comparatively further forward to follow the shape of an actual skull). All these edits required more edge loops and vertices than I had originally planned, which is the root cause for this mess of vertices.
|
||||
|
||||
The new head was designed from the ground up for exactly what I need. The entire head is made of easily-editable edge loops based on quads, except for one further cut along the nose to give it a bit more shape. I deemed this addition acceptable and even preferrable over slicing an entire new edge loop into the head.
|
||||
|
||||
With the head remeshing came more changes: I edited the shape of Laura's head. I made it rounder for one, but I also edited her jawline and made the head shorter in general.
|
||||
|
||||
I found I struggled with hairstyles because her forehead was quite massive compared to the rest of her head. It didn't lend itself to the style I wanted to achieve. Thus, I edited the dimensions, and now it looks a lot better, I find.
|
||||
|
||||
### Sharper (get it?) Hair Shading
|
||||
|
||||
I figured out yesterday how to improve the shading of Laura's hair significantly!
|
||||
|
||||
Here's something that bothered me: her hair consisted of essentially rectangular tubes (in Blender: a path with a circle consisting of 4 vertices wrapped around it, vertices set to 'vector' to turn them into corners). Because it was smoothly-shaded, any shader would try to wrap around the light as if the strands were circular/tubular. This meant that the sides were far darker than I would have liked.
|
||||
|
||||
I managed to 'fix' this (depending on your perspective on the issue) by marking the sides of all strands as sharp edges. This now means that the strands are shaded separately at the front and the back, respective, with a sharp edge where they previously transitioned smoothly.
|
||||
|
||||

|
||||
|
||||
The left hair is the old style, the right is the new one. Notice how the strands are much more distinct on the left because of their darker outlines (shadows).
|
||||
|
||||
The idea came to me while I was experimenting with new hair styles and enabled flat shading on the strands to see their flow better.
|
||||
|
||||
## Continuing the Makeover
|
||||
### Hairdressing
|
||||
|
||||
I played around with Laura's hair a little bit recently.
|
||||
|
||||
More importantly, I figured out her ponytail! Previously, I created a sort of 'banana' and extruded individual strands from it to create a more hair-like appearance.
|
||||
|
||||

|
||||
|
||||
However, I didn't like this very much, because it... well, I just think it looked bad. What I did instead is something that was actually inspired by a girl's hairstyle I saw on a bus:
|
||||
|
||||

|
||||
|
||||
The shadow effects are – once again – created by sharp edges! It actually works very similarly to the tied-up hair on the back of her head.
|
||||
|
||||

|
||||
|
||||
This effect I made by creating a sphere, selecting every second edge loop, scaling it down to create a spiky effect (that is mitigated by smooth shading) and then marking the scaled-down edges as sharp.
|
||||
|
||||
### Those Damn Eyes
|
||||
|
||||
I decided to recolour Laura's right eye. Previously, it was a shade of red to match the rest of her outfit. Instead, though, I decided to go the complete opposite: it now looks borderline out of place against her colour palette, and for good reason.
|
||||
|
||||

|
||||
|
||||
It's blue and cold grey to display a discrepancy in her new body parts. That colour scheme will be used for her right arm, too, as well as some robots and environmental pieces. It shows how, even though Laura will find herself in her home world, the world around her has changed beyong recognition. This change, this unfamiliarity reflects back on her.
|
||||
|
||||
I'll also texture them once I finish modelling to make them look more interesting.
|
||||
|
||||
Due to a non-applied mirror modifier, Laura's eyes look identical (which is to say, the right eye is organic) on some pictures here. This will change, though.
|
||||
|
||||
### Shoe Shopping
|
||||
|
||||
Laura finally has (almost) permanent shoes!!
|
||||
|
||||

|
||||
|
||||
In v1, I intended to give Laura boots. However, I wasn't happy with how they looked. Furthermore, boots just didn't quite fit the style I wanted to go for. So instead, I modelled some sneakers, of course gathering reference from a shopping website.
|
||||
|
||||

|
||||
|
||||
### Minor Adjustments
|
||||
|
||||
Further things I changed:
|
||||
|
||||
- Laura's hoodie has a more vibrant red colour now.
|
||||
- Her trousers are wider now. She has a much more unique silhouette now than she did in v1!
|
||||
- The trousers also have cargo pockets now.
|
||||
- The shape of her eyelashes has been refined.
|
||||
|
||||
|
||||
Her right (mechanical) arm is still not in place, however. I've been struggling with ideas for it.
|
||||
|
||||
Actually, I've not thought about it enough recently. I should change that.
|
||||
|
||||
## Sway to and fro like little insects!
|
||||
|
||||
Gameplay-wise, I also made some progress: there's now ziplining in the game! The idea is that Laura will be able to use her right arm (which doesn't feel rope burn like her organic left arm would) to hook onto ropes and zip across (intended) parts of the levels.
|
||||
|
||||
<Video src="ziplining.mp4" />
|
||||
|
||||
In the video, Laura ziplines *up* and even does a flip, which won't be in the game. It's intended to go downhill only instead, to travel between two platforms in a non-reversible way. This loop was just a test.
|
||||
|
||||
## Laura as of Today
|
||||
|
||||
and to end this devlog, here's how Laura currently looks in her entirety:
|
||||
|
||||

|
||||
50
src/routes/projects/projectn5/devlog/2025/0816.md
Normal file
50
src/routes/projects/projectn5/devlog/2025/0816.md
Normal file
@@ -0,0 +1,50 @@
|
||||
<script lang="ts">
|
||||
import LinkList, { type LinkEntry } from "$lib/link-list.svelte";
|
||||
|
||||
let builds: LinkEntry[] = [
|
||||
{
|
||||
text: "2023-10-07 (Protagonist #1)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2023-10-07.zip",
|
||||
},
|
||||
{
|
||||
text: "2023-12-23 (Protagonist #2)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2023-12-23.zip",
|
||||
},
|
||||
{
|
||||
text: "2024-03-25 (Protagonist #3 with jump animations)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2024-03-25.zip",
|
||||
},
|
||||
{
|
||||
text: "2025-08-16 (Laura era) [same build as the web version]",
|
||||
link: "https://files.denizk0461.dev/projectn5/2025-08-16.zip",
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
This one's more of a heartbeat update rather than a progress display.
|
||||
|
||||
## Update on the Progress Pause
|
||||
|
||||
What's become apparent through the infrequency of devlog updates is that I've slowed development recently. I've had to prepare for an abroad semester that starts in September, and I've also been busy writing a bachelor's thesis on school participation in the city – titled *"The School as a Neighbourhood Actor"*.
|
||||
|
||||
The good news is that I'm done with all of this! The bachelor's thesis in particular robbed me of quite a lot of time, though I managed to power through in the week before submission. I finally submitted it on Monday and only have a colloquium left to pass, though since I only need to prepare a short presentation for this, it won't take nearly as much time away from my creative projects.
|
||||
|
||||
## Play Project N5 (old)
|
||||
|
||||
I decided to upload some playable builds of **Project N5**! Now that the website is running on my own server instead of being hosted by GitHub or Codeberg, I have a lot more freedom here.
|
||||
|
||||
The game, in its state from 2025-05-16 (before the reboot), is available to play in-browser [right here!](https://apps.denizk0461.dev/projectn5) It's not a terribly great experience, though. Loading times are significantly longer and shader compilation regularly freezes the game for longer than in a locally-saved copy. Some shaders are also not functioning as intended, though this only has a minor visual impact. The game was never optimised to work on the web, after all.
|
||||
|
||||
I've also uploaded old builds of the game [here](https://files.denizk0461.dev/projectn5). You'll find the following builds, one for each protagonist:
|
||||
|
||||
<LinkList entries={builds} />
|
||||
|
||||
The 2025-08-16 build has not seen work put into it after [2025-05-16](/projects/projectn5/devlog/20250523/), bar the build notice on the pause screen.
|
||||
|
||||
## What's Next
|
||||
|
||||
More will follow soon!
|
||||
|
||||
Now that my bachelor's thesis is a thing of the past, I have much more free time to work on this game, and I want to *use* it. Starting Monday, I've told myself, I'll work on the game *every day!* I'm hoping this will not only yield more progress, but also that I'll be able to establish a routine, which will remove the requirement of random motivation to get things done.
|
||||
|
||||
Laura's 3D model is progressing well, for example, and I cannot wait to texture and animate her!
|
||||
91
src/routes/projects/projectn5/devlog/2025/1011.md
Normal file
91
src/routes/projects/projectn5/devlog/2025/1011.md
Normal file
@@ -0,0 +1,91 @@
|
||||
<script lang="ts">
|
||||
import Video from "$lib/video.svelte";
|
||||
</script>
|
||||
|
||||
## She's Alive!
|
||||
|
||||
Hi. I finally put Laura into my game. Here she is:
|
||||
|
||||
<Video src="walking.webm" />
|
||||
|
||||
I mostly finished modelling her around two weeks ago, though I've been making constant adjustments while texturing and rigging her. In fact, I made a larger change just two days ago I believe, when I edited the topology around her hips to get better bends in that area.
|
||||
|
||||
I also removed the outline shader here, because it kind of clashed with the model – her eyes were completely black, for example. I'll have to see whether I re-introduce an outline shader. I couldn't really get it to look nice with Godot 4.5's new stencil buffer, though I still think the feature is very cool.
|
||||
|
||||
### Her Rig
|
||||
|
||||

|
||||
|
||||
Unlike last time, I decided against using an auto-rigging tool and instead manually created Laura's rig. Several reasons:
|
||||
|
||||
Setting up a rig using an auto-rigging tool often means creating a very complicated rig. The rig created for v1 Laura using Rigify yielded many hundreds of bones; deformation bones, organisation bones, control bones, IK, FK, literally everything you could imagine. I, quite frankly, do not need most of this. Creating a rig manually meant that I could focus on the things I needed, nothing more, nothing less. Plus, creating it myself meant that I actually understood what was going on and had to justify every single bone. This yielded a rig that's more efficient and *much* more manageable.
|
||||
|
||||
It also allowed me to add extra bones much more easily. I'm aware that it's possible to add bones to a Rigify rig, but as far as I know, this requires writing Python code, and while I know Python, I know absolutely nothing about Blender scripting. In my rig, adding more bones was as easy as... just adding more bones. This was particularly helpful for the zipper, hood, earrings, and her hair. Likewise, I could omit any bones I *didn't* need. Therefore, Laura has no facial bones except for her eyes – something that I think is not easily doable using Rigify (you need to keep or delete *all* face bones at once).
|
||||
|
||||
I also had more creative liberty over creating controls. So far, I've only added a pivot control shape for the root bone (the circles at the hips), but I might add more.
|
||||
|
||||
...that's all for Rigify vs. manual rigs.
|
||||
|
||||
The model is mostly FK, except for the hands and legs, which are controlled using IK. Extra bones near the knees and elbows serve as pointing targets. For simplicity (and because I don't yet know how I could even do this), I don't have any IK/FK switching mechanic implemented. I don't think it'll be necessary, though.
|
||||
|
||||
I'm honestly quite happy with this!
|
||||
|
||||
### Her Hair
|
||||
|
||||
The transition to ponytail hair is done! It also allowed for a hair tie as an extra accessory.
|
||||
|
||||
I've even added some (not quite finished) hair and hood physics using `SpringBoneSimulator3D`. Compared to Laura's v1 model, this one has many more bones in the hair, so that it can animate smoother. The ponytail is also – as I had expected – much easier to animate properly than flat hair, since it doesn't need to collide with her shoulders and deform appropriately (for which I'd have needed many more bones). Compare the rigs between the old model (left) and the new (right):
|
||||
|
||||

|
||||
|
||||
### UVs
|
||||
|
||||
I decided to split Laura's textures into five UV groups:
|
||||
|
||||
- skin
|
||||
- hair
|
||||
- hoodie and hair accessories
|
||||
- other clothing and prosthetic arm
|
||||
- mask glow highlight
|
||||
|
||||
The glow highlight is for overdriving the albedo separately from the rest of the model.
|
||||
|
||||
### Right Arm Prosthetic
|
||||
|
||||
I decided on a relatively simple prosthetic design now. I also changed the colour to white because it honestly just looked a lot nicer than the grey I'd used before. With the toon shader, I don't think a metallic or reflective look would really be possible anyway.
|
||||
|
||||
While modelling her right hand, I also had an idea: instead of creating a second hand from scratch, why not take her left hand and edit that? Doing this meant that the hands don't look drastically different from one another – as in, they look different, but they still look as if they belong to the same character. It'll also make rigging and animating much easier if both sides are similar. That way, I was able to symmetrise the rig and I'll thus be able to mirror poses!
|
||||
|
||||

|
||||
|
||||
## What's Next?
|
||||
|
||||
### More Animations
|
||||
|
||||
So far, the only animations available are the bind pose (A-pose) and the idle pose. I plan to make many more, of course, and I've been having quite a lot of fun already posing Laura.
|
||||
|
||||
It's quite easy in Godot to put animations together – and quite fun too, I think. You can blend multiple animations together, and you can also use `AnimationNodeStateMachine` to define logic for switching between animations. It's quite cool!
|
||||
|
||||
### *your clothes*
|
||||
|
||||
What might be BLATANTLY obvious is the unfinished texturing on her trousers. They are still missing some details, though I figured that's a problem so minor that I can just fix it down the road and replace the .png once I've updated it.
|
||||
|
||||
I did, however, make sure to lay out the model UVs in such a way that her hoodie and hair accessories share a texture, which can be hue-shifted with a shader in-game. Has potential for a future cheat code, hehe.
|
||||
|
||||
### Minor Fixes
|
||||
|
||||
There are some small things I still need to fix. For example, Laura's hair UVs don't yet seem to play quite as nicely with the hair shader as I'd like.
|
||||
|
||||
I may also have to make some adjustments to the zipper, since I currently cannot get `SpringBoneSimulator3D` to animate it. I'll have to see whether this is a configuration error or if I need more bones to use it.
|
||||
|
||||
### ...and then?
|
||||
|
||||
Well, I've not really thought this far ahead. I've been working on Laura for so long – since November of last year, remember! – that I've mostly focussed on finishing that. I guess my next step is to animate her and make the animations work in-game. As for where I'm taking the game next; I have rough ideas but I'm not quite sure which steps to take next, exactly.
|
||||
|
||||
What's a bit annoying is that I'm currently doing an abroad semester, which means that I'm not home and cannot access my usual equipment. I have my laptop and a good mouse with me, but I'm missing my monitor setup – working off a single 14-inch screen is admittedly a bit strenuous, since tools like Blender and Godot split up their workspaces into panels, which quickly become crammed. I've noticed this most when animating in Blender.
|
||||
|
||||
I'm considering taking some days to bury myself in the depths of the university library here to animate. They have 34-inch screens available to use with personal laptops.
|
||||
|
||||
...
|
||||
|
||||
I've been quite enjoying working on this game recently and I've been making good progress too. In the past three weeks, I've made progress almost every single day! I'm hoping to keep this up.
|
||||
57
src/routes/projects/projectn5/devlog/2025/1022.md
Normal file
57
src/routes/projects/projectn5/devlog/2025/1022.md
Normal file
@@ -0,0 +1,57 @@
|
||||
I realise there's still a lot of comparing between the old and the new in this update, but I promise there'll be new stuff soon... hopefully. Right now, I just want to go over the improvements I made, because creating Laura has been a huge learning process for me and I honestly think it's been quite successful, which I'm really happy about.
|
||||
|
||||
## Animation
|
||||
|
||||
...is tough. I've never animated a character before. I get how to do it mechanically, within Blender, but it's hard to nail natural movement. I've dabbled in walking and running cycles so far, and they do look like the action they're supposed to represent, but just not quite like what I'm aiming for. There are also issues with things like the speed and, as a consequence, foot sliding. Growing pains, I guess.
|
||||
|
||||

|
||||
|
||||
## Model Changes
|
||||
|
||||
### Blinking
|
||||
|
||||
Something that was quite easy to improve was Laura's blinking. In her old model, the topology around her eyes was bad, which led to some nasty stretching:
|
||||
|
||||

|
||||
|
||||
I fixed this by adding a separate eyelid mesh, which was recessed into her head while her eyes were open, and stretched from the top of her eyes to the bottom when she blinked. I figured the toon shader I intended to use would hide it, and it kind of did. Still, it didn't look great because her eyes shut from the top only, which is unnatural. Plus, she only had eyelashes on her top eyelid, so making a bottom eyelid would have looked a bit odd. I made the flat eyelashes move and rotate with the eyelid, but it didn't look great either. They clipped into the mask, and the flat plane visually disappeared around the halfway point. Observe on the left, and compare to the new one on the right:
|
||||
|
||||

|
||||
|
||||
The way I set up the new mesh allows for stretching the eyelids without affecting the rest of the mesh in any harmful way. Hardly any stretching artifacts to speak of! Thus, I was easily able to make both the upper and the lower eyelids move. And because her eyelashes now wrap around her eye, they close up during the animation, which I think looks super fancy:
|
||||
|
||||

|
||||
|
||||
Her eyelashes now look *so damn good* when closed. Maybe not perfect but I'm VERY happy with the result.
|
||||
|
||||
### Texturing
|
||||
|
||||
I took the liberty to refine her textures a little bit. I didn't add a lot, but I went over a few things:
|
||||
|
||||
- the trousers are a shade darker
|
||||
- the hoodie now has a black V-shape across the chest and back
|
||||
- the shoes are now white with black accents
|
||||
|
||||
I still need to add some texturing detail to the trousers and hoodie, like seams. I think they're needed to push the model just a little bit further. I'm just worried whether or not I can actually make it look good. I guess I just need to try to get practice though.
|
||||
|
||||

|
||||
|
||||
### More Changes
|
||||
|
||||
I also edited the model slightly by changing the shape of the trouser legs near the shoes and modifying the topology around the hips for better leg bends. The hood now doesn't bend, but rather bounces as a single unit; I disliked the fold it had and the way it looked when Laura moved in-game. I also gave her a belt buckle very similar to what she had in her old model (see picture above). Not sure if I'll keep it, but it might be a neat detail.
|
||||
|
||||

|
||||
|
||||
## Storyboarding
|
||||
|
||||
I'm likely using that term wrong, but I've been trying to refine the story ideas I've had and put them into a string of events. I'm using Obsidian's canvas feature for this, which is really cool. It gets laggy every now and then, but manually deleting cache folders every few months seems to do the trick, for some reason.
|
||||
|
||||
I've been using it to put all my pieces, all my ideas into a central document, and using groups and arrows to create this string of events to turn it into a linear story. It allows me to view the story as a whole and see the gaps and missing pieces.
|
||||
|
||||
Can I just say: this is *difficult!* I've written stories before, but most of them never received an ending, and some of them didn't even have a proper beginning. And those I *have* finished, well... there aren't many, and I don't think they were good. In fact, I remember just one finished story I wrote in the span of around an hour for a school project (a film), and I also directed it, did the camerawork, and edited it. It was awful, let's never speak of it again.
|
||||
|
||||
This time will be different! I never said this before in regards to storywriting, so it ought to be true.
|
||||
|
||||
I've also been thinking about the gameplay side of things. I'm thinking that the game should still lean less into the gun-play direction, so I might stick with the two weapons currently implemented – the blaster and the rifle. I'm also considering omitting the levelling mechanic entirely, since there's hardly a point if there's no arsenal to back it up.
|
||||
|
||||

|
||||
65
src/routes/projects/projectn5/devlog/2025/1207.md
Normal file
65
src/routes/projects/projectn5/devlog/2025/1207.md
Normal file
@@ -0,0 +1,65 @@
|
||||
<script lang="ts">
|
||||
import Video from "$lib/video.svelte";
|
||||
</script>
|
||||
|
||||
Much of what I've been doing recently is think about the game and try to come up with story plans, but I still have some progress to show off!
|
||||
|
||||
## Decoded
|
||||
|
||||
I've been thinking about what kind of devices Laura would use over the course of the game. Besides weapons – the scope of the roster I've significantly reduced in recent times – there should be functional gadgets as well. One of them which I have started implementing is the Decoder (WIP name):
|
||||
|
||||

|
||||
|
||||
Obviously she's just holding a temporary asset for the gadget.
|
||||
|
||||
The Decoder is meant as a gadget allowing to 'hack' into terminals to access doors, information, etc. think of Ratchet & Clank gadgets like the Trespasser, the Hacker, etc. Actually, I used to think there is a device called "Decoder" in Ratchet & Clank, but there is no such thing – I was thinking of the Decryptor and the Infiltrator. Or the Code Bot.
|
||||
|
||||
I have so far considered designing a minigame similar to that of Ratchet 3's Tyhrraguise, where you have to follow timed button prompts. This interface currently looks as follows – the Ratchet face is currently a placeholder for the finish node:
|
||||
|
||||

|
||||
|
||||
No functionality is currently implemented. To be honest, I'm not entirely sure if I'll keep this – or whether I should spend time on something as small as this at all right now.
|
||||
|
||||
## Looking At Things
|
||||
|
||||
In an effort to make Laura a more lively and interactive character, she can now look at things ([again](/projects/projectn5/devlog/20250316/)), courtesy of `LookAtModifier3D`! And this time, I've implemented a priority queue system where the responsible component will keep references to all `LookTarget`s (`Node`s that can be placed freely in the world), which have a priority assigned to them – `LOW`, `MEDIUM`, and `HIGH`. The component will attempt to target the earliest added node of the highest priority.
|
||||
|
||||
<Video src="look-at.webm"/>
|
||||
|
||||
## Becoming an Author
|
||||
|
||||
Possibly the biggest challenge I'm currently facing is: where to take this game story-wise?
|
||||
|
||||
I have some ideas. Even for some levels. I want the game to start with a calibration/escape/sabotage sequence to introduce mechanics and the plot of the game. I want it to lead into Laura finding out what happened to her and the world. I then want it to transition into a slow lead-up to the boss battle, a major plot point being when she returns to the place she had been in the intro cutscene and before the catastrophic event that initiated the game's story happened. I potentially want her to meet an ally that helps her in her mission too.
|
||||
|
||||
What's also important to me is that Laura is a kind of anti-hero. She sees her own actions as justified without considering the (changed) world around her enough. I want the ending to be not entirely happy – something satisfying but also have a degree of regret instilled in Laura.
|
||||
|
||||
I'm ambitious in my story. I am aware that this is a huge challenge and I will not go overboard – for example, I've decided to keep dialogue fairly minimal, create fewer than 10 levels in total (potentially even re-use some levels), and to use minimally animated cutscenes. I'm just one person and I know that I have to make concessions, but I nevertheless think that I can make something cool.
|
||||
|
||||
It's a HUGE challenge, but really, everything so far has been a huge challenge. I learned to code game mechanics! I learned to 3D model! I am learning to animate! Who says I can't write a full game??
|
||||
|
||||
I can do this. Even if it takes me a long time.
|
||||
|
||||
I'm organising myself using [Obsidian](https://obsidian.md), and it's been working quite well. I have a canvas for all kinds of ideas, a spreadsheet for the level structure, another canvas for level image inspirations, and some smaller things such as my long-established TODO kanban board and a mission tree.
|
||||
|
||||
## Other Things I've Been Working On
|
||||
|
||||
### Missions Screen
|
||||
|
||||
Speaking of mission tree – I created a missions screen! It's got similar components to that of Ratchet & Clank 3. The idea is that missions would guide you through the game, with some missions being unlocked by others (sequentially leading you through the game) and others being unlocked when certain conditions are met.
|
||||
|
||||

|
||||
|
||||
### Overview Camera
|
||||
|
||||
Another return from the old Project N5 builds is the overview camera – a per-level `PhantomCamera3D` that displays an establishing shot when loaded into the level. This time, it's solved a bit more elegantly: `Laura` will search for a `Node` in the group `overview_camera`, which will be set to a high priority by default. Once the player moves, the priority is lowered to 0 and the reference to the camera is erased.
|
||||
|
||||

|
||||
|
||||
### A Splash of Colour
|
||||
|
||||
I put in a bonus setting to choose Laura's accent colour from a few pre-selected settings. This changes her hoodie, hairtie, headband, and belt buckle light. It's one of those things that I did just for fun and that didn't take much time to implement at all, fortunately. It'll be an unlockable cheat in the bonus menu.
|
||||
|
||||

|
||||
|
||||
In the future, I might use this to also change the colour of the HUD, similar to how [a cheat in Ratchet: Gladiator](https://ratchetandclank.fandom.com/wiki/Deadlocked_Extras_menu#Cheats) is implemented.
|
||||
Reference in New Issue
Block a user