package net.fe;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_LINE_SMOOTH;
import static org.lwjgl.opengl.GL11.GL_STENCIL_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glClearDepth;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glPopMatrix;
import static org.lwjgl.opengl.GL11.glPushMatrix;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import net.fe.builderStage.TeamDraftStage;
import net.fe.fightStage.AttackRecord;
import net.fe.fightStage.CombatCalculator;
import net.fe.fightStage.FightStage;
import net.fe.lobbystage.ClientLobbyStage;
import net.fe.network.Client;
import net.fe.network.Message;
import net.fe.network.message.CommandMessage;
import net.fe.overworldStage.ClientOverworldStage;
import net.fe.overworldStage.Grid;
import net.fe.overworldStage.Terrain;
import net.fe.overworldStage.objective.Seize;
import net.fe.transition.OverworldFightTransition;
import net.fe.unit.Unit;
import net.fe.unit.UnitFactory;
import net.fe.unit.UnitIdentifier;
import net.fe.unit.WeaponFactory;
import org.lwjgl.openal.AL;
import org.lwjgl.opengl.Display;
import org.newdawn.slick.Color;
import org.newdawn.slick.openal.SoundStore;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
import chu.engine.Game;
import chu.engine.Stage;
import chu.engine.anim.Renderer;
import chu.engine.menu.Notification;
public class FEMultiplayer extends Game{
private static Stage currentStage;
private static Client client;
private static Player localPlayer;
public static Player turn;
public static ClientOverworldStage map;
public static ClientLobbyStage lobby;
public static ConnectStage connect;
// For testing fightstage
private static Session testSession;
public static void main(String[] args) {
try{
FEMultiplayer game = new FEMultiplayer();
// SoundTrack.enabled = false;
game.init(480, 320, "Fire Emblem Multiplayer");
/* Testing code */
// game.testFightStage();
// game.testOverworldStage();
// game.testDraftStage();
game.loop();
} catch (Exception e){
System.err.println("Exception occurred, writing to logs...");
e.printStackTrace();
try{
File errLog = new File("error_log_client" + System.currentTimeMillis()%100000000 + ".log");
PrintWriter pw = new PrintWriter(errLog);
e.printStackTrace(pw);
pw.close();
}catch (IOException e2){
e2.printStackTrace();
}
System.exit(0);
}
}
public void init(int width, int height, String name) {
super.init(width, height, name);
Player p1 = new Player("Player", (byte) 0);
localPlayer = p1;
ByteBuffer icon16, icon32;
icon16 = icon32 = null;
try {
icon16 = ByteBuffer.wrap(TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/gui/icon16.png")).getTextureData());
icon32 = ByteBuffer.wrap(TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/gui/icon32.png")).getTextureData());
} catch (IOException e) {
e.printStackTrace();
}
Display.setIcon(new ByteBuffer[]{icon16, icon32});
FEResources.loadResources();
FEResources.loadBitmapFonts();
WeaponFactory.loadWeapons();
UnitFactory.loadUnits();
p1.getParty().setColor(Party.TEAM_BLUE);
/* OpenGL final setup */
glEnable(GL_LINE_SMOOTH);
UnitFactory.getUnit("Lyn");
connect = new ConnectStage();
setCurrentStage(new TitleStage());
messages = new CopyOnWriteArrayList<Message>();
SoundTrack.loop("main_theme");
}
public void testDraftStage() {
Player p1 = localPlayer;
testSession = new Session();
testSession.setMaxUnits(6);
Player p2 = new Player("p2", (byte) 1);
p2.getParty().setColor(Party.TEAM_RED);
p2.getParty().addUnit(UnitFactory.getUnit("Mia"));
p2.getParty().addUnit(UnitFactory.getUnit("L'Arachel"));
testSession.addPlayer(p1);
testSession.addPlayer(p2);
currentStage = new TeamDraftStage(testSession);
}
public void testFightStage(){
Player p1 = localPlayer;
testSession = new Session();
testSession.setMap("test");
testSession.setObjective(new Seize());
Player p2 = new Player("p2", (byte) 1);
p2.getParty().setColor(Party.TEAM_RED);
testSession.addPlayer(p1);
testSession.addPlayer(p2);
map = new ClientOverworldStage(testSession);
Unit u1 = UnitFactory.getUnit("Gilliam");
u1.getInventory().add(WeaponFactory.getWeapon("Gradivus"));
map.addUnit(u1, 0, 0);
u1.equip(0);
u1.setLevel(20);
u1.loadMapSprites();
p1.getParty().addUnit(u1);
Unit u2 = UnitFactory.getUnit("Joshua");
u2.getInventory().add(WeaponFactory.getWeapon("Wo Dao"));
map.addUnit(u2, 1, 0);
u2.equip(0);
u2.setLevel(15);
u2.loadMapSprites();
p2.getParty().addUnit(u2);
map.processAddStack();
int u2Uses = u2.getWeapon().getMaxUses();
CombatCalculator calc = new CombatCalculator(new UnitIdentifier(u1), new UnitIdentifier(u2), true);
System.out.println(calc.getAttackQueue());
u1.getInventory().add(WeaponFactory.getWeapon("Debug Noodle"));
u1.equip(0);
u2.getWeapon().setUsesDEBUGGING(u2Uses);
u1.fillHp();
u2.fillHp();
setCurrentStage(new FightStage(new UnitIdentifier(u1), new UnitIdentifier(u2), calc.getAttackQueue()));
}
public void testOverworldStage() {
testSession = new Session();
testSession.setMap("test");
testSession.setObjective(new Seize());
testSession.addPlayer(localPlayer);
Player p2 = new Player("P2", (byte)1);
p2.getParty().setColor(Party.TEAM_RED);
testSession.addPlayer(p2);
Unit u1 = UnitFactory.getUnit("Gilliam");
u1.addToInventory(WeaponFactory.getWeapon("Gradivus"));
u1.equip(0);
u1.setHp(1);
localPlayer.getParty().addUnit(u1);
Unit u3 = UnitFactory.getUnit("Joshua");
u3.addToInventory(WeaponFactory.getWeapon("Wo Dao"));
u3.equip(0);
u3.setHp(1);
p2.getParty().addUnit(u3);
Unit u2 = UnitFactory.getUnit("Lute");
u2.addToInventory(WeaponFactory.getWeapon("Physic"));
localPlayer.getParty().addUnit(u2);
currentStage = new ClientOverworldStage(testSession);
}
public static Unit getUnit(UnitIdentifier id){
for(Player p : getPlayers().values()){
if(!p.isSpectator() && p.getParty().getColor().equals(id.partyColor)){
return p.getParty().search(id.name);
}
}
return null;
}
public static void connect(String nickname, String ip) {
getLocalPlayer().setName(nickname);
client = new Client(ip, 21255);
if(client.isOpen()) {
lobby = new ClientLobbyStage(client.getSession());
setCurrentStage(lobby);
client.start();
} else {
currentStage.addEntity(new Notification(
180, 120, "default_med", "ERROR: Could not connect to the server!", 5f, new Color(255, 100, 100), 0f));
}
}
@Override
public void loop() {
while(!Display.isCloseRequested()) {
time = System.nanoTime();
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT);
glClearDepth(1.0f);
getInput();
messages.clear();
if(client != null){
messages.addAll(client.getMessages());
for(Message m : messages)
client.messages.remove(m);
}
SoundStore.get().poll(0);
glPushMatrix();
//Global resolution scale
// Renderer.scale(scaleX, scaleY);
if(!paused) {
currentStage.beginStep();
currentStage.onStep();
currentStage.processAddStack();
currentStage.processRemoveStack();
currentStage.render();
// FEResources.getBitmapFont("stat_numbers").render(
// (int)(1.0f/getDeltaSeconds())+"", 440f, 0f, 0f);
currentStage.endStep();
}
glPopMatrix();
Display.update();
timeDelta = System.nanoTime()-time;
}
AL.destroy();
Display.destroy();
if(client != null && client.isOpen()) client.quit();
}
public static void reportFightResults(FightStage stage){
}
public static void send(UnitIdentifier u, int moveX, int moveY, Object... cmds){
for(Object o: cmds){
System.out.print(o + " ");
}
System.out.println();
client.sendMessage(new CommandMessage(u, moveX, moveY, null, cmds));
}
public static void goToFightStage(UnitIdentifier u, UnitIdentifier other,
ArrayList<AttackRecord> queue) {
FightStage to = new FightStage(u, other, queue);
currentStage.addEntity(new OverworldFightTransition((ClientOverworldStage)currentStage, to, u, other));
}
public static void setCurrentStage(Stage stage) {
currentStage = stage;
if(stage.soundTrack != null){
SoundTrack.loop(stage.soundTrack);
}
}
public static Stage getOverworldStage() {
return map;
}
public static Client getClient() {
return client;
}
public static Stage getCurrentStage() {
return currentStage;
}
public static void setLocalPlayer(Player p) {
localPlayer = p;
}
public static Player getLocalPlayer() {
return localPlayer;
}
public static HashMap<Byte, Player> getPlayers() {
return getSession().getPlayerMap();
}
public static Session getSession() {
if(client == null)
return testSession;
return client.getSession();
}
}