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
2b2e53db
Commit
2b2e53db
authored
Oct 28, 2009
by
anotherguest
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Initial work to support Scenes better. Most work done through reverse engineering.
parent
630b578a
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
330 additions
and
12 deletions
+330
-12
scene.cpp
src/scene.cpp
+317
-6
scene.h
src/scene.h
+13
-6
No files found.
src/scene.cpp
View file @
2b2e53db
...
@@ -35,11 +35,288 @@
...
@@ -35,11 +35,288 @@
#include "io/sound.h"
#include "io/sound.h"
enum
{
ESceneMusic
=
0x2A
,
ESceneFadeType
=
0x3F
,
ESceneFontIndex
=
0x46
,
ESceneTextBlock
=
0x40
,
ESceneTextColour
=
0x41
,
ESceneTextPosition
=
0x47
,
ESceneTextAlign
=
0x4A
,
ESceneBackground
=
0x4c
,
ESceneTextRect
=
0x57
,
ESceneFontDefine
=
0x58
,
ESceneLength
=
0x5d
,
ESceneTextLine
=
0x5e
,
ESceneTextVAdjust
=
0x5f
,
ESceneAnimationIndex
=
0xA7
,
ESceneAnimationSetting
=
0xA6
,
ESceneTextShadow
=
0xdb
};
void
Scene
::
ParseAni
(
File
*
f
)
{
unsigned
short
int
aniType
=
f
->
loadShort
();
// should be 0x20
unsigned
short
int
aniOffset
=
f
->
loadShort
();
// unknown
unsigned
short
int
type
=
0
;
//
int
loop
;
while
(
type
!=
0x4C50
)
{
type
=
f
->
loadShort
();
if
(
type
==
0x4C53
)
{
// SL
unsigned
short
int
offset
=
f
->
loadShort
();
unsigned
char
noSounds
=
f
->
loadChar
();
for
(
loop
=
0
;
loop
<
noSounds
;
loop
++
)
{
char
*
soundName
=
f
->
loadString
();
log
(
"Soundname %s"
,
soundName
);
free
(
soundName
);
}
}
else
if
(
type
==
0x4C50
)
// PL
{
unsigned
short
int
len
=
f
->
loadShort
();
unsigned
char
*
buffer
=
f
->
loadBlock
(
len
);
for
(
int
count
=
0
;
count
<
256
;
count
++
)
{
// Palette entries are 6-bit
// Shift them upwards to 8-bit, and fill in the lower 2 bits
scenePalette
[
count
].
r
=
(
buffer
[
count
*
3
]
<<
2
)
+
(
buffer
[
count
*
3
]
>>
4
);
scenePalette
[
count
].
g
=
(
buffer
[(
count
*
3
)
+
1
]
<<
2
)
+
(
buffer
[(
count
*
3
)
+
1
]
>>
4
);
scenePalette
[
count
].
b
=
(
buffer
[(
count
*
3
)
+
2
]
<<
2
)
+
(
buffer
[(
count
*
3
)
+
2
]
>>
4
);
}
delete
[]
buffer
;
int
pos
=
f
->
tell
();
unsigned
short
int
value
=
f
->
loadShort
();
sceneBGs
[
imageIndex
]
=
f
->
loadSurface
(
320
,
200
,
true
);
imageIndex
++
;
pos
=
f
->
tell
();
}
}
}
void
Scene
::
ParseData
(
File
*
f
)
{
int
loop
;
for
(
loop
=
0
;
loop
<
dataItems
;
loop
++
)
{
f
->
seek
(
dataOffsets
[
loop
],
true
);
// Seek to data start
unsigned
short
int
dataLen
=
f
->
loadShort
();
// Get get the length of the datablock
if
(
dataLen
==
0x4e41
)
{
ParseAni
(
f
);
}
else
{
unsigned
char
type
=
f
->
loadChar
();
log
(
"Type:"
,
type
);
switch
(
type
)
{
case
3
:
case
4
:
// image
case
5
:
{
unsigned
short
int
width
=
f
->
loadShort
();
// get width
unsigned
short
int
height
;
if
(
type
==
3
)
height
=
f
->
loadChar
();
// Get height
else
height
=
f
->
loadShort
();
// Get height
if
(
imageIndex
<
100
)
{
f
->
seek
(
-
2
,
false
);
sceneBGs
[
imageIndex
]
=
f
->
loadSurface
(
width
,
height
);
imageIndex
++
;
}
}
break
;
default
:
{
f
->
seek
(
-
3
,
false
);
f
->
loadPalette
(
scenePalette
);
usePalette
(
scenePalette
);
}
break
;
}
}
}
}
void
Scene
::
ParseScripts
(
File
*
f
)
{
int
loop
;
char
*
string
;
for
(
loop
=
0
;
loop
<
scriptItems
;
loop
++
)
{
f
->
seek
(
scriptStarts
[
loop
],
true
);
// Seek to data start
if
(
f
->
loadChar
()
==
0x50
)
// Script tag
{
signed
long
int
scriptid
=
f
->
loadInt
();
unsigned
char
type
=
0
;
bool
breakloop
=
false
;
while
(
!
breakloop
)
{
type
=
f
->
loadChar
();
switch
(
type
)
{
case
ESceneAnimationSetting
:
{
signed
long
int
something
=
f
->
loadInt
();
signed
long
int
something2
=
f
->
loadInt
();
}
break
;
case
ESceneAnimationIndex
:
{
unsigned
char
aniIndex
=
f
->
loadChar
();
}
break
;
case
ESceneFadeType
:
{
unsigned
char
fadein
=
f
->
loadChar
();
}
break
;
case
ESceneBackground
:
{
signed
long
int
something
=
f
->
loadInt
();
unsigned
short
bgImageIndex
=
f
->
loadShort
();
}
break
;
case
ESceneMusic
:
{
// Music file name
string
=
f
->
loadString
();
playMusic
(
string
);
delete
[]
string
;
}
break
;
case
ESceneTextRect
:
// String
{
unsigned
short
x
=
f
->
loadShort
();
unsigned
short
y
=
f
->
loadShort
();
unsigned
short
w
=
f
->
loadShort
();
unsigned
short
h
=
f
->
loadShort
();
log
(
"Text rectangle xpos:"
,
x
);
}
break
;
case
ESceneFontDefine
:
// Font defnition
{
unsigned
short
fontindex
=
f
->
loadShort
();
char
*
fontname
=
f
->
loadString
();
log
(
"Fontname"
,
fontname
);
free
(
fontname
);
}
break
;
case
ESceneTextPosition
:
{
unsigned
short
newx
=
f
->
loadShort
();
unsigned
short
newy
=
f
->
loadShort
();
log
(
"TextPosition x*y"
,
newx
*
newy
);
}
break
;
case
ESceneTextColour
:
case
ESceneFontIndex
:
case
ESceneTextVAdjust
:
case
ESceneTextShadow
:
{
unsigned
short
value
=
f
->
loadShort
();
}
break
;
case
ESceneTextAlign
:
{
unsigned
char
alignment
=
f
->
loadChar
();
}
break
;
case
ESceneTextLine
:
case
ESceneTextBlock
:
{
unsigned
char
datalen
=
f
->
loadChar
();
unsigned
char
*
block
=
f
->
loadBlock
(
datalen
);
unsigned
char
pos
=
0
;
// Convert to ascii
while
(
datalen
>
0
)
{
if
(
block
[
pos
]
>=
'a'
-
70
&&
block
[
pos
]
<=
'z'
-
70
)
{
block
[
pos
]
+=
70
;
}
else
if
(
block
[
pos
]
>=
'A'
-
64
&&
block
[
pos
]
<=
'Z'
-
64
)
{
block
[
pos
]
+=
64
;
}
else
if
(
block
[
pos
]
>=
'0'
+
5
&&
block
[
pos
]
<=
'9'
+
5
)
{
block
[
pos
]
-=
5
;
}
else
if
(
block
[
pos
]
==
0x7f
)
{
block
[
pos
]
=
' '
;
}
else
if
(
block
[
pos
]
==
0x73
)
{
block
[
pos
]
=
'\''
;
}
else
if
(
block
[
pos
]
==
'r'
)
{
block
[
pos
]
=
':'
;
}
else
if
(
block
[
pos
]
==
'o'
)
{
block
[
pos
]
=
'('
;
}
else
if
(
block
[
pos
]
==
'p'
)
{
block
[
pos
]
=
')'
;
}
else
if
(
block
[
pos
]
==
0x6b
)
{
block
[
pos
]
=
'!'
;
}
else
if
(
block
[
pos
]
==
0x68
)
{
block
[
pos
]
=
'-'
;
}
else
if
(
block
[
pos
]
==
0x67
)
{
block
[
pos
]
=
'?'
;
}
else
if
(
block
[
pos
]
==
0x66
)
{
block
[
pos
]
=
'.'
;
}
else
if
(
block
[
pos
]
==
0x65
)
{
block
[
pos
]
=
','
;
}
else
if
(
block
[
pos
]
==
'?'
)
{
block
[
pos
]
=
'$'
;
}
pos
++
;
datalen
--
;
}
}
break
;
case
ESceneLength
:
unsigned
short
int
sceneLength
=
f
->
loadShort
();
break
;
case
0x3e
:
case
0x51
:
breakloop
=
true
;
f
->
loadChar
();
break
;
default
:
{
breakloop
=
true
;
}
break
;
}
}
}
}
}
Scene
::
Scene
(
char
*
fileName
)
{
Scene
::
Scene
(
char
*
fileName
)
{
File
*
file
;
File
*
file
;
char
*
string
;
char
*
string
;
int
type
;
int
type
;
int
loop
;
try
{
try
{
...
@@ -50,9 +327,32 @@ Scene::Scene (char * fileName) {
...
@@ -50,9 +327,32 @@ Scene::Scene (char * fileName) {
throw
e
;
throw
e
;
}
}
imageIndex
=
0
;
file
->
seek
(
0x13
,
true
);
// Skip Digital Dimensions header
signed
long
int
dataOffset
=
file
->
loadInt
();
//get offset pointer to first data block
scriptItems
=
file
->
loadShort
();
// Get number of script items
scriptStarts
=
new
signed
long
int
[
scriptItems
];
for
(
loop
=
0
;
loop
<
scriptItems
;
loop
++
)
{
scriptStarts
[
loop
]
=
file
->
loadInt
();
// Load offset to script
}
// TODO: Correct loading of cutscene data
// Seek to datastart now
file
->
seek
(
dataOffset
,
true
);
// Seek to data offsets
dataItems
=
file
->
loadShort
()
+
1
;
// Get number of data items
dataOffsets
=
new
signed
long
int
[
dataItems
];
for
(
loop
=
0
;
loop
<
dataItems
;
loop
++
)
{
dataOffsets
[
loop
]
=
file
->
loadInt
();
// Load offset to script
}
ParseData
(
file
);
ParseScripts
(
file
);
delete
[]
scriptStarts
;
delete
[]
dataOffsets
;
/*
// Skip to files
// Skip to files
file->seek(25, true);
file->seek(25, true);
file->seek(file->loadChar(), true);
file->seek(file->loadChar(), true);
...
@@ -160,7 +460,7 @@ Scene::Scene (char * fileName) {
...
@@ -160,7 +460,7 @@ Scene::Scene (char * fileName) {
// log("Pixels", file->tell());
// log("Pixels", file->tell());
sceneBGs[0] = file->loadSurface(320, 200);
sceneBGs[0] = file->loadSurface(320, 200);
*/
delete
file
;
delete
file
;
return
;
return
;
...
@@ -181,21 +481,32 @@ Scene::~Scene () {
...
@@ -181,21 +481,32 @@ Scene::~Scene () {
int
Scene
::
play
()
{
int
Scene
::
play
()
{
SDL_Rect
dst
;
SDL_Rect
dst
;
unsigned
int
sceneIndex
=
0
;
while
(
true
)
{
while
(
true
)
{
if
(
loop
(
NORMAL_LOOP
)
==
E_QUIT
)
return
E_QUIT
;
if
(
loop
(
NORMAL_LOOP
)
==
E_QUIT
)
return
E_QUIT
;
if
(
controls
.
release
(
C_ENTER
)
||
controls
.
release
(
C_ESCAPE
))
if
(
controls
.
release
(
C_ESCAPE
))
{
return
E_NONE
;
return
E_NONE
;
// TODO: Display cutscene
}
if
(
controls
.
release
(
C_ENTER
))
{
sceneIndex
++
;
if
(
sceneIndex
==
scriptItems
)
{
return
E_NONE
;
}
}
// Temporary stuff
// Temporary stuff
clearScreen
(
BLACK
);
clearScreen
(
BLACK
);
dst
.
x
=
(
screenW
-
320
)
>>
1
;
dst
.
x
=
(
screenW
-
320
)
>>
1
;
dst
.
y
=
(
screenH
-
200
)
>>
1
;
dst
.
y
=
(
screenH
-
200
)
>>
1
;
SDL_BlitSurface
(
sceneBGs
[
0
],
NULL
,
screen
,
&
dst
);
if
(
sceneBGs
[
0
])
SDL_BlitSurface
(
sceneBGs
[
0
],
NULL
,
screen
,
&
dst
);
SDL_Delay
(
T_FRAME
);
SDL_Delay
(
T_FRAME
);
}
}
...
...
src/scene.h
View file @
2b2e53db
...
@@ -23,18 +23,25 @@
...
@@ -23,18 +23,25 @@
#ifndef _SCENE_H
#ifndef _SCENE_H
#define _SCENE_H
#define _SCENE_H
#include <io/file.h>
#include <SDL/SDL.h>
#include <sdl.h>
// Class
// Class
class
Scene
{
class
Scene
{
private
:
private
:
SDL_Surface
*
sceneBGs
[
1
];
SDL_Surface
*
sceneBGs
[
1
00
];
SDL_Color
scenePalette
[
256
];
SDL_Color
scenePalette
[
256
];
unsigned
short
int
scriptItems
;
unsigned
short
int
dataItems
;
signed
long
int
*
scriptStarts
;
signed
long
int
*
dataOffsets
;
int
imageIndex
;
protected
:
void
ParseScripts
(
File
*
f
);
void
ParseData
(
File
*
f
);
void
ParseAni
(
File
*
f
);
public
:
public
:
Scene
(
char
*
fileName
);
Scene
(
char
*
fileName
);
~
Scene
();
~
Scene
();
...
...
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