@@ -2422,6 +2422,96 @@ 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+ if (libconfig -> setting_lookup_int (it , "NeedRefineMax" , & i32 ) == CONFIG_TRUE )
2469+ data -> lapineddukddak -> NeedRefineMax = (int8 )i32 ;
2470+
2471+ struct config_setting_t * sources = libconfig -> setting_get_member (it , "SourceItems" );
2472+ itemdb -> read_libconfig_lapineddukddak_sub_sources (sources , data );
2473+
2474+ if (libconfig -> setting_lookup_string (it , "Script" , & str ) == CONFIG_TRUE )
2475+ data -> lapineddukddak -> script = * str ? script -> parse (str , source , - data -> nameid , SCRIPT_IGNORE_EXTERNAL_BRACKETS , NULL ) : NULL ;
2476+ return true;
2477+ }
2478+
2479+ static bool itemdb_read_libconfig_lapineddukddak_sub_sources (struct config_setting_t * sources , struct item_data * data )
2480+ {
2481+ nullpo_retr (false, data );
2482+ nullpo_retr (false, data -> lapineddukddak );
2483+
2484+ int i = 0 ;
2485+ struct config_setting_t * entry = NULL ;
2486+
2487+ if (sources == NULL || !config_setting_is_group (sources ))
2488+ return false;
2489+
2490+ VECTOR_INIT (data -> lapineddukddak -> SourceItems );
2491+ while ((entry = libconfig -> setting_get_elem (sources , i ++ )) != NULL ) {
2492+ struct item_data * edata = NULL ;
2493+ struct itemlist_entry item = { 0 };
2494+ const char * name = config_setting_name (entry );
2495+ int i32 = 0 ;
2496+
2497+ if ((edata = itemdb -> name2id (name )) == NULL ) {
2498+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n" , name );
2499+ continue ;
2500+ }
2501+ item .id = edata -> nameid ;
2502+
2503+ if ((i32 = libconfig -> setting_get_int (entry )) == CONFIG_TRUE && (i32 <= 0 || i32 > MAX_AMOUNT )) {
2504+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: invalid amount (%d) for source item '%s', skipping..\n" , i32 , name );
2505+ continue ;
2506+ }
2507+ item .amount = i32 ;
2508+
2509+ VECTOR_ENSURE (data -> lapineddukddak -> SourceItems , 1 , 1 );
2510+ VECTOR_PUSH (data -> lapineddukddak -> SourceItems , item );
2511+ }
2512+ return true;
2513+ }
2514+
24252515/**
24262516 * Reads all item-related databases.
24272517 */
@@ -2460,6 +2550,7 @@ static void itemdb_read(bool minimal)
24602550 itemdb -> read_groups ();
24612551 itemdb -> read_chains ();
24622552 itemdb -> read_packages ();
2553+ itemdb -> read_libconfig_lapineddukddak ();
24632554}
24642555
24652556/**
@@ -2516,6 +2607,12 @@ static void destroy_item_data(struct item_data *self, int free_self)
25162607 script -> free_code (self -> unequip_script );
25172608 if ( self -> combos )
25182609 aFree (self -> combos );
2610+ if (self -> lapineddukddak != NULL ) {
2611+ if (self -> lapineddukddak -> script != NULL )
2612+ script -> free_code (self -> lapineddukddak -> script );
2613+ VECTOR_CLEAR (self -> lapineddukddak -> SourceItems );
2614+ aFree (self -> lapineddukddak );
2615+ }
25192616 HPM -> data_store_destroy (& self -> hdata );
25202617#if defined(DEBUG )
25212618 // trash item
@@ -2820,4 +2917,7 @@ void itemdb_defaults(void)
28202917 itemdb -> lookup_const = itemdb_lookup_const ;
28212918 itemdb -> lookup_const_mask = itemdb_lookup_const_mask ;
28222919 itemdb -> addname_sub = itemdb_addname_sub ;
2920+ itemdb -> read_libconfig_lapineddukddak = itemdb_read_libconfig_lapineddukddak ;
2921+ itemdb -> read_libconfig_lapineddukddak_sub = itemdb_read_libconfig_lapineddukddak_sub ;
2922+ itemdb -> read_libconfig_lapineddukddak_sub_sources = itemdb_read_libconfig_lapineddukddak_sub_sources ;
28232923}
0 commit comments