4/04/2026

Balticaman: A crappy logbook about modding Pepsiman (PSX)

NOTA: Este blog es un blog en ingles, y ademas, con el objetivo de ayudar a toda la gente en este maldito mundo que quiera hacer un mod de Pepsiman, he decidido hacer este post en Ingles. Si no entiendes Ingles, puedes usar un traductor. Mis sinceras disculpas al respecto 😊

Howdy people, how are you?

If you’re asking me, apart from the boredom and other stuff I don‘t want to talk about, I’m feeling pretty happy beacuse I’m just finishing right now a very, very stupid, but long project of me I kept in standby for across the years (and probably arrived here because the URL or the QR code in the credits): Balticaman: A pretty Infamous mod for Pepsiman PSX.

Ok, this is not the first nor the last mod project you will find at internet, there are TONS, I mean  TONS of those. But since this was a quite large and tedious project, I wanted to make this post as a technical post-mortem to tell you guys how I ened making this piece of sh… ahem, piece of strange stuff from internet, in hope that somebody will be useful if they want to mod Pepsiman and/or getting into PSX modding or something else…

Let’s get started, cuz there are lots of things to talk about!

What is pepsiman?

Well, Pepsiman, the running Hero was a Japanese PlayStation game from 1999 released in Japan that cons… ah, I’m feeling lazy explaining what’s about; I prefer to share a great AVGN video that explains it very nicely what’s this game about:

Hope you get the idea what’s the game about. It was pretty popular among kids and teenagers around “the world” around PSX era (In quotes, cuz obviously you had modded PSX to be able play that unless you lived in Japan… and let’s be honest, you DID not lived there), and gained some sort of status-quo of classical games and blahblahblah.

Now, what is Baltica?

I don’t know if in your country there are great good, bad and worst beers! You know, I’m talking about that crappy, watery, super cheap beer, sold in convenient 6-pack made solely for those irresponsible rebel teenager decisions that you will regret next morning with those hungovers, of course.

Well, that’s about Baltica Dry, Chile’s most infamous, but yet popular beer. Not made for gourmet or anything, just for giving a shit along with despeserate teenagers, fearless punkies, and so. 

 

(Kids, don’t try this at home).

And what about Balticaman?

I guess you are already thinking what happen when you blend Baltica Dry and Pepsiman, huh? Well, it all started in a local meme page around 6-7 years ago, they posted this thing:


It all started there. Yes, they are the culprits.

That meme was quite popular thinking what about having a super-drunken hero saving Chile from some sort of inexplicable cause? Whathever. I remember seeing that in a very boring day and I told myself “Modding pepsiman and making this a reality it should not have to be difficult, let’s do this! ”

Aaaaand that’s how Balticaman was born!

A brief history of what I took almost 7 years.

As this mod was practically meme-motivated, was a joke for the moment, so I had to work fast until the boom cools down. So, I remembered making a quick demo and releasing it (just 1 level modded) and it was a huge success:

It was even local streamers playing the game (sadly that video was removed from youtube, booo), and there were people told me a lot of times that I must finish that game and blahblahblah… The reality was I made that on a crappy PC at that time than ran out of Disk and with a bad DIMM module, I had to scrap half of the tools and stuff made to build that demo, plus obviously that thing called life continued, giving me no time to continue a thing made from a meme.

… Until some months ago!

Now with a far better gear and knowledge, I proposed myself to finish this crap to put an end for this mod (and to giving hope to that 2 or 3 people who still asks me about finishing it), which involved making everything again from scratch, recollect the tools and solving all the problems again once I had at 2018-2019. And luckily, I was lucky (yeah, I repeated that word twice… and so?).

You can check out the full game at this video with download links and stuff (shhh but be quite, remember mods are not a very legal stuff, you know 😉 )

----

So… That’s the end of the post? Nah, I want to share you some thoughts about what’s about technically speaking this mod, and for giving you snippets regarding Pepsiman modding if you are thinking of making mods. (I remembered some guys sent me emails or messages asking me how to mod pepsiman, so It was another motivation to make this). 

NOTE: Don’t expect a very technical thing, I’m not a professional modder or anything, just a guy who likes to make stupid stuff and sharing it to the world. I will try to explain things in a somehow-understandable-potable way.

