User prompt
Please fix the bug: 'TypeError: Cannot read properties of null (reading 'x')' in or related to this line: 'if (spaceship.x > catFloating.x - 50 && spaceship.x < catFloating.x + 50 && !catCaptured) {' Line Number: 811
User prompt
Crea una pantalla de título con estética de espacio y gravedad cero. Logo: Aparece diminuto y se agranda con una animación hasta ocupar el centro. Es solo una imagen, sin texto. Botón “Comenzar”: Imagen sin texto. Comienza fuera de la pantalla y entra rebotando hasta quedarse en su lugar. Gatito en el espacio: Flota indefinidamente por toda la pantalla. Tiene varias ilustraciones distintas: Flotando Saltando Maullando Jugando con un estambre Durmiendo Comiendo Estas ilustraciones cambian de forma aleatoria y lenta, para que el jugador pueda disfrutarlas. Si el jugador toca al gato diez veces, este se enoja (cambia a sprite de enojo) y luego aparece una nave que lo recoge y lo lleva hacia la Tierra (con su propio sprite exclusivo). Una vez el gato llega a la Tierra, desaparece de la pantalla de título y no vuelve. Estrellas: El fondo tiene estrellas brillantes que parpadean, todas con el mismo sprite, excepto una estrella hiperveloz que: Aparece con animación. Se mueve rápidamente en una dirección aleatoria. Desaparece con efecto de desvanecimiento. Reaparece en otra parte de la pantalla cada 15 segundos. Accesibilidad: Todos los elementos deben tener un tamaño exageradamente grande, para que puedan ser vistos fácilmente por personas con problemas de visión o que usen teléfonos. Transición al juego: Al presionar el botón "Comenzar", se realiza un zoom intenso hacia la Tierra, que llega a ocupar toda la pantalla. Entonces inicia el juego. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Crea una pantalla de título — Estilo anime Logo del juego: Aparece en tamaño diminuto y se anima agrandándose hasta ocupar el centro de la pantalla. No contiene texto, es únicamente una imagen. Botón "Comenzar": Inicialmente ubicado en la esquina inferior izquierda. Un gatito aparece con dos sprites: uno en posición de preparación y otro al momento de batear. Cuando golpea el botón con su bate, este comienza a girar rápidamente como un espiral, rebotando contra los bordes de la pantalla hasta alcanzar su posición final. Gatito en el espacio: Después de la animación inicial, el gato flota indefinidamente por la pantalla (simulando gravedad cero). Cuenta con los siguientes sprites o ilustraciones, que se muestran de forma aleatoria y lenta, permitiendo al jugador apreciar cada uno: Flotando en el espacio Saltando Maullando Jugando con estambre Durmiendo Sacando la lengua al jugador Comiendo Interacción especial con el gatito: Si el jugador toca al gato 10 veces, su sprite cambia a una versión enojada. Luego, se transforma en una nave espacial que lo recoge y lo lleva al planeta Tierra (con sprite exclusivo). Una vez el gato llega a la Tierra, desaparece de la pantalla de título y no vuelve a aparecer. Estrellas de fondo: Todas las estrellas parpadean y comparten el mismo sprite, excepto una: una estrella hiperveloz. Esta aparece con una animación de entrada, se desplaza en una dirección aleatoria y luego se desvanece. Este proceso se repite cada 15 segundos. Accesibilidad visual: Todos los elementos (logo, botón, gato, estrellas, etc.) deben tener un tamaño exageradamente grande para facilitar la visibilidad en dispositivos móviles y para personas con discapacidad visual. Transición al juego: Al tocar el botón "Comenzar", se hace un zoom intenso hacia el sprite del planeta Tierra, que llena toda la pantalla. Luego, la pantalla se desvanece para dar paso al juego. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
No veo la pantalla de título, corrige eso
User prompt
Pantalla de título — Estilo anime Logo del juego: Aparece en tamaño diminuto y se anima agrandándose hasta ocupar el centro de la pantalla. No contiene texto, es únicamente una imagen. Botón "Comenzar": Inicialmente ubicado en la esquina inferior izquierda. Un gatito aparece con dos sprites: uno en posición de preparación y otro al momento de batear. Cuando golpea el botón con su bate, este comienza a girar rápidamente como un espiral, rebotando contra los bordes de la pantalla hasta alcanzar su posición final. Gatito en el espacio: Después de la animación inicial, el gato flota indefinidamente por la pantalla (simulando gravedad cero). Cuenta con los siguientes sprites o ilustraciones, que se muestran de forma aleatoria y lenta, permitiendo al jugador apreciar cada uno: Flotando en el espacio Saltando Maullando Jugando con estambre Durmiendo Sacando la lengua al jugador Comiendo Interacción especial con el gatito: Si el jugador toca al gato 10 veces, su sprite cambia a una versión enojada. Luego, se transforma en una nave espacial que lo recoge y lo lleva al planeta Tierra (con sprite exclusivo). Una vez el gato llega a la Tierra, desaparece de la pantalla de título y no vuelve a aparecer. Estrellas de fondo: Todas las estrellas parpadean y comparten el mismo sprite, excepto una: una estrella hiperveloz. Esta aparece con una animación de entrada, se desplaza en una dirección aleatoria y luego se desvanece. Este proceso se repite cada 15 segundos. Accesibilidad visual: Todos los elementos (logo, botón, gato, estrellas, etc.) deben tener un tamaño exageradamente grande para facilitar la visibilidad en dispositivos móviles y para personas con discapacidad visual. Transición al juego: Al tocar el botón "Comenzar", se hace un zoom intenso hacia el sprite del planeta Tierra, que llena toda la pantalla. Luego, la pantalla se desvanece para dar paso al juego. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
La animación del gato golpeando el botón "Comenzar" con un bate se corta abruptamente al final. Asegúrate de que se reproduzca completa sin recortes. Además, mejora la fluidez del movimiento para que la animación se vea más suave y natural. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
La animación del gato al golpear el botón "Comenzar" debería ser más suave ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Pantalla de Título — Especificaciones Detalladas (Estilo Anime) Logo: Aparece inicialmente en tamaño reducido. Animación de escalado hasta el centro de la pantalla. Formato: imagen sin texto. Botón de inicio: Forma: imagen sin texto. Secuencia de aparición: Un gatito con sprite de preparación golpea el botón con un bate (sprite de acción de golpeo). El botón sale girando rápidamente como un espiral hasta llegar a su ubicación definitiva. Gatito espacial (fase posterior al golpe): El gato comienza a flotar en pantalla (gravedad cero). Sprites/ilustraciones requeridas: 1. Flotando 2. Saltando 3. Maullando 4. Jugando con un ovillo de estambre 5. Durmiendo 6. Sacando la lengua al jugador 7. Comiendo Estas imágenes se rotan aleatoriamente y a baja frecuencia (cambios lentos para permitir su apreciación). Interacción especial (easter egg): Al tocar 10 veces al gato: 1. Aparece sprite de gato enojado. 2. Se transforma en una nave que lo lleva a la Tierra (ilustración exclusiva). 3. Al llegar, el gato desaparece y ya no vuelve a la pantalla de título. Efectos ambientales: Estrellas fijas parpadean (todas con el mismo sprite). Una estrella hiperveloz aparece cada 15 segundos en una posición aleatoria, con animaciones de entrada, movimiento y desvanecimiento. Accesibilidad visual: Todos los elementos deben tener dimensiones muy grandes para garantizar visibilidad en pantallas pequeñas y para personas con discapacidad visual. Transición al juego: Al presionar el botón de inicio, se hace un zoom intenso hacia la Tierra. La Tierra ocupa toda la pantalla. Luego, se desvanece la pantalla de título y comienza el juego. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Pantalla de Título — Especificaciones Detalladas (Estilo Anime) Logo: Aparece inicialmente en tamaño reducido. Animación de escalado hasta el centro de la pantalla. Formato: imagen sin texto. Botón de inicio: Forma: imagen sin texto. Secuencia de aparición: Un gatito con sprite de preparación golpea el botón con un bate (sprite de acción de golpeo). El botón sale girando rápidamente como un espiral hasta llegar a su ubicación definitiva. Gatito espacial (fase posterior al golpe): El gato comienza a flotar en pantalla (gravedad cero). Sprites/ilustraciones requeridas: 1. Flotando 2. Saltando 3. Maullando 4. Jugando con un ovillo de estambre 5. Durmiendo 6. Sacando la lengua al jugador 7. Comiendo Estas imágenes se rotan aleatoriamente y a baja frecuencia (cambios lentos para permitir su apreciación). Interacción especial (easter egg): Al tocar 10 veces al gato: 1. Aparece sprite de gato enojado. 2. Se transforma en una nave que lo lleva a la Tierra (ilustración exclusiva). 3. Al llegar, el gato desaparece y ya no vuelve a la pantalla de título. Efectos ambientales: Estrellas fijas parpadean (todas con el mismo sprite). Una estrella hiperveloz aparece cada 15 segundos en una posición aleatoria, con animaciones de entrada, movimiento y desvanecimiento. Accesibilidad visual: Todos los elementos deben tener dimensiones muy grandes para garantizar visibilidad en pantallas pequeñas y para personas con discapacidad visual. Transición al juego: Al presionar el botón de inicio, se hace un zoom intenso hacia la Tierra. La Tierra ocupa toda la pantalla. Luego, se desvanece la pantalla de título y comienza el juego. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Crea una pantalla de título con estilo anime para este juego. El logo comienza siendo diminuto y se agranda con una animación hasta ocupar el centro de la pantalla. No tiene texto, solo es una imagen. Un gatito aparece en escena con un bate. Tiene dos sprites: uno preparándose para batear y otro golpeando. El botón de comenzar también es una imagen sin texto. El gato lo golpea con el bate, y eso hace que el botón salga girando rápidamente como un espiral hasta colocarse en su lugar. Luego de eso, el gatito flota por el espacio. Tiene varios sprites: flotando, saltando por el espacio, maullando, jugando con un estambre, durmiendo, sacando la lengua al jugador y comiendo. Estas imágenes cambian lentamente y de forma aleatoria para que se puedan apreciar bien. Si el jugador toca al gatito 10 veces, el sprite cambia a uno donde está enojado. Después, se transforma en una nave espacial que se lo lleva a la Tierra. El planeta Tierra tiene su propia ilustración exclusiva. Una vez que el gato llega, desaparece y ya no regresa a la pantalla de título. Mientras está en el espacio, el gato flota indefinidamente por la pantalla (sin gravedad). El fondo tiene estrellas parpadeantes (todas con el mismo sprite, salvo una estrella hiperveloz que aparece cada 15 segundos con una animación de entrada, se mueve en cualquier dirección y desaparece con una animación de desvanecimiento). También hay galaxias brillantes y planetas. Todos los elementos deben ser visualmente grandes, pensados para personas con problemas de visión. El resto queda a tu criterio, siempre manteniendo el estilo anime y una atmósfera viva y mágica. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Pantalla de título – Estilo anime (Alta accesibilidad visual) 1. Logo Inicia como una imagen diminuta. Se anima agrandándose hasta ocupar el centro de la pantalla. No contiene texto, es solo una imagen. 2. Botón “Comenzar” Imagen sin texto. El botón no aparece directamente: un gatito interactúa con él. El gato tendrá dos sprites o ilustraciones: Preparándose para batear. Bateando con fuerza. Al golpear el botón, este gira como un espiral muy rápido y se desplaza a su posición final. 3. Gato (Personaje animado) Después de batear, el gato se desplaza flotando indefinidamente por la pantalla, simulando la falta de gravedad. El gato tendrá múltiples sprites que cambiarán lentamente y de forma aleatoria: Flotando en el espacio Saltando en el espacio Maullando Jugando con un ovillo de estambre Dormido Sacando la lengua al jugador Comiendo Interacción especial: Si el jugador toca al gato 10 veces, su sprite cambia a uno enojado. Luego se transforma en una nave espacial que lo lleva hacia un sprite exclusivo del planeta Tierra. Una vez que llega a la Tierra, el gato desaparece permanentemente de la pantalla de título. 4. Fondo animado Estrellas brillantes y parpadeantes (un único sprite, excepto una): Una estrella hiperveloz aparece con animación, se mueve aleatoriamente, y desaparece cada 15 segundos. Galaxias brillantes. Planetas visibles. 5. Accesibilidad visual: Todos los elementos deben tener un tamaño muy grande para facilitar la visibilidad a personas con dificultades visuales. 6. Elementos libres: Puedes añadir lo que creas conveniente, siempre respetando el estilo anime y la atmósfera fantástica del espacio. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Pantalla de título – Estilo anime (Alta accesibilidad visual) 1. Logo Inicia como una imagen diminuta. Se anima agrandándose hasta ocupar el centro de la pantalla. No contiene texto, es solo una imagen. 2. Botón “Comenzar” Imagen sin texto. El botón no aparece directamente: un gatito interactúa con él. El gato tendrá dos sprites o ilustraciones: Preparándose para batear. Bateando con fuerza. Al golpear el botón, este gira como un espiral muy rápido y se desplaza a su posición final. 3. Gato (Personaje animado) Después de batear, el gato se desplaza flotando indefinidamente por la pantalla, simulando la falta de gravedad. El gato tendrá múltiples sprites que cambiarán lentamente y de forma aleatoria: Flotando en el espacio Saltando en el espacio Maullando Jugando con un ovillo de estambre Dormido Sacando la lengua al jugador Comiendo Interacción especial: Si el jugador toca al gato 10 veces, su sprite cambia a uno enojado. Luego se transforma en una nave espacial que lo lleva hacia un sprite exclusivo del planeta Tierra. Una vez que llega a la Tierra, el gato desaparece permanentemente de la pantalla de título. 4. Fondo animado Estrellas brillantes y parpadeantes (un único sprite, excepto una): Una estrella hiperveloz aparece con animación, se mueve aleatoriamente, y desaparece cada 15 segundos. Galaxias brillantes. Planetas visibles. 5. Accesibilidad visual: Todos los elementos deben tener un tamaño muy grande para facilitar la visibilidad a personas con dificultades visuales. 6. Elementos libres: Puedes añadir lo que creas conveniente, siempre respetando el estilo anime y la atmósfera fantástica del espacio. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
No veo la pantalla de título
User prompt
Pantalla de título – Estilo anime (Alta accesibilidad visual) 1. Logo Inicia como una imagen diminuta. Se anima agrandándose hasta ocupar el centro de la pantalla. No contiene texto, es solo una imagen. 2. Botón “Comenzar” Imagen sin texto. El botón no aparece directamente: un gatito interactúa con él. El gato tendrá dos sprites o ilustraciones: Preparándose para batear. Bateando con fuerza. Al golpear el botón, este gira como un espiral muy rápido y se desplaza a su posición final. 3. Gato (Personaje animado) Después de batear, el gato se desplaza flotando indefinidamente por la pantalla, simulando la falta de gravedad. El gato tendrá múltiples sprites que cambiarán lentamente y de forma aleatoria: Flotando en el espacio Saltando en el espacio Maullando Jugando con un ovillo de estambre Dormido Sacando la lengua al jugador Comiendo Interacción especial: Si el jugador toca al gato 10 veces, su sprite cambia a uno enojado. Luego se transforma en una nave espacial que lo lleva hacia un sprite exclusivo del planeta Tierra. Una vez que llega a la Tierra, el gato desaparece permanentemente de la pantalla de título. 4. Fondo animado Estrellas brillantes y parpadeantes (un único sprite, excepto una): Una estrella hiperveloz aparece con animación, se mueve aleatoriamente, y desaparece cada 15 segundos. Galaxias brillantes. Planetas visibles. 5. Accesibilidad visual: Todos los elementos deben tener un tamaño muy grande para facilitar la visibilidad a personas con dificultades visuales. 6. Elementos libres: Puedes añadir lo que creas conveniente, siempre respetando el estilo anime y la atmósfera fantástica del espacio. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Pantalla de título – Estilo anime (Alta accesibilidad visual) 1. Logo Inicia como una imagen diminuta. Se anima agrandándose hasta ocupar el centro de la pantalla. No contiene texto, es solo una imagen. 2. Botón “Comenzar” Imagen sin texto. El botón no aparece directamente: un gatito interactúa con él. El gato tendrá dos sprites o ilustraciones: Preparándose para batear. Bateando con fuerza. Al golpear el botón, este gira como un espiral muy rápido y se desplaza a su posición final. 3. Gato (Personaje animado) Después de batear, el gato se desplaza flotando indefinidamente por la pantalla, simulando la falta de gravedad. El gato tendrá múltiples sprites que cambiarán lentamente y de forma aleatoria: Flotando en el espacio Saltando en el espacio Maullando Jugando con un ovillo de estambre Dormido Sacando la lengua al jugador Comiendo Interacción especial: Si el jugador toca al gato 10 veces, su sprite cambia a uno enojado. Luego se transforma en una nave espacial que lo lleva hacia un sprite exclusivo del planeta Tierra. Una vez que llega a la Tierra, el gato desaparece permanentemente de la pantalla de título. 4. Fondo animado Estrellas brillantes y parpadeantes (un único sprite, excepto una): Una estrella hiperveloz aparece con animación, se mueve aleatoriamente, y desaparece cada 15 segundos. Galaxias brillantes. Planetas visibles. 5. Accesibilidad visual: Todos los elementos deben tener un tamaño muy grande para facilitar la visibilidad a personas con dificultades visuales. 6. Elementos libres: Puedes añadir lo que creas conveniente, siempre respetando el estilo anime y la atmósfera fantástica del espacio. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Pantalla de título – Estilo anime interactivo Logo: Aparece diminuto y se agranda con una animación fluida hasta ocupar el centro de la pantalla. Es solo una imagen, sin texto. Botón de “Comenzar”: El botón es una imagen sin texto. No aparece directamente: un gatito lo golpea con un bate para lanzarlo a su lugar. El gato tiene un sprite/ilustración de preparación para batear y otro al momento de golpear. Al ser golpeado, el botón gira rápidamente como un espiral hasta llegar a su posición definitiva. Gatito animado: Luego del lanzamiento, el gatito entra en modo flotante (pues está en el espacio). Su sprite cambiará lentamente de forma aleatoria entre varias ilustraciones: Flotando por el espacio (movimiento constante por la pantalla). Saltando en el espacio. Maullando. Jugando con un estambre. Durmiendo. Sacando la lengua al jugador. Comiendo. Cada sprite debe mostrarse lentamente para que el jugador pueda apreciarlo. Interacción especial: Si el jugador toca al gato 10 veces, su sprite cambia a uno enojado. Luego, su forma se transforma en una nave espacial que lo lleva de regreso a la Tierra. Ambientación espacial: El gato flota indefinidamente por la pantalla (sin gravedad). Estrellas parpadeantes por toda la pantalla (todas usan el mismo sprite, excepto una). Una estrella hiperveloz aparece cada 15 segundos en ubicaciones aleatorias con animación de entrada, movimiento veloz en cualquier dirección y animación de desvanecimiento. También hay galaxias brillantes y planetas visibles. Resto del diseño: Libre, siempre manteniendo el estilo anime y coherencia visual. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
🌟 Versión 1: Clara y organizada (ideal para briefing de desarrollo o diseño) Pantalla de título – Estilo anime interactivo Logo: Aparece diminuto y se agranda con una animación fluida hasta ocupar el centro de la pantalla. Es solo una imagen, sin texto. Botón de “Comenzar”: El botón es una imagen sin texto. No aparece directamente: un gatito lo golpea con un bate para lanzarlo a su lugar. El gato tiene un sprite/ilustración de preparación para batear y otro al momento de golpear. Al ser golpeado, el botón gira rápidamente como un espiral hasta llegar a su posición definitiva. Gatito animado: Luego del lanzamiento, el gatito entra en modo flotante (pues está en el espacio). Su sprite cambiará lentamente de forma aleatoria entre varias ilustraciones: Flotando por el espacio (movimiento constante por la pantalla). Saltando en el espacio. Maullando. Jugando con un estambre. Durmiendo. Sacando la lengua al jugador. Comiendo. Cada sprite debe mostrarse lentamente para que el jugador pueda apreciarlo. Interacción especial: Si el jugador toca al gato 10 veces, su sprite cambia a uno enojado. Luego, su forma se transforma en una nave espacial que lo lleva de regreso a la Tierra. Ambientación espacial: El gato flota indefinidamente por la pantalla (sin gravedad). Estrellas parpadeantes por toda la pantalla (todas usan el mismo sprite, excepto una). Una estrella hiperveloz aparece cada 15 segundos en ubicaciones aleatorias con animación de entrada, movimiento veloz en cualquier dirección y animación de desvanecimiento. También hay galaxias brillantes y planetas visibles. Resto del diseño: Libre, siempre manteniendo el estilo anime y coherencia visual. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Cambia el font del juego por uno de videojuegos retro
User prompt
Cambia el título "はじめる" por "¡COMENZAR!" y ajusta el tamaño del texto y del botón "titleStartButton" para que encajen visualmente de forma armoniosa.
User prompt
Cambia el título "はじめる" por "¡COMENZAR!" y ajusta el tamaño del texto y del botón "titleStartButton" para que encajen visualmente de forma armoniosa.
User prompt
Cambia el texto del título "はじめる" por "¡COMENZAR!"
User prompt
Pantalla de título – Estética anime Logo: Comienza en tamaño diminuto y se anima con un efecto de escalado hasta posicionarse en el centro de la pantalla. No contiene texto; es una imagen visualmente impactante. Botón de inicio: Imagen sin texto que aparece después del logo, con una animación en espiral (rotación + movimiento) hasta alcanzar su ubicación final. Gato animado: Un gato se desplaza por la pantalla realizando cuatro acciones distintas: caminar, saltar, maullar y jugar con un estambre. Cada acción debe tener su propio sprite o ilustración, reflejando un comportamiento dinámico, alegre y muy expresivo. Elementos adicionales: Quedan a tu interpretación, siempre dentro del estilo anime y con un enfoque visual atractivo y coherente. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Sustituye las animaciones actuales del título por otras que emulen el estilo dinámico y visualmente impactante de los openings de anime. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Reemplazar la animación de "heartDecoration" por una en la que varios corazones alineados formen la silueta de un corazón alrededor del "titleLogo". ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Reemplazar la animación de "heartDecoration" por una en la que varios corazones alineados formen la silueta de un corazón alrededor del "titleLogo". ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Character = Container.expand(function () { var self = Container.call(this); var sprite = self.attachAsset('characterSprite', { anchorX: 0.5, anchorY: 1, x: 280, y: 2732 - 700 }); var sprite2 = self.attachAsset('characterSprite2', { anchorX: 0.5, anchorY: 1, x: 280, y: 2732 - 700 }); sprite2.visible = false; var sprite3 = self.attachAsset('characterSprite3', { anchorX: 0.5, anchorY: 1, x: 280, y: 2732 - 700 }); sprite3.visible = false; self.show = function (isDecisionMoment, isMotivated) { sprite.tint = 0xffffff; // Always use white/no tint if (isMotivated) { sprite.visible = false; sprite2.visible = false; sprite3.visible = true; } else if (isDecisionMoment) { sprite.visible = false; sprite2.visible = true; sprite3.visible = false; } else { sprite.visible = true; sprite2.visible = false; sprite3.visible = false; } self.visible = true; }; self.hide = function () { self.visible = false; }; return self; }); var ChoiceSystem = Container.expand(function () { var self = Container.call(this); var choices = []; self.showChoices = function (choiceOptions) { self.clearChoices(); // Update character sprite for decision moment if Satoshi is visible if (selectedRoute && character.visible) { character.show(true); } for (var i = 0; i < choiceOptions.length; i++) { var choice = choiceOptions[i]; var choiceBtn = self.attachAsset('choiceButton', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1200 + i * 300 }); var choiceText = new Text2(choice.text, { size: 85, fill: 0x000000, wordWrap: true, wordWrapWidth: 750 }); choiceText.anchor.set(0.5, 0.5); choiceText.x = choiceBtn.x; choiceText.y = choiceBtn.y; self.addChild(choiceText); choiceBtn.choiceData = choice; choiceBtn.down = function () { game.makeChoice(this.choiceData); }; choices.push({ btn: choiceBtn, text: choiceText }); } self.visible = true; }; self.clearChoices = function () { for (var i = 0; i < choices.length; i++) { choices[i].btn.destroy(); choices[i].text.destroy(); } choices = []; self.visible = false; }; return self; }); var DialogSystem = Container.expand(function () { var self = Container.call(this); // Dialog box var dialogBox = self.attachAsset('dialogBox', { anchorX: 0.5, anchorY: 1, x: 1024, y: 2732 - 200 }); // Name box var nameBox = self.attachAsset('nameBox', { anchorX: 0, anchorY: 1, x: 50, y: 2732 - 600 }); // Texts var nameText = new Text2('', { size: 80, fill: 0x000000 }); nameText.anchor.set(0.5, 0.5); nameText.x = nameBox.x + 200; nameText.y = nameBox.y - 40; self.addChild(nameText); var dialogText = new Text2('', { size: 90, fill: 0x000000, wordWrap: true, wordWrapWidth: 1400 }); dialogText.anchor.set(0, 0); dialogText.x = dialogBox.x - 900; dialogText.y = dialogBox.y - 280; self.addChild(dialogText); // Next button var nextBtn = self.attachAsset('nextButton', { anchorX: 0.5, anchorY: 0.5, x: 1750, y: 2732 - 350 }); var nextText = new Text2('Siguiente', { size: 85, fill: 0x000000 }); nextText.anchor.set(0.5, 0.5); nextText.x = nextBtn.x; nextText.y = nextBtn.y; self.addChild(nextText); self.showDialog = function (speaker, text) { nameText.setText(speaker); dialogText.setText(text); self.visible = true; // Hide next button and text for GAME OVER if (speaker === 'GAME OVER') { nextBtn.visible = false; nextText.visible = false; } else { nextBtn.visible = true; nextText.visible = true; } }; self.hide = function () { self.visible = false; }; nextBtn.down = function () { if (game.currentChoices.length > 0) { game.showChoices(); } else { game.nextDialog(); } }; return self; }); var MathEvaluation = Container.expand(function () { var self = Container.call(this); var currentInputIndex = 0; var answers = ['', '', '', '']; var problems = [{ question: '8 + 5 = ', answer: '13' }, { question: '12 - 4 = ', answer: '8' }, { question: '3 × 6 = ', answer: '18' }, { question: '16 ÷ 4 = ', answer: '4' }]; var inputFields = []; var questionTexts = []; // Background var mathBackground = self.attachAsset('mathEvaluationBackground', { x: 0, y: 0 }); // Grid lines for notebook effect for (var i = 0; i < 50; i++) { var gridLine = self.attachAsset('gridLine', { x: 0, y: i * 50, scaleX: 40 }); } // Aiko character var aikoSprite = self.attachAsset('aikoEvaluation', { anchorX: 0.5, anchorY: 1, x: 1700, y: 1200, scaleX: 0.8, scaleY: 0.8 }); // Title var titleText = new Text2('Evaluación Matemática', { size: 120, fill: 0x000000 }); titleText.anchor.set(0.5, 0); titleText.x = 1024; titleText.y = 200; self.addChild(titleText); // Create problems and input fields for (var i = 0; i < problems.length; i++) { var questionText = new Text2(i + 1 + '. ' + problems[i].question, { size: 100, fill: 0x000000 }); questionText.anchor.set(0, 0.5); questionText.x = 300; questionText.y = 500 + i * 200; self.addChild(questionText); questionTexts.push(questionText); var inputField = self.attachAsset('mathEvaluationInput', { anchorX: 0.5, anchorY: 0.5, x: 900, y: 500 + i * 200 }); var inputText = new Text2('', { size: 80, fill: 0x000000 }); inputText.anchor.set(0.5, 0.5); inputText.x = inputField.x; inputText.y = inputField.y; self.addChild(inputText); inputField.inputText = inputText; inputField.problemIndex = i; inputField.down = function () { currentInputIndex = this.problemIndex; }; inputFields.push({ field: inputField, text: inputText }); } // Number buttons var numberButtons = []; for (var i = 0; i <= 9; i++) { var numBtn = self.attachAsset('mathEvaluationButton', { anchorX: 0.5, anchorY: 0.5, x: 200 + i % 5 * 120, y: 1600 + Math.floor(i / 5) * 100 }); var numText = new Text2(i.toString(), { size: 60, fill: 0xffffff }); numText.anchor.set(0.5, 0.5); numText.x = numBtn.x; numText.y = numBtn.y; self.addChild(numText); numBtn.number = i; numBtn.down = function () { if (answers[currentInputIndex].length < 3) { answers[currentInputIndex] += this.number.toString(); inputFields[currentInputIndex].text.setText(answers[currentInputIndex]); } }; numberButtons.push(numBtn); } // Clear button var clearBtn = self.attachAsset('mathEvaluationButton', { anchorX: 0.5, anchorY: 0.5, x: 800, y: 1600 }); var clearText = new Text2('Borrar', { size: 50, fill: 0xffffff }); clearText.anchor.set(0.5, 0.5); clearText.x = clearBtn.x; clearText.y = clearBtn.y; self.addChild(clearText); clearBtn.down = function () { answers[currentInputIndex] = ''; inputFields[currentInputIndex].text.setText(''); }; // Submit button var submitBtn = self.attachAsset('mathEvaluationButton', { anchorX: 0.5, anchorY: 0.5, x: 1000, y: 1600, scaleX: 1.5 }); var submitText = new Text2('Listo', { size: 60, fill: 0xffffff }); submitText.anchor.set(0.5, 0.5); submitText.x = submitBtn.x; submitText.y = submitBtn.y; self.addChild(submitText); submitBtn.down = function () { var allCorrect = true; for (var i = 0; i < problems.length; i++) { if (answers[i] !== problems[i].answer) { allCorrect = false; break; } } if (allCorrect) { game.startRomanticScene(); } else { // Handle incorrect answers - show failure scene game.startMathEvaluationFailure(); } }; return self; }); var RomanticScene = Container.expand(function () { var self = Container.call(this); var currentRomanticDialog = 0; var romanticDialogs = [{ speaker: 'Aiko', text: '...¿Todas correctas? Hmm... No está mal, para alguien como vos.' }, { speaker: 'Aiko', text: 'Vamos.', action: 'transition' }, { speaker: 'Aiko', text: '¿Sabés algo? No esperaba sentirme así después de enseñarle a alguien como vos.' }, { speaker: 'Aiko', text: 'Pero... hay algo que me gusta de tu esfuerzo. ...Y de tus ojos tontos también.' }, { speaker: 'Aiko', text: 'Eso fue por aprobar mi prueba.', action: 'kiss' }]; // Classroom at sunset background var sunsetBackground = self.attachAsset('aulaAtardecer', { x: 0, y: 0 }); // Aiko character - hidden by default since this is not math evaluation var aikoSprite = self.attachAsset('aikoEvaluation', { anchorX: 0.5, anchorY: 1, x: 1400, y: 2200, visible: false }); self.showRomanticDialog = function () { if (currentRomanticDialog >= romanticDialogs.length) { self.showFinalChoices(); return; } var dialog = romanticDialogs[currentRomanticDialog]; dialogSystem.showDialog(dialog.speaker, dialog.text); if (dialog.action === 'transition') { // Change to cleaning room background sunsetBackground.destroy(); var cleaningBackground = self.attachAsset('cuartoLimpiezaBackground', { x: 0, y: 0 }); // Keep aikoEvaluation hidden during romantic scene self.setChildIndex(aikoSprite, self.children.length - 1); // Ensure dialog system and choice system are visible and in front if (dialogSystem) { game.setChildIndex(dialogSystem, game.children.length - 1); dialogSystem.visible = true; } if (choiceSystem) { game.setChildIndex(choiceSystem, game.children.length - 1); choiceSystem.visible = true; } currentRomanticDialog++; } else if (dialog.text === '¿Sabés algo? No esperaba sentirme así después de enseñarle a alguien como vos.') { // Change background to school corridor for this specific dialog if (self.children.length > 0 && self.children[0].destroy) { self.children[0].destroy(); } var corridorBackground = self.attachAsset('schoolcorridor', { x: 0, y: 0 }); // Send background to back self.setChildIndex(corridorBackground, 0); // Keep aikoEvaluation hidden during romantic scene self.setChildIndex(aikoSprite, self.children.length - 1); // Ensure dialog system and choice system are visible and in front if (dialogSystem) { game.setChildIndex(dialogSystem, game.children.length - 1); dialogSystem.visible = true; } if (choiceSystem) { game.setChildIndex(choiceSystem, game.children.length - 1); choiceSystem.visible = true; } currentRomanticDialog++; } else if (dialog.text === 'Eso fue por aprobar mi prueba.') { // Change background to AikoKiss for this specific dialog if (self.children.length > 0 && self.children[0].destroy) { self.children[0].destroy(); } var kissBackground = self.attachAsset('AikoKiss', { x: 0, y: 0 }); // Send background to back self.setChildIndex(kissBackground, 0); // Show kiss effect LK.effects.flashScreen(0xff69b4, 500); var kissText = new Text2('Satoshi ha sido besado por primera vez.', { size: 80, fill: 0xff1493 }); kissText.anchor.set(0.5, 0.5); kissText.x = 1024; kissText.y = 1366; self.addChild(kissText); currentRomanticDialog++; } else if (dialog.action === 'kiss') { // Show kiss effect LK.effects.flashScreen(0xff69b4, 500); var kissText = new Text2('Satoshi ha sido besado por primera vez.', { size: 80, fill: 0xff1493 }); kissText.anchor.set(0.5, 0.5); kissText.x = 1024; kissText.y = 1366; self.addChild(kissText); currentRomanticDialog++; } else { currentRomanticDialog++; } }; self.showFinalChoices = function () { dialogSystem.hide(); var finalChoices = [{ text: 'Aiko... quiero más que un beso.', type: 'romantic' }, { text: 'No... no puedo hacer esto contigo.', type: 'reject' }]; choiceSystem.showChoices(finalChoices); }; return self; }); var TitleScreen = Container.expand(function () { var self = Container.call(this); var isActive = false; var catTouchCount = 0; var currentCatSprite = 0; var catAnimationTimer = 0; var hyperStarTimer = 0; var stars = []; var galaxies = []; var planets = []; var cat = null; var startButton = null; var logo = null; var catSprites = ['titleCat', 'titleCatFloat', 'titleCatJump', 'titleCatMeow', 'titleCatPlay', 'titleCatSleep', 'titleCatTongue', 'titleCatEat']; // Space background var spaceBackground = self.attachAsset('titleBackground', { x: 0, y: 0 }); // Create twinkling stars for (var i = 0; i < 50; i++) { var star = self.attachAsset('titleStar', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 2048, y: Math.random() * 2732, alpha: 0.3 + Math.random() * 0.7 }); star.twinklePhase = Math.random() * Math.PI * 2; stars.push(star); } // Create galaxies for (var i = 0; i < 8; i++) { var galaxy = self.attachAsset('titleGalaxy', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 2048, y: Math.random() * 2732, alpha: 0.4 + Math.random() * 0.3 }); galaxy.rotationSpeed = (Math.random() - 0.5) * 0.02; galaxies.push(galaxy); } // Create planets for (var i = 0; i < 6; i++) { var planet = self.attachAsset('titlePlanet', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 2048, y: Math.random() * 2732, alpha: 0.6 + Math.random() * 0.4 }); planet.tint = [0x32cd32, 0x4169e1, 0xff6347, 0xffa500, 0x9370db, 0xdc143c][Math.floor(Math.random() * 6)]; planets.push(planet); } // Logo (starts tiny) logo = self.attachAsset('titleScreenLogo', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 800, scaleX: 0.05, scaleY: 0.05 }); // Cat with bat preparation sprite cat = self.attachAsset('titleCatBat', { anchorX: 0.5, anchorY: 0.5, x: 300, y: 1200 }); // Start button (initially hidden) startButton = self.attachAsset('titleStartButton', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1600, visible: false, rotation: 0 }); var startButtonText = new Text2('COMENZAR', { size: 80, fill: 0xffffff }); startButtonText.anchor.set(0.5, 0.5); startButtonText.x = startButton.x; startButtonText.y = startButton.y; startButtonText.visible = false; self.addChild(startButtonText); self.activate = function () { isActive = true; self.visible = true; catTouchCount = 0; currentCatSprite = 0; catAnimationTimer = 0; hyperStarTimer = 0; // Animate logo growing tween(logo, { scaleX: 1, scaleY: 1 }, { duration: 2000, easing: tween.easeOut, onFinish: function onFinish() { // Start cat batting animation self.startCatBatAnimation(); } }); }; self.startCatBatAnimation = function () { // Change cat to hitting sprite cat.destroy(); cat = self.attachAsset('catBatHit', { anchorX: 0.5, anchorY: 0.5, x: 300, y: 1200 }); // Make button visible and animate it spinning to position startButton.visible = true; startButton.x = 300; startButton.y = 1200; startButton.rotation = 0; startButtonText.visible = true; startButtonText.x = 300; startButtonText.y = 1200; // Animate button spinning to final position tween(startButton, { x: 1024, y: 1600, rotation: Math.PI * 6 }, { duration: 1500, easing: tween.easeOut, onFinish: function onFinish() { startButton.rotation = 0; startButtonText.x = startButton.x; startButtonText.y = startButton.y; // Cat enters floating mode self.startCatFloating(); } }); tween(startButtonText, { x: 1024, y: 1600 }, { duration: 1500, easing: tween.easeOut }); }; self.startCatFloating = function () { // Change cat to floating sprite cat.destroy(); cat = self.attachAsset('titleCatFloat', { anchorX: 0.5, anchorY: 0.5, x: 300, y: 1200 }); // Make cat touchable cat.down = function () { catTouchCount++; if (catTouchCount >= 10) { self.transformCatToSpaceship(); } }; // Start floating animation tween(cat, { x: 1500, y: 400 }, { duration: 8000, easing: tween.linear, onFinish: function onFinish() { tween(cat, { x: 300, y: 1200 }, { duration: 8000, easing: tween.linear, onFinish: function onFinish() { if (catTouchCount < 10) { self.startCatFloating(); } } }); } }); }; self.transformCatToSpaceship = function () { // Show angry cat first cat.destroy(); cat = self.attachAsset('titleCatAngry', { anchorX: 0.5, anchorY: 0.5, x: cat.x, y: cat.y }); // Flash red tween(cat, { tint: 0xff0000 }, { duration: 500, onFinish: function onFinish() { tween(cat, { tint: 0xffffff }, { duration: 500, onFinish: function onFinish() { // Transform to spaceship cat.destroy(); cat = self.attachAsset('titleCatSpaceship', { anchorX: 0.5, anchorY: 0.5, x: cat.x, y: cat.y }); // Fly away to earth tween(cat, { x: 2200, y: -200, rotation: Math.PI * 2 }, { duration: 3000, easing: tween.easeIn, onFinish: function onFinish() { // Reset cat for new cycle catTouchCount = 0; self.startCatFloating(); } }); } }); } }); }; self.createHyperStar = function () { var hyperStar = self.attachAsset('titleHyperStar', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 2048, y: Math.random() * 2732, scaleX: 0.1, scaleY: 0.1 }); // Entry animation tween(hyperStar, { scaleX: 1.5, scaleY: 1.5 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { // Move in random direction var targetX = Math.random() * 2048; var targetY = Math.random() * 2732; tween(hyperStar, { x: targetX, y: targetY }, { duration: 1000, easing: tween.linear, onFinish: function onFinish() { // Fade out tween(hyperStar, { alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 500, onFinish: function onFinish() { hyperStar.destroy(); } }); } }); } }); }; self.update = function () { if (!isActive) return; // Animate twinkling stars for (var i = 0; i < stars.length; i++) { var star = stars[i]; star.twinklePhase += 0.1; star.alpha = 0.3 + Math.sin(star.twinklePhase) * 0.4; } // Rotate galaxies for (var i = 0; i < galaxies.length; i++) { galaxies[i].rotation += galaxies[i].rotationSpeed; } // Change cat sprite animation if (cat && catTouchCount < 10) { catAnimationTimer++; if (catAnimationTimer >= 180) { // 3 seconds at 60fps catAnimationTimer = 0; currentCatSprite = (currentCatSprite + 1) % catSprites.length; var oldX = cat.x; var oldY = cat.y; var wasFloating = cat.visible; cat.destroy(); cat = self.attachAsset(catSprites[currentCatSprite], { anchorX: 0.5, anchorY: 0.5, x: oldX, y: oldY }); // Restore touch handler cat.down = function () { catTouchCount++; if (catTouchCount >= 10) { self.transformCatToSpaceship(); } }; } } // Create hyper stars hyperStarTimer++; if (hyperStarTimer >= 900) { // 15 seconds at 60fps hyperStarTimer = 0; self.createHyperStar(); } }; // Start button functionality startButton.down = function () { if (isActive) { self.startGame(); } }; self.startGame = function () { isActive = false; self.visible = false; // Start the main game game.startMainGame(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xffffff }); /**** * Game Code ****/ // Fondos // Title screen var titleScreen = null; var isInTitleScreen = true; // Game state var currentScene = 0; var currentDialog = 0; var currentChoices = []; var relationshipPoints = { aiko: 0, yui: 0, hikari: 0, respect: 0, peace: 0, academic: 0 }; var selectedRoute = null; var currentBackground = null; var mathEvaluation = null; var romanticScene = null; var isInMathEvaluation = false; var isInRomanticScene = false; // Always start fresh - don't load saved data // Game will always begin from the beginning // UI Systems var dialogSystem = game.addChild(new DialogSystem()); var choiceSystem = game.addChild(new ChoiceSystem()); var character = game.addChild(new Character()); // Story data var storyScenes = [{ background: 'habitacion', dialogs: [{ speaker: 'Satoshi', text: '¡Ya es mi último año de secundaria! Necesito encontrar novia antes de graduarme.' }, { speaker: 'Satoshi', text: 'Pero primero... mejor hablo con mamá sobre mis planes.' }], choices: [{ text: 'Contarle todo a mamá', effects: { respect: 2, peace: -1 } }, { text: 'Mantenerlo en secreto', effects: { peace: 2, respect: -1 } }] }, { background: 'calle', dialogs: [{ speaker: 'Satoshi', text: 'Camino a la escuela... Hoy conoceré a las chicas que podrían cambiar mi vida.' }] }, { background: 'escuela', dialogs: [{ speaker: 'Satoshi', text: 'Aquí está la escuela. Veo tres chicas que me llaman la atención...' }, { speaker: 'Satoshi', text: 'Aiko, la delegada seria... Yui, mi amiga de la infancia... y Hikari, la misteriosa.' }], choices: [{ text: 'Acercarme a Aiko', route: 'aiko' }, { text: 'Hablar con Yui', route: 'yui' }, { text: 'Seguir a Hikari', route: 'hikari' }] }]; // Route-specific scenes var routeScenes = { aiko: [{ background: 'aula', dialogs: [{ speaker: 'Aiko', text: 'Satoshi-kun, necesitas ser más responsable con tus estudios.' }, { speaker: 'Satoshi', text: 'Tienes razón, Aiko. ¿Me ayudarías a estudiar?' }], choices: [{ text: 'Pedirle que sea mi tutora', effects: { aiko: 3 } }, { text: 'Sugerir estudiar juntos como amigos', effects: { aiko: 1 } }] }, { background: 'Aikosurprised', dialogs: [{ speaker: 'Aiko', text: '...¿Yo? ¿tu tutora?' }, { speaker: 'Aiko', text: 'Está bien. Pero no quiero distracciones. Si no cumplís, se acaba el trato.', backgroundChange: 'aula' }, { speaker: 'Satoshi', text: '¡Lo prometo! Seré el alumno más aplicado que hayas visto.' }] }, { background: 'aula', dialogs: [{ speaker: 'Aiko', text: 'Antes de seguir con estas sesiones, quiero comprobar cuánto sabés.', action: 'startMathEval', backgroundChange: 'Aikosmiling' }, { speaker: 'Aiko', text: 'Nada complicado. Empecemos.' }] }], yui: [{ background: 'patio', dialogs: [{ speaker: 'Yui', text: '¡Satoshi! Como en los viejos tiempos, ¿verdad?' }, { speaker: 'Satoshi', text: 'Sí, Yui... pero ahora te veo diferente.' }], choices: [{ text: 'Confesarle mis sentimientos', effects: { yui: 3 } }, { text: 'Mantener la amistad por ahora', effects: { yui: 1 } }] }], hikari: [{ background: 'aula2', dialogs: [{ speaker: 'Hikari', text: 'Te has dado cuenta de mí... interesante.' }, { speaker: 'Satoshi', text: 'Hay algo especial en ti, Hikari.' }], choices: [{ text: 'Preguntarle sobre su misterio', effects: { hikari: 3 } }, { text: 'Invitarla a caminar', effects: { hikari: 2 } }] }] }; function changeBackground(backgroundType) { if (currentBackground) { currentBackground.destroy(); } currentBackground = game.addChild(LK.getAsset(backgroundType, { x: 0, y: 0 })); // Send background to back game.setChildIndex(currentBackground, 0); } function showCurrentDialog() { var scene = getCurrentScene(); if (!scene || !scene.dialogs || currentDialog >= scene.dialogs.length) { if (scene && scene.choices) { currentChoices = scene.choices; choiceSystem.showChoices(scene.choices); dialogSystem.hide(); } else { nextScene(); } return; } var dialog = scene.dialogs[currentDialog]; dialogSystem.showDialog(dialog.speaker, dialog.text); // Handle background changes within dialog if (dialog.backgroundChange) { changeBackground(dialog.backgroundChange); } // Before route selection: hide characterSprite, show full Satoshi // After route selection: show characterSprite for Satoshi, hide for others if (!selectedRoute) { // Before route selection - always hide characterSprite character.hide(); } else { // After route selection - show characterSprite for Satoshi, hide for others if (dialog.speaker === 'Satoshi') { // Check if this is the specific promise dialog in Aiko route var isMotivatedMoment = selectedRoute === 'aiko' && currentScene === 4 && currentDialog === 2 && dialog.text === '¡Lo prometo! Seré el alumno más aplicado que hayas visto.'; character.show(false, isMotivatedMoment); } else { character.hide(); } } choiceSystem.clearChoices(); } function getCurrentScene() { if (selectedRoute && routeScenes[selectedRoute]) { var routeIndex = currentScene - storyScenes.length; if (routeIndex >= 0 && routeIndex < routeScenes[selectedRoute].length) { return routeScenes[selectedRoute][routeIndex]; } } if (currentScene < storyScenes.length) { return storyScenes[currentScene]; } return null; } function nextScene() { currentScene++; currentDialog = 0; currentChoices = []; // No auto-save - game resets on refresh var scene = getCurrentScene(); if (scene) { if (scene.background) { changeBackground(scene.background); } showCurrentDialog(); } else { showEnding(); } } function showEnding() { var maxPoints = 0; var winner = null; if (selectedRoute) { maxPoints = relationshipPoints[selectedRoute]; winner = selectedRoute; } var endingText = ''; if (maxPoints >= 3) { endingText = '¡Felicidades! Has encontrado el amor verdadero con ' + (winner === 'aiko' ? 'Aiko' : winner === 'yui' ? 'Yui' : 'Hikari') + '!'; LK.showYouWin(); } else { endingText = 'Aunque no encontraste el amor esta vez, aprendiste mucho sobre ti mismo.'; dialogSystem.showDialog('Narrador', endingText); } } game.nextDialog = function () { // If we're in romantic scene, continue with romantic dialog if (isInRomanticScene && romanticScene) { romanticScene.showRomanticDialog(); return; } var scene = getCurrentScene(); var dialog = scene && scene.dialogs ? scene.dialogs[currentDialog] : null; if (dialog && dialog.action === 'startMathEval' && !isInMathEvaluation) { game.startMathEvaluation(); return; } currentDialog++; // No auto-save for dialog progress showCurrentDialog(); }; game.startMathEvaluation = function () { isInMathEvaluation = true; dialogSystem.hide(); character.hide(); if (currentBackground) { currentBackground.destroy(); } mathEvaluation = game.addChild(new MathEvaluation()); }; game.startMathEvaluationFailure = function () { isInMathEvaluation = false; if (mathEvaluation) { mathEvaluation.destroy(); mathEvaluation = null; } if (currentBackground) { currentBackground.destroy(); } // Change to cold, grey classroom changeBackground('aula'); character.hide(); // Show Aiko's disappointed reaction with specific dialogs var failureDialogs = [{ speaker: 'Aiko', text: '...¿En serio?' }, { speaker: 'Aiko', text: 'Pensé que podrías con algo tan simple. Pero está claro que puse expectativas demasiado altas en vos.' }, { speaker: 'Aiko', text: 'Mejor andá a pedirle ayuda a tu mamá. Quizás con dibujos entiendas.' }, { speaker: 'GAME OVER', text: '¡Por eso eres virgen!' }]; var failureDialogIndex = 0; function showFailureDialog() { if (failureDialogIndex < failureDialogs.length) { var dialog = failureDialogs[failureDialogIndex]; dialogSystem.showDialog(dialog.speaker, dialog.text); failureDialogIndex++; if (dialog.speaker === 'GAME OVER') { LK.effects.flashScreen(0xff0000, 1000); } } } // Override nextDialog temporarily for failure sequence var originalNextDialog = game.nextDialog; game.nextDialog = function () { showFailureDialog(); if (failureDialogIndex >= failureDialogs.length) { // Restore original nextDialog game.nextDialog = originalNextDialog; } }; showFailureDialog(); }; game.startRomanticScene = function () { isInMathEvaluation = false; isInRomanticScene = true; if (mathEvaluation) { mathEvaluation.destroy(); mathEvaluation = null; } if (currentBackground) { currentBackground.destroy(); } romanticScene = game.addChild(new RomanticScene()); romanticScene.showRomanticDialog(); }; game.makeChoice = function (choice) { // Handle romantic scene choices if (isInRomanticScene && choice.type) { choiceSystem.clearChoices(); if (choice.type === 'romantic') { // Show positive romantic outcome if (romanticScene) { romanticScene.destroy(); } // Change background to AikoPoseOjou for this specific dialog if (currentBackground) { currentBackground.destroy(); } currentBackground = game.addChild(LK.getAsset('AikoPoseOjou', { x: 0, y: 0 })); // Send background to back game.setChildIndex(currentBackground, 0); relationshipPoints.aiko += 2; dialogSystem.showDialog('Aiko', '¿Más...? Sos más valiente de lo que pensaba. Pero antes de seguir... prométeme que vas a seguir estudiando conmigo.'); LK.showYouWin(); } else if (choice.type === 'reject') { // Show game over if (romanticScene) { romanticScene.destroy(); } LK.effects.flashScreen(0xff0000, 1000); dialogSystem.showDialog('GAME OVER', '¡Por eso eres virgen!'); } return; } // Reset character sprite to normal state if (selectedRoute && character.visible) { character.show(false); } if (choice.effects) { for (var key in choice.effects) { relationshipPoints[key] += choice.effects[key]; } } // Special handling for Aiko route choices if (selectedRoute === 'aiko' && currentScene === 3) { if (choice.text === 'Pedirle que sea mi tutora') { relationshipPoints.academic += 1; } else if (choice.text === 'Sugerir estudiar juntos como amigos') { // Trigger immediate game over dialogSystem.hide(); choiceSystem.clearChoices(); LK.effects.flashScreen(0xff0000, 1000); dialogSystem.showDialog('GAME OVER', '¡Por eso eres virgen!'); return; } } if (choice.route) { selectedRoute = choice.route; } choiceSystem.clearChoices(); currentChoices = []; nextScene(); }; game.showChoices = function () { if (currentChoices.length > 0) { choiceSystem.showChoices(currentChoices); dialogSystem.hide(); } }; // Initialize title screen first titleScreen = game.addChild(new TitleScreen()); titleScreen.activate(); game.startMainGame = function () { isInTitleScreen = false; if (titleScreen) { titleScreen.destroy(); titleScreen = null; } // Initialize main game changeBackground('habitacion'); showCurrentDialog(); }; // Restart button in top-right corner var restartButton = LK.gui.topRight.addChild(LK.getAsset('nextButton', { anchorX: 1, anchorY: 0, x: -20, y: 20, scaleX: 0.8, scaleY: 0.8 })); var restartText = new Text2('Reiniciar', { size: 70, fill: 0x000000 }); restartText.anchor.set(0.5, 0.5); restartText.x = restartButton.x - restartButton.width * 0.4; restartText.y = restartButton.y + restartButton.height * 0.4; LK.gui.topRight.addChild(restartText); restartButton.down = function () { // Clear all saved data delete storage.currentScene; delete storage.currentDialog; delete storage.relationshipPoints; delete storage.selectedRoute; // Reset game state variables currentScene = 0; currentDialog = 0; currentChoices = []; relationshipPoints = { aiko: 0, yui: 0, hikari: 0, respect: 0, peace: 0, academic: 0 }; selectedRoute = null; isInMathEvaluation = false; isInRomanticScene = false; // Reset the nextDialog function to original state game.nextDialog = function () { // If we're in romantic scene, continue with romantic dialog if (isInRomanticScene && romanticScene) { romanticScene.showRomanticDialog(); return; } var scene = getCurrentScene(); var dialog = scene && scene.dialogs ? scene.dialogs[currentDialog] : null; if (dialog && dialog.action === 'startMathEval' && !isInMathEvaluation) { game.startMathEvaluation(); return; } currentDialog++; // No auto-save for dialog progress showCurrentDialog(); }; // Destroy any active special scenes if (mathEvaluation) { mathEvaluation.destroy(); mathEvaluation = null; } if (romanticScene) { romanticScene.destroy(); romanticScene = null; } // Clear UI choiceSystem.clearChoices(); character.hide(); // Reset dialog system buttons dialogSystem.showDialog('', ''); dialogSystem.hide(); // Return to title screen isInTitleScreen = true; if (currentBackground) { currentBackground.destroy(); currentBackground = null; } titleScreen = game.addChild(new TitleScreen()); titleScreen.activate(); }; // Game update loop game.update = function () { if (isInTitleScreen && titleScreen) { titleScreen.update(); } }; // Add game state to global for debugging game.currentChoices = currentChoices; ;
===================================================================
--- original.js
+++ change.js
@@ -472,209 +472,276 @@
return self;
});
var TitleScreen = Container.expand(function () {
var self = Container.call(this);
+ var isActive = false;
+ var catTouchCount = 0;
+ var currentCatSprite = 0;
+ var catAnimationTimer = 0;
+ var hyperStarTimer = 0;
+ var stars = [];
+ var galaxies = [];
+ var planets = [];
+ var cat = null;
+ var startButton = null;
+ var logo = null;
+ var catSprites = ['titleCat', 'titleCatFloat', 'titleCatJump', 'titleCatMeow', 'titleCatPlay', 'titleCatSleep', 'titleCatTongue', 'titleCatEat'];
// Space background
var spaceBackground = self.attachAsset('titleBackground', {
x: 0,
y: 0
});
- // Logo - starts tiny and grows
- var logo = self.attachAsset('titleScreenLogo', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 1024,
- y: 800,
- scaleX: 0.1,
- scaleY: 0.1
- });
- // Start button - initially hidden
- var startButton = self.attachAsset('titleStartButton', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 1024,
- y: 1500,
- visible: false
- });
- // Cat sprite - starts with bat prep
- var catSprite = self.attachAsset('catBatPrep', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 500,
- y: 1500
- });
- // Stars array
- var stars = [];
- var galaxies = [];
- var planets = [];
- // Create background stars
+ // Create twinkling stars
for (var i = 0; i < 50; i++) {
- var star = self.attachAsset('star', {
+ var star = self.attachAsset('titleStar', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
- y: Math.random() * 2732
+ y: Math.random() * 2732,
+ alpha: 0.3 + Math.random() * 0.7
});
+ star.twinklePhase = Math.random() * Math.PI * 2;
stars.push(star);
}
// Create galaxies
for (var i = 0; i < 8; i++) {
- var galaxy = self.attachAsset('galaxy', {
+ var galaxy = self.attachAsset('titleGalaxy', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
- y: Math.random() * 2732
+ y: Math.random() * 2732,
+ alpha: 0.4 + Math.random() * 0.3
});
+ galaxy.rotationSpeed = (Math.random() - 0.5) * 0.02;
galaxies.push(galaxy);
}
// Create planets
- for (var i = 0; i < 5; i++) {
- var planet = self.attachAsset('planet', {
+ for (var i = 0; i < 6; i++) {
+ var planet = self.attachAsset('titlePlanet', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
- y: Math.random() * 2732
+ y: Math.random() * 2732,
+ alpha: 0.6 + Math.random() * 0.4
});
+ planet.tint = [0x32cd32, 0x4169e1, 0xff6347, 0xffa500, 0x9370db, 0xdc143c][Math.floor(Math.random() * 6)];
planets.push(planet);
}
- // Game state
- var animationPhase = 'logoGrow';
- var catTouchCount = 0;
- var catCurrentSprite = 0;
- var catSpriteNames = ['catFloat', 'catJump', 'catMeow', 'catPlay', 'catSleep', 'catTongue', 'catEat'];
- var catSpriteTimer = 0;
- var catFloatX = 0;
- var catFloatY = 0;
- var hyperStarTimer = 0;
- var starTwinkleTimer = 0;
- // Animation methods
- self.startLogoAnimation = function () {
+ // Logo (starts tiny)
+ logo = self.attachAsset('titleScreenLogo', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 800,
+ scaleX: 0.05,
+ scaleY: 0.05
+ });
+ // Cat with bat preparation sprite
+ cat = self.attachAsset('titleCatBat', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 300,
+ y: 1200
+ });
+ // Start button (initially hidden)
+ startButton = self.attachAsset('titleStartButton', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1600,
+ visible: false,
+ rotation: 0
+ });
+ var startButtonText = new Text2('COMENZAR', {
+ size: 80,
+ fill: 0xffffff
+ });
+ startButtonText.anchor.set(0.5, 0.5);
+ startButtonText.x = startButton.x;
+ startButtonText.y = startButton.y;
+ startButtonText.visible = false;
+ self.addChild(startButtonText);
+ self.activate = function () {
+ isActive = true;
+ self.visible = true;
+ catTouchCount = 0;
+ currentCatSprite = 0;
+ catAnimationTimer = 0;
+ hyperStarTimer = 0;
+ // Animate logo growing
tween(logo, {
- scaleX: 1.0,
- scaleY: 1.0
+ scaleX: 1,
+ scaleY: 1
}, {
duration: 2000,
easing: tween.easeOut,
onFinish: function onFinish() {
+ // Start cat batting animation
self.startCatBatAnimation();
}
});
};
self.startCatBatAnimation = function () {
- animationPhase = 'catBat';
- // Change to bat hit sprite
- catSprite.destroy();
- catSprite = self.attachAsset('catBatHit', {
+ // Change cat to hitting sprite
+ cat.destroy();
+ cat = self.attachAsset('catBatHit', {
anchorX: 0.5,
anchorY: 0.5,
- x: 500,
- y: 1500
+ x: 300,
+ y: 1200
});
- // Show and animate button
+ // Make button visible and animate it spinning to position
startButton.visible = true;
+ startButton.x = 300;
+ startButton.y = 1200;
startButton.rotation = 0;
+ startButtonText.visible = true;
+ startButtonText.x = 300;
+ startButtonText.y = 1200;
+ // Animate button spinning to final position
tween(startButton, {
+ x: 1024,
+ y: 1600,
rotation: Math.PI * 6
}, {
duration: 1500,
easing: tween.easeOut,
onFinish: function onFinish() {
+ startButton.rotation = 0;
+ startButtonText.x = startButton.x;
+ startButtonText.y = startButton.y;
+ // Cat enters floating mode
self.startCatFloating();
}
});
+ tween(startButtonText, {
+ x: 1024,
+ y: 1600
+ }, {
+ duration: 1500,
+ easing: tween.easeOut
+ });
};
self.startCatFloating = function () {
- animationPhase = 'catFloat';
- catSprite.destroy();
- catSprite = self.attachAsset('catFloat', {
+ // Change cat to floating sprite
+ cat.destroy();
+ cat = self.attachAsset('titleCatFloat', {
anchorX: 0.5,
anchorY: 0.5,
- x: 500,
- y: 1500
+ x: 300,
+ y: 1200
});
- catFloatX = 1;
- catFloatY = 0.5;
+ // Make cat touchable
+ cat.down = function () {
+ catTouchCount++;
+ if (catTouchCount >= 10) {
+ self.transformCatToSpaceship();
+ }
+ };
+ // Start floating animation
+ tween(cat, {
+ x: 1500,
+ y: 400
+ }, {
+ duration: 8000,
+ easing: tween.linear,
+ onFinish: function onFinish() {
+ tween(cat, {
+ x: 300,
+ y: 1200
+ }, {
+ duration: 8000,
+ easing: tween.linear,
+ onFinish: function onFinish() {
+ if (catTouchCount < 10) {
+ self.startCatFloating();
+ }
+ }
+ });
+ }
+ });
};
- self.changeCatSprite = function () {
- if (animationPhase !== 'catFloat') return;
- var oldSprite = catSprite;
- catSprite = self.attachAsset(catSpriteNames[catCurrentSprite], {
+ self.transformCatToSpaceship = function () {
+ // Show angry cat first
+ cat.destroy();
+ cat = self.attachAsset('titleCatAngry', {
anchorX: 0.5,
anchorY: 0.5,
- x: oldSprite.x,
- y: oldSprite.y
+ x: cat.x,
+ y: cat.y
});
- oldSprite.destroy();
- catCurrentSprite = (catCurrentSprite + 1) % catSpriteNames.length;
- };
- self.handleCatTouch = function () {
- if (animationPhase !== 'catFloat') return;
- catTouchCount++;
- if (catTouchCount >= 10) {
- // Transform to angry then spaceship
- var oldSprite = catSprite;
- catSprite = self.attachAsset('catAngry', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: oldSprite.x,
- y: oldSprite.y
- });
- oldSprite.destroy();
- LK.setTimeout(function () {
- var angrySprite = catSprite;
- catSprite = self.attachAsset('catSpaceship', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: angrySprite.x,
- y: angrySprite.y
- });
- angrySprite.destroy();
- // Fly away to Earth
- tween(catSprite, {
- x: 2200,
- y: -200
+ // Flash red
+ tween(cat, {
+ tint: 0xff0000
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ tween(cat, {
+ tint: 0xffffff
}, {
- duration: 3000,
- easing: tween.easeIn
+ duration: 500,
+ onFinish: function onFinish() {
+ // Transform to spaceship
+ cat.destroy();
+ cat = self.attachAsset('titleCatSpaceship', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: cat.x,
+ y: cat.y
+ });
+ // Fly away to earth
+ tween(cat, {
+ x: 2200,
+ y: -200,
+ rotation: Math.PI * 2
+ }, {
+ duration: 3000,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ // Reset cat for new cycle
+ catTouchCount = 0;
+ self.startCatFloating();
+ }
+ });
+ }
});
- }, 1000);
- }
+ }
+ });
};
self.createHyperStar = function () {
- var hyperStar = self.attachAsset('hyperStar', {
+ var hyperStar = self.attachAsset('titleHyperStar', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
y: Math.random() * 2732,
scaleX: 0.1,
scaleY: 0.1
});
- // Entrance animation
+ // Entry animation
tween(hyperStar, {
- scaleX: 1.0,
- scaleY: 1.0
+ scaleX: 1.5,
+ scaleY: 1.5
}, {
- duration: 500,
+ duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
- // Movement
+ // Move in random direction
var targetX = Math.random() * 2048;
var targetY = Math.random() * 2732;
tween(hyperStar, {
x: targetX,
y: targetY
}, {
- duration: 2000,
+ duration: 1000,
easing: tween.linear,
onFinish: function onFinish() {
- // Exit animation
+ // Fade out
tween(hyperStar, {
+ alpha: 0,
scaleX: 0.1,
- scaleY: 0.1,
- alpha: 0
+ scaleY: 0.1
}, {
duration: 500,
- easing: tween.easeIn,
onFinish: function onFinish() {
hyperStar.destroy();
}
});
@@ -682,66 +749,66 @@
});
}
});
};
- // Touch handlers
- catSprite.down = function () {
- self.handleCatTouch();
- };
- startButton.down = function () {
- game.startMainGame();
- };
self.update = function () {
- // Star twinkling
- starTwinkleTimer++;
- if (starTwinkleTimer > 30) {
- starTwinkleTimer = 0;
- for (var i = 0; i < stars.length; i++) {
- if (Math.random() < 0.1) {
- var star = stars[i];
- tween(star, {
- alpha: 0.3
- }, {
- duration: 300,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(star, {
- alpha: 1.0
- }, {
- duration: 300,
- easing: tween.easeInOut
- });
- }
- });
- }
- }
+ if (!isActive) return;
+ // Animate twinkling stars
+ for (var i = 0; i < stars.length; i++) {
+ var star = stars[i];
+ star.twinklePhase += 0.1;
+ star.alpha = 0.3 + Math.sin(star.twinklePhase) * 0.4;
}
- // Cat floating movement
- if (animationPhase === 'catFloat' && catSprite) {
- catSprite.x += catFloatX;
- catSprite.y += catFloatY;
- // Bounce off edges
- if (catSprite.x > 2048 - 100 || catSprite.x < 100) {
- catFloatX *= -1;
+ // Rotate galaxies
+ for (var i = 0; i < galaxies.length; i++) {
+ galaxies[i].rotation += galaxies[i].rotationSpeed;
+ }
+ // Change cat sprite animation
+ if (cat && catTouchCount < 10) {
+ catAnimationTimer++;
+ if (catAnimationTimer >= 180) {
+ // 3 seconds at 60fps
+ catAnimationTimer = 0;
+ currentCatSprite = (currentCatSprite + 1) % catSprites.length;
+ var oldX = cat.x;
+ var oldY = cat.y;
+ var wasFloating = cat.visible;
+ cat.destroy();
+ cat = self.attachAsset(catSprites[currentCatSprite], {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: oldX,
+ y: oldY
+ });
+ // Restore touch handler
+ cat.down = function () {
+ catTouchCount++;
+ if (catTouchCount >= 10) {
+ self.transformCatToSpaceship();
+ }
+ };
}
- if (catSprite.y > 2732 - 100 || catSprite.y < 100) {
- catFloatY *= -1;
- }
- // Change sprite periodically
- catSpriteTimer++;
- if (catSpriteTimer > 300) {
- catSpriteTimer = 0;
- self.changeCatSprite();
- }
}
- // Hyper star spawning
+ // Create hyper stars
hyperStarTimer++;
- if (hyperStarTimer > 900) {
- // Every 15 seconds at 60fps
+ if (hyperStarTimer >= 900) {
+ // 15 seconds at 60fps
hyperStarTimer = 0;
self.createHyperStar();
}
};
+ // Start button functionality
+ startButton.down = function () {
+ if (isActive) {
+ self.startGame();
+ }
+ };
+ self.startGame = function () {
+ isActive = false;
+ self.visible = false;
+ // Start the main game
+ game.startMainGame();
+ };
return self;
});
/****
@@ -754,8 +821,11 @@
/****
* Game Code
****/
// Fondos
+// Title screen
+var titleScreen = null;
+var isInTitleScreen = true;
// Game state
var currentScene = 0;
var currentDialog = 0;
var currentChoices = [];
@@ -772,21 +842,14 @@
var mathEvaluation = null;
var romanticScene = null;
var isInMathEvaluation = false;
var isInRomanticScene = false;
-// Game state management
-var gameState = 'title'; // 'title' or 'main'
-var titleScreen = null;
// Always start fresh - don't load saved data
// Game will always begin from the beginning
// UI Systems
var dialogSystem = game.addChild(new DialogSystem());
var choiceSystem = game.addChild(new ChoiceSystem());
var character = game.addChild(new Character());
-// Hide main game UI initially
-dialogSystem.hide();
-choiceSystem.clearChoices();
-character.hide();
// Story data
var storyScenes = [{
background: 'habitacion',
dialogs: [{
@@ -1166,29 +1229,21 @@
choiceSystem.showChoices(currentChoices);
dialogSystem.hide();
}
};
-// Start with title screen
-function startTitleScreen() {
- gameState = 'title';
- if (currentBackground) {
- currentBackground.destroy();
- }
- titleScreen = game.addChild(new TitleScreen());
- titleScreen.startLogoAnimation();
-}
+// Initialize title screen first
+titleScreen = game.addChild(new TitleScreen());
+titleScreen.activate();
game.startMainGame = function () {
- gameState = 'main';
+ isInTitleScreen = false;
if (titleScreen) {
titleScreen.destroy();
titleScreen = null;
}
// Initialize main game
changeBackground('habitacion');
showCurrentDialog();
};
-// Start with title screen
-startTitleScreen();
// Restart button in top-right corner
var restartButton = LK.gui.topRight.addChild(LK.getAsset('nextButton', {
anchorX: 1,
anchorY: 0,
@@ -1257,16 +1312,22 @@
character.hide();
// Reset dialog system buttons
dialogSystem.showDialog('', '');
dialogSystem.hide();
- // Reset to beginning
- changeBackground('habitacion');
- showCurrentDialog();
+ // Return to title screen
+ isInTitleScreen = true;
+ if (currentBackground) {
+ currentBackground.destroy();
+ currentBackground = null;
+ }
+ titleScreen = game.addChild(new TitleScreen());
+ titleScreen.activate();
};
-// Add game state to global for debugging
-game.currentChoices = currentChoices;
+// Game update loop
game.update = function () {
- // Handle title screen updates
- if (gameState === 'title' && titleScreen) {
+ if (isInTitleScreen && titleScreen) {
titleScreen.update();
}
-};
\ No newline at end of file
+};
+// Add game state to global for debugging
+game.currentChoices = currentChoices;
+;
\ No newline at end of file
A cute 15-year-old red-haired boy with intense red eyes, wearing a traditional Japanese school uniform (gakuran). He's running down the street with a serious and confident expression. Despite his determined look, his appearance remains sweet and endearing. His gaze is focused straight ahead, with the wind gently lifting his hair and school jacket. The scene is illustrated in Pixel Art style.. In-Game asset. 2d. High contrast. No shadows
A cute 15-year-old red-haired boy with red eyes, wearing a traditional Japanese school uniform (gakuran). He has a big closed-mouth smile, shining eyes, and clenched fists held forward, as if encouraging himself. Behind him, other Japanese students can be seen. The scene is illustrated in Pixel Art style.. In-Game asset. 2d. High contrast. No shadows
A cute anime-style girl in pixel art, with an emo aesthetic and striking purple eyes. She wears a classic Japanese school uniform (sailor fuku) and is often shown with a slightly grumpy expression, reflecting a bit of a tsundere personality. She stands confidently with her hands on her hips and a slight tilt to her posture. Behind her is a typical Japanese classroom, enhancing the school-themed atmosphere.. In-Game asset. 2d. High contrast. No shadows
She’s a cute anime girl with a free-spirited and rebellious vibe. Her hair is pink, and she’s wearing a traditional Japanese school uniform (sailor fuku). She sports dark sunglasses and holds a skateboard in one hand while pointing with the other. Her face lights up with a big smile and mischievous pink eyes that match her hair. In the background, there's a Japanese classroom, and the entire artwork is done in Pixel Art style.. In-Game asset. 2d. High contrast. No shadows
Stella is a sweet and very kawaii 15-year-old anime girl with short, soft blue-gray hair (HEX: #b0b9d8) and black eyes. She wears a traditional Japanese school uniform called a sailor fuku. Stella is extremely shy—she blushes easily, avoids eye contact, and often covers herself when she feels nervous. In this Pixel Art scene, she’s gently touching the tips of her index fingers together, a classic gesture of shyness seen in anime. Behind her is the courtyard of a Japanese middle school, completing the charming school setting.. In-Game asset. 2d. High contrast. No shadows
A kawaii anime boy with intense red eyes, each containing shining stars. He raises his fist forward with determination, wearing a wide, open smile full of enthusiasm. Sparkles and glimmers float around him, symbolizing hope. The entire scene is rendered in Pixel Art style.
A kawaii anime boy with red eyes and a serious expression stands with his eyes closed, resting a hand under his chin in a thoughtful pose. He’s wearing a traditional Japanese school uniform called a gakuran. Suddenly, a lightbulb appears above his head—the classic symbol of a brilliant idea. He opens his eyes with determination, a confident smile forming on his face. It's Pixel Art.
Remove the sparkles from the background.
Pure white. 2d
A cute anime-style girl in pixel art, with an emo aesthetic, striking purple eyes, and a classic Japanese school uniform (sailor fuku), is studying with furrowed brows and a confident smile. She sits next to a shy red-haired boy with red eyes, also in pixel art style. Their desks are pushed together, and on the boy’s desk lies an open notebook, which he nervously stares at while holding a graphite pencil. The girl looks at him with a mix of sternness and confidence, convinced he won’t pass the exam. The background depicts a typical Japanese classroom.
A cute anime-style girl rendered in pixel art, with an emo aesthetic and striking purple eyes, is wearing a high school cheerleader uniform and holding pom-poms in both hands. With her arms and legs extended in a dynamic pose, she winks playfully while cheering. The background is an American football field.
A cute anime-style girl depicted in pixel art, with an emo aesthetic and striking purple eyes. She's wearing a classic Japanese school uniform (sailor fuku). She has a shy expression, with blushing cheeks and an averted gaze. Her left hand is playing with her hair, while her right hand rests on her chest. In the background, there's a typical anime-style classroom.
In pixel art style, a cute anime-style girl with an emo aesthetic, striking purple eyes, and a Japanese school uniform (sailor fuku) suddenly pulls the hand of a shy red-haired boy with red eyes, who is wearing a gakuran and sitting in front of a rectangular desk. She smiles brightly with her eyes closed as she yanks him toward her, pulling him out of his seat. The boy looks confused and nervous, flustered by the sudden physical contact. In the background, a typical Japanese classroom can be seen.
The camera focuses only on their hands. The girl, wearing a traditional Japanese sailor fuku uniform, firmly grabs the hand of the boy, who is dressed in a classic gakuran. She pulls him forward with energy and excitement. His hand follows with slight tension, expressing surprise. Nothing else is shown—just the gesture: a meaningful connection captured in the simple act of their hands intertwined. Behind them stretches a Japanese school hallway, all rendered in a charming Pixel Art style.
A cute anime-style girl with an emo aesthetic, striking purple eyes, and dressed in a traditional Japanese school uniform (sailor fuku), suddenly gives an unexpected kiss on the lips to a sweet red-haired boy with deep crimson eyes, wearing a classic gakuran school uniform. As she kisses him, her cheeks are deeply flushed, while he, also blushing, wears a look of shock and disbelief — not only was the kiss completely unprompted, but it’s also the very first time anyone has ever kissed him. Behind them stretches a Japanese school hallway, all rendered in a charming Pixel Art style.
A charming anime-style girl rendered in delightful Pixel Art, featuring an emo aesthetic, striking purple eyes, and a classic Japanese school uniform (sailor fuku). She confidently strikes the iconic “Ojou-sama pose”: Her left hand is elegantly lifted near her face, fingers gracefully splayed like a fan, perfectly framing her smug expression. Her face bears a tilted, self-assured smile, the kind that practically echoes a soft, aristocratic “Ohoho~” laugh. One eyebrow arches subtly, radiating playful confidence and a touch of superiority. Her right hand rests casually near her waist, loosely clenched into a relaxed fist — an anchor for her graceful yet dominant posture. Behind her stretches the polished hallway of a Japanese school, complete with sliding doors and sunlit windows, completing the scene with a nostalgic, everyday charm — all captured in the cozy, detailed charm of Pixel Art.
A cute gray chibi-style anime kitten, dressed in an astronaut suit and drifting through the universe, rendered in Pixel Art.
A cute gray kitten, drawn in an adorable chibi anime style and wearing an astronaut suit, floats in outer space with its little paws outstretched as if reaching out for a hug. It meows sweetly, and the entire scene is illustrated in charming Pixel Art style.
A cute chibi-style anime kitten, dressed in an astronaut suit and drifting through the universe, rendered in Pixel Art.
White star of the universe in Pixel Art style
Planet Earth of the universe in Pixel Art style
Create a title screen logo with the following text: "Corazón de Estudiante - Novela Visual" Behind the text, the Andromeda Galaxy (M31) stretches across the background, creating a dreamy, cosmic atmosphere that evokes mystery and romance.
A cute kitten, illustrated in an adorable chibi anime style and wearing an astronaut suit, is playfully tangled in a ball of yarn, floating through space with overwhelming joy. Its eyes are shut tight in pure happiness, and its movements are full of energetic delight.
Three-quarter view pixel art jetpack
Transparent, colorless glass button that says "Empezar" (Spanish for "Start"), featuring an adventure video game font and Pixel Art style.
Advertencia que dice: "Sin usar"
A realistic yellow star from the universe, in pixel art style.
Pure white
A cute, red-haired anime boy, 15 years old, with red eyes. He's in pajamas, looking sleepy, rubbing one eye with his hand. He's in his otaku-style bedroom. The scene is illustrated in Pixel Art style.
Blue button with two yellow chevrons in a row, pixel art style.
A green circular button featuring a fuchsia-colored refresh icon, designed in Pixel Art style.
Stella is a 15-year-old anime girl—sweet and incredibly kawaii—with short, soft hair in a bluish-gray tone (HEX: #b0b9d8) and deep black eyes. She wears a traditional Japanese school uniform, the classic sailor-style fuku. In her right hand, she holds a butcher knife. Her expression is serious, and her eyes, now glowing with an intense yandere red, reflect jealousy and obsession. Dark under-eye circles emphasize her unsettling gaze. She is inside a high school locker in a Japanese school. Her right hand is slightly raised, gripping the knife, while her left hand gently touches the blade with her index finger, mimicking the motion of a clock hand—adding to the eerie atmosphere. To emphasize the feeling of being inside the locker, soft light shines through the ventilation slits, casting dramatic shadows across her face. The entire scene is rendered in detailed Pixel Art style, enhancing both the cuteness and the unsettling atmosphere of the character and setting.
Yui y un niño anime, ambos de 5 o 6 años, corren por un parque soleado en una carrera infantil. Yui tiene el cabello corto, suave, azul grisáceo (HEX: #b0b9d8) y ojos negros. Lleva un vestido lavanda claro con volantes blancos y zapatillas blancas con detalles rosa pastel. Sonríe tímidamente con mejillas sonrojadas mientras corre con pasos pequeños. El niño tiene cabello pelirrojo alborotado y ojos rojos intensos. Lleva una camiseta amarilla brillante con una estrella blanca, pantalones cortos azul claro y zapatillas rojas. Corre con energía, sonriendo ampliamente, mirando a Yui con entusiasmo. La escena está en Pixel Art, con césped verde, árboles y pétalos flotando. Ambos se ven felices, reflejando un momento puro de infancia.
Yui is a cute 15-year-old anime girl with big black eyes and short, soft blue-gray hair (HEX: #b0b9d8). She wears a traditional Japanese school uniform called a sailor fuku. In this Pixel Art scene, Yui looks clearly upset—she has very noticeable dark circles under her eyes, her eyebrows are tense, and her teeth are pressed together in frustration. Her arms are relaxed and down at her sides, showing no physical aggression, just quiet tension. She’s inside a school locker, looking out through a metal grate with a serious, focused expression. The entire scene is viewed from inside the locker, with soft light coming through the vents, casting gentle shadows across her face and creating a slightly tense but family-friendly atmosphere.
Pixel art. A red-haired 15-year-old anime-style boy with red eyes and a girl with purple eyes in Japanese school uniforms, both with large, expressive eyes and oversized irises to look super kawaii, are talking cheerfully while looking into each other’s eyes and gesturing with their hands. They are standing very close to a row of school lockers. In the center locker, a pair of glowing red eyes peer through the slats. The eyes belong to a hidden yandere—obsessed, crazy, and jealous—whose face and body remain completely obscured in the darkness inside the locker. The mood is lighthearted between the boy and girl, contrasting with the eerie presence watching them from the shadows.
Stella, a 15-year-old anime girl with short, soft hair in a bluish-gray tone (HEX: #b0b9d8), and large black eyes with oversized irises (super kawaii style), glowing with intense yandere red. She wears a traditional Japanese school uniform (classic sailor fuku). She is inside a Japanese school locker, with soft light coming through the ventilation slits, casting dramatic shadows on her face. Her eyebrows are furrowed in extreme anger, but she has a wide, creepy smile, like someone completely insane. Dark under-eye circles highlight her unhinged expression. Her right hand holds a butcher knife slightly raised, while her left hand gently touches the blade with her index finger, mimicking a clock hand motion. Visual style: highly detailed Pixel Art.
Yui is a cute 15-year-old anime girl with big black eyes and short, soft blue-gray hair (HEX: #b0b9d8). She wears a traditional Japanese school uniform called a sailor fuku. In this Pixel Art scene, Yui is clearly devastated—she’s hunched over in a slouched, defeated posture, crying intensely. Many visible tears stream down her cheeks, slipping past her fingers as she covers her face with both hands. Her entire body language screams sadness; it’s raw, heavy, and impossible to ignore. She’s inside a school locker, and although she’s looking outward through the metal grate, her face is mostly hidden behind her trembling hands. The entire scene is viewed from inside the locker, with soft light coming through the vents, casting delicate shadows across her curled-up figure and highlighting the depth of her heartbreak. The atmosphere is heavy, emotional, and quietly heartbreaking—yet still family-friendly in tone.
Diseña exclusivamente un cuadro de diálogo de color blanco de 2048 x 684 píxeles y esquinas en ángulo recto, evocando la estética romántica y juvenil de una novela ligera escolar, todo en estilo pixel art. No debe incluir ninguna otra funcionalidad. Detrás hay un fondo de color verde croma.
Ilustración en Pixel Art de un Name Box blanco, característico de una novela visual romántica, con detalles en colores pastel. El cuadro no contiene texto.
Ilustración en Pixel Art de un Name Box blanco, característico de una novela visual romántica, con detalles en colores pastel. El cuadro no contiene texto.
LoveTime
Music
Music1
Music
titleScreenSong
Music
theBeginningSong
Music
theCrossroadsSong
Music
theSchoolSong
Music
romanticSong
Music
youWinSong
Music
gameOverSong
Music
gameOverEffect
Sound effect
evaluationSong
Music
aikoAudioLine2
Sound effect
aikoAudioLine1
Sound effect
aikoAudioLine3
Sound effect
aikoAudioLine4
Sound effect
aikoAudioLine5
Sound effect
audioAikoLine6
Sound effect
aikoAudioLine7
Sound effect
aikoAudioLine8
Sound effect
Kissonthecheek
Sound effect
aikoAudioLine9
Sound effect
aikoAudioLine10
Sound effect
yuiAudioLine1
Sound effect
yuiAudioLine2
Sound effect
yuiAudioLine3
Sound effect
yuiAudioLine4
Sound effect
yuiAudioLine5
Sound effect
yuiAudioLine6
Sound effect
yuiAudioLine7
Sound effect
yandereSong
Music