Browse Source

Add some documentation and plan files.

Beoran 7 years ago
parent
commit
7c4cab6b41
2 changed files with 344 additions and 0 deletions
  1. 254 0
      doc/PLAN.md
  2. 90 0
      doc/TODO.md

+ 254 - 0
doc/PLAN.md

@@ -0,0 +1,254 @@
+
+= ERUTA PLAN =
+ 
+== General ==
+
+Eruta will be a 2D or 2.5D game. 
+  Rationale: I like the old-school 2D look. 3D games are more resource hungry 
+  and time-consuming to implement, so that's for the next project.
+
+Programmed in C with mruby scripting:
+  Rationale: I love Ruby, but no matter how easy normal Ruby is to use, 
+  I ended up writing a lot of C anyway to support it. For gaming, speed is
+  essential since a slow game is hard to enjoy, especially for an action game.
+  So I decided to rather than use ruby extended with C, to use C
+  extended with a scripting language.
+  At first the choice of scripting languages was on Lua, but the mruby idea 
+  and open source development on github came through, and I switched to mruby 
+  since it does give me the sweet, easy Ruby syntax for the scripts. :)
+  And no, don't even dare mention C++, it complicates matters without being 
+  actually that helpful. And too bad that Objective C is not well supported on 
+  Windows and messy on Linux.
+
+Using Allegro 5.x.
+  Rationale: SDL may be the de facto standard for open source games, but it's
+  very poor in functionality. So I ended up having to write a lot of
+  functionality myself. And SDL 2.0 is not as mature as allegro 5 is. I thought
+  Allegro 5 was slower, but when  using plain C, and taking care to
+  load the images after opening the screen, Allegro 5 was actually plenty
+  fast enough. Allegro has so much nice functionality built in, it would be a
+  waste not to use it when using plain C.
+
+Virtual screen resolution exactly 640x480. Color depth minimum 16bpp or better. 
+  Also implement scaling to other resolutions trough OpenGL or 2xSai, etc 
+  to achieve resolution dependence later.
+  Rationale: Old-style feeling and limit art requrements.
+
+Hand drawn art with colors limited to a 12/15 bits palette. 
+  I like bright colors that have a simple rgb expression and generated
+  a palette that fits the limitations for drawing the hand drawn art.
+  Rationale: Old-style feeling.
+
+A role playing game with much onus on the story.
+  Rationale: I want Eruta to be to RPG's what Katawa Shoujo is to Visual Novels.
+
+Multi player game:
+  Rationale: I want to be able to play together with someone on the same PC. 
+  To begin just 2 players together is OK. Perhaps implement 
+  split screen. 2 to 4 players are probably OK to divide the screen between. The 
+  maximum should be the amount of 12 characters, but it will be hard to fit all 
+  those on one screen. So perhaps allow networked play as well.
+  
+  
+Full Action RPG or Chrono Trigger style menu-driven tactical or more FF12 style RPG?
+  I'm still unsure actually! Oh my! FF6 shows that a menu driven game can be
+  played by several players. Each player simply controls one character during 
+  battles. And since all characters will always be visible and on the screen,
+  the idea would be to allow controlling them even outside of battle. 
+  They can talk and get small side-dialogs. They can search and help solve puzzles.
+  Only the player who controls the main character will be able to make plot
+  determining decisions, and control of secondary characters will be disabled in 
+  camp.
+  Even if I decide that the battles should be menu based, the players will be able 
+  to use various forceful actions outside of combat as well.
+  Ponderings about the 3 different options: action, tactical and hybrid. Strategic
+  is not under consideration since I don't like strategic RPG's too much due to 
+  too slow and too battle-oriented.
+  Action RPG: 
+  + Easy to get in to. 
+  + Action based battles normally are the most "fun" at least to me.
+  - May be difficult to control 12 or 6 characters all at once.
+  - Action based battles lack depth in RPG's since you'd need the controls 
+    of a fighting game to make the moves complex. That would work, but make the game
+    less accessible again. I don't like to have to button mash or memorize button
+    combinations.
+  +- AI implementation is somewhat more complex. 
+  Tactical RPG: (Classic menu driven)
+  + If done correctly, and with some enhancements, can be deeper than action RPG.
+  + For some players, and for me too the menu-based approach is more relaxed.
+    The game becomes more like a tactical puzzle.
+  - If done 100% classic style, the battles can devolve into boring bouts 
+    of doing nothing but selecting "fight/fight/fight..." (or X X X, FFXIII :p) 
+    over and over. More creativity and challenge even in normal battles is needed.
+  - Could be harder to get in to.
+  Hybrid (FF12/MMORPG style):
+  + Can be as deep as tactical. 
+  + Easier to implement networked and multiplayer.
+  - Isn't as relaxing to play as pure menu driven.
+ -+ Game engine is somewhat more complex than tactical and probably even more 
+    than action based alone.
+=> Conclusion: I want this game to be more "SOM"-like with a "PS4"-like 
+atmosphere, so Action RPG it is. Let's see how deep that rabbit hole goes. :)
+My next RPG project will be a more "PERS4" inspired 3D menu driven RPG.
+
+  
+  
+== Needed Functionality ==
+
+The Eruta game engine will need the following general functionality: 
+
+Tile map 
+Sprites
+Physics, collision detection and resolution
+Particle engine for effects
+Camera module
+Resource loading
+UI Subsystem
+Input mapping (to commands/events)
+Music handling
+Sound handling
+Scripting of maps and events.
+Game system: stats, skills, techniques, battle resolution, etc, etc.
+
+
+=== Tile Map Requirements ===
+
+Tile map with tiles of 32x32 pixels. Before, 40x40 or 64x64 were considered, but
+these are too large and make the art requirements too high. Also, 32x32 is easy 
+to accelerate with OpenGL later, and fits the resolution of 640x480 well.
+
+Tile map distinguishes between tile layers wich dictate rendering and world
+layers which dictate gameplay (ie, on which levels the sprites can “be”).
+Tile map has 4 drawing layers of tiles. Testing shows 4 is optimal for speed.
+Layers are usually grouped in pairs for the “world layers”. Layer 1 is the first
+floor, layer 2 is anything that stands on that floor and any fringes/overlaps
+from one kind of floor to another. Layers 1 and 2 are always under all sprites.
+Layer 3 and 4 are normally the “floor above” the player, however, the player may
+walk there in case of bridges, overlays, or parallax.
+
+Every layer may have a background image that is drawn before the tiles of the layer 
+are drawn. the tiles can also be made invisible if the background layer by itself is 
+enough visually. In that case the tiles influence the game play and physics only. 
+Although only one bitmap background can be displayed per layer, it's possible for 
+a layer to change the background depending on what's needed. 
+(night/day/scripting/etc). The background bitmap width and 
+height must have a size that is an integer multiple of 32 pixels.
+
+There will be options for parallax scrolling of the background bitmap versus the 
+tiles in a layer, or, for paralax between the layers in total. Scrolling
+can be locked or unlocked in x and y directions though scripts or by using
+special "scroll lock" tiles.
+
+View culling will be possible, in that, if enabled, only the direct area around the 
+player sprite will be shown, and anything outside a rectangle set by special 
+culling tiles will not be drawn. This to allow inside areas to be stored more 
+compactly.
+
+Every map layer uses exactly one tile set based on a single tile image. Tile images 
+are are files in .png format with a width and height that are integer multiples of
+32, and that contain many individual tiles.
+
+Keeping with convention over configuration, the tile sets are read in, split up
+in 32x32 tiles and interpreted according to the following rules:
+
+Every map describes the names of the tile it uses. The file name of the 
+set is of the form set_name_xxx000.png where xxx000 is a number with at least 4 
+digits that signifies the start index of the set. Tiles in a set are numbered 
+from left to right and from top to bottom, starting from 0. So, for instance  
+the second tile at  the top left of a tile set will be numbered 1.
+
+The idea of this is for maps broadly compatible with each other even if 
+they use different tile sets, and also to make it easy to swap tile sets if 
+needed.
+
+The map engine loads tiled .tmx map files. The properties of a tile, such as 
+solidity or animation are loaded from the Tiled file. Tiled has animated tiles 
+since tiled 0.10 so support those as well.
+
+
+Particle and effect engine
+--------------------------
+
+This module can display effects like rain, snow, blood, bursts. Explosions and spell 
+effects would be nice as well. Will use the camera for correct views. 
+allow bitmaps as well as drawing for the particles. Need to allow bitmap
+animations for certain effects.  
+
+
+Camera module
+-------------
+The camera module should model a camera, that is, a view of a
+rectangular area that can move in the “world” of the game and translate these
+world coordinates to screen coordinates. 
+
+
+Physics
+-------
+Finally got rid of Chipmunk. I was able to implement a useful system 
+that's simpler than chipmunk but that works well and doesn't require bazillions
+of static shapes for the tile map walls. Also need to implement battle related 
+area sensitivity.
+
++---------+
+| Modules |
++---------+
+
+According to the requirements, the following modules will be needed, each
+in one C file (although smaller modules may be joined tohgether into one c
+file if appropriate)
+
+camera.c  : Camera, active view of current area.
+bevec.c   : 2D vectors and points.
+bump.c    : Physics and collision detection.
+dynar.c   : Dynamic arrays.
+alps.c    : Graphical effects using particle engine and likewise.
+every.c   : Iterator for dunamic arrays, etc.
+toruby.c  : Functions that will be used in the ruby scripts
+glh.c     : OpenGL helper functionality.
+rh.c      : Ruby helpers.
+main.c    : Main function of program.
+mem.c     : Memory management and malloc wrappers.
+mobile.c  : Mobile entities 
+sound.c   : Sound and music helpers.
+state.c   : Program state, and also, high level functionality.
+tile.c    : Tile functionality.
+tilemap.c : Tile map functionality.
+tilepane.c: Tile Layer functionality.
+sprite.c  : Sprites on the tile map.
+mode.c    : Different game modes (menu, normal, ect)
+menumode.c: Menu mode
+playmode.c: Play mode
+openmode.c: Opening (intro) mode
+confmode.c: Configuration/settings mode.
+editmode.c: Edit mode for built in editor.
+goal.c    : Goal of motion of mobile or camera.
+player.c  : Player control and data.
+ncp.c     : Npc control and data.
+foe.c     : Foe control and data.
+switch.c  : Switches.
+treasure.c: Treasures.
+door.c    : Doors.
+obstacle.c: Obstacles, pushblocks, etc.
+route.c   : Path finding and planning.
+item.c    : Items player can have.
+gear.c    : Equippable items.
+useable.c : Useable items.
+being.c   : Logical and play-related information about beings.
+inmap.c   : Input mapping (links input to in-game action).
+ai.c      : AI for npc's and foes.
+saveload.c: Saving and loading state.
+initfile.c: Loading and saving settings.
+react.c   : Map events and NPC/Item/Foe reactions.
+world.c   : World state.
+ui.c      : UI.
+widget.c  : UI widget.
+wimenu.c  : UI menu widget.    
+wibox.c   : UI text box widget (more widgets needed).
+
+(Probably more...)
+
+Maybe     : 
+intmap.c  : Maps game objects to integers and vice versa for easy lua wrapping?
+
+47 modules/c files -> upper estimate 80 modules.
+80 * 1000lines per file (upper limit) = 80kloc.

+ 90 - 0
doc/TODO.md

@@ -0,0 +1,90 @@
++------+
+| TODO |
++------+
+
+(Todos marked with 1 are priority 1 for playability)
+
+o Physics:
+  1 Implement attacks for action based battle gaming.
+  * Implement interaction between players characters/NPC's/foes, etc.
+  * Implement sensors for AI and line of sight.
+  * Implement shallow and deep water.
+
+o Play
+  1 implement player and foe data such as HP, MP; LP, and stats.
+
+o GUI:
+  1 game HUD / current HP, MP and LP display 
+  * All sorts of widgets for status screens, menus, etc.
+  * Keyboard input.
+  * Joystick input.
+
+o Main:
+  * Configurable controls
+  * Loading and saving settings
+  * Loading and saving data
+
+o Tile map:
+  * Background images.
+  * Parallax.
+  * Object layers and scriptability.
+  * Transition from one map to another.
+  * Scripting.
+  * Background loading?
+
+o Sprites:
+  * Speed up loading a bit / background loading?
+
+o AI:
+  * Implement D* lite.
+  * Player char pathfinding.
+
+
+o Particle Engine Alps (Allegro Particle System)
+  * Damage display.
+  * Group for flexibility.
+  * Allow bitmaps as well as colors/shapes.
+  * Explosions.
+  * Spell effects.
+
+o Scripting:
+  * Wire it all up so game content becomes accessible in mruby.
+
+o AND MUCH MORE! ^_^;;;
+
+
+
++------+
+| DONE |
++------+
+
+o GUI:
+  * A 2D UI elements / drawing scene graph was implemented so the GUI can be
+    partially implemented in mruby.
+  * Some not too beautiful widgets for menu and dialogs were implemented.
+
+o Tile map:
+  * Static tilesets.
+  * Load tilemapeditor.org TMX maps.
+  * Tile map tile animations, also in TMX 0.10 style.
+  * Tile properties.
+  * Tile map layers.
+  * Tile flipping.
+  
+o Sprites:
+  * Loading.
+  * Coloring.
+  * Positioning.
+  * Shadows under the sprites.
+  * Attack animations and other one-shots now work.
+
+o Physics:
+  * Implemented stairs. Need to use stair and invisible support tiles in tile map.
+  * Bump based physics.
+  * Physical layers.
+
+o Asset loading:
+  * resor and store subsystems, both already scripted.
+
+o Engine: 
+  * Built-in own XML parser so no libxml2 dependency is needed anymore.