mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-03-13 11:27:30 +08:00
153 lines
5.3 KiB
Java
153 lines
5.3 KiB
Java
package emu.grasscutter.data.excels.quest;
|
|
|
|
import com.google.gson.annotations.SerializedName;
|
|
import emu.grasscutter.Grasscutter;
|
|
import emu.grasscutter.data.GameData;
|
|
import emu.grasscutter.data.GameResource;
|
|
import emu.grasscutter.data.ResourceType;
|
|
import emu.grasscutter.data.binout.MainQuestData;
|
|
import emu.grasscutter.data.common.ItemParamData;
|
|
import emu.grasscutter.game.quest.enums.*;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import javax.annotation.Nonnull;
|
|
import javax.annotation.Nullable;
|
|
import lombok.*;
|
|
import lombok.experimental.FieldDefaults;
|
|
|
|
@ResourceType(name = "QuestExcelConfigData.json")
|
|
@Getter
|
|
@ToString
|
|
public class QuestData extends GameResource {
|
|
@Getter private int subId;
|
|
@Getter private int mainId;
|
|
@Getter private int order;
|
|
@Getter private long descTextMapHash;
|
|
|
|
@Getter private boolean finishParent;
|
|
@Getter private boolean isRewind;
|
|
|
|
@Getter private LogicType acceptCondComb;
|
|
@Getter private LogicType finishCondComb;
|
|
@Getter private LogicType failCondComb;
|
|
|
|
@Getter private List<QuestAcceptCondition> acceptCond;
|
|
@Getter private List<QuestContentCondition> finishCond;
|
|
@Getter private List<QuestContentCondition> failCond;
|
|
@Getter private List<QuestExecParam> beginExec;
|
|
@Getter private List<QuestExecParam> finishExec;
|
|
@Getter private List<QuestExecParam> failExec;
|
|
@Getter private Guide guide;
|
|
|
|
@Getter private List<Integer> trialAvatarList;
|
|
@Getter private List<ItemParamData> gainItems;
|
|
|
|
public static String questConditionKey(
|
|
@Nonnull Enum<?> type, int firstParam, @Nullable String paramsStr) {
|
|
return type.name() + firstParam + (paramsStr != null ? paramsStr : "");
|
|
}
|
|
|
|
// ResourceLoader not happy if you remove getId() ~~
|
|
public int getId() {
|
|
return subId;
|
|
}
|
|
|
|
public void onLoad() {
|
|
this.acceptCond = acceptCond.stream().filter(p -> p.getType() != null).toList();
|
|
this.finishCond = finishCond.stream().filter(p -> p.getType() != null).toList();
|
|
this.failCond = failCond.stream().filter(p -> p.getType() != null).toList();
|
|
|
|
this.beginExec = beginExec.stream().filter(p -> p.type != null).toList();
|
|
this.finishExec = finishExec.stream().filter(p -> p.type != null).toList();
|
|
this.failExec = failExec.stream().filter(p -> p.type != null).toList();
|
|
|
|
if (this.acceptCondComb == null) this.acceptCondComb = LogicType.LOGIC_NONE;
|
|
|
|
if (this.finishCondComb == null) this.finishCondComb = LogicType.LOGIC_NONE;
|
|
|
|
if (this.failCondComb == null) this.failCondComb = LogicType.LOGIC_NONE;
|
|
|
|
if (this.gainItems == null) this.gainItems = Collections.emptyList();
|
|
|
|
this.addToCache();
|
|
}
|
|
|
|
public void applyFrom(MainQuestData.SubQuestData additionalData) {
|
|
this.isRewind = additionalData.isRewind();
|
|
this.finishParent = additionalData.isFinishParent();
|
|
}
|
|
|
|
private void addToCache() {
|
|
if (this.acceptCond == null) {
|
|
Grasscutter.getLogger().warn("missing AcceptConditions for quest {}", getSubId());
|
|
return;
|
|
}
|
|
|
|
var cacheMap = GameData.getBeginCondQuestMap();
|
|
if (getAcceptCond().isEmpty()) {
|
|
var list =
|
|
cacheMap.computeIfAbsent(
|
|
QuestData.questConditionKey(QuestCond.QUEST_COND_NONE, 0, null),
|
|
e -> new ArrayList<>());
|
|
list.add(this);
|
|
} else {
|
|
this.getAcceptCond()
|
|
.forEach(
|
|
questCondition -> {
|
|
if (questCondition.getType() == null) {
|
|
Grasscutter.getLogger().warn("null accept type for quest {}", getSubId());
|
|
return;
|
|
}
|
|
|
|
var key = questCondition.asKey();
|
|
var list = cacheMap.computeIfAbsent(key, e -> new ArrayList<>());
|
|
list.add(this);
|
|
});
|
|
}
|
|
}
|
|
|
|
@Data
|
|
@FieldDefaults(level = AccessLevel.PRIVATE)
|
|
public static class QuestExecParam {
|
|
@SerializedName(value = "_type", alternate = {"type"})
|
|
QuestExec type;
|
|
|
|
@SerializedName(value = "_param", alternate = {"param"})
|
|
String[] param;
|
|
|
|
@SerializedName(value = "_count", alternate = {"count"})
|
|
String count;
|
|
}
|
|
|
|
public static class QuestAcceptCondition extends QuestCondition<QuestCond> {}
|
|
|
|
public static class QuestContentCondition extends QuestCondition<QuestContent> {}
|
|
|
|
@Data
|
|
public static class QuestCondition<TYPE extends Enum<?> & QuestTrigger> {
|
|
@SerializedName(value = "_type", alternate = {"type"})
|
|
private TYPE type;
|
|
|
|
@SerializedName(value = "_param", alternate = {"param"})
|
|
private int[] param;
|
|
|
|
@SerializedName(value = "_param_str", alternate = {"param_str"})
|
|
private String paramStr = "";
|
|
|
|
@SerializedName(value = "_count", alternate = {"count"})
|
|
private int count;
|
|
|
|
public String asKey() {
|
|
return questConditionKey(getType(), getParam()[0], getParamStr());
|
|
}
|
|
}
|
|
|
|
@Data
|
|
public static class Guide {
|
|
private String type;
|
|
private List<String> param;
|
|
private int guideScene;
|
|
}
|
|
}
|