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}