@php $seoBaseTitle = (string) ($meta['name'] ?? $meta['sName'] ?? $meta['title'] ?? 'Skill'); $seoTitle = $seoBaseTitle . ' • Vortex Sky X Wiki'; $rawDesc = $meta['sDescription'] ?? ($meta['description'] ?? []); $descLines = []; if (is_array($rawDesc)) { $descLines = array_values(array_filter(array_map(fn($v) => trim((string) $v), $rawDesc))); } elseif (is_string($rawDesc) && trim($rawDesc) !== '') { $descLines = [trim($rawDesc)]; } $seoDescription = trim(implode(' ', $descLines)); $gameName = $game ?? 'Vortex Sky X'; if ($seoDescription === '') { $seoDescription = 'Skill details, effects, and requirements for ' . $seoBaseTitle . ' in ' . $gameName . '.'; } $icon = (string) ($meta['icon'] ?? ''); $seoImage = $icon !== '' ? (str_starts_with($icon, 'http') ? $icon : url($icon)) : asset('images/WebLogo.png'); @endphp {{ $seoTitle }} @include('wiki.partials.seo', [ 'title' => $seoTitle, 'description' => $seoDescription, 'image' => $seoImage, 'type' => 'article', 'game' => $game ?? null, ]) @vite(['resources/css/app.css', 'resources/js/app.js']) @include('wiki.partials.header', ['databaseMenu' => $databaseMenu]) @php $name = (string) ($meta['name'] ?? $meta['sName'] ?? $meta['title'] ?? 'Skill'); $icon = (string) ($meta['icon'] ?? ''); $toNumber = function ($value): ?float { if (is_int($value) || is_float($value)) return (float) $value; if (is_string($value)) { $trim = trim($value); if ($trim !== '' && is_numeric($trim)) return (float) $trim; } return null; }; $formatNumber = function (float $value): string { if (abs($value - round($value)) < 0.0000001) { return (string) (int) round($value); } $txt = number_format($value, 4, '.', ''); return rtrim(rtrim($txt, '0'), '.'); }; $hasVisibleArrayValue = function (array $arr) use (&$hasVisibleArrayValue, $toNumber): bool { foreach ($arr as $entry) { if (is_array($entry)) { if ($hasVisibleArrayValue($entry)) return true; continue; } $num = $toNumber($entry); if ($num !== null) { if (abs($num) > 0.0000001) return true; continue; } if (trim((string) $entry) !== '') return true; } return false; }; $isVisibleValue = function ($value) use ($toNumber, $hasVisibleArrayValue): bool { if ($value === null) return false; if (is_array($value)) { return $hasVisibleArrayValue($value); } if (is_bool($value)) return $value; if (is_string($value) && trim($value) === '') return false; $num = $toNumber($value); if ($num !== null) return abs($num) > 0.0000001; return true; }; $rawDesc = $meta['sDescription'] ?? ($meta['description'] ?? []); $descLines = []; if (is_array($rawDesc)) { $descLines = array_values(array_filter(array_map(fn($v) => trim((string) $v), $rawDesc))); } elseif (is_string($rawDesc) && trim($rawDesc) !== '') { $descLines = [trim($rawDesc)]; } $tribeInfo = $meta['sTribeInfo'] ?? null; $tribeFirst = null; if (is_array($tribeInfo)) { $tribeFirst = $tribeInfo[0] ?? null; } else { $tribeFirst = $tribeInfo; } $validRadiusRaw = $meta['sValidRadius'] ?? null; $validRadiusNum = $toNumber($validRadiusRaw); $validRadius = ($validRadiusNum !== null && $validRadiusNum < 2) ? null : $validRadiusRaw; $factionCodeRaw = $toNumber($tribeFirst); $factionCode = $factionCodeRaw !== null ? ((int) $factionCodeRaw - 2) : null; $faction = match ($factionCode) { 0 => 'Guanyin', 1 => 'Fujin', 2 => 'Jinong', 3 => 'Nangin', default => 'All Factions', }; $factionClass = match (strtolower($faction)) { 'guanyin' => 'wk-f-guanyin', 'fujin' => 'wk-f-fujin', 'jinong' => 'wk-f-jinong', 'nangin' => 'wk-f-nangin', 'all factions' => 'wk-f-all-factions', default => '', }; $coreStats = [ 'Faction' => $faction, 'Learn Skill Point' => $meta['sLearnSkillPoint'] ?? null, 'Max Upgrade Point' => $meta['sMaxUpgradePoint'] ?? null, 'Total Hit Number' => $meta['sTotalHitNumber'] ?? null, 'Valid Radius' => $validRadius, 'Game Type' => $meta['mGameType'] ?? null, ]; $coreStats = collect($coreStats)->filter(fn($value) => $isVisibleValue($value))->all(); $gradeInfo = $meta['sGradeInfo'] ?? []; if (!is_array($gradeInfo)) { $gradeInfo = []; } if (!array_is_list($gradeInfo) && count($gradeInfo)) { $gradeInfo = [$gradeInfo]; } $formatKey = function (string $key): string { $k = preg_replace('/^s(?=[A-Z])/', '', $key); $k = preg_replace('/(? $v) { if (is_array($v)) { if (!isset($gradeRanges[$k])) { $gradeRanges[$k] = ['kind' => 'list', 'min' => [], 'max' => []]; } foreach (array_values($v) as $idx => $entry) { $num = $toNumber($entry); if ($num === null) continue; if (!array_key_exists($idx, $gradeRanges[$k]['min'])) { $gradeRanges[$k]['min'][$idx] = $num; $gradeRanges[$k]['max'][$idx] = $num; } else { $gradeRanges[$k]['min'][$idx] = min($gradeRanges[$k]['min'][$idx], $num); $gradeRanges[$k]['max'][$idx] = max($gradeRanges[$k]['max'][$idx], $num); } } continue; } $num = $toNumber($v); if ($num === null) continue; if (!isset($gradeRanges[$k])) { $gradeRanges[$k] = ['kind' => 'scalar', 'min' => $num, 'max' => $num]; continue; } if (($gradeRanges[$k]['kind'] ?? '') !== 'scalar') continue; $gradeRanges[$k]['min'] = min((float) $gradeRanges[$k]['min'], $num); $gradeRanges[$k]['max'] = max((float) $gradeRanges[$k]['max'], $num); } } $gradeRangeRows = []; foreach ($gradeRanges as $k => $range) { $kind = (string) ($range['kind'] ?? ''); $isAttackInfo = strtolower((string) $k) === 'sattackinfo'; $isRecoverInfo = strtolower((string) $k) === 'srecoverinfo'; $isReturnSuccessUp = strtolower((string) $k) === 'sreturnsuccessup'; $isDestroySuccessUp = strtolower((string) $k) === 'sdestroysuccessup'; $isStunDefenseUp = strtolower((string) $k) === 'sstundefenseup'; $isFastRunSpeed = strtolower((string) $k) === 'sfastrunspeed'; $isChargingDamageUp = strtolower((string) $k) === 'schargingdamageup'; $isEnergyBall = strtolower((string) $k) === 'senergyball'; $isRunTime = strtolower((string) $k) === 'sruntime'; if ($isEnergyBall) { continue; } $scale = ($isReturnSuccessUp || $isDestroySuccessUp) ? 0.1 : 1.0; $valueSuffix = ($isAttackInfo || $isReturnSuccessUp || $isDestroySuccessUp || $isStunDefenseUp || $isFastRunSpeed || $isChargingDamageUp) ? ' (%)' : ($isRunTime ? ' (Seconds)' : ''); $label = $formatKey((string) $k); if ($isAttackInfo) { $label = 'Attack Bonus Damage'; } elseif ($isDestroySuccessUp) { $label = 'Destroy HS Rate'; } elseif ($isRunTime) { $label = 'Buff Duration'; } elseif ($isFastRunSpeed) { $label = 'Run Speed'; } if ($kind === 'scalar') { $min = (float) ($range['min'] ?? 0) * $scale; $max = (float) ($range['max'] ?? 0) * $scale; if (abs($min) < 0.0000001 && abs($max) < 0.0000001) continue; $gradeRangeRows[] = [ 'label' => $formatRangeLabel($label), 'value' => $formatNumber($min) . ' - ' . $formatNumber($max) . $valueSuffix, ]; continue; } if ($kind === 'list') { $mins = is_array($range['min'] ?? null) ? $range['min'] : []; $maxs = is_array($range['max'] ?? null) ? $range['max'] : []; if ($isRecoverInfo) { $recoverLabels = [ 0 => 'HP Recovery', 1 => 'Mana Recovery', ]; foreach ($recoverLabels as $idx => $recoverLabel) { $hasMin = array_key_exists($idx, $mins); $hasMax = array_key_exists($idx, $maxs); if (!$hasMin && !$hasMax) continue; $min = (float) ($hasMin ? $mins[$idx] : $maxs[$idx]); $max = (float) ($hasMax ? $maxs[$idx] : $mins[$idx]); if (abs($min) < 0.0000001 && abs($max) < 0.0000001) continue; $gradeRangeRows[] = [ 'label' => $recoverLabel, 'value' => $formatNumber($min) . ' - ' . $formatNumber($max), ]; } continue; } $indexes = $isAttackInfo ? [0] : array_values(array_unique(array_merge(array_keys($mins), array_keys($maxs)))); if (!$isAttackInfo) { sort($indexes); } $segments = []; foreach ($indexes as $idx) { $hasMin = array_key_exists($idx, $mins); $hasMax = array_key_exists($idx, $maxs); if (!$hasMin && !$hasMax) continue; $min = (float) ($hasMin ? $mins[$idx] : $maxs[$idx]) * $scale; $max = (float) ($hasMax ? $maxs[$idx] : $mins[$idx]) * $scale; if (abs($min) < 0.0000001 && abs($max) < 0.0000001) continue; $segments[] = $formatNumber($min) . ' - ' . $formatNumber($max) . $valueSuffix; } if (count($segments) === 0) continue; $gradeRangeRows[] = [ 'label' => $formatRangeLabel($label), 'value' => implode(' / ', $segments), ]; } } @endphp

{{ $name }}

@if($icon !== '')
{{ $name }}
@endif @if(count($descLines))
Description
@foreach($descLines as $line)
{{ $line }}
@endforeach
@endif @if(count($coreStats))
Base Details
@foreach($coreStats as $label => $value)
{{ $label }} {{ is_array($value) ? implode(' / ', array_map(fn($x) => (string) $x, $value)) : $value }}
@endforeach
@endif @if(count($gradeRangeRows))
Details
@foreach($gradeRangeRows as $row)
{{ $row['label'] }} {{ $row['value'] }}
@endforeach
@endif @if(!empty($html))
{!! $html !!}
@endif