Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/cleanup/src/lib/event/key_mapper.cc @ 10609

Last change on this file since 10609 was 10571, checked in by bensch, 18 years ago

cleaned out unused defs files, and moved glincl to grafics, alincl.h to sound

File size: 8.5 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Patrick Boenzli
13   co-programmer: Christian Meyer
14
15   This code was inspired by the command_node.cc code from Christian Meyer in revision
16   4386 and earlier.
17*/
18
19#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
20
21#include "key_mapper.h"
22
23#include "event_def.h"
24
25#include "orxonox_globals.h"
26#include "parser/ini_parser/ini_parser.h"
27#include "parser/preferences/preferences.h"
28#include "key_names.h"
29#include "event_def.h"
30#include "debug.h"
31
32
33
34ObjectListDefinition(KeyMapper);
35
36/* initialize all variables to a reasonable value*/
37int KeyMapper::PEV_FORWARD           = EV_UNKNOWN;
38int KeyMapper::PEV_BACKWARD          = EV_UNKNOWN;
39int KeyMapper::PEV_LEFT              = EV_UNKNOWN;
40int KeyMapper::PEV_RIGHT             = EV_UNKNOWN;
41int KeyMapper::PEV_UP                = EV_UNKNOWN;
42int KeyMapper::PEV_DOWN              = EV_UNKNOWN;
43int KeyMapper::PEV_ROLL_LEFT         = EV_UNKNOWN;
44int KeyMapper::PEV_ROLL_RIGHT        = EV_UNKNOWN;
45int KeyMapper::PEV_STRAFE_LEFT       = EV_UNKNOWN;
46int KeyMapper::PEV_STRAFE_RIGHT      = EV_UNKNOWN;
47int KeyMapper::PEV_JUMP              = EV_UNKNOWN;
48
49int KeyMapper::PEV_FIRE1             = EV_UNKNOWN;
50int KeyMapper::PEV_FIRE2             = EV_UNKNOWN;
51int KeyMapper::PEV_PREVIOUS_WEAPON   = EV_UNKNOWN;
52int KeyMapper::PEV_NEXT_WEAPON       = EV_UNKNOWN;
53
54int KeyMapper::PEV_CHANGE_SHIP       = EV_UNKNOWN;
55
56int KeyMapper::PEV_VIEW0             = EV_UNKNOWN;
57int KeyMapper::PEV_VIEW1             = EV_UNKNOWN;
58int KeyMapper::PEV_VIEW2             = EV_UNKNOWN;
59int KeyMapper::PEV_VIEW3             = EV_UNKNOWN;
60int KeyMapper::PEV_VIEW4             = EV_UNKNOWN;
61int KeyMapper::PEV_VIEW5             = EV_UNKNOWN;
62
63int KeyMapper::PEV_NEXT_WORLD        = EV_UNKNOWN;
64int KeyMapper::PEV_PREVIOUS_WORLD    = EV_UNKNOWN;
65
66int KeyMapper::PEV_PAUSE             = EV_UNKNOWN;
67int KeyMapper::PEV_QUIT              = EV_UNKNOWN;
68
69
70
71//! this is the mapping array from names to ids: enter all orxonox.conf keys here
72/** @todo use globals.h for this.... everything is done there for those Options,
73 * and you do not have to care about The namings, as they might change
74 */
75KeyMapper::KeyMapping KeyMapper::map[] = {
76      {&KeyMapper::PEV_FORWARD,              CONFIG_NAME_PLAYER_FORWARD,         SDLK_w},
77      {&KeyMapper::PEV_BACKWARD,             CONFIG_NAME_PLAYER_BACKWARD,        SDLK_s},
78      {&KeyMapper::PEV_UP,                   CONFIG_NAME_PLAYER_UP,              SDLK_r},
79      {&KeyMapper::PEV_DOWN,                 CONFIG_NAME_PLAYER_DOWN,            SDLK_f},
80      {&KeyMapper::PEV_LEFT,                 CONFIG_NAME_PLAYER_LEFT,            SDLK_a},
81      {&KeyMapper::PEV_RIGHT,                CONFIG_NAME_PLAYER_RIGHT,           SDLK_d},
82      {&KeyMapper::PEV_ROLL_RIGHT,           CONFIG_NAME_PLAYER_ROLL_LEFT,       SDLK_z},
83      {&KeyMapper::PEV_ROLL_LEFT,            CONFIG_NAME_PLAYER_ROLL_RIGHT,      SDLK_c},
84      {&KeyMapper::PEV_STRAFE_LEFT,          "StrafeLeft",                       SDLK_q},
85      {&KeyMapper::PEV_STRAFE_RIGHT,         "StrafeRight",                      SDLK_e},
86      {&KeyMapper::PEV_JUMP,                 "Jump",                             SDLK_SPACE},
87
88      {&KeyMapper::PEV_FIRE1,                CONFIG_NAME_PLAYER_FIRE,            EV_MOUSE_BUTTON_LEFT},
89      {&KeyMapper::PEV_FIRE2,                "Fire2",                            EV_MOUSE_BUTTON_RIGHT},
90      {&KeyMapper::PEV_NEXT_WEAPON,          CONFIG_NAME_PLAYER_NEXT_WEAPON,     EV_MOUSE_BUTTON_WHEELUP},
91      {&KeyMapper::PEV_PREVIOUS_WEAPON,      CONFIG_NAME_PLAYER_PREV_WEAPON,     EV_MOUSE_BUTTON_WHEELDOWN},
92
93      {&KeyMapper::PEV_CHANGE_SHIP,          CONFIG_NAME_PLAYER_CHANGE_SHIP,     SDLK_g},
94
95
96      {&KeyMapper::PEV_VIEW0,                CONFIG_NAME_VIEW0,                  SDLK_1},
97      {&KeyMapper::PEV_VIEW1,                CONFIG_NAME_VIEW1,                  SDLK_2},
98      {&KeyMapper::PEV_VIEW2,                CONFIG_NAME_VIEW2,                  SDLK_3},
99      {&KeyMapper::PEV_VIEW3,                CONFIG_NAME_VIEW3,                  SDLK_4},
100      {&KeyMapper::PEV_VIEW4,                CONFIG_NAME_VIEW4,                  SDLK_5},
101      {&KeyMapper::PEV_VIEW5,                CONFIG_NAME_VIEW5,                  SDLK_6},
102
103      {&KeyMapper::PEV_NEXT_WORLD,           CONFIG_NAME_NEXT_WORLD,             SDLK_x},
104      {&KeyMapper::PEV_PREVIOUS_WORLD,       CONFIG_NAME_PREV_WORLD,             SDLK_z},
105
106      {&KeyMapper::PEV_PAUSE,                CONFIG_NAME_PAUSE,                  SDLK_p},
107      {&KeyMapper::PEV_QUIT,                 CONFIG_NAME_QUIT,                   SDLK_ESCAPE},
108      {NULL, "", 0}
109    };
110
111
112
113/**
114 *  standard constructor
115*/
116KeyMapper::KeyMapper ()
117{
118  this->registerObject(this, KeyMapper::_objectList);
119}
120
121
122/**
123 *  standard deconstructor
124*/
125KeyMapper::~KeyMapper ()
126{}
127
128
129/**
130 *  loads new key bindings from a file
131 * @param filename: The path and name of the file to load the bindings from
132*/
133void KeyMapper::loadKeyBindings (const std::string& fileName)
134{
135  IniParser parser(fileName);
136  this->loadKeyBindings(&parser);
137}
138
139void KeyMapper::loadKeyBindings(IniParser* iniParser)
140{
141  IniParser::Section* section = iniParser->getSection (CONFIG_SECTION_CONTROL);
142  if( section == NULL)
143  {
144    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_CONTROL "\n");
145    return;
146  }
147  int* index;
148
149
150  for(IniParser::Entry::iterator entry = section->begin();
151      entry != section->end();
152      ++entry)
153  {
154    PRINTF(3)("Keys: Parsing %s, %s now.\n", (*entry).name().c_str(), (*entry).value().c_str());
155    // map the name to an sdl index
156    index = nameToIndex ((*entry).value());
157    // map the index to a internal name
158    this->mapKeys((*entry).name(), index);
159  }
160
161
162  // PARSE MISC SECTION
163  //   if( !iniParser->getSection (CONFIG_SECTION_MISC_KEYS))
164  //   {
165  //     PRINTF(1)("Could not find key bindings" CONFIG_SECTION_MISC_KEYS "\n");
166  //     return;
167  //   }
168  //
169  //   iniParser->firstVar();
170  //   while( iniParser->getCurrentName() != "" )
171  //   {
172  //     PRINTF(3)("MISC: Parsing %s, %s now.\n", iniParser->getCurrentName(), iniParser->getCurrentValue());
173  //     index = nameToIndex (iniParser->getCurrentValue());
174  //     this->mapKeys(iniParser->getCurrentName(), index);
175  //     iniParser->nextVar();
176  //   }
177}
178
179void KeyMapper::loadKeyBindings()
180{
181  if( !Preferences::getInstance()->sectionExists(CONFIG_SECTION_CONTROL))
182  {
183    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_CONTROL "\n");
184    return;
185  }
186  int* index;
187
188  std::list<std::string> keys = Preferences::getInstance()->listKeys(CONFIG_SECTION_CONTROL);
189  for ( std::list<std::string>::const_iterator it = keys.begin(); it!=keys.end(); it++ )
190  {
191    PRINTF(3)("Keys: Parsing %s, %s now.\n", it->c_str(), Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, "").c_str());
192    // map the name to an sdl index
193    index = nameToIndex (Preferences::getInstance()->getString(CONFIG_SECTION_CONTROL, *it, ""));
194    // map the index to a internal name
195    this->mapKeys(*it, index);
196  }
197}
198
199/**
200 *  this function looks up name to key index
201 * @param the name of the button
202*/
203int* KeyMapper::nameToIndex (const std::string& name)
204{
205  coord[0] = -1;
206  coord[1] = -1;
207  int c;
208  if( (c = keynameToSDLK (name)) != -1)
209  {
210    coord[1] = c;
211    coord[0] = 0;
212  }
213  if( (c = buttonnameToSDLB (name)) != -1)
214  {
215    coord[1] = c;
216    coord[0] = 1;
217  }
218  return coord;
219}
220
221
222/**
223 *  the function maps name to key ids
224 * @param name of the key
225 * @param id of the key
226*/
227void KeyMapper::mapKeys(const std::string& name, int* index)
228{
229  for( int i = 0; map[i].pValue != NULL; ++i )
230  {
231    if( name == map[i].pName)
232    {
233      if( index[0] == 0)
234      {
235        *map[i].pValue = index[1];
236        PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLKToKeyname(index[1]).c_str(), index[1]);
237        break;
238      }
239      else
240      {
241        *map[i].pValue = index[1];
242        PRINTF(4)("Mapping %s to '%s' (id %i)\n", name.c_str(), SDLBToButtonname(index[1]).c_str(), index[1]);
243        break;
244      }
245    }
246  }
247}
248
249
250/**
251 *  this function gives some debug information about the key mapper class
252*/
253void KeyMapper::debug()
254{
255  PRINT(0)("\n==========================| KeyMapper::debug() |===\n");
256  for(int i = 0; map[i].pValue != NULL; ++i)
257  {
258    PRINT(0)("%s = %i\n",map[i].pName.c_str(), *map[i].pValue);
259  }
260  PRINT(0)("=======================================================\n");
261}
Note: See TracBrowser for help on using the repository browser.