summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/levels.rb230
-rw-r--r--src/logic.rb95
2 files changed, 299 insertions, 26 deletions
diff --git a/src/levels.rb b/src/levels.rb
index c5e00a0..7f84302 100644
--- a/src/levels.rb
+++ b/src/levels.rb
@@ -32,13 +32,13 @@ level0 = {
lambda do |time|
xstart = 494
ystart = 355
- xstartnode = 827
- ystartnode = 431
- xendnode = 816
+ xstartnode = 800
+ ystartnode = 440
+ xendnode = 780
yendnode = 354
xend = 758
yend = 152
- easeTime = 1 - Math.cos((time * Math::PI) / 2)
+ easeTime = time #1 - Math.cos((time * Math::PI) / 2)
[Math.bezier([xstart, xstartnode, xendnode, xend],easeTime)-(250/2),
Math.bezier([ystart, ystartnode, yendnode, yend],easeTime)-(250/2)]
end,
@@ -61,22 +61,22 @@ level0 = {
path: './assets/mapinit-wasd.png',
time_start: 0,
time_end: -1,
- source_rec: Rl::Rectangle.new(0,0,284,204),
- dest_rec: Rl::Rectangle.new(0,0,284*2,204*2),
+ source_rec: Rl::Rectangle.new(0,0,450,325),
+ dest_rec: Rl::Rectangle.new(0,0,450*2,325*2),
},
{
path: './assets/mapinit-inside.png',
time_start: 0.7,
time_end: -1,
- source_rec: Rl::Rectangle.new(0,0,421,190),
- dest_rec: Rl::Rectangle.new(0,0,421*2,190*2),
+ source_rec: Rl::Rectangle.new(0,0,450,325),
+ dest_rec: Rl::Rectangle.new(0,0,450*2,325*2),
},
{
path: './assets/mapinit-ladder.png',
time_start: 1.3,
time_end: -1,
- source_rec: Rl::Rectangle.new(0,0,192,81),
- dest_rec: Rl::Rectangle.new(0,0,192*2,81*2),
+ source_rec: Rl::Rectangle.new(0,0,450,325),
+ dest_rec: Rl::Rectangle.new(0,0,450*2,325*2),
},
],
end_goal: [160*2,272*2,16*2,16*2],
@@ -215,7 +215,29 @@ level1 = {
end
),
scissor_speed: [1.0/2.0, 1.0/3.5, 1.0/6.0, 1.0/4.5, 1.0/3.0],
- timed_render: [],
+ timed_render: [
+ {
+ path: './assets/map2-avoidspikes.png',
+ time_start: 0.55,
+ time_end: -1,
+ source_rec: Rl::Rectangle.new(42,170,132,49),
+ dest_rec: Rl::Rectangle.new(38*2,170*2,132*2,49*2),
+ },
+ {
+ path: './assets/map2-justin.png',
+ time_start: 2.50,
+ time_end: -1,
+ source_rec: Rl::Rectangle.new(168,133,84,25),
+ dest_rec: Rl::Rectangle.new(168*2,133*2,84*2,25*2),
+ },
+ {
+ path: './assets/map2-time.png',
+ time_start: 2.9,
+ time_end: -1,
+ source_rec: Rl::Rectangle.new(273,131,40,22),
+ dest_rec: Rl::Rectangle.new(273*2,131*2,40*2,22*2),
+ },
+ ],
end_goal: [352*2,240*2,16*2,16*2],
walls: [
[178, 180, 60, 56],
@@ -260,8 +282,192 @@ level1 = {
]
}
+
+mazelevel= {
+ map_texture: {
+ path: './assets/Maze/floormaze.png',
+ source_rec: Rl::Rectangle.new(0,0,480,368),
+ dest_rec: Rl::Rectangle.new(0,0,480*2,368*2)
+ },
+ overhang_texture: {
+ path: './assets/map2-overhang.png',
+ source_rec: Rl::Rectangle.new(0,0,1,1),
+ dest_rec: Rl::Rectangle.new(9999,9999,0,0)
+ },
+ player_spawn: Rl::Vector2.new(460,130),
+ scissor_size: Path.new(
+ lambda do |time|
+ [200,
+ 607]
+ end,
+ ),
+ scissor_path: Path.new(
+ lambda do |time|
+ #xstart = 206
+ #ystart = 509
+ #xstartnode = 204
+ #ystartnode = 390
+ #xendnode = 228
+ #yendnode = 336
+ #xend = 153
+ #yend = 268
+ #easeTime = time #1 - Math.cos((time * Math::PI) / 2)
+ #[Math.bezier([xstart, xstartnode, xendnode, xend],easeTime)-(250/2),
+ # Math.bezier([ystart, ystartnode, yendnode, yend],easeTime)-(250/2)]
+ [(270 * -Math.sin(120 * (time))+510)-(200/2),
+ 367-(607/2)]
+ end,
+ ),
+ scissor_speed: [1.0/200.0],
+ timed_render: [
+ {
+ path: './assets/Maze/mazewalls.png',
+ time_start: 0,
+ time_end: -1,
+ source_rec: Rl::Rectangle.new(0,0,900,650),
+ dest_rec: Rl::Rectangle.new(0*2,0*2,900*2,650*2),
+ },
+ {
+ path: './assets/Maze/invisiblemaze.png',
+ time_start: 0,
+ time_end: -1,
+ source_rec: Rl::Rectangle.new(439,64,153,68),
+ dest_rec: Rl::Rectangle.new(438,64,153,58),
+ },
+ ],
+ end_goal: [452,516,24,24],
+ walls: [
+ [818,180,110,344],
+ [842,524,86,42],
+ [842,140,86,40],
+ [170,42,758,100],
+ [97,62,75,526],
+ [172,566,732,54],
+ [554,180,140,88],
+ [554,268,44,10],
+ [650,268,44,10],
+ [554,278,12,64],
+ [556,308,192,34],
+ [468,374,184,56],
+ [662,404,96,34],
+ [746,308,12,130],
+ #[652,404,10,26],
+ #[650,430,12,38],
+ [618,468,140,34],
+ [650,502,12,64],
+ [406,468,160,34],
+ #[394,404,12,162],
+ [298,404,96,34],
+ [298,438,12,64],
+ [234,468,64,34],
+ [458,340,12,66],
+ [246,340,212,34],
+ [234,244,12,194],
+ #[246,244,123,24],
+ [426,244,44,34],
+ [458,180,12,64],
+ [172,180,286,34],
+ [394,404,12,98],
+ [234,244,108,32],
+ [566,468,52,34]
+ ],
+ damage_areas: [
+ #[10, 0,0, 100,100],
+ ],
+ damage_walls: [
+ #[1, 612, 186, 24, 54], # made spikes taller downward so player cant just walk below them
+ #[1, 422, 186, 24, 54],
+ #[1, 708, 154, 24, 34],
+ #[1, 516, 154, 24, 34],
+ #[1, 324, 154, 24, 34]
+ ]
+}
+
+lastlevel = {
+ map_texture: {
+ path: './assets/Ending/ending.png',
+ source_rec: Rl::Rectangle.new(0,0,464,352),
+ dest_rec: Rl::Rectangle.new(0,0,464*2,352*2)
+ },
+ overhang_texture: {
+ path: './assets/Ending/ending-overhang.png',
+ source_rec: Rl::Rectangle.new(0,0,252,155),
+ dest_rec: Rl::Rectangle.new(0,0,252*2,155*2)
+ },
+ player_spawn: Rl::Vector2.new(465,557),
+ scissor_size: Path.new(
+ lambda do |time|
+ [Math.interpolate(232.5,94.2,time),
+ Math.interpolate(207.0,80.8,time)]
+ end,
+ lambda do |time|
+ [Math.interpolate(94.2,682.2,time),
+ Math.interpolate(80.8,357.2,time)]
+ end,
+ ),
+ scissor_path: Path.new(
+ lambda do |time|
+ xstart = 465.8
+ ystart = 558.9
+ xstartnode = 465.8
+ ystartnode = 558.9
+ xendnode = 465.2
+ yendnode = 381
+ xend = 465.8
+ yend = 319.7
+ easeTime = time#1 - Math.cos((time * Math::PI) / 2)
+ [Math.bezier([xstart, xstartnode, xendnode, xend],easeTime)-(Math.interpolate(232.5,94.2,time)/2),
+ Math.bezier([ystart, ystartnode, yendnode, yend],easeTime)-(Math.interpolate(207.0,80.8,time)/2)]
+ end,
+ lambda do |time|
+ xstart = 465.8
+ ystart = 319.7
+ xstartnode = 473.1
+ ystartnode = 263.1
+ xendnode = 168.7
+ yendnode = 129.4
+ xend = 479.9
+ yend = 198.0
+
+ [Math.bezier([xstart, xstartnode, xendnode, xend],time)-(Math.interpolate(94.2,682.2,time)/2),
+ Math.bezier([ystart, ystartnode, yendnode, yend],time)-(Math.interpolate(80.8,357.2,time)/2)]
+ end
+ ),
+ scissor_speed: [1.0/3.0, 1.0/3.0],
+ timed_render: [],
+ end_goal: [9999,9999,1,1],
+ walls: [
+ [106,308,320,167],
+ [315,502,59,63],
+ [311,475,125,27],
+ [320,630,280,47],
+ [313,565,49,65],
+ [566,566,37,64],
+ [554,468,49,98],
+ [502,467,52,37],
+ [502,344,152,125],
+ [480,308,310,36],
+ [426,308,22,34],
+ [210,116,124,120],
+ [626,116,124,120],
+ [358,86,52,36],
+ [65,52,117,256],
+ [182,8,621,80],
+ [778,88,77,220],
+
+ ],
+ damage_areas: [
+ #[10, 0,0, 100,100],
+ ],
+ damage_walls: [
+ #[10, 350,200, 050,350],
+ ]
+}
+
Levels.push(level0)
Levels.push(level1)
+Levels.push(mazelevel)
+Levels.push(lastlevel)
FECS::Sys.new('ConstructLevel') do
FECS::Sys::DestroyLevel.call
@@ -310,7 +516,7 @@ FECS::Sys.new('ConstructLevel') do
source_rec: rndr[:source_rec],
dest_rec: rndr[:dest_rec],
rotation: 0,
- tint: RED
+ tint: BkgWhite
)
end
diff --git a/src/logic.rb b/src/logic.rb
index d800d93..ffac917 100644
--- a/src/logic.rb
+++ b/src/logic.rb
@@ -80,7 +80,8 @@ FECS::Cmp.new('Transition', :state, :rec, :time).new(
rec: Rl::Rectangle.new(0,0,0,0),
time: 0)
-BkgWhite = Rl::Color.new(255,255,255,255)
+BkgWhite = Rl::Color.new(255,255,255,200)
+PlayerBkgWhite = Rl::Color.new(255,200,200,150)
#ScissorPath = Path.new(
# lambda do |time|
# [Math.bezier([200, 200, 1183, 200],time)-150,
@@ -90,7 +91,7 @@ BkgWhite = Rl::Color.new(255,255,255,255)
#FECS::Cmp::ScissorBox.new(rec: Rl::Rectangle.new(200,200,250,250))
-
+ResetPrompt = Rl::Texture.new('./assets/resetprompt.png')
FECS::Cmp::ScissorTime.new(time: 0)
EndGoal = FECS::Cmp::EndGoal.new
Input = FECS::Cmp::Input.new
@@ -192,9 +193,9 @@ Player = FECS::Ent.new(
rotation: 0
),
FECS::Cmp::Movement.new(
- deceleration: 2500,
- acceleration: 1000,
- max_speed: 400,
+ deceleration: 1500,
+ acceleration: 1500,
+ max_speed: 300,
),
FECS::Cmp::Hitbox.new(
#rec: Rl::Rectangle.new(0,0,16*2,20*2),
@@ -205,6 +206,9 @@ Player = FECS::Ent.new(
)
Music = false # prevents a longjmp error in browsers
+HurtSound = false
+IntroSound = false
+DeathSound = false
Resetting = false
ScissorPath = 10000
ScissorSize = 1
@@ -221,7 +225,7 @@ FECS::Sys.new('Music') do
#puts 'load device'
Rl.init_audio_device
#puts 'set master'
- Rl.set_master_volume(0.1)
+ Rl.set_master_volume(0.5)
end
end
#puts 'check if sound exists'
@@ -229,12 +233,15 @@ FECS::Sys.new('Music') do
if !Music
#puts 'load it'
Music = Rl::Sound.new('./assets/music.ogg')
+ HurtSound = Rl::Sound.new('../assets/hurt.wav')
+ IntroSound = Rl::Sound.new('../assets/intro.ogg')
+ DeathSound = Rl::Sound.new('../assets/death.ogg')
#puts 'set volume'
- #Music.volume = 0.05
#puts 'check if its playing'
elsif !Music.playing?
#puts 'play it'
Music.play
+ Music.volume = 0.09
end
end
#if Rl.key_pressed? 87
@@ -243,6 +250,13 @@ FECS::Sys.new('Music') do
# Music.play
#end
end
+FECS::Sys.new('IntroSound') do
+ button_clicked = FECS::Cmp::Button.first.clicked
+ if Rl.audio_device_ready? && IntroSound && !IntroSoundPlayed && button_clicked
+ IntroSoundPlayed = true
+ IntroSound.play
+ end
+end
FECS::Sys.new('Transition') do
cmp = FECS::Cmp::Transition.first
#cmp.state = 'into_init' if Rl.mouse_button_pressed? 0
@@ -253,7 +267,7 @@ FECS::Sys.new('Transition') do
cmp.time = 0
end
if cmp.state == 'into'
- cmp.time += Rl.frame_time
+ cmp.time += (1.0/60.0)#Rl.frame_time
if cmp.time >= 1
cmp.state = 'outof_init'
cmp.time = 1
@@ -289,7 +303,7 @@ FECS::Sys.new('Transition') do
cmp.time = -0.5
end
if cmp.state == 'outof'
- cmp.time += Rl.frame_time
+ cmp.time += (1.0/60.0)#Rl.frame_time
if cmp.time >= 1
cmp.state = 'none'
cmp.time = 1
@@ -333,6 +347,7 @@ FECS::Scn::Menu.add(
button.clicked = false
end
if trans.state == 'outof_init'
+ IntroSound.play if Rl.platform == 'web'
FECS::Sys::DestroyTitleScreen.call
end
end
@@ -382,7 +397,7 @@ FECS::Scn::Play.add(
Input.show_debug = Rl.key_down? 80 # P
Input.reset = Rl.key_down? 82 # R
#if Rl.key_pressed? 82
- #FECS::Sys::ConstructLevel.call
+ #FECS::Sys::ConstructLevel.call
#end
end,
FECS::Sys.new('PlayerReset') do
@@ -561,12 +576,18 @@ FECS::Scn::Play.add(
if player_hitbox.rec.collide_with_rec?(dmg_hitbox.rec)
FECS::Cmp::Player.first.state = 'set_damaged'
hp_cmp.value -= dmg_hitbox.damage
- hp_cmp.invincible_timer = hp_cmp.max_invincible_time
#puts "oof -#{dmg_hitbox.damage} hp"
#puts "hp: #{hp_cmp.value}"
if hp_cmp.value <= 0
FECS::Cmp::Player.first.state = 'set_dead'
#puts 'ded'
+ DeathSound.play if Rl.platform == 'web'
+ else
+ hp_cmp.invincible_timer = hp_cmp.max_invincible_time
+ if Rl.platform == 'web'
+ HurtSound.play
+ HurtSound.volume = 0.45
+ end
end
break
end
@@ -574,12 +595,18 @@ FECS::Scn::Play.add(
else
FECS::Cmp::Player.first.state = 'set_damaged'
hp_cmp.value -= 1
- hp_cmp.invincible_timer = hp_cmp.max_invincible_time
#puts "oof -#{1} hp"
#puts "hp: #{hp_cmp.value}"
if hp_cmp.value <= 0
FECS::Cmp::Player.first.state = 'set_dead'
#puts 'ded'
+ DeathSound.play if Rl.platform == 'web'
+ else
+ hp_cmp.invincible_timer = hp_cmp.max_invincible_time
+ if Rl.platform == 'web'
+ HurtSound.play
+ HurtSound.volume = 0.45
+ end
end
end
end
@@ -848,7 +875,8 @@ FECS::Scn::Play.add(
Rl.draw_texture_pro(texture: result.texture,
origin: Rl::Vector2.new(0,0),
source_rec: result.source_rec,
- dest_rec: result.dest_rec)
+ dest_rec: result.dest_rec,
+ tint: BkgWhite)
end
end
end
@@ -866,7 +894,7 @@ FECS::Scn::Play.add(
origin: sprite_cmp.origin,
source_rec: sprite_cmp.tileset.rec,
dest_rec: sprite_cmp.dest_rec,
- tint: Rl::Color.new(255,255,255,100),
+ tint: PlayerBkgWhite,
rotation: sprite_cmp.rotation)
end
Rl.scissor_mode(
@@ -943,22 +971,60 @@ FECS::Scn::Play.add(
end
end
)
+FECS::Sys.new('SetBackgroundColor') do
+ trans = FECS::Cmp::Transition.first
+ if trans.state == 'none'
+ BkgWhite.a = 150
+ PlayerBkgWhite.a = 100
+ elsif trans.state == 'into'
+ BkgWhite.a = [Math.interpolate(150,-50,[trans.time,0].max),0].max
+ PlayerBkgWhite.a = [Math.interpolate(100,-50,[trans.time,0].max),0].max
+ elsif trans.state == 'outof'
+ BkgWhite.a = [Math.interpolate(-50,150,[trans.time,0].max),0].max
+ PlayerBkgWhite.a = [Math.interpolate(-50,100,[trans.time,0].max),0].max
+ end
+end
+
+FECS::Sys.new('RenderResetText') do
+ trans = FECS::Cmp::Transition.first
+ if Player.component[FECS::Cmp::Hp].value <= 0
+ if trans.state == 'into'
+ Rl.draw_texture_pro(texture: ResetPrompt,
+ origin: Rl::Vector2.new(0,0),
+ source_rec: Rl::Rectangle.new(0,0,900,650),
+ dest_rec: Rl::Rectangle.new(0,0,900,650),
+ tint: Rl::Color.new(255,255,255,Math.interpolate(255,0,trans.time)))
+ elsif trans.state == 'none'
+ Rl.draw_texture_pro(texture: ResetPrompt,
+ origin: Rl::Vector2.new(0,0),
+ source_rec: Rl::Rectangle.new(0,0,900,650),
+ dest_rec: Rl::Rectangle.new(0,0,900,650),
+ tint: WHITE)
+
+ end
+ end
+end
#CurrentLevel.level = 0
FECS::Sys::ConstructTitleScreen.call
FECS::Scn::Menu.add(
FECS::Sys::Transition,
+ #FECS::Sys::IntroSound,
FECS::Sys::Music,
)
FECS::Scn::Play.add(
FECS::Sys::Transition,
FECS::Sys::Music,
+ FECS::Sys::SetBackgroundColor,
+ FECS::Sys::RenderResetText,
)
FECS::Stg.add(
FECS::Scn::Menu,
)
FelECS::Order.sort(
+ #FECS::Sys::IntroSound,
+ FECS::Sys::Music,
FECS::Sys::PlayerInput,
FECS::Sys::PlayerReset,
FECS::Sys::Button,
@@ -980,4 +1046,5 @@ FelECS::Order.sort(
FECS::Sys::Render,
# Renders the debug hitboxes
FECS::Sys::DebugRenderHitbox,
+ FECS::Sys::RenderResetText,
)