diff --git a/src/EventManager.cpp b/src/EventManager.cpp index e26a99d..21ce992 100644 --- a/src/EventManager.cpp +++ b/src/EventManager.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2006 by Tom Hicks * - * tomhicks@cse.buffalo.edu * + * Copyright (C) 2006 by Tom Hicks * + * tomhicks@cse.buffalo.edu * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -36,21 +36,40 @@ namespace OpenArena { } - void EventManager::SendEvent(Event* event) + + void EventManager::SendEvent(Events::Event* event) { unsigned int index; for(index=0; index < eventHandlers.Length(); index++) { - Event::EventHandler* handler = eventHandlers[index]; + Events::Event::EventHandler* handler = eventHandlers[index]; if(handler->Handles(event->GetEventType())) { handler->HandleEvent(event); } } + + delete event; } - void EventManager::RegisterEventHandler(Event::EventHandler* eventHandler) + /* + void EventManager::SendEvent(Events::Event event) + { + unsigned int index; + + for(index=0; index < eventHandlers.Length(); index++) + { + Events::Event::EventHandler* handler = eventHandlers[index]; + if(handler->Handles(event.GetEventType())) + { + handler->HandleEvent(event); + } + } + } + */ + + void EventManager::RegisterEventHandler(Events::Event::EventHandler* eventHandler) { eventHandlers.Insert(eventHandler); } diff --git a/src/EventManager.h b/src/EventManager.h index f6431df..e1329c7 100644 --- a/src/EventManager.h +++ b/src/EventManager.h @@ -22,16 +22,6 @@ #include "Events/Event.h" #include "list.h" - -/** - * @file EventManager.h - * @breif Specification of the EventManager class - * This file along with EventManager.cpp implement the EventManager - * class. The EventManager class collects and redistributes events - * in a fashion similar to AWT's EventListeners. - * - * @see EventManager.cpp - */ namespace OpenArena { @@ -39,10 +29,10 @@ namespace OpenArena { public: EventManager(); - void SendEvent(Event* event); - void RegisterEventHandler(Event::EventHandler* eventHandler); + void SendEvent(Events::Event* event); + void RegisterEventHandler(Events::Event::EventHandler* eventHandler); private: - list eventHandlers; + list eventHandlers; }; } #endif /*__OpenArena_EventMangaer_h__*/ diff --git a/src/Events/AxisMotionEvent.cpp b/src/Events/AxisMotionEvent.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Events/AxisMotionEvent.h b/src/Events/AxisMotionEvent.h new file mode 100644 index 0000000..e69de29 diff --git a/src/Events/DrawEvent.cpp b/src/Events/DrawEvent.cpp index c3859a3..4617aef 100644 --- a/src/Events/DrawEvent.cpp +++ b/src/Events/DrawEvent.cpp @@ -1,30 +1,45 @@ #include "DrawEvent.h" #include "../main.h" -OpenArena::DrawEvent::DrawEvent() +namespace OpenArena { -} - -OpenArena::DrawEvent::~DrawEvent() -{ -} - -OpenArena::Event::EventType OpenArena::DrawEvent::GetEventType() -{ - return Event::DrawEventType; -} - -bool OpenArena::DrawEvent::DrawEventHandler::Handles(OpenArena::Event::EventType type) -{ - if(type == Event::DrawEventType) + namespace Events { - return true; - } - - return false; -} - -void OpenArena::DrawEvent::DrawEventHandler::HandleEvent(OpenArena::Event* event) -{ - DrawGLScene(); -} + + DrawEvent::DrawEvent() + { + SetEventType(Event::DrawEventType); + } + + DrawEvent::~DrawEvent() + { + } + + bool DrawEvent::DrawEventHandler::Handles(Event::EventType type) + { + if(type == Event::DrawEventType) + { + return true; + } + + return false; + } + + /* + void DrawEvent::DrawEventHandler::HandleEvent(Event event) + { + DrawGLScene(); + } + */ + + void DrawEvent::DrawEventHandler::HandleEvent(Event* event) + { + DrawGLScene(_level); + } + + DrawEvent::DrawEventHandler::DrawEventHandler(Level* level) + { + _level = level; + } + }; +}; diff --git a/src/Events/DrawEvent.h b/src/Events/DrawEvent.h index da8c1d0..d60718a 100644 --- a/src/Events/DrawEvent.h +++ b/src/Events/DrawEvent.h @@ -3,21 +3,29 @@ #include "Event.h" #include "../Geometry2D/Rectangle.h" +#include "../level.h" namespace OpenArena { - class DrawEvent :public OpenArena::Event + namespace Events { - public: - class DrawEventHandler :public EventHandler + class DrawEvent :public OpenArena::Events::Event { - virtual bool Handles(EventType type); - virtual void HandleEvent(Event* event); + public: + class DrawEventHandler :public EventHandler + { + public: + DrawEventHandler(Level* level); + virtual bool Handles(EventType type); + virtual void HandleEvent(Event* event); + //virtual void HandleEvent(Event event); + private: + Level* _level; + }; + + DrawEvent(); + virtual ~DrawEvent(); }; - - DrawEvent(); - virtual ~DrawEvent(); - virtual Event::EventType GetEventType(); }; }; diff --git a/src/Events/Event.cpp b/src/Events/Event.cpp new file mode 100644 index 0000000..6974b1b --- /dev/null +++ b/src/Events/Event.cpp @@ -0,0 +1,49 @@ +#include "Event.h" + +namespace OpenArena +{ + namespace Events + { + Event::Event() + { + SetEventType(UnknownEventType); + } + + Event::~Event() + { + } + + OpenArena::Events::Event::EventType Event::GetEventType() + { + return _type; + } + + void Event::SetEventType(OpenArena::Events::Event::EventType type) + { + _type = type; + } + + Event::EventHandler::EventHandler() + { + } + + Event::EventHandler::~EventHandler() + { + } + + bool Event::EventHandler::Handles(Event::EventType eventType) + { + return false; + } + + void Event::EventHandler::HandleEvent(Event* event) + { + } + + /* + void Event::EventHandler::HandleEvent(Event event) + { + } + */ + } +} \ No newline at end of file diff --git a/src/Events/Event.h b/src/Events/Event.h index 1d34c18..42beb65 100644 --- a/src/Events/Event.h +++ b/src/Events/Event.h @@ -1,30 +1,42 @@ #ifndef __OpenArena_Event_h__ #define __OpenArena_Event_h__ +#include "../Object.h" namespace OpenArena { - class Event + namespace Events { - public: - enum EventType - { - InputEventType, - DrawEventType - }; - - class EventHandler + class Event :public Object { public: - virtual bool Handles(Event::EventType eventType) = 0; - virtual void HandleEvent(Event* event) = 0; -// virtual ~EventHandler(){}; + enum EventType + { + InputEventType, + DrawEventType, + KeyPressEventType, + KeyReleaseEventType, + AxisMotionEventType, + UnknownEventType + }; + + class EventHandler + { + public: + EventHandler(); + virtual bool Handles(Event::EventType eventType); + virtual void HandleEvent(Event* event); + //virtual void HandleEvent(Event event); + virtual ~EventHandler(); + }; + + Event(); + virtual ~Event(); + EventType GetEventType(); + protected: + void SetEventType(EventType type); + private: + EventType _type; }; - - virtual EventType GetEventType() = 0; - - //remove this - Event(){}; - virtual ~Event(){}; }; }; #endif //__OpenArena_Event_h__ diff --git a/src/Events/KeyPressEvent.cpp b/src/Events/KeyPressEvent.cpp new file mode 100644 index 0000000..f7d872b --- /dev/null +++ b/src/Events/KeyPressEvent.cpp @@ -0,0 +1,68 @@ +#include "KeyPressEvent.h" +#include +#include "../main.h" +namespace OpenArena +{ + namespace Events + { + KeyPressEvent::KeyPressEvent(OpenArena::Keys key) + { + printf("KeyPressEvent created"); + _key = key; + SetEventType(KeyPressEventType); + } + + KeyPressEvent::~KeyPressEvent() + { + } + + OpenArena::Keys KeyPressEvent::GetKey() + { + return _key; + } + + bool KeyPressEvent::KeyPressEventHandler::Handles(Event::EventType eventType) + { + if(eventType == Event::KeyPressEventType) + { + return true; + } + + return false; + } + + void KeyPressEvent::KeyPressEventHandler::HandleEvent(Event* event) + { + if(event != 0x0) + { + if(event->GetEventType() == Event::KeyPressEventType) + { + KeyPressEvent* ev = (KeyPressEvent*) event; + printf("KeyPressed: %s\n", GetKeyName(ev->GetKey())); + keys[ev->GetKey()] = true; + } + } + } + + /* + void KeyPressEvent::KeyPressEventHandler::HandleEvent(Event event) + { + if(event.GetEventType() == Event::KeyPressEventType) + { + KeyPressEvent ev = *((KeyPressEvent*)&event); + printf("KeyPressed: %s\n", GetKeyName(ev.GetKey())); + keys[ev.GetKey()] = true; + } + } + */ + + KeyPressEvent::KeyPressEventHandler::KeyPressEventHandler() + { + } + + KeyPressEvent::KeyPressEventHandler::~KeyPressEventHandler() + { + } + + }; +}; diff --git a/src/Events/KeyPressEvent.h b/src/Events/KeyPressEvent.h new file mode 100644 index 0000000..86660a8 --- /dev/null +++ b/src/Events/KeyPressEvent.h @@ -0,0 +1,33 @@ +#ifndef __OpenArena_KeyPressEvent_h__ +#define __OpenArena_KeyPressEvent_h__ +#include "Event.h" +#include "../keys.h" + +namespace OpenArena +{ + namespace Events + { + class KeyPressEvent :public Event + { + public: + KeyPressEvent(OpenArena::Keys key); + ~KeyPressEvent(); + virtual OpenArena::Keys KeyPressEvent::GetKey(); + + class KeyPressEventHandler :public Event::EventHandler + { + public: + KeyPressEventHandler(); + virtual bool Handles(Event::EventType eventType); + virtual void HandleEvent(Event* event); + //virtual void HandleEvent(Event event); + virtual ~KeyPressEventHandler(); + }; + + private: + OpenArena::Keys _key; + }; + }; +}; + +#endif // __OpenArena_KeyPressEvent_h__ \ No newline at end of file diff --git a/src/Events/KeyReleaseEvent.cpp b/src/Events/KeyReleaseEvent.cpp new file mode 100644 index 0000000..7387e3e --- /dev/null +++ b/src/Events/KeyReleaseEvent.cpp @@ -0,0 +1,67 @@ +#include "KeyReleaseEvent.h" +#include +#include "../main.h" +namespace OpenArena +{ + namespace Events + { + KeyReleaseEvent::KeyReleaseEvent(OpenArena::Keys key) + { + _key = key; + SetEventType(KeyReleaseEventType); + } + + KeyReleaseEvent::~KeyReleaseEvent() + { + } + + OpenArena::Keys KeyReleaseEvent::GetKey() + { + return _key; + } + bool KeyReleaseEvent::KeyReleaseEventHandler::Handles(Event::EventType type) + { + if(type == Event::KeyReleaseEventType) + { + return true; + } + return false; + } + + void KeyReleaseEvent::KeyReleaseEventHandler::HandleEvent(Event* event) + { + if(event != 0x0) + { + if(event->GetEventType() == Event::KeyReleaseEventType) + { + KeyReleaseEvent* ev = (KeyReleaseEvent*) event; + printf("KeyReleased: %s\n", GetKeyName(ev->GetKey())); + keys[ev->GetKey()] = false; + keys2[ev->GetKey()] = false; + } + } + } + + /* + void KeyReleaseEvent::KeyReleaseEventHandler::HandleEvent(Event event) + { + if(event.GetEventType() == Event::KeyReleaseEventType) + { + KeyReleaseEvent ev = *((KeyReleaseEvent*)&event); + printf("KeyReleased: %s\n", GetKeyName(ev.GetKey())); + keys[ev.GetKey()] = false; + keys2[ev.GetKey()] = false; + } + } + */ + + KeyReleaseEvent::KeyReleaseEventHandler::KeyReleaseEventHandler() + { + } + + KeyReleaseEvent::KeyReleaseEventHandler::~KeyReleaseEventHandler() + { + } + + }; +}; diff --git a/src/Events/KeyReleaseEvent.h b/src/Events/KeyReleaseEvent.h new file mode 100644 index 0000000..592513a --- /dev/null +++ b/src/Events/KeyReleaseEvent.h @@ -0,0 +1,33 @@ +#ifndef __OpenArena_KeyReleaseEvent_h__ +#define __OpenArena_KeyReleaseEvent_h__ +#include "Event.h" +#include "../keys.h" + +namespace OpenArena +{ + namespace Events + { + class KeyReleaseEvent :public Event + { + public: + KeyReleaseEvent(OpenArena::Keys key); + ~KeyReleaseEvent(); + virtual OpenArena::Keys KeyReleaseEvent::GetKey(); + + class KeyReleaseEventHandler :public Event::EventHandler + { + public: + KeyReleaseEventHandler(); + virtual bool Handles(Event::EventType eventType); + virtual void HandleEvent(Event* event); + //virtual void HandleEvent(Event event); + virtual ~KeyReleaseEventHandler(); + }; + + private: + OpenArena::Keys _key; + }; + }; +}; + +#endif // __OpenArena_KeyReleaseEvent_h__ \ No newline at end of file diff --git a/src/Makefile.macosx b/src/Makefile.macosx index 5fc428c..26cd1d4 100644 --- a/src/Makefile.macosx +++ b/src/Makefile.macosx @@ -8,12 +8,13 @@ INCLUDE_DIRS = -I$(X11INCLUDEDIR) -DHAVE_CONFIG_H LIBRARY_DIRS = -L$(X11LIBDIR) OBJECTS = screen.o bmp.o camera.o ctrls.o level.o mygl.o myglFont.o myglTexture.o player.o OBJECTS += strmanip.o tga.o vector.o window.o keys.o main.o x11.o EventManager.o Events/DrawEvent.o +OBJECTS += Events/Event.o Object.o Events/KeyPressEvent.o Events/KeyReleaseEvent.o LIBS = $(LIBRARY_DIRS) -lGL -lGLU -lXxf86vm -lX11 LIBRARIES = SO_LIBS = SO_LIBRARIES = oa_game.so oa_audio.so oa_net.so oa_video.so oa_input.so CPPFLAGS = $(INCLUDE_DIRS) -LDFLAGS = $(LIBS) -bind_at_load --disable-framework=/Library/Frameworks/OpenGL +LDFLAGS = $(LIBS) -bind_at_load -framework OpenGL -framework AGL -framework Carbon .Phony: all clean install all: ../OpenArena @@ -41,7 +42,19 @@ oa_video.so: oa_input.so: #Object Files -DrawEvent.o: Events/DrawEvent.cpp Events/DrawEvent.h +Events/Event.o: Events/Event.cpp Events/Event.h Object.h + $(CPP) -c $(INCLUDE_DIRS) -o Events/Event.o Events/Event.cpp + +Object.o: Object.cpp Object.h + $(CPP) -c $(INCLUDE_DIRS) -o Object.o Object.cpp + +Events/KeyPressEvent.o: Events/KeyPressEvent.cpp Events/KeyPressEvent.h Events/Event.h + $(CPP) -c $(INCLUDE_DIRS) -o Events/KeyPressEvent.o Events/KeyPressEvent.cpp + +Events/KeyReleaseEvent.o: Events/KeyReleaseEvent.cpp Events/KeyReleaseEvent.h Events/Event.h + $(CPP) -c $(INCLUDE_DIRS) -o Events/KeyReleaseEvent.o Events/KeyReleaseEvent.cpp + +Events/DrawEvent.o: Events/DrawEvent.cpp Events/DrawEvent.h Events/Event.h $(CPP) -c $(INCLUDE_DIRS) -o Events/DrawEvent.o Events/DrawEvent.cpp screen.o: screen.cpp screen.h config.h @@ -89,7 +102,7 @@ keys.o: keys.cpp keys.h config.h main.o: macosx.cpp main.h config.h Events/Event.h Events/DrawEvent.h EventManager.h $(CPP) -c $(INCLUDE_DIRS) -o main.o macosx.cpp -x11.o: x11.cpp x11.h EventManager.h +x11.o: x11.cpp x11.h EventManager.h main.h mygl.h $(CPP) -c $(INCLUDE_DIRS) -o x11.o x11.cpp EventManager.o: EventManager.cpp EventManager.h Events/Event.h diff --git a/src/Object.cpp b/src/Object.cpp new file mode 100644 index 0000000..9a06666 --- /dev/null +++ b/src/Object.cpp @@ -0,0 +1,17 @@ +#include "Object.h" + +namespace OpenArena +{ + Object::Object() + { + } + + Object::~Object() + { + } + + const char * Object::GetClassName() + { + return 0x0; + } +}; \ No newline at end of file diff --git a/src/Object.h b/src/Object.h new file mode 100644 index 0000000..2d6b6d5 --- /dev/null +++ b/src/Object.h @@ -0,0 +1,15 @@ +#ifndef __OpenArena_Object_h__ +#define __OpenArena_Object_h__ + +namespace OpenArena +{ + class Object + { + public: + Object(); + virtual ~Object(); + virtual const char* GetClassName(); + }; +}; + +#endif //__OpenArena_Object_h__ \ No newline at end of file diff --git a/src/ctrls.cpp b/src/ctrls.cpp index f00b956..ba0ee9f 100644 --- a/src/ctrls.cpp +++ b/src/ctrls.cpp @@ -39,255 +39,186 @@ // // Summary of Properties: // ControlScheme -// -list forward; -// A list of the VKeys associated with forward. -// -list backward; -// A list of the VKeys associated with backward. -// -list lookLeft; -// A list of the VKeys associated with turning left. -// -list lookRight; -// A list of the VKeys associated with turning right. -// -list lookUp; -// A list of the VKeys associated with looking up. -// -list lookDown; -// A list of the VKeys associated with looking down. -// -list moveLeft; -// A list of the VKeys associated with strafing left. -// -list moveRight; -// A list of the VKeys associated with strafing right. -// -list moveUp; -// A list of the VKeys associated with jumping. -// -list moveDown; -// A list of the VKeys associated with crouching. -// -list firePrimary; -// A list of the VKeys associated with activating the primary ability of the active item. -// -list fireSecondary; -// A list of the VKeys associated with activating the secondary ablilty of the active item. -// -list weaponNext; -// A list of the VKeys associated with switching to the next item. -// -list weaponPrev; -// A list of the VKeys associated with switching to the previous item. -// -list toggleLights; -// A list of the VKeys associated with turning lighting on and off. -// -list toggleFPS; -// A list of the VKeys associated with turning the FPS display on and off. -// -list toggleConsole; -// A list of the VKeys associated with toggling the display of the console. -// -list toggleMouseLook; -// A list of the VKeys associated with toggling mouse look. -// -list quickMouseLook; -// A list of the VKeys associated with temporarily switching the mouse look mode. -// -list rollLeft; -// A list of the VKeys associated with rolling left. -// -list rollRight; -// A list of the VKeys associated with rolling right. // //////////////////////////////////////////////////////////////////////////////// #include "ctrls.h" +#include "strmanip.h" +using std::string; +using std::ostream; +using std::endl; namespace OpenArena{ void ControlScheme::LoadDefaultControlScheme() { - forward.Insert(OpenArena::KEY_LBUTTON); - backward.Insert(OpenArena::KEY_RBUTTON); - lookLeft.Insert(OpenArena::KEY_LEFT); - lookRight.Insert(OpenArena::KEY_RIGHT); - lookUp.Insert(OpenArena::KEY_UP); - lookDown.Insert(OpenArena::KEY_DOWN); - moveLeft.Insert(OpenArena::KEY_S); - moveRight.Insert(OpenArena::KEY_D); - moveUp.Insert(OpenArena::KEY_SPACE); - moveDown.Insert(OpenArena::KEY_A); - firePrimary.Insert(OpenArena::KEY_F); - fireSecondary.Insert(OpenArena::KEY_G); - weaponNext.Insert(OpenArena::KEY_T); - weaponPrev.Insert(OpenArena::KEY_R); - toggleLights.Insert(OpenArena::KEY_L); - toggleFPS.Insert(OpenArena::KEY_P); - toggleConsole.Insert(OpenArena::KEY_OEM_3); - toggleMouseLook.Insert(OpenArena::KEY_M); - quickMouseLook.Insert(OpenArena::KEY_Q); - rollLeft.Insert(OpenArena::KEY_W); - rollRight.Insert(OpenArena::KEY_E); + Bind(OpenArena::KEY_LBUTTON, ACTION_FORWARD); + Bind(OpenArena::KEY_RBUTTON, ACTION_BACKWARD); + Bind(OpenArena::KEY_LEFT, ACTION_LOOKLEFT); + Bind(OpenArena::KEY_RIGHT, ACTION_LOOKRIGHT); + Bind(OpenArena::KEY_UP, ACTION_LOOKUP); + Bind(OpenArena::KEY_DOWN, ACTION_LOOKDOWN); + Bind(OpenArena::KEY_S, ACTION_MOVELEFT); + Bind(OpenArena::KEY_D, ACTION_MOVERIGHT); + Bind(OpenArena::KEY_SPACE, ACTION_MOVEUP); + Bind(OpenArena::KEY_A, ACTION_MOVEDOWN); + Bind(OpenArena::KEY_F, ACTION_FIREPRIMARY); + Bind(OpenArena::KEY_G, ACTION_FIRESECONDARY); + Bind(OpenArena::KEY_T, ACTION_WEAPONNEXT); + Bind(OpenArena::KEY_R, ACTION_WEAPONPREV); + Bind(OpenArena::KEY_L, ACTION_TOGGLE_LIGHTS); + Bind(OpenArena::KEY_P, ACTION_TOGGLE_FPS); + Bind(OpenArena::KEY_OEM_3, ACTION_TOGGLE_CONSOLE); + Bind(OpenArena::KEY_M, ACTION_TOGGLE_MOUSELOOK); + Bind(OpenArena::KEY_Q, ACTION_QUICKMOUSELOOK); + Bind(OpenArena::KEY_W, ACTION_ROLLLEFT); + Bind(OpenArena::KEY_E, ACTION_ROLLRIGHT); } - void ControlScheme::ClearControlScheme() + void ControlScheme::UnBindAll() { - backward.Clear(); - firePrimary.Clear(); - fireSecondary.Clear(); - forward.Clear(); - lookDown.Clear(); - lookUp.Clear(); - lookRight.Clear(); - lookLeft.Clear(); - moveDown.Clear(); - moveUp.Clear(); - moveLeft.Clear(); - moveRight.Clear(); - quickMouseLook.Clear(); - toggleConsole.Clear(); - toggleFPS.Clear(); - toggleLights.Clear(); - toggleMouseLook.Clear(); - weaponNext.Clear(); - weaponPrev.Clear(); + OpenArena::Keys key; + for(key=(OpenArena::Keys)0; key<(OpenArena::Keys)256; key = (OpenArena::Keys)(key+1)) + { + UnBind(key); + } } - void ControlScheme::Unbind(uint8 key) + void ControlScheme::UnBind(OpenArena::Keys key) { - backward.Remove(key); - firePrimary.Remove(key); - fireSecondary.Remove(key); - forward.Remove(key); - lookDown.Remove(key); - lookUp.Remove(key); - lookRight.Remove(key); - lookLeft.Remove(key); - moveDown.Remove(key); - moveUp.Remove(key); - moveRight.Remove(key); - quickMouseLook.Remove(key); - toggleConsole.Remove(key); - toggleFPS.Remove(key); - toggleLights.Remove(key); - toggleMouseLook.Remove(key); - weaponNext.Remove(key); - weaponPrev.Remove(key); + keyActions[key] = ACTION_NONE; } - bool ControlScheme::Bind(uint32 action, uint8 key) + void ControlScheme::Bind(OpenArena::Keys key, Action action) + { + keyActions[key] = action; + } + + void ControlScheme::WriteToStream(std::ostream& output) + { + //output << " bind " << action << keyname << endl; + OpenArena::Keys key; + for(key=(OpenArena::Keys)0; key<(OpenArena::Keys)256; key = (OpenArena::Keys)(key+1)) + { + if(keyActions[key] != ACTION_NONE) + { + output << " bind " << ActionName(keyActions[key]) << GetKeyName(key) << endl; + } + } + } + + ControlScheme::Action ControlScheme::GetAction(const char* actionName) + { + string str = actionName; + str = tolower(str); + if(str == "none"){ + return ACTION_NONE; + }else if(str == "forward"){ + return ACTION_FORWARD; + }else if(str == "backward"){ + return ACTION_BACKWARD; + }else if(str == "lookleft"){ + return ACTION_LOOKLEFT; + }else if(str == "lookright"){ + return ACTION_LOOKRIGHT; + }else if(str == "lookup"){ + return ACTION_LOOKUP; + }else if(str == "lookdown"){ + return ACTION_LOOKDOWN; + }else if(str == "moveleft"){ + return ACTION_MOVELEFT; + }else if(str == "moveright"){ + return ACTION_MOVERIGHT; + }else if(str == "moveup"){ + return ACTION_MOVEUP; + }else if(str == "movedown"){ + return ACTION_MOVEDOWN; + }else if(str == "rollleft"){ + return ACTION_ROLLLEFT; + }else if(str == "rollright"){ + return ACTION_ROLLRIGHT; + }else if(str == "fireprimary"){ + return ACTION_FIREPRIMARY; + }else if(str == "firesecondary"){ + return ACTION_FIRESECONDARY; + }else if(str == "weaponnext"){ + return ACTION_WEAPONNEXT; + }else if(str == "weaponprev"){ + return ACTION_WEAPONPREV; + }else if(str == "togglelights"){ + return ACTION_TOGGLE_LIGHTS; + }else if(str == "togglefps"){ + return ACTION_TOGGLE_FPS; + }else if(str == "toggleconsole"){ + return ACTION_TOGGLE_CONSOLE; + }else if(str == "togglemouselook"){ + return ACTION_TOGGLE_MOUSELOOK; + }else if(str == "quickmouselook"){ + return ACTION_QUICKMOUSELOOK; + }else{ + return ACTION_NONE; + } + } + + string ControlScheme::ActionName(Action action) { switch(action) { + case ACTION_NONE: + return "none"; case ACTION_FORWARD: - { - Unbind(key); - forward.Insert(key); - return true; - } + return "forward"; case ACTION_BACKWARD: - { - Unbind(key); - backward.Insert(key); - return true; - } + return "backward"; case ACTION_LOOKLEFT: - { - Unbind(key); - lookLeft.Insert(key); - return true; - } + return "lookleft"; case ACTION_LOOKRIGHT: - { - Unbind(key); - lookRight.Insert(key); - return true; - } + return "lookright"; case ACTION_LOOKUP: - { - Unbind(key); - lookUp.Insert(key); - return true; - } + return "lookup"; case ACTION_LOOKDOWN: - { - Unbind(key); - lookDown.Insert(key); - return true; - } + return "lookdown"; case ACTION_MOVELEFT: - { - Unbind(key); - moveLeft.Insert(key); - return true; - } + return "moveleft"; case ACTION_MOVERIGHT: - { - Unbind(key); - moveRight.Insert(key); - return true; - } + return "moveright"; case ACTION_MOVEUP: - { - Unbind(key); - moveUp.Insert(key); - return true; - } + return "moveup"; case ACTION_MOVEDOWN: - { - Unbind(key); - moveDown.Insert(key); - return true; - } + return "movedown"; case ACTION_ROLLLEFT: - { - Unbind(key); - rollLeft.Insert(key); - return true; - } + return "rollleft"; case ACTION_ROLLRIGHT: - { - Unbind(key); - rollRight.Insert(key); - return true; - } + return "rollright"; case ACTION_FIREPRIMARY: - { - Unbind(key); - firePrimary.Insert(key); - return true; - } + return "fireprimary"; case ACTION_FIRESECONDARY: - { - Unbind(key); - fireSecondary.Insert(key); - return true; - } + return "firesecondary"; case ACTION_WEAPONNEXT: - { - Unbind(key); - weaponNext.Insert(key); - return true; - } + return "weaponnext"; case ACTION_WEAPONPREV: - { - Unbind(key); - weaponPrev.Insert(key); - return true; - } + return "weaponprev"; case ACTION_TOGGLE_LIGHTS: - { - Unbind(key); - toggleLights.Insert(key); - return true; - } + return "togglelights"; case ACTION_TOGGLE_FPS: - { - Unbind(key); - toggleFPS.Insert(key); - return true; - } + return "togglefps"; case ACTION_TOGGLE_CONSOLE: - { - Unbind(key); - toggleConsole.Insert(key); - return true; - } + return "toggleconsole"; case ACTION_TOGGLE_MOUSELOOK: - { - Unbind(key); - toggleMouseLook.Insert(key); - return true; - } + return "togglemouselook"; case ACTION_QUICKMOUSELOOK: - { - Unbind(key); - quickMouseLook.Insert(key); - return true; - } + return "quickmouselook"; default: - return false; - } + return "unknown"; + }; } + + bool ControlScheme::IsBound(OpenArena::Keys key, Action action) + { + if(keyActions[key] == action) + { + return true; + } + + return false; + } }; + diff --git a/src/ctrls.h b/src/ctrls.h index 851942b..f333d3f 100644 --- a/src/ctrls.h +++ b/src/ctrls.h @@ -23,105 +23,53 @@ #if defined HAVE_CONFIG_H #include "config.h" #endif - +#include +#include #include "keys.h" #include "datatypes.h" -#include "list.h" namespace OpenArena{ - /*! - * \brief - * This class represents a user's control scheme. - * - * This class manages a set of actions and their associated keys. - * - * \remarks - * This could become a set of keys with associated actions. - * - * \see - */ class ControlScheme { public: - enum Action{ACTION_FORWARD, ACTION_BACKWARD, ACTION_LOOKLEFT, ACTION_LOOKRIGHT, ACTION_LOOKUP, - ACTION_LOOKDOWN, ACTION_MOVELEFT, ACTION_MOVERIGHT, ACTION_MOVEUP, ACTION_MOVEDOWN, - ACTION_ROLLLEFT, ACTION_ROLLRIGHT, ACTION_FIREPRIMARY, ACTION_FIRESECONDARY, - ACTION_WEAPONNEXT, ACTION_WEAPONPREV, ACTION_TOGGLE_LIGHTS, ACTION_TOGGLE_FPS, - ACTION_TOGGLE_CONSOLE, ACTION_TOGGLE_MOUSELOOK, ACTION_QUICKMOUSELOOK}; + enum Action + { + ACTION_NONE = 0, + ACTION_FORWARD, + ACTION_BACKWARD, + ACTION_LOOKLEFT, + ACTION_LOOKRIGHT, + ACTION_LOOKUP, + ACTION_LOOKDOWN, + ACTION_MOVELEFT, + ACTION_MOVERIGHT, + ACTION_MOVEUP, + ACTION_MOVEDOWN, + ACTION_ROLLLEFT, + ACTION_ROLLRIGHT, + ACTION_FIREPRIMARY, + ACTION_FIRESECONDARY, + ACTION_WEAPONNEXT, + ACTION_WEAPONPREV, + ACTION_TOGGLE_LIGHTS, + ACTION_TOGGLE_FPS, + ACTION_TOGGLE_CONSOLE, + ACTION_TOGGLE_MOUSELOOK, + ACTION_QUICKMOUSELOOK, + NUM_ACTIONS + }; - /*! - * \brief - * This method loads a hard coded default control scheme. - * - * \remarks - * - * \see - */ void LoadDefaultControlScheme(); - - /*! - * \brief - * This method clears this control scheme so that no keys are bound to any actions. - * - * \remarks - * - * \see - */ - void ClearControlScheme(); - - /*! - * \brief - * This method removes a key from all actions. - * - * \param - * The KEY_* constant for the key to unbind. - * - * \remarks - * - * \see - */ - void Unbind(uint8); - /*! - * \brief - * This method binds a key to an action. - * - * \param - * The ACTION_* constant for the action to bind to. - * - * \param - * The KEY_* constant for the key to bind. - * - * \returns - * Returns false if an invalid action is specified and true otherwise. - * - * \remarks - * This unbinds the key before binding it to the new action. - * - * \see - */ - bool Bind(uint32, uint8); - - list forward; - list backward; - list lookLeft; - list lookRight; - list lookUp; - list lookDown; - list moveLeft; - list moveRight; - list moveUp; - list moveDown; - list firePrimary; - list fireSecondary; - list weaponNext; - list weaponPrev; - list toggleLights; - list toggleFPS; - list toggleConsole; - list toggleMouseLook; - list quickMouseLook; - list rollLeft; - list rollRight; + void UnBindAll(); + void UnBind(OpenArena::Keys key); + void Bind(OpenArena::Keys key, Action action); + void WriteToStream(std::ostream& output); + static Action GetAction(const char* actionName); + static const char* GetActionName(Action action); + bool IsBound(OpenArena::Keys key, Action action); + private: + std::string ActionName(Action action); + Action keyActions[256]; }; }; diff --git a/src/keys.cpp b/src/keys.cpp index 33dcb01..b30dc66 100644 --- a/src/keys.cpp +++ b/src/keys.cpp @@ -19,6 +19,10 @@ ***************************************************************************/ #include "keys.h" +#include + +using std::string; + char OpenArena::KeyToASCII(Keys key, bool shift) { if(key == KEY_UNKNOWN) @@ -181,3 +185,388 @@ char OpenArena::KeyToASCII(Keys key, bool shift) } return '\0'; } + +const char* OpenArena::GetKeyName(Keys key) +{ + switch(key) + { + case KEY_UNKNOWN: + return "unknown"; + case KEY_BUTTON0: + return "button0"; + case KEY_BUTTON1: + return "button1"; + case KEY_BUTTON2: + return "button2"; + case KEY_BUTTON3: + return "button3"; + case KEY_BUTTON4: + return "button4"; + case KEY_LEFT: + return "left"; + case KEY_RIGHT: + return "right"; + case KEY_UP: + return "up"; + case KEY_DOWN: + return "down"; + case KEY_SPACE: + return "space"; + case KEY_RETURN: + return "return"; + case KEY_SHIFT: + return "shift"; + case KEY_PAUSE: + return "pause"; + case KEY_CONTROL: + return "ctrl"; + case KEY_CAPITAL: + return "caps"; + case KEY_ESCAPE: + return "esc"; + case KEY_PRIOR: + return "pgup"; + case KEY_NEXT: + return "pgdn"; + case KEY_END: + return "end"; + case KEY_HOME: + return "home"; + case KEY_INSERT: + return "insert"; + case KEY_DELETE: + return "del"; + case KEY_LWIN: + return "leftwin"; + case KEY_RWIN: + return "rightwin"; + case KEY_APPS: + return "apps"; + case KEY_NUMPAD0: + return "kp0"; + case KEY_NUMPAD1: + return "kp1"; + case KEY_NUMPAD2: + return "kp2"; + case KEY_NUMPAD3: + return "kp3"; + case KEY_NUMPAD4: + return "kp4"; + case KEY_NUMPAD5: + return "kp5"; + case KEY_NUMPAD6: + return "kp6"; + case KEY_NUMPAD7: + return "kp7"; + case KEY_NUMPAD8: + return "kp8"; + case KEY_NUMPAD9: + return "kp9"; + case KEY_MULTIPLY: + return "multiply"; + case KEY_ADD: + return "plus"; + case KEY_SUBTRACT: + return "minus"; + case KEY_DIVIDE: + return "divide"; + case KEY_F1: + return "f1"; + case KEY_F2: + return "f2"; + case KEY_F3: + return "f3"; + case KEY_F4: + return "f4"; + case KEY_F5: + return "f5"; + case KEY_F6: + return "f6"; + case KEY_F7: + return "f7"; + case KEY_F8: + return "f8"; + case KEY_F9: + return "f9"; + case KEY_F10: + return "f10"; + case KEY_F11: + return "f11"; + case KEY_F12: + return "f12"; + case KEY_NUMLOCK: + return "numlock"; + case KEY_SCROLL: + return "scrolllock"; + case KEY_SEPARATOR: + return "_separator"; + case KEY_OEM_1: + return "semicolon"; + case KEY_OEM_2: + return "slash"; + case KEY_OEM_3: + return "tilde"; + case KEY_OEM_4: + return "leftbracket"; + case KEY_OEM_5: + return "backslash"; + case KEY_OEM_6: + return "rightbracket"; + case KEY_OEM_7: + return "quote"; + case KEY_OEM_PERIOD: + return "period"; + case KEY_OEM_PLUS: + return "equals"; + case KEY_OEM_MINUS: + return "minus"; + case KEY_OEM_COMMA: + return "comma"; + case KEY_BACK: + return "backspace"; + case KEY_TAB: + return "tab"; + case KEY_0: + return "0"; + case KEY_1: + return "1"; + case KEY_2: + return "2"; + case KEY_3: + return "3"; + case KEY_4: + return "4"; + case KEY_5: + return "5"; + case KEY_6: + return "6"; + case KEY_7: + return "7"; + case KEY_8: + return "8"; + case KEY_9: + return "9"; + case KEY_A: + return "a"; + case KEY_B: + return "b"; + case KEY_C: + return "c"; + case KEY_D: + return "d"; + case KEY_E: + return "e"; + case KEY_F: + return "f"; + case KEY_G: + return "g"; + case KEY_H: + return "h"; + case KEY_I: + return "i"; + case KEY_J: + return "j"; + case KEY_K: + return "k"; + case KEY_L: + return "l"; + case KEY_M: + return "m"; + case KEY_N: + return "n"; + case KEY_O: + return "o"; + case KEY_P: + return "p"; + case KEY_Q: + return "q"; + case KEY_R: + return "r"; + case KEY_S: + return "s"; + case KEY_T: + return "t"; + case KEY_U: + return "u"; + case KEY_V: + return "v"; + case KEY_W: + return "w"; + case KEY_X: + return "x"; + case KEY_Y: + return "y"; + case KEY_Z: + return "z"; + case KEY_ALT_L: + return "leftalt"; + case KEY_ALT_R: + return "rightalt"; + case KEY_COMMAND: + return "command"; + case KEY_ENTER: + return "enter"; + case KEY_OPTION: + return "option"; + } + + return "invalid"; +} + +OpenArena::Keys OpenArena::GetKey(const char* keyName) +{ + string str = keyName; + if (str.length() > 1) + { + if (str.substr(0,2) == "up") + return OpenArena::KEY_UP; + else if (str.substr(0,4) == "down") + return OpenArena::KEY_DOWN; + else if (str.substr(0,3) == "esc") + return OpenArena::KEY_ESCAPE; + else if (str.substr(0,6) == "pageup") + return OpenArena::KEY_PRIOR; + else if (str.substr(0,8) == "pagedown") + return OpenArena::KEY_NEXT; + else if (str.substr(0,5) == "right") + return OpenArena::KEY_RIGHT; + else if (str.substr(0,4) == "left") + return OpenArena::KEY_LEFT; + else if (str.substr(0,5) == "space") + return OpenArena::KEY_SPACE; + else if (str.substr(0,6) == "mouse1") + return OpenArena::KEY_LBUTTON; + else if (str.substr(0,6) == "mouse2") + return OpenArena::KEY_RBUTTON; + else if (str.substr(0,6) == "mouse3") + return OpenArena::KEY_MBUTTON; + else if (str.substr(0,4) == "home") + return OpenArena::KEY_HOME; + else if (str.substr(0,3) == "end") + return OpenArena::KEY_END; + else if (str.substr(0,3) == "tab") + return OpenArena::KEY_TAB; + else if (str.substr(0,5) == "enter") + return OpenArena::KEY_RETURN; + else if (str.substr(0,6) == "insert") + return OpenArena::KEY_INSERT; + else if (str.substr(0,6) == "delete") + return OpenArena::KEY_DELETE; + else if (str.substr(0,7) == "control") + return OpenArena::KEY_CONTROL; + else if (str.substr(0,5) == "shift") + return OpenArena::KEY_SHIFT; + else if (str.substr(0,7) == "numpad0") + return OpenArena::KEY_NUMPAD0; + else if (str.substr(0,7) == "numpad1") + return OpenArena::KEY_NUMPAD1; + else if (str.substr(0,7) == "numpad2") + return OpenArena::KEY_NUMPAD2; + else if (str.substr(0,7) == "numpad3") + return OpenArena::KEY_NUMPAD3; + else if (str.substr(0,7) == "numpad4") + return OpenArena::KEY_NUMPAD4; + else if (str.substr(0,7) == "numpad5") + return OpenArena::KEY_NUMPAD5; + else if (str.substr(0,7) == "numpad6") + return OpenArena::KEY_NUMPAD6; + else if (str.substr(0,7) == "numpad7") + return OpenArena::KEY_NUMPAD7; + else if (str.substr(0,7) == "numpad8") + return OpenArena::KEY_NUMPAD8; + else if (str.substr(0,7) == "numpad9") + return OpenArena::KEY_NUMPAD9; + else if (str.substr(0,9) == "separator") + return OpenArena::KEY_SEPARATOR; + else if (str.substr(0,4) == "lwin") + return OpenArena::KEY_LWIN; + else if (str.substr(0,4) == "rwin") + return OpenArena::KEY_RWIN; + else if (str.substr(0,4) == "apps") + return OpenArena::KEY_APPS; + else if (str.substr(0,7) == "numpad*") + return OpenArena::KEY_MULTIPLY; + else if (str.substr(0,7) == "numpad+") + return OpenArena::KEY_ADD; + else if (str.substr(0,7) == "numpad/") + return OpenArena::KEY_DIVIDE; + else if (str.substr(0,7) == "numpad-") + return OpenArena::KEY_SUBTRACT; + else if (str.substr(0,6) == "scroll") + return OpenArena::KEY_SCROLL; + else if (str.substr(0,7) == "numlock") + return OpenArena::KEY_NUMLOCK; + else if (str.substr(0,5) == "pause") + return OpenArena::KEY_PAUSE; + else if (str.substr(0,8) == "capslock") + return OpenArena::KEY_CAPITAL; + + + + /*uncomment this to enable f1 as a mappable key + else if(str.substr(0,2) == "f1") + return OpenArena::KEY_F1; + */ + + else if (str.substr(0,2) == "f2") + return OpenArena::KEY_F2; + else if (str.substr(0,2) == "f3") + return OpenArena::KEY_F3; + else if (str.substr(0,2) == "f4") + return OpenArena::KEY_F4; + else if (str.substr(0,2) == "f5") + return OpenArena::KEY_F5; + else if (str.substr(0,2) == "f6") + return OpenArena::KEY_F6; + else if (str.substr(0,2) == "f7") + return OpenArena::KEY_F7; + else if (str.substr(0,2) == "f8") + return OpenArena::KEY_F8; + else if (str.substr(0,2) == "f9") + return OpenArena::KEY_F9; + else if (str.substr(0,2) == "f10") + return OpenArena::KEY_F10; + else if (str.substr(0,2) == "f11") + return OpenArena::KEY_F11; + else if (str.substr(0,2) == "f12") + return OpenArena::KEY_F12; + //Add Game specific keys here and e-mail headhunter45@hotmail.com subject OpenArena keys so I can add them please + else if (str.substr(0,4) == "null") + return OpenArena::KEY_UNKNOWN; + else + return OpenArena::KEY_UNKNOWN; + } + else + { + if(str[0] == '~' || str[0] == '`') + return OpenArena::KEY_OEM_3; + else if (str[0] == '?' || str[0] == '/') + return OpenArena::KEY_OEM_2; + else if (str[0] == '.' || str[0] == '>') + return OpenArena::KEY_OEM_PERIOD; + else if (str[0] == '+' || str[0] == '=') + return OpenArena::KEY_OEM_PLUS; + else if (str[0] == ';' || str[0] == ':') + return OpenArena::KEY_OEM_1; + else if (str[0] == ',' || str[0] == '<') + return OpenArena::KEY_OEM_COMMA; + else if (str[0] == '-' || str[0] == '_') + return OpenArena::KEY_OEM_MINUS; + else if (str[0] == '[' || str[0] == '{') + return OpenArena::KEY_OEM_4; + else if (str[0] == ']' || str[0] == '}') + return OpenArena::KEY_OEM_6; + else if (str[0] == '\\' || str[0] == '|') + return OpenArena::KEY_OEM_5; + else if (str[0] == '\'' || str[0] == '"') + return OpenArena::KEY_OEM_7; + else if (isalpha(str[0])) + return (OpenArena::Keys)(toupper(str[0]) - 'A' + OpenArena::KEY_A); + else if(isdigit(str[0])) + return (OpenArena::Keys)(str[0] - '0' + OpenArena::KEY_0); + else + return OpenArena::KEY_UNKNOWN; + } +} + + diff --git a/src/keys.h b/src/keys.h index ef63565..c66eaad 100644 --- a/src/keys.h +++ b/src/keys.h @@ -142,7 +142,12 @@ namespace OpenArena KEY_W, KEY_X, KEY_Y, - KEY_Z + KEY_Z, + KEY_ALT_L, + KEY_ALT_R, + KEY_ENTER, + KEY_COMMAND, + KEY_OPTION }; /*! * \brief @@ -208,5 +213,8 @@ namespace OpenArena * Separate items with the '|' character. */ char KeyToASCII(Keys key, bool shift); + const char* GetKeyName(Keys key); + OpenArena::Keys GetKey(const char* keyName); + }; #endif diff --git a/src/level.cpp b/src/level.cpp index 65ac12c..b4679d6 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -54,8 +54,9 @@ using namespace std; namespace OpenArena { - Level::Level() + Level::Level(EventManager* eventManager) { + _eventManager = eventManager; _window = NULL; textureNames = NULL; numTextures = 0; @@ -570,157 +571,18 @@ namespace OpenArena else if(command == "bind") { command = tolower(word(cmd, ++i)); - - if(command == "forward") + string key = tolower(word(cmd, ++i)); + if(ControlScheme::GetAction(command.c_str())==OpenArena::ControlScheme::ACTION_NONE) { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FORWARD, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action forward"); - } + ConsolePrint("No action identified by " + command); } - else if(command == "backward") + else if (GetKey(key.c_str()) == OpenArena::KEY_UNKNOWN) { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_BACKWARD, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action backward"); - } - } - else if(command == "lookleft") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKLEFT, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action lookleft"); - } - } - else if(command == "lookright") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKRIGHT, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action lookright"); - } - } - else if(command == "lookup") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKUP, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action lookup"); - } - } - else if(command == "lookdown") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKDOWN, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action lookdown"); - } - } - else if(command == "moveup") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEUP, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action moveup"); - } - } - else if(command == "movedown") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEDOWN, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action movedown"); - } - } - else if(command == "moveleft") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVELEFT, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action moveleft"); - } - } - else if(command == "moveright") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVERIGHT, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action moveright"); - } - } - else if(command == "fireprimary") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIREPRIMARY, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action fireprimary"); - } - } - else if(command == "firesecondary") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIRESECONDARY, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action firesecondary"); - } - } - else if(command == "weapnext") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONNEXT, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action weapnext"); - } - } - else if(command == "weapprev") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONPREV, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action weapprev"); - } - } - else if(command == "togglelights" || command == "togglelighting") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_LIGHTS, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action togglelights"); - } - } - else if(command == "togglefps") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_FPS, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action togglefps"); - } - } - else if(command == "toggleconsole") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_CONSOLE, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action toggleconsole"); - } - } - else if(command == "togglemouselook") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_MOUSELOOK, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action togglemouselook"); - } - } - else if(command == "quickmouselook") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_QUICKMOUSELOOK, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action quickmouselook"); - } - } - else if(command == "rollleft") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_ROLLLEFT, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action rollleft"); - } - } - else if(command == "rollright") - { - if(!defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_ROLLRIGHT, KeyName(word(cmd, ++i)))) - { - ConsolePrint("Couldn't bind " + word(cmd, i) + " to action rollright"); - } + ConsolePrint("No key identified by " + key); } else { - ConsolePrint("No action identified by " + command); + defaultPlayer[0].controls.Bind(GetKey(key.c_str()), ControlScheme::GetAction(command.c_str())); } } else if(command == "map" || command == "map_load") @@ -740,11 +602,11 @@ namespace OpenArena if(command == "all") { - defaultPlayer[0].controls.ClearControlScheme(); + defaultPlayer[0].controls.UnBindAll(); } else { - defaultPlayer[0].controls.Unbind(KeyName(command)); + defaultPlayer[0].controls.UnBind(GetKey(command.c_str())); } } else if(command == "exec" || command == "config_load") @@ -814,11 +676,10 @@ namespace OpenArena string cmd = lpCmdLine; string command; - uint32 i=0xFFFFFFFF; - while(word(cmd, ++i) != "") + uint32 i=0; + command = word(cmd, i); + while(command != "") { - command = word(cmd, i); - if(command == "+set") { command = tolower(word(cmd, ++i)); @@ -842,6 +703,9 @@ namespace OpenArena else if(command == "game") { gamedir= word(cmd, ++i); + if(gamedir[gamedir.length()-1] != '/'){ + gamedir = gamedir + '/'; + } } } else if(command == "+bind") @@ -850,79 +714,79 @@ namespace OpenArena if(command == "forward") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FORWARD, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_FORWARD); } else if(command == "backward") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_BACKWARD, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_BACKWARD); } else if(command == "lookleft") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKLEFT, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_LOOKLEFT); } else if(command == "lookright") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKRIGHT, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_LOOKRIGHT); } else if(command == "lookup") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKUP, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_LOOKUP); } else if(command == "lookdown") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_LOOKDOWN, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_LOOKDOWN); } else if(command == "moveup") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEUP, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_MOVEUP); } else if(command == "movedown") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVEDOWN, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_MOVEDOWN); } else if(command == "moveleft") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVELEFT, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_MOVELEFT); } else if(command == "moveright") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_MOVERIGHT, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_MOVERIGHT); } else if(command == "fireprimary") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIREPRIMARY, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_FIREPRIMARY); } else if(command == "firesecondary") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_FIRESECONDARY, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_FIRESECONDARY); } else if(command == "weapnext") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONNEXT, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_WEAPONNEXT); } else if(command == "weapprev") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_WEAPONPREV, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_WEAPONPREV); } else if(command == "togglelights" || command == "togglelighting") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_LIGHTS, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_TOGGLE_LIGHTS); } else if(command == "togglefps") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_FPS, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_TOGGLE_FPS); } else if(command == "toggleconsole") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_CONSOLE, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_TOGGLE_CONSOLE); } else if(command == "togglemouselook") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_TOGGLE_MOUSELOOK, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_TOGGLE_MOUSELOOK); } else if(command == "quickmouselook") { - defaultPlayer[0].controls.Bind(OpenArena::ControlScheme::ACTION_QUICKMOUSELOOK, KeyName(word(cmd, ++i))); + defaultPlayer[0].controls.Bind(GetKey(word(cmd, ++i).c_str()), OpenArena::ControlScheme::ACTION_QUICKMOUSELOOK); } } else if(command == "+map" || command == "+map_load") @@ -937,11 +801,11 @@ namespace OpenArena if(command == "all") { - defaultPlayer[0].controls.ClearControlScheme(); + defaultPlayer[0].controls.UnBindAll(); } else { - defaultPlayer[0].controls.Unbind(KeyName(command)); + defaultPlayer[0].controls.UnBind(GetKey(command.c_str())); } } else if(command == "+exec" || command == "+config_load") @@ -959,7 +823,8 @@ namespace OpenArena command = tolower(word(cmd, ++i)); SaveConfig(command); } - + + command = word(cmd, ++i); } } @@ -1034,173 +899,7 @@ namespace OpenArena output << "set maxfps " << maxFPS << endl; //Control Scheme - //output << " bind " << action << keyname << endl; - if(!defaultPlayer->controls.backward.IsEmpty()) - { - defaultPlayer->controls.backward.FirstPosition(); - output << "bind backward " << string(KeyString(defaultPlayer->controls.backward.Retrieve())) << endl; - while(defaultPlayer->controls.backward.NextPosition()) - output << "bind backward " << KeyString(defaultPlayer->controls.backward.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.firePrimary.IsEmpty()) - { - defaultPlayer->controls.firePrimary.FirstPosition(); - output << "bind firePrimary " << KeyString(defaultPlayer->controls.firePrimary.Retrieve()) << endl; - while(defaultPlayer->controls.firePrimary.NextPosition()) - output << "bind firePrimary " << KeyString(defaultPlayer->controls.firePrimary.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.fireSecondary.IsEmpty()) - { - defaultPlayer->controls.fireSecondary.FirstPosition(); - output << "bind fireSecondary " << KeyString(defaultPlayer->controls.fireSecondary.Retrieve()) << endl; - while(defaultPlayer->controls.fireSecondary.NextPosition()) - output << "bind fireSecondary " << KeyString(defaultPlayer->controls.fireSecondary.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.forward.IsEmpty()) - { - defaultPlayer->controls.forward.FirstPosition(); - output << "bind forward " << KeyString(defaultPlayer->controls.forward.Retrieve()) << endl; - while(defaultPlayer->controls.forward.NextPosition()) - output << "bind forward " << KeyString(defaultPlayer->controls.forward.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.lookDown.IsEmpty()) - { - defaultPlayer->controls.lookDown.FirstPosition(); - output << "bind lookDown " << KeyString(defaultPlayer->controls.lookDown.Retrieve()) << endl; - while(defaultPlayer->controls.lookDown.NextPosition()) - output << "bind lookDown " << KeyString(defaultPlayer->controls.lookDown.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.lookLeft.IsEmpty()) - { - defaultPlayer->controls.lookLeft.FirstPosition(); - output << "bind lookLeft " << KeyString(defaultPlayer->controls.lookLeft.Retrieve()) << endl; - while(defaultPlayer->controls.lookLeft.NextPosition()) - output << "bind lookLeft " << KeyString(defaultPlayer->controls.lookLeft.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.lookRight.IsEmpty()) - { - defaultPlayer->controls.lookRight.FirstPosition(); - output << "bind lookRight " << KeyString(defaultPlayer->controls.lookRight.Retrieve()) << endl; - while(defaultPlayer->controls.lookRight.NextPosition()) - output << "bind lookRight " << KeyString(defaultPlayer->controls.lookRight.Retrieve()) << endl; - } - if(!defaultPlayer->controls.lookUp.IsEmpty()) - { - defaultPlayer->controls.lookUp.FirstPosition(); - output << "bind lookUp " << KeyString(defaultPlayer->controls.lookUp.Retrieve()) << endl; - while(defaultPlayer->controls.lookUp.NextPosition()) - output << "bind lookUp " << KeyString(defaultPlayer->controls.lookUp.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.moveDown.IsEmpty()) - { - defaultPlayer->controls.moveDown.FirstPosition(); - output << "bind moveDown " << KeyString(defaultPlayer->controls.moveDown.Retrieve()) << endl; - while(defaultPlayer->controls.moveDown.NextPosition()) - output << "bind moveDown " << KeyString(defaultPlayer->controls.moveDown.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.moveLeft.IsEmpty()) - { - defaultPlayer->controls.moveLeft.FirstPosition(); - output << "bind moveLeft " << KeyString(defaultPlayer->controls.moveLeft.Retrieve()) << endl; - while(defaultPlayer->controls.moveLeft.NextPosition()) - output << "bind moveLeft " << KeyString(defaultPlayer->controls.moveLeft.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.moveRight.IsEmpty()) - { - defaultPlayer->controls.moveRight.FirstPosition(); - output << "bind moveRight " << KeyString(defaultPlayer->controls.moveRight.Retrieve()) << endl; - while(defaultPlayer->controls.moveRight.NextPosition()) - output << "bind moveRight " << KeyString(defaultPlayer->controls.moveRight.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.moveUp.IsEmpty()) - { - defaultPlayer->controls.moveUp.FirstPosition(); - output << "bind moveUp " << KeyString(defaultPlayer->controls.moveUp.Retrieve()) << endl; - while(defaultPlayer->controls.moveUp.NextPosition()) - output << "bind moveUp " << KeyString(defaultPlayer->controls.moveUp.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.quickMouseLook.IsEmpty()) - { - defaultPlayer->controls.quickMouseLook.FirstPosition(); - output << "bind quickMouseLook " << KeyString(defaultPlayer->controls.quickMouseLook.Retrieve()) << endl; - while(defaultPlayer->controls.quickMouseLook.NextPosition()) - output << "bind quickMouseLook " << KeyString(defaultPlayer->controls.quickMouseLook.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.rollLeft.IsEmpty()) - { - defaultPlayer->controls.rollLeft.FirstPosition(); - output << "bind rollLeft " << KeyString(defaultPlayer->controls.rollLeft.Retrieve()) << endl; - while(defaultPlayer->controls.rollLeft.NextPosition()) - output << "bind rollLeft " << KeyString(defaultPlayer->controls.rollLeft.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.rollRight.IsEmpty()) - { - defaultPlayer->controls.rollRight.FirstPosition(); - output << "bind rollRight " << KeyString(defaultPlayer->controls.rollRight.Retrieve()) << endl; - while(defaultPlayer->controls.rollRight.NextPosition()) - output << "bind rollRight " << KeyString(defaultPlayer->controls.rollRight.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.toggleConsole.IsEmpty()) - { - defaultPlayer->controls.toggleConsole.FirstPosition(); - output << "bind toggleConsole " << KeyString(defaultPlayer->controls.toggleConsole.Retrieve()) << endl; - while(defaultPlayer->controls.toggleConsole.NextPosition()) - output << "bind toggleConsole " << KeyString(defaultPlayer->controls.toggleConsole.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.toggleFPS.IsEmpty()) - { - defaultPlayer->controls.toggleFPS.FirstPosition(); - output << "bind toggleFPS " << KeyString(defaultPlayer->controls.toggleFPS.Retrieve()) << endl; - while(defaultPlayer->controls.toggleFPS.NextPosition()) - output << "bind toggleFPS " << KeyString(defaultPlayer->controls.toggleFPS.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.toggleLights.IsEmpty()) - { - defaultPlayer->controls.toggleLights.FirstPosition(); - output << "bind toggleLights " << KeyString(defaultPlayer->controls.toggleLights.Retrieve()) << endl; - while(defaultPlayer->controls.toggleLights.NextPosition()) - output << "bind toggleLights " << KeyString(defaultPlayer->controls.toggleLights.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.toggleMouseLook.IsEmpty()) - { - defaultPlayer->controls.toggleMouseLook.FirstPosition(); - output << "bind toggleMouseLook " << KeyString(defaultPlayer->controls.toggleMouseLook.Retrieve()) << endl; - while(defaultPlayer->controls.toggleMouseLook.NextPosition()) - output << "bind toggleMouseLook " << KeyString(defaultPlayer->controls.toggleMouseLook.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.weaponNext.IsEmpty()) - { - defaultPlayer->controls.weaponNext.FirstPosition(); - output << "bind weaponNext " << KeyString(defaultPlayer->controls.weaponNext.Retrieve()) << endl; - while(defaultPlayer->controls.weaponNext.NextPosition()) - output << "bind weaponNext " << KeyString(defaultPlayer->controls.weaponNext.Retrieve()) << endl; - } - - if(!defaultPlayer->controls.weaponPrev.IsEmpty()) - { - defaultPlayer->controls.weaponPrev.FirstPosition(); - output << "bind weaponPrev " << KeyString(defaultPlayer->controls.weaponPrev.Retrieve()) << endl; - while(defaultPlayer->controls.weaponPrev.NextPosition()) - output << "bind weaponPrev " << KeyString(defaultPlayer->controls.weaponPrev.Retrieve()) << endl; - } + defaultPlayer->controls.WriteToStream(output); } void Level::Print(int x, int y, const char* str, unsigned int set) @@ -1225,7 +924,7 @@ namespace OpenArena { consoleHistory[0] = Left(consoleHistory[0], consoleHistory[0].length()-1); } - else if(!(defaultPlayer->controls.toggleConsole.Contains(newChar))) + else if(!(defaultPlayer->controls.IsBound(GetKey(&newChar), ControlScheme::ACTION_TOGGLE_CONSOLE))) { consoleHistory[0] = consoleHistory[0] + newChar; /* diff --git a/src/level.h b/src/level.h index 9a5015f..b2ba69e 100644 --- a/src/level.h +++ b/src/level.h @@ -58,393 +58,42 @@ #include "player.h" #include "strmanip.h" #include "keys.h" +#include "EventManager.h" using namespace std; using OpenArena::Triangle; namespace OpenArena { - /*! - * \brief - * Write brief comment for piover180 here. - * - * Write detailed description for piover180 here. - * - * \remarks - * Write remarks for piover180 here. - * - * \see - * Separate items with the '|' character. - */ const float piover180 = 0.0174532925f; - /*! - * \brief - * Write brief comment for DEFAULT_TEXTURE_NAME here. - * - * Write detailed description for DEFAULT_TEXTURE_NAME here. - * - * \remarks - * Write remarks for DEFAULT_TEXTURE_NAME here. - * - * \see - * Separate items with the '|' character. - */ const string DEFAULT_TEXTURE_NAME = "oa/textures/default.bmp"; - /*! - * \brief - * Write brief comment for MAX_CONSOLE_LINES here. - * - * Write detailed description for MAX_CONSOLE_LINES here. - * - * \remarks - * Write remarks for MAX_CONSOLE_LINES here. - * - * \see - * Separate items with the '|' character. - */ const unsigned int MAX_CONSOLE_LINES = 30; //The max number of lines to be displayed in the console - /*! - * \brief - * Write brief comment for MAX_CONSOLE_HISTORY_LINES here. - * - * Write detailed description for MAX_CONSOLE_HISTORY_LINES here. - * - * \remarks - * Write remarks for MAX_CONSOLE_HISTORY_LINES here. - * - * \see - * Separate items with the '|' character. - */ const unsigned int MAX_CONSOLE_HISTORY_LINES = MAX_CONSOLE_LINES + 20; //The max number of console lines to store in the history - /*! - * \brief - * Write brief comment for MAX_CONSOLE_OUTPUT_LINES here. - * - * Write detailed description for MAX_CONSOLE_OUTPUT_LINES here. - * - * \remarks - * Write remarks for MAX_CONSOLE_OUTPUT_LINES here. - * - * \see - * Separate items with the '|' character. - */ const unsigned int MAX_CONSOLE_OUTPUT_LINES = MAX_CONSOLE_LINES; - /*! - * \brief - * Write brief comment for MAX_OUTPUT_TEXT_LINES here. - * - * Write detailed description for MAX_OUTPUT_TEXT_LINES here. - * - * \remarks - * Write remarks for MAX_OUTPUT_TEXT_LINES here. - * - * \see - * Separate items with the '|' character. - */ const unsigned int MAX_OUTPUT_TEXT_LINES = 4; //The max number of output lines to be displayed on the screen - /*! - * \brief - * Write brief comment for GL_MY_TEXTURE_CONSOLEBACKGROUND here. - */ enum {GL_MY_TEXTURE_CONSOLEBACKGROUND=0, NUM_MENU_TEXTURES}; class Level { public: - /*! - * \brief - * Write brief comment for Level here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Level here. - * - * \remarks - * Write remarks for Level here. - * - * \see - * Separate items with the '|' character. - */ - Level(); - /*! - * \brief - * Write brief comment for ~Level here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for ~Level here. - * - * \remarks - * Write remarks for ~Level here. - * - * \see - * Separate items with the '|' character. - */ + Level(EventManager* eventManager); ~Level(); - /*! - * \brief - * Write brief comment for LoadMap here. - * - * \param mapname - * Description of parameter mapname. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for LoadMap here. - * - * \remarks - * Write remarks for LoadMap here. - * - * \see - * Separate items with the '|' character. - */ bool LoadMap(string mapname); - /*! - * \brief - * Write brief comment for LoadMap here. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for LoadMap here. - * - * \remarks - * Write remarks for LoadMap here. - * - * \see - * Separate items with the '|' character. - */ bool LoadMap(); - /*! - * \brief - * Write brief comment for SaveMap here. - * - * \param mapname - * Description of parameter mapname. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for SaveMap here. - * - * \remarks - * Write remarks for SaveMap here. - * - * \see - * Separate items with the '|' character. - */ void SaveMap(string mapname); - /*! - * \brief - * Write brief comment for LoadConfig here. - * - * \param cfgname - * Description of parameter cfgname. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for LoadConfig here. - * - * \remarks - * Write remarks for LoadConfig here. - * - * \see - * Separate items with the '|' character. - */ bool LoadConfig(string cfgname); - /*! - * \brief - * Write brief comment for LoadConfig here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for LoadConfig here. - * - * \remarks - * Write remarks for LoadConfig here. - * - * \see - * Separate items with the '|' character. - */ void LoadConfig(); void SaveConfig(string cfgname); - /*! - * \brief - * Write brief comment for Execute here. - * - * \param cmd - * Description of parameter cmd. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Execute here. - * - * \remarks - * Write remarks for Execute here. - * - * \see - * Separate items with the '|' character. - */ void Execute(string cmd); - /*! - * \brief - * Write brief comment for LoadGLTextures here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for LoadGLTextures here. - * - * \remarks - * Write remarks for LoadGLTextures here. - * - * \see - * Separate items with the '|' character. - */ void LoadGLTextures(); - /*! - * \brief - * Write brief comment for Render here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Render here. - * - * \remarks - * Write remarks for Render here. - * - * \see - * Separate items with the '|' character. - */ void Render(); - /*! - * \brief - * Write brief comment for UnloadMap here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for UnloadMap here. - * - * \remarks - * Write remarks for UnloadMap here. - * - * \see - * Separate items with the '|' character. - */ void UnloadMap(); - /*! - * \brief - * Write brief comment for UpdateConsole here. - * - * \param - * Description of parameter . - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for UpdateConsole here. - * - * \remarks - * Write remarks for UpdateConsole here. - * - * \see - * Separate items with the '|' character. - */ void UpdateConsole(char); - /*! - * \brief - * Write brief comment for FPS here. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for FPS here. - * - * \remarks - * Write remarks for FPS here. - * - * \see - * Separate items with the '|' character. - */ uint32 FPS(); - /*! - * \brief - * Write brief comment for ParseCmds here. - * - * \param - * Description of parameter . - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for ParseCmds here. - * - * \remarks - * Write remarks for ParseCmds here. - * - * \see - * Separate items with the '|' character. - */ void ParseCmds(const char*); void Print(int x, int y, const char* string, unsigned int set); - /*! - * \brief - * Write brief comment for SetWindow here. - * - * \param - * Description of parameter . - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for SetWindow here. - * - * \remarks - * Write remarks for SetWindow here. - * - * \see - * Separate items with the '|' character. - */ void SetWindow(Window*); - /*! - * \brief - * Write brief comment for GetWindow here. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for GetWindow here. - * - * \remarks - * Write remarks for GetWindow here. - * - * \see - * Separate items with the '|' character. - */ Window* GetWindow(); /*Not Yet Implemented @@ -482,28 +131,10 @@ namespace OpenArena Texture menuTextures[NUM_MENU_TEXTURES]; Window* _window; - // private: - /*! - * \brief - * Write brief comment for ConsolePrint here. - * - * \param - * Description of parameter . - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for ConsolePrint here. - * - * \remarks - * Write remarks for ConsolePrint here. - * - * \see - * Separate items with the '|' character. - */ void ConsolePrint(string); private: + EventManager* _eventManager; string consoleHistory[MAX_CONSOLE_HISTORY_LINES]; string consoleOutput[MAX_CONSOLE_OUTPUT_LINES]; string outputText[MAX_OUTPUT_TEXT_LINES]; diff --git a/src/macosx.cpp b/src/macosx.cpp index f57b55f..5a895a8 100644 --- a/src/macosx.cpp +++ b/src/macosx.cpp @@ -51,11 +51,45 @@ #include "version.h" #include "EventManager.h" #include "Events/DrawEvent.h" +#include "Events/KeyPressEvent.h" +#include "Events/KeyReleaseEvent.h" #include "x11.h" //include necessary header files using namespace std; -unsigned char TranslateKey(int keyCode); -unsigned char TranslateButton(int keyCode); + +bool g_done = false; +class KeyPressEventHandler: public OpenArena::Events::KeyPressEvent::KeyPressEventHandler +{ +private: +public: + KeyPressEventHandler() + { + } + + virtual void HandleEvent(OpenArena::Events::Event* event) + { + OpenArena::Events::KeyPressEvent* ev = (OpenArena::Events::KeyPressEvent*) event; + switch (ev->GetKey()) + { + case OpenArena::KEY_ESCAPE: + g_done = true; + break; + + default: + break; + }; + } +}; + +int DrawGLScene(OpenArena::Level* level) +{ + //The context is somehow different if this call is inside the RT function + level->Render(); + + g_Screen->SwapBuffers(); + + return true; +} #if defined USE_GLX //void InitControls(); @@ -64,17 +98,7 @@ void HandleConsoleKeyPress(OpenArena::Keys key); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function Definitions -int DrawGLScene() -{ - //The context is somehow different if this call is inside the RT function - level.Render(); - - RT(); - - return true; -} - -void ProcessCommandLineArgs(int argc, char** argv) +void ProcessCommandLineArgs(int argc, char** argv, OpenArena::Level* level) { string commandLine = ""; int i; @@ -82,55 +106,62 @@ void ProcessCommandLineArgs(int argc, char** argv) { commandLine = commandLine + " " + argv[i]; } - level.ParseCmds(commandLine.c_str()); + level->ParseCmds(commandLine.c_str()); } int main(int argc, char** argv) { + g_Screen = new OpenArena::Window(); OpenArena::EventManager* em = new OpenArena::EventManager(); - em->RegisterEventHandler(new OpenArena::DrawEvent::DrawEventHandler()); + OpenArena::Level* level = new OpenArena::Level(em); + OpenArena::Events::DrawEvent::DrawEventHandler* _drawEventHandler = new OpenArena::Events::DrawEvent::DrawEventHandler(level); + KeyPressEventHandler* _keyPressEventHandler = new KeyPressEventHandler(); + OpenArena::Events::KeyReleaseEvent::KeyReleaseEventHandler* _keyReleaseEventHandler = new OpenArena::Events::KeyReleaseEvent::KeyReleaseEventHandler(); + em->RegisterEventHandler(_drawEventHandler); + em->RegisterEventHandler(_keyPressEventHandler); + em->RegisterEventHandler(_keyReleaseEventHandler); + XEvent event; - bool done = false; + OpenArena::Events::Event* ev; + + ProcessCommandLineArgs(argc, argv, level); - ProcessCommandLineArgs(argc, argv); + if (!level->LoadConfig("my.cfg")) + level->LoadConfig(); - InitControls(); + level->glFont.SetScreenDimensions(level->screen.GetWidth()*2, level->screen.GetHeight()*2); - level.glFont.SetScreenDimensions(level.screen.GetWidth()*2, level.screen.GetHeight()*2); - - if(level.nextLevel == "") + if(level->nextLevel == "") { - level.LoadMap("intro.map"); + level->LoadMap("intro.map"); } else { - level.LoadMap(); + level->LoadMap(); } - + //Hack for now X11 no like 32 bit depth - if(level.screen.GetColorDepth() == 32) + if(level->screen.GetColorDepth() == 32) { - level.screen.SetColorDepth(24); + level->screen.SetColorDepth(24); } -// g_Screen.SetInitializer(new OpenArena::Window::Initializer()); -// g_Screen.SetResizer(new OpenArena::Window::Resizer()); - - if(!g_Screen.Open(OPENARENA_VERSION, level.screen.GetWidth(), level.screen.GetHeight(), level.screen.GetColorDepth(), level.screen.GetFullscreen())) + if(!g_Screen->Open(OPENARENA_VERSION, level->screen.GetWidth(), level->screen.GetHeight(), level->screen.GetColorDepth(), level->screen.GetFullscreen())) { return 1; } + + level->SetWindow(g_Screen); - level.SetWindow(&g_Screen); - - level.LoadGLTextures(); + level->LoadGLTextures(); - while(!done) + while(!g_done) { - while(XPending(g_Screen.GetDisplay()) > 0) + while(XPending(g_Screen->GetDisplay()) > 0) { + OpenArena::Events::Event* ev = 0x0; //Equivalent of WNDPROC - XNextEvent(g_Screen.GetDisplay(), &event); + XNextEvent(g_Screen->GetDisplay(), &event); switch(event.type) { case Expose: @@ -139,28 +170,28 @@ int main(int argc, char** argv) break; } - //DrawGLScene(); - em->SendEvent(new OpenArena::DrawEvent()); + em->SendEvent(new OpenArena::Events::DrawEvent()); break; case ConfigureNotify: - if((event.xconfigure.width != g_Screen.GetWidth()) || (event.xconfigure.height != g_Screen.GetHeight())) + if((event.xconfigure.width != g_Screen->GetWidth()) || (event.xconfigure.height != g_Screen->GetHeight())) { - g_Screen.SetWidth(event.xconfigure.width); - g_Screen.SetHeight(event.xconfigure.height); + g_Screen->SetWidth(event.xconfigure.width); + g_Screen->SetHeight(event.xconfigure.height); ResizeGLScene(event.xconfigure.width, event.xconfigure.height); //em->SendEvent(new ResizeWindowEvent(event.xconfigure.width, event.xconfigure.width); } break; case ButtonPress: - keys[TranslateButton(event.xbutton.button)] = true; + em->SendEvent(new OpenArena::Events::KeyPressEvent(TranslateButton(event.xbutton.button))); break; case ButtonRelease: - keys[TranslateButton(event.xbutton.button)] = false; - keys2[TranslateButton(event.xbutton.button)] = false; + em->SendEvent(new OpenArena::Events::KeyReleaseEvent(TranslateButton(event.xbutton.button))); break; case KeyPress: - if(level.showConsole) + em->SendEvent(new OpenArena::Events::KeyPressEvent((OpenArena::Keys)TranslateKey(XLookupKeysym(&event.xkey, 0)))); + /* + if(level->showConsole) { HandleConsoleKeyPress((OpenArena::Keys)TranslateKey(XLookupKeysym(&event.xkey, 0))); } @@ -168,16 +199,18 @@ int main(int argc, char** argv) { keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = true; } + */ break; case KeyRelease: - keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; - keys2[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; + em->SendEvent(new OpenArena::Events::KeyReleaseEvent((OpenArena::Keys)TranslateKey(XLookupKeysym(&event.xkey, 0)))); +// keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; +// keys2[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; break; case ClientMessage: - if(*XGetAtomName(g_Screen.GetDisplay(), event.xclient.message_type) == *"WM_PROTOCOLS") + if(*XGetAtomName(g_Screen->GetDisplay(), event.xclient.message_type) == *"WM_PROTOCOLS") { printf("Exiting sanely...\n"); - done = true; + g_done = true; } break; default: @@ -185,793 +218,89 @@ int main(int argc, char** argv) } } //End Equivalent of WNDPROC + /* if(active) { if(keys[OpenArena::KEY_ESCAPE]) { - done = true; + g_done = true; } else if(keys[OpenArena::KEY_F1]) { - g_Screen.Close(); - g_Screen.ToggleFullscreen(); - g_Screen.Open(); + g_Screen->Close(); + g_Screen->ToggleFullscreen(); + g_Screen->Open(); } else { - level.defaultPlayer[0].camera.Update(); - if(!level.showConsole) - { - if(level.mlook) - { - using OpenArena::Vec2i; - Vec2i middleOfScreen = Vec2i(g_Screen.GetWidth()/2, g_Screen.GetHeight()/2); - Vec2i mousePosition = g_Screen.GetMousePosition(); - if(mousePosition != middleOfScreen) - { - //Vec2i mouseDelta = mousePosition - middleOfScreen; - Vec2i mouseDelta = middleOfScreen - mousePosition; - g_Screen.SetMousePosition(middleOfScreen); - const float MOUSE_SENSITIVITY_HORIZONTAL = 0.005; - const float MOUSE_SENSITIVITY_VERTICAL = 0.005; - float horizontalAngle = mouseDelta.x * MOUSE_SENSITIVITY_HORIZONTAL; - float verticalAngle = mouseDelta.y * MOUSE_SENSITIVITY_VERTICAL; - level.defaultPlayer[0].camera.RotateHorizontal(horizontalAngle); - level.defaultPlayer[0].camera.RotateVertical(verticalAngle); - } - } - else - { -// SetMousePosition(g_Screen.width/2, g_Screen.height/2);//Shit this may be windows specific - } - - //Maybe some of these if not almost all should be moved into Level - ////////// - //Move Backward - if(!level.defaultPlayer->controls.backward.IsEmpty()) - { - level.defaultPlayer->controls.backward.FirstPosition(); - if(keys[level.defaultPlayer->controls.backward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.backward.NextPosition() && (keys[level.defaultPlayer->controls.backward.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.backward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); - } - } - } - } - - ////////// - //Move forward - if(!level.defaultPlayer->controls.forward.IsEmpty()) - { - level.defaultPlayer->controls.forward.FirstPosition(); - if(keys[level.defaultPlayer->controls.forward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.forward.NextPosition() && (keys[level.defaultPlayer->controls.forward.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.forward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(level.moveSpeed); - } - } - } - } - - ////////// - //Strafe Left - if(!level.defaultPlayer->controls.moveLeft.IsEmpty()) - { - level.defaultPlayer->controls.moveLeft.FirstPosition(); - if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) - { - level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.moveLeft.NextPosition() && (keys[level.defaultPlayer->controls.moveLeft.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) - { - level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); - } - } - } - } - - ////////// - //Strafe Right - if(!level.defaultPlayer->controls.moveRight.IsEmpty()) - { - level.defaultPlayer->controls.moveRight.FirstPosition(); - if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) - { - level.defaultPlayer[0].camera.StrafeCamera(level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.moveRight.NextPosition() && (keys[level.defaultPlayer->controls.moveRight.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) - { - level.defaultPlayer->camera.StrafeCamera(level.moveSpeed); - } - } - } - } - - ////////// - //Keyboard Look Left - if(!level.defaultPlayer->controls.lookLeft.IsEmpty()) - { - level.defaultPlayer->controls.lookLeft.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) - { - level.defaultPlayer[0].camera.RotateView(level.turnSpeed, 0, 1, 0); - } - else - { - while(level.defaultPlayer->controls.lookLeft.NextPosition() && (keys[level.defaultPlayer->controls.lookLeft.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) - { - level.defaultPlayer[0].camera.RotateView(level.turnSpeed, 0, 1, 0); - } - } - } - } - - ////////// - //Keyboard Look Right - if(!level.defaultPlayer->controls.lookRight.IsEmpty()) - { - level.defaultPlayer->controls.lookRight.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 0, 1, 0); - } - else - { - while(level.defaultPlayer->controls.lookRight.NextPosition() && (keys[level.defaultPlayer->controls.lookRight.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 0, 1, 0); - } - } - } - } - - ////////// - //Keyboard Look Up - if(!level.defaultPlayer->controls.lookUp.IsEmpty()) - { - level.defaultPlayer->controls.lookUp.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(level.turnSpeed, 1, 0, 0); - } - else - { - while(level.defaultPlayer->controls.lookUp.NextPosition() && (keys[level.defaultPlayer->controls.lookUp.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(level.turnSpeed, 1, 0, 0); - } - } - } - } - - ////////// - //Keyboard Look Down - if(!level.defaultPlayer->controls.lookDown.IsEmpty()) - { - level.defaultPlayer->controls.lookDown.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 1, 0, 0); - } - else - { - while(level.defaultPlayer->controls.lookDown.NextPosition() && (keys[level.defaultPlayer->controls.lookDown.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 1, 0, 0); - } - } - } - } - - ////////// - //Toggle Show FPS - if(!level.defaultPlayer->controls.toggleFPS.IsEmpty()) - { - level.defaultPlayer->controls.toggleFPS.FirstPosition(); - if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - level.showFPS = !level.showFPS; - } - } - else - { - while(level.defaultPlayer->controls.toggleFPS.NextPosition() && (keys[level.defaultPlayer->controls.toggleFPS.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - level.showFPS = !level.showFPS; - } - } - } - } - } - - ////////// - //Toggle MouseLook - if(!level.defaultPlayer->controls.toggleMouseLook.IsEmpty()) - { - level.defaultPlayer->controls.toggleMouseLook.FirstPosition(); - if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - else - { - while(level.defaultPlayer->controls.toggleMouseLook.NextPosition() && (keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - } - } - } - - ////////// - //Toggle Console - if(!level.defaultPlayer[0].controls.toggleConsole.IsEmpty()) - { - level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); - if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - level.showConsole = !level.showConsole; - keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] = true; - } - } - else - { - while(level.defaultPlayer[0].controls.toggleConsole.NextPosition() && (keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] != true)); - { - if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - level.showConsole = !level.showConsole; - keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] = true; - } - } - } - } - } - - ////////// - //Quick MouseLook - if(!level.defaultPlayer->controls.quickMouseLook.IsEmpty()) - { - level.defaultPlayer->controls.quickMouseLook.FirstPosition(); - if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - else - { - while(level.defaultPlayer->controls.quickMouseLook.NextPosition() && (keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - } - } - } - } + level->defaultPlayer[0].camera.Update(); } } - - em->SendEvent(new OpenArena::DrawEvent()); - //DrawGLScene(); + */ + + em->SendEvent(new OpenArena::Events::DrawEvent()); if(keys[OpenArena::KEY_F1]) { keys[OpenArena::KEY_F1] = false; - g_Screen.Close(); - g_Screen.ToggleFullscreen(); - if(!g_Screen.Open(OPENARENA_VERSION, level.screen.GetWidth(), level.screen.GetHeight(), level.screen.GetColorDepth(), level.screen.GetFullscreen())) + g_Screen->Close(); + g_Screen->ToggleFullscreen(); + if(!g_Screen->Open(OPENARENA_VERSION, level->screen.GetWidth(), level->screen.GetHeight(), level->screen.GetColorDepth(), level->screen.GetFullscreen())) { return 1; } - } - + } } - level.UnloadMap(); - g_Screen.Close(); + level->UnloadMap(); + g_Screen->Close(); exit(0); } -/* +#elif defined USE_AGL int main(int argc, char** argv) { - XEvent event; - bool done = false; + g_Screen = new OpenArena::Window(); + OpenArena::Events::DrawEvent::DrawEventHandler* _drawEventHandler = new OpenArena::Events::DrawEvent::DrawEventHandler(); + OpenArena::Events::KeyPressEvent::KeyPressEventHandler* _keyPressEventHandler = new OpenArena::Events::KeyPressEvent::KeyPressEventHandler(); + OpenArena::Events::KeyReleaseEvent::KeyReleaseEventHandler* _keyReleaseEventHandler = new OpenArena::Events::KeyReleaseEvent::KeyReleaseEventHandler(); + OpenArena::EventManager* em = new OpenArena::EventManager(); + em->RegisterEventHandler(_drawEventHandler); + em->RegisterEventHandler(_keyPressEventHandler); + em->RegisterEventHandler(_keyReleaseEventHandler); + +// ProcessCommandLineArgs(argc, argv); - string commandLine = ""; - int i; - for(i=1; iglFont.SetScreenDimensions(level->screen.GetWidth()*2, level->screen.GetHeight()*2); + + if(level->nextLevel == "") { - commandLine = commandLine + " " + argv[i]; - } - level.ParseCmds(commandLine.c_str()); - - InitControls(); - - level.glFont.SetScreenDimensions(level.screen.GetWidth()*2, level.screen.GetHeight()*2); - - if(level.nextLevel == "") - { - level.LoadMap("intro.map"); + level->LoadMap("intro.map"); } else { - level.LoadMap(); + level->LoadMap(); } - - //Hack for now - if(level.screen.GetColorDepth() == 32) + + //Hack for now X11 no like 32 bit depth + if(level->screen.GetColorDepth() == 32) { - level.screen.SetColorDepth(24); + level->screen.SetColorDepth(24); } -// g_Screen.SetInitializer(new OpenArena::Window::Initializer()); -// g_Screen.SetResizer(new OpenArena::Window::Resizer()); - - if(!g_Screen.Open(OPENARENA_VERSION, level.screen.GetWidth(), level.screen.GetHeight(), level.screen.GetColorDepth(), level.screen.GetFullscreen())) + if(!g_Screen->Open(OPENARENA_VERSION, level->screen.GetWidth(), level->screen.GetHeight(), level->screen.GetColorDepth(), level->screen.GetFullscreen())) { return 1; } + + level->SetWindow(g_Screen); - level.SetWindow(&g_Screen); + level->LoadGLTextures(); + + RunApplicationEventLoop(); - level.LoadGLTextures(); - - while(!done) - { - while(XPending(g_Screen.GetDisplay()) > 0) - { - //Equivalent of WNDPROC - XNextEvent(g_Screen.GetDisplay(), &event); - switch(event.type) - { - case Expose: - if(event.xexpose.count != 0) - { - break; - } - DrawGLScene(); - break; - case ConfigureNotify: - if((event.xconfigure.width != g_Screen.GetWidth()) || (event.xconfigure.height != g_Screen.GetHeight())) - { - g_Screen.SetWidth(event.xconfigure.width); - g_Screen.SetHeight(event.xconfigure.height); - ResizeGLScene(event.xconfigure.width, event.xconfigure.height); - } - break; - case ButtonPress: - keys[TranslateButton(event.xbutton.button)] = true; - break; - case ButtonRelease: - keys[TranslateButton(event.xbutton.button)] = false; - keys2[TranslateButton(event.xbutton.button)] = false; - break; - case KeyPress: - if(level.showConsole) - { - HandleConsoleKeyPress((OpenArena::Keys)TranslateKey(XLookupKeysym(&event.xkey, 0))); - } - else - { - keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = true; - } - break; - case KeyRelease: - keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; - keys2[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; - break; - case ClientMessage: - if(*XGetAtomName(g_Screen.GetDisplay(), event.xclient.message_type) == *"WM_PROTOCOLS") - { - printf("Exiting sanely...\n"); - done = true; - } - break; - default: - break; - } - } //End Equivalent of WNDPROC - - if(active) - { - if(keys[OpenArena::KEY_ESCAPE]) - { - done = true; - } - else if(keys[OpenArena::KEY_F1]) - { - g_Screen.Close(); - g_Screen.ToggleFullscreen(); - g_Screen.Open(); - } - else - { - level.defaultPlayer[0].camera.Update(); - if(!level.showConsole) - { - if(level.mlook) - { - using OpenArena::Vec2i; - Vec2i middleOfScreen = Vec2i(g_Screen.GetWidth()/2, g_Screen.GetHeight()/2); - Vec2i mousePosition = g_Screen.GetMousePosition(); - if(mousePosition != middleOfScreen) - { - //Vec2i mouseDelta = mousePosition - middleOfScreen; - Vec2i mouseDelta = middleOfScreen - mousePosition; - g_Screen.SetMousePosition(middleOfScreen); - const float MOUSE_SENSITIVITY_HORIZONTAL = 0.005; - const float MOUSE_SENSITIVITY_VERTICAL = 0.005; - float horizontalAngle = mouseDelta.x * MOUSE_SENSITIVITY_HORIZONTAL; - float verticalAngle = mouseDelta.y * MOUSE_SENSITIVITY_VERTICAL; - level.defaultPlayer[0].camera.RotateHorizontal(horizontalAngle); - level.defaultPlayer[0].camera.RotateVertical(verticalAngle); - } - } - else - { -// SetMousePosition(g_Screen.width/2, g_Screen.height/2);//Shit this may be windows specific - } - - //Maybe some of these if not almost all should be moved into Level - ////////// - //Move Backward - if(!level.defaultPlayer->controls.backward.IsEmpty()) - { - level.defaultPlayer->controls.backward.FirstPosition(); - if(keys[level.defaultPlayer->controls.backward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.backward.NextPosition() && (keys[level.defaultPlayer->controls.backward.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.backward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); - } - } - } - } - - ////////// - //Move forward - if(!level.defaultPlayer->controls.forward.IsEmpty()) - { - level.defaultPlayer->controls.forward.FirstPosition(); - if(keys[level.defaultPlayer->controls.forward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.forward.NextPosition() && (keys[level.defaultPlayer->controls.forward.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.forward.Retrieve()]) - { - level.defaultPlayer->camera.MoveCamera(level.moveSpeed); - } - } - } - } - - ////////// - //Strafe Left - if(!level.defaultPlayer->controls.moveLeft.IsEmpty()) - { - level.defaultPlayer->controls.moveLeft.FirstPosition(); - if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) - { - level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.moveLeft.NextPosition() && (keys[level.defaultPlayer->controls.moveLeft.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) - { - level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); - } - } - } - } - - ////////// - //Strafe Right - if(!level.defaultPlayer->controls.moveRight.IsEmpty()) - { - level.defaultPlayer->controls.moveRight.FirstPosition(); - if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) - { - level.defaultPlayer[0].camera.StrafeCamera(level.moveSpeed); - } - else - { - while(level.defaultPlayer->controls.moveRight.NextPosition() && (keys[level.defaultPlayer->controls.moveRight.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) - { - level.defaultPlayer->camera.StrafeCamera(level.moveSpeed); - } - } - } - } - - ////////// - //Keyboard Look Left - if(!level.defaultPlayer->controls.lookLeft.IsEmpty()) - { - level.defaultPlayer->controls.lookLeft.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) - { - level.defaultPlayer[0].camera.RotateView(level.turnSpeed, 0, 1, 0); - } - else - { - while(level.defaultPlayer->controls.lookLeft.NextPosition() && (keys[level.defaultPlayer->controls.lookLeft.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) - { - level.defaultPlayer[0].camera.RotateView(level.turnSpeed, 0, 1, 0); - } - } - } - } - - ////////// - //Keyboard Look Right - if(!level.defaultPlayer->controls.lookRight.IsEmpty()) - { - level.defaultPlayer->controls.lookRight.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 0, 1, 0); - } - else - { - while(level.defaultPlayer->controls.lookRight.NextPosition() && (keys[level.defaultPlayer->controls.lookRight.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 0, 1, 0); - } - } - } - } - - ////////// - //Keyboard Look Up - if(!level.defaultPlayer->controls.lookUp.IsEmpty()) - { - level.defaultPlayer->controls.lookUp.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(level.turnSpeed, 1, 0, 0); - } - else - { - while(level.defaultPlayer->controls.lookUp.NextPosition() && (keys[level.defaultPlayer->controls.lookUp.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(level.turnSpeed, 1, 0, 0); - } - } - } - } - - ////////// - //Keyboard Look Down - if(!level.defaultPlayer->controls.lookDown.IsEmpty()) - { - level.defaultPlayer->controls.lookDown.FirstPosition(); - if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 1, 0, 0); - } - else - { - while(level.defaultPlayer->controls.lookDown.NextPosition() && (keys[level.defaultPlayer->controls.lookDown.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) - { - level.defaultPlayer->camera.RotateView(-level.turnSpeed, 1, 0, 0); - } - } - } - } - - ////////// - //Toggle Show FPS - if(!level.defaultPlayer->controls.toggleFPS.IsEmpty()) - { - level.defaultPlayer->controls.toggleFPS.FirstPosition(); - if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - level.showFPS = !level.showFPS; - } - } - else - { - while(level.defaultPlayer->controls.toggleFPS.NextPosition() && (keys[level.defaultPlayer->controls.toggleFPS.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) - { - level.showFPS = !level.showFPS; - } - } - } - } - } - - ////////// - //Toggle MouseLook - if(!level.defaultPlayer->controls.toggleMouseLook.IsEmpty()) - { - level.defaultPlayer->controls.toggleMouseLook.FirstPosition(); - if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - else - { - while(level.defaultPlayer->controls.toggleMouseLook.NextPosition() && (keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - } - } - } - - ////////// - //Toggle Console - if(!level.defaultPlayer[0].controls.toggleConsole.IsEmpty()) - { - level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); - if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - level.showConsole = !level.showConsole; - keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] = true; - } - } - else - { - while(level.defaultPlayer[0].controls.toggleConsole.NextPosition() && (keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] != true)); - { - if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) - { - level.showConsole = !level.showConsole; - keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] = true; - } - } - } - } - } - - ////////// - //Quick MouseLook - if(!level.defaultPlayer->controls.quickMouseLook.IsEmpty()) - { - level.defaultPlayer->controls.quickMouseLook.FirstPosition(); - if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - else - { - while(level.defaultPlayer->controls.quickMouseLook.NextPosition() && (keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()] != true)); - { - if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) - { - level.mlook = ! level.mlook; - } - } - } - } - } - } - } - } - - DrawGLScene(); - - if(keys[OpenArena::KEY_F1]) - { - keys[OpenArena::KEY_F1] = false; - g_Screen.Close(); - g_Screen.ToggleFullscreen(); - if(!g_Screen.Open(OPENARENA_VERSION, level.screen.GetWidth(), level.screen.GetHeight(), level.screen.GetColorDepth(), level.screen.GetFullscreen())) - { - return 1; - } - } - - } - level.UnloadMap(); - g_Screen.Close(); - exit(0); } -/**/ - -#elif defined USE_AGL -#error #elif defined USE_CGL #error #endif diff --git a/src/main.h b/src/main.h index 54fb9b8..49b529a 100644 --- a/src/main.h +++ b/src/main.h @@ -28,7 +28,7 @@ #include // Header file for OpenGL32 library #include // Header file for Glu32 library #elif defined USE_AGL -#error unimplemented method +#include "mygl.h" #elif defined USE_CGL #error unimplemented method #elif defined USE_WGL @@ -130,6 +130,6 @@ int InitGL(); // All setup for OpenGL goes here * Separate items with the '|' character. */ void ReSizeGLScene(GLsizei width, GLsizei height); // Resize and initialize the GL window -int DrawGLScene(); +int DrawGLScene(OpenArena::Level* level); #endif diff --git a/src/mygl.cpp b/src/mygl.cpp index 921f8ae..33327e9 100644 --- a/src/mygl.cpp +++ b/src/mygl.cpp @@ -82,4 +82,4 @@ namespace OpenArena } }; -OpenArena::Window g_Screen; +OpenArena::Window* g_Screen = new OpenArena::Window(); diff --git a/src/mygl.h b/src/mygl.h index aee6ef5..a99bd2c 100644 --- a/src/mygl.h +++ b/src/mygl.h @@ -54,7 +54,7 @@ using namespace std; //These this is windows specific static HINSTANCE hInstance; // Application instance #endif -extern OpenArena::Window g_Screen; +extern OpenArena::Window* g_Screen; //This doesn't need to be here I think //int InitGL(GLvoid); namespace OpenArena diff --git a/src/player.h b/src/player.h index 4617ccf..040b946 100644 --- a/src/player.h +++ b/src/player.h @@ -24,121 +24,34 @@ #include "config.h" #endif +#include "EventManager.h" #include "camera.h" #include "ctrls.h" namespace OpenArena { - /*! - * \brief - * Write brief comment for Player here. - * - * Write detailed description for Player here. - * - * \remarks - * Write remarks for Player here. - * - * \see - * Separate items with the '|' character. - */ class Player { public: - /*! - * \brief - * Write brief comment for Load here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Load here. - * - * \remarks - * Write remarks for Load here. - * - * \see - * Separate items with the '|' character. - */ void Load(); - /*! - * \brief - * Write brief comment for Save here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Save here. - * - * \remarks - * Write remarks for Save here. - * - * \see - * Separate items with the '|' character. - */ void Save(); - /*! - * \brief - * Write brief comment for CreateCharacter here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for CreateCharacter here. - * - * \remarks - * Write remarks for CreateCharacter here. - * - * \see - * Separate items with the '|' character. - */ void CreateCharacter(); - //void FirePrimary(ENTITY& ent); - //void FireSecondary(); - /*! - * \brief - * Write brief comment for AddItem here. - * - * \param item - * Description of parameter item. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for AddItem here. - * - * \remarks - * Write remarks for AddItem here. - * - * \see - * Separate items with the '|' character. - */ void AddItem(unsigned int item); - /*! - * \brief - * Write brief comment for RemoveItem here. - * - * \param item - * Description of parameter item. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for RemoveItem here. - * - * \remarks - * Write remarks for RemoveItem here. - * - * \see - * Separate items with the '|' character. - */ void RemoveItem(unsigned int item); ControlScheme controls; Camera camera; + EventManager eventManager; + + class EventHandler + { + public: + + private: + }; private: - }; }; #endif diff --git a/src/strmanip.cpp b/src/strmanip.cpp index b96d87f..11ab731 100644 --- a/src/strmanip.cpp +++ b/src/strmanip.cpp @@ -240,160 +240,6 @@ string KeyString(uint8 key) return "null"; }; } -uint8 KeyName(std::string str) -{ - if (str.length() > 1) - { - if (str.substr(0,2) == "up") - return OpenArena::KEY_UP; - else if (str.substr(0,4) == "down") - return OpenArena::KEY_DOWN; - else if (str.substr(0,3) == "esc") - return OpenArena::KEY_ESCAPE; - else if (str.substr(0,6) == "pageup") - return OpenArena::KEY_PRIOR; - else if (str.substr(0,8) == "pagedown") - return OpenArena::KEY_NEXT; - else if (str.substr(0,5) == "right") - return OpenArena::KEY_RIGHT; - else if (str.substr(0,4) == "left") - return OpenArena::KEY_LEFT; - else if (str.substr(0,5) == "space") - return OpenArena::KEY_SPACE; - else if (str.substr(0,6) == "mouse1") - return OpenArena::KEY_LBUTTON; - else if (str.substr(0,6) == "mouse2") - return OpenArena::KEY_RBUTTON; - else if (str.substr(0,6) == "mouse3") - return OpenArena::KEY_MBUTTON; - else if (str.substr(0,4) == "home") - return OpenArena::KEY_HOME; - else if (str.substr(0,3) == "end") - return OpenArena::KEY_END; - else if (str.substr(0,3) == "tab") - return OpenArena::KEY_TAB; - else if (str.substr(0,5) == "enter") - return OpenArena::KEY_RETURN; - else if (str.substr(0,6) == "insert") - return OpenArena::KEY_INSERT; - else if (str.substr(0,6) == "delete") - return OpenArena::KEY_DELETE; - else if (str.substr(0,7) == "control") - return OpenArena::KEY_CONTROL; - else if (str.substr(0,5) == "shift") - return OpenArena::KEY_SHIFT; - else if (str.substr(0,7) == "numpad0") - return OpenArena::KEY_NUMPAD0; - else if (str.substr(0,7) == "numpad1") - return OpenArena::KEY_NUMPAD1; - else if (str.substr(0,7) == "numpad2") - return OpenArena::KEY_NUMPAD2; - else if (str.substr(0,7) == "numpad3") - return OpenArena::KEY_NUMPAD3; - else if (str.substr(0,7) == "numpad4") - return OpenArena::KEY_NUMPAD4; - else if (str.substr(0,7) == "numpad5") - return OpenArena::KEY_NUMPAD5; - else if (str.substr(0,7) == "numpad6") - return OpenArena::KEY_NUMPAD6; - else if (str.substr(0,7) == "numpad7") - return OpenArena::KEY_NUMPAD7; - else if (str.substr(0,7) == "numpad8") - return OpenArena::KEY_NUMPAD8; - else if (str.substr(0,7) == "numpad9") - return OpenArena::KEY_NUMPAD9; - else if (str.substr(0,9) == "separator") - return OpenArena::KEY_SEPARATOR; - else if (str.substr(0,4) == "lwin") - return OpenArena::KEY_LWIN; - else if (str.substr(0,4) == "rwin") - return OpenArena::KEY_RWIN; - else if (str.substr(0,4) == "apps") - return OpenArena::KEY_APPS; - else if (str.substr(0,7) == "numpad*") - return OpenArena::KEY_MULTIPLY; - else if (str.substr(0,7) == "numpad+") - return OpenArena::KEY_ADD; - else if (str.substr(0,7) == "numpad/") - return OpenArena::KEY_DIVIDE; - else if (str.substr(0,7) == "numpad-") - return OpenArena::KEY_SUBTRACT; - else if (str.substr(0,6) == "scroll") - return OpenArena::KEY_SCROLL; - else if (str.substr(0,7) == "numlock") - return OpenArena::KEY_NUMLOCK; - else if (str.substr(0,5) == "pause") - return OpenArena::KEY_PAUSE; - else if (str.substr(0,8) == "capslock") - return OpenArena::KEY_CAPITAL; - - - - /*uncomment this to enable f1 as a mappable key - else if(str.substr(0,2) == "f1") - return OpenArena::KEY_F1; - */ - - else if (str.substr(0,2) == "f2") - return OpenArena::KEY_F2; - else if (str.substr(0,2) == "f3") - return OpenArena::KEY_F3; - else if (str.substr(0,2) == "f4") - return OpenArena::KEY_F4; - else if (str.substr(0,2) == "f5") - return OpenArena::KEY_F5; - else if (str.substr(0,2) == "f6") - return OpenArena::KEY_F6; - else if (str.substr(0,2) == "f7") - return OpenArena::KEY_F7; - else if (str.substr(0,2) == "f8") - return OpenArena::KEY_F8; - else if (str.substr(0,2) == "f9") - return OpenArena::KEY_F9; - else if (str.substr(0,2) == "f10") - return OpenArena::KEY_F10; - else if (str.substr(0,2) == "f11") - return OpenArena::KEY_F11; - else if (str.substr(0,2) == "f12") - return OpenArena::KEY_F12; - //Add Game specific keys here and e-mail headhunter45@hotmail.com subject OpenArena keys so I can add them please - else if (str.substr(0,4) == "null") - return (uint8)NULL; - else - return (uint8)NULL; - } - else - { - if(str[0] == '~' || str[0] == '`') - return OpenArena::KEY_OEM_3; - else if (str[0] == '?' || str[0] == '/') - return OpenArena::KEY_OEM_2; - else if (str[0] == '.' || str[0] == '>') - return OpenArena::KEY_OEM_PERIOD; - else if (str[0] == '+' || str[0] == '=') - return OpenArena::KEY_OEM_PLUS; - else if (str[0] == ';' || str[0] == ':') - return OpenArena::KEY_OEM_1; - else if (str[0] == ',' || str[0] == '<') - return OpenArena::KEY_OEM_COMMA; - else if (str[0] == '-' || str[0] == '_') - return OpenArena::KEY_OEM_MINUS; - else if (str[0] == '[' || str[0] == '{') - return OpenArena::KEY_OEM_4; - else if (str[0] == ']' || str[0] == '}') - return OpenArena::KEY_OEM_6; - else if (str[0] == '\\' || str[0] == '|') - return OpenArena::KEY_OEM_5; - else if (str[0] == '\'' || str[0] == '"') - return OpenArena::KEY_OEM_7; - else if (isalpha(str[0])) - return toupper(str[0]) - 'A' + OpenArena::KEY_A; - else if(isdigit(str[0])) - return str[0] - '0' + OpenArena::KEY_0; - else - return OpenArena::KEY_UNKNOWN; - } -} string Right(string str, uint32 len) { @@ -433,15 +279,24 @@ string word(string str, uint32 wordNum) { if(wordNum < 1) { + while(isspace(str[start])) + ++start; + while (!isspace(str[++length]) && length < maxLength); + if(length < maxLength || isspace(str[length])){ + if(length >0) + { + length--; + } + } return str.substr(start, length); } else { while(isspace(str[start])) ++start; - + for(uint32 i=0; i - * Description of criteria for throwing this exception. - * - * Write detailed description for KeyName here. - * - * \remarks - * Write remarks for KeyName here. - * - * \see - * Separate items with the '|' character. - */ -uint8 KeyName(string str); /** * @brief diff --git a/src/tga.h b/src/tga.h index 0b4db51..66ebba0 100644 --- a/src/tga.h +++ b/src/tga.h @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2006 by Tom Hicks * - * tomhicks@cse.buffalo.edu * + * Copyright (C) 2006 by Tom Hicks * + * tomhicks@cse.buffalo.edu * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -24,11 +24,7 @@ #include "config.h" #endif -#pragma comment(lib, "OpenGL32.lib") -#ifdef WIN32 -#include //I think this was only needed because gl.h uses it -#endif -#include +#include "mygl.h" #include #include #include "texture.h" diff --git a/src/window.cpp b/src/window.cpp index 52c7a58..9d2c4cb 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -27,7 +27,7 @@ void OpenArena::Window::SwapBuffers() glXSwapBuffers(display, window); } #elif defined USE_AGL - aglSwapBuffers(aglContext); + aglSwapBuffers(_aglContext); #elif defined USE_CGL CGLFlushDrawable(cglContext); #elif defined USE_WGL @@ -35,71 +35,6 @@ void OpenArena::Window::SwapBuffers() #endif } -void OpenArena::Window::Close() -{ - #if defined USE_GLX - if(_fullscreen) - { - #if defined HAVE_XF86VIDMODE - XF86VidModeSwitchToMode(display, screen, &vidMode); - XF86VidModeSetViewPort(display, screen, 0, 0); - #endif - } - - if(hRC) - { - if(!glXMakeCurrent(display, None, NULL)) - { - printf("Could not release drawing context.\n"); - } - glXDestroyContext(display, hRC); - hRC = NULL; - } - - XCloseDisplay(display); - #elif defined USE_AGL - #error unimplemented method - #elif defined USE_CGL - #error unimplemented method - #elif defined USE_WGL - if(_fullscreen) - { - ChangeDisplaySettings(NULL, 0); - ShowCursor(true); - } - - if(glContext) - { - if(!wglMakeCurrent(NULL, NULL)) - MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); - - if (!wglDeleteContext(glContext)) - MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); - - glContext=NULL; - } - - if (deviceContext && !ReleaseDC(window, deviceContext)) - { - MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); - deviceContext=NULL; - } - - if (window && !DestroyWindow(window)) - { - MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); - window=NULL; - } - - if (!UnregisterClass("OpenArena v0.1.0", instance)) - { - MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); - instance=NULL; - } - #endif -} - - bool OpenArena::Window::Open() { #if defined USE_GLX @@ -210,7 +145,46 @@ bool OpenArena::Window::Open() _initializer->Initialize(); return true; #elif defined USE_AGL + OSStatus err = noErr; + SetRect(&_bounds, 0, 0, 640, 480); + err = CreateNewWindow(kDocumentWindowClass, kWindowStandardHandlerAttribute | kWindowCloseBoxAttribute | kWindowFullZoomAttribute | kWindowCollapseBoxAttribute, &_bounds, &_window); + if(err != noErr) + { + return false; + } + + RepositionWindow(_window, NULL, kWindowCascadeOnMainScreen); + + AGLDevice* devices = NULL; + GLint deviceCount = 0; + GLint attributes[] = {AGL_ACCELERATED, AGL_NO_RECOVERY, AGL_RGBA, AGL_DOUBLEBUFFER, AGL_NONE}; + AGLPixelFormat pixelFormat; + + pixelFormat = aglChoosePixelFormat(devices,deviceCount,attributes); + _aglContext = aglCreateContext(pixelFormat, NULL); + if(!_aglContext) + { + exit (5); + } + + aglDestroyPixelFormat(pixelFormat); + + if(!aglSetCurrentContext(_aglContext)) + { + exit(6); + } + + if(!aglSetDrawable(_aglContext, GetWindowPort(_window))) + { + exit(7); + } + + glClearColor(0.0f,0.0f,0.0f,0.0f); + glClear(GL_COLOR_BUFFER_BIT); + aglSwapBuffers(_aglContext); + ShowWindow(_window); #elif defined USE_CGL + #error undefined method #elif defined USE_WGL unsigned int PixelFormat; WNDCLASS wc; @@ -339,6 +313,75 @@ bool OpenArena::Window::Open() #endif } +void OpenArena::Window::Close() +{ + #if defined USE_GLX + if(_fullscreen) + { + #if defined HAVE_XF86VIDMODE + XF86VidModeSwitchToMode(display, screen, &vidMode); + XF86VidModeSetViewPort(display, screen, 0, 0); + #endif + } + + if(hRC) + { + if(!glXMakeCurrent(display, None, NULL)) + { + printf("Could not release drawing context.\n"); + } + glXDestroyContext(display, hRC); + hRC = NULL; + } + + XCloseDisplay(display); + #elif defined USE_AGL + if(!_fullscreen) + { + aglSetCurrentContext(NULL); + aglDestroyContext(_aglContext); + _aglContext = NULL; + } + #elif defined USE_CGL + #error unimplemented method + #elif defined USE_WGL + if(_fullscreen) + { + ChangeDisplaySettings(NULL, 0); + ShowCursor(true); + } + + if(glContext) + { + if(!wglMakeCurrent(NULL, NULL)) + MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); + + if (!wglDeleteContext(glContext)) + MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); + + glContext=NULL; + } + + if (deviceContext && !ReleaseDC(window, deviceContext)) + { + MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); + deviceContext=NULL; + } + + if (window && !DestroyWindow(window)) + { + MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); + window=NULL; + } + + if (!UnregisterClass("OpenArena v0.1.0", instance)) + { + MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); + instance=NULL; + } + #endif +} + bool OpenArena::Window::Open(string title, int width, int height, int bits, bool fullscreenflag) { _fullscreen = fullscreenflag; @@ -423,11 +466,11 @@ OpenArena::Vec2i OpenArena::Window::GetMousePosition() { return Vec2i(mouseX, mouseY); } - #elif USE_AGL + #elif defined USE_AGL + #warning unimplemented method + #elif defined USE_CGL #error unimplemented method - #elif USE_CGL - #error unimplemented method - #elif USE_WGL + #elif defined USE_WGL POINT pos; GetCursorPos(&pos); return Vec2i(pos.x, pos.y); @@ -439,7 +482,7 @@ void OpenArena::Window::SetMousePosition(Vec2i pos) #if defined USE_GLX XWarpPointer(display, None, window, 0, 0, 0, 0, pos.x, pos.y); #elif defined USE_AGL - #error unimplemented method + #warning unimplemented method #elif defined USE_CGL #error unimplemented method #elif defined USE_WGL diff --git a/src/window.h b/src/window.h index 3cb2767..5ba83be 100644 --- a/src/window.h +++ b/src/window.h @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2006 by Tom Hicks * - * tomhicks@cse.buffalo.edu * + * Copyright (C) 2006 by Tom Hicks * + * tomhicks@cse.buffalo.edu * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -39,6 +39,7 @@ #elif defined USE_AGL #include #include + #include #elif defined USE_CGL #include #include @@ -54,329 +55,32 @@ namespace OpenArena { - /*! - * \brief - * Write brief comment for Window here. - * - * Write detailed description for Window here. - * - * \remarks - * Write remarks for Window here. - * - * \see - * Separate items with the '|' character. - */ class Window: public Screen { public: - /*! - * \brief - * Write brief comment for Resizer here. - * - * Write detailed description for Resizer here. - * - * \remarks - * Write remarks for Resizer here. - * - * \see - * Separate items with the '|' character. - */ class Resizer { public: - /*! - * \brief - * Write brief comment for Resize here. - * - * \param width - * Description of parameter width. - * - * \param height - * Description of parameter height. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Resize here. - * - * \remarks - * Write remarks for Resize here. - * - * \see - * Separate items with the '|' character. - */ void Resize(GLsizei width, GLsizei height); }; - /*! - * \brief - * Write brief comment for Initializer here. - * - * Write detailed description for Initializer here. - * - * \remarks - * Write remarks for Initializer here. - * - * \see - * Separate items with the '|' character. - */ class Initializer { public: - /*! - * \brief - * Write brief comment for Initialize here. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Initialize here. - * - * \remarks - * Write remarks for Initialize here. - * - * \see - * Separate items with the '|' character. - */ int Initialize(); }; public: - /*! - * \brief - * Write brief comment for Window here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Window here. - * - * \remarks - * Write remarks for Window here. - * - * \see - * Separate items with the '|' character. - */ Window(); - /*! - * \brief - * Write brief comment for ~Window here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for ~Window here. - * - * \remarks - * Write remarks for ~Window here. - * - * \see - * Separate items with the '|' character. - */ ~Window(); - /*! - * \brief - * Write brief comment for Close here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Close here. - * - * \remarks - * Write remarks for Close here. - * - * \see - * Separate items with the '|' character. - */ void Close(); - /*! - * \brief - * Write brief comment for Open here. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Open here. - * - * \remarks - * Write remarks for Open here. - * - * \see - * Separate items with the '|' character. - */ bool Open(); - /*! - * \brief - * Write brief comment for Open here. - * - * \param title - * Description of parameter title. - * - * \param width - * Description of parameter width. - * - * \param height - * Description of parameter height. - * - * \param bits - * Description of parameter bits. - * - * \param fullscreenflag - * Description of parameter fullscreenflag. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Open here. - * - * \remarks - * Write remarks for Open here. - * - * \see - * Separate items with the '|' character. - */ bool Open(string title, int width, int height, int bits, bool fullscreenflag); //make that string a const char* after this works - /*! - * \brief - * Write brief comment for SetInitializer here. - * - * \param initializer - * Description of parameter initializer. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for SetInitializer here. - * - * \remarks - * Write remarks for SetInitializer here. - * - * \see - * Separate items with the '|' character. - */ void SetInitializer(Initializer* initializer); - /*! - * \brief - * Write brief comment for SetResizer here. - * - * \param resizer - * Description of parameter resizer. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for SetResizer here. - * - * \remarks - * Write remarks for SetResizer here. - * - * \see - * Separate items with the '|' character. - */ - /*! - * \brief - * Write brief comment for SetResizer here. - * - * \param resizer - * Description of parameter resizer. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for SetResizer here. - * - * \remarks - * Write remarks for SetResizer here. - * - * \see - * Separate items with the '|' character. - */ void SetResizer(Resizer* resizer); - /*! - * \brief - * Write brief comment for SwapBuffers here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for SwapBuffers here. - * - * \remarks - * Write remarks for SwapBuffers here. - * - * \see - * Separate items with the '|' character. - */ void SwapBuffers(); - /*! - * \brief - * Write brief comment for Resize here. - * - * \param width - * Description of parameter width. - * - * \param height - * Description of parameter height. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for Resize here. - * - * \remarks - * Write remarks for Resize here. - * - * \see - * Separate items with the '|' character. - */ void Resize(GLsizei width, GLsizei height); - /*! - * \brief - * Write brief comment for GetMousePosition here. - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for GetMousePosition here. - * - * \remarks - * Write remarks for GetMousePosition here. - * - * \see - * Separate items with the '|' character. - */ Vec2i GetMousePosition(); - /*! - * \brief - * Write brief comment for SetMousePosition here. - * - * \param pos - * Description of parameter pos. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for SetMousePosition here. - * - * \remarks - * Write remarks for SetMousePosition here. - * - * \see - * Separate items with the '|' character. - */ void SetMousePosition(Vec2i pos); #ifdef USE_GLX @@ -395,7 +99,11 @@ namespace OpenArena XF86VidModeModeInfo vidMode; #endif int x, y; - Display* display; + Display* display; + #elif defined USE_AGL + AGLContext _aglContext; + WindowRef _window; + Rect _bounds; #elif defined USE_WGL HGLRC glContext; HWND window; @@ -411,36 +119,6 @@ namespace OpenArena static int attrListSgl[] = {GLX_RGBA, GLX_RED_SIZE, 4, GLX_GREEN_SIZE, 4, GLX_BLUE_SIZE, 4, GLX_DEPTH_SIZE, 16, None}; static int attrListDbl[] = {GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 4, GLX_GREEN_SIZE, 4, GLX_BLUE_SIZE, 4, GLX_DEPTH_SIZE, 16, None}; #elif defined USE_WGL -/*! - * \brief - * Write brief comment for WndProc here. - * - * \param - * Description of parameter . - * - * \param - * Description of parameter . - * - * \param - * Description of parameter . - * - * \param - * Description of parameter . - * - * \returns - * Write description of return value here. - * - * \throws - * Description of criteria for throwing this exception. - * - * Write detailed description for WndProc here. - * - * \remarks - * Write remarks for WndProc here. - * - * \see - * Separate items with the '|' character. - */ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); #endif diff --git a/src/worlddefs.h b/src/worlddefs.h index ceb4e6b..2e95ed1 100644 --- a/src/worlddefs.h +++ b/src/worlddefs.h @@ -26,6 +26,6 @@ #include "level.h" -static OpenArena::Level level; +//static OpenArena::Level level; #endif diff --git a/src/x11.cpp b/src/x11.cpp index 09b033f..ab6ca60 100644 --- a/src/x11.cpp +++ b/src/x11.cpp @@ -47,26 +47,13 @@ // //////////////////////////////////////////////////////////////////////////////// #include "x11.h" +#if defined USE_GLX #include "main.h" #include "version.h" -void InitControls(OpenArena::EventManager* em) +int InitGL(OpenArena::Level* level) { - if (!level.LoadConfig("my.cfg")) - { - level.LoadConfig(); - } -} - -void InitControls() -{ - if (!level.LoadConfig("my.cfg")) - level.LoadConfig(); -} - -int InitGL(GLvoid) -{ - level.LoadGLTextures(); + level->LoadGLTextures(); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); @@ -78,11 +65,11 @@ int InitGL(GLvoid) glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); /*lighting disabled temporarily - glLightfv(GL_LIGHT1, GL_AMBIENT, level.LightAmbient); - for(index=0; indexLightAmbient); + for(index=0; indexnumLights; index++) { - glLightfv(GL_LIGHT1, GL_DIFFUSE, level.light[index].color); - glLightfv(GL_LIGHT1, GL_POSITION, level.light[index].coords); + glLightfv(GL_LIGHT1, GL_DIFFUSE, level->light[index].color); + glLightfv(GL_LIGHT1, GL_POSITION, level->light[index].coords); } glEnable(GL_LIGHT1); @@ -93,7 +80,7 @@ int InitGL(GLvoid) } //This should probably be moved into oa_input -unsigned char TranslateKey(int keyCode) +OpenArena::Keys TranslateKey(int keyCode) { switch (keyCode) { @@ -335,46 +322,23 @@ unsigned char TranslateKey(int keyCode) case XK_slash: return OpenArena::KEY_OEM_2; case XK_Alt_L: - return OpenArena::KEY_UNKNOWN; + return OpenArena::KEY_ALT_L; case XK_Alt_R: - return OpenArena::KEY_UNKNOWN; - -/*These keys definately still need to be accounted for -` 96 -pause 65299 -win 65515 -apps 65383 -- 45 -= 61 -[ 91 -] 93 -\ 92 -; 59 -' 39 -' 47 -left alt 65513 -right alt 65514 - -#define KEY_LBUTTON 1 -#define KEY_RBUTTON 2 -#define KEY_MBUTTON 3 -#define KEY_LWIN 21 -#define KEY_RWIN 22 -#define KEY_APPS 23 -#define KEY_OEM_1 53 -#define KEY_OEM_2 54 -#define KEY_OEM_3 55 -#define KEY_OEM_4 56 -#define KEY_OEM_5 57 -#define KEY_OEM_6 58 -#define KEY_OEM_7 59 -*/ + return OpenArena::KEY_ALT_L; + case XK_equal: + return OpenArena::KEY_OEM_PLUS; + case XK_Mode_switch: + return OpenArena::KEY_OPTION; + case XK_Meta_L: + return OpenArena::KEY_COMMAND; + case 16777219: + return OpenArena::KEY_ENTER; default: return OpenArena::KEY_UNKNOWN; } } -unsigned char TranslateButton(int keyCode) +OpenArena::Keys TranslateButton(int keyCode) { switch(keyCode) { @@ -391,44 +355,36 @@ unsigned char TranslateButton(int keyCode) } } -void HandleConsoleKeyPress(OpenArena::Keys key) +void HandleConsoleKeyPress(OpenArena::Keys key, OpenArena::Level* level) { - //See if we need to hide the console - level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); - if(key == level.defaultPlayer[0].controls.toggleConsole.Retrieve()) + if(level->defaultPlayer[0].controls.IsBound(key, OpenArena::ControlScheme::ACTION_TOGGLE_CONSOLE)) { - level.showConsole = false; - } - else - { - while(level.defaultPlayer[0].controls.toggleConsole.NextPosition() && level.showConsole) - { - if(level.defaultPlayer[0].controls.toggleConsole.Retrieve() == key) - { - level.showConsole = false; - } - } + level->showConsole = false; } + switch (key) { case OpenArena::KEY_SHIFT: keys[OpenArena::KEY_SHIFT] = true; break; case OpenArena::KEY_RETURN: - level.UpdateConsole('\n'); + level->UpdateConsole('\n'); break; case OpenArena::KEY_SPACE: printf("hello"); - level.UpdateConsole(' '); + level->UpdateConsole(' '); break; case OpenArena::KEY_BACK: - level.UpdateConsole(OpenArena::KEY_BACK); + level->UpdateConsole(OpenArena::KEY_BACK); + break; + case OpenArena::KEY_ESCAPE: + level->showConsole = false; break; default: char ascii = OpenArena::KeyToASCII(key, keys[OpenArena::KEY_SHIFT]); if(ascii != '\0') { - level.UpdateConsole(ascii); + level->UpdateConsole(ascii); } } } @@ -447,5 +403,6 @@ void ResizeGLScene(GLsizei width, GLsizei height) void RT() { - g_Screen.SwapBuffers(); } + +#endif /* USE_GLX */ diff --git a/src/x11.h b/src/x11.h index 38b08a4..3f3324d 100644 --- a/src/x11.h +++ b/src/x11.h @@ -19,28 +19,22 @@ ***************************************************************************/ #ifndef __x11_h__ #define __x11_h__ - -/** - * @file x11.h - * @breif Specification of an X11 Event loop - * This file along with x11.cpp implement an X11 Event loop to - * process and dispatch events to the specified EventManager. - * - * @see x11.cpp - */ +#if defined HAVE_CONFIG_H +#include "config.h" +#endif +#if defined USE_GLX #include "mygl.h" #include "EventManager.h" +#include "level.h" int DrawGLScene(); -unsigned char TranslateButton(int keyCode); -unsigned char TranslateKey(int keyCode); +OpenArena::Keys TranslateButton(int keyCode); +OpenArena::Keys TranslateKey(int keyCode); void ResizeGLScene(GLsizei width, GLsizei height); void HandleConsoleKeyPress(OpenArena::Keys key); -int DrawGLScene(); -void InitControls(); -void InitControls(OpenArena::EventManager* em); -int InitGL(GLvoid); -void RT(); - -#endif /*__x11_h__*/ +int DrawGLScene(OpenArena::Level* level); +int InitGL(OpenArena::Level* level); +void HandleConsoleKeyPress(OpenArena::Keys key, OpenArena::Level* level); +#endif /* USE_GLX */ +#endif /* __x11_h__ */