Transcription
You do not want this fight.
Everything you're about to see now is running on an actual PS1. No filters or post-processing, just 1994 hardware. God of War 2018 is a massive game with cinematic set pieces and a world that feels huge and alive. The PS1, on the other hand, has 2 MGB of RAM, 1 MGB of VRAM, and a processor that doesn't even do decimal points. So, this wasn't going to be a downgrade. It would be a complete rebuild from the beginning.
So, the first thing I had to deal with is that PS1 development has no editor. You can't just click and drag stuff around. So, I built a camera tuner straight into the game and got the framing set up. Then, I brought Kratos in and he was a disaster, face down on the ground with broken textures. Once he was upright, I got his movement working and put the axe on his back with an equip animation. From there, I built out the first real scene. Added a tree with collision, a prompt to chop it down, and a little objective tracker in the corner. Three swings and it falls, which triggers a cut scene where Atraa shows up.
"Found some."
"Get in the boat, boy."
And once the cut scene ends, he follows you around. All of that just to chop down one tree and combat didn't even exist yet. Gave Atraus a bow and a shooting animation so he could actually contribute during fights. Time for an actual enemy, so I brought in the troll. Textures were scrambled on import, so I fixed that and gave it collision so it felt like it was actually in the world. At this point, there was zero hit feedback. I could swing the axe straight through the troll and nothing happened. So, I built a blood system, which was interesting because the PS1 doesn't have particles. Every droplet is just a flat rectangle from a pool that recycles with the size varying based on how long it's been on screen. Once hits actually felt like hits, I gave the troll a basic combat loop so it could chase Kratos around and made Atreus automatically fire arrows at it on a cool down. Added a health bar for the troll and once it depletes, the death animation plays. Swap the floor to snow and dropped in some ruin columns for atmosphere. Then came the axe throw. When you throw it, the axe becomes a projectile that homes towards the nearest enemy, rotating rapidly as it flies. It embeds on impact, deals damage, then automatically returns to your hand. The recall comes back faster than it went out, which gives it a nice snap-on return. Then I added a quick opening cut scene where the troll roars and the first boss fight was done.
If this was going to feel like God of War, it needed to escalate. So I started on Boulder. With the troll fight done, the next step was Balder. Got both characters into the same scene. But before any combat, I needed to build his intro cutscene. It's one of the most important moments in the game. That first encounter sets the tone for everything that follows. I decided to present it from a first-person perspective, which is pretty unusual for a PS1 cutscene. A fixed camera showing both characters would have worked, but POV puts you right in Kratos's perspective, and at this resolution, it actually shows Bow's details better. I used the in-game camera tool to dial in the exact angle. Once the camera was locked, I added a background behind him, mountains, trees, enough detail to sell the illusion of a larger world outside, but I didn't want it to be just a flat image. So, I placed two actual 3D dead trees in the scene for real depth and gave Balder a separate texture layer just for his tattoos. The cut scene is over a minute long with continuous dialogue, and the PS1 only has 512 kilob of sound RAM. The simple approach of loading a voice sample into memory works fine for a short line. I did that with a trace back in the forest, but for this it was never going to fit. The solution was XA audio streaming. Instead of loading the audio into RAM, the dialogue sits on the CD as a dedicated XA track. When the scene starts, the CD drive streams it directly into the sound processor in real time, sector by sector. The CPU never touches the audio data. It's the same technique games like Final Fantasy 7 use for their FME sequences. I wrote a tool that interleaves the voice sector with silence for precise timing and the whole thing triggers with a single CD read command. With the audio streaming, I synced 15 subtitle cues to send the second accurate timing positions. Each subtitle triggers a talking animation on Balder. The first attempt looked terrible. His entire upper body was jiggling in this really unnatural way, like he was vibrating through the dialogue. I stripped it back so only his head tilt slightly as he speaks. And that small change made it read as actual conversation. Then I fixed some texture color issues on his eyes.
"I thought you'd be bigger."
"You're definitely the one."
"Long way from home, aren't you?"
"What do you want?"
"Oh, you already know the answer to that."
"Whatever it is you seek, I do not have it. You should move on."
"And here I thought your kind was supposed to be so enlightened, so much better than us, so much smarter. And yet you hide out here in the woods like a coward."
"You do not want this fight."
"Oh, I'm pretty sure I do."
"Oh,"
"leave my home."
"You are going to have to kill me for that to happen."
For the actual Baler fight, I didn't start from scratch. I reused most of the trolls combat logic and UI systems. No point reinventing the wheel when you already have working enemy AI and health bars. While testing, I threw on this extremely zoomed out camera as a joke. Let me know what you think about it. I gave Boulder his attack animations next, but they didn't really land. The swings connected and damage registered, but it felt like a regular enemy hitting you. So, I added knockback. When Boulder's attacks land, they physically push Kratos backward, which immediately gave the hits more weight, but it still didn't feel distinct enough. The thing that finally made it click was a quick blue flash right before each attack, followed by Boulder dashing towards Kratos at high speed to close the gap and swing. It only lasts a split second, but that little telegraph and lunge makes his attacks feel fast and aggressive in a way the trolls never did. Then I realized I had never actually added a death animation for Kratos.
The fight was working, but I wanted to go bigger, way bigger. I wanted the next cut scene to feature something massive, so the world serpent on the boat was the obvious pick. First step, as always, was getting the camera right using the in-game tuner, playing around with the controller, and dialing in the framing until the composition felt right. Once the angle was locked, I brought Atraus into the scene and added a deep fog layer. The serpent is supposed to emerge from the mist, so the fog needed to be thick enough that you couldn't see it coming until the right moment. Then I added the boat underr and atraeus. Separate model, 157 vertices, nothing crazy, just enough to ground them in the scene. The serpent itself was the real challenge. When I first got it into the game, it looked rough. One low resolution texture stretched across this massive 497 vertex model, and the detail just wasn't there. The thing is, because the camera is fixed throughout the cut scene, you only ever see the serpent from specific angles. So, in Blender, the model is completely hollow, the inside is empty, and there are no triangles underneath the mouth. Because you never see under it, and the neck doesn't even need to extend very far down since only a segment is visible. Classic PS1 trick. If the camera can't see it, don't model it. Then, I pushed the texture quality hard. Instead of one low res body texture, I gave the face two separate 256x256 texture atlases. the highest resolution I'd used on any model in the project. The difference between the original single texture and this was night and day. For the first time, the serpent actually looked menacing instead of just blurry. I positioned it deep in the fog, so it approaches slowly. The full scale only becoming clear as it draws closer. The camera pulls back as the serpent gets closer using a cubic smooth curve, so the movement eases in and out naturally.
"Stay calm, boy."
"I am."
"This is great."
"It's Yeah, Mom City is friendly."
"What is it saying?"
"I don't know."
Since I had a boat in the scene from the serpent cut scene, I figured why not turn it into a little miniame, something in the spirit of the snowboarding section from Final Fantasy 7. I added a scrolling water texture underneath the boat to fake movement. Then wired up the D-pad so you could actually steer left and right. Kratos and Atraus needed to look like they were sitting in the boat, which took some positioning adjustments, but it was a solid base. Then I procedurally spawned rocks as obstacles and floating diamonds as collectible points with a survival timer counting down in the top right corner. So I added a sinking animation. The boat slowly submerges with Kratos and the tray still sitting in it, and Kratos keeps doing his paddling motion as they go under. That alone was great, but then I realized I had never actually given him a paddle. So the entire time he'd been rowing absolutely nothing. Her first attempt at fixing that gave him a paddle the size of a small tree. Honestly, I almost kept it. Kratos is strong enough to swing a paddle that big, and I think that's a defensible creative choice. I fixed it in the end, though, and the miniame came together as a fun little break from everything else. It's not deep, but it proved the project could do more than just boss fights and cinematics.
And speaking about little breaks, I wanted to show combat against normal enemies instead of just bosses. First import was hilariously oversized, but I scaled it down, brought in three of them, and gave them yellow blood since that's accurate to the actual game. When a jogger dies, it plays a short death animation and then fades out triangle by triangle. That dissolve effect isn't just for looks. Removing the model from the scene actually improves performance, which matters when you've got multiple enemies running around. I also swapped the floor to a stone texture because the snowy arena was getting repetitive. The stage was a little rough around the edges, but it proved that the combat system could handle multiple enemies, not just one-on-one boss fights.
I couldn't leave out Mimir, and the scene with Zeus was the perfect way to tie back to the classic trilogy. It's one of the most atmospheric moments in the 2018 game, and it translates surprisingly well to low poly. I started by placing Mimir in Kratos's hand. For just a severed head, the model is actually the most detailed thing in the entire project. 433 vertices on Mamir alone compared to 298 on Kratos's entire body, a head with more geometry than a full character. The background had to be that specific teal color from the original game. So, I set the screen clear to a dark teal and added a global tint system that blends every piece of geometry one towards the same tone. The Zeus cloud face was a 256x256 texture with the edges feathered to blend seamlessly into the teal backdrop. The glowing eyes were the hard part because I needed the lightning bolts to fire from exactly the right coordinates. So, I built a pointer tool into the game itself, a movable crosshair I could position over the cloud texture on screen to read out pixel coordinates. It's genuinely one of the hackiest things I've ever done, but grabbing screen space coordinates from a running PS1 executable like that was extremely common in original development. Actually, I don't know that, but maybe they did it. With the eye positions locked in, I built the lightning as three separate layers of flickering lines radiating outward from each eye. Each layer uses a different visibility pattern driven by a frame counter, so they blink on and off independently. And here's how the full scene came together.
"Katto Zeus."
"Zeus."
"My father."
"Your father was Zeus. Well, that explains a lot."
But the real test is always actual hardware. And here's how it turned out.
"This is great."
"Yeah. What say?"
"What is it saying?"
"I don't know."
"I found some."
"Get in the boat, boy."
"Bigger, you're definitely the one."
"Long way from home, aren't you?"
"What do you want?"
"Kattos. Zeus."
"My father."
"Your father was Zeus. Life's a lot."
This was a really cool project to work on. Getting God of War running on the PS1, even as a vertical slice, meant solving the kind of problems original developers faced. Streaming audio straight from the disc because the sound chip had no room for it. building your own tools because there wasn't anything else. It's a completely different way of thinking about game development. If you enjoyed this video, please consider subscribing as it really helps the channel. Leave a comment below suggesting what you want to see me do next and I'll see you in the next one.