diff --git a/src/Maps/Grid.gd b/src/Maps/Grid.gd index 2fd104c..f59f13c 100644 --- a/src/Maps/Grid.gd +++ b/src/Maps/Grid.gd @@ -8,7 +8,7 @@ var prio_grid : Array = [] var used_grid : Array = [] var time_passed := 0.0 var offset -export(float,0,42.0) var refresh_rate = 1.0 +export(float,0,42.0) var refresh_rate = 5.0 func _draw_object_grid(): @@ -61,6 +61,14 @@ func _reset_history(): for y in range(7): used_grid[x][y] = false +func countTargets(table): + for x in range(14): + for y in range(7): + for i in prio_grid[x][y]: + if i == Kind.TERMINAL_SYMBOL: + continue + table[i]+=1 + return table func _pixel_to_grid_coords(pixel : Vector2) -> Vector2: var new_coords : Vector2 @@ -79,6 +87,22 @@ func _is_in_grid(grid_coords : Vector2) -> bool: return false return true +func get_nearest(position, kind): + var list = [] + for x in range(14): + for y in range(7): + for i in prio_grid[x][y]: + if(i == kind): + list.append([x,y]) + var dist = [] + for field in list: + var tmp = sqrt(pow(position[0]-field[0],2)+pow(position[1]-field[1],2)) + dist.append(tmp) + var mini = 0 + for i in range(1, dist.size()): + if(dist[i]=spawnRate): - elapsedTime-=spawnRate - var Minion = load("") - var world = get_tree().current_scene.get_child(2) - var minion = Minion.instance() - world.add_child(minion) - minion.global_position = global_position + #if(elapsedTime>=spawnRate): + # elapsedTime-=spawnRate + # var Minion = load("") + # var world = get_tree().current_scene.get_child(2) + # #TODO minions + # var minion = Minion.instance() + # world.add_child(minion) + # minion.global_position = global_position func _on_Hurtbox_area_entered(area): diff --git a/src/Overlap/AI/AI_Hero.gd b/src/Overlap/AI/AI_Hero.gd index ada283e..715fb11 100644 --- a/src/Overlap/AI/AI_Hero.gd +++ b/src/Overlap/AI/AI_Hero.gd @@ -5,19 +5,13 @@ class_name Hero const PrioQueue = preload("prio_queue.gd") # Relative path const Grid = preload("res://Maps/Grid.gd") +var grid + enum{ LENGTH, WAY } -enum{ - DAMAGE, - HEALING, - SLOW, - WALL, - FIELD -} - enum{ STEP, ROLL, @@ -31,13 +25,15 @@ enum{ var ExecutionState = AI_MOVE -var numbers = [0,0,0,0,0,0,0,0,0] -var prios = [7,6,5,4,3,2,0,0,4] +var numbers = [0,0,0,0,0,0,0,0,0,0] +var prios = [7,0,6,5,4,3,2,0,0,4] var totalPrioTurn = 0 var executesTurn = false var abortProb = 0.01 +var targetField = [0,0] +var targetFieldUsed = false #calculates the sum of all present prios func calcTotalPrio(): var sum = 0 @@ -49,18 +45,22 @@ func calcTotalPrio(): return sum #calculates the relative porio -func calcRelPrio(index, sum): - return prios[index]/sum +func calcRelPrio(index, sum) -> float: + if(sum==0): + return 0.0 + return float(prios[index])/float(sum) #calucaltes the prio table of all enemies[0,1) func calcPrioTable(): - var table = [0,0,0,0,0,0,0,0,0] - var lower = 0 + var table = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] + numbers = grid.countTargets(numbers) + var lower = 0.0 var sum = calcTotalPrio() var i = 0; while i != Grid.Kind.TERMINAL_SYMBOL: - lower += calcRelPrio(i, sum) + if(numbers[i]!=0): + lower += calcRelPrio(i, sum) table[i] = lower i += 1 @@ -77,30 +77,27 @@ func adjustPrio(currentHealth, maxHealth): prios[Grid.Kind.HEART]=hearts #return the enemie which will be attacked -func calcEnemy(): +func calcEnemyKind(): var table = calcPrioTable() var number = randf() var i = 0 - while table[i] > number: - i=i+1 + while table[i] <= number: + i += 1 return i - -func getTargetField(currentField): - return Grid.prio_grid[currentField.x][currentField.y] - - #returns a move func getMoveDescription(myPosition : Vector2, targetPositions): - return AStar(myPosition, targetPositions[0]) + return AStar(myPosition, targetPositions) func getCost(field): var cost = 0 - for i in Grid.prio_grid[field.x][field.y]: + for i in grid.prio_grid[field.x][field.y]: match i: - Grid.kind.DAMAGE : cost += prios[Grid.kind.BONFIRE] * 6 - Grid.kind.SLOW : cost += 2 + Grid.Kind.DAMAGE: + cost += prios[Grid.kind.BONFIRE] * 6 + Grid.Kind.SLOW: + cost += 2 return cost #return an heurestic of distance @@ -136,9 +133,9 @@ func adjacent(currentPosition, can_roll = false): continue if(next[1]>6): continue - if(Grid.used_grid[next[0]][next[1]]): + if(grid.used_grid[next[0]][next[1]]): continue - if(Grid[next[0]][next[1]][0]!=WALL): + if(grid.object_grid[next[0]][next[1]][0]!=Grid.Kind.WALL): adj.append([STEP, Vector2(next[0],next[1])]) if not can_roll: @@ -153,9 +150,9 @@ func adjacent(currentPosition, can_roll = false): continue if(next[1]>6): continue - if(Grid.used_grid[next[0]][next[1]]): + if(grid.used_grid[next[0]][next[1]]): continue - if(Grid[next[0]][next[1]][0]!=WALL): + if(grid.object_grid[next[0]][next[1]][0]!=Grid.Kind.WALL): adj.append([ROLL, Vector2(next[0],next[1])]) return adj @@ -178,7 +175,7 @@ func AStar(source, target): return [node[4], node[3]] # 4 is kind | 3 is from # Set flag - Grid.used_grid[node[2][0]][node[2][1]] = true + grid.used_grid[node[2][0]][node[2][1]] = true var adj_list = adjacent(node[2]) for i in adj_list: var move_cost = 0 @@ -191,27 +188,30 @@ func AStar(source, target): var h_val = h(i[1], target) #[g+h(x), g(x), current, from, kind] - var new_node = [g_val+h_val, g_val,i[1], node, i[0]] + var new_node = [g_val+h_val, g_val,i[1], node[2], i[0]] Q.insert(new_node) return [NOTHING, [0,0]] func makeMove(delta): - #match ExecutionState: - # EXECUTING: - # pass - # AI_MOVE: - # var field = [0.1 * prios[Grid.Kind.BONFIRE], 1] - # var decision = randf() - ## var i = 0 - #while field[i] > decision: - # i += 1 - ## if (i == 0): - # var targetField = getTargetField(Grid.prio_grid) - # run(targetField) - # else: - # pass + pass + if ExecutionState == AI_MOVE: + var currentPosition = grid._pixel_to_grid_coords(global_position) + var enemyKind = calcEnemyKind() + var targetField = grid.get_nearest(currentPosition, enemyKind) + var MoveAdvice = getMoveDescription(currentPosition, targetField) + print(MoveAdvice) + ExecutionState = EXECUTING + pass + elif ExecutionState == EXECUTING: + if(targetFieldUsed): + pass + var cur = grid._pixel_to_grid_coords(global_position) + var distance = sqrt(pow(cur[0]-targetField[0],2)+ pow(cur[1]-targetField[1],2)) + if(distance<0.5): + targetFieldUsed = false + ExecutionState = AI_MOVE pass diff --git a/src/Player/Player.gd b/src/Player/Player.gd index bd6f6e5..bfdb6c4 100644 --- a/src/Player/Player.gd +++ b/src/Player/Player.gd @@ -37,6 +37,8 @@ var experience := 0.0 func _debug_update(): debug_label.text = str(player_stats.health) + "/" + str(player_stats.max_health) + " HP\n" + str(currency) + " €" +func _ready(): + grid = get_tree().current_scene.get_child(3) func _physics_process(delta): totaldamage += damage_per_second*delta diff --git a/src/Player/Player.tscn b/src/Player/Player.tscn index 7feeace..d1df54f 100644 --- a/src/Player/Player.tscn +++ b/src/Player/Player.tscn @@ -619,7 +619,10 @@ font_data = ExtResource( 6 ) [node name="Player" type="KinematicBody2D"] script = ExtResource( 1 ) +debug = null +ROLL_SPEED = null FRICTION = 270 +ACCELERATION = null [node name="Kind" parent="." instance=ExtResource( 7 )] kind = 1 diff --git a/src/World.tscn b/src/World.tscn index 9e79e36..119dfe1 100644 --- a/src/World.tscn +++ b/src/World.tscn @@ -12,7 +12,7 @@ script = ExtResource( 2 ) [node name="WallSprite" type="Sprite" parent="."] -position = Vector2( 351.915, 184 ) +position = Vector2( 352, 184 ) texture = ExtResource( 4 ) region_enabled = true region_rect = Rect2( 0, 0, 1280, 720 ) @@ -32,18 +32,14 @@ __meta__ = { position = Vector2( 152, 120 ) [node name="Player" parent="YSort" instance=ExtResource( 1 )] -position = Vector2( 84.2923, 24.0572 ) +position = Vector2( 176, 112 ) scale = Vector2( 2, 2 ) -FRICTION = 200 +FRICTION = null [node name="Bonfire" parent="YSort" instance=ExtResource( 7 )] position = Vector2( 296, -16 ) -[node name="Boss_template" parent="YSort" instance=ExtResource( 17 )] - -[node name="DebugLabel" parent="YSort/Boss_template" index="6"] -text = "Obermutti" +[node name="Boss_template2" parent="YSort" instance=ExtResource( 17 )] +position = Vector2( -40, 16 ) [node name="Grid" parent="." instance=ExtResource( 18 )] - -[editable path="YSort/Boss_template"]