mission change + demo

This commit is contained in:
koneko 2024-10-07 20:37:09 +02:00
parent 464ca751a8
commit 32f615f5a9
3 changed files with 198 additions and 166 deletions

View File

@ -2,6 +2,8 @@
_The Watchers Lament_
[latest demo](https://youtu.be/x9l2zzIlhNE)
# Game description and functionality
Bastion is a Tower Defense type of game.
@ -58,6 +60,7 @@ The Mission screen has the following content:
## Game screen
Every game screen (Buy or Combat phase) has the following content:
- Game map
- Options button - Opens the Options panel
- Sidebar - Content changes based on the phase
@ -70,6 +73,7 @@ Example:
The map is covering the majority of the screen (80%). There is no zooming or panning. Depending on the map aspect ratio, the map may be cropped on the sides. The map is a grid where the player can place towers and through which the creeps will travel.
There are two types of ground on the map:
- Path - The path where the creeps will travel
- Buildable - The ground where the player can place towers
- Non-buildable - The ground where the player can not place towers
@ -117,6 +121,7 @@ _(razmisljam o tome da se gemovi na pocetku buy phasea moraju kupit i/ili mogu s
_(takodjer razmisljam da ima market tower koji se moze buildat)_
## Game screen - Combat phase
During this phase the player has no input (excep the Options menu) and the game is played 'automatically'.
At specific points in time the creeps will spawn at the entrance of the map and start moving towards the exit traversing the preset path.
If a tower has an ability to attack a creep it will do so automatically. Type of attack depends on the tower type and the Gems empowering it.
@ -125,6 +130,7 @@ Player may invoke the Options menu at any time during the combat phase. This wil
Combat phase will end when all creeps are dead / passed the exit or the player's HP reaches 0.
### Sidebar - Combat phase
In the combat phase the sidebar displays same information but it is disabled.
## Towers
@ -137,20 +143,25 @@ Towers on their own can not be upgraded, only the Gems that are empowering them
Not all towers can be empowered (via Gems) and they would serve more for utility purposes instead of attacking creeps.
### Tower effects
There are several possible tower effects which describe the general behavior of the tower:
#### Shooter
This is standard effect available to each tower.
It enables the tower to attack the creeps by shooting projectile(s) at them.
#### Trap
The tower places a trap on the ground which will deal damage to the creeps that pass over it.
The trap is placed in the range of the tower randomly
#### Necromancer tower
This tower spawns creeps which will attack the other creeps. The spawned creeps will have a limited lifespan and will die after a certain amount of time. When this anti-creep meets another creep then one of them will 'die' instantly depending on the their health.
### Shooting Tower
Basic tower that shoots 1 projectile at the closest creep.
- Damage: 1
@ -167,7 +178,9 @@ Basic tower that shoots 1 projectile at the closest creep.
### Chain tower [WIP]
### Damage types
We have several types of damage within the game:
- Physical (default damage type)
- Divine
- Fire
@ -184,6 +197,7 @@ Creeps may go through another creep if they are faster (they may overlap).
Creeps may have special attributes.
### Creep resistance and weaknesses
Creep may be resistant or weak to a specific type of damage.
For each creep there will be a percentage of damage reduction/increase for each damage type.
@ -218,6 +232,7 @@ Requires tower to be empowered with a divinity gem to deal damage, otherwise imm
- FrostFire: 100%
## Creep waves
Each round may have multiple waves of creeps.
Each wave may have different types of creeps and different amounts of creeps.
A new wave may start at any time, even if the previous wave is not finished.
@ -234,6 +249,7 @@ The player starts the game with 200 Gold and can not go below 0 Gold.
Gems are not a number resource like Gold is, rather you earn one of the possible Gems upon completing a round. They are placed in your Gem bag which is accessible via the sidebar.
Gem has the following properties:
- Name
- Color (used for visual representation)
- Description
@ -241,9 +257,10 @@ Gem has the following properties:
- Game effects (used for empowering towers)
- Level
#### Possible gem effects
Games can only be sloted in towers. When slotted the gem may provide following effects for that tower:
- Increase damage
- Change the damage type
- Increase attack speed
@ -252,10 +269,12 @@ Games can only be sloted in towers. When slotted the gem may provide following e
- Increase number of projectiles
#### Gem level
Gem level is a number from 1 to 5. Each level of a Gem enhances the effect of the Gem. The higher the level the more powerful the Gem is.
The actual effect of the level depends on the Gem type.
#### Gem types
Currently there are 6 Gems:
1. Fire Gem (#FF0000) (fire)
@ -294,6 +313,7 @@ If the player loses the game, the score is always 0.
# Data structures and algorithms
## Mission definition
- Name
- Description
- Map image
@ -302,20 +322,24 @@ If the player loses the game, the score is always 0.
- Array of Gem definitions (random type given to player at mission start)
### Game map definition
- Grid size (width, height)
- 2d array of terrain types (Path, Buildable, Non-buildable)
- Array of paths (array of rows and column which represent the path, first cell is the entrance, last cell is the exit)
### Mission round definition
- Array of waves
- Array of Gem types (which the player can get at the end of the round - only 1 picked out of 3)
### Wave definition
- Tick when first creep is generated (calculated once all creeps of the previous wave are generated)
- Ticks between creeps
- Array of creep definitions (identified by creep definition name) together with number of creeps per type
## Mission instance
- Mission definition
- Current round index
- Array of waves
@ -327,16 +351,19 @@ If the player loses the game, the score is always 0.
- Current tick
## Game map instance
- Game map definition
- Array of tower instances
- Array of creep instances
- Array of fired bullets
## Wave instance
- Wave definition
- Array of creeps left to be generated (once the array is empty the wave is finished)
## Tower definition
- Name
- Cost (Gold amount)
- Gem slot count (0 if not empowerable)
@ -348,8 +375,8 @@ If the player loses the game, the score is always 0.
- Array of initial tower effects (enumeration)
- Array of allowed Gem types (enumeration)
## Tower instance
- Tower definition
- Grid row and column (position on the map)
- Gems (array of Gems)
@ -360,6 +387,7 @@ If the player loses the game, the score is always 0.
- Array of tower effects (enumeration)
## Trap instance
- Position (x, y in Grid units)
- Damage type
- Damage amount
@ -368,6 +396,7 @@ If the player loses the game, the score is always 0.
- Image (sprite)
## Bullet instance
- Current position (x, y in Grid units)
- Target position (x, y in Grid units)
- Damage type
@ -375,6 +404,7 @@ If the player loses the game, the score is always 0.
- Image (sprite)
## Creep definition
- Name
- Maximum HP
- Speed
@ -383,6 +413,7 @@ If the player loses the game, the score is always 0.
- Special attributes (hardcoded attribute types)
## Creep instance
- Creep definition
- Current position (x, y in Grid units)
- Current HP (also represents damage dealt to player if reaches exit and damage dealt to other creeps if it is an anti-creep)
@ -391,6 +422,7 @@ If the player loses the game, the score is always 0.
- Anti-creep damage type (if anti-creep)
# Future work
- Add leaderboard functionality to [Mission screen]
- Ability to restart at the current round of the mission [Options panel]
- When in combat phase the 'Go' button should be replaced with 'Speed up' toggle button [Sidebar - Combat phase]

View File

@ -3,29 +3,29 @@
"description": "This is the first mission",
"gameMap": {
"rows": 15,
"columns": 15,
"columns": 20,
"cells": [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
],
"paths": [
[

BIN
public/maps/mission_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB