001package com.fs.starfarer.api.impl.campaign.rulecmd; 002 003import java.util.List; 004import java.util.Map; 005 006import com.fs.starfarer.api.Global; 007import com.fs.starfarer.api.campaign.BaseStoryPointActionDelegate; 008import com.fs.starfarer.api.campaign.InteractionDialogAPI; 009import com.fs.starfarer.api.campaign.OptionPanelAPI.OptionTooltipCreator; 010import com.fs.starfarer.api.campaign.StoryPointActionDelegate; 011import com.fs.starfarer.api.campaign.TextPanelAPI; 012import com.fs.starfarer.api.campaign.rules.MemoryAPI; 013import com.fs.starfarer.api.ui.TooltipMakerAPI; 014import com.fs.starfarer.api.util.Misc; 015import com.fs.starfarer.api.util.Misc.Token; 016 017/** 018 * SetStoryColor <option id> <story points> <bonus XP fraction key> <optional: story point spent sound id> <optional: playthrough log text> 019 */ 020public class SetStoryOption extends BaseCommandPlugin { 021 022// public static boolean set(InteractionDialogAPI dialog, int points, 023// String optionId, String bonusXPKey, String soundId) { 024// return set(null, dialog, null, optionId + " " + points + " " + bonusXPKey + " " + soundId); 025// 026// } 027 028 public static class StoryOptionParams { 029 public Object optionId; 030 public int numPoints; 031 public String bonusXPID; 032 public String soundId; 033 public String logText; 034 public StoryOptionParams(Object optionId, int numPoints, String bonusXPID, String soundId, String logText) { 035 this.optionId = optionId; 036 this.numPoints = numPoints; 037 this.bonusXPID = bonusXPID; 038 this.soundId = soundId; 039 this.logText = logText; 040 } 041 042 } 043 044 public static class BaseOptionStoryPointActionDelegate extends BaseStoryPointActionDelegate { 045 protected Object optionId; 046 protected float bonusXPFraction; 047 protected InteractionDialogAPI dialog; 048 protected int numPoints; 049 protected String soundId; 050 protected String logText; 051 052 public BaseOptionStoryPointActionDelegate(InteractionDialogAPI dialog, StoryOptionParams params) { 053 this.optionId = params.optionId; 054 this.bonusXPFraction = Global.getSettings().getBonusXP(params.bonusXPID); 055 this.dialog = dialog; 056 this.numPoints = params.numPoints; 057 this.soundId = params.soundId; 058 this.logText = params.logText; 059 } 060 @Override 061 public void preConfirm() { 062 if (dialog != null) dialog.addOptionSelectedText(optionId, true); 063 } 064 @Override 065 public void confirm() { 066 } 067 @Override 068 public void createDescription(TooltipMakerAPI info) { 069 //info.setParaSmallInsignia(); 070 info.setParaInsigniaLarge(); 071 072 addActionCostSection(info); 073 074 info.addSpacer(20f); 075 } 076 077 protected void addActionCostSection(TooltipMakerAPI info) { 078 079 int sp = Global.getSector().getPlayerStats().getStoryPoints(); 080 float pad = -10f; 081 float opad = 10f; 082 int percent = Math.round(bonusXPFraction * 100f); 083 084 if (numPoints == 1) { 085 if (percent <= 0) { 086 info.addPara("This action requires a %s and does not grant any bonus experience.", 087 pad, Misc.getStoryOptionColor(), "" + Misc.STORY + " point"); 088 } else { 089 info.addPara("This action requires a %s and grants %s bonus experience.", 090 pad, Misc.getStoryOptionColor(), "" + Misc.STORY + " point", "" + percent + "%"); 091 } 092 } else { 093 if (percent <= 0) { 094 info.addPara("This action requires %s and does not grant any bonus experience.", 095 pad, Misc.getStoryOptionColor(), "" + numPoints + " " + Misc.STORY + " points"); 096 } else { 097 info.addPara("This action requires %s and grants %s bonus experience for each point.", 098 pad, Misc.getStoryOptionColor(), "" + numPoints + " " + Misc.STORY + " points", "" + percent + "%"); 099 } 100 } 101 102 if (sp <= 0) { 103 info.addPara("No " + Misc.STORY + " points available", Misc.getNegativeHighlightColor(), opad); 104 } else if (sp < numPoints) { 105 String points = "points"; 106 if (sp == 1) points = "point"; 107 info.addPara("Only %s " + Misc.STORY + " " + points + " available", opad, Misc.getNegativeHighlightColor(), 108 Misc.getNegativeHighlightColor(), "" + sp); 109 } 110 //info.addSpacer(opad); 111 } 112 113 @Override 114 public float getBonusXPFraction() { 115 return bonusXPFraction; 116 } 117 @Override 118 public String getConfirmSoundId() { 119 String soundId = this.soundId; 120 if ("leadership".equals(soundId)) soundId = "ui_char_spent_story_point_leadership"; 121 if ("combat".equals(soundId)) soundId = "ui_char_spent_story_point_combat"; 122 if ("industry".equals(soundId)) soundId = "ui_char_spent_story_point_industry"; 123 if ("technology".equals(soundId)) soundId = "ui_char_spent_story_point_technology"; 124 if ("general".equals(soundId)) soundId = "ui_char_spent_story_point_combat"; 125 if ("generic".equals(soundId)) soundId = "ui_char_spent_story_point_combat"; 126 return soundId; 127 } 128 @Override 129 public int getRequiredStoryPoints() { 130 return numPoints; 131 } 132 //@Override 133 public String getLogText() { 134 return logText; 135 } 136 @Override 137 public TextPanelAPI getTextPanel() { 138 if (dialog == null) return null; 139 return dialog.getTextPanel(); 140 } 141 @Override 142 public String getTitle() { 143 return null; 144 //return "Confirm use of story points"; 145 } 146 @Override 147 public boolean withSPInfo() { 148 return false; 149 } 150 } 151 152 public static boolean set(String ruleId, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap, String params) { 153 return new SetStoryOption().execute(ruleId, dialog, Misc.tokenize(params), memoryMap); 154 } 155 156 public boolean execute(String ruleId, final InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) { 157 if (dialog == null) return false; 158 159 //SetStoryOption gaData_getAvoidCombat 1 gaData_avoidCombat general "Created a distraction" 160 //SetStoryOption gaData_getAvoidCombat general "Created a distraction" 161 162 String optionId = ""; 163 String bonusXPID = ""; 164 String soundId = ""; 165 String logText = null; 166 int numPoints = 1; 167 if (params.size() == 3) { 168 optionId = params.get(0).string; 169 numPoints = 1; 170 bonusXPID = optionId; 171 soundId = params.get(1).string; 172 logText = params.get(2).getStringWithTokenReplacement(params.get(2).getString(memoryMap), dialog, memoryMap); 173 } else { 174 optionId = params.get(0).string; 175 numPoints = (int) params.get(1).getFloat(memoryMap); 176 bonusXPID = params.get(2).getString(memoryMap); 177 //final float bonusXPFraction = params.get(2).getFloat(memoryMap); 178 179 soundId = params.size() >= 4 ? params.get(3).string : null; 180 // if ("leadership".equals(soundId)) soundId = "ui_char_spent_story_point_leadership"; 181 // if ("combat".equals(soundId)) soundId = "ui_char_spent_story_point_combat"; 182 // if ("industry".equals(soundId)) soundId = "ui_char_spent_story_point_industry"; 183 // if ("technology".equals(soundId)) soundId = "ui_char_spent_story_point_technology"; 184 // if ("general".equals(soundId)) soundId = "ui_char_spent_story_point_combat"; 185 186 if (params.size() >= 5) { 187 //logText = params.get(4).getString(memoryMap); 188 logText = params.get(4).getStringWithTokenReplacement(params.get(4).getString(memoryMap), dialog, memoryMap); 189 } 190 } 191 192 return set(dialog, numPoints, optionId, bonusXPID, soundId, logText); 193 } 194 195 196 public static boolean set(final InteractionDialogAPI dialog, final int numPoints, 197 final Object optionId, String bonusXPID, final String soundId, String logText) { 198 //final float bonusXPFraction = Global.getSettings().getBonusXP(bonusXPID); 199 StoryOptionParams params = new StoryOptionParams(optionId, numPoints, bonusXPID, soundId, logText); 200 return set(dialog, params, new BaseOptionStoryPointActionDelegate(dialog, params)); 201 } 202 public static boolean set(final InteractionDialogAPI dialog, final StoryOptionParams params, 203 StoryPointActionDelegate delegate) { 204 205 final float bonusXPFraction = Global.getSettings().getBonusXP(params.bonusXPID); 206 dialog.makeStoryOption(params.optionId, params.numPoints, bonusXPFraction, params.soundId); 207 208 if (params.numPoints > Global.getSector().getPlayerStats().getStoryPoints()) { 209 dialog.getOptionPanel().setEnabled(params.optionId, false); 210 } 211 212 dialog.getOptionPanel().addOptionTooltipAppender(params.optionId, new OptionTooltipCreator() { 213 public void createTooltip(TooltipMakerAPI tooltip, boolean hadOtherText) { 214 float opad = 10f; 215 float initPad = 0f; 216 if (hadOtherText) initPad = opad; 217 tooltip.addStoryPointUseInfo(initPad, params.numPoints, bonusXPFraction, true); 218 int sp = Global.getSector().getPlayerStats().getStoryPoints(); 219 String points = "points"; 220 if (sp == 1) points = "point"; 221 tooltip.addPara("You have %s " + Misc.STORY + " " + points + ".", opad, 222 Misc.getStoryOptionColor(), "" + sp); 223 } 224 }); 225 226 dialog.getOptionPanel().addOptionConfirmation(params.optionId, delegate); 227 228 dialog.getOptionPanel().setStoryOptionParams(params.optionId, params, delegate); 229 230 return true; 231 } 232 233}