From 36595e81ec611232ce841fd49425d4b4f6b56e77 Mon Sep 17 00:00:00 2001 From: Jakob Feldmann Date: Tue, 11 May 2021 14:17:37 +0200 Subject: [PATCH] Jump height control, walk level, adjustments --- src/Actor/Blobby.gd | 79 ++++++++++++++++++++++----------- src/Actor/Blobby.tscn | 8 ++-- src/Actor/Player.gd | 21 ++++----- src/Actor/PlayerStateMachine.gd | 10 ++--- src/Levels/ApproxLevel.tscn | 26 +++-------- 5 files changed, 78 insertions(+), 66 deletions(-) diff --git a/src/Actor/Blobby.gd b/src/Actor/Blobby.gd index bf3774e..aa91b4c 100644 --- a/src/Actor/Blobby.gd +++ b/src/Actor/Blobby.gd @@ -14,8 +14,8 @@ func _on_EnemyDetector_body_entered(body: Node) -> void: die() -func handle_grounded_movement(delta: float, direction: Vector2, state: String) -> Vector2: - return calculate_grounded_velocity(_velocity, delta, direction, state) +func handle_grounded_movement(delta: float, direction: Vector2) -> Vector2: + return calculate_grounded_velocity(_velocity, delta, direction) func handle_jump_movement(delta: float, direction: Vector2) -> Vector2: @@ -31,8 +31,9 @@ func handle_wallslide_movement(delta: float, direction: Vector2) -> Vector2: func calculate_grounded_velocity( - linear_velocity: Vector2, delta: float, direction: Vector2, state: String + linear_velocity: Vector2, delta: float, direction: Vector2 ) -> Vector2: + var state = self.get_node("PlayerStateMachine").state var out_vel := linear_velocity var velocity_direction = 1.0 if _velocity.x < 0: @@ -41,7 +42,7 @@ func calculate_grounded_velocity( # Stopping movement if direction.x == 0.0: var deceleration_force = calculate_deceleration_force( - gravity, mass, delta + _gravity, mass, delta ) # Translates velocity back to force and subtracts deceleration force var result_force = ( @@ -62,7 +63,7 @@ func calculate_grounded_velocity( if reverse_move: out_vel.x -= ( convert_force_to_velocity( - calculate_deceleration_force(gravity, mass, delta), + calculate_deceleration_force(_gravity, mass, delta), mass, delta ) @@ -85,20 +86,12 @@ func calculate_grounded_velocity( ) elif ! reverse_move: out_vel.x = max_velocity[state] * direction.x - # TODO Is this the right place to determine this? # Jumping when grounded - if is_on_floor() && Input.is_action_just_pressed("jump"): - var additive_jump_force = ( - velocity_jump_boost_ratio - * abs(_velocity.x) - * mass - ) - out_vel.y = ( - ((acceleration_force[state].y + additive_jump_force) / mass) - * -1 - ) + if Input.is_action_just_pressed("jump"): + return calculate_jump_velocity(_velocity, delta, direction) + else: - out_vel.y = gravity * delta + out_vel.y = _gravity * delta return out_vel @@ -113,6 +106,7 @@ func is_reversing_horizontal_movement(direction: Vector2) -> bool: # Being able to touch a vertical surface over this length also makes it a qualified "wall" # Also sets wall_touch_direction # TODO Ugly side effect +# TODO Walljumping is a bit to radical behaving func is_touching_wall_completely() -> bool: for left_raycast in left_wall_raycasts.get_children(): wall_touch_direction = -1 @@ -147,19 +141,43 @@ func get_ground_friction() -> float: # TODO Comments for parameters -func calculate_deceleration_force(gravity: float, mass: float, delta: float) -> float: - return get_ground_friction() * gravity * mass * delta +func calculate_deceleration_force(_gravity: float, mass: float, delta: float) -> float: + return get_ground_friction() * _gravity * mass * delta func calculate_jump_velocity( linear_velocity: Vector2, delta: float, direction: Vector2 ) -> Vector2: - if is_touching_wall_completely() && is_correct_walljump_input(direction): - # The faster you are moving up the farther the walljump goes - linear_velocity.y = (acceleration_force["walljump"].y / mass) * -1 - linear_velocity.x += max_velocity["walljump"] * direction.x + var state = self.get_node("PlayerStateMachine").state + + if Input.is_action_just_pressed("jump") && state != "jump": + var additive_jump_force = ( + velocity_jump_boost_ratio + * abs(_velocity.x) + * mass + ) + linear_velocity.y = ( + ((acceleration_force[state].y + additive_jump_force) / mass) + * -1 + ) + if ( + is_touching_wall_completely() + && is_correct_walljump_input(direction) + ): + # The faster you are moving up the farther the walljump goes + linear_velocity.y = (acceleration_force["walljump"].y / mass) * -1 + linear_velocity.x += max_velocity["walljump"] * direction.x + if ! Input.is_action_pressed("jump"): + # TODO This is so good not gonna lie + if _velocity.y > _gravity * delta * 10: + linear_velocity.y += _gravity * delta * 10 + else: + linear_velocity.y += ( + max(abs(linear_velocity.y), _gravity * delta) + / 2 + ) else: - linear_velocity.y += gravity * delta + linear_velocity.y += _gravity * delta * 0.88 if _velocity.x == 0: linear_velocity.x += inair_velocity * direction.x return linear_velocity @@ -170,7 +188,7 @@ func calculate_fall_velocity( linear_velocity: Vector2, delta: float, direction: Vector2 ) -> Vector2: if _velocity.y < max_velocity["fall"]: - linear_velocity.y += gravity * delta + linear_velocity.y += _gravity * delta else: linear_velocity.y = max_velocity["fall"] if _velocity.x == 0: @@ -183,7 +201,8 @@ func calculate_wallslide_velocity( ) -> Vector2: # Walljump mechanics if is_correct_walljump_input(direction): - var multiplicator = max(min(1, 1000 / _velocity.y), 0.5) + # TODO This +0.01 indicates a larger problem with division through possible 0 values!! + var multiplicator = max(min(1, 1000 / (_velocity.y + 0.01)), 0.5) linear_velocity.y += ( (acceleration_force["walljump"].y / mass) * -1 @@ -191,7 +210,7 @@ func calculate_wallslide_velocity( ) linear_velocity.x += max_velocity["walljump"] * direction.x else: - linear_velocity.y += gravity * delta * 0.4 + linear_velocity.y += _gravity * delta * 0.4 # linear_velocity.x += inair_velocity * direction.x return linear_velocity @@ -204,6 +223,12 @@ func calculate_stomp_velocity(linear_velocity: Vector2, impulse: float) -> Vecto func execute_movement() -> void: _velocity = move_and_slide(_velocity, FLOOR_NORMAL) + # TODO Replace .get_nodes with $ and put them to file beginning if possible + # var camera = self.get_node("Camera2D") + # if _velocity.x < 0: + # camera.transform.origin.x = -100 + # if _velocity.x > 0: + # camera.transform.origin.x = 100 func die() -> void: diff --git a/src/Actor/Blobby.tscn b/src/Actor/Blobby.tscn index d96898d..b2f1fd3 100644 --- a/src/Actor/Blobby.tscn +++ b/src/Actor/Blobby.tscn @@ -29,7 +29,6 @@ script = ExtResource( 3 ) script = ExtResource( 4 ) [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2( 0, -181 ) current = true limit_left = 0 limit_top = 0 @@ -37,8 +36,6 @@ limit_smoothed = true drag_margin_h_enabled = true drag_margin_v_enabled = true smoothing_enabled = true -drag_margin_left = 0.0 -drag_margin_right = 0.0 [node name="EnemyDetector" type="Area2D" parent="."] monitorable = false @@ -48,10 +45,10 @@ collision_mask = 2 modulate = Color( 0.2, 0, 0.494118, 1 ) shape = SubResource( 2 ) -[node name="StateMachine" type="Node" parent="."] +[node name="PlayerStateMachine" type="Node" parent="."] script = ExtResource( 2 ) -[node name="StateLable" type="Label" parent="."] +[node name="StateLabel" type="Label" parent="."] margin_left = -25.3386 margin_top = -34.2836 margin_right = 25.6614 @@ -93,5 +90,6 @@ position = Vector2( 10.6962, 14.8466 ) enabled = true cast_to = Vector2( 1, 0 ) collision_mask = 9 + [connection signal="area_entered" from="EnemyDetector" to="." method="_on_EnemyDetector_area_entered"] [connection signal="body_entered" from="EnemyDetector" to="." method="_on_EnemyDetector_body_entered"] diff --git a/src/Actor/Player.gd b/src/Actor/Player.gd index 9bbcd33..ef27cf5 100644 --- a/src/Actor/Player.gd +++ b/src/Actor/Player.gd @@ -3,23 +3,24 @@ class_name Player const FLOOR_NORMAL := Vector2.UP -export var stomp_feedback := 1000.0 -export var inair_velocity := 21 -export var wallslide_threshold := 1000 -export var max_velocity := { - "walk": 130, "run": 180, "fall": 987, "walljump": 150 +var stomp_feedback := 1000.0 +var inair_velocity := 21 +var wallslide_threshold := 1000 +var max_velocity := { + "walk": 130, "run": 180, "fall": 987, "walljump": 150, "idle": 130 } -export var velocity_jump_boost_ratio := 0.4383 +var velocity_jump_boost_ratio := 0.1967 # This is added to the acceleration force initially -export var init_acceleration_force := {"walk": 4181, "run": 6765} +var init_acceleration_force := {"walk": 4181, "run": 6765, "idle": 4181} # newtonmeters is the unit -export var acceleration_force := { +var acceleration_force := { "walk": Vector2(2584, 2000), + "idle": Vector2(2584, 2000), "run": Vector2(2584, 2000), "walljump": Vector2(2548, 2000) } -export var gravity := 1667.0 +var _gravity := 1667.0 # Kilograms -export var mass := 6 +var mass := 6 var _velocity := Vector2.ZERO diff --git a/src/Actor/PlayerStateMachine.gd b/src/Actor/PlayerStateMachine.gd index 9f7be9f..e945c3d 100644 --- a/src/Actor/PlayerStateMachine.gd +++ b/src/Actor/PlayerStateMachine.gd @@ -48,17 +48,17 @@ func _state_logic(delta): func handle_idle_input(delta, direction := get_horizontal_direction()) -> Vector2: if Input.is_action_pressed("boost_move"): - return parent.handle_grounded_movement(delta, direction, "run") + return parent.handle_grounded_movement(delta, direction) else: - return parent.handle_grounded_movement(delta, direction, "walk") + return parent.handle_grounded_movement(delta, direction) func handle_walk_input(delta, direction := get_horizontal_direction()) -> Vector2: - return parent.handle_grounded_movement(delta, direction, state) + return parent.handle_grounded_movement(delta, direction) func handle_run_input(delta, direction := get_horizontal_direction()) -> Vector2: - return parent.handle_grounded_movement(delta, direction, state) + return parent.handle_grounded_movement(delta, direction) func handle_jump_input(delta, direction := get_horizontal_direction()) -> Vector2: @@ -85,7 +85,7 @@ func get_horizontal_direction() -> Vector2: # Determines which state should be active at the moment func _get_transition(delta): - parent.get_node("StateLable").text = ( + parent.get_node("StateLabel").text = ( self.state + " x vel:" + String(round(parent._velocity.x)) diff --git a/src/Levels/ApproxLevel.tscn b/src/Levels/ApproxLevel.tscn index e4eaaaa..d2ef4d2 100644 --- a/src/Levels/ApproxLevel.tscn +++ b/src/Levels/ApproxLevel.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=8 format=2] [ext_resource path="res://src/Actor/Blobby.tscn" type="PackedScene" id=1] [ext_resource path="res://start-assets/Basic stone block.png" type="Texture" id=2] [ext_resource path="res://start-assets/background.png" type="Texture" id=4] -[ext_resource path="res://start-assets/new_dynamicfont.tres" type="DynamicFont" id=7] [sub_resource type="NavigationPolygon" id=1] vertices = PoolVector2Array( 16, 16, 0, 16, 0, 0, 16, 0 ) @@ -60,7 +59,7 @@ __meta__ = { } [node name="Blobby" parent="." instance=ExtResource( 1 )] -position = Vector2( 56.3835, 522.122 ) +position = Vector2( 85.2018, 551.133 ) [node name="Player" parent="Blobby" index="0"] position = Vector2( 0.279999, 0 ) @@ -72,29 +71,18 @@ position = Vector2( 0, 0.14032 ) points = PoolVector2Array( -6.10207, -4.13742 ) [node name="Camera2D" parent="Blobby" index="2"] -position = Vector2( 0, 0 ) limit_right = 974 limit_bottom = 638 smoothing_enabled = false -drag_margin_left = 0.3 -drag_margin_top = 0.4 -drag_margin_right = 0.3 -drag_margin_bottom = 0.4 +drag_margin_left = 0.15 +drag_margin_top = 0.15 +drag_margin_right = 0.15 +drag_margin_bottom = 0.15 editor_draw_limits = true [node name="CollisionShape2D" parent="Blobby/EnemyDetector" index="0"] position = Vector2( 0, 0.14032 ) -[node name="StateLable" parent="Blobby" index="5"] -margin_left = -23.889 -margin_top = -33.9531 -margin_right = 27.111 -margin_bottom = -19.9531 -size_flags_horizontal = 0 -size_flags_vertical = 0 -custom_fonts/font = ExtResource( 7 ) -text = "State" - [node name="WallRaycasts" parent="Blobby" index="6"] position = Vector2( 0, 0.14032 ) @@ -127,6 +115,6 @@ cell_custom_transform = Transform2D( 16, 0, 0, 16, 0, 0 ) collision_layer = 8 collision_mask = 2147483648 format = 1 -tile_data = PoolIntArray( 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 21, 0, 0, 22, 0, 0, 23, 0, 0, 24, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 0, 28, 0, 0, 29, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0, 46, 0, 0, 47, 0, 0, 48, 0, 0, 49, 0, 0, 50, 0, 0, 51, 0, 0, 52, 0, 0, 53, 0, 0, 54, 0, 0, 55, 0, 0, 56, 0, 0, 57, 0, 0, 58, 0, 0, 59, 0, 0, 60, 0, 0, 65536, 0, 0, 65596, 0, 0, 131072, 0, 0, 131132, 0, 0, 196608, 0, 0, 196668, 0, 0, 262144, 0, 0, 262204, 0, 0, 327680, 0, 0, 327740, 0, 0, 393216, 0, 0, 393276, 0, 0, 458752, 0, 0, 458812, 0, 0, 524288, 0, 0, 524348, 0, 0, 589824, 0, 0, 589884, 0, 0, 655360, 0, 0, 655420, 0, 0, 720896, 0, 0, 720956, 0, 0, 786432, 0, 0, 786492, 0, 0, 851968, 0, 0, 852028, 0, 0, 917504, 0, 0, 917564, 0, 0, 983040, 0, 0, 983100, 0, 0, 1048576, 0, 0, 1048636, 0, 0, 1114112, 0, 0, 1114172, 0, 0, 1179648, 0, 0, 1179708, 0, 0, 1245184, 0, 0, 1245244, 0, 0, 1310720, 0, 0, 1310780, 0, 0, 1376256, 0, 0, 1376316, 0, 0, 1441792, 0, 0, 1441852, 0, 0, 1507328, 0, 0, 1507388, 0, 0, 1572864, 0, 0, 1572865, 0, 0, 1572866, 0, 0, 1572867, 0, 0, 1572924, 0, 0, 1638400, 0, 0, 1638401, 0, 0, 1638402, 0, 0, 1638454, 0, 0, 1638455, 0, 0, 1638460, 0, 0, 1703936, 0, 0, 1703937, 0, 0, 1703938, 0, 0, 1703943, 0, 0, 1703944, 0, 0, 1703996, 0, 0, 1769472, 0, 0, 1769473, 0, 0, 1769474, 0, 0, 1769479, 0, 0, 1769480, 0, 0, 1769481, 0, 0, 1769482, 0, 0, 1769483, 0, 0, 1769487, 0, 0, 1769488, 0, 0, 1769489, 0, 0, 1769495, 0, 0, 1769500, 0, 0, 1769501, 0, 0, 1769502, 0, 0, 1769503, 0, 0, 1769504, 0, 0, 1769532, 0, 0, 1835008, 0, 0, 1835009, 0, 0, 1835044, 0, 0, 1835045, 0, 0, 1835067, 0, 0, 1835068, 0, 0, 1900544, 0, 0, 1900565, 0, 0, 1900566, 0, 0, 1900584, 0, 0, 1900585, 0, 0, 1900586, 0, 0, 1900587, 0, 0, 1900588, 0, 0, 1900603, 0, 0, 1900604, 0, 0, 1966080, 0, 0, 1966138, 0, 0, 1966139, 0, 0, 1966140, 0, 0, 2031616, 0, 0, 2031663, 0, 0, 2031664, 0, 0, 2031665, 0, 0, 2031673, 0, 0, 2031674, 0, 0, 2031675, 0, 0, 2031676, 0, 0, 2097152, 0, 0, 2097208, 0, 0, 2097209, 0, 0, 2097210, 0, 0, 2097211, 0, 0, 2097212, 0, 0, 2162688, 0, 0, 2162744, 0, 0, 2162745, 0, 0, 2162746, 0, 0, 2162747, 0, 0, 2162748, 0, 0, 2228224, 0, 0, 2228277, 0, 0, 2228278, 0, 0, 2228279, 0, 0, 2228280, 0, 0, 2228281, 0, 0, 2228282, 0, 0, 2228283, 0, 0, 2228284, 0, 0, 2293760, 0, 0, 2293775, 0, 0, 2293776, 0, 0, 2293813, 0, 0, 2293814, 0, 0, 2293815, 0, 0, 2293816, 0, 0, 2293817, 0, 0, 2293818, 0, 0, 2293819, 0, 0, 2293820, 0, 0, 2359296, 0, 0, 2359297, 0, 0, 2359298, 0, 0, 2359299, 0, 0, 2359300, 0, 0, 2359301, 0, 0, 2359302, 0, 0, 2359303, 0, 0, 2359304, 0, 0, 2359305, 0, 0, 2359306, 0, 0, 2359307, 0, 0, 2359308, 0, 0, 2359309, 0, 0, 2359310, 0, 0, 2359311, 0, 0, 2359312, 0, 0, 2359313, 0, 0, 2359314, 0, 0, 2359315, 0, 0, 2359316, 0, 0, 2359317, 0, 0, 2359321, 0, 0, 2359322, 0, 0, 2359323, 0, 0, 2359324, 0, 0, 2359325, 0, 0, 2359326, 0, 0, 2359327, 0, 0, 2359328, 0, 0, 2359329, 0, 0, 2359330, 0, 0, 2359331, 0, 0, 2359332, 0, 0, 2359333, 0, 0, 2359334, 0, 0, 2359335, 0, 0, 2359336, 0, 0, 2359342, 0, 0, 2359343, 0, 0, 2359344, 0, 0, 2359345, 0, 0, 2359346, 0, 0, 2359347, 0, 0, 2359348, 0, 0, 2359349, 0, 0, 2359350, 0, 0, 2359351, 0, 0, 2359352, 0, 0, 2359353, 0, 0, 2359354, 0, 0, 2359355, 0, 0, 2359356, 0, 0, 2424832, 0, 0, 2424833, 0, 0, 2424834, 0, 0, 2424835, 0, 0, 2424836, 0, 0, 2424837, 0, 0, 2424838, 0, 0, 2424839, 0, 0, 2424840, 0, 0, 2424841, 0, 0, 2424842, 0, 0, 2424843, 0, 0, 2424844, 0, 0, 2424845, 0, 0, 2424846, 0, 0, 2424847, 0, 0, 2424848, 0, 0, 2424849, 0, 0, 2424850, 0, 0, 2424851, 0, 0, 2424852, 0, 0, 2424853, 0, 0, 2424854, 0, 0, 2424857, 0, 0, 2424858, 0, 0, 2424859, 0, 0, 2424860, 0, 0, 2424861, 0, 0, 2424862, 0, 0, 2424863, 0, 0, 2424864, 0, 0, 2424865, 0, 0, 2424866, 0, 0, 2424867, 0, 0, 2424868, 0, 0, 2424869, 0, 0, 2424870, 0, 0, 2424871, 0, 0, 2424872, 0, 0, 2424873, 0, 0, 2424874, 0, 0, 2424878, 0, 0, 2424879, 0, 0, 2424880, 0, 0, 2424881, 0, 0, 2424882, 0, 0, 2424883, 0, 0, 2424884, 0, 0, 2424885, 0, 0, 2424886, 0, 0, 2424887, 0, 0, 2424888, 0, 0, 2424889, 0, 0, 2424890, 0, 0, 2424891, 0, 0, 2424892, 0, 0, 2490368, 0, 0, 2490369, 0, 0, 2490370, 0, 0, 2490371, 0, 0, 2490372, 0, 0, 2490373, 0, 0, 2490374, 0, 0, 2490375, 0, 0, 2490376, 0, 0, 2490377, 0, 0, 2490378, 0, 0, 2490379, 0, 0, 2490380, 0, 0, 2490381, 0, 0, 2490382, 0, 0, 2490383, 0, 0, 2490384, 0, 0, 2490385, 0, 0, 2490386, 0, 0, 2490387, 0, 0, 2490388, 0, 0, 2490389, 0, 0, 2490390, 0, 0, 2490393, 0, 0, 2490394, 0, 0, 2490395, 0, 0, 2490396, 0, 0, 2490397, 0, 0, 2490398, 0, 0, 2490399, 0, 0, 2490400, 0, 0, 2490401, 0, 0, 2490402, 0, 0, 2490403, 0, 0, 2490404, 0, 0, 2490405, 0, 0, 2490406, 0, 0, 2490407, 0, 0, 2490408, 0, 0, 2490409, 0, 0, 2490410, 0, 0, 2490414, 0, 0, 2490415, 0, 0, 2490416, 0, 0, 2490417, 0, 0, 2490418, 0, 0, 2490419, 0, 0, 2490420, 0, 0, 2490421, 0, 0, 2490422, 0, 0, 2490423, 0, 0, 2490424, 0, 0, 2490425, 0, 0, 2490426, 0, 0, 2490427, 0, 0, 2490428, 0, 0, 2555904, 0, 0, 2555905, 0, 0, 2555906, 0, 0, 2555907, 0, 0, 2555908, 0, 0, 2555909, 0, 0, 2555910, 0, 0, 2555911, 0, 0, 2555912, 0, 0, 2555913, 0, 0, 2555914, 0, 0, 2555915, 0, 0, 2555916, 0, 0, 2555917, 0, 0, 2555918, 0, 0, 2555919, 0, 0, 2555920, 0, 0, 2555921, 0, 0, 2555922, 0, 0, 2555923, 0, 0, 2555924, 0, 0, 2555925, 0, 0, 2555926, 0, 0, 2555927, 0, 0, 2555928, 0, 0, 2555929, 0, 0, 2555930, 0, 0, 2555931, 0, 0, 2555932, 0, 0, 2555933, 0, 0, 2555934, 0, 0, 2555935, 0, 0, 2555936, 0, 0, 2555937, 0, 0, 2555938, 0, 0, 2555939, 0, 0, 2555940, 0, 0, 2555941, 0, 0, 2555942, 0, 0, 2555943, 0, 0, 2555944, 0, 0, 2555945, 0, 0, 2555946, 0, 0, 2555947, 0, 0, 2555948, 0, 0, 2555949, 0, 0, 2555950, 0, 0, 2555951, 0, 0, 2555952, 0, 0, 2555953, 0, 0, 2555954, 0, 0, 2555955, 0, 0, 2555956, 0, 0, 2555957, 0, 0, 2555958, 0, 0, 2555959, 0, 0, 2555960, 0, 0, 2555961, 0, 0, 2555962, 0, 0, 2555963, 0, 0, 2555964, 0, 0 ) +tile_data = PoolIntArray( 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 21, 0, 0, 22, 0, 0, 23, 0, 0, 24, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 0, 28, 0, 0, 29, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0, 46, 0, 0, 47, 0, 0, 48, 0, 0, 49, 0, 0, 50, 0, 0, 51, 0, 0, 52, 0, 0, 53, 0, 0, 54, 0, 0, 55, 0, 0, 56, 0, 0, 57, 0, 0, 58, 0, 0, 59, 0, 0, 60, 0, 0, 65536, 0, 0, 65596, 0, 0, 131072, 0, 0, 131132, 0, 0, 196608, 0, 0, 196668, 0, 0, 262144, 0, 0, 262204, 0, 0, 327680, 0, 0, 327740, 0, 0, 393216, 0, 0, 393276, 0, 0, 458752, 0, 0, 458812, 0, 0, 524288, 0, 0, 524348, 0, 0, 589824, 0, 0, 589884, 0, 0, 655360, 0, 0, 655420, 0, 0, 720896, 0, 0, 720956, 0, 0, 786432, 0, 0, 786492, 0, 0, 851968, 0, 0, 852028, 0, 0, 917504, 0, 0, 917564, 0, 0, 983040, 0, 0, 983100, 0, 0, 1048576, 0, 0, 1048636, 0, 0, 1114112, 0, 0, 1114172, 0, 0, 1179648, 0, 0, 1179708, 0, 0, 1245184, 0, 0, 1245244, 0, 0, 1310720, 0, 0, 1310780, 0, 0, 1376256, 0, 0, 1376316, 0, 0, 1441792, 0, 0, 1441852, 0, 0, 1507328, 0, 0, 1507388, 0, 0, 1572864, 0, 0, 1572865, 0, 0, 1572866, 0, 0, 1572867, 0, 0, 1572924, 0, 0, 1638400, 0, 0, 1638401, 0, 0, 1638402, 0, 0, 1638455, 0, 0, 1638456, 0, 0, 1638460, 0, 0, 1703936, 0, 0, 1703937, 0, 0, 1703938, 0, 0, 1703943, 0, 0, 1703944, 0, 0, 1703996, 0, 0, 1769472, 0, 0, 1769473, 0, 0, 1769474, 0, 0, 1769479, 0, 0, 1769480, 0, 0, 1769481, 0, 0, 1769482, 0, 0, 1769483, 0, 0, 1769487, 0, 0, 1769488, 0, 0, 1769489, 0, 0, 1769495, 0, 0, 1769500, 0, 0, 1769501, 0, 0, 1769502, 0, 0, 1769503, 0, 0, 1769504, 0, 0, 1769532, 0, 0, 1835008, 0, 0, 1835009, 0, 0, 1835044, 0, 0, 1835045, 0, 0, 1835067, 0, 0, 1835068, 0, 0, 1900544, 0, 0, 1900565, 0, 0, 1900566, 0, 0, 1900584, 0, 0, 1900585, 0, 0, 1900586, 0, 0, 1900587, 0, 0, 1900588, 0, 0, 1900603, 0, 0, 1900604, 0, 0, 1966080, 0, 0, 1966138, 0, 0, 1966139, 0, 0, 1966140, 0, 0, 2031616, 0, 0, 2031663, 0, 0, 2031664, 0, 0, 2031665, 0, 0, 2031666, 0, 0, 2031674, 0, 0, 2031675, 0, 0, 2031676, 0, 0, 2097152, 0, 0, 2097209, 0, 0, 2097210, 0, 0, 2097211, 0, 0, 2097212, 0, 0, 2162688, 0, 0, 2162742, 0, 0, 2162743, 0, 0, 2162744, 0, 0, 2162745, 0, 0, 2162746, 0, 0, 2162747, 0, 0, 2162748, 0, 0, 2228224, 0, 0, 2228277, 0, 0, 2228278, 0, 0, 2228279, 0, 0, 2228280, 0, 0, 2228281, 0, 0, 2228282, 0, 0, 2228283, 0, 0, 2228284, 0, 0, 2293760, 0, 0, 2293775, 0, 0, 2293776, 0, 0, 2293813, 0, 0, 2293814, 0, 0, 2293815, 0, 0, 2293816, 0, 0, 2293817, 0, 0, 2293818, 0, 0, 2293819, 0, 0, 2293820, 0, 0, 2359296, 0, 0, 2359297, 0, 0, 2359298, 0, 0, 2359299, 0, 0, 2359300, 0, 0, 2359301, 0, 0, 2359302, 0, 0, 2359303, 0, 0, 2359304, 0, 0, 2359305, 0, 0, 2359306, 0, 0, 2359307, 0, 0, 2359308, 0, 0, 2359309, 0, 0, 2359310, 0, 0, 2359311, 0, 0, 2359312, 0, 0, 2359313, 0, 0, 2359314, 0, 0, 2359315, 0, 0, 2359316, 0, 0, 2359317, 0, 0, 2359321, 0, 0, 2359322, 0, 0, 2359323, 0, 0, 2359324, 0, 0, 2359325, 0, 0, 2359326, 0, 0, 2359327, 0, 0, 2359328, 0, 0, 2359329, 0, 0, 2359330, 0, 0, 2359331, 0, 0, 2359332, 0, 0, 2359333, 0, 0, 2359334, 0, 0, 2359335, 0, 0, 2359336, 0, 0, 2359342, 0, 0, 2359343, 0, 0, 2359344, 0, 0, 2359345, 0, 0, 2359346, 0, 0, 2359347, 0, 0, 2359348, 0, 0, 2359349, 0, 0, 2359350, 0, 0, 2359351, 0, 0, 2359352, 0, 0, 2359353, 0, 0, 2359354, 0, 0, 2359355, 0, 0, 2359356, 0, 0, 2424832, 0, 0, 2424833, 0, 0, 2424834, 0, 0, 2424835, 0, 0, 2424836, 0, 0, 2424837, 0, 0, 2424838, 0, 0, 2424839, 0, 0, 2424840, 0, 0, 2424841, 0, 0, 2424842, 0, 0, 2424843, 0, 0, 2424844, 0, 0, 2424845, 0, 0, 2424846, 0, 0, 2424847, 0, 0, 2424848, 0, 0, 2424849, 0, 0, 2424850, 0, 0, 2424851, 0, 0, 2424852, 0, 0, 2424853, 0, 0, 2424854, 0, 0, 2424857, 0, 0, 2424858, 0, 0, 2424859, 0, 0, 2424860, 0, 0, 2424861, 0, 0, 2424862, 0, 0, 2424863, 0, 0, 2424864, 0, 0, 2424865, 0, 0, 2424866, 0, 0, 2424867, 0, 0, 2424868, 0, 0, 2424869, 0, 0, 2424870, 0, 0, 2424871, 0, 0, 2424872, 0, 0, 2424873, 0, 0, 2424874, 0, 0, 2424878, 0, 0, 2424879, 0, 0, 2424880, 0, 0, 2424881, 0, 0, 2424882, 0, 0, 2424883, 0, 0, 2424884, 0, 0, 2424885, 0, 0, 2424886, 0, 0, 2424887, 0, 0, 2424888, 0, 0, 2424889, 0, 0, 2424890, 0, 0, 2424891, 0, 0, 2424892, 0, 0, 2490368, 0, 0, 2490369, 0, 0, 2490370, 0, 0, 2490371, 0, 0, 2490372, 0, 0, 2490373, 0, 0, 2490374, 0, 0, 2490375, 0, 0, 2490376, 0, 0, 2490377, 0, 0, 2490378, 0, 0, 2490379, 0, 0, 2490380, 0, 0, 2490381, 0, 0, 2490382, 0, 0, 2490383, 0, 0, 2490384, 0, 0, 2490385, 0, 0, 2490386, 0, 0, 2490387, 0, 0, 2490388, 0, 0, 2490389, 0, 0, 2490390, 0, 0, 2490393, 0, 0, 2490394, 0, 0, 2490395, 0, 0, 2490396, 0, 0, 2490397, 0, 0, 2490398, 0, 0, 2490399, 0, 0, 2490400, 0, 0, 2490401, 0, 0, 2490402, 0, 0, 2490403, 0, 0, 2490404, 0, 0, 2490405, 0, 0, 2490406, 0, 0, 2490407, 0, 0, 2490408, 0, 0, 2490409, 0, 0, 2490410, 0, 0, 2490414, 0, 0, 2490415, 0, 0, 2490416, 0, 0, 2490417, 0, 0, 2490418, 0, 0, 2490419, 0, 0, 2490420, 0, 0, 2490421, 0, 0, 2490422, 0, 0, 2490423, 0, 0, 2490424, 0, 0, 2490425, 0, 0, 2490426, 0, 0, 2490427, 0, 0, 2490428, 0, 0, 2555904, 0, 0, 2555905, 0, 0, 2555906, 0, 0, 2555907, 0, 0, 2555908, 0, 0, 2555909, 0, 0, 2555910, 0, 0, 2555911, 0, 0, 2555912, 0, 0, 2555913, 0, 0, 2555914, 0, 0, 2555915, 0, 0, 2555916, 0, 0, 2555917, 0, 0, 2555918, 0, 0, 2555919, 0, 0, 2555920, 0, 0, 2555921, 0, 0, 2555922, 0, 0, 2555923, 0, 0, 2555924, 0, 0, 2555925, 0, 0, 2555926, 0, 0, 2555927, 0, 0, 2555928, 0, 0, 2555929, 0, 0, 2555930, 0, 0, 2555931, 0, 0, 2555932, 0, 0, 2555933, 0, 0, 2555934, 0, 0, 2555935, 0, 0, 2555936, 0, 0, 2555937, 0, 0, 2555938, 0, 0, 2555939, 0, 0, 2555940, 0, 0, 2555941, 0, 0, 2555942, 0, 0, 2555943, 0, 0, 2555944, 0, 0, 2555945, 0, 0, 2555946, 0, 0, 2555947, 0, 0, 2555948, 0, 0, 2555949, 0, 0, 2555950, 0, 0, 2555951, 0, 0, 2555952, 0, 0, 2555953, 0, 0, 2555954, 0, 0, 2555955, 0, 0, 2555956, 0, 0, 2555957, 0, 0, 2555958, 0, 0, 2555959, 0, 0, 2555960, 0, 0, 2555961, 0, 0, 2555962, 0, 0, 2555963, 0, 0, 2555964, 0, 0 ) [editable path="Blobby"]