Compare commits

...

122 Commits

Author SHA1 Message Date
JailDesigner cb7b99cab3 deixar de versionar .claude/ 2026-05-19 08:54:51 +02:00
JailDesigner 21e0ae0c8c reorganitzat release/ alineat amb AEEA 2026-05-19 08:52:55 +02:00
JailDesigner 851e6d35a2 alineat amb AEEA: cmake, makefile, clang-* i hooks 2026-05-19 08:48:25 +02:00
JailDesigner 79d6e71fff afegit readme 2025-12-23 13:06:52 +01:00
JailDesigner fb394d23c9 corregit makefile de macos 2025-12-23 10:36:03 +01:00
JailDesigner 1951bcad11 corregit makefile de windows 2025-12-23 10:03:32 +01:00
JailDesigner 9a874fc83b corregit makefile de tools/pack_resources 2025-12-23 08:52:47 +01:00
JailDesigner 1acdd3f38d corregit make linux_release 2025-12-23 08:18:13 +01:00
JailDesigner a2b11371cf afegit include 2025-12-23 07:41:42 +01:00
JailDesigner b4b76ed6e8 afegit default per a fullscreen 2025-12-19 17:26:20 +01:00
JailDesigner 6f4eb9c1fc tidy: includes 2025-12-19 13:03:52 +01:00
JailDesigner 47f7ffb169 feat: implementar jerarquia d'entitats amb classe base Entitat 2025-12-19 13:01:58 +01:00
JailDesigner 70f2642e6d feat(linter): afegir checks llvm-include-order i misc-include-cleaner
- Check 11: llvm-include-order (0 errors - codi ja compleix)
- Check 12: misc-include-cleaner (detectar includes no usats i faltants)
  - Configurar IgnoreHeaders per SDL3 (genera falsos positius)
  - Fix: afegir <cstdint> a nau.hpp, enemic.hpp, bala.hpp
  - Fix: afegir <cmath> a nau.hpp, enemic.hpp (std::cos/sin)

Include order validat segons LLVM coding standards.
Headers més nets i compilació més ràpida.
2025-12-18 22:35:46 +01:00
JailDesigner 1a42f24a68 refactor(includes): convertir includes relativos a absolutos
- escena_joc.hpp: 7 includes cambiados de ../ a rutas absolutas
- pre-commit hook: añadir validación de includes relativos
- Bloquea commits con includes tipo #include "../foo.hpp"
- Coherencia con CMakeLists.txt (include_directories desde source/)
2025-12-18 22:24:17 +01:00
JailDesigner ac0f03c725 no compilava pack resources 2025-12-18 22:17:42 +01:00
JailDesigner 1804c8a171 feat(tools): afegit pre-commit hook versionat (clang-format + clang-tidy)
Sistema de git hooks per verificar qualitat de codi automàticament:

Hooks implementats:
- pre-commit: Executa clang-format + clang-tidy en arxius modificats
  - 🎨 clang-format: Formata automàticament el codi
  - 🔍 clang-tidy: Verifica errors i bloqueja commit si n'hi ha

Característiques:
-  Només revisa arxius modificats (ràpid)
-  Auto-formata amb clang-format i afegeix canvis al commit
-  Bloqueja commits amb errors de clang-tidy
-  Exclou directoris audio/ i legacy/ automàticament
-  Rutes dinàmiques (funciona en qualsevol màquina)

Instal·lació:
  ./tools/hooks/install.sh

O manual:
  cp tools/hooks/pre-commit .git/hooks/
  chmod +x .git/hooks/pre-commit

Documentació completa: tools/hooks/README.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 22:08:44 +01:00
JailDesigner d83056c614 test: verificar pre-commit hook (clang-format + clang-tidy) 2025-12-18 22:04:34 +01:00
JailDesigner ba2a6fe914 refactor(linter): completat check 10 - bugprone-* (0 fixes necessaris)
Check 10: bugprone-* - Detecció de bugs potencials
Resultat: 0 fixes aplicats - tots els warnings eren falsos positius acceptables

Warnings trobats i justificació d'exclusió:
- bugprone-branch-clone: Fall-through en switch és intencional (patró del codi)
- bugprone-switch-missing-default-case: No tots els switches necessiten default
- bugprone-implicit-widening-of-multiplication-result: Valors petits, sense risc d'overflow
- bugprone-exception-escape: Excepcions en main() terminen el programa (comportament acceptable)

Estat final:
 Check 1: readability-uppercase-literal-suffix (657 fixes)
 Check 2: readability-math-missing-parentheses (291 fixes)
 Check 3: readability-identifier-naming (DESHABILITADO - cascada de cambios)
 Check 4: readability-const-return-type (0 fixes)
 Check 5: readability-else-after-return (0 fixes)
 Check 6: readability-simplify-boolean-expr (0 fixes)
 Check 7: readability-* (225 fixes)
 Check 8: modernize-* (215 fixes)
 Check 9: performance-* (91 fixes)
 Check 10: bugprone-* (0 fixes - falsos positius)

Total: 1479 fixes aplicats correctament
Compilació:  OK
Test del joc:  OK

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 21:47:52 +01:00
JailDesigner 364cf36183 perf: aplicar checks performance-* (91 fixes)
Cambios aplicados:
- Reemplazar std::endl con '\n' (91 casos)
  * std::endl hace flush del buffer (más lento)
  * '\n' solo inserta newline (más rápido)
  * Mejora rendimiento de logging/debug

Check excluido:
- performance-enum-size: Tamaño de enum no es crítico para rendimiento
2025-12-18 21:24:07 +01:00
JailDesigner 7f6af6dd00 style: aplicar checks modernize-* (215 fixes)
Cambios aplicados:
- [[nodiscard]] añadido a funciones que retornan valores
- .starts_with() en lugar de .find() == 0
- Inicializadores designados {.x=0, .y=0}
- auto en castings obvios
- = default para constructores triviales
- Funciones deleted movidas a public
- std::numbers::pi_v<float> (C++20)

Checks excluidos:
- use-trailing-return-type: Estilo controversial
- avoid-c-arrays: Arrays C aceptables en ciertos contextos
2025-12-18 20:16:46 +01:00
JailDesigner fdfb84170f style: aplicar todos los checks readability-* (225 fixes)
Cambios aplicados:
- readability-braces-around-statements (añadir llaves en ifs/fors)
- readability-implicit-bool-conversion (puntero → bool explícito)
- readability-container-size-empty (.empty() en lugar de .size()==0)
- readability-container-contains (.contains() C++20)
- readability-make-member-function-const (métodos const)
- readability-else-after-return (5 casos adicionales)
- Añadido #include <cmath> en defaults.hpp

Checks excluidos (justificados):
- identifier-naming: Cascada de 300+ cambios
- identifier-length: Nombres cortos son OK en este proyecto
- magic-numbers: Demasiados falsos positivos
- convert-member-functions-to-static: Rompe encapsulación
- use-anyofallof: C++20 ranges no universal
- function-cognitive-complexity: Complejidad aceptable
- clang-analyzer-security.insecureAPI.rand: rand() suficiente para juegos
2025-12-18 19:51:43 +01:00
JailDesigner 2088ccdcc6 config(clang-tidy): check 6 completat + exclusió audio/legacy
- Check 6 (readability-simplify-boolean-expr): No cal canvis
- Deshabilitada temporalment check 3 (identifier-naming) per evitar
  cascada de 300+ canvis de nomenclatura
- Exclosa source/core/audio/ i source/legacy/ dels targets de tidy
  (per evitar "no checks enabled" error)
2025-12-18 13:55:26 +01:00
JailDesigner 7556c3fe8d style: habilitar readability-else-after-return
- Código ya cumple (no hay else innecesarios después de return)
- Check 5/N completado

🤖 Generated with Claude Code
2025-12-18 13:32:42 +01:00
JailDesigner decde1b7d5 style: habilitar readability-const-return-type
- Código ya cumple con el check (no hay const innecesarios en returns)
- Check 4/N completado

🤖 Generated with Claude Code
2025-12-18 13:32:00 +01:00
JailDesigner c8545c712d config(clang-tidy): excluir source/core/audio/ de análisis
- Crear .clang-tidy local en source/core/audio/ con Checks: '-*'
- Excluir jail_audio.hpp y archivos que dependen de él (código externo)
- Ajustar HeaderFilterRegex en .clang-tidy raíz
- Check 3 (readability-identifier-naming): código ya cumple convenciones

🤖 Generated with Claude Code
2025-12-18 13:26:27 +01:00
JailDesigner 76786203a0 style: aplicar readability-math-missing-parentheses
- Agregar paréntesis explícitos en operaciones matemáticas para claridad
- Ejemplos: '1.0F - a * b' → '1.0F - (a * b)'
- 291 correcciones aplicadas automáticamente con clang-tidy
- Check 2/N completado

🤖 Generated with Claude Code
2025-12-18 13:09:35 +01:00
JailDesigner bc94eff176 style: aplicar readability-uppercase-literal-suffix
- Cambiar todos los literales float de minúscula a mayúscula (1.0f → 1.0F)
- 657 correcciones aplicadas automáticamente con clang-tidy
- Check 1/N completado

🤖 Generated with Claude Code
2025-12-18 13:06:48 +01:00
JailDesigner 44cd0857e0 fix(shape_loader): corregir inconsistencias de naming y static
- Renombrar getCacheSize() → get_cache_size() (match con .hpp)
- Renombrar resolvePath() → resolve_path() (match con .hpp)
- Cambiar base_path → base_path_ (match con .hpp)
- Eliminar 'static' de definiciones fuera de clase (error de C++)
2025-12-18 13:04:15 +01:00
JailDesigner f8521d644c modificat cmake amb clang-tidy 2025-12-18 12:21:29 +01:00
JailDesigner eb2702eb19 afegit linter 2025-12-18 10:04:21 +01:00
JailDesigner bfb4903998 eliminat warning 2025-12-17 22:53:11 +01:00
JailDesigner f3abab7a13 augmentat numero de debris de 100 a 150 per necesitats del logo 2025-12-17 22:53:05 +01:00
JailDesigner 54031e3520 afegit friendly fire 2025-12-17 19:39:33 +01:00
JailDesigner 8b9d26a02c delay en naus en titol 2025-12-17 18:55:41 +01:00
JailDesigner 3d5277a395 fix: ratolí visible en fullscreen 2025-12-17 18:36:12 +01:00
JailDesigner 2555157bd7 fix: en alguns casos no podies tornar a unirte a la partida 2025-12-17 18:16:46 +01:00
JailDesigner 461eaedecf retocs en nave2 2025-12-17 17:55:14 +01:00
JailDesigner 1891c9e49e eliminades shapes sobrants 2025-12-17 17:44:23 +01:00
JailDesigner 829a895464 continue counter ara arriba fins a 0 2025-12-17 17:21:03 +01:00
JailDesigner 8bc259b25a nous sons 2025-12-17 17:05:42 +01:00
JailDesigner ec333efe66 afegida logica de continues
fix: el text no centrava correctament en horitzontal
2025-12-17 13:31:32 +01:00
JailDesigner 3b432e6580 layout de TITOL 2025-12-17 11:32:37 +01:00
JailDesigner 886ec8ab1d amagat el cursor d'inici en mode finestra 2025-12-16 22:47:12 +01:00
JailDesigner bc5982b286 treballant en les naus de title 2025-12-16 22:14:55 +01:00
JailDesigner 75a4a1b3b9 millorada la JOIN_PHASE i fase final de TITOL 2025-12-16 12:34:19 +01:00
JailDesigner f3f0bfcd9a afegit so a init_hud 2025-12-16 10:05:18 +01:00
JailDesigner c959e0e3a0 animacions de INIT_HUD amb control d'inici i final 2025-12-16 09:39:53 +01:00
JailDesigner 8b896912b2 centralitzada la gestio d'SKIP per a les escenes 2025-12-16 08:33:29 +01:00
JailDesigner 3d0057220d afegides tecles d'START. ja comença el joc amb el numero correcte de jugadors 2025-12-12 16:40:46 +01:00
JailDesigner 0c75f56cb5 treballant en context per a jugador 1, jugador 2 o els dos 2025-12-12 10:43:17 +01:00
JailDesigner 0ceaa75862 integrada classe Input 2025-12-11 12:41:03 +01:00
JailDesigner 087b8d346d afegit segon jugador 2025-12-10 17:18:34 +01:00
JailDesigner aca1f5200b els enemics poden morir mentre fan spawn 2025-12-10 11:58:26 +01:00
JailDesigner 3b638f4715 respawn de nau i invulnerabilitat 2025-12-10 11:35:45 +01:00
JailDesigner 9a5adcbcc5 revisat el marcador
modificada la shape 03
2025-12-10 11:05:15 +01:00
JailDesigner d0be5ea2d1 millorades les definicions de zones 2025-12-10 08:20:43 +01:00
JailDesigner 07e00fff09 eliminada ship2.shp i substituida ship.shp 2025-12-10 07:51:02 +01:00
JailDesigner b4e0ca7eca INIT_HUD amb temps de les animacions per percentatge
ordenats en subcarpetes els fitxers d'audio
corregit typo LIFES a LIVES
2025-12-09 22:57:01 +01:00
JailDesigner b8173b205b acabat INIT_HUD 2025-12-09 22:17:35 +01:00
JailDesigner 57d623d6bc treballant en INIT_HUD 2025-12-09 22:09:24 +01:00
JailDesigner 64ab08973c efecte maquina d'escriure per als textos d'entrada de fase 2025-12-09 19:38:29 +01:00
JailDesigner 94a7a38cdd afegit sistema de punts 2025-12-09 16:56:07 +01:00
JailDesigner 76165e4345 limitada la velocitat angular dels debris i transformada en velocitat lineal tangencial 2025-12-09 13:38:18 +01:00
JailDesigner 767a1f6af8 incrementada velocitat base angular dels enemics 2025-12-09 13:18:24 +01:00
JailDesigner 20ca024100 les bales ara son redones 2025-12-09 12:58:44 +01:00
JailDesigner 3c3857c1b2 debris hereten velocitat angular 2025-12-09 12:30:03 +01:00
JailDesigner 523342fed9 canvis en el inici i final de fase 2025-12-09 11:45:28 +01:00
JailDesigner 217ca58b1a millorat el spawn d'enemics: perimetre de seguretat i animació amb invulnerabilitat 2025-12-09 10:21:42 +01:00
JailDesigner ec6565bf71 debris hereta brillantor i velocitat 2025-12-09 09:25:46 +01:00
JailDesigner cd7f06f3a1 corregit el comptador de FPS 2025-12-08 22:13:26 +01:00
JailDesigner 8886873ed5 corregida la posició dels fitxers en el .dmg 2025-12-08 21:55:49 +01:00
JailDesigner a41e696b69 afegit resources.pack y prefixe a les rutes de recursos 2025-12-08 21:48:52 +01:00
JailDesigner 4b7cbd88bb nou icon per a la release sorpresa 2025-12-04 18:38:30 +01:00
JailDesigner 789cbbc593 afegida veu: good job commander
calibrats els volumnes de musica i efectes
afegida forma: ship2.shp
canviat tamany de textos de canvi de pantalla
2025-12-04 18:27:39 +01:00
JailDesigner 1dd87c0707 corregit: al pulsar per a jugar, el titol deixava d'animar-se 2025-12-04 12:00:08 +01:00
JailDesigner 330044e10f millorada la gestio d'escenes i opcions 2025-12-04 11:51:41 +01:00
JailDesigner f8c5207d5c corregida la posicio del titol al inici 2025-12-04 08:52:07 +01:00
JailDesigner 2caaa29124 afegit fade in al starfield de TITOL 2025-12-04 08:24:08 +01:00
JailDesigner cdc4d07394 animacio del titol als 10 segons 2025-12-04 08:00:13 +01:00
JailDesigner 1023cde1be afegida progresió 2025-12-03 22:19:44 +01:00
JailDesigner a3aeed4b7c afegides musiques
afegit control de brillo al starfield
2025-12-03 19:27:36 +01:00
JailDesigner 3b0354da54 afegit titol al TITOL 2025-12-03 17:40:27 +01:00
JailDesigner 622ccd22bc afegits diferents enemics 2025-12-03 13:47:31 +01:00
JailDesigner 1441134aea afegida colisió nau-enemics i game over 2025-12-03 12:04:44 +01:00
JailDesigner 0500dce7aa includes amb ruta absoluta 2025-12-03 11:19:23 +01:00
JailDesigner 9f0dfc4e24 gitignore no ha deixat versionar cap fitxer de core
afegida gestió de ratolí
2025-12-03 09:42:45 +01:00
JailDesigner aa66dd41c1 ja renderitza a la resolució de la finestra 2025-12-03 08:23:42 +01:00
JailDesigner 69fb5f3cc1 Migrate to CMake-based build with packaging
Major build system refactoring:

