OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
fightaidefinitions.cpp
Go to the documentation of this file.
2
3#include "gothic.h"
4#include "utils/string_frm.h"
5
7 auto vm = Gothic::inst().createPhoenixVm("Fight.dat");
8
9 auto* max = vm->find_symbol_by_name("MAX_FIGHTAI");
10 int count = max != nullptr ? max->get_int() : 0;
11 if(count<0)
12 count=0;
13
14 fAi.resize(size_t(count));
15 for(size_t i=1;i<fAi.size();++i)
16 fAi[i] = loadAi(*vm,i);
17 }
18
19const FightAi::FA& FightAi::operator[](size_t i) const {
20 if(i<fAi.size())
21 return fAi[i];
22 static FA tmp;
23 return tmp;
24 }
25
26zenkit::IFightAi FightAi::loadAi(zenkit::DaedalusVm& vm, std::string_view name) {
27 auto id = vm.find_symbol_by_name(name);
28 if(id==nullptr)
29 return {};
30 auto* move = vm.find_symbol_by_name("C_FIGHTAI.MOVE");
31 if(move==nullptr)
32 return {};
33
34 try {
35 auto fai = vm.init_opaque_instance(id);
36 zenkit::IFightAi ret = {};
37 // Note: any excessive move will be discarded
38 for(size_t i=0; i<zenkit::IFightAi::move_count && i<move->count(); ++i) {
39 ret.move[i] = zenkit::FightAiMove(move->get_int(uint16_t(i), fai.get()));
40 }
41 return ret;
42 }
43 catch(const zenkit::DaedalusScriptError&) {
44 // There was an error during initialization. Ignore it.
45 }
46
47 return {};
48 }
49
50FightAi::FA FightAi::loadAi(zenkit::DaedalusVm &vm, size_t id) {
51 FA ret={};
52
53 string_frm name("FA_ENEMY_PREHIT_",int(id));
54 ret.enemy_prehit = loadAi(vm,name);
55
56 name = string_frm("FA_ENEMY_STORMPREHIT_",int(id));
57 ret.enemy_stormprehit = loadAi(vm,name);
58
59 name = string_frm("FA_MY_W_COMBO_",int(id));
60 ret.my_w_combo = loadAi(vm,name);
61
62 name = string_frm("FA_MY_W_RUNTO_",int(id));
63 ret.my_w_runto = loadAi(vm,name);
64
65 name = string_frm("FA_MY_W_STRAFE_",int(id));
66 ret.my_w_strafe = loadAi(vm,name);
67
68 name = string_frm("FA_MY_W_FOCUS_",int(id));
69 ret.my_w_focus = loadAi(vm,name);
70
71 name = string_frm("FA_MY_W_NOFOCUS_",int(id));
72 ret.my_w_nofocus = loadAi(vm,name);
73
74 name = string_frm("FA_MY_G_COMBO_",int(id));
75 ret.my_g_combo = loadAi(vm,name);
76
77 name = string_frm("FA_MY_G_RUNTO_",int(id));
78 ret.my_g_runto = loadAi(vm,name);
79
80 name = string_frm("FA_MY_G_STRAFE_",int(id));
81 ret.my_g_strafe = loadAi(vm,name);
82
83 name = string_frm("FA_MY_G_FOCUS_",int(id));
84 ret.my_g_focus = loadAi(vm,name);
85
86 name = string_frm("FA_MY_FK_FOCUS_",int(id));
87 ret.my_fk_focus = loadAi(vm,name);
88
89 name = string_frm("FA_MY_G_FK_NOFOCUS_",int(id));
90 ret.my_g_fk_nofocus = loadAi(vm,name);
91
92 name = string_frm("FA_MY_FK_FOCUS_FAR_",int(id));
93 ret.my_fk_focus_far = loadAi(vm,name);
94
95 name = string_frm("FA_MY_FK_NOFOCUS_FAR_",int(id));
96 ret.my_fk_nofocus_far = loadAi(vm,name);
97
98 name = string_frm("FA_MY_FK_FOCUS_MAG_",int(id));
99 ret.my_fk_focus_mag = loadAi(vm,name);
100
101 name = string_frm("FA_MY_FK_NOFOCUS_MAG_",int(id));
102 ret.my_fk_nofocus_mag = loadAi(vm,name);
103
104 return ret;
105 }
const FA & operator[](size_t i) const
static Gothic & inst()
Definition gothic.cpp:249
std::unique_ptr< zenkit::DaedalusVm > createPhoenixVm(std::string_view datFile, const ScriptLang lang=ScriptLang::NONE)
Definition gothic.cpp:711