File: /var/www/html/wp-content/mu-plugins/ethnic-game-development-page.php
<?php
/**
* Plugin Name: Ethnic Game Development Page
* Description: Creates and renders the Game Development service pillar page.
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! function_exists( 'ethnic_game_development_page_parent_id' ) ) {
function ethnic_game_development_page_parent_id() {
static $parent_id = null;
if ( null !== $parent_id ) {
return $parent_id;
}
$page = get_page_by_path( 'services' );
if ( $page instanceof WP_Post ) {
$parent_id = (int) $page->ID;
} else {
$fallback = get_post( 843 );
$parent_id = $fallback instanceof WP_Post ? (int) $fallback->ID : 0;
}
return $parent_id;
}
}
if ( ! function_exists( 'ethnic_game_development_page_get_target_page' ) ) {
function ethnic_game_development_page_get_target_page() {
static $page = false;
if ( false !== $page ) {
return $page instanceof WP_Post ? $page : null;
}
$page = get_page_by_path( 'services/game-development' );
if ( ! ( $page instanceof WP_Post ) ) {
$fallback = get_page_by_path( 'game-development' );
if ( $fallback instanceof WP_Post && (int) $fallback->post_parent === ethnic_game_development_page_parent_id() ) {
$page = $fallback;
}
}
return $page instanceof WP_Post ? $page : null;
}
}
if ( ! function_exists( 'ethnic_game_development_page_ensure_page' ) ) {
function ethnic_game_development_page_ensure_page() {
static $did_run = false;
if ( $did_run ) {
return;
}
$did_run = true;
$parent_id = ethnic_game_development_page_parent_id();
if ( ! $parent_id ) {
return;
}
$postarr = array(
'post_type' => 'page',
'post_title' => 'Game Development',
'post_name' => 'game-development',
'post_parent' => $parent_id,
'post_status' => 'publish',
'post_content' => '',
'comment_status' => 'closed',
'ping_status' => 'closed',
);
$page = get_page_by_path( 'services/game-development' );
if ( $page instanceof WP_Post ) {
$needs_update = 'Game Development' !== $page->post_title
|| (int) $page->post_parent !== $parent_id
|| 'publish' !== $page->post_status;
if ( $needs_update ) {
wp_update_post(
array_merge(
$postarr,
array(
'ID' => (int) $page->ID,
)
)
);
clean_post_cache( (int) $page->ID );
}
return;
}
$fallback = get_page_by_path( 'game-development' );
if ( $fallback instanceof WP_Post ) {
wp_update_post(
array_merge(
$postarr,
array(
'ID' => (int) $fallback->ID,
)
)
);
clean_post_cache( (int) $fallback->ID );
return;
}
wp_insert_post( $postarr );
}
add_action( 'init', 'ethnic_game_development_page_ensure_page', 5 );
}
if ( ! function_exists( 'ethnic_game_development_page_is_target' ) ) {
function ethnic_game_development_page_is_target() {
if ( is_admin() ) {
return false;
}
$page = ethnic_game_development_page_get_target_page();
if ( ! ( $page instanceof WP_Post ) ) {
return false;
}
return (int) get_queried_object_id() === (int) $page->ID || is_page( (int) $page->ID );
}
}
if ( ! function_exists( 'ethnic_game_development_page_url' ) ) {
function ethnic_game_development_page_url( $path ) {
return home_url( '/' . ltrim( (string) $path, '/' ) . '/' );
}
}
if ( ! function_exists( 'ethnic_game_development_page_contact_url' ) ) {
function ethnic_game_development_page_contact_url( $args = array() ) {
return ethnic_consultation_route_contact_url( $args, ethnic_game_development_page_url( 'contact-us' ) );
}
}
if ( ! function_exists( 'ethnic_game_development_page_case_studies_url' ) ) {
function ethnic_game_development_page_case_studies_url() {
return function_exists( 'ethnic_case_studies_archive_url' ) ? ethnic_case_studies_archive_url() : ethnic_game_development_page_url( 'case-studies' );
}
}
if ( ! function_exists( 'ethnic_game_development_page_offering_url' ) ) {
function ethnic_game_development_page_offering_url( $slug ) {
$slug = trim( (string) $slug, '/' );
$candidates = array(
'services/game-development/' . $slug,
'game-development/' . $slug,
$slug,
);
foreach ( $candidates as $candidate ) {
$page = get_page_by_path( $candidate );
if ( $page instanceof WP_Post && 'publish' === get_post_status( $page ) ) {
return get_permalink( $page );
}
}
return ethnic_game_development_page_contact_url(
array(
'intent' => 'offering',
'service' => 'game-development',
'offering' => $slug,
)
);
}
}
if ( ! function_exists( 'ethnic_game_development_page_data' ) ) {
function ethnic_game_development_page_data() {
static $data = null;
if ( null !== $data ) {
return $data;
}
$data = array(
'metaTitle' => 'Game Development Company | Mobile Game Development & End-to-End Production',
'metaDescription' => 'Looking for a game development company? We provide mobile game development, full-cycle production, engine-based development, monetization support, art and UI design, and live game improvement services.',
'heroTitle' => 'Game Development',
'heroText' => 'As a game development company and mobile game development company partner, we build engaging, scalable, and market-ready games across mobile, web, and connected platforms with creative production, technical execution, and live product support working together.',
'heroPoints' => array(
'End-to-end game production support',
'Mobile and cross-platform game development',
'Art, engineering, monetization, and live support',
),
'overviewParagraphs' => array(
'Our game development services support studios, startups, brands, and entertainment businesses that need help turning game ideas into playable, stable, and commercially viable products. That includes concept validation, prototyping, full production, feature expansion, and live product support.',
'We build across different genres, mechanics, and audience types while keeping gameplay quality, technical stability, monetization readiness, and player experience central to the delivery process. As a mobile game development company and broader production partner, we adapt the approach to the platform, market, and retention model the game actually needs.',
'Support can include design, engineering, backend systems, live operations tooling, content iteration, UI/UX, release preparation, and post-launch improvement so the product remains viable after the first launch milestone.',
),
'overviewFeatures' => array(
array(
'icon' => 'controller',
'title' => 'End-to-End Game Production',
'copy' => 'Move from concept validation and prototyping into full production, launch planning, and live product support with one connected delivery path.',
),
array(
'icon' => 'platform',
'title' => 'Platform-Focused Development',
'copy' => 'Shape game systems, UX, technical design, and release planning around mobile, web, PC, and cross-platform delivery goals.',
),
array(
'icon' => 'server',
'title' => 'Scalable Technical Architecture',
'copy' => 'Support client engineering, backend services, live systems, performance, and content delivery with production-minded architecture.',
),
array(
'icon' => 'live',
'title' => 'Live Product Support',
'copy' => 'Continue refining balance, content cadence, monetization behavior, and operational performance after launch.',
),
),
'overviewStats' => array(
array(
'label' => 'Production coverage',
'value' => 'Concept to live ops',
),
array(
'label' => 'Platform scope',
'value' => 'Mobile, web, connected platforms',
),
array(
'label' => 'Delivery focus',
'value' => 'Gameplay, scale, market readiness',
),
),
'typesIntro' => 'Game design and production approach depend on genre, platform, audience, retention model, and business goals. We shape scope, systems, content, and delivery plans around the kind of game being built and the market it needs to serve.',
'gameTypes' => array(
array(
'icon' => 'mobile',
'title' => 'Mobile Games',
'copy' => 'Build mobile-first game experiences for iOS and Android with production plans shaped around performance, retention, and monetization.',
'slug' => 'mobile-game-development',
'cta' => 'Explore service',
),
array(
'icon' => 'casual',
'title' => 'Casual Games',
'copy' => 'Create accessible gameplay loops and progression systems that support broad audiences and repeat engagement.',
),
array(
'icon' => 'multiplayer',
'title' => 'Multiplayer Games',
'copy' => 'Support connected play, session systems, backend coordination, and technical planning for multiplayer features.',
),
array(
'icon' => 'puzzle',
'title' => 'Puzzle and Strategy Games',
'copy' => 'Design progression, balancing, and gameplay clarity for systems-driven games that depend on thoughtful player flow.',
),
array(
'icon' => 'action',
'title' => 'Action and Adventure Games',
'copy' => 'Deliver responsive gameplay systems, content structure, and technical polish for more active player experiences.',
),
array(
'icon' => 'live',
'title' => 'Live-Service and Live-Ops Games',
'copy' => 'Plan content cadence, retention loops, live tooling, and operational support for products that continue evolving after launch.',
),
array(
'icon' => 'education',
'title' => 'Educational Games',
'copy' => 'Combine learning goals with approachable interaction design, progression logic, and player-friendly structure.',
),
array(
'icon' => 'brand',
'title' => 'Brand and Promotional Games',
'copy' => 'Build custom game experiences for campaigns, branded engagement, internal activations, or customer interaction programs.',
),
array(
'icon' => 'browser',
'title' => 'Web-Based Games',
'copy' => 'Develop browser-friendly game experiences that support broader reach, accessible play, and lighter deployment models.',
),
array(
'icon' => 'social',
'title' => 'Social and Community-Driven Games',
'copy' => 'Support gameplay systems that depend on player interaction, community loops, and network-aware engagement mechanics.',
),
),
'engineParagraphs' => array(
'Engine and stack selection depends on game type, platform goals, graphics requirements, multiplayer needs, production scope, and the workflow that best fits the team delivering the game. We make engine and tooling decisions around production reality rather than defaulting to the same stack for every project.',
'This Game Development page is structured to connect into dedicated service branches including mobile game development and Unity game development today, with room to expand further into Unreal game development, multiplayer game development, casual game development, and live game support.',
),
'engineGroups' => array(
array(
'icon' => 'engine',
'title' => 'Game Engines',
'description' => 'Engine fit depends on visuals, performance, team workflow, content pipeline, and gameplay scope.',
'items' => array( 'Unity', 'Unreal Engine', 'Godot', 'Custom engine / framework placeholders' ),
'slug' => 'unity-game-development',
'cta' => 'Explore Unity service',
),
array(
'icon' => 'platform',
'title' => 'Platform Targets',
'description' => 'Target platform decisions shape UX, controls, performance expectations, and release planning.',
'items' => array( 'iOS', 'Android', 'Web', 'PC', 'Console placeholder' ),
),
array(
'icon' => 'multiplayer',
'title' => 'Backend / Multiplayer / Services',
'description' => 'Connected systems can include session support, analytics, live-ops tooling, and backend service layers.',
'items' => array( 'Backend service placeholders', 'Matchmaking / session service placeholders', 'Analytics and live-ops tooling placeholders' ),
),
array(
'icon' => 'deploy',
'title' => 'Performance / Build / Delivery',
'description' => 'Production pipelines and delivery infrastructure help keep builds, assets, and release workflows manageable at scale.',
'items' => array( 'CI/CD', 'Cloud hosting placeholders', 'Asset pipeline placeholders' ),
),
),
'toolchainStages' => array(
array(
'title' => 'Engine',
'items' => array( 'Unity', 'Unreal', 'Godot', 'Custom framework placeholders' ),
),
array(
'title' => 'Platform',
'items' => array( 'Mobile', 'Web', 'PC', 'Console placeholder' ),
),
array(
'title' => 'Backend',
'items' => array( 'Session services', 'Live data', 'Analytics placeholders' ),
),
array(
'title' => 'Build',
'items' => array( 'CI/CD', 'Asset pipeline', 'Cloud delivery placeholders' ),
),
),
'workflowParagraphs' => array(
'Game development requires coordinated planning across design, art, engineering, testing, and release preparation. A structured production workflow helps teams validate ideas earlier, reduce execution risk, and move toward launch with fewer surprises.',
'Workflows vary by scope, platform, team model, and product type, but concept validation, gameplay iteration, technical execution, quality control, and live planning all benefit from a more organized production path.',
),
'workflowSteps' => array(
array(
'title' => 'Concept and Discovery',
'copy' => 'Clarify the audience, product goals, target platforms, and commercial direction before full production begins.',
),
array(
'title' => 'Gameplay and Feature Planning',
'copy' => 'Define core loops, feature scope, session structure, progression, and the systems the game depends on most.',
),
array(
'title' => 'Prototyping',
'copy' => 'Validate mechanics, controls, visual direction, and technical assumptions through playable early-stage builds.',
),
array(
'title' => 'Art and UI Production',
'copy' => 'Develop interface systems, content direction, asset pipelines, and production-ready visual language.',
),
array(
'title' => 'Development',
'copy' => 'Build client gameplay, tools, integrations, backend systems, and engine-based features through structured production sprints.',
),
array(
'title' => 'QA and Optimization',
'copy' => 'Improve stability, performance, and playability while reducing technical and gameplay issues before launch.',
),
array(
'title' => 'Launch Preparation',
'copy' => 'Prepare store readiness, deployment processes, release controls, and operational support for the launch window.',
),
array(
'title' => 'Live Support and Iteration',
'copy' => 'Refine content, systems, monetization, analytics visibility, and product performance after players arrive.',
),
),
'monetizationParagraphs' => array(
'Monetization should support the player experience rather than undermine it. The right commercial model depends on platform, audience, retention strategy, content cadence, and the kind of long-term product the game is meant to become.',
'We help align monetization planning with progression, balancing, retention design, and offer structure so the business model supports the game instead of fighting against it.',
),
'monetizationAreas' => array(
array(
'icon' => 'coins',
'title' => 'In-App Purchases',
'copy' => 'Design purchasable items, progression support, or utility layers that fit the product model and player expectations.',
),
array(
'icon' => 'ads',
'title' => 'Ad-Supported Flows',
'copy' => 'Plan ad placement and reward timing in ways that support revenue without overwhelming the player experience.',
),
array(
'icon' => 'premium',
'title' => 'Premium Game Models',
'copy' => 'Support full-price or one-time purchase models where the product and audience fit a premium structure better.',
),
array(
'icon' => 'pass',
'title' => 'Subscription or Pass Models',
'copy' => 'Shape recurring access or battle-pass style systems when ongoing engagement and content cadence support them.',
),
array(
'icon' => 'balance',
'title' => 'Reward and Retention Balancing',
'copy' => 'Align monetization with pacing, progression, reward logic, and long-term player trust.',
),
array(
'icon' => 'store',
'title' => 'Store and Offer Design Support',
'copy' => 'Improve shop structure, bundle presentation, and offer clarity so monetization fits the game UX more naturally.',
),
),
'artParagraphs' => array(
'Game UI/UX, art direction, interaction flow, and visual polish all influence how players understand, enjoy, and trust the game. Design support should make gameplay clearer and the product feel more intentional, not just more decorative.',
'We support interface design, HUD systems, visual direction, character and environment style placeholders, menu design, and player flow refinement aligned with gameplay clarity, audience expectations, and production scope.',
),
'artCapabilities' => array(
array(
'icon' => 'hud',
'title' => 'Game UI and HUD Design',
'copy' => 'Create interface layers that support gameplay clarity, readability, and better player decision-making during active play.',
),
array(
'icon' => 'ux',
'title' => 'UX and Player Flow Design',
'copy' => 'Improve onboarding, navigation, progression flow, and interaction pacing across the player journey.',
),
array(
'icon' => 'palette',
'title' => 'Art Direction Support',
'copy' => 'Shape a consistent visual language for characters, environments, feedback, menus, and overall game identity.',
),
array(
'icon' => 'asset',
'title' => 'Asset Style System Placeholders',
'copy' => 'Support visual systems and production direction for game assets that need clearer consistency across content.',
),
array(
'icon' => 'menu',
'title' => 'Menu and Store Design',
'copy' => 'Design interface components for core navigation, offers, progression views, and monetization touchpoints.',
),
array(
'icon' => 'spark',
'title' => 'Visual Polish and Consistency',
'copy' => 'Add the finishing quality that makes game systems, feedback, and UI feel more cohesive and production-ready.',
),
),
'caseStudies' => array(
array(
'title' => 'Mobile Puzzle Game Launch',
'genre' => 'Puzzle / Mobile',
'engine' => 'Unity',
'service' => 'Full Production',
'challenge'=> 'A new casual concept needed clearer progression, stable mobile performance, and monetization planning before launch.',
'solution' => 'We supported prototyping, gameplay refinement, UI production, mobile engineering, and release readiness around a retention-friendly puzzle loop.',
'outcome' => 'The product moved toward launch with a more polished experience, clearer player flow, and stronger commercial readiness.',
),
array(
'title' => 'Multiplayer Companion System for a Live Game',
'genre' => 'Multiplayer / Live Service',
'engine' => 'Backend-connected placeholder stack',
'service' => 'Feature Expansion',
'challenge'=> 'A live product needed better player connectivity, backend support systems, and scalable session-aware feature planning.',
'solution' => 'We designed and implemented multiplayer-supporting workflows, service coordination, and product-side UX aligned to live operations needs.',
'outcome' => 'The game gained a stronger technical foundation for ongoing connected features and more dependable player-facing support systems.',
),
array(
'title' => 'Promotional Branded Game Experience',
'genre' => 'Brand / Web',
'engine' => 'Web game framework placeholder',
'service' => 'Custom Experience Build',
'challenge'=> 'A campaign-driven brand needed an interactive game experience that balanced speed, polish, and audience accessibility.',
'solution' => 'We created a compact branded game flow with approachable mechanics, strong UI clarity, and production support tuned to campaign goals.',
'outcome' => 'The brand launched a more engaging digital experience that supported promotion goals without sacrificing product quality.',
),
),
'faqs' => array(
array(
'question' => 'What types of game development services do you offer?',
'answer' => 'We support concept validation, prototyping, full production, feature expansion, backend-connected systems, UI and art support, monetization planning, and post-launch improvement.',
),
array(
'question' => 'Do you build mobile games as well as other platform-based games?',
'answer' => 'Yes. As a mobile game development company and broader game production partner, we support mobile, web, PC, and connected platform targets based on the product scope.',
),
array(
'question' => 'Which game engines and technologies do you use?',
'answer' => 'We work with engines and supporting technologies such as Unity, Unreal Engine, Godot, backend-connected service layers, analytics tooling, and production delivery systems chosen around the game’s needs.',
),
array(
'question' => 'Can you help with prototypes and MVPs before full production?',
'answer' => 'Yes. Prototypes and MVP-style builds are often the right way to validate mechanics, product direction, or business fit before committing to larger production scope.',
),
array(
'question' => 'Do you support multiplayer and backend-connected game features?',
'answer' => 'Yes. We can support multiplayer-aware workflows, backend service planning, connected features, analytics visibility, and live-supporting product systems where needed.',
),
array(
'question' => 'How do you approach monetization in game development?',
'answer' => 'We treat monetization as part of the product design, aligning it with player experience, progression, retention, and long-term commercial goals rather than adding it as an isolated layer.',
),
array(
'question' => 'Do you provide art, UI, and design support?',
'answer' => 'Yes. We support game UI/UX, HUD systems, player flow design, art direction, interface production, and visual polish alongside engineering delivery.',
),
array(
'question' => 'Can you help with live updates and post-launch improvements?',
'answer' => 'Yes. We support live updates, feature expansion, gameplay iteration, monetization refinement, analytics-led improvements, and ongoing product care after launch.',
),
array(
'question' => 'Which businesses or studios do you work with?',
'answer' => 'We work with studios, startups, brands, and entertainment businesses that need a production partner for new game ideas, platform expansion, live systems, or content-driven improvement.',
),
array(
'question' => 'Can you build custom game experiences for brands or internal use cases?',
'answer' => 'Yes. We can build promotional game experiences, branded interactive products, educational concepts, and other custom game systems aligned to specific business goals.',
),
),
'ctaTitle' => 'Looking for a Game Development Company?',
'ctaText' => 'Talk with us about mobile game development, multiplayer features, prototypes, full production, monetization planning, art and UI direction, or post-launch improvement needs with a team focused on practical production and market-ready delivery.',
'ctaHighlights' => array(
'Game development company support shaped around creative execution, technical stability, and commercial readiness',
'Mobile game development company capabilities plus cross-platform production, backend support, and live product improvement',
'Clear next steps across concept validation, engine selection, monetization planning, art direction, and launch preparation',
),
'ctaSteps' => array(
array(
'title' => 'Share the game concept or production gap',
'copy' => 'Tell us whether you need concept validation, a prototype, full production, a live feature expansion, or technical support.',
),
array(
'title' => 'Map the right production path',
'copy' => 'We help define platform priorities, engine fit, production scope, monetization direction, and the delivery model that makes sense.',
),
array(
'title' => 'Move into planning and execution',
'copy' => 'Leave with clearer next steps for development, art direction, release planning, live support, and long-term product improvement.',
),
),
);
return $data;
}
}
if ( ! function_exists( 'ethnic_game_development_page_heading' ) ) {
function ethnic_game_development_page_heading( $eyebrow, $title, $copy = '' ) {
ob_start();
?>
<div class="ethnic-game-heading">
<?php if ( $eyebrow ) : ?>
<p class="ethnic-game-heading__eyebrow"><?php echo esc_html( $eyebrow ); ?></p>
<?php endif; ?>
<h2 class="ethnic-game-heading__title"><?php echo esc_html( $title ); ?></h2>
<?php if ( $copy ) : ?>
<p class="ethnic-game-heading__copy"><?php echo esc_html( $copy ); ?></p>
<?php endif; ?>
</div>
<?php
return ob_get_clean();
}
}
if ( ! function_exists( 'ethnic_game_development_page_icon' ) ) {
function ethnic_game_development_page_icon( $icon ) {
ob_start();
switch ( $icon ) {
case 'controller':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M7.2 9.5h9.6a3.4 3.4 0 0 1 3.2 4.5l-1 3.1a2.2 2.2 0 0 1-4 .4l-1.1-1.8h-3.8L9 17.5a2.2 2.2 0 0 1-4-.4l-1-3.1a3.4 3.4 0 0 1 3.2-4.5z" />
<path d="M8 12.5h2.8" />
<path d="M9.4 11.1v2.8" />
<circle cx="15.8" cy="12.2" r="0.9" />
<circle cx="18" cy="14.2" r="0.9" />
</svg>
<?php
break;
case 'platform':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="4.2" y="5.4" width="7.2" height="13.2" rx="1.8" />
<rect x="13.6" y="7.6" width="6.2" height="9" rx="1.6" />
<path d="M7.8 15.8h.01" />
</svg>
<?php
break;
case 'server':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="4.2" y="5" width="15.6" height="5.2" rx="1.4" />
<rect x="4.2" y="13.8" width="15.6" height="5.2" rx="1.4" />
<path d="M7.4 7.6h.01" />
<path d="M7.4 16.4h.01" />
<path d="M11 7.6h5.6" />
<path d="M11 16.4h5.6" />
</svg>
<?php
break;
case 'live':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M5 12h2.8l1.8-3 2.6 6 2.1-4.2h4.7" />
<path d="M18.2 6.8a7.1 7.1 0 1 1-12 6" />
</svg>
<?php
break;
case 'mobile':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="7.3" y="3.8" width="9.4" height="16.4" rx="2.2" />
<path d="M10 6.7h4" />
<path d="M11.6 17h.8" />
</svg>
<?php
break;
case 'casual':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<circle cx="8" cy="8" r="2.4" />
<circle cx="16" cy="8" r="2.4" />
<circle cx="8" cy="16" r="2.4" />
<circle cx="16" cy="16" r="2.4" />
</svg>
<?php
break;
case 'multiplayer':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<circle cx="8" cy="8" r="2.1" />
<circle cx="16" cy="8" r="2.1" />
<circle cx="12" cy="16.5" r="2.2" />
<path d="M9.8 9.2 11 14" />
<path d="M14.2 9.2 13 14" />
<path d="M10.2 8h3.6" />
</svg>
<?php
break;
case 'puzzle':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M8.2 4.8h4.1a1.8 1.8 0 0 1 1.8 1.8v1.1a1.8 1.8 0 1 0 3.6 0V6.6a1.8 1.8 0 0 1 1.8-1.8h.1v5.3a1.8 1.8 0 0 1-1.8 1.8h-1.1a1.8 1.8 0 1 0 0 3.6h1.1a1.8 1.8 0 0 1 1.8 1.8v1.9H8.2a1.8 1.8 0 0 1-1.8-1.8v-1.1a1.8 1.8 0 1 0-3.6 0v1.1a1.8 1.8 0 0 1-1.8 1.8V8.2h5.4a1.8 1.8 0 0 0 1.8-1.8V4.8z" />
</svg>
<?php
break;
case 'action':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="m6.2 17.6 11.6-11.6" />
<path d="m9.2 5.8 8.9 8.9" />
<path d="M6.2 17.6 4.6 19.2" />
<path d="M17.8 6l1.6-1.6" />
</svg>
<?php
break;
case 'education':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="m4.5 8.2 7.5-3.5 7.5 3.5-7.5 3.5Z" />
<path d="M7 10.7v4.2c0 1.8 2.2 3.3 5 3.3s5-1.5 5-3.3v-4.2" />
</svg>
<?php
break;
case 'brand':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M5.2 6.2h13.6v11.6H5.2z" />
<path d="M8 9.2h8" />
<path d="M8 12h5.6" />
<path d="M8 14.8h4" />
</svg>
<?php
break;
case 'browser':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="3.5" y="5" width="17" height="14" rx="2" />
<path d="M3.5 8.3h17" />
<path d="M7.2 6.6h.01" />
<path d="M10 6.6h.01" />
</svg>
<?php
break;
case 'social':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<circle cx="8" cy="9" r="2.2" />
<circle cx="16.4" cy="8" r="1.8" />
<path d="M4.8 17.8c.5-2 2.1-3.2 4.2-3.2s3.7 1.2 4.2 3.2" />
<path d="M13.6 16.8c.4-1.4 1.6-2.2 3.1-2.2 1.6 0 2.8.8 3.1 2.2" />
</svg>
<?php
break;
case 'engine':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="4.5" y="5" width="6" height="6" rx="1.4" />
<rect x="13.5" y="5" width="6" height="6" rx="1.4" />
<rect x="9" y="14" width="6" height="6" rx="1.4" />
<path d="M10.5 8h3" />
<path d="M12 11v3" />
</svg>
<?php
break;
case 'deploy':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M12 4.8v9.7" />
<path d="m8.4 11 3.6 3.5 3.6-3.5" />
<rect x="4.4" y="16.1" width="15.2" height="3.8" rx="1.4" />
</svg>
<?php
break;
case 'coins':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<ellipse cx="12" cy="7.2" rx="5.4" ry="2.4" />
<path d="M6.6 7.2v4.4c0 1.3 2.4 2.4 5.4 2.4s5.4-1.1 5.4-2.4V7.2" />
<path d="M6.6 11.6V16c0 1.3 2.4 2.4 5.4 2.4s5.4-1.1 5.4-2.4v-4.4" />
</svg>
<?php
break;
case 'ads':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M5.2 12.8V8.6a1.8 1.8 0 0 1 1.8-1.8h3.2l5.2-2.4v14.8l-5.2-2.4H7a1.8 1.8 0 0 1-1.8-1.8v-2.2" />
<path d="M17.6 9.2a3.6 3.6 0 0 1 0 5.6" />
</svg>
<?php
break;
case 'premium':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="m5.2 17.8 2.2-10.6 4.6 5.2 4.6-5.2 2.2 10.6z" />
<path d="M8.6 17.8h6.8" />
</svg>
<?php
break;
case 'pass':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="4.2" y="7" width="15.6" height="10" rx="2" />
<path d="M8 10.2h8" />
<path d="M8 13.8h4.6" />
</svg>
<?php
break;
case 'balance':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M12 5.2v13.6" />
<path d="M7 8.2h10" />
<path d="M8.6 8.2 6 13h5.2Z" />
<path d="M18 13h-5.2l2.6-4.8Z" />
</svg>
<?php
break;
case 'store':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M5.2 8.4h13.6l-1.1 8.8H6.3L5.2 8.4z" />
<path d="M8 8.4V6.2A2.2 2.2 0 0 1 10.2 4h3.6A2.2 2.2 0 0 1 16 6.2v2.2" />
</svg>
<?php
break;
case 'hud':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="4.2" y="5" width="15.6" height="14" rx="2" />
<path d="M8 9h8" />
<path d="M8 12.6h4.8" />
<path d="M8 16.2h6.2" />
</svg>
<?php
break;
case 'ux':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M6 6.2h12" />
<path d="M6 12h12" />
<path d="M6 17.8h7.2" />
<circle cx="16.6" cy="17.8" r="1.4" />
</svg>
<?php
break;
case 'palette':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M12 4c4.4 0 8 2.8 8 6.4 0 3-2.7 5.4-6.1 5.4h-1.2c-.8 0-1.5.6-1.5 1.3 0 .4.1.7.4 1l.7.7c.5.5.2 1.2-.5 1.2C7.5 20 4 16.6 4 12.4 4 7.8 7.6 4 12 4z" />
<circle cx="8.2" cy="10.1" r="1" />
<circle cx="11.1" cy="8.1" r="1" />
<circle cx="14.5" cy="8.3" r="1" />
<circle cx="16.9" cy="10.8" r="1" />
</svg>
<?php
break;
case 'asset':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<rect x="5" y="5" width="14" height="14" rx="2" />
<path d="m8.2 14.4 2.4-2.8 2.2 2.4 2.8-3.2 2.4 3.6" />
<circle cx="9" cy="9" r="1" />
</svg>
<?php
break;
case 'menu':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M6 7.2h12" />
<path d="M6 12h12" />
<path d="M6 16.8h12" />
</svg>
<?php
break;
case 'spark':
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M12 4.8v3.2" />
<path d="M12 16v3.2" />
<path d="M4.8 12H8" />
<path d="M16 12h3.2" />
<path d="m7 7 2.2 2.2" />
<path d="m14.8 14.8 2.2 2.2" />
<path d="m17 7-2.2 2.2" />
<path d="m9.2 14.8-2.2 2.2" />
</svg>
<?php
break;
default:
if ( function_exists( 'ethnic_devops_services_page_icon' ) ) {
ob_end_clean();
return ethnic_devops_services_page_icon( $icon );
}
if ( function_exists( 'ethnic_services_page_icon' ) ) {
ob_end_clean();
return ethnic_services_page_icon( 'game' );
}
?>
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<circle cx="12" cy="12" r="8.5" />
<path d="M8.6 12.3 10.8 14.5 15.4 9.9" />
</svg>
<?php
break;
}
return ob_get_clean();
}
}
if ( ! function_exists( 'ethnic_game_development_page_render' ) ) {
function ethnic_game_development_page_render() {
$data = ethnic_game_development_page_data();
$consultation_url = ethnic_game_development_page_contact_url(
array(
'intent' => 'consultation',
'service' => 'game-development',
)
);
$team_url = ethnic_game_development_page_contact_url(
array(
'intent' => 'team',
'service' => 'game-development',
)
);
$quote_url = ethnic_game_development_page_contact_url(
array(
'intent' => 'quote',
'service' => 'game-development',
)
);
$case_studies_url = ethnic_game_development_page_case_studies_url();
$case_studies = function_exists( 'ethnic_case_studies_service_page_cards' )
? ethnic_case_studies_service_page_cards(
array(
'page_id' => get_queried_object_id(),
'limit' => 3,
'filters' => array(
'service' => array( 'game-development' ),
),
'fallback_items' => $data['caseStudies'],
)
)
: (array) $data['caseStudies'];
ob_start();
?>
<div class="ethnic-game-page">
<section class="ethnic-game-section ethnic-game-section--hero">
<div class="ethnic-game-shell">
<div class="ethnic-game-hero">
<div class="ethnic-game-hero__copy">
<p class="ethnic-game-kicker">Interactive Product Production</p>
<h1 class="ethnic-game-hero__title"><?php echo esc_html( $data['heroTitle'] ); ?></h1>
<p class="ethnic-game-hero__lead"><?php echo esc_html( $data['heroText'] ); ?></p>
<div class="ethnic-game-actions">
<a class="ethnic-game-button ethnic-game-button--primary" href="<?php echo esc_url( $consultation_url ); ?>">Book a Free Consultation</a>
<a class="ethnic-game-button ethnic-game-button--secondary" href="<?php echo esc_url( $case_studies_url ); ?>">View Case Studies</a>
</div>
<ul class="ethnic-game-hero__points" aria-label="Game development highlights">
<?php foreach ( (array) $data['heroPoints'] as $point ) : ?>
<li><?php echo esc_html( $point ); ?></li>
<?php endforeach; ?>
</ul>
</div>
<div class="ethnic-game-hero__visual" aria-hidden="true">
<div class="ethnic-game-scene">
<div class="ethnic-game-scene__screen">
<div class="ethnic-game-scene__hud">
<span class="ethnic-game-scene__hud-pill">Mission 04</span>
<span class="ethnic-game-scene__hud-pill">Energy 82%</span>
</div>
<div class="ethnic-game-scene__world">
<div class="ethnic-game-scene__terrain"></div>
<div class="ethnic-game-scene__character-card">
<p>Character card</p>
<strong>Sky Runner</strong>
<span>Speed / Boost / Survival</span>
</div>
<div class="ethnic-game-scene__analytics">
<div>
<small>Retention</small>
<strong>+31%</strong>
</div>
<div>
<small>Session Flow</small>
<strong>Stable</strong>
</div>
</div>
</div>
</div>
<div class="ethnic-game-scene__panel ethnic-game-scene__panel--engine">
<p>Engine scene mockup</p>
<strong>Gameplay camera, HUD overlays, and production-ready interface systems.</strong>
</div>
<div class="ethnic-game-scene__panel ethnic-game-scene__panel--production">
<p>Production board</p>
<ul>
<li>Prototype validated</li>
<li>Art pass in progress</li>
<li>Launch prep aligned</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-game-section" id="overview">
<div class="ethnic-game-shell">
<?php echo ethnic_game_development_page_heading( 'Overview', 'Game development services built for studios, startups, brands, and entertainment teams that need both creative execution and production discipline.', 'We support products from concept and prototype through full production, release preparation, live support, and long-term iteration while keeping the business goals easy to track.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-game-overview">
<div class="ethnic-game-overview__content">
<div class="ethnic-game-prose">
<?php foreach ( (array) $data['overviewParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-game-card-grid ethnic-game-card-grid--overview">
<?php foreach ( (array) $data['overviewFeatures'] as $feature ) : ?>
<article class="ethnic-game-card ethnic-game-card--feature">
<div class="ethnic-game-card__icon">
<?php echo ethnic_game_development_page_icon( $feature['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $feature['title'] ); ?></h3>
<p><?php echo esc_html( $feature['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-game-overview__visual" aria-label="Game production overview visual">
<div class="ethnic-game-overview-board">
<div class="ethnic-game-overview-board__header">
<p>Production overview</p>
<strong>Creative, engineering, backend, and live product support working as one system.</strong>
</div>
<div class="ethnic-game-overview-board__lanes">
<span>Gameplay</span>
<span>Art</span>
<span>Backend</span>
<span>Live Ops</span>
</div>
<div class="ethnic-game-overview-board__stats">
<?php foreach ( (array) $data['overviewStats'] as $stat ) : ?>
<div class="ethnic-game-overview-board__stat">
<strong><?php echo esc_html( $stat['value'] ); ?></strong>
<span><?php echo esc_html( $stat['label'] ); ?></span>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-game-section ethnic-game-section--soft" id="types-of-games">
<div class="ethnic-game-shell">
<?php echo ethnic_game_development_page_heading( 'Types of Games Developed', 'Game production approach changes with genre, platform, player behavior, and product goals.', $data['typesIntro'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-game-card-grid ethnic-game-card-grid--types">
<?php foreach ( (array) $data['gameTypes'] as $type ) : ?>
<article class="ethnic-game-card ethnic-game-type-card">
<div class="ethnic-game-type-card__art">
<div class="ethnic-game-card__icon">
<?php echo ethnic_game_development_page_icon( $type['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<span class="ethnic-game-type-card__beam"></span>
</div>
<h3><?php echo esc_html( $type['title'] ); ?></h3>
<p><?php echo esc_html( $type['copy'] ); ?></p>
<?php if ( ! empty( $type['slug'] ) ) : ?>
<a class="ethnic-game-type-card__link" href="<?php echo esc_url( ethnic_game_development_page_offering_url( $type['slug'] ) ); ?>"><?php echo esc_html( ! empty( $type['cta'] ) ? $type['cta'] : 'Explore service' ); ?></a>
<?php endif; ?>
</article>
<?php endforeach; ?>
</div>
</div>
</section>
<section class="ethnic-game-section" id="engines-and-technologies">
<div class="ethnic-game-shell">
<?php echo ethnic_game_development_page_heading( 'Engines and Technologies', 'Engine and technology choices depend on platform goals, production scope, multiplayer needs, and the gameplay experience the product is meant to deliver.', 'We select tools for fit, maintainability, and production efficiency while keeping the service branch ready for future engine-specific and platform-specific game development pages.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-game-stack">
<div class="ethnic-game-stack__copy">
<div class="ethnic-game-prose">
<?php foreach ( (array) $data['engineParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-game-card-grid ethnic-game-card-grid--engine-groups">
<?php foreach ( (array) $data['engineGroups'] as $group ) : ?>
<article class="ethnic-game-card ethnic-game-card--engine-group">
<div class="ethnic-game-card__icon">
<?php echo ethnic_game_development_page_icon( $group['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $group['title'] ); ?></h3>
<p><?php echo esc_html( $group['description'] ); ?></p>
<div class="ethnic-game-chip-list">
<?php foreach ( (array) $group['items'] as $item ) : ?>
<span><?php echo esc_html( $item ); ?></span>
<?php endforeach; ?>
</div>
<?php if ( ! empty( $group['slug'] ) ) : ?>
<a class="ethnic-game-card__link" href="<?php echo esc_url( ethnic_game_development_page_offering_url( $group['slug'] ) ); ?>"><?php echo esc_html( ! empty( $group['cta'] ) ? $group['cta'] : 'Explore service' ); ?></a>
<?php endif; ?>
</article>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-game-stack__visual" aria-label="Game technology architecture">
<div class="ethnic-game-toolchain">
<p class="ethnic-game-toolchain__eyebrow">Production stack map</p>
<div class="ethnic-game-toolchain__stages">
<?php foreach ( (array) $data['toolchainStages'] as $stage ) : ?>
<div class="ethnic-game-toolchain__stage">
<strong><?php echo esc_html( $stage['title'] ); ?></strong>
<div class="ethnic-game-toolchain__badges">
<?php foreach ( (array) $stage['items'] as $item ) : ?>
<span><?php echo esc_html( $item ); ?></span>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-game-section ethnic-game-section--soft" id="production-workflow">
<div class="ethnic-game-shell">
<?php echo ethnic_game_development_page_heading( 'Production Workflow', 'A structured game production process helps reduce risk while keeping gameplay, art, engineering, QA, and launch planning aligned.', 'The details vary by scope and platform, but concept validation, iteration, technical execution, quality control, and live readiness all benefit from clearer coordination.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-game-workflow">
<div class="ethnic-game-workflow__intro">
<div class="ethnic-game-prose">
<?php foreach ( (array) $data['workflowParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-game-workflow__rail">
<?php foreach ( (array) $data['workflowSteps'] as $index => $step ) : ?>
<article class="ethnic-game-workflow-step">
<span class="ethnic-game-workflow-step__number"><?php echo esc_html( sprintf( '%02d', $index + 1 ) ); ?></span>
<h3><?php echo esc_html( $step['title'] ); ?></h3>
<p><?php echo esc_html( $step['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
</div>
</section>
<section class="ethnic-game-section" id="monetization-approach">
<div class="ethnic-game-shell">
<?php echo ethnic_game_development_page_heading( 'Monetization Approach', 'Monetization planning should support player experience, retention, and product goals rather than feeling forced or disconnected from the game itself.', 'The right model depends on platform, audience, progression design, content cadence, and how the product is meant to perform commercially over time.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-game-monetization">
<div class="ethnic-game-monetization__content">
<div class="ethnic-game-prose">
<?php foreach ( (array) $data['monetizationParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-game-card-grid ethnic-game-card-grid--monetization">
<?php foreach ( (array) $data['monetizationAreas'] as $area ) : ?>
<article class="ethnic-game-card ethnic-game-card--monetization">
<div class="ethnic-game-card__icon">
<?php echo ethnic_game_development_page_icon( $area['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $area['title'] ); ?></h3>
<p><?php echo esc_html( $area['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
<div class="ethnic-game-monetization__visual" aria-label="Monetization planning visual">
<div class="ethnic-game-monetization-board">
<p class="ethnic-game-monetization-board__eyebrow">Player-first monetization</p>
<div class="ethnic-game-monetization-board__ring">
<span>Retention</span>
<span>Progression</span>
<span>Offers</span>
<span>Balance</span>
</div>
<div class="ethnic-game-monetization-board__models">
<span>Premium</span>
<span>Free-to-play</span>
<span>Ad-supported</span>
<span>Hybrid</span>
<span>Pass models</span>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="ethnic-game-section ethnic-game-section--soft" id="art-and-design">
<div class="ethnic-game-shell">
<?php echo ethnic_game_development_page_heading( 'Art and Design Capabilities', 'Visual direction, interface design, and player flow influence how polished and understandable a game feels from the first session onward.', 'We support UI/UX for games, HUD design, art direction, asset system placeholders, menu design, and player flow refinement aligned to gameplay clarity and product polish.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-game-art">
<div class="ethnic-game-art__visual" aria-label="Game art and UI visual board">
<div class="ethnic-game-art-board">
<div class="ethnic-game-art-board__frame ethnic-game-art-board__frame--hud">
<p>HUD overlay</p>
<strong>Ability cooldowns / score / objective rail</strong>
</div>
<div class="ethnic-game-art-board__frame ethnic-game-art-board__frame--character">
<p>Character sheet placeholder</p>
<strong>Visual style direction and readable silhouette</strong>
</div>
<div class="ethnic-game-art-board__frame ethnic-game-art-board__frame--menu">
<p>Menu system</p>
<strong>Store, mission, and progression views</strong>
</div>
</div>
</div>
<div class="ethnic-game-art__content">
<div class="ethnic-game-prose">
<?php foreach ( (array) $data['artParagraphs'] as $paragraph ) : ?>
<p><?php echo esc_html( $paragraph ); ?></p>
<?php endforeach; ?>
</div>
<div class="ethnic-game-card-grid ethnic-game-card-grid--art">
<?php foreach ( (array) $data['artCapabilities'] as $capability ) : ?>
<article class="ethnic-game-card ethnic-game-card--art">
<div class="ethnic-game-card__icon">
<?php echo ethnic_game_development_page_icon( $capability['icon'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</div>
<h3><?php echo esc_html( $capability['title'] ); ?></h3>
<p><?php echo esc_html( $capability['copy'] ); ?></p>
</article>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
</section>
<?php if ( ! empty( $case_studies ) ) : ?>
<section class="ethnic-game-section ethnic-game-section--contrast" id="case-studies">
<div class="ethnic-game-shell">
<?php echo ethnic_game_development_page_heading( 'Case Studies', 'Commercial game development examples that show production, feature, and launch support across different types of game projects.', 'These premium placeholder case studies reflect the kinds of mobile, multiplayer, branded, and cross-platform work businesses often need from a technical production partner.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<?php echo ethnic_shared_case_study_showcase_render( $case_studies, array( 'carousel_label' => 'Game development case studies showcase' ) ); ?>
</div>
</section>
<?php endif; ?>
<section class="ethnic-game-section" id="faq">
<div class="ethnic-game-shell ethnic-game-shell--narrow">
<?php echo ethnic_game_development_page_heading( 'FAQs', 'Answers to common questions about game development services, mobile game production, engines, monetization, art support, and post-launch delivery.' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<div class="ethnic-game-faq">
<?php foreach ( (array) $data['faqs'] as $index => $faq ) : ?>
<details class="ethnic-game-faq__item" <?php echo 0 === $index ? 'open' : ''; ?>>
<summary>
<span><?php echo esc_html( $faq['question'] ); ?></span>
<span class="ethnic-game-faq__marker" aria-hidden="true"></span>
</summary>
<div class="ethnic-game-faq__answer">
<p><?php echo esc_html( $faq['answer'] ); ?></p>
</div>
</details>
<?php endforeach; ?>
</div>
</div>
</section>
<section class="ethnic-game-section ethnic-game-section--cta" id="cta">
<div class="ethnic-game-shell">
<div class="ethnic-game-cta">
<div class="ethnic-game-cta__copy">
<div class="ethnic-game-cta__intro">
<p class="ethnic-game-kicker ethnic-game-kicker--light">Ready to Talk</p>
<p class="ethnic-game-cta__note">Planning around mobile game development, multiplayer systems, prototypes, full production, monetization, and post-launch improvement.</p>
</div>
<h2><?php echo esc_html( $data['ctaTitle'] ); ?></h2>
<p class="ethnic-game-cta__lead"><?php echo esc_html( $data['ctaText'] ); ?></p>
<div class="ethnic-game-actions">
<a class="ethnic-game-button ethnic-game-button--primary" href="<?php echo esc_url( $team_url ); ?>">Talk to Our Team</a>
<a class="ethnic-game-button ethnic-game-button--secondary" href="<?php echo esc_url( $quote_url ); ?>">Get a Free Quote</a>
</div>
<ul class="ethnic-game-cta__highlights" aria-label="Game development CTA highlights">
<?php foreach ( (array) $data['ctaHighlights'] as $highlight ) : ?>
<li><?php echo esc_html( $highlight ); ?></li>
<?php endforeach; ?>
</ul>
</div>
<aside class="ethnic-game-cta__panel" aria-label="What happens next">
<div class="ethnic-game-cta__visual">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="ethnic-game-cta__panel-header">
<p class="ethnic-game-cta__panel-eyebrow">What Happens Next</p>
<h3 class="ethnic-game-cta__panel-title">Shape the right production path for a new game, live product improvement, or market-ready release build.</h3>
</div>
<ol class="ethnic-game-cta__steps">
<?php foreach ( (array) $data['ctaSteps'] as $index => $step ) : ?>
<li class="ethnic-game-cta__step">
<span class="ethnic-game-cta__step-number"><?php echo esc_html( sprintf( '%02d', $index + 1 ) ); ?></span>
<div class="ethnic-game-cta__step-copy">
<strong><?php echo esc_html( $step['title'] ); ?></strong>
<p><?php echo esc_html( $step['copy'] ); ?></p>
</div>
</li>
<?php endforeach; ?>
</ol>
<div class="ethnic-game-cta__panel-note"><strong>Focus:</strong> production planning, engine fit, gameplay iteration, monetization readiness, art direction, and live game support.</div>
</aside>
</div>
</div>
</section>
</div>
<?php
return ob_get_clean();
}
}
if ( ! function_exists( 'ethnic_game_development_page_styles' ) ) {
function ethnic_game_development_page_styles() {
$base_styles = '';
if ( function_exists( 'ethnic_devops_services_page_styles' ) ) {
$base_styles = str_replace(
array(
'ethnic-devops-development-target',
'ethnic-devops-services-target',
'ethnic-devops',
),
array(
'ethnic-game-development-target',
'ethnic-game-development-target',
'ethnic-game',
),
ethnic_devops_services_page_styles()
);
} elseif ( function_exists( 'ethnic_ecommerce_development_page_styles' ) ) {
$base_styles = str_replace(
array(
'ethnic-ecommerce-development-target',
'ethnic-ecommerce',
),
array(
'ethnic-game-development-target',
'ethnic-game',
),
ethnic_ecommerce_development_page_styles()
);
}
return $base_styles . <<<'CSS'
.ethnic-game-page {
--ethnic-game-accent: #8b5cf6;
--ethnic-game-accent-dark: #6d28d9;
--ethnic-game-cyan: #22d3ee;
--ethnic-game-lime: #c4b5fd;
}
.ethnic-game-section--hero {
background:
radial-gradient(circle at 18% 18%, rgba(139, 92, 246, 0.24), transparent 25%),
radial-gradient(circle at 84% 18%, rgba(34, 211, 238, 0.14), transparent 18%),
linear-gradient(180deg, #090f22, #121938 55%, #1c2550);
}
.ethnic-game-hero__title {
max-width: 8ch;
}
.ethnic-game-hero__lead {
max-width: 61ch;
}
.ethnic-game-visual__window-body {
background:
radial-gradient(circle at top right, rgba(139, 92, 246, 0.18), transparent 28%),
linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(246, 243, 255, 0.98));
}
.ethnic-game-visual__nav span,
.ethnic-game-visual__tags span {
background: rgba(139, 92, 246, 0.08);
color: #5b21b6;
}
.ethnic-game-visual__product-shot {
background:
radial-gradient(circle at 28% 28%, rgba(255, 255, 255, 0.92), transparent 22%),
linear-gradient(150deg, rgba(139, 92, 246, 0.16), rgba(34, 211, 238, 0.1)),
linear-gradient(180deg, #f5f3ff, #ede9fe);
}
.ethnic-game-visual__product-shot::before {
background: linear-gradient(180deg, #ffffff, #f7f5ff);
border: 1px solid rgba(139, 92, 246, 0.14);
}
.ethnic-game-visual__product-shot::after {
background: rgba(139, 92, 246, 0.12);
}
.ethnic-game-visual__eyebrow {
color: var(--ethnic-game-accent-dark);
}
.ethnic-game-visual__floating li::before,
.ethnic-game-checklist li::before,
.ethnic-game-cta__highlights li::before {
background: var(--ethnic-game-accent);
box-shadow: 0 0 0 5px rgba(139, 92, 246, 0.14);
}
.ethnic-game-visual__floating--ops {
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.04)),
linear-gradient(180deg, #251552, #180f35);
}
.ethnic-game-card__icon,
.ethnic-game-platform-card__icon {
background: rgba(139, 92, 246, 0.08);
color: var(--ethnic-game-accent-dark);
}
.ethnic-game-dashboard,
.ethnic-game-faq__marker,
.ethnic-game-dashboard__journey-step span {
background-color: rgba(139, 92, 246, 0.08);
color: var(--ethnic-game-accent-dark);
}
.ethnic-game-dashboard {
background:
radial-gradient(circle at top right, rgba(34, 211, 238, 0.12), transparent 30%),
linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(248, 247, 255, 0.96));
}
.ethnic-game-cta::before {
background:
linear-gradient(90deg, rgba(139, 92, 246, 0.05) 1px, transparent 1px),
linear-gradient(0deg, rgba(139, 92, 246, 0.05) 1px, transparent 1px);
}
.ethnic-game-cta .ethnic-game-kicker--light,
.ethnic-game-heading__eyebrow {
border-color: rgba(139, 92, 246, 0.18);
color: var(--ethnic-game-accent-dark) !important;
-webkit-text-fill-color: var(--ethnic-game-accent-dark);
}
.ethnic-game-cta .ethnic-game-kicker--light {
color: #5b21b6 !important;
-webkit-text-fill-color: #5b21b6;
box-shadow: 0 14px 36px rgba(139, 92, 246, 0.14);
}
.ethnic-game-scene {
position: relative;
min-height: 560px;
}
.ethnic-game-scene__screen {
position: relative;
padding: 18px;
border-radius: 30px;
background: rgba(255, 255, 255, 0.94);
box-shadow: 0 28px 60px rgba(7, 13, 34, 0.24);
}
.ethnic-game-scene__hud {
display: flex;
justify-content: space-between;
gap: 10px;
}
.ethnic-game-scene__hud-pill {
display: inline-flex;
align-items: center;
min-height: 32px;
padding: 0 12px;
border-radius: 999px;
background: rgba(139, 92, 246, 0.08);
border: 1px solid rgba(139, 92, 246, 0.12);
color: var(--ethnic-game-accent-dark);
font-size: 12px;
font-weight: 800;
letter-spacing: 0.08em;
line-height: 1;
text-transform: uppercase;
}
.ethnic-game-scene__world {
position: relative;
min-height: 320px;
margin-top: 16px;
border-radius: 26px;
overflow: hidden;
background:
radial-gradient(circle at 30% 24%, rgba(34, 211, 238, 0.18), transparent 20%),
linear-gradient(180deg, #1b2550 0%, #14203d 48%, #0d162a 100%);
}
.ethnic-game-scene__terrain {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 44%;
background:
linear-gradient(180deg, rgba(124, 58, 237, 0), rgba(124, 58, 237, 0.06)),
linear-gradient(135deg, #1f7a4f 0%, #17493d 46%, #0f2d29 100%);
clip-path: polygon(0 58%, 12% 46%, 24% 56%, 37% 42%, 52% 60%, 67% 38%, 78% 50%, 91% 34%, 100% 48%, 100% 100%, 0 100%);
}
.ethnic-game-scene__character-card,
.ethnic-game-scene__analytics {
position: absolute;
border-radius: 22px;
background: rgba(255, 255, 255, 0.12);
border: 1px solid rgba(255, 255, 255, 0.08);
backdrop-filter: blur(12px);
}
.ethnic-game-scene__character-card {
left: 18px;
bottom: 18px;
display: grid;
gap: 8px;
padding: 18px;
max-width: 190px;
}
.ethnic-game-scene__character-card p,
.ethnic-game-scene__analytics small,
.ethnic-game-scene__panel p,
.ethnic-game-overview-board__header p,
.ethnic-game-monetization-board__eyebrow {
margin: 0;
color: rgba(255, 255, 255, 0.74);
font-size: 11px;
font-weight: 800;
letter-spacing: 0.12em;
line-height: 1.3;
text-transform: uppercase;
}
.ethnic-game-scene__character-card strong,
.ethnic-game-scene__analytics strong,
.ethnic-game-scene__panel strong {
color: #ffffff;
font-family: "Plus Jakarta Sans", "Figtree", sans-serif;
}
.ethnic-game-scene__character-card strong {
font-size: 24px;
font-weight: 700;
line-height: 1.05;
}
.ethnic-game-scene__character-card span {
color: rgba(255, 255, 255, 0.84);
font-size: 13px;
font-weight: 600;
line-height: 1.5;
}
.ethnic-game-scene__analytics {
right: 18px;
top: 20px;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
padding: 16px;
min-width: 220px;
}
.ethnic-game-scene__analytics div {
padding: 12px;
border-radius: 18px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.06);
}
.ethnic-game-scene__analytics strong {
display: block;
margin-top: 8px;
font-size: 22px;
font-weight: 700;
line-height: 1.05;
}
.ethnic-game-scene__panel {
position: absolute;
display: grid;
gap: 8px;
padding: 18px;
border-radius: 22px;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.04)),
rgba(12, 18, 37, 0.76);
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 20px 40px rgba(7, 13, 34, 0.18);
}
.ethnic-game-scene__panel strong {
font-size: 15px;
font-weight: 700;
line-height: 1.5;
}
.ethnic-game-scene__panel--engine {
left: -12px;
top: 120px;
max-width: 220px;
}
.ethnic-game-scene__panel--production {
right: -10px;
bottom: 30px;
max-width: 220px;
}
.ethnic-game-scene__panel--production ul {
display: grid;
gap: 10px;
padding: 0;
margin: 0;
list-style: none;
}
.ethnic-game-scene__panel--production li {
position: relative;
padding-left: 20px;
color: rgba(255, 255, 255, 0.78);
font-size: 13px;
font-weight: 600;
line-height: 1.5;
}
.ethnic-game-scene__panel--production li::before {
content: "";
position: absolute;
left: 0;
top: 0.42em;
width: 9px;
height: 9px;
border-radius: 50%;
background: rgba(34, 211, 238, 0.9);
box-shadow: 0 0 0 5px rgba(34, 211, 238, 0.12);
}
.ethnic-game-overview,
.ethnic-game-stack,
.ethnic-game-monetization,
.ethnic-game-art {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(360px, 0.9fr);
gap: clamp(28px, 4vw, 44px);
align-items: start;
}
.ethnic-game-overview__content,
.ethnic-game-stack__copy,
.ethnic-game-monetization__content,
.ethnic-game-art__content,
.ethnic-game-workflow {
display: grid;
gap: 24px;
}
.ethnic-game-card-grid--overview,
.ethnic-game-card-grid--types,
.ethnic-game-card-grid--engine-groups,
.ethnic-game-card-grid--monetization,
.ethnic-game-card-grid--art {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ethnic-game-card-grid--types,
.ethnic-game-card-grid--case-studies {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.ethnic-game-overview-board,
.ethnic-game-toolchain,
.ethnic-game-monetization-board,
.ethnic-game-art-board {
border-radius: 28px;
border: 1px solid var(--ethnic-game-border);
box-shadow: var(--ethnic-game-shadow);
padding: 24px;
background:
radial-gradient(circle at top right, rgba(139, 92, 246, 0.08), transparent 26%),
linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(247, 244, 255, 0.98));
}
.ethnic-game-overview-board__header strong,
.ethnic-game-toolchain__stage strong,
.ethnic-game-workflow-step h3,
.ethnic-game-monetization-board__ring span,
.ethnic-game-art-board__frame strong {
color: var(--ethnic-game-text);
font-family: "Plus Jakarta Sans", "Figtree", sans-serif;
}
.ethnic-game-overview-board__header strong {
display: block;
margin-top: 10px;
font-size: 24px;
font-weight: 700;
line-height: 1.25;
letter-spacing: -0.04em;
}
.ethnic-game-overview-board__lanes,
.ethnic-game-monetization-board__models {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 20px;
}
.ethnic-game-overview-board__lanes span,
.ethnic-game-monetization-board__models span,
.ethnic-game-chip-list span,
.ethnic-game-toolchain__badges span {
display: inline-flex;
align-items: center;
min-height: 32px;
padding: 0 12px;
border-radius: 999px;
background: rgba(139, 92, 246, 0.08);
border: 1px solid rgba(139, 92, 246, 0.12);
color: var(--ethnic-game-accent-dark);
font-size: 12px;
font-weight: 700;
line-height: 1;
}
.ethnic-game-overview-board__stats {
display: grid;
gap: 12px;
margin-top: 20px;
}
.ethnic-game-overview-board__stat {
display: grid;
gap: 8px;
padding: 16px 18px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.82);
border: 1px solid rgba(139, 92, 246, 0.1);
}
.ethnic-game-overview-board__stat strong,
.ethnic-game-monetization-board__ring span {
font-size: 18px;
font-weight: 700;
line-height: 1.1;
}
.ethnic-game-overview-board__stat span {
color: var(--ethnic-game-muted);
font-size: 14px;
line-height: 1.6;
}
.ethnic-game-type-card {
height: 100%;
}
.ethnic-game-card__link {
display: inline-flex;
align-items: center;
gap: 8px;
margin-top: 16px;
color: var(--ethnic-game-accent-dark);
font-size: 14px;
font-weight: 700;
line-height: 1.4;
text-decoration: none;
}
.ethnic-game-card__link::after {
content: "";
width: 7px;
height: 7px;
border-top: 2px solid currentColor;
border-right: 2px solid currentColor;
transform: rotate(45deg);
}
.ethnic-game-type-card__link {
display: inline-flex;
align-items: center;
gap: 8px;
margin-top: 16px;
color: var(--ethnic-game-accent-dark);
font-size: 14px;
font-weight: 700;
line-height: 1.4;
text-decoration: none;
}
.ethnic-game-type-card__link::after {
content: "";
width: 7px;
height: 7px;
border-top: 2px solid currentColor;
border-right: 2px solid currentColor;
transform: rotate(45deg);
}
.ethnic-game-type-card__art {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.ethnic-game-type-card__beam {
width: 64px;
height: 8px;
border-radius: 999px;
background: linear-gradient(90deg, rgba(139, 92, 246, 0.82), rgba(34, 211, 238, 0.72));
box-shadow: 0 0 0 8px rgba(139, 92, 246, 0.06);
}
.ethnic-game-stack__visual {
display: grid;
}
.ethnic-game-toolchain__eyebrow {
display: inline-flex;
align-items: center;
width: fit-content;
min-height: 32px;
margin: 0 0 18px;
padding: 8px 14px;
border-radius: 999px;
background: rgba(139, 92, 246, 0.08);
border: 1px solid rgba(139, 92, 246, 0.12);
color: var(--ethnic-game-accent-dark);
font-size: 11px;
font-weight: 800;
letter-spacing: 0.12em;
line-height: 1;
text-transform: uppercase;
}
.ethnic-game-toolchain__stages {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.ethnic-game-toolchain__stage {
position: relative;
display: grid;
gap: 14px;
padding: 18px;
border-radius: 22px;
background: rgba(255, 255, 255, 0.84);
border: 1px solid rgba(139, 92, 246, 0.1);
}
.ethnic-game-toolchain__stage strong {
font-size: 16px;
font-weight: 700;
line-height: 1.3;
}
.ethnic-game-toolchain__badges,
.ethnic-game-chip-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 18px;
}
.ethnic-game-workflow__rail {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 22px;
align-items: stretch;
}
.ethnic-game-workflow__intro {
max-width: 1000px;
}
.ethnic-game-workflow__intro .ethnic-game-prose {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
}
.ethnic-game-workflow__intro .ethnic-game-prose p {
margin: 0;
padding: 22px 24px;
border-radius: 26px;
border: 1px solid rgba(148, 163, 184, 0.18);
background:
radial-gradient(circle at top right, rgba(34, 211, 238, 0.08), transparent 28%),
linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(244, 247, 255, 0.98));
box-shadow: var(--ethnic-game-shadow);
color: var(--ethnic-game-text-soft);
font-size: 17px;
line-height: 1.75;
}
.ethnic-game-workflow-step {
position: relative;
display: grid;
align-content: start;
gap: 14px;
min-height: 100%;
padding: 24px 24px 26px;
border-radius: 28px;
border: 1px solid var(--ethnic-game-border);
background:
radial-gradient(circle at top right, rgba(34, 211, 238, 0.08), transparent 24%),
linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(246, 243, 255, 0.98));
box-shadow: var(--ethnic-game-shadow);
}
.ethnic-game-workflow-step__number {
display: inline-grid;
place-items: center;
min-width: 46px;
height: 34px;
padding: 0 12px;
border-radius: 999px;
background: rgba(139, 92, 246, 0.08);
color: var(--ethnic-game-accent-dark);
font-size: 12px;
font-weight: 800;
letter-spacing: 0.12em;
line-height: 1;
text-transform: uppercase;
}
.ethnic-game-workflow-step h3 {
margin: 0;
max-width: none;
font-size: clamp(22px, 1.55vw, 29px);
font-weight: 700;
line-height: 1.12;
letter-spacing: -0.05em;
text-wrap: balance;
}
.ethnic-game-workflow-step p {
margin: 0;
color: var(--ethnic-game-text-soft);
font-size: 16px;
line-height: 1.72;
}
.ethnic-game-monetization-board__eyebrow {
display: inline-flex;
align-items: center;
width: fit-content;
min-height: 32px;
padding: 8px 14px;
border-radius: 999px;
background: rgba(139, 92, 246, 0.08);
border: 1px solid rgba(139, 92, 246, 0.12);
color: var(--ethnic-game-accent-dark);
}
.ethnic-game-monetization-board__ring {
position: relative;
display: grid;
place-items: center;
min-height: 280px;
margin-top: 8px;
}
.ethnic-game-monetization-board__ring span {
position: absolute;
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 112px;
min-height: 38px;
padding: 0 14px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.9);
border: 1px solid rgba(139, 92, 246, 0.12);
box-shadow: 0 14px 28px rgba(15, 23, 42, 0.08);
}
.ethnic-game-monetization-board__ring::before {
content: "Player experience";
display: inline-grid;
place-items: center;
width: 150px;
height: 150px;
border-radius: 50%;
background:
radial-gradient(circle at top left, rgba(139, 92, 246, 0.16), transparent 36%),
linear-gradient(180deg, #ffffff, #f5f3ff);
border: 1px solid rgba(139, 92, 246, 0.14);
color: var(--ethnic-game-text);
font-family: "Plus Jakarta Sans", "Figtree", sans-serif;
font-size: 20px;
font-weight: 700;
line-height: 1.1;
text-align: center;
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.08);
}
.ethnic-game-monetization-board__ring span:nth-child(1) {
top: 8px;
}
.ethnic-game-monetization-board__ring span:nth-child(2) {
right: 8px;
}
.ethnic-game-monetization-board__ring span:nth-child(3) {
bottom: 8px;
}
.ethnic-game-monetization-board__ring span:nth-child(4) {
left: 8px;
}
.ethnic-game-art-board {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
.ethnic-game-art-board__frame {
display: grid;
gap: 10px;
padding: 22px;
border-radius: 24px;
border: 1px solid rgba(139, 92, 246, 0.1);
background:
radial-gradient(circle at top right, rgba(34, 211, 238, 0.08), transparent 28%),
linear-gradient(180deg, rgba(255, 255, 255, 0.9), rgba(244, 241, 255, 0.98));
}
.ethnic-game-art-board__frame--character {
grid-column: span 2;
}
.ethnic-game-art-board__frame strong {
font-size: 22px;
font-weight: 700;
line-height: 1.25;
}
.ethnic-game-case-card__tags {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.ethnic-game-case-card__tags span {
display: inline-flex;
align-items: center;
min-height: 32px;
padding: 7px 12px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.78);
font-size: 12px;
font-weight: 700;
line-height: 1;
}
.ethnic-game-case-card__summary {
display: grid;
gap: 12px;
margin-top: 18px;
}
.ethnic-game-case-card__summary p {
margin: 0;
}
.ethnic-game-case-card h3 {
margin: 18px 0 0;
font-family: "Plus Jakarta Sans", "Figtree", sans-serif;
font-size: 22px;
font-weight: 700;
line-height: 1.3;
}
.ethnic-game-section--contrast .ethnic-game-heading__title,
.ethnic-game-section--contrast .ethnic-game-heading__copy,
.ethnic-game-section--contrast .ethnic-game-heading__eyebrow,
.ethnic-game-case-card h3,
.ethnic-game-case-card p,
.ethnic-game-case-card strong {
color: #ffffff !important;
-webkit-text-fill-color: #ffffff;
}
.ethnic-game-case-card {
display: flex;
flex-direction: column;
gap: 16px;
height: 100%;
padding: 24px;
border-radius: 28px;
border: 1px solid rgba(255, 255, 255, 0.08);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03)),
rgba(255, 255, 255, 0.02);
box-shadow: 0 22px 60px rgba(5, 14, 28, 0.2);
}
.ethnic-game-case-card h3 {
margin: 0;
font-size: clamp(24px, 1.9vw, 30px);
line-height: 1.16;
letter-spacing: -0.035em;
text-wrap: balance;
}
.ethnic-game-case-card__tags span {
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.12);
color: rgba(255, 255, 255, 0.92);
letter-spacing: 0.03em;
}
.ethnic-game-case-card__summary p {
color: rgba(255, 255, 255, 0.82) !important;
-webkit-text-fill-color: rgba(255, 255, 255, 0.82);
font-size: 15px;
line-height: 1.72;
}
.ethnic-game-case-card__summary strong {
color: #ffffff !important;
-webkit-text-fill-color: #ffffff;
}
.ethnic-game-case-card .ethnic-game-button--ghost {
align-self: flex-start;
margin-top: auto;
}
.ethnic-game-cta__visual {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
margin-bottom: 18px;
}
.ethnic-game-cta__visual span {
position: relative;
display: block;
height: 18px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.12);
border: 1px solid rgba(255, 255, 255, 0.08);
}
.ethnic-game-cta__visual span::after {
content: "";
position: absolute;
right: -12px;
top: 50%;
width: 12px;
height: 1px;
background: rgba(255, 255, 255, 0.16);
}
.ethnic-game-cta__visual span:last-child::after {
display: none;
}
@media (max-width: 1200px) {
.ethnic-game-overview,
.ethnic-game-stack,
.ethnic-game-monetization,
.ethnic-game-art {
grid-template-columns: 1fr;
}
.ethnic-game-card-grid--types,
.ethnic-game-card-grid--case-studies {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ethnic-game-workflow__intro .ethnic-game-prose {
grid-template-columns: 1fr;
}
.ethnic-game-workflow__rail {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 1024px) {
.ethnic-game-card-grid--overview,
.ethnic-game-card-grid--engine-groups,
.ethnic-game-card-grid--monetization,
.ethnic-game-card-grid--art,
.ethnic-game-toolchain__stages {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 767px) {
.ethnic-game-scene {
min-height: auto;
}
.ethnic-game-scene__analytics,
.ethnic-game-scene__panel--engine,
.ethnic-game-scene__panel--production {
position: static;
margin-top: 16px;
max-width: none;
}
.ethnic-game-scene__analytics {
grid-template-columns: 1fr;
}
.ethnic-game-card-grid--overview,
.ethnic-game-card-grid--types,
.ethnic-game-card-grid--engine-groups,
.ethnic-game-card-grid--monetization,
.ethnic-game-card-grid--art,
.ethnic-game-card-grid--case-studies,
.ethnic-game-toolchain__stages,
.ethnic-game-workflow__rail {
grid-template-columns: 1fr;
}
.ethnic-game-workflow__intro .ethnic-game-prose p {
padding: 20px 20px 21px;
font-size: 16px;
}
.ethnic-game-workflow-step {
padding: 22px 20px 24px;
}
.ethnic-game-workflow-step h3 {
font-size: 24px;
}
.ethnic-game-art-board {
grid-template-columns: 1fr;
}
.ethnic-game-art-board__frame--character {
grid-column: auto;
}
.ethnic-game-monetization-board__ring {
min-height: 420px;
}
.ethnic-game-monetization-board__ring span:nth-child(1) {
top: 12px;
}
.ethnic-game-monetization-board__ring span:nth-child(2) {
right: 50%;
top: 92px;
transform: translateX(50%);
}
.ethnic-game-monetization-board__ring span:nth-child(3) {
bottom: 12px;
}
.ethnic-game-monetization-board__ring span:nth-child(4) {
left: 50%;
bottom: 92px;
transform: translateX(-50%);
}
.ethnic-game-cta__visual span::after {
display: none;
}
}
CSS;
}
}
if ( ! function_exists( 'ethnic_game_development_page_body_class' ) ) {
function ethnic_game_development_page_body_class( $classes ) {
if ( ethnic_game_development_page_is_target() ) {
$classes[] = 'ethnic-game-development-target';
}
return $classes;
}
add_filter( 'body_class', 'ethnic_game_development_page_body_class' );
}
if ( ! function_exists( 'ethnic_game_development_page_print_head_assets' ) ) {
function ethnic_game_development_page_print_head_assets() {
if ( ! ethnic_game_development_page_is_target() ) {
return;
}
$data = ethnic_game_development_page_data();
?>
<style id="ethnic-game-development-page-inline-css" type="text/css">
<?php echo ethnic_game_development_page_styles(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
</style>
<meta name="description" content="<?php echo esc_attr( $data['metaDescription'] ); ?>" />
<?php
}
add_action( 'wp_head', 'ethnic_game_development_page_print_head_assets', 120 );
}
if ( ! function_exists( 'ethnic_game_development_page_document_title' ) ) {
function ethnic_game_development_page_document_title( $title ) {
if ( ethnic_game_development_page_is_target() ) {
$data = ethnic_game_development_page_data();
return $data['metaTitle'];
}
return $title;
}
add_filter( 'pre_get_document_title', 'ethnic_game_development_page_document_title', 50 );
}
if ( ! function_exists( 'ethnic_game_development_page_replace_content' ) ) {
function ethnic_game_development_page_replace_content( $content ) {
if ( ! ethnic_game_development_page_is_target() || ! in_the_loop() || ! is_main_query() ) {
return $content;
}
static $rendered = false;
if ( $rendered ) {
return $content;
}
$rendered = true;
return ethnic_game_development_page_render();
}
add_filter( 'the_content', 'ethnic_game_development_page_replace_content', 1000 );
}