Skip to content

Commit ff39ff3

Browse files
committed
2.0.0: Unified Release Bump
1 parent f1f6d1a commit ff39ff3

4 files changed

Lines changed: 171 additions & 3 deletions

File tree

VERSION.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.7
1+
2.0.0

src/main/java/com/bobsgame/client/BobsGame.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public class BobsGame extends NDGameEngine implements GameManager {
3131
private boolean isNetworkGame = false;
3232
private int frameCount = 0;
3333

34+
private com.badlogic.gdx.scenes.scene2d.ui.Table chatTable;
35+
private com.badlogic.gdx.scenes.scene2d.ui.Table chatLogTable;
36+
private com.badlogic.gdx.scenes.scene2d.ui.TextField chatInputField;
37+
private boolean chatActive = false;
38+
3439
public BobsGame(ND nD) {
3540
super(nD);
3641
}
@@ -106,8 +111,20 @@ public void init() {
106111
log.info("Joined room, waiting for other player...");
107112
});
108113

114+
networkManager.on("chatMessage", args -> {
115+
if (args.length > 0) {
116+
try {
117+
String json = args[0].toString();
118+
NetworkManager.ChatMessage msg = new com.google.gson.Gson().fromJson(json, NetworkManager.ChatMessage.class);
119+
Gdx.app.postRunnable(() -> addChatMessage(msg));
120+
} catch (Exception e) {}
121+
}
122+
});
123+
109124
networkManager.connect("http://localhost:6065");
110125
networkManager.createRoom("JavaRoom");
126+
127+
Gdx.app.postRunnable(this::initChatUI);
111128
}
112129

113130
// Load default game type for testing
@@ -117,6 +134,12 @@ public void init() {
117134
}
118135

119136
public void update() {
137+
if (isNetworkGame && Gdx.input.isKeyJustPressed(com.badlogic.gdx.Input.Keys.T)) {
138+
toggleChat();
139+
}
140+
141+
if (chatActive) return;
142+
120143
// This is called by ND or Engine
121144
if (ME != null) ME.update(0, games.size());
122145

@@ -138,6 +161,63 @@ public void render() {
138161
puzzleRenderer.render(ME, 100, 100, 32);
139162
}
140163
}
164+
165+
if (chatActive && chatTable != null) {
166+
// Need a stage to render chatTable
167+
// For now assume ND stage or Engine stage
168+
com.bobsgame.client.engine.Engine.GUIManager().render();
169+
}
170+
}
171+
172+
private void initChatUI() {
173+
com.badlogic.gdx.scenes.scene2d.ui.Skin skin = com.bobsgame.client.engine.Engine.GUIManager().e.uiSkin;
174+
chatTable = new com.badlogic.gdx.scenes.scene2d.ui.Table(skin);
175+
chatTable.setFillParent(true);
176+
chatTable.bottom().left().pad(10);
177+
178+
chatLogTable = new com.badlogic.gdx.scenes.scene2d.ui.Table(skin);
179+
chatLogTable.bottom().left();
180+
com.badlogic.gdx.scenes.scene2d.ui.ScrollPane scroll = new com.badlogic.gdx.scenes.scene2d.ui.ScrollPane(chatLogTable, skin);
181+
182+
chatInputField = new com.badlogic.gdx.scenes.scene2d.ui.TextField("", skin);
183+
chatInputField.setMessageText("Press T to chat...");
184+
chatInputField.setVisible(false);
185+
186+
chatTable.add(scroll).width(300).height(200).left().row();
187+
chatTable.add(chatInputField).width(300).left();
188+
189+
com.bobsgame.client.engine.Engine.GUIManager().e.stage.addActor(chatTable);
190+
}
191+
192+
private void toggleChat() {
193+
chatActive = !chatActive;
194+
chatInputField.setVisible(chatActive);
195+
if (chatActive) {
196+
com.bobsgame.client.engine.Engine.GUIManager().e.stage.setKeyboardFocus(chatInputField);
197+
chatInputField.setText("");
198+
chatInputField.setTextFieldListener((textField, c) -> {
199+
if (c == '\n' || c == '\r') {
200+
sendChat();
201+
toggleChat();
202+
}
203+
});
204+
} else {
205+
com.bobsgame.client.engine.Engine.GUIManager().e.stage.setKeyboardFocus(null);
206+
}
207+
}
208+
209+
private void sendChat() {
210+
String text = chatInputField.getText().trim();
211+
if (!text.isEmpty()) {
212+
networkManager.sendChat(text, "JavaPlayer");
213+
}
214+
}
215+
216+
private void addChatMessage(NetworkManager.ChatMessage msg) {
217+
if (chatLogTable == null) return;
218+
com.badlogic.gdx.scenes.scene2d.ui.Label label = new com.badlogic.gdx.scenes.scene2d.ui.Label(msg.name + ": " + msg.message, chatLogTable.getSkin());
219+
label.setWrap(true);
220+
chatLogTable.add(label).width(280).left().row();
141221
}
142222

