Compare commits

...

11 Commits

Author SHA1 Message Date
2252a80bb9 feat(i18n): EN fixes.
All checks were successful
Gymkhana exports / All exports (push) Successful in 2m44s
2025-11-12 01:19:53 +01:00
29c9cd4828 feat(scoreboard): Label with note. 2025-11-12 01:19:23 +01:00
6d426fe4fb feat(save): new savegames for post-intro and con ajo 2025-11-12 00:30:53 +01:00
e5259f500f feat(build): Fix patches conflict. Merged audio PR with conflicting ones
All checks were successful
Gymkhana exports / All exports (push) Successful in 2m45s
2025-11-12 00:05:32 +01:00
d99320fcc8 fix(web): submit score params in path, hopefully fixes #270
All checks were successful
Gymkhana exports / All exports (push) Successful in 2m44s
2025-11-11 23:16:33 +01:00
44d838fedf feat(i18n): French fixes 2025-11-11 23:12:24 +01:00
8e0f13a10c feat(build): Update patches & rejected files list. 2025-11-11 22:12:03 +01:00
8aacb4b615 fix(web): refresh page if service worker was installed, fixes #267 2025-11-11 20:53:47 +01:00
990acac845 chore: cleanup 2025-11-11 20:07:44 +01:00
af6ae3e137 uids 2025-11-11 20:00:19 +01:00
72f2d1b091 i18n 2025-11-11 15:08:55 +01:00
35 changed files with 925 additions and 2826 deletions

View File

@@ -1,9 +0,0 @@
## Development
- Oier
- Eneko
## Collaborations
- Pico
- Miette
- Niko
- Urtzi

File diff suppressed because it is too large Load Diff

View File

@@ -1,83 +0,0 @@
Subject: [PATCH] feat(deploy): Itch.io publishing. #203
---
Index: .gitea/workflows/push-release.yml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/.gitea/workflows/push-release.yml b/.gitea/workflows/push-release.yml
--- a/.gitea/workflows/push-release.yml (revision 1c1f32e2aa839ccf963326d88f5f21bb3085ba1d)
+++ b/.gitea/workflows/push-release.yml (revision 8d2907c071001995b91dc6234ec511729fd49137)
@@ -34,16 +34,6 @@
files: |
build/**/*.appimage
build/**/*.tar.gz
- - name: Publish AMD to itch.io
- uses: yeslayla/butler-publish-itchio-action@master
- env:
- BUTLER_CREDENTIALS: ${{ secrets.BUTLER_API_KEY }}
- CHANNEL: linux
- PACKAGE: build/debug/amd64/*.appimage
- - name: Publish ARM to itch.io
- uses: yeslayla/butler-publish-itchio-action@master
- env:
- BUTLER_CREDENTIALS: ${{ secrets.BUTLER_API_KEY }}
- CHANNEL: linux
- PACKAGE: build/debug/arm64/*.appimage
- VERSION_FILE: build/version.txt
\ No newline at end of file
+ - name: Publishing
+ run: |
+ ./publish.sh
\ No newline at end of file
Index: bash_colors.sh
===================================================================
diff --git a/bash_colors.sh b/bash_colors.sh
new file mode 100644
--- /dev/null (revision 8d2907c071001995b91dc6234ec511729fd49137)
+++ b/bash_colors.sh (revision 8d2907c071001995b91dc6234ec511729fd49137)
@@ -0,0 +1,6 @@
+NOCOLOR='\033[0m' # No Color
+BLUE='\e[34m' # BrightBlue
+BOLD_BLUE='\033[1;94m' # BrightBlue
+GREEN='\e[49;32m' # Green
+ORANGE='\033[1;33m'
+RED='\033[1;31m'
\ No newline at end of file
Index: publish.sh
===================================================================
diff --git a/publish.sh b/publish.sh
new file mode 100644
--- /dev/null (revision 8d2907c071001995b91dc6234ec511729fd49137)
+++ b/publish.sh (revision 8d2907c071001995b91dc6234ec511729fd49137)
@@ -0,0 +1,29 @@
+#!/bin/bash
+source bash_colors.sh
+
+ITCHIO_ENABLED=true
+
+VERSION=`cat build/version.txt`
+echo -e "Publishing ${GREEN}v${VERSION}${NOCOLOR}"
+
+# Publish to Itch.io
+if [ "$ITCHIO_ENABLED" = true ] ; then
+ echo -e "${BLUE}Publishing to Itch.io${NOCOLOR}"
+ if ! command -v butler >/dev/null 2>&1
+ then
+ echo -e "${RED}butler could not be found. Aborting!${NOCOLOR}"
+ exit 1
+ fi
+
+
+
+ echo -e "${ORANGE}Publishing AMD64${NOCOLOR}"
+ butler push build/debug/amd64/LasGymkhanikasDeUli--debug.x86_64.appimage uliwood/las-gymkhanikas-de-uli-turno-cocina:linux-amd64 --userversion $VERSION
+
+ echo -e "${ORANGE}Publishing ARM64${NOCOLOR}"
+ butler push build/debug/arm64/LasGymkhanikasDeUli--debug.arm_64.appimage uliwood/las-gymkhanikas-de-uli-turno-cocina:linux-arm64 --userversion $VERSION
+
+
+ else
+ echo -e "${ORANGE}Itch.io not enabled.{NOCOLOR}"
+fi
\ No newline at end of file

View File

@@ -73,22 +73,12 @@ func get_scores(collection: String) -> Array[RTMIScoreRow]:
func submit_score(collection: String, name: String, time: int) -> bool:
var hash = ("%s_%s_%s_%s" % [collection, name, time, score_submit_key]).sha256_text()
var request_data: String = (
JSON
. new()
. stringify(
{
"collectionId": collection,
"score":
{
"name": name,
"time": time,
},
"hash": hash
}
)
)
var response_data = await _score_http_request(http_requests[SUBMIT], score_submit_url, HTTPClient.METHOD_POST, request_data)
var url = "%s/%s/%s/%s/%s" % [score_submit_url, collection, name.uri_encode(), time, hash]
var response_data = await _score_http_request(http_requests[SUBMIT], url)
if response_data == null:
push_error("Error submitting score: response data is null")
return false
if not response_data.success:
push_error("Error submitting score: error=%s" % response_data.errorMsg)

View File

@@ -41,6 +41,11 @@ unique_name_in_owner = true
layout_mode = 2
collection = "perfect"
[node name="Label" type="Label" parent="CenterContainer/VBoxContainer"]
layout_mode = 2
text = "SCOREBOARD_NOTE"
horizontal_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/VBoxContainer"]
layout_mode = 2
alignment = 1

View File

@@ -9,7 +9,7 @@ DEFAULT_DESTINATION_PATH="../escoria-demo-game"
DESTINATION_PATH="${1:-$DEFAULT_DESTINATION_PATH}"
REMOTE_PATCHES=(
"https://patch-diff.githubusercontent.com/raw/godot-escoria/escoria-demo-game/pull/777.patch"
#"https://patch-diff.githubusercontent.com/raw/godot-escoria/escoria-demo-game/pull/777.patch"
)
PROJECT_PATH=$PWD
@@ -44,7 +44,7 @@ echo -e "${BLUE}Applying remote patches...${NOCOLOR}"
echo -e ==========================
for REMOTE_PATCH in "${REMOTE_PATCHES[@]}"; do
echo -e "Patch: ${ORANGE}$REMOTE_PATCH${NOCOLOR}"
curl $REMOTE_PATCH | git apply -v --index
curl $REMOTE_PATCH | git apply -v --reject --index
done
echo -e
@@ -52,9 +52,14 @@ echo -e "${BLUE}Applying local patches...${NOCOLOR}"
echo -e ==========================
for FILE in $PROJECT_PATH/patches/*; do
echo -e "Patch: ${ORANGE}$FILE${NOCOLOR}"
git apply -v --index $FILE
git apply -v --reject --index $FILE
done
echo -e
echo -e "${BLUE}Rejected files...${NOCOLOR}"
echo -e ==========================
find -name "*.rej"
popd > /dev/null
echo -e "${BLUE}Done!🎉${NOCOLOR}"

View File

@@ -169,7 +169,7 @@ variant/thread_support=true
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/export_icon=true
html/custom_html_shell=""
html/custom_html_shell="res://platform/web/full-size.html"
html/head_include=""
html/canvas_resize_policy=2
html/focus_canvas_on_start=true

View File

@@ -27,7 +27,7 @@
"SLOW_TEXT_MODE","Slow dialogs","Dialogues lents","","Dialogos lentos","Elkarrizketa mantsoak"
"SKIP_VIDEO"," Skip video","Passer la vidéo","","Saltar video","Bideoa pasa"
"ACHIEVEMENT_UNLOCKED_NOTIFICATION_LABEL","Unlocked achievement:","Objectifs débloqués:","","Logro desbloqueado:","Lorpen desblokeatua:"
"ACHIEVEMENT_SUMMARY","Achivement summary","Résumé des objectifs atteints","","Resumen de logros","Lorpenen laburpena"
"ACHIEVEMENT_SUMMARY","Achievement summary","Résumé des objectifs atteints","","Resumen de logros","Lorpenen laburpena"
"TOTAL_TIME","Total time","Temps total","","Tiempo total","Denbora totala"
"POSITION","Position","","","Posición","Postua"
"SCOREBOARD_PERFECT_TITLE","Perfect TOP 10","Parfait TOP 10",,"Perfect TOP 10","Perfect TOP 10"
@@ -35,11 +35,12 @@
"SKIP_CREDITS","Skip credits","Sauter les crédits",,"Saltar créditos","Kredituak pasa"
"SHOW_CREDITS","Continue","","","Continuar sin enviar","Jarraitu bidali gabe"
"NAME_PLACEHOLDER","Your name","","","Tu nombre","Zure izena"
"SUBMIT_SCORE","Sumbit score","Envoyer le score",,"Enviar puntuación","Puntuazioa bidali"
"SUBMIT_SCORE","Submit score","Envoyer le score",,"Enviar puntuación","Puntuazioa bidali"
"SUBMIT_PERFECT_SCORE","Submit PERFECT score","Envoyer PARFAIT score","","Enviar puntuación PERFECTA","Puntuazioa PERFEKTUA bidali"
"BACK_MAIN_MENU","Return to the main menu","Retour au menu principal","","Volver al menú principal","Menu nagusira bueltatu"
"SCOREBOARD_REFRESH","Refresh","Rafaîchir","","Refrescar","Eguneratu"
"SCOREBOARD_BACK","Back","Retour","Zurück","Volver","Itzuli"
"CURRENT_PLAYING_TIME","Current playing time:","Temps de partie :","","Tiempo de la partida:","Jolastutako denbora:"
"ACHIEVEMENTS","Achievements","Objectifs","","Logros","Lorpenak"
"ACHIEVEMENTS_MENU_NOTE","Get all the achievements to get a perfect score.","Obtenez tous les objectifs pour obtenir un score parfait.","","Consigue todos los logros para obtener una puntuación perfecta.","Lortu lorpen guztiak puntuazio perfektua lortzeko."
"ACHIEVEMENTS_MENU_NOTE","Get all the achievements to get a perfect score.","Obtenez tous les objectifs pour obtenir un score parfait.","","Consigue todos los logros para obtener una puntuación perfecta.","Lortu lorpen guztiak puntuazio perfektua lortzeko."
"SCOREBOARD_NOTE","Only the best score for each player is registered.","Seul le meilleur score de chaque joueur est enregistré.","","Solo se registra la mejor puntuación de cada jugador.","Jokalari bakoitzaren puntuaziorik onena bakarrik erregistratzen da."
1 keys en fr de es eu
27 SLOW_TEXT_MODE Slow dialogs Dialogues lents Dialogos lentos Elkarrizketa mantsoak
28 SKIP_VIDEO Skip video Passer la vidéo Saltar video Bideoa pasa
29 ACHIEVEMENT_UNLOCKED_NOTIFICATION_LABEL Unlocked achievement: Objectifs débloqués: Logro desbloqueado: Lorpen desblokeatua:
30 ACHIEVEMENT_SUMMARY Achivement summary Achievement summary Résumé des objectifs atteints Resumen de logros Lorpenen laburpena
31 TOTAL_TIME Total time Temps total Tiempo total Denbora totala
32 POSITION Position Posición Postua
33 SCOREBOARD_PERFECT_TITLE Perfect TOP 10 Parfait TOP 10 Perfect TOP 10 Perfect TOP 10
35 SKIP_CREDITS Skip credits Sauter les crédits Saltar créditos Kredituak pasa
36 SHOW_CREDITS Continue Continuar sin enviar Jarraitu bidali gabe
37 NAME_PLACEHOLDER Your name Tu nombre Zure izena
38 SUBMIT_SCORE Sumbit score Submit score Envoyer le score Enviar puntuación Puntuazioa bidali
39 SUBMIT_PERFECT_SCORE Submit PERFECT score Envoyer PARFAIT score Enviar puntuación PERFECTA Puntuazioa PERFEKTUA bidali
40 BACK_MAIN_MENU Return to the main menu Retour au menu principal Volver al menú principal Menu nagusira bueltatu
41 SCOREBOARD_REFRESH Refresh Rafaîchir Refrescar Eguneratu
42 SCOREBOARD_BACK Back Retour Zurück Volver Itzuli
43 CURRENT_PLAYING_TIME Current playing time: Temps de partie : Tiempo de la partida: Jolastutako denbora:
44 ACHIEVEMENTS Achievements Objectifs Logros Lorpenak
45 ACHIEVEMENTS_MENU_NOTE Get all the achievements to get a perfect score. Obtenez tous les objectifs pour obtenir un score parfait. Consigue todos los logros para obtener una puntuación perfecta. Lortu lorpen guztiak puntuazio perfektua lortzeko.
46 SCOREBOARD_NOTE Only the best score for each player is registered. Seul le meilleur score de chaque joueur est enregistré. Solo se registra la mejor puntuación de cada jugador. Jokalari bakoitzaren puntuaziorik onena bakarrik erregistratzen da.

View File

@@ -232,7 +232,7 @@
"cocina_cuchillos_action3_cuchillo","Leave it in place","Laisser à sa place","Dejar en su sitio","Bere tokian utzi"
"cocina_cuchillos_action3_cuchillo_say","The knife in its place!","Le couteau à sa place ","El cuchillo a su sitio!","Labana bere lekura!"
"cocina_cuerno_action1_say","Uli's horn, the call for food.","La corne d'Uli, l'appel de la nourriture.","El cuerno de Uli, la llamada para comer.","Uliko adarra, bazkaltzera deitzeko."
"cocina_cuerno_action2_say","Charge!","A l'assaut !","A la saca!","Barrura!"
"cocina_cuerno_action2_say","Into the bag!","A l'assaut !","A la saca!","Barrura!"
"cocina_cuerno_action3_say","It looks like an animal's horn. It's used to call people to the table.","On dirait la corne d'un animal. Il est utilisé pour appeler à table.","Parece un cuerno de algún animal. Lo usan para llamar a comer.","Animaliaren baten adarra dirudi. Otorduetara deitzeko erabiltzen dute."
"cocina_cuerno_action4_hint","I should ask Eneko to taste the lentils before calling people to the table.","Je devrais demander à Eneko qu'il goûte les lentilles avant d'appeler les gens à table.","Debería pedirle a Eneko que pruebe las lentejas antes de llamar a la gente.","Adarra jo aurretik Enekori dilistak dastatzeko esan beharko nioke."
"cocina_cuerno_action4_say","If I blow it here, people in the garden won't hear me. I should find a better place.","Si je la sonne ici, les gens au potager ne vont pas m'entendre. Il faudrait trouver un meilleur endroit.","Si lo toco aquí no me va a oir la gente que esté en la huerta, debería buscar un sitio mejor.","Adarra hemen jotzen badut baratzean daudenek ez dute tutik ere entzungo. Leku hobe bat bilatu beharko dut."
@@ -304,7 +304,7 @@
"cocina_ajo_action2_say","A good head of garlic, just what I needed for good lentils.","Une bonne tête d'ail, juste ce dont j'avais besoin pour de bonnes lentilles.","Una buena cabeza de ajo, justo lo que necesitaba para unas buenas lentejas.","Baratxuri oso bat, dilista goxo batzuk prestatzeko ezinbestekoa!"
"mechero_action1_say_1","My lighter, so good!","Mon briquet, trop bien !","Mi mechero, que bien!!","Nire txiskeroa, zeinen ongi!!"
"mechero_action1_say_2","Wait, I left it on the table for a minute and it disappeared.","Attends, je l'ai laissé une minute sur la table et il a disparu.","Ayer lo dejé un segundo encima de la mesa y desapareció.","Atzo mahi gainean utzi eta desagertu egin zen."
"mechero_action2_say","Charge!","A l'assaut !","A la saca!","Barrura!"
"mechero_action2_say","Into the bag!","A l'assaut !","A la saca!","Barrura!"
"mechero_action3_say_1","It looks like it has no gas.","On dirait qu'il n'a pas de gaz.","Parece que no tiene gas.","Ez zaio gasik gelditzen."
"mechero_action3_say_2","That explains why it was abandoned.","Ça explique qu'il ait été abandonné.","Eso explica que lo hayan abandonado.","Horregatik utzi dute hortik."
"mechero_action3_say_3","If you come to Uli, watch your lighter.","Si tu viens à Uli, fais gaffe à ton briquet.","Si vienes a Uli vigila tu mechero.","Ulira bazatoz zaindu zure txiskeroa."
@@ -317,7 +317,7 @@
"olla_vacia_action3_romero_say","First, I should fill the pot with water.","D'abord, il faudrait que je remplisse la casserole d'eau.","Primero debería llenar la olla de agua.","Eltzea urez bete beharko nuke lehenik."
"tooltip_olla_llena_action2","Scare the lentils","Faire peur aux lentilles","Asustar las lentejas","Dilistak izutu"
"olla_llena_action2_say","Booooooh!!","Bouuuuuh !!","Buuuuh!!","Buuuuh!!"
"olla_llena_action2_say2","Krkrkrkrkr","Krkrkrkrkr","ji ji ji","ji ji ji"
"olla_llena_action2_say2","hehehe","Krkrkrkrkr","ji ji ji","ji ji ji"
"olla_llena_action2_without_lentejas_say","First, I need to put the lentils in the pot.","D'abord, il faut que je mette les lentilles dans la casserole.","Primero tengo que poner lentejas en la olla.","Lehenik dilistak eltzean jarri behar ditut."
"olla_llena_action1_say","It's full of water.","Elle est pleine d'eau.","Está llena de agua","Urez beteta dago"
"olla_llena_action1_lentejas_say","lentils","lentilles","lentejas","dilistak"
@@ -450,11 +450,11 @@
"cocina_delante_pegatinas_eneko_smoking_1","Hey! Don't even think about touching them.","Eh ! Penses même pas à les toucher.","Eh! Ni se te ocurra tocarlas.","Argi ibili, ezta pentsatu ere!"
"cocina_delante_pegatinas_eneko_smoking_2","Hey! Watch out, I know how many there are.","Eh ! Attention, je sais combien y en a.","Eh! Cuidado que las tengo contadas.","Banan banan zenbatu ditut, ez zaitez hurbildu!"
"cocina_delante_pegatinas_eneko_smoking_3","Hey! Don't insist!","Eh ! Insistes pas !","Eh! No insistas!","Ezetz esan dizut!"
"cocina_delante_pegatinas_eneko_smoking_count_2","Stop trying! That's 2 attempts.","Arrête d'essayer ! Ça fait 2 que tu essaies.","Deja de intentarlo! Llevas ya 2 intentos!","Ez zaitez tematu, 2 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_5","Stop trying! That's 5 attempts.","Arrête d'essayer ! Ça fait 5 que tu essaies.","Deja de intentarlo! Llevas ya 5 intentos!","Ez zaitez tematu, 5 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_10","Stop trying! That's 10 attempts.","Arrête d'essayer ! Ça fait 10 que tu essaies.","Deja de intentarlo! Llevas ya 10 intentos!","Ez zaitez tematu, 10 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_20","Stop trying! That's 20 attempts.","Arrête d'essayer ! Ça fait 20 que tu essaies.","Deja de intentarlo! Llevas ya 20 intentos!","Ez zaitez tematu, 20 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_100","Stop trying! That's 100 attempts.","Arrête d'essayer ! Ça fait 100 que tu essaies.","Deja de intentarlo! Llevas ya 100 intentos!","Ez zaitez tematu, 100 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_2","Stop trying! That's 2 attempts.","Arrête d'essayer ! Ça fait 2 fois que tu essaies.","Deja de intentarlo! Llevas ya 2 intentos!","Ez zaitez tematu, 2 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_5","Stop trying! That's 5 attempts.","Arrête d'essayer ! Ça fait 5 fois que tu essaies.","Deja de intentarlo! Llevas ya 5 intentos!","Ez zaitez tematu, 5 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_10","Stop trying! That's 10 attempts.","Arrête d'essayer ! Ça fait 10 fois que tu essaies.","Deja de intentarlo! Llevas ya 10 intentos!","Ez zaitez tematu, 10 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_20","Stop trying! That's 20 attempts.","Arrête d'essayer ! Ça fait 20 fois que tu essaies.","Deja de intentarlo! Llevas ya 20 intentos!","Ez zaitez tematu, 20 aldiz saiatu zara!"
"cocina_delante_pegatinas_eneko_smoking_count_100","Stop trying! That's 100 attempts.","Arrête d'essayer ! Ça fait 100 fois que tu essaies.","Deja de intentarlo! Llevas ya 100 intentos!","Ez zaitez tematu, 100 aldiz saiatu zara!"
"cocina_ordenador_action1_say","It's Uli's computer. They use it to go on the internet, talk via Element or play music.","C'est l'ordinateur d'Uli. On l'utilise pour aller sur internet, se parler par Element ou mettre de la musique.","Es el ordenador de Uli. Lo usan para navegar, comunicarse con Element y poner música.","Uliko ordenagailua da. Nabigatzeko, Element bidez mezuak bidaltzeko eta musika entzuteko erabiltzen dute."
"cocina_ordenador_action2_say","Let's see what songs it has...","Voyons voir quelles chansons il contient...","A ver que canciones tiene...","Ea ze abesti dauzkan..."
"turno_cocina_bandera_palestina_action1","Which side are you on?","Tu es de quel coté ?","¿De qué lado estas?","Zu noren alde zaude?"
@@ -465,19 +465,19 @@
"turno_cocina_bandera_palestina_action2_say_3","The deliberate actions; mass killings, forced displacements, blockade of access to food, water and medicine and the dehumanizing rhetoric of the Israeli authorities demonstrate an intention to destroy totally or partially the Palestinian people.","Les actions délibérées massacres, déplacements forcés, blocage de laccès à la nourriture, à leau et aux médicaments et la rhétorique déshumanisante des autorités israéliennes démontrent une intention de détruire totalement ou partiellement le peuple palestinien.","Las acciones deliberadas asesinatos masivos, desplazamientos forzados, bloqueo del acceso a alimentos, agua y medicinas y la retórica deshumanizadora de las autoridades israelíes demuestran una intención de destruir total o parcialmente al pueblo palestino.","Israelgo agintarien nahitako ekintzek hilketa masiboak, lekualdatze behartuak, janari, ur eta sendagaietarako sarbidea blokeatzea eta gizagabetzearen erretorikek palestinar herria erabat edo partzialki suntsitzeko asmoa erakusten dute."
"turno_cocina_bandera_palestina_action2_say_4","Israel's impunity in the face of international resolutions perpetuates the occupation, apartheid and genocide against the Palestinian population.","Limpunité dIsraël face aux résolutions internationales perpétue loccupation, lapartheid et le génocide contre la population palestinienne.","La impunidad de Israel frente a las resoluciones internacionales perpetúa la ocupación, el apartheid y el genocidio contra la población palestina.","Nazioarteko ebazpenen aurrean Israelen zigorgabetasunak okupazioa, apartheida eta genozidioa iraunarazten dute Palestinako biztanleriaren aurka."
"achievement_ordenado_title","Things in their place","Chaque chose à sa place.","Las cosas a su sitio","Gauzak bere lekura"
"achievement_coleccionista_title","Sticker collector","Collectionneur d'autocollants","Coleccionista de pegatinas","Pegatinazalea"
"achievement_coleccionista_title","Sticker collector","Collectionneur de stickers","Coleccionista de pegatinas","Pegatinazalea"
"achievement_amenazas_title","Violent threats","Menaces violentes","Amenazas violentas","Mehatxu bortitzak"
"achievement_gourmet_title","Great gourmet","Grand gourmet","Gran gourmet","Gourmet bikaina"
"achievement_chistes_title","Bad jokes","Mauvaises blagues","Chistes malos","Txiste txarrak"
"achievement_musica_title","Music lover","Mélophile","Amante de la música","Musikazale amorratua"
"achievement_musica_title","Music lover","Mélomane","Amante de la música","Musikazale amorratua"
"achievement_palestina_title","Free Palestine!","Palestine libre","Palestina libre!","Palestina askatu!"
"achievement_hambrientas_title","Hungry people","Les affamés","Gente hambrienta","Gosetiak"
"turno_cocina_creditos_score_1","Congratulations! Save your score so everyone can see it.","Félicitations! Enregistrez votre score pour que tout le monde puisse le voir.","Enhorabuena! Guarda tu puntuación, para que todo el mundo la vea.","Zorionak! Gorde zure puntuazioa denek ikus dezaten."
"turno_cocina_creditos_score_2","If you get all the achievements you'll enter the perfect scores list.","Si vous atteignez tous les objectifs, vous figurerez dans la liste des scores parfaits.","Si consigues todos los logros entrarás en la lista de puntuaciones perfectas.","Lorpen guztiak lortzen badituzu, puntuazio perfektuen zerrendan sartuko zara."
"turno_cocina_creditos_score_3","For now we're putting you on the mediocre list.","Pour le moment, vous êtes placé sur la liste des médiocres.","Por ahora te apuntamos en la lista de mediocres.","Oraingoz, erdipurdikoen zerdan sartuko zaitugu."
"turno_cocina_creditos_score_1","Congratulations! Save your score so everyone can see it.","Félicitations ! Enregistre ton score pour que tout le monde puisse le voir.","Enhorabuena! Guarda tu puntuación, para que todo el mundo la vea.","Zorionak! Gorde zure puntuazioa denek ikus dezaten."
"turno_cocina_creditos_score_2","If you get all the achievements you'll enter the perfect scores list.","Si tu atteins tous les objectifs, tu figurerera dans la liste des scores parfaits.","Si consigues todos los logros entrarás en la lista de puntuaciones perfectas.","Lorpen guztiak lortzen badituzu, puntuazio perfektuen zerrendan sartuko zara."
"turno_cocina_creditos_score_3","For now we're putting you on the mediocre list.","Pour le moment, tu es placé sur la liste des médiocres.","Por ahora te apuntamos en la lista de mediocres.","Oraingoz, erdipurdikoen zerdan sartuko zaitugu."
"turno_cocina_creditos_perfect_score_oier_1","Perfect!","Parfait!","Perfect!","Perfekt!"
"turno_cocina_creditos_perfect_score_oier_2","Perfect!","Parfait!","Perfect!","Perfekt!"
"turno_cocina_creditos_perfect_score_oier_3","Perfect!","Parfait!","Perfect!","Perfekt!"
"turno_cocina_creditos_perfect_score_eneko_1","Perfect!","Parfait!","Perfect!","Perfekt!"
"turno_cocina_creditos_perfect_score_eneko_2","Perfect!","Parfait!","Perfect!","Perfekt!"
"turno_cocina_creditos_perfect_score_eneko_3","Perfect!","Parfait!","Perfect!","Perfekt!"
"turno_cocina_creditos_perfect_score_eneko_3","Perfect!","Parfait!","Perfect!","Perfekt!"
1 keys en fr es eu
232 cocina_cuchillos_action3_cuchillo Leave it in place Laisser à sa place Dejar en su sitio Bere tokian utzi
233 cocina_cuchillos_action3_cuchillo_say The knife in its place! Le couteau à sa place El cuchillo a su sitio! Labana bere lekura!
234 cocina_cuerno_action1_say Uli's horn, the call for food. La corne d'Uli, l'appel de la nourriture. El cuerno de Uli, la llamada para comer. Uliko adarra, bazkaltzera deitzeko.
235 cocina_cuerno_action2_say Charge! Into the bag! A l'assaut ! A la saca! Barrura!
236 cocina_cuerno_action3_say It looks like an animal's horn. It's used to call people to the table. On dirait la corne d'un animal. Il est utilisé pour appeler à table. Parece un cuerno de algún animal. Lo usan para llamar a comer. Animaliaren baten adarra dirudi. Otorduetara deitzeko erabiltzen dute.
237 cocina_cuerno_action4_hint I should ask Eneko to taste the lentils before calling people to the table. Je devrais demander à Eneko qu'il goûte les lentilles avant d'appeler les gens à table. Debería pedirle a Eneko que pruebe las lentejas antes de llamar a la gente. Adarra jo aurretik Enekori dilistak dastatzeko esan beharko nioke.
238 cocina_cuerno_action4_say If I blow it here, people in the garden won't hear me. I should find a better place. Si je la sonne ici, les gens au potager ne vont pas m'entendre. Il faudrait trouver un meilleur endroit. Si lo toco aquí no me va a oir la gente que esté en la huerta, debería buscar un sitio mejor. Adarra hemen jotzen badut baratzean daudenek ez dute tutik ere entzungo. Leku hobe bat bilatu beharko dut.
304 cocina_ajo_action2_say A good head of garlic, just what I needed for good lentils. Une bonne tête d'ail, juste ce dont j'avais besoin pour de bonnes lentilles. Una buena cabeza de ajo, justo lo que necesitaba para unas buenas lentejas. Baratxuri oso bat, dilista goxo batzuk prestatzeko ezinbestekoa!
305 mechero_action1_say_1 My lighter, so good! Mon briquet, trop bien ! Mi mechero, que bien!! Nire txiskeroa, zeinen ongi!!
306 mechero_action1_say_2 Wait, I left it on the table for a minute and it disappeared. Attends, je l'ai laissé une minute sur la table et il a disparu. Ayer lo dejé un segundo encima de la mesa y desapareció. Atzo mahi gainean utzi eta desagertu egin zen.
307 mechero_action2_say Charge! Into the bag! A l'assaut ! A la saca! Barrura!
308 mechero_action3_say_1 It looks like it has no gas. On dirait qu'il n'a pas de gaz. Parece que no tiene gas. Ez zaio gasik gelditzen.
309 mechero_action3_say_2 That explains why it was abandoned. Ça explique qu'il ait été abandonné. Eso explica que lo hayan abandonado. Horregatik utzi dute hortik.
310 mechero_action3_say_3 If you come to Uli, watch your lighter. Si tu viens à Uli, fais gaffe à ton briquet. Si vienes a Uli vigila tu mechero. Ulira bazatoz zaindu zure txiskeroa.
317 olla_vacia_action3_romero_say First, I should fill the pot with water. D'abord, il faudrait que je remplisse la casserole d'eau. Primero debería llenar la olla de agua. Eltzea urez bete beharko nuke lehenik.
318 tooltip_olla_llena_action2 Scare the lentils Faire peur aux lentilles Asustar las lentejas Dilistak izutu
319 olla_llena_action2_say Booooooh!! Bouuuuuh !! Buuuuh!! Buuuuh!!
320 olla_llena_action2_say2 Krkrkrkrkr hehehe Krkrkrkrkr ji ji ji ji ji ji
321 olla_llena_action2_without_lentejas_say First, I need to put the lentils in the pot. D'abord, il faut que je mette les lentilles dans la casserole. Primero tengo que poner lentejas en la olla. Lehenik dilistak eltzean jarri behar ditut.
322 olla_llena_action1_say It's full of water. Elle est pleine d'eau. Está llena de agua Urez beteta dago
323 olla_llena_action1_lentejas_say lentils lentilles lentejas dilistak
450 cocina_delante_pegatinas_eneko_smoking_1 Hey! Don't even think about touching them. Eh ! Penses même pas à les toucher. Eh! Ni se te ocurra tocarlas. Argi ibili, ezta pentsatu ere!
451 cocina_delante_pegatinas_eneko_smoking_2 Hey! Watch out, I know how many there are. Eh ! Attention, je sais combien y en a. Eh! Cuidado que las tengo contadas. Banan banan zenbatu ditut, ez zaitez hurbildu!
452 cocina_delante_pegatinas_eneko_smoking_3 Hey! Don't insist! Eh ! Insistes pas ! Eh! No insistas! Ezetz esan dizut!
453 cocina_delante_pegatinas_eneko_smoking_count_2 Stop trying! That's 2 attempts. Arrête d'essayer ! Ça fait 2 que tu essaies. Arrête d'essayer ! Ça fait 2 fois que tu essaies. Deja de intentarlo! Llevas ya 2 intentos! Ez zaitez tematu, 2 aldiz saiatu zara!
454 cocina_delante_pegatinas_eneko_smoking_count_5 Stop trying! That's 5 attempts. Arrête d'essayer ! Ça fait 5 que tu essaies. Arrête d'essayer ! Ça fait 5 fois que tu essaies. Deja de intentarlo! Llevas ya 5 intentos! Ez zaitez tematu, 5 aldiz saiatu zara!
455 cocina_delante_pegatinas_eneko_smoking_count_10 Stop trying! That's 10 attempts. Arrête d'essayer ! Ça fait 10 que tu essaies. Arrête d'essayer ! Ça fait 10 fois que tu essaies. Deja de intentarlo! Llevas ya 10 intentos! Ez zaitez tematu, 10 aldiz saiatu zara!
456 cocina_delante_pegatinas_eneko_smoking_count_20 Stop trying! That's 20 attempts. Arrête d'essayer ! Ça fait 20 que tu essaies. Arrête d'essayer ! Ça fait 20 fois que tu essaies. Deja de intentarlo! Llevas ya 20 intentos! Ez zaitez tematu, 20 aldiz saiatu zara!
457 cocina_delante_pegatinas_eneko_smoking_count_100 Stop trying! That's 100 attempts. Arrête d'essayer ! Ça fait 100 que tu essaies. Arrête d'essayer ! Ça fait 100 fois que tu essaies. Deja de intentarlo! Llevas ya 100 intentos! Ez zaitez tematu, 100 aldiz saiatu zara!
458 cocina_ordenador_action1_say It's Uli's computer. They use it to go on the internet, talk via Element or play music. C'est l'ordinateur d'Uli. On l'utilise pour aller sur internet, se parler par Element ou mettre de la musique. Es el ordenador de Uli. Lo usan para navegar, comunicarse con Element y poner música. Uliko ordenagailua da. Nabigatzeko, Element bidez mezuak bidaltzeko eta musika entzuteko erabiltzen dute.
459 cocina_ordenador_action2_say Let's see what songs it has... Voyons voir quelles chansons il contient... A ver que canciones tiene... Ea ze abesti dauzkan...
460 turno_cocina_bandera_palestina_action1 Which side are you on? Tu es de quel coté ? ¿De qué lado estas? Zu noren alde zaude?
465 turno_cocina_bandera_palestina_action2_say_3 The deliberate actions; mass killings, forced displacements, blockade of access to food, water and medicine and the dehumanizing rhetoric of the Israeli authorities demonstrate an intention to destroy totally or partially the Palestinian people. Les actions délibérées – massacres, déplacements forcés, blocage de l’accès à la nourriture, à l’eau et aux médicaments – et la rhétorique déshumanisante des autorités israéliennes démontrent une intention de détruire totalement ou partiellement le peuple palestinien. Las acciones deliberadas –asesinatos masivos, desplazamientos forzados, bloqueo del acceso a alimentos, agua y medicinas– y la retórica deshumanizadora de las autoridades israelíes demuestran una intención de destruir total o parcialmente al pueblo palestino. Israelgo agintarien nahitako ekintzek –hilketa masiboak, lekualdatze behartuak, janari, ur eta sendagaietarako sarbidea blokeatzea– eta gizagabetzearen erretorikek palestinar herria erabat edo partzialki suntsitzeko asmoa erakusten dute.
466 turno_cocina_bandera_palestina_action2_say_4 Israel's impunity in the face of international resolutions perpetuates the occupation, apartheid and genocide against the Palestinian population. L’impunité d’Israël face aux résolutions internationales perpétue l’occupation, l’apartheid et le génocide contre la population palestinienne. La impunidad de Israel frente a las resoluciones internacionales perpetúa la ocupación, el apartheid y el genocidio contra la población palestina. Nazioarteko ebazpenen aurrean Israelen zigorgabetasunak okupazioa, apartheida eta genozidioa iraunarazten dute Palestinako biztanleriaren aurka.
467 achievement_ordenado_title Things in their place Chaque chose à sa place. Las cosas a su sitio Gauzak bere lekura
468 achievement_coleccionista_title Sticker collector Collectionneur d'autocollants Collectionneur de stickers Coleccionista de pegatinas Pegatinazalea
469 achievement_amenazas_title Violent threats Menaces violentes Amenazas violentas Mehatxu bortitzak
470 achievement_gourmet_title Great gourmet Grand gourmet Gran gourmet Gourmet bikaina
471 achievement_chistes_title Bad jokes Mauvaises blagues Chistes malos Txiste txarrak
472 achievement_musica_title Music lover Mélophile Mélomane Amante de la música Musikazale amorratua
473 achievement_palestina_title Free Palestine! Palestine libre Palestina libre! Palestina askatu!
474 achievement_hambrientas_title Hungry people Les affamés Gente hambrienta Gosetiak
475 turno_cocina_creditos_score_1 Congratulations! Save your score so everyone can see it. Félicitations! Enregistrez votre score pour que tout le monde puisse le voir. Félicitations ! Enregistre ton score pour que tout le monde puisse le voir. Enhorabuena! Guarda tu puntuación, para que todo el mundo la vea. Zorionak! Gorde zure puntuazioa denek ikus dezaten.
476 turno_cocina_creditos_score_2 If you get all the achievements you'll enter the perfect scores list. Si vous atteignez tous les objectifs, vous figurerez dans la liste des scores parfaits. Si tu atteins tous les objectifs, tu figurerera dans la liste des scores parfaits. Si consigues todos los logros entrarás en la lista de puntuaciones perfectas. Lorpen guztiak lortzen badituzu, puntuazio perfektuen zerrendan sartuko zara.
477 turno_cocina_creditos_score_3 For now we're putting you on the mediocre list. Pour le moment, vous êtes placé sur la liste des médiocres. Pour le moment, tu es placé sur la liste des médiocres. Por ahora te apuntamos en la lista de mediocres. Oraingoz, erdipurdikoen zerdan sartuko zaitugu.
478 turno_cocina_creditos_perfect_score_oier_1 Perfect! Parfait! Perfect! Perfekt!
479 turno_cocina_creditos_perfect_score_oier_2 Perfect! Parfait! Perfect! Perfekt!
480 turno_cocina_creditos_perfect_score_oier_3 Perfect! Parfait! Perfect! Perfekt!
481 turno_cocina_creditos_perfect_score_eneko_1 Perfect! Parfait! Perfect! Perfekt!
482 turno_cocina_creditos_perfect_score_eneko_2 Perfect! Parfait! Perfect! Perfekt!
483 turno_cocina_creditos_perfect_score_eneko_3 Perfect! Parfait! Perfect! Perfekt!

View File

@@ -0,0 +1,17 @@
1
00:00:00,712 --> 00:00:06,763
MULTITUD: We want to eat, we want to eat, we want to eat!
2
00:00:07,031 --> 00:00:11,073
<font color=#957d45>The food isn't ready.</font>
3
00:00:11,152 --> 00:00:15,853
<font color=#957d45>Come back later, come back later. The food isn't ready yet.</font>
MULTITUD: Oh no, oh no, the food.
4
00:00:15,889 --> 00:00:20,201
<font color=#957d45>But you're heartless. How could you do this to the little ones?</font>

View File

@@ -0,0 +1 @@
uid://ddsqfg7ekv8cx

View File

@@ -0,0 +1,8 @@
1
00:00:02,397 --> 00:00:04,288
<font color=#52a94d>Hey, I've already made the lentils.</font>
2
00:00:04,721 --> 00:00:08,754
<font color=#957d45>It's about time. Come on, let's see if they're edible, I'm going to try them.</font>

View File

@@ -0,0 +1 @@
uid://bxvgexeyj6lhr

View File

@@ -0,0 +1,8 @@
1
00:00:03,804 --> 00:00:07,517
<font color=#957d45>Let's just say they're acceptable. I think we'll be able to eat.</font>
2
00:00:07,766 --> 00:00:10,324
<font color=#957d45>Tell people to come.</font>

View File

@@ -0,0 +1 @@
uid://bi22xj8ifv8jo

View File

@@ -0,0 +1,20 @@
1
00:00:01,201 --> 00:00:02,866
<font color=#957d45>They're delicious!</font>
2
00:00:03,458 --> 00:00:05,395
<font color=#957d45>Wow! How did you do that?</font>
3
00:00:05,473 --> 00:00:07,925
<font color=#957d45>Thank you so much, they're just like my grandmother's.</font>
4
00:00:09,471 --> 00:00:10,514
<font color=#52a94d>Me alegro.</font>
5
00:00:10,614 --> 00:00:11,508
<font color=#957d45>Glad to hear it.</font>

View File

@@ -0,0 +1 @@
uid://0w4abq8gqim3

View File

@@ -0,0 +1,12 @@
1
00:00:02,268 --> 00:00:03,762
<font color=#957d45>But what is that concoction?</font>
2
00:00:04,075 --> 00:00:05,736
<font color=#957d45>You can do something about that now.</font>
3
00:00:05,772 --> 00:00:08,095
<font color=#957d45>Fix it, we're not going to eat it like this.</font>

View File

@@ -0,0 +1 @@
uid://bbcaeg6acu050

View File

@@ -1,16 +1,16 @@
1
00:00:36,712 --> 00:00:37,512
<font color=#52a94d>¡Buenos días! EN</font>
<font color=#52a94d>Good morning!</font>
2
00:00:38,035 --> 00:00:39,443
<font color=#52a94d>Qué bien se duerme en este pueblo. EN</font>
<font color=#52a94d>You sleep so well in this town.</font>
3
00:00:39,716 --> 00:00:42,383
<font color=#957d45>Mira tú, el señorito se ha dignado a aparecer. EN</font>
<font color=#957d45>Look at that, the young master has deigned to appear.</font>
4
00:00:43,127 --> 00:00:46,657
<font color=#957d45>¿Vas a hacer algo de provecho o te vas a pasar toda la mañana fumando porros? EN</font>
<font color=#957d45>Are you going to do something productive or are you going to spend all morning smoking joints?</font>

View File

@@ -0,0 +1,12 @@
1
00:00:00,712 --> 00:00:01,962
<font color=#52a94d>Your money or your life!</font>
2
00:00:02,780 --> 00:00:04,850
<font color=#957d45>What are you doing? Knives are not toys.</font>
3
00:00:04,860 --> 00:00:06,504
<font color=#957d45>Give me this, because I don't trust you one bit.</font>

View File

@@ -0,0 +1 @@
uid://d02auemdvu28e

View File

@@ -0,0 +1,4 @@
1
00:00:04,381 --> 00:00:05,312
<font color=#52a94d>What a mess!</font>

View File

@@ -0,0 +1 @@
uid://b1al1gk73dsck

View File

@@ -1,22 +0,0 @@
diff --git a/addons/escoria-core/game/esc_autoload.gd b/addons/escoria-core/game/esc_autoload.gd
index 4044fecc..be413109 100644
--- a/addons/escoria-core/game/esc_autoload.gd
+++ b/addons/escoria-core/game/esc_autoload.gd
@@ -8,6 +8,9 @@ signal paused
## Signal sent when Escoria is resumed from pause
signal resumed
+## Signal sent when escoria starts a new game
+signal new_game_started
+
## Current game state.[br]
## * DEFAULT: Common game function[br]
## * DIALOG: Game is playing a dialog[br]
@@ -182,6 +185,7 @@ func set_game_paused(p_paused: bool):
## Called from main menu's "new game" button.
func new_game():
get_escoria().new_game()
+ new_game_started.emit()
## Called from main menu's "quit" button.
func quit():

View File

@@ -1,26 +1,28 @@
diff --git a/addons/escoria-core/game/core-scripts/esc/types/esc_dialog_option.gd b/addons/escoria-core/game/core-scripts/esc/types/esc_dialog_option.gd
index bb4dd65b..92fb0e01 100644
index e3701e59..9b9f390d 100644
--- a/addons/escoria-core/game/core-scripts/esc/types/esc_dialog_option.gd
+++ b/addons/escoria-core/game/core-scripts/esc/types/esc_dialog_option.gd
@@ -5,9 +5,15 @@ extends ESCStatement
@@ -4,11 +4,15 @@
extends ESCStatement
class_name ESCDialogOption
-
+var _option: String
## Option text displayed in the HUD.
var option: String:
- get = get_translated_option
-
+ get:
+ return get_translated_option()
+ set(value):
+ _option = value
+ option = value
+
+
## Maps back to the parsed source option.
var source_option
@@ -22,8 +28,8 @@ var _is_valid: bool:
## default text is returned.
@@ -29,8 +33,8 @@ var _is_valid: bool:
## Returns the translated version of the option, if one exists; otherwise, the default text is returned. (`String`)
func get_translated_option() -> String:
# Check if text has a key
- if ":" in option:
@@ -30,14 +32,13 @@ index bb4dd65b..92fb0e01 100644
var key = splitted_text[0]
var translated_text = tr(key)
@@ -33,7 +39,15 @@ func get_translated_option() -> String:
@@ -40,7 +44,14 @@ func get_translated_option() -> String:
if splitted_text.size() > 1:
return splitted_text[1]
- return option
+ return _option
+
+
+func get_translation_id() -> String:
+ if ":" in _option:
+ var splitted_text = _option.split(":")
@@ -46,4 +47,4 @@ index bb4dd65b..92fb0e01 100644
+ return _option
## Checks if conditions match for this dialog option.[br]
## Whether this dialog option is valid. Note: this value isn't currently used as part of any meaningful validation checks.[br]

View File

@@ -1,8 +1,8 @@
diff --git a/addons/escoria-core/game/core-scripts/esc/compiler/esc_interpreter_factory.gd b/addons/escoria-core/game/core-scripts/esc/compiler/esc_interpreter_factory.gd
index 8e62f95e..bdb82e28 100644
index 4205f92d..26399e77 100644
--- a/addons/escoria-core/game/core-scripts/esc/compiler/esc_interpreter_factory.gd
+++ b/addons/escoria-core/game/core-scripts/esc/compiler/esc_interpreter_factory.gd
@@ -3,11 +3,11 @@ extends RefCounted
@@ -3,7 +3,7 @@ extends RefCounted
class_name ESCInterpreterFactory
@@ -10,13 +10,17 @@ index 8e62f95e..bdb82e28 100644
+var _interpreter: ESCInterpreter = null
## Produces an interpreter as a singleton.
## Produces an interpreter as a singleton.[br]
@@ -15,7 +15,7 @@ static var _interpreter: ESCInterpreter = null
## #### Returns[br]
## [br]
## Returns a `ESCInterpreter` value. (`ESCInterpreter`)
-static func create_interpreter() -> ESCInterpreter:
+func create_interpreter() -> ESCInterpreter:
if not _interpreter:
_interpreter = load("res://addons/escoria-core/game/core-scripts/esc/compiler/esc_interpreter.gd").new(ESCCompiler.load_commands(), ESCCompiler.load_globals())
return _interpreter
@@ -17,7 +17,7 @@ static func create_interpreter() -> ESCInterpreter:
@@ -25,7 +25,7 @@ static func create_interpreter() -> ESCInterpreter:
return _interpreter
@@ -26,10 +30,10 @@ index 8e62f95e..bdb82e28 100644
_interpreter.cleanup()
_interpreter = null
diff --git a/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd
index f541a172..27fe7a77 100644
index 28d867c3..d9f89017 100644
--- a/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd
+++ b/addons/escoria-core/game/core-scripts/esc/esc_action_manager.gd
@@ -650,7 +650,7 @@ func _telekinetic_applies_to(event: ESCGrammarStmts.Event) -> bool:
@@ -726,7 +726,7 @@ func _telekinetic_applies_to(event: ESCGrammarStmts.Event) -> bool:
var tk_flag_condition = event.get_flags_with_conditions().get("TK")
if tk_flag_condition:
@@ -39,10 +43,10 @@ index f541a172..27fe7a77 100644
var result = interpreter.look_up_global(tk_flag_condition.get_name())
diff --git a/addons/escoria-core/game/core-scripts/esc/esc_compiler.gd b/addons/escoria-core/game/core-scripts/esc/esc_compiler.gd
index e18bd512..aaaef9e6 100644
index c029f476..41536d39 100644
--- a/addons/escoria-core/game/core-scripts/esc/esc_compiler.gd
+++ b/addons/escoria-core/game/core-scripts/esc/esc_compiler.gd
@@ -101,7 +101,7 @@ func _compiler_shim(source: String, filename: String = "", associated_global_id:
@@ -123,7 +123,7 @@ func _compiler_shim(source: String, filename: String = "", associated_global_id:
# Some static analysis
if not had_error and _run_script_analysis():
@@ -52,10 +56,10 @@ index e18bd512..aaaef9e6 100644
if not filename.is_empty():
diff --git a/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd
index 2928a238..d6309c48 100644
index 78c992a0..6ee5381a 100644
--- a/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd
+++ b/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd
@@ -174,7 +174,7 @@ func _process(delta: float) -> void:
@@ -229,7 +229,7 @@ func _process(delta: float) -> void:
#var rc = _running_events[channel_name].run()
#escoria.interpreter.reset()
#var resolver: ESCResolver = ESCResolver.new(escoria.interpreter)
@@ -65,11 +69,11 @@ index 2928a238..d6309c48 100644
var event = _running_events[channel_name]
diff --git a/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd b/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd
index 0e05d94b..7b5a0fff 100644
index 1358239c..b91a3661 100644
--- a/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd
+++ b/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd
@@ -69,7 +69,7 @@ func is_valid() -> bool:
## *Returns* The return code of the statement.
@@ -107,7 +107,7 @@ func is_valid() -> bool:
## Returns a `int` value. (`int`)
func run() -> int:
if parsed_statements.size() > 0:
- var interpreter = ESCInterpreterFactory.create_interpreter()

View File

@@ -1,10 +1,10 @@
diff --git a/addons/escoria-core/game/core-scripts/esc/esc_inventory_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_inventory_manager.gd
index 4bb19343..fa8b939b 100644
index 7c550f2a..944aead7 100644
--- a/addons/escoria-core/game/core-scripts/esc/esc_inventory_manager.gd
+++ b/addons/escoria-core/game/core-scripts/esc/esc_inventory_manager.gd
@@ -11,7 +11,9 @@ class_name ESCInventoryManager
@@ -16,7 +16,9 @@ class_name ESCInventoryManager
## [br]
## **Returns** Whether the player has the inventory.
## Returns a `bool` value. (`bool`)
func inventory_has(item: String) -> bool:
- return escoria.globals_manager.has("i/%s" % item)
+ if not escoria.globals_manager.has("i/%s" % item):
@@ -12,4 +12,4 @@ index 4bb19343..fa8b939b 100644
+ return escoria.globals_manager.get_global("i/%s" % item)
## Get all inventory items.[br]
## Retrieves all inventory items.[br]

View File

@@ -1,8 +1,8 @@
diff --git a/addons/escoria-core/game/core-scripts/esc_item.gd b/addons/escoria-core/game/core-scripts/esc_item.gd
index 383c7d64..60a313ab 100644
index cbce2e51..3164579a 100644
--- a/addons/escoria-core/game/core-scripts/esc_item.gd
+++ b/addons/escoria-core/game/core-scripts/esc_item.gd
@@ -578,12 +578,12 @@ func get_animation_player() -> Node:
@@ -672,12 +672,12 @@ func get_animation_player() -> Node:
child is AnimationPlayer:
player_node_path = child.get_path()
if player_node_path.is_empty():

View File

@@ -1,16 +0,0 @@
diff --git a/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd b/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd
index 26463b49..29dac83e 100644
--- a/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd
+++ b/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd
@@ -236,3 +236,10 @@ func save_settings():
self,
"There was an issue writing settings %s" % save_path
)
+
+## Returns a custom setting by key or an optional default value. Returns null if not found and no default value is defined.
+func get_custom_setting(key: String, default_value = null):
+ if custom_settings.has(key):
+ return custom_settings.get(key)
+
+ return default_value
\ No newline at end of file

View File

@@ -1,21 +1,21 @@
diff --git a/addons/escoria-core/game/esc_inputs_manager.gd b/addons/escoria-core/game/esc_inputs_manager.gd
index c24588eb..b4b8a85d 100644
index 762da5ea..e2686e24 100644
--- a/addons/escoria-core/game/esc_inputs_manager.gd
+++ b/addons/escoria-core/game/esc_inputs_manager.gd
@@ -3,6 +3,9 @@
@@ -5,6 +5,9 @@
extends Resource
class_name ESCInputsManager
+## Emitted when input mode changes.
+signal input_mode_changed(new_mode)
+
## Valid input flags.[br]
## INPUT_ALL: All input is allowed.[br]
## INPUT_NONE: No input is allowed at all.[br]
@@ -22,7 +25,12 @@ const ESC_SHOW_DEBUG_PROMPT = "esc_show_debug_prompt"
const ESC_UI_PRIMARY_ACTION = "esc_ui_primary_action"
## The current input mode.
## Valid input flags[br]
## * INPUT_ALL: All input is allowed[br]
@@ -27,7 +30,12 @@ const ESC_UI_PRIMARY_ACTION = "esc_ui_primary_action"
## The current input mode
-var input_mode = INPUT_ALL
+var input_mode = INPUT_ALL:
+ get:
@@ -24,590 +24,5 @@ index c24588eb..b4b8a85d 100644
+ input_mode = new_mode
+ input_mode_changed.emit(new_mode)
## A LIFO stack of hovered items.
## A LIFO stack of hovered items
var hover_stack: HoverStack
@@ -46,12 +54,14 @@ var custom_input_handler = null
## The currently hovered element. Usually the one on top of the hover stack.
var _hovered_element = null
+
## Constructor.
func _init():
escoria.event_manager.connect("event_finished", Callable(self, "_on_event_finished"))
hover_stack = HoverStack.new()
hover_stack.connect("hover_stack_changed", Callable(self, "_on_hover_stack_changed"))
+
## Called when an event is finished, so that the current hotspot is reset.[br]
## [br]
## #### Parameters[br]
@@ -62,10 +72,12 @@ func _on_event_finished(return_code: int, event_name: String):
if _hovered_element == null:
hotspot_focused = ""
+
## Register core signals (from escoria.gd).
func register_core():
escoria.game_scene.request_pause_menu.connect(_on_pause_menu_requested)
+
## Connect the item signals to the local methods.[br]
## [br]
## #### Parameters[br]
@@ -78,6 +90,7 @@ func register_inventory_item(item: Node):
item.inventory_item_focused.connect(_on_mouse_entered_inventory_item)
item.inventory_item_unfocused.connect(_on_mouse_exited_inventory_item)
+
## Connect background signals to local methods.[br]
## [br]
## #### Parameters[br]
@@ -103,7 +116,7 @@ func register_background(background: ESCBackground):
## - is_default_state: Whether the current state is escoria.GAME_STATE.DEFAULT[br]
## - returns whether the function processed the event[br]
##[br]
-## `callback` is responsible for calling `get_tree().set_input_as_handled()`,
+## `callback` is responsible for calling `get_tree().set_input_as_handled()`,
## if appropriate.[br]
##[br]
## #### Parameters[br]
@@ -111,6 +124,7 @@ func register_background(background: ESCBackground):
func register_custom_input_handler(callback) -> void:
custom_input_handler = callback
+
## If a callback was specified via register_custom_input_handler(),[br]
## forwards the event to the callback and returns its result; otherwise,[br]
## returns false.[br]
@@ -127,6 +141,7 @@ func try_custom_input_handler(event: InputEvent, is_default_state: bool) -> bool
else:
return false
+
## Callback called by hover stack content change.
func _on_hover_stack_changed():
if hover_stack.is_empty():
@@ -134,6 +149,7 @@ func _on_hover_stack_changed():
else:
set_hovered_node(hover_stack.get_top_item())
+
## Sets the hovered node and calls its mouse_entered() method if it was the top[br]
## most item in hover_stack.[br]
## [br]
@@ -143,17 +159,20 @@ func _on_hover_stack_changed():
## [br]
## *Returns* True if item is the new top hovered object.[br]
func set_hovered_node(item: ESCItem) -> bool:
- if _hovered_element != item \
- and escoria.action_manager.is_object_actionable(item.global_id) \
- or (item is ESCPlayer and not (item as ESCPlayer).selectable):
+ if (
+ _hovered_element != item and escoria.action_manager.is_object_actionable(item.global_id)
+ or (item is ESCPlayer and not (item as ESCPlayer).selectable)
+ ):
_hovered_element = item
_hovered_element.mouse_entered()
return true
# If tested item was already hovered
# or is not actionable (not selectable for ESCPlayer) then do nothing
- if _hovered_element == item \
- or not escoria.action_manager.is_object_actionable(item.global_id) \
- or (item is ESCPlayer and not (item as ESCPlayer).selectable):
+ if (
+ _hovered_element == item
+ or not escoria.action_manager.is_object_actionable(item.global_id)
+ or (item is ESCPlayer and not (item as ESCPlayer).selectable)
+ ):
return true
if not is_instance_valid(_hovered_element) or hover_stack.get_top_item() != item:
_hovered_element = item
@@ -163,6 +182,7 @@ func set_hovered_node(item: ESCItem) -> bool:
else:
return false
+
## Unsets the hovered node.[br]
## [br]
## #### Parameters[br]
@@ -176,10 +196,12 @@ func unset_hovered_node(item: ESCItem):
_hovered_element = null
hotspot_focused = ""
+
## Background was hovered.
func _on_hover_bg() -> void:
escoria.main.current_scene.game.hovered_bg()
+
## The background was clicked with the LMB.[br]
## [br]
## #### Parameters[br]
@@ -188,12 +210,10 @@ func _on_hover_bg() -> void:
func _on_left_click_on_bg(position: Vector2) -> void:
if input_mode == INPUT_ALL:
hotspot_focused = ""
- escoria.logger.info(
- self,
- "Left click on background at %s." % str(position)
- )
+ escoria.logger.info(self, "Left click on background at %s." % str(position))
escoria.main.current_scene.game.left_click_on_bg(position)
+
## The background was double-clicked with the LMB.[br]
## [br]
## #### Parameters[br]
@@ -202,12 +222,10 @@ func _on_left_click_on_bg(position: Vector2) -> void:
func _on_double_left_click_on_bg(position: Vector2) -> void:
if input_mode == INPUT_ALL:
hotspot_focused = ""
- escoria.logger.info(
- self,
- "Double left click on background at %s." % str(position)
- )
+ escoria.logger.info(self, "Double left click on background at %s." % str(position))
escoria.main.current_scene.game.left_double_click_on_bg(position)
+
## The background was clicked with the RMB.[br]
## [br]
## #### Parameters[br]
@@ -215,12 +233,10 @@ func _on_double_left_click_on_bg(position: Vector2) -> void:
## - position: Position of the click.
func _on_right_click_on_bg(position: Vector2) -> void:
if input_mode == INPUT_ALL and hotspot_focused.is_empty():
- escoria.logger.info(
- self,
- "Right click on background at %s." % str(position)
- )
+ escoria.logger.info(self, "Right click on background at %s." % str(position))
escoria.main.current_scene.game.right_click_on_bg(position)
+
## An inventory item was clicked with the LMB.[br]
## [br]
## #### Parameters[br]
@@ -228,17 +244,11 @@ func _on_right_click_on_bg(position: Vector2) -> void:
## - inventory_item_global_id: The global id of the clicked inventory item.[br]
## - event: The input event received.
func _on_mouse_left_click_inventory_item(
- inventory_item_global_id: String,
- event: InputEvent
+ inventory_item_global_id: String, event: InputEvent
) -> void:
- escoria.logger.info(
- self,
- "Inventory item %s left clicked." % inventory_item_global_id
- )
- escoria.main.current_scene.game.left_click_on_inventory_item(
- inventory_item_global_id,
- event
- )
+ escoria.logger.info(self, "Inventory item %s left clicked." % inventory_item_global_id)
+ escoria.main.current_scene.game.left_click_on_inventory_item(inventory_item_global_id, event)
+
## An inventory item was clicked with the RMB.[br]
## [br]
@@ -247,19 +257,15 @@ func _on_mouse_left_click_inventory_item(
## - inventory_item_global_id: The global id of the clicked inventory item.[br]
## - event: The input event received.
func _on_mouse_right_click_inventory_item(
- inventory_item_global_id: String,
- event: InputEvent
+ inventory_item_global_id: String, event: InputEvent
) -> void:
if input_mode == INPUT_ALL:
- escoria.logger.info(
- self,
- "Inventory item %s right clicked." % inventory_item_global_id
- )
+ escoria.logger.info(self, "Inventory item %s right clicked." % inventory_item_global_id)
escoria.main.current_scene.game.right_click_on_inventory_item(
- inventory_item_global_id,
- event
+ inventory_item_global_id, event
)
+
## An inventory item was double-clicked with the LMB.[br]
## [br]
## #### Parameters[br]
@@ -267,41 +273,33 @@ func _on_mouse_right_click_inventory_item(
## - inventory_item_global_id: The global id of the clicked inventory item.[br]
## - event: The input event received.
func _on_mouse_double_left_click_inventory_item(
- inventory_item_global_id: String,
- event: InputEvent
+ inventory_item_global_id: String, event: InputEvent
) -> void:
if input_mode == INPUT_ALL:
escoria.logger.info(
- self,
- "Inventory item %s double left clicked." % inventory_item_global_id
+ self, "Inventory item %s double left clicked." % inventory_item_global_id
)
escoria.main.current_scene.game.left_double_click_on_inventory_item(
- inventory_item_global_id,
- event
+ inventory_item_global_id, event
)
+
## The mouse entered an inventory item.[br]
## [br]
## #### Parameters[br]
## [br]
## - inventory_item_global_id: The global id of the inventory item that is hovered.
func _on_mouse_entered_inventory_item(inventory_item_global_id: String) -> void:
- escoria.logger.info(
- self,
- "Inventory item %s focused." % inventory_item_global_id
- )
- escoria.main.current_scene.game.inventory_item_focused(
- inventory_item_global_id
- )
+ escoria.logger.info(self, "Inventory item %s focused." % inventory_item_global_id)
+ escoria.main.current_scene.game.inventory_item_focused(inventory_item_global_id)
+
## The mouse exited an inventory item.
func _on_mouse_exited_inventory_item() -> void:
- escoria.logger.info(
- self,
- "Inventory item unfocused."
- )
+ escoria.logger.info(self, "Inventory item unfocused.")
escoria.main.current_scene.game.inventory_item_unfocused()
+
## The mouse entered an Escoria item.[br]
## [br]
## #### Parameters[br]
@@ -310,8 +308,7 @@ func _on_mouse_exited_inventory_item() -> void:
func _on_mouse_entered_item(item: ESCItem) -> void:
if item as ESCPlayer and not (item as ESCPlayer).selectable:
escoria.logger.trace(
- self,
- "Ignoring mouse entering player %s: Player not selectable." % [item.global_id]
+ self, "Ignoring mouse entering player %s: Player not selectable." % [item.global_id]
)
if hover_stack.is_empty():
hotspot_focused = ""
@@ -322,20 +319,15 @@ func _on_mouse_entered_item(item: ESCItem) -> void:
return
if not escoria.action_manager.is_object_actionable(item.global_id):
- escoria.logger.debug(
- self,
- "Ignoring mouse entering item %s." % [item.global_id]
- )
+ escoria.logger.debug(self, "Ignoring mouse entering item %s." % [item.global_id])
return
- escoria.logger.info(
- self,
- "Item focused: %s" % item.global_id
- )
+ escoria.logger.info(self, "Item focused: %s" % item.global_id)
hotspot_focused = item.global_id
escoria.main.current_scene.game.element_focused(item.global_id)
+
## The mouse exited an Escoria item.[br]
## [br]
## #### Parameters[br]
@@ -350,14 +342,16 @@ func _on_mouse_exited_item(item: ESCItem) -> void:
if object and not object.interactive:
return
- if object and is_instance_valid(object.node) and object.node is ESCPlayer and not (object.node as ESCPlayer).selectable:
+ if (
+ object
+ and is_instance_valid(object.node)
+ and object.node is ESCPlayer
+ and not (object.node as ESCPlayer).selectable
+ ):
hotspot_focused = ""
return
- escoria.logger.info(
- self,
- "Item unfocused: %s" % hotspot_focused
- )
+ escoria.logger.info(self, "Item unfocused: %s" % hotspot_focused)
if hover_stack.is_empty():
hotspot_focused = ""
@@ -366,6 +360,7 @@ func _on_mouse_exited_item(item: ESCItem) -> void:
hotspot_focused = hover_stack.get_top_item().global_id
escoria.main.current_scene.game.element_focused(hotspot_focused)
+
## Function called when the item is set interactive, to re-trigger an input on[br]
## underlying item.[br]
## [br]
@@ -382,9 +377,12 @@ func on_item_non_interactive(item: ESCItem) -> void:
return
else:
var new_item = hover_stack.get_top_item()
- escoria.action_manager.set_action_input_state(ESCActionManager.ACTION_INPUT_STATE.AWAITING_VERB_OR_ITEM)
+ escoria.action_manager.set_action_input_state(
+ ESCActionManager.ACTION_INPUT_STATE.AWAITING_VERB_OR_ITEM
+ )
new_item.mouse_entered()
+
## An Escoria item was clicked with the LMB.[br]
## [br]
## #### Parameters[br]
@@ -396,34 +394,32 @@ func _on_mouse_left_clicked_item(item: ESCItem, event: InputEvent) -> void:
# Manage clicking through ESCPlayer (if ESCPlayer.selectable is false)
if item as ESCPlayer and not (item as ESCPlayer).selectable:
escoria.logger.trace(
- self,
- "Ignoring left click on player %s: Player not selectable."
- % [item.global_id]
+ self, "Ignoring left click on player %s: Player not selectable." % [item.global_id]
)
# Get next object in hover stack and forward event to it
if not hover_stack.is_empty():
var next_item = hover_stack.pop_top_item()
_on_mouse_left_clicked_item(next_item, event)
- else: # if no next object, consider this click as background click
+ else: # if no next object, consider this click as background click
hotspot_focused = ""
_on_left_click_on_bg(event.position)
return
# Clicked object can't be actioned and there is no other object behind
# We consider this click as a background click
- if not escoria.action_manager.is_object_actionable(item.global_id) \
- and hover_stack.is_empty():
+ if (
+ not escoria.action_manager.is_object_actionable(item.global_id)
+ and hover_stack.is_empty()
+ ):
hotspot_focused = ""
_on_left_click_on_bg(event.position)
return
# Finally, execute the action on the ESCItem
hotspot_focused = item.global_id
- escoria.main.current_scene.game.left_click_on_item(
- item.global_id,
- event
- )
+ escoria.main.current_scene.game.left_click_on_item(item.global_id, event)
+
## An Escoria item was double-clicked with the LMB.[br]
## [br]
@@ -431,42 +427,38 @@ func _on_mouse_left_clicked_item(item: ESCItem, event: InputEvent) -> void:
## [br]
## - item: The Escoria item clicked.[br]
## - event: The input event from the click.
-func _on_mouse_left_double_clicked_item(
- item: ESCItem,
- event: InputEvent
-) -> void:
+func _on_mouse_left_double_clicked_item(item: ESCItem, event: InputEvent) -> void:
if input_mode == INPUT_ALL:
# Manage clicking through ESCPlayer (if ESCPlayer.selectable is false)
if item as ESCPlayer and not (item as ESCPlayer).selectable:
escoria.logger.trace(
self,
- "Ignoring double left click on player %s: Player not selectable."
- % [item.global_id]
+ "Ignoring double left click on player %s: Player not selectable." % [item.global_id]
)
# Get next object in hover stack and forward event to it
if not hover_stack.is_empty():
var next_item = hover_stack.pop_top_item()
_on_mouse_left_double_clicked_item(next_item, event)
- else: # if no next object, consider this click as background click
+ else: # if no next object, consider this click as background click
hotspot_focused = ""
_on_double_left_click_on_bg(event.position)
return
# Clicked object can't be actioned and there is no other object behind
# We consider this click as a background click
- if not escoria.action_manager.is_object_actionable(item.global_id) \
- and hover_stack.is_empty():
+ if (
+ not escoria.action_manager.is_object_actionable(item.global_id)
+ and hover_stack.is_empty()
+ ):
hotspot_focused = ""
_on_double_left_click_on_bg(event.position)
return
# Finally, execute the action on the ESCItem
hotspot_focused = item.global_id
- escoria.main.current_scene.game.left_double_click_on_item(
- item.global_id,
- event
- )
+ escoria.main.current_scene.game.left_double_click_on_item(item.global_id, event)
+
## An Escoria item was clicked with the RMB.[br]
## [br]
@@ -478,8 +470,7 @@ func _on_mouse_right_clicked_item(item: ESCItem, event: InputEvent) -> void:
if input_mode == INPUT_ALL:
if item as ESCPlayer and not (item as ESCPlayer).selectable:
escoria.logger.debug(
- self,
- "Ignoring right click on player %s: Player not selectable." % [item.global_id]
+ self, "Ignoring right click on player %s: Player not selectable." % [item.global_id]
)
if not hover_stack.is_empty():
@@ -487,9 +478,11 @@ func _on_mouse_right_clicked_item(item: ESCItem, event: InputEvent) -> void:
_on_mouse_right_clicked_item(next_item, event)
return
- if not escoria.action_manager.is_object_actionable(item.global_id) \
- and hover_stack.is_empty():
- # Treat this as a background click now
+ if (
+ not escoria.action_manager.is_object_actionable(item.global_id)
+ and hover_stack.is_empty()
+ ):
+ # Treat this as a background click now
hotspot_focused = ""
_on_right_click_on_bg(event.position)
return
@@ -508,22 +501,27 @@ func _on_mouse_right_clicked_item(item: ESCItem, event: InputEvent) -> void:
if event.position:
(escoria.main.current_scene.game as ESCGame).right_click_on_bg(event.position)
else:
- escoria.logger.info(
- self,
- "Clicked item %s with event %s cannot be activated (player not selectable or not interactive).\n"
- % [item.global_id, event] +
- "No valid item found in the items stack. Action canceled."
+ (
+ escoria
+ . logger
+ . info(
+ self,
+ (
+ (
+ "Clicked item %s with event %s cannot be activated (player not selectable or not interactive).\n"
+ % [item.global_id, event]
+ )
+ + "No valid item found in the items stack. Action canceled."
+ )
+ )
)
else:
escoria.logger.info(
- self,
- "Item %s right clicked with event %s." % [actual_item.global_id, event]
+ self, "Item %s right clicked with event %s." % [actual_item.global_id, event]
)
hotspot_focused = actual_item.global_id
- escoria.main.current_scene.game.right_click_on_item(
- actual_item.global_id,
- event
- )
+ escoria.main.current_scene.game.right_click_on_item(actual_item.global_id, event)
+
## The mousewheel was turned.[br]
## [br]
@@ -533,13 +531,14 @@ func _on_mouse_right_clicked_item(item: ESCItem, event: InputEvent) -> void:
func _on_mousewheel_action(direction: int):
escoria.main.current_scene.game.mousewheel_action(direction)
+
## Event when the pause menu was requested.
func _on_pause_menu_requested():
escoria.main.current_scene.game.pause_game()
+
## Hover Stack implementation.
class HoverStack:
-
## Emitted when the content of the hover stack has changed.
signal hover_stack_changed
@@ -562,7 +561,6 @@ class HoverStack:
_sort()
hover_stack_changed.emit()
-
## Add the items contained in given list to the stack if not already in it.[br]
## [br]
## #### Parameters[br]
@@ -573,7 +571,6 @@ class HoverStack:
if escoria.action_manager.is_object_actionable(item.global_id):
add_item(item)
-
## Clean the hover stack.
func clean():
for e in hover_stack:
@@ -581,7 +578,6 @@ class HoverStack:
hover_stack.erase(e)
hover_stack_changed.emit()
-
## Pops the top element of the hover stack and returns it.[br]
## [br]
## *Returns* The top element of the hover stack.
@@ -591,14 +587,12 @@ class HoverStack:
hover_stack_changed.emit()
return ret
-
## Returns the top element of the hover stack.[br]
## [br]
## *Returns* The top element of the hover stack.
func get_top_item():
return hover_stack.back()
-
## Remove the given item from the stack.[br]
## [br]
## #### Parameters[br]
@@ -610,25 +604,21 @@ class HoverStack:
_sort()
hover_stack_changed.emit()
-
## Clear the stack of hovered items.
func clear():
hover_stack = []
hover_stack_emptied.emit()
-
## Returns true if the hover stack is empty, else false.[br]
## [br]
## *Returns* True if hover stack is empty, else false.
func is_empty() -> bool:
return hover_stack.is_empty()
-
## Sort the hover stack by items' z-index.
func _sort():
hover_stack.sort_custom(Callable(HoverStackSorter, "sort_ascending_z_index"))
-
## Returns true if the hover stack contains the given item.[br]
## [br]
## #### Parameters[br]
@@ -639,7 +629,6 @@ class HoverStack:
func has(item) -> bool:
return hover_stack.has(item)
-
## Returns the hover stack array.
## [br]
## *Returns* The hover stack array.

View File

@@ -0,0 +1,370 @@
diff --git a/README.md b/README.md
index fd3d3e60..5e57540a 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,10 @@ This is the demo game that acts as a testing ground for future Escoria developme
* “Mystical Ocean Puzzle Game” (Licence CC-BY 4.0)
by Eric Matyas
www.soundimage.org
-
+* "Ambient bird sounds"
+ License: CC0
+ [https://freesound.org/people/Garuda1982/sounds/691629/](https://freesound.org/people/Garuda1982/sounds/691629/)
+
## Cursors
* Pointers part 4 by "yd"
diff --git a/addons/escoria-core/buses/default_bus_layout.tres b/addons/escoria-core/buses/default_bus_layout.tres
index 6ff12e0a..90726934 100644
--- a/addons/escoria-core/buses/default_bus_layout.tres
+++ b/addons/escoria-core/buses/default_bus_layout.tres
@@ -19,3 +19,9 @@ bus/3/mute = false
bus/3/bypass_fx = false
bus/3/volume_db = 0.0
bus/3/send = &"Master"
+bus/4/name = &"Ambient"
+bus/4/solo = false
+bus/4/mute = false
+bus/4/bypass_fx = false
+bus/4/volume_db = 0.0
+bus/4/send = &"Master"
diff --git a/addons/escoria-core/game/core-scripts/esc/esc_object_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_object_manager.gd
index 8d1c7c1c..047fcabb 100644
--- a/addons/escoria-core/game/core-scripts/esc/esc_object_manager.gd
+++ b/addons/escoria-core/game/core-scripts/esc/esc_object_manager.gd
@@ -16,11 +16,15 @@ const SOUND = "_sound"
## Reserved speech player object.
const SPEECH = "_speech"
+## Reserved ambient player object.
+const AMBIENT = "_ambient"
+
## Array of objects that are reserved and automatically created when Escoria starts up.
const RESERVED_OBJECTS = [
MUSIC,
SOUND,
SPEECH,
+ AMBIENT,
]
@@ -489,7 +493,7 @@ func save_game(p_savegame: ESCSaveGame) -> void:
p_savegame.objects[room_obj.room_global_id] = room_objects_dict
- # Add in reserved objects (music, speech, sound), too.
+ # Add in reserved objects (music, speech, sound, ambient), too.
var reserved_objects: Dictionary = reserved_objects_container.objects
for obj_global_id in reserved_objects:
if not reserved_objects[obj_global_id] is ESCObject:
diff --git a/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd b/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd
index 76df48b1..64d3596b 100644
--- a/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd
+++ b/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd
@@ -192,7 +192,7 @@ func get_save_data() -> Dictionary:
if self.node.has_method("get_custom_data"):
save_data["custom_data"] = self.node.get_custom_data()
- if self.global_id in ["_music", "_sound"] and self.node.get("state"):
+ if self.global_id in ["_music", "_sound", "_ambient"] and self.node.get("state"):
save_data["state"] = self.node.get("state")
save_data["playback_position"] = self.node.get_playback_position()
diff --git a/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd b/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd
index 9117d0ec..1df5a43e 100644
--- a/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd
+++ b/addons/escoria-core/game/core-scripts/save_data/esc_savesettings.gd
@@ -37,6 +37,10 @@ class_name ESCSaveSettings
## Speech volume only.
@export var speech_volume: float = ProjectSettings.get_setting(
"escoria/sound/speech_volume")
+
+## Ambient volume only.
+@export var ambient_volume: float = ProjectSettings.get_setting(
+ "escoria/sound/ambient_volume")
## True if game has to be fullscreen.
@export var fullscreen: bool = ProjectSettings.get_setting(
diff --git a/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd b/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd
index 722f409e..23a9f855 100644
--- a/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd
+++ b/addons/escoria-core/game/core-scripts/save_data/esc_settings_manager.gd
@@ -77,6 +77,14 @@ func apply_settings() -> void:
)
)
)
+ AudioServer.set_bus_volume_db(
+ AudioServer.get_bus_index(escoria.BUS_AMBIENT),
+ linear_to_db(
+ ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.AMBIENT_VOLUME
+ )
+ )
+ )
var mode = Window.MODE_EXCLUSIVE_FULLSCREEN if ESCProjectSettingsManager.get_setting(ESCProjectSettingsManager.FULLSCREEN) else Window.MODE_WINDOWED
DisplayServer.window_set_mode(mode)
@@ -130,6 +138,10 @@ func save_settings_resource_to_project_settings(settings: ESCSaveSettings):
ESCProjectSettingsManager.SPEECH_VOLUME,
settings.speech_volume
)
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.AMBIENT_VOLUME,
+ settings.ambient_volume
+ )
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.FULLSCREEN,
settings.fullscreen
@@ -196,6 +208,9 @@ func get_settings() -> ESCSaveSettings:
settings.speech_volume = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.SPEECH_VOLUME
)
+ settings.ambient_volume = ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.AMBIENT_VOLUME
+ )
settings.fullscreen = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.WINDOW_MODE
) in [DisplayServer.WINDOW_MODE_FULLSCREEN, DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN]
@@ -278,3 +293,10 @@ func save_settings():
self,
"There was an issue writing settings %s" % save_path
)
+
+## Returns a custom setting by key or an optional default value. Returns null if not found and no default value is defined.
+func get_custom_setting(key: String, default_value = null):
+ if custom_settings.has(key):
+ return custom_settings.get(key)
+
+ return default_value
\ No newline at end of file
diff --git a/addons/escoria-core/game/esc_autoload.gd b/addons/escoria-core/game/esc_autoload.gd
index 24b14687..1a224469 100644
--- a/addons/escoria-core/game/esc_autoload.gd
+++ b/addons/escoria-core/game/esc_autoload.gd
@@ -2,6 +2,14 @@ extends Node
## This is Escoria's singleton script.
## It holds accessors to some utils, such as Escoria's logger.
+## Signal sent when Escoria starts a new game[br]
+## [br]
+## #### Parameters[br]
+## [br]
+## None.
+## [br]
+signal new_game_started
+
## Signal sent when Escoria is paused[br]
## [br]
## #### Parameters[br]
@@ -45,6 +53,9 @@ const BUS_MUSIC = "Music"
## Speech audio bus
const BUS_SPEECH = "Speech"
+## Ambient sound audio bus
+const BUS_AMBIENT = "Ambient"
+
# Path to camera scene
const CAMERA_SCENE_PATH = "res://addons/escoria-core/game/scenes/camera_player/camera.tscn"
@@ -218,6 +229,7 @@ func set_game_paused(p_paused: bool):
## Returns nothing.
func new_game():
get_escoria().new_game()
+ new_game_started.emit()
## Called from main menu's "quit" button.[br]
## [br]
diff --git a/addons/escoria-core/game/esc_project_settings_manager.gd b/addons/escoria-core/game/esc_project_settings_manager.gd
index 1e0bee53..3a2b10be 100644
--- a/addons/escoria-core/game/esc_project_settings_manager.gd
+++ b/addons/escoria-core/game/esc_project_settings_manager.gd
@@ -89,6 +89,8 @@ const SPEECH_EXTENSION = _ESCORIA_SETTINGS_ROOT + "/" + _SOUND_ROOT + "/" + "spe
const SPEECH_FOLDER = _ESCORIA_SETTINGS_ROOT + "/" + _SOUND_ROOT + "/" + "speech_folder"
## Path to the speech volume setting.
const SPEECH_VOLUME = _ESCORIA_SETTINGS_ROOT + "/" + _SOUND_ROOT + "/" + "speech_volume"
+## Path to the ambient volume setting.
+const AMBIENT_VOLUME = _ESCORIA_SETTINGS_ROOT + "/" + _SOUND_ROOT + "/" + "ambient_volume"
## Platform-related Escoria project settings root.
const _PLATFORM_ROOT = "platform"
diff --git a/addons/escoria-core/game/main.tscn b/addons/escoria-core/game/main.tscn
index 66e7755b..60f548b5 100644
--- a/addons/escoria-core/game/main.tscn
+++ b/addons/escoria-core/game/main.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=6 format=3 uid="uid://dwlr0gu4erswn"]
+[gd_scene load_steps=7 format=3 uid="uid://dwlr0gu4erswn"]
[ext_resource type="Script" uid="uid://cgvex4ltwyld6" path="res://addons/escoria-core/game/main.gd" id="1"]
[ext_resource type="PackedScene" uid="uid://b0q36us3uuimq" path="res://addons/escoria-core/game/scenes/esc_prompt/esc_prompt_popup.tscn" id="2"]
[ext_resource type="PackedScene" uid="uid://c1txn45mpksqd" path="res://addons/escoria-core/game/scenes/sound/esc_music_player.tscn" id="3"]
[ext_resource type="PackedScene" uid="uid://uwqpnwjmp6aq" path="res://addons/escoria-core/game/scenes/sound/esc_sound_player.tscn" id="5"]
[ext_resource type="PackedScene" uid="uid://c8ecyitwga1dx" path="res://addons/escoria-core/game/scenes/sound/esc_speech_player.tscn" id="6"]
+[ext_resource type="PackedScene" uid="uid://wsdpiju6bxqd" path="res://addons/escoria-core/game/scenes/sound/esc_ambient_player.tscn" id="6_sy38t"]
[node name="main" type="Node"]
script = ExtResource("1")
@@ -41,3 +42,11 @@ layout_mode = 3
anchors_preset = 15
grow_horizontal = 2
grow_vertical = 2
+
+[node name="bg_ambient" parent="." instance=ExtResource("6_sy38t")]
+layout_mode = 3
+anchors_preset = 15
+offset_right = 0.0
+offset_bottom = 0.0
+grow_horizontal = 2
+grow_vertical = 2
diff --git a/addons/escoria-core/game/scenes/sound/esc_sound_player.gd b/addons/escoria-core/game/scenes/sound/esc_sound_player.gd
index 05f839a8..2a9fa64c 100644
--- a/addons/escoria-core/game/scenes/sound/esc_sound_player.gd
+++ b/addons/escoria-core/game/scenes/sound/esc_sound_player.gd
@@ -2,7 +2,7 @@
extends Control
class_name ESCSoundPlayer
-## Global id of the background sound player.
+## Global id of the sfx sound player.
@export var global_id: String = "_sound"
## The state of the sound player. "default" or "off" disable sound. Any other
diff --git a/addons/escoria-core/game/scenes/sound/esc_speech_player.gd b/addons/escoria-core/game/scenes/sound/esc_speech_player.gd
index 74e2ceb8..31fc6681 100644
--- a/addons/escoria-core/game/scenes/sound/esc_speech_player.gd
+++ b/addons/escoria-core/game/scenes/sound/esc_speech_player.gd
@@ -2,7 +2,7 @@
extends Control
class_name ESCSpeechPlayer
-## Global id of the background music player.
+## Global id of the speech player.
@export var global_id: String = "_speech"
## Reference to the audio player.
diff --git a/addons/escoria-core/ui_library/menus/options/options.gd b/addons/escoria-core/ui_library/menus/options/options.gd
index 2ba85861..32a97586 100644
--- a/addons/escoria-core/ui_library/menus/options/options.gd
+++ b/addons/escoria-core/ui_library/menus/options/options.gd
@@ -61,6 +61,7 @@ func initialize_options(p_settings):
_options.get_node("sound_volume").value = p_settings["sfx_volume"]
_options.get_node("music_volume").value = p_settings["music_volume"]
_options.get_node("speech_volume").value = p_settings["speech_volume"]
+ _options.get_node("ambient_volume").value = p_settings["ambient_volume"]
_options.get_node("fullscreen").set_pressed_no_signal(p_settings["fullscreen"])
@@ -142,6 +143,21 @@ func _on_speech_volume_value_changed(value: float) -> void:
escoria.settings_manager.apply_settings()
changed = true
+# Ambient volume was changed
+#
+# #### Parameters
+# - value: The new volume level
+func _on_ambient_volume_value_changed(value: float) -> void:
+ if ESCProjectSettingsManager.get_setting(
+ ESCProjectSettingsManager.AMBIENT_VOLUME
+ ) != value:
+ ESCProjectSettingsManager.set_setting(
+ ESCProjectSettingsManager.AMBIENT_VOLUME,
+ value
+ )
+ escoria.settings_manager.apply_settings()
+ changed = true
+
# Fullscreen was changed
#
diff --git a/addons/escoria-core/ui_library/menus/options/options.tscn b/addons/escoria-core/ui_library/menus/options/options.tscn
index cbcab577..133315cf 100644
--- a/addons/escoria-core/ui_library/menus/options/options.tscn
+++ b/addons/escoria-core/ui_library/menus/options/options.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=3 format=3 uid="uid://bhcfnds3yy2yv"]
-[ext_resource type="Texture2D" uid="uid://gwy5bljr0ik1" path="res://addons/escoria-core/ui_library/menus/options/flags/de.png" id="1"]
+[ext_resource type="Texture2D" uid="uid://r6b3dp6ipv5k" path="res://addons/escoria-core/ui_library/menus/options/flags/de.png" id="1"]
[ext_resource type="Script" uid="uid://btyrwps5h2qn7" path="res://addons/escoria-core/ui_library/menus/options/options.gd" id="4"]
[node name="options" type="Control"]
@@ -98,6 +98,16 @@ step = 0.001
[node name="label6" type="Label" parent="VBoxContainer/MarginContainer/options"]
layout_mode = 2
+text = "AMBIENT_VOLUME"
+
+[node name="ambient_volume" type="HSlider" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
+size_flags_horizontal = 3
+max_value = 1.0
+step = 0.001
+
+[node name="label7" type="Label" parent="VBoxContainer/MarginContainer/options"]
+layout_mode = 2
text = "FULLSCREEN"
[node name="fullscreen" type="CheckBox" parent="VBoxContainer/MarginContainer/options"]
@@ -120,6 +130,7 @@ text = "APPLY"
[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/sound_volume" to="." method="_on_sound_volume_changed"]
[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/music_volume" to="." method="_on_music_volume_changed"]
[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/speech_volume" to="." method="_on_speech_volume_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/MarginContainer/options/ambient_volume" to="." method="_on_ambient_volume_value_changed"]
[connection signal="toggled" from="VBoxContainer/MarginContainer/options/fullscreen" to="." method="_on_fullscreen_toggled"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/back" to="." method="_on_back_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/apply" to="." method="_on_apply_pressed"]
diff --git a/game/rooms/room04/esc/left_exit.esc b/game/rooms/room04/esc/left_exit.esc
index a5fe6648..bd0a2aa5 100644
--- a/game/rooms/room04/esc/left_exit.esc
+++ b/game/rooms/room04/esc/left_exit.esc
@@ -1,4 +1,5 @@
:exit_scene
+ stop_snd(_ambient)
change_scene("res://game/rooms/room03/room03.tscn")
:look
diff --git a/game/rooms/room04/esc/right_exit.esc b/game/rooms/room04/esc/right_exit.esc
index 20d5cd16..658ff435 100644
--- a/game/rooms/room04/esc/right_exit.esc
+++ b/game/rooms/room04/esc/right_exit.esc
@@ -1,2 +1,3 @@
:exit_scene
+ stop_snd(_ambient)
change_scene("res://game/rooms/room05/room05.tscn")
diff --git a/game/rooms/room04/esc/room04.esc b/game/rooms/room04/esc/room04.esc
index 6545739b..4e281146 100644
--- a/game/rooms/room04/esc/room04.esc
+++ b/game/rooms/room04/esc/room04.esc
@@ -1,6 +1,8 @@
:setup
global r4_door_look_count = 0
+ play_snd("res://game/sfx/sounds/birds_ambient_loop.ogg", _ambient)
+
if ESC_LAST_SCENE == "room3":
teleport($player, $l_exit)
# Set player look right
diff --git a/game/translations/main_menu.csv b/game/translations/main_menu.csv
index fae9a28a..9e51686f 100644
--- a/game/translations/main_menu.csv
+++ b/game/translations/main_menu.csv
@@ -11,6 +11,7 @@ GENERAL_VOLUME,General,Général,Allgemein,General
MUSIC_VOLUME,Music,Musique,Musik,Música
SOUND_VOLUME,Sound effects,Effets sonores,Soundeffekte,Efectos de sonido
SPEECH_VOLUME,Speech,Voix,Sprachausgabe,Voz
+AMBIENT_VOLUME,Ambient,Ambiance,Atmosphäre,Ambiente
FULLSCREEN,Fullscreen,Plein écran,Vollbild,Pantalla completa
CANCEL,Cancel,Annuler,Abbrechen,Cancelar
OK,OK,Ok,Ok,Ok
diff --git a/project.godot b/project.godot
index 742cd758..37462240 100644
--- a/project.godot
+++ b/project.godot
@@ -74,6 +74,7 @@ sound/sfx_volume=1
sound/speech_volume=1
sound/speech_folder="res://game/speech"
sound/speech_extension="ogg"
+sound/ambient_volume=1
platform/skip_cache=false
platform/skip_cache.mobile=true
sound/speech_enabled=1

220
platform/web/full-size.html Normal file
View File

@@ -0,0 +1,220 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0">
<title>$GODOT_PROJECT_NAME</title>
<style>
html, body, #canvas {
margin: 0;
padding: 0;
border: 0;
}
body {
color: white;
background-color: black;
overflow: hidden;
touch-action: none;
}
#canvas {
display: block;
}
#canvas:focus {
outline: none;
}
#status, #status-splash, #status-progress {
position: absolute;
left: 0;
right: 0;
}
#status, #status-splash {
top: 0;
bottom: 0;
}
#status {
background-color: $GODOT_SPLASH_COLOR;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
visibility: hidden;
}
#status-splash {
max-height: 100%;
max-width: 100%;
margin: auto;
}
#status-splash.show-image--false {
display: none;
}
#status-splash.fullsize--true {
height: 100%;
width: 100%;
object-fit: contain;
}
#status-splash.use-filter--false {
image-rendering: pixelated;
}
#status-progress, #status-notice {
display: none;
}
#status-progress {
bottom: 10%;
width: 50%;
margin: 0 auto;
}
#status-notice {
background-color: #5b3943;
border-radius: 0.5rem;
border: 1px solid #9b3943;
color: #e0e0e0;
font-family: 'Noto Sans', 'Droid Sans', Arial, sans-serif;
line-height: 1.3;
margin: 0 2rem;
overflow: hidden;
padding: 1rem;
text-align: center;
z-index: 1;
}
</style>
$GODOT_HEAD_INCLUDE
</head>
<body>
<canvas id="canvas">
Your browser does not support the canvas tag.
</canvas>
<noscript>
Your browser does not support JavaScript.
</noscript>
<div id="status">
<img id="status-splash" class="$GODOT_SPLASH_CLASSES" src="$GODOT_SPLASH" alt="">
<progress id="status-progress"></progress>
<div id="status-notice"></div>
</div>
<script src="$GODOT_URL"></script>
<script>
const GODOT_CONFIG = $GODOT_CONFIG;
const GODOT_THREADS_ENABLED = $GODOT_THREADS_ENABLED;
const engine = new Engine(GODOT_CONFIG);
(function () {
const statusOverlay = document.getElementById('status');
const statusProgress = document.getElementById('status-progress');
const statusNotice = document.getElementById('status-notice');
let initializing = true;
let statusMode = '';
function setStatusMode(mode) {
if (statusMode === mode || !initializing) {
return;
}
if (mode === 'hidden') {
statusOverlay.remove();
initializing = false;
return;
}
statusOverlay.style.visibility = 'visible';
statusProgress.style.display = mode === 'progress' ? 'block' : 'none';
statusNotice.style.display = mode === 'notice' ? 'block' : 'none';
statusMode = mode;
}
function setStatusNotice(text) {
while (statusNotice.lastChild) {
statusNotice.removeChild(statusNotice.lastChild);
}
const lines = text.split('\n');
lines.forEach((line) => {
statusNotice.appendChild(document.createTextNode(line));
statusNotice.appendChild(document.createElement('br'));
});
}
function displayFailureNotice(err) {
console.error(err);
if (err instanceof Error) {
setStatusNotice(err.message);
} else if (typeof err === 'string') {
setStatusNotice(err);
} else {
setStatusNotice('An unknown error occurred.');
}
setStatusMode('notice');
initializing = false;
}
const missing = Engine.getMissingFeatures({
threads: GODOT_THREADS_ENABLED,
});
if (missing.length !== 0) {
if (GODOT_CONFIG['serviceWorker'] && GODOT_CONFIG['ensureCrossOriginIsolationHeaders'] && 'serviceWorker' in navigator) {
let serviceWorkerRegistrationPromise;
try {
serviceWorkerRegistrationPromise = navigator.serviceWorker.getRegistration();
} catch (err) {
serviceWorkerRegistrationPromise = Promise.reject(new Error('Service worker registration failed.'));
}
// There's a chance that installing the service worker would fix the issue
Promise.race([
serviceWorkerRegistrationPromise.then((registration) => {
if (registration != null) {
// MODIFIED FOR RTMI-UI
// return Promise.reject(new Error('Service worker already exists.'));
window.location.reload();
// END MODIFIED FOR RTMI-UI
}
return registration;
}).then(() => engine.installServiceWorker()),
// For some reason, `getRegistration()` can stall
new Promise((resolve) => {
setTimeout(() => resolve(), 2000);
}),
]).then(() => {
// Reload if there was no error.
window.location.reload();
}).catch((err) => {
console.error('Error while registering service worker:', err);
});
} else {
// Display the message as usual
const missingMsg = 'Error\nThe following features required to run Godot projects on the Web are missing:\n';
displayFailureNotice(missingMsg + missing.join('\n'));
}
} else {
setStatusMode('progress');
engine.startGame({
'onProgress': function (current, total) {
if (current > 0 && total > 0) {
statusProgress.value = current;
statusProgress.max = total;
} else {
statusProgress.removeAttribute('value');
statusProgress.removeAttribute('max');
}
},
}).then(() => {
setStatusMode('hidden');
}, displayFailureNotice);
}
}());
</script>
</body>
</html>

View File

@@ -8,13 +8,13 @@ escoria_version = "1.0.0"
game_version = "Local"
name = "post-intro"
date = {
"day": 9,
"day": 12,
"dst": false,
"hour": 14,
"minute": 27,
"hour": 0,
"minute": 22,
"month": 11,
"second": 30,
"weekday": 0,
"second": 58,
"weekday": 3,
"year": 2025
}
main = {
@@ -50,16 +50,10 @@ globals = {
}
inventory = ["turno_cocina_frontal", "turno_cocina_libro_de_cocina"]
objects = {
"_ambient": {
"active": true,
"interactive": true,
"playback_position": 4.716553,
"state": "res://gymkhana/sounds/birds_ambient_loop.ogg"
},
"_music": {
"active": true,
"interactive": true,
"playback_position": 7.9789567,
"playback_position": 9.395374,
"state": "res://gymkhana/sounds/pause_menu_loop.ogg"
},
"_sound": {
@@ -260,7 +254,7 @@ settings = {
"custom_settings": {
"clear_text_by_click_only": false,
"slow_text_mode": false,
"video_subtitles": false
"video_subtitles": true
},
"escoria_version": "1.0.0",
"fullscreen": false,
@@ -269,7 +263,7 @@ settings = {
"sfx_volume": 1.0,
"speech_enabled": true,
"speech_volume": 1.0,
"text_lang": "es",
"text_lang": "en",
"voice_lang": "es_ES"
}
custom_data = {

View File

@@ -8,13 +8,13 @@ escoria_version = "1.0.0"
game_version = "Local"
name = "con ajo"
date = {
"day": 2,
"day": 12,
"dst": false,
"hour": 2,
"minute": 32,
"hour": 0,
"minute": 28,
"month": 11,
"second": 33,
"weekday": 0,
"second": 52,
"weekday": 3,
"year": 2025
}
main = {
@@ -23,7 +23,6 @@ main = {
}
globals = {
"ESC_CURRENT_SCENE": "cocina_delante",
"ESC_DIALOG_CHOSEN_OPTION": "Ya he hecho las lentejas!",
"ESC_LAST_SCENE": "cocina",
"FORCE_LAST_SCENE_NULL": false,
"_COUNT_turno_cocina_patata": 4,
@@ -40,12 +39,13 @@ globals = {
"turno_cocina_carton_encendido_picked": true,
"turno_cocina_carton_picked": true,
"turno_cocina_cocina_gas_encendida": false,
"turno_cocina_cuchillo_en_su_sitio": false,
"turno_cocina_cuchillo_picked": true,
"turno_cocina_cuerno_picked": true,
"turno_cocina_economica_con_madera": true,
"turno_cocina_economica_con_olla": true,
"turno_cocina_economica_encendida": true,
"turno_cocina_eneko_cata_ok": false,
"turno_cocina_eneko_cata_ok": true,
"turno_cocina_eneko_catando": false,
"turno_cocina_frontal_debajo_sofa": true,
"turno_cocina_frontal_entregado": false,
@@ -56,7 +56,6 @@ globals = {
"turno_cocina_ingrediente_patatas": true,
"turno_cocina_ingrediente_romero": false,
"turno_cocina_libro_de_cocina_picked": true,
"turno_cocina_libro_leido_count": 0.0,
"turno_cocina_madera_picked": true,
"turno_cocina_mechero_picked": true,
"turno_cocina_mikel_played_times": 0.0,
@@ -76,17 +75,11 @@ globals = {
}
inventory = ["turno_cocina_cuchillo", "turno_cocina_cuerno", "turno_cocina_frontal", "turno_cocina_libro_de_cocina", "turno_cocina_mechero", "turno_cocina_pegatina"]
objects = {
"_ambient": {
"active": true,
"interactive": true,
"playback_position": 7.0617685,
"state": "res://gymkhana/sounds/birds_ambient_loop.ogg"
},
"_music": {
"active": true,
"interactive": true,
"playback_position": 9.000635,
"state": "res://gymkhana/sounds/intro_menu_loop.ogg"
"playback_position": 7.6190476,
"state": "res://gymkhana/sounds/pause_menu_loop.ogg"
},
"_sound": {
"active": true,
@@ -112,7 +105,7 @@ objects = {
"interactive": true,
"state": "default"
},
"turno_cocina_bol_lentejas": {
"turno_cocina_carton_encendido": {
"active": true,
"custom_data": {
"tooltips": {
@@ -139,20 +132,30 @@ objects = {
"interactive": true,
"state": "default"
},
"turno_cocina_frontal": {
"active": true,
"turno_cocina_mechero": {
"active": false,
"custom_data": {
"tooltips": {
"action3": "tooltip_frontal_action3",
"action4": "tooltip_frontal_action4"
"action1": "tooltip_common_look",
"action2": "tooltip_common_pick",
"action3": "tooltip_common_look",
"action4": "tooltip_common_use"
}
},
"interactive": true,
"state": "default"
},
"turno_cocina_mechero": {
"active": true,
"turno_cocina_olla_vacia": {
"active": false,
"custom_data": {
"target_tooltips": {
"action3": {
"turno_cocina_ajo": "tooltip_turno_cocina_olla_vacia_action3_drop_in",
"turno_cocina_bol_lentejas": "tooltip_turno_cocina_olla_vacia_action3_drop_in",
"turno_cocina_patata": "tooltip_turno_cocina_olla_vacia_action3_drop_in",
"turno_cocina_romero": "tooltip_turno_cocina_olla_vacia_action3_drop_in"
}
},
"tooltips": {
"action1": "tooltip_common_look",
"action2": "tooltip_common_pick",
@@ -166,6 +169,7 @@ objects = {
"turno_cocina_patata": {
"active": true,
"custom_data": {
"count": 4,
"count_textures": [{
"start": 1,
"texture": "res://gymkhana/items/assets/turno_cocina_patata.png"
@@ -194,16 +198,6 @@ objects = {
},
"interactive": true,
"state": "default"
},
"turno_cocina_peso_usado": {
"active": true,
"custom_data": {
"tooltips": {
"action3": "tooltip_common_look"
}
},
"interactive": true,
"state": "default"
}
},
"cocina_delante": {
@@ -284,10 +278,10 @@ objects = {
"player": {
"active": true,
"custom_data": {},
"global_transform": Transform2D(0.85431373, 0, 0, 0.85431373, 716, 473),
"global_transform": Transform2D(0.96705884, 0, 0, 0.96705884, 677.6001, 541.60004),
"interactive": false,
"last_deg": 71,
"last_dir": 4,
"last_deg": 21,
"last_dir": 3,
"state": "idle_down"
},
"puerta_cocina_start": {
@@ -365,6 +359,17 @@ objects = {
"interactive": true,
"state": "default"
},
"turno_cocina_frontal": {
"active": true,
"custom_data": {
"tooltips": {
"action3": "tooltip_frontal_action3",
"action4": "tooltip_frontal_action4"
}
},
"interactive": true,
"state": "default"
},
"turno_cocina_libro_de_cocina": {
"active": false,
"custom_data": {
@@ -391,6 +396,27 @@ objects = {
"interactive": true,
"state": "default"
},
"turno_cocina_patata_grande": {
"active": false,
"custom_data": {
"target_tooltips": {
"action3": {
"turno_cocina_cuchillo": "tooltip_turno_cocina_patata_grande_action3_turno_cocina_cuchillo"
},
"action4": {
"turno_cocina_cuchillo": "tooltip_turno_cocina_patata_grande_action4_turno_cocina_cuchillo"
}
},
"tooltips": {
"action1": "tooltip_common_look",
"action2": "tooltip_turno_cocina_patata_grande_action2",
"action3": "tooltip_common_look",
"action4": "tooltip_common_use"
}
},
"interactive": true,
"state": "default"
},
"turno_cocina_pegatina": {
"active": true,
"custom_data": {
@@ -400,6 +426,93 @@ objects = {
},
"interactive": true,
"state": "default"
},
"turno_cocina_peso": {
"active": false,
"custom_data": {
"target_tooltips": {
"action3": {
"turno_cocina_bol": "tooltip_cocina_peso_action3_bol"
}
},
"tooltips": {
"action1": "tooltip_common_whats_this",
"action2": "tooltip_common_pick",
"action3": "tooltip_common_look",
"action4": "tooltip_common_use"
}
},
"interactive": true,
"state": "default"
}
},
"cocina_detras": {
"turno_cocina_carton": {
"active": false,
"custom_data": {
"target_tooltips": {
"action3": {
"turno_cocina_mechero": "tooltip_turno_cocina_carton_action3_turno_cocina_mechero"
}
},
"tooltips": {
"action1": "tooltip_common_look",
"action2": "tooltip_common_pick",
"action3": "tooltip_common_look",
"action4": "tooltip_common_use"
}
},
"interactive": true,
"state": "default"
},
"turno_cocina_madera": {
"active": false,
"custom_data": {
"tooltips": {
"action1": "tooltip_cocina_delante_madera_action1",
"action2": "tooltip_cocina_delante_madera_action2",
"action3": "tooltip_common_look",
"action4": "tooltip_common_use"
}
},
"interactive": true,
"state": "default"
}
},
"despensa": {
"turno_cocina_bol_lentejas": {
"active": true,
"custom_data": {
"tooltips": {
"action3": "tooltip_common_look",
"action4": "tooltip_common_use"
}
},
"interactive": true,
"state": "default"
},
"turno_cocina_peso_bol": {
"active": true,
"custom_data": {
"tooltips": {
"action1": "tooltip_common_whats_this",
"action2": "tooltip_common_pick",
"action3": "tooltip_common_look",
"action4": "tooltip_common_use"
}
},
"interactive": true,
"state": "default"
},
"turno_cocina_peso_usado": {
"active": true,
"custom_data": {
"tooltips": {
"action3": "tooltip_common_look"
}
},
"interactive": true,
"state": "default"
}
}
}
@@ -415,17 +528,17 @@ settings = {
"custom_settings": {
"clear_text_by_click_only": false,
"slow_text_mode": false,
"video_subtitles": false
"video_subtitles": true
},
"escoria_version": "1.0.0",
"fullscreen": false,
"master_volume": 0.35,
"music_volume": 1.0,
"master_volume": 1.0,
"music_volume": 0.35,
"sfx_volume": 1.0,
"speech_enabled": true,
"speech_volume": 1.0,
"text_lang": "es",
"voice_lang": "fr_FR"
"text_lang": "en",
"voice_lang": "es_ES"
}
custom_data = {
"ui_type": "rtmi-ui"