MBHaxe/src/gui/MPSearchGui.hx
2024-07-17 12:42:37 +05:30

282 lines
10 KiB
Haxe

package gui;
import net.NetCommands;
import src.Marbleland;
import h2d.Tile;
import hxd.BitmapData;
import src.MarbleGame;
import hxd.res.BitmapFont;
import h3d.Vector;
import src.ResourceLoader;
import src.Settings;
import src.MissionList;
class MPSearchGui extends GuiImage {
public function new(isCustom:Bool) {
var img = ResourceLoader.getImage("data/ui/mp/search/window.png");
super(img.resource.toTile());
this.horizSizing = Center;
this.vertSizing = Center;
this.position = new Vector(76, 8);
this.extent = new Vector(487, 463);
var missionList = [];
if (!isCustom) {
for (diffName => diff in MissionList.missionList["multiplayer"]) {
for (mis in diff) {
missionList.push({
mis: mis,
name: mis.title,
artist: mis.artist,
path: mis.path,
difficulty: diffName,
});
}
}
} else {
var customsList = Marbleland.multiplayerMissions;
for (mis in customsList) {
missionList.push({
mis: mis,
name: mis.title,
artist: mis.artist,
path: mis.path,
difficulty: "custom"
});
}
}
var displayList = missionList.map(x -> x.name);
displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1));
missionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1));
var retrieveMissionList = missionList;
var searchMissionList:GuiTextListCtrl = null;
var scrollCtrl:GuiScrollCtrl = null;
var currentSortBy = "title";
function sortBy(type:String, txt:String = "") {
if (type == "title") {
retrieveMissionList = missionList.filter(x -> StringTools.contains(x.name.toLowerCase(), txt.toLowerCase()));
displayList = retrieveMissionList.map(x -> x.name);
displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1));
retrieveMissionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1));
}
if (type == "artist") {
retrieveMissionList = missionList.filter(x -> StringTools.contains(x.artist.toLowerCase(), txt.toLowerCase()));
retrieveMissionList.sort((x, y) -> x.artist > y.artist ? 1 : (x.artist == y.artist ? 0 : -1));
displayList = retrieveMissionList.map(x -> '${x.name} By ${x.artist}');
}
if (type == "file") {
retrieveMissionList = missionList.filter(x -> StringTools.contains(x.path.toLowerCase(), txt.toLowerCase()));
retrieveMissionList.sort((x, y) -> x.path > y.path ? 1 : (x.path == y.path ? 0 : -1));
var idxofslash = 0;
displayList = retrieveMissionList.map(x -> {
var idxofslash = 0;
var slashcount = 0;
for (i in 0...x.path.length) {
if (x.path.charCodeAt(x.path.length - i - 1) == '/'.code) {
slashcount++;
if (slashcount == 2) {
idxofslash = x.path.length - i - 1;
break;
}
}
}
return '${x.path.substr(idxofslash + 1)}';
});
}
searchMissionList.setTexts(displayList);
scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight());
}
function loadButtonImages(path:String) {
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
var disabledObj = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources);
var disabled = disabledObj != null ? disabledObj.toTile() : null;
return [normal, hover, pressed, disabled];
}
var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt");
var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry);
@:privateAccess markerFelt32b.loader = ResourceLoader.loader;
var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
var markerFelt24 = markerFelt32b.toSdfFont(cast 18 * Settings.uiScale, MultiChannel);
var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel);
var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt");
var domcasual32b = new BitmapFont(domcasual32fontdata.entry);
@:privateAccess domcasual32b.loader = ResourceLoader.loader;
var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel);
var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel);
var searchCancel = new GuiButton(loadButtonImages("data/ui/mp/search/cancel"));
searchCancel.vertSizing = Top;
searchCancel.position = new Vector(21, 395);
searchCancel.extent = new Vector(94, 45);
searchCancel.pressedAction = (e) -> {
MarbleGame.canvas.popDialog(this);
}
this.addChild(searchCancel);
var selectedIdx:Int = -1;
var searchPlay = new GuiButton(loadButtonImages("data/ui/mp/search/play"));
searchPlay.position = new Vector(370, 395);
searchPlay.extent = new Vector(94, 45);
searchPlay.disabled = true;
searchPlay.pressedAction = (e) -> {
if (selectedIdx != -1) {
var mis = retrieveMissionList[selectedIdx];
if (mis.difficulty == "custom") {
var idx = Marbleland.multiplayerMissions.indexOf(mis.mis);
NetCommands.setLobbyLevelIndex(mis.difficulty, idx);
} else {
var idx = MissionList.missionList["multiplayer"][mis.difficulty].indexOf(mis.mis);
NetCommands.setLobbyLevelIndex(mis.difficulty, idx);
}
MarbleGame.canvas.popDialog(this);
}
}
this.addChild(searchPlay);
var searchTitle = new GuiText(domcasual24);
searchTitle.position = new Vector(52, 23);
searchTitle.extent = new Vector(64, 25);
searchTitle.text.textColor = 0x696969;
searchTitle.text.text = "Title:";
this.addChild(searchTitle);
var searchEdit = new GuiTextInput(domcasual24);
searchEdit.text.textColor = 0;
searchEdit.text.selectionColor.setColor(0xFFFFFFFF);
searchEdit.text.selectionTile = h2d.Tile.fromColor(0x808080, 0, hxd.Math.ceil(searchEdit.text.font.lineHeight));
searchEdit.position = new Vector(91, 23);
searchEdit.extent = new Vector(373, 29);
searchEdit.onTextChange = (txt) -> {
sortBy(currentSortBy, txt);
};
this.addChild(searchEdit);
scrollCtrl = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile());
scrollCtrl.position = new Vector(18, 68);
scrollCtrl.extent = new Vector(447, 317);
scrollCtrl.childrenHandleScroll = true;
this.addChild(scrollCtrl);
searchMissionList = new GuiTextListCtrl(markerFelt24, displayList, 0xFFFFFF);
searchMissionList.selectedColor = 0xFFFFFF;
searchMissionList.selectedFillColor = 0x7585E3;
searchMissionList.horizSizing = Width;
searchMissionList.position = new Vector(4, -1);
searchMissionList.extent = new Vector(432, 2880);
searchMissionList.textYOffset = -6;
searchMissionList.scrollable = true;
searchMissionList.onSelectedFunc = (sel) -> {
selectedIdx = sel;
if (retrieveMissionList.length <= selectedIdx || selectedIdx < 0) {
searchPlay.disabled = true;
} else {
searchPlay.disabled = false;
}
}
scrollCtrl.addChild(searchMissionList);
scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight());
var optionsPopup:GuiButton = null;
var searchOptions = new GuiButton(loadButtonImages("data/ui/mp/search/options"));
searchOptions.vertSizing = Top;
searchOptions.horizSizing = Right;
searchOptions.position = new Vector(121, 398);
searchOptions.extent = new Vector(94, 45);
searchOptions.pressedAction = (e) -> {
MarbleGame.canvas.pushDialog(optionsPopup);
}
this.addChild(searchOptions);
var temprev = new BitmapData(1, 1);
temprev.setPixel(0, 0, 0);
var tmpprevtile = Tile.fromBitmap(temprev);
optionsPopup = new GuiButton([tmpprevtile, tmpprevtile, tmpprevtile]);
optionsPopup.horizSizing = Width;
optionsPopup.vertSizing = Height;
optionsPopup.position = new Vector(0, 0);
optionsPopup.extent = new Vector(640, 480);
optionsPopup.pressedAction = (e) -> {
MarbleGame.canvas.popDialog(optionsPopup, false);
}
var optionsPopupInner = new GuiControl();
optionsPopupInner.horizSizing = Center;
optionsPopupInner.vertSizing = Center;
optionsPopupInner.position = new Vector(80, 7);
optionsPopupInner.extent = new Vector(480, 465);
optionsPopup.addChild(optionsPopupInner);
var optionsBgR = ResourceLoader.getResource('data/ui/mp/play/moremenu.png', ResourceLoader.getImage, this.imageResources).toTile();
var optionsBg = new GuiImage(optionsBgR);
optionsBg.position = new Vector(0, 281);
optionsBg.extent = new Vector(348, 148);
optionsPopupInner.addChild(optionsBg);
var searchByFile = new GuiButton(loadButtonImages("data/ui/mp/search/file"));
searchByFile.buttonType = Radio;
searchByFile.position = new Vector(229, 45);
searchByFile.extent = new Vector(67, 45);
searchByFile.pressedAction = (e) -> {
searchTitle.text.text = "File:";
currentSortBy = "file";
sortBy("file");
};
optionsBg.addChild(searchByFile);
var searchByartist = new GuiButton(loadButtonImages("data/ui/mp/search/artist"));
searchByartist.buttonType = Radio;
searchByartist.position = new Vector(159, 45);
searchByartist.extent = new Vector(71, 45);
searchByartist.pressedAction = (e) -> {
searchTitle.text.text = "Artist:";
currentSortBy = "artist";
sortBy("artist");
};
optionsBg.addChild(searchByartist);
var searchByTitle = new GuiButton(loadButtonImages("data/ui/mp/search/name"));
searchByTitle.buttonType = Radio;
searchByTitle.position = new Vector(92, 45);
searchByTitle.extent = new Vector(68, 45);
searchByTitle.pressed = true;
searchByTitle.pressedAction = (e) -> {
searchTitle.text.text = "Title:";
currentSortBy = "title";
sortBy("title");
};
optionsBg.addChild(searchByTitle);
var searchRandom = new GuiButton(loadButtonImages("data/ui/mp/search/random"));
searchRandom.vertSizing = Top;
searchRandom.position = new Vector(44, 45);
searchRandom.extent = new Vector(44, 44);
searchRandom.pressedAction = (e) -> {
var mis = retrieveMissionList[Math.floor(Math.random() * missionList.length)];
if (mis.difficulty == "custom") {
var idx = Marbleland.multiplayerMissions.indexOf(mis.mis);
NetCommands.setLobbyLevelIndex(mis.difficulty, idx);
} else {
var idx = MissionList.missionList["multiplayer"][mis.difficulty].indexOf(mis.mis);
NetCommands.setLobbyLevelIndex(mis.difficulty, idx);
}
}
optionsBg.addChild(searchRandom);
}
}