Operation Outrageous Overhaul
Leges Motus
Operation Outrageous Overhaul (or oOo for short, and Operation Overly Outrageous Overhaul of Object Orientation Organization for long) is the current endeavor for Leges Motus to be a better-organized project, and an easier project to extend. Beginning after the release of 0.4.0, this will be the main focus of the project for 0.5.0. It will be a long road, but the more we put it off, the worse it'll be.
oOo is a large revamp of the client to bring it up to snuff with a more thought-out design. The original client is plagued by being too integrated in such a way that made it difficult to modularize, and as such difficult to write different frontends, and just generally difficult to work with. oOo hopes to alleviate this, but it is a difficult process, given the existing code.
As this is essentially a rewrite of most of Leges Motus, there is much organization that must be kept sorted. A current TODO list can be found here, which will hopefully be up-to-date, and contain relevant links to tickets.
Remember, Leges Motus is open-source, and you are welcome to help!
Current Status
Armed and dangerous.
Playability: Playable! (Though with difficulty, since visual feedback has a long way to go).
Plan of attack
As oOo will be huge, the work is broken down into multiple stages.
- Implement new graphics engine (DONE)
- The old graphics engine is slow, and could use a good rewrite. There were some design problems, and a lot of things could use work
- A baseline drawing context type for drawing primitives without making calls directly (DONE)
- SDL-independent Image struct that holds tex pointers or the actual data (DONE)
- Caching of Images (DONE)
- Various thin Graphic classes (DONE)
- Bones for manipulating Graphics without having a large hierarchy of the graphics themselves (DONE)
- The old graphics engine is slow, and could use a good rewrite. There were some design problems, and a lot of things could use work
- Rewrite game engine (IN PROGRESS)
- Note that a lot of this has to be done in lock-step with the graphical game engine so that things can be tested effectively
- Get a baseline GraphicalPlayer class working (DONE)
- Get visual scaling to screen size working (DONE)
- Fake some basic map loading (DONE)
- Implement some basic physics to bounce around on the map (DONE)
- Fake some basic networking (DONE)
- Implement key-bindings (DONE)
- Get jumping working (DONE)
- Implement most networking (IN PROGRESS)
- Implement gate lowering (DONE)
- Implement single weapon and freezing - (DONE) - Weaponry Design
- Implement remaining physics (DONE)
- Implement real map loading (IN PROGRESS)
- Hazards (DONE)
- Spawn Points (NOTHING TO DO?)
- Repulsion (DONE)
- Force Fields (DONE)
- Implement object sets (DELAYED)
- Implement remaining weapons (DONE)
- Penetration (DONE)
- Spread (DONE)
- Thaw (DONE)
- Area (DONE)
- Charge(?)
- Implement heavyweight server (DONE)
- Fix weapon firing (DONE)
- Fix map loading to not destroy the MapReader as it loads
- Change packets to make heavy server receive input about when/where to jump/shoot (DONE)
- Improve packet design to avoid including useless information in player updates from client/server. (DONE)
- Fix player died packet sending. (DONE)
- Add last minor gameplay features:
- Health regeneration (DONE)
- Server-to-client map sending support.
- Note that a lot of this has to be done in lock-step with the graphical game engine so that things can be tested effectively
- Rewrite graphical extensions to game engine (e.g. menus, fancy effects) (IN PROGRESS)
- Implement widgets (IN PROGRESS)
- Implement buttons
- Implement progress bars (DONE)
- Implement text input
- Redo HUD (IN PROGRESS)
- Redo menu
- Overhaul configuration file format
- Write gamepad support
- Write customizable key-bindings
- Redo animation protocol
- Special effects
- Particle effects
- Shaders (IN PROGRESS)
- Redo audio engine
- Redo sound effects
- Implement widgets (IN PROGRESS)
Note that some of the later parts may get pushed back to 0.6.0.
Tips and Tricks
Some bits of the refactor are tricky and may include things like conflicting naming. Here are some relevant tricks:
-
These two classes have the same name, and thus I can't compile!
-
In the new class .hpp, #define ClassName NewClassName and make sure everything that needs it #includes the .hpp instead of forward declaring. Once the old version gets axed after the refactor is done, remove the #define, and it should be fine.This is no longer necessary! The only old client class still being compiled is client/Curve. If you are still running into a double-name problem, please make clean. For a list of these in Leges Motus, please see the TODO list.