Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/event/key_mapper.cc @ 7495

Last change on this file since 7495 was 7256, checked in by bensch, 19 years ago

orxonox/trunk: merged the preferences back to the trunk
merged with command:
svn merge https://svn.orxonox.net/orxonox/branches/preferences . -r7233:HEAD
no conflicts… nice work

File size: 8.2 KB
RevLine 
[4582]1/*
[4367]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
[4388]13   co-programmer: Christian Meyer
[4582]14
[4388]15   This code was inspired by the command_node.cc code from Christian Meyer in revision
16   4386 and earlier.
[4367]17*/
18
19#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_EVENT
20
[4386]21#include "key_mapper.h"
[4367]22
[5915]23#include "event_def.h"
24
[4864]25#include "globals.h"
[5944]26#include "parser/ini_parser/ini_parser.h"
[7256]27#include "util/preferences.h"
[4400]28#include "key_names.h"
[5075]29#include "debug.h"
[4386]30
[5915]31
[4367]32using namespace std;
33
34
[4452]35/* initialize all variables to a reasonable value*/
[6997]36int KeyMapper::PEV_FORWARD           = EV_UNKNOWN;
37int KeyMapper::PEV_BACKWARD          = EV_UNKNOWN;
[4452]38int KeyMapper::PEV_LEFT              = EV_UNKNOWN;
39int KeyMapper::PEV_RIGHT             = EV_UNKNOWN;
[6998]40int KeyMapper::PEV_UP                = EV_UNKNOWN;
41int KeyMapper::PEV_DOWN              = EV_UNKNOWN;
[5978]42int KeyMapper::PEV_ROLL_LEFT         = EV_UNKNOWN;
43int KeyMapper::PEV_ROLL_RIGHT        = EV_UNKNOWN;
[4452]44int KeyMapper::PEV_STRAFE_LEFT       = EV_UNKNOWN;
45int KeyMapper::PEV_STRAFE_RIGHT      = EV_UNKNOWN;
[4386]46
[4452]47int KeyMapper::PEV_FIRE1             = EV_UNKNOWN;
48int KeyMapper::PEV_FIRE2             = EV_UNKNOWN;
49int KeyMapper::PEV_PREVIOUS_WEAPON   = EV_UNKNOWN;
50int KeyMapper::PEV_NEXT_WEAPON       = EV_UNKNOWN;
[4386]51
[6998]52int KeyMapper::PEV_CHANGE_SHIP       = EV_UNKNOWN;
53
[4452]54int KeyMapper::PEV_VIEW0             = EV_UNKNOWN;
55int KeyMapper::PEV_VIEW1             = EV_UNKNOWN;
56int KeyMapper::PEV_VIEW2             = EV_UNKNOWN;
57int KeyMapper::PEV_VIEW3             = EV_UNKNOWN;
58int KeyMapper::PEV_VIEW4             = EV_UNKNOWN;
[4582]59int KeyMapper::PEV_VIEW5             = EV_UNKNOWN;
[4386]60
[4452]61int KeyMapper::PEV_NEXT_WORLD        = EV_UNKNOWN;
62int KeyMapper::PEV_PREVIOUS_WORLD    = EV_UNKNOWN;
[4386]63
[4452]64int KeyMapper::PEV_PAUSE             = EV_UNKNOWN;
65int KeyMapper::PEV_QUIT              = EV_UNKNOWN;
[4386]66
[4410]67
68
[4452]69//! this is the mapping array from names to ids: enter all orxonox.conf keys here
[4833]70/** @todo use globals.h for this.... everything is done there for those Options,
[4834]71 * and you do not have to care about The namings, as they might change
[4833]72 */
73orxKeyMapping map[] = {
[6998]74  {&KeyMapper::PEV_FORWARD,              CONFIG_NAME_PLAYER_FORWARD},
75  {&KeyMapper::PEV_BACKWARD,             CONFIG_NAME_PLAYER_BACKWARD},
76  {&KeyMapper::PEV_UP,                   CONFIG_NAME_PLAYER_UP},
77  {&KeyMapper::PEV_DOWN,                 CONFIG_NAME_PLAYER_DOWN},
[4834]78  {&KeyMapper::PEV_LEFT,                 CONFIG_NAME_PLAYER_LEFT},
79  {&KeyMapper::PEV_RIGHT,                CONFIG_NAME_PLAYER_RIGHT},
[5978]80  {&KeyMapper::PEV_ROLL_LEFT,            CONFIG_NAME_PLAYER_ROLL_RIGHT},
81  {&KeyMapper::PEV_ROLL_RIGHT,           CONFIG_NAME_PLAYER_ROLL_LEFT},
[4833]82  {&KeyMapper::PEV_STRAFE_LEFT,          "StrafeLeft"},
83  {&KeyMapper::PEV_STRAFE_RIGHT,         "StrafeRight"},
[4386]84
[4834]85  {&KeyMapper::PEV_FIRE1,                CONFIG_NAME_PLAYER_FIRE},
[4833]86  {&KeyMapper::PEV_FIRE1,                "Fire1"},
87  {&KeyMapper::PEV_FIRE2,                "Fire2"},
[4864]88  {&KeyMapper::PEV_NEXT_WEAPON,          CONFIG_NAME_PLAYER_NEXT_WEAPON},
89  {&KeyMapper::PEV_PREVIOUS_WEAPON,      CONFIG_NAME_PLAYER_PREV_WEAPON},
[4412]90
[6998]91  {&KeyMapper::PEV_CHANGE_SHIP,          CONFIG_NAME_PLAYER_CHANGE_SHIP},
[4410]92
[6998]93
[4834]94  {&KeyMapper::PEV_VIEW0,                CONFIG_NAME_VIEW0},
95  {&KeyMapper::PEV_VIEW1,                CONFIG_NAME_VIEW1},
96  {&KeyMapper::PEV_VIEW2,                CONFIG_NAME_VIEW2},
97  {&KeyMapper::PEV_VIEW3,                CONFIG_NAME_VIEW3},
98  {&KeyMapper::PEV_VIEW4,                CONFIG_NAME_VIEW4},
99  {&KeyMapper::PEV_VIEW5,                CONFIG_NAME_VIEW5},
[4410]100
[4834]101  {&KeyMapper::PEV_NEXT_WORLD,           CONFIG_NAME_NEXT_WORLD},
102  {&KeyMapper::PEV_PREVIOUS_WORLD,       CONFIG_NAME_PREV_WORLD},
[4582]103
[4834]104  {&KeyMapper::PEV_PAUSE,                CONFIG_NAME_PAUSE},
105  {&KeyMapper::PEV_QUIT,                 CONFIG_NAME_QUIT},
[4833]106  {NULL, NULL}
107};
[4400]108
109
[4452]110
[4367]111/**
[4836]112 *  standard constructor
[4367]113*/
[4582]114KeyMapper::KeyMapper ()
[4367]115{
[4582]116   this->setClassID(CL_KEY_MAPPER, "KeyMapper");
[4367]117}
118
119
120/**
[4836]121 *  standard deconstructor
[4367]122*/
[4582]123KeyMapper::~KeyMapper ()
[4367]124{
125}
[4369]126
[4452]127
[4369]128/**
[4836]129 *  loads new key bindings from a file
130 * @param filename: The path and name of the file to load the bindings from
[4369]131*/
[7221]132void KeyMapper::loadKeyBindings (const std::string& fileName)
[4369]133{
[4866]134  IniParser parser(fileName);
135  this->loadKeyBindings(&parser);
136}
[4582]137
[4866]138void KeyMapper::loadKeyBindings(IniParser* iniParser)
139{
[5014]140  if( !iniParser->getSection (CONFIG_SECTION_PLAYER "1"))
[4866]141  {
142    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_PLAYER"1\n");
143    return;
144  }
[4369]145  int* index;
[4582]146
[5936]147  iniParser->firstVar();
[7256]148  while( iniParser->getCurrentName() != "" )
[4866]149  {
[5014]150    PRINTF(3)("Keys: Parsing %s, %s now.\n", iniParser->getCurrentName(), iniParser->getCurrentValue());
[5474]151    // map the name to an sdl index
[5014]152    index = nameToIndex (iniParser->getCurrentValue());
[5474]153    // map the index to a internal name
154    this->mapKeys(iniParser->getCurrentName(), index);
[5015]155    iniParser->nextVar();
[4866]156  }
[4369]157
158
159  // PARSE MISC SECTION
[5014]160  if( !iniParser->getSection (CONFIG_SECTION_MISC_KEYS))
[4866]161  {
[5014]162    PRINTF(1)("Could not find key bindings" CONFIG_SECTION_MISC_KEYS "\n");
[4866]163    return;
164  }
[4369]165
[5936]166  iniParser->firstVar();
[7256]167  while( iniParser->getCurrentName() != "" )
[4866]168  {
[5014]169    PRINTF(3)("MISC: Parsing %s, %s now.\n", iniParser->getCurrentName(), iniParser->getCurrentValue());
170    index = nameToIndex (iniParser->getCurrentValue());
[5474]171    this->mapKeys(iniParser->getCurrentName(), index);
[5015]172    iniParser->nextVar();
[4866]173  }
[4369]174}
[4386]175
[7256]176void KeyMapper::loadKeyBindings()
177{
178  if( !Preferences::getInstance()->sectionExists(CONFIG_SECTION_PLAYER "1"))
179  {
180    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_PLAYER"1\n");
181    return;
182  }
183  int* index;
184
185  std::list<std::string> keys = Preferences::getInstance()->listKeys(CONFIG_SECTION_PLAYER "1");
186  for ( std::list<std::string>::const_iterator it = keys.begin(); it!=keys.end(); it++ )
187  {
188    PRINTF(3)("Keys: Parsing %s, %s now.\n", it->c_str(), Preferences::getInstance()->getString(CONFIG_SECTION_PLAYER "1", *it, "").c_str());
189    // map the name to an sdl index
190    index = nameToIndex (Preferences::getInstance()->getString(CONFIG_SECTION_PLAYER "1", *it, ""));
191    // map the index to a internal name
192    this->mapKeys(*it, index);
193  }
194
195
196  // PARSE MISC SECTION
197  if( !Preferences::getInstance()->sectionExists (CONFIG_SECTION_MISC_KEYS))
198  {
199    PRINTF(1)("Could not find key bindings " CONFIG_SECTION_MISC_KEYS "\n");
200    return;
201  }
202
203  keys = Preferences::getInstance()->listKeys(CONFIG_SECTION_MISC_KEYS);
204  for ( std::list<std::string>::const_iterator it = keys.begin(); it!=keys.end(); it++ )
205  {
206    PRINTF(3)("MISC: Parsing %s, %s now.\n", it->c_str(), Preferences::getInstance()->getString(CONFIG_SECTION_MISC_KEYS, *it, "").c_str());
207    index = nameToIndex (Preferences::getInstance()->getString(CONFIG_SECTION_MISC_KEYS, *it, ""));
208    this->mapKeys(*it, index);
209  }
210}
211
[4452]212/**
[4836]213 *  this function looks up name to key index
214 * @param the name of the button
[4452]215*/
[7221]216int* KeyMapper::nameToIndex (const std::string& name)
[4386]217{
218  coord[0] = -1;
219  coord[1] = -1;
220  int c;
[5474]221  if( (c = keynameToSDLK (name)) != -1) {
[4386]222      coord[1] = c;
223      coord[0] = 0;
224    }
[5474]225  if( (c = buttonnameToSDLB (name)) != -1) {
[4386]226      coord[1] = c;
227      coord[0] = 1;
228    }
229  return coord;
230}
[4389]231
232
[4452]233/**
[4836]234 *  the function maps name to key ids
235 * @param name of the key
236 * @param id of the key
[4452]237*/
[7221]238void KeyMapper::mapKeys(const std::string& name, int* index)
[4399]239{
[5474]240  for( int i = 0; map[i].pValue != NULL; ++i )
[4399]241    {
[7221]242      if( name == map[i].pName)
[4582]243      {
[5474]244        if( index[0] == 0)
[5915]245        {
[5474]246          *map[i].pValue = index[1];
247          PRINTF(4)("Mapping %s to '%s' (id %i)\n", name, SDLKToKeyname(index[1]), index[1]);
248          break;
[5915]249        }
250        else {
[5474]251          *map[i].pValue = index[1];
252          PRINTF(4)("Mapping %s to '%s' (id %i)\n", name, SDLBToButtonname(index[1]), index[1]);
253          break;
[5915]254        }
[4582]255      }
[4399]256    }
257}
258
259
[4452]260/**
[4836]261 *  this function gives some debug information about the key mapper class
[4452]262*/
[4389]263void KeyMapper::debug()
264{
[4582]265  PRINT(0)("\n==========================| KeyMapper::debug() |===\n");
[4403]266  for(int i = 0; map[i].pValue != NULL; ++i)
267    {
268      PRINT(0)("%s = %i\n",map[i].pName, *map[i].pValue);
269    }
[4582]270  PRINT(0)("=======================================================\n");
[4389]271}
Note: See TracBrowser for help on using the repository browser.