Play game
LOOPsnake's itch.io pageResults
| Criteria | Rank | Score* | Raw Score |
| Enjoyment | #3460 | 3.000 | 3.000 |
| Artwork | #4524 | 2.857 | 2.857 |
| Creativity | #4603 | 3.107 | 3.107 |
| Audio | #5846 | 2.286 | 2.286 |
| Narrative | #6386 | 1.857 | 1.857 |
Ranked from 28 ratings. Score is adjusted from raw score by the median number of ratings per game in the jam.
How does your game fit the theme?
I play with the Theme of Loop because you create Loops around apples to collect in snake
Leave a comment
Log in with itch.io to leave a comment.


Comments
Another snake-like game with a skill tree, there are tons of us!
Fun little game, the apple crunch sound effect was really nice and weighty :)
The game crashed a few times and turned my screen grey when I picked up an apple, but not really sure why. Not sure if you are keeping a list of bugs or not.
Cool entry given the time constraint!
Yea thats a bug i was trying to fix, ran out of time.
Fun little game - I enjoyed the solid connection to the theme and satisfying crunches with each apple. The upgrade system felt nice albeit a little unbalanced (but good for the time constraints of the jam!). Overall with a little polish here and there, this’ll turn out great!
I do love the upgrades, feel like adding in enemies or obstacles and making it a little easier to control your loop would slay. Also be dope to chase down moving targets too! Cute charming game!
despite being a bit janky and gray screening this game was very fun . :)
yea that bug is gonna get fixed
nice game, tho sometimes the screen turns grey
Concept wise, this game is set up for a good time-consuming experience with no clear objective (nothing negative :)). Try to polish the game more, especially the snake movement. Seems like the further your mouse from the snake, the faster it becomes, which is quite hard to create a good loop, since it will drastically slow down when players try to make one, and when reach for a new apple, it quickly goes out of hand. Perhaps a constant speed for the normal movement, and gaining more speed is the job of the upgrades, could make the game feel much more satisfying.
Just some thoughts on the game. Keep up the good work!
PS: SFX could help alot!
It was a great game, I loved the progression and upgrades! However, a rogue bug turned my game window into a blank gray screen.
yea that bug is so anoying its getting removed now
Nice game! Similar to mine too lol
Brooo our ideas are similar haha, love this one. Really liked how you handled the loop mechanic. It felt intuitive, and I’m curious about how you managed loop detection behind the scenes. I was working on something similar and know how tricky that can be. If anyone’s interested in another take on loops, feel free to check out my game from the jam too!
My game ended up having similar controls and I had a very difficult time detecting loops/deciding what to do with them. I'm curious how your loop detection works under the hood cause it seems more robust than what mine ended up being.
ill send you the code (disclaimer this is in GD script and there are lots of removed and broken features) - this is practicly my enitre game code besides the snake movement
extends Node2D
@onready var snake_head = $SnakeHead
@onready var snake_trail = $SnakeTrail
@onready var trail_label: Label = $"CanvasLayer/Panel/Trail Length UI"
var comboactive = false
var path: Array[Vector2] = []
var path_length := 0.0
var combomult = 1
signal dashupgot
var dashup = false
var combolife = 1
signal permspeed
var doubleupgot = false
@export var spacing := 5.0
@export var trail_length := 500.0
var apple := 0
signal speady
var more_apples_upgrade = false
@export var berry_scene: PackedScene
@export var big_apple_scene: PackedScene
@export var golden_apple_scene: PackedScene
@export var bomb_apple_scene: PackedScene
@export var poison_apple_scene: PackedScene
@export var spawn_area: Rect2 = Rect2(Vector2(-1000, -1000), Vector2(1800, 1800))
@export var berry_count := 5
signal moreapplesgot
signal betterpallesgot
signal combogot
var better_apples = false
var big_apple: Node2D = null
var golden_apple: Node2D = null
var bomb_apple: Node2D = null
var poison_apple: Node2D = null
var upgrade_big_apple := false
var upgrade_golden_apple := false
var upgrade_bomb_apple := false
var upgrade_poison_apple := false
var golden_multiplier_active := false
var combo = 0
var extralife = false
var loop_cooldown := false
var loop_check_distance := 15.0
func _ready():
for i in berry_count:
spawn_random_berry()
if upgrade_big_apple:
spawn_big_apple()
if upgrade_golden_apple:
spawn_golden_apple()
if upgrade_bomb_apple:
spawn_bomb_apple()
if upgrade_poison_apple:
spawn_poison_apple()
path.append(snake_head.global_position)
snake_trail.add_point(snake_head.global_position)
func _process(delta):
var current_pos = snake_head.global_position
var last_point = path[-1] if not path.is_empty() else current_pos
var distance = current_pos.distance_to(last_point)
trail_label.text = "Apples: " + str(apple)
if better_apples == true:
emit_signal("betterpallesgot")
if distance >= spacing:
path.append(current_pos)
snake_trail.add_point(current_pos)
path_length += distance
while path.size() > 1 and path_length > trail_length:
var removed = path.pop_front()
var next = path[0]
var seg_length = removed.distance_to(next)
snake_trail.remove_point(0)
path_length -= seg_length
if not loop_cooldown:
_check_for_loop()
func _check_for_loop():
if path.size() < 6:
return
var head = path[-1]
for i in range(path.size() - 5):
if head.distance_to(path[i]) < loop_check_distance:
_process_loop()
break
func _process_loop():
var polygon = path.duplicate()
var collected := 0
var new_points := 0
var golden_multiplier = golden_multiplier_active
golden_multiplier_active = false
for berry in get_tree().get_nodes_in_group("berries"):
var pos = to_local(berry.global_position)
if Geometry2D.is_point_in_polygon(pos, polygon):
_consume_berry(berry)
collected += 1
if better_apples == false:
new_points += 1
else:
new_points += 2
for big in get_tree().get_nodes_in_group("big_apples"):
var pos = to_local(big.global_position)
if Geometry2D.is_point_in_polygon(pos, polygon):
big.queue_free()
spawn_big_apple()
collected += 1
new_points += 3
for gold in get_tree().get_nodes_in_group("golden_apples"):
var pos = to_local(gold.global_position)
if Geometry2D.is_point_in_polygon(pos, polygon):
gold.queue_free()
spawn_golden_apple()
collected += 1
new_points += 5
golden_multiplier_active = true
for bomb in get_tree().get_nodes_in_group("bomb_apples"):
var pos = to_local(bomb.global_position)
if Geometry2D.is_point_in_polygon(pos, polygon):
bomb.queue_free()
spawn_bomb_apple()
_explode_nearby_apples(bomb.global_position)
collected += 1
for poison in get_tree().get_nodes_in_group("poison_apples"):
var pos = to_local(poison.global_position)
if Geometry2D.is_point_in_polygon(pos, polygon):
poison.queue_free()
spawn_poison_apple()
collected += 1
new_points -= 2
if collected >= 2 and doubleupgot== true:
emit_signal("speady")
if new_points > 0 and golden_multiplier:
new_points *= 2
if collected > 0:
$AudioStreamPlayer2D.play()
_start_loop_cooldown()
if combolife == 1 and extralife == true:
combolife =2
if comboactive== true:
apple += new_points + combo
combo+=combomult
print (combo)
else:
apple += new_points
func _consume_berry(berry: Node2D):
berry.queue_free()
spawn_random_berry()
func _random_spawn_pos() -> Vector2:
return Vector2(
randf_range(spawn_area.position.x, spawn_area.end.x),
randf_range(spawn_area.position.y, spawn_area.end.y)
)
func spawn_random_berry():
var berry = berry_scene.instantiate()
berry.global_position = _random_spawn_pos()
berry.add_to_group("berries")
add_child(berry)
func spawn_big_apple():
if big_apple:
big_apple.queue_free()
big_apple = big_apple_scene.instantiate()
big_apple.global_position = _random_spawn_pos()
big_apple.add_to_group("big_apples")
add_child(big_apple)
func spawn_golden_apple():
if golden_apple:
golden_apple.queue_free()
golden_apple = golden_apple_scene.instantiate()
golden_apple.global_position = _random_spawn_pos()
golden_apple.add_to_group("golden_apples")
add_child(golden_apple)
func spawn_bomb_apple():
if bomb_apple:
bomb_apple.queue_free()
bomb_apple = bomb_apple_scene.instantiate()
bomb_apple.global_position = _random_spawn_pos()
bomb_apple.add_to_group("bomb_apples")
add_child(bomb_apple)
func spawn_poison_apple():
if poison_apple:
poison_apple.queue_free()
poison_apple = poison_apple_scene.instantiate()
poison_apple.global_position = _random_spawn_pos()
poison_apple.add_to_group("poison_apples")
add_child(poison_apple)
func _explode_nearby_apples(origin: Vector2):
var radius = 100.0
var to_free := []
for berry in get_tree().get_nodes_in_group("berries"):
if berry.global_position.distance_to(origin) <= radius:
to_free.append(berry)
for big in get_tree().get_nodes_in_group("big_apples"):
if big.global_position.distance_to(origin) <= radius:
to_free.append(big)
for gold in get_tree().get_nodes_in_group("golden_apples"):
if gold.global_position.distance_to(origin) <= radius:
to_free.append(gold)
for poison in get_tree().get_nodes_in_group("poison_apples"):
if poison.global_position.distance_to(origin) <= radius:
to_free.append(poison)
for apple in to_free:
# Determine type and respawn
if apple.is_in_group("berries"):
_consume_berry(apple)
elif apple.is_in_group("big_apples"):
apple.queue_free()
spawn_big_apple()
elif apple.is_in_group("golden_apples"):
apple.queue_free()
spawn_golden_apple()
elif apple.is_in_group("poison_apples"):
apple.queue_free()
spawn_poison_apple()
func _start_loop_cooldown():
loop_cooldown = true
await get_tree().create_timer(0.5).timeout
loop_cooldown = false
func _on_size_increase_pressed() -> void:
if apple >= 1:
trail_length += 50
apple -= 1
func _on_texture_button_pressed() -> void:
if apple >= 3:
berry_count += 2
apple -= 3
spawn_random_berry()
spawn_random_berry()
more_apples_upgrade = true
emit_signal("moreapplesgot")
func _on_texture_button_2_pressed() -> void:
if apple >= 5 and upgrade_big_apple == false and more_apples_upgrade == true:
upgrade_big_apple = true
apple -= 5
spawn_big_apple()
func _on_golden_apples_pressed() -> void:
if apple >= 20 and upgrade_golden_apple == false:
upgrade_golden_apple = true
apple -= 20
spawn_golden_apple()
func _on_better_apples_pressed() -> void:
if apple >= 5 and better_apples == false:
better_apples = true
apple -=5
func _on_snake_head_bang() -> void:
combolife -= 1
if combolife <= 0:
combo = 0
combolife = 1 if extralife else 0
func _on_combo_pressed() -> void:
if comboactive == false and apple>= 5:
comboactive= true
apple-= 5
emit_signal("combogot")
func _on_x_combo_pressed() -> void:
if apple >= 10 and combomult==1:
apple-= 10
combomult = 2
func _on_extra_life_streak_pressed() -> void:
if apple>=10 and combolife==1 and extralife == false :
apple-=10
combolife=2
extralife = true
func _on_double_pressed() -> void:
if apple >= 5 and doubleupgot == false:
doubleupgot = true
apple -= 5
func _on_speed_pressed() -> void:
if apple >= 1:
emit_signal("permspeed")
apple-=1
func _on_dash_pressed() -> void:
if apple >= 10 and dashup == false:
dashup = true
apple -= 10
emit_signal("dashupgot")
sorry if its quite long i didnt remove anything in case of breaking it
also - the formating is broken there are normaly tabs
best game ever made. (Though I did notice that loops could just be made near apples and the apple would get eaten)
Thanks so much yea i had bugs to fix on my trello board but i didnt get enough time to fix them
i fw this game
10/10 game of the year but would be better if there were more apples
This game is very unpolished, and frankly, not very good. The loop mechanic was buggy, the visuals were trashy, and the upgrade system was strange. This game screams "essay that I did the night before it was due" and it crashed on me numerous times. This game needs a lot of work to be good, and that work was clearly not put in. The gameplay loop was uninteresting, especially given that there is no way to fail. In a snake game. Overall, this game is not one I would recommend to anyone.
Can you compare my LOOPsnake and the other LoopSnake that was also submitted in the jam
Woah woah woah don’t point them my way haha
shush deathstrucke i think the game is very polished
Be nice it’s a game jam not a triple A game