Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
openjazz
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PocketInsanity
openjazz
Commits
40768f56
Commit
40768f56
authored
Apr 06, 2010
by
alistert
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added new font. More work on bonus levels.
parent
30bfea2a
Changes
25
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
765 additions
and
439 deletions
+765
-439
OpenJazz.h
src/OpenJazz.h
+52
-32
baselevel.cpp
src/baselevel.cpp
+29
-0
baselevel.h
src/baselevel.h
+13
-1
bonus.cpp
src/bonus/bonus.cpp
+232
-96
bonus.h
src/bonus/bonus.h
+7
-3
game.cpp
src/game/game.cpp
+99
-44
game.h
src/game/game.h
+1
-1
gamemode.cpp
src/game/gamemode.cpp
+3
-3
font.cpp
src/io/gfx/font.cpp
+115
-26
font.h
src/io/gfx/font.h
+5
-2
sprite.cpp
src/io/gfx/sprite.cpp
+7
-1
video.cpp
src/io/gfx/video.cpp
+19
-0
video.h
src/io/gfx/video.h
+7
-6
demolevel.cpp
src/level/demolevel.cpp
+1
-1
level.cpp
src/level/level.cpp
+35
-72
level.h
src/level/level.h
+0
-11
levelframe.cpp
src/level/levelframe.cpp
+26
-11
levelload.cpp
src/level/levelload.cpp
+9
-32
main.cpp
src/main.cpp
+49
-45
mainmenu.cpp
src/menu/mainmenu.cpp
+2
-2
player.cpp
src/player/player.cpp
+9
-0
player.h
src/player/player.h
+2
-1
scene.cpp
src/scene/scene.cpp
+16
-14
scene.h
src/scene/scene.h
+14
-12
sceneload.cpp
src/scene/sceneload.cpp
+13
-23
No files found.
src/OpenJazz.h
View file @
40768f56
...
@@ -70,41 +70,61 @@
...
@@ -70,41 +70,61 @@
#define LEVEL_FILE "openjazz.tmp"
#define LEVEL_FILE "openjazz.tmp"
#ifdef UPPERCASE_FILENAMES
#ifdef UPPERCASE_FILENAMES
#define F_MAINCHAR "MAINCHAR.000"
#define F_FONTS "FONTS.000"
#define F_MENU "MENU.000"
#define F_MAINCHAR "MAINCHAR.000"
#define F_PANEL "PANEL.000"
#define F_MENU "MENU.000"
#define F_SOUNDS "SOUNDS.000"
#define F_PANEL "PANEL.000"
#define F_BONUS "BONUS.000"
#define F_SOUNDS "SOUNDS.000"
#define F_BONUS "BONUS.000"
#define F_STARTUP_0SC "STARTUP.0SC"
#define F_END_0SC "END.0SC"
#define F_BONUS_0SC "BONUS.0SC"
#define F_END_0SC "END.0SC"
#define F_MACRO "MACRO.2"
#define F_INSTRUCT_0SC "INSTRUCT.0SC"
#define F_ORDER_0SC "ORDER.0SC"
#define F_STARTUP_0SC "STARTUP.0SC"
#define F_MACRO "MACRO.2"
#define F_FONT2_0FN "FONT2.0FN"
#define F_FONTBIG_0FN "FONTBIG.0FN"
#define F_FONTINY_0FN "FONTINY.0FN"
#define F_FONTMN1_0FN "FONTMN1.0FN"
#define F_FONTMN2_0FN "FONTMN2.0FN"
// File path prefixes
// File path prefixes
#define F_BLOCKS "BLOCKS"
#define F_BLOCKS
"BLOCKS"
#define F_BONUSMAP "BONUSMAP"
#define F_BONUSMAP
"BONUSMAP"
#define F_LEVEL "LEVEL"
#define F_LEVEL
"LEVEL"
#define F_PLANET "PLANET"
#define F_PLANET
"PLANET"
#define F_SPRITES "SPRITES"
#define F_SPRITES
"SPRITES"
#else
#else
#define F_MAINCHAR "mainchar.000"
#define F_FONTS "fonts.000"
#define F_MENU "menu.000"
#define F_MAINCHAR "mainchar.000"
#define F_PANEL "panel.000"
#define F_MENU "menu.000"
#define F_SOUNDS "sounds.000"
#define F_PANEL "panel.000"
#define F_BONUS "bonus.000"
#define F_SOUNDS "sounds.000"
#define F_BONUS "bonus.000"
#define F_STARTUP_0SC "startup.0sc"
#define F_END_0SC "end.0sc"
#define F_BONUS_0SC "bonus.0sc"
#define F_END_0SC "end.0sc"
#define F_MACRO "macro.2"
#define F_INSTRUCT_0SC "instruct.0SC"
#define F_ORDER_0SC "order.0SC"
#define F_STARTUP_0SC "startup.0sc"
#define F_MACRO "macro.2"
#define F_FONT2_0FN "font2.0fn"
#define F_FONTBIG_0FN "fontbig.0fn"
#define F_FONTINY_0FN "fontiny.0fn"
#define F_FONTMN1_0FN "fontmn1.0fn"
#define F_FONTMN2_0FN "fontmn2.0fn"
// File path prefixes
// File path prefixes
#define F_BLOCKS "blocks"
#define F_BLOCKS
"blocks"
#define F_BONUSMAP "bonusmap"
#define F_BONUSMAP
"bonusmap"
#define F_LEVEL "level"
#define F_LEVEL
"level"
#define F_PLANET "planet"
#define F_PLANET
"planet"
#define F_SPRITES "sprites"
#define F_SPRITES
"sprites"
#endif
#endif
// Standard string length
// Standard string length
...
...
src/baselevel.cpp
View file @
40768f56
...
@@ -26,6 +26,7 @@
...
@@ -26,6 +26,7 @@
*/
*/
#include "game/game.h"
#include "io/gfx/font.h"
#include "io/gfx/font.h"
#include "io/gfx/video.h"
#include "io/gfx/video.h"
#include "player/player.h"
#include "player/player.h"
...
@@ -39,6 +40,9 @@ BaseLevel::BaseLevel () {
...
@@ -39,6 +40,9 @@ BaseLevel::BaseLevel () {
paused
=
false
;
paused
=
false
;
// Set the level stage
stage
=
LS_NORMAL
;
return
;
return
;
}
}
...
@@ -151,3 +155,28 @@ void BaseLevel::drawStats (int stats) {
...
@@ -151,3 +155,28 @@ void BaseLevel::drawStats (int stats) {
}
}
void
BaseLevel
::
addTimer
()
{
unsigned
char
buffer
[
MTL_L_PROP
];
if
(
stage
!=
LS_NORMAL
)
return
;
endTime
+=
2
*
60
*
1000
;
// 2 minutes. Is this right?
if
(
gameMode
)
{
buffer
[
0
]
=
MTL_L_PROP
;
buffer
[
1
]
=
MT_L_PROP
;
buffer
[
2
]
=
2
;
// add timer
buffer
[
3
]
=
0
;
buffer
[
4
]
=
0
;
// Don't really matter
game
->
send
(
buffer
);
}
return
;
}
src/baselevel.h
View file @
40768f56
...
@@ -46,6 +46,15 @@
...
@@ -46,6 +46,15 @@
#define TTOI(x) ((x) << 5)
#define TTOI(x) ((x) << 5)
// Enum
enum
LevelStage
{
LS_NORMAL
=
0
,
LS_SUDDENDEATH
=
1
,
LS_END
=
2
};
// Classes
// Classes
class
BaseLevel
{
class
BaseLevel
{
...
@@ -58,12 +67,15 @@ class BaseLevel {
...
@@ -58,12 +67,15 @@ class BaseLevel {
float
smoothfps
;
float
smoothfps
;
int
items
;
int
items
;
bool
paused
;
bool
paused
;
LevelStage
stage
;
void
timeCalcs
();
void
timeCalcs
();
void
drawStats
(
int
stats
);
void
drawStats
(
int
stats
);
public
:
public
:
BaseLevel
();
BaseLevel
();
void
addTimer
();
};
};
...
...
src/bonus/bonus.cpp
View file @
40768f56
...
@@ -26,7 +26,8 @@
...
@@ -26,7 +26,8 @@
*/
*/
#include "bonus.h"
#include "bonus.h"
#include "game/game.h"
#include "game/gamemode.h"
#include "game/gamemode.h"
#include "io/controls.h"
#include "io/controls.h"
#include "io/file.h"
#include "io/file.h"
...
@@ -146,7 +147,37 @@ Bonus::Bonus (char * fileName, unsigned char diff) {
...
@@ -146,7 +147,37 @@ Bonus::Bonus (char * fileName, unsigned char diff) {
delete
[]
buffer
;
delete
[]
buffer
;
file
->
seek
(
178
,
false
);
// Set the tick at which the level will end
endTime
=
file
->
loadShort
()
*
1000
;
// Number of gems to collect
items
=
file
->
loadShort
();
// The players' coordinates
x
=
file
->
loadShort
();
y
=
file
->
loadShort
();
if
(
game
)
game
->
setCheckpoint
(
x
,
y
);
// Set the players' initial values
if
(
game
)
{
for
(
x
=
0
;
x
<
nPlayers
;
x
++
)
game
->
resetPlayer
(
players
+
x
,
true
);
}
else
{
localPlayer
->
reset
();
localPlayer
->
setPosition
(
TTOF
(
x
)
+
F16
,
TTOF
(
y
)
+
F16
);
}
delete
file
;
delete
file
;
...
@@ -168,12 +199,8 @@ Bonus::Bonus (char * fileName, unsigned char diff) {
...
@@ -168,12 +199,8 @@ Bonus::Bonus (char * fileName, unsigned char diff) {
// Apply the palette to surfaces that already exist, e.g. fonts
// Apply the palette to surfaces that already exist, e.g. fonts
usePalette
(
palette
);
usePalette
(
palette
);
// Adjust fontmn1 to use bonuslevel palette
// Adjust fontmn1 to use bonus level palette
fontmn1
->
mapPalette
(
224
,
8
,
0
,
16
);
fontsFont
->
mapPalette
(
0
,
16
,
15
,
-
16
);
// Set the tick at which the level will end
endTime
=
(
5
-
diff
)
*
30
*
1000
;
return
;
return
;
...
@@ -193,12 +220,186 @@ Bonus::~Bonus () {
...
@@ -193,12 +220,186 @@ Bonus::~Bonus () {
SDL_FreeSurface
(
tileSet
);
SDL_FreeSurface
(
tileSet
);
font
mn1
->
restorePalette
();
font
sFont
->
restorePalette
();
return
;
return
;
}
}
int
Bonus
::
step
()
{
fixed
playerX
,
playerY
;
int
gridX
,
gridY
;
int
msps
;
int
count
;
// Milliseconds per step
msps
=
ticks
-
prevStepTicks
;
prevStepTicks
=
ticks
;
// Check if time has run out
if
(
ticks
>
endTime
)
return
LOST
;
// Apply controls to local player
for
(
count
=
0
;
count
<
PCONTROLS
;
count
++
)
localPlayer
->
setControl
(
count
,
controls
.
getState
(
count
));
// Process players
for
(
count
=
0
;
count
<
nPlayers
;
count
++
)
{
players
[
count
].
bonusStep
(
ticks
,
msps
);
playerX
=
players
[
count
].
getX
();
playerY
=
players
[
count
].
getY
();
gridX
=
FTOT
(
playerX
);
gridY
=
FTOT
(
playerY
);
if
((
playerX
>
TTOF
(
gridX
)
+
F12
)
&&
(
playerX
<
TTOF
(
gridX
)
+
F20
)
&&
(
playerY
>
TTOF
(
gridY
)
+
F12
)
&&
(
playerY
<
TTOF
(
gridY
)
+
F20
))
{
while
(
gridX
<
0
)
gridX
+=
BLW
;
while
(
gridY
<
0
)
gridY
+=
BLH
;
switch
(
events
[
gridY
][
gridX
])
{
case
1
:
// Extra time
addTimer
();
events
[
gridY
][
gridX
]
=
0
;
break
;
case
2
:
// Gem
players
[
count
].
addItem
();
events
[
gridY
][
gridX
]
=
0
;
if
(
players
[
count
].
getItems
()
>=
items
)
return
WON
;
break
;
case
3
:
// Hand
players
[
count
].
setSpeed
(
0
,
0
);
break
;
case
4
:
// Exit
return
LOST
;
default
:
// Do nothing
break
;
}
}
}
return
E_NONE
;
}
void
Bonus
::
draw
()
{
SDL_Rect
src
,
dst
;
int
x
,
y
;
src
.
x
=
0
;
src
.
w
=
32
;
src
.
h
=
32
;
int
vX
=
FTOI
(
localPlayer
->
getX
())
-
(
canvasW
>>
1
);
int
vY
=
FTOI
(
localPlayer
->
getY
())
-
(
canvasH
>>
1
);
for
(
y
=
0
;
y
<=
ITOT
(
canvasH
-
1
)
+
1
;
y
++
)
{
for
(
x
=
0
;
x
<=
ITOT
(
canvasW
-
1
)
+
1
;
x
++
)
{
src
.
y
=
TTOI
(
tiles
[(
y
+
ITOT
(
vY
)
+
BLH
)
%
BLH
][(
x
+
ITOT
(
vX
)
+
BLW
)
%
BLW
]);
dst
.
x
=
TTOI
(
x
)
-
(
vX
&
31
);
dst
.
y
=
TTOI
(
y
)
-
(
vY
&
31
);
SDL_BlitSurface
(
tileSet
,
&
src
,
canvas
,
&
dst
);
dst
.
x
=
12
+
TTOI
(
x
)
-
(
vX
&
31
);
dst
.
y
=
12
+
TTOI
(
y
)
-
(
vY
&
31
);
switch
(
events
[(
y
+
ITOT
(
vY
)
+
BLH
)
%
BLH
][(
x
+
ITOT
(
vX
)
+
BLW
)
%
BLW
])
{
case
0
:
// No event
break
;
case
1
:
// Extra time
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
60
);
break
;
case
2
:
// Gem
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
67
);
break
;
case
3
:
// Hand
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
15
);
break
;
case
4
:
// Exit
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
45
);
break
;
default
:
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
0
);
break
;
}
}
}
// Draw the "player"
drawRect
(
(
canvasW
>>
1
)
+
fixed
(
sin
(
localPlayer
->
getDirection
()
*
6.283185
/
1024.0
)
*
3
)
-
4
,
(
canvasH
>>
1
)
-
fixed
(
cos
(
localPlayer
->
getDirection
()
*
6.283185
/
1024.0
)
*
3
)
-
4
,
8
,
8
,
0
);
drawRect
((
canvasW
>>
1
)
-
4
,
(
canvasH
>>
1
)
-
4
,
8
,
8
,
22
);
// Show gem count
fontsFont
->
showString
(
"x"
,
15
,
0
);
fontsFont
->
showNumber
(
localPlayer
->
getItems
(),
64
,
0
);
fontsFont
->
showNumber
(
items
,
117
,
0
);
// Show time remaining
if
(
endTime
>
ticks
)
x
=
(
endTime
-
ticks
)
/
1000
;
else
x
=
0
;
fontsFont
->
showNumber
(
x
/
60
,
242
,
0
);
fontsFont
->
showNumber
(
x
%
60
,
286
,
0
);
return
;
}
int
Bonus
::
play
()
{
int
Bonus
::
play
()
{
...
@@ -206,9 +407,8 @@ int Bonus::play () {
...
@@ -206,9 +407,8 @@ int Bonus::play () {
PaletteEffect
*
levelPE
;
PaletteEffect
*
levelPE
;
bool
pmenu
,
pmessage
;
bool
pmenu
,
pmessage
;
int
stats
,
option
;
int
stats
,
option
;
SDL_Rect
src
,
dst
;
unsigned
int
returnTime
;
int
x
,
y
;
int
count
;
int
msps
;
tickOffset
=
globalTicks
;
tickOffset
=
globalTicks
;
...
@@ -219,9 +419,6 @@ int Bonus::play () {
...
@@ -219,9 +419,6 @@ int Bonus::play () {
option
=
0
;
option
=
0
;
stats
=
S_NONE
;
stats
=
S_NONE
;
// Arbitrary position
localPlayer
->
setPosition
(
TTOF
(
32
)
+
F16
,
TTOF
(
7
)
+
F16
);
while
(
true
)
{
while
(
true
)
{
if
(
loop
(
NORMAL_LOOP
)
==
E_QUIT
)
return
E_QUIT
;
if
(
loop
(
NORMAL_LOOP
)
==
E_QUIT
)
return
E_QUIT
;
...
@@ -294,104 +491,43 @@ int Bonus::play () {
...
@@ -294,104 +491,43 @@ int Bonus::play () {
timeCalcs
();
timeCalcs
();
// Milliseconds per step
msps
=
ticks
-
prevStepTicks
;
prevStepTicks
=
ticks
;
// Check if level has been won
if
(
returnTime
&&
(
ticks
>
returnTime
))
{
if
(
!
paused
)
{
if
(
localPlayer
->
getItems
()
>=
items
)
return
WON
;
// Apply controls to local player
return
LOST
;
for
(
x
=
0
;
x
<
PCONTROLS
;
x
++
)
localPlayer
->
setControl
(
x
,
controls
.
getState
(
x
));
// Process players
for
(
x
=
0
;
x
<
nPlayers
;
x
++
)
players
[
x
].
bonusStep
(
ticks
,
msps
);
}
}
src
.
x
=
0
;
src
.
w
=
32
;
src
.
h
=
32
;
int
vX
=
FTOI
(
localPlayer
->
getX
())
-
(
canvasW
>>
1
);
int
vY
=
FTOI
(
localPlayer
->
getY
())
-
(
canvasH
>>
1
);
for
(
y
=
0
;
y
<=
ITOT
(
canvasH
-
1
)
+
1
;
y
++
)
{
for
(
x
=
0
;
x
<=
ITOT
(
canvasW
-
1
)
+
1
;
x
++
)
{
src
.
y
=
TTOI
(
tiles
[(
y
+
ITOT
(
vY
)
+
BLH
)
%
BLH
][(
x
+
ITOT
(
vX
)
+
BLW
)
%
BLW
]);
dst
.
x
=
TTOI
(
x
)
-
(
vX
&
31
);
dst
.
y
=
TTOI
(
y
)
-
(
vY
&
31
);
SDL_BlitSurface
(
tileSet
,
&
src
,
canvas
,
&
dst
);
dst
.
x
=
12
+
TTOI
(
x
)
-
(
vX
&
31
);
dst
.
y
=
12
+
TTOI
(
y
)
-
(
vY
&
31
);
switch
(
events
[(
y
+
ITOT
(
vY
)
+
BLH
)
%
BLH
][(
x
+
ITOT
(
vX
)
+
BLW
)
%
BLW
])
{
case
0
:
// No event
break
;
case
1
:
// Extra time
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
60
);
// Process frame-by-frame activity
break
;
if
(
!
paused
&&
(
ticks
>=
prevStepTicks
+
16
)
&&
(
stage
==
LS_NORMAL
))
{
case
2
:
// Gem
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
67
);
count
=
step
(
);
break
;
if
(
count
<
0
)
return
count
;
else
if
(
count
)
{
case
3
:
// Hand
stage
=
LS_END
;
firstPE
=
new
WhiteOutPaletteEffect
(
T_BONUS_END
,
firstPE
);
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
15
);
returnTime
=
ticks
+
T_BONUS_END
;
break
;
case
4
:
// Exit
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
45
);
break
;
default
:
drawRect
(
dst
.
x
,
dst
.
y
,
8
,
8
,
0
);
break
;
}
}
}
}
}
// Draw the "player"
drawRect
(
(
canvasW
>>
1
)
+
fixed
(
sin
(
localPlayer
->
getDirection
()
*
6.283185
/
1024.0
)
*
3
)
-
4
,
(
canvasH
>>
1
)
-
fixed
(
cos
(
localPlayer
->
getDirection
()
*
6.283185
/
1024.0
)
*
3
)
-
4
,
8
,
8
,
0
);
drawRect
((
canvasW
>>
1
)
-
4
,
(
canvasH
>>
1
)
-
4
,
8
,
8
,
22
);
// Draw the graphics
// Show time remaining
draw
();
if
(
endTime
>
ticks
)
x
=
endTime
-
ticks
;
else
x
=
0
;
y
=
x
/
(
60
*
1000
);
fontmn1
->
showNumber
(
y
,
144
,
8
);
x
-=
(
y
*
60
*
1000
);
y
=
x
/
1000
;
fontmn1
->
showNumber
(
y
,
192
,
8
);
// If paused, draw "PAUSE"
// If paused, draw "PAUSE"
if
(
p
aused
&&
!
pmenu
)
if
(
p
message
&&
!
pmenu
)
font
mn1
->
showString
(
"pause"
,
(
canvasW
>>
1
)
-
44
,
32
);
font
sFont
->
showString
(
"pause"
,
(
canvasW
>>
1
)
-
44
,
32
);
// Draw statistics
// Draw statistics
drawStats
(
stats
);
drawStats
(
stats
);
...
@@ -403,12 +539,12 @@ int Bonus::play () {
...
@@ -403,12 +539,12 @@ int Bonus::play () {
drawRect
((
canvasW
>>
2
)
-
8
,
(
canvasH
>>
1
)
-
46
,
144
,
60
,
0
);
drawRect
((
canvasW
>>
2
)
-
8
,
(
canvasH
>>
1
)
-
46
,
144
,
60
,
0
);
for
(
x
=
0
;
x
<
3
;
x
++
)
{
for
(
count
=
0
;
count
<
3
;
count
++
)
{
if
(
x
==
option
)
fontmn2
->
mapPalette
(
240
,
8
,
31
,
16
);
if
(
count
==
option
)
fontmn2
->
mapPalette
(
240
,
8
,
31
,
16
);
else
fontmn2
->
mapPalette
(
240
,
8
,
0
,
16
);
else
fontmn2
->
mapPalette
(
240
,
8
,
0
,
16
);
fontmn2
->
showString
(
options
[
x
],
canvasW
>>
2
,
(
canvasH
>>
1
)
+
(
x
<<
4
)
-
38
);
fontmn2
->
showString
(
options
[
count
],
canvasW
>>
2
,
(
canvasH
>>
1
)
+
(
count
<<
4
)
-
38
);
}
}
...
...
src/bonus/bonus.h
View file @
40768f56
...
@@ -34,16 +34,20 @@
...
@@ -34,16 +34,20 @@
#define BLW 256
/* Bonus level width */
#define BLW 256
/* Bonus level width */
#define BLH 256
/* Bonus level height */
#define BLH 256
/* Bonus level height */
#define T_BONUS_END 1500
// Class
// Class
class
Bonus
:
public
BaseLevel
{
class
Bonus
:
public
BaseLevel
{
private
:
private
:
unsigned
char
tiles
[
BLH
][
BLW
];
unsigned
char
tiles
[
BLH
][
BLW
];
unsigned
char
events
[
BLH
][
BLW
];
unsigned
char
events
[
BLH
][
BLW
];
int
loadTiles
(
char
*
fileName
);
int
loadTiles
(
char
*
fileName
);
int
step
();
void
draw
();
public
:
public
:
Bonus
(
char
*
fileName
,
unsigned
char
diff
);
Bonus
(
char
*
fileName
,
unsigned
char
diff
);
...
...
src/game/game.cpp
View file @
40768f56
...
@@ -148,6 +148,22 @@ int Game::play () {
...
@@ -148,6 +148,22 @@ int Game::play () {
levelRet
=
level
->
play
();
levelRet
=
level
->
play
();
if
(
levelRet
<
0
)
{
delete
level
;
return
levelRet
;
}
else
if
(
levelRet
==
E_NONE
)
{
delete
level
;
playMusic
(
"menusng.psm"
);
return
E_NONE
;
}
}
else
levelRet
=
WON
;
}
else
levelRet
=
WON
;
...
@@ -165,16 +181,63 @@ int Game::play () {
...
@@ -165,16 +181,63 @@ int Game::play () {
}
}
delete
[]
bonusFile
;
if
(
levelFile
)
{
bonusFile
=
NULL
;
delete
[]
bonusFile
;
bonusFile
=
NULL
;
}
bonusRet
=
bonus
->
play
();
bonusRet
=
bonus
->
play
();
delete
bonus
;
delete
bonus
;
if
(
bonusRet
==
E_QUIT
)
return
E_QUIT
;
if
(
bonusRet
==
E_QUIT
)
{
if
(
level
)
delete
level
;
return
E_QUIT
;
}
else
if
(
bonusRet
==
E_NONE
)
{
if
(
level
)
delete
level
;
playMusic
(
"menusng.psm"
);
return
E_NONE
;
}
else
if
(
bonusRet
==
WON
)
{
try
{
scene
=
new
Scene
(
F_BONUS_0SC
);
}
catch
(
int
e
)
{
scene
=
NULL
;
}
if
(
scene
)
{
if
(
scene
->
play
()
==
E_QUIT
)
{
delete
scene
;
if
(
level
)
delete
level
;
return
E_QUIT
;
}
if
(
bonusRet
==
E_NONE
)
return
E_NONE
;
delete
scene
;
}
// If part of a bonus-only game, go to next level
if
(
!
level
)
setBonus
((
bonusFile
[
10
]
*
10
)
+
bonusFile
[
11
]
-
527
);
}
}
}
...
@@ -182,59 +245,51 @@ int Game::play () {
...
@@ -182,59 +245,51 @@ int Game::play () {
if
(
!
level
)
continue
;
if
(
!
level
)
continue
;
switch
(
levelRet
)
{
if
(
levelRet
==
WON
)
{
// Won the level
// If there is no next level, load and play the cutscene
if
(
!
levelFile
)
{
case
E_NONE
:
// Quit game
scene
=
level
->
createScene
();
delete
level
;
delete
level
;
if
(
scene
)
{
if
(
scene
->
play
()
==
E_QUIT
)
{
delete
scene
;
return
E_QUIT
;
}
playMusic
(
"menusng.psm"
);
delete
scene
;
}
return
E_NONE
;
return
E_NONE
;
case
WON
:
// Completed level
}
// If there is no next level, load and play the cutscene
if
(
!
levelFile
)
{
scene
=
level
->
createScene
();
delete
level
;
scene
->
play
();
delete
scene
;
return
E_NONE
;
}
delete
level
;
// Do not use old level's checkpoint coordinates
checkpoint
=
false
;
// Do not use old level's checkpoint coordinates
}
else
{
checkpoint
=
false
;
break
;
case
LOST
:
// Lost level
delete
level
;
if
(
!
localPlayer
->
getLives
())
return
E_NONE
;
// Not really a success...
// Lost the level
// Use checkpoint coordinates
checkpoint
=
true
;
break
;
if
(
!
localPlayer
->
getLives
())
return
E_NONE
;
default
:
// Error
// Use checkpoint coordinates
checkpoint
=
true
;
delete
level
;
return
levelRet
;
}
}
delete
level
;
}
}
return
E_NONE
;
return
E_NONE
;
...
@@ -294,10 +349,10 @@ void Game::setCheckpoint (unsigned char gridX, unsigned char gridY) {
...
@@ -294,10 +349,10 @@ void Game::setCheckpoint (unsigned char gridX, unsigned char gridY) {
}
}
void
Game
::
resetPlayer
(
Player
*
player
)
{
void
Game
::
resetPlayer
(
Player
*
player
,
bool
bonus
)
{
player
->
reset
();
player
->
reset
();
player
->
setPosition
(
TTOF
(
checkX
)
,
TTOF
(
checkY
));
player
->
setPosition
(
TTOF
(
checkX
)
+
(
bonus
?
F16
:
0
),
TTOF
(
checkY
)
+
(
bonus
?
F16
:
0
));
return
;
return
;
...
...
src/game/game.h
View file @
40768f56
...
@@ -105,7 +105,7 @@ class Game {
...
@@ -105,7 +105,7 @@ class Game {
virtual
int
step
(
unsigned
int
ticks
);
virtual
int
step
(
unsigned
int
ticks
);
virtual
void
score
(
unsigned
char
team
);
virtual
void
score
(
unsigned
char
team
);
virtual
void
setCheckpoint
(
unsigned
char
gridX
,
unsigned
char
gridY
);
virtual
void
setCheckpoint
(
unsigned
char
gridX
,
unsigned
char
gridY
);
void
resetPlayer
(
Player
*
player
);
void
resetPlayer
(
Player
*
player
,
bool
bonus
);
};
};
...
...
src/game/gamemode.cpp
View file @
40768f56
...
@@ -105,7 +105,7 @@ unsigned char FreeForAllGameMode::chooseTeam () {
...
@@ -105,7 +105,7 @@ unsigned char FreeForAllGameMode::chooseTeam () {
void
FreeForAllGameMode
::
drawScore
()
{
void
FreeForAllGameMode
::
drawScore
()
{
font
mn1
->
showNumber
(
localPlayer
->
teamScore
,
64
,
4
);
font
sFont
->
showNumber
(
localPlayer
->
teamScore
,
64
,
4
);
return
;
return
;
...
@@ -140,7 +140,7 @@ unsigned char TeamGameMode::chooseTeam () {
...
@@ -140,7 +140,7 @@ unsigned char TeamGameMode::chooseTeam () {
void
TeamGameMode
::
drawScore
()
{
void
TeamGameMode
::
drawScore
()
{
font
mn1
->
showNumber
(
localPlayer
->
teamScore
,
64
,
4
);
font
sFont
->
showNumber
(
localPlayer
->
teamScore
,
64
,
4
);
return
;
return
;
...
@@ -199,7 +199,7 @@ bool RaceGameMode::endOfLevel (Player *player, unsigned char gridX,
...
@@ -199,7 +199,7 @@ bool RaceGameMode::endOfLevel (Player *player, unsigned char gridX,
if
(
player
==
localPlayer
)
game
->
score
(
player
->
getTeam
());
if
(
player
==
localPlayer
)
game
->
score
(
player
->
getTeam
());
game
->
resetPlayer
(
player
);
game
->
resetPlayer
(
player
,
false
);
return
false
;
return
false
;
...
...
src/io/gfx/font.cpp
View file @
40768f56
...
@@ -36,7 +36,7 @@
...
@@ -36,7 +36,7 @@
Font
::
Font
(
const
char
*
fileName
)
{
Font
::
Font
(
const
char
*
fileName
)
{
File
*
file
;
File
*
file
;
unsigned
char
*
pixels
;
unsigned
char
*
pixels
,
*
blank
;
int
fileSize
;
int
fileSize
;
int
count
,
size
,
width
,
height
;
int
count
,
size
,
width
,
height
;
...
@@ -52,30 +52,24 @@ Font::Font (const char * fileName) {
...
@@ -52,30 +52,24 @@ Font::Font (const char * fileName) {
}
}
fileSize
=
file
->
getSize
();
file
->
seek
(
20
,
true
);
nCharacters
=
128
;
lineHeight
=
file
->
loadChar
()
<<
1
;
// Create the first character
pixels
=
new
unsigned
char
[
3
*
lineHeight
];
file
->
seek
(
20
,
true
);
lineHeight
=
file
->
loadChar
()
<<
1
;
memset
(
pixels
,
0
,
3
*
lineHeight
);
characters
[
0
]
=
createSurface
(
pixels
,
3
,
lineHeight
);
SDL_SetColorKey
(
characters
[
0
],
SDL_SRCCOLORKEY
,
0
);
delete
[]
pixels
;
// Create blank character data
blank
=
new
unsigned
char
[
3
];
memset
(
blank
,
0
,
3
);
// Create remaining characters
fileSize
=
file
->
getSize
();
// Load characters
nCharacters
=
128
;
file
->
seek
(
23
,
true
);
for
(
count
=
1
;
count
<
128
;
count
++
)
{
for
(
count
=
0
;
count
<
128
;
count
++
)
{
size
=
file
->
loadShort
();
size
=
file
->
loadShort
();
...
@@ -97,13 +91,16 @@ Font::Font (const char * fileName) {
...
@@ -97,13 +91,16 @@ Font::Font (const char * fileName) {
height
+=
pixels
[
3
]
<<
8
;
height
+=
pixels
[
3
]
<<
8
;
characters
[
count
]
=
createSurface
(
pixels
+
4
,
width
,
height
);
characters
[
count
]
=
createSurface
(
pixels
+
4
,
width
,
height
);
SDL_SetColorKey
(
characters
[
count
],
SDL_SRCCOLORKEY
,
0
);
delete
[]
pixels
;
delete
[]
pixels
;
}
else
characters
[
count
]
=
createSurface
(
NULL
,
1
,
1
);
}
else
characters
[
count
]
=
createSurface
(
blank
,
3
,
1
);
SDL_SetColorKey
(
characters
[
count
],
SDL_SRCCOLORKEY
,
0
);
}
}
delete
[]
blank
;
delete
file
;
delete
file
;
...
@@ -174,18 +171,19 @@ Font::Font (unsigned char *pixels, bool big) {
...
@@ -174,18 +171,19 @@ Font::Font (unsigned char *pixels, bool big) {
delete
[]
chrPixels
;
delete
[]
chrPixels
;
// Create ASCII->font map
if
(
big
)
{
if
(
big
)
{
// Goes " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-:."
// Goes " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-:."
// Create ASCII->font map
for
(
count
=
0
;
count
<
45
;
count
++
)
map
[
count
]
=
0
;
for
(
count
=
0
;
count
<
45
;
count
++
)
map
[
count
]
=
0
;
map
[
45
]
=
37
;
map
[
count
++
]
=
37
;
map
[
46
]
=
39
;
map
[
count
++
]
=
39
;
for
(
count
=
47
;
count
<
48
;
count
++
)
map
[
count
]
=
0
;
for
(;
count
<
48
;
count
++
)
map
[
count
]
=
0
;
for
(;
count
<
58
;
count
++
)
map
[
count
]
=
count
-
47
;
for
(;
count
<
58
;
count
++
)
map
[
count
]
=
count
-
47
;
map
[
58
]
=
38
;
map
[
count
++
]
=
38
;
for
(
count
=
59
;
count
<
65
;
count
++
)
map
[
count
]
=
0
;
for
(;
count
<
65
;
count
++
)
map
[
count
]
=
0
;
for
(;
count
<
91
;
count
++
)
map
[
count
]
=
count
-
54
;
for
(;
count
<
91
;
count
++
)
map
[
count
]
=
count
-
54
;
for
(;
count
<
97
;
count
++
)
map
[
count
]
=
0
;
for
(;
count
<
97
;
count
++
)
map
[
count
]
=
0
;
for
(;
count
<
123
;
count
++
)
map
[
count
]
=
count
-
86
;
for
(;
count
<
123
;
count
++
)
map
[
count
]
=
count
-
86
;
...
@@ -194,10 +192,9 @@ Font::Font (unsigned char *pixels, bool big) {
...
@@ -194,10 +192,9 @@ Font::Font (unsigned char *pixels, bool big) {
}
else
{
}
else
{
// Goes " 0123456789oo" (where oo = infinity)
// Goes " 0123456789oo" (where oo = infinity)
// Use :; to represent the infinity symbol
// Create ASCII->font map
for
(
count
=
0
;
count
<
48
;
count
++
)
map
[
count
]
=
0
;
for
(
count
=
0
;
count
<
48
;
count
++
)
map
[
count
]
=
0
;
// Use :; to represent the infinity symbol
for
(;
count
<
60
;
count
++
)
map
[
count
]
=
count
-
47
;
for
(;
count
<
60
;
count
++
)
map
[
count
]
=
count
-
47
;
for
(;
count
<
128
;
count
++
)
map
[
count
]
=
0
;
for
(;
count
<
128
;
count
++
)
map
[
count
]
=
0
;
...
@@ -208,6 +205,98 @@ Font::Font (unsigned char *pixels, bool big) {
...
@@ -208,6 +205,98 @@ Font::Font (unsigned char *pixels, bool big) {
}
}
Font
::
Font
()
{
File
*
file
;
unsigned
char
*
pixels
,
*
sorted
;
int
fileSize
;
int
count
,
width
,
height
;
// Load font from FONTS.000
try
{
file
=
new
File
(
F_FONTS
,
false
);
}
catch
(
int
e
)
{
throw
e
;
}
fileSize
=
file
->
getSize
();
nCharacters
=
file
->
loadShort
();
// Load characters
for
(
count
=
0
;
count
<
nCharacters
;
count
++
)
{
width
=
file
->
loadShort
()
<<
2
;
height
=
file
->
loadShort
();
file
->
seek
(
4
,
false
);
if
(
file
->
tell
()
>=
fileSize
)
{
nCharacters
=
count
;
break
;
}
pixels
=
file
->
loadBlock
(
width
*
height
);
sorted
=
sortPixels
(
pixels
,
width
*
height
);
characters
[
count
]
=
createSurface
(
sorted
,
width
,
height
);
SDL_SetColorKey
(
characters
[
count
],
SDL_SRCCOLORKEY
,
254
);
delete
[]
sorted
;
delete
[]
pixels
;
}
delete
file
;
lineHeight
=
characters
[
0
]
->
h
;
// Create blank character data
pixels
=
new
unsigned
char
[
3
];
memset
(
pixels
,
254
,
3
);
characters
[
nCharacters
]
=
createSurface
(
pixels
,
3
,
1
);
SDL_SetColorKey
(
characters
[
nCharacters
],
SDL_SRCCOLORKEY
,
254
);
delete
[]
pixels
;
// Create ASCII->font map
for
(
count
=
0
;
count
<
37
;
count
++
)
map
[
count
]
=
nCharacters
;
map
[
count
++
]
=
36
;
for
(;
count
<
48
;
count
++
)
map
[
count
]
=
nCharacters
;
for
(;
count
<
58
;
count
++
)
map
[
count
]
=
count
-
22
;
for
(;
count
<
65
;
count
++
)
map
[
count
]
=
nCharacters
;
for
(;
count
<
91
;
count
++
)
map
[
count
]
=
count
-
65
;
for
(;
count
<
97
;
count
++
)
map
[
count
]
=
nCharacters
;
for
(;
count
<
123
;
count
++
)
map
[
count
]
=
count
-
97
;
for
(;
count
<
128
;
count
++
)
map
[
count
]
=
nCharacters
;
nCharacters
++
;
for
(
count
=
0
;
count
<
128
;
count
++
)
{
if
(
map
[
count
]
>=
nCharacters
)
map
[
count
]
=
0
;
}
return
;
}
Font
::~
Font
()
{
Font
::~
Font
()
{
int
count
;
int
count
;
...
...
src/io/gfx/font.h
View file @
40768f56
...
@@ -44,6 +44,7 @@ class Font {
...
@@ -44,6 +44,7 @@ class Font {
public
:
public
:
Font
(
const
char
*
fileName
);
Font
(
const
char
*
fileName
);
Font
(
unsigned
char
*
pixels
,
bool
big
);
Font
(
unsigned
char
*
pixels
,
bool
big
);
Font
();
~
Font
();
~
Font
();
int
showString
(
const
char
*
s
,
int
x
,
int
y
);
int
showString
(
const
char
*
s
,
int
x
,
int
y
);
...
@@ -56,6 +57,7 @@ class Font {
...
@@ -56,6 +57,7 @@ class Font {
int
getSceneStringWidth
(
const
unsigned
char
*
string
);
int
getSceneStringWidth
(
const
unsigned
char
*
string
);
};
};
// Variables
// Variables
...
@@ -64,8 +66,9 @@ EXTERN Font *fontbig; /* Taken from .0FN file name */
...
@@ -64,8 +66,9 @@ EXTERN Font *fontbig; /* Taken from .0FN file name */
EXTERN
Font
*
fontiny
;
/* Taken from .0FN file name */
EXTERN
Font
*
fontiny
;
/* Taken from .0FN file name */
EXTERN
Font
*
fontmn1
;
/* Taken from .0FN file name */
EXTERN
Font
*
fontmn1
;
/* Taken from .0FN file name */
EXTERN
Font
*
fontmn2
;
/* Taken from .0FN file name */
EXTERN
Font
*
fontmn2
;
/* Taken from .0FN file name */
EXTERN
Font
*
panelBigFont
;
/* Not a font file, found in PANEL.000 */
EXTERN
Font
*
panelBigFont
;
/* Found in PANEL.000 */
EXTERN
Font
*
panelSmallFont
;
/* Not a font file, found in PANEL.000 */
EXTERN
Font
*
panelSmallFont
;
/* Found in PANEL.000 */
EXTERN
Font
*
fontsFont
;
/* Found in FONTS.000 */
#endif
#endif
src/io/gfx/sprite.cpp
View file @
40768f56
...
@@ -59,11 +59,17 @@ void Sprite::clearPixels () {
...
@@ -59,11 +59,17 @@ void Sprite::clearPixels () {
void
Sprite
::
setPixels
(
unsigned
char
*
data
,
int
width
,
int
height
)
{
void
Sprite
::
setPixels
(
unsigned
char
*
data
,
int
width
,
int
height
)
{
unsigned
char
*
sorted
;
if
(
pixels
)
SDL_FreeSurface
(
pixels
);
if
(
pixels
)
SDL_FreeSurface
(
pixels
);
sorted
=
sortPixels
(
data
,
width
*
height
);
pixels
=
createSurface
(
data
,
width
,
height
);
pixels
=
createSurface
(
sorted
,
width
,
height
);
SDL_SetColorKey
(
pixels
,
SDL_SRCCOLORKEY
,
SKEY
);
SDL_SetColorKey
(
pixels
,
SDL_SRCCOLORKEY
,
SKEY
);
delete
[]
sorted
;
return
;
return
;
...
...
src/io/gfx/video.cpp
View file @
40768f56
...
@@ -31,6 +31,25 @@
...
@@ -31,6 +31,25 @@
#include <string.h>
#include <string.h>
unsigned
char
*
sortPixels
(
unsigned
char
*
pixels
,
int
length
)
{
unsigned
char
*
sorted
;
int
count
;
sorted
=
new
unsigned
char
[
length
];
// Rearrange pixels in correct order
for
(
count
=
0
;
count
<
length
;
count
++
)
{
sorted
[
count
]
=
pixels
[(
count
>>
2
)
+
((
count
&
3
)
*
(
length
>>
2
))];
}
return
sorted
;
}
SDL_Surface
*
createSurface
(
unsigned
char
*
pixels
,
int
width
,
int
height
)
{
SDL_Surface
*
createSurface
(
unsigned
char
*
pixels
,
int
width
,
int
height
)
{
SDL_Surface
*
ret
;
SDL_Surface
*
ret
;
...
...
src/io/gfx/video.h
View file @
40768f56
...
@@ -75,12 +75,13 @@ EXTERN SDL_Surface *panelAmmo[5];
...
@@ -75,12 +75,13 @@ EXTERN SDL_Surface *panelAmmo[5];
// Functions
// Functions
EXTERN
SDL_Surface
*
createSurface
(
unsigned
char
*
pixels
,
int
width
,
int
height
);
EXTERN
unsigned
char
*
sortPixels
(
unsigned
char
*
pixels
,
int
length
);
EXTERN
void
createScreen
();
EXTERN
SDL_Surface
*
createSurface
(
unsigned
char
*
pixels
,
int
width
,
int
height
);
EXTERN
void
usePalette
(
SDL_Color
*
palette
);
EXTERN
void
createScreen
();
EXTERN
void
restorePalette
(
SDL_Surface
*
surface
);
EXTERN
void
usePalette
(
SDL_Color
*
palette
);
EXTERN
void
clearScreen
(
int
index
);
EXTERN
void
restorePalette
(
SDL_Surface
*
surface
);
EXTERN
void
drawRect
(
int
x
,
int
y
,
int
width
,
int
height
,
int
index
);
EXTERN
void
clearScreen
(
int
index
);
EXTERN
void
drawRect
(
int
x
,
int
y
,
int
width
,
int
height
,
int
index
);
#endif
#endif
...
...
src/level/demolevel.cpp
View file @
40768f56
...
@@ -171,7 +171,7 @@ int DemoLevel::play () {
...
@@ -171,7 +171,7 @@ int DemoLevel::play () {
drawStats
(
stats
);
drawStats
(
stats
);
font
mn1
->
showString
(
"demo"
,
(
canvasW
>>
1
)
-
36
,
32
);
font
sFont
->
showString
(
"demo"
,
(
canvasW
>>
1
)
-
36
,
32
);
}
}
...
...
src/level/level.cpp
View file @
40768f56
...
@@ -130,8 +130,6 @@ Level::~Level () {
...
@@ -130,8 +130,6 @@ Level::~Level () {
delete
[]
spriteSet
;
delete
[]
spriteSet
;
fontmn1
->
restorePalette
();
delete
[]
sceneFile
;
delete
[]
sceneFile
;
return
;
return
;
...
@@ -371,31 +369,6 @@ Anim * Level::getMiscAnim (unsigned char anim) {
...
@@ -371,31 +369,6 @@ Anim * Level::getMiscAnim (unsigned char anim) {
}
}
void
Level
::
addTimer
()
{
unsigned
char
buffer
[
MTL_L_PROP
];
if
(
stage
!=
LS_NORMAL
)
return
;
endTime
+=
2
*
60
*
1000
;
// 2 minutes. Is this right?
if
(
gameMode
)
{
buffer
[
0
]
=
MTL_L_PROP
;
buffer
[
1
]
=
MT_L_PROP
;
buffer
[
2
]
=
2
;
// add timer
buffer
[
3
]
=
0
;
buffer
[
4
]
=
0
;
// Don't really matter
game
->
send
(
buffer
);
}
return
;
}
void
Level
::
setWaterLevel
(
unsigned
char
gridY
)
{
void
Level
::
setWaterLevel
(
unsigned
char
gridY
)
{
unsigned
char
buffer
[
MTL_L_PROP
];
unsigned
char
buffer
[
MTL_L_PROP
];
...
@@ -417,6 +390,7 @@ void Level::setWaterLevel (unsigned char gridY) {
...
@@ -417,6 +390,7 @@ void Level::setWaterLevel (unsigned char gridY) {
return
;
return
;
}
}
fixed
Level
::
getWaterLevel
()
{
fixed
Level
::
getWaterLevel
()
{
...
@@ -464,8 +438,16 @@ LevelStage Level::getStage () {
...
@@ -464,8 +438,16 @@ LevelStage Level::getStage () {
Scene
*
Level
::
createScene
()
{
Scene
*
Level
::
createScene
()
{
return
new
Scene
(
sceneFile
);
try
{
return
new
Scene
(
sceneFile
);
}
catch
(
int
e
)
{
return
NULL
;
}
}
}
...
@@ -626,7 +608,6 @@ int Level::play () {
...
@@ -626,7 +608,6 @@ int Level::play () {
timeCalcs
();
timeCalcs
();
// Check if level has been won
// Check if level has been won
if
(
game
&&
returnTime
&&
(
ticks
>
returnTime
))
{
if
(
game
&&
returnTime
&&
(
ticks
>
returnTime
))
{
...
@@ -648,36 +629,16 @@ int Level::play () {
...
@@ -648,36 +629,16 @@ int Level::play () {
// Process frame-by-frame activity
// Process frame-by-frame activity
if
(
!
paused
)
{
if
(
!
paused
&&
(
ticks
>=
prevStepTicks
+
16
)
)
{
// Apply controls to local player
// Apply controls to local player
for
(
count
=
0
;
count
<
PCONTROLS
;
count
++
)
for
(
count
=
0
;
count
<
PCONTROLS
;
count
++
)
localPlayer
->
setControl
(
count
,
controls
.
getState
(
count
));
localPlayer
->
setControl
(
count
,
controls
.
getState
(
count
));
count
=
step
();
// Process step
if
(
ticks
>=
prevStepTicks
+
16
)
{
count
=
step
();
if
(
count
<
0
)
return
count
;
}
// Handle player reactions
for
(
count
=
0
;
count
<
nPlayers
;
count
++
)
{
if
(
players
[
count
].
reacted
(
ticks
)
==
PR_KILLED
)
{
if
(
!
gameMode
)
return
LOST
;
game
->
resetPlayer
(
players
+
count
);
}
}
if
(
count
)
return
count
;
}
}
...
@@ -687,8 +648,8 @@ int Level::play () {
...
@@ -687,8 +648,8 @@ int Level::play () {
// If paused, draw "PAUSE"
// If paused, draw "PAUSE"
if
(
p
aused
&&
!
pmenu
)
if
(
p
message
&&
!
pmenu
)
font
mn1
->
showString
(
"pause"
,
(
canvasW
>>
1
)
-
44
,
32
);
font
sFont
->
showString
(
"pause"
,
(
canvasW
>>
1
)
-
44
,
32
);
// If this is a competitive game, draw the score
// If this is a competitive game, draw the score
...
@@ -744,28 +705,30 @@ int Level::play () {
...
@@ -744,28 +705,30 @@ int Level::play () {
// Display statistics & bonuses
// Display statistics & bonuses
// TODO: Display percentage symbol
// TODO: Display percentage symbol
font
mn1
->
showString
(
"time"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
-
60
);
font
sFont
->
showString
(
"time"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
-
60
);
font
mn1
->
showNumber
(
timeBonus
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
60
);
font
sFont
->
showNumber
(
timeBonus
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
60
);
font
mn1
->
showString
(
"enemies"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
-
40
);
font
sFont
->
showString
(
"enemies"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
-
40
);
if
(
enemies
)
if
(
enemies
)
font
mn1
->
showNumber
((
localPlayer
->
getEnemies
()
*
100
)
/
enemies
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
40
);
font
sFont
->
showNumber
((
localPlayer
->
getEnemies
()
*
100
)
/
enemies
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
40
);
else
else
fontmn1
->
showNumber
(
0
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
40
);
fontsFont
->
showNumber
(
0
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
40
);
fontsFont
->
showString
(
"%"
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
40
);
font
mn1
->
showString
(
"items"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
-
20
);
font
sFont
->
showString
(
"items"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
-
20
);
if
(
items
)
if
(
items
)
font
mn1
->
showNumber
((
localPlayer
->
getItems
()
*
100
)
/
items
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
20
);
font
sFont
->
showNumber
((
localPlayer
->
getItems
()
*
100
)
/
items
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
20
);
else
else
fontmn1
->
showNumber
(
0
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
20
);
fontsFont
->
showNumber
(
0
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
20
);
fontsFont
->
showString
(
"%"
,
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
-
20
);
font
mn1
->
showString
(
"perfect"
,
(
canvasW
>>
1
)
-
152
,
canvasH
>>
1
);
font
sFont
->
showString
(
"perfect"
,
(
canvasW
>>
1
)
-
152
,
canvasH
>>
1
);
font
mn1
->
showNumber
(
perfect
,
(
canvasW
>>
1
)
+
124
,
canvasH
>>
1
);
font
sFont
->
showNumber
(
perfect
,
(
canvasW
>>
1
)
+
124
,
canvasH
>>
1
);
font
mn1
->
showString
(
"score"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
+
40
);
font
sFont
->
showString
(
"score"
,
(
canvasW
>>
1
)
-
152
,
(
canvasH
>>
1
)
+
40
);
font
mn1
->
showNumber
(
localPlayer
->
getScore
(),
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
+
40
);
font
sFont
->
showNumber
(
localPlayer
->
getScore
(),
(
canvasW
>>
1
)
+
124
,
(
canvasH
>>
1
)
+
40
);
}
}
...
...
src/level/level.h
View file @
40768f56
...
@@ -57,15 +57,6 @@
...
@@ -57,15 +57,6 @@
#define T_END 1000
#define T_END 1000
// Enum
enum
LevelStage
{
LS_NORMAL
=
0
,
LS_SUDDENDEATH
=
1
,
LS_END
=
2
};
// Datatypes
// Datatypes
typedef
struct
{
typedef
struct
{
...
@@ -119,7 +110,6 @@ class Level : public BaseLevel {
...
@@ -119,7 +110,6 @@ class Level : public BaseLevel {
fixed
waterLevelTarget
;
fixed
waterLevelTarget
;
fixed
waterLevelSpeed
;
fixed
waterLevelSpeed
;
fixed
energyBar
;
fixed
energyBar
;
LevelStage
stage
;
int
loadSprites
(
char
*
fileName
);
int
loadSprites
(
char
*
fileName
);
int
loadTiles
(
char
*
fileName
);
int
loadTiles
(
char
*
fileName
);
...
@@ -153,7 +143,6 @@ class Level : public BaseLevel {
...
@@ -153,7 +143,6 @@ class Level : public BaseLevel {
Sprite
*
getSprite
(
unsigned
char
sprite
);
Sprite
*
getSprite
(
unsigned
char
sprite
);
Anim
*
getAnim
(
unsigned
char
anim
);
Anim
*
getAnim
(
unsigned
char
anim
);
Anim
*
getMiscAnim
(
unsigned
char
anim
);
Anim
*
getMiscAnim
(
unsigned
char
anim
);
void
addTimer
();
void
setWaterLevel
(
unsigned
char
gridY
);
void
setWaterLevel
(
unsigned
char
gridY
);
fixed
getWaterLevel
();
fixed
getWaterLevel
();
void
playSound
(
int
sound
);
void
playSound
(
int
sound
);
...
...
src/level/levelframe.cpp
View file @
40768f56
...
@@ -34,6 +34,7 @@
...
@@ -34,6 +34,7 @@
#include "game/game.h"
#include "game/game.h"
#include "game/gamemode.h"
#include "game/gamemode.h"
#include "io/controls.h"
#include "io/gfx/font.h"
#include "io/gfx/font.h"
#include "io/gfx/video.h"
#include "io/gfx/video.h"
#include "player/player.h"
#include "player/player.h"
...
@@ -169,6 +170,20 @@ int Level::step () {
...
@@ -169,6 +170,20 @@ int Level::step () {
waterLevel
+=
(
waterLevelSpeed
*
msps
)
>>
10
;
waterLevel
+=
(
waterLevelSpeed
*
msps
)
>>
10
;
// Handle player reactions
for
(
x
=
0
;
x
<
nPlayers
;
x
++
)
{
if
(
players
[
x
].
reacted
(
ticks
)
==
PR_KILLED
)
{
if
(
!
gameMode
)
return
LOST
;
game
->
resetPlayer
(
players
+
x
,
false
);
}
}
return
E_NONE
;
return
E_NONE
;
}
}
...
@@ -184,17 +199,11 @@ void Level::draw () {
...
@@ -184,17 +199,11 @@ void Level::draw () {
int
vX
,
vY
;
int
vX
,
vY
;
int
x
,
y
,
bgScale
;
int
x
,
y
,
bgScale
;
unsigned
int
change
;
unsigned
int
change
;
// Set tile drawing dimensions
src
.
w
=
TTOI
(
1
);
src
.
h
=
TTOI
(
1
);
src
.
x
=
0
;
// Calculate viewport
// Calculate viewport
if
(
game
&&
(
stage
==
LS_END
))
game
->
view
(
(
ticks
-
prevTicks
)
*
160
);
if
(
game
&&
(
stage
==
LS_END
))
game
->
view
(
paused
?
0
:
((
ticks
-
prevTicks
)
*
160
)
);
else
localPlayer
->
view
(
ticks
,
ticks
-
prevTicks
);
else
localPlayer
->
view
(
ticks
,
paused
?
0
:
(
ticks
-
prevTicks
)
);
// Ensure the new viewport is within the level
// Ensure the new viewport is within the level
if
(
viewX
<
0
)
viewX
=
0
;
if
(
viewX
<
0
)
viewX
=
0
;
...
@@ -211,9 +220,15 @@ void Level::draw () {
...
@@ -211,9 +220,15 @@ void Level::draw () {
dst
.
h
=
viewH
;
dst
.
h
=
viewH
;
SDL_SetClipRect
(
canvas
,
&
dst
);
SDL_SetClipRect
(
canvas
,
&
dst
);
if
((
viewW
<
canvasW
)
||
(
viewH
<
canvasH
))
clearScreen
(
15
);
if
((
viewW
<
canvasW
)
||
(
viewH
<
canvasH
))
clearScreen
(
15
);
// Set tile drawing dimensions
src
.
w
=
TTOI
(
1
);
src
.
h
=
TTOI
(
1
);
src
.
x
=
0
;
// If there is a sky, draw it
// If there is a sky, draw it
if
(
sky
)
{
if
(
sky
)
{
...
...
src/level/levelload.cpp
View file @
40768f56
...
@@ -50,7 +50,7 @@
...
@@ -50,7 +50,7 @@
int
Level
::
loadSprites
(
char
*
fileName
)
{
int
Level
::
loadSprites
(
char
*
fileName
)
{
File
*
file
,
*
mainFile
,
*
specFile
;
File
*
file
,
*
mainFile
,
*
specFile
;
unsigned
char
*
pixels
,
*
sorted
;
unsigned
char
*
pixels
,
*
mask
;
int
mainPos
,
specPos
;
int
mainPos
,
specPos
;
int
count
,
x
,
y
,
width
,
height
,
m
;
int
count
,
x
,
y
,
width
,
height
,
m
;
...
@@ -157,11 +157,10 @@ int Level::loadSprites (char * fileName) {
...
@@ -157,11 +157,10 @@ int Level::loadSprites (char * fileName) {
}
}
// m is for MAGIC
m
=
file
->
loadShort
();
m
=
file
->
loadShort
();
// Allocate space for
descrambling
// Allocate space for
mask
sorted
=
new
unsigned
char
[
width
*
height
];
mask
=
new
unsigned
char
[
width
*
height
];
// Actually, m is for mask offset.
// Actually, m is for mask offset.
// Sprites can be either masked or not masked.
// Sprites can be either masked or not masked.
...
@@ -219,9 +218,7 @@ int Level::loadSprites (char * fileName) {
...
@@ -219,9 +218,7 @@ int Level::loadSprites (char * fileName) {
for
(
x
=
0
;
x
<
width
;
x
++
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
{
sorted
[(((
y
>>
2
)
+
((
x
&
3
)
*
(
height
>>
2
)))
*
width
)
+
mask
[((
y
+
((
x
&
3
)
*
height
))
*
(
width
>>
2
))
+
(
x
>>
2
)]
=
(
x
>>
2
)
+
(((
y
&
3
)
+
((
height
&
3
)
*
(
x
&
3
)))
*
(
width
>>
2
))]
=
pixels
[(
y
*
width
)
+
x
];
pixels
[(
y
*
width
)
+
x
];
}
}
...
@@ -240,7 +237,7 @@ int Level::loadSprites (char * fileName) {
...
@@ -240,7 +237,7 @@ int Level::loadSprites (char * fileName) {
for
(
x
=
0
;
x
<
width
;
x
++
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
{
if
(
sorted
[(
y
*
width
)
+
x
]
==
1
)
{
if
(
mask
[(
y
*
width
)
+
x
]
==
1
)
{
// The unmasked portions are transparent, so no masked
// The unmasked portions are transparent, so no masked
// portion should be transparent.
// portion should be transparent.
...
@@ -265,27 +262,13 @@ int Level::loadSprites (char * fileName) {
...
@@ -265,27 +262,13 @@ int Level::loadSprites (char * fileName) {
}
}
// Rearrange pixels in correct order
for
(
y
=
0
;
y
<
height
;
y
++
)
{
for
(
x
=
0
;
x
<
width
;
x
++
)
{
// Convert the scrambled sprite to an SDL surface
spriteSet
[
count
].
setPixels
(
pixels
,
width
,
height
);
sorted
[(
y
*
width
)
+
x
]
=
pixels
[(((
y
>>
2
)
+
((
x
&
3
)
*
(
height
>>
2
)))
*
width
)
+
(
x
>>
2
)
+
(((
y
&
3
)
+
((
height
&
3
)
*
(
x
&
3
)))
*
(
width
>>
2
))];
}
}
// Convert the sprite to an SDL surface
spriteSet
[
count
].
setPixels
(
sorted
,
width
,
height
);
// Free redundant data
// Free redundant data
delete
[]
pixels
;
delete
[]
pixels
;
delete
[]
sorted
;
delete
[]
mask
;
// Check if the next sprite exists
// Check if the next sprite exists
...
@@ -829,7 +812,7 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
...
@@ -829,7 +812,7 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
if
(
game
)
{
if
(
game
)
{
for
(
count
=
0
;
count
<
nPlayers
;
count
++
)
for
(
count
=
0
;
count
<
nPlayers
;
count
++
)
game
->
resetPlayer
(
players
+
count
);
game
->
resetPlayer
(
players
+
count
,
false
);
}
else
{
}
else
{
...
@@ -1016,16 +999,10 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
...
@@ -1016,16 +999,10 @@ int Level::load (char *fileName, unsigned char diff, bool checkpoint) {
// Apply the palette to surfaces that already exist, e.g. fonts
// Apply the palette to surfaces that already exist, e.g. fonts
usePalette
(
palette
);
usePalette
(
palette
);
// Adjust fontmn1 to use level palette
fontmn1
->
mapPalette
(
224
,
8
,
14
,
-
16
);
// Set the tick at which the level will end
// Set the tick at which the level will end
endTime
=
(
5
-
difficulty
)
*
2
*
60
*
1000
;
endTime
=
(
5
-
difficulty
)
*
2
*
60
*
1000
;
// Set the level stage
stage
=
LS_NORMAL
;
firstBullet
=
NULL
;
firstBullet
=
NULL
;
firstEvent
=
NULL
;
firstEvent
=
NULL
;
...
...
src/main.cpp
View file @
40768f56
...
@@ -403,16 +403,18 @@ int loadMain (int argc, char *argv[]) {
...
@@ -403,16 +403,18 @@ int loadMain (int argc, char *argv[]) {
try
{
try
{
fontsFont
=
new
Font
();
panelBigFont
=
new
Font
(
pixels
+
(
40
*
320
),
true
);
panelBigFont
=
new
Font
(
pixels
+
(
40
*
320
),
true
);
panelSmallFont
=
new
Font
(
pixels
+
(
48
*
320
),
false
);
panelSmallFont
=
new
Font
(
pixels
+
(
48
*
320
),
false
);
font2
=
new
Font
(
"font2.0fn"
);
font2
=
new
Font
(
F_FONT2_0FN
);
fontbig
=
new
Font
(
"fontbig.0fn"
);
fontbig
=
new
Font
(
F_FONTBIG_0FN
);
fontiny
=
new
Font
(
"fontiny.0fn"
);
fontiny
=
new
Font
(
F_FONTINY_0FN
);
fontmn1
=
new
Font
(
"fontmn1.0fn"
);
fontmn1
=
new
Font
(
F_FONTMN1_0FN
);
fontmn2
=
new
Font
(
"fontmn2.0fn"
);
fontmn2
=
new
Font
(
F_FONTMN2_0FN
);
}
catch
(
int
e
)
{
}
catch
(
int
e
)
{
if
(
fontsFont
)
delete
fontsFont
;
if
(
panelBigFont
)
delete
panelBigFont
;
if
(
panelBigFont
)
delete
panelBigFont
;
if
(
panelSmallFont
)
delete
panelSmallFont
;
if
(
panelSmallFont
)
delete
panelSmallFont
;
if
(
font2
)
delete
font2
;
if
(
font2
)
delete
font2
;
...
@@ -568,25 +570,52 @@ int loop (LoopType type) {
...
@@ -568,25 +570,52 @@ int loop (LoopType type) {
SDL_Color
shownPalette
[
256
];
SDL_Color
shownPalette
[
256
];
SDL_Event
event
;
SDL_Event
event
;
int
prevTicks
,
ret
;
int
prevTicks
,
ret
;
// Show everything that has been drawn so far
#ifdef SCALE
#ifdef SCALE
if
(
canvas
!=
screen
)
{
if
(
canvas
!=
screen
)
{
// Copy everything that has been drawn so far
scale
(
scaleFactor
,
scale
(
scaleFactor
,
screen
->
pixels
,
screen
->
pitch
,
screen
->
pixels
,
screen
->
pitch
,
canvas
->
pixels
,
canvas
->
pitch
,
canvas
->
pixels
,
canvas
->
pitch
,
screen
->
format
->
BytesPerPixel
,
canvas
->
w
,
canvas
->
h
);
screen
->
format
->
BytesPerPixel
,
canvas
->
w
,
canvas
->
h
);
}
}
#endif
#endif
// Update tick count
prevTicks
=
globalTicks
;
globalTicks
=
SDL_GetTicks
();
// Apply palette effects
if
(
firstPE
)
{
/* If the palette is being emulated, compile all palette changes and
apply them all at once.
If the palette is being used directly, apply all palette effects
directly. */
if
(
fakePalette
)
{
memcpy
(
shownPalette
,
currentPalette
,
sizeof
(
SDL_Color
)
*
256
);
firstPE
->
apply
(
shownPalette
,
false
,
globalTicks
-
prevTicks
);
SDL_SetPalette
(
screen
,
SDL_PHYSPAL
,
shownPalette
,
0
,
256
);
}
else
{
firstPE
->
apply
(
shownPalette
,
true
,
globalTicks
-
prevTicks
);
}
}
// Show what has been drawn
SDL_Flip
(
screen
);
SDL_Flip
(
screen
);
prevTicks
=
globalTicks
;
globalTicks
=
SDL_GetTicks
();
// Process system events
// Process system events
while
(
SDL_PollEvent
(
&
event
))
{
while
(
SDL_PollEvent
(
&
event
))
{
...
@@ -665,31 +694,6 @@ int loop (LoopType type) {
...
@@ -665,31 +694,6 @@ int loop (LoopType type) {
controls
.
loop
();
controls
.
loop
();
// Apply palette effects
if
(
firstPE
)
{
/* If the palette is being emulated, compile all palette changes and
apply them all at once.
If the palette is being used directly, apply all palette effects
directly. */
if
(
fakePalette
)
{
memcpy
(
shownPalette
,
currentPalette
,
sizeof
(
SDL_Color
)
*
256
);
firstPE
->
apply
(
shownPalette
,
false
,
globalTicks
-
prevTicks
);
SDL_SetPalette
(
screen
,
SDL_PHYSPAL
,
shownPalette
,
0
,
256
);
}
else
{
firstPE
->
apply
(
shownPalette
,
true
,
globalTicks
-
prevTicks
);
}
}
#if defined(WIZ) || defined(GP2X)
#if defined(WIZ) || defined(GP2X)
WIZ_AdjustVolume
(
volume_direction
);
WIZ_AdjustVolume
(
volume_direction
);
#endif
#endif
...
...
src/menu/mainmenu.cpp
View file @
40768f56
...
@@ -110,7 +110,7 @@ int Menu::main () {
...
@@ -110,7 +110,7 @@ int Menu::main () {
try
{
try
{
scene
=
new
Scene
(
"instruct.0sc"
);
scene
=
new
Scene
(
F_INSTRUCT_0SC
);
}
catch
(
int
e
)
{
}
catch
(
int
e
)
{
...
@@ -142,7 +142,7 @@ int Menu::main () {
...
@@ -142,7 +142,7 @@ int Menu::main () {
try
{
try
{
scene
=
new
Scene
(
"order.0sc"
);
scene
=
new
Scene
(
F_ORDER_0SC
);
}
catch
(
int
e
)
{
}
catch
(
int
e
)
{
...
...
src/player/player.cpp
View file @
40768f56
...
@@ -602,6 +602,15 @@ void Player::kill (Player *source, unsigned int ticks) {
...
@@ -602,6 +602,15 @@ void Player::kill (Player *source, unsigned int ticks) {
}
}
void
Player
::
addItem
()
{
items
++
;
return
;
}
void
Player
::
addScore
(
int
addedScore
)
{
void
Player
::
addScore
(
int
addedScore
)
{
score
+=
addedScore
*
10
;
score
+=
addedScore
*
10
;
...
...
src/player/player.h
View file @
40768f56
...
@@ -198,7 +198,7 @@ class Player : public Movable {
...
@@ -198,7 +198,7 @@ class Player : public Movable {
int
enemies
,
items
;
int
enemies
,
items
;
unsigned
char
team
;
unsigned
char
team
;
void
addAmmo
(
int
type
,
int
amount
);
void
addAmmo
(
int
type
,
int
amount
);
public
:
public
:
int
teamScore
;
int
teamScore
;
...
@@ -219,6 +219,7 @@ class Player : public Movable {
...
@@ -219,6 +219,7 @@ class Player : public Movable {
void
clearEvent
(
unsigned
char
gridX
,
unsigned
char
gridY
);
void
clearEvent
(
unsigned
char
gridX
,
unsigned
char
gridY
);
bool
hit
(
Player
*
source
,
unsigned
int
ticks
);
bool
hit
(
Player
*
source
,
unsigned
int
ticks
);
void
kill
(
Player
*
source
,
unsigned
int
ticks
);
void
kill
(
Player
*
source
,
unsigned
int
ticks
);
void
addItem
();
void
addScore
(
int
addedScore
);
void
addScore
(
int
addedScore
);
int
getScore
();
int
getScore
();
int
getEnergy
();
int
getEnergy
();
...
...
src/scene/scene.cpp
View file @
40768f56
...
@@ -132,6 +132,7 @@ Scene::Scene (const char * fileName) {
...
@@ -132,6 +132,7 @@ Scene::Scene (const char * fileName) {
}
}
background
=
NULL
;
images
=
NULL
;
images
=
NULL
;
palettes
=
NULL
;
palettes
=
NULL
;
...
@@ -180,6 +181,8 @@ Scene::~Scene () {
...
@@ -180,6 +181,8 @@ Scene::~Scene () {
delete
[]
pages
;
delete
[]
pages
;
if
(
background
)
SDL_FreeSurface
(
background
);
if
(
images
)
delete
images
;
if
(
images
)
delete
images
;
if
(
palettes
)
delete
palettes
;
if
(
palettes
)
delete
palettes
;
...
@@ -194,9 +197,10 @@ int Scene::play () {
...
@@ -194,9 +197,10 @@ int Scene::play () {
unsigned
int
pageTime
=
pages
[
sceneIndex
].
pageTime
;
unsigned
int
pageTime
=
pages
[
sceneIndex
].
pageTime
;
unsigned
int
lastTicks
=
globalTicks
;
unsigned
int
lastTicks
=
globalTicks
;
int
newpage
=
true
;
int
newpage
=
true
;
int
fadein
=
false
;
SDL_Rect
textRect
=
{
0
,
0
,
SW
,
SH
};
SDL_Rect
textRect
=
{
0
,
0
,
SW
,
SH
};
clearScreen
(
0
);
while
(
true
)
{
while
(
true
)
{
if
(
loop
(
NORMAL_LOOP
)
==
E_QUIT
)
return
E_QUIT
;
if
(
loop
(
NORMAL_LOOP
)
==
E_QUIT
)
return
E_QUIT
;
...
@@ -240,7 +244,9 @@ int Scene::play () {
...
@@ -240,7 +244,9 @@ int Scene::play () {
// usePalette(palette);
// usePalette(palette);
currentPalette
=
palette
->
palette
;
currentPalette
=
palette
->
palette
;
fadein
=
true
;
// Fade in from black
firstPE
=
new
FadeInPaletteEffect
(
250
,
firstPE
);
}
else
restorePalette
(
screen
);
}
else
restorePalette
(
screen
);
...
@@ -260,14 +266,20 @@ int Scene::play () {
...
@@ -260,14 +266,20 @@ int Scene::play () {
if
(
image
)
{
if
(
image
)
{
dst
.
x
=
(
pages
[
sceneIndex
].
bgPos
[
bg
]
&
65535
)
*
2
+
(
canvasW
-
SW
)
>>
1
;
dst
.
x
=
pages
[
sceneIndex
].
bgX
[
bg
]
+
((
canvasW
-
SW
)
>>
1
)
;
dst
.
y
=
((
pages
[
sceneIndex
].
bgPos
[
bg
]
&
(
~
65535
))
>>
16
)
*
2
+
(
canvasH
-
SH
)
>>
1
;
dst
.
y
=
pages
[
sceneIndex
].
bgY
[
bg
]
+
((
canvasH
-
SH
)
>>
1
)
;
SDL_BlitSurface
(
image
->
image
,
NULL
,
canvas
,
&
dst
);
SDL_BlitSurface
(
image
->
image
,
NULL
,
canvas
,
&
dst
);
}
}
}
}
}
else
if
(
background
)
{
dst
.
x
=
(
canvasW
-
SW
)
>>
1
;
dst
.
y
=
(
canvasH
-
SH
)
>>
1
;
SDL_BlitSurface
(
background
,
NULL
,
canvas
,
&
dst
);
}
else
clearScreen
(
0
);
}
else
clearScreen
(
0
);
...
@@ -350,16 +362,6 @@ int Scene::play () {
...
@@ -350,16 +362,6 @@ int Scene::play () {
}
}
// Fade in from black
if
(
fadein
)
{
fadein
=
false
;
firstPE
=
new
FadeInPaletteEffect
(
250
,
firstPE
);
clearScreen
(
0
);
}
}
}
return
E_NONE
;
return
E_NONE
;
...
...
src/scene/scene.h
View file @
40768f56
...
@@ -83,16 +83,17 @@ class SceneText {
...
@@ -83,16 +83,17 @@ class SceneText {
class
ScenePage
{
class
ScenePage
{
public
:
public
:
int
backgrounds
;
int
backgrounds
;
int
bgIndex
[
30
];
int
bgIndex
[
30
];
unsigned
int
bgPos
[
30
];
unsigned
short
int
bgX
[
30
];
unsigned
short
int
bgY
[
30
];
// Length of the scene in seconds, or if zero = anim complete, or 256 = user interaction
// Length of the scene in seconds, or if zero = anim complete, or 256 = user interaction
int
pageTime
;
int
pageTime
;
SceneText
texts
[
100
];
SceneText
texts
[
100
];
int
nTexts
;
int
nTexts
;
char
*
musicFile
;
char
*
musicFile
;
int
paletteIndex
;
int
paletteIndex
;
ScenePage
();
ScenePage
();
~
ScenePage
();
~
ScenePage
();
...
@@ -133,7 +134,8 @@ class SceneFont {
...
@@ -133,7 +134,8 @@ class SceneFont {
class
Scene
{
class
Scene
{
private
:
private
:
SDL_Surface
*
background
;
SceneImage
*
images
;
SceneImage
*
images
;
ScenePalette
*
palettes
;
ScenePalette
*
palettes
;
SceneFont
fonts
[
5
];
SceneFont
fonts
[
5
];
...
@@ -146,9 +148,9 @@ class Scene {
...
@@ -146,9 +148,9 @@ class Scene {
// Scripts all information needed to render script pages, text etc
// Scripts all information needed to render script pages, text etc
ScenePage
*
pages
;
ScenePage
*
pages
;
void
loadScripts
(
File
*
f
);
void
loadScripts
(
File
*
f
);
void
loadData
(
File
*
f
);
void
loadData
(
File
*
f
);
void
loadAni
(
File
*
f
,
int
dataIndex
);
void
loadAni
(
File
*
f
,
int
dataIndex
);
public
:
public
:
Scene
(
const
char
*
fileName
);
Scene
(
const
char
*
fileName
);
...
...
src/scene/sceneload.cpp
View file @
40768f56
...
@@ -111,20 +111,14 @@ void Scene::loadAni (File *f, int dataIndex) {
...
@@ -111,20 +111,14 @@ void Scene::loadAni (File *f, int dataIndex) {
case
0x3131
:
case
0x3131
:
{
// Skip back size header, this is read by the surface reader
f
->
seek
(
-
2
,
false
);
// Skip back size header, this is read by the surface reader
f
->
seek
(
-
2
,
false
);
SDL_Surface
*
image
=
f
->
loadSurface
(
SW
,
SH
);
if
(
!
background
)
background
=
f
->
loadSurface
(
SW
,
SH
);
SDL_BlitSurface
(
image
,
NULL
,
canvas
,
NULL
);
SDL_FreeSurface
(
image
);
// Use the most recently loaded palette
// Use the most recently loaded palette
SDL_SetPalette
(
screen
,
SDL_PHYSPAL
,
palettes
->
palette
,
0
,
256
);
SDL_SetPalette
(
screen
,
SDL_PHYSPAL
,
palettes
->
palette
,
0
,
256
);
currentPalette
=
palettes
->
palette
;
currentPalette
=
palettes
->
palette
;
}
break
;
break
;
...
@@ -461,19 +455,15 @@ void Scene::loadScripts (File *f) {
...
@@ -461,19 +455,15 @@ void Scene::loadScripts (File *f) {
case
ESceneBackground
:
case
ESceneBackground
:
{
pages
[
loop
].
bgX
[
pages
[
loop
].
backgrounds
]
=
f
->
loadShort
();
pages
[
loop
].
bgY
[
pages
[
loop
].
backgrounds
]
=
f
->
loadShort
();
pages
[
loop
].
bgIndex
[
pages
[
loop
].
backgrounds
]
=
f
->
loadShort
();
unsigned
short
int
xpos
=
f
->
loadShort
();
LOG
(
"ESceneBackground: xpos"
,
pages
[
loop
].
bgX
[
pages
[
loop
].
backgrounds
]);
unsigned
short
int
ypos
=
f
->
loadShort
();
LOG
(
"ESceneBackground: ypos"
,
pages
[
loop
].
bgY
[
pages
[
loop
].
backgrounds
]);
unsigned
short
bgImageIndex
=
f
->
loadShort
();
LOG
(
"ESceneBackground: index"
,
pages
[
loop
].
bgIndex
[
pages
[
loop
].
backgrounds
]);
LOG
(
"ESceneBackground: index"
,
bgImageIndex
);
LOG
(
"ESceneBackground: xpos"
,
xpos
);
LOG
(
"ESceneBackground: ypos"
,
ypos
);
pages
[
loop
].
bgIndex
[
pages
[
loop
].
backgrounds
]
=
bgImageIndex
;
pages
[
loop
].
bgPos
[
pages
[
loop
].
backgrounds
]
=
xpos
|
(
ypos
<<
16
);
pages
[
loop
].
backgrounds
++
;
}
pages
[
loop
].
backgrounds
++
;
break
;
break
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment