basics of ai, ready for soundeffects

This commit is contained in:
Jonas Mucke
2020-04-19 17:41:57 +02:00
parent ac97b3b49e
commit 78af384563
6 changed files with 90 additions and 64 deletions

View File

@@ -8,7 +8,7 @@ var prio_grid : Array = []
var used_grid : Array = [] var used_grid : Array = []
var time_passed := 0.0 var time_passed := 0.0
var offset 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(): func _draw_object_grid():
@@ -61,6 +61,14 @@ func _reset_history():
for y in range(7): for y in range(7):
used_grid[x][y] = false 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: func _pixel_to_grid_coords(pixel : Vector2) -> Vector2:
var new_coords : Vector2 var new_coords : Vector2
@@ -79,6 +87,22 @@ func _is_in_grid(grid_coords : Vector2) -> bool:
return false return false
return true 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]<dist[mini]):
mini = i
return list[mini]
func _update_grid(): func _update_grid():
_reset_grids() _reset_grids()

View File

@@ -7,13 +7,14 @@ var elapsedTime = 0.0
func _physics_process(delta): func _physics_process(delta):
elapsedTime += delta elapsedTime += delta
if(elapsedTime>=spawnRate): #if(elapsedTime>=spawnRate):
elapsedTime-=spawnRate # elapsedTime-=spawnRate
var Minion = load("") # var Minion = load("")
var world = get_tree().current_scene.get_child(2) # var world = get_tree().current_scene.get_child(2)
var minion = Minion.instance() # #TODO minions
world.add_child(minion) # var minion = Minion.instance()
minion.global_position = global_position # world.add_child(minion)
# minion.global_position = global_position
func _on_Hurtbox_area_entered(area): func _on_Hurtbox_area_entered(area):

View File

@@ -5,19 +5,13 @@ class_name Hero
const PrioQueue = preload("prio_queue.gd") # Relative path const PrioQueue = preload("prio_queue.gd") # Relative path
const Grid = preload("res://Maps/Grid.gd") const Grid = preload("res://Maps/Grid.gd")
var grid
enum{ enum{
LENGTH, LENGTH,
WAY WAY
} }
enum{
DAMAGE,
HEALING,
SLOW,
WALL,
FIELD
}
enum{ enum{
STEP, STEP,
ROLL, ROLL,
@@ -31,13 +25,15 @@ enum{
var ExecutionState = AI_MOVE var ExecutionState = AI_MOVE
var numbers = [0,0,0,0,0,0,0,0,0] var numbers = [0,0,0,0,0,0,0,0,0,0]
var prios = [7,6,5,4,3,2,0,0,4] var prios = [7,0,6,5,4,3,2,0,0,4]
var totalPrioTurn = 0 var totalPrioTurn = 0
var executesTurn = false var executesTurn = false
var abortProb = 0.01 var abortProb = 0.01
var targetField = [0,0]
var targetFieldUsed = false
#calculates the sum of all present prios #calculates the sum of all present prios
func calcTotalPrio(): func calcTotalPrio():
var sum = 0 var sum = 0
@@ -49,18 +45,22 @@ func calcTotalPrio():
return sum return sum
#calculates the relative porio #calculates the relative porio
func calcRelPrio(index, sum): func calcRelPrio(index, sum) -> float:
return prios[index]/sum if(sum==0):
return 0.0
return float(prios[index])/float(sum)
#calucaltes the prio table of all enemies[0,1) #calucaltes the prio table of all enemies[0,1)
func calcPrioTable(): func calcPrioTable():
var table = [0,0,0,0,0,0,0,0,0] var table = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]
var lower = 0 numbers = grid.countTargets(numbers)
var lower = 0.0
var sum = calcTotalPrio() var sum = calcTotalPrio()
var i = 0; var i = 0;
while i != Grid.Kind.TERMINAL_SYMBOL: while i != Grid.Kind.TERMINAL_SYMBOL:
lower += calcRelPrio(i, sum) if(numbers[i]!=0):
lower += calcRelPrio(i, sum)
table[i] = lower table[i] = lower
i += 1 i += 1
@@ -77,30 +77,27 @@ func adjustPrio(currentHealth, maxHealth):
prios[Grid.Kind.HEART]=hearts prios[Grid.Kind.HEART]=hearts
#return the enemie which will be attacked #return the enemie which will be attacked
func calcEnemy(): func calcEnemyKind():
var table = calcPrioTable() var table = calcPrioTable()
var number = randf() var number = randf()
var i = 0 var i = 0
while table[i] > number: while table[i] <= number:
i=i+1 i += 1
return i return i
func getTargetField(currentField):
return Grid.prio_grid[currentField.x][currentField.y]
#returns a move #returns a move
func getMoveDescription(myPosition : Vector2, targetPositions): func getMoveDescription(myPosition : Vector2, targetPositions):
return AStar(myPosition, targetPositions[0]) return AStar(myPosition, targetPositions)
func getCost(field): func getCost(field):
var cost = 0 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: match i:
Grid.kind.DAMAGE : cost += prios[Grid.kind.BONFIRE] * 6 Grid.Kind.DAMAGE:
Grid.kind.SLOW : cost += 2 cost += prios[Grid.kind.BONFIRE] * 6
Grid.Kind.SLOW:
cost += 2
return cost return cost
#return an heurestic of distance #return an heurestic of distance
@@ -136,9 +133,9 @@ func adjacent(currentPosition, can_roll = false):
continue continue
if(next[1]>6): if(next[1]>6):
continue continue
if(Grid.used_grid[next[0]][next[1]]): if(grid.used_grid[next[0]][next[1]]):
continue 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])]) adj.append([STEP, Vector2(next[0],next[1])])
if not can_roll: if not can_roll:
@@ -153,9 +150,9 @@ func adjacent(currentPosition, can_roll = false):
continue continue
if(next[1]>6): if(next[1]>6):
continue continue
if(Grid.used_grid[next[0]][next[1]]): if(grid.used_grid[next[0]][next[1]]):
continue 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])]) adj.append([ROLL, Vector2(next[0],next[1])])
return adj return adj
@@ -178,7 +175,7 @@ func AStar(source, target):
return [node[4], node[3]] # 4 is kind | 3 is from return [node[4], node[3]] # 4 is kind | 3 is from
# Set flag # 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]) var adj_list = adjacent(node[2])
for i in adj_list: for i in adj_list:
var move_cost = 0 var move_cost = 0
@@ -191,27 +188,30 @@ func AStar(source, target):
var h_val = h(i[1], target) var h_val = h(i[1], target)
#[g+h(x), g(x), current, from, kind] #[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) Q.insert(new_node)
return [NOTHING, [0,0]] return [NOTHING, [0,0]]
func makeMove(delta): func makeMove(delta):
#match ExecutionState: pass
# EXECUTING: if ExecutionState == AI_MOVE:
# pass var currentPosition = grid._pixel_to_grid_coords(global_position)
# AI_MOVE: var enemyKind = calcEnemyKind()
# var field = [0.1 * prios[Grid.Kind.BONFIRE], 1] var targetField = grid.get_nearest(currentPosition, enemyKind)
# var decision = randf() var MoveAdvice = getMoveDescription(currentPosition, targetField)
## var i = 0 print(MoveAdvice)
#while field[i] > decision: ExecutionState = EXECUTING
# i += 1 pass
## if (i == 0): elif ExecutionState == EXECUTING:
# var targetField = getTargetField(Grid.prio_grid) if(targetFieldUsed):
# run(targetField) pass
# else: var cur = grid._pixel_to_grid_coords(global_position)
# pass 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 pass

