Skip to content

Commit 3e5e25b

Browse files
authored
Use optional/mandatory for vpart_info and vpart_reqs. (#82634)
* Get mods lists in length order This means that more mods will be tested sooner, exposing errors faster. * weighted_string_id_reader can require weights It makes sense for formats to be able to require a value * vpart_info easy optional/mandatory conversion * vpart_reqs to optional/mandatory
2 parents 01fbdfd + af548ec commit 3e5e25b

File tree

3 files changed

+50
-60
lines changed

3 files changed

+50
-60
lines changed

build-scripts/get_all_mods.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import os
1111

1212
mods_this_time = []
13+
mods_lists = []
1314

1415
exclusions = [
1516
# Tuple of (mod_id, mod_id) - these two mods will be incompatible
@@ -49,7 +50,7 @@ def add_mods(mods):
4950

5051

5152
def print_modlist(modlist, master_list):
52-
print(','.join(modlist))
53+
mods_lists.append(','.join(modlist))
5354
master_list -= set(modlist)
5455
modlist.clear()
5556

@@ -92,7 +93,7 @@ def print_modlist(modlist, master_list):
9293
if ident in obsolete_mods:
9394
continue
9495
mods_this_time.append(os.path.basename(mod.path))
95-
print(','.join(mods_this_time))
96+
mods_lists.append(','.join(mods_this_time))
9697
mods_this_time.clear()
9798

9899
mods_remaining = set(all_mod_dependencies)
@@ -107,3 +108,6 @@ def print_modlist(modlist, master_list):
107108
raise RuntimeError(
108109
'mods remain ({}) but none could be added'.format(mods_remaining))
109110
print_modlist(mods_this_time, mods_remaining)
111+
112+
for list in sorted(mods_lists, key=len, reverse=True):
113+
print(list)

src/generic_factory.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <limits>
1010
#include <list>
1111
#include <map>
12+
#include <optional>
1213
#include <set>
1314
#include <string>
1415
#include <string_view>
@@ -1843,20 +1844,21 @@ class weighted_string_id_reader : public generic_typed_reader<weighted_string_id
18431844
public:
18441845
static constexpr bool read_objects = true;
18451846

1846-
V default_weight;
1847-
explicit weighted_string_id_reader( V default_weight ) : default_weight( default_weight ) {};
1847+
std::optional<V> default_weight;
1848+
explicit weighted_string_id_reader( std::optional<V> default_weight ) : default_weight(
1849+
default_weight ) {};
18481850

18491851
std::pair<K, V> get_next( const JsonValue &val ) const {
18501852
if( val.is_member() ) {
18511853
const JsonMember &jm = dynamic_cast<const JsonMember &>( val );
18521854
return std::pair<K, V>( jm.name(), static_cast<V>( val.get_float() ) );
18531855
} else if( val.test_object() ) {
18541856
JsonObject inline_pair = val.get_object();
1855-
if( !( inline_pair.size() == 1 || inline_pair.size() == 2 ) ) {
1857+
if( !( ( inline_pair.size() == 1 && default_weight.has_value() ) || inline_pair.size() == 2 ) ) {
18561858
inline_pair.throw_error( "weighted_string_id_reader failed to read object" );
18571859
}
18581860
K pair_key;
1859-
V pair_val = default_weight;
1861+
V pair_val = default_weight.value_or( V() );
18601862
for( JsonMember mem : inline_pair ) {
18611863
if( mem.test_string() ) {
18621864
pair_key = K( std::move( mem.get_string() ) );
@@ -1875,12 +1877,14 @@ class weighted_string_id_reader : public generic_typed_reader<weighted_string_id
18751877
return std::pair<K, V>(
18761878
K( std::move( arr[0].get_string() ) ),
18771879
static_cast<V>( arr[1].get_float() ) );
1878-
} else {
1880+
} else if( default_weight.has_value() ) {
18791881
if( val.test_string() ) {
18801882
return std::pair<K, V>(
1881-
K( std::move( val.get_string() ) ), default_weight );
1883+
K( std::move( val.get_string() ) ), *default_weight );
18821884
}
18831885
val.throw_error( "weighted_string_id_reader provided with invalid string_id" );
1886+
} else {
1887+
val.throw_error( "weighted_string_id_reader requires two entries" );
18841888
}
18851889
}
18861890
};

src/veh_type.cpp

Lines changed: 34 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
#include "vpart_range.h"
5050
#include "wcwidth.h"
5151

52+
class emit;
53+
5254
namespace
5355
{
5456
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:
179181
}
180182
JsonObject src = obj.get_object( key );
181183

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 } );
193185

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 );
200187

188+
// FIXME: generic typed reader for requirements
201189
if( src.has_string( "using" ) ) {
202190
reqs = { { requirement_id( src.get_string( "using" ) ), 1 } };
203191
} else if( src.has_array( "using" ) ) {
@@ -273,29 +261,29 @@ void vpart_info::load( const JsonObject &jo, const std::string &src )
273261
{
274262
const bool strict = src == "dda";
275263

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 );
299287
int legacy_floor_bedding_warmth = units::to_legacy_bodypart_temp_delta( floor_bedding_warmth );
300288
assign( jo, "floor_bedding_warmth", legacy_floor_bedding_warmth, strict );
301289
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 )
343331
parse_vp_control_reqs( reqs, id, "land", control_land );
344332
}
345333

346-
assign( jo, "looks_like", looks_like, strict );
334+
optional( jo, was_loaded, "looks_like", looks_like, looks_like );
347335

348336
if( jo.has_member( "breaks_into" ) ) {
349337
breaks_into_group = item_group::load_item_group(
350338
jo.get_member( "breaks_into" ), "collection", "breaks_into for vpart " + id.str() );
351339
}
352340

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} );
360342

361343
JsonArray tools = jo.get_array( "pseudo_tools" );
362344
if( !tools.empty() ) {
@@ -371,10 +353,10 @@ void vpart_info::load( const JsonObject &jo, const std::string &src )
371353
}
372354
}
373355
}
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 );
378360

379361
if( jo.has_member( "damage_reduction" ) ) {
380362
JsonObject dred = jo.get_object( "damage_reduction" );

0 commit comments

Comments
 (0)