Primitive research "tree"

This commit is contained in:
DBotThePony 2021-08-24 22:09:38 +07:00
parent a5af0a4a00
commit f388639fc6
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 113 additions and 31 deletions

View File

@ -18,6 +18,7 @@ public class AndroidResearchType<T extends AndroidResearch> extends ForgeRegistr
}
private List<AndroidResearchType<?>> blocking;
private List<AndroidResearchType<?>> unlocks;
/**
* @return List of research blocked once this research is unlocked
@ -38,6 +39,25 @@ public class AndroidResearchType<T extends AndroidResearch> extends ForgeRegistr
return blocking;
}
/**
* @return List of research unlocked once this research is unlocked
*/
public List<AndroidResearchType<?>> getUnlocks() {
if (unlocks == null) {
var list = new ArrayList<AndroidResearchType<?>>();
for (var type : Registry.ANDROID_RESEARCH()) {
if (type.getPrerequisites().contains(this)) {
list.add(type);
}
}
unlocks = List.copyOf(list);
}
return unlocks;
}
/**
* @return List of research once unlocked blocks this research
*/

View File

@ -9,6 +9,7 @@ import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.entity.player.Inventory;
import ru.dbotthepony.mc.otm.Registry;
import ru.dbotthepony.mc.otm.android.AndroidResearch;
import ru.dbotthepony.mc.otm.android.AndroidResearchType;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
import ru.dbotthepony.mc.otm.menu.AndroidStationMenu;
@ -17,8 +18,7 @@ import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.screen.panels.*;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenBatteryGetter {
class AndroidResearchButton extends EditablePanel {
@ -32,7 +32,7 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> impl
public AndroidResearchButton(@Nullable EditablePanel parent, AndroidResearch node) {
super(AndroidStationScreen.this, parent, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
this.node = node;
setDockMargin(2, 2, 0, 0);
setDockMargin(2, 2, 2, 2);
}
@Override
@ -92,7 +92,6 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> impl
public static final int FRAME_WIDTH = 210;
public static final int GRID_WIDTH = 5;
public static final int GRID_HEIGHT = 5;
public static final int FRAME_HEIGHT = 120;
public AndroidStationScreen(AndroidStationMenu p_97741_, Inventory p_97742_, Component p_97743_) {
@ -109,6 +108,59 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> impl
return List.of(menu.battery_slot);
}
private final EditablePanel[] rows = new EditablePanel[100];
private final Set<AndroidResearchType<?>> seen = new HashSet<>();
private float next_x = 0;
private float[] rows_width = new float[100];
private final AndroidResearchButton[][] created_buttons = new AndroidResearchButton[100][1000];
private final int[] created_buttons_idx = new int[100];
private void dive(AndroidCapabilityPlayer cap, AndroidResearchType<?> research, int level) {
if (seen.contains(research))
return;
seen.add(research);
if (rows[level] == null) {
rows[level] = new EditablePanel(this, canvas, 0, level * 22, 1000, 22) {
@Override
protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) {
return false;
}
@Override
protected boolean mouseReleasedInner(double mouse_x, double mouse_y, int flag) {
return false;
}
@Override
protected boolean mouseDraggedInner(double mouse_x, double mouse_y, int flag, double drag_x, double drag_y) {
return false;
}
};
}
var row = rows[level];
var button = new AndroidResearchButton(row, cap.getResearch(research));
button.setPos(next_x + rows_width[level], 2);
created_buttons[level][created_buttons_idx[level]] = button;
created_buttons_idx[level]++;
rows_width[level] += 22;
for (var _research : research.getUnlocks()) {
dive(cap, _research, level + 1);
}
if (level > 0) {
for (var _research : research.getPrerequisites()) {
dive(cap, _research, level - 1);
}
}
}
private DraggableCanvasPanel canvas;
@Nullable
@Override
protected FramePanel makeMainFrame() {
@ -116,7 +168,7 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> impl
autoAttachToFrame(frame);
var canvas = new DraggableCanvasPanel(this, frame, 0, 0, GRID_WIDTH * 22, 0) {
canvas = new DraggableCanvasPanel(this, frame, 0, 0, GRID_WIDTH * 22, 0) {
@Override
protected void innerRender(PoseStack stack, float mouse_x, float mouse_y, float flag) {
RenderHelper.setDrawColor(RGBAColor.BLACK);
@ -124,40 +176,50 @@ public class AndroidStationScreen extends MatteryScreen<AndroidStationMenu> impl
}
};
var grid = new GridPanel(this, canvas, 0, 0, 0, 0, GRID_WIDTH, GRID_HEIGHT) {
@Override
protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) {
// pass event to canvas
return false;
}
@Override
protected boolean mouseReleasedInner(double mouse_x, double mouse_y, int flag) {
// pass event to canvas
return false;
}
@Override
protected boolean mouseDraggedInner(double mouse_x, double mouse_y, int flag, double drag_x, double drag_y) {
// pass event to canvas
return false;
}
};
minecraft.player.getCapability(MatteryCapability.ANDROID).ifPresent(_cap -> {
if (_cap instanceof AndroidCapabilityPlayer cap) {
for (var feature : Registry.ANDROID_RESEARCH().getValues()) {
var node = cap.getResearch(feature);
for (var research : Registry.ANDROID_RESEARCH().getValues()) {
if (research.getPrerequisites().size() == 0) {
dive(cap, research, 0);
float max = 0;
if (node != null) {
new AndroidResearchButton(grid, node);
for (float v : rows_width)
max = Math.max(max, v);
for (var button_list : created_buttons) {
int count = 0;
for (int i = 0; i < button_list.length; i++) {
if (button_list[i] == null) {
count = i;
break;
}
}
if (count > 0) {
float this_x = next_x + max / 2f - (count * 22f) / 2f;
for (int i = 0; i < count; i++) {
button_list[i].setPos(this_x, 2);
this_x += 22;
}
}
}
for (var v : created_buttons)
Arrays.fill(v, null);
next_x += max;
Arrays.fill(rows_width, 0);
Arrays.fill(created_buttons_idx, 0);
}
}
seen.clear();
}
});
canvas.setDock(Dock.RIGHT);
grid.setDock(Dock.FILL);
return frame;
}

View File

@ -73,7 +73,7 @@
"android_research.overdrive_that_matters.nanobots_armor_speed": "Nanobots armor build speed %s",
"android_research.overdrive_that_matters.nanobots_armor_speed.description": "Reduces time required for nanobots to form protection layer",
"android_research.overdrive_that_matters.nanobots_armor_strength": "Nanobots armor build speed %s",
"android_research.overdrive_that_matters.nanobots_armor_strength": "Nanobots armor strength %s",
"android_research.overdrive_that_matters.nanobots_armor_strength.description": "Increases impact absorption strength of nanobots",
"stat.overdrive_that_matters.health_regenerated": "Damage Regenerated by Nanobots",