View File

@@ -37,6 +37,8 @@ var experience := 0.0
func _debug_update(): func _debug_update():
debug_label.text = str(player_stats.health) + "/" + str(player_stats.max_health) + " HP\n" + str(currency) + "" 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): func _physics_process(delta):
totaldamage += damage_per_second*delta totaldamage += damage_per_second*delta

View File

@@ -619,7 +619,10 @@ font_data = ExtResource( 6 )
[node name="Player" type="KinematicBody2D"] [node name="Player" type="KinematicBody2D"]
script = ExtResource( 1 ) script = ExtResource( 1 )
debug = null
ROLL_SPEED = null
FRICTION = 270 FRICTION = 270
ACCELERATION = null
[node name="Kind" parent="." instance=ExtResource( 7 )] [node name="Kind" parent="." instance=ExtResource( 7 )]
kind = 1 kind = 1

View File

@@ -12,7 +12,7 @@
script = ExtResource( 2 ) script = ExtResource( 2 )
[node name="WallSprite" type="Sprite" parent="."] [node name="WallSprite" type="Sprite" parent="."]
position = Vector2( 351.915, 184 ) position = Vector2( 352, 184 )
texture = ExtResource( 4 ) texture = ExtResource( 4 )
region_enabled = true region_enabled = true
region_rect = Rect2( 0, 0, 1280, 720 ) region_rect = Rect2( 0, 0, 1280, 720 )
@@ -32,18 +32,14 @@ __meta__ = {
position = Vector2( 152, 120 ) position = Vector2( 152, 120 )
[node name="Player" parent="YSort" instance=ExtResource( 1 )] [node name="Player" parent="YSort" instance=ExtResource( 1 )]
position = Vector2( 84.2923, 24.0572 ) position = Vector2( 176, 112 )
scale = Vector2( 2, 2 ) scale = Vector2( 2, 2 )
FRICTION = 200 FRICTION = null
[node name="Bonfire" parent="YSort" instance=ExtResource( 7 )] [node name="Bonfire" parent="YSort" instance=ExtResource( 7 )]
position = Vector2( 296, -16 ) position = Vector2( 296, -16 )
[node name="Boss_template" parent="YSort" instance=ExtResource( 17 )] [node name="Boss_template2" parent="YSort" instance=ExtResource( 17 )]
position = Vector2( -40, 16 )
[node name="DebugLabel" parent="YSort/Boss_template" index="6"]
text = "Obermutti"
[node name="Grid" parent="." instance=ExtResource( 18 )] [node name="Grid" parent="." instance=ExtResource( 18 )]
[editable path="YSort/Boss_template"]