Something about PSX games, filesystems and mixed audio/data CDs.

I bet if you had a CD reader in your PC and a bunch of PSX games you tried to put one of those in your PC to check what are inside. (And emul… ahem).


(That’s actually Pepsiman CD contents!)

Just like your favorite 1990 PC Videogame, the game CD has a Filesystem! Whoah! And all those files contain game data …in some sort of way!

Well, let’s say not ALL PSX games have a file structure like this. Yeah, it’s an improvement from cartridges era where there was just a bunch of bytes embedded in a ROM (or more if you are thinking in more sophisticated boards such an Arcade/MAME32 stuff), and all references for different media and resources (such as audio, textures, blahblahblah) are just defined in pesky offsets and pointers. Well, “now” (199x speaking) PSX disks follow some CD standards (XA Mode 2 if you’re the nerdy person) that your PC is happy to show, letting a new world of file organization, probably a bit easier for developers of the era to seek some files and gibberish.

However, those filesystems are still rudimentary, and those still depend on a lot of stuff being at specific offsets of your media (in this case the CD itself). Long history short, the executables must be in a specific physic location of your CD (or LBA), and so several resources to not break anything. It’s not just taking all those files, copypaste in a CD recorder, burn it, and put in a modded PSX to expect it to boot. If you insisted on doing that, most probably you will end up with this:


(Technically speaking, that’s a PSX Bios Crash, considering the factor that it should never meant to boot a CD just like the you put in, but as you modded the console, your PSX was forced to boot that anyways, that is what you deserve hahaha. There are plenty of Youtube videos explaining this and pretty bunch of based-creppypastas around there – seek for “PSX Personified fear” or “PSX Fearful harmony” for more weekend fun 😊 ).

So, you got the idea? You need to touch the original format as little as possible.

Also, apart from that, lots of PSX games of the era likes to exploit all those CD standards of the era and liked to mix audio tracks for the OST and CD data in different tracks (or more known by nerds, those “Red-book CDs”). That’s why you can be able in many games, put your CD into your home/audio CD player, avoid track 1 (to not getting a very damn-loud data vomit… or just silence if you CD player is smart enough to silence that) and surprisingly listen to the soundtrack of the game.

Not just exclusive from Sony, also other companies take advantage of that, and even put very weird and curious audio track warnings for saving your crappy speakers:


(Well, I wanted to sleep well tonight. I guess I will not )

And yeah, you guessed it: Pepsiman used all of those shenanigans!  And what could mean? For storing those not-so standard things an ISO would not be pretty useful (good for storing data CD stuff, but not less-standard stuff for PC, such as CDDA or similar). Pepsiman on internet comes usually in ISO format, which will break the OST (as is in audio tracks, but more on that later). Then, we will need to seek dumps in a nicer format, I mean CUE/BIN, which is basically a format that consists of a CUE file who describes a virtual CD and its contents and its physical location. That usually comes along with a BIN (or other files) that contains the actual data, which that CUE file points.

Seeking a functional Pepsiman dump that contains the audio data was not a straightforward task, but I was able to get it from… Sorry, I can’t tell you that for obvious reasons 😉


(They put and iso extension but it should be bin instead… but for now, focus on the CUE file, okay?)

Now, how the hell I could edit that ISO/BIN file without screwing up all those embedded CD audio files?

For that I used a tool called TurboRip (with DaemonTools to simulate a very-real CD reader) to simulate a CD re-dump and leaving a nice output in also a CUE/BIN format, but with the sole difference that this tool was nice enough to separate all the data in a nice-ISO file ready to be edited such like a more standard PSX game (but still cautious to not break stuff such as LBA’s and stuff) and the audio tracks in WAV format 😊.


For getting it back to CUE/BIN (with audio tracks in BIN format again), I could use another tool: CDMage.

So… You might already know that for modding Pepsiman soundtrack is just editing those WAV files and putting another content, making sure to respect the audio rate and the exact duration, huh? (Spoiler: CDDA was not all the audio data, there is more, but more on that later).


(As a extra stuff, I have to say that TurboRipper cames with pretty sick old-school JRPG visuals :D )… and yeah, had to use a Virtualized Windows 7 to make it work.

 Pepsiman filesystem structure

Remember what I told you recently? PSX filesystems are quite delicate, and we must ensure that if we are gonna mod this game we must ensure that:

·        All files should be keep it’s original location (Windows file explorer does not care about physical locations… in a normal daily basis nowadays that low-level-thing should be abstracted).

·        If we modify any resource/media, its final size should be the same as the original, so we avoid writing all the rest of the stuff on different locations to make more or less space (and then breaking rule number 1).

For that, we need to use some sort of a special tool that keeps track of Pepsiman CD files physical location inside the ISO file, right? For that, my weapon of choice was mkpsxiso, a great tool for authoring PSX CDs. It comes with 2 tools: dumpsxiso and mkpsxiso which, as the name suggests, makes dumps and builds PSX iso files. So, running this tool (command line based), will extract all our CD data in a folder, plus creates a XML file containing all physical locations of our files. So, we can make all our modifications (respecting rule number 2), and then re-build the PSX ISO file with that XML to put everything in the same place as before.

 

(A small glance of how the XML file made by dumpsxiso looks like).

As it both were command line tools, it was a bit of trial-and-error getting with the right parameters. Here is mine if that helps you:

For dumping an ISO

./dumpsxiso.exe -x "$ISO_OUTPUT" -s "$METADATA_OUTPUT" -S "$ISO_ORIGINAL_PATH"

Where

·        $ISO_OUTPUT: Path to a folder where the CD contents will be dumped.

·        $ISO_ORIGINAL_PATH: Path to your original ISO file.

·        "$METADATA_OUTPUT: File where your XML file will be written.

For generating an ISO

./mkpsxiso.exe -y -o "$OUTPUT_FILE" "$ORIGINAL_METADATA_FOLDER"

Where

·        $OUTPUT_FILE: Filename of your generated ISO

·        $ORIGINAL_METADATA_FOLDER: Your generated XML filename that contains the metadata. Path to the extracted CD files will be there in that XML file, so you don’t need to specify it.

 

About the file structure of Pepsiman itself, we have this:

·        CDDATA: A bunch of folders from 0-9, A-H that have all Pepsiman data files.

·        MOVIE*.STR: Movie files in standard PSX format. Pepsiman have a bunch of them,

·        PCD_*.DA: Just pointers to our audio CD data tracks. do not touch them, touch those previously extracted WAV files instead.  (Speaking of PSX filesystem weirdness).

·        SLPS_017.62: Our PS-EXE executable, this is the main executable of Pepsiman. Nothing to do here.

·        SYSTEM.CNF: Internal PSX data file that indicates stuff such as executable offset and that.

·        license_data.dat: This is explicitly created by dumpsxiso as it’s not usually visible in a filesystem (think it as part of a ROM, but not matched with any file). Used for licensing and making it your PSX reads it as an … ahem… genuine ahem… game! Also have the PSX logo and copyright message shown at boot!

Outside of CDDATA folder we have not much interesting stuff like the movies and license_data if you want to replace PSLogo at boot and the copyright message with a teenager-class Joke (Did you heard about the popular “Pico pal que lee?” xDDD). 

Now, inside CDDATA folder is the interesting stuff, but not in interesting files/formats. The names did not give us clues for anything specially. We have a pretty numerical-abecedary folder organization, each one with a bunch of files without extension with numbers on it. It does not say anything about its contents. (Spoiler: are mixed up stuff, but more on that just a bunch of lines below).

Some clues about what “interesting” are about is following:

·        0: UI’s, core game files, pepsiman model and textures.

o   0100: UI VAB/VAG sounds (more on that later).

·        1: More pepsiman model and textures, main menu, intros.

o   1101: Textures of stage 1 intro animation.

o   1201: Textures of stage 2 intro animation.

o   1301: ??? (*)

o   1401: Textures of stage 3 intro animation.

o   1501: Textures of stage 4 intro animation.

·        2: Stage 1, level 1

·        3: Stage 1, level 1

·        4: Stage 1, level 3

·        5: Stage 2, level 1

·        6: Stage 2, level 2

·        7: Stage 2, level 3

·        8,9,A: ??? (*)

·        B: Stage 3, level 1

·        C: Stage 3, level 2

