Browse Source

adding ECS to enemies

galo 2 years ago
parent
commit
0af27b11ef
8 changed files with 99 additions and 33 deletions
  1. 23 0
      Enemy2.tscn
  2. 5 3
      Server.gd
  3. 1 0
      damage_player.tscn
  4. 1 1
      enemiessprite.gd
  5. 3 6
      main.tscn
  6. 15 5
      playerphysics.gd
  7. 0 4
      project.godot
  8. 51 14
      spawner.gd

+ 23 - 0
Enemy2.tscn

@@ -0,0 +1,23 @@
+[gd_scene load_steps=3 format=2]
+
+[sub_resource type="GDScript" id=2]
+script/source = "extends KinematicBody2D
+var id = 0
+func damage( damage, attacker):
+	get_parent().dict.arrayvida[id] -= damage
+	get_parent().death_count(attacker)
+#	get_node('CollisionShape2D').disabled = true
+#	queue_free()
+#	print(get_parent().dict.arrayvida[id])
+	pass
+"
+
+[sub_resource type="RectangleShape2D" id=1]
+
+[node name="Enemy" type="KinematicBody2D"]
+collision_layer = 4
+collision_mask = 0
+script = SubResource( 2 )
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource( 1 )

+ 5 - 3
Server.gd

@@ -68,9 +68,11 @@ func _physics_process(delta):
 	tick += 1
 	if fmod(tick,tickrate) == 0:
 		var enemies_datachunk = PoolByteArray()
-		for i in $enemies.dict.arraypos:
-			enemies_datachunk.append_array( return_int16(i.x) )
-			enemies_datachunk.append_array( return_int16(i.y) )
+		for i in $enemies.dict.arraypos.size():
+			if $enemies.dict.arrayvida[i] > 0:
+				var pos = $enemies.dict.arraypos[i]
+				enemies_datachunk.append_array( return_int16(pos.x) )
+				enemies_datachunk.append_array( return_int16(pos.y) )
 		rpc_unreliable_id(0, 'enemies_position_2', enemies_datachunk)
 
 func return_int16(number):

+ 1 - 0
damage_player.tscn

@@ -9,6 +9,7 @@ extents = Vector2( 70, 40 )
 collision_layer = 0
 collision_mask = 2147483652
 script = ExtResource( 1 )
+damage = 100
 
 [node name="CollisionShape2D" type="CollisionShape2D" parent="."]
 shape = SubResource( 1 )

+ 1 - 1
enemiessprite.gd

@@ -3,7 +3,7 @@ extends Node
 var sprite = preload('res://enemie/monster.tscn')
 
 func _ready():
-	for i in 2048:
+	for i in 1024:
 		var add= sprite.instance()
 		add.texture = get_node('../../Textures').dict['Goblin1']
 		add.z_index = 1

+ 3 - 6
main.tscn

@@ -68,7 +68,6 @@ render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin1"]
 frames = SubResource( 5 )
-frame = 1
 playing = true
 offset = Vector2( 32, 32 )
 
@@ -80,7 +79,6 @@ render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin2"]
 frames = SubResource( 5 )
-frame = 1
 speed_scale = 0.8
 playing = true
 offset = Vector2( 32, 32 )
@@ -93,7 +91,7 @@ render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin3"]
 frames = SubResource( 5 )
-frame = 3
+frame = 2
 speed_scale = 1.2
 playing = true
 offset = Vector2( 32, 32 )
@@ -106,7 +104,6 @@ render_target_v_flip = true
 
 [node name="Goblin" type="AnimatedSprite" parent="Textures/Goblin4"]
 frames = SubResource( 5 )
-frame = 3
 speed_scale = 0.9
 playing = true
 offset = Vector2( 32, 32 )
@@ -120,9 +117,9 @@ tickrate = 4
 
 [node name="enemies" type="Node" parent="Server"]
 script = ExtResource( 6 )
-wave_num = 256
+wave_num = 8
 spawn_speed = 1
-limit = 3072
+limit = 256
 
 [node name="dmgbox" type="Node" parent="Server"]
 

+ 15 - 5
playerphysics.gd

@@ -12,7 +12,7 @@ var attacks = ['melee']
 var damage = preload('res://damage_player.tscn')
 
 var attack_buffers = {'melee':0}
-var vida = 10000
+var vida = 100
 
 func damage(arg, id):
 	vida += arg
@@ -22,15 +22,25 @@ func damage(arg, id):
 
 var sidebuffer = true
 
+#func melee():
+#	attack_buffers.melee += 1
+#	if fmod(attack_buffers.melee,45) == 0:
+#		var newdmg = damage.instance()
+#		newdmg.global_position = global_position + (Vector2(70,0) if sidebuffer else Vector2(-70,0))
+#		newdmg.attacker = name
+#		get_node('../../dmgbox').add_child(newdmg)
+#		get_node('../..').player_anim('melee',name)
+
+export var dmg = 50
 func melee():
 	attack_buffers.melee += 1
 	if fmod(attack_buffers.melee,45) == 0:
-		var newdmg = damage.instance()
-		newdmg.global_position = global_position + (Vector2(70,0) if sidebuffer else Vector2(-70,0))
-		newdmg.attacker = name
-		get_node('../../dmgbox').add_child(newdmg)
+		dmg(70,0)
 		get_node('../..').player_anim('melee',name)
 