143223
public static void initSprites(SpriteManager sm) {

src/main/java/com/bobsgame/client/state/LobbyScreen.java

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public class LobbyScreen extends Scene2DPanel {
3131
private TextField startLevelField;
3232
private CheckBox privateCheckbox;
3333
private TextField joinPasswordField;
34+
private Table chatLogTable;
35+
private TextField chatInputField;
36+
private Table listsTable;
3437
private Gson gson = new Gson();
3538
private float refreshTimer = 0;
3639

@@ -149,7 +152,22 @@ private void setupNetwork() {
149152
});
150153

151154
nm.on("joinedRoom", args -> {
152-
Gdx.app.postRunnable(() -> statusLabel.setText("Joined room. Waiting for players..."));
155+
Gdx.app.postRunnable(() -> {
156+
statusLabel.setText("Joined room. Waiting for players...");
157+
showChatUI();
158+
});
159+
});
160+
161+
nm.on("chatMessage", args -> {
162+
if (args.length > 0) {
163+
try {
164+
String json = args[0].toString();
165+
NetworkManager.ChatMessage msg = gson.fromJson(json, NetworkManager.ChatMessage.class);
166+
Gdx.app.postRunnable(() -> addChatMessage(msg));
167+
} catch (Exception e) {
168+
e.printStackTrace();
169+
}
170+
}
153171
});
154172

155173
nm.on("gameStart", args -> {
@@ -240,10 +258,65 @@ private void startNetworkGame(long seed, String mode, int level) {
240258
public void update(long deltaTicks) {
241259
super.update(deltaTicks);
242260
refreshTimer += deltaTicks / 1000.0f;
243-
if (refreshTimer > 5.0f) {
261+
if (refreshTimer > 5.0f && chatLogTable == null) {
244262
refreshTimer = 0;
245263
ClientMain.clientMain.networkManager.listRooms();
246264
ClientMain.clientMain.networkManager.getLeaderboard("marathon");
247265
}
248266
}
267+
268+
private void showChatUI() {
269+
listsTable.clear();
270+
271+
chatLogTable = new Table(engine.uiSkin);
272+
chatLogTable.top().left();
273+
274+
com.badlogic.gdx.scenes.scene2d.ui.ScrollPane scrollPane = new com.badlogic.gdx.scenes.scene2d.ui.ScrollPane(chatLogTable, engine.uiSkin);
275+
scrollPane.setFadeScrollBars(false);
276+
277+
chatInputField = new TextField("", engine.uiSkin);
278+
chatInputField.setMessageText("Press Enter to send...");
279+
280+
TextButton sendBtn = new TextButton("Send", engine.uiSkin);
281+
sendBtn.addListener(new ClickListener() {
282+
@Override
283+
public void clicked(InputEvent event, float x, float y) {
284+
sendChat();
285+
}
286+
});
287+
288+
chatInputField.setTextFieldListener((textField, c) -> {
289+
if (c == '\n' || c == '\r') {
290+
sendChat();
291+
}
292+
});
293+
294+
Table chatContainer = new Table(engine.uiSkin);
295+
chatContainer.add(scrollPane).expand().fill().colspan(2).row();
296+
chatContainer.add(chatInputField).expandX().fillX();
297+
chatContainer.add(sendBtn).padLeft(5);
298+
299+
listsTable.add(chatContainer).expand().fill();
300+
}
301+
302+
private void addChatMessage(NetworkManager.ChatMessage msg) {
303+
if (chatLogTable == null) return;
304+
305+
Label chatLabel = new Label(msg.name + ": " + msg.message, engine.uiSkin);
306+
chatLabel.setWrap(true);
307+
chatLogTable.add(chatLabel).expandX().fillX().left().pad(2).row();
308+
309+
// Auto-scroll
310+
if (chatLogTable.getParent() instanceof com.badlogic.gdx.scenes.scene2d.ui.ScrollPane) {
311+
((com.badlogic.gdx.scenes.scene2d.ui.ScrollPane)chatLogTable.getParent()).setScrollPercentY(100);
312+
}
313+
}
314+
315+
private void sendChat() {
316+
String text = chatInputField.getText().trim();
317+
if (!text.isEmpty()) {
318+
ClientMain.clientMain.networkManager.sendChat(text, "JavaPlayer");
319+
chatInputField.setText("");
320+
}
321+
}
249322
}

src/main/java/com/bobsgame/net/NetworkManager.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ public JoinRoomOptions(String id, String password) {
4646
}
4747
}
4848

49+
public static class ChatMessage {
50+
public String message;
51+
public String name;
52+
public long timestamp;
53+
}
54+
4955
private Socket socket;
5056
private GameLogic game;
5157
private GameLogic opponentGame;
@@ -168,6 +174,15 @@ public void sendFrame(GameLogic.GameStateData state) {
168174
}
169175
}
170176

177+
public void sendChat(String message, String name) {
178+
if (socket != null && socket.connected()) {
179+
Map<String, String> data = new HashMap<>();
180+
data.put("message", message);
181+
data.put("name", name);
182+
socket.emit("chatMessage", gson.toJson(data));
183+
}
184+
}
185+
171186
public void reportScore(com.google.gson.JsonObject data) {
172187
if (socket != null && socket.connected()) {
173188
socket.emit("reportScore", data.toString());

0 commit comments

Comments
 (0)