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}