+void Keymap::LoadDefault() {
+ Map(SDL_SCANCODE_UP, MOVE_FORWARD);
+ Map(SDL_SCANCODE_W, MOVE_FORWARD);
+ Map(SDL_SCANCODE_DOWN, MOVE_BACKWARD);
+ Map(SDL_SCANCODE_S, MOVE_BACKWARD);
+ Map(SDL_SCANCODE_LEFT, MOVE_LEFT);
+ Map(SDL_SCANCODE_A, MOVE_LEFT);
+ Map(SDL_SCANCODE_RIGHT, MOVE_RIGHT);
+ Map(SDL_SCANCODE_D, MOVE_RIGHT);
+ Map(SDL_SCANCODE_SPACE, MOVE_UP);
+ Map(SDL_SCANCODE_RSHIFT, MOVE_UP);
+ Map(SDL_SCANCODE_LSHIFT, MOVE_DOWN);
+ Map(SDL_SCANCODE_LCTRL, MOVE_DOWN);
+ Map(SDL_SCANCODE_RCTRL, MOVE_DOWN);
+
+ Map(SDL_SCANCODE_TAB, INV_NEXT);
+ Map(SDL_SCANCODE_RIGHTBRACKET, INV_NEXT);
+ Map(SDL_SCANCODE_LEFTBRACKET, INV_PREVIOUS);
+ Map(SDL_SCANCODE_1, INV_1);
+ Map(SDL_SCANCODE_2, INV_2);
+ Map(SDL_SCANCODE_3, INV_3);
+ Map(SDL_SCANCODE_4, INV_4);
+ Map(SDL_SCANCODE_5, INV_5);
+ Map(SDL_SCANCODE_6, INV_6);
+ Map(SDL_SCANCODE_7, INV_7);
+ Map(SDL_SCANCODE_8, INV_8);
+ Map(SDL_SCANCODE_9, INV_9);
+ Map(SDL_SCANCODE_0, INV_10);
+
+ Map(SDL_SCANCODE_INSERT, SECONDARY);
+ Map(SDL_SCANCODE_RETURN, SECONDARY);
+ Map(SDL_SCANCODE_MENU, TERTIARY);
+ Map(SDL_SCANCODE_DELETE, PRIMARY);
+ Map(SDL_SCANCODE_BACKSPACE, PRIMARY);
+
+ Map(SDL_SCANCODE_F1, TOGGLE_HUD);
+ Map(SDL_SCANCODE_F2, TOGGLE_VIDEO);
+ Map(SDL_SCANCODE_F3, TOGGLE_DEBUG);
+ Map(SDL_SCANCODE_F4, TOGGLE_AUDIO);
+
+ Map(SDL_SCANCODE_ESCAPE, EXIT);
+}
+
+
+void Keymap::Load(std::istream &is) {
+ TokenStreamReader in(is);
+ std::string key_name;
+ std::string action_name;
+ SDL_Scancode key;
+ Action action;
+ while (in.HasMore()) {
+ if (in.Peek().type == Token::STRING) {
+ in.ReadString(key_name);
+ key = SDL_GetScancodeFromName(key_name.c_str());
+ } else {
+ key = SDL_Scancode(in.GetInt());
+ }
+ in.Skip(Token::EQUALS);
+ in.ReadIdentifier(action_name);
+ action = StringToAction(action_name);
+ if (in.HasMore() && in.Peek().type == Token::SEMICOLON) {
+ in.Skip(Token::SEMICOLON);
+ }
+ Map(key, action);
+ }