Compare commits

...

15 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
7f380e7ccd feat(i18n): Credits fix EN. Closes #157
All checks were successful
Gymkhana exports / All exports (push) Successful in 2m45s
2025-11-11 01:08:53 +01:00
cfe374f350 feat(i18n): Credits #157 2025-11-11 01:07:56 +01:00
93f2651889 feat(i18n): Missing translations #157 2025-11-11 00:57:22 +01:00
acc55fb462 feat(build): exe artifact 2025-11-10 02:13:19 +01:00
40 changed files with 975 additions and 2874 deletions

View File

@@ -36,3 +36,4 @@ jobs:
build/**/*.appimage
build/**/*.tar.gz
build/**/*.zip
build/**/*.exe

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

@@ -42,7 +42,7 @@ layout_mode = 2
custom_minimum_size = Vector2(0, 50)
layout_mode = 2
theme_override_font_sizes/normal_font_size = 16
text = "Consigue todos los logros para obtener una puntuación perfecta."
text = "ACHIEVEMENTS_MENU_NOTE"
vertical_alignment = 1
[node name="Back" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"]

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

@@ -12,7 +12,7 @@ Leo
Piko
Encuentros de música Uli 2023
Uli Music Fest 2023
Bazyl
@@ -21,8 +21,8 @@ Chloe
Mateo
A Uli por existir
Al grupo de rol por aguantar la espera
A Ron Gilbert por crear Monkey Island
A la comunidad detrás de Godot y Escoria
por hacer posible este juego
To Uli for existing
To the role-playing group for enduring the wait
To Ron Gilbert for creating Monkey Island
To the community behind Godot and Escoria
for making this game possible

View File

@@ -21,8 +21,8 @@ Chloe
Mateo
A Uli por existir
Al grupo de rol por aguantar la espera
A Ron Gilbert por crear Monkey Island
A la comunidad detrás de Godot y Escoria
por hacer posible este juego
Uli d'exister
Au groupe de jeu de rôle pour sa patience
À Ron Gilbert, créateur de Monkey Island
À la communauté de Godot et Escoria
pour avoir rendu ce jeu possible

View File

@@ -1,24 +1,24 @@
CREADO POR
CREATED BY
COLABORACIONES
COLLABORATIONS
CÁMARA
CAMERA
MÚSICA
MUSIC
GENTE HAMBRIENTA
HUNGRY PEOPLE
AGRADECIMIENTOS
THANKS

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,10 +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","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."
"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

@@ -74,14 +74,14 @@
"tips_eneko_porfa_7_res","I'm losing patience.","Je perds patience.","Me estoy empezando a cansar.","Aspertzen hasia naiz."
"tips_eneko_porfa_8","Please with cream?","Steuplè à la crème ?","¿Porfa please recubierto de nata?","Bitxilorezko super mese hiper mesedez?"
"tips_eneko_porfa_8_res","Alright, big baby.","C'est bon, gros bébé cadum.","Vale, llorica.","Ados, negarti alena!"
"tips_eneko_porfa_8_res2","If you want I'll help you, but if you like challenges and adventures you shouldn't use these aids.","","Si quieres te ayudo, pero si te gustan los retos y las aventuras no deberías usar estas ayudas.","Nahi izatekotan lagunduko zaitut, baina erronkak eta abenturak gustoko badituzu, ez zenituzke laguntza hauek erabili behar."
"tips_eneko_porfa_8_res2","If you want I'll help you, but if you like challenges and adventures you shouldn't use these aids.","Je peux vous aider si vous le souhaitez, mais si vous aimez les défis et les aventures, vous ne devriez pas utiliser ces aides.","Si quieres te ayudo, pero si te gustan los retos y las aventuras no deberías usar estas ayudas.","Nahi izatekotan lagunduko zaitut, baina erronkak eta abenturak gustoko badituzu, ez zenituzke laguntza hauek erabili behar."
"tips_eneko_porfa_break","I can see you don't want to help me. If I don't make it, it'll be your fault.","Je vois bien que tu veux pas m'aider. Si je n'y arrive pas, ce sera ta faute.","Ya veo que no me quieres ayudar. Si no lo consigo será por tu culpa.","Agerikoa da ez didazula lagundu nahi. Ez badut lortzen zure errua izango da."
"tips_eneko_porfa_break_res","Oh yeah, what a shame.","Ah ouais hein, quel dommage.","Ya ves tú que pena.","A ze pena, niri bost axola."
"tips_eneko_spoiler_confirmation","Are you sure you want me to give you the solution? This action is [b]IRREVERSIBLE[/b].","","¿Tienes claro que quieres que te dé la solución? Esta acción es [b]IRREVERSIBLE[/b].","Seguru zaude soluzioa ematea nahi duzula? Ekintza hau eta gero [b]EZIN DA ATZERA EGIN[/b]."
"tips_eneko_spoiler_confirmation_yes_spoiler","SPOILER ALERT - Yes, I can't think of anything else and I'm bored.","","SPOILER ALERT - Sí, no se me ocurre nada más y me aburro.","SPOILER ALERT - Bai, ez zait beste ezer bururatzen eta aspertzen hasi naiz."
"tips_eneko_spoiler_confirmation_yes_super_spoiler","SUPER SPOILER ALERT - Yes, I can't think of anything else and I'm bored.","","SUPER SPOILER ALERT - Sí, no se me ocurre nada más y me aburro.","SUPER SPOILER ALERT - Bai, ez zait beste ezer bururatzen eta aspertzen hasi naiz."
"tips_eneko_spoiler_confirmation_yes","Yes, I can't think of anything else and I'm bored.","","Sí, no se me ocurre nada más y me aburro.","Bai, ez zait beste ezer bururatzen eta aspertzen hasi naiz."
"tips_eneko_spoiler_confirmation_no","No, I want to try a little more.","","No, quiero intentarlo un poco más.","Ez, pixka bat gehiago saiatu nahi dut."
"tips_eneko_spoiler_confirmation","Are you sure you want me to give you the solution? This action is [b]IRREVERSIBLE[/b].","Êtes-vous sûr de vouloir que je vous donne la solution ? Cette action est [b]IRRÉVERSIBLE[/b].","¿Tienes claro que quieres que te dé la solución? Esta acción es [b]IRREVERSIBLE[/b].","Seguru zaude soluzioa ematea nahi duzula? Ekintza hau eta gero [b]EZIN DA ATZERA EGIN[/b]."
"tips_eneko_spoiler_confirmation_yes_spoiler","SPOILER ALERT - Yes, I can't think of anything else and I'm bored.","ATTENTION SPOILER - Oui, je ne vois rien d'autre et je m'ennuie.","SPOILER ALERT - Sí, no se me ocurre nada más y me aburro.","SPOILER ALERT - Bai, ez zait beste ezer bururatzen eta aspertzen hasi naiz."
"tips_eneko_spoiler_confirmation_yes_super_spoiler","SUPER SPOILER ALERT - Yes, I can't think of anything else and I'm bored.","ATTENTION SPOILER ! - Oui, je ne vois rien d'autre et je m'ennuie.","SUPER SPOILER ALERT - Sí, no se me ocurre nada más y me aburro.","SUPER SPOILER ALERT - Bai, ez zait beste ezer bururatzen eta aspertzen hasi naiz."
"tips_eneko_spoiler_confirmation_yes","Yes, I can't think of anything else and I'm bored.","Oui, je ne vois rien d'autre et je m'ennuie.","Sí, no se me ocurre nada más y me aburro.","Bai, ez zait beste ezer bururatzen eta aspertzen hasi naiz."
"tips_eneko_spoiler_confirmation_no","No, I want to try a little more.","Non, je veux essayer encore un peu.","No, quiero intentarlo un poco más.","Ez, pixka bat gehiago saiatu nahi dut."
"tips_eneko_patata_grande_0","What do I do with the big potato?","Je fais quoi de la grande patate ?","¿Qué hago con la patata grande?","Zer egin dezaket patata handiarekin?"
"tips_eneko_patata_grande_0_res","It's a potato twice as big as a medium potato.","C'est une patate deux fois plus grande qu'une moyenne patate.","Es una patata el doble de grande que una patata mediana.","Patatetako bat ertainen bikoitza da."
"tips_eneko_patata_grande_1","I need more help with the big potato.","J'ai besoin de plus d'aide avec la grande patate.","Necesito más ayuda con la patata grande.","Laguntza gehiago behar dut patata handiarekin."
@@ -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."
@@ -241,11 +241,11 @@
"cocina_libro_de_cocina_action2_say_2","I've kept the book in the inventory. You'll find it at the bottom left of the screen.","J'ai gardé le livre dans l'inventaire. Tu le trouveras en bas à gauche de l'écran.","He guardado el libro en el inventario. Lo verás más abajo a la izquierda de la pantalla.","Liburua inbentarioan gorde dut. Pantailaren azpiko ezker aldean aurkituko duzu."
"cocina_libro_de_cocina_action2_say_3","Some inventory items can be combined with each other to be used. Remember that, you'll need it later.","Certains objets de l'inventaire peuvent se combiner entre eux pour être utilisés. Souviens-t-en, tu en auras besoin plus tard.","Algunos objetos del inventario pueden combinarse entre ellos usándolos. Acuérdate más tarde, te hará falta.","Inbentarioko gauza batzuk haien artean konbinatu daitezke. Ez ahaztu, gero beharko duzu eta."
"cocina_libro_de_cocina_action2_say_4","For now, reading the recipe book will be enough.","Pour le moment, lire le livre de recette ce sera suffisant.","Por ahora, con leer el libro de recetas bastará.","Oraingoz errezeta liburua irakurtzearekin aski."
"cocina_libro_de_cocina_intro_action3_1","\"Shrimp carpaccio garnished with black lumpfish roe\"","« Carpaccio de crevettes garni d'œufs de lompe noire »","'Carpaccio de gambas aderezadas con huevas de lumpo negras'","'Izkira Carpaccioa shiitake perretxiko eta makadamia saltsan'"
"cocina_libro_de_cocina_intro_action3_1","'Shrimp carpaccio garnished with black lumpfish roe'","« Carpaccio de crevettes garni d'œufs de lompe noire »","'Carpaccio de gambas aderezadas con huevas de lumpo negras'","'Izkira Carpaccioa shiitake perretxiko eta makadamia saltsan'"
"cocina_libro_de_cocina_intro_action3_2","No, too simple and vulgar.","Non, trop simple et vulgaire.","Hmm no, es demasiado sencillo y vulgar.","Errazegia, gaur plater berezi bat nahi dut, ez eguneroko zerbait."
"cocina_libro_de_cocina_intro_action3_3","\"Fried egg\"","« Œuf sur le plat »","'Huevo frito'","'Arrautza frijitua'"
"cocina_libro_de_cocina_intro_action3_3","'Fried egg'","« Œuf sur le plat »","'Huevo frito'","'Arrautza frijitua'"
"cocina_libro_de_cocina_intro_action3_4","Hmph, too complicated.","Humpf, trop compliqué.","Uff, demasiado complicado.","Ufff, zailegia."
"cocina_libro_de_cocina_intro_action3_5","\"Lentils, potatoes\"","« Lentilles, patates »","'Lentejas con patatas'","'Dilistak patatekin'"
"cocina_libro_de_cocina_intro_action3_5","'Lentils, potatoes'","« Lentilles, patates »","'Lentejas con patatas'","'Dilistak patatekin'"
"cocina_libro_de_cocina_intro_action3_6","Lentils! I'm going to make lentils!!","Des lentilles ! Je vais faire des lentilles !!","Lentejas! Uuh, voy a hacer lentejas!!","Dilistak! Dilistak prestatuko ditut!!"
"cocina_libro_de_cocina_intro_action3_7","Healthy and nutritious, they contain more iron than spinach.","Saines et nutritives, elles contiennent plus de fer que les épinards.","Sanas y nutritivas, tienen más hierro que las espinacas.","Osasuntsu eta elikagarriak, hiltzeek baina burni gehiagorekin gainera."
"cocina_libro_de_cocina_intro_action3_8","And what's more, they're delicious!","Et qui plus est, elles sont délicieuses !","Y además están riquísimas!","Oso goxoak daude gainera!"
@@ -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"
@@ -338,7 +338,7 @@
"olla_llena_action3_patata_enough_say","Here come the potatoes!","En avant les patates !","Patatas pa'entro","Patatak barrura!"
"olla_llena_action3_romero_say","With rosemary, these lentils will be succulent!","Avec le romarin, ces lentilles vont être succulentes !","Con romero estas lentejas van a estar de rechupete!","Erromeroarekin dilista hauek mundialak egongo dira!"
"olla_llena_action3_ajo_say","With garlic it will be to Eneko's taste","Avec l'ail ça sera au goût d'Eneko","Con ajo quedará al gusto de Eneko.","Baratxuriarekin Enekori gustatzen zaizkion bezala egongo dira."
"pegatina_action3_say_1","\"Only the people save the people\"","« Seul le peuple sauve le peuple »","'Solo el pueblo salva al pueblo'","'Herriak bakarrik salba dezake Herria'"
"pegatina_action3_say_1","'Only the people save the people'","« Seul le peuple sauve le peuple »","'Solo el pueblo salva al pueblo'","'Herriak bakarrik salba dezake Herria'"
"pegatina_action3_say_2","These stickers are so beautiful. It was worth taking the risk.","Ces stickers sont tellement beaux. Ça valait la peine de prendre le risque.","Que pegatina más guapa, ha valido la pena correr el riesgo.","Ze pegatina polita, hartzeko arriskatzeak merezi izan du."
"patata_action3_one_say","I need three more potatoes.","Il me faut trois autres patates.","Tengo que conseguir tres patatas más.","Beste hiru patata lortu behar ditut."
"patata_action3_two_say","I already have {_COUNT_turno_cocina_patata} potatoes!","J'ai déjà {_COUNT_turno_cocina_patata} patates !","Ya tengo {_COUNT_turno_cocina_patata} patatas!","{_COUNT_turno_cocina_patata} lortu ditut jada!"
@@ -358,9 +358,9 @@
"tooltip_turno_cocina_romero_action3_turno_cocina_libro_de_cocina","Search for ingredients","Chercher des ingrédients","Buscar ingredientes","Osagaiak bilatu"
"cocina_detras_romero_action3_libro_de_cocina_say","This plant looks like rosemary. According to the recipe book, it's the secret to getting delicious lentils!","Cette plante ressemble à du romarin. Selon le lire de recette, c'est le secret pour obtenir de délicieuses lentilles !","Esta planta parece romero. ¡Según el libro de recetas es el secreto para conseguir unas lentejas riquísimas!","Landare honek erromeroa dirudi, liburu honen arabera, dilistarik onenak prestatzeko osagai sekretua da!"
"cocina_detras_romero_action3_libro_de_cocina_say2","I'm going to take a bit to put in the food.","Je vais en prendre un peu pour en mettre dans la nourriture.","Voy a coger un poco para echarle a la comida.","Bazkariari botatzeko pixka bat jasoko dut."
"tooltip_despensa_bidon_cntr_action1_after_look","Look at the lentil container","","Mirar bidón con lentejas","Dilisten bidoia miatu"
"tooltip_despensa_bidon_cntr_action1_after_look","Look at the lentil container","Regardez le récipient à lentilles","Mirar bidón con lentejas","Dilisten bidoia miatu"
"despensa_bidon_cntr_action1_say","There are a lot of lentils.","Il y a beaucoup de lentilles.","Hay muchas lentejas.","Dilista pila bat dago."
"tooltip_despensa_bidon_cntr_action2_after_look","Take lentils","","Coger lentejas","Dilistak hartu"
"tooltip_despensa_bidon_cntr_action2_after_look","Take lentils","Prenez des lentilles","Coger lentejas","Dilistak hartu"
"despensa_bidon_cntr_action2_say","I need to take them with something.","Il faut que je les prenne avec quelque chose.","Necesito cogerlas con algo.","Zerbaitekin hartu behar ditut."
"despensa_bidon_cntr_action3_bol_say","I don't want to make lentils for a whole regiment. I should take the right amount.","Je ne veux pas faire des lentilles pour tout un régiment. Il faudrait que j'en prenne la juste quantité.","No quiero hacer lentejas para un ejercito, debería coger la cantidad justa.","Ez ditut armada batentzako bezainbeste prestatu nahi, zenbat hartzen ditudan neurtu beharko nuke."
"despensa_bidon_cntr_action3_peso_say","The scale is missing a container to put the lentils in.","Il manque un récipient à la balance pour mettre les lentilles.","Al peso le falta un recipiente donde poner las lentejas.","Pisuari ontzi bat falta zaio dilistak jartzeko."
@@ -450,34 +450,34 @@
"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...","","A ver que canciones tiene...","Ea ze abesti dauzkan..."
"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?"
"turno_cocina_bandera_palestina_action2","A bit of history","Un peu d'Histoire","Un poco de historia",""
"turno_cocina_bandera_palestina_action1_say","When a people suffers a genocide, neutrality does not exist. You must choose which side you are on.","Lorsqu'un peuple souffre d'un génocide, la neutralité n'existe pas. Tu dois choisir de quel coté tu es.","Mientras un pueblo está sufriendo un genocidio, no existe la neutralidad, tienes que decidir de que lado estas. ",""
"turno_cocina_bandera_palestina_action2_say_1","The occupation of Palestine did not begin on October 7, 2023, but with the proclamation of the State of Israel in 1948.","","La ocupación de Palestina no empezó el 7 de octubre de 2023 si no con la proclamación del Estado de Israel en 1948.",""
"turno_cocina_bandera_palestina_action2_say_2","Since the attacks of October 7, 2023, Israel has carried out a military offensive that, according to Amnesty International and other organizations, meets the elements of the crime of genocide against the Palestinian population of Gaza.","","Desde los ataques del 7 de octubre de 2023, Israel ha llevado a cabo una ofensiva militar que según Amnistía Internacional y otras organizaciones, reúne los elementos del crimen de genocidio contra la población palestina de Gaza.",""
"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.","","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.",""
"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.","","La impunidad de Israel frente a las resoluciones internacionales perpetúa la ocupación, el apartheid y el genocidio contra la población palestina.",""
"achievement_ordenado_title","Things in their place","","Las cosas a su sitio",""
"achievement_coleccionista_title","Sticker collector","","Coleccionista de pegatinas",""
"achievement_amenazas_title","Violent threats","","Amenazas violentas",""
"achievement_gourmet_title","Great gourmet","","Gran gourmet",""
"achievement_chistes_title","Bad jokes","","Chistes malos",""
"achievement_musica_title","Music lover","","Amante de la música",""
"achievement_palestina_title","Free Palestine!","","Palestina libre!",""
"achievement_hambrientas_title","Hungry people","","Gente hambrienta","Gosetiak"
"turno_cocina_creditos_score_1","Congratulations! Save your score so everyone can see it.","","Enhorabuena! Guarda tu puntuación, para que todo el mundo la vea.",""
"turno_cocina_creditos_score_2","If you get all the achievements you'll enter the perfect scores list.","","Si consigues todos los logros entrarás en la lista de puntuaciones perfectas.",""
"turno_cocina_creditos_score_3","For now we're putting you on the mediocre list.","","Por ahora te apuntamos en la lista de mediocres.",""
"turno_cocina_creditos_perfect_score_oier_1","Perfect!","","Perfect!",""
"turno_cocina_creditos_perfect_score_oier_2","Perfect!","","Perfect!",""
"turno_cocina_creditos_perfect_score_oier_3","Perfect!","","Perfect!",""
"turno_cocina_creditos_perfect_score_eneko_1","Perfect!","","Perfect!",""
"turno_cocina_creditos_perfect_score_eneko_2","Perfect!","","Perfect!",""
"turno_cocina_creditos_perfect_score_eneko_3","Perfect!","","Perfect!",""
"turno_cocina_bandera_palestina_action2","A bit of history","Un peu d'Histoire","Un poco de historia","Historia pixka bat"
"turno_cocina_bandera_palestina_action1_say","When a people suffers a genocide, neutrality does not exist. You must choose which side you are on.","Lorsqu'un peuple souffre d'un génocide, la neutralité n'existe pas. Tu dois choisir de quel coté tu es.","Mientras un pueblo está sufriendo un genocidio, no existe la neutralidad, tienes que decidir de que lado estas.","Herri batek genozidio bat jasaten duen bitartean, ez dago neutralitaterik, zein aldetan zauden erabaki behar duzu."
"turno_cocina_bandera_palestina_action2_say_1","The occupation of Palestine did not begin on October 7, 2023, but with the proclamation of the State of Israel in 1948.","L'occupation de la Palestine n'a pas commencé le 7 octobre 2023, mais avec la proclamation de lÉtat dIsraël en 1948.","La ocupación de Palestina no empezó el 7 de octubre de 2023 si no con la proclamación del Estado de Israel en 1948.","Palestinaren okupazioa ez zen 2023ko urriaren 7an hasi, baizik eta 1948an Israelgo Estatua aldarrikatu zenean."
"turno_cocina_bandera_palestina_action2_say_2","Since the attacks of October 7, 2023, Israel has carried out a military offensive that, according to Amnesty International and other organizations, meets the elements of the crime of genocide against the Palestinian population of Gaza.","Depuis les attaques du 7 octobre 2023, Israël a mené une offensive militaire qui, selon Amnesty International et d'autres organisations, remplit les critères du crime de génocide contre la population palestinienne de Gaza.","Desde los ataques del 7 de octubre de 2023, Israel ha llevado a cabo una ofensiva militar que según Amnistía Internacional y otras organizaciones, reúne los elementos del crimen de genocidio contra la población palestina de Gaza.","2023ko urriaren 7tik aurrera Israelek egindako eraso militarrek, Amnistia Internazionalaren eta beste erakunde askoren arabera, Gazako palestinar biztanleriaren aurkako genozidio krimenaren irizpideak betetzen dituzte."
"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 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é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 ! 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!"
Can't render this file because it contains an unexpected character in line 244 and column 44.

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"