cr4ckr
Not enough ratings
👨‍💻 | [SAM-Free] A way to 100% the game
By Sage
a guide on how to 100% in terms of acheivements and maybe to look at it from a different angle :)
   
Award
Favorite
Favorited
Unfavorite
-- foreword
I made this guide solely because I felt like this game was misunderstood. If you are reading this, you might miss some interesting experience if you don't try on your own.

If you are feeling stuck, here is the hint: look inside the game's files and achivements. The latter is optional but it gave me a better clue and the feel of the game. Follow the guide if you feel REALLY stuck.
-- 'Legit' walkthrough
How to play

If you take the game's descriptiion quite literally, you just have to guess the words which are somehow connected.

Let's take an example from Steam's store page:


Joke ---> Character ---> Class ---> Enemy ---> Force

The words are already filled in, since the all the fields are greyed out. Oh and the player failed because the "Police" bar is st 100%, means they took too long to complete the level, thus "Access denied".

It doesn't matter though, we are here to understand the logic. Basically what the game wants you to do is to guess the next word (if you play from top) or the previous one (if you start from botton). So, depending on that each next / previous word has to make some sense with it's neighbour.

In this example the first thing you had to guess is either a word after "Joke" or a word before "Force". Each type you click on the not complete field, 1 letter will reveal with some intervals, so it's a hint. A slow one.

So, yeah a "joke character" is apparently a thing, as well as "Character Class" or a "Class Enemy". You just have to make up an expression / idiom or simply make up a word pair to get the whole password.

What is a "Password"?

from the chain above, the password would be:

jokecharacterclassenemyforce

It will get "accepted" automatically: the whole column will get greyed out in the game once you typed in all the correct words (=components)

Joke
Character
Class
Enemy
Force

So, sequence of words is the password you are supposed to guess. Each separate word is a component of a password.
-- Meta walkthrough
1. start the story mode
2. always get the Quick Cooldown upgrade
[Reduce cooldown between password components by an additional 1 second]
-- 2.1. if that upgrade doesnt appear after the 1st lvl, restart.
3. keep upgrading the same thing
-- 3.1 make sure NOT to get this upgrade above lvl 4
4. ??????
5. PROFIT

Congratz, you can finish the game in under 3 minutes like this. You will eventually only have to guess 1 last letter in each word. I believe in you!


A couple of notes though:
- This only works in story mode.
- The quick play will make you suffer as intended (check the reviews, I'm not lying).

  • After this meta story playthrough you will have at least 5 achievements.
  • If you get an upgrade to the max level, then 6.
  • If you spam the quick play button 10 times, you will get the 7th achievement.

The remaining 2 achievements will require you to get your head out of the box and get them in a very special way I will describe in this guide.
-- Complete walkthrough
-- Analyzing the game's description
According to the steam page, it is

a puzzle game about cracking passwords

but let's be honest: if you play this the " word puzzle" way, you will cry like people in reviews, but if you look at it from another perspective, it is an actual mini "crack-me" game.

------------------

Before you read the guide, just quickly read the whole description of the game:


We will come back to it in the end of the guide.

I had the impression the game was made tedious on purpose to make you think of better ways of playing = "solving the puzzle".

-- Analyzing achievements
So, I wondered why upon discovering the whole contents of the games (or so I thought), I still didn't get the 100% in terms of achievements.

Reading Steam's descriptions for those didn't help either.

- the [Special Thanks] one didn't have any description whatsoever and was flagged as secret.
- the [Timeless] one wanted me to "Play a quick game" which I did but it never popped up.

Let's see on SteamDB [steamdb.info]for Steamworks' internal names for achivements:


now we have a bit of more information on the internal names, plus we saw there is an incremental value named hey_sunny_gp for the "Games Played" - means the dev can see how many times you did something in the game - in this case the display name doesn't lie, it indeed counts how many games you played, as you will see later in the guide.

internal name
actual action required
hey_sunny_0
- launch the game
hey_sunny_2
- start the story mode
hey_sunny_3
- complete the first career objective
hey_sunny_7
- max out a power-up in story mode
hey_sunny_4
- complete the second career objective
hey_sunny_5
- finish the final story objective
hey_sunny_6
- start 10 quick games

hey_sunny_8
- ? ? ?
hey_sunny_1
- ? ? ?


-- Analyzing game files
Now, let's have a look at the game files in the game's directory.

navigate to the app directory inside the game's folder:

C:Program Files (x86)Steamsteamappscommoncr4ckrapp

^ standard path on windows


there are 2 files which are interesting to us:

- [script.js] - the main game itself
- [phrases] - the word pairs you encounter in the game

notice that the game files were left so accessible and transparent - I assume, it was made on purpose, you will see later why.

- - - - - - - - - - - - - - -

phrases

let's open 'phrases' fist, I recommend opening it with a code editor so you can appreciate the amount of strings:


38305 pairs of words which will be randomly shuffled depending on the first / last component of the password. If you hoped to play it often enough to just know the word pairs, probably that'd be a pretty weak strategy :)

script.js

let's have a look at the 'script.js' file. First thing I'd like to check is whether the "phrases" file is actually the one which the game is using. Simple "Find" (Ctrl+F) will do the trick:


formPassword() - this functiuon caught my attention because among other actions, it's building ("forming") passwords and is awaiting for getPhrases to load something.

now let's look what getPhrases() does:

async function getPhrases(){ let raw = (await (await fetch(`phrases`)).text()).split("\n").map(i => i.trim().toLowerCase().split(" ")); . . .

(await fetch(`phrases`))
- is what we were looking for. the getPhrases() function fetches some "phrases" file with no extension, - just like the one in \app.

looks like it's enough information to confirm that is indeed the file with password components.

of course, alternatively you could either check it in a more "manual" and experimental way: see the first word, and just quickly scroll through the phrases file and choose the word based on the letters revealed, - to make sure it's not just a coincidence.

- - -
... or you could write your own script with dynamic input and autpfill which would assist you in nailing the game

... or even better you could replace the phrases with your own word pairs but so that it preserves the gameflow logic with word pairs / components :)

We will come back later to this idea.


Achievement triggers

now since we are already in the game's "body", why don't we try and find achievements mentioned here? Remember the internal names we found on the steam DB earlier? Let's try and find them:

CTRL+F to Find
hey_sunny_n
, replace n with the number you want.
I started to look for hey_sunny_8 and hey_sunny_1 since they were th only ones missing.
-- hey_sunny_8
searching for hey_sunny_8 should show you the following:


even if you don't know JS, you can see it says almost in plain English:

if password typed matches heysunny, unlock the hey_sunny_8 achievement.

so, we have to get heysunny as a password component somehow. Oh and heysunny is not inside "phrases", of course. Now if you think about manipulating the "phrases" file, you are very close to solving this puzzle :)

how about we just make a short phrases file with the heysunny component inside? If you are not sure how to, here is the list I created:

steam heysunny heysunny achievement achievement easy easy unlock unlock end

I just had ot make sure that this list is "chained" via password's components (refer to the beginning of the guide if you forgot the "legit" way to play)

Save this new list under the same name "phrases" but backup your original copy file (phrases - original, for example, so you can find it faster) just in case, and use the new phrases with predictable outcome as your main phrases file. Restart the game if it was running.

Start the story mode, you should see this:


after clicking the empty field, you will see the promising "h" :)
Finish typing and enjoy the well-earned achievement, it should pop up immediately after typing heysunny.


Note that this list is not robust enough for longer / quick play - you would need to create a longer list for that. I created this one solely for the achievement and replaced it with the original one after.
-- hey_sunny_1
now where is hey_sunny_1? searching through the code only will find us:

- hey_sunny_0
- hey_sunny_2
- hey_sunny_3
- hey_sunny_4
- hey_sunny_5
- hey_sunny_6
- hey_sunny_7
- hey_sunny_8
- hey_sunny_gp

no hey_sunny_1

well, how about we cr4ck patch the game in an elegant way?
So, the achievement description says "Play a quick game". Let's find a part of the code which is responsible for starting what's called a "Quick Game" (opposed to "Story" Mode).

Remember the 3 achievements connected to the story mode? Lets find them in the code and see what loop / function / process they are attached to:

this will lead us to this piece of code:


These unlock in Story/Roguelike mode only. So "roguelikeLevel" is another name for the Story mode. Makes sense, since only in story mode you have random upgrades to choose from upon your progression. Quick mode is just raw play with a random password to crack.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Now that we confirmed the "code" name for it, after a short search we find where the story mode starts:


Here we see that after roguelikeLevel ist set to "0", the story is "injected": injectStory(elem).
Probably means, in order for the game to place you in the story mode, the roguelikeLevel has to be "0", right?

Out of curiosity, let's try find:

roguelikeLevel > 0
and
roguelikeLevel < 0

The first won't give any result, the second, though, will show you an interesting piece of code:


Remember the incremental value from Steam DB we discovered earlier? It has IncrStat, so it must be it. As you might have noticed, this piece of code is executed only and only if this condition is met:

roguelikeLevel < 0

As we discovered earlier, roguelikeLevel = 0 is the story mode. Means, if it's less than zero, it must be the other mode. This also implied that the counter only counts how many times you played the quick play.

So, how about we just add a trigger to steam achivement here? Even if you are not familiar with how Steamworks "understands" achievement triggers, you know that earlier in the code you saw what syntax was used to unlock achievements:

steamworks?.UnlockAchievement("NAME_OF_ACHIEVEMENT_HERE");

earlier we found the internal name for the missing cheevo: hey_sunny_1. Let's use our knowledge and add the following line under steamworks?.IncrStat("hey_sunny_gp"); inside the "if( roguelikeLevel < 0 )" block so we get it as intended - when we start a quick game.

steamworks?.UnlockAchievement("hey_sunny_1");

should look like this:


- Save the file. Launch the game, click the "Quick Play".
- The "Timeless" achievement will pop up in no time after starting the Quick Game.
-- afterword & bonus

That's it, you made it! Enjoy seeing your another 100%ed game in the library (:

Was the game designed to play this way? I have no idea, but I feel it was. Could be completely overthought though. Still, try to read the game's description which I pasted in the beginning of this guide again - do you also see it differently now? You actually outsmarted the system, you solved the puzzle, and you cracked those passwords.. in your way :)

- - - - - - - - - - - - - - - - - - - -

Oh and before you go, there is one more thing I haven't noticed right away: you can get this item in your inventory:


But I will leave it to you to figure out how. No coding knowledge required.

- - - - - - - - - - - - - - - - - - - -