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