Compare commits
123 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cb7b99cab3 | |||
| 21e0ae0c8c | |||
| 851e6d35a2 | |||
| 79d6e71fff | |||
| fb394d23c9 | |||
| 1951bcad11 | |||
| 9a874fc83b | |||
| 1acdd3f38d | |||
| a2b11371cf | |||
| b4b76ed6e8 | |||
| 6f4eb9c1fc | |||
| 47f7ffb169 | |||
| 70f2642e6d | |||
| 1a42f24a68 | |||
| ac0f03c725 | |||
| 1804c8a171 | |||
| d83056c614 | |||
| ba2a6fe914 | |||
| 364cf36183 | |||
| 7f6af6dd00 | |||
| fdfb84170f | |||
| 2088ccdcc6 | |||
| 7556c3fe8d | |||
| decde1b7d5 | |||
| c8545c712d | |||
| 76786203a0 | |||
| bc94eff176 | |||
| 44cd0857e0 | |||
| f8521d644c | |||
| eb2702eb19 | |||
| bfb4903998 | |||
| f3abab7a13 | |||
| 54031e3520 | |||
| 8b9d26a02c | |||
| 3d5277a395 | |||
| 2555157bd7 | |||
| 461eaedecf | |||
| 1891c9e49e | |||
| 829a895464 | |||
| 8bc259b25a | |||
| ec333efe66 | |||
| 3b432e6580 | |||
| 886ec8ab1d | |||
| bc5982b286 | |||
| 75a4a1b3b9 | |||
| f3f0bfcd9a | |||
| c959e0e3a0 | |||
| 8b896912b2 | |||
| 3d0057220d | |||
| 0c75f56cb5 | |||
| 0ceaa75862 | |||
| 087b8d346d | |||
| aca1f5200b | |||
| 3b638f4715 | |||
| 9a5adcbcc5 | |||
| d0be5ea2d1 | |||
| 07e00fff09 | |||
| b4e0ca7eca | |||
| b8173b205b | |||
| 57d623d6bc | |||
| 64ab08973c | |||
| 94a7a38cdd | |||
| 76165e4345 | |||
| 767a1f6af8 | |||
| 20ca024100 | |||
| 3c3857c1b2 | |||
| 523342fed9 | |||
| 217ca58b1a | |||
| ec6565bf71 | |||
| cd7f06f3a1 | |||
| 8886873ed5 | |||
| a41e696b69 | |||
| 4b7cbd88bb | |||
| 789cbbc593 | |||
| 1dd87c0707 | |||
| 330044e10f | |||
| f8c5207d5c | |||
| 2caaa29124 | |||
| cdc4d07394 | |||
| 1023cde1be | |||
| a3aeed4b7c | |||
| 3b0354da54 | |||
| 622ccd22bc | |||
| 1441134aea | |||
| 0500dce7aa | |||
| 9f0dfc4e24 | |||
| aa66dd41c1 | |||
| 69fb5f3cc1 | |||
| d6b2e97777 | |||
| 98c90e6075 | |||
| f795c86a38 | |||
| c1c5774406 | |||
| 0139da4764 | |||
| ec911979fb | |||
| e51749dbc6 | |||
| 9ceb21c04f | |||
| 76a91b4736 | |||
| df744338f1 | |||
| 8803fc3806 | |||
| c26a4774a1 | |||
| 20538af4c6 | |||
| 73f222fcb7 | |||
| 67681e0f37 | |||
| 5210448ac9 | |||
| 983f42814f | |||
| 89302a2ee3 | |||
| 832f77de80 | |||
| 656144d182 | |||
| 4f926ddebf | |||
| 624039e00d | |||
| 430fcbe026 | |||
| 8e25d388fa | |||
| 3c7df0e989 | |||
| 4d0a5ca5bd | |||
| 06e9a10c98 | |||
| 836debdc0b | |||
| 1e8829ba22 | |||
| 2b1311042f | |||
| 0d69af667d | |||
| 93fed0b984 | |||
| c8838aa450 | |||
| 896a61ed0d | |||
| c7a7e604f1 |
@@ -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
@@ -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 }
|
||||||
Executable
+92
@@ -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
@@ -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/
|
||||||
-399
@@ -1,399 +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;
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
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.01 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.
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.2 KiB |
+234
@@ -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
@@ -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.
|
|
||||||
@@ -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))"
|
||||||
@@ -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.
|
El joc permet l'ús del teclat per a controlar la nau i la finestra. Les tecles són les següents:
|
||||||
|
|
||||||
## Com jugar hui en dia
|
| 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 |
|
||||||
|
|
||||||
Amb DosBox. Augmenta cicles, uns 30000 en el meu macbook.
|
---
|
||||||
|
|
||||||
## Com compilar hui en dia
|
## Compilació i execució
|
||||||
|
|
||||||
Turbo Pascal 7 desde DosBox. No m'ha fet falta activar res.
|
### 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.
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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)
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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.
@@ -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 |
@@ -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>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
Versions/Current/Headers
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user