/*******************************************************************************
* Copyright 2015 Maximilian Stark | Dakror <mail@dakror.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.dakror.arise.layer;
import java.awt.Desktop;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import javax.swing.JOptionPane;
import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;
import de.dakror.arise.Arise;
import de.dakror.arise.game.Game;
import de.dakror.arise.game.world.World;
import de.dakror.arise.net.packet.Packet;
import de.dakror.arise.net.packet.Packet.PacketTypes;
import de.dakror.arise.net.packet.Packet01Login;
import de.dakror.arise.net.packet.Packet01Login.Response;
import de.dakror.arise.net.packet.Packet03World;
import de.dakror.arise.net.packet.Packet10Attribute;
import de.dakror.arise.net.packet.Packet10Attribute.Key;
import de.dakror.gamesetup.layer.Alert;
import de.dakror.gamesetup.ui.ClickEvent;
import de.dakror.gamesetup.ui.InputField;
import de.dakror.gamesetup.ui.button.TextButton;
import de.dakror.gamesetup.util.Helper;
/**
* @author Dakror
*/
public class LoginLayer extends MPLayer {
BufferedImage cache;
TextButton login;
InputField username, password;
boolean startGame;
public LoginLayer() {
startGame = false;
}
@Override
public void draw(Graphics2D g) {
if (cache == null) {
cache = new BufferedImage(Game.getWidth(), Game.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) cache.getGraphics();
Helper.setRenderingHints(g2, true);
g2.setFont(g.getFont());
g2.drawImage(Game.getImage("system/menu.jpg"), 0, 0, Game.getWidth(), Game.getHeight(), null);
Shape oc = g2.getClip();
g2.setClip(new Rectangle(Game.getWidth() / 4, 190 + 19, Game.getWidth() / 2, 16));
Helper.drawOutline(Game.getWidth() / 4, 190, Game.getWidth() / 2, 32, true, g2);
g2.setClip(oc);
Helper.drawImageCenteredRelativeScaled(Game.getImage("system/title.png"), 50, 1920, 1080, Game.getWidth(), Game.getHeight(), g2);
Helper.drawContainer((Game.getWidth() - (TextButton.WIDTH + 40)) / 2, 300, TextButton.WIDTH + 40, TextButton.HEIGHT * 4 + 40, true, false, g2);
}
g.drawImage(cache, 0, 0, null);
drawComponents(g);
}
@Override
public void update(int tick) {
if (login != null) login.enabled = username.getText().length() >= 4 && password.getText().length() > 0;
if (Game.currentGame.alpha == 1 && startGame) Game.currentGame.startGame();
}
public void initFirstPage() {
login = null;
components.clear();
TextButton login = new TextButton((Game.getWidth() - (TextButton.WIDTH + 40)) / 2 + 20, 320, "Anmelden");
login.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
initSecondPage();
}
});
components.add(login);
TextButton register = new TextButton(login.getX(), login.getY() + TextButton.HEIGHT, "Registrieren");
register.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
try {
if (!Arise.wrapper) Game.applet.getAppletContext().showDocument(new URL("http://dakror.de#register"), "_blank");
else Desktop.getDesktop().browse(new URL("http://dakror.de#register").toURI());
} catch (Exception e) {
e.printStackTrace();
}
}
});
components.add(register);
TextButton exit = new TextButton(login.getX(), register.getY() + TextButton.HEIGHT * 2, "Beenden");
exit.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
try {
if (!Arise.wrapper) Game.applet.getAppletContext().showDocument(new URL("http://dakror.de"));
else System.exit(0);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
});
components.add(exit);
}
public void initSecondPage() {
components.clear();
TextButton back = new TextButton((Game.getWidth() - (TextButton.WIDTH + 40)) / 2 + 20, 320, "Zurück");
back.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
initFirstPage();
}
});
components.add(back);
username = new InputField(back.getX(), back.getY() + TextButton.HEIGHT, TextButton.WIDTH, 40);
username.setAllowed("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890öäüÖÄÜß");
username.setHint("Benutzername");
components.add(username);
password = new InputField(back.getX(), back.getY() + TextButton.HEIGHT * 2, TextButton.WIDTH, 40);
password.setPassword(true);
String allowed = password.getAllowed();
allowed += ",;.:-_#'+*~!§$%&/()=?<>| ";
password.setAllowed(allowed);
password.setHint("Passwort");
components.add(password);
login = new TextButton(back.getX(), back.getY() + TextButton.HEIGHT * 3, "Anmelden");
login.enabled = false;
login.addClickEvent(new ClickEvent() {
@Override
public void trigger() {
try {
final String pw = new String(HexBin.encode(MessageDigest.getInstance("MD5").digest(password.getText().getBytes()))).toLowerCase();
Game.client.sendPacket(new Packet01Login(username.getText(), pw, Game.worldID));
Game.currentGame.addLayer(new LoadingLayer());
} catch (Exception e) {
e.printStackTrace();
}
}
});
components.add(login);
}
@Override
public void init() {
initFirstPage();
}
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
if (e.getKeyCode() == KeyEvent.VK_F2) {
String id = JOptionPane.showInputDialog("ID der gewünschten Welt: ", Game.worldID);
try {
int i = Integer.parseInt(id);
Game.worldID = i;
} catch (Exception e1) {}
}
}
@Override
public void onReceivePacket(Packet p) {
super.onReceivePacket(p);
if (p.getType() == PacketTypes.LOGIN) {
if (((Packet01Login) p).getResponse() != Response.LOGIN_OK) {
Game.currentGame.removeLoadingLayer();
Game.currentGame.addLayer(new Alert(((Packet01Login) p).getResponse().text, new ClickEvent() {
@Override
public void trigger() {
password.setText("");
Game.worldID = 1;
}
}));
} else {
Game.username = ((Packet01Login) p).getUsername();
Game.userID = ((Packet01Login) p).getUserId();
try {
Game.client.sendPacket(new Packet03World(Game.worldID));
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (p.getType() == PacketTypes.WORLD) {
try {
Game.world = new World((Packet03World) p);
Game.client.sendPacket(new Packet10Attribute(Key.world_data, Game.worldID));
} catch (Exception e) {
e.printStackTrace();
}
}
if (p.getType() == PacketTypes.CITY || p.getType() == PacketTypes.TRANSFER) {
Game.world.onReceivePacket(p);
}
if (p.getType() == PacketTypes.ATTRIBUTE) {
if (((Packet10Attribute) p).getKey() == Key.loading_complete) {
startGame = true;
Game.currentGame.removeLoadingLayer();
Game.currentGame.fadeTo(1, 0.05f);
}
}
}
}