From 2b133ddd42d604eeabb935b51de65e6399379883 Mon Sep 17 00:00:00 2001 From: Artem Votintsev Date: Thu, 15 Aug 2024 18:28:13 +0200 Subject: [PATCH] Add different players --- src/Presentation/Constants.cs | 3 + src/Presentation/Drones.cs | 24 ++++++- src/Presentation/Drones.tscn | 66 ++++++++++++++---- src/Presentation/Main.cs | 26 ++++++- src/Presentation/Main.tscn | 1 - src/Presentation/Planet.cs | 43 ++++++++++-- src/Presentation/Planet.tscn | 18 +++-- src/Presentation/assets/Drone_ally_sprite.png | Bin 0 -> 6809 bytes .../assets/Drone_enemy_sprite.png | Bin 0 -> 6727 bytes ...ne_sprite.png => Drone_neutral_sprite.png} | Bin .../assets/Planet_ally_sprite.png | Bin 0 -> 6809 bytes .../assets/Planet_enemy_sprite.png | Bin 0 -> 6725 bytes ...e_sprite.png => Planet_neutral_sprite.png} | Bin 13 files changed, 154 insertions(+), 27 deletions(-) create mode 100644 src/Presentation/Constants.cs create mode 100644 src/Presentation/assets/Drone_ally_sprite.png create mode 100644 src/Presentation/assets/Drone_enemy_sprite.png rename src/Presentation/assets/{Drone_sprite.png => Drone_neutral_sprite.png} (100%) create mode 100644 src/Presentation/assets/Planet_ally_sprite.png create mode 100644 src/Presentation/assets/Planet_enemy_sprite.png rename src/Presentation/assets/{Example_sprite.png => Planet_neutral_sprite.png} (100%) diff --git a/src/Presentation/Constants.cs b/src/Presentation/Constants.cs new file mode 100644 index 0000000..4692eb1 --- /dev/null +++ b/src/Presentation/Constants.cs @@ -0,0 +1,3 @@ +public partial class Player { + public static int PlayerNeutral = 0; +} diff --git a/src/Presentation/Drones.cs b/src/Presentation/Drones.cs index 02491d9..3ee4247 100644 --- a/src/Presentation/Drones.cs +++ b/src/Presentation/Drones.cs @@ -2,12 +2,23 @@ using GodotAnalysers; [SceneReference("Drones.tscn")] -[Tool] public partial class Drones { + private int playerId = 0; + private bool playerIdDirty = true; + [Export] + public int PlayerId + { + get => playerId; + set + { + this.playerId = value; + this.playerIdDirty = true; + } + } + private int dronesCount = 0; private bool dronesCountDirty = true; - [Export] public int DronesCount { @@ -34,6 +45,15 @@ public override void _Process(float delta) if (this.dronesCountDirty) { this.dronesCountLabel.Text = this.dronesCount.ToString(); + this.dronesCountDirty = false; + } + + if (this.playerIdDirty) + { + this.nodeNeutral.Visible = this.playerId == Main.PlayerNeutralId; + this.nodeEnemy.Visible = this.playerId == Main.PlayerEnemyId; + this.nodeAlly.Visible = this.playerId == Main.PlayerAllyId; + this.playerIdDirty = false; } } } diff --git a/src/Presentation/Drones.tscn b/src/Presentation/Drones.tscn index 3c5cbd2..b39fbd0 100644 --- a/src/Presentation/Drones.tscn +++ b/src/Presentation/Drones.tscn @@ -1,31 +1,71 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=5 format=2] -[ext_resource path="res://Presentation/assets/Drone_sprite.png" type="Texture" id=1] +[ext_resource path="res://Presentation/assets/Drone_neutral_sprite.png" type="Texture" id=1] [ext_resource path="res://Presentation/Drones.cs" type="Script" id=2] +[ext_resource path="res://Presentation/assets/Drone_enemy_sprite.png" type="Texture" id=3] +[ext_resource path="res://Presentation/assets/Drone_ally_sprite.png" type="Texture" id=4] [node name="Planet" type="Node2D"] script = ExtResource( 2 ) -[node name="PlanetSprite" type="Sprite" parent="." groups=["MinimapElement"]] +[node name="DronesCountLabel" type="Label" parent="."] +margin_left = -23.0 +margin_top = -23.0 +margin_right = 23.0 +margin_bottom = 23.0 +text = "0" +align = 1 +valign = 1 + +[node name="NodeNeutral" type="Node2D" parent="."] + +[node name="DroneNeutral1" type="Sprite" parent="NodeNeutral"] position = Vector2( -5, -2 ) scale = Vector2( 0.3, 0.3 ) texture = ExtResource( 1 ) -[node name="PlanetSprite2" type="Sprite" parent="." groups=["MinimapElement"]] +[node name="DroneNeutral2" type="Sprite" parent="NodeNeutral"] position = Vector2( 6, 6 ) scale = Vector2( 0.3, 0.3 ) texture = ExtResource( 1 ) -[node name="PlanetSprite3" type="Sprite" parent="." groups=["MinimapElement"]] +[node name="DroneNeutral3" type="Sprite" parent="NodeNeutral"] position = Vector2( 6, -8 ) scale = Vector2( 0.3, 0.3 ) texture = ExtResource( 1 ) -[node name="DronesCountLabel" type="Label" parent="."] -margin_left = -23.0 -margin_top = -23.0 -margin_right = 23.0 -margin_bottom = 23.0 -text = "0" -align = 1 -valign = 1 +[node name="NodeEnemy" type="Node2D" parent="."] +visible = false + +[node name="DroneEnemy1" type="Sprite" parent="NodeEnemy"] +position = Vector2( -5, -2 ) +scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 3 ) + +[node name="DroneEnemy2" type="Sprite" parent="NodeEnemy"] +position = Vector2( 6, 6 ) +scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 3 ) + +[node name="DroneEnemy3" type="Sprite" parent="NodeEnemy"] +position = Vector2( 6, -8 ) +scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 3 ) + +[node name="NodeAlly" type="Node2D" parent="."] +visible = false + +[node name="DroneAlly1" type="Sprite" parent="NodeAlly"] +position = Vector2( -5, -2 ) +scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 4 ) + +[node name="DroneAlly2" type="Sprite" parent="NodeAlly"] +position = Vector2( 6, 6 ) +scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 4 ) + +[node name="DroneAlly3" type="Sprite" parent="NodeAlly"] +position = Vector2( 6, -8 ) +scale = Vector2( 0.3, 0.3 ) +texture = ExtResource( 4 ) diff --git a/src/Presentation/Main.cs b/src/Presentation/Main.cs index 361d6e7..a4d6753 100644 --- a/src/Presentation/Main.cs +++ b/src/Presentation/Main.cs @@ -13,6 +13,10 @@ public partial class Main [Export] public PackedScene DronesScene; + public const int PlayerNeutralId = 0; + public const int PlayerAllyId = 1; + public const int PlayerEnemyId = 2; + private Random r = new Random(); private const int PlanetSize = 50; @@ -30,17 +34,20 @@ public override void _Ready() for (var i = 0; i < 10; i++) { - int dronesCount = r.Next(100); + int dronesCount = r.Next(50); Vector2 position = new Vector2(r.Next(480 - 2 * PlanetSize) + PlanetSize, r.Next(800 - 2 * PlanetSize) + PlanetSize); + var isNeutral = i > 0 && r.Next(100) > 10; var planet = PlanetScene.Instance(); planet.Position = position; planet.DronesCount = dronesCount; + planet.PlayerId = isNeutral ? Main.PlayerNeutralId : Main.PlayerAllyId; this.AddChild(planet); var planet2 = PlanetScene.Instance(); planet2.Position = new Vector2(480, 800) - position; planet2.DronesCount = dronesCount; + planet2.PlayerId = isNeutral ? Main.PlayerNeutralId : Main.PlayerEnemyId; this.AddChild(planet2); } } @@ -61,6 +68,7 @@ public override void _Input(InputEvent @event) { draggingFrom = this.GetTree().GetNodesInGroup(Groups.Planet) .Cast() + .Where(a => a.PlayerId == PlayerAllyId) .Where(a => a.GetRect().HasPoint(a.ToLocal(mouse.Position))) .FirstOrDefault(); @@ -84,6 +92,7 @@ public override void _Input(InputEvent @event) drones.DronesCount = draggingFrom.DronesCount; drones.To = draggingTo; drones.Position = draggingFrom.Position; + drones.PlayerId = draggingFrom.PlayerId; this.AddChild(drones); draggingFrom.DronesCount = 0; @@ -92,7 +101,6 @@ public override void _Input(InputEvent @event) tween.TweenProperty(drones, "position", draggingTo.Position, (draggingFrom.Position - draggingTo.Position).Length() / 50); tween.TweenCallback(this, nameof(DronesArrived), new Godot.Collections.Array { drones }); } - } draggingFrom = null; @@ -105,7 +113,19 @@ public override void _Input(InputEvent @event) private void DronesArrived(Drones drones) { - drones.To.DronesCount += drones.DronesCount; + if (drones.To.PlayerId == drones.PlayerId) + { + drones.To.DronesCount += drones.DronesCount; + } + else + { + if (drones.DronesCount > drones.To.DronesCount) + { + drones.To.PlayerId = drones.PlayerId; + } + drones.To.DronesCount = Math.Abs(drones.DronesCount - drones.To.DronesCount); + } + drones.QueueFree(); } diff --git a/src/Presentation/Main.tscn b/src/Presentation/Main.tscn index 842a261..4844034 100644 --- a/src/Presentation/Main.tscn +++ b/src/Presentation/Main.tscn @@ -29,7 +29,6 @@ margin_bottom = 779.0 [node name="CenterNode" parent="." instance=ExtResource( 5 )] position = Vector2( 240, 400 ) -DronesCount = 10 [node name="MouseDirectionLine" type="Line2D" parent="."] points = PoolVector2Array( 0, 0, 10, 0 ) diff --git a/src/Presentation/Planet.cs b/src/Presentation/Planet.cs index d1bd71d..73cf60f 100644 --- a/src/Presentation/Planet.cs +++ b/src/Presentation/Planet.cs @@ -3,16 +3,27 @@ using GodotAnalysers; [SceneReference("Planet.tscn")] -[Tool] public partial class Planet : IMinimapElement { public bool VisibleOnBorder => true; - public Sprite Sprite => this.planetSprite; + public Sprite Sprite => this.planetNeutralSprite; + + private int playerId = 0; + private bool playerIdDirty = true; + [Export] + public int PlayerId + { + get => playerId; + set + { + this.playerId = value; + this.playerIdDirty = true; + } + } private int dronesCount = 0; private bool dronesCountDirty = true; - [Export] public int DronesCount { @@ -24,6 +35,11 @@ public int DronesCount } } + [Export] + public float GrowSpeed = 1; + public float GrowTimeout; + public int DronesMaxCount = 50; + public override void _Ready() { base._Ready(); @@ -40,8 +56,27 @@ public override void _Process(float delta) if (this.dronesCountDirty) { this.dronesCountLabel.Text = this.dronesCount.ToString(); + this.dronesCountDirty = false; + } + + if (this.playerIdDirty) + { + this.planetNeutralSprite.Visible = this.playerId == Main.PlayerNeutralId; + this.planetEnemySprite.Visible = this.playerId == Main.PlayerEnemyId; + this.planetAllySprite.Visible = this.playerId == Main.PlayerAllyId; + this.playerIdDirty = false; + } + + if (dronesCount < DronesMaxCount && this.playerId != Main.PlayerNeutralId) + { + this.GrowTimeout += this.GrowSpeed * delta; + if (this.GrowTimeout > 1) + { + this.DronesCount++; + this.GrowTimeout--; + } } } - public Rect2 GetRect() => this.planetSprite.GetRect(); + public Rect2 GetRect() => this.planetNeutralSprite.GetRect(); } diff --git a/src/Presentation/Planet.tscn b/src/Presentation/Planet.tscn index 629b3f2..8208fb7 100644 --- a/src/Presentation/Planet.tscn +++ b/src/Presentation/Planet.tscn @@ -1,19 +1,29 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=5 format=2] -[ext_resource path="res://Presentation/assets/Example_sprite.png" type="Texture" id=1] +[ext_resource path="res://Presentation/assets/Planet_neutral_sprite.png" type="Texture" id=1] [ext_resource path="res://Presentation/Planet.cs" type="Script" id=2] +[ext_resource path="res://Presentation/assets/Planet_ally_sprite.png" type="Texture" id=3] +[ext_resource path="res://Presentation/assets/Planet_enemy_sprite.png" type="Texture" id=4] [node name="Planet" type="Node2D"] script = ExtResource( 2 ) -[node name="PlanetSprite" type="Sprite" parent="." groups=["MinimapElement"]] +[node name="PlanetNeutralSprite" type="Sprite" parent="."] texture = ExtResource( 1 ) +[node name="PlanetEnemySprite" type="Sprite" parent="."] +visible = false +texture = ExtResource( 4 ) + +[node name="PlanetAllySprite" type="Sprite" parent="."] +visible = false +texture = ExtResource( 3 ) + [node name="DronesCountLabel" type="Label" parent="."] margin_left = -23.0 margin_top = -23.0 margin_right = 23.0 margin_bottom = 23.0 -text = "1" +text = "0" align = 1 valign = 1 diff --git a/src/Presentation/assets/Drone_ally_sprite.png b/src/Presentation/assets/Drone_ally_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..a443e994cadb262360f7adce5bd22e11367adbe9 GIT binary patch literal 6809 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 literal 0 HcmV?d00001 diff --git a/src/Presentation/assets/Planet_enemy_sprite.png b/src/Presentation/assets/Planet_enemy_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc6ef8cd3c664ffdd183bcef68d55b9b7b8f34a GIT binary patch literal 6725 zcmeHL2~-o;8V-tpAczPEC>nzcpp#4{dra5@LeKyL7C}%albH|*NytJXq5`c&T%NnQ zPzq{Ysz|}20*Yt_1f^OlwfYoLskL>(4Ygug1r?)%Vj^Ke|~#_NnanwfJ(p`?7JCKXvY|L%J@6 z;wwZCeMpSp6*LV+_mF6w)27EYZ`AmhPIY{Li=X^ z=BJ+0WVS`?;dxn)<1*drFS&D;j-S**xOC`ns;g7&n)n*OINeQ2d45#3VC2(=mO|+9 zo_I$3*#*H%mR4OZyi!HGHg?qhD8sFceeoH{h31p@4|Ix)FNObjs6H{N?#8^d3&98J zBiC?ulqI=X@mq>dla{pE?L6r{Fvxbxf$aO(gk{d>hEfw<+jmXd?mxdF)XAQ&cMiGU zs3_kxG%WrTMqAzKfDdcOp09DMvQBr8dwMM3q$2LRx7Q%nv5;||TV1U&AD?Lj-fqap zyj9I7V`^$?R%Qsq`qX7WKw^HXZEhZMT43~Q ziSB1cV)Qh|Ci?g=y9VmE4P#`XUQ(B)Gx_&)b(#4#!(uW9j&=5mi)?VZ5;fnJ@xiX7 zq|Yl-HMVoN)Q%I)Osa?q_SCfsRwPt*o_pZ8)0Wj`WDWbNbFt!o&w zrZ#1%OFs?|3Ui`=E8LKuMeQ`NL!r#f>kS*H-!Ev|rch%;k?H0ZjbMX}?%Myu>Y+LQ z!}POH&A--U=$?7#UPJ!IbMvz~v|aO#T`D=mpHtj)d3&7HS)g$Z+Yy)ZLylPjExBOx z#i$E3i|Mi;hevda8}%RMtj*#rHn$4jPKY-@{ghm8oxi+#*0mGG`Y%tDlMW?oJmSxO zzkBq#L8EN)6Jou)+)B~qE%zrnS#*8F4;^tU(zWAz&y=0ZLM=uXs44L(ewf?31ee3!A*6-ajApFxgO}>|7TQA9CxavR}IqJrx@1R(1H1FJZ7PP+Vi%B9aS@Tv#EE+2Cepcy!2Yep#DV( zg|YhlyGXsPfN)gW7OH&4a;teb{-;O#oqhXl`Dab7Ze~l2|_{TXbNtK24|+ehS$olR~z)2KgN~c8G@^O z$^RPqMZ8S5nBvL}R3bW~QehyUWVDwnQ6e%4*Yt?d*$@?Epa6@>5Ce238v|e(!UWh< z2F8NLYz9nY^q~?eG+J1Jphha3oGin6By1{&O=D64n888;I*L&N4hXRUDq9SSS!^nZ zvetBh05V(N?07(o|AJUT?8*rz#PXpb3mhjP=%AaRIQDVjA)&Zv+31DJoH^SNvx@ub?kk z{MA~$Qk@*G4i_h(i1zI~Zvww$io|=JMysAH`~#Taehr+4_GAYh$DSo55mrc1yxaDc+KYMF8`2mSOIRSC0Rs?11pzt? zBY>Dqg8?zjMqws`pbQqvw81agHA+mYht;UR6wd*CpYhT%?K9ESlzm>WqxFfXF||Ov z)8ajlN{@yhE=1+hzzHD41wm5Jj`wE3U*jT;j{Abp8Gu9#;pGLRAb=MYUh#A`Oamos zh{5d1;Xmc#-{%j53Bs_LiUAT9oej`gYzTlcIurK?!$20w;;u!sS*IC z)9ENIhB*l1HwF9W{ozrJca#?$gJ(R&MIvtBp29Pp@?4>@nMdhVD!B|*zus$J^xl7i z>m%RW=l@8&FRVvepj6Gp&%s1(xL)yA^=|<7Fie#ps6wNBo9TTaJz?o{mBVfBnZvJ$ z_>GhD^2*uUY4MWzD?hy*{I66&B)(VjPVs#ouJ_@3rwF_g_txyI2zmpz+C6(#ZZjZmtvJg)R4m7>kB0LpTEySM&szPEl1cKdh