Signal Cipher by Shiiro 10psi

[raw]
made by Shiiro 10psi for Ludum Dare 59 (JAM)

The goal of this game is to decode the ten signal words. The first word is always signal.

All ten words are shifted according to the same 15 number noise pattern, beginning at randomly assigned indices from 0 to 9. Therefore, each word shares the shift pattern of its last five characters with the first five of another word, except for the words at the end of the pattern.

The noise pattern begins with a value between -5 and +5, and a velocity between -1 and +1. Between each step in the pattern, the velocity is added to the value, then the velocity is adjusted by -1,0,or +1.

Eight note pages are provided. The complete list of potential signal words is included in the last tab of this panel.

Ratings

Overall 672th 3.184⭐ 21🧑‍⚖️
Fun 633th 3.026⭐ 21🧑‍⚖️
Innovation 383th 3.447⭐ 21🧑‍⚖️
Theme 445th 3.711⭐ 21🧑‍⚖️
Given 58🗳️ 1🗨️

Feedback

MountainGoose
Apr 20th · 14:56 UTC
Very clean aesthetic. I have to admit I'm struggling to understand how to go about solving the puzzles, but I'm also very tired! I'll give this another go after another coffee :)
LDJam user 407703
Apr 26th · 01:13 UTC
Very cool project! The style looks well polished and appealing. The sound design also draws you in right away.
Providing note sheets is a really great idea. I would love to see that more often in puzzle games!
Daviiiiiiid
Apr 27th · 00:03 UTC
![Capture d’écran 2026-04-27 à 02.02.01.png](///raw/cf5/a5/z/72c8d.png)

we hate you

and also we are not sure if there is a mistake or we are just too tired to finish the puzzle
Jacobloon
Apr 27th · 22:22 UTC
![finished.png](///raw/389/06/z/72f5c.png)

I have finally conquered the beast. Through a mix of translation, python scripting, and brute forcing I managed to get all the words as well as the 'post velocity noise' pattern.
I'll put the python script I used below; maybe it'll help others ;)

The way I used the script is by first manually calculating the shift value from the first word, then plugging those into 'cur_shift'. Then I put all the unsolved words into 'word_list' and ran the script. It prints out possible answers showing which direction it shifted the cipher and noise pattern.
'left-to-right' starts from index 0 of cur_shift, and moves along the ciphered word from left to right.
'right-to-left' starts from index 1 of cur_shift, and moves along the cur_shift values.

```
# Add shift value from known cipher in the positive form.
# ex: 'rgdjvf -> signal' would be [1, 2, 3, 4, 5, 6] (r = 18, s = 19)
cur_shift = [0, 0, 0, 0, 0, 0]
max_num = 122 # z in ascii
min_num = 97 # a in ascii

# List of unsolved ciphertext from the game. Use lowercase
word_list = []
for to_shift in word_list:
# Print the original
print(f"Original: {to_shift}")
start_pos = 0
end_pos = 0

print("left-to-right")
while start_pos < 3:
shift_pos = start_pos
arr_pos = 0
cur_word = "_" * shift_pos
while shift_pos < len(to_shift):
temp_num = ord(to_shift[shift_pos])
# Shift w array
temp_num += cur_shift[arr_pos]
while temp_num > max_num:
dif = temp_num - max_num - 1
temp_num = min_num + dif
cur_word += chr(temp_num)

#Increment
shift_pos +=1
arr_pos += 1
start_pos += 1
# whats the word
print(f" {cur_word}")

print("right-to-left")
while end_pos < 3:
# Don't need to check full 6 sub
end_pos += 1
shift_end = len(to_shift) - end_pos
shift_pos = 0
arr_pos = end_pos
cur_word = ""
while shift_pos < shift_end:
temp_num = ord(to_shift[shift_pos])
# Shift w array
temp_num += cur_shift[arr_pos]
while temp_num > max_num:
dif = temp_num - max_num - 1
temp_num = min_num + dif
cur_word += chr(temp_num)

#Increment
shift_pos +=1
arr_pos += 1

cur_word += "_" * end_pos
start_pos += 1
# whats the word
print(f" {cur_word}")

# Break between words
print()
```

Definitely not the best or most thorough helper script, but it worked for me™️


Apart from the helper script, I must say I really did enjoy this game. I love challenging 'ciphers' like this, even though they definitely aren't for everyone.
If anything, a good/convenient addition may be an interactable noise tool in game. One where the user could input values for the noise, and they could enter/move the ciphered text along noise positions to check for words/parts of words. That could 'gamify' it a bit.

![example.png](///raw/389/06/z/72f5b.png)
almost
May 06th · 22:01 UTC
A couple minor inconveniences:
- The game resolution is too large to view in my browser.
- For the notes tabs, CTRL-C / CTRL-V / CTRL-F doesn't work, and arrow keys go to the previous note
- The word list is not sorted alphabetically. This makes it hard to verify if a word is possible.

For the game itself, it would probably be good to start with a simpler setup to introduce the concepts, like two pairs of words with the same shift patterns instead of 8 words. And you could also add some interactible UI like for each answer word have 6 boxes with a letter in each, and up and down arrows to shift these letters.

I think the strategy to solve this is to apply the 6-part shift pattern from SIGNAL to all of the other words with some index offsets and use this to learn slightly more of the cipher key. So I get 433443 and then try ?43344 and 33443?. But I don't want to do that by hand, so a spreadsheet or something is necessary.

I found one word this way as a proof of concept, but I'm not sure that I want to go through and do the rest.
![spreadsheet letter offsets.png](///raw/974/1/z/73272.png)