V-Gears 0
Free Final Fantasy VII engine.
FieldCodeGenerator.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 The V-Gears Team
3 *
4 * This file is part of V-Gears
5 *
6 * V-Gears is free software: you can redistribute it and/or modify it under
7 * terms of the GNU General Public License as published by the Free Software
8 * Foundation, version 3.0 (GPLv3) of the License.
9 *
10 * V-Gears is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#pragma once
17
18#include <deque>
19#include <unordered_map>
20#include <boost/algorithm/string.hpp>
23
31
32 public:
33
44 FunctionMetaData(std::string meta_data);
45
52 bool IsStart() const;
53
60 bool IsEnd() const;
61
67 std::string GetEntityName();
68
74 int GetCharacterId();
75
76 private:
77
81 static const std::string DELIMITER;
82
86 static const std::string START;
87
91 static const std::string END;
92
98 void Parse(std::string meta_data);
99
109 void ParseStart(const std::string& item, std::deque<std::string>& strs);
110
120 void ParseEnd(const std::string& item, std::deque<std::string>& strs);
121
131 void ParseCharId(const std::string& item, std::deque<std::string>& strs);
132
141 void ParseEntity(const std::string& item, std::deque<std::string>& strs);
142
146 bool end_ = false;
147
151 bool start_ = false;
152
156 std::string entity_name_;
157
162
163};
164
171
172 public:
173
177 enum struct ValueType : int{
178
182 Integer = 0,
183
187 Float = 1
188 };
189
200 static const std::string FormatInstructionNotImplemented(
201 const std::string& entity, uint32 address, uint32 opcode
202 );
203
214 static const std::string FormatInstructionNotImplemented(
215 const std::string& entity, uint32 address, const Instruction& instruction
216 );
217
224 static const std::string FormatBool(uint32 value);
225
232 static const std::string FormatInvertedBool(uint32 value);
233
252 template<typename TValue>static const std::string FormatValueOrVariable(
253 FieldScriptFormatter& formatter, uint32 bank, TValue value_or_address,
254 ValueType type = ValueType::Integer, float scale = 1.0f
255 ){
256 switch (bank){
257 case 0:
258 switch (type){
259 // TODO: check for zero
260 case ValueType::Float: return std::to_string(value_or_address / scale);
261 case ValueType::Integer: return std::to_string(value_or_address);
262 default: return std::to_string(value_or_address);
263 }
264 case 1:
265 case 2:
266 case 3:
267 case 13:
268 case 15:
269 {
270 const auto address = static_cast<uint32>(value_or_address) & 0xFF;
271 const auto friendly_name = formatter.GetFriendlyVarName(
272 bank, value_or_address
273 );
274 if (friendly_name.empty())
275 return (boost::format("Banks[%1%][%2%]") % bank % address).str();
276 return (
277 boost::format("Banks[%1%][%2%]--[[%3%]]") % bank % address % friendly_name
278 ).str();
279 }
280 case 5:
281 case 6:
282 {
283 const auto address = static_cast<uint32>(value_or_address)& 0xFF;
284 const auto friendly_name = formatter.GetFriendlyVarName(bank, address);
285 if (friendly_name.empty())
286 return (boost::format("Banks[%1%][%2%]") % bank % address).str();
287 return (
288 boost::format("Banks[%1%][%2%]--[[%3%]]") % bank % address % friendly_name
289 ).str();
290 }
291 default:
292 return (
293 boost::format(
294 "Banks[%1%][%2%]"
295 ) % bank % (static_cast<uint32>(value_or_address) & 0xFF)
296 ).str();
297 }
298 }
299
309 Engine *engine, const InstVec& insts, std::ostream &output,
311 ) :
314 {target_lang_ = std::make_unique<LuaLanguage>();}
315
322 virtual void Generate(InstVec& insts, const Graph &graph) override;
323
333 virtual void AddOutputLine(
334 std::string line, bool unindent_before = false, bool indent_after = false
335 ) override;
336
342 float GetScaleFactor() const;
343
348
349
350
351 protected:
352
364 virtual std::string ConstructFuncSignature(const Function &function) override;
365
374 virtual void OnEndFunction(const Function& function) override;
375
386 virtual void OnBeforeStartFunction(const Function& function) override;
387
395 virtual void OnStartFunction(const Function& function) override;
396
402 virtual bool OutputOnlyRequiredLabels() const override;
403
404 private:
405
410
414 std::vector<CodeLine> lines_;
415
420
421};
@ LIFO_ARGUMENT_ORDER
First argument is pushed to stack last.
Definition: CodeGenerator.h:48
@ FIFO_ARGUMENT_ORDER
First argument is pushed to stack first.
Definition: CodeGenerator.h:43
boost::adjacency_list< boost::setS, boost::listS, boost::bidirectionalS, GraphProperty, EdgeProperty > Graph
Definition: Graph.h:169
std::vector< InstPtr > InstVec
Type representing a vector of InstPtrs.
Definition: Instruction.h:382
Base class for code generators.
Definition: CodeGenerator.h:58
std::unique_ptr< LuaLanguage > target_lang_
The target language.
Definition: CodeGenerator.h:305
Base class for engines.
Definition: Engine.h:34
The code generator.
Definition: FieldCodeGenerator.h:170
FieldScriptFormatter & formatter_
The formatter.
Definition: FieldCodeGenerator.h:419
virtual bool OutputOnlyRequiredLabels() const override
Checks if only required labels are to be written.
Definition: FieldCodeGenerator.cpp:279
static const std::string FormatInvertedBool(uint32 value)
Formats a value as a boolean.
Definition: FieldCodeGenerator.cpp:316
float GetScaleFactor() const
Retrieves the engine scale factor.
Definition: FieldCodeGenerator.cpp:220
virtual void Generate(InstVec &insts, const Graph &graph) override
Generates the script from the instructions.
Definition: FieldCodeGenerator.cpp:84
std::vector< CodeLine > lines_
Generated lines.
Definition: FieldCodeGenerator.h:414
static const std::string FormatInstructionNotImplemented(const std::string &entity, uint32 address, uint32 opcode)
Generates code for an unimplemented instruction.
Definition: FieldCodeGenerator.cpp:283
virtual void OnEndFunction(const Function &function) override
Finalizes a function.
Definition: FieldCodeGenerator.cpp:263
virtual void AddOutputLine(std::string line, bool unindent_before=false, bool indent_after=false) override
Adds a line to the script.
Definition: FieldCodeGenerator.cpp:216
static const std::string FormatBool(uint32 value)
Formats a value as a boolean.
Definition: FieldCodeGenerator.cpp:312
ValueType
Type of data.
Definition: FieldCodeGenerator.h:177
FieldScriptFormatter & GetFormatter()
Retrieves the formatter.
Definition: FieldCodeGenerator.cpp:281
static const std::string FormatValueOrVariable(FieldScriptFormatter &formatter, uint32 bank, TValue value_or_address, ValueType type=ValueType::Integer, float scale=1.0f)
Formats a data access for a map script.
Definition: FieldCodeGenerator.h:252
FieldCodeGenerator(Engine *engine, const InstVec &insts, std::ostream &output, FieldScriptFormatter &formatter)
Constructor.
Definition: FieldCodeGenerator.h:308
virtual void OnStartFunction(const Function &function) override
Initializes a function.
Definition: FieldCodeGenerator.cpp:234
virtual std::string ConstructFuncSignature(const Function &function) override
Constructs the function signature.
Definition: FieldCodeGenerator.cpp:272
virtual void OnBeforeStartFunction(const Function &function) override
Adds lines to the script before a function.
Definition: FieldCodeGenerator.cpp:223
const InstVec & insts_
The list of instructions in the function to generate.
Definition: FieldCodeGenerator.h:409
Formatter for field scripts.
Definition: FieldScriptFormatter.h:26
Parses an stores function metadata.
Definition: FieldCodeGenerator.h:30
bool end_
Indicates if the function is the last of a class.
Definition: FieldCodeGenerator.h:146
static const std::string DELIMITER
Delimiter for metadata tokens.
Definition: FieldCodeGenerator.h:81
void Parse(std::string meta_data)
Parses metadata.
Definition: FieldCodeGenerator.cpp:36
std::string GetEntityName()
Retrieves the entity name.
Definition: FieldCodeGenerator.cpp:32
void ParseStart(const std::string &item, std::deque< std::string > &strs)
Parses a metadata item, looking for a start mark.
Definition: FieldCodeGenerator.cpp:46
std::string entity_name_
The entity name.
Definition: FieldCodeGenerator.h:156
FunctionMetaData(std::string meta_data)
Constructor.
Definition: FieldCodeGenerator.cpp:26
bool start_
Indicates if the function is the first of a class.
Definition: FieldCodeGenerator.h:151
void ParseEnd(const std::string &item, std::deque< std::string > &strs)
Parses a metadata item, looking for an end mark.
Definition: FieldCodeGenerator.cpp:58
bool IsEnd() const
Checks if the function is the last of a class.
Definition: FieldCodeGenerator.cpp:30
static const std::string START
Start tag for metadata.
Definition: FieldCodeGenerator.h:86
void ParseCharId(const std::string &item, std::deque< std::string > &strs)
Parses a metadata item, looking for a character ID.
Definition: FieldCodeGenerator.cpp:70
void ParseEntity(const std::string &item, std::deque< std::string > &strs)
Parses a metadata item, looking for an entity name.
Definition: FieldCodeGenerator.cpp:79
bool IsStart() const
Checks if the function is the first of a class.
Definition: FieldCodeGenerator.cpp:28
static const std::string END
End tag for metadata.
Definition: FieldCodeGenerator.h:91
int GetCharacterId()
Retrieves the character ID.
Definition: FieldCodeGenerator.cpp:34
int character_id_
The character ID.
Definition: FieldCodeGenerator.h:161
Structure for representing an instruction.
Definition: Instruction.h:50
virtual std::string GetFriendlyVarName(unsigned int bank, unsigned int addr)
Retrieves a friendly name for a variable.
Definition: ScriptFormatter.cpp:18
DummyFormatter formatter
Definition: ff7_field_disasm_all_opcodes_by_category_test.cpp:1966
unsigned int uint32
Definition: scummsys.h:435
Structure representing a function.
Definition: Function.h:26