49
49
#include " vpart_range.h"
50
50
#include " wcwidth.h"
51
51
52
+ class emit ;
53
+
52
54
namespace
53
55
{
54
56
generic_factory<vehicle_prototype> vehicle_prototype_factory ( " vehicle" , " id" );
@@ -179,25 +181,11 @@ static void parse_vp_reqs( const JsonObject &obj, const vpart_id &id, const std:
179
181
}
180
182
JsonObject src = obj.get_object ( key );
181
183
182
- JsonArray sk = src.get_array ( " skills" );
183
- if ( !sk.empty () ) {
184
- skills.clear ();
185
- for ( JsonArray cur : sk ) {
186
- if ( cur.size () != 2 ) {
187
- debugmsg ( " vpart '%s' has requirement with invalid skill entry" , id.str () );
188
- continue ;
189
- }
190
- skills.emplace ( skill_id ( cur.get_string ( 0 ) ), cur.get_int ( 1 ) );
191
- }
192
- }
184
+ optional ( src, false , " skills" , skills, weighted_string_id_reader<skill_id, int > { std::nullopt } );
193
185
194
- if ( src.has_string ( " time" ) ) {
195
- assign ( src, " time" , time, /* strict = */ false );
196
- } else if ( src.has_int ( " time" ) ) { // remove in 0.H
197
- time = time_duration::from_moves ( src.get_int ( " time" ) );
198
- debugmsg ( " vpart '%s' defines requirement time as integer, use time units string" , id.str () );
199
- }
186
+ optional ( src, false , " time" , time, time );
200
187
188
+ // FIXME: generic typed reader for requirements
201
189
if ( src.has_string ( " using" ) ) {
202
190
reqs = { { requirement_id ( src.get_string ( " using" ) ), 1 } };
203
191
} else if ( src.has_array ( " using" ) ) {
@@ -273,29 +261,29 @@ void vpart_info::load( const JsonObject &jo, const std::string &src )
273
261
{
274
262
const bool strict = src == " dda" ;
275
263
276
- assign ( jo, " name" , name_, strict );
277
- assign ( jo, " item" , base_item, strict );
278
- assign ( jo, " remove_as" , removed_item, strict );
279
- assign ( jo, " location" , location, strict );
280
- assign ( jo, " durability" , durability, strict );
281
- assign ( jo, " damage_modifier" , dmg_mod, strict );
282
- assign ( jo, " energy_consumption" , energy_consumption, strict );
283
- assign ( jo, " power" , power, strict );
284
- assign ( jo, " epower" , epower, strict );
285
- assign ( jo, " emissions" , emissions, strict );
286
- assign ( jo, " exhaust" , exhaust, strict );
287
- assign ( jo, " fuel_type" , fuel_type, strict );
288
- assign ( jo, " default_ammo" , default_ammo, strict );
289
- assign ( jo, " folded_volume" , folded_volume, strict );
290
- optional ( jo, was_loaded, " size" , size );
291
- assign ( jo, " bonus" , bonus, strict );
292
- assign ( jo, " cargo_weight_modifier" , cargo_weight_modifier, strict );
293
- assign ( jo, " categories" , categories, strict );
294
- assign ( jo, " flags" , flags, strict );
295
- assign ( jo, " description" , description, strict );
296
- optional ( jo, was_loaded, " color" , color, nc_color_reader{} );
297
- optional ( jo, was_loaded, " broken_color" , color_broken, nc_color_reader{} );
298
- assign ( jo, " comfort" , comfort, strict );
264
+ optional ( jo, was_loaded, " name" , name_ );
265
+ optional ( jo, was_loaded, " item" , base_item );
266
+ optional ( jo, was_loaded, " remove_as" , removed_item );
267
+ optional ( jo, was_loaded, " location" , location );
268
+ optional ( jo, was_loaded, " durability" , durability, 0 );
269
+ optional ( jo, was_loaded, " damage_modifier" , dmg_mod, 100 );
270
+ optional ( jo, was_loaded, " energy_consumption" , energy_consumption, 0_W );
271
+ optional ( jo, was_loaded, " power" , power, 0_W );
272
+ optional ( jo, was_loaded, " epower" , epower, 0_W );
273
+ optional ( jo, was_loaded, " emissions" , emissions, string_id_reader<emit> {} );
274
+ optional ( jo, was_loaded, " exhaust" , exhaust, string_id_reader<emit> {} );
275
+ optional ( jo, was_loaded, " fuel_type" , fuel_type, itype_id::NULL_ID () );
276
+ optional ( jo, was_loaded, " default_ammo" , default_ammo, itype_id::NULL_ID () );
277
+ optional ( jo, was_loaded, " folded_volume" , folded_volume, std:: nullopt );
278
+ optional ( jo, was_loaded, " size" , size, 0_ml );
279
+ optional ( jo, was_loaded, " bonus" , bonus, 0 );
280
+ optional ( jo, was_loaded, " cargo_weight_modifier" , cargo_weight_modifier, 100 );
281
+ optional ( jo, was_loaded, " categories" , categories, string_reader{} );
282
+ optional ( jo, was_loaded, " flags" , flags, string_reader{} );
283
+ optional ( jo, was_loaded, " description" , description );
284
+ optional ( jo, was_loaded, " color" , color, nc_color_reader{}, c_light_gray );
285
+ optional ( jo, was_loaded, " broken_color" , color_broken, nc_color_reader{}, c_light_gray );
286
+ optional ( jo, was_loaded, " comfort" , comfort, 0 );
299
287
int legacy_floor_bedding_warmth = units::to_legacy_bodypart_temp_delta ( floor_bedding_warmth );
300
288
assign ( jo, " floor_bedding_warmth" , legacy_floor_bedding_warmth, strict );
301
289
floor_bedding_warmth = units::from_legacy_bodypart_temp_delta ( legacy_floor_bedding_warmth );
@@ -343,20 +331,14 @@ void vpart_info::load( const JsonObject &jo, const std::string &src )
343
331
parse_vp_control_reqs ( reqs, id, " land" , control_land );
344
332
}
345
333
346
- assign ( jo, " looks_like" , looks_like, strict );
334
+ optional ( jo, was_loaded, " looks_like" , looks_like, looks_like );
347
335
348
336
if ( jo.has_member ( " breaks_into" ) ) {
349
337
breaks_into_group = item_group::load_item_group (
350
338
jo.get_member ( " breaks_into" ), " collection" , " breaks_into for vpart " + id.str () );
351
339
}
352
340
353
- JsonArray qual = jo.get_array ( " qualities" );
354
- if ( !qual.empty () ) {
355
- qualities.clear ();
356
- for ( JsonArray pair : qual ) {
357
- qualities[ quality_id ( pair.get_string ( 0 ) ) ] = pair.get_int ( 1 );
358
- }
359
- }
341
+ optional ( jo, was_loaded, " qualities" , qualities, weighted_string_id_reader<quality_id, int > {std::nullopt } );
360
342
361
343
JsonArray tools = jo.get_array ( " pseudo_tools" );
362
344
if ( !tools.empty () ) {
@@ -371,10 +353,10 @@ void vpart_info::load( const JsonObject &jo, const std::string &src )
371
353
}
372
354
}
373
355
}
374
- assign ( jo, " folding_tools" , folding_tools, strict );
375
- assign ( jo, " unfolding_tools" , unfolding_tools, strict );
376
- assign ( jo, " folding_time" , folding_time, strict );
377
- assign ( jo, " unfolding_time" , unfolding_time, strict );
356
+ optional ( jo, was_loaded, " folding_tools" , folding_tools, string_id_reader<itype> {} );
357
+ optional ( jo, was_loaded, " unfolding_tools" , unfolding_tools, string_id_reader<itype> {} );
358
+ optional ( jo, was_loaded, " folding_time" , folding_time, 10_seconds );
359
+ optional ( jo, was_loaded, " unfolding_time" , unfolding_time, 10_seconds );
378
360
379
361
if ( jo.has_member ( " damage_reduction" ) ) {
380
362
JsonObject dred = jo.get_object ( " damage_reduction" );
0 commit comments