001package com.fs.starfarer.api.impl.codex;
002
003import java.util.LinkedHashSet;
004import java.util.List;
005
006import com.fs.starfarer.api.GameState;
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.campaign.BattleAPI;
009import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
010import com.fs.starfarer.api.campaign.CampaignFleetAPI;
011import com.fs.starfarer.api.campaign.CargoAPI;
012import com.fs.starfarer.api.campaign.CargoStackAPI;
013import com.fs.starfarer.api.campaign.InteractionDialogAPI;
014import com.fs.starfarer.api.campaign.PlayerMarketTransaction;
015import com.fs.starfarer.api.campaign.SectorEntityToken;
016import com.fs.starfarer.api.campaign.SpecialItemSpecAPI;
017import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
018import com.fs.starfarer.api.campaign.econ.Industry;
019import com.fs.starfarer.api.campaign.econ.MarketAPI;
020import com.fs.starfarer.api.campaign.econ.MarketConditionAPI;
021import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
022import com.fs.starfarer.api.campaign.listeners.CargoScreenListener;
023import com.fs.starfarer.api.campaign.listeners.CodexEventListener;
024import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
025import com.fs.starfarer.api.characters.AbilityPlugin;
026import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
027import com.fs.starfarer.api.characters.MutableCharacterStatsAPI.SkillLevelAPI;
028import com.fs.starfarer.api.fleet.FleetMemberAPI;
029import com.fs.starfarer.api.impl.SharedUnlockData;
030import com.fs.starfarer.api.impl.campaign.ids.Tags;
031import com.fs.starfarer.api.loading.FighterWingSpecAPI;
032import com.fs.starfarer.api.loading.HullModSpecAPI;
033import com.fs.starfarer.api.loading.WeaponSpecAPI;
034import com.fs.starfarer.api.util.Misc;
035
036/**
037 * For the codex entries that require a listener of some type to unlock.
038 * 
039 * @author Alex
040 *
041 */
042public class CodexUnlocker implements FleetEventListener, CodexEventListener, CargoScreenListener {
043
044        @Override
045        public void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param) {
046        }
047
048        @Override
049        public void reportBattleOccurred(CampaignFleetAPI nullHere, CampaignFleetAPI primaryWinner, BattleAPI battle) {
050                if (battle == null || !battle.isPlayerInvolved()) return;
051                
052                LinkedHashSet<String> hulls = new LinkedHashSet<String>(); 
053                
054                for (CampaignFleetAPI fleet : battle.getNonPlayerSideSnapshot()) {
055                        List<FleetMemberAPI> members = Misc.getSnapshotMembersLost(fleet);
056                        // unlock everything, not just the destroyed ships
057                        //if (primaryWinner != null && primaryWinner.isPlayerFleet()) {
058                                for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
059                                        if (!members.contains(member)) {
060                                                members.add(member);
061                                        }
062                                }
063                        //}
064                        for (FleetMemberAPI member : members) {
065                                if (member.getHullSpec().hasTag(Tags.CODEX_UNLOCKABLE)) {
066                                        String hullId = CodexDataV2.getFleetMemberBaseHullId(member);
067                                        if (SharedUnlockData.get().isPlayerAwareOfShip(hullId)) continue;
068                                        hulls.add(hullId);
069                                }
070                        }
071                }
072                
073                if (!hulls.isEmpty()) {
074                        for (String hullId : hulls) {
075                                SharedUnlockData.get().reportPlayerAwareOfShip(hullId, false);
076                        }
077                        SharedUnlockData.get().saveIfNeeded();
078                }
079        }
080
081        @Override
082        public void reportCargoScreenOpened() {
083                unlockStuff();
084        }
085        
086        @Override
087        public void reportAboutToOpenCodex() {
088                unlockStuff();
089        }
090        
091        public void unlockStuff() {
092                if (Global.getCurrentState() != GameState.CAMPAIGN) return;
093                
094                CampaignFleetAPI fleet = Global.getSector().getPlayerFleet();
095                if (fleet == null || fleet.getFleetData() == null) return;
096                CargoAPI cargo = fleet.getCargo();
097                if (cargo == null) return;
098                
099                boolean save = false; 
100                for (CargoStackAPI stack : cargo.getStacksCopy()) {
101                        FighterWingSpecAPI wing = stack.getFighterWingSpecIfWing();
102                        if (wing != null && wing.hasTag(Tags.CODEX_UNLOCKABLE)) {
103                                save |= SharedUnlockData.get().reportPlayerAwareOfFighter(wing.getId(), false);
104                        }
105                        
106                        WeaponSpecAPI weapon = stack.getWeaponSpecIfWeapon();
107                        if (weapon != null && weapon.hasTag(Tags.CODEX_UNLOCKABLE)) {
108                                save |= SharedUnlockData.get().reportPlayerAwareOfWeapon(weapon.getWeaponId(), false);
109                        }
110                        
111                        HullModSpecAPI hullmod = stack.getHullModSpecIfHullMod();
112                        if (hullmod != null && hullmod.hasTag(Tags.CODEX_UNLOCKABLE)) {
113                                save |= SharedUnlockData.get().reportPlayerAwareOfHullmod(hullmod.getId(), false);
114                        }
115                        
116                        SpecialItemSpecAPI item = stack.getSpecialItemSpecIfSpecial();
117                        if (item != null && item.hasTag(Tags.CODEX_UNLOCKABLE)) {
118                                save |= SharedUnlockData.get().reportPlayerAwareOfSpecialItem(item.getId(), false);
119                        }
120                        
121                        CommoditySpecAPI commodity = stack.getResourceIfResource();
122                        if (commodity != null && commodity.hasTag(Tags.CODEX_UNLOCKABLE)) {
123                                save |= SharedUnlockData.get().reportPlayerAwareOfCommodity(commodity.getId(), false);
124                        }
125                }
126                
127                
128                for (MarketAPI market : Misc.getPlayerMarkets(true)) {
129                        for (Industry ind : market.getIndustries()) {
130                                if (ind.getSpec().hasTag(Tags.CODEX_UNLOCKABLE)) {
131                                        save |= SharedUnlockData.get().reportPlayerAwareOfIndustry(ind.getSpec().getId(), false);
132                                }
133                        }
134                }
135                
136                MutableCharacterStatsAPI stats = Global.getSector().getPlayerStats();
137                if (stats != null) {
138                        for (SkillLevelAPI sl : stats.getSkillsCopy()) {
139                                if (sl.getLevel() > 0 && sl.getSkill().hasTag(Tags.CODEX_UNLOCKABLE)) {
140                                        save |= SharedUnlockData.get().reportPlayerAwareOfSkill(sl.getSkill().getId(), false);
141                                }       
142                        }
143                }
144                
145                for (AbilityPlugin ability : fleet.getAbilities().values()) {
146                        if (ability.getSpec().hasTag(Tags.CODEX_UNLOCKABLE)) {
147                                save |= SharedUnlockData.get().reportPlayerAwareOfAbility(ability.getSpec().getId(), false);
148                        }
149                }
150                
151                for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
152                        if (member.getHullSpec().hasTag(Tags.CODEX_UNLOCKABLE)) {
153                                String hullId = CodexDataV2.getFleetMemberBaseHullId(member);
154                                save |= SharedUnlockData.get().reportPlayerAwareOfShip(hullId, true);
155                        }
156                }
157                
158                if (save) SharedUnlockData.get().saveIfNeeded();
159        }
160        
161        
162        
163        @Override
164        public void reportClosedCodex() {
165                
166        }
167
168        
169        public static void makeAwareOfConditionsOn(MarketAPI market) {
170                if (market == null) return;
171                
172                boolean save = false;
173                for (MarketConditionAPI mc : market.getConditions()) {
174                        if (mc.getSpec().hasTag(Tags.CODEX_UNLOCKABLE)) {
175                                save |= SharedUnlockData.get().reportPlayerAwareOfCondition(mc.getSpec().getId(), false);
176                        }
177                }
178                if (save) SharedUnlockData.get().saveIfNeeded();
179        }
180
181
182        @Override
183        public void reportPlayerLeftCargoPods(SectorEntityToken entity) {}
184        @Override
185        public void reportPlayerNonMarketTransaction(PlayerMarketTransaction transaction, InteractionDialogAPI dialog) {}
186        @Override
187        public void reportSubmarketOpened(SubmarketAPI submarket) {}
188        
189        
190        
191        
192
193}