/* ========================================================= 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); } } QuicKit (Topo Soft / Erbe 1993) :: Computer Emuzone
developmentdevelopment
Miguel Sepúlveda, el autor, nos cuenta cómo fue el proceso de creación del programa:

"Todo empezó llevando unos juegos a Rafael Gómez de ERBE pero gráficamente eran muy pobres y charlando un poco se nos ocurrió hacer una utilidad gráfica para MS-DOS que entonces no había nada y me puse manos a la obra, claro que de los gráficos se encargó Alfonso Fernández porque eso no era lo mío.

Cuando estaba a punto de salir al mercado, vinieron los franceses de Info Games para presentar el juego Alon in the Dark y se lo enseñaron, le comentaron a Rafa que porque no le añadía compresión y descompresión de ficheros y se alargó el desarrollo un poco más.

Total que cuando por fin se sacó al mercado, también salió el Windows 1.1 que nos chafo un poco ya que contra la publicidad de Microsoft no se podía.

La instalación era totalmente gráfica, todo a golpe de ratón, montando los disquetes y discos duros en el ordenador que eligieras.
Durante el desarrollo del proyecto solo tuve contacto con Rafa Gómez, al que le pedía lo que necesitaba de los gráficos.

No conocí personalmente al resto del equipo.
El programa lo hice con Borlan C y Asembler para las funciones de compresión y descompresión de ficheros."
RATINGSratings

CEZ

Total
Editorial rating
Current rating and category breakdown.
Graphics
Music
Gameplay
Presentation -

Community & Magazines

Votes
8
Participation
#683 in CEZ #1 in Utility
Rating Votes
8 1
10 7
Users
Users
9.8
#1 in CEZ #1 in Utility
developing teamdeveloping team
Programador: Miguel Sepúlveda Fernández
Idea: Rafael Gómez, Miguel Sepúlveda Fernández
Gráficos: Alfonso Fernández Borro
Infografía: Roberto Potenciano Acebes
Fotografía: José María Ruiz de Cenzano
Logotipo, Aerografía: Roberto Uriel Herrera
Dirección del proyecto e Instrucciones: Rafa Gómez
commentcomment
AFFILIATES
In CEZ Zones
thanksthanks
Miguel Sepúlveda
cover