001package com.fs.starfarer.api.impl.campaign.rulecmd; 002 003import java.util.ArrayList; 004import java.util.List; 005import java.util.Map; 006 007import com.fs.starfarer.api.GameState; 008import com.fs.starfarer.api.Global; 009import com.fs.starfarer.api.campaign.InteractionDialogAPI; 010import com.fs.starfarer.api.campaign.InteractionDialogPlugin; 011import com.fs.starfarer.api.campaign.rules.MemKeys; 012import com.fs.starfarer.api.campaign.rules.MemoryAPI; 013import com.fs.starfarer.api.combat.EngagementResultAPI; 014import com.fs.starfarer.api.impl.campaign.DevMenuOptions; 015import com.fs.starfarer.api.util.Misc.Token; 016 017// Alex's version + added optionsAllPages function and NGC handling 018public class PaginatedOptions extends BaseCommandPlugin implements InteractionDialogPlugin { 019 020 public static String OPTION_NEXT_PAGE = "core_option_next_page"; 021 public static String OPTION_PREV_PAGE = "core_option_prev_page"; 022 023 public static class PaginatedOption { 024 public String text; 025 public String id; 026 public PaginatedOption(String text, String id) { 027 this.text = text; 028 this.id = id; 029 } 030 } 031 032 protected InteractionDialogPlugin originalPlugin; 033 protected InteractionDialogAPI dialog; 034 protected Map<String, MemoryAPI> memoryMap; 035 036 protected List<PaginatedOption> options = new ArrayList<PaginatedOption>(); 037 protected List<PaginatedOption> optionsAllPages = new ArrayList<PaginatedOption>(); 038 protected int optionsPerPage = 5; 039 protected int currPage = 0; 040 protected boolean withSpacers = true; 041 042 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, final Map<String, MemoryAPI> memoryMap) { 043 this.dialog = dialog; 044 this.memoryMap = memoryMap; 045 046 originalPlugin = dialog.getPlugin(); 047 048 dialog.setPlugin(this); 049 init(dialog); 050 051 for (int i = 0; i < params.size(); i += 2) { 052 String text = params.get(i).getString(memoryMap); 053 String id = params.get(i + 1).getString(memoryMap); 054 addOption(text, id); 055 } 056 if (params.size() > 0) { 057 showOptions(); 058 } 059 060 return true; 061 } 062 063 public void addOption(String text, String id) { 064 options.add(new PaginatedOption(text, id)); 065 } 066 067 public void addOptionAllPages(String text, String id) { 068 optionsAllPages.add(new PaginatedOption(text, id)); 069 } 070 071 public void showOptions() { 072 dialog.getOptionPanel().clearOptions(); 073 074 int maxPages = (int) Math.ceil((float)options.size() / (float)optionsPerPage); 075 if (currPage > maxPages - 1) currPage = maxPages - 1; 076 if (currPage < 0) currPage = 0; 077 078 int start = currPage * optionsPerPage; 079 for (int i = start; i < start + optionsPerPage; i++) { 080 if (i >= options.size()) { 081 if (maxPages > 1 && withSpacers) { 082 dialog.getOptionPanel().addOption("", "spacer" + i); 083 dialog.getOptionPanel().setEnabled("spacer" + i, false); 084 } 085 } else { 086 PaginatedOption option = options.get(i); 087 dialog.getOptionPanel().addOption(option.text, option.id); 088 } 089 } 090 091 if (maxPages > 1) { 092 dialog.getOptionPanel().addOption(getPreviousPageText(), OPTION_PREV_PAGE); 093 dialog.getOptionPanel().addOption(getNextPageText(), OPTION_NEXT_PAGE); 094 095 if (currPage >= maxPages - 1) { 096 dialog.getOptionPanel().setEnabled(OPTION_NEXT_PAGE, false); 097 } 098 if (currPage <= 0) { 099 dialog.getOptionPanel().setEnabled(OPTION_PREV_PAGE, false); 100 } 101 } 102 103 for (PaginatedOption option : optionsAllPages) { 104 dialog.getOptionPanel().addOption(option.text, option.id); 105 } 106 107 if (Global.getSettings().isDevMode()) { 108 DevMenuOptions.addOptions(dialog); 109 } 110 } 111 112 public String getPreviousPageText() { 113 return "Previous page"; 114 } 115 116 public String getNextPageText() { 117 return "Next page"; 118 } 119 120 public boolean isNewGameDialog() { 121 //return false; 122 return Global.getCurrentState() == GameState.TITLE; 123 } 124 125 public void optionSelected(String optionText, Object optionData) { 126 if (optionData == OPTION_PREV_PAGE) { 127 currPage--; 128 showOptions(); 129 return; 130 } 131 if (optionData == OPTION_NEXT_PAGE) { 132 currPage++; 133 showOptions(); 134 return; 135 } 136 137 if (optionText != null) { 138 dialog.getTextPanel().addParagraph(optionText, Global.getSettings().getColor("buttonText")); 139 } 140 141 if (optionData == DumpMemory.OPTION_ID) { 142 new DumpMemory().execute(null, dialog, null, getMemoryMap()); 143 return; 144 } else if (DevMenuOptions.isDevOption(optionData)) { 145 DevMenuOptions.execute(dialog, (String) optionData); 146 return; 147 } 148 149 dialog.setPlugin(originalPlugin); 150 MemoryAPI memory = dialog.getInteractionTarget().getMemory(); 151 memory.set("$option", optionData); 152 memory.expire("$option", 0); 153 memoryMap.get(MemKeys.LOCAL).set("$option", optionData, 0); // needed to make it work in conversations 154 boolean fired = FireBest.fire(null, dialog, memoryMap, isNewGameDialog() ? "NewGameOptionSelected" : "DialogOptionSelected"); 155 if (!fired) { 156 dialog.setPlugin(this); // failsafe for selecting an option with no matching rule 157 } 158 } 159 160 161 162 public void advance(float amount) { 163 } 164 public void backFromEngagement(EngagementResultAPI battleResult) { 165 } 166 public Object getContext() { 167 return null; 168 } 169 public Map<String, MemoryAPI> getMemoryMap() { 170 return memoryMap; 171 } 172 public void optionMousedOver(String optionText, Object optionData) { 173 } 174 175 public void init(InteractionDialogAPI dialog) { 176 } 177}