@@ -49,16 +49,28 @@ POSSIBILITY OF SUCH DAMAGE.
4949#include " PluginManager.h"
5050#include " MiscUtils.h"
5151
52+ #include " modules/Materials.h"
53+
54+ #include " DataDefs.h"
55+ #include " df/material.h"
56+ #include " df/matter_state.h"
57+ #include " df/inorganic_raw.h"
58+ #include " df/creature_raw.h"
59+ #include " df/plant_raw.h"
60+ #include " df/historical_figure.h"
61+
62+ #include " BasicApi.pb.h"
63+
5264#include < cstdio>
5365#include < cstdlib>
5466#include < sstream>
5567
5668#include < memory>
5769
5870using namespace DFHack ;
71+ using namespace df ::enums;
72+ using namespace dfproto ;
5973
60- using dfproto::CoreTextNotification;
61- using dfproto::CoreTextFragment;
6274using google::protobuf::MessageLite;
6375
6476void DFHack::strVectorToRepeatedField (RepeatedPtrField<std::string> *pf,
@@ -68,6 +80,149 @@ void DFHack::strVectorToRepeatedField(RepeatedPtrField<std::string> *pf,
6880 *pf->Add () = vec[i];
6981}
7082
83+ void DFHack::describeMaterial (BasicMaterialInfo *info, df::material *mat,
84+ const BasicMaterialInfoMask *mask)
85+ {
86+ info->set_token (mat->id );
87+
88+ if (mask && mask->flags ())
89+ flagarray_to_string (info->mutable_flags (), mat->flags );
90+
91+ info->set_name_prefix (mat->prefix );
92+
93+ if (!mask || mask->states_size () == 0 )
94+ {
95+ df::matter_state state = matter_state::Solid;
96+ int temp = (mask && mask->has_temperature ()) ? mask->temperature () : 10015 ;
97+
98+ if (temp >= mat->heat .melting_point )
99+ state = matter_state::Liquid;
100+ if (temp >= mat->heat .boiling_point )
101+ state = matter_state::Gas;
102+
103+ info->add_state_color (mat->state_color [state]);
104+ info->add_state_name (mat->state_name [state]);
105+ info->add_state_adj (mat->state_adj [state]);
106+ }
107+ else
108+ {
109+ for (int i = 0 ; i < mask->states_size (); i++)
110+ {
111+ info->add_state_color (mat->state_color [i]);
112+ info->add_state_name (mat->state_name [i]);
113+ info->add_state_adj (mat->state_adj [i]);
114+ }
115+ }
116+
117+ if (mask && mask->reaction ())
118+ {
119+ for (size_t i = 0 ; i < mat->reaction_class .size (); i++)
120+ info->add_reaction_class (*mat->reaction_class [i]);
121+
122+ for (size_t i = 0 ; i < mat->reaction_product .id .size (); i++)
123+ {
124+ auto ptr = info->add_reaction_product ();
125+ ptr->set_id (*mat->reaction_product .id [i]);
126+ ptr->set_type (mat->reaction_product .material .mat_type [i]);
127+ ptr->set_index (mat->reaction_product .material .mat_index [i]);
128+ }
129+ }
130+ }
131+
132+ void DFHack::describeMaterial (BasicMaterialInfo *info, const MaterialInfo &mat,
133+ const BasicMaterialInfoMask *mask)
134+ {
135+ assert (mat.isValid ());
136+
137+ info->set_type (mat.type );
138+ info->set_index (mat.index );
139+
140+ describeMaterial (info, mat.material , mask);
141+
142+ switch (mat.mode ) {
143+ case MaterialInfo::Inorganic:
144+ info->set_token (mat.inorganic ->id );
145+ if (mask && mask->flags ())
146+ flagarray_to_string (info->mutable_inorganic_flags (), mat.inorganic ->flags );
147+ break ;
148+
149+ case MaterialInfo::Creature:
150+ info->set_subtype (mat.subtype );
151+ if (mat.figure )
152+ {
153+ info->set_hfig_id (mat.index );
154+ info->set_creature_id (mat.figure ->race );
155+ }
156+ else
157+ info->set_creature_id (mat.index );
158+ break ;
159+
160+ case MaterialInfo::Plant:
161+ info->set_plant_id (mat.index );
162+ break ;
163+ }
164+ }
165+
166+ static void listMaterial (ListMaterialsRes *out, int type, int index, const BasicMaterialInfoMask *mask)
167+ {
168+ MaterialInfo info (type, index);
169+ if (info.isValid ())
170+ describeMaterial (out->add_value (), info, mask);
171+ }
172+
173+ static command_result ListMaterials (color_ostream &stream,
174+ const ListMaterialsRq *in, ListMaterialsRes *out)
175+ {
176+ CoreSuspender suspend;
177+
178+ auto mask = in->has_mask () ? &in->mask () : NULL ;
179+
180+ for (int i = 0 ; i < in->id_list_size (); i++)
181+ {
182+ auto &elt = in->id_list (i);
183+ listMaterial (out, elt.type (), elt.index (), mask);
184+ }
185+
186+ if (in->builtin ())
187+ {
188+ for (int i = 0 ; i < MaterialInfo::NUM_BUILTIN ; i++)
189+ listMaterial (out, i, -1 , mask);
190+ }
191+
192+ if (in->inorganic ())
193+ {
194+ auto &vec = df::inorganic_raw::get_vector ();
195+ for (size_t i = 0 ; i < vec.size (); i++)
196+ listMaterial (out, 0 , i, mask);
197+ }
198+
199+ if (in->creatures ())
200+ {
201+ auto &vec = df::creature_raw::get_vector ();
202+ for (size_t i = 0 ; i < vec.size (); i++)
203+ {
204+ auto praw = vec[i];
205+
206+ for (size_t j = 0 ; j < praw->material .size (); j++)
207+ listMaterial (out, MaterialInfo::CREATURE_BASE +j, i, mask);
208+ }
209+ }
210+
211+ if (in->plants ())
212+ {
213+ auto &vec = df::plant_raw::get_vector ();
214+ for (size_t i = 0 ; i < vec.size (); i++)
215+ {
216+ auto praw = vec[i];
217+
218+ for (size_t j = 0 ; j < praw->material .size (); j++)
219+ listMaterial (out, MaterialInfo::PLANT_BASE +j, i, mask);
220+ }
221+ }
222+
223+ return out->value_size () ? CR_OK : CR_NOT_FOUND ;
224+ }
225+
71226CoreService::CoreService () {
72227 suspend_depth = 0 ;
73228
@@ -78,6 +233,8 @@ CoreService::CoreService() {
78233 // Add others here:
79234 addMethod (" CoreSuspend" , &CoreService::CoreSuspend);
80235 addMethod (" CoreResume" , &CoreService::CoreResume);
236+
237+ addFunction (" ListMaterials" , ListMaterials);
81238}
82239
83240CoreService::~CoreService ()
0 commit comments