+func dmg(arg,arg1):
+	get_node('../../../Server/enemies').damage_detection(global_position + (Vector2(arg,arg1) if sidebuffer else Vector2(-arg,arg1)),dmg,name)
+
 func _physics_process(delta):
 	get_node('../..').hp_update(vida, name)
 	if motion.x != 0: sidebuffer = motion.x > 0

+ 0 - 4
project.godot

@@ -63,10 +63,6 @@ f3={
 2d_physics/layer_2="player"
 2d_physics/layer_3="enemy"
 
-[physics]
-
-2d/physics_engine="GodotPhysics"
-
 [rendering]
 
 quality/driver/driver_name="GLES2"

+ 51 - 14
spawner.gd

@@ -12,15 +12,20 @@ var dict = {
 	"arraytarget":[],
 	"arraymotion":[],
 	"arraydirtime":[],
+	'attacker':[],
 }
 
+var collisions = []
+var areas = preload('res://Enemy2.tscn')
+
 func _ready():
+	
 	yield(get_tree().create_timer(1.0),"timeout")
 	while true:
 		if dict.arraypos.size() < limit:
 			for x in clamp(limit-dict.arraypos.size(),0,wave_num):
 				var rot = rand_range(-PI,PI)
-				var pos = Vector2(sin(rot), cos(rot)) * 640
+				var pos = (Vector2(sin(rot), cos(rot)) * 400) + Vector2(320,180)
 				var vida = 100
 				var array = get_node('../players').get_children()
 				array.shuffle()
@@ -30,6 +35,7 @@ func _ready():
 				dict.arraypos.append(pos)
 				dict.arrayvida.append(vida)
 				dict.arraytype.append('goblin')
+				dict.attacker.append('')
 				
 				dict.arraymotion.append(Vector2.ZERO)
 				dict.arraydirtime.append(int(rand_range(60,120)))
@@ -42,6 +48,8 @@ var speed = 2.3
 var tick = 0
 export var tickrate = 4
 
+var blockmapenemy = {}
+
 func _physics_process(delta):
 
 #setting tickrate, to reduce executions per second
@@ -59,24 +67,53 @@ func _physics_process(delta):
 #yes this abomination controls the enemies, ECS code looks ugly as fuck in this engine
 		for i in dict.arraypos.size():
 
+# death checking
+			if dict.arrayvida[i] > 0:
+
 #picking new targets if the last one is invalid
-			if dict.arraytarget[i] == null:
-				if get_node('../players').get_child_count() == 0: return
-				var array = get_node('../players').get_children()
-				array.shuffle()
-				if array.size() > 0:
-					dict.arraytarget[i] = array[0]
+				if dict.arraytarget[i] == null:
+					if get_node('../players').get_child_count() == 0: return
+					var array = get_node('../players').get_children()
+					array.shuffle()
+					if array.size() > 0:
+						dict.arraytarget[i] = array[0]
 
 #exclusive movmenet code
-			if fmod(tick, dict.arraydirtime[i]) == 0:
-				dict.arraymotion[i] = (dict.arraytarget[i].global_position - dict.arraypos[i]).normalized() * speed
-			dict.arraypos[i] += dict.arraymotion[i]
+				if fmod(tick, dict.arraydirtime[i]) == 0:
+					dict.arraymotion[i] = (dict.arraytarget[i].global_position - dict.arraypos[i]).normalized() * speed
+				dict.arraypos[i] += dict.arraymotion[i]
 
 # enemy attak on players
-			var x = int(dict.arraypos[i].x/20)
-			var y = int(dict.arraypos[i].y/20)
-			if blockmap.has(Vector2(x,y)):
-				blockmap[Vector2(x,y)].damage( -0.5, '')
+				var x = int(dict.arraypos[i].x/20)
+				var y = int(dict.arraypos[i].y/20)
+				if blockmap.has(Vector2(x,y)):
+					blockmap[Vector2(x,y)].damage( -0.5, '')
+
+#hitboxes
+				var x2 = int( (dict.arraypos[i].x-50) /100)
+				var y2 = int( (dict.arraypos[i].y-50) /100)
+				if blockmapenemy.has(Vector2(x2,y2)):
+					blockmapenemy[Vector2(x2,y2)].append(i)
+				else:
+					blockmapenemy[Vector2(x2,y2)] = [i]
+
+#died
+			else:
+				var rot = rand_range(-PI,PI)
+				dict.arraypos[i] = (Vector2(sin(rot), cos(rot)) * 400) + Vector2(320,180)
+				dict.arrayvida[i] = 100
+				death_count(dict.attacker[i])
+				
+
+func damage_detection(arg,dmg, attacker):
+	var x = int((arg.x-50)/100)
+	var y = int((arg.y-50)/100)
+	if blockmapenemy.has(Vector2(x,y)):
+		for i in blockmapenemy[Vector2(x,y)]:
+			dict.arrayvida[i] -= dmg
+			if dict.arrayvida[i] <= 0:
+				dict.attacker[i] = attacker
+				
 
 var counter = 0
 var score = {}