Created
August 25, 2019 19:17
-
-
Save amirrajan/61f6a8524ccff37600d02b3ccd56c92a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def fiddle args | |
args.state.gravity = -0.3 | |
args.state.enemy_jump_power = 10 | |
args.state.enemy_jump_interval = 60 | |
args.state.hammer_throw_interval = 40 | |
args.state.hammer_launch_power_default = 5 | |
args.state.hammer_launch_power_near = 2 | |
args.state.hammer_launch_power_far = 7 | |
args.state.hammer_upward_launch_power = 15 | |
args.state.max_hammers_per_volley = 10 | |
args.state.gap_between_hammers = 10 | |
args.state.player_jump_power = 10 | |
args.state.player_jump_power_duration = 10 | |
args.state.player_max_run_speed = 10 | |
args.state.player_speed_slowdown_rate = 0.9 | |
args.state.player_acceleration = 1 | |
args.state.hammer_size = 32 | |
end | |
def defaults args | |
fiddle args | |
args.state.enemy.hammers ||= [] | |
args.state.enemy.hammer_queue ||= [] | |
args.state.tick_count = args.state.tick_count | |
args.state.bridge_top = 128 | |
args.state.player.x ||= 0 | |
args.state.player.y ||= args.state.bridge_top | |
args.state.player.w ||= 64 | |
args.state.player.h ||= 64 | |
args.state.player.dy ||= 0 | |
args.state.player.dx ||= 0 | |
args.state.enemy.x ||= 800 | |
args.state.enemy.y ||= 0 | |
args.state.enemy.w ||= 128 | |
args.state.enemy.h ||= 128 | |
args.state.enemy.dy ||= 0 | |
args.state.enemy.dx ||= 0 | |
args.state.game_over_at ||= 0 | |
end | |
def render args | |
args.outputs.solids << 20.map_with_index do |i| | |
[i * 64, args.state.bridge_top - 64, 64, 64] | |
end | |
args.outputs.solids << [args.state.x, args.state.y, args.state.w, args.state.h, 255, 0, 0] | |
args.outputs.solids << [args.state.player.x, args.state.player.y, args.state.player.w, args.state.player.h, 255, 0, 0] | |
args.outputs.solids << [args.state.enemy.x, args.state.enemy.y, args.state.enemy.w, args.state.enemy.h, 0, 255, 0] | |
args.outputs.solids << args.state.enemy.hammers | |
end | |
def tick args | |
defaults args | |
render args | |
calc args | |
input args | |
end | |
def calc args | |
args.state.player.x += args.state.player.dx | |
args.state.player.y += args.state.player.dy | |
args.state.player.dy += args.state.gravity | |
args.state.player.y = args.state.player.y.greater(args.state.bridge_top) | |
args.state.player.x = args.state.player.x.greater(0) | |
args.state.player.falling = false if args.state.player.y == args.state.bridge_top | |
args.state.player.rect = [args.state.player.x, args.state.player.y, args.state.player.h, args.state.player.w] | |
args.state.enemy.x += args.state.enemy.dx | |
args.state.enemy.y += args.state.enemy.dy | |
args.state.enemy.y = args.state.enemy.y.greater(args.state.bridge_top) | |
args.state.enemy.x = args.state.enemy.x.greater(0) | |
args.state.enemy.dy += args.state.gravity | |
args.state.enemy.y = args.state.enemy.y.greater(args.state.bridge_top) | |
args.state.enemy.rect = [args.state.enemy.x, args.state.enemy.y, args.state.enemy.h, args.state.enemy.w] | |
if args.state.enemy.y == args.state.bridge_top | |
args.state.enemy.dy = 0 | |
end | |
if args.state.tick_count.mod_zero?(args.state.enemy_jump_interval) && args.state.enemy.dy == 0 | |
args.state.enemy.dy = args.state.enemy_jump_power | |
end | |
if args.state.tick_count.mod_zero?(args.state.hammer_throw_interval) || args.state.game_over_at.elapsed_time == 5 | |
volley_dx = (rand(args.state.hammer_launch_power_default) + 1) * -1 | |
if (args.state.player.x - args.state.enemy.x).abs < 128 | |
volley_dx = (rand(args.state.hammer_launch_power_near) + 1) * -1 | |
end | |
if (args.state.player.x - args.state.enemy.x).abs > 300 | |
volley_dx = (rand(args.state.hammer_launch_power_far) + 1) * -1 | |
end | |
(rand(args.state.max_hammers_per_volley) + 1).map_with_index do |i| | |
args.state.enemy.hammer_queue << { | |
x: args.state.enemy.x, | |
w: args.state.hammer_size, | |
h: args.state.hammer_size, | |
dx: volley_dx, | |
throw_at: args.state.tick_count + i * args.state.gap_between_hammers | |
} | |
end | |
end | |
args.state.enemy.hammers += args.state.enemy.hammer_queue.find_all do |h| | |
h[:throw_at] < args.state.tick_count | |
end | |
args.state.enemy.hammers.each do |h| | |
h[:y] ||= args.state.enemy.y + 130 | |
h[:dy] ||= args.state.hammer_upward_launch_power | |
h[:dy] += args.state.gravity | |
h[:x] += h[:dx] | |
h[:y] += h[:dy] | |
h[:rect] = [h[:x], h[:y], h[:w], h[:h]] | |
end | |
args.state.enemy.hammer_queue = args.state.enemy.hammer_queue.reject do |h| | |
h[:throw_at] < args.state.tick_count | |
end | |
args.state.enemy.hammers = args.state.enemy.hammers.reject { |h| h[:y] < 0 } | |
if args.state.enemy.hammers.any? { |h| h[:rect].intersects_rect?(args.state.player.rect) } | |
reset_player args | |
end | |
if args.state.enemy.rect.intersects_rect? args.state.player.rect | |
reset_player args | |
end | |
end | |
def reset_player args | |
args.state.player.x = 0 | |
args.state.player.y = args.state.bridge_top | |
args.state.player.dy = 0 | |
args.state.player.dx = 0 | |
args.state.enemy.hammers.clear | |
args.state.enemy.hammer_queue.clear | |
args.state.game_over_at = args.state.tick_count | |
end | |
def input args | |
if args.inputs.keyboard.space | |
args.state.player.jumped_at ||= args.state.tick_count | |
if args.state.player.jumped_at.elapsed_time < args.state.player_jump_power_duration && !args.state.player.falling | |
args.state.player.dy = args.state.player_jump_power | |
end | |
end | |
if args.inputs.keyboard.key_up.space | |
args.state.player.jumped_at = nil | |
args.state.player.falling = true | |
end | |
if args.inputs.keyboard.left | |
args.state.player.dx -= args.state.player_acceleration | |
args.state.player.dx = args.state.player.dx.greater(-args.state.player_max_run_speed) | |
elsif args.inputs.keyboard.right | |
args.state.player.dx += args.state.player_acceleration | |
args.state.player.dx = args.state.player.dx.lesser(args.state.player_max_run_speed) | |
else | |
args.state.player.dx *= args.state.player_speed_slowdown_rate | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment