(string)$row['tier_code'], 'roll_min' => $row['roll_min'], 'roll_max' => $row['roll_max'], ]; $entry = sqlsave_merge_extra_json($entry, $row['extra_json'] ?? null); $tiers[(string)$row['tier_code']] = $entry; } $attrs = []; foreach ($attrRows as $row) { $entry = [ 'id' => (string)$row['attr_id'], 'name' => (string)$row['name'], 'name_ko' => (string)$row['name_ko'], 'slot_group' => (string)$row['slot_group'], 'stat_key' => (string)$row['stat_key'], 'value_default' => $row['value_default'], 'value_scale' => $row['value_scale'], 'decimals' => (int)$row['decimals'], 'idx' => (int)$row['idx'], ]; if ((string)$row['tier_code'] !== '') { $entry['tier_code'] = (string)$row['tier_code']; } $entry = sqlsave_merge_extra_json($entry, $row['extra_json'] ?? null); $attrs[(string)$row['attr_id']] = $entry; } $ringBases = []; foreach ($ringBaseRows as $row) { $ringBaseId = (string)$row['ring_base_id']; $entry = [ 'id' => $ringBaseId, 'name' => (string)$row['name'], 'name_ko' => (string)$row['name_ko'], 'display_name' => (string)$row['display_name'], 'base_attr_id' => (string)$row['base_attr_id'], 'base_attr_name' => (string)$row['base_attr_name'], 'base_stat_key' => (string)$row['base_stat_key'], 'base_formula_text' => (string)$row['base_formula_text'], 'base_value' => $row['base_value'], 'level_coeff' => $row['level_coeff'], 'gloss_coeff' => $row['gloss_coeff'], 'ring_level_min' => (int)$row['ring_level_min'], 'ring_level_max' => (int)$row['ring_level_max'], 'value_decimals' => (int)$row['value_decimals'], 'unique_bonus_tier' => (string)$row['unique_bonus_tier'], 'unique_bonus_attr_ids' => $bonusByRingBaseId[$ringBaseId] ?? [], ]; $entry = sqlsave_merge_extra_json($entry, $row['extra_json'] ?? null); $ringBases[$ringBaseId] = $entry; } $skulls = []; foreach ($skullRows as $row) { $entry = [ 'id' => (string)$row['skull_id'], 'code' => (string)$row['code'], 'name' => (string)$row['name'], 'name_ko' => (string)$row['name_ko'], 'name1' => (string)$row['name1'], 'name2' => (string)$row['name2'], 'effect_ko' => (string)$row['effect_ko'], 'slot_group' => (string)$row['slot_group'], 'operation' => (string)$row['operation'], 'attr_id' => (string)$row['attr_id'], 'value' => $row['value'], 'required_grade' => (string)$row['required_grade'], 'result_grade' => (string)$row['result_grade'], 'page_index' => (int)$row['page_index'], 'slot_x' => (int)$row['slot_x'], 'slot_y' => (int)$row['slot_y'], 'rarity' => (int)$row['rarity'], ]; if ((int)$row['buy_price_mileage'] !== 0) { $entry['buy_price_mileage'] = (int)$row['buy_price_mileage']; } if ((int)$row['sell_price_mileage'] !== 0) { $entry['sell_price_mileage'] = (int)$row['sell_price_mileage']; } $entry = sqlsave_merge_extra_json($entry, $row['extra_json'] ?? null); $skulls[(string)$row['skull_id']] = $entry; } $schemaVersion = is_array($metaRow) ? (int)$metaRow['schema_version'] : 1; $payload = [ 'schema_version' => $schemaVersion, 'ring_bases' => $ringBases, 'tiers' => $tiers, 'attrs' => $attrs, 'skulls' => $skulls, ]; if (is_array($metaRow)) { $payload = sqlsave_merge_extra_json($payload, $metaRow['extra_json'] ?? null); } sqlsave_ok('crafting_sqlsave_masterdata_get', [ 'masterdata' => $payload, 'meta' => is_array($metaRow) ? [ 'master_key' => (string)$metaRow['master_key'], 'schema_version' => (int)$metaRow['schema_version'], 'source_name' => (string)$metaRow['source_name'], 'source_revision' => (string)$metaRow['source_revision'], 'notes' => (string)$metaRow['notes'], 'created_at' => (string)$metaRow['created_at'], 'updated_at' => (string)$metaRow['updated_at'], ] : null, ]); } catch (mysqli_sql_exception $e) { sqlsave_fail('crafting_sqlsave_masterdata_get', 'database_error', $e->getMessage(), 500); } catch (Throwable $e) { sqlsave_fail('crafting_sqlsave_masterdata_get', 'internal_error', $e->getMessage(), 500); }