Real fix for main story chapter 9

This commit is contained in:
Melledy committed 2026-10-06 22:04:24 -07:00
1 parent 4bf52f127d
commit f58ba82f17
3 files changed
+45 -41

No files matched your search

@@ -1,7 +1,6 @@
package emu.nebula.game.story; package emu.nebula.game.story;
import dev.morphia.annotations.Entity; import dev.morphia.annotations.Entity;
import emu.nebula.proto.Public.StoryChoice;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@@ -20,13 +19,8 @@ public class StoryChoiceInfo {
this.value = value; this.value = value;
} }
// Proto public StoryChoiceInfo setValue(int value) {
this.value = value;
public StoryChoice toProto() { return this;
var proto = StoryChoice.newInstance()
.setGroup(this.getGroup())
.setValue(this.getValue());
return proto;
} }
} }
@@ -270,18 +270,6 @@ public class StoryManager extends PlayerManager implements GameDatabaseObject {
save = true; save = true;
} }
// Hardcoded fix if the player is missing the last option in main story chapter 9
if (this.getCompletedStories().contains(1025)) {
if (!this.getEvidences().contains(1004)) {
this.getEvidences().add(1004);
save = true;
}
if (!this.getEvidences().contains(1007)) {
this.getEvidences().add(1007);
save = true;
}
}
// Save to database // Save to database
if (save) { if (save) {
this.save(); this.save();
@@ -6,8 +6,9 @@ import java.util.List;
import dev.morphia.annotations.Entity; import dev.morphia.annotations.Entity;
import emu.nebula.proto.Public.Story; import emu.nebula.proto.Public.Story;
import emu.nebula.proto.Public.StoryChoice;
import emu.nebula.proto.StorySett.StoryOptions; import emu.nebula.proto.StorySett.StoryOptions;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import lombok.Getter; import lombok.Getter;
import us.hebi.quickbuf.RepeatedMessage; import us.hebi.quickbuf.RepeatedMessage;
@@ -81,23 +82,23 @@ public class StoryOptionLog {
return this.personality.size(); return this.personality.size();
} }
public boolean hasPersonalityOption(int group, int choice) { public void addPersonalityOption(int group, int choice) {
if (this.personality == null) {
return false;
}
return this.personality.stream()
.filter(c -> c.getGroup() == group && c.getValue() == choice)
.findFirst()
.isPresent();
}
public boolean addPersonalityOption(int group, int choice) {
if (this.personality == null) { if (this.personality == null) {
this.personality = new ArrayList<>(); this.personality = new ArrayList<>();
} }
return this.personality.add(new StoryChoiceInfo(group, choice)); // Try and get existing group option
var option = this.personality.stream()
.filter(c -> c.getGroup() == group)
.findFirst()
.orElseGet(null);
// Set value for choice option
if (option == null) {
this.personality.add(new StoryChoiceInfo(group, choice));
} else {
option.setValue(choice);
}
} }
public boolean settlePersonality(RepeatedMessage<StoryOptions> options) { public boolean settlePersonality(RepeatedMessage<StoryOptions> options) {
@@ -109,10 +110,7 @@ public class StoryOptionLog {
break; break;
} }
// Skip if we already have this choice // TODO fix old accounts with multiple of the same personality groups
if (this.hasPersonalityOption(option.getGroup(), option.getChoice())) {
continue;
}
// Add // Add
this.addPersonalityOption(option.getGroup(), option.getChoice()); this.addPersonalityOption(option.getGroup(), option.getChoice());
@@ -128,14 +126,38 @@ public class StoryOptionLog {
public void encodeStoryProto(Story proto) { public void encodeStoryProto(Story proto) {
if (this.major != null) { if (this.major != null) {
var chosen = new Int2IntOpenHashMap();
for (var choice : this.major) { for (var choice : this.major) {
proto.addMajor(choice.toProto()); var value = chosen.get(choice.getGroup()) | choice.getValue();
chosen.put(choice.getGroup(), value);
}
for (var entry : chosen.int2IntEntrySet()) {
var choice = StoryChoice.newInstance()
.setGroup(entry.getIntKey())
.setValue(entry.getIntValue());
proto.addMajor(choice);
} }
} }
if (this.personality != null) { if (this.personality != null) {
var chosen = new Int2IntOpenHashMap();
for (var choice : this.personality) { for (var choice : this.personality) {
proto.addMajor(choice.toProto()); chosen.put(choice.getGroup(), choice.getValue());
}
for (var entry : chosen.int2IntEntrySet()) {
int factor = 5; // Guessed value
int value = (entry.getIntValue() << 4) + (factor << 8);
var choice = StoryChoice.newInstance()
.setGroup(entry.getIntKey())
.setValue(value);
proto.addPersonality(choice);
} }
} }
} }