24 Commits

Author SHA1 Message Date
0a5a79dc60 - [FIX] Guarda per a quan falla un arxiu en JFile 2024-10-10 13:48:24 +02:00
baae73a38d - [FIX] Un café feia impossible passar per una habitació
- [FIX] No s'activaba el prólogo quan toca
- [FIX] El gràfic de les portes de vegades era transparent
- [FIX] Separades unes caixes que feien molt frustrant agafar una cosa
- [FIX] Quan tenia el café de doble velocitat no podia creuar portes
- [FIX] Algunes vegades el objecte dropejat encara feia clipping amb altres
- [NEW] Missatges en els moments importants
- [NEW] Quan te pases el joc també te dona els 'stats' de temps, vides i habitacions visitades.
2024-10-10 12:58:22 +02:00
ec7ac7114e - [FIX] No es podia entrar al editor de bitmap_pos des de l'editor
- [FIX] Recreativa afegida
- [NEW] Prologo acabat
- [FIX] Quan s'acava el boost de invulnerabilitat se moria
2024-10-10 09:33:56 +02:00
cabbb52cbb - [FIX] Solventats els problemes de memòria al eliminar un actor 2024-10-09 12:03:16 +02:00
ac4e1f3298 Merge branch 'master' of https://gitea.sustancia.synology.me/JailDoctor/thepool 2024-10-09 10:10:23 +02:00
b292ae710a - [FIX] La porta de l'habitacio de les sabates, que vaig pujar en la party pero se m'havia oblidat fer-ho en el repo
- [FIX] Solució a un dangling pointer que me va trobar valgrind
- [COMMIT ABANS DEL MEGACANVI]
2024-10-09 10:10:21 +02:00
9827865e9c - Prologo quasi acabat 2024-10-08 13:59:04 +02:00
119136332b - [FIX] Si està escribint un text, que no pille la D o la M com a "duplicar" o "moure" el actor seleccionat 2024-10-08 08:08:17 +02:00
77cdf90c99 - Treballant en el prólogo 2024-10-07 20:07:03 +02:00
304f636a95 - [CHG] Pujat el maxim d'habitacions per al prologo 2024-10-07 13:56:09 +02:00
fa97ea79e8 - [NEW] Anbernics en el lloc i ja se poden recollir
- [CHG] Canviats uns pixels en les portes
- [NEW] Sequencia de final de joc acabada
- [NEW] Al pillar un booster fa sorollet
- Treballant en el prólogo
2024-10-07 13:35:01 +02:00
f38d50e7f9 - [FIX] Llevat el SDL2_mixer del Makefile 2024-10-06 19:27:46 +02:00
0ccd8a570a - [NEW] Sempre es pot navegar pels menus amb cursors, RETURN i ESCAPE
- [NEW] El gamepad es configura amb la info del gamescontrollerdb.txt per defecte
- [NEW] El botó de START en el gamepad funciona com el ESCAPE del teclat
- [FIX] La música ingame continuava estant mal
- [FIX] Si la música està desactivada que no sone la del logo
2024-10-06 19:23:06 +02:00
52d3916f8c - [FIX] La pilota de l'habitació 02 ja no te una ralla de pixels
- [FIX] Al pegar botonà en el logo el fondo se quedava de algún color durant la intro.
- [FIX] Al morir el malo que t'ha matat ja no es queda tot loco
- [FIX] Retocades un poc algunes portes on s'ha pogut
2024-10-06 17:36:51 +02:00
394773003a - [FIX] La música ja sona be en un auricularet
- [CHG] El joc ja no usa SDL_Mixer, sinó JailAudio
- [FIX] La música de game over ja no fa bucle
- [FIX] Tanquem les coses abans d'eixir pa que Valgrind no s'enfade
2024-10-06 15:03:46 +02:00
da3cb5ff8e - [FIX] Els actors que canvien de direcció aleatòriament no han de fer roido de tropeçar si han canviat de direcció perque sí i no han tropeçat 2024-10-04 20:46:20 +02:00
d17ac3a2ed - [NEW] Intro acabada 2024-10-04 17:53:27 +02:00
f84eb3e238 - [NEW] Afegit xicotet detall al logo
- [NEW] Sequencia de introducció (ongoing)
2024-10-04 14:00:27 +02:00
c3d1b672c2 - [NEW] Músiques definitives
- [FIX] Si ja està sonant el só de push, que no sonen més. Sinó s'acumulen i atronen
2024-10-04 08:10:58 +02:00
3919281080 - [NEW] Só del logo
- [NEW] Só de quan mor
- [NEW] Só de quan agafa trastos
- [NEW] Só de quan desapareix un bloc
- [FIX] Ruido en una habitació
2024-10-03 17:40:14 +02:00
1251ef5110 - [NEW] Nova debug info: flags
- [NEW] Só de caminar i botar funcionant
- [NEW] Só de enemics rebotant
- [NEW] Menus amb só (MOC MOC!)
- [FIX] El so de caminar ja no continua durant el menu ingame
2024-10-03 16:27:43 +02:00
9ca1e59f44 - Arreglats un milló de warnings tontos (i alguno serio) 2024-10-03 13:40:54 +02:00
b44ba3517a Merge branch 'master' of https://gitea.sustancia.synology.me/JailDoctor/thepool 2024-10-03 13:16:04 +02:00
e009aef341 - [CHG] Retocat el mòdul JAudio per a adaptar-se a les necesitats del joc.
- [NEW] audio::getCurrentMusic()
- [NEW] audio::stopAllChannels()
- [FIX] El JAudio i JInput han de inicialitzarse abans de entrar al Init del joc
- Afegides músiques i alguns sons
- Comence a fer que sone cada musica i so en el seu lloc
- [TOFIX] LAG EN EL AUDIO!
2024-10-03 13:09:44 +02:00
114 changed files with 13638 additions and 369 deletions

5
.gitignore vendored
View File

