mirror of
https://github.com/creyD/ludum_dare_46.git
synced 2026-06-15 22:50:20 +02:00
basics of ai, ready for soundeffects
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user