Skip to content

Instantly share code, notes, and snippets.

@amirrajan
Created August 25, 2019 19:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amirrajan/61f6a8524ccff37600d02b3ccd56c92a to your computer and use it in GitHub Desktop.
Save amirrajan/61f6a8524ccff37600d02b3ccd56c92a to your computer and use it in GitHub Desktop.
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