summaryrefslogtreecommitdiffhomepage
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/components/hitcircle.rb3
-rw-r--r--app/components/stats/collision_damage.rb2
-rw-r--r--app/components/stats/hp.rb2
-rw-r--r--app/components/teams/enemy_team.rb1
-rw-r--r--app/components/teams/player_team.rb1
-rw-r--r--app/factories/bullet.rb17
-rw-r--r--app/factories/ships/osprey.rb22
-rw-r--r--app/main.rb8
-rw-r--r--app/systems/collision_damage.rb14
-rw-r--r--app/systems/death.rb20
-rw-r--r--app/systems/start_game.rb15
-rw-r--r--app/tick.rb5
12 files changed, 97 insertions, 13 deletions
diff --git a/app/components/hitcircle.rb b/app/components/hitcircle.rb
new file mode 100644
index 0000000..7f60f01
--- /dev/null
+++ b/app/components/hitcircle.rb
@@ -0,0 +1,3 @@
+FF::Cmp.new('Hitcircle',
+ x: 0, y: 0,
+ r: 50)
diff --git a/app/components/stats/collision_damage.rb b/app/components/stats/collision_damage.rb
new file mode 100644
index 0000000..f915039
--- /dev/null
+++ b/app/components/stats/collision_damage.rb
@@ -0,0 +1,2 @@
+FF::Cmp.new('CollisionDamage',
+ damage: 10)
diff --git a/app/components/stats/hp.rb b/app/components/stats/hp.rb
new file mode 100644
index 0000000..1a6f996
--- /dev/null
+++ b/app/components/stats/hp.rb
@@ -0,0 +1,2 @@
+FF::Cmp.new('Hp',
+ health: 100)
diff --git a/app/components/teams/enemy_team.rb b/app/components/teams/enemy_team.rb
new file mode 100644
index 0000000..9d4e0d1
--- /dev/null
+++ b/app/components/teams/enemy_team.rb
@@ -0,0 +1 @@
+FF::Cmp.new('EnemyTeam')
diff --git a/app/components/teams/player_team.rb b/app/components/teams/player_team.rb
new file mode 100644
index 0000000..6e1b126
--- /dev/null
+++ b/app/components/teams/player_team.rb
@@ -0,0 +1 @@
+FF::Cmp.new('PlayerTeam')
diff --git a/app/factories/bullet.rb b/app/factories/bullet.rb
new file mode 100644
index 0000000..160613c
--- /dev/null
+++ b/app/factories/bullet.rb
@@ -0,0 +1,17 @@
+class Factory
+ class Bullet
+ def self.new(damage: 10, x:, y:)
+ puts 'new ent created'
+ sprite = FF::Cmp::Sprite.new
+ sprite.props[:path] = 'sprites/kenny/Tiles/tile_0000.png'
+ FF::Ent.new(
+ sprite,
+ FF::Cmp::Boid.new(x: x, y: y, vx: 10, w: 16, h: 16),
+ FF::Cmp::SingletonCamera[0],
+ FF::Cmp::Hitcircle.new(r: 10),
+ FF::Cmp::Hp.new(health: 1),
+ FF::Cmp::CollisionDamage.new(damage: damage),
+ )
+ end
+ end
+end
diff --git a/app/factories/ships/osprey.rb b/app/factories/ships/osprey.rb
new file mode 100644
index 0000000..1f57cb1
--- /dev/null
+++ b/app/factories/ships/osprey.rb
@@ -0,0 +1,22 @@
+class Factory
+ class Osprey
+ def self.new(x: x, y: y)
+ sprite = FF::Cmp::Sprite.new
+ sprite.props[:path] = 'sprites/kenny/Ships/Osprey.png'
+ FF::Ent.new(
+ FF::Cmp::Boid.new(x: x, y: y, vx: 25, vy: 25, w: 32, h: 32),
+ sprite,
+ FF::Cmp::BoidBounds.new(strength: 0.6),
+ FF::Cmp::BoidsAlignment.new(strength: 1),
+ FF::Cmp::BoidsSeparation.new(distance: 150, strength: 0.001),
+ FF::Cmp::BoidsCohesion.new(strength: 10000),
+ FF::Cmp::Hp.new(health: 100),
+ FF::Cmp::CollisionDamage.new(damage: 100),
+ FF::Cmp::Hitcircle.new(r: 12),
+ FF::Cmp::DebugVectorArrow[0],
+ FF::Cmp::SingletonCamera[0],
+ )
+ end
+ end
+end
+
diff --git a/app/main.rb b/app/main.rb
index 12cd6dd..f5cc908 100644
--- a/app/main.rb
+++ b/app/main.rb
@@ -13,6 +13,9 @@ require 'app/components/rules/separation.rb'
require 'app/components/rules/follow.rb'
require 'app/components/debug/debug_vector_arrow.rb'
require 'app/components/camera.rb'
+require 'app/components/stats/collision_damage.rb'
+require 'app/components/stats/hp.rb'
+require 'app/components/hitcircle.rb'
require 'app/systems/init_title_screen.rb'
require 'app/systems/title_screen.rb'
@@ -28,5 +31,10 @@ require 'app/systems/rules/reset_change_vector.rb'
require 'app/systems/rules/follow.rb'
require 'app/systems/debug/debug_render_vector_arrow.rb'
require 'app/systems/camera.rb'
+require 'app/systems/collision_damage.rb'
+require 'app/systems/death.rb'
+
+require 'app/factories/bullet.rb'
+require 'app/factories/ships/osprey.rb'
require 'app/tick.rb'
diff --git a/app/systems/collision_damage.rb b/app/systems/collision_damage.rb
new file mode 100644
index 0000000..9e47c0c
--- /dev/null
+++ b/app/systems/collision_damage.rb
@@ -0,0 +1,14 @@
+FF::Scn::BoidRules.add(
+ FF::Sys.new("CollisionDamage", priority: 65) do
+ FF::Cmp::Hitcircle.each do |hitcircle_self|
+ boid_self = hitcircle_self.entities[0].components[FF::Cmp::Boid][0]
+ FF::Cmp::Hitcircle.each do |hitcircle_target|
+ next if hitcircle_self == hitcircle_target
+ boid_target = hitcircle_target.entities[0].components[FF::Cmp::Boid][0]
+ if Math.sqrt(((boid_self.x - boid_target.x) ** 2) + ((boid_self.y - boid_target.y) ** 2)) < (hitcircle_target.r + hitcircle_self.r)
+ hitcircle_target.entities[0].components[FF::Cmp::Hp][0].health -= hitcircle_self.entities[0].components[FF::Cmp::CollisionDamage][0].damage
+ end
+ end
+ end
+ end
+)
diff --git a/app/systems/death.rb b/app/systems/death.rb
new file mode 100644
index 0000000..d9cd792
--- /dev/null
+++ b/app/systems/death.rb
@@ -0,0 +1,20 @@
+FF::Scn::BoidRules.add(
+ FF::Sys.new("Death", priority: 200) do
+ FF::Cmp::Hp.each do |hp|
+ if hp.health <= 0
+ component_hash = hp.entities[0].components.clone
+ component_hash.each_pair do |manager, manager_array|
+ next if manager.equal?(FF::Cmp::SingletonCamera)
+ next if manager.equal?(FF::Cmp::Hp)
+ next if manager.equal?(FF::Cmp::DebugVectorArrow)
+ manager_array.each do |component|
+ # unless singleton
+ component.delete
+ end
+ end
+ hp.entities[0].delete
+ hp.delete
+ end
+ end
+ end
+)
diff --git a/app/systems/start_game.rb b/app/systems/start_game.rb
index b71086e..39cc63c 100644
--- a/app/systems/start_game.rb
+++ b/app/systems/start_game.rb
@@ -17,19 +17,8 @@ FF::Sys.new('StartGame', priority: 50 ) do
]
position_range = (100..700).to_a
- 25.times do |pos|
- sprite = FF::Cmp::Sprite.new
- sprite.props[:path] = 'sprites/kenny/Ships/ship_0011.png'
- FF::Ent.new(
- FF::Cmp::Boid.new(x: position_range.sample, y: position_range.sample, vx: 25, vy: 25, w: sprite.props[:w], h: sprite.props[:h]),
- sprite,
- FF::Cmp::BoidBounds.new(strength: 1),
- FF::Cmp::BoidsAlignment.new(strength: 1),
- FF::Cmp::BoidsSeparation.new(distance: 150, strength: 0.01),
- FF::Cmp::BoidsCohesion.new(strength: 100),
- debug_arrow,
- FF::Cmp::SingletonCamera[0],
- )
+ 5.times do |pos|
+ Factory::Osprey.new(x: position_range.sample, y: position_range.sample)
end
sprite = FF::Cmp::Sprite.new
diff --git a/app/tick.rb b/app/tick.rb
index c8c8f83..1205fd6 100644
--- a/app/tick.rb
+++ b/app/tick.rb
@@ -10,6 +10,11 @@ def tick args
args.outputs.background_color = [0,0,0]
FelFlame::Stage.call
+ # Spawn Bullet
+ if args.inputs.keyboard.keys[:down].include?(:b)
+ Factory::Bullet.new(x: @camera.x, y: @camera.y)
+ end
+
# Moving Camera
if args.inputs.keyboard.keys[:down_or_held].include?(:d)
@camera.x += (Math.cos([email protected] * (Math::PI / 180.0)) * 5)