·        D: Stage 3, level 3

·        E: Stage 4, level 1

·        F: Stage 4, level 2

·        G: Stage 4, level 3

·        H: XA audio files (more on that later)

(*) Seems there are files of a missing “stage3” which was unused content of the game? see https://www.youtube.com/watch?v=Cmw8FyADwck  and https://tcrf.net/Pepsiman_(PlayStation)

Seems all files in those folders are just containers of several other unnamed files, serialized one each other in some sort of unknown format. Most of modding tools used have some sort of support for seeking files inside those container-files, watching for common file headers and so, so we don’t need to dig deeper in knowing what those file format are about (made an attempt anyways years ago, but it did not resulted very well: https://github.com/elsemieni/pepsiman-texture-unpacker

 With that in knowledge, we can identify specific stuff to modify :D We will go in what I’ve modified: Textures, audio, movies. (Did not touched 3D models, but if you want to, probably this will be a good reference if you want to motivate yourself).

About textures

In PSX the most common used texture format is something called TIM, a specially crafted format for PlayStation which contained a bitmap, a CLUT (or Color Lookup Table, more known as a color palette for indexed images, you know) and other metadata for handling it well in PSX’s GPU. TIM supports both indexed images for 4 (16 colors) and 8 bit (256 colors), and also 16-24 bit RGB images. If all of that sounds like Chinese, I will recommend you this great video that explains very well what indexed images are about 😊 https://www.youtube.com/watch?v=cwHPuU3sHOk Most popular imaging tools have support for indexed images. Okay, Pepsiman uses mostly 4 bit TIM textures (and some 8 bit, but are quite a minority really).

Thing is, all those textures are packed in those uncomfortable files named with codes we already analyzed. I tried several tools that supports TIM extraction and replacement, and it was a lot of trial and error sincerely. However, long history short, I eneded up using a combination of 2 tools for modifying Pepsiman textures:

 

·        Tim2View: Used for TIM extraction, TIM->PNG conversion and TIM files replacement. Pretty bad for converting PNG->TIM. Use version r90, the latest version for less glitches.

·        Img2tim: Powerful command line tool to convert PNG files to TIM.

Let’s start with Tim2View. It provides a nice interface that allows you to scan a single file, or scan many files in a folder as you want (just be careful to not overload the tool, as it usually gets glitchy if you feel too creative). I usually loaded a level folder one by one, and then, exported all files to PNG using the menu there.



(Here are the options I mentioned).

So, you might think now it’s just editing the textures, and importing it back using the import feature the program has? Not so fast buddy! Yeah, I acknowledge that Tim2View has an Import PNG feature that actually converts your PNG into a TIM file and it gets injected into the packed file, but sincerely? That feature sucks. It does not respect the CLUT (so, the colors gets messy), plus ignores all the metadata such as CLUT offset and VRAM location, making things probably break really bad inside the game.


(Look how they massacred my boy)

Luckily, this tool still has the feature of importing an already converted TIM file back to our packed file, so we can make a plan B and convert our modified PNG to TIM with another tool that actually gets care of the palette and the PSX GPU metadata.

As I told you upper, I used Img2tim https://github.com/Lameguy64/img2tim , a tool that have all we need. The only bad thing is not very straightforward to use, as it requires all those metadata as parameters. But for helping you, I used this command line for converting stuff from PNG to TIM and worked pretty fine most of the time:

img2tim.exe -usealpha -bpp 4 -org 480 480 -plt 320 320 -o "output.tim" "original_file.png"

 Let me dissect this:

·        -usealpha:  If your texture has transparent color, use the one you defined in your PNG file.

·        -bpp 4: Specify if the texture has 16 colors(4), 256 colors (8) or real color (16,32). You can obtain that info in Tim2View.

·        -org 480 480 Texture location in VRAM. ). You can obtain that info in Tim2View.

·        -plt 320 320 CLUT location in VRAM. You can obtain that info in Tim2View. (*)

·        -o "output.tim" "original_file.png" Output and input file.

(*) Be warned that many textures (specially from complex 3D models) sometimes shares one same palette location in VRAM. In those cases, make extra sure when editing, you will use the SAME color palette on those files, otherwise probably your textures will look like a mess. At least, Photoshop usually allows you to save/load indexed palette presets.

