“Искам да създам интерактивно уеб приложение под формата на образователна игра за ученици от 11. клас по математика на тема тригонометрични формули. Името на приложението е „TrigMystery: Храмът на формулите“. Идеята е учениците да учат и упражняват материала в по-интересна и мотивираща среда, а не чрез обикновен тест.
Приложението трябва да бъде направено като приключение в мистериозен храм, в който ученикът преминава през 8 различни нива. Всяко ниво да е свързано с определени тригонометрични формули, преобразувания или кратки задачи. Желанието ми е играта не само да проверява знанията, а и да помага на учениците да разбират по-добре материала чрез подсказки, кратки обяснения и обратна връзка след всеки отговор.
Искам да има система с XP точки, за да се усеща напредък и мотивация, отделно да има животи, които се отнемат при грешни отговори. При правилни отговори ученикът да печели точки, а при грешни да получава насочване или кратко обяснение, за да може да се учи от грешките си. Добре е да има и мини-уроци или помощни панели в отделните нива.
Накрая общият брой събрани точки трябва да се преобразува в крайна оценка по шестобалната система. Интерфейсът трябва да е модерен, цветен и достатъчно атрактивен за учениците, с атмосфера на древен храм, загадки и приключение, но същевременно да е ясен и лесен за работа в учебна среда.
Целта е ученикът да не чувства, че просто решава тест, а че участва в истинско математическо приключение, в което знанията му помагат да напредва.
TrigMystery: Храмът на формулите — Master Prompt
Project overview
TrigMystery is a Bulgarian-language trigonometry learning game for 11th-grade students. It is built as a full-stack web app using React + TypeScript (Vite frontend), Express (backend), PostgreSQL (via Drizzle ORM), and deployed on Replit. The visual identity is a dark jungle-temple adventure with amber/gold accents, handwritten fonts, and animated effects.
Tech stack
Frontend: React 18, TypeScript, TailwindCSS, Framer Motion, shadcn/ui components, TanStack Query v5, Wouter routing
Backend: Express, Drizzle ORM, PostgreSQL
Audio: Custom WebAudio API system (client/src/lib/sfx.ts) — no external sound files, procedural oscillator sounds only
State: TanStack Query + localStorage for lives, session, SFX preferences
Screens and navigation
HomeScreen — Landing page with animated jungle temple background. Buttons: “”Старт”” / “”Нова игра”” / “”Продължи””
MapScreen — Island treasure map with 8 level hotspots. Shows lives, XP, current level. Hotspots unlock progressively. Has ambient audio loop + volume/mute control.
RoomScreen — Main gameplay screen. Has three sub-phases:
lesson — Mini-lesson with Mumi character, lessonTitle/Text/Example, “”Продължи”” button
question — Rotating magic-circle image + question panel. Supports multiple-choice (MC), true/false (TF), and numeric (NUM) question types
levelComplete / gameOver — Result card with XP summary and grade
Game logic (DO NOT CHANGE)
8 levels, each with 5 weighted questions (weights: 1,1,2,3,3 XP)
Final level (level 8, isFinal: true) has flat 3 XP per question, 2 attempts before auto-fail
Lessons shown once per lessonGroupId/topic group, then hidden for repeat visits
Wrong answers: attempt 1 → hint1 unlocked, attempt 2 → hint2 + XP penalty, attempt 3 → −1 life, game over at 0 lives
Lives reset to 5 on each level start
XP persists and accumulates across levels; saved to backend via useSaveProgress
Level unlock: completing level N unlocks level N+1
Data model
LEVELS array in client/src/lib/game-data.ts — never change structure
Each question has: id, type, text, options, correctIndex, correctAnswer, tolerance, explanation, hint1, hint2, lessonTitle, lessonText, lessonExample, extraExample, lessonGroupId, topic, mumiLine, mumiReactionCorrect, mumiReactionWrong
Progress stored in DB: currentLevel, unlockedLevels[], xp, streak
Audio system
Module: client/src/lib/sfx.ts, singleton sfx exported
API: sfx.play(name), sfx.setEnabled(bool), sfx.setVolume(0..1), sfx.getSettings(), sfx.stopAmbient()
SFX names: ambient_map, ui_click, level_select, lesson_open, ui_confirm, correct, wrong, portal_spin, next, level_win, game_over
Persisted in localStorage: trigmystery_sfx (0/1) and trigmystery_sfx_volume
Button.tsx plays ui_click automatically on every button press
Ambient loop respects prefers-reduced-motion and prefers-reduced-data
Key constraints for all contributors
Never change Bulgarian text strings (any language at all)
Never change colors, fonts, spacing, border, or shadow classes
Never change game logic, XP formulas, or question data
Never add new npm dependencies
Use h-[100dvh] not h-screen; use flex-1 min-h-0 for scrollable content areas
All interactive elements must have data-testid attributes
Use clamp() for responsive font sizes, not fixed pixel breakpoints
Components live in client/src/components/, pages in client/src/pages/
Shared types/schema in shared/schema.ts
Backend routes thin — all logic in storage layer (server/storage.ts)
Current known tasks
Add SFX triggers to RoomScreen.tsx (lesson_open, ui_confirm, correct, wrong, portal_spin, next, level_win, game_over)
Add OrientationGate component that shows a portrait-block overlay on phones (<768px + portrait orientation) wrapping the entire app in App.tsx or GameRoot.tsx"