Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Story Arc Editor #4020

Draft
wants to merge 48 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
5164532
Add startup button for story arc editor
AaronGullickson Apr 22, 2024
ca96ed2
Add frame for StoryArcEditorGUI and ability to get there from splash …
AaronGullickson Apr 22, 2024
4e5e6cd
Add StoryPointTableModel and corresponding table to GUI
AaronGullickson Apr 22, 2024
d002bbc
Add StoryPointEditorPanel framework (WIP)
AaronGullickson Apr 22, 2024
2a7f60a
Add information on linking storypoints to StoryPointEditorPanel
AaronGullickson Apr 22, 2024
4936a11
Add beginning of story outcomes table to StoryPointEditorPanel
AaronGullickson Apr 22, 2024
c58bf35
Add default outcomes to story outcome table in StoryPointEditorPanel
AaronGullickson Apr 22, 2024
33a7c42
Report next story point name rather than id in outcome table for Stor…
AaronGullickson Apr 22, 2024
6c92c0b
Add class name for each story point
AaronGullickson Apr 22, 2024
fb4dd58
Create StoryPointHyperLinkListener
AaronGullickson Apr 23, 2024
19cb0da
Try another approach to displaying StoryOutcomes in StoryPointEditoPa…
AaronGullickson Apr 23, 2024
4efcbb6
Preventing JLabel wrapping with <nobr> tag
AaronGullickson Apr 23, 2024
0f9f924
Add getAllPossibleResults method to StoryPoint
AaronGullickson Apr 23, 2024
e0aa366
Make delete outcome button function in StoryPointEditorPanel
AaronGullickson Apr 24, 2024
a998aa7
Add StoryTrigger description
AaronGullickson Apr 24, 2024
891acf3
Refactor StoryPointHyperLinkListener to gui
AaronGullickson Apr 24, 2024
d803935
Use static token for STORYPOINT in hyperlinklistener
AaronGullickson Apr 24, 2024
54f4686
Add CustomizeStoryOutcomeDialog
AaronGullickson Apr 24, 2024
2eb1fd1
Make add outcome button functional in StoryPointEditorPanel
AaronGullickson Apr 24, 2024
212b0c6
Add actual possible results for CheckStringVariableStoryPoint
AaronGullickson Apr 24, 2024
b2cfbe0
Improve layout of Add StoryOutcome button and combobox
AaronGullickson Apr 24, 2024
35c698c
Add missing space
AaronGullickson Apr 24, 2024
b44680b
Disallow CURRENT as a possible result for ScenarioStoryPoint
AaronGullickson Apr 24, 2024
87bab0b
Fix graphical artifact when updating story outcomes
AaronGullickson Apr 24, 2024
3a8633d
Add save and cancel button for name in StoryPointEditorPanel
AaronGullickson Apr 24, 2024
8f16056
Change title of story arc editor
AaronGullickson Apr 24, 2024
90ddeaf
Remove StoryOutcomeModel
AaronGullickson Apr 24, 2024
14e16bc
Set up story trigger panel in CustomizeStoryOutcomeDialog
AaronGullickson Apr 24, 2024
d894c65
Add storytriggerpanels
AaronGullickson Apr 27, 2024
17ec557
Merge branch 'master' into story-arc-editor
AaronGullickson May 7, 2024
63fe8fa
Redesign CustomizeStoryOUtcomeDialog for display of triggerpanels
AaronGullickson May 8, 2024
4482900
Make StoryTrigger.getStoryArc public
AaronGullickson May 8, 2024
6668390
Add ChangeStringVariableStoryTriggerPanel
AaronGullickson May 8, 2024
0f701f9
Add SwitchTabStoryTriggerPanel
AaronGullickson May 8, 2024
e78a901
Pass in proper subclass to StoryTriggerPanel
AaronGullickson May 8, 2024
e2e4f31
Make combobox private
AaronGullickson May 8, 2024
5b2a867
Add CompleteMissionStoryTriggerPanel
AaronGullickson May 8, 2024
a51979b
Add SetDateStoryTriggerPanel
AaronGullickson May 8, 2024
b6e20b4
Add delete button for triggers in StoryTriggerPanel
AaronGullickson May 8, 2024
8020621
Merge branch 'master' into story-arc-editor
AaronGullickson May 8, 2024
04895c5
Make delete trigger button functional
AaronGullickson May 11, 2024
ba3e117
Remove unused function
AaronGullickson May 11, 2024
44009fc
Set layout of SwitchTabStoryTriggerPanel to GridBagLayout
AaronGullickson May 11, 2024
dd43f6f
Add AdvanceTimeStoryTriggerPanel
AaronGullickson May 28, 2024
46e66cf
Add EndArc and GameOver StoryTriggerPanels
AaronGullickson May 28, 2024
4647b66
Add story trigger drop down selector
AaronGullickson May 28, 2024
037d14e
Correct layout of CompleteMissionStoryTriggerPanel
AaronGullickson May 28, 2024
e579c30
Fix conflicts
AaronGullickson May 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion MekHQ/resources/mekhq/resources/GUI.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1196,7 +1196,7 @@ btnNewCampaign.text=Start a New Campaign
btnLoadCampaign.text=Load a Campaign
btnLoadLastCampaign.text=Load Last Save
btnLoadStoryArc.text=Load a Story Arc

