Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarAiDatabase.cpp
blob: e9183966f835fa1fa1f893493fcd9b56e27fa197 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "StarAiDatabase.hpp"
#include "StarLexicalCast.hpp"
#include "StarJsonExtra.hpp"
#include "StarRoot.hpp"
#include "StarAssets.hpp"

namespace Star {

AiDatabase::AiDatabase() {
  auto assets = Root::singleton().assets();
  auto config = assets->json("/ai/ai.config");

  auto& missions = assets->scanExtension("aimission");
  assets->queueJsons(missions);

  for (auto const& file : missions) {
    if (auto config = assets->json(file)) {
      auto mission = parseMission(config);
      m_missions[mission.missionName] = mission;
    }
  }

  for (auto const& speciesPair : config.get("species").iterateObject())
    m_speciesParameters[speciesPair.first] = parseSpeciesParameters(speciesPair.second);

  for (auto const& p : config.get("shipStatus").iterateObject())
    m_shipStatus[lexicalCast<unsigned>(p.first)] = parseSpeech(p.second);

  m_noMissionsSpeech = parseSpeech(config.get("noMissionsSpeech"));
  m_noCrewSpeech = parseSpeech(config.get("noCrewSpeech"));

  m_animationConfig.charactersPerSecond = config.getFloat("charactersPerSecond");
  m_animationConfig.defaultAnimation = config.getString("defaultAnimation");
  m_animationConfig.staticAnimation = Animation("/ai/ai.config:staticAnimation");
  m_animationConfig.staticOpacity = config.getFloat("staticOpacity");
  m_animationConfig.scanlineAnimation = Animation("/ai/ai.config:scanlineAnimation");
  m_animationConfig.scanlineOpacity = config.getFloat("scanlineOpacity");

  for (auto const& pair : config.get("aiAnimations").iterateObject())
    m_animationConfig.aiAnimations[pair.first] = Animation(pair.second, "/ai/");
}

AiMission AiDatabase::mission(String const& missionName) const {
  return m_missions.get(missionName);
}

AiSpeech AiDatabase::shipStatus(unsigned shipLevel) const {
  // Find the first open speech set at this ship level or below.
  auto i = m_shipStatus.upper_bound(shipLevel);
  if (i != m_shipStatus.begin() && (--i)->first <= shipLevel)
    return i->second;

  return {};
}

AiSpeech AiDatabase::noCrewSpeech() const {
  return m_noCrewSpeech;
}

AiSpeech AiDatabase::noMissionsSpeech() const {
  return m_noMissionsSpeech;
}

String AiDatabase::portraitImage(String const& species, String const& frame) const {
  return strf("/ai/{}:{}", m_speciesParameters.get(species).portraitFrames, frame);
}

Animation AiDatabase::animation(String const& species, String const& animationName) const {
  auto faceAnimation = m_animationConfig.aiAnimations.get(animationName);
  faceAnimation.setTag("image", m_speciesParameters.get(species).aiFrames);
  return faceAnimation;
}

Animation AiDatabase::staticAnimation(String const& species) const {
  auto staticAnimation = m_animationConfig.staticAnimation;
  staticAnimation.setTag("image", m_speciesParameters.get(species).staticFrames);
  staticAnimation.setColor(Color::rgbaf(1.0f, 1.0f, 1.0f, m_animationConfig.staticOpacity));
  return staticAnimation;
}

Animation AiDatabase::scanlineAnimation() const {
  auto animation = m_animationConfig.scanlineAnimation;
  animation.setColor(Color::rgbaf(1.0f, 1.0f, 1.0f, m_animationConfig.scanlineOpacity));
  return animation;
}

float AiDatabase::charactersPerSecond() const {
  return m_animationConfig.charactersPerSecond;
}

String AiDatabase::defaultAnimation() const {
  return m_animationConfig.defaultAnimation;
}

AiSpeech AiDatabase::parseSpeech(Json const& v) {
  return AiSpeech{v.getString("animation"), v.getString("text"), v.getFloat("speedModifier", 1.0f)};
}

AiDatabase::AiSpeciesParameters AiDatabase::parseSpeciesParameters(Json const& v) {
  AiSpeciesParameters species;
  species.aiFrames = v.getString("aiFrames");
  species.portraitFrames = v.getString("portraitFrames");
  species.staticFrames = v.getString("staticFrames");
  return species;
}

AiSpeciesMissionText AiDatabase::parseSpeciesMissionText(Json const& vm) {
  return AiSpeciesMissionText{
      vm.getString("buttonText"), vm.getString("repeatButtonText"), parseSpeech(vm.get("selectSpeech", {}))};
}

AiMission AiDatabase::parseMission(Json const& vm) {
  AiMission mission;
  mission.missionName = vm.getString("missionName");
  mission.missionUniqueWorld = vm.getString("missionWorld");
  mission.warpAnimation = vm.optString("warpAnimation");
  mission.warpDeploy = vm.optBool("warpDeploy");
  mission.icon = AssetPath::relativeTo("/ai/", vm.getString("icon"));
  for (auto const& textPair : vm.get("speciesText").iterateObject())
    mission.speciesText[textPair.first] = parseSpeciesMissionText(textPair.second);
  return mission;
}

}