I know that looks like a lot of work, but at least that’s how things worked for me. Of course, you can try your own methods. If things works for you and it’s more easier, the better! :D (And if you want to share us to the world, even best!). As for me, in my case I made a lots of scripts that semi-automated the work for me (As my adult-job involves lot of Linux and Bash, I used GitBash/MSYS2 for making bash scripts and it improved me the work a lot here, but you can also build .BAT or Powershell scripts and it will be the same).

About audio

Things will get a bit messy here. And that’s because KID (Pepsiman developer) make some really strange design decisions here. Do I already told you here before that Pepsiman used CDDA audio tracks for it’s soundtrack? I probably already took a look at the tracks and you will find lots of stuff are missing here. Yeah, there are level tracks and game over jingle. But what about everything else.

Seems the developers for some mysterious reason I do not yet fully understand, they decided to use almost everything audio format PSX SDK offers haha. Those are:

·        CDDA Audio data: We already talked about it. Editing is pretty straightforward.

·        XA audio data: Because why not? Used at stages intro animations. Located at H folder.

·        VAB/SEQ audio: Some games uses those for synthetized music (aka MIDI), separated in instrument data (VAB) and music data (SEQ), Pepsiman used it too for sound effects and jingles. Located at 0100 file in 0 folder.

About XA audio data:

Again, those files are all packed in some strange pack format, just like TIM files at textures. Luckily, all those files are contained in just 1 file, and XAConv could more than happily to handle it. This tool gives us all what we need: Extraction to WAV and re-importing it. So, thanks to that things could be pretty straightforward. (Again, just remember to keep the audio files to it’s original duration and sample rate, to preserve our rule number 2, remember?).



About VAB/SEQ audio data:

This is the toughest part of all. Just like XA one and TIM textures, audio data is located in one strangely pack file called 0100. Unfortunately, this time we lack of tools that extract and inject from packed files here, but after overanalyzing this file it seems it just contain one big file. That means, extracting the only file it would be easy as just remove some bytes of the header, resulting in one VAB file containing our sounds!


(Just saying, for modding you will need surgeon’s license for occasional butchery :P ).

And for packing the file again? Just put that header again when you get the job done! (Assuming, again, you respected the rule number 2 and you will have a file with exact the same file size!).

Now for getting those audio files, we need to get VAG files from that VAB file (VAB file is a container of sounds in VAG format plus a plenty of metadata). Now what tools do we have for editing VAB files? Not much out there, but this time we are going to use VABTool and VAGEdit, both tools from PSX SDK, directly from Sony Computer Entertainment Itself xDDD


(I thought modding was illegal, now using abandonware official SDK tools is worse haha).

I have to say, I’m quite impressed those tools still worked on Windows 11. The learning curve of VABTool is not straightforward, but you eventually get in there. Think about VAB files stores instruments data (yeah, Pepsiman screaming IS an instrument, quite creative wasn’t?), where each instrument comes from audio (VAG data)… Pretty familiar stuff if you already messed it up with MIDI Soundfonts, patches or Trackers by the way. 

This tool lacks just one thing: It does not extract VAG files (even with the fact it can re-import those) :c For that, we will use another tool : PSound.

(Awww come on! How many more tools are we gonna need?!)

So, for modifying sounds we gonna do the following:

·        Extract the sound from VAB with PSound and export it at WAV

·        Actually, adjusting it (remember the rule number 2 please!)

·        Convert it to VAG using VAGEdit (another tool to the list!)

·        Import your VAG back to your VAB using VABTool.

Well, that last step is a bit tough, as I mentioned the tool is not so straightforward. If you go to “View VAGS (F10)” you will see a long list of seems-to-be audio/VAG files. You will need to search your audio file and replace it with Replace VAG button. But before, you need to know what sound is what, as that window does not offer you a preview button (why Sony, why?)

For checking what sound is what, you can go instead to View Tones button, switch the VAG value and test the sound. Then write it down and go back to that other menu to replace it. When you do that, test it if the sound actually got replaced it correctly. 



(OMFG; what a labyrinth).

Oh! And do not forget to save the changes before exiting! ^^. (And also don’t forget to re-inject the data header we stripped at the beginning).

About video

Let’s put all the previous chaos aside, this time things get a lot easier. We have STR videos, pretty standard format in PSX and pretty video converters powered by STRConv. Quite poorly translated (and sometimes a bit unstable), but more than enough for what we need.


(Not sure If I’m looking for TVGame guy, or the TVGame guy is looking at me)

What are the rules here? 320x240 15fps videos (forget about that widescreen 4k video 120fps with extra detail in acne), in AVI using quite edible codecs for this tool (Microsoft Video 1 or no compression at all worked for me, and I’m risking it… for audio, I will go for a classical PCM 22kHz 16 bit mono).

Aaand (making a separate paragraph here cuz I want to highlight this) try keep the duration slightly shorter than the original video (for respecting our rule number #2, but also realizing that things at video compression could be a bit more unpredictable). Once nice thing that STRConv offers us, if the final size is smaller than the original video, the tool can offers us fill the remaining spaces with zeros to fit the exact original filesize (seems those zeros are perfectly ignorable by STR format standard), which is very useful for the rule #2. How considerate! <3

Notes: For some reason sometimes 18fps are also fine. Why? Don’t ask me.

Notes2: Seems this tool did not behave very well with very long videos (aka ending). For just that video I choose psxavenc as weapon. Kinda more complicated to use as it is CLI, plus a LOT of options, but seems it converted my ending video in no time with just the standard paramters! :D

And for testing?

Of course we can’t go blind here, we need to test how our beloved work is going. I’m talking about emulators.  When I started this hackrom, I opted to use ePSXe and worked… well, it was never very reliable across the years but got the job done; however nowadays getting it working was almost impossible, so I opted to upgrade my emulation gear for the good and decided to use DuckStation. It was a really good decision there! Very good emulation, savestates, embedded cheat codes support (will talk about it next paragraphs) and super customizable!

For test something obviously you don’t want to play the whole game once and once and once again. For sure, you need to get know very well the game for tweaking it, and probably you will gain some sick skills on Pepsiman during the development, but other times you will just need to go straightforward to the action, by using 2 important tools:

1.        1. A memory card with Pepsiman at 100%

If you beat Pepsiman at 100% you will unlock the free play feature, which consist of a level selection screen (super cool if you need review a particular level which is not level 1) that gives you the generous amount of 99 lives.



2.        2. Cheat codes!

Tell me a cheater, I don’t care. Many people says games with cheats are not enjoyable, but put ourselves in our context. We are not here for a speedrunning the game with our own skills and have fun with it, but want a fast way to see if our shit works or not. So, here it is: helpers for getting us beat levels a lot easier. Duckstation comes with a plenty set of ActionReplay ones, already done, but if you feel more adventurous, you can even find more outside like this one for entering hidden debugging modes at https://tcrf.net/Pepsiman_(PlayStation)


Another tool I did not wanted to add it to the list but very useful indeed was having a full gameplay no commentary of Pepsiman, to see what the have should behave at certain points of the game, or to see “what texture/audio should be there”.

Apart from all those testing tools I tried, I wanted too to add a TAS gameplay downloaded from somewhere and playing it using Bizhawk2; however it was impossible to make it run properly (not the tool but the Pepsiman TAS I had found at internet). Seems my dump was not the correct, and it ended up pressing gibberish buttons and making anything but playing the actual damn game. Anyways…

 

Final words

Even finishing this project lasted a bit, as that thing called life does not stop or anything for letting me something so irrelevant just as Balticaman to be finished. Ugh, I said I wanted to end this in 2025 but well, as you can see 2026 was the year (but I don’t regret anything, 2025 happened so many happy little things in life that I will be super proud! )

Even, in non-technical aspects, it gave me some extra time to purchase a silly costume at AliExpress to make cutscenes more … interactive let’s say? Haha.




My original plan was going to the streets with that silly costume but it seems the plan was not possible, but hey, indoors is almost as-silly as I wanted hahaha… oh, the cringe! (You can see all that cringe content at the trailers and videos! )

So… nothing more to say, I will post a link to the final trailer and the download (below) to enjoy the final product hehe! 

Download it now! https://www.mediafire.com/file/i05lgmj5az7da9m/balticaman_final.zip/file 

No comments: