diff --git a/core/src/gdx/diablo/screen/MenuScreen.java b/core/src/gdx/diablo/screen/MenuScreen.java index 38bd7a6a..90dc3a22 100644 --- a/core/src/gdx/diablo/screen/MenuScreen.java +++ b/core/src/gdx/diablo/screen/MenuScreen.java @@ -40,7 +40,7 @@ public class MenuScreen extends ScreenAdapter { private Stage stage; private Button btnSinglePlayer; - private Button btnMultiPlayer; + private Button btnMultiplayer; private Button btnExitDiablo; private Label lbVersion; @@ -101,6 +101,8 @@ public class MenuScreen extends ScreenAdapter { Actor actor = event.getListenerActor(); if (actor == btnSinglePlayer) { Diablo.client.pushScreen(new SelectCharacterScreen()); + } else if (actor == btnMultiplayer) { + Diablo.client.pushScreen(new MultiplayerScreen(D2logoLeft, D2logoRight)); } else if (actor == btnExitDiablo) { Gdx.app.exit(); } @@ -108,14 +110,14 @@ public class MenuScreen extends ScreenAdapter { }; btnSinglePlayer = new TextButton(5106, style); btnSinglePlayer.addListener(clickListener); - btnMultiPlayer = new TextButton(5108, style); - btnMultiPlayer.addListener(clickListener); + btnMultiplayer = new TextButton(5107, style); + btnMultiplayer.addListener(clickListener); btnExitDiablo = new TextButton(5109, style); btnExitDiablo.addListener(clickListener); Table panel = new Table() {{ add(btnSinglePlayer).space(8).row(); - add(btnMultiPlayer).space(8).row(); + add(btnMultiplayer).space(8).row(); add(btnExitDiablo).space(8).row(); }}; panel.setX(stage.getWidth() / 2); diff --git a/core/src/gdx/diablo/screen/MultiplayerScreen.java b/core/src/gdx/diablo/screen/MultiplayerScreen.java new file mode 100644 index 00000000..72ba1ad3 --- /dev/null +++ b/core/src/gdx/diablo/screen/MultiplayerScreen.java @@ -0,0 +1,159 @@ +package gdx.diablo.screen; + +import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Button; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; + +import gdx.diablo.BlendMode; +import gdx.diablo.Diablo; +import gdx.diablo.codec.Animation; +import gdx.diablo.codec.DC6; +import gdx.diablo.graphics.PaletteIndexedBatch; +import gdx.diablo.loader.DC6Loader; +import gdx.diablo.widget.TextButton; + +public class MultiplayerScreen extends ScreenAdapter { + private static final String TAG = "MultiplayerScreen"; + + final AssetDescriptor TitleScreenDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\TitleScreen.dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE); + TextureRegion TitleScreen; + + final AssetDescriptor D2logoBlackLeftDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoBlackLeft.DC6", DC6.class); + final AssetDescriptor D2logoFireLeftDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoFireLeft.DC6", DC6.class); + final AssetDescriptor D2logoBlackRightDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoBlackRight.DC6", DC6.class); + final AssetDescriptor D2logoFireRightDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoFireRight.DC6", DC6.class); + Animation D2logoLeft; + Animation D2logoRight; + + final AssetDescriptor WideButtonBlankDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\3WideButtonBlank.dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE); + final AssetDescriptor buttonDescriptor = new AssetDescriptor<>("data\\global\\sfx\\cursor\\button.wav", Sound.class); + + final AssetDescriptor selectDescriptor = new AssetDescriptor<>("data\\global\\sfx\\cursor\\select.wav", Sound.class); + + private Stage stage; + private Button btnOpenBattlenet; + private Button btnTCPIP; + private Button btnCancel; + + public MultiplayerScreen(Animation D2logoLeft, Animation D2logoRight) { + this.D2logoLeft = D2logoLeft; + this.D2logoRight = D2logoRight; + Diablo.assets.load(TitleScreenDescriptor); + Diablo.assets.load(D2logoFireLeftDescriptor); + Diablo.assets.load(D2logoFireRightDescriptor); + Diablo.assets.load(D2logoBlackLeftDescriptor); + Diablo.assets.load(D2logoBlackRightDescriptor); + Diablo.assets.load(WideButtonBlankDescriptor); + Diablo.assets.load(buttonDescriptor); + Diablo.assets.load(selectDescriptor); + + stage = new Stage(Diablo.viewport, Diablo.batch); + } + + @Override + public void show() { + Diablo.assets.finishLoadingAsset(TitleScreenDescriptor); + TitleScreen = Diablo.assets.get(TitleScreenDescriptor).getTexture(); + + if (D2logoLeft == null || D2logoRight == null) { + Diablo.music.enqueue("data/global/music/Act1/tristram.wav"); + } + + if (D2logoLeft == null) { + Diablo.assets.finishLoadingAsset(D2logoBlackLeftDescriptor); + Diablo.assets.finishLoadingAsset(D2logoFireLeftDescriptor); + D2logoLeft = new Animation.CompositeAnimation( + Animation.Layer.from(Diablo.assets.get(D2logoBlackLeftDescriptor)), + Animation.Layer.from(Diablo.assets.get(D2logoFireLeftDescriptor), BlendMode.LUMINOSITY)); + } + + if (D2logoRight == null) { + Diablo.assets.finishLoadingAsset(D2logoBlackRightDescriptor); + Diablo.assets.finishLoadingAsset(D2logoFireRightDescriptor); + D2logoRight = new Animation.CompositeAnimation( + Animation.Layer.from(Diablo.assets.get(D2logoBlackRightDescriptor)), + Animation.Layer.from(Diablo.assets.get(D2logoFireRightDescriptor), BlendMode.LUMINOSITY)); + } + + TextButton.TextButtonStyle style = new TextButton.TextButtonStyle() {{ + Diablo.assets.finishLoadingAsset(WideButtonBlankDescriptor); + DC6 WideButtonBlank = Diablo.assets.get(WideButtonBlankDescriptor); + up = new TextureRegionDrawable(WideButtonBlank.getTexture(0)); + down = new TextureRegionDrawable(WideButtonBlank.getTexture(1)); + font = Diablo.fonts.fontexocet10; + }}; + ClickListener clickListener = new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + Actor actor = event.getListenerActor(); + if (actor == btnOpenBattlenet) { + } else if (actor == btnTCPIP) { + Diablo.client.pushScreen(new TCPIPScreen(D2logoLeft, D2logoRight)); + } else if (actor == btnCancel) { + Diablo.client.popScreen(); + } + } + }; + btnOpenBattlenet = new TextButton(5115, style); + btnOpenBattlenet.addListener(clickListener); + btnTCPIP = new TextButton(5116, style); + btnTCPIP.addListener(clickListener); + btnCancel = new TextButton(5134, style); + btnCancel.addListener(clickListener); + + Table panel = new Table() {{ + add(btnOpenBattlenet).space(8).row(); + add(btnTCPIP).space(8).row(); + add(btnCancel).space(8).row(); + }}; + panel.setX(stage.getWidth() / 2); + panel.setY(stage.getHeight() * 0.40f); + stage.addActor(panel); + + Diablo.input.addProcessor(stage); + } + + @Override + public void hide() { + Diablo.input.removeProcessor(stage); + } + + @Override + public void dispose() { + Diablo.assets.unload(TitleScreenDescriptor.fileName); + Diablo.assets.unload(D2logoFireLeftDescriptor.fileName); + Diablo.assets.unload(D2logoFireRightDescriptor.fileName); + Diablo.assets.unload(D2logoBlackLeftDescriptor.fileName); + Diablo.assets.unload(D2logoBlackRightDescriptor.fileName); + Diablo.assets.unload(WideButtonBlankDescriptor.fileName); + Diablo.assets.unload(buttonDescriptor.fileName); + Diablo.assets.unload(selectDescriptor.fileName); + } + + @Override + public void render(float delta) { + PaletteIndexedBatch b = Diablo.batch; + b.begin(Diablo.palettes.units); + b.draw(TitleScreen, Diablo.VIRTUAL_WIDTH_CENTER - (TitleScreen.getRegionWidth() / 2), 0); + + int x = Diablo.VIRTUAL_WIDTH_CENTER; + float y = (Diablo.VIRTUAL_HEIGHT * 0.75f); + D2logoLeft.act(delta); + D2logoLeft.draw(b, x, y); + D2logoRight.act(delta); + D2logoRight.draw(b, x, y); + + b.end(); + + stage.act(delta); + stage.draw(); + } +} diff --git a/core/src/gdx/diablo/screen/TCPIPScreen.java b/core/src/gdx/diablo/screen/TCPIPScreen.java new file mode 100644 index 00000000..c23ea095 --- /dev/null +++ b/core/src/gdx/diablo/screen/TCPIPScreen.java @@ -0,0 +1,229 @@ +package gdx.diablo.screen; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.Net; +import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.net.Socket; +import com.badlogic.gdx.net.SocketHints; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Button; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.GdxRuntimeException; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import gdx.diablo.BlendMode; +import gdx.diablo.Diablo; +import gdx.diablo.codec.Animation; +import gdx.diablo.codec.DC6; +import gdx.diablo.graphics.PaletteIndexedBatch; +import gdx.diablo.loader.DC6Loader; +import gdx.diablo.widget.Label; +import gdx.diablo.widget.TextButton; + +public class TCPIPScreen extends ScreenAdapter { + private static final String TAG = "MultiplayerScreen"; + + final AssetDescriptor TitleScreenDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\TitleScreen.dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE); + TextureRegion TitleScreen; + + final AssetDescriptor D2logoBlackLeftDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoBlackLeft.DC6", DC6.class); + final AssetDescriptor D2logoFireLeftDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoFireLeft.DC6", DC6.class); + final AssetDescriptor D2logoBlackRightDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoBlackRight.DC6", DC6.class); + final AssetDescriptor D2logoFireRightDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\D2logoFireRight.DC6", DC6.class); + Animation D2logoLeft; + Animation D2logoRight; + + final AssetDescriptor WideButtonBlankDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\3WideButtonBlank.dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE); + final AssetDescriptor MediumButtonBlankDescriptor = new AssetDescriptor<>("data\\global\\ui\\FrontEnd\\MediumButtonBlank.dc6", DC6.class); + final AssetDescriptor buttonDescriptor = new AssetDescriptor<>("data\\global\\sfx\\cursor\\button.wav", Sound.class); + + final AssetDescriptor selectDescriptor = new AssetDescriptor<>("data\\global\\sfx\\cursor\\select.wav", Sound.class); + + private Stage stage; + private Label lbHostIP; + private Button btnHostGame; + private Button btnJoinGame; + private Label lbDescription; + private Button btnCancel; + + public TCPIPScreen(Animation D2logoLeft, Animation D2logoRight) { + this.D2logoLeft = D2logoLeft; + this.D2logoRight = D2logoRight; + Diablo.assets.load(TitleScreenDescriptor); + Diablo.assets.load(D2logoFireLeftDescriptor); + Diablo.assets.load(D2logoFireRightDescriptor); + Diablo.assets.load(D2logoBlackLeftDescriptor); + Diablo.assets.load(D2logoBlackRightDescriptor); + Diablo.assets.load(WideButtonBlankDescriptor); + Diablo.assets.load(MediumButtonBlankDescriptor); + Diablo.assets.load(buttonDescriptor); + Diablo.assets.load(selectDescriptor); + + stage = new Stage(Diablo.viewport, Diablo.batch); + } + + @Override + public void show() { + Diablo.assets.finishLoadingAsset(TitleScreenDescriptor); + TitleScreen = Diablo.assets.get(TitleScreenDescriptor).getTexture(); + + if (D2logoLeft == null || D2logoRight == null) { + Diablo.music.enqueue("data/global/music/Act1/tristram.wav"); + } + + if (D2logoLeft == null) { + Diablo.assets.finishLoadingAsset(D2logoBlackLeftDescriptor); + Diablo.assets.finishLoadingAsset(D2logoFireLeftDescriptor); + D2logoLeft = new Animation.CompositeAnimation( + Animation.Layer.from(Diablo.assets.get(D2logoBlackLeftDescriptor)), + Animation.Layer.from(Diablo.assets.get(D2logoFireLeftDescriptor), BlendMode.LUMINOSITY)); + } + + if (D2logoRight == null) { + Diablo.assets.finishLoadingAsset(D2logoBlackRightDescriptor); + Diablo.assets.finishLoadingAsset(D2logoFireRightDescriptor); + D2logoRight = new Animation.CompositeAnimation( + Animation.Layer.from(Diablo.assets.get(D2logoBlackRightDescriptor)), + Animation.Layer.from(Diablo.assets.get(D2logoFireRightDescriptor), BlendMode.LUMINOSITY)); + } + + TextButton.TextButtonStyle style = new TextButton.TextButtonStyle() {{ + Diablo.assets.finishLoadingAsset(WideButtonBlankDescriptor); + DC6 WideButtonBlank = Diablo.assets.get(WideButtonBlankDescriptor); + up = new TextureRegionDrawable(WideButtonBlank.getTexture(0)); + down = new TextureRegionDrawable(WideButtonBlank.getTexture(1)); + font = Diablo.fonts.fontexocet10; + }}; + ClickListener clickListener = new ClickListener() { + @Override + public boolean mouseMoved(InputEvent event, float x, float y) { + if (btnHostGame.isOver()) { + lbDescription.setText(5122); + } else if (btnJoinGame.isOver()) { + lbDescription.setText(5123); + } + + return super.mouseMoved(event, x, y); + } + + @Override + public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) { + lbDescription.setText(null); + super.exit(event, x, y, pointer, toActor); + } + + @Override + public void clicked(InputEvent event, float x, float y) { + Actor actor = event.getListenerActor(); + if (actor == btnHostGame) { + } else if (actor == btnJoinGame) { + try { + Gdx.input.getTextInput(new Input.TextInputListener() { + @Override + public void input(String text) { + Socket socket = Gdx.net.newClientSocket(Net.Protocol.TCP, text, 6112, new SocketHints()); + socket.dispose(); + } + + @Override + public void canceled() {} + }, "Enter IP", "127.0.0.1", "127.0.0.1"); + } catch (GdxRuntimeException e) { + Gdx.app.log(TAG, e.getMessage(), e); + } + } else if (actor == btnCancel) { + Diablo.client.popScreen(); + } + } + }; + String ip = null; + try { + InetAddress address = InetAddress.getLocalHost(); + ip = address.getHostAddress(); + } catch (UnknownHostException e) {} + lbHostIP = new Label(Diablo.string.lookup(5121) + '\n' + ip, Diablo.fonts.font16); + lbHostIP.setColor(Diablo.colors.unique); + lbHostIP.setAlignment(Align.center); + btnHostGame = new TextButton(5118, style); + btnHostGame.addListener(clickListener); + btnJoinGame = new TextButton(5119, style); + btnJoinGame.addListener(clickListener); + lbDescription = new Label(null, Diablo.fonts.fontformal12); + lbDescription.setColor(Diablo.colors.unique); + lbDescription.setAlignment(Align.center); + lbDescription.setWrap(true); + + // TODO: Sizing could be cleaned up some + Table panel = new Table() {{ + add(lbHostIP).space(8).row(); + add(btnHostGame).space(8).row(); + add(btnJoinGame).space(8).row(); + add(lbDescription).space(8).minSize(400, 112).row(); + }}; + panel.setX(stage.getWidth() / 2); + panel.setY(stage.getHeight() * 0.40f); + stage.addActor(panel); + + TextButton.TextButtonStyle mediumButtonStyle = new TextButton.TextButtonStyle() {{ + Diablo.assets.finishLoadingAsset(MediumButtonBlankDescriptor); + DC6 pages = Diablo.assets.get(MediumButtonBlankDescriptor); + up = new TextureRegionDrawable(pages.getTexture(0)); + down = new TextureRegionDrawable(pages.getTexture(1)); + font = Diablo.fonts.fontexocet10; + }}; + btnCancel = new TextButton(5134, mediumButtonStyle); + btnCancel.addListener(clickListener); + btnCancel.setPosition(20, 20); + stage.addActor(btnCancel); + + Diablo.input.addProcessor(stage); + } + + @Override + public void hide() { + Diablo.input.removeProcessor(stage); + } + + @Override + public void dispose() { + Diablo.assets.unload(TitleScreenDescriptor.fileName); + Diablo.assets.unload(D2logoFireLeftDescriptor.fileName); + Diablo.assets.unload(D2logoFireRightDescriptor.fileName); + Diablo.assets.unload(D2logoBlackLeftDescriptor.fileName); + Diablo.assets.unload(D2logoBlackRightDescriptor.fileName); + Diablo.assets.unload(WideButtonBlankDescriptor.fileName); + Diablo.assets.unload(MediumButtonBlankDescriptor.fileName); + Diablo.assets.unload(buttonDescriptor.fileName); + Diablo.assets.unload(selectDescriptor.fileName); + } + + @Override + public void render(float delta) { + PaletteIndexedBatch b = Diablo.batch; + b.begin(Diablo.palettes.units); + b.draw(TitleScreen, Diablo.VIRTUAL_WIDTH_CENTER - (TitleScreen.getRegionWidth() / 2), 0); + + int x = Diablo.VIRTUAL_WIDTH_CENTER; + float y = (Diablo.VIRTUAL_HEIGHT * 0.75f); + D2logoLeft.act(delta); + D2logoLeft.draw(b, x, y); + D2logoRight.act(delta); + D2logoRight.draw(b, x, y); + + b.end(); + + stage.act(delta); + stage.draw(); + } +}