menu screens: better scaling and positioning

git-svn-id: https://svn.code.sf.net/p/extremetuxracer/code/trunk@241 0420edf4-82e4-42fc-9478-35b55e6d67a3
master
erin10 2010-12-09 16:47:36 +00:00
parent f1190be438
commit 6fa0830093
36 changed files with 639 additions and 1303 deletions

View File

@ -46,6 +46,8 @@ void CAudio::Open () {
void CAudio::Close () {
if (IsOpen) {
Music.FreeMusics ();
Sound.FreeSounds ();
Mix_CloseAudio();
IsOpen = false;
}
@ -65,7 +67,7 @@ bool CAudio::CheckOpen() {
CSound::CSound () {
for (int i=0; i<MAX_SOUNDS; i++) {
sounds[i] = NULL;
sounds[i].chunk = NULL;
active_arr[i] = false;
}
SoundIndex = "";
@ -75,15 +77,12 @@ CSound::CSound () {
int CSound::LoadChunk (const char *name, const char *filename) {
if (Audio.IsOpen == false) return -1;
if (numSounds >= MAX_SOUNDS) return -1;
Mix_Chunk *load = Mix_LoadWAV (filename);
if (load == NULL) return -1;
sounds[numSounds].chunk = Mix_LoadWAV (filename);
if (sounds[numSounds].chunk == NULL) return -1;
sounds[numSounds].channel = -1; // default: no channel
sounds[numSounds].loop_count = 0; // default: playing once
sounds[numSounds] = new TSound;
sounds[numSounds]->chunk = load;
sounds[numSounds]->channel = -1; // default: no channel
sounds[numSounds]->loop_count = 0; // default: playing once
Mix_VolumeChunk (sounds[numSounds]->chunk, param.sound_volume);
Mix_VolumeChunk (sounds[numSounds].chunk, param.sound_volume);
SoundIndex = SoundIndex + "[" + name + "]" + Int_StrN (numSounds);
numSounds++;
return numSounds-1;
@ -110,15 +109,12 @@ void CSound::LoadSoundList () {
}
void CSound::FreeSounds () {
for (int i=0; i<numSounds; i++) {
if (sounds[i] != NULL) {
if (sounds[i]->chunk != NULL) free (sounds[i]->chunk);
free (sounds[i]);
// sounds[i] = NULL;
}
}
HaltAll ();
for (int i=0; i<numSounds; i++)
if (sounds[i].chunk != NULL) Mix_FreeChunk (sounds[i].chunk);
for (int i=0; i<MAX_SOUNDS; i++) {
sounds[i] = NULL;
sounds[i].chunk = NULL;
active_arr[i] = false;
}
SoundIndex = "";
@ -135,9 +131,8 @@ void CSound::SetVolume (int soundid, int volume) {
if (soundid < 0 || soundid >= numSounds) return;
volume = MIN (MIX_MAX_VOLUME, MAX (0, volume));
TSound *sound = sounds[soundid];
if (sound->chunk == NULL) return;
Mix_VolumeChunk (sound->chunk, volume);
if (sounds[soundid].chunk == NULL) return;
Mix_VolumeChunk (sounds[soundid].chunk, volume);
}
void CSound::SetVolume (string name, int volume) {
@ -150,11 +145,10 @@ void CSound::Play (int soundid, int loop) {
if (!Audio.IsOpen) return;
if (soundid < 0 || soundid >= numSounds) return;
if (active_arr[soundid] == true) return;
TSound *sound = sounds[soundid];
if (sound->chunk == NULL) return;
if (sounds[soundid].chunk == NULL) return;
sound->channel = Mix_PlayChannel (-1, sound->chunk, loop);
sound->loop_count = loop;
sounds[soundid].channel = Mix_PlayChannel (-1, sounds[soundid].chunk, loop);
sounds[soundid].loop_count = loop;
if (loop < 0) active_arr[soundid] = true;
}
@ -166,13 +160,12 @@ void CSound::Play (int soundid, int loop, int volume) {
if (!Audio.IsOpen) return;
if (soundid < 0 || soundid >= numSounds) return;
if (active_arr[soundid] == true) return;
TSound *sound = sounds[soundid];
if (sound->chunk == NULL) return;
if (sounds[soundid].chunk == NULL) return;
volume = MIN (MIX_MAX_VOLUME, MAX (0, volume));
Mix_VolumeChunk (sound->chunk, volume);
sound->channel = Mix_PlayChannel (-1, sound->chunk, loop);
sound->loop_count = loop;
Mix_VolumeChunk (sounds[soundid].chunk, volume);
sounds[soundid].channel = Mix_PlayChannel (-1, sounds[soundid].chunk, loop);
sounds[soundid].loop_count = loop;
if (loop < 0) active_arr[soundid] = true;
}
@ -183,14 +176,13 @@ void CSound::Play (string name, int loop, int volume) {
void CSound::Halt (int soundid) {
if (!Audio.IsOpen) return;
if (soundid < 0 || soundid >= numSounds) return;
TSound *sound = sounds[soundid];
if (sound->chunk == NULL) return;
if (sounds[soundid].chunk == NULL) return;
// loop_count must be -1 (endless loop) for halt
if (sound->loop_count < 0) {
Mix_HaltChannel (sound->channel);
sound->loop_count = 0;
sound->channel = -1;
if (sounds[soundid].loop_count < 0) {
Mix_HaltChannel (sounds[soundid].channel);
sounds[soundid].loop_count = 0;
sounds[soundid].channel = -1;
active_arr[soundid] = false;
}
}
@ -203,8 +195,8 @@ void CSound::HaltAll () {
if (!Audio.IsOpen) return;
Mix_HaltChannel (-1);
for (int i=0; i<numSounds; i++) {
sounds[i]->loop_count = 0;
sounds[i]->channel = -1;
sounds[i].loop_count = 0;
sounds[i].channel = -1;
active_arr[i] = false;
}
}
@ -238,14 +230,11 @@ CMusic::CMusic () {
int CMusic::LoadPiece (const char *name, const char *filename) {
if (!Audio.IsOpen) return -1;
if (numMusics >= MAX_MUSICS) return -1;
Mix_Music *load = Mix_LoadMUS (filename);
if (load == 0) {
Message ("could not load", filename);
musics[numMusics] = Mix_LoadMUS (filename);
if (musics[numMusics] == NULL) {
Message ("could not load music", filename);
return -1;
}
musics[numMusics] = new TMusic;
musics[numMusics]->piece = load;
MusicIndex = MusicIndex + "[" + name + "]" + Int_StrN (numMusics);
numMusics++;
return numMusics-1;
@ -294,16 +283,12 @@ void CMusic::LoadMusicList () {
}
void CMusic::FreeMusics () {
for (int i=0; i<numMusics; i++) {
if (musics[i] != NULL) {
if (musics[i]->piece != NULL) free (musics[i]->piece);
free (musics[i]);
}
}
Halt ();
for (int i=0; i<numMusics; i++) if (musics[i] != NULL) Mix_FreeMusic (musics[i]);
for (int i=0; i<MAX_MUSICS; i++) musics[i] = NULL;
MusicIndex = "";
numMusics = 0;
for (int i=0; i<MAX_THEMES; i++) {
for (int j=0; j<3; j++) themes[i][j] = -1;
}
@ -342,11 +327,11 @@ void CMusic::Update () {
bool CMusic::Play (int musid, int loop) {
if (!Audio.IsOpen) return false;
if (musid < 0 || musid >= numMusics) return false;
TMusic *music = musics[musid];
if (music->piece == NULL) return false;
Mix_Music *music = musics[musid];
if (music == NULL) return false;
if (musid != curr_musid) {
Halt ();
Mix_PlayMusic (music->piece, loop);
Mix_PlayMusic (music, loop);
curr_musid = musid;
loop_count = loop;
}
@ -361,13 +346,12 @@ bool CMusic::Play (string name, int loop) {
bool CMusic::Play (int musid, int loop, int volume) {
if (!Audio.IsOpen) return false;
if (musid < 0 || musid >= numMusics) return false;
TMusic *music = musics[musid];
if (music->piece == NULL) return false;
Mix_Music *music = musics[musid];
int vol = MIN (MIX_MAX_VOLUME, MAX (0, volume));
if (musid != curr_musid) {
Halt ();
Mix_PlayMusic (music->piece, loop);
Mix_PlayMusic (music, loop);
Mix_VolumeMusic (vol);
curr_musid = musid;
loop_count = loop;

11
audio.h
View File

@ -39,7 +39,7 @@ public:
// class CSound
// --------------------------------------------------------------------
#define MAX_SOUNDS 64
#define MAX_SOUNDS 32
typedef struct {
Mix_Chunk *chunk;
@ -50,7 +50,7 @@ typedef struct {
class CSound {
private:
TSound *sounds[MAX_SOUNDS];
TSound sounds[MAX_SOUNDS];
int numSounds;
string SoundIndex;
bool active_arr[MAX_SOUNDS];
@ -88,14 +88,9 @@ public:
#define MAX_MUSICS 32
#define MAX_THEMES 16
typedef struct {
Mix_Music *piece;
// perhaps we need more params ...
} TMusic;
class CMusic {
private:
TMusic *musics[MAX_MUSICS];
Mix_Music *musics[MAX_MUSICS];
int numMusics;
string MusicIndex;

View File

@ -28,6 +28,7 @@ const TColor colDDYell = {0.8, 0.6, 0.0, 1.0};
const TColor colYellow = {1.0, 1.0, 0.0, 1.0};
const TColor colLYell = {1.0, 1.0, 0.4, 1.0};
const TColor colOrange = {1.0, 0.5, 0.0, 1.0};
const TColor colLRed = {1.0, 0.3, 0.3, 1.0};
const TColor colRed = {1.0, 0.0, 0.0, 1.0};
const TColor colDRed = {0.8, 0.0, 0.0, 1.0};
const TColor colGrey = {0.5, 0.5, 0.5, 1.0};
@ -35,7 +36,7 @@ const TColor colLGrey = {0.7, 0.7, 0.7, 1.0};
const TColor colDGrey = {0.3, 0.3, 0.3, 1.0};
const TColor colBlack = {0.0, 0.0, 0.0, 1.0};
const TColor colBlue = {0.0, 0.0, 1.0, 1.0};
const TColor colLBlue = {0.5, 0.7, 0.9, 1.0};
const TColor colLBlue = {0.5, 0.7, 1.0, 1.0};
const TColor colDBlue = {0.0, 0.0, 0.6, 1.0};
const TColor colLBackgr = {0.5, 0.7, 0.9, 1.0};
const TColor colBackgr = {0.4, 0.6, 0.8, 1.0};

View File

@ -32,6 +32,7 @@ extern const TColor colDDYell;
extern const TColor colYellow;
extern const TColor colLYell;
extern const TColor colOrange;
extern const TColor colLRed;
extern const TColor colRed;
extern const TColor colDRed;
extern const TColor colGrey;

View File

@ -794,8 +794,8 @@ bool CCourse::LoadCourseList () {
CourseList[i].author = SPStrN (line, "author", "unknown");
desc = SPStrN (line, "desc", "");
if (param.use_papercut_font > 0) FT.SetSize (18); else FT.SetSize (12);
FT.MakeLineList (desc.c_str(), &desclist, 220);
FT.AutoSizeN (2);
FT.MakeLineList (desc.c_str(), &desclist, 300 * param.scale);
cnt = desclist.Count ();
if (cnt > MAX_DESCRIPTION_LINES) cnt = MAX_DESCRIPTION_LINES;
CourseList[i].num_lines = cnt;

View File

@ -25,6 +25,7 @@ GNU General Public License for more details.
#define TOP_Y 160
#define BOTT_Y 64
#define OFFS_SCALE_FACTOR 1.2
static TCredits CreditList[MAX_CREDITS];
static int numCredits = 0;
@ -38,7 +39,8 @@ void LoadCreditList () {
CSPList list(MAX_CREDITS);
string creditfile;
int i, offset;
int i;
double offset;
string item;
string line;
@ -51,8 +53,8 @@ void LoadCreditList () {
line = list.Line(i);
CreditList[i].text = SPStrN (line, "text", "");
offset = SPIntN (line, "offs", 0);
if (i>0) CreditList[i].offs = CreditList[i-1].offs + offset;
offset = SPFloatN (line, "offs", 0) * OFFS_SCALE_FACTOR * param.scale;
if (i>0) CreditList[i].offs = CreditList[i-1].offs + (int)offset;
else CreditList[i].offs = offset;
CreditList[i].col = SPIntN (line, "col", 0);
@ -62,21 +64,21 @@ void LoadCreditList () {
}
void DrawCreditsText (double time_step){
int w = param.x_resolution;
int h = param.y_resolution;
double w = (double)param.x_resolution;
double h = (double)param.y_resolution;
double offs = 0.0;
int i;
TColor col;
if (moving) y_offset += time_step * 30;
for (i=0; i < numCredits; i++) {
offs = h - 100 - y_offset + CreditList[i].offs;
if (CreditList[i].col == 0) col = colWhite;
else col = colDYell;
FT.SetColor (col);
FT.SetSize (CreditList[i].size);
FT.AutoSizeN (CreditList[i].size);
FT.DrawString (-1, (int)offs, CreditList[i].text);
}
@ -191,7 +193,7 @@ void CreditsLoop (double time_step) {
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
Tex.Draw (T_TITLE_SMALL, -1, AutoYPos (10), 1);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), param.scale);
Reshape (ww, hh);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -1,40 +1,40 @@
# the credits list is still incomplete and only a suggestion
*[offs] 0 [text] Extreme Tux Racer [font] 0 [size] 36 [col] 1
*[offs] 50 [text] Version 0.5 [font] 0 [size] 16 [col] 0
*[offs] 40 [text] Release "Bunny Hill" [font] 0 [size] 24 [col] 1
*[offs] 50 [text] Copyright © 1999 - 2000 Jasmin F. Patry[font] 0 [size] 20 [col] 0
*[offs] 25 [text] Copyright © 2010 Extreme Tux Racer Team[font] 0 [size] 20 [col] 0
*[offs] 40 [text] on the web at: www.extremetuxracer.com [font] 0 [size] 20 [col] 0
*[offs] 0 [text] Extreme Tux Racer [font] 0 [size] 7 [col] 1
*[offs] 50 [text] Version 0.6 [font] 0 [size] 3 [col] 0
*[offs] 40 [text] Release "Bunny Hill" [font] 0 [size] 4 [col] 1
*[offs] 50 [text] Copyright © 1999 - 2000 Jasmin F. Patry[font] 0 [size] 3 [col] 0
*[offs] 25 [text] Copyright © 2010 Extreme Tux Racer Team[font] 0 [size] 3 [col] 0
*[offs] 40 [text] on the web at: www.extremetuxracer.com [font] 0 [size] 3 [col] 0
*[offs] 40 [text] The ETR Team: [font] 0 [size] 24 [col] 1
*[offs] 30 [text] Christian Picon [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Nicosmos [font] 0 [size] 20 [col] 0
*[offs] 30 [text] R. Niehoff [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Steven Bell [font] 0 [size] 20 [col] 0
*[offs] 40 [text] The ETR Team: [font] 0 [size] 4 [col] 1
*[offs] 30 [text] Christian Picon [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Nicosmos [font] 0 [size] 3 [col] 0
*[offs] 30 [text] R. Niehoff [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Steven Bell [font] 0 [size] 3 [col] 0
*[offs] 40 [text] Authors Of Tuxracer: [font] 0 [size] 24 [col] 1
*[offs] 30 [text] Eric Hall [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Jasmin Patry [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Mark Riddell [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Patrick Gilhuly [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Rick Knowles [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Vincent Ma [font] 0 [size] 20 [col] 0
*[offs] 40 [text] Authors Of Tuxracer: [font] 0 [size] 4 [col] 1
*[offs] 30 [text] Eric Hall [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Jasmin Patry [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Mark Riddell [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Patrick Gilhuly [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Rick Knowles [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Vincent Ma [font] 0 [size] 3 [col] 0
*[offs] 40 [text] Thanks To: [font] 0 [size] 24 [col] 1
*[offs] 30 [text] Christian Picon (music, font)[font] 0 [size] 20 [col] 0
*[offs] 30 [text] Daniel Poeira (font)[font] 0 [size] 20 [col] 0
*[offs] 30 [text] Joseph Toscano (music)[font] 0 [size] 20 [col] 0
*[offs] 30 [text] Larry Ewing (creator of Tux) [font] 0 [size] 20 [col] 0
*[offs] 30 [text] Ulrich Thatcher (quadtree algorithm)[font] 0 [size] 20 [col] 0
*[offs] 40 [text] Thanks To: [font] 0 [size] 4 [col] 1
*[offs] 30 [text] Christian Picon (music, font)[font] 0 [size] 3 [col] 0
*[offs] 30 [text] Daniel Poeira (font)[font] 0 [size] 3 [col] 0
*[offs] 30 [text] Joseph Toscano (music)[font] 0 [size] 3 [col] 0
*[offs] 30 [text] Larry Ewing (creator of Tux) [font] 0 [size] 3 [col] 0
*[offs] 30 [text] Ulrich Thatcher (quadtree algorithm)[font] 0 [size] 3 [col] 0
*[offs] 40 [text] Translations: [font] 0 [size] 24 [col] 1
*[offs] 30 [text] Nicosmos (French)[font] 0 [size] 20 [col] 0
*[offs] 30 [text] Woody (Polish)[font] 0 [size] 20 [col] 0
*[offs] 40 [text] Translations: [font] 0 [size] 4 [col] 1
*[offs] 30 [text] Nicosmos (French)[font] 0 [size] 3 [col] 0
*[offs] 30 [text] Woody (Polish)[font] 0 [size] 3 [col] 0
*[offs] 50 [text] ----------------------- [font] 0 [size] 20 [col] 0
*[offs] 30 [text] This program is distributed in the hope that it will be useful, [font] 1 [size] 14 [col] 0
*[offs] 20 [text] but WITHOUT ANY WARRANTY; without even the implied warranty of [font] 1 [size] 14 [col] 0
*[offs] 20 [text] MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [font] 1 [size] 14 [col] 0
*[offs] 20 [text] GNU General Public License for more details. [font] 1 [size] 14 [col] 0
*[offs] 50 [text] ----------------------- [font] 0 [size] 3 [col] 0
*[offs] 30 [text] This program is distributed in the hope that it will be useful, [font] 1 [size] 2 [col] 0
*[offs] 20 [text] but WITHOUT ANY WARRANTY; without even the implied warranty of [font] 1 [size] 2 [col] 0
*[offs] 20 [text] MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [font] 1 [size] 2 [col] 0
*[offs] 20 [text] GNU General Public License for more details. [font] 1 [size] 2 [col] 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

View File

@ -1,49 +0,0 @@
Something about the structure
The character tool of Tuxracer is supposed to make shaping and adjusting of sphere-orientated characters easier. Before we look at this tool, some preliminary remarks:
- Look at the picture "char_struct.png" and the file "tux.lst". You must know the way how Tux and other characters are shaped. I suggest to print out the 2 sources before starting.
- You see that the figure is a hierarchic structure with parent and child nodes. Except the root node and the end nodes at the bottom each node has a parent and at least one child. Also look at the list to see how the child nodes and parent nodes are defined.
- Numeric values are used for the notation of the nodes, not literal identifiers. There are two reasons: It's easier to navigate in a list of sorted numbers, and the numbers allow a faster access. The latter reason is important because the character takes a lot of performance.
- Only a few nodes are visible and represent a sphere or ellipsoid that will be drawn. On the structure they are marked yellow. On the list they are marked [vis] with a level. The higher the level the better the appearance of the node - and the more performance it takes. [vis] 3 is quite raw, and 10 is very nice. It doesn't make sense to draw a little toe on level 10 or higher whereas the body or heads need a higher level.
- Besides the visible nodes there are different kinds of hidden nodes. They contain different transform actions like transformation, scale or rotation. By adjusting these parameters the character gets the desired shape and size. Very important are the blue-framed joint nodes, without any transform statements. These nodes are the interface nodes for the different kinds of animation. The keyframes use joint nodes, too. For this reason, the joints are specially named in the list ([joint]).
- You may want to add a node. Make sure that the related parent node is already in the list ! The best will be to append the new node at the end of the list.
- You can delete a node, too. But in this case you can run into troubles if the node is used as parent. Be careful and check the dependencies. The visible nodes, which are normally end nodes without childs, should be trouble-free.
- Most nodes contain an [order] entry. This entry controls the order of the transformations. The order is not abitrary! That means, it's a difference if you rotate around the x-axis first and then around the y-axis instead of the reverse. For full understanding you should be a bit familiar with the transformation matrices of OpenGL. Or try. The [order] statement is encoded as follows:
0 - trans
1 - rot x-axis
2 - rot y-axis
3 - rot z-axis
4 - scale
5 - level of visibility
9 - rot y-axis, using the vector component z (special case)
It's impossible to explain the complete structure, but you will become familiar with it by doing. The tool will help a bit. But you should have in mind what the tool does NOT. You can't add or remove nodes, that must be done by editing the list. Also you can't define materials or set the shadow flag with the tool.
The character tool of ETR
- First copy "tux.lst" to "test.lst". The latter will be automatically loaded when you start the tool with "./etr 2". On the right you see the figure, you can change the view by using the mouse. Click and drag for rotating (left button), moving (right button) or zooming (wheel).
- On the left there is a list of all nodes. You can select a node with the 4 cursor keys. Below this list you see a list of available transformations, dependent of the node. Select a transformation with PAGEUP or PAGEDOWN. And now you can change the adjustments. Type "1", "2" or "3" on the numeric keypad, together with SHIFT if you want the inverse impact. The results of these modifications can be seen immediately.
- About the view: The figure is always drawn perspectively, never orthogonally. So don't wonder when the direction changes a bit in the case you move the figure. Also the figure is drawn with active lighting. So you can evaluate the effects of specular lights, for example. Sometimes it might be helpful to disable the material adjustments, therefore type "m".
- There's not a real undo option, that would be too much effort. But you can undo the changes of the current node by typing "u". After selecting another node, the undo will work no longer.
- To save the changes type "s". The tool generates a new character list and stores it back to "test.lst". That can be done anytime.

104
doc/code
View File

@ -1,104 +0,0 @@
Extreme Tux Racer - Code Documentation
by Reinhard Niehoff, edited by Kristian Picon
---------------------------------------------
Some internal changes:
---------------------------------------------
The Tcl scripting library has been completely replaced with the SP library,
written exclusively for Extreme Tux Racer. Because of this modification, some
modules or methods are now obsolete: the Tcl hash tables, the "list" module etc.
A restrained approach to C++ has been taken. The entire program can be compiled
with g++, but there are only a few C++ classes. Most of these classes are
implemented for the sake of clarity. For example, when you see the function
"Env.DrawFog", you know that this function is declared and defined
in the module env.cpp. The global instance Env of the class CEnvironment is
available throughout the code. The same with some other classes. And of course,
the classes put together data and their functions. This makes the
code clearer.
A substantial change has been made to the phys_sim module (now physics.cpp),
though most of the functions are left unchanged or with little
modification. There is a new class CControl that encapsulates all parameters
of the traditional "TControl" structure, as well as the functions of the old
phys_sim. All of this belongs together, and this class is really sensible
and will simplify the implementation of multiplayer mode. Some functions have
been moved to other modules, for example TuxOrientation to tux.cpp or
FindCourseNormal to course.cpp. All functions should now have a logical location.
----------------------------------------------
Completely or almost completely rewritten modules
----------------------------------------------
The old modules audio.c and audio_data.c have been replaced with audio.cpp.
The old code was, to say the least, too long and convoluted.
The same with game_config, and with many parts of other modules.
A significant number of modules have not been completely rewritten, but
have been altered almost in their practical entirety. For example
winsys.cpp. It is shorter and clearer now, and it contains
the joystick functions (only a few lines). The module joystick.c has
been rendered obsolete.
These are only some examples. Compare the new code with the original code
and you will find that more than 60 % is rewritten. That's less than the
code of the Bunny Hill rewrite, but the intention of the ETR rewrite was
to clean up und clear up the code first, and enhance it
with new functions, later.
One effect of the clearance is shorter code. Three examples:
1) In the old code there are 5 modules responsible for the Tux character:
tux.c, tux_shadow.c, hier.c, hier_cb.c and hier_util.c
That are about 1850 lines in total (okay, 1500 to 1600 lines without comments).
The new code contains all the functions in a single module (tux.cpp)
with a total of 720 lines.
2) The audio modules. In Tuxracer 0.61 there are 2 modules,
audio.c and audio_data.c
with 1630 lines in total. The new code contains only 1 module with 300 lines!
3) The old race_select.c consists of 1300 lines; the reworked, new code
contains 230 lines - and does at least the same, of course.
------------------------------------------------------------------
Unchanged modules
------------------------------------------------------------------
Some modules are almost unchanged (except the formal style). That doesn't mean
that these modules will never be modified. I think, eventually all the code
must be completely rewritten. But some tasks are not very urgent or too
extensive at the moment. Here the modules which are nearly unchanged:
view.cpp, quadtree.cpp, hud.cpp, trackmarks.cpp and parts of particles.cpp
------------------------------------------------------------------
Comments
------------------------------------------------------------------
I know, a good code should be well-commented. For me, the best commentation
is a clear and well-ordered structure. It sounds unbelievable but first I
removed all comments in the original code to make it understandable for me.
So excuse the lack of comments in the new code. Perhaps, some day ...
-------------------------------------------------------------------
BTW
-------------------------------------------------------------------
Some people, including the authors of Tuxracer 0.61, prefer the following formal style:
scale_vector( -2. * dot_product( *vel, treeNml ) , treeNml ) ,*vel ) ;
Okay, this isn't very important (there are more important things) for the effectiveness
of the code, but I have problems to putting up with this style. Additionally, the
accumulation of underscores is bothersome:
static vector_t adjust_tux_zvec_for_roll( player_data_t *plyr, vector_t vel, vector_t zvec )
All clear? Oh yes, reading the code of other developers is pleasurable, and
so I leave you with: have fun with my code ;-)

View File

@ -1,139 +0,0 @@
Extreme Tux Racer - Courses, Cups and Events...
by Reinhard Niehoff, edited by Kristian Picon
----------------------------------------------------
The new course format
----------------------------------------------------
It's not really new, there are only some minor changes from
ETR 0.4. The 3 maps (elev.png, terrain.png and trees.png) are the same
as in ETR. The preview is a bit larger now (192 x 144). I've taken all
preview shots without huds, but that's a matter of taste.
The most significant change is the new format for course description.
Up to now the params were listed in the file course.tcl. Now we use
an SP list for this purpose. The syntax differs but the content is
almost the same: course dimensions, start point, angle and scale are
the same as of this writing. But there are some additional entries:
[env] etr
With this environment entry you select the location, not the weather
or time of day. Currently there are 2 locations, each with the
well-known 4 lightings (sunny, foggy, evening, night). Without this entry
the location will fall back to standard (tuxracer).
There is also:
[start_keyframe] tux_jump.lst
[success_keyframe] tux_joice.lst
[failure_keyframe] tux_sad.lst
[final_keyframe] tux_wait.lst
These entries are not used yet since there is only the start keyframe
implemented. In future versions there will be some keyframes for the
finish stage, too.
----------------------------------------------------
trees.png or items.lst?
----------------------------------------------------
In trees.png each tree or other object is marked as a colored dot.
This bitmap corresponds to the other bitmaps (elev.png for the height
and terrain.png for the textures). The advantage of the trees.png is
that the objects can be positioned in a fast and easy way. However, the bitmap
can store only the position, no information about scale, rotation,
collision, sound etc. For more particular description of the objects
ETR uses the text file items.lst. This method has a disadvantage,
too. It's very difficult and fiddly to edit this file, specifically
the positioning of objects is almost impossible.
ETR can read both the trees.png and the items.lst. This facilitates
the procedure considerably. It is best to position items in two steps. First
you should create or edit trees.png with all objects. Then, you can edit
and complete the entries in items.lst, if desirable or necessary.
How do trees.png and items.lst work together? In ETR the items.lst
has priority. If this file can be found, it is loaded and used while
trees.png is ignored. If items.lst doesn't exist, ETR loads
trees.png instead, generates an items list, and saves this list immediately.
Sometimes you may want to use trees.png even though an items list is present.
In this case you can type "t" on the race_select screen. But watch out!
The existing items.lst will be overwritten, that can be fatal if the list
already contains a lot of manual changes. It's strongly advised that one
backup the items list after having edited it manually.
Another aspect:
Trees should have different sizes, otherwise they look boring and too synthetic.
When Tuxracer reads the trees.png it scales the trees at random (height
and diameter). You can find these values in the automatically generated
items.lst. If you are not content with the appearance you should use the
trees.png again (see hint above). The range of size variation and the basic
size can be adjusted on the race_select screen (press "c" and "v", see the
End User Documentation in the guide file for more info).
In future versions, the items list will contain more information: scale,
rotation, exact position, etc. Then an entry in items.lst can look like this:
[pos] 23.5 0.0 -135.9 [scale] 3.4 1.9 2.1 [rotation] -15 27 -22
Notice that the y-position is 0.0. This value is not used since it can
be exactly calculated when the course is loaded.
--------------------------------------------------
What about rotation in current version?
--------------------------------------------------
The rotation can't be adjusted and is not done at random like the scaling.
Nevertheless all trees are a bit rotated (1°). Which is necessary to avoid
flickering if 2 trees are at same z-postion and close together. The
flickering is a result of parallel intersection of textures.
--------------------------------------------------
Defining courses and events
--------------------------------------------------
You must tell ETR 0.5.5 that a course exists. That's different from 0.4 and
PPRacer where the course directory is scanned by TCL. The course list
(courses.lst) has an extremely simple structure:
*[name] Twisty Slope [dir] twisty_slope
[desc] Tight twists make grabbing herring difficult. Hard turns ...
*[name] ...
A (little) advantage is that you can specify the order of the courses on
the race_select screen. Or you can deactivate a course by commenting out the
entry.
The event list (events.lst) is a bit more complex, but still easier than the list in
ETR 0.4 or PPRacer. The list consists of 3 parts, the first is where the
races are:
*[struct] 0 [race] race_bunnyhill [course] bunny_hill [light] sunny [snow] 0 [wind] 0
[herring] 20 22 23 [time] 37 34 30
*[struct] 0 [race] race_twistyslope [course] twisty_slope [light] night [snow] 0 [wind] 0
[herring] 21 23 24 [time] 43 39 34
This is essentially the same as the course list, but completed with information
about the weather conditions and the race challenges. A course may be used
multiple times and redefined with different conditions.
The second part contains the cups:
*[struct] 1 [cup] canadian [name] Canadian Cup
[num] 3 [1] race_bunnyhill [2] race_twistyslope [3] race_bumpyride
[desc] The classic Tuxracer cup for beginners. Learn to paddle ...
The cup entries access one or more races (see second line). Additional
there is a description that appears on the event_select screen.
The third and last part contains the events. The following entry
describes the only event in the current program:
*[struct] 2 [event] classics [name] Tux Racer Classics
[num] 2 [1] canadian [2] swiss
--
Good luck with your course creation!

104
doc/guide
View File

@ -1,104 +0,0 @@
Extreme Tux Racer - End User Documentation
by Reinhard Niehoff, edited by Kristian Picon
-------------------------------------------
Important keys
-------------------------------------------
1, 2, 3 - different camera modes (standard is 2)
f - hide or show fps display as part of the hud (heads-up display)
s - screenshot (in folder "screenshots")
h - hide or show hud
u - toggle snowflakes on menu screens
There are some special functions which might be relevant for newcomers
who are interested in the compoments of the scenery. You can toggle
the following elements:
F5 - skybox
F6 - fog
F7 - terrain
F8 - trees and objects
For generating the item list by parsing the trees.png file the
following keys might be helpful:
t - sets priority to trees.png and generates an items.lst
c - value of size of trees (1 ... 5)
v - value for size variation (1 ... 5)
-------------------------------------------
The configuration screen
-------------------------------------------
The most important adjustments can be done at runtime at the
config screen. Most options should be self-explanatory.
"Auto" for resolution means that the program uses the same values
as set in the basic computer configuration. That's not convenient
in windowed mode since it ignores the menu/task bar on the screen.
There are 3 levels of detail:
1 - for very slow computers (no trackmarks, particles etc.)
2 - most details are shown but on an lower level
3 - best appearance, today's computers should have no problems with this
The adjustments are entered and stored in the file "options".
Editing this file is possible, but not necessary.
# 0 = framed window | 1 = fullscreen
[fullscreen] 1
# resolution type: 0 = auto | 1 = 800 x 600 | 2 = 1024 * 768
[res_type] 0
# level of details 1 ... 3
[detail_level] 3
# maximal values are 120
[sound_volume] 60
[music_volume] 30
-------------------------------------
The options file
-------------------------------------
The following adjustments must be done by editing the options file,
they don't appear on the config screen. The file is not commented
yet, that will be done in a future version.
# Index to a language list
[language] 0
# the distances where the course clipping begins
[forward_clip_distance] 75
[backward_clip_distance] 20
# field of view, similar to the focal length at a camera lens
[fov] 60
# color depth, 0 = auto, 1 = 16, 2 = 32
[bpp_mode] 1
# some performance parameters
[tree_detail_distance] 20
[tux_sphere_divisions] 10
[tux_shadow_sphere_div] 3
# This parameter should be obsolete soon. It's the distance where
# the trees are not drawn crosswise but as simple plane textures.
[course_detail_level] 75
# You can choose between 2 font styles: 0 Helvetica, 1 Papercut
# If the value is 2, the huds are drawn with Papercut, too
[use_papercut_font] 1
# Cursor style: 0 normal alrrow cursor, 1 icicle
[ice_cursor] 1
# Normally the sky is drawn with 6 textures (a cube). In the Tuxracer scene
# are only 3 textures visible (left, front, right). So it's faster to draw
# only the visible textures. In addition, it spares resources.
# If set to 1, all 6 textures will be drawn (they have to exist!).
[full_skybox] 0

View File

@ -1,14 +0,0 @@
You may want to know how the score points are calculated. Sometimes you have to decide between a shorter time or an additional herring. For this reason, I've tried to make the algorithm as transparent as possible.
The basis rule is clear and easy:
1 herring - 10 points
1 second gain of time - 10 points (with resolution 0.1 second - 1 point)
Score is the sum of herring points and time points.
The herring points are calculated absolutely, starting with 0. For the time points we need a reference value; the difference between this value and the reached time is the result. Apparently the reference value must be high enough so that we don't get negative results. Additionally the reference should depend from the course length: the larger the course the higher the value. In the algorithm the reference is proportional to the course length, divided by 10.
Example: The course "Bunny Hill" is 520 units long, thus the reference time value is 52. If you reach the finish line after 31.3 seconds, you get (52 - 31.3) * 10 = 207 time points. With 21 herrings the score is 417.
This algorithm seems to be rough and inexact, and it doesn't allow to compare the results of different courses. That's right, but the courses differ too much. All attempts to make the race results comparable can't be successful. You would have to work with weighted values for time and herrings, so that the user won't be able to evaluate the situation when racing.

View File

@ -1,253 +0,0 @@
{\rtf1\ansi\deff1\adeflang1025
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fswiss\fprq0\fcharset0 DejaVu Sans;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fnil\fprq0\fcharset0 DejaVu Sans;}{\f4\fswiss\fprq0\fcharset0 DejaVu Sans;}{\f5\fswiss\fprq2\fcharset0 Arial;}{\f6\fnil\fprq0\fcharset128 OpenSymbol{\*\falt Arial Unicode MS};}{\f7\fswiss\fprq2\fcharset128 DejaVu Sans;}{\f8\fnil\fprq2\fcharset0 DejaVu Sans;}{\f9\fswiss\fprq2\fcharset0 DejaVu Sans;}}
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
{\stylesheet{\s1\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\snext1 Normal;}
{\s2\sb240\sa120\keepn\rtlch\af8\afs28\lang255\ltrch\dbch\af8\langfe255\hich\f2\fs28\lang1031\loch\f2\fs28\lang1031\sbasedon1\snext3 Heading;}
{\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext3 Body Text;}
{\s4\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon3\snext4 List;}
{\s5\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\f3\fs24\lang1031\i\loch\f3\fs24\lang1031\i\sbasedon1\snext5 caption;}
{\s6\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f3\fs24\lang1031\loch\f3\fs24\lang1031\sbasedon1\snext6 Index;}
{\s7\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 Heading;}
{\s8\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext8 caption;}
{\s9\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext9 Index;}
{\s10\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading;}
{\s11\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext11 WW-caption;}
{\s12\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext12 WW-Index;}
{\s13\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading1;}
{\s14\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext14 WW-caption1;}
{\s15\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext15 WW-Index1;}
{\s16\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af9\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading11;}
{\s17\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext17 WW-caption11;}
{\s18\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext18 WW-Index11;}
{\s19\sb240\sa120\keepn\rtlch\af5\afs28\lang255\ltrch\dbch\af1\langfe255\hich\f5\fs28\lang1031\loch\f5\fs28\lang1031\sbasedon1\snext3 WW-Heading111;}
{\s20\sb120\sa120\rtlch\afs24\lang255\ai\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\i\loch\fs24\lang1031\i\sbasedon1\snext20 WW-caption111;}
{\s21\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext21 WW-Index111;}
{\s22\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext22 Table Contents;}
{\s23\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext23 WW-Table Contents;}
{\s24\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon23\snext24 Table Heading;}
{\s25\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext25 WW-Table Contents1;}
{\s26\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon25\snext26 WW-Table Heading;}
{\s27\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext27 WW-Table Contents12;}
{\s28\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon27\snext28 WW-Table Heading1;}
{\s29\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext29 WW-Table Contents123;}
{\s30\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon29\snext30 WW-Table Heading12;}
{\s31\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031\sbasedon1\snext31 Table Contents;}
{\s32\qc\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b\sbasedon31\snext32 Table Heading;}
{\*\cs34\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 1;}
{\*\cs35\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 2;}
{\*\cs36\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 3;}
{\*\cs37\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 4;}
{\*\cs38\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 5;}
{\*\cs39\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 6;}
{\*\cs40\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 7;}
{\*\cs41\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 8;}
{\*\cs42\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 9;}
{\*\cs43\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 2 10;}
{\*\cs44\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 1;}
{\*\cs45\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 2;}
{\*\cs46\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 3;}
{\*\cs47\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 4;}
{\*\cs48\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 5;}
{\*\cs49\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 6;}
{\*\cs50\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 7;}
{\*\cs51\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 8;}
{\*\cs52\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 9;}
{\*\cs53\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 RTF_Num 3 10;}
{\*\cs54\cf0\rtlch\af1\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang1031\loch\f1\fs24\lang1031 Numbering Symbols;}
{\*\cs55\cf0\rtlch\af6\afs24\lang255\ltrch\dbch\af6\langfe255\hich\f6\fs24\lang1031\loch\f6\fs24\lang1031 Bullet Symbols;}
}
{\info{\creatim\yr2010\mo11\dy15\hr15\min35}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern3000}}\deftab709
{\*\pgdsctbl
{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
{\*\pgdscno0}\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
\pard\plain \ltrpar\s3\sa120\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs28\lang1031\b\loch\fs28\lang1031\b {\rtlch \ltrch\loch\f1\fs28\lang1031\i0\b The character tools of Extreme Tux Racer}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0{\rtlch\ltrch\hich\b\loch\b Note}}{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 : Now the keyframes are built and adjusted on per-character basis. The consequence is that each character gets its own set of keyframes. They are placed in the particular character folder. The folder can contain the following files:}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - shape.lst - the file for building the character}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - preview.png - an image for the entrance screen}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - start.lst - the keyframe for the intro mode}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - finish.lst - neutral keyframe for the final stage}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - wonrace.lst - the same but used in case that the race was successful}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - lostrace.lst - that should be clear}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 The animations rules should be part of the character, too, but that will be implemented later.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b Starting the tools}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 For running the character tools you have to start the program by}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 \tab ./etr --char folder keyframe}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 where folder is the character folder (e.g. \'84samuel\'93) and keyframe one of the frame descriptions in this folder (e.g. \'84wonrace.lst\'93). Probably it's a good idea to create a special test folder.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b The tool modes}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 There are 3 modes:}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - char mode - for shaping the figure}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - frame mode - for editing a singe frame of a keyframe sequence}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 - sequence mode - running the keyframe with real time}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 After starting the tools you are in char mode.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b View}
\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 In char mode you can rotate and move the figure (see tables below). Also you can zoom in and out.}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 In frame mode it doesn't make sense to move or rotate the figure freely because the position as well as the rotations are adjusted by the frames. To get another view we have to move and rotate the camera whereas the figure keeps the specified adjustments.
It's not easy to orientate oneself by changing the camera position and direction, but it might be helpful to use <1> ... <8>. That sets the camera on fixed positions around the reference point (0, 0, 0).}
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0{\rtlch\ltrch\hich\b\loch\b Keyboard function in the different modes:}}{\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b0 \tab }
\par \pard\plain \ltrpar\s3\sa120\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\b\loch\f7\fs20\lang1031\b
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\b\loch\f7\fs18\lang1031\b {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b char mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\b\loch\f7\fs20\lang1031\b {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b frame mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\b\loch\f7\fs18\lang1031\b {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b sequence mode}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <PAGE_DOWN>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <PAGE_UP>}
\par \pard\plain \intbl\ltrpar\s22\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <HOME> <END>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 select node}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 select frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_DOWN>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_UP>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 select }
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 transformation}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 select }
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 joint}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <SPACE>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 select vector component }
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_LEFT>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CRSR_RIGHT>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 change value of}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 selected component}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 rotate joint}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <1> ... <4>}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <1> ... <8>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 set standard}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 orientations}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 set standard}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 views}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <TAB>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 go to frame mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 go to char mode}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 back to frame mode}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <ESCAPE>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 quit program}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 quit program}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 back to frame mode}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <ENTER>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 start sequence}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 repeat sequence}
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <M>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 show / hide material}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 show / hide material}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <H>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 toggle highlighting}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 toggle highlighting}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <R>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 reload character}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <U>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 reset current node}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <-> <+> <=>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 zoom}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <S>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 save character}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 save keyframe seq.}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <A><INST>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 add, insert frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trrh312\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <DEL>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 delete frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CTRL> + <C>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 copy }
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <CTRL> + <V>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 paste}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <C>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 clear current frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <P>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 copy previous frame}
\par \pard\plain \intbl\ltrpar\s22\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 to current frame}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <0> (zero)}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 set current value to}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 0.0}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <F1> <F2>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 change camera rotation}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \trowd\trql\trleft17\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4827\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7233\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031 {\rtlch \ltrch\loch\f7\fs18\lang1031\i0\b0 <F3> <F4>}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs20\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 change camera}
\par \pard\plain \intbl\ltrpar\s22\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs20\lang1031\loch\f7\fs20\lang1031 {\rtlch \ltrch\loch\f7\fs20\lang1031\i0\b0 distance}
\cell\pard\plain \intbl\ltrpar\s22\ql\rtlch\af7\afs18\lang255\ltrch\dbch\af9\langfe255\hich\f7\fs18\lang1031\loch\f7\fs18\lang1031
\cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \pard\plain \ltrpar\s1\ql\rtlch\afs24\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\b\loch\fs24\lang1031\b {\rtlch \ltrch\loch\f1\fs24\lang1031\i0\b Mouse functions:}
\par \pard\plain \ltrpar\s1\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\par \pard\plain \ltrpar\s1\ql\rtlch\afs24\lang255\ltrch\dbch\af9\langfe255\hich\fs24\lang1031\loch\fs24\lang1031
\par \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b char mode}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b frame mode}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ab\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\b\loch\fs18\lang1031\b {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b sequence mode}
\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 WHEEL}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 zoom}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 zoom}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 LEFT BUTTON}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 rotate figure}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx2409\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx4818\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx7227\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9637
\pard\intbl\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 RIGHT BUTTON}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031 {\rtlch \ltrch\loch\f1\fs18\lang1031\i0\b0 move figure}
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\pard\plain \intbl\ltrpar\s23\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\afs18\lang255\ltrch\dbch\af9\langfe255\hich\fs18\lang1031\loch\fs18\lang1031
\par }

View File

@ -1,211 +0,0 @@
# Character definition
# [par] = parent node
# [order] = order of transform actions
# [name] only used for information on the tool screen
# [joint] a identifier that relaces the numeric identifier in case that
# the node contains a joint
# 0 translation
# 1 x-rotation
# 2 y-rotation
# 3 z-rotation
# 4 scale
# 5 visible
# 9 additionl y-rotation, use z component
# material
*[material] 1 [mat] whitecol [diff] 0.78 0.78 0.78 [spec] 0.2 0.2 0.2 [exp] 50.0
*[material] 1 [mat] blackcol [diff] 0.1 0.1 0.1 [spec] 0.5 0.5 0.5 [exp] 20.0
*[material] 1 [mat] beakcol [diff] 0.64 0.54 0.06 [spec] 0.4 0.4 0.4 [exp] 5.0
*[material] 1 [mat] iriscol [diff] 0.01 0.01 0.41 [spec] 0.4 0.4 0.4 [exp] 90.0
# -----------------------------------------------------------------------------------
# body
*[node] 01 [par] 00 [order] 4 [scale] 0.35 0.35 0.35
[name] complete figure
*[node] 02 [par] 01 [order] 4 [scale] 0.9 0.9 0.9
[name] body
*[node] 72 [par] 02 [order] 45 [vis] 10 [scale] 0.95 1.0 0.8 [mat] blackcol [shad] 1
[name] black part of the body
*[node] 73 [par] 02 [order] 045 [vis] 10 [trans] 0 0 0.17 [scale] 0.8 0.9 0.7 [mat] whitecol
[name] white part of the body
# breast
*[node] 03 [par] 01 [order] 0 [trans] 0 0.4 0.05
[name] breast
*[node] 04 [par] 03 [order] 4 [scale] 0.72 0.72 0.72
[name] breast
*[node] 74 [par] 04 [order] 45 [vis] 10 [scale] 0.95 1.0 0.8 [mat] blackcol
[name] black part of the breast
*[node] 75 [par] 04 [order] 045 [vis] 10 [trans] 0 0 0.17 [scale] 0.8 0.9 0.7
[mat] whitecol [name] white part of the breast
# neck
*[node] 05 [par] 01 [order] 02 [trans] 0 0.9 0.07 [rot] 0 90.0 0 [name] neck and head
*[node] 06 [par] 05 [joint] neck [name] joint for neck
*[node] 07 [par] 06 [order] 2 [rot] 0 -90 0 [name] neck and head
*[node] 08 [par] 07 [order] 4 [scale] 0.45 0.5 0.45 [name] neck
*[node] 09 [par] 08 [order] 5 [vis] 10 [mat] blackcol [shad] 1
[name] black part of the neck
*[node] 10 [par] 08 [order] 045 [vis] 10 [trans] 0 -0.08 0.35
[scale] 0.8 0.9 0.7 [mat] whitecol [name] white part of the neck
# head
*[node] 11 [par] 07 [order] 02 [trans] 0 0.3 0.07 [rot] 0 90.0 0 [name] head
*[node] 12 [par] 11 [joint] head [name] joint for head
#*[node] 13 [par] 12 [order] seems to do nothing, waste
*[node] 14 [par] 12 [order] 02 [trans] 0 0.2 0 [rot] 0 -90.0 0 [name] head
*[node] 15 [par] 14 [order] 45 [vis] 10 [scale] 0.42 0.5 0.42
[mat] blackcol [shad] 1 [name] head
# beak
*[node] 16 [par] 14 [order] 0145 [vis] 4 [trans] 0 -0.205 0.3 [rot] 10 0 0
[scale] 0.23 0.12 0.4 [mat] beakcol [name] beak
*[node] 17 [par] 14 [order] 0145 [vis] 4 [trans] 0 -0.23 0.3 [rot] 10 0 0
[scale] 0.21 0.17 0.38 [mat] beakcol [name] beak
# left eye
*[node] 18 [par] 14 [order] 023145 [vis] 4 [trans] 0.13 -0.03 0.38 [rot] 5.0 18.0 -5.0
[mat] whitecol [scale] 0.1 0.13 0.03 [name] left eye
# right eye
*[node] 19 [par] 14 [order] 023145 [vis] 4 [trans] -0.13 -0.03 0.38 [rot] 5.0 -18.0 -5.0
[mat] whitecol [scale] 0.1 0.13 0.03 [name] right eye
# left iris
*[node] 20 [par] 14 [order] 023145 [vis] 2 [trans] 0.12 -0.045 0.4 [rot] 5.0 18.0 5.0
[mat] iriscol [scale] 0.055 0.07 0.03 [name] left iris
# right iris
*[node] 21 [par] 14 [order] 023145 [vis] 2 [trans] -0.12 -0.045 0.4 [rot] 5.0 -18.0 -5.0
[mat] iriscol [scale] 0.055 0.07 0.03 [name] right iris
# left upper arm
*[node] 22 [par] 03 [order] 2031 [rot] 90 180 45 [trans] -0.56 0.3 0 [name] left arm
*[node] 23 [par] 22 [joint] left_shldr [name] joint for left shoulder
*[node] 24 [par] 23 [order] 01 [trans] -0.22 0 0 [rot] -90.0 0 0 [name] left arm
*[node] 25 [par] 24 [order] 45 [vis] 5 [scale] 0.34 0.1 0.2 [mat] blackcol [shad] 1
[name] left upper arm
# left forearm
*[node] 30 [par] 24 [order] 031 [trans] -0.23 0 0 [rot] 90 0 20.0
[name] left forearm and hand
*[node] 31 [par] 30 [joint] joint [name] joint for left_elbow
*[node] 32 [par] 31 [order] 01 [trans] -0.19 0 0 [rot] -90.0 0 0
[name] left forearm and hand
*[node] 33 [par] 32 [order] 45 [vis] 5 [scale] 0.3 0.07 0.15 [mat] blackcol [shad] 1
[name] left forearm
# left hand
*[node] 38 [par] 32 [order] 031 [trans] -0.24 0 0 [rot] 90 0 20.0 [name] left hand
*[node] 39 [par] 38 [joint] left_hand [name] joint for left hand
*[node] 40 [par] 39 [order] 01 [trans] -0.1 0 0 [rot] -90.0 0 0 [name] left hand
*[node] 41 [par] 40 [order] 45 [vis] 3 [scale] 0.12 0.05 0.12 [mat] blackcol [shad] 1
[name] left hand
# right upper arm
*[node] 26 [par] 03 [order] 031 [trans] -0.56 0.3 0 [rot] -90 0 45.0 [name] right arm
*[node] 27 [par] 26 [joint] right_shldr [name] joint for right shoulder
*[node] 28 [par] 27 [order] 01 [trans] -0.22 0 0 [rot] 90.0 0 0 [name] right arm
*[node] 29 [par] 28 [order] 45 [vis] 5 [scale] 0.34 0.1 0.2 [mat] blackcol [shad] 1
[name] right upper arm
# right forearm
*[node] 34 [par] 28 [order] 031 [trans] -0.23 0 0 [rot] -90 0 20.0
[name] rigth forearm and hand
*[node] 35 [par] 34 [joint] right_elbow [name] joint for right elbow
*[node] 36 [par] 35 [order] 01 [trans] -0.19 0 0 [rot] 90.0 0 0
[name] right forearm and hand
*[node] 37 [par] 36 [order] 45 [vis] 5 [scale] 0.3 0.07 0.15 [mat] blackcol [shad] 1
[name] right forearm
# right hand
*[node] 42 [par] 36 [order] 031 [trans] -0.24 0 0 [rot] -90 0 20.0 [name] right hand
*[node] 43 [par] 42 [joint] right_hand [name] joint for right hand
*[node] 44 [par] 43 [order] 01 [trans] -0.1 0 0 [rot] 90.0 0 0 [name] right hand
*[node] 45 [par] 44 [order] 45 [vis] 3 [scale] 0.12 0.05 0.12 [mat] blackcol [shad] 1
[name] right hand
# left leg
*[node] 46 [par] 01 [order] 209 [rot] 0 180.0 110 [trans] -0.28 -0.8 0 [name] left leg
*[node] 47 [par] 46 [joint] left_hip [name] joint for left leg
*[node] 48 [par] 47 [order] 02 [trans] 0 -0.1 0 [rot] 0 -110.0 0 [name] left leg
*[node] 49 [par] 48 [order] 45 [vis] 3 [scale] 0.07 0.3 0.07 [mat] beakcol [shad] 1
[name] left highbone
*[node] 50 [par] 48 [order] 045 [vis] 3 [trans] 0.0 0.05 0.0
[scale] 0.09 0.18 0.09 [mat] blackcol [name] left hip
*[node] 56 [par] 48 [order] 02 [trans] 0 -0.21 0 [rot] 0 90.0 0
[name] left lower leg and foot
*[node] 57 [par] 56 [joint] left_knee [name] joint for left knee
*[node] 58 [par] 57 [order] 02 [trans] 0 -0.13 0 [rot] 0 -90.0 0
[name] left lower leg and foot
*[node] 59 [par] 58 [order] 45 [vis] 3 [scale] 0.06 0.18 0.06
[mat] beakcol [name] left lower leg
*[node] 64 [par] 58 [order] 02 [trans] 0 -0.18 0 [rot] 0 -50.0 0
[name] left foot
*[node] 65 [par] 64 [joint] left_ankle [name] joint for left ankle
*[node] 76 [par] 65 [order] 04 [trans] -0.13 0 0 [scale] 1.1 1.0 1.3
[name] left foot
*[node] 77 [par] 76 [vis] 8 [order] 45 [scale] 0.25 0.08 0.18
[mat] beakcol [name] left foot
*[node] 78 [par] 76 [vis] 8 [order] 0245 [trans] -0.07 0 0.1 [rot] 0 30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at left foot
*[node] 79 [par] 76 [vis] 8 [order] 0245 [trans] -0.07 0 -0.1 [rot] 0 -30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at left foot
*[node] 80 [par] 76 [vis] 8 [order] 045 [trans] -0.08 0 0
[scale] 0.27 0.07 0.10 [mat] beakcol [shad] 1 [name] toe at left foot
# right leg
*[node] 51 [par] 01 [order] 02 [trans] -0.28 -0.8 0 [rot] 0 -110.0 0
[name] right leg
*[node] 52 [par] 51 [joint] right_hip [name] joint for right leg
*[node] 53 [par] 52 [order] 02 [trans] 0 -0.1 0 [rot] 0 110.0 0
[name] right leg
*[node] 54 [par] 53 [order] 45 [vis] 3 [scale] 0.07 0.3 0.07
[mat] beakcol [shad] 1 [name] right highbone
*[node] 55 [par] 53 [order] 045 [vis] 3 [trans] 0.0 0.05 0.0
[scale] 0.09 0.18 0.09 [mat] blackcol [name] right hip
*[node] 60 [par] 53 [order] 02 [trans] 0 -0.21 0 [rot] 0 -90.0 0
[name] right lower leg and foot
*[node] 61 [par] 60 [joint] right_knee [name] joint for right knee
*[node] 62 [par] 61 [order] 02 [trans] 0 -0.13 0 [rot] 0 90.0 0
[name] right lower leg and foot
*[node] 63 [par] 62 [order] 45 [vis] 3 [scale] 0.06 0.18 0.06
[mat] beakcol [name] right lower leg
*[node] 66 [par] 62 [order] 02 [trans] 0 -0.18 0 [rot] 0 50.0 0
[name] right foot
*[node] 67 [par] 66 [joint] right_ankle [name] joint for right ankle
*[node] 81 [par] 67 [order] 04 [trans] -0.13 0 0 [scale] 1.1 1.0 1.3
[name] right foot
*[node] 82 [par] 81 [vis] 8 [order] 45 [scale] 0.25 0.08 0.18
[mat] beakcol [name] right foot
*[node] 83 [par] 81 [vis] 8 [order] 0245 [trans] -0.07 0 0.1 [rot] 0 30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at right foot
*[node] 84 [par] 81 [vis] 8 [order] 0245 [trans] -0.07 0 -0.1 [rot] 0 -30 0
[scale] 0.27 0.07 0.11 [mat] beakcol [shad] 1 [name] toe at right foot
*[node] 85 [par] 81 [vis] 8 [order] 045 [trans] -0.08 0 0
[scale] 0.27 0.07 0.10 [mat] beakcol [shad] 1 [name] toe at right foot
# tail
*[node] 68 [par] 01 [order] 01 [trans] 0 -0.4 -0.5 [rot] -60.0 0 0 [name] tail
*[node] 69 [par] 68 [joint] tail [name] joint for tail
*[node] 70 [par] 69 [order] 0 [trans] 0 0.15 0 [name] tail
*[node] 71 [par] 70 [order] 45 [vis] 2 [scale] 0.2 0.3 0.1
[mat] blackcol [shad] 1 [name] tail

View File

@ -53,6 +53,8 @@ GNU General Public License for more details.
#define BRAKING_ROLL_ANGLE 55
#define BUFF_LEN 1024
#define CENTER -1
#define FIT -1
typedef double scalar_t;
@ -126,6 +128,13 @@ typedef struct {
int height;
} TRect;
typedef struct {
int left;
int right;
int top;
int bottom;
} TArea;
typedef enum {
NO_MODE,
SPLASH,

View File

@ -36,7 +36,6 @@ static TRace2 *eraces[MAX_RACES_PER_CUP];
static int ecourseidx[MAX_RACES_PER_CUP];
static int curr_race = 0;
static int curr_bonus = 0;
static int xleft, ytop, ytop2;
static TVector2 cursor_pos = {0, 0};
void StartRace () {
@ -136,19 +135,35 @@ void UpdateCupRacing () {
// --------------------------------------------------------------------
static TArea area;
static int messtop, messtop2;
static int bonustop, framewidth, frametop, framebottom;
static int dist, texsize;
void EventInit () {
Winsys.ShowCursor (!param.ice_cursor);
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (210);
ytop2 = ytop + 80;
if (g_game.prev_mode == GAME_OVER) UpdateCupRacing ();
else InitCupRacing ();
framewidth = 500;
frametop = AutoYPosN (45);
area = AutoAreaN (30, 80, framewidth);
messtop = AutoYPosN (50);
messtop2 = AutoYPosN (60);
bonustop = AutoYPosN (35);
texsize = 32 * param.scale;
if (texsize < 32) texsize = 32;
dist = texsize + 2 * 4;
framebottom = frametop + ecup->num_races * dist + 10;
ResetWidgets ();
AddTextButton (Trans.Text(13), xleft + 300, ytop + ecup->num_races * 35 + 160, 0, -1);
AddTextButton (Trans.Text(8), xleft + 100, ytop + ecup->num_races * 35 + 160, 1, -1);
AddTextButton (Trans.Text(15), CENTER, ytop + ecup->num_races * 35 + 160, 2, -1);
int siz = FT.AutoSizeN (5);
AddTextButton (Trans.Text(8), area.left + 100, AutoYPosN (80), 1, siz);
double len = FT.GetTextWidth (Trans.Text(13));
AddTextButton (Trans.Text(13), area.right -len - 100, AutoYPosN (80), 0, siz);
AddTextButton (Trans.Text(15), CENTER, AutoYPosN (80), 2, siz);
Music.Play (param.menu_music, -1);
if (ready < 1) curr_focus = 0; else curr_focus = 2;
g_game.loopdelay = 20;
@ -178,59 +193,65 @@ void EventLoop (double timestep) {
update_ui_snow (timestep);
draw_ui_snow ();
}
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), param.scale);
Tex.Draw (BOTTOM_LEFT, 0, hh-256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
// DrawFrameX (area.left, area.top, area.right-area.left, area.bottom - area.top,
// 0, colMBackgr, colBlack, 0.2);
if (ready == 0) { // cup not finished
FT.SetSize (AutoFtSize());
FT.AutoSizeN (6);
FT.SetColor (colWhite);
FT.DrawString (CENTER, ytop - 60, ecup->name);
FT.DrawString (CENTER, AutoYPosN (25), ecup->name);
DrawBonusExt (ytop+20, ecup->num_races, curr_bonus);
DrawBonusExt (bonustop, ecup->num_races, curr_bonus);
DrawFrameX (area.left, frametop, framewidth,
ecup->num_races * dist + 20, 3, colBackgr, colWhite, 1);
// race list:
DrawFrameX (xleft, ytop2, 500, ecup->num_races * 35 + 20, 3, colBackgr, colWhite, 1);
for (i=0; i<ecup->num_races; i++) {
if (i == curr_race) col = colDYell; else col = colWhite;
if (param.use_papercut_font > 0) FT.SetSize (20); else FT.SetSize (15);
FT.AutoSizeN (3);
y = ytop2 + 10 + i * 35;
y = frametop + 10 + i * dist;
FT.SetColor (col);
FT.DrawString (xleft + 29, y, Course.CourseList[ecourseidx[i]].name);
Tex.Draw (CHECKBOX, xleft + 440, y, 1.0);
if (curr_race > i) Tex.Draw (CHECKMARK, xleft + 444, y + 4, 0.8);
FT.DrawString (area.left + 29, y, Course.CourseList[ecourseidx[i]].name);
Tex.Draw (CHECKBOX, area.right -54, y, texsize, texsize);
if (curr_race > i) Tex.Draw (CHECKMARK, area.right-50, y + 4, 0.8);
}
FT.SetColor (colWhite);
FT.AutoSizeN (3);
int ddd = FT.AutoDistanceN (1);
FT.SetColor (colDBlue);
info = Trans.Text(11);
info += " " + Int_StrN (eraces[curr_race]->herrings.i);
info += " " + Int_StrN (eraces[curr_race]->herrings.j);
info += " " + Int_StrN (eraces[curr_race]->herrings.k);
FT.DrawString (xleft+30, ytop2 + ecup->num_races * 35 + 25, info);
FT.DrawString (CENTER, framebottom+15, info);
info = Trans.Text(12);
info += " " + Float_StrN (eraces[curr_race]->time.x, 0);
info += " " + Float_StrN (eraces[curr_race]->time.y, 0);
info += " " + Float_StrN (eraces[curr_race]->time.z, 0);
info += " " + Trans.Text(14);
FT.DrawString (xleft+280, ytop2 + ecup->num_races * 35 + 25, info);
FT.DrawString (CENTER, framebottom+15+ddd, info);
} else if (ready == 1) { // cup successfully finished
FT.AutoSizeN (5);
FT.SetColor (colWhite);
FT.DrawString (CENTER, ytop-20, Trans.Text(16));
DrawBonusExt (ytop+60, ecup->num_races, curr_bonus);
FT.DrawString (CENTER, messtop, Trans.Text(16));
DrawBonusExt (bonustop, ecup->num_races, curr_bonus);
int res = resultlevel(curr_bonus, ecup->num_races);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (20);
FT.DrawString (CENTER, ytop + 120, Trans.Text(17) + " "+Int_StrN (res));
FT.DrawString (CENTER, messtop2, Trans.Text(17) + " "+Int_StrN (res));
} else if (ready == 2) { // cup finished but failed
FT.SetColor (colRed);
FT.DrawString (CENTER, ytop-20, Trans.Text(18));
DrawBonusExt (ytop+60, ecup->num_races, curr_bonus);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (20);
FT.DrawString (CENTER, ytop + 120, Trans.Text(19));
FT.AutoSizeN (5);
FT.SetColor (colLRed);
FT.DrawString (CENTER, messtop, Trans.Text(18));
DrawBonusExt (bonustop, ecup->num_races, curr_bonus);
FT.DrawString (CENTER, messtop2, Trans.Text(19));
}
if (ready < 1) {
PrintTextButton (0, curr_focus);

View File

@ -29,7 +29,6 @@ GNU General Public License for more details.
static TEvent2 *EventList;
static int last_event;
static int curr_event = 0;
static int xleft, ytop, ytop2;
static int curr_focus = 0;
static TCup2 *CupList;
static int curr_cup = 0;
@ -114,6 +113,8 @@ void EventSelectMotionFunc (int x, int y ){
}
// --------------------------------------------------------------------
static TArea area;
static int framewidth, frameheight, frametop1, frametop2;
void EventSelectInit () {
Winsys.ShowCursor (!param.ice_cursor);
@ -123,17 +124,24 @@ void EventSelectInit () {
CupList = Events.CupList;
curr_cup = 0;
last_cup = EventList[curr_event].num_cups - 1;
curr_focus = 1;
framewidth = 500 * param.scale;
frameheight = 50 * param.scale;
area = AutoAreaN (30, 80, framewidth);
frametop1 = AutoYPosN (35);
frametop2 = AutoYPosN (50);
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (210);
ytop2 = AutoYPos (320);
ResetWidgets ();
AddArrow (xleft + 470, ytop, 0, 0);
AddArrow (xleft + 470, ytop+18, 1, 0);
AddArrow (xleft + 470, ytop2, 0, 1);
AddArrow (xleft + 470, ytop2+18, 1, 1);
AddTextButton (Trans.Text (9), xleft + 300, ytop + 200, 2, -1);
AddTextButton (Trans.Text (8), xleft + 100, ytop + 200, 3, -1);
AddArrow (area.right+8, frametop1, 0, 0);
AddArrow (area.right+8, frametop1+18, 1, 0);
AddArrow (area.right+8, frametop2, 0, 1);
AddArrow (area.right+8, frametop2+18, 1, 1);
int siz = FT.AutoSizeN (5);
AddTextButton (Trans.Text(9), area.left+50, AutoYPosN (70), 2, siz);
double len = FT.GetTextWidth (Trans.Text(8));
AddTextButton (Trans.Text(8), area.right-len-50, AutoYPosN (70), 3, siz);
Events.MakeUnlockList (Players.GetCurrUnlocked());
Music.Play (param.menu_music, -1);
@ -156,38 +164,42 @@ void EventSelectLoop (double timestep) {
draw_ui_snow ();
}
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), param.scale);
Tex.Draw (BOTTOM_LEFT, 0, hh-256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
// DrawFrameX (area.left, area.top, area.right-area.left, area.bottom - area.top,
// 0, colMBackgr, colBlack, 0.2);
if (param.use_papercut_font > 0) FT.SetSize (20); else FT.SetSize (15);
FT.AutoSizeN (3);
FT.SetColor (colWhite);
FT.DrawString (xleft, ytop-40, Trans.Text (6));
FT.DrawString (xleft, ytop2-40, Trans.Text (7));
FT.DrawString (area.left, AutoYPosN (30), Trans.Text (6));
FT.DrawString (area.left,AutoYPosN (45), Trans.Text (7));
if (Events.IsUnlocked (curr_event, curr_cup) == false) {
FT.SetColor (colLGrey);
FT.DrawString (CENTER, ytop2+60, Trans.Text (10));
FT.DrawString (CENTER, AutoYPosN (58), Trans.Text (10));
}
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (22);
FT.AutoSizeN (4);
if (curr_focus == 0) col = colDYell; else col = colWhite;
DrawFrameX (xleft, ytop-4, 460, 44, 3, colMBackgr, col, 1.0);
DrawFrameX (area.left, frametop1, framewidth, frameheight, 3, colMBackgr, col, 1.0);
FT.SetColor (colDYell);
FT.DrawString (xleft+20, ytop, EventList[curr_event].name);
FT.DrawString (area.left + 20, frametop1, EventList[curr_event].name);
if (curr_focus == 1) col = colDYell; else col = colWhite;
DrawFrameX (xleft, ytop2-4, 460, 44, 3, colMBackgr, col, 1.0);
DrawFrameX (area.left, frametop2, framewidth, frameheight, 3, colMBackgr, col, 1.0);
if (Events.IsUnlocked (curr_event, curr_cup)) FT.SetColor (colDYell);
else FT.SetColor (colLGrey);
FT.DrawString (xleft+20, ytop2, Events.GetCupTrivialName (curr_event, curr_cup));
FT.DrawString (area.left + 20, frametop2, Events.GetCupTrivialName (curr_event, curr_cup));
PrintArrow (0, (curr_event > 0));
PrintArrow (1, (curr_event < last_event));
PrintArrow (2, (curr_cup > 0));
PrintArrow (3, (curr_cup < last_cup));
if (Events.IsUnlocked (curr_event, curr_cup)) PrintTextButton (0, curr_focus);
PrintTextButton (1, curr_focus);

View File

@ -18,6 +18,7 @@ GNU General Public License for more details.
#include "font.h"
#include "spx.h"
#include "gui.h"
#define USE_UNICODE true
@ -267,6 +268,25 @@ void CFont::SetSize (float size) {
void CFont::SetFont (string fontname) {
int idx = SPIntN (fontindex, fontname, -1);
curr_font = idx;
if (fontname == "pc20") curr_fact = 1.25;
else curr_fact = 1.0;
}
// -------------------- auto ------------------------------------------
int CFont::AutoSizeN (int rel_val) {
double size = (rel_val + 2) * 4;
size *= curr_fact;
size *= param.scale;
SetSize (size);
return (int)size;
}
int CFont::AutoDistanceN (int rel_val) {
double fact = (rel_val + 5) * 0.2;
double dist = curr_size * fact;
return (int) dist;
}
// -------------------- draw (x, y, text) -----------------------------
@ -471,3 +491,4 @@ void CFont::MakeLineList (const char *source, CSPList *line_list, float width) {
while (last < wordlist.Count()-1);
}

5
font.h
View File

@ -39,6 +39,7 @@ private:
int curr_font;
TColor curr_col;
float curr_size;
float curr_fact; // the length factor
wchar_t *UnicodeStr (const char* s);
void UnicodeStr (wchar_t* buff, const char* string);
@ -61,6 +62,10 @@ public:
void SetSize (float size);
void SetFont (string fontname);
// auto
int AutoSizeN (int rel_val); // rel_val = relative size, return: autosize
int AutoDistanceN (int rel_val); // rel_val = relative dist
// draw
void DrawText (float x, float y, const char *text); // normal char*
void DrawText (float x, float y, const wchar_t *text); // wide char*

View File

@ -14,6 +14,27 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
---------------------------------------------------------------------*/
/*
If you want to add a new option, do this:
First add the option to the TParam struct (game_config.h).
Then edit the below functions:
- LoadConfigFile. Use
SPIntN for integer and boolean values
SPStrN for strings.
The first value is always 'line', the second defines the tag within the
brackets [ ], and the last value is the default.
- SetConfigDefaults. These values are used as long as no options file exists.
It's a good idea to use the same values as the defaults in LoadConfigFile.
- SaveConfigFile. See the other entries; it should be self-explanatory.
If an options file exists, you will have to change any value at runtime
on the configuration screen to overwrite the file. Then you will see the
new entry.
*/
#include "game_config.h"
#include "spx.h"
#include "particles.h"
@ -61,6 +82,8 @@ void LoadConfigFile () {
param.full_skybox = SPIntN (line, "full_skybox", false);
param.audio_freq = SPIntN (line, "audio_freq", 22050);
param.audio_buffer_size = SPIntN (line, "audio_buffer_size", 512);
param.restart_on_res_change = SPIntN (line, "restart_on_res_change", 0);
param.use_quad_scale = SPIntN (line, "use_quad_scale", 0);
param.menu_music = SPStrN (line, "menu_music", "start_1");
param.credits_music = SPStrN (line, "credits_music", "credits_1");
@ -76,6 +99,8 @@ void SetConfigDefaults () {
param.sound_volume = 100;
param.music_volume = 20;
// ---------------------------------------
param.forward_clip_distance = 75;
param.backward_clip_distance = 20;
param.fov = 60;
@ -90,6 +115,8 @@ void SetConfigDefaults () {
param.use_papercut_font = 1;
param.ice_cursor = true;
param.full_skybox = false;
param.restart_on_res_change = 0;
param.use_quad_scale = 0;
param.menu_music = "start_1";
param.credits_music = "credits_1";
@ -239,6 +266,22 @@ void SaveConfigFile () {
AddItem (&liste, "menu_music", param.menu_music);
AddItem (&liste, "credits_music", param.credits_music);
AddItem (&liste, "config_music", param.config_music);
liste.Add ("");
AddComment (liste, "Restart if the resolution has been changed [0...1]");
AddComment (liste, "Only for Windows users: if the game crashes after");
AddComment (liste, "changing the resolution you should set this option to 1.");
AddComment (liste, "Then you will have to restart for the new resolution.");
AddIntItem (&liste, "restart_on_res_change", param.restart_on_res_change);
liste.Add ("");
AddComment (liste, "Use sqare root of scale factors for menu screens [0...1]");
AddComment (liste, "Exprimental: these factors reduce the effect of screen scaling.");
AddComment (liste, "The widgets are closer to their default sizes.");
AddIntItem (&liste, "use_quad_scale", param.use_quad_scale);
liste.Add ("");
// ---------------------------------------
liste.Save (param.configfile);
}
@ -308,13 +351,11 @@ void InitConfig (char *arg0) {
// configuration screen
// ********************************************************************
//#define NUM_RES 10
//#define NUM_LANG 1
static TVector2 cursor_pos = {0, 0};
static string res_names[NUM_RESOLUTIONS];
//static string languages[NUM_LANG];
static int xleft, ytop;
static bool curr_fullscreen = false;
static bool prev_fullscreen;
@ -330,24 +371,28 @@ static TLang *LangList;
static int lastLang = 0;
void RestartSDL () {
Winsys.CloseJoystick ();
Tex.FreeTextureList ();
Course.FreeCourseList ();
Char.FreeCharacterPreviews (); // they are not reloaded !!!
// first close the resources that must be restored when
// starting a new VideoMode. That are all resourcse controlled
// by SDL or OpenGL
Winsys.CloseJoystick (); // controlled by SDL
Tex.FreeTextureList (); // textures are controlled by OpenGL
Course.FreeCourseList (); // contains the preview textures
Char.FreeCharacterPreviews (); // they are not reloaded !!!
Audio.Close (); // frees music and sound as well (SDL_mixer)
SDL_Quit (); // SDL main
Sound.FreeSounds ();
Music.FreeMusics ();
Audio.Close ();
SDL_Quit ();
Winsys.Init ();
Audio.Open ();
Sound.LoadSoundList ();
Music.LoadMusicList ();
// second restore the freed resources
Winsys.Init (); // includes SetVideoMode
Audio.Open (); // clear, it has been closed before
Sound.LoadSoundList (); // all sounds must loaded again
Music.LoadMusicList (); // same with music pieces
Tex.LoadTextureList (); // common textures
Course.LoadCourseList (); // only for the previews
Course.ResetCourse (); // the current course must be freed and reset
// and some start settings which refer to the restored resources,
// probably it's not necessary.
Music.SetVolume (param.music_volume);
Tex.LoadTextureList ();
Course.LoadCourseList ();
Course.ResetCourse ();
g_game.course_id = 0;
g_game.cup_id = 0;
g_game.race_id = 0;
@ -356,16 +401,22 @@ void RestartSDL () {
void SetConfig () {
if (paramchanged) {
if (curr_res != prev_res || curr_fullscreen != prev_fullscreen) {
// these changes require a new VideoMode
param.res_type = curr_res;
param.fullscreen = curr_fullscreen;
#if defined (OS_WIN32_MINGW)
// RestartSDL ();
// on windows we need to free and restore a lot of resources
if (!param.restart_on_res_change) RestartSDL ();
#elif defined (OS_LINUX)
Winsys.SetupVideoMode (curr_res);
// on linux the resources seem to be kept at new VideoMode
if (curr_res > 0) Winsys.SetupVideoMode (curr_res);
else RestartSDL ();
#endif
}
// the followind config params don't require a new VideoMode
// they only must stored in the param structure (and saved)
param.music_volume = curr_mus_vol;
Music.SetVolume (param.music_volume);
param.sound_volume = curr_sound_vol;
@ -511,6 +562,10 @@ void GameConfigMotionFunc (int x, int y) {
// ------------------ Init --------------------------------------------
static TArea area;
static int framewidth, frameheight;
static int dd, rightpos;
void GameConfigInit (void) {
Winsys.ShowCursor (!param.ice_cursor);
Winsys.KeyRepeat (true);
@ -522,11 +577,8 @@ void GameConfigInit (void) {
SDL_Surface *surf = 0;
surf = SDL_GetVideoSurface ();
for (int i=0; i<NUM_RESOLUTIONS; i++) res_names[i] = Winsys.GetResName (i);
for (int i=0; i<NUM_RESOLUTIONS; i++) res_names[i] = Winsys.GetResName (i);
xleft = (param.x_resolution - 400) / 2;
ytop = AutoYPos (150);
ResetWidgets ();
paramchanged = false;
// read the start params:
@ -540,19 +592,31 @@ void GameConfigInit (void) {
curr_language = param.language;
if (curr_language > lastLang) curr_language = lastLang;
AddCheckbox (xleft, ytop, 0, 400, Trans.Text(31));
AddArrow (xleft + 400 - 32, ytop+36, 0, 1);
AddArrow (xleft + 400 - 32, ytop+36+18, 1, 1);
AddArrow (xleft + 400 - 32, ytop+72, 0, 2);
AddArrow (xleft + 400 - 32, ytop+72+18, 1, 2);
AddArrow (xleft + 400 - 32, ytop+108, 0, 3);
AddArrow (xleft + 400 - 32, ytop+108+18, 1, 3);
AddArrow (xleft + 400 - 32, ytop+144, 0, 4);
AddArrow (xleft + 400 - 32, ytop+144+18, 1, 4);
AddArrow (xleft + 400 - 32, ytop+180, 0, 5);
AddArrow (xleft + 400 - 32, ytop+180+18, 1, 5);
AddTextButton (Trans.Text(28), xleft+70, ytop+320, 6, -1);
AddTextButton (Trans.Text(15), xleft+300, ytop+320, 7, -1);
framewidth = 550 * param.scale;
frameheight = 50 * param.scale;
area = AutoAreaN (30, 80, framewidth);
FT.AutoSizeN (4);
dd = FT.AutoDistanceN (3);
if (dd < 36) dd = 36;
rightpos = area.right -48;
ResetWidgets ();
AddCheckbox (area.left, area.top, 0, framewidth-16, Trans.Text(31));
AddArrow (rightpos, area.top+dd*1, 0, 1);
AddArrow (rightpos, area.top+dd*1+18, 1, 1);
AddArrow (rightpos, area.top+dd*2, 0, 2);
AddArrow (rightpos, area.top+dd*2+18, 1, 2);
AddArrow (rightpos, area.top+dd*3, 0, 3);
AddArrow (rightpos, area.top+dd*3+18, 1, 3);
AddArrow (rightpos, area.top+dd*4, 0, 4);
AddArrow (rightpos, area.top+dd*4+18, 1, 4);
AddArrow (rightpos, area.top+dd*5, 0, 5);
AddArrow (rightpos, area.top+dd*5+18, 1, 5);
int siz = FT.AutoSizeN (5);
AddTextButton (Trans.Text(28), area.left+50, AutoYPosN (80), 6, siz);
double len = FT.GetTextWidth (Trans.Text(8));
AddTextButton (Trans.Text(15), area.right-len-50, AutoYPosN (80), 7, siz);
curr_focus = 0;
Music.Play (param.config_music, -1);
@ -575,33 +639,35 @@ void GameConfigLoop (double time_step) {
draw_ui_snow();
}
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), 1.0);
Tex.Draw (BOTTOM_LEFT, 0, hh-256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (22);
// DrawFrameX (area.left, area.top, area.right-area.left, area.bottom - area.top,
// 0, colMBackgr, colBlack, 0.2);
FT.AutoSizeN (4);
PrintCheckbox (0, curr_focus, curr_fullscreen);
if (curr_focus == 1) FT.SetColor (colDYell); else FT.SetColor (colWhite);
FT.DrawString (xleft, ytop + 36, Trans.Text(32));
FT.DrawString (area.left, area.top + dd, Trans.Text(32));
if (curr_focus == 2) FT.SetColor (colDYell); else FT.SetColor (colWhite);
FT.DrawString (xleft, ytop + 72, Trans.Text(33));
FT.DrawString (area.left, area.top + dd*2, Trans.Text(33));
if (curr_focus == 3) FT.SetColor (colDYell); else FT.SetColor (colWhite);
FT.DrawString (xleft, ytop + 108, Trans.Text(34));
FT.DrawString (area.left, area.top + dd*3, Trans.Text(34));
if (curr_focus == 4) FT.SetColor (colDYell); else FT.SetColor (colWhite);
FT.DrawString (xleft, ytop + 144, Trans.Text(36));
FT.DrawString (area.left, area.top + dd*4, Trans.Text(36));
if (curr_focus == 5) FT.SetColor (colDYell); else FT.SetColor (colWhite);
FT.DrawString (xleft, ytop + 180, Trans.Text(35));
FT.DrawString (area.left, area.top + dd*5, Trans.Text(35));
if (param.use_papercut_font > 0) FT.SetSize (20); else FT.SetSize (14);
FT.SetColor (colWhite);
FT.DrawString (xleft+240, ytop + 40, res_names[curr_res]);
FT.DrawString (xleft+240, ytop + 76, Int_StrN (curr_mus_vol));
FT.DrawString (xleft+240, ytop + 112, Int_StrN (curr_sound_vol));
FT.DrawString (xleft+240, ytop + 148, Int_StrN (curr_detail_level));
FT.DrawString (xleft+240, ytop + 184, LangList[curr_language].language);
FT.DrawString (area.left+240, area.top + dd, res_names[curr_res]);
FT.DrawString (area.left+240, area.top + dd*2, Int_StrN (curr_mus_vol));
FT.DrawString (area.left+240, area.top + dd*3, Int_StrN (curr_sound_vol));
FT.DrawString (area.left+240, area.top + dd*4, Int_StrN (curr_detail_level));
FT.DrawString (area.left+240, area.top + dd*5, LangList[curr_language].language);
PrintArrow (0, (curr_res < (NUM_RESOLUTIONS-1)));
PrintArrow (1, (curr_res > 0));
@ -618,22 +684,23 @@ void GameConfigLoop (double time_step) {
PrintTextButton (1, curr_focus);
#if defined (OS_WIN32_MINGW)
if (curr_res != prev_res || curr_fullscreen != prev_fullscreen) {
if ((curr_res != prev_res || curr_fullscreen != prev_fullscreen) &&
param.restart_on_res_change) {
FT.SetColor (colDYell);
if (param.use_papercut_font > 0) FT.SetSize (24); else FT.SetSize (18);
FT.DrawString (-1, ytop + 240, "The video adjustments have changed,");
FT.DrawString (-1, ytop + 270, "You need to restart the game");
FT.AutoSizeN (4);
FT.DrawString (CENTER, AutoYPosN (68), "The video adjustments have changed,");
FT.DrawString (CENTER, AutoYPosN (72), "You need to restart the game");
} else {
FT.SetColor (colLGrey);
if (param.use_papercut_font > 0) FT.SetSize (18); else FT.SetSize (14);
FT.DrawString (-1, ytop+240, Trans.Text(41));
FT.DrawString (-1, ytop+262, Trans.Text(42));
FT.AutoSizeN (3);
FT.DrawString (CENTER, AutoYPosN (68), Trans.Text(41));
FT.DrawString (CENTER, AutoYPosN (72), Trans.Text(42));
}
#else
FT.SetColor (colWhite);
if (param.use_papercut_font > 0) FT.SetSize (20); else FT.SetSize (14);
FT.DrawString (xleft, ytop+240, Trans.Text(41));
FT.DrawString (xleft, ytop+262, Trans.Text(42));
FT.AutoSizeN (3);
FT.DrawString (CENTER, AutoYPosN (68), Trans.Text(41));
FT.DrawString (CENTER, AutoYPosN (72), Trans.Text(42));
#endif
if (param.ice_cursor) DrawCursor ();

View File

@ -45,8 +45,6 @@ typedef struct {
string trans_dir;
string player_dir;
string configfile;
int x_resolution;
int y_resolution;
// ------------------------------------
// main config params:
@ -71,15 +69,22 @@ typedef struct {
int use_papercut_font;
bool ice_cursor;
bool full_skybox;
int restart_on_res_change; // only Windows
int use_quad_scale; // scaling type for menus
string menu_music;
string credits_music;
string config_music;
// toggle params, not saved in options file
// these params are not saved in options file
bool ui_snow;
bool display_fps;
bool show_hud;
int view_mode;
int x_resolution;
int y_resolution;
double scale; // scale factor for screen, see 'use_quad_scale'
} TParam;
void InitConfig (char *arg0);

View File

@ -37,9 +37,9 @@ void QuitGameType (int sc) {
case 0: Winsys.SetMode (EVENT_SELECT); break;
case 1: EnterPractice (); break;
case 2: Winsys.SetMode (GAME_CONFIG); break;
case 3: Winsys.SetMode (CREDITS); break;
case 5: Winsys.SetMode (CREDITS); break;
case 4: Winsys.SetMode (HELP); break;
case 5: Winsys.SetMode (SCORE); break;
case 3: Winsys.SetMode (SCORE); break;
case 6: Winsys.Quit (); break;
};
}
@ -62,6 +62,7 @@ void GameSelectKeys (unsigned int key, bool special, bool release, int x, int y)
case 273: if (scope > 0) scope--; break;
case 13: QuitGameType (scope); break;
case SDLK_TAB: scope++; if (scope > 6) scope = 0; break;
case SDLK_w: Music.FreeMusics (); break;
}
}
@ -89,15 +90,17 @@ static void GameSelectInit (void) {
scope = 1;
ResetWidgets ();
int top = (int)(param.y_resolution * 0.4);
double dist = AutoDistance ();
AddTextButton (Trans.Text(1), CENTER, top, 0, FIT);
AddTextButton (Trans.Text(2), CENTER, top + dist, 1, FIT);
AddTextButton (Trans.Text(3), CENTER, top + dist * 2, 2, FIT);
AddTextButton (Trans.Text(4), CENTER, top + dist * 3, 3, FIT);
AddTextButton (Trans.Text(43), CENTER, top + dist * 4, 4, FIT);
AddTextButton ("Highscore list", CENTER, top + dist * 5, 5, FIT);
AddTextButton (Trans.Text(5), CENTER, top + dist * 6, 6, FIT);
int top = AutoYPosN (40);
int siz = FT.AutoSizeN (6);
int dist = FT.AutoDistanceN (2);
AddTextButton (Trans.Text(1), CENTER, top, 0, siz);
AddTextButton (Trans.Text(2), CENTER, top + dist, 1, siz);
AddTextButton (Trans.Text(3), CENTER, top + dist * 2, 2, siz);
AddTextButton (Trans.Text(4), CENTER, top + dist * 5, 5, siz);
AddTextButton (Trans.Text(43), CENTER, top + dist * 4, 4, siz);
AddTextButton ("Highscore list", CENTER, top + dist * 3, 3, siz);
AddTextButton (Trans.Text(5), CENTER, top + dist * 6, 6, siz);
Music.Play (param.menu_music, -1);
g_game.loopdelay = 10;
}
@ -117,7 +120,7 @@ static void GameSelectLoop (double time_step) {
draw_ui_snow();
}
Tex.Draw (T_TITLE, -1, 20, 0.8);
Tex.Draw (T_TITLE, CENTER, AutoYPosN (5), param.scale);
Tex.Draw (BOTTOM_LEFT, 0, hh-256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);

76
gui.cpp
View File

@ -77,53 +77,14 @@ void AddArrow (int x, int y, int dir, int focus) {
numArrows++;
}
double AutoFtSize () {
if (param.use_papercut_font > 0) {
return ((double)param.x_resolution / 800 * 32);
} else {
return ((double)param.x_resolution / 800 * 24);
}
}
double AutoFtSize (double basesize) {
if (param.use_papercut_font > 0) {
return ((double)param.x_resolution / 800 * basesize);
} else {
return ((double)param.x_resolution / 800 * basesize * 0.75);
}
}
int AutoXSize (int size) {
double sz = (double)param.x_resolution / 800 * size + 0.0001;
return (int)sz;
}
int AutoYSize (int size) {
double sz = (double)param.y_resolution / 600 * size + 0.0001;
return (int)sz;
}
int AutoXPos (int x) {
double sz = (double)param.x_resolution / 800 * x + 0.0001;
return (int)sz;
}
int AutoYPos (int y) {
double sz = (double)param.y_resolution / 600 * y + 0.0001;
return (int)sz;
}
double AutoDistance () {
return ((double)param.y_resolution / 600 * 40);
}
void AddTextButton (const char *text, int x, int y, int focus, double ftsize) {
if (numTextButtons >= MAX_TEXTBUTTONS) return;
TextButtons[numTextButtons].y = y;
TextButtons[numTextButtons].text = text;
TextButtons[numTextButtons].focus = focus;
if (ftsize < 0) ftsize = AutoFtSize ();
if (ftsize < 0) ftsize = FT.AutoSizeN (4);
TextButtons[numTextButtons].ftsize = ftsize;
FT.SetSize (ftsize);
double len = FT.GetTextWidth (text);
@ -139,6 +100,16 @@ void AddTextButton (const string text, int x, int y, int focus, double ftsize) {
AddTextButton (text.c_str(), x, y, focus, ftsize);
}
void AddTextButtonN (const char *text, int x, int y, int focus, int rel_ftsize) {
double siz = FT.AutoSizeN (rel_ftsize);
AddTextButton (text, y, y, focus, siz);
}
void AddTextButtonN (const string text, int x, int y, int focus, int rel_ftsize) {
double siz = FT.AutoSizeN (rel_ftsize);
AddTextButton (text, y, y, focus, siz);
}
void PrintTextButton (int nr, int focus) {
TColor col = colWhite;
if (focus == TextButtons[nr].focus) col = colDYell;
@ -462,5 +433,28 @@ void DrawBonusExt (int y, int numraces, int num) {
}
}
// ------------------ new ---------------------------------------------
int AutoYPosN (double percent) {
double hh = (double)param.y_resolution;
double po = hh * percent / 100;
return (int)(po);
}
TArea AutoAreaN (double top_perc, double bott_perc, int w) {
TArea res;
res.top = AutoYPosN (top_perc);
res.bottom = AutoYPosN (bott_perc);
if (w > param.x_resolution) w = param.x_resolution;
double left = (param.x_resolution - w) / 2;
res.left = (int) left;
res.right = param.x_resolution - res.left;
return res;
}

16
gui.h
View File

@ -26,9 +26,6 @@ GNU General Public License for more details.
#define MAX_ICONBUTTONS 8
#define MAX_CHECKBOXES 16
#define CENTER -1
#define FIT -1
typedef enum {
W_ARROW,
W_TEXTBUTTON,
@ -83,6 +80,8 @@ void AddArrow (int x, int y, int dir, int focus);
void PrintArrow (int nr, bool active);
void AddTextButton (const char *text, int x, int y, int focus, double ftsize);
void AddTextButton (const string text, int x, int y, int focus, double ftsize);
void AddTextButtonN (const char *text, int x, int y, int focus, int rel_ftsize);
void AddTextButtonN (const string text, int x, int y, int focus, int rel_ftsize);
void PrintTextButton (int nr, int focus);
void AddIconButton (int x, int y, int focus, GLuint texid, double size);
void PrintIconButton (int nr, int focus, int state);
@ -96,12 +95,9 @@ void DrawBonus (int x, int y, int max, int num);
void DrawBonusExt (int y, int numraces, int num);
void DrawCursor ();
double AutoFtSize ();
double AutoFtSize (double basesize);
int AutoXSize (int size);
int AutoYSize (int size);
int AutoXPos (int x);
int AutoYPos (int y);
double AutoDistance ();
// --------------------------------------------------------------------
int AutoYPosN (double percent);
TArea AutoAreaN (double top_perc, double bott_perc, int w);
#endif

View File

@ -51,9 +51,9 @@ void HelpInit (void) {
init_ui_snow ();
Music.Play (param.credits_music, -1);
xleft1 = 20;
xleft1 = 40;
xleft2 = (int)(param.x_resolution / 2) + 20;
ytop = 30;
ytop = AutoYPosN (15);
}
void HelpLoop (double timestep ){
@ -68,26 +68,27 @@ void HelpLoop (double timestep ){
draw_ui_snow();
}
double offs = AutoFtSize (25);
FT.SetSize (AutoFtSize (28));
FT.AutoSizeN (4);
FT.SetColor (colWhite);
FT.DrawString (xleft1, ytop, Trans.Text (57));
FT.SetSize (AutoFtSize (22));
FT.DrawString (xleft1+20, ytop + 50, Trans.Text(44));
FT.DrawString (xleft1+20, ytop + 50 + offs, Trans.Text(45));
FT.DrawString (xleft1+20, ytop + 50 + offs * 2, Trans.Text(46));
FT.DrawString (xleft1+20, ytop + 50 + offs * 3, Trans.Text(47));
FT.DrawString (xleft1+20, ytop + 50 + offs * 4, Trans.Text(48));
FT.DrawString (xleft1+20, ytop + 50 + offs * 5, Trans.Text(49));
FT.DrawString (xleft1+20, ytop + 50 + offs * 6, Trans.Text(50));
FT.DrawString (xleft1+20, ytop + 50 + offs * 7, Trans.Text(51));
FT.DrawString (xleft1+20, ytop + 50 + offs * 8,Trans.Text(52));
FT.DrawString (xleft1+20, ytop + 50 + offs * 9, Trans.Text(53));
FT.DrawString (xleft1+20, ytop + 50 + offs * 10, Trans.Text(54));
FT.DrawString (xleft1+20, ytop + 50 + offs * 11, Trans.Text(55));
FT.DrawString (xleft1+20, ytop + 50 + offs * 12, Trans.Text(56));
FT.DrawString (xleft1, AutoYPosN (5), Trans.Text (57));
FT.AutoSizeN (3);
int offs = FT.AutoDistanceN (2);
FT.DrawString (xleft1, ytop, Trans.Text(44));
FT.DrawString (xleft1, ytop + offs, Trans.Text(45));
FT.DrawString (xleft1, ytop + offs * 2, Trans.Text(46));
FT.DrawString (xleft1, ytop + offs * 3, Trans.Text(47));
FT.DrawString (xleft1, ytop + offs * 4, Trans.Text(48));
FT.DrawString (xleft1, ytop + offs * 5, Trans.Text(49));
FT.DrawString (xleft1, ytop + offs * 6, Trans.Text(50));
FT.DrawString (xleft1, ytop + offs * 7, Trans.Text(51));
FT.DrawString (xleft1, ytop + offs * 8,Trans.Text(52));
FT.DrawString (xleft1, ytop + offs * 9, Trans.Text(53));
FT.DrawString (xleft1, ytop + offs * 10, Trans.Text(54));
FT.DrawString (xleft1, ytop + offs * 11, Trans.Text(55));
FT.DrawString (xleft1, ytop + offs * 12, Trans.Text(56));
FT.DrawString (CENTER, AutoYPosN (90), "Press any key to return to the main menu");
Winsys.SwapBuffers();
}

View File

@ -25,6 +25,7 @@ GNU General Public License for more details.
#include "env.h"
#include "keyframe.h"
#include "translation.h"
#include "gui.h"
// ====================================================================
void LoadingInit (void) {
@ -49,16 +50,17 @@ void LoadingLoop (double time_step) {
draw_ui_snow ();
}
Tex.Draw (TEXLOGO, -1, 40, 0.7);
Tex.Draw (TEXLOGO, CENTER, 40, 0.7);
Tex.Draw (BOTTOM_LEFT, 0, hh-256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
FT.SetColor (colDYell);
FT.DrawString (-1, 240, msg);
FT.AutoSizeN (5);
FT.DrawString (CENTER, AutoYPosN (60), msg);
FT.SetColor (colWhite);
FT.DrawString (-1, 320, Trans.Text (30));
FT.DrawString (CENTER, AutoYPosN (70), Trans.Text (30));
Winsys.SwapBuffers ();
SDL_Delay (100);

View File

@ -25,7 +25,6 @@ GNU General Public License for more details.
#include "game_ctrl.h"
#include "translation.h"
static int xleft, ytop;
static int curr_focus = 0;
static TVector2 cursor_pos = {0, 0};
static string name;
@ -42,7 +41,7 @@ static int last_avatar = 0;
void DrawCrsr (float x, float y, int pos, double timestep) {
if (crsrvisible) {
float w = 3;
float h = 26;
float h = 26*param.scale;
TColor col = MakeColor (1, 1, 0, 1);
float scrheight = param.y_resolution;
@ -196,23 +195,35 @@ void NewPlayerMotionFunc (int x, int y ){
}
}
static TArea area;
static int framewidth, frameheight, frametop;
static int prevleft, prevtop, prevwidth, prevoffs;
void NewPlayerInit (void) {
Winsys.KeyRepeat (true);
Winsys.ShowCursor (!param.ice_cursor);
init_ui_snow ();
Music.Play (param.menu_music, -1);
xleft = (param.x_resolution - 400) / 2;
ytop = AutoYPos (200);
g_game.loopdelay = 10;
name = "";
posit = 0;
framewidth = 400 * param.scale;
frameheight = 50 * param.scale;
frametop = AutoYPosN (38);
area = AutoAreaN (30, 80, framewidth);
prevleft = area.left;
prevtop = AutoYPosN (52);
prevwidth = 75 * param.scale;
prevoffs = 80;
ResetWidgets ();
AddArrow (xleft + 340, ytop+165, 0, 0);
AddArrow (xleft + 340, ytop+183, 1, 0);
AddTextButton (Trans.Text(8), xleft + 100, ytop + 280, 1, -1);
AddTextButton (Trans.Text(15), xleft + 300, ytop + 280, 2, -1);
AddArrow (area.left + prevwidth + prevoffs + 8, prevtop, 0, 0);
AddArrow (area.left + prevwidth + prevoffs + 8, prevtop +prevwidth -18, 1, 0);
int siz = FT.AutoSizeN (5);
AddTextButton (Trans.Text(8), area.left+50, AutoYPosN (70), 1, siz);
double len = FT.GetTextWidth (Trans.Text(15));
AddTextButton (Trans.Text(15), area.right-len-50, AutoYPosN (70), 2, siz);
last_avatar = Players.numAvatars - 1;
curr_focus = 0;
@ -232,26 +243,29 @@ void NewPlayerLoop (double timestep ){
update_ui_snow (timestep);
draw_ui_snow();
// DrawFrameX (area.left, area.top, area.right-area.left, area.bottom - area.top,
// 0, colMBackgr, col, 0.2);
Tex.Draw (BOTTOM_LEFT, 0, hh - 256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), param.scale);
FT.SetColor (colWhite);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (20);
FT.DrawString (-1, ytop, "Enter a name for the new player:");
if (param.use_papercut_font > 0) FT.SetSize (24); else FT.SetSize (16);
FT.DrawString (xleft + 70, ytop+160, "Select an avatar:");
FT.AutoSizeN (4);
FT.DrawString (CENTER, AutoYPosN (30), "Enter a name for the new player and select an avatar:");
DrawFrameX (xleft, ytop+60, 400, 44, 3, colMBackgr, colWhite, 1.0);
FT.DrawString (xleft+20, ytop+64, name);
DrawFrameX (area.left, frametop, framewidth, frameheight, 3, colMBackgr, colWhite, 1.0);
FT.AutoSizeN (5);
FT.DrawString (area.left+20, frametop, name);
CalcCursorPos ();
DrawCrsr (xleft+20+curposit+1, ytop+69, 0, timestep);
DrawCrsr (area.left+20+curposit+1, frametop+9, 0, timestep);
if (curr_focus == 0) col = colDYell; else col = colWhite;
Tex.DrawDirectFrame (Players.GetDirectAvatarID (curr_avatar),
xleft+250, ytop + 145, 75, 75, 2, col);
prevleft + prevoffs, prevtop, prevwidth, prevwidth, 2, col);
FT.SetColor (colWhite);
PrintArrow (0, (curr_avatar > 0));
@ -264,7 +278,7 @@ void NewPlayerLoop (double timestep ){
}
void NewPlayerTerm () {
Winsys.SetFonttype ();
// Winsys.SetFonttype ();
}
void NewPlayerRegister() {

View File

@ -42,7 +42,6 @@ static int lastCourse;
static TVector2 cursor_pos = {0, 0};
static TCourse *CourseList;
static int xleft, ytop;
void SetRaceConditions (void) {
if (curr_random > 0) {
@ -140,6 +139,11 @@ static void RaceSelectKeys
}
// --------------------------------------------------------------------
static TArea area;
static int framewidth, frameheight, frametop;
static int prevtop, prevwidth, prevheight;
static int icontop, iconsize, iconspace, iconleft, iconsumwidth;
static int boxleft, boxwidth;
void RaceSelectInit (void) {
Winsys.ShowCursor (!param.ice_cursor);
@ -148,21 +152,37 @@ void RaceSelectInit (void) {
CourseList = Course.CourseList;
lastCourse = Course.numCourses - 1;
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (170);
framewidth = 550 * param.scale;
frameheight = 50 * param.scale;
frametop = AutoYPosN (30);
area = AutoAreaN (30, 80, framewidth);
prevtop = AutoYPosN (50);
prevheight = 144 * param.scale;
prevwidth = 192 * param.scale;
boxwidth = framewidth - prevwidth - 20;
boxleft = area.right - boxwidth;
icontop = AutoYPosN (40);
iconsize = 32 * param.scale;
iconspace = (int)((iconsize+6) * 1.5);
iconsumwidth = iconspace * 4 + iconsize;
iconleft = (param.x_resolution - iconsumwidth) / 2;
ResetWidgets ();
AddArrow (xleft + 470, ytop, 0, 0);
AddArrow (xleft + 470, ytop+18, 1, 0);
AddArrow (area.left + framewidth + 8, frametop, 0, 0);
AddArrow (area.left + framewidth + 8, frametop+18, 1, 0);
int buttoffs = 80; // defines x position of first button
AddIconButton (xleft + buttoffs + 10, ytop + 55, 1, Tex.TexID (LIGHT_BUTT), 32);
AddIconButton (xleft + buttoffs + 60, ytop + 55, 2, Tex.TexID (SNOW_BUTT), 32);
AddIconButton (xleft + buttoffs + 110, ytop + 55, 3, Tex.TexID (WIND_BUTT), 32);
AddIconButton (xleft + buttoffs + 160, ytop + 55, 4, Tex.TexID (MIRROR_BUTT), 32);
AddIconButton (xleft + buttoffs + 210, ytop + 55, 5, Tex.TexID (RANDOM_BUTT), 32);
AddIconButton (iconleft, icontop, 1, Tex.TexID (LIGHT_BUTT), iconsize);
AddIconButton (iconleft + iconspace, icontop, 2, Tex.TexID (SNOW_BUTT), iconsize);
AddIconButton (iconleft + iconspace*2, icontop, 3, Tex.TexID (WIND_BUTT), iconsize);
AddIconButton (iconleft + iconspace*3, icontop, 4, Tex.TexID (MIRROR_BUTT), iconsize);
AddIconButton (iconleft + iconspace*4, icontop, 5, Tex.TexID (RANDOM_BUTT), iconsize);
int siz = FT.AutoSizeN (5);
AddTextButton (Trans.Text(13), area.left+50, AutoYPosN (80), 6, siz);
double len = FT.GetTextWidth (Trans.Text(8));
AddTextButton (Trans.Text(8), area.right-len-50, AutoYPosN (80), 7, siz);
AddTextButton (Trans.Text(13), xleft + 300, ytop + 320, 6, -1);
AddTextButton (Trans.Text(8), xleft + 100, ytop + 320, 7, -1);
curr_focus = 0;
g_game.loopdelay = 20;
}
@ -184,29 +204,35 @@ void RaceSelectLoop (double timestep){
draw_ui_snow ();
}
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), 1.0);
Tex.Draw (BOTTOM_LEFT, 0, hh-256, 1);
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
// DrawFrameX (area.left, area.top, area.right-area.left, area.bottom - area.top,
// 0, colMBackgr, colBlack, 0.2);
// course selection
if (curr_focus == 0) col = colDYell; else col = colWhite;
DrawFrameX (xleft, ytop-4, 460, 44, 3, colMBackgr, col, 1.0);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (22);
DrawFrameX (area.left, frametop, framewidth, frameheight, 3, colMBackgr, col, 1.0);
FT.AutoSizeN (4);
FT.SetColor (colDYell);
FT.DrawString (xleft+20, ytop, CourseList[curr_course].name);
Tex.DrawDirectFrame (CourseList[curr_course].preview, xleft + 3, ytop + 105,
192, 144, 3, colWhite);
DrawFrameX (xleft+210, ytop+102, 250, 150, 3, colBackgr, colWhite, 1.0);
if (param.use_papercut_font > 0) FT.SetSize (18); else FT.SetSize (12);
FT.SetColor (colWhite);
for (int i=0; i<CourseList[curr_course].num_lines; i++) {
FT.DrawString (xleft+220, ytop+105+i*16, CourseList[curr_course].desc[i]);
}
FT.DrawString (area.left+20, frametop, CourseList[curr_course].name);
FT.DrawString (-1, ytop+260, "Author: " + CourseList[curr_course].author);
Tex.DrawDirectFrame (CourseList[curr_course].preview,
area.left + 3, prevtop, prevwidth, prevheight, 3, colWhite);
DrawFrameX (area.right-boxwidth, prevtop-3, boxwidth, prevheight+6, 3, colBackgr, colWhite, 1.0);
FT.AutoSizeN (2);
FT.SetColor (colWhite);
int dist = FT.AutoDistanceN (0);
for (int i=0; i<CourseList[curr_course].num_lines; i++) {
FT.DrawString (boxleft+8, prevtop+i*dist, CourseList[curr_course].desc[i]);
}
FT.DrawString (CENTER, prevtop + prevheight + 10, "Author: " + CourseList[curr_course].author);
PrintArrow (0, (curr_course > 0));
PrintArrow (1, (curr_course < lastCourse));
@ -220,7 +246,7 @@ void RaceSelectLoop (double timestep){
PrintTextButton (0, curr_focus);
PrintTextButton (1, curr_focus);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (20);
FT.AutoSizeN (4);
string forcetrees = "Load trees.png";
string sizevar = "Size: ";
sizevar += Int_StrN (g_game.treesize);
@ -228,10 +254,12 @@ void RaceSelectLoop (double timestep){
sizevar += Int_StrN (g_game.treevar);
if (g_game.force_treemap) {
FT.SetColor (colYellow);
FT.DrawString (-1, ytop + 340, forcetrees);
FT.DrawString (-1, ytop + 380, sizevar);
FT.DrawString (CENTER, AutoYPosN (85), forcetrees);
FT.DrawString (CENTER, AutoYPosN (90), sizevar);
}
if (param.ice_cursor) DrawCursor ();
SDL_GL_SwapBuffers ();
}

View File

@ -34,7 +34,7 @@ static int curr_focus = 0;
static TCharacter *CharList;
static int curr_character = 0;
static int last_character;
static int xleft, ytop;
//static int xleft, ytop;
static int curr_player = 0;
static int last_player;
static int old_last;
@ -109,20 +109,31 @@ void RegistMotionFunc (int x, int y ){
}
}
static int framewidth, frameheight, arrowwidth, sumwidth;
static TArea area;
static double scale, texsize;
void RegistInit (void) {
Winsys.ShowCursor (!param.ice_cursor);
init_ui_snow ();
Music.Play (param.menu_music, -1);
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (230);
scale = param.scale;
framewidth = (int)(scale * 280);
frameheight = (int)(scale * 50);
arrowwidth = 50;
sumwidth = framewidth * 2 + arrowwidth * 2;
area = AutoAreaN (30, 80, sumwidth);
texsize = 128 * scale;
ResetWidgets ();
AddArrow (xleft + 210, ytop, 0, 0);
AddArrow (xleft + 210, ytop+18, 1, 0);
AddArrow (xleft + 470, ytop, 0, 1);
AddArrow (xleft + 470, ytop+18, 1, 1);
AddTextButton ("Enter", -1, ytop + 240, 2, -1);
AddTextButton ("Register a new player", -1, ytop + 290, 3, -1);
AddArrow (area.left + framewidth + 8, area.top, 0, 0);
AddArrow (area.left + framewidth + 8, area.top + 18, 1, 0);
AddArrow (area.left + framewidth * 2 + arrowwidth + 8, area.top, 0, 1);
AddArrow (area.left + framewidth * 2 + arrowwidth + 8, area.top + 18, 1, 1);
int siz = FT.AutoSizeN (5);
AddTextButton ("Enter", CENTER, AutoYPosN (62), 2, siz);
AddTextButton ("Register a new player", CENTER, AutoYPosN (70), 3, siz);
curr_focus = 0;
g_game.loopdelay = 10;
@ -151,35 +162,43 @@ void RegistLoop (double timestep ){
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), scale);
if (param.use_papercut_font > 0) FT.SetSize (20); else FT.SetSize (15);
// DrawFrameX (area.left, area.top, area.right-area.left, area.bottom - area.top,
// 0, colMBackgr, col, 0.2);
FT.AutoSizeN (3);
FT.SetColor (colWhite);
FT.DrawString (xleft, ytop-40, "Select your player name:");
FT.DrawString (xleft+260, ytop-40, "Select a character:");
int top = AutoYPosN (24);
FT.DrawString (area.left, top, "Select your player name:");
FT.DrawString (area.left + framewidth + arrowwidth, top, "Select a character:");
// player selection
FT.AutoSizeN (4);
if (curr_focus == 0) col = colDYell; else col = colWhite;
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (22);
DrawFrameX (xleft, ytop-4, 200, 44, 3, colMBackgr, col, 1.0);
DrawFrameX (area.left, area.top, framewidth, frameheight, 3, colMBackgr, col, 1.0);
FT.SetColor (col);
FT.DrawString (xleft+20, ytop, Players.GetName (curr_player));
FT.DrawString (area.left + 20, area.top, Players.GetName (curr_player));
Tex.DrawDirectFrame (Players.GetAvatarID (curr_player),
xleft + 30, ytop + 65, 128, 128, 3, colWhite);
area.left + 60, AutoYPosN (40), texsize, texsize, 3, colWhite);
// char selection
if (curr_focus == 1) col = colDYell; else col = colWhite;
DrawFrameX (xleft+260, ytop-4, 200, 44, 3, colMBackgr, col, 1.0);
DrawFrameX (area.left + framewidth + arrowwidth, area.top,
framewidth, frameheight, 3, colMBackgr, col, 1.0);
FT.SetColor (col);
FT.DrawString (xleft+280, ytop, CharList[curr_character].name);
Tex.DrawDirectFrame (CharList[curr_character].preview, xleft + 300, ytop + 65,
128, 128, 3, colWhite);
FT.DrawString (area.left + framewidth + arrowwidth + 20,
area.top, CharList[curr_character].name);
Tex.DrawDirectFrame (CharList[curr_character].preview,
area.right - texsize - 60 - arrowwidth,
AutoYPosN (40), texsize, texsize, 3, colWhite);
FT.SetColor (colWhite);
PrintArrow (0, (curr_player > 0));
PrintArrow (1, (curr_player < last_player));
PrintArrow (1, (curr_player < last_player));
PrintArrow (2, (curr_character > 0));
PrintArrow (3, (curr_character < last_character));
PrintTextButton (0, curr_focus);
PrintTextButton (1, curr_focus);

View File

@ -195,7 +195,6 @@ int CScore::CalcRaceResult () {
static int curr_focus = 0;
static TVector2 cursor_pos = {0, 0};
static int xleft, ytop;
static TCourse *CourseList;
static int lastCourse = 0;
static int curr_course = 0;
@ -249,23 +248,38 @@ void ScoreMotionFunc (int x, int y ){
}
}
static TArea area;
static int framewidth, frameheight, frametop;
static int linedist, listtop;
static int dd1, dd2, dd3, dd4;
void ScoreInit (void) {
Winsys.ShowCursor (!param.ice_cursor);
Winsys.KeyRepeat (true);
init_ui_snow ();
Music.Play (param.menu_music, -1);
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (130);
framewidth = 550 * param.scale;
frameheight = 50 * param.scale;
frametop = AutoYPosN (32);
area = AutoAreaN (30, 80, framewidth);
FT.AutoSizeN (3);
linedist = FT.AutoDistanceN (1);
listtop = AutoYPosN (44);
dd1 = 50 * param.scale;
dd2 = 115 * param.scale;
dd3 = 250 * param.scale;
dd4 = 375 * param.scale;
CourseList = Course.CourseList;
lastCourse = Course.numCourses - 1;
curr_course = g_game.course_id;
ResetWidgets ();
AddArrow (xleft + 470, ytop+80, 0, 0);
AddArrow (xleft + 470, ytop+98, 1, 0);
AddTextButton ("Back", CENTER, ytop+400, 1, FIT);
AddArrow (area.right + 8, frametop, 0, 0);
AddArrow (area.right + 8, frametop + 18, 1, 0);
int siz = FT.AutoSizeN (5);
AddTextButton ("Back", CENTER, AutoYPosN (80), 1, siz);
g_game.loopdelay = 1;
}
@ -289,16 +303,19 @@ void ScoreLoop (double timestep ){
Tex.Draw (BOTTOM_RIGHT, ww-256, hh-256, 1);
Tex.Draw (TOP_LEFT, 0, 0, 1);
Tex.Draw (TOP_RIGHT, ww-256, 0, 1);
Tex.Draw (T_TITLE_SMALL, -1, 20, 1.0);
Tex.Draw (T_TITLE_SMALL, CENTER, AutoYPosN (5), param.scale);
if (param.use_papercut_font > 0) FT.SetSize (42); else FT.SetSize (33);
FT.SetColor (colWhite);
FT.DrawString (-1, ytop, "Highscore list");
// DrawFrameX (area.left, area.top, area.right-area.left, area.bottom - area.top,
// 0, colMBackgr, colBlack, 0.2);
DrawFrameX (xleft, ytop+76, 460, 44, 3, colMBackgr, colDYell, 1.0);
if (param.use_papercut_font > 0) FT.SetSize (28); else FT.SetSize (22);
FT.AutoSizeN (7);
FT.SetColor (colWhite);
FT.DrawString (xleft+20, ytop+80, CourseList[curr_course].name);
FT.DrawString (CENTER, AutoYPosN (22), "Highscore list");
DrawFrameX (area.left, frametop, framewidth, frameheight, 3, colMBackgr, colDYell, 1.0);
FT.AutoSizeN (5);
FT.SetColor (colWhite);
FT.DrawString (area.left+20, frametop, CourseList[curr_course].name);
PrintArrow (0, (curr_course > 0));
PrintArrow (1, (curr_course < lastCourse));
@ -307,21 +324,22 @@ void ScoreLoop (double timestep ){
string line;
int y;
FT.SetColor (colWhite);
if (list != NULL) {
if (param.use_papercut_font > 0) FT.SetSize (22); else FT.SetSize (16);
FT.AutoSizeN (3);
if (list->numScores < 1) {
FT.DrawString (-1, ytop + 140, "No entries for this race");
FT.DrawString (CENTER, area.top + 140, "No entries for this race");
} else {
if (list->numScores > MAX_SCORES) list->numScores = MAX_SCORES;
for (int i=0; i<list->numScores; i++) {
y = ytop + i*30 + 140;
FT.DrawString (xleft, y, ordinals[i]);
FT.DrawString (xleft+50, y, Int_StrN (list->scores[i].points));
FT.DrawString (xleft + 115, y, list->scores[i].player);
FT.DrawString (xleft + 250, y,
y = listtop + i*linedist;
FT.DrawString (area.left, y, ordinals[i]);
FT.DrawString (area.left + dd1, y, Int_StrN (list->scores[i].points));
FT.DrawString (area.left + dd2, y, list->scores[i].player);
FT.DrawString (area.left + dd3, y,
Int_StrN (list->scores[i].herrings) + " herrings");
FT.DrawString (xleft + 375, y,
FT.DrawString (area.left + dd4, y,
Float_StrN (list->scores[i].time, 1) + " sec");
}
}

View File

@ -30,37 +30,45 @@ GNU General Public License for more details.
#include "translation.h"
#include "score.h"
static int xleft, ytop;
void SplashKeys (unsigned int key, bool special, bool release, int x, int y) {
if (release) return;
switch (key) {
case 27: Winsys.Quit (); break;
case 13: Winsys.SetMode (REGIST); break;
}
}
void SplashInit (void) {
Winsys.ShowCursor (!param.ice_cursor);
init_ui_snow ();
Music.Play (param.menu_music, -1);
xleft = (param.x_resolution - 500) / 2;
ytop = AutoYPos (230);
g_game.loopdelay = 10;
}
static string fontnam[6] = {"normal", "italic", "bold", "outline", "pc20", "pcoutline"};
void SplashLoop (double timestep ){
int top;
Music.Update ();
check_gl_error();
ClearRenderContext ();
set_gl_options (GUI);
SetupGuiDisplay ();
Tex.Draw (TEXLOGO, -1, 60, 1);
// FT.SetFont ("normal");
Tex.Draw (TEXLOGO, CENTER, 60, param.scale);
FT.SetColor (colDYell);
FT.SetSize (AutoFtSize ());
top = AutoYPos (350);
FT.AutoSizeN (6);
int top = AutoYPosN (60);
int dist = FT.AutoDistanceN (3);
FT.DrawText (CENTER, top, "Loading resources,");
FT.DrawText (CENTER, top + AutoDistance(), "please wait ...");
FT.DrawText (CENTER, top+dist, "please wait ...");
if (param.ice_cursor) DrawCursor ();
Winsys.SwapBuffers();
Trans.LoadLanguages ();
Trans.LoadTranslations (param.language);
LoadCreditList ();
@ -74,7 +82,7 @@ void SplashLoop (double timestep ){
Players.LoadAvatars (); // before LoadPlayers !!!
Players.LoadPlayers ();
SDL_Delay (100);
SDL_Delay (10);
Winsys.SetMode (REGIST);
}
@ -83,5 +91,5 @@ void SplashTerm () {
void splash_screen_register() {
Winsys.SetModeFuncs (SPLASH, SplashInit, SplashLoop, SplashTerm,
NULL, NULL, NULL, NULL, NULL, NULL);
SplashKeys, NULL, NULL, NULL, NULL, NULL);
}

16
tux.cpp
View File

@ -460,8 +460,9 @@ void CCharShape::DrawNodes (TCharNode *node) {
set_material (mat->diffuse, mat->specular, mat->exp);
#if defined (OS_LINUX)
if (USE_CHAR_DISPLAY_LIST) glCallList (GetDisplayList (node->divisions));
else DrawCharSphere (node->divisions);
DrawCharSphere (node->divisions);
// if (USE_CHAR_DISPLAY_LIST) glCallList (GetDisplayList (node->divisions));
// else DrawCharSphere (node->divisions);
#else
DrawCharSphere (node->divisions);
#endif
@ -621,17 +622,6 @@ void CCharShape::AdjustOrientation (CControl *ctrl, double dtime,
RotateAboutVectorMatrix (rot_mat, new_x, ctrl->flip_factor * 360);
MultiplyMatrices (cob_mat, rot_mat, cob_mat);
/* Trick rotations 0.61
new_y = make_vector( cob_mat[1][0], cob_mat[1][1], cob_mat[1][2] );
make_rotation_about_vector_matrix( rot_mat, new_y,
( plyr->control.barrel_roll_factor * 360 ) );
multiply_matrices( cob_mat, rot_mat, cob_mat );
new_x = make_vector( cob_mat[0][0], cob_mat[0][1], cob_mat[0][2] );
make_rotation_about_vector_matrix( rot_mat, new_x,
plyr->control.flip_factor * 360 );
multiply_matrices( cob_mat, rot_mat, cob_mat );
*/
TransposeMatrix (cob_mat, inv_cob_mat);
TransformNode (0, cob_mat, inv_cob_mat);
}

View File

@ -81,6 +81,13 @@ string CWinsys::GetResName (int idx) {
return line;
}
double CWinsys::CalcScreenScale () {
double hh = (double)param.y_resolution;
if (hh < 768) return 0.78;
else if (hh == 768) return 1.0;
else return (hh / 768);
}
void CWinsys::SetupVideoMode (TScreenRes resolution) {
int bpp = 0;
Uint32 video_flags = SDL_OPENGL;
@ -91,9 +98,8 @@ void CWinsys::SetupVideoMode (TScreenRes resolution) {
case 2: bpp = 32; break;
default: param.bpp_mode = 0; bpp = 0;
}
if ((screen = SDL_SetVideoMode
(resolution.width, resolution.height, bpp, video_flags)) == NULL) {
(resolution.width, resolution.height, bpp, video_flags)) == NULL) {
Message ("couldn't initialize video", SDL_GetError());
Message ("set to 800 x 600");
screen = SDL_SetVideoMode (800, 600, bpp, video_flags);
@ -107,6 +113,8 @@ void CWinsys::SetupVideoMode (TScreenRes resolution) {
auto_x_resolution = param.x_resolution;
auto_y_resolution = param.y_resolution;
}
param.scale = CalcScreenScale ();
if (param.use_quad_scale) param.scale = sqrt (param.scale);
}
void CWinsys::SetupVideoMode (int idx) {
@ -114,6 +122,10 @@ void CWinsys::SetupVideoMode (int idx) {
else SetupVideoMode (resolution[idx]);
}
void CWinsys::SetupVideoMode (int width, int height) {
SetupVideoMode (MakeRes (width, height));
}
void CWinsys::InitJoystick () {
if (SDL_InitSubSystem (SDL_INIT_JOYSTICK) < 0) {
Message ("Could not initialize SDL_joystick: %s", SDL_GetError());
@ -175,7 +187,7 @@ void CWinsys::Quit () {
Course.FreeCourseList ();
Course.ResetCourse ();
SaveMessages ();
Audio.Close ();
Audio.Close (); // frees music and sound as well
FT.Clear ();
Players.SavePlayers ();
Score.SaveHighScore ();

View File

@ -64,6 +64,7 @@ private:
int auto_y_resolution;
SDL_Surface *screen;
TScreenRes MakeRes (int width, int height);
double CalcScreenScale ();
// modes and loop
TModeFuncsN modefuncs [NUM_GAME_MODES];
@ -82,6 +83,7 @@ public:
void Init ();
void SetupVideoMode (TScreenRes resolution);
void SetupVideoMode (int idx);
void SetupVideoMode (int width, int height);
void KeyRepeat (bool repeat);
void SetFonttype ();
void PrintJoystickInfo ();