**CMake (build authority)**:
- Auto-discovers .cpp files (GLOB_RECURSE in source/core/ and source/game/)
- No manual file list maintenance needed
- Excludes source/legacy/ automatically
- Generates build/project.h from template

**Makefile (simplified wrapper)**:
- Delegates compilation to CMake (make → cmake --build build)
- Contains 5 release packaging targets:
  * macos_release: .app bundle + .dmg (Apple Silicon)
  * linux_release: .tar.gz
  * windows_release: .zip with .exe + DLLs
  * windows_cross: cross-compile from Linux/macOS
  * rpi_release: ARM64 cross-compile
- Complex packaging logic preserved (code signing, symlinks, DMG creation)

**Benefits**:
- Add new .cpp file → automatically compiled (no manual updates)
- Single source of truth in CMakeLists.txt (no duplication)
- IDE-friendly (VSCode, CLion, etc.)
- Complete packaging support (5 platforms)

**Files changed**:
- CMakeLists.txt: GLOB_RECURSE replaces 23-file hardcoded list
- Makefile: Simplified compilation + added 5 release targets (~220 lines)
- CLAUDE.md: Updated build system documentation
- escena_titol.cpp: Fixed include path (build/project.h → project.h)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 07:36:53 +01:00
JailDesigner d6b2e97777 afegit nivell de brillo per shape 2025-12-02 22:11:17 +01:00
JailDesigner 98c90e6075 treballant en el starfield 2025-12-02 21:19:43 +01:00
JailDesigner f795c86a38 afegida escena TITOL 2025-12-02 21:03:21 +01:00
JailDesigner c1c5774406 retocs disseny en LOGO 2025-12-02 17:27:18 +01:00
JailDesigner 0139da4764 corregit el escalat de finestra i mode fullscreen 2025-12-02 17:10:53 +01:00
JailDesigner ec911979fb afegit so al LOGO 2025-12-02 14:01:53 +01:00
JailDesigner e51749dbc6 afegit sistema de audio 2025-12-02 13:51:54 +01:00
JailDesigner 9ceb21c04f colisions bala-enemic 2025-12-02 13:22:26 +01:00
JailDesigner 76a91b4736 restaurada funcionalitat de disparar 2025-12-02 13:09:34 +01:00
JailDesigner df744338f1 enemics ja no ixen del area de joc 2025-12-02 10:01:31 +01:00
JailDesigner 8803fc3806 afegit vsync toggle 2025-12-02 09:44:58 +01:00
JailDesigner c26a4774a1 afegit comptador de frames per segon 2025-12-02 09:09:22 +01:00
JailDesigner 20538af4c6 LOGO explota 2025-12-02 08:50:38 +01:00
JailDesigner 73f222fcb7 afegit debris_manager 2025-12-02 08:30:32 +01:00
JailDesigner 67681e0f37 el marcador fake ja es pinta correctament 2025-12-01 23:47:42 +01:00
JailDesigner 5210448ac9 versió preliminar de text en pantalla 2025-12-01 22:29:34 +01:00
JailDesigner 983f42814f afegides shapes per a fonts 2025-11-29 10:06:33 +01:00
JailDesigner 89302a2ee3 afegides zones 2025-11-29 09:04:18 +01:00
JailDesigner 832f77de80 Makefile regenera project.h automàticament 2025-11-29 08:50:38 +01:00
JailDesigner 656144d182 afegits estats al LOGO 2025-11-28 23:06:25 +01:00
JailDesigner 4f926ddebf el zoom del LOGO ja es correcte 2025-11-28 22:43:36 +01:00
JailDesigner 624039e00d treballant en el LOGO 2025-11-28 21:07:36 +01:00
JailDesigner 430fcbe026 afegides escenes 2025-11-28 20:22:15 +01:00
JailDesigner 8e25d388fa afegida clase text 2025-11-28 17:08:42 +01:00
JailDesigner 3c7df0e989 afegides formes per als numeros i simbols 2025-11-28 12:49:51 +01:00
JailDesigner 4d0a5ca5bd migrat a sistema de shapes 2025-11-28 12:29:56 +01:00
JailDesigner 06e9a10c98 afegit pulso de color 2025-11-28 09:00:41 +01:00
JailDesigner 836debdc0b separació per entitats 2025-11-28 08:17:12 +01:00
JailDesigner 1e8829ba22 ja guarda la configuracio 2025-11-27 22:19:00 +01:00
JailDesigner 2b1311042f creat project.h 2025-11-27 21:47:08 +01:00
JailDesigner 0d69af667d migrant a SDL3 2025-11-27 17:32:01 +01:00
JailDesigner 93fed0b984 migrant a SDL3 2025-11-27 12:25:39 +01:00
JailDesigner c8838aa450 Convirtiendo el código a cpp 2022-08-13 15:11:25 +02:00
JailDesigner 896a61ed0d Convirtiendo el código a cpp 2022-08-13 15:00:01 +02:00
282 changed files with 118829 additions and 722 deletions
+22
View File
@@ -0,0 +1,22 @@
BasedOnStyle: Google
IndentWidth: 4
NamespaceIndentation: All
IndentAccessModifiers: false
ColumnLimit: 0 # Sin límite de longitud de línea
BreakBeforeBraces: Attach # Llaves en la misma línea
AllowShortIfStatementsOnASingleLine: true
AllowShortBlocksOnASingleLine: true
AllowShortFunctionsOnASingleLine: All
AlignOperands: DontAlign
AlignAfterOpenBracket: DontAlign
BinPackArguments: false
BinPackParameters: false
ContinuationIndentWidth: 4
ConstructorInitializerIndentWidth: 4
IndentWrappedFunctionNames: false
Cpp11BracedListStyle: true
BreakConstructorInitializers: BeforeColon
AllowAllConstructorInitializersOnNextLine: false
PackConstructorInitializers: Never
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
+107
View File
@@ -0,0 +1,107 @@
Checks:
- readability-*
- modernize-*
- performance-*
- bugprone-*
- -readability-identifier-length
- -readability-magic-numbers
- -bugprone-integer-division
- -bugprone-easily-swappable-parameters
- -bugprone-narrowing-conversions
- -modernize-avoid-c-arrays
WarningsAsErrors: '*'
# Headers nostres (excloem source/external/ que conté dependències de tercers no editables)
HeaderFilterRegex: 'source/(core|game|utils)/'
FormatStyle: file
CheckOptions:
# bugprone-empty-catch: aceptar catches vacíos marcados con @INTENTIONAL en un comentario
- { key: bugprone-empty-catch.IgnoreCatchWithKeywords, value: '@INTENTIONAL' }
# =====================================================================
# CONSTANTES → UPPER_CASE (compile-time y runtime, en cualquier scope)
# =====================================================================
# Todo lo que sea const o constexpr se identifica visualmente en UPPER_CASE,
# sin importar si es global, local, miembro o static.
# constexpr en cualquier scope (globales y locales)
- { key: readability-identifier-naming.ConstexprVariableCase, value: UPPER_CASE }
# Constantes globales (const no-constexpr)
- { key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE }
# Constantes locales (const en función)
- { key: readability-identifier-naming.LocalConstantCase, value: UPPER_CASE }
# Static const a nivel de archivo/namespace
- { key: readability-identifier-naming.StaticConstantCase, value: UPPER_CASE }
# Miembros static const/constexpr de clase (p.ej. static constexpr int MAX = 100;)
- { key: readability-identifier-naming.ClassConstantCase, value: UPPER_CASE }
# Miembros const no-static de clase (p.ej. const int limit;)
- { key: readability-identifier-naming.ConstantMemberCase, value: UPPER_CASE }
# Valores de enums
- { key: readability-identifier-naming.EnumConstantCase, value: UPPER_CASE }
# NOTA: Los parámetros const NO se tratan como constantes aquí.
# Un parámetro sigue siendo un parámetro aunque sea const → hereda ParameterCase.
# =====================================================================
# VARIABLES NO-CONST
# =====================================================================
# Variables locales
- { key: readability-identifier-naming.VariableCase, value: lower_case }
- { key: readability-identifier-naming.LocalVariableCase, value: lower_case }
# Parámetros de función
- { key: readability-identifier-naming.ParameterCase, value: lower_case }
# Variables estáticas no-const (static locales, static file-scope,
# y static members no-const de clase como el instance_ de un Singleton).
# Sufijo _ para marcar que tienen storage estático.
- { key: readability-identifier-naming.StaticVariableCase, value: lower_case }
- { key: readability-identifier-naming.StaticVariableSuffix, value: _ }
# =====================================================================
# MIEMBROS DE CLASE NO-CONST
# =====================================================================
# Privados: snake_case con sufijo _
- { key: readability-identifier-naming.PrivateMemberCase, value: lower_case }
- { key: readability-identifier-naming.PrivateMemberSuffix, value: _ }
# Protegidos: snake_case con sufijo _
- { key: readability-identifier-naming.ProtectedMemberCase, value: lower_case }
- { key: readability-identifier-naming.ProtectedMemberSuffix, value: _ }
# Públicos: snake_case sin sufijo
- { key: readability-identifier-naming.PublicMemberCase, value: lower_case }
# =====================================================================
# TIPOS
# =====================================================================
- { key: readability-identifier-naming.ClassCase, value: CamelCase }
- { key: readability-identifier-naming.StructCase, value: CamelCase }
- { key: readability-identifier-naming.EnumCase, value: CamelCase }
- { key: readability-identifier-naming.UnionCase, value: CamelCase }
- { key: readability-identifier-naming.TypeAliasCase, value: CamelCase }
- { key: readability-identifier-naming.TypedefCase, value: CamelCase }
- { key: readability-identifier-naming.TemplateParameterCase, value: CamelCase }
# Namespaces
- { key: readability-identifier-naming.NamespaceCase, value: CamelCase }
# =====================================================================
# FUNCIONES Y MÉTODOS (incluyendo constexpr)
# =====================================================================
# Un método/función constexpr es un invocable, no una constante → camelBack.
- { key: readability-identifier-naming.FunctionCase, value: camelBack }
- { key: readability-identifier-naming.ConstexprFunctionCase, value: camelBack }
- { key: readability-identifier-naming.MethodCase, value: camelBack }
- { key: readability-identifier-naming.PrivateMethodCase, value: camelBack }
- { key: readability-identifier-naming.ProtectedMethodCase, value: camelBack }
- { key: readability-identifier-naming.PublicMethodCase, value: camelBack }
- { key: readability-identifier-naming.ConstexprMethodCase, value: camelBack }
+92
View File
@@ -0,0 +1,92 @@
#!/usr/bin/env bash
# Pre-commit hook: aplica clang-format als fitxers C++ staged abans del commit.
# - Només toca fitxers staged dins source/ (exclou source/external/ i source/legacy/).
# - Avorta el commit si hi ha canvis NO staged en aquests fitxers (per no incloure'ls sense voler).
set -euo pipefail
if ! command -v clang-format >/dev/null 2>&1; then
echo "pre-commit: clang-format no trobat — saltant format check" >&2
exit 0
fi
mapfile -t STAGED < <(git diff --cached --name-only --diff-filter=ACMR \
| grep -E '^source/.*\.(cpp|hpp|h)$' \
| grep -vE '^source/(external|legacy)/' || true)
if [ ${#STAGED[@]} -eq 0 ]; then
exit 0
fi
UNSTAGED_DIRTY=()
for f in "${STAGED[@]}"; do
if ! git diff --quiet -- "$f"; then
UNSTAGED_DIRTY+=("$f")
fi
done
if [ ${#UNSTAGED_DIRTY[@]} -gt 0 ]; then
echo "pre-commit: aquests fitxers tenen canvis NO staged i estan al commit." >&2
echo " Fes 'git add' o 'git stash' abans de continuar:" >&2
printf ' %s\n' "${UNSTAGED_DIRTY[@]}" >&2
exit 1
fi
clang-format -i "${STAGED[@]}"
git add -- "${STAGED[@]}"
# --- clang-tidy només sobre els fitxers staged ---
if ! command -v clang-tidy >/dev/null 2>&1; then
echo "pre-commit: clang-tidy no trobat — saltant tidy" >&2
exit 0
fi
REPO_ROOT="$(git rev-parse --show-toplevel)"
BUILD_DIR="$REPO_ROOT/build"
if [ ! -f "$BUILD_DIR/compile_commands.json" ]; then
echo "pre-commit: generant compile_commands.json (build dir buit)..." >&2
cmake -S "$REPO_ROOT" -B "$BUILD_DIR" >/dev/null
fi
echo "pre-commit: clang-tidy sobre ${#STAGED[@]} fitxer(s)..." >&2
if ! clang-tidy -p "$BUILD_DIR" --quiet "${STAGED[@]}"; then
echo "pre-commit: clang-tidy ha trobat errors — commit avortat" >&2
exit 1
fi
# --- cppcheck només sobre els .cpp staged ---
if ! command -v cppcheck >/dev/null 2>&1; then
echo "pre-commit: cppcheck no trobat — saltant cppcheck" >&2
exit 0
fi
CPP_STAGED=()
for f in "${STAGED[@]}"; do
[[ "$f" == *.cpp ]] && CPP_STAGED+=("$f")
done
if [ ${#CPP_STAGED[@]} -eq 0 ]; then
exit 0
fi
echo "pre-commit: cppcheck sobre ${#CPP_STAGED[@]} fitxer(s)..." >&2
if ! cppcheck \
--enable=warning,style,performance,portability \
--std=c++20 \
--language=c++ \
--inline-suppr \
--suppress=missingIncludeSystem \
--suppress=toomanyconfigs \
--suppress='*:*source/external/*' \
--suppress='*:*source/legacy/*' \
--suppress=normalCheckLevelMaxBranches \
-D_DEBUG \
-DLINUX_BUILD \
--quiet \
--error-exitcode=1 \
-I "$REPO_ROOT/source" \
"${CPP_STAGED[@]}"; then
echo "pre-commit: cppcheck ha trobat errors — commit avortat" >&2
exit 1
fi
+107
View File
@@ -0,0 +1,107 @@
# IDEs and Editors
.vscode/*
.idea/
*.swp
*.swo
*~
# Build directories
build/
bin/
out/
cmake-build-*/
# Executables
orni
asteroids
*.exe
*.out
*.app
tools/pack_resources/pack_resources
tools/pack_resources/pack_resources.exe
# Releases
*.zip
*.tar.gz
*.dmg
dist/
# Generated resources
resources.pack
release/windows/*.res
# Compiled Object files
*.o
*.obj
*.ko
*.elf
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.so.*
*.dylib
*.dll
# Compiled Static libraries
*.a
*.lib
*.la
*.lo
# CMake
CMakeCache.txt
CMakeFiles/
CMakeScripts/
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps/
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
*.ilk
# Core dumps
# core
# core.*
# *.core
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*
# Windows
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
*.stackdump
[Dd]esktop.ini
# Linux
*~
.directory
.fuse_hidden*
.Trash-*
.nfs*
# Temporary files
*.tmp
*.temp
*.log
*.bak
*.swp
*.swo
.cache/
.claude/
-433
View File
@@ -1,433 +0,0 @@
uses crt,keyboard,sencos;
const
marge_dalt=20;
marge_baix=460;
marge_esq=20;
marge_dret=620;
max_ipunts=30;
max_ornis=15;
velocitat=2;
velocitat_max=6;
max_bales=3;
type
ipunt=RECORD r,angle:real; END;
punt=RECORD x,y:integer; END;
ivector=array [0..max_ipunts-1] of ipunt;
triangle=RECORD p1,p2,p3:ipunt;
centre:punt;
angle:real;
velocitat:real;
END;
poligon=RECORD ipunts:^ivector;
ipuntx:ivector;
centre:punt;
angle:real;
velocitat:real;
n:byte;
drotacio,rotacio:real;
esta:boolean;
END;
pvirt=array [1..38400] of byte;
var nau:triangle;pol:poligon;
ang:real;
ch:char;
Dx,Dy:word;
i,aux:byte;
dist:integer;
puntaux:punt;
orni:array [1..max_ornis] of poligon;
virt:^pvirt;
bales:array [1..max_bales] of poligon;
procedure volca;
var i:word;
begin
for i:=1 to 38400 do mem[$A000:i]:=mem[seg(virt^):i];
end;
procedure crear_poligon_regular(var pol:poligon;n:byte;r:real);
var i:word;act,interval:real;aux:ipunt;
begin
{getmem(pol.ipunts,{n*464000);}
interval:=2*pi/n;
act:=0;
for i:=0 to n-1 do begin
aux.r:=r;
aux.angle:=act;
pol.ipuntx[i]:=aux;
act:=act + interval;
end;
pol.centre.x:=320;
pol.centre.y:=200;
pol.angle:=0;
pol.velocitat:=velocitat;
pol.n:=n;
pol.drotacio:=0.078539816;
pol.rotacio:=0;
end;
procedure MCGA;
begin
asm
mov ax,0012h
int 10h
end;
directvideo:= false;
end;
procedure Text;
begin
asm
mov ax,0003h
int 10h
end;
end;
procedure WaitRetrace; assembler;
label
l1,l2;
asm
mov dx,3DAh
l1:
in al,dx
and al,08h
jnz l1
l2:
in al,dx
and al,08h
jz l2
end;
procedure posa(x,y:word;color:byte);
begin
if color=1 then
case (x mod 8) of
0:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $7F)OR $80;
1:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $BF)OR $40;
2:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $DF)OR $20;
3:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $EF)OR $10;
4:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $F7)OR $08;
5:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $FB)OR $04;
6:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $FD)OR $02;
7:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $FE)OR $01;
end;
if color=0 then
case (x mod 8) of
0:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $7F);
1:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $BF);
2:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $DF);
3:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $EF);
4:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $F7);
5:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $FB);
6:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $FD);
7:mem[seg(virt^):y*80+(x div 8)]:=(mem[seg(virt^):y*80+(x div 8)]AND $FE);
end;
end;
function llig(x,y:word):byte;
begin
case (x mod 8) of
0:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $80)shr 7;
1:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $40)shr 6;
2:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $20)shr 5;
3:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $10)shr 4;
4:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $08)shr 3;
5:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $04)shr 2;
6:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $02)shr 1;
7:llig:=(mem[seg(virt^):y*80+(x div 8)]AND $01);
end;
end;
procedure posavga(x,y:word;color:byte);
begin
if color=1 then
case (x mod 8) of
0:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $7F)OR $80;
1:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $BF)OR $40;
2:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $DF)OR $20;
3:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $EF)OR $10;
4:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $F7)OR $08;
5:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $FB)OR $04;
6:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $FD)OR $02;
7:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $FE)OR $01;
end;
if color=0 then
case (x mod 8) of
0:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $7F);
1:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $BF);
2:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $DF);
3:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $EF);
4:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $F7);
5:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $FB);
6:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $FD);
7:mem[$A000:y*80+(x div 8)]:=(mem[$A000:y*80+(x div 8)]AND $FE);
end;
end;
function modul(p:punt):real;
begin
modul:=sqrt(sqr(p.x)+sqr(p.y));
end;
procedure diferencia(o,d:punt;var p:punt);
begin
p.x:=o.x-d.x;
p.y:=o.y-d.y;
end;
function distancia(o,d:punt):integer;
var p:punt;
begin
diferencia(o,d,p);
distancia:=round(modul(p));
end;
function angle(p:punt):real;
begin
if p.y<>0 then angle:=arctan(p.x/p.y);
end;
procedure clsvirt;
var i:word;
begin
for i:=1 to 38400 do mem[seg(virt^):i]:=0;
end;
function linea(x1,y1,x2,y2,color:word):boolean;
function sign(x:integer):integer; {like sgn(x) in basic}
begin if x<0 then sign:=-1 else if x>0 then sign:=1 else sign:=0 end;
var
x,y,count,xs,ys,xm,ym,col:integer;
begin
linea:=false;
col:=0;
x:=x1;y:=y1;
xs:=x2-x1; ys:=y2-y1;
xm:=sign(xs); ym:=sign(ys);
xs:=abs(xs); ys:=abs(ys);
if llig(x,y)=1 then inc(col);
posa(x,y,color);
if xs > ys
then begin {flat line <45 deg}
count:=-(xs div 2);
while (x <> x2 ) do begin
count:=count+ys;
x:=x+xm;
if count>0 then begin
y:=y+ym;
count:=count-xs;
end;
if llig(x,y)=1 then inc(col);
posa(x,y,color);
end;
end
else begin {steep line >=45 deg}
count:=-(ys div 2);
while (y <> y2 ) do begin
count:=count+xs;
y:=y+ym;
if count>0 then begin
x:=x+xm;
count:=count-ys;
end;
if llig(x,y)=1 then inc(col);
posa(x,y,color);
end;
end;
if col>2 then linea:=true;
end;
function rota_tri(tri:triangle;angul,velocitat:real;color:byte):byte;
var x1,x2,x3,y1,y2,y3:word;
begin
x1:=round((tri.p1.r+velocitat)*cos(tri.p1.angle+angul))+tri.centre.x;
x2:=round((tri.p2.r+velocitat)*cos(tri.p2.angle+angul{+velocitat/20}))+tri.centre.x;
x3:=round((tri.p3.r+velocitat)*cos(tri.p3.angle+angul{-velocitat/20}))+tri.centre.x;
y1:=round((tri.p1.r+velocitat)*sin(tri.p1.angle+angul))+tri.centre.y;
y2:=round((tri.p2.r+velocitat)*sin(tri.p2.angle+angul{+velocitat/20}))+tri.centre.y;
y3:=round((tri.p3.r+velocitat)*sin(tri.p3.angle+angul{-velocitat/20}))+tri.centre.y;
rota_tri:=0;
if linea(x1,y1,x2,y2,color) then rota_tri:=1 ;
if linea(x1,y1,x3,y3,color) then rota_tri:=1;
if linea(x3,y3,x2,y2,color) then rota_tri:=1;
end;
procedure rota_pol(pol:poligon;angul:real;color:byte);
var xy:array [0..max_ipunts] of punt;i:byte;
begin
for i:=0 to pol.n-1 do begin
xy[i].x:=round((pol.ipuntx[i].r)*cos(pol.ipuntx[i].angle+angul))+pol.centre.x;
xy[i].y:=round((pol.ipuntx[i].r)*sin(pol.ipuntx[i].angle+angul))+pol.centre.y;
end;
for i:=0 to pol.n-2 do
linea(xy[i].x,xy[i].y,xy[i+1].x,xy[i+1].y,color);
linea(xy[pol.n-1].x,xy[pol.n-1].y,xy[0].x,xy[0].y,color);
end;
procedure mou_orni(var orni:poligon);
var dx,dy:real;
begin
orni.angle:=orni.angle{+(random(256)/512)*(random(3)-1)};
Dy:=round(orni.velocitat*sin(orni.angle-pi/2))+orni.centre.y;
Dx:=round(orni.velocitat*cos(orni.angle-pi/2))+orni.centre.x;
if (dy>marge_dalt) and (dy<marge_baix) then
orni.centre.y:=round(Dy)
else orni.angle:=orni.angle+(random(256)/512)*(random(3)-1);
if (dx>marge_esq) and (dx<marge_dret) then
orni.centre.x:=round(Dx)
else orni.angle:=orni.angle+(random(256)/512)*(random(3)-1);
orni.rotacio:=orni.rotacio+orni.drotacio;
end;
procedure mou_bales(var orni:poligon);
var dx,dy:real;
begin
orni.angle:=orni.angle{+(random(256)/512)*(random(3)-1)};
Dy:=round(orni.velocitat*sin(orni.angle-pi/2))+orni.centre.y;
Dx:=round(orni.velocitat*cos(orni.angle-pi/2))+orni.centre.x;
if (dy>marge_dalt) and (dy<marge_baix) then
orni.centre.y:=round(Dy)
else {orni.angle:=orni.angle+(random(256)/512)*(random(3)-1)}orni.esta:=false;
if (dx>marge_esq) and (dx<marge_dret) then
orni.centre.x:=round(Dx)
else {orni.angle:=orni.angle+(random(256)/512)*(random(3)-1)}orni.esta:=false;;
end;
var itocado:word;
chatarra_cosmica:poligon;
procedure tocado;
var i,j,k:word;dx,dy:word;
begin
if itocado=1 then begin
chatarra_cosmica.centre.x:=nau.centre.x;
chatarra_cosmica.centre.y:=nau.centre.y;
chatarra_cosmica.n:=max_ipunts;
for i:=0 to max_ipunts-1 do begin
chatarra_cosmica.ipuntx[i].r:=1;
chatarra_cosmica.ipuntx[i].angle:=random(360)*57.295779513;
end;
nau.velocitat:=0;
end;
if ((nau.p1.r>1) and (nau.p2.r>1)and (nau.p3.r>1)and (itocado<170)) then begin
nau.p1.r:=nau.p1.r-0.7;
nau.p2.r:=nau.p2.r-0.7;
nau.p3.r:=nau.p3.r-0.7;
nau.angle:=nau.angle-0.3;
rota_tri(nau,nau.angle,0,1);
end
else begin
for i:=0 to max_ipunts-1 do begin
chatarra_cosmica.ipuntx[i].r:=chatarra_cosmica.ipuntx[i].r+3;
dx:=round((chatarra_cosmica.ipuntx[i].r)*cos(chatarra_cosmica.ipuntx[i].angle))
+chatarra_cosmica.centre.x;
dy:=round((chatarra_cosmica.ipuntx[i].r)*sin(chatarra_cosmica.ipuntx[i].angle))
+chatarra_cosmica.centre.y;
if ((dx>=0)AND(dx<640)AND(dy>0)AND(dy<480))then posa(dx,dy,1);
end;
end;
inc(itocado);
if itocado=170 then begin
nau.p1.r:=12;nau.p1.angle:=3*pi/2;
nau.p2.r:=12;nau.p2.angle:=pi/4;
nau.p3.r:=12;nau.p3.angle:=(3*pi)/4;
nau.angle:=0;
nau.centre.x:=320;nau.centre.y:=240;
end;
if ((itocado>170)and(itocado mod 3=0)) then rota_tri(nau,nau.angle,nau.velocitat,1);
if itocado>250 then itocado:=0;
end;
begin
randomize;
getmem(virt,38400);
itocado:=0;
clsvirt;
nau.p1.r:=12;nau.p1.angle:=3*pi/2;
nau.p2.r:=12;nau.p2.angle:=pi/4;
nau.p3.r:=12;nau.p3.angle:=(3*pi)/4;
nau.angle:=0;
nau.centre.x:=320;nau.centre.y:=240;
crear_poligon_regular(pol,10,200);
for i:=1 to max_ornis do crear_poligon_regular(orni[i],5,20);
mcga;
rota_pol(pol,0,1);
instalarkb;
repeat
{ rota_tri(nau,nau.angle,nau.velocitat,0);}
clsvirt;
if teclapuls(KEYarrowright) then nau.angle:=nau.angle+0.157079632;
if teclapuls(KEYarrowleft) then nau.angle:=nau.angle-0.157079632;
if teclapuls(KEYarrowup) then begin
if nau.velocitat<velocitat_max then nau.velocitat:=nau.velocitat+0.2;
end;
if teclapuls(KEYspace)and(bales[1].esta=false) then begin
bales[1].esta:=true;
bales[1].centre.x:=nau.centre.x;
bales[1].centre.y:=nau.centre.y;
bales[1].n:=2;
bales[1].velocitat:=7;
bales[1].ipuntx[1].r:=10;
bales[1].ipuntx[1].angle:=pi/2+nau.angle;
bales[1].ipuntx[2].r:=20;
bales[1].ipuntx[2].angle:=pi/2+nau.angle;
bales[1].angle:=nau.angle;
end;
Dy:=round(nau.velocitat*sin(nau.angle-pi/2))+nau.centre.y;
Dx:=round(nau.velocitat*cos(nau.angle-pi/2))+nau.centre.x;
if (dy>marge_dalt) and (dy<marge_baix) then
nau.centre.y:=Dy;
if (dx>marge_esq) and (dx<marge_dret) then
nau.centre.x:=Dx;
if (nau.velocitat>0.1) then nau.velocitat:=nau.velocitat-0.1;
{ dist:=distancia(nau.centre,pol.centre);
diferencia(pol.centre,nau.centre,puntaux);
if dist<(pol.ipuntx[1].r+30) then begin
nau.centre.x:=nau.centre.x
+round(dist*cos(angle(puntaux)+0.031415));
nau.centre.y:=nau.centre.y
+round(dist*sin(angle(puntaux)+0.031415));
end;}
{ for i:=1 to 5 do begin
rota_pol(orni[i],ang,0);
end;}
for i:=1 to max_ornis do begin
mou_orni(orni[i]);
rota_pol(orni[i],orni[i].rotacio,1);
end;
if itocado=0 then aux:=rota_tri(nau,nau.angle,nau.velocitat,1)
else tocado;
if (aux=1) then begin inc(itocado);aux:=0;end;
if bales[1].esta then begin
mou_bales(bales[1]);
rota_pol(bales[1],0,1);
end;
waitretrace;
volca;
{ if aux=1 then begin {gotoxy(0,0);write('tocado')tocado;delay(200);end;}
gotoxy(50,24);
write('¸ Visente i Sergi');
gotoxy(50,25);
write('áETA 2.2 2/6/99');
until teclapuls(keyesc);
desinstalarkb;
ang:=0;
repeat waitretrace;rota_pol(pol,ang,0); ang:=ang+0.031415 ;rota_pol(pol,ang,1);until keypressed;
text;
end.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

+1095
View File
File diff suppressed because it is too large Load Diff
+234
View File
@@ -0,0 +1,234 @@
cmake_minimum_required(VERSION 3.16)
project(orni VERSION 0.7.2 LANGUAGES CXX)
# Info del projecte (font de veritat per a project.h)
set(PROJECT_LONG_NAME "Orni Attack")
set(PROJECT_COPYRIGHT_ORIGINAL "© 1999 Visente i Sergi")
set(PROJECT_COPYRIGHT_PORT "© 2025 JailDesigner")
set(PROJECT_COPYRIGHT "${PROJECT_COPYRIGHT_ORIGINAL}, ${PROJECT_COPYRIGHT_PORT}")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
endif()
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# --- GENERACIÓ DEL project.h AMB GIT HASH ---
# Si GIT_HASH ve passat des de fora (Makefile), l'usem; si no, el resolem amb git.
if(NOT DEFINED GIT_HASH OR GIT_HASH STREQUAL "")
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
endif()
if(NOT DEFINED GIT_HASH OR GIT_HASH STREQUAL "")
set(GIT_HASH "unknown")
endif()
endif()
configure_file(${CMAKE_SOURCE_DIR}/source/project.h.in ${CMAKE_BINARY_DIR}/project.h @ONLY)
# --- LLISTA DE FONTS (AUTO-DESCOBRIMENT) ---
# Cerquem tots els .cpp dins core/ i game/, més main.cpp. Exclou legacy/.
file(GLOB_RECURSE CORE_SOURCES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/source/core/*.cpp")
file(GLOB_RECURSE GAME_SOURCES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/source/game/*.cpp")
file(GLOB_RECURSE EXTERNAL_SOURCES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/source/external/*.cpp")
set(APP_SOURCES
${CORE_SOURCES}
${GAME_SOURCES}
${EXTERNAL_SOURCES}
source/main.cpp
)
list(FILTER APP_SOURCES EXCLUDE REGEX ".*/legacy/.*")
list(LENGTH APP_SOURCES APP_SOURCES_COUNT)
message(STATUS "Fonts .cpp trobades: ${APP_SOURCES_COUNT}")
# --- SDL3 ---
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
add_executable(${PROJECT_NAME} ${APP_SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE
"${CMAKE_SOURCE_DIR}/source"
"${CMAKE_BINARY_DIR}"
)
target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3)
# Silencia warnings de codi de tercers (mateixa filosofia que el
# .clang-tidy a source/external/). Només afecta aquests TUs concrets;
# la resta del codi continua compilant amb -Wall -Wextra -Wpedantic.
if(EXTERNAL_SOURCES)
set_source_files_properties(
${EXTERNAL_SOURCES}
PROPERTIES COMPILE_OPTIONS "-Wno-missing-field-initializers;-Wno-deprecated-declarations"
)
endif()
target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic)
target_compile_options(${PROJECT_NAME} PRIVATE
$<$<CONFIG:Release>:-O2 -ffunction-sections -fdata-sections>
)
target_compile_definitions(${PROJECT_NAME} PRIVATE
$<$<CONFIG:Debug>:_DEBUG>
$<$<CONFIG:Release>:RELEASE_BUILD>
)
if(APPLE AND MACOSX_BUNDLE)
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUNDLE)
endif()
if(WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE WINDOWS_BUILD)
target_link_libraries(${PROJECT_NAME} PRIVATE mingw32)
target_link_options(${PROJECT_NAME} PRIVATE
-static-libgcc
-static-libstdc++
-static
)
elseif(APPLE)
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUILD)
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated)
elseif(UNIX AND NOT APPLE)
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
endif()
# --- EINA STANDALONE: pack_resources ---
# Executable auxiliar que empaqueta `data/` a `build/resources.pack`.
# EXCLUDE_FROM_ALL: només es compila quan algun target en depèn (ho fa
# `resource_pack`). Build manual: `cmake --build build --target pack_resources`.
add_executable(pack_resources EXCLUDE_FROM_ALL
tools/pack_resources/pack_resources.cpp
source/core/resources/resource_pack.cpp
)
target_include_directories(pack_resources PRIVATE "${CMAKE_SOURCE_DIR}/source")
target_compile_options(pack_resources PRIVATE -Wall -Wextra -Wpedantic)
# --- REGENERACIÓ AUTOMÀTICA DE build/resources.pack ---
# A cada build re-empaquetem data/ si algun fitxer dins ha canviat. Evita
# debugar amb un pack obsolet. CONFIGURE_DEPENDS força CMake a re-globbar
# a la pròxima invocació (recull fitxers nous afegits a data/).
file(GLOB_RECURSE DATA_FILES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/data/*")
set(RESOURCE_PACK "${CMAKE_BINARY_DIR}/resources.pack")
add_custom_command(
OUTPUT ${RESOURCE_PACK}
COMMAND $<TARGET_FILE:pack_resources>
"${CMAKE_SOURCE_DIR}/data"
"${RESOURCE_PACK}"
DEPENDS pack_resources ${DATA_FILES}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Empaquetant data/ → build/resources.pack"
VERBATIM
)
add_custom_target(resource_pack ALL DEPENDS ${RESOURCE_PACK})
add_dependencies(${PROJECT_NAME} resource_pack)
# --- STATIC ANALYSIS / FORMAT TARGETS ---
find_program(CLANG_TIDY_EXE NAMES clang-tidy)
find_program(CLANG_FORMAT_EXE NAMES clang-format)
find_program(CPPCHECK_EXE NAMES cppcheck)
file(GLOB_RECURSE ALL_SOURCE_FILES
"${CMAKE_SOURCE_DIR}/source/*.cpp"
"${CMAKE_SOURCE_DIR}/source/*.hpp"
"${CMAKE_SOURCE_DIR}/source/*.h"
)
list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX ".*/external/.*")
list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX ".*/legacy/.*")
set(CPPCHECK_SOURCES ${ALL_SOURCE_FILES})
list(FILTER CPPCHECK_SOURCES INCLUDE REGEX ".*\\.cpp$")
if(CLANG_TIDY_EXE)
# En macOS, obtenir la ruta del SDK perquè clang-tidy trobe els headers del sistema.
set(CLANG_TIDY_EXTRA_ARGS "")
if(APPLE)
execute_process(
COMMAND xcrun --show-sdk-path
OUTPUT_VARIABLE MACOS_SDK_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(MACOS_SDK_PATH)
set(CLANG_TIDY_EXTRA_ARGS "--extra-arg=-isysroot${MACOS_SDK_PATH}")
message(STATUS "clang-tidy usarà SDK de macOS: ${MACOS_SDK_PATH}")
endif()
endif()
add_custom_target(tidy
COMMAND ${CLANG_TIDY_EXE}
-p ${CMAKE_BINARY_DIR}
${CLANG_TIDY_EXTRA_ARGS}
${ALL_SOURCE_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Running clang-tidy..."
)
add_custom_target(tidy-fix
COMMAND ${CLANG_TIDY_EXE}
-p ${CMAKE_BINARY_DIR}
${CLANG_TIDY_EXTRA_ARGS}
--fix
${ALL_SOURCE_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Running clang-tidy with fixes..."
)
else()
message(STATUS "clang-tidy no trobat - targets 'tidy' i 'tidy-fix' no disponibles")
endif()
if(CLANG_FORMAT_EXE)
add_custom_target(format
COMMAND ${CLANG_FORMAT_EXE}
-i
${ALL_SOURCE_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Running clang-format..."
)
add_custom_target(format-check
COMMAND ${CLANG_FORMAT_EXE}
--dry-run
--Werror
${ALL_SOURCE_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Checking clang-format..."
)
else()
message(STATUS "clang-format no trobat - targets 'format' i 'format-check' no disponibles")
endif()
if(CPPCHECK_EXE)
add_custom_target(cppcheck
COMMAND ${CPPCHECK_EXE}
--enable=warning,style,performance,portability
--std=c++20
--language=c++
--inline-suppr
--suppress=missingIncludeSystem
--suppress=toomanyconfigs
--suppress=*:*source/external/*
--suppress=*:*source/legacy/*
--suppress=normalCheckLevelMaxBranches
-D_DEBUG
-DLINUX_BUILD
--quiet
-I ${CMAKE_SOURCE_DIR}/source
${CPPCHECK_SOURCES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Running cppcheck..."
)
else()
message(STATUS "cppcheck no trobat - target 'cppcheck' no disponible")
endif()
-275
View File
@@ -1,275 +0,0 @@
{
-----------------------------------------------------
File: Keyboard.Pas
By: Ronny Wester, ronny@rat.se
Unit to check up/down status of individual key flags.
Written from code I got off rec.games.programmer.
Sorry, I lost the name of the poster.
As most of this code is scancode-dependent some keys
may not be where they "should" on your keyboard.
-----------------------------------------------------
}
unit Keyboard;
interface
uses Dos;
const
keySysReq = $54;
keyCapsLock = $3A;
keyNumLock = $45;
keyScrollLock = $46;
keyLeftCtrl = $1D;
keyLeftAlt = $38;
keyLeftShift = $2A;
keyRightCtrl = $9D;
keyAltGr = $B8;
keyRightShift = $36;
keyEsc = $01;
keyBackspace = $0E;
keyEnter = $1C;
keySpace = $39;
keyTab = $0F;
keyF1 = $3B;
keyF2 = $3C;
keyF3 = $3D;
keyF4 = $3E;
keyF5 = $3F;
keyF6 = $40;
keyF7 = $41;
keyF8 = $42;
keyF9 = $43;
keyF10 = $44;
keyF11 = $57;
keyF12 = $58;
keyA = $1E;
keyB = $30;
keyC = $2E;
keyD = $20;
keyE = $12;
keyF = $21;
keyG = $22;
keyH = $23;
keyI = $17;
keyJ = $24;
keyK = $25;
keyL = $26;
keyM = $32;
keyN = $31;
keyO = $18;
keyP = $19;
keyQ = $10;
keyR = $13;
keyS = $1F;
keyT = $14;
keyU = $16;
keyV = $2F;
keyW = $11;
keyX = $2D;
keyY = $15;
keyZ = $2C;
key1 = $02;
key2 = $03;
key3 = $04;
key4 = $05;
key5 = $06;
key6 = $07;
key7 = $08;
key8 = $09;
key9 = $0A;
key0 = $0B;
keyMinus = $0C;
keyEqual = $0D;
keyLBracket = $1A;
keyRBracket = $1B;
keySemicolon = $27;
keyTick = $28;
keyApostrophe = $29;
keyBackslash = $2B;
keyComma = $33;
keyPeriod = $34;
keySlash = $35;
keyInsert = $D2;
keyDelete = $D3;
keyHome = $C7;
keyEnd = $CF;
keyPageUp = $C9;
keyArrowLeft = $CB;
keyArrowRight = $CD;
keyArrowUp = $C8;
keyArrowDown = $D0;
keyKeypad0 = $52;
keyKeypad1 = $4F;
keyKeypad2 = $50;
keyKeypad3 = $51;
keyKeypad4 = $4B;
keyKeypad5 = $4C;
keyKeypad6 = $4D;
keyKeypad7 = $47;
keyKeypad8 = $48;
keyKeypad9 = $49;
keyKeypadComma = $53;
keyKeypadStar = $37;
keyKeypadMinus = $4A;
keyKeypadPlus = $4E;
keyKeypadEnter = $9C;
keyCtrlPrtScr = $B7;
keyShiftPrtScr = $B7;
keyKeypadSlash = $B5;
keyNames : array [0..255] of PChar =
( { $00 } nil, 'Esc', '1', '2', '3', '4', '5', '6',
{ $08 } '7', '8', '9', '0', '+', 'Apostrophe', 'Backspace', 'Tab',
{ $10 } 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
{ $18 } 'O', 'P', '', '?', 'Enter', 'Left Ctrl', 'A', 'S',
{ $20 } 'D', 'F', 'G', 'H', 'J', 'K', 'L', '™',
{ $28 } 'Ž', '''', 'Left shift', '<', 'Z', 'X', 'C', 'V',
{ $30 } 'B', 'N', 'M', ',', '.', '-', 'Right shift', '* (pad)',
{ $38 } 'Alt', 'Space', 'Caps Lock', 'F1', 'F2', 'F3', 'F4', 'F5',
{ $40 } 'F6', 'F7', 'F8', 'F9', 'F10', 'Num Lock', 'Scroll Lock', '7 (pad)',
{ $48 } '8 (pad)', '9 (pad)', '- (pad)', '4 (pad)', '5 (pad)', '6 (pad)', '+ (pad)', '1 (pad)',
{ $50 } '2 (pad)', '3 (pad)', '0 (pad)', ', (pad)', 'SysRq', nil, nil, 'F11', 'F12',
{ $59 } nil, nil, nil, nil, nil, nil, nil,
{ $60 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
{ $70 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
{ $80 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
{ $90 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 'Enter (pad)', 'Right Ctrl', nil, nil,
{ $A0 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
{ $B0 } nil, nil, nil, nil, nil, '/ (pad)', nil, 'PrtScr', 'Alt Gr', nil, nil, nil, nil, nil, nil, nil,
{ $C0 } nil, nil, nil, nil, nil, nil, nil, 'Home',
{ $C8 } 'Up arrow', 'Page Up', nil, 'Left arrow', nil, 'Right arrow', nil, 'End',
{ $D0 } 'Down arrow', nil, 'Insert', 'Delete', nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
{ $E0 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
{ $F0 } nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil
);
procedure InstalarKb;
procedure DesinstalarKb;
function TeclaPuls( b : byte ) : Boolean;
function QTeclaPuls : Boolean;
function AgarrarTecla : Byte;
procedure BorrarKb;
procedure EscriuKb;
implementation
var
uOldInt9 : Pointer; { saves location of old OldInt9 vector }
uKeys : array [0..255] of Boolean; { array that holds key values }
e0Flag : Byte;
uExitProc : Pointer;
{$F+}
procedure NewInt9; interrupt; assembler;
asm
cli
in al, $60 { get scan code from keyboard port }
cmp al, $E0 { al = $E0 key ? }
jne @@SetScanCode
mov [e0Flag], 128
mov al, 20h { Send 'generic' EOI to PIC }
out 20h, al
jmp @@exit
@@SetScanCode:
mov bl, al { Save scancode in BL }
and bl, 01111111b
add bl, [e0Flag]
xor bh, bh
and al, 10000000b { keep break bit, if set }
xor al, 10000000b { flip bit, 1 means pressed, 0 no }
rol al, 1 { move breakbit to bit 0 }
mov [offset uKeys + bx], al
mov [e0Flag], 0
mov al, 20h { send EOI to PIC }
out 20h, al
@@exit:
sti
end;
{$F-}
procedure InstalarKb;
begin
GetIntVec( $09, uOldInt9); { save old location of INT 09 handler }
SetIntVec( $09, Addr( NewInt9)); { point to new routine }
FillChar( uKeys, SizeOf( uKeys), 0); { clear the keys array }
end;
procedure DesinstalarKb;
begin
SetIntVec( $09, uOldInt9); { point back to original routine }
uOldInt9 := nil;
end;
function TeclaPuls( b : byte ) : Boolean;
begin
TeclaPuls := uKeys[b];
end;
function QTeclaPuls : Boolean;
var b : Integer;
begin
QTeclaPuls := True;
for b := 0 to 255 do
if uKeys[b] and (keyNames[b] <> nil) then
Exit;
QTeclaPuls := False;
end;
function AgarrarTecla : Byte;
var b : Integer;
begin
AgarrarTecla := 0;
for b := 1 to 255 do
if uKeys[b] and (keyNames[b] <> nil) then
begin
AgarrarTecla := b;
Exit;
end;
end;
procedure BorrarKb;
begin
FillChar( uKeys, SizeOf( uKeys), 0); { clear the keys array }
end;
{$F+}
procedure CleanUp;
begin
ExitProc := uExitProc;
if uOldInt9 <> nil then
DesinstalarKb;
end;
procedure EscriuKb;
var b:byte;
begin
for b := 0 to 255 do
if uKeys[b] and (keyNames[b] <> nil) then
write(keyNames[b],' | ');
writeln;
end;
{$F-}
begin
uExitProc := ExitProc;
ExitProc := @CleanUp;
uOldInt9 := nil;
end.
+340
View File
@@ -0,0 +1,340 @@
PROJECT := orni
BUILDDIR := build
# Detecció de plataforma. En Windows CMake defaulteja a "NMake Makefiles"
# (que requereix Visual Studio); forcem MinGW Makefiles per usar el g++ de
# MinGW. nproc tampoc existeix en cmd.exe → fem servir NUMBER_OF_PROCESSORS.
ifeq ($(OS),Windows_NT)
ifneq ($(MSYSTEM),)
NULDEV := /dev/null
else
NULDEV := NUL
endif
JOBS ?= $(NUMBER_OF_PROCESSORS)
HAS_NINJA := $(shell ninja --version 2>$(NULDEV))
ifneq ($(HAS_NINJA),)
CMAKE_GEN := -G "Ninja"
else
CMAKE_GEN := -G "MinGW Makefiles"
endif
else
NULDEV := /dev/null
JOBS ?= $(shell nproc 2>/dev/null || echo 4)
HAS_NINJA := $(shell ninja --version 2>/dev/null)
ifneq ($(HAS_NINJA),)
CMAKE_GEN := -G "Ninja"
else
CMAKE_GEN :=
endif
endif
# VERSION (única font de veritat: CMakeLists.txt project(...) VERSION ...).
# Lazy (=): només es calcula quan s'invoca un target que la usa.
ifeq ($(OS),Windows_NT)
VERSION = v$(shell powershell -Command "(Select-String -Path 'CMakeLists.txt' -Pattern 'project.*VERSION\s+([0-9.]+)').Matches.Groups[1].Value")
else
VERSION = v$(shell grep '^project' CMakeLists.txt | sed -E 's/.*VERSION[[:space:]]+([0-9.]+).*/\1/')
endif
# GIT_HASH calculat al host i passat a CMake (evita problemes si CMake corre en
# entorns sense accés a git).
GIT_HASH := $(shell git rev-parse --short=7 HEAD 2>$(NULDEV))
ifeq ($(GIT_HASH),)
GIT_HASH := unknown
endif
CMAKE_DEFS := -DGIT_HASH=$(GIT_HASH)
# ==============================================================================
# RELEASE — variables d'empaquetat per distribució
# ==============================================================================
APP_NAME := Orni Attack
DIST_DIR := dist
RELEASE_FOLDER := $(DIST_DIR)/_tmp
TARGET_FILE := $(BUILDDIR)/$(PROJECT)
RELEASE_FILE := $(RELEASE_FOLDER)/$(PROJECT)
# Noms dels artefactes finals (amb VERSION i PROJECT)
WINDOWS_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-win32-x64.zip
MACOS_APPLE_SILICON_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-macos-apple-silicon.dmg
LINUX_RELEASE := $(DIST_DIR)/$(PROJECT)-$(VERSION)-linux.tar.gz
# Variables específiques de Windows (PowerShell). El subst escapa apòstrofs.
ifeq ($(OS),Windows_NT)
WIN_TARGET_FILE := $(BUILDDIR)/$(APP_NAME)
WIN_RELEASE_FILE := $(RELEASE_FOLDER)/$(APP_NAME)
WIN_RELEASE_FILE_PS := $(subst ','',$(WIN_RELEASE_FILE))
UNAME_S :=
else
WIN_TARGET_FILE := $(TARGET_FILE)
WIN_RELEASE_FILE := $(RELEASE_FILE)
WIN_RELEASE_FILE_PS := $(WIN_RELEASE_FILE)
UNAME_S := $(shell uname -s)
endif
# Helpers cross-platform.
ifeq ($(OS),Windows_NT)
RMFILE := del /Q
RMDIR := rmdir /S /Q
MKDIR := mkdir
else
RMFILE := rm -f
RMDIR := rm -rdf
MKDIR := mkdir -p
endif
.PHONY: all debug release _windows-release _macos-release _linux-release \
run run-debug clean rebuild show-version pack \
format format-check tidy tidy-fix cppcheck hooks-install help
# ==============================================================================
# COMPILACIÓ
# ==============================================================================
# make → Release (binari d'ús normal)
# make debug → Debug
# make release → Release + empaquetat per a distribució (zip/dmg/tar.gz segons SO)
# ==============================================================================
all:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) -j$(JOBS)
debug:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Debug $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) -j$(JOBS)
run: all
@./$(BUILDDIR)/$(PROJECT)
run-debug: debug
@./$(BUILDDIR)/$(PROJECT)
# Release + empaquetat: detecta el SO i delega al sub-target corresponent.
release:
ifeq ($(OS),Windows_NT)
@"$(MAKE)" _windows-release
else
ifeq ($(UNAME_S),Darwin)
@$(MAKE) _macos-release
else
@$(MAKE) _linux-release
endif
endif
# ==============================================================================
# RELEASE — Linux (.tar.gz)
# ==============================================================================
_linux-release:
@echo "Creando release para Linux - Version: $(VERSION)"
# Compila Release (genera resources.pack i binari)
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) -j$(JOBS)
# Recrea la carpeta temporal
@$(MKDIR) "$(DIST_DIR)" 2>/dev/null || true
@$(RMDIR) "$(RELEASE_FOLDER)" 2>/dev/null || true
$(MKDIR) "$(RELEASE_FOLDER)"
# Còpia de fitxers
cp $(BUILDDIR)/resources.pack "$(RELEASE_FOLDER)"
cp README.md "$(RELEASE_FOLDER)"
@[ -f LICENSE ] && cp LICENSE "$(RELEASE_FOLDER)" || true
cp "$(TARGET_FILE)" "$(RELEASE_FILE)"
strip -s -R .comment -R .gnu.version "$(RELEASE_FILE)" --strip-unneeded
# Empaqueta a .tar.gz
$(RMFILE) "$(LINUX_RELEASE)"
tar -czvf "$(LINUX_RELEASE)" -C "$(RELEASE_FOLDER)" .
@echo "Release creado: $(LINUX_RELEASE)"
# Neteja la carpeta temporal
$(RMDIR) "$(RELEASE_FOLDER)"
# ==============================================================================
# RELEASE — Windows (.zip)
# ==============================================================================
_windows-release:
@echo off
@echo Creando release para Windows - Version: $(VERSION)
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) -j$(JOBS)
@powershell -Command "if (-not (Test-Path '$(DIST_DIR)')) {New-Item '$(DIST_DIR)' -ItemType Directory}"
@powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}"
@powershell -Command "if (-not (Test-Path '$(RELEASE_FOLDER)')) {New-Item '$(RELEASE_FOLDER)' -ItemType Directory}"
@powershell -Command "Copy-Item -Path '$(BUILDDIR)/resources.pack' -Destination '$(RELEASE_FOLDER)'"
@powershell -Command "if (Test-Path 'LICENSE') { Copy-Item 'LICENSE' -Destination '$(RELEASE_FOLDER)' }"
@powershell -Command "Copy-Item 'README.md' -Destination '$(RELEASE_FOLDER)'"
@powershell -Command "if (Test-Path 'release\windows\dll') { Copy-Item 'release\windows\dll\*.dll' -Destination '$(RELEASE_FOLDER)' }"
@powershell -Command "Copy-Item -Path '$(TARGET_FILE).exe' -Destination '$(WIN_RELEASE_FILE_PS).exe'"
strip -s -R .comment -R .gnu.version "$(WIN_RELEASE_FILE).exe" --strip-unneeded
@powershell -Command "if (Test-Path '$(WINDOWS_RELEASE)') {Remove-Item '$(WINDOWS_RELEASE)'}"
@powershell -Command "Compress-Archive -Path '$(RELEASE_FOLDER)/*' -DestinationPath '$(WINDOWS_RELEASE)'"
@echo Release creado: $(WINDOWS_RELEASE)
@powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}"
# ==============================================================================
# RELEASE — macOS (.dmg per Apple Silicon)
# ==============================================================================
_macos-release:
@echo "Creando release para macOS - Version: $(VERSION)"
# Verificar/instal·lar create-dmg si cal
@which create-dmg > /dev/null || (echo "Instalando create-dmg..." && brew install create-dmg)
# Compila la versió Apple Silicon
@cmake -S . -B $(BUILDDIR)/arm $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
-DMACOS_BUNDLE=ON $(CMAKE_DEFS)
@cmake --build $(BUILDDIR)/arm -j$(JOBS)
# Neteja artefactes anteriors
@$(MKDIR) "$(DIST_DIR)" 2>/dev/null || true
$(RMDIR) "$(RELEASE_FOLDER)" 2>/dev/null || true
$(RMFILE) "$(DIST_DIR)"/rw.* 2>/dev/null || true
$(RMFILE) "$(MACOS_APPLE_SILICON_RELEASE)"
# Crea l'estructura del bundle .app
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS"
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
# Còpia de recursos i metadades del bundle
cp $(BUILDDIR)/arm/resources.pack "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
cp -R release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
cp release/icons/icon.icns "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
cp release/macos/Info.plist "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents"
@[ -f LICENSE ] && cp LICENSE "$(RELEASE_FOLDER)" || true
cp README.md "$(RELEASE_FOLDER)"
# Recreate framework symlinks (Versions/Current i top-level)
@cd "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks/SDL3.framework" && \
rm -f SDL3 Headers Resources && \
ln -s Versions/Current/SDL3 SDL3 && \
ln -s Versions/Current/Headers Headers && \
ln -s Versions/Current/Resources Resources
@cd "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks/SDL3.framework/Versions" && \
rm -f Current && ln -s A Current
# Actualitza Info.plist amb VERSION i metadades
@echo "Actualizando Info.plist con versión $(VERSION)..."
@RAW_VERSION=$$(echo "$(VERSION)" | sed 's/^v//'); \
sed -i '' '/<key>CFBundleShortVersionString<\/key>/{n;s|<string>.*</string>|<string>'"$$RAW_VERSION"'</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"; \
sed -i '' '/<key>CFBundleVersion<\/key>/{n;s|<string>.*</string>|<string>'"$$RAW_VERSION"'</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"; \
sed -i '' '/<key>CFBundleExecutable<\/key>/{n;s|<string>.*</string>|<string>$(PROJECT)</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"; \
sed -i '' '/<key>CFBundleName<\/key>/{n;s|<string>.*</string>|<string>$(APP_NAME)</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"; \
sed -i '' '/<key>CFBundleDisplayName<\/key>/{n;s|<string>.*</string>|<string>$(APP_NAME)</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"
# Còpia del binari al bundle
cp "$(BUILDDIR)/arm/$(PROJECT)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(PROJECT)"
# Firma ad-hoc del bundle
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
# Empaqueta el .dmg
@echo "Creando DMG Apple Silicon con iconos de 96x96..."
create-dmg \
--volname "$(APP_NAME)" \
--window-pos 200 120 \
--window-size 720 300 \
--icon-size 96 \
--text-size 12 \
--icon "$(APP_NAME).app" 278 102 \
--icon "LICENSE" 441 102 \
--icon "README.md" 604 102 \
--app-drop-link 115 102 \
--hide-extension "$(APP_NAME).app" \
"$(MACOS_APPLE_SILICON_RELEASE)" \
"$(RELEASE_FOLDER)" || true
@echo "Release Apple Silicon creado: $(MACOS_APPLE_SILICON_RELEASE)"
# Neteja temporals
$(RMDIR) "$(RELEASE_FOLDER)"
$(RMDIR) $(BUILDDIR)/arm
$(RMFILE) "$(DIST_DIR)"/rw.* 2>/dev/null || true
show-version:
@echo "$(PROJECT) $(VERSION) ($(GIT_HASH))"
clean:
@rm -rf $(BUILDDIR) $(DIST_DIR)
rebuild: clean all
# Empaqueta data/ a $(BUILDDIR)/resources.pack. Força un rebuild del pack encara
# que res no hagi canviat dins data/. L'empaquetat també es fa automàticament a
# cada `make`/`make debug` via el target CMake `resource_pack`.
pack:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) --target pack_resources
@./$(BUILDDIR)/pack_resources data $(BUILDDIR)/resources.pack
# ==============================================================================
# CODE QUALITY (delegats a cmake)
# ==============================================================================
format:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) --target format
format-check:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) --target format-check
tidy:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) --target tidy
tidy-fix:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) --target tidy-fix
cppcheck:
@cmake -S . -B $(BUILDDIR) $(CMAKE_GEN) -DCMAKE_BUILD_TYPE=Release $(CMAKE_DEFS)
@cmake --build $(BUILDDIR) --target cppcheck
# ==============================================================================
# GIT HOOKS
# ==============================================================================
hooks-install:
@git config core.hooksPath .githooks
@echo "Git hooks activats: $(shell pwd)/.githooks"
# ==============================================================================
# AJUDA
# ==============================================================================
help:
@echo "Makefile per a $(PROJECT)"
@echo ""
@echo " Compilació:"
@echo " make - Compilar amb cmake (Release)"
@echo " make debug - Compilar amb cmake (Debug)"
@echo ""
@echo " Execució:"
@echo " make run - Compilar (Release) i executar"
@echo " make run-debug - Compilar (Debug) i executar"
@echo ""
@echo " Release:"
@echo " make release - Release + empaquetat (zip/dmg/tar.gz segons SO)"
@echo ""
@echo " Recursos:"
@echo " make pack - Empaquetar data/ a $(BUILDDIR)/resources.pack"
@echo ""
@echo " Qualitat de codi:"
@echo " make format - Formatar codi amb clang-format"
@echo " make format-check - Verificar format sense modificar"
@echo " make tidy - Anàlisi estàtic amb clang-tidy"
@echo " make tidy-fix - Anàlisi estàtic amb auto-fix"
@echo " make cppcheck - Anàlisi estàtic amb cppcheck"
@echo ""
@echo " Altres:"
@echo " make clean - Esborrar $(BUILDDIR)/ i $(DIST_DIR)/"
@echo " make rebuild - clean + all"
@echo " make show-version - Mostrar versió"
@echo " make hooks-install - Activar git hooks del projecte"
@echo ""
@echo " Versió actual: $(VERSION) ($(GIT_HASH))"
+65 -14
View File
@@ -1,20 +1,71 @@
# Asteroids <div align="center">
<img src="https://php.sustancia.synology.me/images/orni_attack/orni_attack_1.png" width="600" alt="Orni Attack">
</div>
# Orni Attack
Destrueix als cosinus mesisinus que ens ataquen montats en ORNIs! Destrueix als cosinus mesisinus que ens ataquen montats en ORNIs!
<img width="752" src="https://user-images.githubusercontent.com/110221325/184473983-a07c8594-f87c-4e6a-b723-b0a0f8d08e85.png">
---
## Controls ## Controls
* `cursor amunt` accelerar
* `cursor avall` frenar
* `cursor dreta` rotar en el sentit de les agulles del rellotge
* `cursor esquerra`rotar en l'altre sentit
* `espai` disparar
* `esc` eixir
Nomes tens una bala a l'hora. Crec que els teus dispars encara no fan pupa als ORNIs. Pero si ells te toquen sí que rebentes.
## Com jugar hui en dia El joc permet l'ús del teclat per a controlar la nau i la finestra. Les tecles són les següents:
Amb DosBox. Augmenta cicles, uns 30000 en el meu macbook. | Tecla | Acció |
|-------|-------|
| **↑** | Accelerar la nau |
| **↓** | Frenar |
| **←** | Rotar a l'esquerra |
| **→** | Rotar a la dreta |
| **Espai** | Disparar |
| **ESC** | Eixir del joc |
| **F1** | Disminuir la mida de la finestra |
| **F2** | Augmentar la mida de la finestra |
| **F3** | Alternar pantalla completa |
## Com compilar hui en dia ---
Turbo Pascal 7 desde DosBox. No m'ha fet falta activar res. ## Compilació i execució
### Compilar el joc
```bash
make # Compilar
make debug # Compilació en mode debug
make clean # Netejar fitxers compilats
./orni # Executar
```
### Crear versions release
```bash
make macos_release # macOS .app bundle + .dmg (Apple Silicon)
make linux_release # Linux .tar.gz
make windows_release # Windows .zip (requereix MinGW a Windows)
make windows_cross # Cross-compilació Windows des de Linux/macOS
make rpi_release # Raspberry Pi ARM64 cross-compilació
```
---
## Requisits
- **C++20** compatible compiler
- **SDL3** library
- **CMake** 3.15 o superior
### Plataformes suportades
- macOS (Apple Silicon i Intel)
- Linux (x86_64)
- Windows (MinGW)
- Raspberry Pi (ARM64)
---
## Història
Joc original creat en **Turbo Pascal 7 per a DOS** (1999), ara migrat a **C++20 amb SDL3**. Aquest port modern preserva la jugabilitat i l'estètica de l'original mentre aprofita les capacitats dels sistemes actuals.
**Versió actual**: BETA 3.0
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
+23
View File
@@ -0,0 +1,23 @@
# bullet.shp - Projectil (petit pentàgon)
# © 1999 Visente i Sergi (versió Pascal)
# © 2025 Port a C++20 amb SDL3
name: bullet
scale: 1.0
center: 0, 0
# Cercle (octàgon regular radi=3)
# 8 punts equidistants (45° entre ells) per aproximar un cercle
# Començant a angle=-90° (amunt), rotant sentit horari
#
# Conversió polar→cartesià (radi=3, SDL: Y creix cap avall):
# angle=-90°: (0.00, -3.00)
# angle=-45°: (2.12, -2.12)
# angle=0°: (3.00, 0.00)
# angle=45°: (2.12, 2.12)
# angle=90°: (0.00, 3.00)
# angle=135°: (-2.12, 2.12)
# angle=180°: (-3.00, 0.00)
# angle=225°: (-2.12, -2.12)
polyline: 0,-3 2.12,-2.12 3,0 2.12,2.12 0,3 -2.12,2.12 -3,0 -2.12,-2.12 0,-3
+21
View File
@@ -0,0 +1,21 @@
# enemy_pentagon.shp - ORNI enemic (pentàgon regular)
# © 1999 Visente i Sergi (versió Pascal)
# © 2025 Port a C++20 amb SDL3
name: enemy_pentagon
scale: 1.0
center: 0, 0
# Pentàgon regular radi=20
# 5 punts equidistants al voltant d'un cercle (72° entre ells)
# Començant a angle=-90° (amunt), rotant sentit antihorari
#
# Angles: -90°, -18°, 54°, 126°, 198°
# Conversió polar→cartesià (SDL: Y creix cap avall):
# angle=-90°: (0.00, -20.00)
# angle=-18°: (19.02, -6.18)
# angle=54°: (11.76, 16.18)
# angle=126°: (-11.76, 16.18)
# angle=198°: (-19.02, -6.18)
polyline: 0,-20 19.02,-6.18 11.76,16.18 -11.76,16.18 -19.02,-6.18 0,-20
+30
View File
@@ -0,0 +1,30 @@
# enemy_pinwheel.shp - ORNI enemic (molinillo de 4 triangles)
# © 2025 Port a C++20 amb SDL3
name: enemy_pinwheel
scale: 1.0
center: 0, 0
# Molinillo: 4 triangles, un en cada quadrant
# Cada triangle comparteix el centre (0,0) i té:
# - Un vèrtex en un eix (±20, 0) o (0, ±20)
# - Un vèrtex en la diagonal del quadrant (±14.14, ±14.14)
# - El tercer vèrtex al centre (0,0)
#
# Geometria:
# Triangle 1 (quadrant superior-dret): centre → eix dret → diagonal
# Triangle 2 (quadrant superior-esq): centre → eix superior → diagonal
# Triangle 3 (quadrant inferior-esq): centre → eix esquerre → diagonal
# Triangle 4 (quadrant inferior-dret): centre → eix inferior → diagonal
# Triangle 1: quadrant superior-dret
polyline: 0,0 20,0 14.14,-14.14 0,0
# Triangle 2: quadrant superior-esquerre
polyline: 0,0 0,-20 -14.14,-14.14 0,0
# Triangle 3: quadrant inferior-esquerre
polyline: 0,0 -20,0 -14.14,14.14 0,0
# Triangle 4: quadrant inferior-dret
polyline: 0,0 0,20 14.14,14.14 0,0
+19
View File
@@ -0,0 +1,19 @@
# enemy_square.shp - ORNI enemic (quadrat regular)
# © 2025 Port a C++20 amb SDL3
name: enemy_square
scale: 1.0
center: 0, 0
# Quadrat regular radi=20 (circumscrit)
# 4 punts equidistants al voltant d'un cercle (90° entre ells)
# Començant a angle=-90° (amunt), rotant sentit horari
#
# Angles: -90°, 0°, 90°, 180°
# Conversió polar→cartesià (SDL: Y creix cap avall):
# angle=-90°: (0.00, -20.00)
# angle=0°: (20.00, 0.00)
# angle=90°: (0.00, 20.00)
# angle=180°: (-20.00, 0.00)
polyline: 0,-20 20,0 0,20 -20,0 0,-20
+10
View File
@@ -0,0 +1,10 @@
# char_0.shp - Dígito 0
# Dimensiones: 20×40 (blocky display)
# Rectángulo cerrado (polyline continua, NO 6 líneas separadas)
name: char_0
scale: 1.0
center: 10, 20
# Rectángulo cerrado
polyline: 2,10 18,10 18,30 2,30 2,10
+10
View File
@@ -0,0 +1,10 @@
# char_1.shp - Dígito 1
# Dimensiones: 20×40 (blocky display)
# Línea vertical simple centrada
name: char_1
scale: 1.0
center: 10, 20
# Línea vertical central
line: 10,10 10,30
+10
View File
@@ -0,0 +1,10 @@
# char_2.shp - Dígito 2
# Dimensiones: 20×40 (blocky display)
# Forma de "2" con curva simulada (polyline continua)
name: char_2
scale: 1.0
center: 10, 20
# Trazo continuo en forma de S achatada
polyline: 2,10 18,10 18,20 2,20 2,30 18,30
+11
View File
@@ -0,0 +1,11 @@
# char_3.shp - Dígito 3
# Dimensiones: 20×40 (blocky display)
# Forma de "3" con dos curvas (polylines)
name: char_3
scale: 1.0
center: 10, 20
# Trazo continuo (barra superior + lateral derecho + barra media + lateral derecho + barra inferior)
polyline: 2,10 18,10 18,20 8,20
polyline: 8,20 18,20 18,30 2,30
+12
View File
@@ -0,0 +1,12 @@
# char_4.shp - Dígito 4
# Dimensiones: 20×40 (blocky display)
# Forma de "4" con líneas continuas
name: char_4
scale: 1.0
center: 10, 20
# Trazo principal (vertical izquierda + horizontal + vertical derecha superior)
polyline: 2,10 2,20 18,20
# Vertical derecha completa (cruza la horizontal)
line: 18,10 18,30
+10
View File
@@ -0,0 +1,10 @@
# char_5.shp - Dígito 5
# Dimensiones: 20×40 (blocky display)
# Forma de "5" con curva (polyline continua)
name: char_5
scale: 1.0
center: 10, 20
# Trazo continuo en forma de S invertida
polyline: 18,10 2,10 2,20 18,20 18,30 2,30
+10
View File
@@ -0,0 +1,10 @@
# char_6.shp - Dígito 6
# Dimensiones: 20×40 (blocky display)
# Forma de "6" con espiral (polyline continua)
name: char_6
scale: 1.0
center: 10, 20
# Trazo continuo: barra superior + lateral izquierdo + barra media + lateral derecho inferior + barra inferior + cierre
polyline: 18,10 2,10 2,30 18,30 18,20 2,20
+10
View File
@@ -0,0 +1,10 @@
# char_7.shp - Dígito 7
# Dimensiones: 20×40 (blocky display)
# Línea horizontal superior + diagonal hacia abajo-derecha
name: char_7
scale: 1.0
center: 10, 20
# Barra superior + diagonal
polyline: 2,10 18,10 18,30
+12
View File
@@ -0,0 +1,12 @@
# char_8.shp - Dígito 8
# Dimensiones: 20×40 (blocky display)
# Dos rectángulos apilados (polylines continuas)
name: char_8
scale: 1.0
center: 10, 20
# Rectángulo superior
polyline: 2,10 18,10 18,20 2,20 2,10
# Rectángulo inferior (comparte borde con el superior)
polyline: 2,20 18,20 18,30 2,30 2,20
+10
View File
@@ -0,0 +1,10 @@
# char_9.shp - Dígito 9
# Dimensiones: 20×40 (blocky display)
# Forma de "9" con espiral (polyline continua)
name: char_9
scale: 1.0
center: 10, 20
# Trazo continuo: lateral derecho completo + barra superior + lateral izquierdo superior + barra media
polyline: 18,30 18,10 2,10 2,20 18,20
+11
View File
@@ -0,0 +1,11 @@
# char_A.shp - Letra A
# Dimensiones: 20×40 (blocky display)
name: char_A
scale: 1.0
center: 10, 20
# Forma triangular (dos diagonales hacia arriba)
polyline: 2,30 10,10 18,30
# Barra horizontal media
line: 5,22 15,22
+11
View File
@@ -0,0 +1,11 @@
# char_B.shp - Letra B
# Dimensiones: 20×40 (blocky display)
name: char_B
scale: 1.0
center: 10, 20
# Rectángulo superior
polyline: 2,10 14,10 14,20 2,20 2,10
# Rectángulo inferior (más ancho)
polyline: 2,20 16,20 16,30 2,30 2,20
+9
View File
@@ -0,0 +1,9 @@
# char_C.shp - Letra C
# Dimensiones: 20×40 (blocky display)
name: char_C
scale: 1.0
center: 10, 20
# Curva simulada (semicírculo abierto a la derecha)
polyline: 18,12 14,10 6,10 2,14 2,26 6,30 14,30 18,28
+9
View File
@@ -0,0 +1,9 @@
# char_D.shp - Letra D
# Dimensiones: 20×40 (blocky display)
name: char_D
scale: 1.0
center: 10, 20
# Vertical izquierda + curva derecha simulada
polyline: 2,10 14,10 18,14 18,26 14,30 2,30 2,10
+10
View File
@@ -0,0 +1,10 @@
# char_E.shp - Letra E
# Dimensiones: 20×40 (blocky display)
name: char_E
scale: 1.0
center: 10, 20
# Forma de E (vertical izquierda + 3 horizontales)
polyline: 18,10 2,10 2,30 18,30
line: 2,20 14,20
+10
View File
@@ -0,0 +1,10 @@
# char_F.shp - Letra F
# Dimensiones: 20×40 (blocky display)
name: char_F
scale: 1.0
center: 10, 20
# Vertical izquierda + barra superior + barra media
polyline: 2,30 2,10 18,10
line: 2,20 14,20
+9
View File
@@ -0,0 +1,9 @@
# char_G.shp - Letra G
# Dimensiones: 20×40 (blocky display)
name: char_G
scale: 1.0
center: 10, 20
# Como C pero con barra horizontal hacia adentro
polyline: 18,12 14,10 6,10 2,14 2,26 6,30 14,30 18,28 18,20 12,20
+13
View File
@@ -0,0 +1,13 @@
# char_H.shp - Letra H
# Dimensiones: 20×40 (blocky display)
name: char_H
scale: 1.0
center: 10, 20
# Vertical izquierda
line: 2,10 2,30
# Vertical derecha
line: 18,10 18,30
# Barra media
line: 2,20 18,20
+9
View File
@@ -0,0 +1,9 @@
# char_I.shp - Letra I
# Dimensiones: 20×40 (blocky display)
name: char_I
scale: 1.0
center: 10, 20
# Línea vertical central
line: 10,10 10,30
+9
View File
@@ -0,0 +1,9 @@
# char_J.shp - Letra J
# Dimensiones: 20×40 (blocky display)
name: char_J
scale: 1.0
center: 10, 20
# Vertical derecha con curva abajo-izquierda
polyline: 18,10 18,26 14,30 6,30 2,26
+13
View File
@@ -0,0 +1,13 @@
# char_K.shp - Letra K
# Dimensiones: 20×40 (blocky display)
name: char_K
scale: 1.0
center: 10, 20
# Vertical izquierda
line: 2,10 2,30
# Diagonal superior
line: 18,10 2,20
# Diagonal inferior
line: 2,20 18,30
+9
View File
@@ -0,0 +1,9 @@
# char_L.shp - Letra L
# Dimensiones: 20×40 (blocky display)
name: char_L
scale: 1.0
center: 10, 20
# Forma de L (vertical izquierda + horizontal abajo)
polyline: 2,10 2,30 18,30
+9
View File
@@ -0,0 +1,9 @@
# char_M.shp - Letra M
# Dimensiones: 20×40 (blocky display)
name: char_M
scale: 1.0
center: 10, 20
# Forma de M con pico en el medio
polyline: 2,30 2,10 10,20 18,10 18,30
+9
View File
@@ -0,0 +1,9 @@
# char_N.shp - Letra N
# Dimensiones: 20×40 (blocky display)
name: char_N
scale: 1.0
center: 10, 20
# Vertical izquierda + diagonal + vertical derecha
polyline: 2,30 2,10 18,30 18,10
+9
View File
@@ -0,0 +1,9 @@
# char_O.shp - Letra O
# Dimensiones: 20×40 (blocky display)
name: char_O
scale: 1.0
center: 10, 20
# Rectángulo cerrado
polyline: 2,10 18,10 18,30 2,30 2,10
+11
View File
@@ -0,0 +1,11 @@
# char_P.shp - Letra P
# Dimensiones: 20×40 (blocky display)
name: char_P
scale: 1.0
center: 10, 20
# Vertical izquierda completa
line: 2,10 2,30
# Rectángulo superior cerrado
polyline: 2,10 14,10 14,20 2,20
+11
View File
@@ -0,0 +1,11 @@
# char_Q.shp - Letra Q
# Dimensiones: 20×40 (blocky display)
name: char_Q
scale: 1.0
center: 10, 20
# Rectángulo cerrado (como O)
polyline: 2,10 18,10 18,30 2,30 2,10
# Diagonal inferior derecha (cola de la Q)
line: 12,24 18,30
+13
View File
@@ -0,0 +1,13 @@
# char_R.shp - Letra R
# Dimensiones: 20×40 (blocky display)
name: char_R
scale: 1.0
center: 10, 20
# Vertical izquierda completa
line: 2,10 2,30
# Rectángulo superior cerrado
polyline: 2,10 14,10 14,20 2,20
# Diagonal inferior derecha
line: 8,20 18,30
+9
View File
@@ -0,0 +1,9 @@
# char_S.shp - Letra S
# Dimensiones: 20×40 (blocky display)
name: char_S
scale: 1.0
center: 10, 20
# Forma de S con curvas simuladas
polyline: 18,12 14,10 6,10 2,14 2,18 6,20 14,20 18,22 18,26 14,30 6,30 2,28
+11
View File
@@ -0,0 +1,11 @@
# char_T.shp - Letra T
# Dimensiones: 20×40 (blocky display)
name: char_T
scale: 1.0
center: 10, 20
# Barra horizontal superior
line: 2,10 18,10
# Línea vertical central
line: 10,10 10,30
+9
View File
@@ -0,0 +1,9 @@
# char_U.shp - Letra U
# Dimensiones: 20×40 (blocky display)
name: char_U
scale: 1.0
center: 10, 20
# Forma de U (dos verticales + curva abajo)
polyline: 2,10 2,26 6,30 14,30 18,26 18,10
+9
View File
@@ -0,0 +1,9 @@
# char_V.shp - Letra V
# Dimensiones: 20×40 (blocky display)
name: char_V
scale: 1.0
center: 10, 20
# Forma de V (dos diagonales hacia abajo)
polyline: 2,10 10,30 18,10
+9
View File
@@ -0,0 +1,9 @@
# char_W.shp - Letra W
# Dimensiones: 20×40 (blocky display)
name: char_W
scale: 1.0
center: 10, 20
# Forma de W (doble V)
polyline: 2,10 5,30 10,20 15,30 18,10
+11
View File
@@ -0,0 +1,11 @@
# char_X.shp - Letra X
# Dimensiones: 20×40 (blocky display)
name: char_X
scale: 1.0
center: 10, 20
# Diagonal \
line: 2,10 18,30
# Diagonal /
line: 18,10 2,30
+12
View File
@@ -0,0 +1,12 @@
# char_Y.shp - Letra Y
# Dimensiones: 20×40 (blocky display)
name: char_Y
scale: 1.0
center: 10, 20
# Dos diagonales superiores que se juntan
polyline: 2,10 10,20
polyline: 18,10 10,20
# Línea vertical inferior
line: 10,20 10,30
+9
View File
@@ -0,0 +1,9 @@
# char_Z.shp - Letra Z
# Dimensiones: 20×40 (blocky display)
name: char_Z
scale: 1.0
center: 10, 20
# Barra superior + diagonal + barra inferior
polyline: 2,10 18,10 2,30 18,30
+11
View File
@@ -0,0 +1,11 @@
# char_colon.shp - Símbolo : (dos puntos)
# Dimensiones: 20×40 (blocky display)
name: char_colon
scale: 1.0
center: 10, 20
# Punto superior
polyline: 8,14 12,14 12,17 8,17 8,14
# Punto inferior
polyline: 8,23 12,23 12,26 8,26 8,23
+9
View File
@@ -0,0 +1,9 @@
# char_comma.shp - Símbolo , (coma)
# Dimensiones: 20×40 (blocky display)
name: char_comma
scale: 1.0
center: 10, 20
# Dot + tail hacia abajo-izquierda
polyline: 10,28 10,32 8,34
+12
View File
@@ -0,0 +1,12 @@
# char_copyright.shp - Símbolo © (copyright)
# Dimensiones: 20×40 (blocky display)
name: char_copyright
scale: 1.0
center: 10, 20
# Círculo exterior (aproximado con 12 puntos)
polyline: 10,8 13,9 15,11 17,14 18,17 18,23 17,26 15,29 13,31 10,32 7,31 5,29 3,26 2,23 2,17 3,14 5,11 7,9 10,8
# Letra C interior
polyline: 13,16 9,14 7,16 6,20 7,24 9,26 13,24
+9
View File
@@ -0,0 +1,9 @@
# char_dot.shp - Símbolo . (punto)
# Dimensiones: 20×40 (blocky display)
name: char_dot
scale: 1.0
center: 10, 20
# Cuadrado pequeño centrado abajo
polyline: 8,28 12,28 12,32 8,32 8,28
+11
View File
@@ -0,0 +1,11 @@
# char_exclamation.shp - Símbolo ! (exclamación)
# Dimensiones: 20×40 (blocky display)
name: char_exclamation
scale: 1.0
center: 10, 20
# Línea vertical superior
line: 10,10 10,24
# Dot inferior
polyline: 8,28 12,28 12,32 8,32 8,28
+9
View File
@@ -0,0 +1,9 @@
# char_minus.shp - Símbolo - (menos/guión)
# Dimensiones: 20×40 (blocky display)
name: char_minus
scale: 1.0
center: 10, 20
# Línea horizontal en el centro
line: 4,20 16,20
+11
View File
@@ -0,0 +1,11 @@
# char_question.shp - Símbolo ? (interrogación)
# Dimensiones: 20×40 (blocky display)
name: char_question
scale: 1.0
center: 10, 20
# Curva superior + trazo hacia abajo
polyline: 2,12 10,10 18,12 18,18 10,20 10,24
# Dot inferior
polyline: 8,28 12,28 12,32 8,32 8,28
+9
View File
@@ -0,0 +1,9 @@
# char_space.shp - Espacio (vacío)
# Dimensiones: 20×40 (blocky display)
# Sin geometría (espacio vacío intencional)
name: char_space
scale: 1.0
center: 10, 20
# No hay polylines ni lines (vacío intencionado)
+10
View File
@@ -0,0 +1,10 @@
# letra_a.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 71.43 x 100.00 px
name: letra_a
scale: 1.0
center: 35.71, 50.00
polyline: 28.57,71.43 28.57,100.00 0.00,100.00 0.00,14.29 14.29,14.29 14.29,0.00 57.14,0.00 57.14,14.29 71.43,14.29 71.43,100.00 42.86,100.00 42.86,71.43 28.57,71.43
polyline: 28.57,14.29 28.57,57.14 42.86,57.14 42.86,14.29 28.57,14.29
+9
View File
@@ -0,0 +1,9 @@
# letra_e.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 71.43 x 100.00 px
name: letra_e
scale: 1.0
center: 35.71, 50.00
polyline: 57.14,28.57 57.14,42.86 28.57,42.86 28.57,85.71 71.43,85.71 71.43,100.00 0.00,100.00 0.00,0.00 71.43,0.00 71.43,14.29 28.57,14.29 28.57,28.57 57.14,28.57
+9
View File
@@ -0,0 +1,9 @@
# letra_g.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 71.43 x 100.00 px
name: letra_g
scale: 1.0
center: 35.71, 50.00
polyline: 14.29,0.00 57.14,0.00 57.14,14.29 28.57,14.29 28.57,85.71 42.86,85.71 42.86,42.86 71.43,42.86 71.43,100.00 14.29,100.00 14.29,85.71 0.00,85.71 0.00,14.29 14.29,14.29 14.29,0.00
+9
View File
@@ -0,0 +1,9 @@
# letra_i.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 28.57 x 100.00 px
name: letra_i
scale: 1.0
center: 14.29, 50.00
polyline: 0.00,0.00 28.57,0.00 28.57,100.00 0.00,100.00 0.00,0.00
+9
View File
@@ -0,0 +1,9 @@
# letra_j.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 57.14 x 100.00 px
name: letra_j
scale: 1.0
center: 28.57, 50.00
polyline: 0.00,100.00 0.00,85.71 28.57,85.71 28.57,0.00 57.14,0.00 57.14,85.71 42.86,85.71 42.86,100.00 0.00,100.00
+9
View File
@@ -0,0 +1,9 @@
# letra_l.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 57.14 x 100.00 px
name: letra_l
scale: 1.0
center: 28.57, 50.00
polyline: 0.00,0.00 28.57,0.00 28.57,85.71 57.14,85.71 57.14,100.00 0.00,100.00 0.00,0.00
+9
View File
@@ -0,0 +1,9 @@
# letra_m.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 100.00 x 100.00 px
name: letra_m
scale: 1.0
center: 50.00, 50.00
polyline: 71.43,57.14 57.14,57.14 57.14,71.43 42.86,71.43 42.86,57.14 28.57,57.14 28.57,100.00 0.00,100.00 0.00,0.00 14.29,0.00 14.29,14.29 28.57,14.29 28.57,28.57 42.86,28.57 42.86,42.86 57.14,42.86 57.14,28.57 71.43,28.57 71.43,14.29 85.71,14.29 85.71,0.00 100.00,0.00 100.00,100.00 71.43,100.00 71.43,57.14
+9
View File
@@ -0,0 +1,9 @@
# letra_s.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 57.14 x 100.00 px
name: letra_s
scale: 1.0
center: 28.57, 50.00
polyline: 0.00,85.71 28.57,85.71 28.57,57.14 14.29,57.14 14.29,42.86 0.00,42.86 0.00,14.29 14.29,14.29 14.29,0.00 57.14,0.00 57.14,14.29 28.57,14.29 28.57,42.86 42.86,42.86 42.86,57.14 57.14,57.14 57.14,85.71 42.86,85.71 42.86,100.00 0.00,100.00 0.00,85.71
+24
View File
@@ -0,0 +1,24 @@
# ship.shp - Nau del jugador 1 (triangle amb base còncava - punta de fletxa)
# © 1999 Visente i Sergi (versió Pascal)
# © 2025 Port a C++20 amb SDL3
name: ship
scale: 1.0
center: 0, 0
# Triangle amb base còncava tipus "punta de fletxa"
# Punts originals (polar):
# p1: r=12, angle=270° (3π/2) → punta amunt
# p2: r=12, angle=45° (π/4) → base dreta-darrere
# p3: r=12, angle=135° (3π/4) → base esquerra-darrere
#
# MODIFICACIÓ: afegit p4 al mig de la base, desplaçat cap al centre
# p4: (0, 4) → punt central de la base, cap endins
#
# Conversió polar→cartesià (angle-90° perquè origen visual és amunt):
# p1: (0, -12) → punta
# p2: (8.49, 8.49) → base dreta
# p4: (0, 4) → base centre (cap endins)
# p3: (-8.49, 8.49) → base esquerra
polyline: 0,-12 8.49,8.49 0,4 -8.49,8.49 0,-12
+30
View File
@@ -0,0 +1,30 @@
# ship2.shp - Nau del jugador 2 (triangle amb circulito central)
# © 1999 Visente i Sergi (versió Pascal)
# © 2025 Port a C++20 amb SDL3
name: ship2
scale: 1.0
center: 0, 0
# Triangle amb base còncava tipus "punta de fletxa"
# (Mateix que ship.shp)
# Punts originals (polar):
# p1: r=12, angle=270° (3π/2) → punta amunt
# p2: r=12, angle=45° (π/4) → base dreta-darrere
# p3: r=12, angle=135° (3π/4) → base esquerra-darrere
#
# MODIFICACIÓ: afegit p4 al mig de la base, desplaçat cap al centre
# p4: (0, 4) → punt central de la base, cap endins
#
# Conversió polar→cartesià (angle-90° perquè origen visual és amunt):
# p1: (0, -12) → punta
# p2: (8.49, 8.49) → base dreta
# p4: (0, 4) → base centre (cap endins)
# p3: (-8.49, 8.49) → base esquerra
#polyline: 0,-12 8.49,8.49 0,4 -8.49,8.49 0,-12
polyline: 0,-12 8.49,8.49 -8.49,8.49 0,-12
# Circulito central (octàgon r=2.5)
# Distintiu visual del jugador 2
polyline: 0,-2.5 1.77,-1.77 2.5,0 1.77,1.77 0,2.5 -1.77,1.77 -2.5,0 -1.77,-1.77 0,-2.5
+28
View File
@@ -0,0 +1,28 @@
# ship2_perspective.shp - Nave P2 con perspectiva pre-calculada
# Posición optimizada: "4 del reloj" (Abajo-Derecha)
# Dirección: Volando hacia el fondo (centro pantalla)
name: ship2_perspective
scale: 1.0
center: 0, 0
# TRANSFORMACIÓN APLICADA:
# 1. Rotación -45° (apuntando al centro desde abajo-dcha)
# 2. Proyección de perspectiva:
# - Punta (p1): Reducida al 60% (simula lejanía)
# - Base (p2, p3): Aumentada al 110% (simula cercanía)
# 3. Flip horizontal (simétrica a ship_starfield.shp)
#
# Nuevos Punts (aprox):
# p1 (Punta): (-4, -4) -> Lejos, pequeña y apuntando arriba-izq
# p2 (Ala Izq): (-3, 11) -> Cerca, lado interior
# p4 (Base Cnt): (3, 5) -> Centro base
# p3 (Ala Dcha): (11, 2) -> Cerca, lado exterior (más grande)
#polyline: -4,-4 -3,11 3,5 11,2 -4,-4
polyline: -4,-4 -3,11 11,2 -4,-4
# Circulito central (octàgon r=2.5)
# Distintiu visual del jugador 2
# Sin perspectiva (está en el centro de la nave)
polyline: 0,-2.5 1.77,-1.77 2.5,0 1.77,1.77 0,2.5 -1.77,1.77 -2.5,0 -1.77,-1.77 0,-2.5
+27
View File
@@ -0,0 +1,27 @@
# ship2.shp - Nau del jugador 2 (interceptor amb ales)
# © 2025 Orni Attack - Jugador 2
name: ship2
scale: 1.0
center: 0, 0
# Interceptor amb ales laterals
# Disseny més ample i agressiu que P1
#
# Geometria:
# - Punta més curta i ampla
# - Ales laterals pronunciades
# - Base més ampla per estabilitat visual
#
# Punts (cartesianes, Y negatiu = amunt):
# p1: (0, -10) → punta (més curta que P1)
# p2: (4, -6) → transició ala dreta
# p3: (10, 2) → punta ala dreta (més ampla)
# p4: (6, 8) → base ala dreta
# p5: (0, 6) → base centre (menys còncava)
# p6: (-6, 8) → base ala esquerra
# p7: (-10, 2) → punta ala esquerra
# p8: (-4, -6) → transició ala esquerra
# p1: (0, -10) → tanca
polyline: 0,-10 4,-6 10,2 6,8 0,6 -6,8 -10,2 -4,-6 0,-10
+21
View File
@@ -0,0 +1,21 @@
# ship_perspective.shp - Nave con perspectiva pre-calculada
# Posición optimizada: "8 del reloj" (Abajo-Izquierda)
# Dirección: Volando hacia el fondo (centro pantalla)
name: ship_perspective
scale: 1.0
center: 0, 0
# TRANSFORMACIÓN APLICADA:
# 1. Rotación +45° (apuntando al centro desde abajo-izq)
# 2. Proyección de perspectiva:
# - Punta (p1): Reducida al 60% (simula lejanía)
# - Base (p2, p3): Aumentada al 110% (simula cercanía)
#
# Nuevos Puntos (aprox):
# p1 (Punta): (4, -4) -> Lejos, pequeña y apuntando arriba-dcha
# p2 (Ala Dcha): (3, 11) -> Cerca, lado interior
# p4 (Base Cnt): (-3, 5) -> Centro base
# p3 (Ala Izq): (-11, 2) -> Cerca, lado exterior (más grande)
polyline: 4,-4 3,11 -3,5 -11,2 4,-4
+19
View File
@@ -0,0 +1,19 @@
# star.shp - Estrella per a starfield
# © 2025 Orni Attack
name: star
scale: 1.0
center: 0, 0
# Estrella de 4 puntes (diamant/creu)
# Petita i simple per a l'efecte starfield
#
# Punts:
# angle=0°: (0, -3) Dalt
# angle=90°: (3, 0) Dreta
# angle=180°: (0, 3) Baix
# angle=270°: (-3, 0) Esquerra
#
# Forma de diamant amb línies de centre a puntes
polyline: 0,-3 3,0 0,3 -3,0 0,-3
+10
View File
@@ -0,0 +1,10 @@
# letra_a.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 137.50 x 100.00 px
name: letra_a
scale: 1.0
center: 68.75, 50.00
polyline: 0.00,100.00 0.00,75.00 37.50,0.00 100.00,0.00 137.50,75.00 137.50,100.00 100.00,100.00 100.00,87.50 37.50,87.50 37.50,100.00 0.00,100.00
polyline: 62.50,25.00 50.00,50.00 50.00,62.50 87.50,62.50 87.50,50.00 75.00,25.00 62.50,25.00
+9
View File
@@ -0,0 +1,9 @@
# letra_c.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 137.50 x 100.00 px
name: letra_c
scale: 1.0
center: 68.75, 50.00
polyline: 12.50,100.00 0.00,87.50 0.00,12.50 12.50,0.00 125.00,0.00 137.50,12.50 137.50,37.50 100.00,37.50 100.00,25.00 37.50,25.00 37.50,75.00 100.00,75.00 100.00,62.50 137.50,62.50 137.50,87.50 125.00,100.00 12.50,100.00
+10
View File
@@ -0,0 +1,10 @@
# letra_exclamacion.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 37.51 x 100.00 px
name: letra_exclamacion
scale: 1.0
center: 18.75, 50.00
polyline: 0.00,62.50 0.00,0.00 37.51,0.00 37.51,62.50 0.00,62.50
polyline: 0.00,100.00 0.00,75.00 37.51,75.00 37.51,100.00 0.00,100.00
+9
View File
@@ -0,0 +1,9 @@
# letra_i.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 37.50 x 100.00 px
name: letra_i
scale: 1.0
center: 18.75, 50.00
polyline: 0.00,0.00 37.50,0.00 37.50,100.00 0.00,100.00 0.00,0.00
+9
View File
@@ -0,0 +1,9 @@
# letra_k.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 137.50 x 100.00 px
name: letra_k
scale: 1.0
center: 68.75, 50.00
polyline: 0.00,100.00 0.00,0.00 37.50,0.00 37.50,37.50 50.00,37.50 100.00,0.00 137.50,0.00 137.50,25.00 87.06,50.00 137.50,75.00 137.50,100.00 100.00,100.00 50.00,62.50 37.50,62.50 37.50,100.00 0.00,100.00
+9
View File
@@ -0,0 +1,9 @@
# letra_n.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 137.50 x 100.00 px
name: letra_n
scale: 1.0
center: 68.75, 50.00
polyline: 0.00,100.00 0.00,0.00 50.00,0.00 100.00,50.00 100.00,0.00 137.50,0.00 137.50,100.00 87.50,100.00 37.50,50.00 37.50,100.00 0.00,100.00
+10
View File
@@ -0,0 +1,10 @@
# letra_o.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 137.50 x 100.00 px
name: letra_o
scale: 1.0
center: 68.75, 50.00
polyline: 12.50,100.00 0.00,87.50 0.00,12.50 12.50,0.00 125.00,0.00 137.50,12.50 137.50,87.50 125.00,100.00 12.50,100.00
polyline: 100.00,25.00 37.50,25.00 37.50,75.00 100.00,75.00 100.00,25.00
+10
View File
@@ -0,0 +1,10 @@
# letra_r.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 137.50 x 100.00 px
name: letra_r
scale: 1.0
center: 68.75, 50.00
polyline: 0.00,100.00 0.00,0.00 125.00,0.00 137.50,12.50 137.50,62.50 125.00,62.50 137.50,75.00 137.50,100.00 100.00,100.00 100.00,75.00 37.50,75.00 37.50,100.00 0.00,100.00
polyline: 37.50,50.00 100.00,50.00 100.00,25.00 37.50,25.00 37.50,50.00
+9
View File
@@ -0,0 +1,9 @@
# letra_t.shp
# Generado automáticamente desde jailgames.svg
# Dimensiones: 137.50 x 100.00 px
name: letra_t
scale: 1.0
center: 68.75, 50.00
polyline: 0.00,25.00 0.00,0.00 137.50,0.00 137.50,25.00 87.50,25.00 87.50,100.00 50.00,100.00 50.00,25.00 0.00,25.00
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+168
View File
@@ -0,0 +1,168 @@
# stages.yaml - Configuració de les 10 etapes d'Orni Attack
# © 2025 Orni Attack
metadata:
version: "1.0"
total_stages: 10
description: "Progressive difficulty curve from novice to expert"
stages:
# STAGE 1: Tutorial - Only pentagons, slow speed
- stage_id: 1
total_enemies: 5
spawn_config:
mode: "progressive"
initial_delay: 2.0
spawn_interval: 3.0
enemy_distribution:
pentagon: 100
quadrat: 0
molinillo: 0
difficulty_multipliers:
speed_multiplier: 0.7
rotation_multiplier: 0.8
tracking_strength: 0.0
# STAGE 2: Introduction to tracking enemies
- stage_id: 2
total_enemies: 7
spawn_config:
mode: "progressive"
initial_delay: 1.5
spawn_interval: 2.5
enemy_distribution:
pentagon: 70
quadrat: 30
molinillo: 0
difficulty_multipliers:
speed_multiplier: 0.85
rotation_multiplier: 0.9
tracking_strength: 0.3
# STAGE 3: All enemy types, normal speed
- stage_id: 3
total_enemies: 10
spawn_config:
mode: "progressive"
initial_delay: 1.0
spawn_interval: 2.0
enemy_distribution:
pentagon: 50
quadrat: 30
molinillo: 20
difficulty_multipliers:
speed_multiplier: 1.0
rotation_multiplier: 1.0
tracking_strength: 0.5
# STAGE 4: Increased count, faster enemies
- stage_id: 4
total_enemies: 12
spawn_config:
mode: "progressive"
initial_delay: 0.8
spawn_interval: 1.8
enemy_distribution:
pentagon: 40
quadrat: 35
molinillo: 25
difficulty_multipliers:
speed_multiplier: 1.1
rotation_multiplier: 1.15
tracking_strength: 0.6
# STAGE 5: Maximum count reached
- stage_id: 5
total_enemies: 15
spawn_config:
mode: "progressive"
initial_delay: 0.5
spawn_interval: 1.5
enemy_distribution:
pentagon: 35
quadrat: 35
molinillo: 30
difficulty_multipliers:
speed_multiplier: 1.2
rotation_multiplier: 1.25
tracking_strength: 0.7
# STAGE 6: Molinillo becomes dominant
- stage_id: 6
total_enemies: 15
spawn_config:
mode: "progressive"
initial_delay: 0.3
spawn_interval: 1.3
enemy_distribution:
pentagon: 30
quadrat: 30
molinillo: 40
difficulty_multipliers:
speed_multiplier: 1.3
rotation_multiplier: 1.4
tracking_strength: 0.8
# STAGE 7: High intensity, fast spawns
- stage_id: 7
total_enemies: 15
spawn_config:
mode: "progressive"
initial_delay: 0.2
spawn_interval: 1.0
enemy_distribution:
pentagon: 25
quadrat: 30
molinillo: 45
difficulty_multipliers:
speed_multiplier: 1.4
rotation_multiplier: 1.5
tracking_strength: 0.9
# STAGE 8: Expert level, 50% molinillos
- stage_id: 8
total_enemies: 15
spawn_config:
mode: "progressive"
initial_delay: 0.1
spawn_interval: 0.8
enemy_distribution:
pentagon: 20
quadrat: 30
molinillo: 50
difficulty_multipliers:
speed_multiplier: 1.5
rotation_multiplier: 1.6
tracking_strength: 1.0
# STAGE 9: Near-maximum difficulty
- stage_id: 9
total_enemies: 15
spawn_config:
mode: "progressive"
initial_delay: 0.0
spawn_interval: 0.6
enemy_distribution:
pentagon: 15
quadrat: 25
molinillo: 60
difficulty_multipliers:
speed_multiplier: 1.6
rotation_multiplier: 1.7
tracking_strength: 1.1
# STAGE 10: Final challenge, 70% molinillos
- stage_id: 10
total_enemies: 15
spawn_config:
mode: "progressive"
initial_delay: 0.0
spawn_interval: 0.5
enemy_distribution:
pentagon: 10
quadrat: 20
molinillo: 70
difficulty_multipliers:
speed_multiplier: 1.8
rotation_multiplier: 2.0
tracking_strength: 1.2
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

