summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--app/components/debug/singleton_debug_vector_arrow.rb1
-rw-r--r--app/components/singleton_ai_timer.rb5
-rw-r--r--app/components/singleton_move_camera.rb3
-rw-r--r--app/components/singleton_random_ai_pick.rb2
-rw-r--r--app/factories/ships/osprey.rb34
-rw-r--r--app/factories/ships/sample_enemy.rb48
-rw-r--r--app/main.rb10
-rw-r--r--app/scenes/scenes.rb4
-rw-r--r--app/systems/ai/randomize_ai.rb34
-rw-r--r--app/systems/ai/rejoin.rb14
-rw-r--r--app/systems/ai/scatter.rb15
-rw-r--r--app/systems/ai/target_player.rb8
-rw-r--r--app/systems/collision_damage.rb4
-rw-r--r--app/systems/death.rb8
-rw-r--r--app/systems/end_game.rb39
-rw-r--r--app/systems/init_title_screen.rb46
-rw-r--r--app/systems/move_camera.rb10
-rw-r--r--app/systems/player_weapon.rb18
-rw-r--r--app/systems/rules/follow.rb27
-rw-r--r--app/systems/start_game.rb24
-rw-r--r--app/systems/title_screen.rb26
-rw-r--r--app/systems/ui/button.rb26
-rw-r--r--app/systems/ui/return_to_menu.rb13
-rw-r--r--app/tick.rb21
-rw-r--r--sprites/title/gameover.pngbin0 -> 3260 bytes
-rw-r--r--sprites/title/overlay.pngbin0 -> 565 bytes
-rw-r--r--sprites/title/return.pngbin0 -> 9114 bytes
-rw-r--r--sprites/title/return_pressed.pngbin0 -> 8814 bytes
28 files changed, 286 insertions, 154 deletions
diff --git a/app/components/debug/singleton_debug_vector_arrow.rb b/app/components/debug/singleton_debug_vector_arrow.rb
index f06cd27..d6d6de9 100644
--- a/app/components/debug/singleton_debug_vector_arrow.rb
+++ b/app/components/debug/singleton_debug_vector_arrow.rb
@@ -1,3 +1,4 @@
FF::Cmp.new('SingletonDebugVectorArrow',
singleton: true,
length: 1)
+FF::Cmp::SingletonDebugVectorArrow.new(length: 5)
diff --git a/app/components/singleton_ai_timer.rb b/app/components/singleton_ai_timer.rb
new file mode 100644
index 0000000..ce14380
--- /dev/null
+++ b/app/components/singleton_ai_timer.rb
@@ -0,0 +1,5 @@
+FF::Cmp.new('SingletonAITimer',
+ timer: 0,
+ interval: 200,
+ singleton: true)
+FF::Cmp::SingletonAITimer.new
diff --git a/app/components/singleton_move_camera.rb b/app/components/singleton_move_camera.rb
new file mode 100644
index 0000000..88cd8e1
--- /dev/null
+++ b/app/components/singleton_move_camera.rb
@@ -0,0 +1,3 @@
+FF::Cmp.new('SingletonMoveCamera', singleton: true)
+
+FF::Cmp::SingletonMoveCamera.new
diff --git a/app/components/singleton_random_ai_pick.rb b/app/components/singleton_random_ai_pick.rb
new file mode 100644
index 0000000..19f2ca8
--- /dev/null
+++ b/app/components/singleton_random_ai_pick.rb
@@ -0,0 +1,2 @@
+FF::Cmp.new('SingletonRandomAIPick', singleton: true)
+FF::Cmp::SingletonRandomAIPick.new
diff --git a/app/factories/ships/osprey.rb b/app/factories/ships/osprey.rb
deleted file mode 100644
index e371e60..0000000
--- a/app/factories/ships/osprey.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-class Factory
- class Osprey
- def self.new(x: x, y: y)
- sprite = FF::Cmp::Sprite.new
- sprite.props[:path] = [
- 'sprites/kenny/Ships/WeebillGrey.png',
- 'sprites/kenny/Ships/BuntingGrey.png',
- 'sprites/kenny/Ships/NighthawkGrey.png',
- 'sprites/kenny/Ships/MagpieGrey.png',
- 'sprites/kenny/Ships/WaxwingGrey.png',
- 'sprites/kenny/Ships/LongspurGrey.png',
- 'sprites/kenny/Ships/WarblerGrey.png',
- 'sprites/kenny/Ships/NutcrackerGrey.png',
- ].sample
- FF::Ent.new(
- FF::Cmp::Boid.new(x: x, y: y, vx: -3, vy: -3, w: 32, h: 32),
- sprite,
- FF::Cmp::BoidBounds.new(strength: 0.6),
- FF::Cmp::BoidsAlignment.new(strength: 10),
- FF::Cmp::BoidsSeparation.new(distance: 150, strength: 0.001),
- FF::Cmp::BoidsCohesion.new(strength: 1000),
- FF::Cmp::Hp.new(health: 100),
- FF::Cmp::CollisionDamage.new(damage: 100),
- FF::Cmp::Hitcircle.new(r: 12),
- FF::Cmp::BoidMinimumSpeed.new(speed: 3),
- FF::Cmp::DecaySpeed.new(strength: 0.9),
- FF::Cmp::Team.new,
- #FF::Cmp::SingletonDebugVectorArrow[0],
- FF::Cmp::SingletonCamera[0],
- )
- end
- end
-end
-
diff --git a/app/factories/ships/sample_enemy.rb b/app/factories/ships/sample_enemy.rb
new file mode 100644
index 0000000..a2a3a21
--- /dev/null
+++ b/app/factories/ships/sample_enemy.rb
@@ -0,0 +1,48 @@
+class Factory
+ class SampleEnemy
+ def self.defaults
+ @defaults ||= {
+ boid_bounds_strength: 0.6,
+ boids_alignment_strength: 0.005,
+ boids_seperation_strength: 0.005,
+ boids_seperation_distance: 50,
+ boids_cohesion_strength: 0.003,
+ hp_health: 100,
+ collision_damage_damage: 100,
+ hitcircle_r: 12,
+ boid_minimum_speed_speed: 5,
+ decay_speed_multiplier: 0.9,
+ }
+ end
+ def self.new(x: 0, y: 0, vx: -3, vy: -3)
+ sprite = FF::Cmp::Sprite.new
+ sprite.props[:path] = [
+ 'sprites/kenny/Ships/WeebillGrey.png',
+ 'sprites/kenny/Ships/BuntingGrey.png',
+ 'sprites/kenny/Ships/NighthawkGrey.png',
+ 'sprites/kenny/Ships/MagpieGrey.png',
+ 'sprites/kenny/Ships/WaxwingGrey.png',
+ 'sprites/kenny/Ships/LongspurGrey.png',
+ 'sprites/kenny/Ships/WarblerGrey.png',
+ 'sprites/kenny/Ships/NutcrackerGrey.png',
+ ].sample
+ FF::Ent.new(
+ FF::Cmp::Boid.new(x: x, y: y, vx: vx, vy: vy, w: 32, h: 32),
+ sprite,
+ FF::Cmp::BoidBounds.new(strength: self.defaults[:boid_bounds_strength]),
+ FF::Cmp::BoidsAlignment.new(strength: self.defaults[:boids_alignment_strength]),
+ FF::Cmp::BoidsSeparation.new(distance: self.defaults[:boids_seperation_distance], strength: self.defaults[:boids_seperation_strength]),
+ FF::Cmp::BoidsCohesion.new(strength: self.defaults[:boids_cohesion_strength]),
+ FF::Cmp::Hp.new(health: self.defaults[:hp_health]),
+ FF::Cmp::CollisionDamage.new(damage: self.defaults[:collision_damage_damage]),
+ FF::Cmp::Hitcircle.new(r: self.defaults[:hitcircle_r]),
+ FF::Cmp::BoidMinimumSpeed.new(speed: self.defaults[:boid_minimum_speed_speed]),
+ FF::Cmp::DecaySpeed.new(strength: self.defaults[:decay_speed_multiplier]),
+ FF::Cmp::Team.new,
+ FF::Cmp::SingletonDebugVectorArrow[0],
+ FF::Cmp::SingletonCamera[0],
+ )
+ end
+ end
+end
+
diff --git a/app/main.rb b/app/main.rb
index 234143b..5f59b42 100644
--- a/app/main.rb
+++ b/app/main.rb
@@ -17,6 +17,7 @@ require 'app/components/rules/minimum_speed.rb'
require 'app/components/rules/decay_speed.rb'
require 'app/components/debug/singleton_debug_vector_arrow.rb'
require 'app/components/singleton_camera.rb'
+require 'app/components/singleton_move_camera.rb'
require 'app/components/singleton_bullet.rb'
require 'app/components/stats/collision_damage.rb'
require 'app/components/stats/hp.rb'
@@ -26,11 +27,15 @@ require 'app/components/teams/singleton_enemy_team.rb'
require 'app/components/weapon.rb'
require 'app/components/teams/team.rb'
require 'app/components/singleton_title.rb'
+require 'app/components/singleton_ai_timer.rb'
+require 'app/components/singleton_random_ai_pick.rb'
require 'app/systems/init_title_screen.rb'
-require 'app/systems/title_screen.rb'
+require 'app/systems/ui/button.rb'
+require 'app/systems/ui/return_to_menu.rb'
require 'app/systems/start_game.rb'
+require 'app/systems/end_game.rb'
require 'app/systems/render.rb'
require 'app/systems/update_boid_sprite.rb'
require 'app/systems/update_boid_position.rb'
@@ -52,8 +57,9 @@ require 'app/systems/cleanup_bullets.rb'
require 'app/systems/ai/scatter.rb'
require 'app/systems/ai/rejoin.rb'
require 'app/systems/ai/target_player.rb'
+require 'app/systems/ai/randomize_ai.rb'
require 'app/factories/bullet.rb'
-require 'app/factories/ships/osprey.rb'
+require 'app/factories/ships/sample_enemy.rb'
require 'app/tick.rb'
diff --git a/app/scenes/scenes.rb b/app/scenes/scenes.rb
index 3d11802..f0cdf17 100644
--- a/app/scenes/scenes.rb
+++ b/app/scenes/scenes.rb
@@ -1,8 +1,8 @@
FF::Scn.new('BoidRules')
-FF::Scn.new('Debug')
FF::Scn.new('Camera')
FF::Scn.new('Cleanup')
FF::Stg.add(
- FF::Scn.new('TitleScreen'),
+ FF::Scn.new('UI'),
FF::Scn.new('Render'),
+ FF::Scn.new('Debug')
)
diff --git a/app/systems/ai/randomize_ai.rb b/app/systems/ai/randomize_ai.rb
new file mode 100644
index 0000000..f272181
--- /dev/null
+++ b/app/systems/ai/randomize_ai.rb
@@ -0,0 +1,34 @@
+FF::Scn::BoidRules.add(
+ FF::Sys.new('RandomizeAI', priority: 50) do
+ timer = FF::Cmp::SingletonAITimer[0]
+ timer.timer += 1
+ if timer.timer > timer.interval
+ random_ai_pick = FF::Cmp::SingletonRandomAIPick[0]
+ random_ai_pick.entities.reverse_each do |entity|
+ entity.remove random_ai_pick
+ #puts 'remove pick'
+ end
+ FF::Cmp::BoidsSeparation.each do |sep|
+ if rand < 0.3
+ sep.entities[0].add random_ai_pick
+ #puts 'pick'
+ end
+ end
+ x = rand 3
+ if x == 0
+ FF::Sys::Scatter.call
+ #puts 'scatter'
+ elsif x == 1
+ FF::Sys::Rejoin.call
+ #puts 'rejoin'
+ elsif x == 2
+ FF::Sys::TargetPlayer.call
+ #puts 'target'
+ end
+ #timer.interval = (300..1200).to_a.sample
+ timer.interval = 60
+ #puts timer.interval
+ timer.timer = 0
+ end
+ end
+)
diff --git a/app/systems/ai/rejoin.rb b/app/systems/ai/rejoin.rb
index 606a0be..9e06eb7 100644
--- a/app/systems/ai/rejoin.rb
+++ b/app/systems/ai/rejoin.rb
@@ -1,14 +1,14 @@
FF::Sys.new("Rejoin", priority: 40) do
- FF::Cmp::BoidsSeparation.each do |sep|
- #puts 'add align/cohesion'.upcase
- sep.distance = 150
- alignment_mgr = sep.entities[0].components[FF::Cmp::BoidsAlignment]
- cohesion_mgr = sep.entities[0].components[FF::Cmp::BoidsCohesion]
+ FF::Cmp::SingletonRandomAIPick[0].entities.each do |entity|
+ sep = entity.components[FF::Cmp::BoidsSeparation][0]
+ sep.distance = Factory::SampleEnemy.defaults[:boids_seperation_distance]
+ alignment_mgr = entity.components[FF::Cmp::BoidsAlignment]
+ cohesion_mgr = entity.components[FF::Cmp::BoidsCohesion]
if alignment_mgr.nil? || alignment_mgr.empty?
- sep.entities[0].add FF::Cmp::BoidsAlignment.new(strength: 10)
+ entity.add FF::Cmp::BoidsAlignment.new(strength: Factory::SampleEnemy.defaults[:boids_alignment_strength])
end
if cohesion_mgr.nil? || cohesion_mgr.empty?
- sep.entities[0].add FF::Cmp::BoidsCohesion.new(strength: 1000)
+ entity.add FF::Cmp::BoidsCohesion.new(strength: Factory::SampleEnemy.defaults[:boids_cohesion_strength])
end
end
end
diff --git a/app/systems/ai/scatter.rb b/app/systems/ai/scatter.rb
index 1469fd9..82bcb65 100644
--- a/app/systems/ai/scatter.rb
+++ b/app/systems/ai/scatter.rb
@@ -1,10 +1,15 @@
FF::Sys.new("Scatter", priority: 40) do
- FF::Cmp::BoidsSeparation.each do |sep|
- sep.distance = 200
+ FF::Cmp::SingletonRandomAIPick[0].entities.each do |entity|
+ sep = entity.components[FF::Cmp::BoidsSeparation][0]
+ # I did times 3 becase then it will always be greater then
+ # what it was before and that means it will force a
+ # seperation to happen even if the default value is
+ # changed and you forget to update this number here
+ sep.distance = Factory::SampleEnemy.defaults[:boids_seperation_distance] * 3
#puts 'remove align/cohesion/follow'.upcase
- alignment_mgr = sep.entities[0].components[FF::Cmp::BoidsAlignment]
- cohesion_mgr = sep.entities[0].components[FF::Cmp::BoidsCohesion]
- follow_mgr = sep.entities[0].components[FF::Cmp::Follow]
+ alignment_mgr = entity.components[FF::Cmp::BoidsAlignment]
+ cohesion_mgr = entity.components[FF::Cmp::BoidsCohesion]
+ follow_mgr = entity.components[FF::Cmp::Follow]
unless follow_mgr.nil? || follow_mgr.empty?
follow_mgr[0].delete
end
diff --git a/app/systems/ai/target_player.rb b/app/systems/ai/target_player.rb
index 8e715eb..1e4a3ea 100644
--- a/app/systems/ai/target_player.rb
+++ b/app/systems/ai/target_player.rb
@@ -1,11 +1,11 @@
FF::Sys.new("TargetPlayer", priority: 40) do
- FF::Cmp::BoidsSeparation.each do |sep|
- #puts 'target player'.upcase
+ FF::Cmp::SingletonRandomAIPick[0].entities.each do |entity|
+ sep = entity.components[FF::Cmp::BoidsSeparation][0]
sep.distance = 200
- follow_mgr = sep.entities[0].components[FF::Cmp::Follow]
+ follow_mgr = entity.components[FF::Cmp::Follow]
player_boid = FF::Cmp::SingletonPlayer[0].entities[0].components[FF::Cmp::Boid][0]
if follow_mgr.nil? || follow_mgr.empty?
- sep.entities[0].add FF::Cmp::Follow.new(target: player_boid, strength: 500)
+ entity.add FF::Cmp::Follow.new(target: player_boid, strength: 1.2)
end
end
end
diff --git a/app/systems/collision_damage.rb b/app/systems/collision_damage.rb
index 7aba563..cc052bd 100644
--- a/app/systems/collision_damage.rb
+++ b/app/systems/collision_damage.rb
@@ -8,6 +8,10 @@ FF::Scn::BoidRules.add(
#puts 'passed first check'
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)
+ puts 'checks here'.upcase
+ puts 'hp dont exist' if hitcircle_target.entities[0].components[FF::Cmp::Hp].nil?
+ puts 'collision damage dont exist' if hitcircle_target.entities[0].components[FF::Cmp::CollisionDamage].nil?
+ puts 'checks end'.upcase
hitcircle_target.entities[0].components[FF::Cmp::Hp][0].health -= hitcircle_self.entities[0].components[FF::Cmp::CollisionDamage][0].damage
end
end
diff --git a/app/systems/death.rb b/app/systems/death.rb
index 7c10212..edeb493 100644
--- a/app/systems/death.rb
+++ b/app/systems/death.rb
@@ -2,10 +2,12 @@ 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|
+ hp.entities[0].components.each do |manager, manager_array|
+ if manager.equal?(FF::Cmp::SingletonPlayer)
+ FF::Sys::EndGame.call
+ end
next if manager.equal?(FF::Cmp::Hp)
- manager_array.each do |component|
+ manager_array.reverse_each do |component|
next if component.respond_to?(:singleton)
component.delete
end
diff --git a/app/systems/end_game.rb b/app/systems/end_game.rb
new file mode 100644
index 0000000..4fa0b36
--- /dev/null
+++ b/app/systems/end_game.rb
@@ -0,0 +1,39 @@
+FF::Sys.new('EndGame', priority: 50) do
+ FF::Scn::BoidRules.remove(FF::Sys::Follow, FF::Sys::RandomizeAI)
+ overlay_sprite = FF::Cmp::Sprite.new
+ overlay_sprite.props.merge!({
+ x: 0,
+ y: 0,
+ w: $gtk.args.grid.w,
+ h: $gtk.args.grid.h,
+ path: 'sprites/title/overlay.png'
+ })
+ gameover_sprite = FF::Cmp::Sprite.new
+ gameover_sprite.props.merge!({
+ x: 1280/2 - 643/2,
+ y: 500,
+ w: 643,
+ h: 76,
+ path: 'sprites/title/gameover.png'
+ })
+ btn_w = 190
+ btn_h = 49
+ btn_x = 1280/2 - btn_w/2
+ btn_y = 200
+ btn_sprite = FF::Cmp::Sprite.new
+ btn_sprite.props.merge!({
+ x: btn_x,
+ y: btn_y,
+ w: btn_w,
+ h: btn_h,
+ })
+ FF::Ent.new(
+ overlay_sprite,
+ gameover_sprite,
+ )
+ FF::Ent.new(
+ FF::Cmp::Button.new(action: FF::Sys::ReturnToMenu, pressed_sprite_path: 'sprites/title/return_pressed.png', unpressed_sprite_path: 'sprites/title/return.png'),
+ FF::Cmp::Hitbox.new(x: btn_x, y: btn_y, w: btn_w, h: btn_h),
+ btn_sprite,
+ )
+end
diff --git a/app/systems/init_title_screen.rb b/app/systems/init_title_screen.rb
index 7f966c2..5ec56a8 100644
--- a/app/systems/init_title_screen.rb
+++ b/app/systems/init_title_screen.rb
@@ -1,26 +1,36 @@
FF::Sys.new('InitTitleScreen', priority: 1) do
+ FF::Stg.remove(
+ FF::Scn::BoidRules,
+ FF::Scn::Camera,
+ FF::Scn::Cleanup,
+ )
+ bg_sprite = FF::Cmp::Sprite.new
+ bg_sprite.props.merge!({
+ x: 0,
+ y: 0,
+ w: 1280,
+ h: 720,
+ path: 'sprites/title/titlebackground.png'
+ })
+ title_sprite = FF::Cmp::Sprite.new
+ title_sprite.props.merge!({
+ x: 1280/2 - 993/2,
+ y: 500,
+ w: 993,
+ h: 89,
+ path: 'sprites/title/title.png'
+ })
+ btn_sprite = FF::Cmp::Sprite.new
btn_w = 190
btn_h = 49
btn_x = 1280/2 - btn_w/2
btn_y = 200
-
- bg_sprite = FF::Cmp::Sprite.new
- title_sprite = FF::Cmp::Sprite.new
- btn_sprite = FF::Cmp::Sprite.new
- title_sprite.props[:x] = 1280/2 - 993/2
- title_sprite.props[:y] = 500
- title_sprite.props[:w] = 993
- title_sprite.props[:h] = 89
- title_sprite.props[:path] = 'sprites/title/title.png'
- bg_sprite.props[:x] = 0
- bg_sprite.props[:y] = 0
- bg_sprite.props[:w] = 1280
- bg_sprite.props[:h] = 720
- bg_sprite.props[:path] = 'sprites/title/titlebackground.png'
- btn_sprite.props[:x] = btn_x
- btn_sprite.props[:y] = btn_y
- btn_sprite.props[:w] = btn_w
- btn_sprite.props[:h] = btn_h
+ btn_sprite.props.merge!({
+ x: btn_x,
+ y: btn_y,
+ w: btn_w,
+ h: btn_h,
+ })
FF::Ent.new(
bg_sprite,
FF::Cmp::SingletonTitle[0]
diff --git a/app/systems/move_camera.rb b/app/systems/move_camera.rb
index 939ce56..fc22475 100644
--- a/app/systems/move_camera.rb
+++ b/app/systems/move_camera.rb
@@ -1,9 +1,11 @@
FF::Scn::Camera.add(
FF::Sys.new('MoveCamera', priority: 100) do
- camera = FF::Cmp::SingletonCamera[0]
- player_boid = FF::Cmp::SingletonPlayer[0].entities[0].components[FF::Cmp::Boid][0]
- camera.x = player_boid.x
- camera.y = player_boid.y
+ unless FF::Cmp::SingletonPlayer[0].entities[0].nil?
+ camera = FF::Cmp::SingletonCamera[0]
+ player_boid = FF::Cmp::SingletonPlayer[0].entities[0].components[FF::Cmp::Boid][0]
+ camera.x = player_boid.x
+ camera.y = player_boid.y
+ end
#mouse = $gtk.args.inputs.mouse
#camera_pos = [0,0]
#
diff --git a/app/systems/player_weapon.rb b/app/systems/player_weapon.rb
index 02a50ec..2ecd250 100644
--- a/app/systems/player_weapon.rb
+++ b/app/systems/player_weapon.rb
@@ -2,14 +2,16 @@ FF::Scn::BoidRules.add(
FF::Sys.new('PlayerWeapon') do
if $gtk.args.inputs.mouse.down
player = FF::Cmp::SingletonPlayer[0].entities[0]
- boid = player.components[FF::Cmp::Boid][0]
- weapon = player.components[FF::Cmp::Weapon][0]
- if player.components[FF::Cmp::Weapon][0].cooldown <= 0
- # spawn bullet facing correct angle
- mag = Math.sqrt((boid.vx ** 2) + (boid.vy ** 2))
- bullet = Factory::Bullet.new(damage: weapon.damage, vx: (boid.vx/mag) * weapon.speed, vy: (boid.vy/mag) * weapon.speed, x: boid.x, y: boid.y)
- bullet.remove(bullet.components[FF::Cmp::Team][0])
- bullet.add(FF::Cmp::Team.new(team: 'player'))
+ unless player.nil?
+ boid = player.components[FF::Cmp::Boid][0]
+ weapon = player.components[FF::Cmp::Weapon][0]
+ if player.components[FF::Cmp::Weapon][0].cooldown <= 0
+ # spawn bullet facing correct angle
+ mag = Math.sqrt((boid.vx ** 2) + (boid.vy ** 2))
+ bullet = Factory::Bullet.new(damage: weapon.damage, vx: (boid.vx/mag) * weapon.speed, vy: (boid.vy/mag) * weapon.speed, x: boid.x, y: boid.y)
+ bullet.remove(bullet.components[FF::Cmp::Team][0])
+ bullet.add(FF::Cmp::Team.new(team: 'player'))
+ end
end
end
end
diff --git a/app/systems/rules/follow.rb b/app/systems/rules/follow.rb
index abaabd7..47835f2 100644
--- a/app/systems/rules/follow.rb
+++ b/app/systems/rules/follow.rb
@@ -5,11 +5,19 @@ FF::Scn::BoidRules.add(
target_coords = [0.0, 0.0]
case follow.target
when FF::Cmp::Boid
- target_coords[0] = follow.target.x
- target_coords[1] = follow.target.y
+ mag = Helpers::Vectors.magnitude(follow.target.x,
+ follow.target.y,
+ boid.x,
+ boid.y)
+ target_coords[0] = (follow.target.x - boid.x) / mag
+ target_coords[1] = (follow.target.y - boid.y) / mag
when Array
- target_coords[0] = follow.target[0]
- target_coords[1] = follow.target[1]
+ mag = Helpers::Vectors.magnitude(follow.target[0],
+ follow.target[1],
+ boid.x,
+ boid.y)
+ target_coords[0] = (follow.target[0] - boid.x) / mag
+ target_coords[1] = (follow.target[1] - boid.y) / mag
when :mouse
camera = FF::Cmp::SingletonCamera[0]
angle = camera.angle * (Math::PI / 180)
@@ -23,6 +31,7 @@ FF::Scn::BoidRules.add(
mouse_y,
half_width,
half_height) / camera.zoom
+ # Caps the maximum power the mouse distance can inflict
if mag > half_height
mouse_x = (((mouse_x - half_width) / mag) * half_height) + half_width
mouse_y = (((mouse_y - half_height) / mag) * half_height) + half_height
@@ -31,15 +40,15 @@ FF::Scn::BoidRules.add(
#puts "y: #{mouse_y}"
#puts "x mag: #{mouse_x / mag}"
#puts "y mag: #{mouse_y / mag}"
- $gtk.args.outputs.solids << [mouse_x, mouse_y, 250, 250, 255, 0, 0, 255]
+ #$gtk.args.outputs.solids << [mouse_x, mouse_y, 250, 250, 255, 0, 0, 255]
- target_coords[0] = (((mouse_x - half_width) / camera.zoom) * Math.cos(-angle)) - (((mouse_y - half_height) / camera.zoom) * Math.sin(-angle)) + camera.x
- target_coords[1] = (((mouse_x - half_width) / camera.zoom) * Math.sin(-angle)) + (((mouse_y - half_height) / camera.zoom) * Math.cos(-angle)) + camera.y
+ target_coords[0] = (((mouse_x - half_width) / camera.zoom) * Math.cos(-angle)) - (((mouse_y - half_height) / camera.zoom) * Math.sin(-angle)) + camera.x - boid.x
+ target_coords[1] = (((mouse_x - half_width) / camera.zoom) * Math.sin(-angle)) + (((mouse_y - half_height) / camera.zoom) * Math.cos(-angle)) + camera.y - boid.y
end
- boid.cx += (target_coords[0] - boid.x) * follow.strength.to_f
- boid.cy += (target_coords[1] - boid.y) * follow.strength.to_f
+ boid.cx += target_coords[0] * follow.strength.to_f
+ boid.cy += target_coords[1] * follow.strength.to_f
end
end
)
diff --git a/app/systems/start_game.rb b/app/systems/start_game.rb
index 4657e77..4d6289e 100644
--- a/app/systems/start_game.rb
+++ b/app/systems/start_game.rb
@@ -1,6 +1,5 @@
FF::Sys.new('StartGame', priority: 50 ) do
- thing = FF::Cmp::SingletonTitle[0].entities.clone
- thing.each do |entity|
+ FF::Cmp::SingletonTitle[0].entities.reverse_each do |entity|
entity.components[FF::Cmp::Sprite][0].delete
if (!entity.components[FF::Cmp::Button].nil? && !entity.components[FF::Cmp::Hitbox].nil?)
entity.components[FF::Cmp::Hitbox][0].delete
@@ -9,17 +8,17 @@ FF::Sys.new('StartGame', priority: 50 ) do
entity.delete
end
- FF::Cmp::SingletonTitle[0].title_screen = false
- FF::Stg.remove FF::Scn::TitleScreen
+ #FF::Cmp::SingletonTitle[0].title_screen = false
+ #FF::Stg.remove FF::Scn::TitleScreen
- debug_arrow = FF::Cmp::SingletonDebugVectorArrow.new(length: 5)
+ debug_arrow = FF::Cmp::SingletonDebugVectorArrow[0]
position = [
{x: 100, y: 100},
{x: 500, y: 500},
{x: 700, y: 200},
{x: 150, y: 250},
]
- position_range = (100..700).to_a
+ position_range = (500..1000).to_a
sprite = FF::Cmp::Sprite.new
sprite.props[:path] = 'sprites/background.png'
@@ -28,9 +27,9 @@ FF::Sys.new('StartGame', priority: 50 ) do
FF::Cmp::SingletonCamera[0],
FF::Cmp::Boid.new(h: 1920 * 2, w: 1920 * 2)
)
- #15.times do |pos|
- # Factory::Osprey.new(x: position_range.sample, y: position_range.sample)
- #end
+ 8.times do |pos|
+ Factory::SampleEnemy.new(x: position_range.sample, y: position_range.sample)
+ end
sprite = FF::Cmp::Sprite.new
sprite.props[:path] = [
@@ -40,10 +39,11 @@ FF::Sys.new('StartGame', priority: 50 ) do
'sprites/kenny/Ships/Grosbeak.png',
].sample
FF::Ent.new(
- FF::Cmp::Boid.new(x: position_range.sample, y: position_range.sample, vx: 25, vy: 25, w: 32, h: 32),
+ FF::Cmp::Boid.new(x: 0, y: 0, vx: 25, vy: 25, w: 32, h: 32),
sprite,
debug_arrow,
FF::Cmp::SingletonCamera[0],
+ FF::Cmp::SingletonMoveCamera[0],
FF::Cmp::BoidBounds.new,
FF::Cmp::Follow.new(target: :mouse, strength: 0.007),
FF::Cmp::SingletonPlayer[0],
@@ -51,6 +51,9 @@ FF::Sys.new('StartGame', priority: 50 ) do
FF::Cmp::Weapon.new,
FF::Cmp::BoidMinimumSpeed.new(speed: 5),
FF::Cmp::DecaySpeed.new(strength: 0.8),
+ FF::Cmp::Hp.new(health: 100),
+ FF::Cmp::CollisionDamage.new(damage: 100),
+ FF::Cmp::Hitcircle.new(r: 32),
)
@@ -59,7 +62,6 @@ FF::Sys.new('StartGame', priority: 50 ) do
FF::Scn::BoidRules,
FF::Scn::Camera,
FF::Scn::Cleanup,
- FF::Scn::Debug,
)
FF::Scn::Debug.add(FF::Sys::DebugRenderVectorArrow)
diff --git a/app/systems/title_screen.rb b/app/systems/title_screen.rb
deleted file mode 100644
index 3f16a26..0000000
--- a/app/systems/title_screen.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-FF::Scn::TitleScreen.add(
- FF::Sys.new('TitleScreen', priority: 50) do
- FF::Cmp::SingletonTitle[0].entities.each do |entity|
- next unless entity.components.key?(FF::Cmp::Button)
-
- btn = entity.components[FF::Cmp::Button][0]
- sprite = entity.components[FF::Cmp::Sprite][0]
- hitbox = entity.components[FF::Cmp::Hitbox][0]
- mouse = $gtk.args.inputs.mouse
-
- if mouse.x > hitbox.x and mouse.x < hitbox.x + hitbox.w and mouse.y > hitbox.y and mouse.y < hitbox.y + hitbox.h
- if $gtk.args.inputs.mouse.down
- btn.clicked = true
- sprite.props[:path] = btn.pressed_sprite_path
- elsif $gtk.args.inputs.mouse.up and btn.clicked
- btn.clicked = false
- sprite.props[:path] = btn.unpressed_sprite_path
- btn.action.call
- end
- else
- btn.clicked = false
- sprite.props[:path] = btn.unpressed_sprite_path
- end
- end
- end
-)
diff --git a/app/systems/ui/button.rb b/app/systems/ui/button.rb
new file mode 100644
index 0000000..5ec855b
--- /dev/null
+++ b/app/systems/ui/button.rb
@@ -0,0 +1,26 @@
+FF::Scn::UI.add(
+ FF::Sys.new('ButtonHandler', priority: 50) do
+ FF::Cmp::Button.each do |button|
+ sprite = button.entities[0].components[FF::Cmp::Sprite][0]
+ hitbox = button.entities[0].components[FF::Cmp::Hitbox][0]
+ mouse = $gtk.args.inputs.mouse
+
+ if button.clicked
+ sprite.props[:path] = button.pressed_sprite_path
+ else
+ sprite.props[:path] = button.unpressed_sprite_path
+ end
+
+ if mouse.x > hitbox.x and mouse.x < hitbox.x + hitbox.w and mouse.y > hitbox.y and mouse.y < hitbox.y + hitbox.h
+ if mouse.down
+ button.clicked = true
+ elsif mouse.up and button.clicked
+ button.clicked = false
+ button.action.call
+ end
+ else
+ button.clicked = false
+ end
+ end
+ end
+)
diff --git a/app/systems/ui/return_to_menu.rb b/app/systems/ui/return_to_menu.rb
new file mode 100644
index 0000000..8b6f0c0
--- /dev/null
+++ b/app/systems/ui/return_to_menu.rb
@@ -0,0 +1,13 @@
+FF::Sys.new('ReturnToMenu', priority: 200) do
+ FF::Ent.each do |entity|
+ entity.components.each do |manager, manager_array|
+ manager_array.reverse_each do |component|
+ next if component.respond_to?(:singleton)
+ component.delete
+ end
+ end
+ entity.delete
+ end
+ FF::Scn::BoidRules.add(FF::Sys::Follow, FF::Sys::RandomizeAI)
+ FF::Sys::InitTitleScreen.call
+end
diff --git a/app/tick.rb b/app/tick.rb
index 20ff3e9..a48fce3 100644
--- a/app/tick.rb
+++ b/app/tick.rb
@@ -4,29 +4,8 @@
#@pause = false
@camera = FF::Cmp::SingletonCamera[0]
-@scatter = false
-@target = true
-@timer = 0
FF::Sys::InitTitleScreen.call
def tick args
- #puts @timer
- @timer += 1
- if @timer >= 100 && !FF::Cmp::SingletonTitle[0].title_screen
- @timer -= 100
- #puts "scatter: #{@scatter}"
- #puts "target: #{@target}"
- @scatter = !@scatter
- if @scatter
- FF::Sys::Scatter.call
- elsif @target
- @target = false
- FF::Sys::Rejoin.call
- else
- @target = true
- FF::Sys::TargetPlayer.call
- end
- end
-
args.outputs.background_color = [0,0,0]
args.outputs.solids << [-10_000, -10_000, 20_000, 20_000, 223, 246, 245]
diff --git a/sprites/title/gameover.png b/sprites/title/gameover.png
new file mode 100644
index 0000000..30c5d7e
--- /dev/null
+++ b/sprites/title/gameover.png
Binary files differ
diff --git a/sprites/title/overlay.png b/sprites/title/overlay.png
new file mode 100644
index 0000000..1d541b3
--- /dev/null
+++ b/sprites/title/overlay.png
Binary files differ
diff --git a/sprites/title/return.png b/sprites/title/return.png
new file mode 100644
index 0000000..7273e27
--- /dev/null
+++ b/sprites/title/return.png
Binary files differ
diff --git a/sprites/title/return_pressed.png b/sprites/title/return_pressed.png
new file mode 100644
index 0000000..8ddd92a
--- /dev/null
+++ b/sprites/title/return_pressed.png
Binary files differ