Skip to content

Instantly share code, notes, and snippets.

@onliniak
Created August 15, 2024 11:43
Show Gist options
  • Save onliniak/23ae1632128489b86db73d8d6ee1c191 to your computer and use it in GitHub Desktop.
Save onliniak/23ae1632128489b86db73d8d6ee1c191 to your computer and use it in GitHub Desktop.
Toy quasi-binary story (pseudo-octal) index

Toy quasi-binary story (pseudo-octal) index

Zawsze uważałem, że Twine ma najlepszy format plików opowieściowych. Więc kiedy zachciało mi się zrobić coś w stylu retro lochów. Powstało takie coś.

Plik C

extern char* word[] = {
  "test",
  "txt",
  "test"
}; // ignore: warning: 'word' initialized and declared 'extern'

extern char* wordf[] = {
  "found_treasury",
  "killed_by_monster_with_example_id",
  "test"
};

extern long long main() {
  return 800010010118;
}

extern int text_filename(int file, int index) { //return 1st char of file 0 array.
  r = word[file][index]
  return r;
}

extern int fun_filename(int file, int index) { //return 1st char of file 0 array.
  r = wordf[file][index] // ignore: warning: initialization of 'int' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
  return r;
}

extern int found_treasury() {
  return 10000; // on server: money += 10_000
}

extern int extra_toy_story_quasi_binary_octal_index(int index) {
  if (index == 0) {
    // code
  }
  if (index == 1) {
    // code
  }
  if (index == 2) {
    // code
  }
  if (index == 3) {
    // code
  }
}

Index

Runtime zawsze zaczyna od wywołania indexu, który zwraca Int64/long long.

Zaczynamy zawsze od 8 i kończymy 8. Pomiędzy ósemkami znajduje się ciąg 4 kodów.
*W Int64 możesz zmieścić tylko 8 instrukcji. Po za tym wygląda jak zero.

  • 00 - Przeczytaj funkcję text_filename(occurance of index number). Plik tekstowy powinien zostać dostarczony innym kanałem.
  • 01 - Fałsz albo wybór po lewej
  • 10 - Prawda albo wybór po prawej
  • 11 - Przeczytaj funkcję fun_filename(occurance of index number) oraz uruchom inną funkcję w tym samym pliku.

Operacje dodatkowe:
*Zawsze zwracają kolejny index.

  • 80 - Wykonaj opcjonalny extra_toy_story_quasi_binary_octal_index[0]
  • 81 - Wykonaj opcjonalny extra_toy_story_quasi_binary_octal_index[1]
  • 18 - Wykonaj opcjonalny extra_toy_story_quasi_binary_octal_index[2]
  • 81 - Wykonaj opcjonalny extra_toy_story_quasi_binary_octal_index[3]

Rezultat może wyglądać tak → 811100100111001008 albo tak 8008.
Ale najprawdopodobniej będzie wyglądać tak → 800101101008:

  1. 8 - Początek transmisji.
  2. 00 - Wykonaj text_filename(0, 0) && wczytaj nazwę pliku jaką otrzymasz z pamięci trwałej.
  3. 10 - Jeśli użytkownik wybrał odpowiedź T albo idź na wschód w formularzu, wykonaj następną instrukcję.
  4. 11 - Wykonaj fun_filename(0, 0) && wykonaj otrzymaną funkcję.
  5. 01 - Jeśli użytkownik wybrał odpowiedź N albo idź na zachód w formularzu, wykonaj następną instrukcję.
  6. 00 - Wykonaj text_filename(1, 0) && wczytaj nazwę pliku jaką otrzymasz z pamięci trwałej.
  7. 8 - Koniec transmisji.

Historia

Oryginalny WASM nie zezwala na użycie array -ów, więc musiałem wymyślić ciąg cyfr. Jasne, użycie wszystkich cyfr byłoby łatwiejsze ale trudno byłoby zrozumieć co autor miał na myśli. System binarny składa się tylko z 4 znaków. Przypadkowo retro dungeony też mają 4 operacje: obrót w lewo, obrót w prawo, idź prosto i interakcja. Po zastąpieniu dwóch ostatnich wczytywaniem plików i akcji w stylu walk, czy innych kufrów; otrzymujemy całkiem przyjemny format nieczytelny dla ludzi. A jakby tego było mało to mam jeszcze zarezerwowane 4 opcje dodatkowe dla programistów. Tak, ograniczenie do 8 instrukcji nie wydaje się w porządku ale skoro antyczni twórcy dali radę ?

Pastebin

https://klembot.github.io/chapbook/guide/

Na razie piszę backend oparty na infrastrukturze Mastodona. Ja wysyłam wiadomości, które pierwszy lepszy filtr antyspamowy by odrzucił, a klient odczyta z nich całe API. Jak skończę to wezmę się do pracy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment