From 9a2f2f1cd79e8dee5de3eebc3cfcd76e46d3a317 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 18 Nov 2009 20:53:10 +1300 Subject: [PATCH] chat --- OpenRa.Game/Chat.cs | 43 ++++++++++++++++++++++++++++++++++ OpenRa.Game/Chrome.cs | 18 ++++++++++++++ OpenRa.Game/Game.cs | 2 ++ OpenRa.Game/MainWindow.cs | 10 ++++++++ OpenRa.Game/OpenRa.Game.csproj | 1 + OpenRa.Game/Order.cs | 5 ++++ OpenRa.Game/OrderManager.cs | 6 ++--- OpenRa.Game/UnitOrders.cs | 6 +++++ 8 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 OpenRa.Game/Chat.cs diff --git a/OpenRa.Game/Chat.cs b/OpenRa.Game/Chat.cs new file mode 100644 index 0000000000..69e8e0bb61 --- /dev/null +++ b/OpenRa.Game/Chat.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using IjwFramework.Types; + +namespace OpenRa.Game +{ + class Chat + { + const int logLength = 10; + + public List> recentLines = new List>(); + public string typing = ""; + public bool isChatting = false; + + public void Toggle() + { + if (isChatting && typing.Length > 0) + Game.controller.AddOrder(Order.Chat(Game.LocalPlayer, typing)); + + typing = ""; + isChatting ^= true; + } + + public void TypeChar(char c) + { + if (c == '\b') + { + if (typing.Length > 0) + typing = typing.Remove(typing.Length - 1); + } + else + typing += c; + } + + public void AddLine(Pair line) + { + recentLines.Add(line); + while (recentLines.Count > logLength) recentLines.RemoveAt(0); + } + } +} diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index 99a1cb3686..846cf63c4b 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -125,6 +125,24 @@ namespace OpenRa.Game chromeRenderer.Flush(); DrawBuildPalette(currentTab); + + var chatpos = new int2( 400, Game.viewport.Height - 20 ); + + if (Game.chat.isChatting) + RenderChatLine(Pair.New("Chat:", Game.chat.typing), chatpos); + + foreach (var line in Game.chat.recentLines.AsEnumerable().Reverse()) + { + chatpos.Y -= 20; + RenderChatLine(line, chatpos); + } + } + + void RenderChatLine(Pair line, int2 p) + { + var size = renderer.MeasureText(line.First); + renderer.DrawText(line.First, p, Color.Red); + renderer.DrawText(line.Second, p + new int2(size.X + 10, 0), Color.White); } string currentTab = "Building"; diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index fd6239c545..ad7204c6e8 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -157,6 +157,8 @@ namespace OpenRa.Game static int oreTicks = oreFrequency; public static int RenderFrame = 0; + public static Chat chat = new Chat(); + public static void Tick() { int t = Environment.TickCount; diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 4328be5b9e..41964c91d5 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -128,6 +128,16 @@ namespace OpenRa.Game Location = new int2(e.Location) }); } + + protected override void OnKeyPress(KeyPressEventArgs e) + { + base.OnKeyPress(e); + + if (e.KeyChar == '\r') + Game.chat.Toggle(); + else if (Game.chat.isChatting) + Game.chat.TypeChar(e.KeyChar); + } } struct MouseInput diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 8b2a788f15..4dc2262e62 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -75,6 +75,7 @@ + diff --git a/OpenRa.Game/Order.cs b/OpenRa.Game/Order.cs index 184a4f71f9..6e29ad9623 100644 --- a/OpenRa.Game/Order.cs +++ b/OpenRa.Game/Order.cs @@ -87,6 +87,11 @@ namespace OpenRa.Game return Game.world.Actors.Where(x => x.ActorID == aID).First(); } + public static Order Chat(Player subject, string text) + { + return new Order(subject, "Chat", null, null, int2.Zero, text, null); + } + public static Order Attack(Actor subject, Actor target) { return new Order(subject.Owner, "Attack", subject, target, int2.Zero, null, Cursor.Attack); diff --git a/OpenRa.Game/OrderManager.cs b/OpenRa.Game/OrderManager.cs index a401c55c4c..016400e844 100755 --- a/OpenRa.Game/OrderManager.cs +++ b/OpenRa.Game/OrderManager.cs @@ -155,7 +155,7 @@ namespace OpenRa.Game this.socket.NoDelay = true; var reader = new BinaryReader( socket.GetStream() ); - var nextFrameId = System.BitConverter.GetBytes( nextLocalOrderFrame ); + var nextFrameId = BitConverter.GetBytes( nextLocalOrderFrame ); socket.GetStream().Write( nextFrameId, 0, nextFrameId.Length ); new Thread( () => @@ -208,14 +208,14 @@ namespace OpenRa.Game var ms = new MemoryStream(); - ms.Write( System.BitConverter.GetBytes( nextLocalOrderFrame ) ); + ms.Write( BitConverter.GetBytes( nextLocalOrderFrame ) ); foreach( var order in localOrders ) ms.Write( order.Serialize() ); ++nextLocalOrderFrame; - socket.GetStream().Write( System.BitConverter.GetBytes( (int)ms.Length ) ); + socket.GetStream().Write( BitConverter.GetBytes( (int)ms.Length ) ); ms.WriteTo( socket.GetStream() ); } diff --git a/OpenRa.Game/UnitOrders.cs b/OpenRa.Game/UnitOrders.cs index 386fdf8bb9..b1e745bd0a 100755 --- a/OpenRa.Game/UnitOrders.cs +++ b/OpenRa.Game/UnitOrders.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using OpenRa.Game.GameRules; using OpenRa.Game.Traits; +using IjwFramework.Types; namespace OpenRa.Game { @@ -143,6 +144,11 @@ namespace OpenRa.Game pt.rallyPoint = order.TargetLocation; break; } + case "Chat": + { + Game.chat.AddLine(Pair.New(order.Player.PlayerName + ":", order.TargetString)); + break; + } default: throw new NotImplementedException(); }