liblcf
rpg_fixup.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of liblcf. Copyright (c) 2020 liblcf authors.
3  * https://github.com/EasyRPG/liblcf - https://easyrpg.org
4  *
5  * liblcf is Free/Libre Open Source Software, released under the MIT License.
6  * For the full copyright and license information, please view the COPYING
7  * file that was distributed with this source code.
8  */
9 
10 #include "lcf_options.h"
11 #include "rpg_actor.h"
12 #include "rpg_mapinfo.h"
13 #include "rpg_system.h"
14 #include "rpg_save.h"
15 #include "rpg_savemapinfo.h"
16 #include "data.h"
17 
18 
19 template <typename T, typename U>
20 static void FixInt(T& val, U def) {
21  if (val < 0) {
22  val = def;
23  }
24 };
25 
26 template <typename T, typename U>
27 void UnFixInt(T& val, U def) {
28  if (val == def) {
29  val = -1;
30  }
31 };
32 
33 void RPG::SaveActor::Fixup(int actor_id) {
34  ID = actor_id;
35 
36  const RPG::Actor& actor = Data::actors[actor_id - 1];
37 
38  if (name == "\x1") {
39  name = actor.name;
40  }
41  if (title == "\x1") {
42  title = actor.title;
43  }
44  if (sprite_name.empty()) {
46  sprite_id = actor.character_index;
47  transparency = actor.transparent ? 3 : 0;
48  }
49  if (face_name.empty()) {
50  face_name = actor.face_name;
51  face_id = actor.face_index;
52  }
53 
54  if (status.size() < Data::states.size()) {
55  status.resize(Data::states.size());
56  }
57 }
58 
60  const RPG::Actor& actor = Data::actors[ID - 1];
61 
62  if (name == actor.name) {
63  name = "\x1";
64  }
65  if (title == actor.title) {
66  title = "\x1";
67  }
68  if (sprite_name == actor.character_name
69  && sprite_id == actor.character_index
70  && transparency == (actor.transparent ? 3 : 0)) {
71  sprite_name.clear();
72  sprite_id = 0;
73  transparency = 0;
74  }
75  if (face_name == actor.face_name && face_id == actor.face_index) {
76  face_name.clear();
77  face_id = 0;
78  }
79 }
80 
83 
84  switches.reserve(Data::switches.size());
85  variables.reserve(Data::variables.size());
86  if (battle_music.name.empty()) {
87  battle_music = system.battle_music;
88  }
89  if (battle_end_music.name.empty()) {
90  battle_end_music = system.battle_end_music;
91  }
92  if (inn_music.name.empty()) {
93  inn_music = system.inn_music;
94  }
95  if (title_music.name.empty()) {
96  title_music = system.title_music;
97  }
98  if (boat_music.name.empty()) {
99  boat_music = system.boat_music;
100  }
101  if (ship_music.name.empty()) {
102  ship_music = system.ship_music;
103  }
104  if (airship_music.name.empty()) {
105  airship_music = system.airship_music;
106  }
107  if (gameover_music.name.empty()) {
108  gameover_music = system.gameover_music;
109  }
110  if (cursor_se.name.empty()) {
111  cursor_se = system.cursor_se;
112  }
113  if (decision_se.name.empty()) {
114  decision_se = system.decision_se;
115  }
116  if (cancel_se.name.empty()) {
117  cancel_se = system.cancel_se;
118  }
119  if (buzzer_se.name.empty()) {
120  buzzer_se = system.buzzer_se;
121  }
122  if (battle_se.name.empty()) {
123  battle_se = system.battle_se;
124  }
125  if (escape_se.name.empty()) {
126  escape_se = system.escape_se;
127  }
128  if (enemy_attack_se.name.empty()) {
129  enemy_attack_se = system.enemy_attack_se;
130  }
131  if (enemy_damaged_se.name.empty()) {
132  enemy_damaged_se = system.enemy_damaged_se;
133  }
134  if (actor_damaged_se.name.empty()) {
135  actor_damaged_se = system.actor_damaged_se;
136  }
137  if (dodge_se.name.empty()) {
138  dodge_se = system.dodge_se;
139  }
140  if (enemy_death_se.name.empty()) {
141  enemy_death_se = system.enemy_death_se;
142  }
143  if (item_se.name.empty()) {
144  item_se = system.item_se;
145  }
146 }
147 
150 
151  //TODO: Should be a C++14 polymorphic lambda
152  auto reset_se = [](RPG::Sound& s) {
153  s = {};
154  s.name.clear();
155  };
156 
157  auto reset_bgm = [](RPG::Music& s) {
158  s = {};
159  s.name.clear();
160  };
161 
162  if (battle_music == system.battle_music) {
163  reset_bgm(battle_music);
164  }
165  if (battle_end_music == system.battle_end_music) {
166  reset_bgm(battle_end_music);
167  }
168  if (inn_music == system.inn_music) {
169  reset_bgm(inn_music);
170  }
171  if (title_music == system.title_music) {
172  reset_bgm(title_music);
173  }
174  if (boat_music == system.boat_music) {
175  reset_bgm(boat_music);
176  }
177  if (ship_music == system.ship_music) {
178  reset_bgm(ship_music);
179  }
180  if (airship_music == system.airship_music) {
181  reset_bgm(airship_music);
182  }
183  if (gameover_music == system.gameover_music) {
184  reset_bgm(gameover_music);
185  }
186  if (cursor_se == system.cursor_se) {
187  reset_se(cursor_se);
188  }
189  if (decision_se == system.decision_se) {
190  reset_se(decision_se);
191  }
192  if (cancel_se == system.cancel_se) {
193  reset_se(cancel_se);
194  }
195  if (buzzer_se == system.buzzer_se) {
196  reset_se(buzzer_se);
197  }
198  if (battle_se == system.battle_se) {
199  reset_se(battle_se);
200  }
201  if (escape_se == system.escape_se) {
202  reset_se(escape_se);
203  }
204  if (enemy_attack_se == system.enemy_attack_se) {
205  reset_se(enemy_attack_se);
206  }
207  if (enemy_damaged_se == system.enemy_damaged_se) {
208  reset_se(enemy_damaged_se);
209  }
210  if (actor_damaged_se == system.actor_damaged_se) {
211  reset_se(actor_damaged_se);
212  }
213  if (dodge_se == system.dodge_se) {
214  reset_se(dodge_se);
215  }
216  if (enemy_death_se == system.enemy_death_se) {
217  reset_se(enemy_death_se);
218  }
219  if (item_se == system.item_se) {
220  reset_se(item_se);
221  }
222 }
223 
224 
226  FixInt(chipset_id, map.chipset_id);
227 }
228 
230  FixInt(encounter_rate, map.encounter_steps);
231 }
232 
234  UnFixInt(chipset_id, map.chipset_id);
235 }
236 
238  UnFixInt(encounter_rate, map.encounter_steps);
239 }
std::string character_name
Definition: rpg_actor.h:33
std::string name
Definition: rpg_actor.h:31
int32_t face_index
Definition: rpg_actor.h:41
bool transparent
Definition: rpg_actor.h:35
int32_t character_index
Definition: rpg_actor.h:34
std::string title
Definition: rpg_actor.h:32
std::string face_name
Definition: rpg_actor.h:40
int32_t chipset_id
Definition: rpg_map.h:62
int32_t encounter_steps
Definition: rpg_mapinfo.h:77
std::string face_name
Definition: rpg_saveactor.h:45
int32_t sprite_id
Definition: rpg_saveactor.h:43
std::vector< int16_t > status
Definition: rpg_saveactor.h:61
void Fixup(int actor_id)
Definition: rpg_fixup.cpp:33
std::string sprite_name
Definition: rpg_saveactor.h:42
void UnFixup()
Definition: rpg_fixup.cpp:59
std::string title
Definition: rpg_saveactor.h:41
std::string name
Definition: rpg_saveactor.h:40
int32_t transparency
Definition: rpg_saveactor.h:44
void Fixup(const RPG::Map &map)
Definition: rpg_fixup.cpp:225
void UnFixup(const RPG::Map &map)
Definition: rpg_fixup.cpp:233
Sound battle_se
Definition: rpg_system.h:202
Sound actor_damaged_se
Definition: rpg_system.h:206
Music boat_music
Definition: rpg_system.h:194
Music gameover_music
Definition: rpg_system.h:197
Music airship_music
Definition: rpg_system.h:196
Music inn_music
Definition: rpg_system.h:193
Music battle_end_music
Definition: rpg_system.h:192
Music battle_music
Definition: rpg_system.h:191
Music title_music
Definition: rpg_system.h:190
Sound escape_se
Definition: rpg_system.h:203
Sound dodge_se
Definition: rpg_system.h:207
Sound cancel_se
Definition: rpg_system.h:200
Sound enemy_death_se
Definition: rpg_system.h:208
Music ship_music
Definition: rpg_system.h:195
Sound enemy_attack_se
Definition: rpg_system.h:204
Sound cursor_se
Definition: rpg_system.h:198
Sound enemy_damaged_se
Definition: rpg_system.h:205
Sound decision_se
Definition: rpg_system.h:199
Sound item_se
Definition: rpg_system.h:209
Sound buzzer_se
Definition: rpg_system.h:201
std::vector< RPG::State > & states
Definition: data.cpp:23
std::vector< RPG::Switch > & switches
Definition: data.cpp:32
std::vector< RPG::Variable > & variables
Definition: data.cpp:33
std::vector< RPG::Actor > & actors
Definition: data.cpp:16
RPG::System & system
Definition: data.cpp:31
void UnFixInt(T &val, U def)
Definition: rpg_fixup.cpp:27
static void FixInt(T &val, U def)
Definition: rpg_fixup.cpp:20