btnStoryArcEditor.text=Story Arc Editor

##### Panes
#### RankSystemsPane Class
Expand Down
4 changes: 4 additions & 0 deletions MekHQ/resources/mekhq/resources/StoryArcEditorGUI.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fileMenu.text=File
miNewArc.text=New Story Arc...
miLoadArc.text=Load Story Arc...
miSaveArc.text=Save Story Arc
7 changes: 7 additions & 0 deletions MekHQ/src/mekhq/MekHQ.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,11 @@
import mekhq.campaign.mission.AtBContract;
import mekhq.campaign.mission.AtBScenario;
import mekhq.campaign.mission.Scenario;
import mekhq.campaign.storyarc.StoryArc;
import mekhq.campaign.stratcon.StratconRulesManager;
import mekhq.campaign.unit.Unit;
import mekhq.gui.CampaignGUI;
import mekhq.gui.StoryArcEditorGUI;
import mekhq.gui.dialog.ResolveScenarioWizardDialog;
import mekhq.gui.dialog.RetirementDefectionDialog;
import mekhq.gui.panels.StartupScreenPanel;
Expand Down Expand Up @@ -95,6 +97,7 @@ public class MekHQ implements GameListener {
// the actual campaign - this is where the good stuff is
private CampaignController campaignController;
private CampaignGUI campaignGUI;
private StoryArcEditorGUI storyArcEditorGUI;

private IconPackage iconPackage = new IconPackage();

Expand Down Expand Up @@ -246,6 +249,10 @@ public void showNewView() {
campaignGUI = new CampaignGUI(this);
}

public void showNewStoryArcEditor(StoryArc arc) {
storyArcEditorGUI = new StoryArcEditorGUI(this, arc);
}

/**
* Main method launching the application.
*/
Expand Down
13 changes: 13 additions & 0 deletions MekHQ/src/mekhq/campaign/storyarc/StoryArc.java
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@ private UUID getStartingPointId() {
return startingPointId;
}

public List<StoryPoint> getStoryPoints() {
return new ArrayList<StoryPoint>(storyPoints.values());
}

public void setInitCampaignPath(String s) {
this.initCampaignPath =s;
}
Expand Down Expand Up @@ -246,6 +250,15 @@ public String toString() {
return getTitle();
}

public boolean isDuplicateName(String name) {
for(StoryPoint sp : getStoryPoints()) {
if(sp.getName().equals(name)) {
return true;
}
}
return false;
}

//region EventHandlers
@Subscribe
public void handleScenarioResolved(ScenarioResolvedEvent ev) {
Expand Down
14 changes: 13 additions & 1 deletion MekHQ/src/mekhq/campaign/storyarc/StoryOutcome.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,22 +48,34 @@ public class StoryOutcome {
/** A list of StoryTriggers to replace the defaults on this outcome */
List<StoryTrigger> storyTriggers;

StoryOutcome() {
public StoryOutcome() {
storyTriggers = new ArrayList<>();
}

public String getResult() {
return result;
}

public void setResult(String r) {
this.result = r;
}

public UUID getNextStoryPointId() {
return nextStoryPointId;
}

public void setNextStoryPointId(UUID id) {
this.nextStoryPointId = id;
}

public List<StoryTrigger> getStoryTriggers() {
return storyTriggers;
}

public void setStoryTriggers(List<StoryTrigger> triggers) {
this.storyTriggers = triggers;
}

/**
* Set the StoryArc on all StoryTriggers here
* @param a a {@link StoryArc StoryArc}
Expand Down
79 changes: 76 additions & 3 deletions MekHQ/src/mekhq/campaign/storyarc/StoryPoint.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
package mekhq.campaign.storyarc;

import megamek.Version;
import mekhq.gui.StoryPointHyperLinkListener;
import mekhq.utilities.MHQXMLUtility;
import mekhq.campaign.Campaign;
import org.apache.logging.log4j.LogManager;
Expand Down Expand Up @@ -61,6 +62,8 @@
*/
public abstract class StoryPoint {

public final static String DEFAULT_OUTCOME = "DEFAULT";

/** The story arc that this story point is a part of **/
private StoryArc storyArc;

Expand Down Expand Up @@ -103,15 +106,15 @@ public void setStoryArc(StoryArc a) {
}
}

protected StoryArc getStoryArc() {
public StoryArc getStoryArc() {
return storyArc;
}

public void setId(UUID id) {
this.id = id;
}

protected UUID getId() {
public UUID getId() {
return id;
}

Expand All @@ -125,6 +128,30 @@ public String getName() {
return name;
}

public void setName(String s) {
name = s;
}

public UUID getNextStoryPointId() {
return nextStoryPointId;
}

public void setNextStoryPointId(UUID nextStoryPointId) {
this.nextStoryPointId = nextStoryPointId;
}

public List<StoryOutcome> getStoryOutcomes() {
return new ArrayList<StoryOutcome>(storyOutcomes.values());
}

public List<StoryTrigger> getStoryTriggers() {
return storyTriggers;
}

public void setStoryTriggers(List<StoryTrigger> storyTriggers) {
this.storyTriggers = storyTriggers;
}

/**
* Do whatever needs to be done to start this story point. Specific story point types may need to override this
*/
Expand Down Expand Up @@ -206,6 +233,53 @@ public Campaign getCampaign() {
return getStoryArc().getCampaign();
}

public List<String> getAllPossibleResults() {
ArrayList<String> results = new ArrayList<>();
results.add(DEFAULT_OUTCOME);
return results;
}

public List<StoryPoint> getLinkingStoryPoints() {
List previous = new ArrayList<StoryPoint>();
UUID nextId;
for (StoryPoint otherStoryPoint : storyArc.getStoryPoints()) {
nextId = otherStoryPoint.getNextStoryPointId();
if ((nextId != null) && (nextId.equals(getId()))) {
previous.add(otherStoryPoint);
continue;
}
for( StoryOutcome outcome : otherStoryPoint.getStoryOutcomes()) {
nextId = outcome.getNextStoryPointId();
if ((nextId != null) && (nextId.equals(getId()))) {
previous.add(otherStoryPoint);
continue;
}
}
}
return previous;
}

public String getHyperlinkedName() {
return String.format("<a href='%s:%s'>%s</a>", StoryPointHyperLinkListener.STORYPOINT, getId(), getName());
}

public StoryOutcome getStoryOutcome(String result) {
return storyOutcomes.get(result);
}

public void addStoryOutcome(String result, StoryOutcome outcome) {
storyOutcomes.put(result, outcome);
}

public void removeStoryOutcome(String result) {
storyOutcomes.remove(result);
}

public void removeDefaultOutcome() {
nextStoryPointId = null;
storyTriggers = new ArrayList<>();
}

//region I/O
public abstract void writeToXml(PrintWriter pw1, int indent);

Expand Down Expand Up @@ -294,5 +368,4 @@ public static StoryPoint generateInstanceFromXML(Node wn, Campaign c, Version ve

return retVal;
}

}
8 changes: 7 additions & 1 deletion MekHQ/src/mekhq/campaign/storyarc/StoryTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@
package mekhq.campaign.storyarc;

import megamek.Version;
import mekhq.gui.panels.storytriggerpanels.StoryTriggerPanel;
import mekhq.utilities.MHQXMLUtility;
import mekhq.campaign.Campaign;
import org.apache.logging.log4j.LogManager;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import javax.swing.*;
import java.io.PrintWriter;
import java.text.ParseException;

Expand All @@ -48,7 +50,7 @@ public void setStoryArc(StoryArc a) {
this.arc = a;
}

protected StoryArc getStoryArc() {
public StoryArc getStoryArc() {
return arc;
}

Expand All @@ -61,6 +63,10 @@ protected Campaign getCampaign() {
*/
protected abstract void execute();

public abstract String getDescription();

public abstract StoryTriggerPanel getPanel(JFrame frame);

//region I/O
public abstract void writeToXml(PrintWriter pw1, int indent);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package mekhq.campaign.storyarc.storypoint;

import megamek.Version;
import mekhq.campaign.storyarc.StoryArc;
import mekhq.utilities.MHQXMLUtility;
import mekhq.campaign.Campaign;
import mekhq.campaign.mission.Mission;
Expand All @@ -29,6 +30,8 @@

import java.io.PrintWriter;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
Expand Down Expand Up @@ -61,6 +64,15 @@ protected String getResult() {
return "true";
}

@Override
public List<String> getAllPossibleResults() {
ArrayList<String> results = new ArrayList<>();
results.add("true");
results.add("false");
results.add(DEFAULT_OUTCOME);
return results;
}

@Override
public void start() {
super.start();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
package mekhq.campaign.storyarc.storypoint;

import megamek.Version;
import mekhq.campaign.personnel.enums.PersonnelStatus;
import mekhq.campaign.storyarc.StoryArc;
import mekhq.utilities.MHQXMLUtility;
import mekhq.campaign.Campaign;
import mekhq.campaign.personnel.Person;
Expand All @@ -31,6 +33,8 @@

import java.io.PrintWriter;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
Expand Down Expand Up @@ -62,6 +66,16 @@ protected String getResult() {
}
}

@Override
public List<String> getAllPossibleResults() {
ArrayList<String> results = new ArrayList<>();
for(PersonnelStatus status : PersonnelStatus.getImplementedStatuses()) {
results.add(status.name());
}
results.add(DEFAULT_OUTCOME);
return results;
}

@Override
public void start() {
super.start();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
package mekhq.campaign.storyarc.storypoint;

import megamek.Version;
import mekhq.campaign.storyarc.StoryArc;
import mekhq.campaign.storyarc.StoryTrigger;
import mekhq.campaign.storyarc.storytrigger.ChangeStringVariableStoryTrigger;
import mekhq.utilities.MHQXMLUtility;
import mekhq.campaign.Campaign;
import mekhq.campaign.storyarc.StoryPoint;
Expand All @@ -30,6 +33,8 @@

import java.io.PrintWriter;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
* This StoryPoint checks the value of a stored string variable from the
Expand Down Expand Up @@ -57,6 +62,33 @@ protected String getResult() {
return getStoryArc().getCustomStringVariable(key);
}

@Override
public List<String> getAllPossibleResults() {
// this one is complicated, but we can find all the triggers where this has been changed and collect
// all possibilities
List<String> results = new ArrayList<>();
for(StoryPoint sp : getStoryArc().getStoryPoints()) {
for(StoryTrigger trigger : sp.getStoryTriggers()) {
if(trigger instanceof ChangeStringVariableStoryTrigger) {
if(!((ChangeStringVariableStoryTrigger)trigger).getKey().equals(key)) {
continue;
}
String value = ((ChangeStringVariableStoryTrigger)trigger).getValue();
if(!results.contains(value)) {
results.add(value);
}
}
}
}
// finally, check the current value of this variable and add it if not already there
String value = getStoryArc().getCustomStringVariable(key);
if(!results.contains(value)) {
results.add(value);
}
results.add(DEFAULT_OUTCOME);
return results;
}

@Override
public void start() {
super.start();
Expand Down
Loading
Loading