001package com.fs.starfarer.api.impl.campaign.missions;
002
003import java.awt.Color;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.campaign.PersonImportance;
007import com.fs.starfarer.api.campaign.SectorEntityToken;
008import com.fs.starfarer.api.campaign.StarSystemAPI;
009import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
010import com.fs.starfarer.api.campaign.econ.MarketAPI;
011import com.fs.starfarer.api.characters.PersonAPI;
012import com.fs.starfarer.api.impl.campaign.ids.Factions;
013import com.fs.starfarer.api.impl.campaign.ids.Ranks;
014import com.fs.starfarer.api.impl.campaign.ids.Tags;
015import com.fs.starfarer.api.impl.campaign.missions.academy.GACelestialObject.Variation;
016import com.fs.starfarer.api.impl.campaign.missions.askonia.TheUsurpers.Stage;
017import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
018import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
019import com.fs.starfarer.api.ui.TooltipMakerAPI;
020import com.fs.starfarer.api.util.Misc;
021
022public class LuddicPilgrimTransport extends HubMissionWithBarEvent {
023
024        //graphics/icons/missions/luddic_pilgrim_transport.png
025        public static float MISSION_DAYS = 60f;
026        public static float MIN_VALUE = 10000f;
027        public static float MAX_VALUE = 20000f;
028        public static float PROB_RICH = 0.5f;
029        
030        public static enum Stage {
031                TRANSPORT,
032                COMPLETED,
033                FAILED,
034        }
035        
036        public static enum Variation {
037                RICH,
038                POOR,
039        }
040        
041        
042        protected MarketAPI source_market;
043        protected StarSystemAPI destination_system;
044        protected SectorEntityToken destination_entity;
045        protected int quantity;
046        protected String destination_shrine;
047        protected Variation variation;
048        
049        @Override
050        protected boolean create(MarketAPI createdAt, boolean barEvent) {
051                // if already accepted by the player, abort
052                if (!setGlobalReference("$lpt_ref", "$lpt_inProgress")) {
053                        return false;
054                }
055                
056                //genRandom = Misc.random;
057                
058                //if (Factions.PIRATES.equals(createdAt.getFaction().getId())) return false;
059                
060                source_market = createdAt;
061                
062                // let's just whitelist core worlds. Should be based on places that plausibly have a significant/interesting Luddic population
063                if ( !( source_market.getId().equals("chicomoztoc") ||
064                                source_market.getId().equals("mazalot") ||
065                                source_market.getId().equals("ilm") ||
066                                source_market.getId().equals("volturn") ||
067                                source_market.getId().equals("jangala") ||
068                                source_market.getId().equals("epiphany") ||
069                                source_market.getId().equals("cibola") ||
070                                source_market.getId().equals("madeira") ||
071                                source_market.getId().equals("chalcedon") ||
072                                source_market.getId().equals("tartessus") ||
073                                source_market.getId().equals("hesperus") ||
074                                source_market.getId().equals("fikenhild") ||
075                                source_market.getId().equals("athulf") ||
076                                source_market.getId().equals("suddene")) ) {
077                        return false;
078                        }
079                
080                if (rollProbability(PROB_RICH)) {
081                        variation = Variation.RICH;
082                        float value = MIN_VALUE + getQuality() * (MAX_VALUE - MIN_VALUE);
083                        value *= 0.9f + genRandom.nextFloat() * 0.2f;
084                        setCreditReward((int)(value * 0.5f), (int)(value * 0.7f));
085                } else {
086                        variation = Variation.POOR;
087                }
088                
089                if (barEvent) {
090                        setGiverRank(Ranks.CITIZEN);
091                        setGiverPost(Ranks.POST_PILGRIM);
092                        //setGiverImportance(pickImportance());
093                        setGiverImportance(PersonImportance.VERY_LOW); // irrelevant anyway.
094                        setGiverFaction(Factions.LUDDIC_CHURCH);
095                        findOrCreateGiver(createdAt, false, false);
096                }
097                
098                PersonAPI person = getPerson();
099                if (person == null) return false;
100                
101                
102                if (!setPersonMissionRef(person, "$lpt_ref")) {
103                        return false;
104                }
105                
106                setRepFactionChangesNone();
107                setIconName("campaignMissions", "luddic_pilgrim_transport");
108                
109                // Maybe handle non-"public" shrines later.
110                destination_shrine = pickOne("gilead", "beholder_station");
111                
112                if (destination_shrine.equals("gilead"))
113                {
114                        destination_system = Global.getSector().getStarSystem("canaan");
115                        destination_entity = Global.getSector().getEconomy().getMarket("gilead").getPlanetEntity();
116                        if (destination_entity == null) return false;
117                        if (!destination_entity.getMarket().getFactionId().equals(Factions.LUDDIC_CHURCH)) return false;
118                }
119                else if (destination_shrine.equals("beholder_station"))
120                {
121                        destination_system = Global.getSector().getStarSystem("kumari kandam");
122                        for (SectorEntityToken beholder_station : destination_system.getEntitiesWithTag(Tags.LUDDIC_SHRINE)) {
123                                destination_entity = beholder_station;
124                                break;
125                        }
126                }
127                
128                if (!setEntityMissionRef(destination_entity, "$lpt_ref")) {
129                        return false;
130                }
131                
132                makeImportant(destination_entity, "$lpt_target", Stage.TRANSPORT);
133                
134                setStartingStage(Stage.TRANSPORT);
135                setSuccessStage(Stage.COMPLETED);
136                setFailureStage(Stage.FAILED);
137                
138                setStageOnMemoryFlag(Stage.COMPLETED, destination_entity, "$lpt_completed");
139        //      setStageOnGlobalFlag(Stage.COMPLETED, "lpt_completed");
140                setNoAbandon();
141                setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
142                
143                
144                
145                //setCreditRewardWithBonus(CreditReward.VERY_LOW, (int) (value * 0.5f));
146                
147                return true;
148        }
149        
150        protected void updateInteractionDataImpl() {
151                //set("$lpt_destinationShrine", destination_shrine);
152                set("$lpt_barEvent", isBarEvent());
153                set("$lpt_reward", Misc.getWithDGS(getCreditsReward()));
154                
155                set("$lpt_manOrWoman", getPerson().getManOrWoman());
156                set("$lpt_heOrShe", getPerson().getHeOrShe());
157                set("$lpt_hisOrHer", getPerson().getHisOrHer());
158                set("$lpt_himOrHer", getPerson().getHimOrHer());
159                set("$lpt_HeOrShe", getPerson().getHeOrShe().substring(0, 1).toUpperCase() + getPerson().getHeOrShe().substring(1));
160                set("$lpt_HisOrHer", getPerson().getHisOrHer().substring(0, 1).toUpperCase() + getPerson().getHisOrHer().substring(1));
161                set("$lpt_HimOrHer", getPerson().getHimOrHer().substring(0, 1).toUpperCase() + getPerson().getHimOrHer().substring(1));
162                
163                if( variation == variation.POOR)
164                        set("$lpt_wealth", "poor");
165                else set("$lpt_wealth", "rich");        
166                
167                set("$lpt_personName", getPerson().getNameString());
168                set("$lpt_systemName", destination_system.getNameWithLowercaseTypeShort());
169                set("$lpt_entityName", destination_entity.getName());
170                set("$lpt_sourceName", source_market.getName());
171                
172                //if (destination_entity.m)
173                //set("$lpt_marketOnOrAt", destination_entity.getOnOrAt());
174                
175                set("$lpt_dist", getDistanceLY(destination_entity));
176        }
177        
178        @Override
179        public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
180                float opad = 10f;
181                Color h = Misc.getHighlightColor();
182                if (currentStage == Stage.TRANSPORT) {
183                        info.addPara("Transport a small party of Luddic pilgrims to " + destination_entity.getName() + 
184                                        " in the " + destination_system.getNameWithLowercaseTypeShort() + ".", opad,
185                                        h, Misc.getWithDGS(quantity));
186                        
187                        info.addPara("The pilgrims will expect to arrive at the shrine within " + MISSION_DAYS + " days.", opad);
188                }
189        }
190
191        @Override
192        public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
193                Color h = Misc.getHighlightColor();
194                if (currentStage == Stage.TRANSPORT) {
195                        info.addPara("Transport a small party of Luddic pilgrims to " + destination_entity.getName() + 
196                                        " in the " + destination_system.getNameWithLowercaseTypeShort(), pad, tc,
197                                        h, Misc.getWithDGS(quantity));
198                        return true;
199                }
200                return false;
201        }       
202        
203        @Override
204        public String getBaseName() {
205                return "Luddic Pilgrim Transport";
206        }
207        
208}
209