+42
View File
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>Orni Attack</string>
<key>CFBundleExecutable</key>
<string>orni</string>
<key>CFBundleIconFile</key>
<string>icon</string>
<key>CFBundleIconName</key>
<string>icon</string>
<key>CFBundleIdentifier</key>
<string>org.jailgames.orni</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Orni Attack</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.1</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>© 1999 Visente i Sergi, 2025 Port</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>SUPublicDSAKeyFile</key>
<string>dsa_pub.pem</string>
</dict>
</plist>
@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>SDL3.framework/Versions/A/SDL3</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>macos-arm64_x86_64</string>
<key>LibraryPath</key>
<string>SDL3.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>macos</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>SDL3.framework/SDL3</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>tvos-arm64_x86_64-simulator</string>
<key>LibraryPath</key>
<string>SDL3.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>tvos</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>SDL3.framework/SDL3</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>tvos-arm64</string>
<key>LibraryPath</key>
<string>SDL3.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>tvos</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>SDL3.framework/SDL3</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>ios-arm64</string>
<key>LibraryPath</key>
<string>SDL3.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>SDL3.framework/SDL3</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>ios-arm64_x86_64-simulator</string>
<key>LibraryPath</key>
<string>SDL3.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>
@@ -0,0 +1 @@
Versions/Current/Headers

Some files were not shown because too many files have changed in this diff Show More