@@ -4,4 +4,7 @@
*.dSYM/* *.dSYM/*
build/* build/*
thepool thepool
thepool_debug thepool_debug
valgrind*
release/*
data.jf2

View File

@@ -3,25 +3,25 @@ source = source/*.cpp
windows: windows:
@echo off @echo off
g++ $(source) icon.res -lmingw32 -lSDL2main -lSDL2 -lSDL2_mixer -mwindows -o "$(executable).exe" g++ $(source) icon.res -lmingw32 -lSDL2main -lSDL2 -mwindows -o "$(executable).exe"
strip -s -R .comment -R .gnu.version --strip-unneeded "$(executable).exe" strip -s -R .comment -R .gnu.version --strip-unneeded "$(executable).exe"
windows_debug: windows_debug:
@echo off @echo off
g++ $(source) -D DEBUG -g -Wall -fvar-tracking -lmingw32 -lSDL2main -lSDL2 -lSDL2_mixer -o "$(executable)_debug.exe" g++ $(source) -D DEBUG -g -Wall -fvar-tracking -lmingw32 -lSDL2main -lSDL2 -o "$(executable)_debug.exe"
macos: macos:
clang++ $(source) -Wall -Os -std=c++11 -ffunction-sections -fdata-sections -lSDL2 -lSDL2_mixer -o "$(executable)" clang++ $(source) -Wall -Os -std=c++11 -ffunction-sections -fdata-sections -lSDL2 -o "$(executable)"
macos_debug: macos_debug:
clang++ $(source) -D DEBUG -g -Wall -std=c++11 -lSDL2 -lSDL2_mixer -o "$(executable)_debug" clang++ $(source) -D DEBUG -g -Wall -std=c++11 -lSDL2 -o "$(executable)_debug"
macos_bundle: macos_bundle:
clang++ $(source) -D MACOS_BUNDLE -Wall -Os -std=c++11 -framework SDL2 -framework SDL2_mixer -F /Library/Frameworks -ffunction-sections -fdata-sections -o mini_bundle -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12 clang++ $(source) -D MACOS_BUNDLE -Wall -Os -std=c++11 -framework SDL2 -F /Library/Frameworks -ffunction-sections -fdata-sections -o mini_bundle -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12
linux: linux:
g++ $(source) -Wall -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -lSDL2 -lSDL2_mixer -o "$(executable)" g++ $(source) -Wall -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -lSDL2 -o "$(executable)"
strip -s -R .comment -R .gnu.version --strip-unneeded "$(executable)" strip -s -R .comment -R .gnu.version --strip-unneeded "$(executable)"
linux_debug: linux_debug:
g++ $(source) -D DEBUG -g -lSDL2 -lSDL2_mixer -o "$(executable)_debug" g++ $(source) -D DEBUG -g -lSDL2 -o "$(executable)_debug"

BIN
data/25anys.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
data/end1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
data/end2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

2078
data/gamecontrollerdb.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,19 +1,31 @@
25anys.gif
abad.gif abad.gif
altres.gif altres.gif
batman.gif batman.gif
caixes.gif caixes.gif
doors.gif doors.gif
end1.gif
end2.gif
floor.gif floor.gif
font.gif font.gif
font2.gif font2.gif
gat.gif gat.gif
gat2.gif gat2.gif
intro1.gif
intro2.gif
intro3.gif
intro4.gif
intro5.gif
jailgames.gif jailgames.gif
lordabad.gif lordabad.gif
mapa.gif mapa.gif
objectes.gif objectes.gif
obrer.gif obrer.gif
piscina.gif piscina.gif
prologo1.gif
prologo2.gif
prologo3.gif
prologo4.gif
roomaux.gif roomaux.gif
sam.gif sam.gif
test.gif test.gif

View File

@@ -9,4 +9,5 @@ objectes.gif
obrer.gif obrer.gif
piscina.gif piscina.gif
sam.gif sam.gif
test.gif
doors.gif doors.gif

BIN
data/intro1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
data/intro2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
data/intro3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
data/intro4.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
data/intro5.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
data/mus_gameover.ogg Normal file

Binary file not shown.

BIN
data/mus_ingame.ogg Normal file

Binary file not shown.

BIN
data/mus_menu.ogg Normal file

Binary file not shown.

BIN
data/prologo1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
data/prologo2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
data/prologo3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
data/prologo4.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -129,7 +129,7 @@ actor{
actor{ actor{
name: PILOTA name: PILOTA
bmp: altres.gif bmp: altres.gif
bmp-rect: 0 108 22 22 bmp-rect: 0 108 21 21
bmp-offset: -5 24 bmp-offset: -5 24
pos: 28 32 0 pos: 28 32 0
size: 8 8 2 size: 8 8 2

View File

@@ -28,13 +28,13 @@ actor{
} }
actor{ actor{
name: ANBERNIC name: ANBERNIC0
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -4 16 bmp-offset: -4 16
pos: 56 16 0 pos: 56 16 0
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW movement: CW
} }

View File

@@ -1,7 +1,7 @@
width: 2 width: 2
height: 3 height: 3
door-height-xn: 3 door-height-xn: 3
door-height-yp: 2 door-height-yp: 3
color: WHITE color: WHITE
floor-texture: 11 floor-texture: 11
wall-texture: 2 wall-texture: 2
@@ -19,7 +19,6 @@ actor{
pos: 8 0 0 pos: 8 0 0
size: 8 8 4 size: 8 8 4
orient: ZP orient: ZP
flags: MOVING
movement: Z movement: Z
} }
@@ -31,7 +30,6 @@ actor{
pos: 8 56 0 pos: 8 56 0
size: 8 8 4 size: 8 8 4
orient: ZP orient: ZP
flags: MOVING
movement: Z movement: Z
} }
@@ -43,7 +41,6 @@ actor{
pos: 40 56 0 pos: 40 56 0
size: 8 8 4 size: 8 8 4
orient: ZP orient: ZP
flags: MOVING
movement: Z movement: Z
} }
@@ -55,7 +52,6 @@ actor{
pos: 24 0 0 pos: 24 0 0
size: 8 8 4 size: 8 8 4
orient: ZP orient: ZP
flags: MOVING
movement: Z movement: Z
} }

View File

@@ -11,13 +11,13 @@ exit-zp: 21
editor-done: 1 editor-done: 1
actor{ actor{
name: ANBERNIC name: ANBERNIC1
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -4 16 bmp-offset: -4 16
pos: 24 40 8 pos: 24 40 8
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW movement: CW
} }

View File

@@ -7,6 +7,7 @@ floor-texture: 10
wall-texture: 1 wall-texture: 1
door-texture: 0 door-texture: 0
under-door-texture: 0 under-door-texture: 0
exit-xp: 86
exit-yp: 50 exit-yp: 50
exit-yn: 24 exit-yn: 24
editor-done: 1 editor-done: 1
@@ -26,13 +27,24 @@ actor{
} }
actor{ actor{
name: ANBERNIC name: ANBERNIC2
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -6 10 bmp-offset: -6 10
pos: 40 8 6 pos: 40 8 6
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW
}
actor{
name: ARCADE
bmp: altres.gif
bmp-rect: 160 0 30 48
bmp-offset: 0 49
pos: 56 8 0
size: 8 8 16
orient: YP
movement: CW movement: CW
} }
@@ -66,7 +78,7 @@ actor{
bmp: altres.gif bmp: altres.gif
bmp-rect: 128 0 20 41 bmp-rect: 128 0 20 41
bmp-offset: -6 45 bmp-offset: -6 45
pos: 56 8 0 pos: 16 8 0
size: 6 6 16 size: 6 6 16
movement: CW movement: CW
} }

View File

@@ -11,6 +11,19 @@ exit-xp: 17
exit-xn: 28 exit-xn: 28
editor-done: 1 editor-done: 1
actor{
name: B-03-GOD
bmp: objectes.gif
bmp-rect: 114 78 15 18
bmp-offset: -8 22
pos: 48 -3 16
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: ANIMATED SPECIAL
movement: CW
}
actor{ actor{
name: BOX-B name: BOX-B
bmp: caixes.gif bmp: caixes.gif

View File

@@ -13,6 +13,17 @@ exit-yp: 35
exit-yn: 29 exit-yn: 29
editor-done: 1 editor-done: 1
actor{
name: ANBERNIC3
bmp: altres.gif
bmp-rect: 157 80 24 14
bmp-offset: -4 16
pos: 0 8 0
size: 6 4 2
flags: SPECIAL
movement: CW
}
actor{ actor{
name: BLOCMATA-00 name: BLOCMATA-00
bmp: altres.gif bmp: altres.gif

View File

@@ -14,13 +14,13 @@ exit-yn: 32
editor-done: 1 editor-done: 1
actor{ actor{
name: ANBERNIC name: ANBERNIC4
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -4 16 bmp-offset: -4 16
pos: 24 32 0 pos: 24 32 0
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW movement: CW
} }

View File

@@ -12,13 +12,13 @@ exit-yn: 33
editor-done: 1 editor-done: 1
actor{ actor{
name: ANBERNIC name: ANBERNIC5
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -4 16 bmp-offset: -4 16
pos: 40 16 0 pos: 40 16 0
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW movement: CW
} }

View File

@@ -12,13 +12,13 @@ exit-yp: 37
editor-done: 1 editor-done: 1
actor{ actor{
name: ANBERNIC name: ANBERNIC6
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -4 16 bmp-offset: -4 16
pos: 0 8 0 pos: 0 8 0
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW movement: CW
} }
@@ -47,7 +47,7 @@ actor{
bmp: doors.gif bmp: doors.gif
bmp-rect: 160 7 16 40 bmp-rect: 160 7 16 40
bmp-offset: -8 47 bmp-offset: -8 47
pos: 8 16 0 pos: 10 18 0
size: 6 6 14 size: 6 6 14
movement: CW movement: CW
} }

View File

@@ -10,21 +10,6 @@ exit-yn: 42
exit-zn: 47 exit-zn: 47
editor-done: 1 editor-done: 1
actor{
name: ABAD
bmp: lordabad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 2 28 20
size: 8 8 8
orient: XP
anim-cycle: MIN
anim-wait: 1
flags: ANIMATED ORIENTABLE
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{ actor{
name: LIFT-00 name: LIFT-00
bmp: caixes.gif bmp: caixes.gif
@@ -47,6 +32,21 @@ actor{
movement: Z movement: Z
} }
actor{
name: LORD-ABAD
bmp: lordabad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 2 28 20
size: 8 8 8
orient: XP
anim-cycle: MIN
anim-wait: 1
flags: ANIMATED ORIENTABLE
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{ actor{
name: PLATH-00 name: PLATH-00
bmp: caixes.gif bmp: caixes.gif

View File

@@ -14,7 +14,7 @@ actor{
name: BOX-A name: BOX-A
bmp: sam.gif bmp: sam.gif
bmp-rect: 0 0 19 33 bmp-rect: 0 0 19 33
bmp-offset: -7 37 bmp-offset: -10 38
pos: 27 0 19 pos: 27 0 19
size: 8 8 8 size: 8 8 8
anim-cycle: DUO anim-cycle: DUO
@@ -37,8 +37,8 @@ actor{
actor{ actor{
name: PLATH-00 name: PLATH-00
bmp: caixes.gif bmp: caixes.gif
bmp-rect: 128 128 32 32 bmp-rect: 32 32 32 32
bmp-offset: 0 32 bmp-offset: 0 24
pos: 24 0 15 pos: 24 0 15
size: 8 8 4 size: 8 8 4
orient: ZP orient: ZP
@@ -59,8 +59,8 @@ actor{
actor{ actor{
name: PLATH-01 name: PLATH-01
bmp: caixes.gif bmp: caixes.gif
bmp-rect: 128 128 32 32 bmp-rect: 32 32 32 32
bmp-offset: 0 32 bmp-offset: 0 24
pos: 32 0 15 pos: 32 0 15
size: 8 8 4 size: 8 8 4
orient: ZP orient: ZP

View File

@@ -10,6 +10,29 @@ exit-yp: 52
exit-zp: 47 exit-zp: 47
editor-done: 1 editor-done: 1
actor{
name: ANBERNIC7
bmp: altres.gif
bmp-rect: 157 80 24 14
bmp-offset: -4 16
pos: 8 40 0
size: 6 4 2
flags: SPECIAL
movement: CW
}
actor{
name: ARCADE
bmp: altres.gif
bmp-rect: 160 0 30 48
bmp-offset: 0 49
pos: 8 24 0
size: 8 8 16
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{ actor{
name: CADIRA name: CADIRA
bmp: caixes.gif bmp: caixes.gif

View File

@@ -27,6 +27,19 @@ actor{
movement: CW movement: CW
} }
actor{
name: B-02-RUN
bmp: objectes.gif
bmp-rect: 114 78 15 18
bmp-offset: -8 22
pos: 8 8 0
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: ANIMATED SPECIAL
movement: CW
}
actor{ actor{
name: BATMAN name: BATMAN
bmp: batman.gif bmp: batman.gif

View File

@@ -10,13 +10,13 @@ exit-yn: 59
editor-done: 1 editor-done: 1
actor{ actor{
name: ANBERNIC name: ANBERNIC8
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -4 16 bmp-offset: -4 16
pos: 48 40 0 pos: 48 40 0
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW movement: CW
} }

View File

@@ -10,13 +10,13 @@ exit-xp: 59
editor-done: 1 editor-done: 1
actor{ actor{
name: ANBERNIC name: ANBERNIC9
bmp: altres.gif bmp: altres.gif
bmp-rect: 157 80 24 14 bmp-rect: 157 80 24 14
bmp-offset: -4 16 bmp-offset: -4 16
pos: 0 40 0 pos: 0 40 0
size: 6 4 2 size: 6 4 2
flags: PUSHABLE GRAVITY flags: SPECIAL
movement: CW movement: CW
} }
@@ -25,7 +25,7 @@ actor{
bmp: altres.gif bmp: altres.gif
bmp-rect: 0 133 32 27 bmp-rect: 0 133 32 27
bmp-offset: 0 27 bmp-offset: 0 27
pos: 0 48 0 pos: 0 51 0
size: 8 8 6 size: 8 8 6
flags: REACTIVE DEADLY flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN react-mask: XP XN YP YN ZP ZN

228
data/rooms/64.txt Normal file
View File

@@ -0,0 +1,228 @@
width: 3
height: 1
door-height-xp: 0
color: CYAN
floor-texture: 0
wall-texture: 2
door-texture: 0
under-door-texture: 0
exit-xp: 65
editor-done: 1
actor{
name: BOX-01
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 46 40 0
size: 8 8 8
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-02
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 56 40 0
size: 8 8 8
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-03
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 52 40 8
size: 8 8 8
orient: YP
flags: PUSHABLE ORIENTABLE
movement: CW
}
actor{
name: FINESTRA-01
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: -1 30 6
size: 1 1 9
movement: CW
}
actor{
name: FINESTRA-02
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: -1 23 6
size: 1 1 9
movement: CW
}
actor{
name: JAILDES
bmp: test.gif
bmp-rect: 0 32 20 32
bmp-offset: -6 38
pos: 0 32 0
size: 8 8 8
orient: XN
anim-wait: 1
flags: REACTIVE ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: KALLAX-01
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: -8 31
pos: 32 16 0
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-02
bmp: altres.gif
bmp-rect: 24 48 24 27
bmp-offset: -8 31
pos: 32 16 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-03
bmp: altres.gif
bmp-rect: 48 48 24 27
bmp-offset: -8 31
pos: 40 16 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-04
bmp: altres.gif
bmp-rect: 72 48 24 27
bmp-offset: -8 31
pos: 40 16 0
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: LAMPARA
bmp: altres.gif
bmp-rect: 128 0 20 41
bmp-offset: -6 45
pos: 1 41 0
size: 6 6 16
movement: CW
}
actor{
name: LLIT
bmp: altres.gif
bmp-rect: 48 0 57 47
bmp-offset: 11 32
pos: 8 16 0
size: 16 16 4
movement: CW
}
actor{
name: MANCUERNA
bmp: altres.gif
bmp-rect: 106 33 17 14
bmp-offset: -6 20
pos: 24 25 0
size: 6 4 2
movement: CW
}
actor{
name: MESITA-01
bmp: caixes.gif
bmp-rect: 0 64 32 32
bmp-offset: 0 32
pos: 0 16 0
size: 8 8 4
movement: CW
}
actor{
name: MESITA-02
bmp: caixes.gif
bmp-rect: 0 64 32 32
bmp-offset: 0 32
pos: 24 16 0
size: 8 8 4
movement: CW
}
actor{
name: X-0
bmp: objectes.gif
bmp-rect: 162 0 28 22
bmp-offset: -3 24
pos: 8 32 0
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
actor{
name: X-1
bmp: objectes.gif
bmp-rect: 167 22 18 23
bmp-offset: -7 27
pos: 16 24 4
size: 4 4 6
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
actor{
name: X-2
bmp: objectes.gif
bmp-rect: 165 45 21 22
bmp-offset: -2 26
pos: 24 14 4
size: 4 4 5
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
actor{
name: X-3
bmp: objectes.gif
bmp-rect: 145 41 20 25
bmp-offset: -5 27
pos: 34 13 16
size: 6 4 6
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}

38
data/rooms/65.txt Normal file
View File

@@ -0,0 +1,38 @@
width: 3
height: 0
door-height-xp: 0
door-height-xn: 0
door-height-yp: 0
color: WHITE
floor-texture: 0
wall-texture: 2
door-texture: 0
under-door-texture: 0
exit-xp: 66
exit-xn: 64
exit-yp: 70
editor-done: 1
actor{
name: CUADRO-01
bmp: altres.gif
bmp-rect: 102 75 18 32
bmp-offset: 0 39
pos: 18 23 6
size: 1 1 9
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: CUADRO-02
bmp: altres.gif
bmp-rect: 66 75 18 32
bmp-offset: 0 39
pos: 42 23 6
size: 1 1 9
orient: YP
flags: ORIENTABLE
movement: CW
}

152
data/rooms/66.txt Normal file
View File

@@ -0,0 +1,152 @@
width: 3
height: 2
door-height-xn: 0
door-height-yn: 0
color: GREEN
floor-texture: 0
wall-texture: 2
door-texture: 0
under-door-texture: 0
exit-xn: 65
exit-yn: 67
editor-done: 1
actor{
name: ARMARI-A1
bmp: caixes.gif
bmp-rect: 64 32 24 32
bmp-offset: -8 36
pos: 16 8 0
size: 8 4 8
movement: CW
}
actor{
name: ARMARI-A2
bmp: caixes.gif
bmp-rect: 96 32 24 32
bmp-offset: -8 36
pos: 16 8 8
size: 8 4 8
movement: CW
}
actor{
name: ARMARI-B1
bmp: caixes.gif
bmp-rect: 64 32 24 32
bmp-offset: -8 36
pos: 4 8 0
size: 8 4 8
movement: CW
}
actor{
name: ARMARI-B2
bmp: caixes.gif
bmp-rect: 96 32 24 32
bmp-offset: -8 36
pos: 4 8 8
size: 8 4 8
movement: CW
}
actor{
name: BOX-01
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 14 24 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-02
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 13 16 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: KALLAX-01
bmp: altres.gif
bmp-rect: 48 48 24 27
bmp-offset: 0 31
pos: 0 12 0
size: 4 8 8
movement: CW
}
actor{
name: KALLAX-02
bmp: altres.gif
bmp-rect: 72 48 24 27
bmp-offset: 0 31
pos: 0 12 8
size: 4 12 8
movement: CW
}
actor{
name: LLIT
bmp: altres.gif
bmp-rect: 48 0 57 47
bmp-offset: 11 32
pos: 40 8 0
size: 16 16 8
movement: CW
}
actor{
name: MESITA
bmp: caixes.gif
bmp-rect: 0 64 32 32
bmp-offset: 0 32
pos: 56 8 0
size: 8 8 4
movement: CW
}
actor{
name: PILOTA
bmp: altres.gif
bmp-rect: 0 108 21 21
bmp-offset: -5 24
pos: 28 32 0
size: 8 8 2
orient: XN
flags: PUSHABLE INERTIA
movement: CCW
}
actor{
name: ROOMBA-01
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 8 32 0
size: 8 8 2
orient: YP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: ROOMBA-02
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 56 24 0
size: 8 8 2
orient: YP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CCW
}

144
data/rooms/67.txt Normal file
View File

@@ -0,0 +1,144 @@
width: 2
height: 2
door-height-xn: 0
door-height-yp: 0
color: CYAN
floor-texture: 4
wall-texture: 0
door-texture: 0
under-door-texture: 0
exit-xn: 68
exit-yp: 66
editor-done: 1
actor{
name: ABAD
bmp: abad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 40 48 0
size: 8 8 8
orient: XP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: X
}
actor{
name: ARMARI-01
bmp: caixes.gif
bmp-rect: 64 32 32 32
bmp-offset: 8 36
pos: 8 40 0
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: ARMARI-02
bmp: caixes.gif
bmp-rect: 96 32 32 32
bmp-offset: 8 36
pos: 8 40 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: BATMAN
bmp: batman.gif
bmp-rect: 0 0 21 32
bmp-offset: -5 35
pos: 8 8 0
size: 8 8 8
orient: YP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}
actor{
name: BOX-01
bmp: test.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 24 32 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-02
bmp: test.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 19 40 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: ESPILL
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: -10 38
pos: 24 7 8
size: 1 1 9
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-01
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: -8 31
pos: 13 8 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-02
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: -8 31
pos: 48 8 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: PILA
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 24 8 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: WC
bmp: altres.gif
bmp-rect: 105 0 21 33
bmp-offset: -4 36
pos: 40 8 0
size: 8 8 6
movement: CW
}

109
data/rooms/68.txt Normal file
View File

@@ -0,0 +1,109 @@
width: 3
height: 1
door-height-xp: 0
door-height-xn: 0
color: WHITE
floor-texture: 1
wall-texture: 6
door-texture: 6
under-door-texture: 6
exit-xp: 67
exit-xn: 69
editor-done: 1
actor{
name: BOX-00
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 56 16 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-01
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 0 16 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: KALLAX-01
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: -8 31
pos: 8 16 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-02
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: -8 31
pos: 24 16 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-03
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: -8 31
pos: 40 16 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: ROOMBA-01
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 8 16 0
size: 8 8 2
orient: YP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}
actor{
name: ROOMBA-02
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 24 24 0
size: 8 8 2
orient: YP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}
actor{
name: ROOMBA-03
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 40 32 0
size: 8 8 2
orient: YP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}

236
data/rooms/69.txt Normal file
View File

@@ -0,0 +1,236 @@
width: 2
height: 2
door-height-xp: 0
color: YELLOW
floor-texture: 4
wall-texture: 0
door-texture: 0
under-door-texture: 0
exit-xp: 68
editor-done: 1
actor{
name: ABAD
bmp: abad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 32 48 2
size: 8 8 8
orient: YP
anim-wait: 1
flags: PUSHABLE REACTIVE ORIENTABLE DEADLY GRAVITY
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: BATMAN
bmp: batman.gif
bmp-rect: 0 0 21 32
bmp-offset: -5 38
pos: 16 48 2
size: 8 8 8
orient: XP
anim-wait: 1
flags: PUSHABLE REACTIVE ORIENTABLE DEADLY GRAVITY
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: FINESTRA-01
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: 7 19 6
size: 1 1 9
movement: CW
}
actor{
name: FINESTRA-02
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: 7 26 6
size: 1 1 9
movement: CW
}
actor{
name: KALLAX-01
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: 0 31
pos: 8 8 0
size: 4 8 8
movement: CW
}
actor{
name: KALLAX-02
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: 0 31
pos: 8 8 8
size: 4 8 8
movement: CW
}
actor{
name: KALLAX-03
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: 0 31
pos: 8 36 0
size: 4 8 8
movement: CW
}
actor{
name: KALLAX-04
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: 0 31
pos: 8 36 8
size: 4 8 8
movement: CW
}
actor{
name: PILA-01
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 24 16 0
size: 8 8 8
orient: YP
movement: CW
}
actor{
name: PILA-02
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 24 24 0
size: 8 8 8
orient: YP
movement: CW
}
actor{
name: PILA-03
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 24 32 0
size: 8 8 8
orient: YP
movement: CW
}
actor{
name: PILA-04
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 24 40 0
size: 8 8 8
orient: YP
movement: CW
}
actor{
name: PILA-11
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 40 16 0
size: 8 8 8
orient: YP
movement: CW
}
actor{
name: PILA-12
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 40 24 0
size: 8 8 8
movement: CW
}
actor{
name: PILA-13
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 40 32 0
size: 8 8 8
orient: YP
movement: CW
}
actor{
name: PILA-14
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 40 40 0
size: 8 8 8
orient: YP
movement: CW
}
actor{
name: ROOMBA-01
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 16 48 0
size: 8 8 2
orient: XP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: ROOMBA-02
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 32 48 0
size: 8 8 2
orient: YN
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}
actor{
name: WC
bmp: altres.gif
bmp-rect: 105 0 21 33
bmp-offset: -4 36
pos: 8 48 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CCW
}
actor{
name: Y-2
bmp: objectes.gif
bmp-rect: 165 45 21 22
bmp-offset: -2 26
pos: 8 22 0
size: 4 4 5
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}

143
data/rooms/70.txt Normal file
View File

@@ -0,0 +1,143 @@
width: 2
height: 2
door-height-xp: 0
door-height-yn: 0
color: PURPLE
floor-texture: 3
wall-texture: 2
door-texture: 0
under-door-texture: 2
exit-xp: 71
exit-yn: 65
editor-done: 1
actor{
name: BOX-01
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 16 16 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-02
bmp: caixes.gif
bmp-rect: 64 0 32 32
bmp-offset: 0 32
pos: 28 16 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-03
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 40 16 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-04
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 16 24 0
size: 8 8 8
orient: YP
flags: PICKABLE PUSHABLE ORIENTABLE GRAVITY
movement: CCW
}
actor{
name: BOX-05
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 16 32 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-06
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 16 40 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-07
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 40 40 0
size: 8 8 8
orient: YP
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: ROOMBA-01
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 40 48 0
size: 8 8 2
orient: XP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: ROOMBA-02
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 48 16 0
size: 8 8 2
orient: YN
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: ROOMBA-03
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 16 8 0
size: 8 8 2
orient: XN
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: ROOMBA-04
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 8 40 0
size: 8 8 2
orient: YP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}

147
data/rooms/71.txt Normal file
View File

@@ -0,0 +1,147 @@
width: 2
height: 2
door-height-xn: 0
door-height-yp: 0
color: YELLOW
floor-texture: 3
wall-texture: 0
door-texture: 0
under-door-texture: 2
exit-xn: 70
exit-yp: 72
editor-done: 1
actor{
name: GAT-BATMAN
bmp: test.gif
bmp-rect: 0 32 20 32
bmp-offset: -4 32
pos: 40 16 0
size: 8 8 8
orient: XP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: HUNT
}
actor{
name: MESITA
bmp: caixes.gif
bmp-rect: 0 64 32 32
bmp-offset: 0 32
pos: 28 28 0
size: 8 8 4
flags: PUSHABLE
movement: CW
}
actor{
name: PILAR-01
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 8 8 0
size: 8 8 8
movement: CW
}
actor{
name: PILAR-02
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 8 8 8
size: 8 8 8
movement: CW
}
actor{
name: PILAR-03
bmp: caixes.gif
bmp-rect: 96 128 32 32
bmp-offset: 0 32
pos: 8 8 16
size: 8 8 4
movement: CW
}
actor{
name: PILAR-11
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 48 8 0
size: 8 8 8
movement: CW
}
actor{
name: PILAR-12
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 48 8 8
size: 8 8 8
movement: CW
}
actor{
name: PILAR-13
bmp: caixes.gif
bmp-rect: 96 128 32 32
bmp-offset: 0 32
pos: 48 8 16
size: 8 8 4
movement: CW
}
actor{
name: PILAR-21
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 48 48 0
size: 8 8 8
movement: CW
}
actor{
name: PILAR-22
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 48 48 8
size: 8 8 8
movement: CW
}
actor{
name: PILAR-31
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 8 48 0
size: 8 8 8
movement: CW
}
actor{
name: PILAR-32
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 8 48 8
size: 8 8 8
movement: CW
}
actor{
name: PILAR-33
bmp: caixes.gif
bmp-rect: 96 128 32 32
bmp-offset: 0 32
pos: 8 48 16
size: 8 8 4
movement: CW
}

112
data/rooms/72.txt Normal file
View File

@@ -0,0 +1,112 @@
width: 0
height: 3
door-height-yp: 0
door-height-yn: 5
color: CYAN
floor-texture: 0
wall-texture: 0
door-texture: 0
under-door-texture: 0
exit-yp: 73
exit-yn: 71
editor-done: 1
actor{
name: ESCALO-001
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 24 0 8
size: 8 8 8
movement: CW
}
actor{
name: ESCALO-011
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 24 8 8
size: 8 8 4
movement: CW
}
actor{
name: ESCALO-020
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 24 16 0
size: 8 8 8
movement: CW
}
actor{
name: ESCALO-030
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 24 24 0
size: 8 8 4
movement: CW
}
actor{
name: ESCALO-100
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 32 0 0
size: 8 8 8
movement: CW
}
actor{
name: ESCALO-101
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 32 0 8
size: 8 8 8
movement: CW
}
actor{
name: ESCALO-110
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 32 8 0
size: 8 8 8
movement: CW
}
actor{
name: ESCALO-111
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 32 8 8
size: 8 8 4
movement: CW
}
actor{
name: ESCALO-120
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 32 16 0
size: 8 8 8
movement: CW
}
actor{
name: ESCALO-130
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 32 24 0
size: 8 8 4
movement: CW
}

187
data/rooms/73.txt Normal file
View File

@@ -0,0 +1,187 @@
width: 2
height: 2
door-height-xp: 0
door-height-xn: 0
door-height-yp: 0
door-height-yn: 0
color: PURPLE
floor-texture: 3
wall-texture: 9
door-texture: 3
under-door-texture: 9
exit-xp: 76
exit-xn: 74
exit-yp: 80
exit-yn: 72
editor-done: 1
actor{
name: BUBBLE-00
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 32 24 28
size: 8 8 8
orient: ZP
flags: PUSHABLE REACTIVE MOVING DEADLY INERTIA
react-mask: XP XN YP YN ZP ZN
movement: Z
}
actor{
name: BUBBLE-01
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 24 32 9
size: 8 8 8
orient: ZN
flags: PUSHABLE REACTIVE MOVING DEADLY INERTIA
react-mask: XP XN YP YN ZP ZN
movement: Z
}
actor{
name: BUBBLE-02
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 32 32 21
size: 8 8 8
orient: ZN
flags: PUSHABLE REACTIVE MOVING DEADLY INERTIA
react-mask: XP XN YP YN ZP ZN
movement: Z
}
actor{
name: BUBBLE-03
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 24 24 15
size: 8 8 8
orient: ZP
flags: PUSHABLE REACTIVE MOVING DEADLY INERTIA
react-mask: XP XN YP YN ZP ZN
movement: Z
}
actor{
name: CADIRA-00
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -7 38
pos: 18 8 0
size: 6 5 4
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: CADIRA-01
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -7 38
pos: 8 19 0
size: 6 5 4
orient: YP
movement: CW
}
actor{
name: CADIRA-02
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -7 38
pos: 8 41 0
size: 6 5 4
orient: YP
movement: CW
}
actor{
name: CADIRA-03
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -7 38
pos: 8 49 0
size: 6 5 4
orient: YP
movement: CW
}
actor{
name: CADIRA-04
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -7 38
pos: 49 8 0
size: 6 5 4
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: CADIRA-05
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -7 38
pos: 41 8 0
size: 6 5 4
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: MESITA
bmp: caixes.gif
bmp-rect: 0 64 32 32
bmp-offset: 0 32
pos: 8 8 0
size: 8 8 4
movement: CW
}
actor{
name: TRANSPA-00
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 24 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-01
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 32 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-02
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 32 32 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-03
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 24 32 0
size: 8 8 6
movement: CW
}

190
data/rooms/74.txt Normal file
View File

@@ -0,0 +1,190 @@
width: 2
height: 3
door-height-xp: 0
door-height-yn: 0
color: WHITE
floor-texture: 4
wall-texture: 7
door-texture: 2
under-door-texture: 0
exit-xp: 73
exit-yn: 75
editor-done: 1
actor{
name: BANCADA-01
bmp: caixes.gif
bmp-rect: 96 96 32 32
bmp-offset: 0 32
pos: 8 0 0
size: 8 8 8
movement: CW
}
actor{
name: BANCADA-02
bmp: caixes.gif
bmp-rect: 96 96 32 32
bmp-offset: 0 32
pos: 8 16 0
size: 8 8 8
movement: CW
}
actor{
name: BANCADA-03
bmp: caixes.gif
bmp-rect: 96 96 32 32
bmp-offset: 0 32
pos: 8 32 0
size: 8 8 8
movement: CW
}
actor{
name: CADIRA-01
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -8 40
pos: 8 51 0
size: 5 4 4
orient: YP
movement: CW
}
actor{
name: CADIRA-02
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -8 40
pos: 8 59 0
size: 5 4 4
orient: YP
movement: CW
}
actor{
name: CADIRA-03
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -8 40
pos: 31 44 0
size: 5 4 4
orient: YP
flags: PUSHABLE ORIENTABLE
movement: CW
}
actor{
name: FINESTRA-01
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: 8 33 9
size: 1 1 9
movement: CW
}
actor{
name: FINESTRA-02
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: 8 41 9
size: 1 1 9
movement: CW
}
actor{
name: FORN
bmp: caixes.gif
bmp-rect: 128 96 32 32
bmp-offset: 0 32
pos: 8 24 0
size: 8 8 8
movement: CW
}
actor{
name: NEVERA-01
bmp: caixes.gif
bmp-rect: 0 96 32 32
bmp-offset: 2 33
pos: 8 8 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: NEVERA-02
bmp: caixes.gif
bmp-rect: 32 96 32 32
bmp-offset: 2 33
pos: 8 8 8
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: PILA
bmp: caixes.gif
bmp-rect: 160 96 32 32
bmp-offset: 0 32
pos: 8 40 0
size: 8 8 8
movement: CW
}
actor{
name: ROOMBA-00
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 48 0 0
size: 8 8 2
orient: XN
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: RAND
}
actor{
name: ROOMBA-01
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 24 48 0
size: 8 8 2
orient: YP
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: RAND
}
actor{
name: TAULA-01
bmp: caixes.gif
bmp-rect: 160 32 32 32
bmp-offset: 0 32
pos: 28 32 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: TAULA-02
bmp: caixes.gif
bmp-rect: 128 32 32 32
bmp-offset: 0 32
pos: 28 24 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}

318
data/rooms/75.txt Normal file
View File

@@ -0,0 +1,318 @@
width: 3
height: 2
door-height-yp: 0
color: YELLOW
floor-texture: 4
wall-texture: 3
door-texture: 1
under-door-texture: 0
exit-yp: 74
editor-done: 1
actor{
name: ABAD
bmp: abad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 40 32 0
size: 8 8 8
orient: XN
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: X
}
actor{
name: BATMAN
bmp: batman.gif
bmp-rect: 0 0 21 32
bmp-offset: -5 35
pos: 8 16 0
size: 8 8 8
orient: XP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: X
}
actor{
name: FINESTRA-00
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: -1 36 4
size: 1 1 9
movement: CW
}
actor{
name: FINESTRA-01
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: -1 44 4
size: 1 1 9
movement: CW
}
actor{
name: FINESTRA-02
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: 48 2 5
size: 1 1 9
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: FINESTRA-03
bmp: altres.gif
bmp-rect: 0 75 20 33
bmp-offset: 0 39
pos: 40 2 5
size: 1 1 9
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: ROOMBA
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 56 24 0
size: 8 8 2
orient: YN
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}
actor{
name: TRANSPA-00
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 0 8 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-01
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 16 8 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-02
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 24 8 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-03
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 40 8 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-04
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 8 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-05
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-06
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 40 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-07
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 32 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-08
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 24 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-09
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 16 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-10
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 0 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-11
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 8 24 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-12
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 0 8 6
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-13
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 8 40 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-14
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 16 40 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-15
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 0 8 12
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-16
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 32 40 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-17
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 40 40 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-18
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 40 48 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-19
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 0 24 6
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-20
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 0 24 12
size: 8 8 6
movement: CW
}
actor{
name: Y-1
bmp: objectes.gif
bmp-rect: 167 22 18 23
bmp-offset: -7 27
pos: 0 16 0
size: 4 4 6
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}

159
data/rooms/76.txt Normal file
View File

@@ -0,0 +1,159 @@
width: 3
height: 1
door-height-xp: 5
door-height-xn: 5
door-height-yn: 0
color: GREEN
floor-texture: 0
wall-texture: 3
door-texture: 1
under-door-texture: 3
exit-xp: 77
exit-xn: 73
exit-yn: 79
editor-done: 1
actor{
name: ABAD
bmp: abad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 0 40 0
size: 8 8 8
orient: XP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: X
}
actor{
name: BATMAN
bmp: batman.gif
bmp-rect: 0 0 21 32
bmp-offset: -5 35
pos: 56 40 0
size: 8 8 8
orient: XN
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: X
}
actor{
name: BOX-A-00
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 24 16
size: 8 8 4
movement: CW
}
actor{
name: BOX-A-01
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 8 28 16
size: 8 8 4
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-A-02
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 16 28 16
size: 8 8 4
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-A-03
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 24 28 16
size: 8 8 4
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-A-04
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 32 28 16
size: 8 8 4
flags: DISAPPEAR
movement: CW
}
actor{
name: BOX-A-05
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 40 28 16
size: 8 8 4
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-A-06
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 48 28 16
size: 8 8 4
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-A-07
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 56 24 16
size: 8 8 4
movement: CW
}
actor{
name: BOX-A-08
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 32 16
size: 8 8 4
movement: CW
}
actor{
name: BOX-A-09
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 56 32 16
size: 8 8 4
movement: CW
}
actor{
name: PILOTA
bmp: altres.gif
bmp-rect: 0 108 21 21
bmp-offset: -6 26
pos: 40 40 0
size: 8 8 8
flags: PUSHABLE INERTIA
movement: CW
}

244
data/rooms/77.txt Normal file
View File

@@ -0,0 +1,244 @@
width: 2
height: 2
door-height-xn: 1
door-height-yn: 1
color: CYAN
floor-texture: 0
wall-texture: 2
door-texture: 0
under-door-texture: 0
exit-xn: 76
exit-yn: 78
exit-zn: 81
editor-done: 1
actor{
name: LIFT
bmp: altres.gif
bmp-rect: 160 56 32 24
bmp-offset: 0 24
pos: 24 48 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT13
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 8 32 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT14
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 8 40 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT16
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 8 24 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT17
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 8 16 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT18
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 8 8 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT19
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 16 8 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT20
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 24 8 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT21
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 32 8 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT22
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 40 8 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT23
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 48 8 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: LIFT28
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 16 40 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: LIFT29
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 16 32 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: LIFT30
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 16 24 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: LIFT31
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 16 16 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: LIFT32
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 24 16 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: LIFT33
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 32 16 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: LIFT34
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 40 16 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: LIFT35
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 48 16 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: PLATF
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 16 48 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: PLATH
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 8 48 0
size: 8 8 4
orient: ZP
movement: Z
}

415
data/rooms/78.txt Normal file
View File

@@ -0,0 +1,415 @@
width: 2
height: 3
door-height-xn: 3
door-height-yp: 3
color: WHITE
floor-texture: 11
wall-texture: 2
door-texture: 0
under-door-texture: 0
exit-xn: 79
exit-yp: 77
editor-done: 1
actor{
name: BLOCK-00
bmp: caixes.gif
bmp-rect: 0 40 32 24
bmp-offset: 0 24
pos: 8 0 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: BLOCK-01
bmp: caixes.gif
bmp-rect: 0 40 32 24
bmp-offset: 0 24
pos: 8 56 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: BLOCK-02
bmp: caixes.gif
bmp-rect: 0 40 32 24
bmp-offset: 0 24
pos: 40 56 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: BLOCK-03
bmp: caixes.gif
bmp-rect: 0 40 32 24
bmp-offset: 0 24
pos: 24 0 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: CONV-XP-00
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 56 4
size: 8 8 4
orient: XP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: XP
}
actor{
name: CONV-XP-01
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 16 56 4
size: 8 8 4
orient: XP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: XP
}
actor{
name: CONV-XP-02
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 24 56 4
size: 8 8 4
orient: XP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: XP
}
actor{
name: CONV-XP-03
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 32 56 4
size: 8 8 4
orient: XP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: XP
}
actor{
name: CONV-XP-04
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 40 56 4
size: 8 8 4
orient: XP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: XP
}
actor{
name: CONV-XP-05
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 16 0 4
size: 8 8 4
orient: XP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: XP
}
actor{
name: CONV-XP-06
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 24 0 4
size: 8 8 4
orient: XP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: XP
}
actor{
name: CONV-YP-00
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 0 4
size: 8 8 4
orient: YP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: YP
}
actor{
name: CONV-YP-01
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 8 4
size: 8 8 4
orient: YP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: YP
}
actor{
name: CONV-YP-02
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 16 4
size: 8 8 4
orient: YP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: YP
}
actor{
name: CONV-YP-03
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 24 4
size: 8 8 4
orient: YP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: YP
}
actor{
name: CONV-YP-04
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 32 4
size: 8 8 4
orient: YP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: YP
}
actor{
name: CONV-YP-05
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 40 4
size: 8 8 4
orient: YP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: YP
}
actor{
name: CONV-YP-06
bmp: caixes.gif
bmp-rect: 0 128 32 32
bmp-offset: 0 32
pos: 8 48 4
size: 8 8 4
orient: YP
anim-cycle: MIN
flags: REACTIVE ANIMATED ORIENTABLE
react-mask: ZN
react-push: YP
}
actor{
name: OBRER
bmp: obrer.gif
bmp-rect: 0 0 24 32
bmp-offset: -4 37
pos: 48 0 4
size: 8 8 8
orient: YP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}
actor{
name: PLAT-00
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 56 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-01
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 48 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-02
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 40 48 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-03
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 40 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-04
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 32 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-05
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 40 32 0
size: 8 8 4
orient: ZP
flags: DISAPPEAR
movement: Z
}
actor{
name: PLAT-06
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 24 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-07
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 16 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-08
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 40 16 0
size: 8 8 4
orient: ZP
flags: REACTIVE
react-mask: ZN
react-push: XP
movement: Z
}
actor{
name: PLAT-09
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 8 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-10
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 48 0 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLAT-11
bmp: caixes.gif
bmp-rect: 160 136 32 24
bmp-offset: 0 24
pos: 40 0 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: Y-0
bmp: objectes.gif
bmp-rect: 162 0 28 22
bmp-offset: -3 24
pos: 40 0 4
size: 6 6 4
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}

13
data/rooms/79.txt Normal file
View File

@@ -0,0 +1,13 @@
width: 1
height: 3
door-height-xp: 0
door-height-yp: 0
door-height-yn: 3
color: YELLOW
floor-texture: 6
wall-texture: 3
door-texture: 1
under-door-texture: 3
exit-xp: 78
exit-yp: 76
editor-done: 1

32
data/rooms/80.txt Normal file
View File

@@ -0,0 +1,32 @@
width: 0
height: 3
door-height-xn: 1
door-height-yn: 0
color: CYAN
floor-texture: 0
wall-texture: 0
door-texture: 0
under-door-texture: 0
exit-xn: 82
exit-yn: 73
editor-done: 1
actor{
name: FINESTRA-00
bmp: altres.gif
bmp-rect: 48 76 18 32
bmp-offset: 0 39
pos: 23 8 4
size: 1 1 9
movement: CW
}
actor{
name: FINESTRA-01
bmp: altres.gif
bmp-rect: 84 76 18 32
bmp-offset: 0 39
pos: 23 48 4
size: 1 1 9
movement: CW
}

114
data/rooms/81.txt Normal file
View File

@@ -0,0 +1,114 @@
width: 2
height: 2
door-height-xn: 0
door-height-yn: 0
color: PURPLE
floor-texture: 1
wall-texture: 13
door-texture: 7
under-door-texture: 0
exit-zp: 77
editor-done: 1
actor{
name: BOX-A
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 40 48 0
size: 8 8 8
orient: YP
flags: PUSHABLE ORIENTABLE
movement: CW
}
actor{
name: BOX-A-00
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 8 20 0
size: 8 8 8
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-A-01
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 48 8 0
size: 8 8 8
movement: CW
}
actor{
name: BOX-A-02
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 10 8 0
size: 8 8 8
orient: YP
flags: PUSHABLE ORIENTABLE
movement: CW
}
actor{
name: BOX-B-00
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 40 10 0
size: 8 8 8
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-B-01
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 42 48 8
size: 8 8 8
orient: YP
flags: PUSHABLE ORIENTABLE
movement: CW
}
actor{
name: BOX-C-00
bmp: caixes.gif
bmp-rect: 64 0 32 32
bmp-offset: 0 32
pos: 13 32 0
size: 8 8 8
flags: PUSHABLE
movement: CW
}
actor{
name: BOX-C-01
bmp: caixes.gif
bmp-rect: 64 0 32 32
bmp-offset: 0 32
pos: 26 8 0
size: 8 8 8
orient: YP
flags: PUSHABLE ORIENTABLE
movement: CW
}
actor{
name: LIFT
bmp: altres.gif
bmp-rect: 160 56 32 24
bmp-offset: 0 24
pos: 24 48 0
size: 8 8 4
orient: ZP
flags: MOVING
movement: Z
}

222
data/rooms/82.txt Normal file
View File

@@ -0,0 +1,222 @@
width: 2
height: 3
door-height-xp: 0
door-height-xn: 0
color: YELLOW
floor-texture: 10
wall-texture: 9
door-texture: 3
under-door-texture: 9
exit-xp: 80
exit-xn: 83
editor-done: 1
actor{
name: BOX-B
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 48 8 0
size: 8 8 8
flags: PUSHABLE
movement: CW
}
actor{
name: CADIRA
bmp: caixes.gif
bmp-rect: 64 96 20 32
bmp-offset: -7 38
pos: 16 32 0
size: 6 5 8
orient: YP
flags: PUSHABLE
movement: CW
}
actor{
name: CUADRO-00
bmp: altres.gif
bmp-rect: 66 75 18 32
bmp-offset: 0 39
pos: 7 8 6
size: 1 1 9
orient: YP
movement: CW
}
actor{
name: CUADRO-01
bmp: altres.gif
bmp-rect: 102 75 18 32
bmp-offset: 0 39
pos: 7 48 6
size: 1 1 9
orient: YP
movement: CW
}
actor{
name: KALLAX-00
bmp: altres.gif
bmp-rect: 0 48 24 27
bmp-offset: -8 31
pos: 16 0 0
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-01
bmp: altres.gif
bmp-rect: 48 48 24 27
bmp-offset: -8 31
pos: 16 0 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-02
bmp: altres.gif
bmp-rect: 24 48 24 27
bmp-offset: -8 31
pos: 8 0 0
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-02
bmp: altres.gif
bmp-rect: 48 48 24 27
bmp-offset: -8 31
pos: 40 0 0
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-03
bmp: altres.gif
bmp-rect: 24 48 24 27
bmp-offset: -8 31
pos: 48 0 0
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-04
bmp: altres.gif
bmp-rect: 96 48 24 27
bmp-offset: -8 31
pos: 40 0 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-05
bmp: altres.gif
bmp-rect: 72 48 24 27
bmp-offset: -8 31
pos: 48 0 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: KALLAX-06
bmp: altres.gif
bmp-rect: 96 48 24 27
bmp-offset: -8 31
pos: 8 0 8
size: 8 4 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: MESITA
bmp: caixes.gif
bmp-rect: 0 64 32 32
bmp-offset: 0 32
pos: 24 0 0
size: 8 8 4
movement: CW
}
actor{
name: NES
bmp: caixes.gif
bmp-rect: 96 0 32 32
bmp-offset: -2 33
pos: 32 0 0
size: 8 7 6
flags: PUSHABLE
movement: CW
}
actor{
name: ROOMBA
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 8 56 0
size: 8 8 2
orient: XN
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: TAULA-A
bmp: caixes.gif
bmp-rect: 128 32 32 32
bmp-offset: 0 32
pos: 24 24 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: TAULA-B
bmp: caixes.gif
bmp-rect: 160 32 32 32
bmp-offset: 0 32
pos: 24 32 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: TV
bmp: caixes.gif
bmp-rect: 32 64 32 32
bmp-offset: -4 34
pos: 24 0 4
size: 8 6 8
flags: PUSHABLE
movement: CW
}

280
data/rooms/83.txt Normal file
View File

@@ -0,0 +1,280 @@
width: 3
height: 3
door-height-xp: 0
door-height-yn: 0
color: GREEN
floor-texture: 10
wall-texture: 3
door-texture: 1
under-door-texture: 3
exit-xp: 82
exit-yn: 84
editor-done: 1
actor{
name: ABAD
bmp: abad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 32 16 0
size: 8 8 8
orient: XP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: RAND
}
actor{
name: BATMAN
bmp: batman.gif
bmp-rect: 0 0 21 32
bmp-offset: -5 35
pos: 0 24 0
size: 8 8 8
orient: YP
anim-wait: 1
flags: REACTIVE MOVING ANIMATED ORIENTABLE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: RAND
}
actor{
name: BLOCMATA-00
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 48 48 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-01
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 48 40 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-02
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 40 48 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-03
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 48 16 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-04
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 48 8 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-05
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 40 8 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-06
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 16 8 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-07
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 8 8 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-08
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 8 16 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-09
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 8 40 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-10
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 8 48 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-11
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 16 48 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-12
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 24 24 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-13
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 32 24 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-14
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 32 32 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BLOCMATA-15
bmp: altres.gif
bmp-rect: 0 133 32 27
bmp-offset: 0 27
pos: 24 32 0
size: 8 8 6
flags: REACTIVE DEADLY
react-mask: XP XN YP YN ZP ZN
movement: CW
}
actor{
name: BUBBLE-00
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 8 8 6
size: 8 8 8
orient: ZP
flags: PUSHABLE MOVING INERTIA
movement: Z
}
actor{
name: BUBBLE-01
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 8 48 31
size: 8 8 8
orient: ZP
flags: PUSHABLE MOVING INERTIA
movement: Z
}
actor{
name: BUBBLE-02
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 48 48 23
size: 8 8 8
orient: ZP
flags: PUSHABLE MOVING INERTIA
movement: Z
}
actor{
name: BUBBLE-03
bmp: altres.gif
bmp-rect: 20 75 28 26
bmp-offset: -2 28
pos: 48 8 15
size: 8 8 8
orient: ZP
flags: PUSHABLE MOVING INERTIA
movement: Z
}

36
data/rooms/84.txt Normal file
View File

@@ -0,0 +1,36 @@
width: 0
height: 3
door-height-xn: 0
door-height-yp: 0
door-height-yn: 0
color: WHITE
floor-texture: 4
wall-texture: 2
door-texture: 0
under-door-texture: 0
exit-xn: 86
exit-yp: 83
exit-yn: 85
editor-done: 1
actor{
name: CUADRO-00
bmp: altres.gif
bmp-rect: 66 75 18 32
bmp-offset: 0 39
pos: 23 8 6
size: 1 1 9
orient: YP
movement: CW
}
actor{
name: CUADRO-01
bmp: altres.gif
bmp-rect: 102 75 18 32
bmp-offset: 0 39
pos: 23 48 6
size: 1 1 9
orient: YP
movement: CW
}

270
data/rooms/85.txt Normal file
View File

@@ -0,0 +1,270 @@
width: 3
height: 3
door-height-yp: 1
color: CYAN
floor-texture: 11
wall-texture: 0
door-texture: 0
under-door-texture: 0
exit-yp: 84
editor-done: 1
actor{
name: PLATF-02
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 0 8 16
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: PLATF-04
bmp: caixes.gif
bmp-rect: 96 160 32 32
bmp-offset: 0 32
pos: 0 8 0
size: 8 8 8
orient: ZP
movement: Z
}
actor{
name: PLATH-00
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 16 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-00
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 56 16
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-00
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 32 56 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-01
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 24 56 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-02
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 24 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-03
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 32 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-04
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 40 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-05
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 48 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-06
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 56 0
size: 8 8 4
orient: ZP
movement: Z
}
actor{
name: PLATH-07
bmp: caixes.gif
bmp-rect: 160 128 32 32
bmp-offset: 0 32
pos: 0 32 16
size: 8 8 4
orient: ZP
flags: DISAPPEAR
movement: Z
}
actor{
name: ROOMBA
bmp: caixes.gif
bmp-rect: 160 0 32 32
bmp-offset: 0 34
pos: 0 56 4
size: 8 8 2
orient: YN
flags: REACTIVE MOVING DEADLY
react-mask: XP XN YP YN ZP ZN
movement: Y
}
actor{
name: TRANSPA-00
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 48 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-01
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 26 6
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-02
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 26 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-03
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 4 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-04
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 4 6
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-05
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 48 4 12
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-06
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 24 4 0
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-06
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 24 4 16
size: 8 8 6
movement: CW
}
actor{
name: TRANSPA-07
bmp: altres.gif
bmp-rect: 0 160 32 32
bmp-offset: 0 32
pos: 24 4 8
size: 8 8 6
movement: CW
}
actor{
name: TV
bmp: caixes.gif
bmp-rect: 32 64 32 32
bmp-offset: -4 34
pos: 0 13 24
size: 8 6 8
flags: PUSHABLE GRAVITY
movement: CW
}
actor{
name: Y-3
bmp: objectes.gif
bmp-rect: 145 41 20 25
bmp-offset: -5 27
pos: 0 56 20
size: 6 4 6
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}

117
data/rooms/86.txt Normal file
View File

@@ -0,0 +1,117 @@
width: 2
height: 2
door-height-xp: 0
door-height-yp: 5
color: PURPLE
floor-texture: 1
wall-texture: 2
door-texture: 3
under-door-texture: 2
exit-xp: 84
editor-done: 1
actor{
name: BOX-A
bmp: caixes.gif
bmp-rect: 0 0 32 32
bmp-offset: 0 32
pos: 26 29 0
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: BOX-B
bmp: caixes.gif
bmp-rect: 32 0 32 32
bmp-offset: 0 32
pos: 8 8 8
size: 8 8 8
flags: PICKABLE PUSHABLE GRAVITY
movement: CW
}
actor{
name: ESTANT-00
bmp: altres.gif
bmp-rect: 21 101 26 24
bmp-offset: -6 27
pos: 48 8 0
size: 8 5 6
movement: CW
}
actor{
name: ESTANT-01
bmp: altres.gif
bmp-rect: 21 101 26 24
bmp-offset: -6 27
pos: 40 8 0
size: 8 5 6
movement: CW
}
actor{
name: ESTANT-02
bmp: altres.gif
bmp-rect: 21 101 26 24
bmp-offset: -6 27
pos: 40 8 6
size: 8 5 6
movement: CW
}
actor{
name: ESTANT-03
bmp: altres.gif
bmp-rect: 21 101 26 24
bmp-offset: -6 27
pos: 48 8 6
size: 8 5 6
movement: CW
}
actor{
name: ESTANT-04
bmp: altres.gif
bmp-rect: 21 101 26 24
bmp-offset: -6 27
pos: 48 8 12
size: 8 5 6
movement: CW
}
actor{
name: ESTANT-05
bmp: altres.gif
bmp-rect: 21 101 26 24
bmp-offset: -6 27
pos: 40 8 12
size: 8 5 6
movement: CW
}
actor{
name: TAULA-A
bmp: caixes.gif
bmp-rect: 128 32 32 32
bmp-offset: 0 32
pos: 8 8 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}
actor{
name: TAULA-B
bmp: caixes.gif
bmp-rect: 160 32 32 32
bmp-offset: 0 32
pos: 8 16 0
size: 8 8 8
orient: YP
flags: ORIENTABLE
movement: CW
}

BIN
data/snd_boost.wav Normal file

Binary file not shown.

BIN
data/snd_dead.wav Normal file

Binary file not shown.

BIN
data/snd_disappear.wav Normal file

Binary file not shown.

BIN
data/snd_jump.wav Normal file

Binary file not shown.

BIN
data/snd_logo.wav Normal file

Binary file not shown.

BIN
data/snd_pick.wav Normal file

Binary file not shown.

BIN
data/snd_push.wav Normal file

Binary file not shown.

BIN
data/snd_walk.wav Normal file

Binary file not shown.

View File

@@ -47,19 +47,6 @@ category{
movement: CW movement: CW
} }
actor{
name: S-SHOES
bmp: objectes.gif
bmp-rect: 162 0 28 22
bmp-offset: -3 24
pos: 48 8 0
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
actor{ actor{
name: FINESTRA name: FINESTRA
bmp: altres.gif bmp: altres.gif
@@ -217,6 +204,87 @@ category{
movement: CW movement: CW
} }
actor{
name: SAM
bmp: sam.gif
bmp-rect: 0 0 19 33
bmp-offset: -8 38
pos: 24 40 0
size: 8 8 8
orient: XP
anim-cycle: DUO
anim-wait: 20
flags: ANIMATED
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: YONKI
bmp: caixes.gif
bmp-rect: 168 65 19 31
bmp-offset: -6 36
pos: 24 40 0
size: 8 8 8
orient: XP
anim-wait: 20
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: LORD-ABAD
bmp: lordabad.gif
bmp-rect: 0 0 20 33
bmp-offset: -6 38
pos: 56 48 0
size: 8 8 8
orient: XP
anim-cycle: MIN
anim-wait: 1
flags: ANIMATED ORIENTABLE
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: JAILDES
bmp: test.gif
bmp-rect: 0 32 20 32
bmp-offset: -6 38
pos: 48 40 0
size: 8 8 8
orient: XP
anim-wait: 1
flags: ANIMATED
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: ROOMBA2
bmp: caixes.gif
bmp-rect: 164 0 24 32
bmp-offset: 0 34
pos: 24 40 0
size: 8 8 2
orient: XN
react-mask: XP XN YP YN ZP ZN
movement: CCW
}
actor{
name: ARCADE
bmp: altres.gif
bmp-rect: 160 0 30 48
bmp-offset: 0 49
pos: 0 16 0
size: 8 8 16
orient: YP
flags: ORIENTABLE
movement: CW
}
} }
category{ category{
@@ -400,11 +468,11 @@ category{
bmp: objectes.gif bmp: objectes.gif
bmp-rect: 96 0 24 32 bmp-rect: 96 0 24 32
bmp-offset: -4 34 bmp-offset: -4 34
pos: 8 40 8 pos: 16 0 8
size: 4 4 4 size: 4 4 4
anim-cycle: SEQ anim-cycle: SEQ
anim-wait: 2 anim-wait: 2
flags: SPECIAL flags: PUSHABLE GRAVITY SPECIAL
movement: CW movement: CW
} }
@@ -657,3 +725,60 @@ category{
} }
} }
category{
name: SKILLS
actor{
name: S-SHOES
bmp: objectes.gif
bmp-rect: 162 0 28 22
bmp-offset: -3 24
pos: 40 0 4
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
actor{
name: S-BAG
bmp: objectes.gif
bmp-rect: 145 41 20 25
bmp-offset: -5 27
pos: 0 56 20
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
actor{
name: S-PANTS
bmp: objectes.gif
bmp-rect: 167 22 18 23
bmp-offset: -7 27
pos: 0 16 0
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
actor{
name: S-GLOVES
bmp: objectes.gif
bmp-rect: 165 45 21 22
bmp-offset: -2 26
pos: 8 22 0
size: 4 4 4
anim-cycle: SEQ
anim-wait: 2
flags: SPECIAL
movement: CW
}
}

Binary file not shown.

View File

@@ -1,4 +1,4 @@
libs = -lSDL2 -lSDL2_mixer libs = -lSDL2
cppflags = -D DEBUG -g cppflags = -D DEBUG -g
executable = thepool_debug executable = thepool_debug
sourcepath = source sourcepath = source

View File

@@ -31,8 +31,9 @@ namespace actor
int current_tag = 0; int current_tag = 0;
bool floating_editing = false; bool floating_editing = false;
audio::sound *walk = nullptr;
int walk_channel = -1; int walk_channel = -1;
bool push_sound_already_playing = false;
std::vector<actor_t*> purgatory;
void resetTag() void resetTag()
{ {
@@ -69,6 +70,7 @@ namespace actor
act->surface = draw::getSurface(bmp.c_str()); act->surface = draw::getSurface(bmp.c_str());
act->bmp_rect = r; act->bmp_rect = r;
act->bmp_offset = o; act->bmp_offset = o;
act->alive = true;
return act; return act;
} }
@@ -89,6 +91,8 @@ namespace actor
act->react_mask = act->react_push = 0; act->react_mask = act->react_push = 0;
act->flags = FLAG_NONE; act->flags = FLAG_NONE;
act->template_category = 0; act->template_category = 0;
act->alive = true;
return act; return act;
} }
@@ -233,7 +237,7 @@ namespace actor
newactor->prev = act->prev; newactor->prev = act->prev;
newactor->next = act->next; newactor->next = act->next;
act->prev = act->next = nullptr; act->prev = act->next = nullptr;
remove(act); sendToPurgatory(act);
return newactor; return newactor;
} }
@@ -457,13 +461,33 @@ namespace actor
actor_t *hero = find("HERO"); actor_t *hero = find("HERO");
while (obj2) while (obj2)
{ {
if (obj2 != hero && obj1 != obj2 && check_2d_collision(obj1, obj2)) if (obj2 != hero && obj1 != obj2 && (obj1->pos.z<obj2->pos.z+obj2->size.z) && check_2d_collision(obj1, obj2))
return true; return true;
obj2 = obj2->next; obj2 = obj2->next;
} }
return false; return false;
} }
void find_non_colliding_position(actor_t *obj)
{
int dist = 1;
while (does_collide(obj))
{
obj->pos.x += dist;
if (!does_collide(obj)) return;
obj->pos.x -= dist*2;
if (!does_collide(obj)) return;
obj->pos.x += dist;
obj->pos.y += dist;
if (!does_collide(obj)) return;
obj->pos.y -= dist*2;
if (!does_collide(obj)) return;
obj->pos.y += dist;
dist++;
}
}
const bool is_above(actor_t *obj1, actor_t *obj2) const bool is_above(actor_t *obj1, actor_t *obj2)
{ {
return check_2d_collision(obj1, obj2) && (obj1->pos.z == obj2->pos.z + obj2->size.z); return check_2d_collision(obj1, obj2) && (obj1->pos.z == obj2->pos.z + obj2->size.z);
@@ -633,8 +657,10 @@ namespace actor
} }
if ((source->flags & FLAG_HERO) && (act->flags & FLAG_DISAPPEAR)) if ((source->flags & FLAG_HERO) && (act->flags & FLAG_DISAPPEAR))
{ {
audio::playSound("snd_disappear.wav", SOUND_BASIC);
act = actor::replaceWithTemplate(act, "EXPLOSION"); act = actor::replaceWithTemplate(act, "EXPLOSION");
act->name[0] = '_'; act->name[0] = '_';
return PUSH_NONE;
} }
if (source->flags & FLAG_DEADLY) if (source->flags & FLAG_DEADLY)
@@ -649,22 +675,61 @@ namespace actor
if (act->name[0] == 'B') if (act->name[0] == 'B')
{ // Es un booster { // Es un booster
hero::collectBooster(&act->name[5], (act->name[2] - 48) * 10 + (act->name[3] - 48)); hero::collectBooster(&act->name[5], (act->name[2] - 48) * 10 + (act->name[3] - 48));
audio::playSound("snd_boost.wav", SOUND_BASIC);
} }
else if (act->name[0] == 'S') else if (act->name[0] == 'S')
{ // Es un skill { // Es un skill
hero::giveSkill(&act->name[2]); hero::giveSkill(&act->name[2]);
audio::playSound("snd_boost.wav", SOUND_BASIC);
} }
else if (act->name[0] == 'P') else if (act->name[0] == 'P')
{ {
if (hero::getSkills() & SKILL_BAG) if (hero::getSkills() & SKILL_BAG)
{ // Es una part { // Es una part
hero::pickPart(&act->name[2]); hero::pickPart(&act->name[2]);
audio::playSound("snd_pick.wav", SOUND_BASIC);
} }
else else
{ {
audio::playSound("snd_push.wav", SOUND_BASIC);
return result; return result;
} }
} }
else if (act->name[0] == 'A')
{
hero::pickAnbernic(act->name);
audio::playSound("snd_pick.wav", SOUND_BASIC);
}
else if (act->name[0] == 'X')
{
if (hero::isCarryingPrologoObject()) {
audio::playSound("snd_push.wav", SOUND_BASIC);
return result;
} else {
hero::pickPrologoObject(act->name[2]-48);
audio::playSound("snd_pick.wav", SOUND_BASIC);
}
}
else if (act->name[0] == 'Y')
{
const int which = act->name[2]-48;
if (hero::getPrologoObjectState(which)==PROLOGO_OBJECT_PICKED)
{
hero::leavePrologoObject(which);
audio::playSound("snd_pick.wav", SOUND_BASIC);
act->name[0] = 'Z';
room::cycleColor(1);
return result;
} else {
audio::playSound("snd_push.wav", SOUND_BASIC);
return result;
}
}
else if (act->name[0] == 'Z')
{
audio::playSound("snd_push.wav", SOUND_BASIC);
return result;
}
else else
{ {
SDL_assert(false); SDL_assert(false);
@@ -672,6 +737,7 @@ namespace actor
act = actor::replaceWithTemplate(act, "EXPLOSION"); act = actor::replaceWithTemplate(act, "EXPLOSION");
act->name[0] = '_'; act->name[0] = '_';
room::cycleColor(1); room::cycleColor(1);
return PUSH_NONE;
} }
} }
return result; return result;
@@ -690,6 +756,7 @@ namespace actor
if ((act->pos.x > min.x && act->pos.y >= min.y && (act->pos.y + act->size.y) <= max.y) || ((room::getDoors() & DOOR_XN) && (act->pos.y >= 24) && (act->pos.y <= 32))) if ((act->pos.x > min.x && act->pos.y >= min.y && (act->pos.y + act->size.y) <= max.y) || ((room::getDoors() & DOOR_XN) && (act->pos.y >= 24) && (act->pos.y <= 32)))
{ {
moving = true; moving = true;
// Si està en les vores d'una porta, espenta cap a centrar-lo
if ((act->pos.x <= min.x) && (act->pos.z == room::getDoor(XN) * 4) && (room::getDoors() & DOOR_XN)) if ((act->pos.x <= min.x) && (act->pos.z == room::getDoor(XN) * 4) && (room::getDoors() & DOOR_XN))
{ {
if (act->pos.y < 28) if (act->pos.y < 28)
@@ -697,10 +764,16 @@ namespace actor
else if (act->pos.y > 28) else if (act->pos.y > 28)
act->push |= PUSH_YN; act->push |= PUSH_YN;
else else
{
act->push |= PUSH_XN; act->push |= PUSH_XN;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
else else
{
act->push |= PUSH_XN; act->push |= PUSH_XN;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
} }
else if (controller::down(KEY_RIGHT)) //(input::keyDown(SDL_SCANCODE_RIGHT) || input::keyDown(config::getKey(KEY_RIGHT))) else if (controller::down(KEY_RIGHT)) //(input::keyDown(SDL_SCANCODE_RIGHT) || input::keyDown(config::getKey(KEY_RIGHT)))
@@ -710,6 +783,7 @@ namespace actor
if (((act->pos.x + act->size.x) < max.x && act->pos.y >= min.y && (act->pos.y + act->size.y) <= max.y) || ((room::getDoors() & DOOR_XP) && (act->pos.y >= 24) && (act->pos.y <= 32))) if (((act->pos.x + act->size.x) < max.x && act->pos.y >= min.y && (act->pos.y + act->size.y) <= max.y) || ((room::getDoors() & DOOR_XP) && (act->pos.y >= 24) && (act->pos.y <= 32)))
{ {
moving = true; moving = true;
// Si està en les vores d'una porta, espenta cap a centrar-lo
if (((act->pos.x + act->size.x) >= max.x) && (act->pos.z == room::getDoor(XP) * 4) && (room::getDoors() & DOOR_XP)) if (((act->pos.x + act->size.x) >= max.x) && (act->pos.z == room::getDoor(XP) * 4) && (room::getDoors() & DOOR_XP))
{ {
if (act->pos.y < 28) if (act->pos.y < 28)
@@ -717,19 +791,26 @@ namespace actor
else if (act->pos.y > 28) else if (act->pos.y > 28)
act->push |= PUSH_YN; act->push |= PUSH_YN;
else else
{
act->push |= PUSH_XP; act->push |= PUSH_XP;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
else else
{
act->push |= PUSH_XP; act->push |= PUSH_XP;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
} }
else if (controller::down(KEY_UP)) //input::keyDown(SDL_SCANCODE_UP) || input::keyDown(config::getKey(KEY_UP))) else if (controller::down(KEY_UP)) // input::keyDown(SDL_SCANCODE_UP) || input::keyDown(config::getKey(KEY_UP)))
{ {
hero::useBoostRun(); hero::useBoostRun();
act->orient = PUSH_YN; act->orient = PUSH_YN;
if ((act->pos.y > min.y && act->pos.x >= min.x && (act->pos.x + act->size.x) <= max.x) || ((room::getDoors() & DOOR_YN) && (act->pos.x >= 24) && (act->pos.x <= 32))) if ((act->pos.y > min.y && act->pos.x >= min.x && (act->pos.x + act->size.x) <= max.x) || ((room::getDoors() & DOOR_YN) && (act->pos.x >= 24) && (act->pos.x <= 32)))
{ {
moving = true; moving = true;
// Si està en les vores d'una porta, espenta cap a centrar-lo
if ((act->pos.y <= min.y) && (act->pos.z == room::getDoor(YN) * 4) && (room::getDoors() & DOOR_YN)) if ((act->pos.y <= min.y) && (act->pos.z == room::getDoor(YN) * 4) && (room::getDoors() & DOOR_YN))
{ {
if (act->pos.x < 28) if (act->pos.x < 28)
@@ -737,19 +818,26 @@ namespace actor
else if (act->pos.x > 28) else if (act->pos.x > 28)
act->push |= PUSH_XN; act->push |= PUSH_XN;
else else
{
act->push |= PUSH_YN; act->push |= PUSH_YN;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
else else
{
act->push |= PUSH_YN; act->push |= PUSH_YN;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
} }
else if (controller::down(KEY_DOWN)) //input::keyDown(SDL_SCANCODE_DOWN) || input::keyDown(config::getKey(KEY_DOWN))) else if (controller::down(KEY_DOWN)) // input::keyDown(SDL_SCANCODE_DOWN) || input::keyDown(config::getKey(KEY_DOWN)))
{ {
hero::useBoostRun(); hero::useBoostRun();
act->orient = PUSH_YP; act->orient = PUSH_YP;
if (((act->pos.y + act->size.y) < max.y && act->pos.x >= min.x && (act->pos.x + act->size.x) <= max.x) || ((room::getDoors() & DOOR_YP) && (act->pos.x >= 24) && (act->pos.x <= 32))) if (((act->pos.y + act->size.y) < max.y && act->pos.x >= min.x && (act->pos.x + act->size.x) <= max.x) || ((room::getDoors() & DOOR_YP) && (act->pos.x >= 24) && (act->pos.x <= 32)))
{ {
moving = true; moving = true;
// Si està en les vores d'una porta, espenta cap a centrar-lo
if (((act->pos.y + act->size.y) >= max.y) && (act->pos.z == room::getDoor(YP) * 4) && (room::getDoors() & DOOR_YP)) if (((act->pos.y + act->size.y) >= max.y) && (act->pos.z == room::getDoor(YP) * 4) && (room::getDoors() & DOOR_YP))
{ {
if (act->pos.x < 28) if (act->pos.x < 28)
@@ -757,13 +845,19 @@ namespace actor
else if (act->pos.x > 28) else if (act->pos.x > 28)
act->push |= PUSH_XN; act->push |= PUSH_XN;
else else
{
act->push |= PUSH_YP; act->push |= PUSH_YP;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
else else
{
act->push |= PUSH_YP; act->push |= PUSH_YP;
if (hero::getBoostRun() > 0) act->push |= PUSH_DOUBLE;
}
} }
} }
//if ((input::keyPressed(SDL_SCANCODE_RETURN) || input::keyPressed(config::getKey(KEY_PICK))) && (hero::getSkills() & SKILL_PANTS)) // if ((input::keyPressed(SDL_SCANCODE_RETURN) || input::keyPressed(config::getKey(KEY_PICK))) && (hero::getSkills() & SKILL_PANTS))
if ((controller::pressed(KEY_PICK)) && (hero::getSkills() & SKILL_PANTS)) if ((controller::pressed(KEY_PICK)) && (hero::getSkills() & SKILL_PANTS))
{ {
if (picked) if (picked)
@@ -775,7 +869,8 @@ namespace actor
if (picked->pos.y + picked->size.y > room::getMax().y) if (picked->pos.y + picked->size.y > room::getMax().y)
picked->pos.y = room::getMax().y - picked->size.y; picked->pos.y = room::getMax().y - picked->size.y;
picked->pos.z = act->pos.z; picked->pos.z = act->pos.z;
if (does_collide(picked)) find_non_colliding_position(picked);
/*if (does_collide(picked))
{ {
picked->pos.x -= 2; picked->pos.x -= 2;
if (does_collide(picked)) if (does_collide(picked))
@@ -783,7 +878,7 @@ namespace actor
picked->pos.x += 2; picked->pos.x += 2;
picked->pos.y -= 2; picked->pos.y -= 2;
} }
} }*/
act->pos.z += picked->size.z; act->pos.z += picked->size.z;
actor::actor_t *above = act->above; actor::actor_t *above = act->above;
while (above) while (above)
@@ -810,11 +905,16 @@ namespace actor
// act->pos.z -= height; // act->pos.z -= height;
} }
} }
actor::actor_t *future_below = any_below_me(act); actor::actor_t *future_below = any_below_me(act);
//if ((input::keyDown(SDL_SCANCODE_SPACE) || input::keyDown(config::getKey(KEY_JUMP))) && // if ((input::keyDown(SDL_SCANCODE_SPACE) || input::keyDown(config::getKey(KEY_JUMP))) &&
if ((controller::down(KEY_JUMP)) && if ((controller::down(KEY_JUMP)) && ((hero::getSkills() & SKILL_SHOES) || actor::hero::isPrologo())
(hero::getSkills() & SKILL_SHOES) && (act->pos.y + act->size.y) <= max.y && act->pos.y >= min.y && (act->pos.x + act->size.x) <= max.x && act->pos.x >= min.x && act->react_mask == 0 && ((act->pos.z == 0 && room::getFloor() != 11) || (act->below || future_below))) && (act->pos.y + act->size.y) <= max.y && act->pos.y >= min.y && (act->pos.x + act->size.x) <= max.x && act->pos.x >= min.x && act->react_mask == 0 && ((act->pos.z == 0 && room::getFloor() != 11) || (act->below || future_below)))
{ {
audio::pauseChannel(walk_channel);
audio::playSound("snd_jump.wav", SOUND_BASIC);
// [RZC 01/10/2024] Hack per a que al aterrar sobre els que desapareixen puga botar sobre ells, i a més ells desapareguen // [RZC 01/10/2024] Hack per a que al aterrar sobre els que desapareixen puga botar sobre ells, i a més ells desapareguen
if (!act->below && future_below && future_below->flags & FLAG_DISAPPEAR) if (!act->below && future_below && future_below->flags & FLAG_DISAPPEAR)
actor::push(act, future_below, PUSH_ZN); actor::push(act, future_below, PUSH_ZN);
@@ -863,13 +963,13 @@ namespace actor
if (moving) if (moving)
{ {
act->flags |= FLAG_ANIMATED; act->flags |= FLAG_ANIMATED;
//if (audio::getChannelState(walk_channel) == audio::CHANNEL_PAUSED) audio::resumeChannel(walk_channel); if ((config::getSoundMode() == SOUND_ALL) && act->react_mask == 0 && ((act->below) || (act->pos.z == 0)))
if ( (config::getSoundMode()==SOUND_ALL) && (act->anim_frame==0)) walk_channel = audio::playSound(walk, 0); audio::resumeChannel(walk_channel);
} }
else else
{ {
act->flags &= uint8_t(~FLAG_ANIMATED); act->flags &= uint8_t(~FLAG_ANIMATED);
//if (audio::getChannelState(walk_channel) == audio::CHANNEL_PLAYING) audio::pauseChannel(walk_channel); audio::pauseChannel(walk_channel);
} }
} }
@@ -880,8 +980,13 @@ namespace actor
act->push |= act->mov_push; act->push |= act->mov_push;
} }
void changeMoving(actor_t *act) void changeMoving(actor_t *act, const bool silent = false)
{ {
if (!silent && !push_sound_already_playing)
{
audio::playSound("snd_push.wav", SOUND_BASIC);
push_sound_already_playing = true;
}
switch (act->movement) switch (act->movement)
{ {
case MOV_X: case MOV_X:
@@ -1006,7 +1111,7 @@ namespace actor
vec3_t min = room::getMin(); vec3_t min = room::getMin();
vec3_t max = room::getMax(); vec3_t max = room::getMax();
if ((act->push & PUSH_KILL) && (act->flags & FLAG_HERO)) if ((act->push & PUSH_KILL) && (act->flags & FLAG_HERO) && (!hero::hasBoostGod()))
{ {
if (!editor::isDevMode()) if (!editor::isDevMode())
{ {
@@ -1015,6 +1120,8 @@ namespace actor
stats::loseLive(); stats::loseLive();
} }
// [TODO] If lives == 0 anar a la pantalla de game-over o cat's life // [TODO] If lives == 0 anar a la pantalla de game-over o cat's life
audio::pauseChannel(walk_channel);
audio::playSound("snd_dead.wav", SOUND_BASIC);
actor_t *act = actor::find("HERO"); actor_t *act = actor::find("HERO");
act = actor::replaceWithTemplate(act, "EXPLOSION"); act = actor::replaceWithTemplate(act, "EXPLOSION");
actor_t *act2 = actor::createFromTemplate("EXPLOSION"); actor_t *act2 = actor::createFromTemplate("EXPLOSION");
@@ -1022,17 +1129,25 @@ namespace actor
act2->pos.z += 8; act2->pos.z += 8;
act2->anim_frame = 2; act2->anim_frame = 2;
act->anim_wait = act2->anim_wait = 1; act->anim_wait = act2->anim_wait = 1;
actor_t *other = first;
while (other)
{
other->flags &= ~FLAG_MOVING;
other = other->next;
}
actor::setDirty(act2); actor::setDirty(act2);
room::cycleColor(4); room::cycleColor(4);
return; return;
} }
if ((act->flags & FLAG_HERO) && (hero::hasBoostGod())) act->push &= ~PUSH_KILL;
// [RZC 26/09/2024] Hack usant react_push en el moviment RAND per a contar la distancia abans de canviar de direcció // [RZC 26/09/2024] Hack usant react_push en el moviment RAND per a contar la distancia abans de canviar de direcció
if (act->movement == MOV_RAND) if (act->movement == MOV_RAND)
{ {
act->react_push--; act->react_push--;
if (act->react_push == 0) if (act->react_push == 0)
changeMoving(act); changeMoving(act, true);
} }
// [RZC 26/09/2024] Hack usant react_push en les bambolles de café per al dz del moviment de anar pegant botets // [RZC 26/09/2024] Hack usant react_push en les bambolles de café per al dz del moviment de anar pegant botets
@@ -1045,7 +1160,9 @@ namespace actor
act->pos.z += act->react_push; act->pos.z += act->react_push;
} }
int vel = (act->flags & FLAG_HERO) && (hero::getBoostRun() > 0) ? 2 : 1; //int vel = (act->flags & FLAG_HERO) && (hero::getBoostRun() > 0) ? 2 : 1;
int vel = (act->flags & FLAG_HERO) && (act->push & PUSH_DOUBLE) ? 2 : 1;
act->push &= ~ PUSH_DOUBLE;
if (act->push & PUSH_ZP) if (act->push & PUSH_ZP)
{ {
@@ -1106,8 +1223,10 @@ namespace actor
actor::actor_t *other = actor::get_collision(act); actor::actor_t *other = actor::get_collision(act);
if (other || (act->pos.x < min.x && (!(room::getDoors() & DOOR_XN) || (act->pos.y != 28) || (act->pos.z != room::getDoor(XN) * 4) || !(act->flags & FLAG_HERO)))) if (other || (act->pos.x < min.x && (!(room::getDoors() & DOOR_XN) || (act->pos.y != 28) || (act->pos.z != room::getDoor(XN) * 4) || !(act->flags & FLAG_HERO))))
{ {
if (other) if (other) {
other->push |= push(act, other, PUSH_XN); uint8_t push_value = push(act, other, PUSH_XN);
if (push_value) other->push |= push_value;
}
act->pos.x += vel; act->pos.x += vel;
if (act->flags & FLAG_MOVING) if (act->flags & FLAG_MOVING)
changeMoving(act); changeMoving(act);
@@ -1144,8 +1263,10 @@ namespace actor
actor::actor_t *other = actor::get_collision(act); actor::actor_t *other = actor::get_collision(act);
if (other || ((act->pos.x + act->size.x) > max.x && (!(room::getDoors() & DOOR_XP) || (act->pos.y != 28) || !(act->flags & FLAG_HERO)))) if (other || ((act->pos.x + act->size.x) > max.x && (!(room::getDoors() & DOOR_XP) || (act->pos.y != 28) || !(act->flags & FLAG_HERO))))
{ {
if (other) if (other) {
other->push |= push(act, other, PUSH_XP); uint8_t push_value = push(act, other, PUSH_XP);
if (push_value) other->push |= push_value;
}
act->pos.x -= vel; act->pos.x -= vel;
if (act->flags & FLAG_MOVING) if (act->flags & FLAG_MOVING)
changeMoving(act); changeMoving(act);
@@ -1165,7 +1286,7 @@ namespace actor
room::load(room::getExit(XP)); room::load(room::getExit(XP));
if (llevar_abad) if (llevar_abad)
{ {
actor::remove(actor::find("ABAD")); actor::sendToPurgatory(actor::find("ABAD"));
} }
act->pos.x = room::getMin().x - 3; act->pos.x = room::getMin().x - 3;
act->pos.z = room::getDoor(XN) * 4; act->pos.z = room::getDoor(XN) * 4;
@@ -1185,8 +1306,10 @@ namespace actor
actor::actor_t *other = actor::get_collision(act); actor::actor_t *other = actor::get_collision(act);
if (other || (act->pos.y < min.y && (!(room::getDoors() & DOOR_YN) || (act->pos.x != 28) || (act->pos.z != room::getDoor(YN) * 4) || !(act->flags & FLAG_HERO)))) if (other || (act->pos.y < min.y && (!(room::getDoors() & DOOR_YN) || (act->pos.x != 28) || (act->pos.z != room::getDoor(YN) * 4) || !(act->flags & FLAG_HERO))))
{ {
if (other) if (other) {
other->push |= push(act, other, PUSH_YN); uint8_t push_value = push(act, other, PUSH_YN);
if (push_value) other->push |= push_value;
}
act->pos.y += vel; act->pos.y += vel;
if (act->flags & FLAG_MOVING) if (act->flags & FLAG_MOVING)
changeMoving(act); changeMoving(act);
@@ -1221,8 +1344,10 @@ namespace actor
actor::actor_t *other = actor::get_collision(act); actor::actor_t *other = actor::get_collision(act);
if (other || ((act->pos.y + act->size.y) > max.y && (!(room::getDoors() & DOOR_YP) || (act->pos.x != 28) || !(act->flags & FLAG_HERO)))) if (other || ((act->pos.y + act->size.y) > max.y && (!(room::getDoors() & DOOR_YP) || (act->pos.x != 28) || !(act->flags & FLAG_HERO))))
{ {
if (other) if (other) {
other->push |= push(act, other, PUSH_YP); uint8_t push_value = push(act, other, PUSH_YP);
if (push_value) other->push |= push_value;
}
act->pos.y -= vel; act->pos.y -= vel;
if (act->flags & FLAG_MOVING) if (act->flags & FLAG_MOVING)
changeMoving(act); changeMoving(act);
@@ -1279,7 +1404,8 @@ namespace actor
if (is_above(act, act->below)) if (is_above(act, act->below))
{ {
// ...li pase a ell el push, neteje el meu flag, canvie direcció si pertoca i me ane // ...li pase a ell el push, neteje el meu flag, canvie direcció si pertoca i me ane
act->push |= push(act, act->below, PUSH_ZN); // [RZC 20/09/2024] Canvie "act->below->push" per "act->push". Se li deu passar la reacció al que la inicia uint8_t push_value = push(act, act->below, PUSH_ZN); // [RZC 20/09/2024] Canvie "act->below->push" per "act->push". Se li deu passar la reacció al que la inicia
if (push_value) act->push |= push_value;
act->push &= ~PUSH_ZN; act->push &= ~PUSH_ZN;
if ((act->flags & FLAG_MOVING) && (act->movement == MOV_Z)) if ((act->flags & FLAG_MOVING) && (act->movement == MOV_Z))
changeMoving(act); changeMoving(act);
@@ -1300,7 +1426,9 @@ namespace actor
act->below = below; act->below = below;
below->above = act; below->above = act;
// ... i li passem el push, netejem el meu flag i gonnem // ... i li passem el push, netejem el meu flag i gonnem
act->push |= push(act, act->below, PUSH_ZN); // [RZC 20/09/2024] Canvie "act->below->push" per "act->push". Se li deu passar la reacció al que la inicia uint8_t push_value = push(act, act->below, PUSH_ZN); // [RZC 20/09/2024] Canvie "act->below->push" per "act->push". Se li deu passar la reacció al que la inicia
if (push_value) act->push |= push_value;
act->push &= ~PUSH_ZN; act->push &= ~PUSH_ZN;
if ((act->flags & FLAG_MOVING) && (act->movement == MOV_Z)) if ((act->flags & FLAG_MOVING) && (act->movement == MOV_Z))
changeMoving(act); changeMoving(act);
@@ -1342,6 +1470,7 @@ namespace actor
if (act == first) if (act == first)
{ {
push_sound_already_playing = false;
brilli_brilli = (brilli_brilli + 1) & 0x7; brilli_brilli = (brilli_brilli + 1) & 0x7;
} }
@@ -1355,7 +1484,7 @@ namespace actor
{ {
if (act->name[0] == '_') if (act->name[0] == '_')
{ {
actor::remove(act); actor::sendToPurgatory(act);
return; return;
} }
else else
@@ -1372,23 +1501,16 @@ namespace actor
act->anim_wait_count++; act->anim_wait_count++;
} }
if (act->flags & FLAG_HERO) if (act->flags & FLAG_HERO) updateUserInput(act);
updateUserInput(act);
if (act->flags & FLAG_MOVING) if (act->flags & FLAG_MOVING)
{ {
if (act->movement == MOV_HUNT && ((act->pos.x & 7) == 0 || (act->pos.y & 7) == 0)) if (act->movement == MOV_HUNT && ((act->pos.x & 7) == 0 || (act->pos.y & 7) == 0))
changeMoving(act); changeMoving(act);
updateMoving(act); updateMoving(act);
} }
if (act->flags & FLAG_GRAVITY) if (act->flags & FLAG_GRAVITY) act->push |= PUSH_ZN;
act->push |= PUSH_ZN;
// if (act->flags & FLAG_PUSHABLE)
updatePush(act); updatePush(act);
// if (act->flags & FLAG_GRAVITY) updateGravity(act);
// if (act->flags & FLAG_REACTIVE) updateReactive(act);
// act->push = PUSH_NONE;
if (!room_changed && update_all && next) if (!room_changed && update_all && next)
update(next); update(next);
@@ -1471,9 +1593,10 @@ namespace actor
if (editor::isEditing() && (act == selected) && modules::game::getSection() == modules::game::SECTION_ACTOR) if (editor::isEditing() && (act == selected) && modules::game::getSection() == modules::game::SECTION_ACTOR)
draw::swapcol(1, room::getColor(1)); // Si està seleccionat, que canvie de color draw::swapcol(1, room::getColor(1)); // Si està seleccionat, que canvie de color
draw::stencil::set(act->tag); draw::stencil::set(act->tag);
draw::draw(x, y, act->bmp_rect.w, act->bmp_rect.h, act->bmp_rect.x + ao, act->bmp_rect.y + oo, flip); if (!(act->flags & FLAG_SPECIAL) || !(act->name[0] == 'Y') || (brilli_brilli<4) )
draw::draw(x, y, act->bmp_rect.w, act->bmp_rect.h, act->bmp_rect.x + ao, act->bmp_rect.y + oo, flip);
draw::swapcol(1, room::getColor(0)); // Tornem al color per defecte draw::swapcol(1, room::getColor(0)); // Tornem al color per defecte
if (act->flags & FLAG_SPECIAL) if ((act->flags & FLAG_SPECIAL) && (act->name[0] != 'A') && (act->name[0] != 'Z'))
{ {
draw::setSource(brilli); draw::setSource(brilli);
const int dx = (act->bmp_rect.w - 22) >> 1; const int dx = (act->bmp_rect.w - 22) >> 1;
@@ -1489,6 +1612,13 @@ namespace actor
draw::swapcol(1, room::getColor(0)); // Tornem al color per defecte draw::swapcol(1, room::getColor(0)); // Tornem al color per defecte
} }
} }
if ((act->flags & FLAG_HERO) && debug::isEnabled(DEBUG_ACTOR_FLAGS))
{
char tmp[100];
draw::print(SDL_itoa(act->flags, tmp, 2), 1, 1, LIGHT + WHITE, BLACK);
draw::swapcol(1, room::getColor(0)); // Tornem al color per defecte
}
if (draw_all && act->next) if (draw_all && act->next)
draw(act->next); draw(act->next);
} }
@@ -1599,6 +1729,26 @@ namespace actor
free(act); free(act);
} }
void sendToPurgatory(actor_t *act)
{
if (!act) return;
if (act->prev) act->prev->next = act->next;
if (act == first) first = act->next;
if (act == dirty) dirty = act->next;
if (act->next) act->next->prev = act->prev;
if (act == selected) selected = nullptr;
if (act->below) act->below->above = nullptr;
if (act->above) act->above->below = nullptr;
act->alive = false;
purgatory.push_back(act);
}
void cleanPurgatory()
{
for (auto act : purgatory) remove(act);
purgatory.clear();
}
void pick(actor_t *act) void pick(actor_t *act)
{ {
if (!act) if (!act)
@@ -1664,6 +1814,11 @@ namespace actor
{ {
return floating_editing; return floating_editing;
} }
void pauseWalkSound()
{
audio::pauseChannel(walk_channel);
}
namespace templates namespace templates
{ {
std::vector<actor_t> templates; std::vector<actor_t> templates;
@@ -1750,7 +1905,7 @@ namespace actor
std::vector<actor_t> actors; std::vector<actor_t> actors;
for (auto act : templates) for (auto act : templates)
{ {
if (act.template_category >= categories.size()) if (act.template_category >= (int)categories.size())
act.template_category = 0; act.template_category = 0;
if (categories[act.template_category] == catname) if (categories[act.template_category] == catname)
actors.push_back(act); actors.push_back(act);
@@ -1776,7 +1931,7 @@ namespace actor
actor_t *getByName(const char *name) actor_t *getByName(const char *name)
{ {
for (int i = 0; i < templates.size(); ++i) for (int i = 0; i < (int)templates.size(); ++i)
if (util::strcomp(name, templates[i].name)) if (util::strcomp(name, templates[i].name))
return &templates[i]; return &templates[i];
// for (auto t : templates) if (util::strcomp(name, t.name)) return &t; // for (auto t : templates) if (util::strcomp(name, t.name)) return &t;
@@ -1830,9 +1985,9 @@ namespace actor
void swapCategories(const int a, const int b) void swapCategories(const int a, const int b)
{ {
if (a >= categories.size() || a < 0) if (a >= (int)categories.size() || a < 0)
return; return;
if (b >= categories.size() || b < 0) if (b >= (int)categories.size() || b < 0)
return; return;
auto str = categories[a]; auto str = categories[a];
categories[a] = categories[b]; categories[a] = categories[b];
@@ -1871,13 +2026,35 @@ namespace actor
int skills = SKILL_NONE; int skills = SKILL_NONE;
int parts = PART_NONE; int parts = PART_NONE;
bool boosters_collected[100]; bool boosters_collected[100];
bool anbernics[10] = {false, false, false, false, false, false, false, false, false, false};
vec3_t first_pos = {0, 0, 0}; vec3_t first_pos = {0, 0, 0};
int first_orient = 0; int first_orient = 0;
bool dead = false; bool dead = false;
bool prologo = false;
int prologo_objects[4] = {PROLOGO_OBJECT_INITIAL, PROLOGO_OBJECT_INITIAL, PROLOGO_OBJECT_INITIAL, PROLOGO_OBJECT_INITIAL};
int num_prologo_objects=0;
void setPrologo(const bool value)
{
prologo = value;
}
const bool isPrologo()
{
return prologo;
}
void init(const bool complete) void init(const bool complete)
{ {
actor::actor_t *hero = actor::create("HERO", {16, 32, 0}, {6, 6, 12}, "test.gif", {0, 32, 20, 32}, {-6, 38}); actor::actor_t *hero = nullptr;
if (prologo)
{
hero = actor::create("HERO", {16, 32, 0}, {6, 6, 8}, "gat.gif", {0, 0, 24, 28}, {-4, 32});
}
else
{
hero = actor::create("HERO", {16, 32, 0}, {6, 6, 12}, "test.gif", {0, 32, 20, 32}, {-6, 38});
}
hero->flags = FLAG_HERO | FLAG_PUSHABLE | FLAG_GRAVITY | FLAG_ORIENTABLE | FLAG_ANIMATED; hero->flags = FLAG_HERO | FLAG_PUSHABLE | FLAG_GRAVITY | FLAG_ORIENTABLE | FLAG_ANIMATED;
actor::setDirty(hero, true); actor::setDirty(hero, true);
@@ -1889,14 +2066,20 @@ namespace actor
stats::reset(); stats::reset();
lives = 8; lives = 8;
skills = SKILL_NONE; skills = SKILL_NONE;
if (prologo) skills &= SKILL_SHOES;
for (int i=0;i<4;++i) prologo_objects[i] = PROLOGO_OBJECT_INITIAL;
num_prologo_objects=0;
parts = PART_NONE; parts = PART_NONE;
for (int i = 0; i < 10; ++i)
anbernics[i] = false;
for (int i = 0; i < 100; ++i) for (int i = 0; i < 100; ++i)
boosters_collected[i] = false; boosters_collected[i] = false;
brilli = draw::getSurface("objectes.gif"); brilli = draw::getSurface("objectes.gif");
if ((config::getSoundMode() == SOUND_ALL))
if (config::getSoundMode()==SOUND_ALL) walk = audio::loadSound("walk.wav"); {
//walk_channel = audio::playSound(walk, -1); walk_channel = audio::playSound("snd_walk.wav", SOUND_ALL, -1);
//audio::pauseChannel(walk_channel); audio::pauseChannel(walk_channel);
}
} }
else else
{ {
@@ -1924,8 +2107,8 @@ namespace actor
{ {
return dead; return dead;
} }
const int getBoosterFromString(const char *booster) const int getBoosterFromString(const char *booster)
{ {
static const char *boostset_name[4] = {"RUN", "GOD", "JUMP", "LIVE"}; static const char *boostset_name[4] = {"RUN", "GOD", "JUMP", "LIVE"};
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
@@ -2032,6 +2215,11 @@ namespace actor
boost_jumps--; boost_jumps--;
} }
const bool hasBoostGod()
{
return boost_god > 0;
}
const int getSkillFromString(char *skill) const int getSkillFromString(char *skill)
{ {
static const char *skillset_name[4] = {"SHOES", "GLOVES", "PANTS", "BAG"}; static const char *skillset_name[4] = {"SHOES", "GLOVES", "PANTS", "BAG"};
@@ -2070,7 +2258,12 @@ namespace actor
bool giveSkill(char *skill) bool giveSkill(char *skill)
{ {
return giveSkill(getSkillFromString(skill)); const int skill_number = getSkillFromString(skill);
if (skill_number==SKILL_SHOES) modules::game::setMissatge(" JA TENS LES SABATES!- ARA JA POTS BOTAR!");
else if (skill_number==SKILL_GLOVES) modules::game::setMissatge(" JA TENS ELS GUANTS!- ARA JA POTS ESPENTAR!");
else if (skill_number==SKILL_PANTS) modules::game::setMissatge(" JA TENS ELS PANTALONS!- JA POTS AGAFAR COSES!");
else if (skill_number==SKILL_BAG) modules::game::setMissatge(" JA TENS LA MOTXILLA!- A ARREPLEGAR PECES!");
return giveSkill(skill_number);
} }
bool dropSkill(int skill) bool dropSkill(int skill)
@@ -2132,8 +2325,13 @@ namespace actor
{ {
const int value = getPartFromString(part); const int value = getPartFromString(part);
parts |= value; parts |= value;
if (value != 0) if (value != 0) stats::collectPart();
stats::collectPart();
int num_parts = stats::getNumPartsCollected();
char text[] = " PECES ARREPLEGADES:- 0/6";
text[34] = num_parts + 48;
modules::game::setMissatge(text);
return value != 0; return value != 0;
} }
@@ -2154,6 +2352,64 @@ namespace actor
return parts; return parts;
} }
void pickAnbernic(char *name)
{
anbernics[name[8] - 48] = true;
int num_anbernics = getNumAmbernicsCollected();
if (num_anbernics==10)
{
modules::game::setMissatge(" HAS DESBLOQUEJAT- EL PROLOGO!");
config::setProgoloDesbloquejat();
}
else
{
char text[] = " ANBERNICS ARREPLEGADES:- 0/10";
text[36] = num_anbernics+48;
modules::game::setMissatge(text);
}
}
bool wasAnbernicCollected(char *name)
{
return anbernics[name[8] - 48];
}
int getNumAmbernicsCollected()
{
int count = 0;
for (auto anbernic : anbernics)
if (anbernic)
count++;
return count;
}
void pickPrologoObject(int which)
{
prologo_objects[which] = PROLOGO_OBJECT_PICKED;
}
void leavePrologoObject(int which)
{
prologo_objects[which] = PROLOGO_OBJECT_LEFT;
num_prologo_objects++;
}
const bool isCarryingPrologoObject()
{
for (auto object : prologo_objects) if (object==PROLOGO_OBJECT_PICKED) return true;
return false;
}
const int getPrologoObjectState(int which)
{
return prologo_objects[which];
}
const int getNumPrologoObjectsDone()
{
return num_prologo_objects;
}
void move(int *x, int *y, int *z) void move(int *x, int *y, int *z)
{ {
actor_t *hero = actor::find("HERO"); actor_t *hero = actor::find("HERO");

View File

@@ -33,6 +33,7 @@
#define PUSH_ZP 16 #define PUSH_ZP 16
#define PUSH_ZN 32 #define PUSH_ZN 32
#define PUSH_KILL 64 #define PUSH_KILL 64
#define PUSH_DOUBLE 128
// Tipus de moviment de l'actor // Tipus de moviment de l'actor
#define MOV_NONE 0 // Ningun #define MOV_NONE 0 // Ningun
@@ -109,6 +110,7 @@ namespace actor
int tag; int tag;
int template_category; int template_category;
bool alive;
}; };
void resetTag(); void resetTag();
@@ -169,6 +171,10 @@ namespace actor
void remove(actor_t *act); void remove(actor_t *act);
void sendToPurgatory(actor_t *act);
void cleanPurgatory();
void pick(actor_t *act); void pick(actor_t *act);
actor_t *getPicked(); actor_t *getPicked();
@@ -179,6 +185,8 @@ namespace actor
const bool getFloatingEditing(); const bool getFloatingEditing();
void pauseWalkSound();
namespace templates namespace templates
{ {
void load(); void load();
@@ -196,6 +204,17 @@ namespace actor
namespace hero namespace hero
{ {
#define PROLOGO_OBJECT_INITIAL 0
#define PROLOGO_OBJECT_PICKED 1
#define PROLOGO_OBJECT_LEFT 2
#define PROLOGO_SHOES 0
#define PROLOGO_PANTS 1
#define PROLOGO_GLOVES 2
#define PROLOGO_BAG 3
void setPrologo(const bool value);
const bool isPrologo();
void init(const bool complete = true); void init(const bool complete = true);
int getLives(); int getLives();
void setLives(int value); void setLives(int value);
@@ -214,6 +233,7 @@ namespace actor
void useBoostGod(); void useBoostGod();
void useBoostRun(); void useBoostRun();
void useBoostJump(); void useBoostJump();
const bool hasBoostGod();
const int getSkillFromString(char *skill); const int getSkillFromString(char *skill);
const char *getSkillName(int skill); const char *getSkillName(int skill);
@@ -231,6 +251,16 @@ namespace actor
bool wasPartCollected(char *part); bool wasPartCollected(char *part);
int getParts(); int getParts();
void pickAnbernic(char *name);
bool wasAnbernicCollected(char *name);
int getNumAmbernicsCollected();
void pickPrologoObject(int which);
void leavePrologoObject(int which);
const bool isCarryingPrologoObject();
const int getPrologoObjectState(int which);
const int getNumPrologoObjectsDone();
void move(int *x, int *y, int *z); void move(int *x, int *y, int *z);
void setFirstPos(); void setFirstPos();
} }

View File

@@ -6,8 +6,9 @@ namespace config
{ {
bool musicEnabled = true; bool musicEnabled = true;
int soundMode = SOUND_ALL; int soundMode = SOUND_ALL;
uint8_t keys[6] = {SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_SPACE, SDL_SCANCODE_RETURN}; uint8_t keys[7] = {SDL_SCANCODE_UP, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_RIGHT, SDL_SCANCODE_SPACE, SDL_SCANCODE_RETURN, SDL_SCANCODE_ESCAPE};
int8_t pad_btns[6] = {0, 1, 2, 3, 4, 5}; int8_t pad_btns[7] = {SDL_CONTROLLER_BUTTON_DPAD_UP, SDL_CONTROLLER_BUTTON_DPAD_DOWN, SDL_CONTROLLER_BUTTON_DPAD_LEFT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT, SDL_CONTROLLER_BUTTON_A, SDL_CONTROLLER_BUTTON_B, SDL_CONTROLLER_BUTTON_START};
bool prologo_desbloquejat = false;
void setMusic(const bool value) void setMusic(const bool value)
{ {
@@ -46,7 +47,7 @@ namespace config
void defineKey(const int which, const int key) void defineKey(const int which, const int key)
{ {
static const char* nomtecles[6] = {"keyup", "keydown", "keyleft", "keyright", "keyjump", "keypick"}; static const char* nomtecles[7] = {"keyup", "keydown", "keyleft", "keyright", "keyjump", "keypick", "keymenu"};
keys[which] = key; keys[which] = key;
char tmp[5]; char tmp[5];
file::setConfigValue(nomtecles[which], SDL_itoa(key, tmp, 10)); file::setConfigValue(nomtecles[which], SDL_itoa(key, tmp, 10));
@@ -59,7 +60,7 @@ namespace config
void definePadBtn(const int which, const int btn) void definePadBtn(const int which, const int btn)
{ {
static const char* nombotons[6] = {"btnup", "btndown", "btnleft", "btnright", "btnjump", "btnpick"}; static const char* nombotons[7] = {"btnup", "btndown", "btnleft", "btnright", "btnjump", "btnpick", "btnmenu"};
pad_btns[which] = btn; pad_btns[which] = btn;
char tmp[5]; char tmp[5];
file::setConfigValue(nombotons[which], SDL_itoa(btn, tmp, 10)); file::setConfigValue(nombotons[which], SDL_itoa(btn, tmp, 10));
@@ -69,4 +70,16 @@ namespace config
{ {
return pad_btns[which]; return pad_btns[which];
} }
void setProgoloDesbloquejat()
{
prologo_desbloquejat = true;
file::setConfigValue("prologo", "unlocked");
}
const bool isProgoloDesbloquejat()
{
return prologo_desbloquejat;
}
} }

View File

@@ -12,6 +12,7 @@ namespace config
#define KEY_RIGHT 3 #define KEY_RIGHT 3
#define KEY_JUMP 4 #define KEY_JUMP 4
#define KEY_PICK 5 #define KEY_PICK 5
#define KEY_MENU 6
void setMusic(const bool value); void setMusic(const bool value);
void toggleMusic(); void toggleMusic();
@@ -27,4 +28,6 @@ namespace config
void definePadBtn(const int which, const int btn); void definePadBtn(const int which, const int btn);
const int getPadBtn(const int which); const int getPadBtn(const int which);
void setProgoloDesbloquejat();
const bool isProgoloDesbloquejat();
} }

View File

@@ -173,7 +173,7 @@ namespace console
const int getIndexFromString(char *str, std::vector<const char*> list) const int getIndexFromString(char *str, std::vector<const char*> list)
{ {
//static const char *skillset_name[4] = {"SHOES", "GLOVES", "PANTS", "BAG"}; //static const char *skillset_name[4] = {"SHOES", "GLOVES", "PANTS", "BAG"};
for (int i=0;i<list.size();++i) for (int i=0; i<(int)list.size(); ++i)
{ {
if (strcmp(str, list[i])==0) if (strcmp(str, list[i])==0)
{ {
@@ -264,7 +264,7 @@ namespace console
strcpy(msg, "ERROR: Nothing to show."); strcpy(msg, "ERROR: Nothing to show.");
} else { } else {
strcpy(msg, "Ok."); strcpy(msg, "Ok.");
const int value = getIndexFromString(tokens[1], {"NOTHING", "ACTOR-POS"}); const int value = getIndexFromString(tokens[1], {"NOTHING", "POS", "FLAGS"});
if (value==-1) if (value==-1)
strcpy(msg, "ERROR: Cannot show that."); strcpy(msg, "ERROR: Cannot show that.");
else else
@@ -276,7 +276,7 @@ namespace console
strcpy(msg, "ERROR: Nothing to hide."); strcpy(msg, "ERROR: Nothing to hide.");
} else { } else {
strcpy(msg, "Ok."); strcpy(msg, "Ok.");
const int value = getIndexFromString(tokens[1], {"NOTHING", "ACTOR-POS"}); const int value = getIndexFromString(tokens[1], {"NOTHING", "POS", "FLAGS"});
if (value==-1) if (value==-1)
strcpy(msg, "ERROR: Cannot hide that."); strcpy(msg, "ERROR: Cannot hide that.");
else else
@@ -309,10 +309,10 @@ namespace console
strcpy(msg, "Exits the game."); strcpy(msg, "Exits the game.");
break; break;
case CMD_SHOW: case CMD_SHOW:
strcpy(msg, "NOTHING ACTOR-POS"); strcpy(msg, "NOTHING POS FLAGS");
break; break;
case CMD_HIDE: case CMD_HIDE:
strcpy(msg, "NOTHING ACTOR-POS"); strcpy(msg, "NOTHING POS FLAGS");
break; break;
} }

View File

@@ -2,7 +2,7 @@
namespace debug namespace debug
{ {
bool debug_info[2] {false, false}; bool debug_info[3] {false, false, false};
void enable(int info_type) void enable(int info_type)
{ {

View File

@@ -3,6 +3,7 @@
namespace debug namespace debug
{ {
#define DEBUG_ACTOR_POS 1 #define DEBUG_ACTOR_POS 1
#define DEBUG_ACTOR_FLAGS 2
void enable(int info_type); void enable(int info_type);
void disable(int info_type); void disable(int info_type);

345
source/jail_audio.cpp Normal file
View File

@@ -0,0 +1,345 @@
#ifndef JA_USESDLMIXER
#include "jail_audio.h"
#include "stb_vorbis.c"
#include <SDL2/SDL.h>
#include <stdio.h>
#define JA_MAX_SIMULTANEOUS_CHANNELS 5
struct JA_Sound_t {
Uint32 length {0};
Uint8* buffer {NULL};
};
struct JA_Channel_t {
JA_Sound_t *sound;
int pos {0};
int times {0};
JA_Channel_state state { JA_CHANNEL_FREE };
};
struct JA_Music_t {
int samples {0};
int pos {0};
int times {0};
short* output {NULL};
JA_Music_state state {JA_MUSIC_INVALID};
};
JA_Music_t *current_music{NULL};
JA_Channel_t channels[JA_MAX_SIMULTANEOUS_CHANNELS];
int JA_freq {48000};
SDL_AudioFormat JA_format {AUDIO_S16};
Uint8 JA_channels {2};
int JA_musicVolume = 128;
int JA_soundVolume = 64;
bool JA_musicEnabled = true;
bool JA_soundEnabled = true;
SDL_AudioDeviceID sdlAudioDevice = 0;
void audioCallback(void * userdata, uint8_t * stream, int len) {
SDL_memset(stream, 0, len);
if (current_music != NULL && current_music->state == JA_MUSIC_PLAYING) {
const int size = SDL_min(len, current_music->samples*2-current_music->pos);
SDL_MixAudioFormat(stream, (Uint8*)(current_music->output+current_music->pos), AUDIO_S16, size, JA_musicVolume);
current_music->pos += size/2;
if (size < len) {
if (current_music->times != 0) {
SDL_MixAudioFormat(stream+size, (Uint8*)current_music->output, AUDIO_S16, len-size, JA_musicVolume);
current_music->pos = (len-size)/2;
if (current_music->times > 0) current_music->times--;
} else {
current_music->pos = 0;
current_music->state = JA_MUSIC_STOPPED;
}
}
}
// Mixar els channels mi amol
for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) {
if (channels[i].state == JA_CHANNEL_PLAYING) {
const int size = SDL_min(len, channels[i].sound->length - channels[i].pos);
SDL_MixAudioFormat(stream, channels[i].sound->buffer + channels[i].pos, AUDIO_S16, size, JA_soundVolume);
channels[i].pos += size;
if (size < len) {
if (channels[i].times != 0) {
SDL_MixAudioFormat(stream + size, channels[i].sound->buffer, AUDIO_S16, len-size, JA_soundVolume);
channels[i].pos = len-size;
if (channels[i].times > 0) channels[i].times--;
} else {
JA_StopChannel(i);
}
}
}
}
}
void JA_Init(const int freq, const SDL_AudioFormat format, const int channels) {
JA_freq = freq;
JA_format = format;
JA_channels = channels;
SDL_AudioSpec audioSpec{JA_freq, JA_format, JA_channels, 0, 1024, 0, 0, audioCallback, NULL};
if (sdlAudioDevice != 0) SDL_CloseAudioDevice(sdlAudioDevice);
sdlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &audioSpec, NULL, 0);
SDL_PauseAudioDevice(sdlAudioDevice, 0);
}
void JA_Quit() {
SDL_PauseAudioDevice(sdlAudioDevice, 1);
if (sdlAudioDevice != 0) SDL_CloseAudioDevice(sdlAudioDevice);
sdlAudioDevice = 0;
}
JA_Music_t *JA_LoadMusic(Uint8* buffer, Uint32 length)
{
int chan, samplerate;
JA_Music_t *music = new JA_Music_t();
music->samples = stb_vorbis_decode_memory(buffer, length, &chan, &samplerate, &music->output);
// [RZC 28/08/22] Abans el descomprimiem mentre el teniem obert
// music->samples = stb_vorbis_decode_filename(filename, &chan, &samplerate, &music->output);
SDL_AudioCVT cvt;
SDL_BuildAudioCVT(&cvt, AUDIO_S16, chan, samplerate, JA_format, JA_channels, JA_freq);
if (cvt.needed) {
cvt.len = music->samples * chan * 2;
cvt.buf = (Uint8 *) SDL_malloc(cvt.len * cvt.len_mult);
SDL_memcpy(cvt.buf, music->output, cvt.len);
SDL_ConvertAudio(&cvt);
free(music->output);
music->output = (short*)cvt.buf;
}
music->pos = 0;
music->state = JA_MUSIC_STOPPED;
return music;
}
JA_Music_t *JA_LoadMusic(const char* filename)
{
// [RZC 28/08/22] Carreguem primer el arxiu en memòria i després el descomprimim. Es algo més rapid.
FILE *f = fopen(filename, "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);
Uint8 *buffer = (Uint8*)malloc(fsize + 1);
if (fread(buffer, fsize, 1, f)!=1) return NULL;
fclose(f);
JA_Music_t *music = JA_LoadMusic(buffer, fsize);
free(buffer);
return music;
}
void JA_PlayMusic(JA_Music_t *music, const int loop)
{
if (!JA_musicEnabled) return;
if (current_music != NULL) {
current_music->pos = 0;
current_music->state = JA_MUSIC_STOPPED;
}
current_music = music;
current_music->pos = 0;
current_music->state = JA_MUSIC_PLAYING;
current_music->times = loop;
}
void JA_PauseMusic()
{
if (!JA_musicEnabled) return;
if (current_music == NULL || current_music->state == JA_MUSIC_INVALID) return;
current_music->state = JA_MUSIC_PAUSED;
}
void JA_ResumeMusic()
{
if (!JA_musicEnabled) return;
if (current_music == NULL || current_music->state == JA_MUSIC_INVALID) return;
current_music->state = JA_MUSIC_PLAYING;
}
void JA_StopMusic()
{
if (!JA_musicEnabled) return;
if (current_music == NULL || current_music->state == JA_MUSIC_INVALID) return;
current_music->pos = 0;
current_music->state = JA_MUSIC_STOPPED;
}
JA_Music_state JA_GetMusicState() {
if (!JA_musicEnabled) return JA_MUSIC_DISABLED;
if (current_music == NULL) return JA_MUSIC_INVALID;
return current_music->state;
}
void JA_DeleteMusic(JA_Music_t *music) {
if (current_music == music) current_music = NULL;
free(music->output);
delete music;
}
int JA_SetMusicVolume(int volume)
{
JA_musicVolume = volume > 128 ? 128 : volume < 0 ? 0 : volume;
return JA_musicVolume;
}
void JA_EnableMusic(const bool value)
{
if (!value && current_music != NULL && current_music->state==JA_MUSIC_PLAYING) JA_StopMusic();
JA_musicEnabled = value;
}
JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length) {
JA_Sound_t *sound = new JA_Sound_t();
sound->buffer = buffer;
sound->length = length;
return sound;
}
JA_Sound_t *JA_LoadSound(uint8_t* buffer, uint32_t size) {
JA_Sound_t *sound = new JA_Sound_t();
SDL_AudioSpec wavSpec;
SDL_LoadWAV_RW(SDL_RWFromMem(buffer, size),1, &wavSpec, &sound->buffer, &sound->length);
SDL_AudioCVT cvt;
SDL_BuildAudioCVT(&cvt, wavSpec.format, wavSpec.channels, wavSpec.freq, JA_format, JA_channels, JA_freq);
cvt.len = sound->length;
cvt.buf = (Uint8 *) SDL_malloc(cvt.len * cvt.len_mult);
SDL_memcpy(cvt.buf, sound->buffer, sound->length);
SDL_ConvertAudio(&cvt);
SDL_FreeWAV(sound->buffer);
sound->buffer = cvt.buf;
sound->length = cvt.len_cvt;
return sound;
}
JA_Sound_t *JA_LoadSound(const char* filename) {
JA_Sound_t *sound = new JA_Sound_t();
SDL_AudioSpec wavSpec;
SDL_LoadWAV(filename, &wavSpec, &sound->buffer, &sound->length);
SDL_AudioCVT cvt;
SDL_BuildAudioCVT(&cvt, wavSpec.format, wavSpec.channels, wavSpec.freq, JA_format, JA_channels, JA_freq);
cvt.len = sound->length;
cvt.buf = (Uint8 *) SDL_malloc(cvt.len * cvt.len_mult);
SDL_memcpy(cvt.buf, sound->buffer, sound->length);
SDL_ConvertAudio(&cvt);
SDL_FreeWAV(sound->buffer);
sound->buffer = cvt.buf;
sound->length = cvt.len_cvt;
return sound;
}
int JA_PlaySound(JA_Sound_t *sound, const int loop)
{
if (!JA_soundEnabled) return -1;
int channel = 0;
while (channel < JA_MAX_SIMULTANEOUS_CHANNELS && channels[channel].state != JA_CHANNEL_FREE) { channel++; }
if (channel == JA_MAX_SIMULTANEOUS_CHANNELS) channel = 0;
channels[channel].sound = sound;
channels[channel].times = loop;
channels[channel].pos = 0;
channels[channel].state = JA_CHANNEL_PLAYING;
return channel;
}
void JA_DeleteSound(JA_Sound_t *sound)
{
for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) {
if (channels[i].sound == sound) JA_StopChannel(i);
}
SDL_free(sound->buffer);
delete sound;
}
void JA_PauseChannel(const int channel)
{
if (!JA_soundEnabled) return;
if (channel == -1) {
for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) {
if (channels[i].state == JA_CHANNEL_PLAYING) channels[i].state = JA_CHANNEL_PAUSED;
}
} else if (channel >= 0 && channel < JA_MAX_SIMULTANEOUS_CHANNELS) {
if (channels[channel].state == JA_CHANNEL_PLAYING) channels[channel].state = JA_CHANNEL_PAUSED;
}
}
void JA_ResumeChannel(const int channel)
{
if (!JA_soundEnabled) return;
if (channel == -1) {
for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) {
if (channels[i].state == JA_CHANNEL_PAUSED) channels[i].state = JA_CHANNEL_PLAYING;
}
} else if (channel >= 0 && channel < JA_MAX_SIMULTANEOUS_CHANNELS) {
if (channels[channel].state == JA_CHANNEL_PAUSED) channels[channel].state = JA_CHANNEL_PLAYING;
}
}
void JA_StopChannel(const int channel)
{
if (!JA_soundEnabled) return;
if (channel == -1) {
for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) {
channels[i].state = JA_CHANNEL_FREE;
channels[i].pos = 0;
channels[i].sound = NULL;
}
} else if (channel >= 0 && channel < JA_MAX_SIMULTANEOUS_CHANNELS) {
channels[channel].state = JA_CHANNEL_FREE;
channels[channel].pos = 0;
channels[channel].sound = NULL;
}
}
JA_Channel_state JA_GetChannelState(const int channel)
{
if (!JA_soundEnabled) return JA_SOUND_DISABLED;
if (channel < 0 || channel >= JA_MAX_SIMULTANEOUS_CHANNELS) return JA_CHANNEL_INVALID;
return channels[channel].state;
}
int JA_SetSoundVolume(int volume)
{
JA_soundVolume = volume > 128 ? 128 : volume < 0 ? 0 : volume;
return JA_soundVolume;
}
void JA_EnableSound(const bool value)
{
for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++)
{
if (channels[i].state == JA_CHANNEL_PLAYING) JA_StopChannel(i);
}
JA_soundEnabled = value;
}
int JA_SetVolume(int volume)
{
JA_musicVolume = volume > 128 ? 128 : volume < 0 ? 0 : volume;
JA_soundVolume = JA_musicVolume/2;
return JA_musicVolume;
}
#endif

36
source/jail_audio.h Normal file
View File

@@ -0,0 +1,36 @@
#pragma once
#include <SDL2/SDL.h>
enum JA_Channel_state { JA_CHANNEL_INVALID, JA_CHANNEL_FREE, JA_CHANNEL_PLAYING, JA_CHANNEL_PAUSED, JA_SOUND_DISABLED };
enum JA_Music_state { JA_MUSIC_INVALID, JA_MUSIC_PLAYING, JA_MUSIC_PAUSED, JA_MUSIC_STOPPED, JA_MUSIC_DISABLED };
struct JA_Sound_t;
struct JA_Music_t;
void JA_Init(const int freq, const SDL_AudioFormat format, const int channels);
void JA_Quit();
JA_Music_t *JA_LoadMusic(const char* filename);
JA_Music_t *JA_LoadMusic(Uint8* buffer, Uint32 length);
void JA_PlayMusic(JA_Music_t *music, const int loop = -1);
void JA_PauseMusic();
void JA_ResumeMusic();
void JA_StopMusic();
JA_Music_state JA_GetMusicState();
void JA_DeleteMusic(JA_Music_t *music);
int JA_SetMusicVolume(int volume);
void JA_EnableMusic(const bool value);
JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length);
JA_Sound_t *JA_LoadSound(Uint8* buffer, Uint32 length);
JA_Sound_t *JA_LoadSound(const char* filename);
int JA_PlaySound(JA_Sound_t *sound, const int loop = 0);
void JA_PauseChannel(const int channel);
void JA_ResumeChannel(const int channel);
void JA_StopChannel(const int channel);
JA_Channel_state JA_GetChannelState(const int channel);
void JA_DeleteSound(JA_Sound_t *sound);
int JA_SetSoundVolume(int volume);
void JA_EnableSound(const bool value);
int JA_SetVolume(int volume);

View File

@@ -1,81 +1,89 @@
#include "jaudio.h" #include "jaudio.h"
#include "jail_audio.h"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>
#include <stdio.h> #include <stdio.h>
#include "jfile.h" #include "jfile.h"
#include <vector>
#include "config.h"
namespace audio namespace audio
{ {
// Açò son estructures de mentires, per a usar estructures de SDL_Mixer de forma opaca. struct sound_cache_t
// Al final es un punter, així que és irrelevant el tipus del punter,
// però si amague que son estructures de SDL_Mixer, no fa falta ficar el include a SDL_mixer fora de este arxiu
struct sound
{
}; // Dummy structs
struct music
{ {
std::string name;
JA_Sound_t *chunk;
}; };
char *music_buffer = nullptr; //char *music_buffer = nullptr;
JA_Music_t *music = nullptr;
std::vector<sound_cache_t> sounds;
std::string musica_actual = "";
// Inicialitza el sistema de só // Inicialitza el sistema de só
void init() void init()
{ {
int result = Mix_Init(MIX_INIT_OGG | MIX_INIT_WAVPACK); JA_Init(48000, AUDIO_S16, 2);
// Al final he ficat la configuració automàtica i au. Si en el futur necesitem canviar-ho pos se canvia //Mix_Init(MIX_INIT_OGG);// | MIX_INIT_WAVPACK);
result = Mix_OpenAudio(48000, AUDIO_S16, 2, 1024); //Mix_OpenAudio(48000, AUDIO_S16, 2, 512);
} }
// Tanca el sistema de só (no shit, sherlock) // Tanca el sistema de só (no shit, sherlock)
void quit() void quit()
{ {
Mix_CloseAudio(); if (music) JA_DeleteMusic(music);
} for (auto sound : sounds) JA_DeleteSound(sound.chunk); // Mix_FreeChunk(sound.chunk);
sounds.clear();
// Carrega un arxiu de música en format OGG JA_Quit(); // Mix_CloseAudio();
const music *loadMusic(const std::string filename)
{
int size;
if (music_buffer) free(music_buffer);
music_buffer = file::getFileBuffer(filename, size);
auto rwops = SDL_RWFromMem(music_buffer, size);
auto mus = Mix_LoadMUS_RW(rwops, 1);
//free(buffer);
return (music *)mus;
} }
// Comença a reproduïr la música en questió // Comença a reproduïr la música en questió
void playMusic(const music *mus, const int loop) void playMusic(const std::string filename, const int loop)
{ {
Mix_PlayMusic((Mix_Music *)mus, loop); if (!config::isMusicEnabled()) return;
// Si hi havia musica carregada, alliberem memòria
//if (music_buffer) free(music_buffer);
if (music) JA_DeleteMusic(music); //Mix_FreeMusic(music);
int size;
char *buffer = file::getFileBuffer(filename, size);
music = JA_LoadMusic((uint8_t*)buffer, size);
free(buffer);
//auto rwops = SDL_RWFromMem(music_buffer, size);
//auto mus = Mix_LoadMUS_RW(rwops, 1);
//free(music_buffer); // [RZC 03/10/2024] Si allibere el buffer, no funciona la música. Porca miseria! Per aixó l'allibere abans de carregar si ja estava usat.
//Mix_PlayMusic((Mix_Music *)mus, loop);
JA_PlayMusic(music, loop);
musica_actual = filename;
} }
// Pausa la música que està sonant ara // Pausa la música que està sonant ara
void pauseMusic() void pauseMusic()
{ {
Mix_PauseMusic(); JA_PauseMusic(); //Mix_PauseMusic();
} }
// Continua la música pausada // Continua la música pausada
void resumeMusic() void resumeMusic()
{ {
Mix_ResumeMusic(); if (!config::isMusicEnabled()) return;
JA_ResumeMusic(); //Mix_ResumeMusic();
} }
// Para la música que estava sonant // Para la música que estava sonant
void stopMusic() void stopMusic()
{ {
Mix_HaltMusic(); JA_StopMusic(); //Mix_HaltMusic();
musica_actual = "";
} }
// Obté el estat actual de la música // Obté el estat actual de la música
const music_state getMusicState() const music_state getMusicState()
{ {
if (Mix_PausedMusic()) if (JA_GetMusicState() == JA_MUSIC_PAUSED)
{ {
return MUSIC_PAUSED; return MUSIC_PAUSED;
} }
else if (Mix_PlayingMusic()) else if (JA_GetMusicState() == JA_MUSIC_PLAYING)
{ {
return MUSIC_PLAYING; return MUSIC_PLAYING;
} }
@@ -85,58 +93,74 @@ namespace audio
} }
} }
// Allibera una música // Obté el nom de la música actual
void deleteMusic(music *mus) const std::string getCurrentMusic()
{ {
Mix_FreeMusic((Mix_Music *)mus); return musica_actual;
} }
// Carrega un só des d'un arxiu WAV // Carrega un só des d'un arxiu WAV
sound *loadSound(const std::string filename) void loadSound(const std::string filename)
{ {
int size; int size;
char *buffer = file::getFileBuffer(filename, size); char *buffer = file::getFileBuffer(filename, size);
return (sound *)Mix_LoadWAV_RW(SDL_RWFromMem(buffer, size), 1); auto chunk = JA_LoadSound((uint8_t *)buffer, size);
free(buffer);
//auto chunk = Mix_LoadWAV_RW(SDL_RWFromMem(buffer, size), 1);
//if (!chunk) printf("ERROR: %s\n", SDL_GetError());
sound_cache_t sound = { filename, chunk };
sounds.push_back(sound);
} }
// Comença a reproduïr el só especificat // Comença a reproduïr el só especificat
const int playSound(sound *snd, const int loop) const int playSound(const std::string name, const int priority, const int loop)
{ {
return Mix_PlayChannel(-1, (Mix_Chunk *)snd, loop); if (priority < config::getSoundMode()) return -1;
} for (auto sound : sounds)
{
// Allibera un só if (sound.name == name) return JA_PlaySound(sound.chunk, loop); // Mix_PlayChannel(-1, sound.chunk, loop);
void deleteSound(sound *snd) }
{ return -1;
Mix_FreeChunk((Mix_Chunk *)snd);
} }
// Pausa un canal en el que s'estava reproduïnt un só // Pausa un canal en el que s'estava reproduïnt un só
void pauseChannel(const int channel) void pauseChannel(const int channel)
{ {
Mix_Pause(channel); if (channel == -1) return;
JA_PauseChannel(channel); // Mix_Pause(channel);
} }
// Continua un canal pausat // Continua un canal pausat
void resumeChannel(const int channel) void resumeChannel(const int channel)
{ {
Mix_Resume(channel); if (channel == -1) return;
JA_ResumeChannel(channel); // Mix_Resume(channel);
} }
// Para un canal que estava reproduïnt un só // Para un canal que estava reproduïnt un só
void stopChannel(const int channel) void stopChannel(const int channel)
{ {
Mix_HaltChannel(channel); if (channel == -1) return;
JA_StopChannel(channel); // Mix_HaltChannel(channel);
}
// Para tots els canals
void stopAllChannel()
{
JA_StopChannel(-1); // Mix_HaltChannel(-1);
} }
// Obté l'estat d'un canal // Obté l'estat d'un canal
const channel_state getChannelState(const int channel) const channel_state getChannelState(const int channel)
{ {
if (Mix_Paused(channel)) if (JA_GetChannelState(channel) == JA_CHANNEL_PAUSED)
{ {
return CHANNEL_PAUSED; return CHANNEL_PAUSED;
} }
else if (Mix_Playing(channel)) else if (JA_GetChannelState(channel) == JA_CHANNEL_PLAYING)
{ {
return CHANNEL_PLAYING; return CHANNEL_PLAYING;
} }
@@ -149,6 +173,6 @@ namespace audio
// Estableix el volum general // Estableix el volum general
const int setVolume(int volume) const int setVolume(int volume)
{ {
return Mix_Volume(-1, volume); return JA_SetVolume(volume); // Mix_Volume(-1, volume);
} }
} }

View File

@@ -21,25 +21,16 @@ namespace audio
MUSIC_STOPPED MUSIC_STOPPED
}; };
// Estructures per a gestionar música i só
struct sound;
struct music;
/// @brief Inicialitza el sistema de só /// @brief Inicialitza el sistema de só
void init(); void init();
/// @brief Tanca el sistema de só /// @brief Tanca el sistema de só
void quit(); void quit();
/// @brief Carrega un arxiu de música en format OGG /// @brief Comença a reproduïr la música des d'un arxiu
/// @param filename nom de l'arxiu /// @param filename nom de l'arxiu
/// @return punter a la música
const music *loadMusic(const std::string filename);
/// @brief Comença a reproduïr la música en questió
/// @param mus punter a la música
/// @param loop quants bucles farà (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...) /// @param loop quants bucles farà (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...)
void playMusic(const music *mus, const int loop = -1); void playMusic(const std::string filename, const int loop = -1);
/// @brief Pausa la música que està sonant ara /// @brief Pausa la música que està sonant ara
void pauseMusic(); void pauseMusic();
@@ -54,20 +45,19 @@ namespace audio
/// @return estat actual de la música (MUSIC_INVALID, MUSIC_PLAYING, MUSIC_PAUSED o MUSIC_STOPPED) /// @return estat actual de la música (MUSIC_INVALID, MUSIC_PLAYING, MUSIC_PAUSED o MUSIC_STOPPED)
const music_state getMusicState(); const music_state getMusicState();
/// @brief Allibera una música /// @brief Obté el nom de la música actual
/// @param mus punter a la música a alliberar /// @return nom de la cançò
void deleteMusic(music *mus); const std::string getCurrentMusic();
/// @brief Carrega un só des d'un arxiu WAV /// @brief Precarrega un só des d'un arxiu WAV
/// @param filename nom de l'arxiu /// @param filename nom de l'arxiu
/// @return un punter al só void loadSound(const std::string filename);
sound *loadSound(const std::string filename);
/// @brief Comença a reproduïr el só especificat /// @brief Comença a reproduïr el só especificat
/// @param snd punter al só a reproduïr /// @param snd punter al só a reproduïr
/// @param loop si es fa bucle (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...) /// @param loop si es fa bucle (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...)
/// @return número del canal en que està sonant el só /// @return número del canal en que està sonant el só
const int playSound(sound *snd, const int loop = 0); const int playSound(const std::string name, const int priority, const int loop = 0);
/// @brief Pausa un canal en el que s'estava reproduïnt un só /// @brief Pausa un canal en el que s'estava reproduïnt un só
/// @param channel número del canal a pausar /// @param channel número del canal a pausar
@@ -81,15 +71,14 @@ namespace audio
/// @param channel número del canal a parar /// @param channel número del canal a parar
void stopChannel(const int channel); void stopChannel(const int channel);
/// @brief Para tots els canals
void stopAllChannel();
/// @brief Obté l'estat d'un canal /// @brief Obté l'estat d'un canal
/// @param channel canal del que es vol obtindre l'estat /// @param channel canal del que es vol obtindre l'estat
/// @return estat del canal (CHANNEL_INVALID, CHANNEL_FREE, CHANNEL_PLAYING o CHANNEL_PAUSED) /// @return estat del canal (CHANNEL_INVALID, CHANNEL_FREE, CHANNEL_PLAYING o CHANNEL_PAUSED)
const channel_state getChannelState(const int channel); const channel_state getChannelState(const int channel);
/// @brief Allibera un só
/// @param snd punter al só
void deleteSound(sound *snd);
/// @brief Estableix el volum general /// @brief Estableix el volum general
/// @param volume valor a establir com a volum (128 màxim) /// @param volume valor a establir com a volum (128 màxim)
/// @return el volum anterior /// @return el volum anterior

View File

@@ -103,7 +103,8 @@ namespace draw
char *p = buffer; char *p = buffer;
char *n = buffer; char *n = buffer;
while (*n!=0) { while (*n!=0) {
while (*n!='\n') n++; *n=0; while (*n!='\n') n++;
*n=0;
loadSurface(p); loadSurface(p);
p=++n; p=++n;
} }
@@ -614,7 +615,8 @@ namespace draw
const uint32_t size = screen->w * screen->h; // tamany de la superficie const uint32_t size = screen->w * screen->h; // tamany de la superficie
// Bloquejem la textura SDL i agafem els seus pixels (son enters de 32 bits amb format 0xAARRGGBB) // Bloquejem la textura SDL i agafem els seus pixels (son enters de 32 bits amb format 0xAARRGGBB)
int result = SDL_LockTexture(sdl_texture, NULL, (void **)&sdl_pixels, &sdl_pitch); //int result =
SDL_LockTexture(sdl_texture, NULL, (void **)&sdl_pixels, &sdl_pitch);
// Cada pixel de la superficie "screen" es un enter de 8 bits que representa un index en la paleta de colors // Cada pixel de la superficie "screen" es un enter de 8 bits que representa un index en la paleta de colors
// Per tant, per a pintar en la textura SDL, pillem el color de la paleta que correspon al index en "screen" // Per tant, per a pintar en la textura SDL, pillem el color de la paleta que correspon al index en "screen"

View File

@@ -54,10 +54,10 @@ OFFSET CONTINGUT TAMANY DESCRIPCIÓ
25 4 4 tamany del primer axiu 25 4 4 tamany del primer axiu
29 13 1 tamany de la ruta al primer arxiu 29 13 1 tamany de la ruta al primer arxiu
30 "data/hola.txt" 13 la ruta al primer arxiu 30 "data/hola.txt" 13 la ruta al primer arxiu
43 16 4 offset al primer arxiu 43 16 4 offset al segon arxiu
47 4 4 tamany del primer axiu 47 4 4 tamany del segon axiu
51 13 1 tamany de la ruta al primer arxiu 51 14 1 tamany de la ruta al segon arxiu
52 "data/adios.txt" 14 la ruta al primer arxiu 52 "data/adios.txt" 14 la ruta al segon arxiu
- Es un exemple raro, perque ocupa mes la ruta al arxiu que l'arxiu en si, pero espere que la idea quede clara! - Es un exemple raro, perque ocupa mes la ruta al arxiu que l'arxiu en si, pero espere que la idea quede clara!
@@ -260,6 +260,7 @@ namespace file
if (!found) if (!found)
{ {
// [TODO] Donar mes informació de quin recurs no havem trobat // [TODO] Donar mes informació de quin recurs no havem trobat
printf("Arxiu: %s\n", resourcename.c_str());
perror("El recurs no s'ha trobat en l'arxiu de recursos"); perror("El recurs no s'ha trobat en l'arxiu de recursos");
exit(1); exit(1);
} }

View File

@@ -36,9 +36,9 @@ int main(int argc, char *argv[])
SDL_Init(SDL_INIT_EVERYTHING); SDL_Init(SDL_INIT_EVERYTHING);
game::init();
input::init(); input::init();
audio::init(); audio::init();
game::init();
static unsigned int current_ticks = SDL_GetTicks(); static unsigned int current_ticks = SDL_GetTicks();
@@ -82,5 +82,9 @@ int main(int argc, char *argv[])
current_ticks = SDL_GetTicks(); current_ticks = SDL_GetTicks();
} }
} }
audio::quit();
draw::quit();
return 0; return 0;
} }

View File

@@ -1,6 +1,7 @@
#include "jinput.h" #include "jinput.h"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "jdraw.h" #include "jdraw.h"
#include "jfile.h"
namespace input namespace input
{ {
@@ -15,6 +16,11 @@ namespace input
void initGamePad() void initGamePad()
{ {
int size;
char *buffer = file::getFileBuffer("gamecontrollerdb.txt", size);
if (SDL_GameControllerAddMappingsFromRW(SDL_RWFromMem(buffer, size), 1) < 0) printf("No s'ha pogut carregar el gamecontrollersdb.txt\n");
free(buffer);
const int num_joysticks = SDL_NumJoysticks(); const int num_joysticks = SDL_NumJoysticks();
if (num_joysticks>=1) { if (num_joysticks>=1) {
for (int i=0; i<num_joysticks; ++i) { for (int i=0; i<num_joysticks; ++i) {

View File

@@ -8,7 +8,7 @@ namespace util
{ {
char lowercase[255]; char lowercase[255];
strcpy(lowercase, value); strcpy(lowercase, value);
for (int i=0; i<strlen(value);++i) lowercase[i]=tolower(value[i]); for (int i=0; i<(int)strlen(value);++i) lowercase[i]=tolower(value[i]);
const int max_size = strings.size()<values.size()?strings.size():values.size(); const int max_size = strings.size()<values.size()?strings.size():values.size();
for (int i=0;i<max_size;++i) for (int i=0;i<max_size;++i)

View File

@@ -2,6 +2,7 @@
#include "jgame.h" #include "jgame.h"
#include "controller.h" #include "controller.h"
#include "jdraw.h" #include "jdraw.h"
#include "jaudio.h"
#include "actor.h" #include "actor.h"
#include "room.h" #include "room.h"
#include "config.h" #include "config.h"
@@ -15,6 +16,7 @@ namespace modules
void init() void init()
{ {
audio::playMusic("mus_gameover.ogg", 0);
if (gat == nullptr) gat = actor::createFromTemplate("GAT-NEGRE"); if (gat == nullptr) gat = actor::createFromTemplate("GAT-NEGRE");
} }

View File

@@ -29,10 +29,10 @@ namespace modules
actor::actor_t *sel = actor::getSelected(); actor::actor_t *sel = actor::getSelected();
if (input::keyDown(SDL_SCANCODE_UP)) if (!ctrl) sel->bmp_rect.y--; else sel->bmp_rect.h--; if (input::keyDown(SDL_SCANCODE_UP)) { if (!ctrl) sel->bmp_rect.y--; else sel->bmp_rect.h--; }
if (input::keyDown(SDL_SCANCODE_DOWN)) if (!ctrl) sel->bmp_rect.y++; else sel->bmp_rect.h++; if (input::keyDown(SDL_SCANCODE_DOWN)) { if (!ctrl) sel->bmp_rect.y++; else sel->bmp_rect.h++; }
if (input::keyDown(SDL_SCANCODE_LEFT)) if (!ctrl) sel->bmp_rect.x--; else sel->bmp_rect.w--; if (input::keyDown(SDL_SCANCODE_LEFT)) { if (!ctrl) sel->bmp_rect.x--; else sel->bmp_rect.w--; }
if (input::keyDown(SDL_SCANCODE_RIGHT)) if (!ctrl) sel->bmp_rect.x++; else sel->bmp_rect.w++; if (input::keyDown(SDL_SCANCODE_RIGHT)) { if (!ctrl) sel->bmp_rect.x++; else sel->bmp_rect.w++; }
if (input::mouseBtn(1)) if (input::mouseBtn(1))
{ {

View File

@@ -23,7 +23,8 @@ namespace modules
char *p = buffer; char *p = buffer;
char *n = buffer; char *n = buffer;
while (*n!=0) { while (*n!=0) {
while (*n!='\n') n++; *n=0; while (*n!='\n') n++;
*n=0;
gifs.push_back(p); gifs.push_back(p);
p=++n; p=++n;
} }
@@ -39,7 +40,7 @@ namespace modules
const int x = input::mouseX()/80; const int x = input::mouseX()/80;
const int y = input::mouseY()/80; const int y = input::mouseY()/80;
const int selected = x+y*6; const int selected = x+y*6;
if (selected < gifs.size()) if (selected < (int)gifs.size())
{ {
actor::actor_t* act = actor::getSelected(); actor::actor_t* act = actor::getSelected();
strcpy(act->bmp, gifs[selected].c_str()); strcpy(act->bmp, gifs[selected].c_str());
@@ -54,18 +55,18 @@ namespace modules
const int x = input::mouseX()/80; const int x = input::mouseX()/80;
const int y = input::mouseY()/80; const int y = input::mouseY()/80;
selected = x+y*6; selected = x+y*6;
if (selected >= gifs.size()) selected = -1; if (selected >= (int)gifs.size()) selected = -1;
} }
draw::cls(2); draw::cls(2);
int bx = 0; int bx = 0;
int by = 0; int by = 0;
for (int i=0; i<gifs.size(); ++i) for (int i=0; i<(int)gifs.size(); ++i)
{ {
draw::surface *surf = draw::getSurface(gifs[i].c_str()); draw::surface *surf = draw::getSurface(gifs[i].c_str());
draw::setSource(surf); draw::setSource(surf);
const float aspect = float(surf->w) / float(surf->h); //const float aspect = float(surf->w) / float(surf->h);
const int width = 64.0f*aspect; //const int width = 64.0f*aspect;
draw::draw(2+80*bx, 2+by*80, surf->w, surf->h, 0, 0, 0, 64, 64); draw::draw(2+80*bx, 2+by*80, surf->w, surf->h, 0, 0, 0, 64, 64);
draw::print(gifs[i].c_str(), 2+80*bx + 32 - (gifs[0].size()/2)*4, 70+by*80, LIGHT+WHITE, PAPER); draw::print(gifs[i].c_str(), 2+80*bx + 32 - (gifs[0].size()/2)*4, 70+by*80, LIGHT+WHITE, PAPER);
bx++; if (bx>5) { bx=0; by++; } bx++; if (bx>5) { bx=0; by++; }

View File

@@ -12,7 +12,7 @@ namespace modules
{ {
draw::surface *surf; draw::surface *surf;
vec2_t scroll {0,0}; vec2_t scroll {0,0};
int drawn[64]; int drawn[MAX_ROOMS];
int current_room; int current_room;
int previous_room; int previous_room;
@@ -25,7 +25,7 @@ namespace modules
uint32_t specials; uint32_t specials;
uint8_t editor_done; uint8_t editor_done;
}; };
miniroom_t minirooms[64]; miniroom_t minirooms[MAX_ROOMS];
void drawLines(const int room, const int x, const int y) void drawLines(const int room, const int x, const int y)
{ {
@@ -112,7 +112,7 @@ namespace modules
for (int i=0; i<=ZN; ++i) { for (int i=0; i<=ZN; ++i) {
const int next_room = minirooms[room].exits[i]; const int next_room = minirooms[room].exits[i];
if ( (next_room >= 0) && (next_room <= 64) && (!drawn[next_room]) ) { if ( (next_room >= 0) && (next_room <= MAX_ROOMS) && (!drawn[next_room]) ) {
room::load(next_room); room::load(next_room);
loadMiniRoom(); loadMiniRoom();
} }
@@ -124,14 +124,14 @@ namespace modules
surf = draw::getSurface("mapa.gif"); surf = draw::getSurface("mapa.gif");
scroll = {260,120}; scroll = {260,120};
draw::resetViewport(); draw::resetViewport();
for (int i=0;i<64;++i) drawn[i]=false; for (int i=0;i<MAX_ROOMS;++i) drawn[i]=false;
current_room = room::getCurrent(); current_room = room::getCurrent();
previous_room = current_room; previous_room = current_room;
loadMiniRoom(); loadMiniRoom();
room::load(42); room::load(42);
for (int i=0;i<64;++i) drawn[i]=false; for (int i=0;i<MAX_ROOMS;++i) drawn[i]=false;
draw::cls(2); draw::cls(2);
draw::setSource(surf); draw::setSource(surf);
@@ -140,14 +140,14 @@ namespace modules
for (int y=-1; y<=1; ++y) for (int y=-1; y<=1; ++y)
for (int x=-1; x<=1; ++x) for (int x=-1; x<=1; ++x)
{ {
for (int i=0;i<64;++i) drawn[i]=false; for (int i=0;i<MAX_ROOMS;++i) drawn[i]=false;
drawRoom(room::getCurrent(), scroll.x+x, scroll.y+y, true); drawRoom(room::getCurrent(), scroll.x+x, scroll.y+y, true);
} }
draw::stencil::enable(); draw::stencil::enable();
draw::stencil::clear(255); draw::stencil::clear(255);
for (int i=0;i<64;++i) drawn[i]=false; for (int i=0;i<MAX_ROOMS;++i) drawn[i]=false;
drawRoom(room::getCurrent(), scroll.x, scroll.y); drawRoom(room::getCurrent(), scroll.x, scroll.y);
draw::render(); draw::render();
@@ -165,7 +165,7 @@ namespace modules
//draw::stencil::enable(); //draw::stencil::enable();
//draw::stencil::clear(255); //draw::stencil::clear(255);
//for (int i=0;i<64;++i) drawn[i]=false; //for (int i=0;i<MAX_ROOMS;++i) drawn[i]=false;
//drawRoom(room::getCurrent(), scroll.x, scroll.y); //drawRoom(room::getCurrent(), scroll.x, scroll.y);
const int hover = draw::stencil::query(input::mouseX(), input::mouseY()); const int hover = draw::stencil::query(input::mouseX(), input::mouseY());

View File

@@ -104,9 +104,9 @@ namespace modules
int i = 0; int i = 0;
auto actors = actor::templates::getByCategory(categories[current_category].c_str()); auto actors = actor::templates::getByCategory(categories[current_category].c_str());
if (input::keyPressed(SDL_SCANCODE_X) && (hovered_actor < actors.size())) strcpy(actor_cut, actors[hovered_actor].name); if (input::keyPressed(SDL_SCANCODE_X) && (hovered_actor < (int)actors.size())) strcpy(actor_cut, actors[hovered_actor].name);
if (input::keyPressed(SDL_SCANCODE_W) && (hovered_actor < actors.size()) && actor_cut[0]!=0) if (input::keyPressed(SDL_SCANCODE_W) && (hovered_actor < (int)actors.size()) && actor_cut[0]!=0)
{ {
actor::actor_t *act = actor::templates::getByName(actor_cut); actor::actor_t *act = actor::templates::getByName(actor_cut);
actor::actor_t *other = actor::templates::getByName(actors[hovered_actor].name); actor::actor_t *other = actor::templates::getByName(actors[hovered_actor].name);
@@ -135,12 +135,12 @@ namespace modules
current_category += input::mouseWheel(); current_category += input::mouseWheel();
if (current_category < 0) current_category = categories.size()-1; if (current_category < 0) current_category = categories.size()-1;
if (current_category >= categories.size()) current_category = 0; if (current_category >= (int)categories.size()) current_category = 0;
if (input::mouseClk(1)) if (input::mouseClk(1))
{ {
if (input::mouseY()>12) { if (input::mouseY()>12) {
if (hovered_actor<=actors.size()) { if (hovered_actor <= (int)actors.size()) {
actor::actor_t *new_act = actor::duplicate(&actors[hovered_actor]); actor::actor_t *new_act = actor::duplicate(&actors[hovered_actor]);
actor::setUniqueName(new_act); actor::setUniqueName(new_act);
actor::setDirty(new_act, true); actor::setDirty(new_act, true);
@@ -156,7 +156,7 @@ namespace modules
init_text_edit(); init_text_edit();
} else { } else {
int clicked_category = (input::mouseX()-11)/40; int clicked_category = (input::mouseX()-11)/40;
if (clicked_category<categories.size()) if (clicked_category < (int)categories.size())
{ {
if (input::keyDown(SDL_SCANCODE_LCTRL)) if (input::keyDown(SDL_SCANCODE_LCTRL))
{ {
@@ -171,7 +171,7 @@ namespace modules
else if (input::mouseClk(3)) else if (input::mouseClk(3))
{ {
if (input::mouseX()>12) { if (input::mouseX()>12) {
if (hovered_actor<=actors.size()) { if (hovered_actor <= (int)actors.size()) {
actor_edited = actor::templates::getByName(actors[hovered_actor].name); actor_edited = actor::templates::getByName(actors[hovered_actor].name);
edit_mode = EDITING_ACTOR_NAME; edit_mode = EDITING_ACTOR_NAME;
init_text_edit(); init_text_edit();

View File

@@ -0,0 +1,72 @@
#include "m_intro.h"
#include "jgame.h"
#include "jdraw.h"
#include "jinput.h"
#include "jaudio.h"
#include "controller.h"
#include "config.h"
#include <SDL2/SDL.h>
#include "actor.h"
namespace modules
{
namespace end_prologo_sequence
{
int stage = 0;
uint32_t time = 0;
void init()
{
time = SDL_GetTicks();
stage = 0;
draw::restorecol(2);
draw::cls(2);
draw::swapcol(1, 7);
draw::setSource(draw::getSurface("prologo3.gif"));
draw::draw(96, 28, 128, 96, 0, 0);
draw::print2("ALE! QUE BON", 13, 17, WHITE, FONT_ZOOM_NONE);
draw::print2("TRABAJ HE HECH!", 11, 19, WHITE, FONT_ZOOM_NONE);
draw::render();
if (audio::getCurrentMusic() != "mus_menu.ogg") audio::playMusic("mus_menu.ogg");
actor::templates::load();
}
const bool shouldGoToNext()
{
if (SDL_GetTicks()-time < 1000) return false;
return (SDL_GetTicks()-time > (stage==15||stage==16?10000:5000)) ||
(controller::pressed(KEY_JUMP)) || (controller::pressed(KEY_PICK)) ||
(input::keyPressed(SDL_SCANCODE_SPACE)) || (input::keyPressed(SDL_SCANCODE_RETURN));
}
bool loop()
{
if (controller::pressed(KEY_MENU)) return false;
if (shouldGoToNext())
{
time = SDL_GetTicks();
stage++;
if (stage==2) return false;
switch (stage)
{
case 1:
draw::cls(2);
draw::swapcol(1, 8);
draw::setSource(draw::getSurface("prologo4.gif"));
draw::draw(96, 28, 128, 96, 0, 0);
draw::print2("PERO QUE...?", 12, 17, WHITE, FONT_ZOOM_NONE);
//draw::render();
break;
}
}
draw::render();
return true;
}
}
}

View File

@@ -0,0 +1,10 @@
#pragma once
namespace modules
{
namespace end_prologo_sequence
{
void init();
bool loop();
}
}

166
source/m_end_sequence.cpp Normal file
View File

@@ -0,0 +1,166 @@
#include "m_intro.h"
#include "jgame.h"
#include "jdraw.h"
#include "jinput.h"
#include "jaudio.h"
#include "controller.h"
#include "config.h"
#include <SDL2/SDL.h>
#include "actor.h"
namespace modules
{
namespace end_sequence
{
int stage = 0;
uint32_t time = 0;
actor::actor_t *act = nullptr;
const char *actor_names[] = {"JAILDESIGNER", "BATMAN", "ROBIN", "EL ALTRE BATMAN", "EL ABAD", "LA ROOMBA", "EL OBRER", "BAMBOLLA DE CAFE", "EL YONKI", "LA PILOTA", "SAM", "LORD ABAD"};
const char *actor_ids[] = {"JAILDES", "GAT-BATMAN", "GAT-ROBIN", "BATMAN", "ABAD", "ROOMBA2", "OBRER", "COFFEE", "YONKI", "PILOTA", "SAM", "LORD-ABAD"};
char time_text[7] = " 00:00";
void init(bool go_direct_to_credits)
{
stage = go_direct_to_credits ? 2 : 0;
time = SDL_GetTicks();
if (go_direct_to_credits) time += 5000;
draw::restorecol(2);
draw::cls(2);
draw::swapcol(1, 7);
draw::setSource(draw::getSurface("end1.gif"));
draw::draw(96, 28, 128, 96, 0, 0);
draw::print2("PER FI! JA PUC", 13, 17, WHITE, FONT_ZOOM_NONE);
draw::print2("TASTAR LA PISCINA!", 11, 19, WHITE, FONT_ZOOM_NONE);
draw::render();
if (audio::getCurrentMusic() != "mus_menu.ogg") audio::playMusic("mus_menu.ogg");
actor::templates::load();
int milliseconds = SDL_GetTicks()-actor::stats::getStartTime();
int seconds = milliseconds/1000;
int minutes = seconds / 60;
seconds = seconds % 60;
time_text[0] = minutes<100 ? ' ' : (minutes/100)+48;
time_text[1] = minutes<10 ? ' ' : ((minutes%100)/10)+48;
time_text[2] = (minutes%10)+48;
time_text[4] = (seconds/10)+48;
time_text[5] = (seconds%10)+48;
time_text[6] = 0;
}
const bool shouldGoToNext()
{
if (SDL_GetTicks()-time < 1000) return false;
return (SDL_GetTicks()-time > (stage==15||stage==16?10000:5000)) ||
(controller::pressed(KEY_JUMP)) || (controller::pressed(KEY_PICK)) ||
(input::keyPressed(SDL_SCANCODE_SPACE)) || (input::keyPressed(SDL_SCANCODE_RETURN));
}
void drawActorAt(const char* name, const int x, const int y)
{
draw::swapcol(1,YELLOW);
actor::actor_t *act = actor::createFromTemplate(name);
//act->flags &= ~FLAG_SPECIAL;
actor::drawAt(act, x, y); actor::remove(act);
}
bool loop()
{
if (controller::pressed(KEY_MENU)) return false;
if (shouldGoToNext())
{
time = SDL_GetTicks();
stage++;
if ( (stage==2) && (config::isProgoloDesbloquejat()) ) stage++;
if (stage == 17) return false;
switch (stage)
{
case 1:
draw::cls(2);
draw::swapcol(1, 8);
draw::setSource(draw::getSurface("end2.gif"));
draw::draw(96, 28, 128, 96, 0, 0);
draw::print2("PUTA, QUE GUST...", 12, 17, WHITE, FONT_ZOOM_NONE);
//draw::render();
break;
case 2:
draw::cls(2);
draw::swapcol(1, 8);
draw::setSource(draw::getSurface("end2.gif"));
draw::draw(96, 28, 128, 96, 0, 0);
draw::print2("LLASTIMA QUE ENCARA", 11, 17, WHITE, FONT_ZOOM_NONE);
draw::print2("NO HE TROBAT TOTES", 11, 19, WHITE, FONT_ZOOM_NONE);
draw::print2("LES ANBERNICS...", 13, 21, WHITE, FONT_ZOOM_NONE);
//draw::render();
break;
case 3: case 4: case 5: case 6: case 7: case 8:
case 9: case 10: case 11: case 12: case 13: case 14:
::game::setUpdateTicks(64);
if (act) actor::remove(act);
act = actor::createFromTemplate(actor_ids[stage-3]);
act->flags &= ~FLAG_MOVING;
break;
case 15:
if (act) actor::remove(act);
act = actor::createFromTemplate("GAT-BATMAN");
act->flags &= ~FLAG_MOVING;
break;
case 16:
if (act) actor::remove(act);
break;
}
}
switch (stage)
{
case 3: case 4: case 5: case 6: case 7: case 8:
case 9: case 10: case 11: case 12: case 13: case 14:
{
draw::cls(2);
draw::print2("THE POOL", 16, 3, TEAL, FONT_ZOOM_VERTICAL);
draw::swapcol(1,YELLOW);
actor::update(act, false);
actor::drawAt(act, 148, 100);
const int x = 160-strlen(actor_names[stage-3])*2;
draw::print(actor_names[stage-3], x, 145, WHITE, PAPER);
draw::print2("(C) JAILDOCTOR 2024", 11, 28, TEAL, FONT_ZOOM_NONE);
break;
}
case 15:
{
draw::cls(2);
draw::swapcol(1,GREEN);
actor::update(act, false);
actor::drawAt(act, 148, 100);
const int x = 160-strlen("DEDICAT A BATMAN")*2;
draw::print("DEDICAT A BATMAN", x, 145, WHITE, PAPER);
break;
}
case 16:
draw::cls(2);
draw::print2("GRACIES PER JUGAR!", 11, 9, PURPLE, FONT_ZOOM_VERTICAL);
draw::print2(actor::stats::getRoomsVisited(), 2, 8, 14, TEAL, FONT_ZOOM_NONE);
draw::print2("HABITACIONS VISITADES", 11, 14, GREEN, FONT_ZOOM_NONE);
draw::print2(actor::stats::getLivesLost(), 2, 11, 16, TEAL, FONT_ZOOM_NONE);
draw::print2("VIDES PERDUDES", 14, 16, GREEN, FONT_ZOOM_NONE);
draw::print2(time_text, 11, 18, TEAL, FONT_ZOOM_NONE);
draw::print2("TEMPS TOTAL", 18, 18, GREEN, FONT_ZOOM_NONE);
break;
}
draw::render();
return true;
}
}
}

10
source/m_end_sequence.h Normal file
View File

@@ -0,0 +1,10 @@
#pragma once
namespace modules
{
namespace end_sequence
{
void init(bool go_direct_to_credits=false);
bool loop();
}
}

View File

@@ -9,6 +9,8 @@
#include "jutil.h" #include "jutil.h"
#include "jaudio.h" #include "jaudio.h"
#include "config.h" #include "config.h"
#include "controller.h"
namespace modules namespace modules
{ {
namespace game namespace game
@@ -20,8 +22,9 @@ namespace modules
vec2_t floating_position = {3,3}; vec2_t floating_position = {3,3};
void init() void init(const bool prologo)
{ {
actor::hero::setPrologo(prologo);
actor::clear(true); actor::clear(true);
::game::setUpdateTicks(64); ::game::setUpdateTicks(64);
actor::templates::load(); actor::templates::load();
@@ -42,15 +45,11 @@ namespace modules
} }
fclose(f); fclose(f);
} else { } else {
if (config::isMusicEnabled()) audio::playMusic("mus_ingame.ogg");
{
auto musica = audio::loadMusic("ingame.ogg");
audio::playMusic(musica);
}
} }
actor::hero::init(); actor::hero::init();
room::load(0); room::load(actor::hero::isPrologo()?64:0);
} }
void print(int x, int y, int num) void print(int x, int y, int num)
@@ -290,18 +289,50 @@ namespace modules
return section; return section;
} }
char missatge[255] = "";
void mostra_missatge()
{
if ( (controller::pressed(KEY_MENU)) || (controller::pressed(KEY_PICK)) || (controller::pressed(KEY_JUMP)) )
{
missatge[0] = 0;
return;
}
draw::color(BLACK);
draw::fillrect(56, 68, 208, 48);
draw::color(WHITE);
draw::rect(56, 68, 208, 48);
char text[2][25];
int i=0, j=0, k=0;
while (missatge[i]!=0)
{
if (missatge[i]=='-') { text[k][j]=0; i++; j=0; k++; }
text[k][j] = missatge[i];
i++; j++;
}
text[k][j]=0;
draw::print2(text[0], 8, 10, WHITE, FONT_ZOOM_NONE);
draw::print2(text[1], 8, 12, WHITE, FONT_ZOOM_NONE);
draw::render();
}
int loop() int loop()
{ {
if (missatge[0] != 0) { mostra_missatge(); return GAME_NONE; }
int return_value = GAME_NONE; int return_value = GAME_NONE;
if (actor::hero::isDead()) return GAME_DEAD; if (actor::hero::isDead()) return GAME_DEAD;
if (input::keyPressed(SDL_SCANCODE_ESCAPE)) if (controller::pressed(KEY_MENU))
{ {
if (console::isEnabled()) { if (console::isEnabled()) {
console::toggle(); console::toggle();
} else { } else {
if (room::editor::isModified()) room::editor::save(); if (room::editor::isModified()) room::editor::save();
actor::pauseWalkSound();
return GAME_MENU; return GAME_MENU;
} }
} }
@@ -323,6 +354,8 @@ namespace modules
{ {
actor::update(actor::getFirst()); actor::update(actor::getFirst());
actor::hero::useBoostGod(); actor::hero::useBoostGod();
if ( (actor::hero::getParts()==0x3f) && (room::getCurrent()==45) ) return GAME_END;
if ( (actor::hero::getNumPrologoObjectsDone()==4) && (room::getCurrent()==64) ) return GAME_PROLOGO_END;
} }
} }
@@ -337,7 +370,9 @@ namespace modules
room::draw(); room::draw();
actor::actor_t *selected = actor::getSelected(); actor::actor_t *selected = actor::getSelected();
if (editor::isDevMode() && selected && input::keyPressed(SDL_SCANCODE_M)) actor::setFloatingEditing(true); const bool inside_room_zone = (draw::getLocalX(input::mouseX())>=0 && draw::getLocalY(input::mouseY())>=0 && draw::getLocalX(input::mouseX())<320 && draw::getLocalY(input::mouseY())<240);
if (editor::isDevMode() && selected && inside_room_zone && input::keyPressed(SDL_SCANCODE_M)) actor::setFloatingEditing(true);
if (editor::isDevMode() && actor::getFloatingEditing() && selected) { if (editor::isDevMode() && actor::getFloatingEditing() && selected) {
draw::swapcol(1, GREEN+LIGHT); draw::swapcol(1, GREEN+LIGHT);
@@ -394,45 +429,64 @@ namespace modules
draw::print2("no", 4, 25, col3, FONT_ZOOM_NONE); draw::print2("no", 4, 25, col3, FONT_ZOOM_NONE);
draw::print2(actor::hero::getLives(), 2, 4, 26, col1, FONT_ZOOM_VERTICAL); draw::print2(actor::hero::getLives(), 2, 4, 26, col1, FONT_ZOOM_VERTICAL);
draw::print2("a", 9, 26, col1, FONT_ZOOM_NONE); if (!actor::hero::isPrologo())
draw::print2("b", 12, 26, col2, FONT_ZOOM_NONE);
draw::print2("c", 15, 26, col3, FONT_ZOOM_NONE);
draw::print2(actor::hero::getBoostJump(), 2, 8, 27, col3, FONT_ZOOM_NONE);
draw::print2(actor::hero::getBoostGod()/2, 2, 11, 27, col1, FONT_ZOOM_NONE);
draw::print2(actor::hero::getBoostRun()/2, 2, 14, 27, col2, FONT_ZOOM_NONE);
draw::stencil::enable();
draw::stencil::clear(255);
draw::setSource(draw::getSurface("objectes.gif"));
draw::stencil::set(SKILL_SHOES);
draw::swapcol(1, actor::hero::getSkills()&SKILL_SHOES ? col1 : col3);
draw::draw(276,166, 28, 22, 162, 0);
draw::stencil::set(SKILL_PANTS);
draw::swapcol(1, actor::hero::getSkills()&SKILL_PANTS ? col1 : col3);
draw::draw(250,183, 18, 23, 167, 22);
draw::stencil::set(SKILL_GLOVES);
draw::swapcol(1, actor::hero::getSkills()&SKILL_GLOVES ? col1 : col3);
draw::draw(222,200, 21, 22, 165, 45);
draw::stencil::set(SKILL_BAG);
draw::swapcol(1, actor::hero::getSkills()&SKILL_BAG ? col1 : col3);
draw::draw(279,200, 20, 25, 145, 41);
draw::stencil::disable();
// Si estem en el editor, fent click en els skills del marcador els obtenim
if (editor::isDevMode() && input::mouseClk(1))
{ {
const uint8_t val = draw::stencil::query(input::mouseX(), input::mouseY()); draw::print2("a", 9, 26, col1, FONT_ZOOM_NONE);
if (val != 255) draw::print2("b", 12, 26, col2, FONT_ZOOM_NONE);
draw::print2("c", 15, 26, col3, FONT_ZOOM_NONE);
draw::print2(actor::hero::getBoostJump(), 2, 8, 27, col3, FONT_ZOOM_NONE);
draw::print2(actor::hero::getBoostGod()/2, 2, 11, 27, col1, FONT_ZOOM_NONE);
draw::print2(actor::hero::getBoostRun()/2, 2, 14, 27, col2, FONT_ZOOM_NONE);
draw::stencil::enable();
draw::stencil::clear(255);
draw::setSource(draw::getSurface("objectes.gif"));
draw::stencil::set(SKILL_SHOES);
draw::swapcol(1, actor::hero::getSkills()&SKILL_SHOES ? col1 : col3);
draw::draw(276,166, 28, 22, 162, 0);
draw::stencil::set(SKILL_PANTS);
draw::swapcol(1, actor::hero::getSkills()&SKILL_PANTS ? col1 : col3);
draw::draw(250,183, 18, 23, 167, 22);
draw::stencil::set(SKILL_GLOVES);
draw::swapcol(1, actor::hero::getSkills()&SKILL_GLOVES ? col1 : col3);
draw::draw(222,200, 21, 22, 165, 45);
draw::stencil::set(SKILL_BAG);
draw::swapcol(1, actor::hero::getSkills()&SKILL_BAG ? col1 : col3);
draw::draw(279,200, 20, 25, 145, 41);
draw::stencil::disable();
// Si estem en el editor, fent click en els skills del marcador els obtenim
if (editor::isDevMode() && input::mouseClk(1))
{ {
if (actor::hero::getSkills() & val) const uint8_t val = draw::stencil::query(input::mouseX(), input::mouseY());
actor::hero::dropSkill(val); if (val != 255)
else {
actor::hero::giveSkill(val); if (actor::hero::getSkills() & val)
actor::hero::dropSkill(val);
room::cycleColor(1); else
actor::hero::giveSkill(val);
room::cycleColor(1);
}
}
} else if (actor::hero::isCarryingPrologoObject())
{
draw::setSource(draw::getSurface("objectes.gif"));
if (actor::hero::getPrologoObjectState(PROLOGO_SHOES)==PROLOGO_OBJECT_PICKED)
{
draw::draw(276,166, 28, 22, 162, 0);
} else if (actor::hero::getPrologoObjectState(PROLOGO_PANTS)==PROLOGO_OBJECT_PICKED)
{
draw::draw(276,166, 18, 23, 167, 22);
} else if (actor::hero::getPrologoObjectState(PROLOGO_GLOVES)==PROLOGO_OBJECT_PICKED)
{
draw::draw(276,166, 21, 22, 165, 45);
} else if (actor::hero::getPrologoObjectState(PROLOGO_BAG)==PROLOGO_OBJECT_PICKED)
{
draw::draw(276,166, 20, 25, 145, 41);
} }
} }
} }
@@ -551,7 +605,7 @@ namespace modules
int mx = draw::getLocalX(input::mouseX()); int mx = draw::getLocalX(input::mouseX());
int my = draw::getLocalY(input::mouseY()); int my = draw::getLocalY(input::mouseY());
const bool btnDown = input::mouseBtn(1) || input::mouseBtn(3); //const bool btnDown = input::mouseBtn(1) || input::mouseBtn(3);
const bool btnClk = input::mouseClk(1) || input::mouseClk(3); const bool btnClk = input::mouseClk(1) || input::mouseClk(3);
if (mx>=0 && mx <=100 && my>=0 && my<=221) if (mx>=0 && mx <=100 && my>=0 && my<=221)
@@ -665,8 +719,7 @@ namespace modules
} }
draw::setViewport(420, 15, 100, 225); draw::setViewport(420, 15, 100, 225);
mx = draw::getLocalX(input::mouseX());
my = draw::getLocalY(input::mouseY());
bool changed = false; bool changed = false;
@@ -739,27 +792,27 @@ namespace modules
ui::label("EXITS", 2, line, 96, 11, GRAY); line+=10; ui::label("EXITS", 2, line, 96, 11, GRAY); line+=10;
ui::label("XN", 2, line, 48, 11); ui::label("XN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(XN), -1, 64, 36); changed |= btn_small(48, line, room::editor::refExit(XN), -1, MAX_ROOMS, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(XN), XP); if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(XN), XP);
line += 10; line += 10;
ui::label("YP", 2, line, 48, 11); ui::label("YP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(YP), -1, 64, 36); changed |= btn_small(48, line, room::editor::refExit(YP), -1, MAX_ROOMS, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(YP), YN); if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(YP), YN);
line += 10; line += 10;
ui::label("XP", 2, line, 48, 11); ui::label("XP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(XP), -1, 64, 36); changed |= btn_small(48, line, room::editor::refExit(XP), -1, MAX_ROOMS, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(XP), XN); if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(XP), XN);
line += 10; line += 10;
ui::label("YN", 2, line, 48, 11); ui::label("YN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(YN), -1, 64, 36); changed |= btn_small(48, line, room::editor::refExit(YN), -1, MAX_ROOMS, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(YN), YP); if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(YN), YP);
line += 10; line += 10;
ui::label("ZP", 2, line, 48, 11); ui::label("ZP", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(ZP), -1, 64, 36); changed |= btn_small(48, line, room::editor::refExit(ZP), -1, MAX_ROOMS, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(ZP), ZN); if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(ZP), ZN);
line += 10; line += 10;
ui::label("ZN", 2, line, 48, 11); ui::label("ZN", 2, line, 48, 11);
changed |= btn_small(48, line, room::editor::refExit(ZN), -1, 64, 36); changed |= btn_small(48, line, room::editor::refExit(ZN), -1, MAX_ROOMS, 36);
if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(ZN), ZP); if (ui::button("GO", 84, line, 13, 11)) room::load(room::editor::refExit(ZN), ZP);
line += 10; line += 10;
@@ -821,6 +874,9 @@ namespace modules
changed = true; changed = true;
} }
*/ */
mx = draw::getLocalX(input::mouseX());
my = draw::getLocalY(input::mouseY());
line+=10; line+=10;
ui::label("POS", 2, line, 48, 11); ui::label("POS", 2, line, 48, 11);
if (input::mouseClk(1) && mx>=2 && mx <=48 && my>=line && my<=line+10) return_value = GAME_EDITOR_BITMAP_POS; if (input::mouseClk(1) && mx>=2 && mx <=48 && my>=line && my<=line+10) return_value = GAME_EDITOR_BITMAP_POS;
@@ -895,8 +951,8 @@ namespace modules
draw::color(PAPER); draw::color(PAPER);
draw::rect(2, 0, 96, 204); draw::rect(2, 0, 96, 204);
if (ui::button("DUPLICATE", 2, line, 48, 11) || input::keyPressed(SDL_SCANCODE_D)) if (ui::button("DUPLICATE", 2, line, 48, 11) || ( input::keyPressed(SDL_SCANCODE_D) && inside_room_zone))
{ {
actor::actor_t *new_act = actor::duplicate(act); actor::actor_t *new_act = actor::duplicate(act);
actor::setUniqueName(new_act); actor::setUniqueName(new_act);
@@ -906,7 +962,7 @@ namespace modules
actor::setFloatingEditing(true); actor::setFloatingEditing(true);
changed = true; changed = true;
} }
if (ui::button("DELETE", 48, line, 48, 11) || input::keyPressed(SDL_SCANCODE_DELETE)) if (ui::button("DELETE", 48, line, 48, 11) || ( input::keyPressed(SDL_SCANCODE_DELETE) && inside_room_zone))
{ {
actor::remove(act); actor::remove(act);
act = nullptr; act = nullptr;
@@ -930,5 +986,11 @@ namespace modules
return return_value; return return_value;
} }
void setMissatge(const char *text)
{
strcpy(missatge, text);
}
} }
} }

View File

@@ -15,15 +15,19 @@ namespace modules
#define GAME_EDITOR_BITMAP_FILE 5 #define GAME_EDITOR_BITMAP_FILE 5
#define GAME_EDITOR_BITMAP_POS 6 #define GAME_EDITOR_BITMAP_POS 6
#define GAME_EDITOR_BITMAP_SIZE 7 #define GAME_EDITOR_BITMAP_SIZE 7
#define GAME_END 8
#define GAME_PROLOGO_END 9
enum sections { SECTION_GENERAL, SECTION_ROOM, SECTION_ACTOR }; enum sections { SECTION_GENERAL, SECTION_ROOM, SECTION_ACTOR };
void init(); void init(const bool prologo=false);
int loop(); int loop();
void setSection(int value); void setSection(int value);
const int getSection(); const int getSection();
std::vector<std::string> getGifs(); std::vector<std::string> getGifs();
void setMissatge(const char *text);
} }
} }

View File

@@ -2,6 +2,7 @@
#include "jgame.h" #include "jgame.h"
#include "controller.h" #include "controller.h"
#include "jdraw.h" #include "jdraw.h"
#include "jaudio.h"
#include "actor.h" #include "actor.h"
#include "room.h" #include "room.h"
#include "config.h" #include "config.h"
@@ -16,7 +17,14 @@ namespace modules
void init() void init()
{ {
if (heroi == nullptr) heroi = actor::create("HERO", {16,32,8}, {6,6,12}, "test.gif", {0,32,20,32}, {-6,38}); if (audio::getCurrentMusic() != "mus_gameover.ogg") audio::playMusic("mus_gameover.ogg", 0);
if (heroi) actor::remove(heroi);
if (actor::hero::isPrologo()) {
heroi = actor::create("HERO", {16, 32, 0}, {6, 6, 8}, "gat.gif", {0, 0, 24, 28}, {-4, 32});
} else {
heroi = actor::create("HERO", {16,32,8}, {6,6,12}, "test.gif", {0,32,20,32}, {-6,38});
}
heroi->flags = FLAG_ANIMATED; heroi->flags = FLAG_ANIMATED;
int milliseconds = SDL_GetTicks()-actor::stats::getStartTime(); int milliseconds = SDL_GetTicks()-actor::stats::getStartTime();
@@ -47,8 +55,16 @@ namespace modules
draw::print2("GAME OVER", 15, 7, YELLOW, FONT_ZOOM_VERTICAL); draw::print2("GAME OVER", 15, 7, YELLOW, FONT_ZOOM_VERTICAL);
draw::print2(actor::stats::getNumPartsCollected(), 2, 11, 12, TEAL, FONT_ZOOM_NONE); if (actor::hero::isPrologo())
draw::print2("PARTS TROBADES", 14, 12, GREEN, FONT_ZOOM_NONE); {
int num_objectes = 0;
for (int i=0;i<4;++i) if (actor::hero::getPrologoObjectState(i)==PROLOGO_OBJECT_LEFT) num_objectes++;
draw::print2(num_objectes, 2, 11, 12, TEAL, FONT_ZOOM_NONE);
draw::print2("OBJECTES DEJATS", 14, 12, GREEN, FONT_ZOOM_NONE);
} else {
draw::print2(actor::stats::getNumPartsCollected(), 2, 11, 12, TEAL, FONT_ZOOM_NONE);
draw::print2("PARTS TROBADES", 14, 12, GREEN, FONT_ZOOM_NONE);
}
draw::print2(actor::stats::getRoomsVisited(), 2, 8, 14, TEAL, FONT_ZOOM_NONE); draw::print2(actor::stats::getRoomsVisited(), 2, 8, 14, TEAL, FONT_ZOOM_NONE);
draw::print2("HABITACIONS VISITADES", 11, 14, GREEN, FONT_ZOOM_NONE); draw::print2("HABITACIONS VISITADES", 11, 14, GREEN, FONT_ZOOM_NONE);

View File

@@ -3,6 +3,7 @@
#include "jinput.h" #include "jinput.h"
#include "controller.h" #include "controller.h"
#include "jdraw.h" #include "jdraw.h"
#include "jaudio.h"
#include "actor.h" #include "actor.h"
#include "room.h" #include "room.h"
#include "config.h" #include "config.h"
@@ -12,15 +13,18 @@ namespace modules
{ {
namespace ingame namespace ingame
{ {
draw::surface *surf; //draw::surface *surf;
int selected_option = INGAME_CONTINUAR; int selected_option = INGAME_CONTINUAR;
actor::actor_t *parts[6] = {nullptr,nullptr,nullptr,nullptr,nullptr,nullptr}; actor::actor_t *parts[6] = {nullptr,nullptr,nullptr,nullptr,nullptr,nullptr};
actor::actor_t *anbernic = nullptr;
int num_anbernics = 0;
void init() void init()
{ {
num_anbernics = actor::hero::getNumAmbernicsCollected();
selected_option = INGAME_CONTINUAR; selected_option = INGAME_CONTINUAR;
surf = draw::getSurface("objectes.gif"); //surf = draw::getSurface("objectes.gif");
if (parts[0]==nullptr) if (parts[0]==nullptr)
{ {
parts[0] = actor::createFromTemplate("P-ELBOW"); parts[0] = actor::createFromTemplate("P-ELBOW");
@@ -63,32 +67,60 @@ namespace modules
parts[5]->inner_x=96+16; parts[5]->inner_x=96+16;
parts[5]->inner_y=69+8; parts[5]->inner_y=69+8;
} }
if (anbernic==nullptr)
{
anbernic = actor::createFromTemplate("ANBERNIC");
anbernic->flags=0;
anbernic->inner_x=252;
anbernic->inner_y=76;
}
} }
int loop() int loop()
{ {
if (input::keyPressed(SDL_SCANCODE_ESCAPE)) { if (controller::pressed(KEY_MENU)) {
return INGAME_CONTINUAR; return INGAME_CONTINUAR;
} }
if (controller::pressed(KEY_DOWN)) if (controller::pressed(KEY_DOWN) || input::keyPressed(SDL_SCANCODE_DOWN))
{
selected_option = (selected_option+1)&1; selected_option = (selected_option+1)&1;
if (controller::pressed(KEY_UP)) audio::playSound("snd_push.wav", SOUND_BASIC);
}
if (controller::pressed(KEY_UP) || input::keyPressed(SDL_SCANCODE_UP))
{
selected_option = (selected_option-1)&1; selected_option = (selected_option-1)&1;
if (controller::pressed(KEY_JUMP) || controller::pressed(KEY_PICK)) { audio::playSound("snd_push.wav", SOUND_BASIC);
}
if (controller::pressed(KEY_JUMP) || controller::pressed(KEY_PICK) || input::keyPressed(SDL_SCANCODE_RETURN))
{
audio::playSound("snd_push.wav", SOUND_BASIC);
if (selected_option==INGAME_EIXIR)
{
for (int i=0; i<6; ++i) { actor::remove(parts[i]); parts[i]=nullptr;}
actor::remove(anbernic); anbernic=nullptr;
}
return selected_option; return selected_option;
} }
draw::cls(2); draw::cls(2);
draw::color(1); draw::color(1);
draw::setSource(surf); //draw::setSource(surf);
static int part[6] = { PART_ELBOW, PART_PIPE, PART_SALT, PART_FILTER, PART_PUMP, PART_TIMER}; static int part[6] = { PART_ELBOW, PART_PIPE, PART_SALT, PART_FILTER, PART_PUMP, PART_TIMER};
for (int i=0;i<6;++i) for (int i=0;i<6;++i)
{ {
draw::swapcol(1, room::getColor((actor::hero::getParts() & part[i])?1:3)); draw::swapcol(1, room::getColor((actor::hero::getParts() & part[i])?1:3));
actor::drawAt(parts[i], parts[i]->inner_x, parts[i]->inner_y); actor::drawAt(parts[i], parts[i]->inner_x, parts[i]->inner_y);
} }
if (num_anbernics>0)
{
draw::restorecol(1);
actor::drawAt(anbernic, anbernic->inner_x, anbernic->inner_y);
char count[] = " 0/10";
count[1] = (num_anbernics%10)+48;
if (num_anbernics==10) count[0]='1';
draw::print2(count, 30, 12, WHITE, FONT_ZOOM_NONE);
}
draw::print2("PAUSA", 17, 3, TEAL, FONT_ZOOM_VERTICAL); draw::print2("PAUSA", 17, 3, TEAL, FONT_ZOOM_VERTICAL);

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