/* =========================================================
FICHA · SEO / META / JSON-LD
========================================================= */
if (!function_exists('cez_seo_clean_text')) {
function cez_seo_clean_text($value, int $limit = 0): string {
$text = trim(preg_replace('/\s+/u', ' ', strip_tags((string)$value)));
if ($limit > 0 && function_exists('mb_strlen') && mb_strlen($text, 'UTF-8') > $limit) {
$text = rtrim(mb_substr($text, 0, $limit - 1, 'UTF-8')) . '…';
} elseif ($limit > 0 && strlen($text) > $limit) {
$text = rtrim(substr($text, 0, $limit - 1)) . '…';
}
return $text;
}
}
if (!function_exists('cez_seo_companies_from_row')) {
function cez_seo_companies_from_row(array $r, int $max = 3): array {
$out = [];
foreach (['compania','compania2','compania3','compania4','compania5','compania6'] as $field) {
foreach (explode(',', (string)($r[$field] ?? '')) as $name) {
$name = trim($name);
if ($name !== '' && !in_array($name, $out, true)) { $out[] = $name; }
}
}
return array_slice($out, 0, $max);
}
}
if (!function_exists('cez_seo_platforms_from_codes')) {
function cez_seo_platforms_from_codes(array $codes, array $sisToSistemaMap = [], int $max = 6): array {
$out = [];
foreach ($codes as $code) {
$code = trim((string)$code);
if ($code === '') { continue; }
$label = trim((string)($sisToSistemaMap[$code] ?? $code));
if ($label !== '' && !in_array($label, $out, true)) { $out[] = $label; }
}
return array_slice($out, 0, $max);
}
}
if (!function_exists('cez_ficha_meta_description')) {
function cez_ficha_meta_description(array $r, array $context = []): string {
$isEn = (($context['l'] ?? null) === 'en');
$pg = trim((string)($context['pg'] ?? ''));
$item = trim((string)($context['itemDescription'] ?? ''));
$name = trim((string)($r['nombre'] ?? ''));
$subtitle = trim((string)($r['subtitulo'] ?? ''));
$fullName = trim($name . ($subtitle !== '' ? ' - ' . $subtitle : ''));
$companies = cez_seo_companies_from_row($r, 2);
$companyText = implode(' / ', $companies);
$yearText = trim((string)($context['anos_string'] ?? ''));
$platforms = cez_seo_platforms_from_codes((array)($context['platforms'] ?? []), (array)($context['sisToSistemaMap'] ?? []), 5);
$platformText = implode(', ', $platforms);
$features = [];
if ($pg === '') {
if (!empty($r['comentario'])) { $features[] = $isEn ? 'review' : 'análisis'; }
if ((int)($context['totalDescargasFicha'] ?? 0) > 0) { $features[] = $isEn ? 'downloads' : 'descargas'; }
if ((int)($r['rscreens'] ?? 0) > 0) { $features[] = $isEn ? 'screenshots' : 'pantallas'; }
if ((int)($r['rcovers'] ?? 0) > 0) { $features[] = $isEn ? 'covers' : 'carátulas'; }
if ((int)($r['rmanual'] ?? 0) > 0) { $features[] = $isEn ? 'manuals' : 'manuales'; }
if ((int)($context['rmags'] ?? 0) > 0) { $features[] = $isEn ? 'magazine reviews' : 'revistas'; }
$features[] = $isEn ? 'credits' : 'créditos';
}
if ($pg !== '' && $item !== '') {
$desc = $isEn
? $item . ' of ' . $fullName . '. Additional material and information from Computer Emuzone'
: $item . ' de ' . $fullName . '. Material e información complementaria en Computer Emuzone';
} else {
$featureText = implode(', ', array_values(array_unique($features)));
$desc = $isEn
? 'Game card of ' . $fullName . ($featureText ? ': ' . $featureText : '')
: 'Ficha de ' . $fullName . ($featureText ? ': ' . $featureText : '');
}
$tail = [];
if ($companyText !== '') { $tail[] = $companyText; }
if ($yearText !== '') { $tail[] = $yearText; }
if ($platformText !== '') { $tail[] = ($isEn ? 'for ' : 'para ') . $platformText; }
if ($tail) { $desc .= '. ' . implode(', ', $tail) . '.'; }
return cez_seo_clean_text($desc, 165);
}
}
if (!function_exists('cez_ficha_jsonld')) {
function cez_ficha_jsonld(array $r, array $context = []): array {
$isEn = (($context['l'] ?? null) === 'en');
$name = trim((string)($r['nombre'] ?? ''));
$subtitle = trim((string)($r['subtitulo'] ?? ''));
$fullName = trim($name . ($subtitle !== '' ? ' - ' . $subtitle : ''));
$companies = cez_seo_companies_from_row($r, 6);
$platforms = cez_seo_platforms_from_codes((array)($context['platforms'] ?? []), (array)($context['sisToSistemaMap'] ?? []), 12);
$canonical = trim((string)($context['canonical'] ?? ''));
$imageUrl = trim((string)($context['imageUrl'] ?? ''));
$description = trim((string)($context['description'] ?? ''));
$json = [
'@context' => 'https://schema.org',
'@type' => 'VideoGame',
'name' => $fullName !== '' ? $fullName : $name,
'url' => $canonical,
'inLanguage' => $isEn ? 'en' : 'es',
'publisher' => [
'@type' => 'Organization',
'name' => 'Computer Emuzone',
'url' => 'https://computeremuzone.com/'
],
];
if ($description !== '') { $json['description'] = $description; }
if ($imageUrl !== '') { $json['image'] = [$imageUrl]; }
if ($canonical !== '') { $json['mainEntityOfPage'] = ['@type' => 'WebPage', '@id' => $canonical]; }
if ($platforms) { $json['gamePlatform'] = $platforms; }
if ($companies) {
$json['creator'] = array_map(static fn($name) => ['@type' => 'Organization', 'name' => $name], $companies);
}
$years = preg_split('/[^0-9]+/', (string)($context['anos_string'] ?? ''), -1, PREG_SPLIT_NO_EMPTY);
if (!empty($years)) { $json['datePublished'] = (string)min(array_map('intval', $years)); }
$genreLabels = [];
foreach ((array)($context['genres'] ?? []) as $g) {
$label = trim((string)($g[$isEn ? 'nombre_en' : 'nombre'] ?? $g['nombre'] ?? ''));
if ($label !== '' && !in_array($label, $genreLabels, true)) { $genreLabels[] = $label; }
}
foreach ((array)($context['subgenres'] ?? []) as $g) {
$label = trim((string)($g[$isEn ? 'nombre_en' : 'nombre'] ?? $g['nombre'] ?? ''));
if ($label !== '' && !in_array($label, $genreLabels, true)) { $genreLabels[] = $label; }
}
if ($genreLabels) { $json['genre'] = $genreLabels; }
$dateModified = trim((string)($context['dateModified'] ?? ''));
if ($dateModified !== '' && preg_match('/^\d{4}-\d{2}-\d{2}/', $dateModified)) { $json['dateModified'] = substr($dateModified, 0, 10); }
$votos = (int)($context['votos'] ?? 0);
$media = (float)($context['media'] ?? 0);
if ($votos > 0 && $media > 0) {
$json['aggregateRating'] = [
'@type' => 'AggregateRating',
'ratingValue' => round($media, 1),
'ratingCount' => $votos,
'bestRating' => 10,
'worstRating' => 1
];
}
$cezScore = isset($context['cezScore']) && $context['cezScore'] !== '' ? (float)$context['cezScore'] : 0.0;
$reviewBody = cez_seo_clean_text($r['comentario'] ?? '', 500);
if ($reviewBody !== '') {
$review = [
'@type' => 'Review',
'reviewBody' => $reviewBody,
'author' => ['@type' => 'Organization', 'name' => 'Computer Emuzone']
];
if ($cezScore > 0) {
$review['reviewRating'] = [
'@type' => 'Rating',
'ratingValue' => round($cezScore, 1),
'bestRating' => 10,
'worstRating' => 1
];
}
$json['review'] = $review;
}
return array_filter($json, static fn($v) => $v !== '' && $v !== [] && $v !== null);
}
}
Aragami (Lince Works 2016–2019) :: Computer Emuzone
@
🌓
PR
revistas
nº (4/10/2016)
Lince Works no va a reinventar la rueda, pero como decíamos al inicio, hay un gran mérito detrás de este juego para tratarse de un estudio independiente. Habrá que seguir la pista del equipo con futuros proyectos.
nº (4 oct. 2016 10:01h.)
Aragami es un juego que gustará a los jugones que disfrutan con los juegos de sigilo puro y duro. Si hubiese más variedad de situaciones y la IA enemiga fuese mejor, estaríamos hablando de uno de los grandes del género. El apartado artístico no deja dudas, con unos escenarios de ensueño y una BSO con temas muy buenos.
PUNTUACIONES
relacionados
RELACIONADOS
SI TE GUSTA...
comenta
agradecimientos
Todavía no hay contribuciones registradas para esta ficha.