@@ -2422,6 +2422,93 @@ static uint64 itemdb_unique_id(struct map_session_data *sd)
24222422 return ((uint64 )sd -> status .char_id << 32 ) | sd -> status .uniqueitem_counter ++ ;
24232423}
24242424
2425+ static bool itemdb_read_libconfig_lapineddukddak (void )
2426+ {
2427+ struct config_t item_lapineddukddak ;
2428+ struct config_setting_t * it = NULL ;
2429+ const char * config_filename = "db/item_lapineddukddak.conf" ; // FIXME hardcoded name
2430+ int i = 0 ;
2431+ int count = 0 ;
2432+
2433+ if (libconfig -> load_file (& item_lapineddukddak , config_filename ) == CONFIG_FALSE )
2434+ return false;
2435+
2436+ while ((it = libconfig -> setting_get_elem (item_lapineddukddak .root , i ++ )) != NULL ) {
2437+ if (itemdb -> read_libconfig_lapineddukddak_sub (it , config_filename ))
2438+ ++ count ;
2439+ }
2440+
2441+ libconfig -> destroy (& item_lapineddukddak );
2442+ ShowStatus ("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n" , count , config_filename );
2443+ return true;
2444+ }
2445+
2446+ static bool itemdb_read_libconfig_lapineddukddak_sub (struct config_setting_t * it , const char * source )
2447+ {
2448+ nullpo_retr (false, it );
2449+ nullpo_retr (false, source );
2450+
2451+ struct item_data * data = NULL ;
2452+ const char * name = config_setting_name (it );
2453+ const char * str = NULL ;
2454+ int i32 = 0 ;
2455+
2456+ if ((data = itemdb -> name2id (name )) == NULL ) {
2457+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n" , name );
2458+ return false;
2459+ }
2460+
2461+ data -> lapineddukddak = aCalloc (1 , sizeof (struct item_lapineddukddak ));
2462+ if (libconfig -> setting_lookup_int (it , "NeedCount" , & i32 ) == CONFIG_TRUE )
2463+ data -> lapineddukddak -> NeedCount = (int16 )i32 ;
2464+
2465+ if (libconfig -> setting_lookup_int (it , "NeedRefineMin" , & i32 ) == CONFIG_TRUE )
2466+ data -> lapineddukddak -> NeedRefineMin = (int8 )i32 ;
2467+
2468+ struct config_setting_t * sources = libconfig -> setting_get_member (it , "SourceItems" );
2469+ itemdb -> read_libconfig_lapineddukddak_sub_sources (sources , data );
2470+
2471+ if (libconfig -> setting_lookup_string (it , "Script" , & str ) == CONFIG_TRUE )
2472+ data -> lapineddukddak -> script = * str ? script -> parse (str , source , - data -> nameid , SCRIPT_IGNORE_EXTERNAL_BRACKETS , NULL ) : NULL ;
2473+ return true;
2474+ }
2475+
2476+ static bool itemdb_read_libconfig_lapineddukddak_sub_sources (struct config_setting_t * sources , struct item_data * data )
2477+ {
2478+ nullpo_retr (false, data );
2479+ nullpo_retr (false, data -> lapineddukddak );
2480+
2481+ int i = 0 ;
2482+ struct config_setting_t * entry = NULL ;
2483+
2484+ if (sources == NULL || !config_setting_is_group (sources ))
2485+ return false;
2486+
2487+ VECTOR_INIT (data -> lapineddukddak -> SourceItems );
2488+ while ((entry = libconfig -> setting_get_elem (sources , i ++ )) != NULL ) {
2489+ struct item_data * edata = NULL ;
2490+ struct itemlist_entry item = { 0 };
2491+ const char * name = config_setting_name (entry );
2492+ int i32 = 0 ;
2493+
2494+ if ((edata = itemdb -> name2id (name )) == NULL ) {
2495+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n" , name );
2496+ continue ;
2497+ }
2498+ item .id = edata -> nameid ;
2499+
2500+ if ((i32 = libconfig -> setting_get_int (entry )) == CONFIG_TRUE && (i32 <= 0 || i32 > MAX_AMOUNT )) {
2501+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: invalid amount (%d) for source item '%s', skipping..\n" , i32 , name );
2502+ continue ;
2503+ }
2504+ item .amount = i32 ;
2505+
2506+ VECTOR_ENSURE (data -> lapineddukddak -> SourceItems , 1 , 1 );
2507+ VECTOR_PUSH (data -> lapineddukddak -> SourceItems , item );
2508+ }
2509+ return true;
2510+ }
2511+
24252512/**
24262513 * Reads all item-related databases.
24272514 */
@@ -2459,6 +2546,7 @@ static void itemdb_read(bool minimal)
24592546 itemdb -> read_chains ();
24602547 itemdb -> read_packages ();
24612548 itemdb -> read_options ();
2549+ itemdb -> read_libconfig_lapineddukddak ();
24622550}
24632551
24642552/**
@@ -2515,6 +2603,12 @@ static void destroy_item_data(struct item_data *self, int free_self)
25152603 script -> free_code (self -> unequip_script );
25162604 if ( self -> combos )
25172605 aFree (self -> combos );
2606+ if (self -> lapineddukddak != NULL ) {
2607+ if (self -> lapineddukddak -> script != NULL )
2608+ script -> free_code (self -> lapineddukddak -> script );
2609+ VECTOR_CLEAR (self -> lapineddukddak -> SourceItems );
2610+ aFree (self -> lapineddukddak );
2611+ }
25182612 HPM -> data_store_destroy (& self -> hdata );
25192613#if defined(DEBUG )
25202614 // trash item
@@ -2819,4 +2913,7 @@ void itemdb_defaults(void)
28192913 itemdb -> lookup_const = itemdb_lookup_const ;
28202914 itemdb -> lookup_const_mask = itemdb_lookup_const_mask ;
28212915 itemdb -> addname_sub = itemdb_addname_sub ;
2916+ itemdb -> read_libconfig_lapineddukddak = itemdb_read_libconfig_lapineddukddak ;
2917+ itemdb -> read_libconfig_lapineddukddak_sub = itemdb_read_libconfig_lapineddukddak_sub ;
2918+ itemdb -> read_libconfig_lapineddukddak_sub_sources = itemdb_read_libconfig_lapineddukddak_sub_sources ;
28222919}
0 commit comments