﻿Tony "picano" Ianacone
******
*Note*
******
I take pride in my bombing. This was a class project and is somewhat incomplete.
I... don't have the time to work on it, so... the AI is non-existent. You do have
the option to play against a friend (single keyboard) or chase down the random
cpus.
**********
*Overview*
**********
This game is a rough mixture of the styles of Bomberman 64 and the classic Bomberman games.
The goal of the game is to eliminate the enemies / opposing bombermen by either blowing them
up with your own bombs or by tricking them into killing themselves. Bombs explode in the four primary directions,
unless obstructed by an impassable object.

Character movement is 2D and only within the four primary directions. Do note that, in accordance
with classic 2D Bomberman game play, all objects have simple square hit boxes. (This game is
played at a 25 degree orthogonal camera, all bounding boxes and movement has been adjusted accordingly)
Also note that, as with the classic games, a sort of 'soft cornering' feature has been included to
make movement within the confined spaces easier.

While characters can freely move along the open spaces on the field, bombs and explosions are
tied to the grid. Dropped and or kicked bombs will always land precisely on a tile and as such,
their resulting explosions will too.

All bombermen start out with the same attributes:
-Fire +1
-Bomb +2 
-Speed +11
All bomberman max out their stats at:
-Fire +20
-Bomb +9
-Speed +20
All bombermen may have their stats reduced to the following minimums:
-Fire +1
-Bomb +1
-Speed +1 (This also serves as the speed at which a bomber will 'soft corner')

The fire attribute will affect all active bombs of that bomber. (Ex: Start with +1,
place a bomb, and then get 3 fire panels; the explosion will be +4)

As is, all AI bomberman are stupid and will run around randomly without attacking.
The red bomber is a bit of an oddity, he has the ability to destroy soft blocks within
a short proximity, making attacking him a bit harder.
**********
*Controls*
**********
	Menu
		1
			1P mode
		2
			2P mode
	1P Mode
		Up, Down, Left, Right
			Movement
		Space
			Drop / kick bomb
	2P Mode
		W, A, S, D
			1P Movement
		Tab
			1P Drop / kick bomb
		Up, Down, Left, Right
			2P Movement
		Numpad 0
			2P Drop / kick bomb
**********
*Graphics*
**********
	All sprites, background images, and model work have been created by me.
	
	Field color scheme is randomly chosens out of a preset 4.
*******
*Sound*
*******
Dead, Drop, Explosion, Item, Kick
	Bomberman 64 2nd Attack
	Ripped via Project 64
Sub Boss (battle music)
	Bomberman 64
	Found at: http://www.youtube.com/watch?v=9SSUQARuSBc&feature=BFa&list=PL6CD1A92B9852311E&lf=results_main
******
*Code*
******
(Excuse the mess, even planning ahead... I always end up changing my mind)

Game1
	Standard game class, nothing too special.

items
	Enumerator for item types

direction
	Enumerator for directions

controllertype
	Enumerator for human player # or AI type

mode
	Enumerator for current game state (menu, 1p, 2p, etc)

Sprites.Manager
	Initialize(), LoadContent(), Update(), Draw()
		Standard game component functions
	ClearAllSprites()
		Empty the screen of all current sprites.
	AddSprite(), RemoveSprite()
		Add or remove sprites to the drawing list. Never called directly.
		Accepts a sprite
	AddSoftSprite(), RemoveSoftSprite()
		Add or remove sprites to the hard collision list. Calls the respective base function.
		AddHardSprite(), RemoveHardSprite()
		Add or remove sprites to the soft collision list. Calls the respective base function.
		Accepts a sprite
	SoftCollision(), HardCollision()
		Tests collisions with the respective list and returns the collision sprite or null.
		Accepts a sprite and an optional sprite to ignore
		returns the first collision sprite object
	LoadMenu()
		Loads a menu screen.
	LoadGame()
		Makes all the calls to start a new game
		Accepts an integer for number of players
	LoadShuroBon(), LoadAkaBon(), LoadKuroBon, LoadAoBon()
		Load the respective bomber.
	LoadField()
		Initializes the battle field.
	ModeManager()
		Determines which game mode or menu mode is active.
		
Sprites.Sprite()
	A very basic sprite class upon which the others are based.
	Update()
		Update of a sprites status, calls upon move
	Draw()
		Drawing of the sprite
	Move()
		Moves the sprite
	Destroy()
		Remove all references to the sprite, may trigger sound
		
Sprites.AniSets()
	A special class serving as a collection of animation details. This is used in
	cases where multiple sprite sets are necessary. (Ex: ShiroBon Wait and Walk)
	
Sprites.Bomb
	Simple bomb sprite class. Only special concerns are the variables used to keep
	track of when it should explode.
	Kicked()
		Moves the bomb in the specified direction.
	Stopped()
		Stops the bomb and fixes its position to a tile.
	
Sprites.ItemPanel
	Simple item panel sprite class. Only special concerns are the variables used to
	determine what type of item it is.
	
Sprites.Explosion
	Simple explosion sprite class. Only special concerns are the variables used to
	determine when it will be rendered harmless.
	RecursiveExplosion()
		Function to recursively spawn the plus pattern explosive bits.
		Accepts an int for blast level and a direction
		
Sprites.Block
	Simple block sprite class. Only special concerns are the variables used to determine
	the type of block.
	
Sprites.Bomber
	Complex bomber sprite class. Includes many variables to determine the bomber's current
	atrributes.
	switchAnimation()
		Using Sprites.AniSets, this changes between multiple animation sheets.
	Walk()
		Handling of movement, includes soft cornering.
		Accepts a hard collision reference
	Powerups()
		Handling of item pickup.
		Accepts a soft collision reference
	DropOrKickBomb()
		Drops a bomb, or attempts to kick.
	KickBomb()
		Kicks a bomb.
		Accepts both types of colliders and a time object (to set explosion end time)
	Cheats()
		Debug feature, uses top row number keys to spawn item panels directly below the bomber.

Sprites.Simple
	A very stripped down sprite type used for menu screens

Sprites.BomberController
	Control / AI handling for the bombers.
	userGetKeys()
		Get controls for P1
		Accepts a reference to and old and new keyboard state
	guardianGetKeys()
		Get controls for P2
		Accepts a reference to and old and new keyboard state
	binomeGetKeys()
		Get stupid, defenseless AI (which... has killed me)
		Accepts a reference to and old and new keyboard state
	virusGetKeys()
		Roughly the same as above.
		Accepts a reference to and old and new keyboard state
	binomeTestSurroundings()
		Test surroundings for movement possibilities.
	virusTestSurroundings()
		Same as above, but can destroy item-blocks by sight.
	removeCurrentDirection()
		Helper function for ___TestSurroundings.
		Accepts a direction
	
