From 0f3fc9274637e1f1e69d2ec8d18a9347d3efeb25 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 14 Apr 2022 16:23:39 -0400 Subject: [PATCH] Objective flag system --- core/src/mindustry/core/Logic.java | 3 +++ core/src/mindustry/game/MapObjectives.java | 12 +++++++++ core/src/mindustry/game/Rules.java | 2 ++ core/src/mindustry/logic/LExecutor.java | 21 ++++++++++++++++ core/src/mindustry/logic/LStatements.java | 29 ++++++++++++++++++++++ 5 files changed, 67 insertions(+) diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 2f550f20eb..80a7165f41 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -318,6 +318,9 @@ public class Logic implements ApplicationListener{ if(!net.client() && first.complete()){ state.rules.objectives.remove(0); first.completed(); + //apply flags. + state.rules.objectiveFlags.removeAll(first.flagsRemoved); + state.rules.objectiveFlags.addAll(first.flagsAdded); if(!headless){ //delete markers for(var marker : first.markers){ diff --git a/core/src/mindustry/game/MapObjectives.java b/core/src/mindustry/game/MapObjectives.java index a0db0bd57c..a96924d7f7 100644 --- a/core/src/mindustry/game/MapObjectives.java +++ b/core/src/mindustry/game/MapObjectives.java @@ -172,9 +172,21 @@ public class MapObjectives{ /** Base abstract class for any in-map objective. */ public static abstract class MapObjective{ + public String[] flagsAdded = {}; + public String[] flagsRemoved = {}; public ObjectiveMarker[] markers = {}; public @Nullable String details; + public MapObjective withFlags(String... flags){ + this.flagsAdded = flags; + return this; + } + + public MapObjective withFlagsRemoved(String... flags){ + this.flagsRemoved = flags; + return this; + } + public MapObjective withMarkers(ObjectiveMarker... markers){ this.markers = markers; return this; diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index bb2ee57634..fca1c9a409 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -118,6 +118,8 @@ public class Rules{ public ObjectSet hiddenBuildItems = Items.erekirOnlyItems.asSet(); /** Campaign-only map objectives. */ public Seq objectives = new Seq<>(); + /** Flags set by objectives. Used in world processors. */ + public ObjectSet objectiveFlags = new ObjectSet<>(); /** HIGHLY UNSTABLE/EXPERIMENTAL. DO NOT USE THIS. */ public boolean fog = false; /** If fog = true, this is whether static (black) fog is enabled. */ diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index eec07afc33..a61ee3c299 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1498,5 +1498,26 @@ public class LExecutor{ } } + public static class GetFlagI implements LInstruction{ + public int result, flag; + + public GetFlagI(int result, int flag){ + this.result = result; + this.flag = flag; + } + + public GetFlagI(){ + } + + @Override + public void run(LExecutor exec){ + if(exec.obj(flag) instanceof String str){ + exec.setbool(result, state.rules.objectiveFlags.contains(str)); + }else{ + exec.setobj(result, null); + } + } + } + //endregion } diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 7fff92da7d..b043b62a89 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -1514,4 +1514,33 @@ public class LStatements{ return new FetchI(type, builder.var(result), builder.var(team), builder.var(index)); } } + + @RegisterStatement("getflag") + public static class GetFlagStatement extends LStatement{ + public String result = "result", flag = "\"flag\""; + + @Override + public void build(Table table){ + fields(table, result, str -> result = str); + + table.add(" = flag "); + + fields(table, flag, str -> flag = str); + } + + @Override + public boolean privileged(){ + return true; + } + + @Override + public Color color(){ + return Pal.logicWorld; + } + + @Override + public LInstruction build(LAssembler builder){ + return new GetFlagI(builder.var(result), builder.var(flag)); + } + } }