From d60f93db3ef3e2c0acf47f3b41cdc1c1da24ed8f Mon Sep 17 00:00:00 2001 From: Jonas Mucke Date: Mon, 20 Apr 2020 14:38:58 +0200 Subject: [PATCH 1/7] ai movement, ai hit and move treshhold added --- src/Boss/SlimeBoss/SlimeBoss.tscn | 10 +++-- src/Objects/Bonfire/Bonfire.tscn | 2 +- src/Overlap/AI/AI_Hero.gd | 61 +++++++++++++++++++++---------- src/Player/Player.tscn | 6 +-- src/World.tscn | 4 +- 5 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/Boss/SlimeBoss/SlimeBoss.tscn b/src/Boss/SlimeBoss/SlimeBoss.tscn index cd64f46..4359ca6 100644 --- a/src/Boss/SlimeBoss/SlimeBoss.tscn +++ b/src/Boss/SlimeBoss/SlimeBoss.tscn @@ -20,7 +20,7 @@ radius = 18.0 height = 18.0 [sub_resource type="CapsuleShape2D" id=2] -radius = 18.0 +radius = 20.0 height = 18.0 [sub_resource type="CircleShape2D" id=3] @@ -448,7 +448,7 @@ states/move/position = Vector2( 143, 70 ) [node name="SlimeBoss" type="KinematicBody2D"] collision_layer = 4 -collision_mask = 3 +collision_mask = 131 script = ExtResource( 4 ) __meta__ = { "_edit_group_": true @@ -491,9 +491,11 @@ collision_layer = 4 position = Vector2( 0, -15 ) shape = SubResource( 1 ) -[node name="Hurtbox" parent="." instance=ExtResource( 1 )] +[node name="Hurtbox" parent="." groups=[ +"HittableByPlayer", +] instance=ExtResource( 1 )] collision_layer = 4 -collision_mask = 0 +collision_mask = 128 [node name="CollisionShape2D" parent="Hurtbox" index="0"] position = Vector2( 0, -15 ) diff --git a/src/Objects/Bonfire/Bonfire.tscn b/src/Objects/Bonfire/Bonfire.tscn index e2291eb..26220d0 100644 --- a/src/Objects/Bonfire/Bonfire.tscn +++ b/src/Objects/Bonfire/Bonfire.tscn @@ -45,7 +45,7 @@ shape = SubResource( 2 ) [node name="Hitbox" parent="." instance=ExtResource( 4 )] collision_layer = 16 -damage = -0.5 +damage = -1.5 [node name="CollisionShape2D" parent="Hitbox" index="0"] position = Vector2( 0, -2 ) diff --git a/src/Overlap/AI/AI_Hero.gd b/src/Overlap/AI/AI_Hero.gd index e298d71..131fb12 100644 --- a/src/Overlap/AI/AI_Hero.gd +++ b/src/Overlap/AI/AI_Hero.gd @@ -33,9 +33,15 @@ var actionFieldUsed = false var areaRefList = [] -var threadTime = 0.6 +var threadTime = 0.4 var threadDelta = 0.0 +var hitDelta = 0.0 +var hitTreshhold = 0.1 + +var aiDelta = 0.0 +var aiTreshhold = 0.4 + #calculates the sum of all present prios func calcTotalPrio(): var sum = 0 @@ -70,7 +76,7 @@ func calcPrioTable(): #14+7 0.999 #updates heart and bonfire prio func adjustPrio(currentHealth, maxHealth): - var prioVal = 10.0 - (float(currentHealth)/float(maxHealth))*10.0 + var prioVal = 20.0 - (float(currentHealth)/float(maxHealth))*20.0 var bonfire = prioVal + 1 var hearts = prioVal if(hearts < 0): @@ -106,6 +112,7 @@ func getCost(field): # curr - current position # targ - a target position func h_fn(curr, target): + var h = min(target[0]-curr[0],target[1]-curr[1]) return 0 # currCost - currentCost @@ -143,21 +150,25 @@ func adjacent(currentPosition, can_roll = true): continue if(grid.object_grid[next[0]][next[1]][0]!=Grid.Kind.WALL): if(i==0): + continue if(grid.object_grid[pot_adj_step[1][0]][pot_adj_step[1][1]][0]!=Grid.Kind.WALL && grid.object_grid[pot_adj_step[3][0]][pot_adj_step[3][1]][0]!=Grid.Kind.WALL): adj.append([STEP, Vector2(next[0],next[1]),1.1]) continue if(i==2): + continue if(grid.object_grid[pot_adj_step[1][0]][pot_adj_step[1][1]][0]!=Grid.Kind.WALL && grid.object_grid[pot_adj_step[4][0]][pot_adj_step[4][1]][0]!=Grid.Kind.WALL): adj.append([STEP, Vector2(next[0],next[1]),1.1]) continue if(i==5): + continue if(grid.object_grid[pot_adj_step[3][0]][pot_adj_step[3][1]][0]!=Grid.Kind.WALL && grid.object_grid[pot_adj_step[6][0]][pot_adj_step[6][1]][0]!=Grid.Kind.WALL): adj.append([STEP, Vector2(next[0],next[1]),1.1]) continue if(i==7): + continue if(grid.object_grid[pot_adj_step[4][0]][pot_adj_step[4][1]][0]!=Grid.Kind.WALL && grid.object_grid[pot_adj_step[6][0]][pot_adj_step[6][1]][0]!=Grid.Kind.WALL): adj.append([STEP, Vector2(next[0],next[1]),1.1]) @@ -267,11 +278,15 @@ func hit_or_miss(target, current, delta): func movement_decider_ai(target, kindOfStep, delta): var currentPosition = grid._pixel_to_grid_coords(global_position) - var currentPixel = global_position - var hitPixelTarget = is_hittable() - if hitPixelTarget!=null: - hit_or_miss(hitPixelTarget, currentPixel, delta*4) + if hitDelta >= hitTreshhold && randf() <0.5: + hitDelta -= hitTreshhold + var currentPixel = global_position + var hitPixelTarget = is_hittable() + + if hitPixelTarget!=null: + hit_or_miss(hitPixelTarget, currentPixel, delta*4) + return else: if(kindOfStep==STEP): @@ -288,12 +303,15 @@ func movement_decider_ai(target, kindOfStep, delta): func movement_execution(delta): - var currentPixel = global_position - var hitPixelTarget = is_hittable() - if hitPixelTarget!=null: - hit_or_miss(hitPixelTarget, currentPixel, delta*4) - return + if hitDelta >= hitTreshhold && randf() <0.5: + hitDelta -= hitTreshhold + var currentPixel = global_position + var hitPixelTarget = is_hittable() + + if hitPixelTarget!=null: + hit_or_miss(hitPixelTarget, currentPixel, delta*4) + return if(targetFieldUsed): var cur = grid._pixel_to_grid_coords(global_position) @@ -320,16 +338,19 @@ func reset_exeution_state(delta): -func makeMove(delta): - if ExecutionState == AI_MOVE: - threadDelta = 0 - var MoveAdvice = movement_calulcaotr() - if(MoveAdvice==null): - return - var target = MoveAdvice[1] - movement_decider_ai(target, MoveAdvice[0], delta) +func makeMove(delta): + hitDelta += delta + aiDelta+=delta + if(aiDelta>aiTreshhold): + if ExecutionState == AI_MOVE: + threadDelta = 0 + var MoveAdvice = movement_calulcaotr() + if(MoveAdvice==null): + return + var target = MoveAdvice[1] + movement_decider_ai(target, MoveAdvice[0], delta) - elif ExecutionState == EXECUTING: + if ExecutionState == EXECUTING: movement_execution(delta) reset_exeution_state(delta) diff --git a/src/Player/Player.tscn b/src/Player/Player.tscn index b35f873..be52078 100644 --- a/src/Player/Player.tscn +++ b/src/Player/Player.tscn @@ -619,19 +619,17 @@ height = 0.2 radius = 4.03497 height = 9.42006 -[sub_resource type="CircleShape2D" id=51] +[sub_resource type="CircleShape2D" id=49] radius = 13.3924 [sub_resource type="DynamicFont" id=50] size = 12 font_data = ExtResource( 6 ) - [node name="Player" type="KinematicBody2D" groups=[ "hero", ]] collision_mask = 14 - script = ExtResource( 1 ) ROLL_SPEED = 120 FRICTION = 270 @@ -724,7 +722,7 @@ damage = 0.0 [node name="CollisionShape2D" parent="Pivot/SwordRange" index="0"] position = Vector2( 0, -4.56405 ) -shape = SubResource( 51 ) +shape = SubResource( 49 ) [node name="DebugLabel" type="Label" parent="."] margin_left = -8.12021 diff --git a/src/World.tscn b/src/World.tscn index beddf7c..595ba10 100644 --- a/src/World.tscn +++ b/src/World.tscn @@ -21,7 +21,7 @@ region_enabled = true region_rect = Rect2( 0, 0, 1280, 720 ) [node name="Background" parent="." instance=ExtResource( 7 )] -frame = 20 +frame = 41 [node name="FloorTileMap" type="TileMap" parent="."] visible = false @@ -40,7 +40,7 @@ __meta__ = { [node name="YSort" type="YSort" parent="."] [node name="Bonfire" parent="YSort" instance=ExtResource( 10 )] -position = Vector2( 265.543, -16 ) +position = Vector2( 448, 32 ) [node name="Player" parent="YSort" instance=ExtResource( 1 )] position = Vector2( 344, 125.768 ) From e2f50060db48d4f2cd389fccfc5f48df244736e6 Mon Sep 17 00:00:00 2001 From: Jonas Mucke Date: Mon, 20 Apr 2020 14:41:29 +0200 Subject: [PATCH 2/7] deleted h(x) and changed cost --- src/Overlap/AI/AI_Hero.gd | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Overlap/AI/AI_Hero.gd b/src/Overlap/AI/AI_Hero.gd index 131fb12..c88b2d4 100644 --- a/src/Overlap/AI/AI_Hero.gd +++ b/src/Overlap/AI/AI_Hero.gd @@ -103,17 +103,18 @@ func getCost(field): for i in grid.object_grid[field.x][field.y]: match i: Grid.Kind.DAMAGE: - cost += 100 + cost += 15 Grid.Kind.SLOW: - cost += 1 + cost += 4 return cost #return an heurestic of distance # curr - current position # targ - a target position func h_fn(curr, target): + return 0 var h = min(target[0]-curr[0],target[1]-curr[1]) - return 0 + return h # currCost - currentCost # target - position of the field to move to From a84331a7020480e5b5598866f4b5b05d993130b9 Mon Sep 17 00:00:00 2001 From: Conrad Date: Mon, 20 Apr 2020 20:32:45 +0200 Subject: [PATCH 3/7] Update README.md --- README.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5b2aaa1..e11f8d6 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,25 @@ -# WORKING TITLE +# Bosskeeper - Keep the boss alive! -## Summary +## Story -Short summary of the game and gameplay. +You start the game as a main character of any old video game and meet the slime boss - pretty much the first thing you encounter anywhere. But the boss is weak and easily defeated and therefore nobody even took the time to kill it properly. In this moment you decide that your days as a hero are over and that you would love nothing more than to help this boss to stay alive as long as possible. + +In this game you have cards to help the angry slime boss to survive. Each time a marvelous hero comes by, you get the chance to place traps, walls, fields of slime and valuable barrels the hero just can't resist to look into. But watch out: if the slime boss dies, you are defeated too. + +Have fun playing ~ + +## Context + +This is a minigame developed by a team of 8 people for the Ludum Dare No. 46 in 04/2020 over the course of 3 days. The team members consisted of @panorb, @Sonaion, @Streamfire, @DerAnonymos, @Mienek, Leo (for all major assets), Markus (for sounds) and @creyD. It is written in the Godot framework and a playable version can be downloaded on the release page of this repo. ## Branching -- `master` - Current state of the game +- `master` - Current state of the game, latest major release - `dev` - Next feature update state of the game - Merged to `master` - `dev-X` - Specific features for the game - Merged to `dev` - `hotfix-X` - Bugfixes that need to be pushed to all branches -## Context -Ludum Dare whatever +## Bugs + +You may report bugs [here](https://github.com/creyD/ludum_dare_46/issues/new) but please don't expect us to fix them in a timely manner. From c551a70b4d112b50f3e532f7adb8a99cf5db63ff Mon Sep 17 00:00:00 2001 From: Conrad Date: Mon, 20 Apr 2020 20:45:41 +0200 Subject: [PATCH 4/7] Stopped the background from playing on default This reduces our world default changes from 1 to 0 --- src/World.tscn | 1 + 1 file changed, 1 insertion(+) diff --git a/src/World.tscn b/src/World.tscn index beddf7c..f933691 100644 --- a/src/World.tscn +++ b/src/World.tscn @@ -22,6 +22,7 @@ region_rect = Rect2( 0, 0, 1280, 720 ) [node name="Background" parent="." instance=ExtResource( 7 )] frame = 20 +playing = false [node name="FloorTileMap" type="TileMap" parent="."] visible = false From e380a18ee3f0950da390c0e64529fd418589f6d7 Mon Sep 17 00:00:00 2001 From: Jonas Mucke Date: Mon, 20 Apr 2020 20:52:07 +0200 Subject: [PATCH 5/7] finished player ai --- src/Maps/Grid.gd | 218 ++++++++++++++++++++++++++---------- src/Overlap/AI/AI_Hero.gd | 229 +++++++------------------------------- src/Player/Player.gd | 13 +-- src/Player/Player.tscn | 2 +- src/World.tscn | 2 +- 5 files changed, 203 insertions(+), 261 deletions(-) diff --git a/src/Maps/Grid.gd b/src/Maps/Grid.gd index 6253da2..c5a2514 100644 --- a/src/Maps/Grid.gd +++ b/src/Maps/Grid.gd @@ -1,32 +1,104 @@ extends Node const Kind = preload("res://Overlap/Kind.gd") # Relative path +onready var aStar_node = AStar.new() + +var path_start_position : Vector2= Vector2() setget _set_path_start_position +var path_end_position : Vector2 = Vector2() setget _set_path_end_position + +var obstacles = [] +var _point_path = [] +var _half_cell_size = Vector2() var object_grid : Array = [] var prio_grid : Array = [] -var used_grid : Array = [] var time_passed := 0.0 var offset -export(float, 0, 42.0) var refresh_rate = 0.0 +export(float, 0, 42.0) var refresh_rate = 0.4 + +func _point_coors(point : Vector2): + return 14*point.y+point.x + +func _ready(): + var walls = get_tree().current_scene.get_node("FloorTileMap") + offset = walls.global_position -func _draw_object_grid(): + for x in range(14): + object_grid.push_back([]) + prio_grid.push_back([]) + for y in range(7): + object_grid[x].push_back([Kind.FIELD]) + prio_grid[x].push_back([Kind.TERMINAL_SYMBOL]) + + + for tile in walls.get_used_cells(): + if(is_in_coord(tile)): + object_grid[tile.x][tile.y][0] = Kind.WALL + obstacles.push_back(Vector2(tile.x, tile.y)) + + var walkableCells = [] for y in range(7): - var stri = "" for x in range(14): - stri += str(object_grid[x][y]) + " " - print(stri) - print() - - -func _draw_prio_grid(): - for y in range(7): - var stri = "" - for x in range(14): - stri += str(prio_grid[x][y]) + " " - print(stri) - print() - + if object_grid[x][y][0] == Kind.FIELD: + walkableCells.push_back(Vector2(x,y)) + var Index = _point_coors(Vector2(x,y)) + aStar_node.add_point(Index, Vector3(x,y,0.0)) + + #add points straight + for point in walkableCells: + var point_index = _point_coors(point) + + var points_relative_str = PoolVector2Array([ + Vector2(point.x + 1, point.y), + Vector2(point.x - 1, point.y), + Vector2(point.x , point.y + 1), + Vector2(point.x , point.y - 1) + ]) + for point_rel in points_relative_str: + var point_relative_index = _point_coors(point_rel) + + if point_rel == point or not is_in_coord(point_rel): + continue + if not aStar_node.has_point(point_relative_index): + continue + aStar_node.connect_points(point_index, point_relative_index, true) + + #diagonal + for point in walkableCells: + var point_index = _point_coors(point) + + var points_relative_dia = PoolVector2Array([ + Vector2(point.x + 1, point.y + 1), Vector2(point.x, point.y + 1), Vector2(point.x + 1, point.y), + Vector2(point.x - 1, point.y + 1), Vector2(point.x, point.y + 1), Vector2(point.x - 1, point.y), + Vector2(point.x + 1, point.y - 1), Vector2(point.x, point.y - 1), Vector2(point.x + 1, point.y), + Vector2(point.x - 1, point.y - 1), Vector2(point.x, point.y - 1), Vector2(point.x - 1, point.y) + ]) + + for i in range(points_relative_dia.size()/3): + var p_targ = points_relative_dia[i*3] + var p_ch1 = points_relative_dia[i*3+1] + var p_ch2 = points_relative_dia[i*3+2] + + var p_targ_c = _point_coors(p_targ) + var p_ch1_c = _point_coors(p_targ) + var p_ch2_c = _point_coors(p_targ) + + if p_targ == point or not is_in_coord(p_targ) and not aStar_node.has_point(p_targ_c): + continue + if p_ch1 == point or not is_in_coord(p_ch1) and not aStar_node.has_point(p_ch1_c): + continue + if p_ch2 == point or not is_in_coord(p_ch2) and not aStar_node.has_point(p_ch2_c): + continue + + aStar_node.connect_points(point_index, p_targ_c, true) + + +func recalculate_path(): + _point_path = [] + var start_index = _point_coors(path_start_position) + var end_index = _point_coors(path_end_position) + _point_path = aStar_node.get_point_path(start_index, end_index) func _reset_grids(): for x in range(14): @@ -37,33 +109,6 @@ func _reset_grids(): prio_grid[x][y].pop_back() -func _ready(): - - var walls = get_tree().current_scene.get_node("FloorTileMap") - offset = walls.global_position - #todo put in grid_lul - for x in range(14): - object_grid.push_back([]) - prio_grid.push_back([]) - used_grid.push_back([]) - for y in range(7): - object_grid[x].push_back([Kind.FIELD]) - prio_grid[x].push_back([Kind.TERMINAL_SYMBOL]) - used_grid[x].push_back(false) - - for tile in walls.get_used_cells(): - if(_is_in_grid(tile)): - object_grid[tile.x][tile.y][0] = Kind.WALL - - _update_grid() - - -func reset_history(): - for x in range(14): - for y in range(7): - used_grid[x][y] = false - - func countTargets(table): for i in range(table.size()): table[i]=0 @@ -83,19 +128,6 @@ func _pixel_to_grid_coords(pixel : Vector2) -> Vector2: new_coords.y = floor((pixel.y-offset.y) / 32.0) return new_coords - -func _is_in_grid(grid_coords : Vector2) -> bool: - if(grid_coords.x < 0): - return false - if(grid_coords.x > 13): - return false - if(grid_coords.y < 0): - return false - if(grid_coords.y > 6): - return false - return true - - func get_nearest(position, kind): var list = [] for x in range(14): @@ -115,6 +147,23 @@ func get_nearest(position, kind): mini = i return list[mini] +func get_fields_around(point): + var points_relative_str = PoolVector2Array([ + Vector2(point.x + 1, point.y + 1), + Vector2(point.x - 1, point.y + 1), + Vector2(point.x + 1, point.y - 1), + Vector2(point.x - 1, point.y - 1) + ]) + var point_list = [] + for point_rel in points_relative_str: + var point_relative_index = _point_coors(point_rel) + if point_rel == point or not is_in_coord(point_rel): + continue + if not aStar_node.has_point(point_relative_index): + continue + point_list.push_back(point_rel) + return point_list + func _update_grid(): _reset_grids() @@ -122,14 +171,65 @@ func _update_grid(): for node in world.get_children(): var node_kind = node.get_node("Kind") var grid_corrds = _pixel_to_grid_coords(node.global_position) - if (_is_in_grid(grid_corrds)): + if (is_in_coord(grid_corrds)): if(node_kind.general != Kind.FIELD and node_kind.general != Kind.WALL): object_grid[grid_corrds.x][grid_corrds.y].push_back(node_kind.general) prio_grid[grid_corrds.x][grid_corrds.y].push_back(node_kind.kind) - + + for y in range(7): + for x in range(14): + var index = _point_coors(Vector2(x,y)) + var scale = 1.0 + for val in object_grid[x][y]: + match val: + Kind.DAMAGE: + scale += 16 + Kind.HEALING: + scale -= 8 + Kind.SLOW: + scale += 8 + var neighboor_list = get_fields_around(Vector2(x,y)) + for neighboor in neighboor_list: + for val in object_grid[neighboor.x][neighboor.y]: + match val: + Kind.DAMAGE: + scale += 16 + Kind.HEALING: + scale -= 8 + Kind.SLOW: + scale += 8 + if(scale<0): + scale = 0 + aStar_node.set_point_weight_scale(index, scale) func _physics_process(delta): if(time_passed > refresh_rate): time_passed -= refresh_rate _update_grid() time_passed += delta + + +func is_in_coord(point): + if point[0]<0 || point[0]>13: + return false + if point[1]<0 || point[1]>6: + return false + return true + +func _set_path_start_position(value : Vector2): + if value in obstacles: + return + if not is_in_coord(value): + return + + path_start_position = value + + + +func _set_path_end_position(value : Vector2): + if value in obstacles: + return + if not is_in_coord(value): + return + + path_end_position = value diff --git a/src/Overlap/AI/AI_Hero.gd b/src/Overlap/AI/AI_Hero.gd index c88b2d4..51a4c86 100644 --- a/src/Overlap/AI/AI_Hero.gd +++ b/src/Overlap/AI/AI_Hero.gd @@ -6,6 +6,7 @@ const PrioQueue = preload("prio_queue.gd") # Relative path const Grid = preload("res://Maps/Grid.gd") var grid +var lock = Mutex.new() enum{ STEP, @@ -73,7 +74,7 @@ func calcPrioTable(): i += 1 return table -#14+7 0.999 + #updates heart and bonfire prio func adjustPrio(currentHealth, maxHealth): var prioVal = 20.0 - (float(currentHealth)/float(maxHealth))*20.0 @@ -94,157 +95,27 @@ func calcEnemyKind(): return i #returns a move -func getMoveDescription(myPosition : Vector2, targetPositions): - return AStar(myPosition, targetPositions) - - -func getCost(field): - var cost = 0 - for i in grid.object_grid[field.x][field.y]: - match i: - Grid.Kind.DAMAGE: - cost += 15 - Grid.Kind.SLOW: - cost += 4 - return cost +func getMoveDescription(myPosition : Vector2, targetPositions : Vector2): + grid.path_start_position = myPosition + grid.path_end_position = targetPositions + grid.recalculate_path() + if(grid._point_path.size()<=1): + return [NOTHING, [0,0]] + var to = grid._point_path[1] + var from = grid._point_path[0] + var p1 = pow(to[0]-from[0],2) + var p2 = pow(to[1]-from[1],2) -#return an heurestic of distance -# curr - current position -# targ - a target position -func h_fn(curr, target): - return 0 - var h = min(target[0]-curr[0],target[1]-curr[1]) - return h - -# currCost - currentCost -# target - position of the field to move to -func g_fn(currCost, target): - return currCost + getCost(target) + var norm = sqrt(p1+p2) + var move = STEP + if(norm > 1.0 && p1 != p2): + move = ROLL + return [move, grid._point_path[1]] -# Returns the list of adjacent nodes -func adjacent(currentPosition, can_roll = true): - var adj := [] - #adj.append([STEP, Vector2(0,0)]) - var p = currentPosition - var pot_adj_step = [[p[0]-1, p[1]-1], [p[0]-0, p[1]-1], [p[0]+1, p[1]-1], - [p[0]-1, p[1]-0], [p[0]+1, p[1]+0], - [p[0]-1, p[1]+1], [p[0]+0, p[1]+1], [p[0]+1, p[1]+1]] - - var pot_adj_roll = [[p[0]-0, p[1]-2], - [p[0]-2, p[1]-0],[p[0]+2, p[1]+0], - [p[0]+0, p[1]+2]] - - - for i in range(pot_adj_step.size()): - var next = pot_adj_step[i] - if(next[0]<0): - continue - if(next[0]>13): - continue - if(next[1]<0): - continue - if(next[1]>6): - continue - if(grid.used_grid[next[0]][next[1]]): - continue - if(grid._is_in_grid(Vector2(next[0], next[1])) ==false): - continue - if(grid.object_grid[next[0]][next[1]][0]!=Grid.Kind.WALL): - if(i==0): - continue - if(grid.object_grid[pot_adj_step[1][0]][pot_adj_step[1][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[3][0]][pot_adj_step[3][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - if(i==2): - continue - if(grid.object_grid[pot_adj_step[1][0]][pot_adj_step[1][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[4][0]][pot_adj_step[4][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - if(i==5): - continue - if(grid.object_grid[pot_adj_step[3][0]][pot_adj_step[3][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[6][0]][pot_adj_step[6][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - if(i==7): - continue - if(grid.object_grid[pot_adj_step[4][0]][pot_adj_step[4][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[6][0]][pot_adj_step[6][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - - adj.append([STEP, Vector2(next[0],next[1]),1.0]) - - - for i in range(pot_adj_roll.size()): - var next = pot_adj_roll[i] - if(next[0]<0): - continue - if(next[0]>13): - continue - if(next[1]<0): - continue - if(next[1]>6): - continue - if(grid.used_grid[next[0]][next[1]]): - continue - if(grid._is_in_grid(Vector2(next[0], next[1])) == false): - continue - if(grid.object_grid[next[0]][next[1]][0]!=Grid.Kind.WALL): - if(i==0): - if(grid.object_grid[next[0]+0][next[1]+1][0]!=Grid.Kind.WALL): - adj.append([ROLL, Vector2(next[0],next[1]),1.0]) - if(i==1): - if(grid.object_grid[next[0]+1][next[1]+0][0]!=Grid.Kind.WALL): - adj.append([ROLL, Vector2(next[0],next[1]),1.0]) - if(i==2): - if(grid.object_grid[next[0]-1][next[1]+0][0]!=Grid.Kind.WALL): - adj.append([ROLL, Vector2(next[0],next[1]),1.0]) - if(i==3): - if(grid.object_grid[next[0]+0][next[1]-1][0]!=Grid.Kind.WALL): - adj.append([ROLL, Vector2(next[0],next[1]),1.0]) - - return adj - - -func AStar(source, target): - #swap rtarget and source, when target source istr reached, do inversxse step - # node layout [g+h(x), g(x), current, from, kind] - var tmp = source - source = target - target = tmp - - var Q = PrioQueue.new() - Q.insert([0,0, [source[0], source[1]], [source[0], source[1]], NOTHING] ) - while !Q.empty(): - var node = Q.delMin() - - # Check if reached - if(node[2][0] == target[0] and node[2][1] == target[1]): - return [node[4], node[3]] # 4 is kind | 3 is from - - # Set flag - grid.used_grid[node[2][0]][node[2][1]] = true - var adj_list = adjacent(node[2]) - var current_field = node[2] - for i in adj_list: - var move_cost = i[2] - - var g_val = g_fn(node[1]+move_cost, i[1]) - var h_val = h_fn(i[1], target) - - #[g+h(x), g(x), current, from, kind] - var new_node = [g_val+h_val, g_val,i[1], node[2], i[0]] - Q.insert(new_node) - - return [NOTHING, [0,0]] func movement_calulcaotr(): var currentPosition = grid._pixel_to_grid_coords(global_position) - var enemyKind numbers = grid.countTargets(numbers) @@ -252,21 +123,17 @@ func movement_calulcaotr(): enemyKind = calcEnemyKind() actionKind = enemyKind actionFieldUsed = true + if(enemyKind==Grid.Kind.TERMINAL_SYMBOL): + return else: enemyKind = actionKind - if(enemyKind==Grid.Kind.TERMINAL_SYMBOL): - return - var targetField = grid.get_nearest(currentPosition, enemyKind) if(targetField==[-1,-1]): - return + return - - var MoveAdvice = getMoveDescription(currentPosition, targetField) - grid.reset_history() + return getMoveDescription(currentPosition, Vector2(targetField[0], targetField[1])) - return MoveAdvice func is_hittable(): var length = areaRefList.size() @@ -280,40 +147,28 @@ func hit_or_miss(target, current, delta): func movement_decider_ai(target, kindOfStep, delta): var currentPosition = grid._pixel_to_grid_coords(global_position) - if hitDelta >= hitTreshhold && randf() <0.5: - hitDelta -= hitTreshhold - var currentPixel = global_position - var hitPixelTarget = is_hittable() - - if hitPixelTarget!=null: - hit_or_miss(hitPixelTarget, currentPixel, delta*4) - return - + hitDelta -= hitTreshhold + var currentPixel = global_position + var hitPixelTarget = is_hittable() + + if hitPixelTarget!=null && randf()<0.5: + hit_or_miss(hitPixelTarget, currentPixel, delta*4) else: if(kindOfStep==STEP): run(Vector2(target[0]-currentPosition[0], target[1]-currentPosition[1]), delta*4) targetFieldCur = target - targetFieldUsed = true ai_movement_state = STEP elif(kindOfStep==ROLL): roll(Vector2(target[0]-currentPosition[0], target[1]-currentPosition[1]), delta*4) - targetFieldCur = target - targetFieldUsed = true + + targetFieldCur = target + targetFieldUsed = true + ExecutionState = EXECUTING -func movement_execution(delta): - - if hitDelta >= hitTreshhold && randf() <0.5: - hitDelta -= hitTreshhold - var currentPixel = global_position - var hitPixelTarget = is_hittable() - - if hitPixelTarget!=null: - hit_or_miss(hitPixelTarget, currentPixel, delta*4) - return - +func movement_execution(delta): if(targetFieldUsed): var cur = grid._pixel_to_grid_coords(global_position) var distance = sqrt(pow(cur[0]-targetFieldCur[0],2)+ pow(cur[1]-targetFieldCur[1],2)) @@ -340,21 +195,19 @@ func reset_exeution_state(delta): func makeMove(delta): - hitDelta += delta - aiDelta+=delta - if(aiDelta>aiTreshhold): - if ExecutionState == AI_MOVE: - threadDelta = 0 - var MoveAdvice = movement_calulcaotr() - if(MoveAdvice==null): - return - var target = MoveAdvice[1] - movement_decider_ai(target, MoveAdvice[0], delta) + lock.lock() + if ExecutionState == AI_MOVE: + threadDelta = 0 + var MoveAdvice = movement_calulcaotr() + if(MoveAdvice==null): + return + var target = MoveAdvice[1] + movement_decider_ai(target, MoveAdvice[0], delta) if ExecutionState == EXECUTING: movement_execution(delta) reset_exeution_state(delta) - + lock.unlock() # API Interface for ai_hero -> methods are handled in player.gd func attac(direction, delta): diff --git a/src/Player/Player.gd b/src/Player/Player.gd index 2abd01c..e50f982 100644 --- a/src/Player/Player.gd +++ b/src/Player/Player.gd @@ -150,24 +150,13 @@ func movement_hit(): func hit_finished(): grid._update_grid() movementState = moveState.IDLE - ai_movement_state = STEP - ExecutionState = EXECUTING + ExecutionState = AI_MOVE actionFieldUsed = false func movement_roll(): velocity = rollvector * ROLL_SPEED animation_state.change_state("roll") - - """ - # Roll.gd - func enter(): - owner.animation_state.travel("roll") - - func update(): - owner.velocity = rollvector * ROLL_SPEED - """ - ExecutionState = EXECUTING func roll_finished(): diff --git a/src/Player/Player.tscn b/src/Player/Player.tscn index be52078..a032e86 100644 --- a/src/Player/Player.tscn +++ b/src/Player/Player.tscn @@ -736,7 +736,7 @@ __meta__ = { } [node name="Stats" parent="." instance=ExtResource( 5 )] -max_health = 5 +max_health = 20 [node name="AnimationStates" type="Node" parent="."] script = ExtResource( 15 ) diff --git a/src/World.tscn b/src/World.tscn index 595ba10..d9487ac 100644 --- a/src/World.tscn +++ b/src/World.tscn @@ -21,7 +21,7 @@ region_enabled = true region_rect = Rect2( 0, 0, 1280, 720 ) [node name="Background" parent="." instance=ExtResource( 7 )] -frame = 41 +frame = 4 [node name="FloorTileMap" type="TileMap" parent="."] visible = false From 75e8a0d18887cb452160b18a826ca4e5bb893d63 Mon Sep 17 00:00:00 2001 From: Conrad Date: Mon, 20 Apr 2020 21:00:25 +0200 Subject: [PATCH 6/7] Updated new icon --- src/icon.ico | Bin 0 -> 34494 bytes src/icon.png | Bin 228 -> 551 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icon.ico diff --git a/src/icon.ico b/src/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..669eb87485e566448af37ad3f4bb596933687bca GIT binary patch literal 34494 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 literal 0 HcmV?d00001 diff --git a/src/icon.png b/src/icon.png index 496e49846bde3d101e2bbca816b2635bc10dbc66..fcf2cc034f7d17565fa02522dff9b7dd6e77ce61 100644 GIT binary patch delta 537 zcmV+!0_OeX0jC6z8Gi-<0063Kaozv`010qNS#tmY009610096`CB)VM001OSFM?qtcF-io;z$yT!CQEl87$X9t+e!t1J!y&i zK>Y}iAFWCNtjWvV2Wm%vON2>0wV4M8322WwYv{w0Ia*mQ|FpoZUD2( zYp0jrTOl|BY=!t%$Xg+}0PHQk9bA*E$|(@jJ3M~u_?z|j5s(Hj=YW{f0OE4?1J+LW z&iuqrBd#TdJP_HhqC{+ygDt|(&lBYoQ_?wlg29NHsDHQ=F z+z0aIaPMA=Ds+URO7;WJ{6?-s5-cSLfIF|Ya$xQxSWapHjKW3=&Y1*DN(q2j*2)07 zl3-b>04SOo5|EB0SXv4I%9a)#s5%Lj7aM@1p-Ba+OoBs*381Y$l^OT9w&|lhOV*eV|Yj6bk_a z5WxQcJXIy?>Hw(|Nd_qUE&wtB8NfV{$_sS@4Pg?X3>aZQz)WQTyZ~i@0UQ881h5L= z0LUfRGUdW*z#MZDfC$+6_kd|=07ZZzz!qSi@jE#jKkJ7QKmY-J3tU;8FQ0qgzC-{3 N002ovPDHLkV1l9SPK*Em From ce1429693a193b2977296f0181e1868ddf3a05ce Mon Sep 17 00:00:00 2001 From: Jonas Mucke Date: Mon, 20 Apr 2020 21:05:40 +0200 Subject: [PATCH 7/7] player and minion ai finished --- src/Maps/Grid.gd | 8 +- src/Overlap/AI/AI_Hero.gd | 1 - src/Overlap/AI/AI_Minion.gd | 166 +++++++++--------------------------- src/Player/Player.tscn | 3 + src/World.tscn | 10 ++- 5 files changed, 52 insertions(+), 136 deletions(-) diff --git a/src/Maps/Grid.gd b/src/Maps/Grid.gd index c5a2514..c72fe2b 100644 --- a/src/Maps/Grid.gd +++ b/src/Maps/Grid.gd @@ -193,11 +193,11 @@ func _update_grid(): for val in object_grid[neighboor.x][neighboor.y]: match val: Kind.DAMAGE: - scale += 16 - Kind.HEALING: - scale -= 8 - Kind.SLOW: scale += 8 + Kind.HEALING: + scale -= 4 + Kind.SLOW: + scale += 4 if(scale<0): scale = 0 aStar_node.set_point_weight_scale(index, scale) diff --git a/src/Overlap/AI/AI_Hero.gd b/src/Overlap/AI/AI_Hero.gd index 51a4c86..cced40a 100644 --- a/src/Overlap/AI/AI_Hero.gd +++ b/src/Overlap/AI/AI_Hero.gd @@ -2,7 +2,6 @@ extends KinematicBody2D class_name Hero -const PrioQueue = preload("prio_queue.gd") # Relative path const Grid = preload("res://Maps/Grid.gd") var grid diff --git a/src/Overlap/AI/AI_Minion.gd b/src/Overlap/AI/AI_Minion.gd index e2acc53..329274c 100644 --- a/src/Overlap/AI/AI_Minion.gd +++ b/src/Overlap/AI/AI_Minion.gd @@ -2,10 +2,10 @@ extends KinematicBody2D class_name Minion -const PrioQueue = preload("prio_queue.gd") # Relative path const Grid = preload("res://Maps/Grid.gd") var grid +var lock = Mutex.new() enum{ STEP, @@ -21,8 +21,7 @@ var ExecutionState = AI_MOVE var ai_movement_state = NOTHING var numbers = [0,0,0,0,0,0,0,0,0,0] -var prios = [0,6,0,0,0,0,0,0,4,0] - +var prios = [0,7,0,0,0,0,0,0,3,0] var targetFieldCur = [0,0] var targetFieldUsed = false @@ -30,9 +29,17 @@ var targetFieldUsed = false var actionKind = Grid.Kind.TERMINAL_SYMBOL var actionFieldUsed = false +var areaRefList = [] + var threadTime = 0.4 var threadDelta = 0.0 +var hitDelta = 0.0 +var hitTreshhold = 0.1 + +var aiDelta = 0.0 +var aiTreshhold = 0.4 + #calculates the sum of all present prios func calcTotalPrio(): var sum = 0 @@ -64,11 +71,6 @@ func calcPrioTable(): i += 1 return table - -#14+7 0.999 -#updates heart and bonfire prio -func adjustPrio(currentHealth, maxHealth): - return #return the enemie which will be attacked func calcEnemyKind(): @@ -80,146 +82,53 @@ func calcEnemyKind(): return i #returns a move -func getMoveDescription(myPosition : Vector2, targetPositions): - return AStar(myPosition, targetPositions) - - -func getCost(field): - return 0 +func getMoveDescription(myPosition : Vector2, targetPositions : Vector2): + grid.path_start_position = myPosition + grid.path_end_position = targetPositions + grid.recalculate_path() + if(grid._point_path.size()<=1): + return [NOTHING, [0,0]] -#return an heurestic of distance -# curr - current position -# targ - a target position -func h_fn(curr, target): - return sqrt(pow(target[0]-curr[0],2)+pow(target[0]-curr[0],2)) - -# currCost - currentCost -# target - position of the field to move to -func g_fn(currCost, target): - return currCost + getCost(target) + var move = STEP + return [move, grid._point_path[1]] -# Returns the list of adjacent nodes -func adjacent(currentPosition, can_roll = false): - var adj := [] - #adj.append([STEP, Vector2(0,0)]) - var p = currentPosition - var pot_adj_step = [[p[0]-1, p[1]-1], [p[0]-1, p[1]-0], [p[0]-1, p[1]+1], - [p[0]+0, p[1]-1], [p[0]+0, p[1]+1], - [p[0]+1, p[1]-1], [p[0]+1, p[1]+0], [p[0]+1, p[1]+1]] - - - for i in range(pot_adj_step.size()): - var next = pot_adj_step[i] - if(next[0]<0): - continue - if(next[0]>13): - continue - if(next[1]<0): - continue - if(next[1]>6): - continue - if(grid.used_grid[next[0]][next[1]]): - continue - if(grid.object_grid[next[0]][next[1]][0]!=Grid.Kind.WALL): - if(i==0): - if(grid.object_grid[pot_adj_step[1][0]][pot_adj_step[1][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[3][0]][pot_adj_step[3][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - if(i==2): - if(grid.object_grid[pot_adj_step[1][0]][pot_adj_step[1][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[4][0]][pot_adj_step[4][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - if(i==5): - if(grid.object_grid[pot_adj_step[3][0]][pot_adj_step[3][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[6][0]][pot_adj_step[6][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - if(i==7): - if(grid.object_grid[pot_adj_step[4][0]][pot_adj_step[4][1]][0]!=Grid.Kind.WALL && - grid.object_grid[pot_adj_step[6][0]][pot_adj_step[6][1]][0]!=Grid.Kind.WALL): - adj.append([STEP, Vector2(next[0],next[1]),1.1]) - continue - - adj.append([STEP, Vector2(next[0],next[1]),1.0]) - - return adj - - -func AStar(source, target): - #swap rtarget and source, when target source istr reached, do inversxse step - # node layout [g+h(x), g(x), current, from, kind] - var tmp = source - source = target - target = tmp - - var Q = PrioQueue.new() - Q.insert([0,0, [source[0], source[1]], [source[0], source[1]], NOTHING] ) - while !Q.empty(): - var node = Q.delMin() - - # Check if reached - if(node[2][0] == target[0] and node[2][1] == target[1]): - return [node[4], node[3]] # 4 is kind | 3 is from - - # Set flag - grid.used_grid[node[2][0]][node[2][1]] = true - var adj_list = adjacent(node[2]) - for i in adj_list: - var move_cost = i[2] - - var g_val = g_fn(node[1]+move_cost, i[1]) - var h_val = h_fn(i[1], target) - - #[g+h(x), g(x), current, from, kind] - var new_node = [g_val+h_val, g_val,i[1], node[2], i[0]] - Q.insert(new_node) - - return [NOTHING, [0,0]] func movement_calulcaotr(): var currentPosition = grid._pixel_to_grid_coords(global_position) - var enemyKind - if(actionFieldUsed==false): + + numbers = grid.countTargets(numbers) + if(actionKind == grid.Kind.TERMINAL_SYMBOL || numbers[actionKind]==0 || actionFieldUsed==false): enemyKind = calcEnemyKind() actionKind = enemyKind actionFieldUsed = true + if(enemyKind==Grid.Kind.TERMINAL_SYMBOL): + return else: enemyKind = actionKind - if(enemyKind==Grid.Kind.TERMINAL_SYMBOL): - return - var targetField = grid.get_nearest(currentPosition, enemyKind) if(targetField==[-1,-1]): - return + return - - var MoveAdvice = getMoveDescription(currentPosition, targetField) - grid.reset_history() - - return MoveAdvice - + return getMoveDescription(currentPosition, Vector2(targetField[0], targetField[1])) func movement_decider_ai(target, kindOfStep, delta): var currentPosition = grid._pixel_to_grid_coords(global_position) - var field_of_movement = target - var currentPixel = global_position - - if(kindOfStep==STEP): - run(Vector2(target[0]-currentPosition[0], target[1]-currentPosition[1]), delta*4) - targetFieldCur = target - targetFieldUsed = true - ai_movement_state = STEP - + + run(Vector2(target[0]-currentPosition[0], target[1]-currentPosition[1]), delta*4) + targetFieldCur = target + ai_movement_state = STEP + + targetFieldCur = target + targetFieldUsed = true + ExecutionState = EXECUTING -func movement_execution(delta): +func movement_execution(delta): if(targetFieldUsed): var cur = grid._pixel_to_grid_coords(global_position) var distance = sqrt(pow(cur[0]-targetFieldCur[0],2)+ pow(cur[1]-targetFieldCur[1],2)) @@ -243,7 +152,8 @@ func reset_exeution_state(delta): -func makeMove(delta): +func makeMove(delta): + lock.lock() if ExecutionState == AI_MOVE: threadDelta = 0 var MoveAdvice = movement_calulcaotr() @@ -252,10 +162,10 @@ func makeMove(delta): var target = MoveAdvice[1] movement_decider_ai(target, MoveAdvice[0], delta) - elif ExecutionState == EXECUTING: + if ExecutionState == EXECUTING: movement_execution(delta) reset_exeution_state(delta) - + lock.unlock() # API Interface for ai_hero -> methods are handled in player.gd diff --git a/src/Player/Player.tscn b/src/Player/Player.tscn index a032e86..24ce11c 100644 --- a/src/Player/Player.tscn +++ b/src/Player/Player.tscn @@ -631,8 +631,11 @@ font_data = ExtResource( 6 ) ]] collision_mask = 14 script = ExtResource( 1 ) +debug = null ROLL_SPEED = 120 FRICTION = 270 +ACCELERATION = null +title_scene = null [node name="Kind" parent="." instance=ExtResource( 7 )] general = 4 diff --git a/src/World.tscn b/src/World.tscn index d9487ac..97d6e63 100644 --- a/src/World.tscn +++ b/src/World.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=2] +[gd_scene load_steps=12 format=2] [ext_resource path="res://Player/Player.tscn" type="PackedScene" id=1] [ext_resource path="res://World.gd" type="Script" id=2] @@ -8,6 +8,7 @@ [ext_resource path="res://Menus/DialogueBox/DialogueBox.tscn" type="PackedScene" id=6] [ext_resource path="res://Maps/Background/Background.tscn" type="PackedScene" id=7] [ext_resource path="res://Boss/SlimeBoss/SlimeBoss.tscn" type="PackedScene" id=8] +[ext_resource path="res://Boss/Minion.tscn" type="PackedScene" id=9] [ext_resource path="res://Objects/Bonfire/Bonfire.tscn" type="PackedScene" id=10] [ext_resource path="res://Maps/Grid.tscn" type="PackedScene" id=18] @@ -21,7 +22,7 @@ region_enabled = true region_rect = Rect2( 0, 0, 1280, 720 ) [node name="Background" parent="." instance=ExtResource( 7 )] -frame = 4 +frame = 44 [node name="FloorTileMap" type="TileMap" parent="."] visible = false @@ -46,11 +47,14 @@ position = Vector2( 448, 32 ) position = Vector2( 344, 125.768 ) scale = Vector2( 2, 2 ) ROLL_SPEED = 140 -FRICTION = 200 +FRICTION = null [node name="SlimeBoss" parent="YSort" instance=ExtResource( 8 )] position = Vector2( 104, 80 ) +[node name="Minion" parent="YSort" instance=ExtResource( 9 )] +position = Vector2( 24, 184 ) + [node name="Grid" parent="." instance=ExtResource( 18 )] [node name="CanvasLayer" type="CanvasLayer" parent="."]