Original Post
Hello,
I''ve been playing a military FPS lately. You know how it is -- you play a game for a while and become hooked and decide you want to make your own.
I need a group opinion of whether my design is feasible or not. I haven''t gotten as far as writing a technical design document yet; frankly I don''t want to waste resources (my brain energy in this case) on a project that is dead before it begins. The reason I need someone else''s opinion is because although I consider myself an advanced C++ programmer, I''ve never gotten into heavy 3D graphics and 3D AI.
Anywho, the game is similar to Battlefield 1942, but without multiplayer support. There is no story whatsoever, at least no story linking the missions together. You play as a single unit involved a large ground battle. There are two large teams warring against each other. You play by selecting a mission from a list. Missions range from "capture x building" to "hold off the invading army for 10 minutes". Everything else about the mission is completely random. The terrain is a randomly generated heightmap covered by randomly placed textures. I''m not sure what will happen if you reach the edge of the world... All buildings and units are also placed randomly. The selling point of the game is that you never fight the same battle twice.
When you join the game and after everytime you die, you are able to choose which of your teammate types to play as. The number and types of teammates (rocketiers, grenadiers, engineers, machine gunners, etc.) are set in the mission file, but the norm will probably be 16-32 units per side. The type dictates what weapons you start out as, but armory buildings placed around the map allow you to pick up different weapons. Possible vehicles include tanks, helicopters, and trucks. As currently planned the vehicles cannot be driven by the player, but can transport the player. The player will be able to call choppers down by placing flares.
Basic commands can be given to units. You can select them on the map or with CTRL+left click in the game. You can assign selected units to a group with CTRL+# like in RTS games. You can tell units to clear a building or move to a spot in the world by clicking on it on the map or by pressing CTRL+left click in the game. You can tell units to follow you or hold position.
You can design your own missions in the in-game mission editor. It is based around a system of objects. Objects include units, buildings, and locations. Locations are invisible cicles on the map with a radius defined in the mission editor. For example, you can create a location called "Town1" with a radius of 200 yards, and then when placing buildings set their location to "Town1". The building''s position vector will be set to a random spot within the 200 yard radius of "Town1". An object''s location defaults to "Entire Map", so it will appear randomly at any point in the map. Because locations are objects too, you must give them a location. The locations appear in a random location within their parent location. If you want units to appear inside a building in a town, for example, you would create a location called "Town1" and set its location to "Entire Map", create a location called "Building1" and set its location to "Town1", create a building object and set its location to "Building1", and create a unit object and set its location to "Building1". Confused yet?
Object types are stored in a database. Players can add their own objects. Example:
1,"Grenadier","Unit","Grenadier.mdl"
2,"Hind","Helicopter","Hind1.mdl"
3,"Clock Tower","Building","clktwr.mdl"
Then in the mission editor they can place a unit object and choose "Grenadier" as the type. The given model file will be loaded when the game starts. Each object will be stored in a CObject class, which will handle stuff like its health and current world position. There will be a CObjType class that loads the model for the type and takes care of rendering it. A CObjMgr class oversees it all, creating the different classes and handling their destruction.
Object AI is handled by a wrapper class. So for example there is a CHelicopterAI and CUnitAI class. One instance will be created for each type of object. Every tick, you go through all of the objects and call something like UnitAI.Process(pObject) or HelicopterAI.Process(pObject), which will look at what is going on around the given object and update its states (position, task) accordingly.
Missions goals are set with triggers. Triggers can be something like:
IF "Blue Team Unit" ENTERS LOCATION "Red Base" GIVE "1" "point" TO "Blue Team"
IF "Any Unit" ENTERS LOCATION "Armory" GIVE "1" "m16" TO "Unit"
Stuff like that. There are different variables and commands available, which can be chosen from list boxes.
I''m thinking as I type, so I better start wrapping it up. Here is a rough plan of what has to be done:
-- Object system
-- Database system (Done)
-- Dynamic heightmap generation (Done)
-- Terrain rendering
-- Skybox rendering
-- Model loading for each different object type
-- Random weather (cuttable)
-- Random day/night (cuttable)
-- Create model for unit (all units have same model)
-- Create animations for unit
-- Create model for unit holding knife, pistol, m16, etc.
-- Unit AI
-- Building models
-- Vehicle models (cuttable)
-- Vehicle AI (cuttable)
-- Smoke effects (explosions, gun blasts, rocket trails
That''s a very rough plan, but it is good enough for now.
Looking at all that this entails, is this doable for a small online team if ever get one together and decide to do this?
Thanks for reading my ramblings.
--Jon