3D spaceshooter with online scoreboard, online demos, ship building. Now entirely defunct, but might be resurrected
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
sector/src/net/sector/gui/panels/game/PanelGameOverShared_User.java

206 lines
5.2 KiB

package net.sector.gui.panels.game;
import java.util.Collections;
import net.sector.App;
import net.sector.gui.panels.PanelGui;
import net.sector.gui.panels.highscore.HighscoreEntryFactory;
import net.sector.gui.screens.Screen;
import net.sector.gui.screens.ScreenDesigner;
import net.sector.gui.screens.ScreenLevels;
import net.sector.gui.screens.ScreenMenuMain;
import net.sector.gui.widgets.GuiRoot;
import net.sector.gui.widgets.Widget;
import net.sector.gui.widgets.composite.CompositeScrollBox;
import net.sector.gui.widgets.display.Text;
import net.sector.gui.widgets.input.Button;
import net.sector.gui.widgets.layout.Gap;
import net.sector.gui.widgets.layout.LayoutH;
import net.sector.gui.widgets.layout.LayoutV;
import net.sector.gui.widgets.layout.WindowFrame;
import net.sector.level.ELevel;
import net.sector.level.GameContext;
import net.sector.level.SuperContext;
import net.sector.network.communication.ServerError;
import net.sector.network.responses.ObjScoreInfo;
import net.sector.network.responses.ObjScoreList;
import net.sector.sounds.Music;
import net.sector.sounds.Sounds;
import net.sector.util.Align;
import net.sector.util.Log;
import org.lwjgl.input.Keyboard;
import com.porcupine.color.RGB;
import com.porcupine.util.StringUtils;
/**
* Game over screen for Shared levels and registered user.
*
* @author Ondřej Hruška (MightyPork)
*/
public class PanelGameOverShared_User extends PanelGui {
private static final int RETRY = 0, GOTO_LEVELS = 1, GOTO_MAIN_MENU = 2;
private int score;
private CompositeScrollBox scrollBox;
private ObjScoreList scores;
private String lid;
/**
* Game over panel
*
* @param screen the screen
*/
public PanelGameOverShared_User(Screen screen) {
super(screen);
GameContext ctx = SuperContext.getGameContext();
this.score = ctx.getCursor().scoreTotal;
if (ctx.levelBundle.type != ELevel.NET) {
throw new RuntimeException("Cannot open PanelGameOverShared_User for local level.");
}
if (SuperContext.selectedUser == null) {
throw new RuntimeException("Cannot open PanelGameOverShared_User for Guest user.");
}
if (App.offlineMode) {
throw new RuntimeException("Cannot open PanelGameOverShared_User while offline.");
}
lid = ctx.levelBundle.lid;
scores = null;
try {
scores = SuperContext.selectedUser.submitScore(lid, score);
} catch (ServerError e) {
Log.e("Error loading scores from server.", e);
scores = new ObjScoreList();
}
Collections.sort(scores);
}
private static HighscoreEntryFactory entryFactory = HighscoreEntryFactory.instance;
@Override
public void initGui(GuiRoot root) {
Sounds.shield_loop.stop();
Sounds.timer_loop.stop();
Music.playMenu();
//@formatter:off
WindowFrame frame = new WindowFrame();
frame.setPadding(5, 5, 5, 5);
frame.enableShadow(true);
LayoutV v = new LayoutV(Align.CENTER);
v.add(new Text("Game over!", "gameover").setMarginsV(10, 5));
v.add(new Text("Score: " + StringUtils.formatInt(score), "gameover_score").setColorText(new RGB(1, 0.8, 0)));
v.add(new Gap(0, 6));
String uid = SuperContext.selectedUser.uid;
int position = scores.getUserPosition(uid);
if(position == -1) {
v.add(new Text("Sorry, could not connect to highscore server.", "larger_text").setColorText(RGB.RED));
}else {
v.add(new Text("You are "+StringUtils.numberToOrdinal(position)+" in the Universe!", "larger_text").setColorText(RGB.YELLOW));
if(scores.scoreImproved && scores.lastScore!=-1) {
v.add(new Text("You improved your record\n"+StringUtils.formatInt(scores.lastScore)+" to "+StringUtils.formatInt(score)));
}else if(scores.lastScore!=-1) {
v.add(new Text("You didn't beat your record: "+StringUtils.formatInt(scores.lastScore)));
}
}
v.add(new Gap(0,10));
scrollBox = new CompositeScrollBox(9, entryFactory);
v.add(scrollBox);
LayoutH h = new LayoutH(Align.CENTER);
h.add(new Button(GOTO_MAIN_MENU, "Main menu", "small_text"));
h.add(new Gap(30, 0));
h.add(new Button(RETRY, "Try again", "small_text"));
h.add(new Button(GOTO_LEVELS, "Select level", "small_text"));
v.add(h);
frame.add(v);
root.setRootWidget(frame);
printHiscore();
//@formatter:on
}
private void printHiscore() {
scrollBox.removeAll();
Collections.sort(scores);
int i = 1;
for (ObjScoreInfo sc : scores) {
scrollBox.addItem(entryFactory.getItem(i, sc));
i++;
}
scrollBox.refresh();
}
@Override
public void actionPerformed(Widget widget) {
if (widget.id == GOTO_LEVELS) {
app.replaceScreen(new ScreenLevels());
return;
}
if (widget.id == GOTO_MAIN_MENU) {
app.replaceScreen(new ScreenMenuMain());
return;
}
if (widget.id == RETRY) {
SuperContext.getGameContext().restoreCursor();
app.replaceScreen(new ScreenDesigner());
return;
}
}
@Override
public void onKey(int key, char c, boolean down) {
super.onKey(key, c, down);
}
@Override
public void onFocus() {
Keyboard.enableRepeatEvents(true);
}
@Override
public void onBlur() {
Keyboard.enableRepeatEvents(false);
}
@Override
public boolean hasBackgroundLayer() {
return true;
}
@Override
public RGB getBackgroundColor() {
return new RGB(0, 0.6);
}
}