Help
RSS
API
Feed
Maltego
Contact
Domain > bentleypc.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2024-11-28
3.166.135.125
(
ClassC
)
2025-11-15
3.169.173.110
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Sat, 15 Nov 2025 23:24:28 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://bentleypc.com/X-Cache: Redirect from cloudfrontVia: 1.1 08437041a08295a47ee88412dbd8c35a.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: tN8lykuwPEeuJtedh0RXmq4lmmJwWqQrly6k2HvMZdwPtSV_ZWROGw html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 160251Connection: keep-aliveDate: Sat, 15 Nov 2025 23:24:29 GMTLast-Modified: Fri, 27 Dec 2024 12:29:59 GMTETag: 7d20f6dd2fd7cd6cd5374640c04d8a4eServer: AmazonS3X-Cache: Miss from cloudfrontVia: 1.1 7d14d4fc1c149f1d429681a4c414c21a.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: AVyLsp6Pe6c4zu_YrTXn6lYMmH3KKx2GiiArYVrq-4V8HZN3qJJI3g !DOCTYPE html>html langen>head> !-- Google Tag Manager --> script>(function(w,d,s,l,i){wlwl||;wl.push({gtm.start: new Date().getTime(),event:gtm.js});var fd.getElementsByTagName(s)0, jd.createElement(s),dll!dataLayer?&l+l:;j.asynctrue;j.src https://www.googletagmanager.com/gtm.js?id+i+dl;f.parentNode.insertBefore(j,f); })(window,document,script,dataLayer,GTM-WVSK6HR8);/script> !-- End Google Tag Manager --> !-- Google tag (gtag.js) --> script async srchttps://www.googletagmanager.com/gtag/js?idG-13PR3SF82X>/script> script> window.dataLayer window.dataLayer || ; function gtag(){dataLayer.push(arguments);} gtag(js, new Date()); gtag(config, G-13PR3SF82X); /script> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>BentleyPC - Big Data IT Solutions/title> link relicon typeimage/x-icon href/favicon.ico> link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css> style> /* Header and Navigation Styles */ header { background-color: #fff; box-shadow: 0 2px 5px rgba(0,0,0,0.1); position: fixed; width: 100%; top: 0; z-index: 1000; } .header-content { max-width: 1200px; margin: 0 auto; padding: 1rem; display: flex; justify-content: space-between; align-items: center; } nav { position: relative; } nav ul { list-style: none; display: flex; flex-wrap: wrap; gap: 1.5rem; justify-content: flex-end; padding: 0.5rem; } nav ul li { position: relative; } nav ul li a { text-decoration: none; color: var(--dark-gray); font-weight: 500; padding: 0.5rem 0.75rem; transition: all 0.3s ease; position: relative; display: inline-block; } nav ul li a::after { content: ; position: absolute; width: 100%; height: 2px; bottom: 0; left: 0; background-color: var(--primary-color); transform: scaleX(0); transform-origin: bottom right; transition: transform 0.3s ease; } nav ul li a:hover { color: var(--primary-color); } nav ul li a:hover::after { transform: scaleX(1); transform-origin: bottom left; } nav ul li a.active { color: var(--primary-color); } nav ul li a.active::after { transform: scaleX(1); } @media (max-width: 768px) { .header-content { padding: 0.5rem; flex-direction: column; align-items: center; } .logo { margin-bottom: 0.5rem; } nav { width: 100%; margin: 0; } nav ul { gap: 0.2rem; padding: 0; margin: 0; justify-content: center; flex-wrap: wrap; width: 100%; } nav ul li { margin: 0; } nav ul li a { font-size: 0.75rem; padding: 0.3rem 0.4rem; white-space: nowrap; } } /* Reset and Base Styles */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; } /* Color Scheme */ :root { --primary-color: #Ad56b3; --secondary-color: #004085; --accent-color: #28a745; --light-gray: #f8f9fa; --dark-gray: #343a40; } /* Header Styles */ header { /* Base styles for desktop */ .header-content { max-width: 1200px; margin: 0 auto; padding: 1rem; display: flex; justify-content: space-between; align-items: center; } nav ul { list-style: none; display: flex; flex-wrap: wrap; gap: 1.5rem; justify-content: flex-end; padding: 0.5rem; } .hero { background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); color: white; padding: 8rem 2rem 4rem; text-align: center; } .hero h1 { font-size: 2.5rem; margin-bottom: 1rem; } .hero p { font-size: 1.2rem; max-width: 800px; margin: 0 auto; } .services { padding: 4rem 2rem; background-color: var(--light-gray); } .services-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 2rem; max-width: 1200px; margin: 0 auto; } .service-card { background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); text-align: center; transition: transform 0.3s ease, box-shadow 0.3s ease; } .section-header { text-align: center; margin-bottom: 3rem; } .section-header h2 { font-size: 2rem; color: var(--primary-color); margin-bottom: 1rem; } /* Mobile Styles */ @media (max-width: 768px) { .header-content { padding: 0.5rem; flex-direction: column; align-items: center; } .logo { margin-bottom: 0.5rem; } nav { width: 100%; margin: 0; } nav ul { gap: 0.2rem; padding: 0; margin: 0; justify-content: center; flex-wrap: wrap; width: 100%; } nav ul li { margin: 0; } nav ul li a { font-size: 0.75rem; padding: 0.3rem 0.4rem; white-space: nowrap; } .hero { padding: 7rem 1rem 3rem; } .hero h1 { font-size: 2rem; } .services-grid { grid-template-columns: 1fr; } } } } @media (max-width: 992px) { .header-content { padding: 1rem 0.5rem; } nav { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE and Edge */ } nav::-webkit-scrollbar { display: none; /* Chrome, Safari, Opera */ } nav ul { flex-wrap: nowrap; padding-bottom: 0.5rem; } } /* Add subtle indicator for scrollable menu on mobile */ @media (max-width: 992px) { nav::after { content: ; position: absolute; top: 0; right: 0; height: 100%; width: 30px; background: linear-gradient(to right, transparent, rgba(255,255,255,0.9)); pointer-events: none; opacity: 0; transition: opacity 0.3s ease; } nav.scroll-available::after { opacity: 1; } } /* Hero Section */ .hero { background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); color: white; padding: 8rem 2rem 4rem; text-align: center; } .hero h1 { font-size: 2.5rem; margin-bottom: 1rem; } .hero p { font-size: 1.2rem; max-width: 800px; margin: 0 auto; } /* Services Section */ .services { padding: 4rem 2rem; background-color: var(--light-gray); } /* Consistent Grid Layouts */ .grid-layout { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 2rem; width: 100%; } @media (max-width: 576px) { .grid-layout { grid-template-columns: 1fr; } } .services-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 2rem; max-width: 1200px; margin: 0 auto; } .service-card { background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); text-align: center; transition: transform 0.3s ease, box-shadow 0.3s ease; } .icon-card { text-align: center; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease; background: var(--light-gray); } .icon-card i { font-size: 2rem; color: var(--primary-color); margin-bottom: 1rem; display: block; } .icon-card:hover { transform: translateY(-5px); } .service-card:hover { transform: translateY(-5px); box-shadow: 0 4px 15px rgba(0,0,0,0.15); } .service-card i { font-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem; } /* About Section */ .about { padding: 4rem 2rem; max-width: 1200px; margin: 0 auto; } /* Contact Section */ .contact { padding: 4rem 2rem; background-color: white; } .contact-content { max-width: 800px; margin: 0 auto; } .contact form { display: grid; gap: 1rem; } .form-group { display: grid; gap: 0.5rem; } input, textarea { padding: 0.8rem; border: 1px solid #ddd; border-radius: 4px; width: 100%; } button { background-color: var(--primary-color); color: white; padding: 0.8rem 2rem; border: none; border-radius: 4px; cursor: pointer; font-size: 1rem; } button:hover { background-color: var(--secondary-color); } /* Footer */ footer { background-color: var(--dark-gray); color: white; padding: 2rem; text-align: center; } /* Easter Egg Modal */ .modal { display: none; position: fixed; z-index: 9999; /* Ensure its above everything */ left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.9); } .modal-content { position: relative; margin: auto; padding: 0; width: 95%; max-width: 800px; /* Increased for missile command */ height: auto; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; } /* Game Selection */ .game-selector { position: absolute; top: -40px; left: 10px; z-index: 2001; } .game-selector button { background: none; border: none; color: #f1f1f1; font-size: 16px; cursor: pointer; margin-right: 15px; padding: 5px 10px; } .game-selector button.active { color: var(--primary-color); border-bottom: 2px solid var(--primary-color); } /* Missile Command Specific Styles */ #missileCommand { display: none; } #missileCommand canvas { cursor: crosshair; border: 1px solid white; width: 100%; height: 550px; } .close-modal { position: absolute; right: 10px; top: -40px; color: #f1f1f1; font-size: 30px; font-weight: bold; cursor: pointer; z-index: 2001; } .close-modal:hover { color: var(--primary-color); } .game-container { width: 100%; background-color: black; position: relative; overflow: visible; /* Changed from hidden to visible */ display: flex; flex-direction: column; align-items: center; justify-content: center; } #jsdos { width: 100%; height: 100%; background-color: black; } #jsdos canvas { width: 100% !important; height: 100% !important; image-rendering: pixelated; } /* Section Headers */ .section-header { text-align: center; margin-bottom: 3rem; } .section-header h2 { color: var(--primary-color); margin-bottom: 1rem; } /* Responsive Design */ (max-width: 768px) { .header-content { padding: 0.5rem; } nav { margin-top: 0; } nav ul { gap: 0.3rem; padding: 0; margin: 0; flex-wrap: nowrap; } nav ul li { margin: 0; } nav ul li a { font-size: 0.75rem; padding: 0.25rem 0.35rem; white-space: nowrap; } } } /style>/head>body> !-- Google Tag Manager (noscript) --> noscript>iframe srchttps://www.googletagmanager.com/ns.html?idGTM-WVSK6HR8 height0 width0 styledisplay:none;visibility:hidden>/iframe>/noscript> !-- End Google Tag Manager (noscript) --> header> div classcontainer> div classheader-content> div classlogo> a hrefjavascript:void(0) styletext-decoration: none; color: var(--secondary-color); display: flex; align-items: center; transition: opacity 0.3s ease;> img srclogo.svg altBentleyPC Logo styleheight: 40px; margin-right: 10px;> h1>BentleyPC/h1> /a> /div> nav> ul> li>a href#bigdata>Big Data/a>/li> li>a href#cloud>Cloud/a>/li> li>a href#security>Security/a>/li> li>a href#development>Development/a>/li> li>a href#schedule>Schedule/a>/li> li>a href#contact>Contact/a>/li> li>a href#awards>Awards/a>/li> li>a href#about>About/a>/li> /ul> /nav> /div> /div> /header> !-- Hero Section --> section classhero> h1>Big Data IT Solutions/h1> p>Transforming your business through innovative data solutions and cloud technology expertise/p> /section> !-- Services Section --> section idservices classservices> div classsection-header> h2>Our Services/h2> p>Comprehensive solutions for your IT needs/p> /div> div classservices-grid> a href#bigdata styletext-decoration: none; color: inherit;> div classservice-card stylecursor: pointer; transition: transform 0.3s ease;> i classfas fa-database>/i> h3>Big Data Analytics/h3> p>Transform your data into actionable insights with our advanced analytics solutions/p> /div> /a> a href#cloud styletext-decoration: none; color: inherit;> div classservice-card stylecursor: pointer; transition: transform 0.3s ease;> i classfas fa-cloud>/i> h3>Cloud Solutions/h3> p>Scalable and secure cloud infrastructure designed for your business needs/p> /div> /a> a href#security styletext-decoration: none; color: inherit;> div classservice-card stylecursor: pointer; transition: transform 0.3s ease;> i classfas fa-shield-alt>/i> h3>Security Solutions/h3> p>Protect your assets with our comprehensive security solutions/p> /div> /a> a href#development styletext-decoration: none; color: inherit;> div classservice-card stylecursor: pointer; transition: transform 0.3s ease;> i classfas fa-code>/i> h3>Custom Development/h3> p>Tailored software solutions to meet your specific requirements/p> /div> /a> /div> /section> !-- Big Data Analytics Section --> section idbigdata classbigdata stylepadding: 4rem 2rem; background-color: var(--light-gray);> div classsection-header> h2>Big Data Analytics/h2> p>Harness the power of your data with our specialized tools and expertise/p> /div> div stylemax-width: 1200px; margin: 0 auto;> div classgrid-layout stylemargin-top: 3rem;> div classicon-card> i classfas fa-greater-than>/i> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Splunk/h3> p>Advanced data analytics and monitoring platform for machine-generated big data. Real-time insights, powerful search capabilities, and comprehensive operational intelligence./p> /div> div classicon-card> i classfas fa-stream>/i> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Cribl/h3> p>Innovative data pipeline management and optimization. Shape, route, and transform data streams while significantly reducing storage and analysis costs./p> /div> div classicon-card> i classfas fa-search>/i> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Elasticsearch/h3> p>Distributed search and analytics engine. Perfect for complex search operations, log analytics, and full-text search capabilities with impressive scalability./p> /div> div classicon-card> i classfas fa-database>/i> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>NIFI/h3> p>Apache NiFi automation for data flow management between systems. Design, control, and monitor your data flows with an intuitive web interface./p> /div> /div> div styletext-align: center; margin-top: 3rem;> p stylefont-size: 1.2rem; max-width: 800px; margin: 0 auto; margin-bottom: 2rem;> Our expertise in these leading platforms enables us to deliver comprehensive big data solutions tailored to your specific needs. From data ingestion to analysis and visualization, we ensure you get the most value from your data. /p> a href#schedule styledisplay: inline-block; background-color: var(--primary-color); color: white; padding: 1rem 2rem; border-radius: 4px; text-decoration: none; font-weight: 500; transition: background-color 0.3s ease;> Discuss Your Big Data Needs /a> /div> /div> /section> !-- Cloud Solutions Section --> section idcloud classcloud stylepadding: 4rem 2rem; background-color: white;> div classsection-header> h2>Cloud Solutions/h2> p>Comprehensive cloud expertise across multiple platforms and architectures/p> /div> div stylemax-width: 1200px; margin: 0 auto;> div stylemargin-bottom: 2rem;> h3 stylecolor: var(--primary-color); margin-bottom: 1rem; text-align: center;>Major Cloud Platforms/h3> div styledisplay: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem;> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfab fa-aws>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Amazon Web Services/h3> p>Expert implementation and management of AWS services including EC2, S3, RDS, Lambda, and more. Specializing in scalable, secure, and cost-effective cloud architectures./p> /div> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfab fa-microsoft>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Microsoft Azure/h3> p>Comprehensive Azure cloud solutions including Virtual Machines, App Services, Azure SQL, and Azure Active Directory. Seamless integration with existing Microsoft infrastructure./p> /div> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfab fa-google>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Google Cloud Platform/h3> p>GCP implementation expertise including Compute Engine, Cloud Storage, BigQuery, and Kubernetes Engine. Leverage Googles cutting-edge technology for your business./p> /div> /div> /div> div stylemargin-bottom: 4rem;> h3 stylecolor: var(--primary-color); margin-bottom: 1rem; text-align: center;>Specialized Cloud Solutions/h3> div styledisplay: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem;> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-stream>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Cribl Cloud/h3> p>Expert deployment and management of Cribl Cloud for optimal data processing and routing. Maximize your observability pipeline with cloud-native stream processing and data collection./p> /div> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-chart-line>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Splunk Cloud/h3> p>Full-service implementation and optimization of Splunk Cloud Platform. Leverage cloud-native capabilities for real-time data analytics, monitoring, and insights at any scale./p> /div> /div> /div> div stylemargin-top: 4rem; background: white; padding: 3rem; border-radius: 8px; text-align: center;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-server>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>On-Premises Hyperconverged Cloud/h3> p stylemax-width: 800px; margin: 0 auto; margin-bottom: 2rem;> Custom-built hyperconverged infrastructure solutions that bring cloud capabilities to your data center. Seamlessly integrate computation, storage, networking, and virtualization in a single system. Perfect for organizations requiring complete control over their infrastructure while maintaining cloud-like flexibility. /p> div classgrid-layout stylemargin-top: 2rem;> div classicon-card> i classfas fa-tachometer-alt>/i> h4 stylemargin: 1rem 0;>High Performance/h4> p>Optimized for maximum speed and efficiency/p> /div> div classicon-card> i classfas fa-shield-alt>/i> h4 stylemargin: 1rem 0;>Enhanced Security/h4> p>Complete control over your data and infrastructure/p> /div> div classicon-card> i classfas fa-expand-arrows-alt>/i> h4 stylemargin: 1rem 0;>Scalable/h4> p>Easily expand resources as needed/p> /div> /div> /div> div styletext-align: center; margin-top: 3rem;> p stylefont-size: 1.2rem; max-width: 800px; margin: 0 auto; margin-bottom: 2rem;> Whether youre looking to migrate to the cloud, optimize your existing cloud infrastructure, or build a hybrid solution, our team has the expertise to guide you through every step of the journey. /p> a href#schedule styledisplay: inline-block; background-color: var(--primary-color); color: white; padding: 1rem 2rem; border-radius: 4px; text-decoration: none; font-weight: 500; transition: background-color 0.3s ease;> Discuss Your Cloud Strategy /a> /div> /div> /section> !-- Security Solutions Section --> section idsecurity classsecurity stylepadding: 4rem 2rem; background-color: var(--light-gray);> div classsection-header> h2>Security Solutions/h2> p>Comprehensive security and threat management for your enterprise/p> /div> div stylemax-width: 1200px; margin: 0 auto;> div styledisplay: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; margin-top: 3rem;> div classanalytics-platform stylebackground: var(--light-gray); padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-shield-alt>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>SIEM/h3> p>Security Information and Event Management solutions for comprehensive threat detection, incident response, and compliance management across your enterprise./p> /div> div classanalytics-platform stylebackground: var(--light-gray); padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-lock>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Splunk Enterprise Security/h3> p>Advanced security analytics and operations platform providing real-time visibility, threat intelligence, and automated response capabilities for your security operations center./p> /div> div classanalytics-platform stylebackground: var(--light-gray); padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-robot>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Splunk SOAR/h3> p>Security Orchestration, Automation and Response platform that streamlines security operations, automates incident response, and accelerates threat mitigation./p> /div> /div> div styledisplay: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; margin-top: 2rem;> div classanalytics-platform stylebackground: var(--light-gray); padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-cogs>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>XSOAR/h3> p>Palo Altos Extended Security Orchestration, Automation and Response platform for unified incident management, automation, and real-time collaboration./p> /div> div classanalytics-platform stylebackground: var(--light-gray); padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfas fa-check-circle>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>FedRAMP/h3> p>Federal Risk and Authorization Management Program compliance expertise. Secure cloud solutions meeting strict government security requirements and standards./p> /div> /div> div styletext-align: center; margin-top: 3rem;> p stylefont-size: 1.2rem; max-width: 800px; margin: 0 auto; margin-bottom: 2rem;> Our comprehensive security solutions integrate seamlessly to provide multi-layered protection, automated response capabilities, and compliance assurance for your organization. /p> a href#schedule styledisplay: inline-block; background-color: var(--primary-color); color: white; padding: 1rem 2rem; border-radius: 4px; text-decoration: none; font-weight: 500; transition: background-color 0.3s ease;> Discuss Your Security Needs /a> /div> /div> /section> !-- Custom Development Section --> section iddevelopment classdevelopment stylepadding: 4rem 2rem; background-color: white;> div classsection-header> h2>Custom Development/h2> p>Secure, efficient, and tailored software solutions/p> /div> div stylemax-width: 1200px; margin: 0 auto;> !-- Core Expertise --> div styletext-align: center; margin-bottom: 3rem;> div styledisplay: inline-block; padding: 2rem; background-color: white; border-radius: 8px; margin-bottom: 2rem; max-width: 800px;> div styledisplay: flex; align-items: center; gap: 1rem; margin-bottom: 1rem;> i classfas fa-shield-alt stylecolor: var(--primary-color); font-size: 2.5rem;>/i> h3 stylecolor: var(--primary-color); margin: 0;>Software Security Practitioner - Defending Python/h3> /div> p stylemargin: 1rem 0; text-align: left;>Certified by Security Compass, our team has mastered secure software coding and design techniques, with expertise in defending against OWASP Top 10 vulnerabilities in Python applications. This certification demonstrates our commitment to implementing robust security measures in all our Python development work./p> a hrefhttps://www.credly.com/badges/898ea933-530e-4466-adb7-eb89af2b3730 target_blank styledisplay: inline-flex; align-items: center; gap: 0.5rem; color: var(--primary-color); text-decoration: none; font-weight: 500;> i classfas fa-external-link-alt>/i> View Certificate /a> /div> /div> !-- Main Languages --> div stylemargin-bottom: 4rem;> h3 stylecolor: var(--primary-color); margin-bottom: 1rem; text-align: center;>Core Technologies/h3> div styledisplay: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 2rem;> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfab fa-python>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Python Development/h3> p>Expert secure Python development specializing in Splunk apps and custom solutions. Building robust, secure, and scalable applications for diverse IT challenges./p> /div> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfab fa-node-js>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>Node.js & JavaScript/h3> p>Custom Cribl functions and filters development. Full-stack capabilities with modern JavaScript frameworks and Node.js for efficient data processing solutions./p> /div> div classanalytics-platform stylebackground: white; padding: 2rem; border-radius: 8px; transition: transform 0.3s ease;> div stylefont-size: 2.5rem; color: var(--primary-color); margin-bottom: 1rem;> i classfab fa-aws>/i> /div> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>AWS Lambda & APIs/h3> p>Serverless application development with AWS Lambda. Expert integration of AWS services through custom API development and implementation./p> /div> /div> /div> !-- Additional Languages --> div stylebackground: white; padding: 3rem; border-radius: 8px; margin-bottom: 3rem;> h3 stylecolor: var(--primary-color); margin-bottom: 2rem; text-align: center;>Additional Expertise/h3> div classgrid-layout> div classicon-card> i classfas fa-terminal>/i> h4 stylemargin: 1rem 0;>Bash Scripting/h4> p>Automation and system administration scripts/p> /div> div classicon-card> i classfab fa-windows>/i> h4 stylemargin: 1rem 0;>PowerShell/h4> p>Windows automation and management scripts/p> /div> div classicon-card> i classfas fa-code>/i> h4 stylemargin: 1rem 0;>C & C#/h4> p>System-level programming and .NET applications/p> /div> /div> /div> !-- Development Process --> div stylebackground: white; padding: 3rem; border-radius: 8px; text-align: center;> h3 stylecolor: var(--primary-color); margin-bottom: 2rem;>Our Development Process/h3> div classgrid-layout> div classicon-card> i classfas fa-search>/i> h4 stylemargin: 1rem 0;>Requirements Analysis/h4> p>Thorough understanding of your needs/p> /div> div classicon-card> i classfas fa-shield-alt>/i> h4 stylemargin: 1rem 0;>Secure Design/h4> p>Security-first architecture planning/p> /div> div classicon-card> i classfas fa-code-branch>/i> h4 stylemargin: 1rem 0;>Development/h4> p>Efficient and secure implementation/p> /div> div classicon-card> i classfas fa-check-double>/i> h4 stylemargin: 1rem 0;>Testing/h4> p>Comprehensive security and functionality testing/p> /div> /div> /div> div styletext-align: center; margin-top: 3rem;> p stylefont-size: 1.2rem; max-width: 800px; margin: 0 auto; margin-bottom: 2rem;> From secure Python applications to custom Cribl functions, we deliver robust solutions that meet your specific requirements while maintaining the highest security standards. /p> a href#schedule styledisplay: inline-block; background-color: var(--primary-color); color: white; padding: 1rem 2rem; border-radius: 4px; text-decoration: none; font-weight: 500; transition: background-color 0.3s ease;> Discuss Your Development Needs /a> /div> /div> /section> !-- Schedule Section --> section idschedule classschedule stylepadding: 4rem 2rem; background-color: var(--light-gray);> div classsection-header> h2>Schedule Time With Us/h2> p>Book a consultation with our team/p> /div> !-- Calendly inline widget begin --> style> /* Header and Navigation Styles */ header { background-color: #fff; box-shadow: 0 2px 5px rgba(0,0,0,0.1); position: fixed; width: 100%; top: 0; z-index: 1000; } .header-content { max-width: 1200px; margin: 0 auto; padding: 1rem; display: flex; justify-content: space-between; align-items: center; } nav { position: relative; } nav ul { list-style: none; display: flex; flex-wrap: wrap; gap: 1.5rem; justify-content: flex-end; padding: 0.5rem; } nav ul li { position: relative; } nav ul li a { text-decoration: none; color: var(--dark-gray); font-weight: 500; padding: 0.5rem 0.75rem; transition: all 0.3s ease; position: relative; display: inline-block; } nav ul li a::after { content: ; position: absolute; width: 100%; height: 2px; bottom: 0; left: 0; background-color: var(--primary-color); transform: scaleX(0); transform-origin: bottom right; transition: transform 0.3s ease; } nav ul li a:hover { color: var(--primary-color); } nav ul li a:hover::after { transform: scaleX(1); transform-origin: bottom left; } nav ul li a.active { color: var(--primary-color); } nav ul li a.active::after { transform: scaleX(1); } @media (max-width: 768px) { .header-content { padding: 0.5rem; flex-direction: column; align-items: center; } .logo { margin-bottom: 0.5rem; } nav { width: 100%; margin: 0; } nav ul { gap: 0.2rem; padding: 0; margin: 0; justify-content: center; flex-wrap: wrap; width: 100%; } nav ul li { margin: 0; } nav ul li a { font-size: 0.75rem; padding: 0.3rem 0.4rem; white-space: nowrap; } } @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.2); opacity: 0.7; } 100% { transform: scale(1); opacity: 1; } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .loading-container { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; background-color: white; border-radius: 8px; padding: 2rem; height: 600px; overflow: hidden; } .loading-icons { position: relative; width: 400px; height: 400px; display: flex; align-items: center; justify-content: center; } .calendar-icon { position: absolute; font-size: 400px; color: var(--primary-color); animation: pulse 2s infinite ease-in-out; display: flex; align-items: center; justify-content: center; line-height: 1; } .loading-spinner { position: absolute; font-size: 440px; color: var(--secondary-color); animation: spin 2s infinite linear; opacity: 0.5; display: flex; align-items: center; justify-content: center; line-height: 1; margin-top: -20px; /* Adjust centering */ } .loading-text { color: var(--primary-color); font-size: 1.2rem; font-weight: 500; text-align: center; } /style> div idcalendlyLoading stylemin-width:320px;height:700px;display:flex;align-items:center;justify-content:center;> div classloading-container> div classloading-icons> i classfar fa-calendar-alt calendar-icon>/i> i classfas fa-circle-notch loading-spinner>/i> /div> div classloading-text> Loading Calendar... /div> /div> /div> div classcalendly-inline-widget data-urlhttps://calendly.com/bentleypc/30min stylemin-width:320px;height:700px;display:none;>/div> script> // Initialize Calendly function initCalendly() { // Create script element var script document.createElement(script); script.src https://assets.calendly.com/assets/external/widget.js; script.onload function() { // Once script is loaded, wait a moment for widget initialization setTimeout(function() { var loadingElement document.getElementById(calendlyLoading); var widgetElement document.querySelector(.calendly-inline-widget); if (loadingElement && widgetElement) { loadingElement.style.display none; widgetElement.style.display block; } }, 1000); // Wait 1 second after script loads }; document.body.appendChild(script); } // Initialize when document is ready if (document.readyState loading) { document.addEventListener(DOMContentLoaded, initCalendly); } else { initCalendly(); } // Backup check in case the onload event doesnt fire setTimeout(function() { var loadingElement document.getElementById(calendlyLoading); var widgetElement document.querySelector(.calendly-inline-widget); if (loadingElement && loadingElement.style.display ! none) { loadingElement.style.display none; widgetElement.style.display block; } }, 5000); // Fallback after 5 seconds /script> !-- Calendly inline widget end --> /section> !-- Contact Section --> section idcontact classcontact stylepadding: 4rem 2rem; background-color: white;> div classsection-header> h2>Contact Us/h2> p>Get in touch with our team/p> /div> div classcontact-content> form idcontactForm> div classform-group> label forname>Name/label> input typetext idname required> /div> div classform-group> label foremail>Email/label> input typeemail idemail required> /div> div classform-group> label formessage>Message/label> textarea idmessage rows5 required>/textarea> /div> button typesubmit>Send Message/button> /form> /div> /section> !-- Industry Awards Section --> section idawards classawards stylepadding: 4rem 2rem; background-color: var(--light-gray);> div classsection-header> h2>Industry Awards/h2> p>Recognition for Excellence in Enterprise IT Solutions/p> /div> div stylemax-width: 1200px; margin: 0 auto;> div stylebackground: white; padding: 3rem; border-radius: 8px; text-align: center;> img srcimages/splunk-revolution-award.png altSplunk Revolution Award stylemax-width: 440px; width: 100%; height: auto; margin-bottom: 2rem;> div stylemax-width: 800px; margin: 0 auto;> h3 stylecolor: var(--primary-color); margin-bottom: 1rem;>2018 Splunk Revolution Ecosystem Award Winner/h3> p stylemargin-bottom: 2rem;> Proud member of the Splunk Trust since 2016, contributing to the Splunk community with expertise and innovation in enterprise security solutions. /p> blockquote stylemargin: 2rem auto; padding: 1.5rem; border-left: 4px solid var(--primary-color); background-color: var(--light-gray); text-align: left; max-width: 700px; font-style: italic;> As a Splunk reseller, Michael is a strong business enabler and Splunk enthusiast for customers, as he develops custom integrations and software development lifecycle best practices to support unique, large enterprise security concerns. footer stylemargin-top: 0.5rem; font-style: normal; color: var(--dark-gray);>— Splunk Revolution Awards, 2018/footer> /blockquote> a hrefhttps://www.splunk.com/en_us/blog/conf-splunklive/announcing-our-2018-splunk-revolution-award-winners.html target_blank styledisplay: inline-flex; align-items: center; gap: 0.5rem; color: var(--primary-color); text-decoration: none; font-weight: 500;> i classfas fa-external-link-alt>/i> Read the Full Story /a> /div> /div> /div> /section> !-- About Section --> section idabout classabout stylepadding: 4rem 2rem; background-color: white;> div classsection-header> h2>About Us/h2> p>Your trusted partner in IT solutions/p> /div> div classabout-content> p>BentleyPC is an S Corporation based in Atlanta, Georgia, specializing in Big Data IT Solutions. With years of experience in the industry, we provide cutting-edge technology solutions to help businesses thrive in the digital age. Our team of experts is dedicated to delivering excellence in every project, ensuring that our clients receive the highest quality service and support./p> /div> /section> !-- Footer --> footer> p>© 2024 BentleyPC. All rights reserved./p> /footer> !-- Easter Egg Modal --> div idgameModal classmodal> div classmodal-content> span classclose-modal>×/span> div classgame-selector> button onclickswitchGame(dos) classactive>DOS Game/button> button onclickswitchGame(missile)>Missile Command/button> /div> div classgame-container> div idjsdos>/div> div idmissileCommand> canvas width800 height550 idgame>/canvas> /div> /div> /div> /div> !-- Game Scripts --> script> // Game switching function function switchGame(game) { const dosGame document.getElementById(jsdos); const missileGame document.getElementById(missileCommand); const buttons document.querySelectorAll(.game-selector button); // Update button states buttons.forEach(btn > btn.classList.remove(active)); event.target.classList.add(active); // Show selected game if (game dos) { dosGame.style.display block; missileGame.style.display none; } else { dosGame.style.display none; missileGame.style.display block; // Restart missile command if needed if (typeof restartMissileCommand function) { restartMissileCommand(); } } } // Missile Command Game Code const canvas document.getElementById(game); const context canvas.getContext(2d); const groundY 500; const cityWidth 45; const cityHeight 25; const cityY groundY - cityHeight; const siloY groundY - 30; const missileSize 4; const missileSpeed 1; const counterMissileSpeed 15; let missiles ; let counterMissiles ; let explosions ; let currLevel 0; let currInterval 0; const levels 4, 4 ; let cities { x: 140, y: cityY, alive: true }, { x: 220, y: cityY, alive: true }, { x: 300, y: cityY, alive: true }, { x: 500, y: cityY, alive: true }, { x: 580, y: cityY, alive: true }, { x: 660, y: cityY, alive: true } ; const siloPos 55, canvas.width / 2, 745 ; let silos { x: siloPos0, y: siloY, missiles: 10, alive: true }, { x: siloPos1, y: siloY, missiles: 10, alive: true }, { x: siloPos2, y: siloY, missiles: 10, alive: true } ; const missileSpawns cities .concat(silos) .concat({ x: 0, y: 0 }, { x: canvas.width, y: 0 }) .map(pos > ({ x: pos.x, y: 0 })); function randInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function angleBetweenPoints(source, target) { return Math.atan2(target.y - source.y, target.x - source.x) + Math.PI / 2; } function distance(source, target) { return Math.hypot(source.x - target.x, source.y - target.y); } function spawnMissile() { const targets cities.concat(silos); const randSpawn randInt(0, missileSpawns.length - 1); const randTarget randInt(0, targets.length - 1); const start missileSpawnsrandSpawn; const target targetsrandTarget; const angle angleBetweenPoints(start, target); missiles.push({ start, target, pos: { x: start.x, y: start.y }, alive: true, dx: missileSpeed * Math.sin(angle), dy: missileSpeed * -Math.cos(angle) }); } let lastTime -2000; let gameLoop; function loop(time) { gameLoop requestAnimationFrame(loop); context.clearRect(0,0,canvas.width,canvas.height); if (time - lastTime > 3000 && currInterval levelscurrLevel.length) { for (let i 0; i levelscurrLevelcurrInterval; i++) { spawnMissile(); } currInterval++; lastTime time; } // Draw cities context.fillStyle blue; cities.forEach(city > { context.fillRect(city.x - cityWidth / 2, city.y, cityWidth, cityHeight); }); // Draw ground and silos context.fillStyle yellow; context.beginPath(); context.moveTo(0, canvas.height); context.lineTo(0, groundY); siloPos.forEach(x > { context.lineTo(x - 40, groundY); context.lineTo(x - 20, siloY); context.lineTo(x + 20, siloY); context.lineTo(x + 40, groundY); }); context.lineTo(canvas.width, groundY); context.lineTo(canvas.width, canvas.height); context.fill(); // Draw missiles in silos context.fillStyle black; silos.forEach(silo > { let missilesPerRow 1; let count 0; let x silo.x; let y silo.y + 5; for (let i 0; i silo.missiles; i++) { context.fillRect(x, y, 4, 10); x + 12; if (++count missilesPerRow) { x silo.x - 6 * count; missilesPerRow++; y + 7; count 0; } } }); // Update and draw enemy missiles context.strokeStyle red; context.lineWidth 2; context.fillStyle Math.round(time / 2) % 2 0 ? black : white; missiles.forEach(missile > { missile.pos.x + missile.dx; missile.pos.y + missile.dy; explosions.forEach(explosion > { const dist distance(explosion, missile.pos); if (dist missileSize + explosion.size) { missile.alive false; } }); const dist distance(missile.pos, missile.target); if (dist missileSpeed) { missile.alive false; missile.target.alive false; } if (missile.alive) { context.beginPath(); context.moveTo(missile.start.x, missile.start.y); context.lineTo(missile.pos.x, missile.pos.y); context.stroke(); context.fillRect(missile.pos.x - missileSize / 2, missile.pos.y - missileSize / 2, missileSize, missileSize); } else { explosions.push({ x: missile.pos.x, y: missile.pos.y, size: 2, dir: 1, alive: true }); } }); // Update and draw player missiles context.strokeStyle blue; context.fillStyle white; counterMissiles.forEach(missile > { missile.pos.x + missile.dx; missile.pos.y + missile.dy; const dist distance(missile.pos, missile.target); if (dist counterMissileSpeed) { missile.alive false; explosions.push({ x: missile.pos.x, y: missile.pos.y, size: 2, dir: 1, alive: true }); } else { context.beginPath(); context.moveTo(missile.start.x, missile.start.y); context.lineTo(missile.pos.x, missile.pos.y); context.stroke(); context.fillRect(missile.pos.x - 2, missile.pos.y - 2, 4, 4); } }); // Update and draw explosions explosions.forEach(explosion > { explosion.size + 0.35 * explosion.dir; if (explosion.size > 30) { explosion.dir -1; } if (explosion.size 0) { explosion.alive false; } else { context.fillStyle Math.round(time / 3) % 2 0 ? blue : white; context.beginPath(); context.arc(explosion.x, explosion.y, explosion.size, 0, 2 * Math.PI); context.fill(); } }); // Clean up dead objects missiles missiles.filter(missile > missile.alive); counterMissiles counterMissiles.filter(missile > missile.alive); explosions explosions.filter(explosion > explosion.alive); cities cities.filter(city > city.alive); silos silos.filter(silo > silo.alive); // Check for game over if (cities.length 0 || (missiles.length 0 && currInterval > levelscurrLevel.length)) { cancelAnimationFrame(gameLoop); context.fillStyle white; context.font 48px Arial; context.textAlign center; context.fillText(cities.length 0 ? Game Over! : Level Complete!, canvas.width/2, canvas.height/2); } } function handleClick(e) { const rect canvas.getBoundingClientRect(); const x e.clientX - rect.left; const y e.clientY - rect.top; let launchSilo null; let siloDistance Infinity; silos.forEach(silo > { const dist distance({ x, y }, silo); if (dist siloDistance && silo.missiles) { siloDistance dist; launchSilo silo; } }); if (launchSilo) { const start { x: launchSilo.x, y: launchSilo.y }; const target { x, y }; const angle angleBetweenPoints(start, target); launchSilo.missiles--; counterMissiles.push({ start, target, pos: { x: launchSilo.x, y: launchSilo.y }, dx: counterMissileSpeed * Math.sin(angle), dy: counterMissileSpeed * -Math.cos(angle), alive: true }); } } function restartMissileCommand() { // Reset game state missiles ; counterMissiles ; explosions ; currLevel 0; currInterval 0; lastTime -2000; // Reset cities and silos cities { x: 140, y: cityY, alive: true }, { x: 220, y: cityY, alive: true }, { x: 300, y: cityY, alive: true }, { x: 500, y: cityY, alive: true }, { x: 580, y: cityY, alive: true }, { x: 660, y: cityY, alive: true } ; silos { x: siloPos0, y: siloY, missiles: 10, alive: true }, { x: siloPos1, y: siloY, missiles: 10, alive: true }, { x: siloPos2, y: siloY, missiles: 10, alive: true } ; // Start game loop if (gameLoop) { cancelAnimationFrame(gameLoop); } gameLoop requestAnimationFrame(loop); } canvas.addEventListener(click, handleClick); /script> script> // Initialize global game state window.gameModal null; window.gameInitialized false; window.selectGame null; window.returnToMenu null; // Global game functions - with vibration feedback window.launchGame function() { console.log(launchGame called); try { // Vibrate if supported if (vibrate in navigator) { navigator.vibrate(200); } // Get modal element if (!window.gameModal) { window.gameModal document.getElementById(gameModal); console.log(Game modal found:, window.gameModal); } // Make sure we have the modal if (!window.gameModal) { console.error(Game modal not found!); return; } // Show the modal window.gameModal.style.display block; console.log(Game modal displayed); // Initialize game if needed if (!window.gameInitialized) { console.log(Initializing game...); window.initGame(); } } catch (error) { console.error(Error in launchGame:, error); } }; // Set up Easter egg trigger function setupEasterEgg() { try { console.log(Setting up Easter egg trigger...); const logo document.querySelector(.logo); const logoLink logo ? logo.querySelector(a) : null; console.log(Logo elements found:, { logo, logoLink }); if (logoLink) { // Remove any existing click handlers logoLink.removeEventListener(click, easterEggHandler); // Add new click handler logoLink.addEventListener(click, easterEggHandler); console.log(Easter egg trigger set up successfully); } else { console.log(Logo element not found, retrying in 500ms...); setTimeout(setupEasterEgg, 500); } } catch (error) { console.error(Error in setupEasterEgg:, error); } } // Easter egg click handler function easterEggHandler(e) { console.log(Logo clicked!, { ctrlKey: e.ctrlKey, metaKey: e.metaKey, target: e.target, currentTarget: e.currentTarget }); if (e.ctrlKey || e.metaKey) { console.log(Launching game...); e.preventDefault(); e.stopPropagation(); try { window.launchGame(); } catch (error) { console.error(Error launching game:, error); } return false; } } // Try to set up Easter egg when script loads if (document.readyState loading) { // Document still loading, wait for DOMContentLoaded document.addEventListener(DOMContentLoaded, setupEasterEgg); } else { // DOMContentLoaded already fired, run immediately setupEasterEgg(); } window.initGame function() { if (window.gameInitialized) return; try { const gameContainer document.getElementById(jsdos); // Create game menu const menuHTML ` div stylecolor: white; text-align: center; padding: 2rem;> h2 stylecolor: var(--primary-color); margin-bottom: 2rem; font-size: 2em;>Secret Arcade/h2> div styledisplay: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 2rem; max-width: 800px; margin: 0 auto;> !-- Snake --> div classgame-choice onclickwindow.selectGame(snake) stylebackground: rgba(255,255,255,0.1); padding: 1.5rem; border-radius: 8px; cursor: pointer; transition: all 0.3s ease;> i classfas fa-dragon stylefont-size: 3em; color: var(--primary-color); margin-bottom: 1rem;>/i> h3 stylemargin-bottom: 0.5rem;>Snake/h3> p stylefont-size: 0.9em; opacity: 0.8;>Classic snake game with modern graphics/p> /div> !-- Space Invaders --> div classgame-choice onclickwindow.selectGame(invaders) stylebackground: rgba(255,255,255,0.1); padding: 1.5rem; border-radius: 8px; cursor: pointer; transition: all 0.3s ease;> i classfas fa-user-astronaut stylefont-size: 3em; color: var(--primary-color); margin-bottom: 1rem;>/i> h3 stylemargin-bottom: 0.5rem;>Space Invaders/h3> p stylefont-size: 0.9em; opacity: 0.8;>Defend Earth from alien invasion/p> /div> !-- Gorillas --> div classgame-choice onclickwindow.selectGame(gorillas) stylebackground: rgba(255,255,255,0.1); padding: 1.5rem; border-radius: 8px; cursor: pointer; transition: all 0.3s ease;> i classfas fa-bomb stylefont-size: 3em; color: var(--primary-color); margin-bottom: 1rem;>/i> h3 stylemargin-bottom: 0.5rem;>Gorillas/h3> p stylefont-size: 0.9em; opacity: 0.8;>QBasic-style banana throwing warfare/p> /div> /div> div stylemargin-top: 2rem; font-size: 0.8em; opacity: 0.6;> Press ESC anytime to return to this menu /div> /div> `; gameContainer.innerHTML menuHTML; // Add hover effects for game choices const gameChoices document.querySelectorAll(.game-choice); gameChoices.forEach(choice > { choice.addEventListener(mouseover, () > { choice.style.transform translateY(-5px); choice.style.background rgba(255,255,255,0.15); }); choice.addEventListener(mouseout, () > { choice.style.transform translateY(0); choice.style.background rgba(255,255,255,0.1); }); }); // Initialize event handlers document.querySelector(.close-modal).onclick function() { window.gameModal.style.display none; }; window.onclick function(event) { if (event.target window.gameModal) { window.gameModal.style.display none; } }; // Set up keyboard shortcuts document.addEventListener(keydown, function(e) { if ((e.ctrlKey || e.metaKey) && e.code KeyC) { e.preventDefault(); e.stopPropagation(); window.launchGame(); } }); // Set initialized flag // Snake game implementation window.selectGame function(game) { if (game gorillas) { gameContainer.innerHTML ` div styletext-align: center; padding: 1rem;> h2 stylecolor: var(--primary-color); margin-bottom: 1rem;>Gorillas/h2> div stylecolor: white; margin-bottom: 1rem;> div styledisplay: flex; justify-content: space-between; margin-bottom: 1rem;> div>Player 1: span idp1name>Player 1/span>/div> div>Wind: span idwind>0/span> m/s/div> div>Player 2: span idp2name>Player 2/span>/div> /div> div styledisplay: flex; justify-content: space-between; margin-bottom: 1rem;> div>Angle: input typenumber idp1angle min0 max360 stylewidth: 60px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); color: white; padding: 2px 5px;>/div> div>Score: span idp1score>0/span> - span idp2score>0/span>/div> div>Angle: input typenumber idp2angle min0 max360 stylewidth: 60px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); color: white; padding: 2px 5px;>/div> /div> div styledisplay: flex; justify-content: space-between;> div>Power: input typenumber idp1power min1 max100 stylewidth: 60px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); color: white; padding: 2px 5px;>/div> div>Gravity: span idgravity>9.81/span> m/s²/div> div>Power: input typenumber idp2power min1 max100 stylewidth: 60px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); color: white; padding: 2px 5px;>/div> /div> /div> /div> div styleposition: relative; width: 800px; height: 600px; margin: auto; background: #000; border: 2px solid var(--primary-color);> canvas idgorillasCanvas width800 height600 styleposition: absolute; top: 0; left: 0;>/canvas> /div> div styletext-align: center; padding: 1rem;> button onclickwindow.returnToMenu() stylebackground: var(--primary-color); color: white; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer;>Back to Menu/button> /div> `; // Initialize Gorillas game initGorillasGame(); } else if (game snake) { gameContainer.innerHTML ` div styletext-align: center; padding: 1rem;> h2 stylecolor: var(--primary-color); margin-bottom: 1rem;>Snake/h2> p stylecolor: white; margin-bottom: 1rem;>Use arrow keys to move or virtual joystick on mobile/p> p stylecolor: white;>Lives: span idlives>3/span> | Score: span idscore>0/span>/p> /div> div styleposition: relative; width: 400px; margin: auto;> canvas idgameCanvas stylebackground: #300; border: 2px solid white; display: block; width: 400px; height: 400px;>/canvas> div idvirtualJoystick styledisplay: none; position: absolute; bottom: 20px; left: 20px; width: 120px; height: 120px; background: rgba(255, 255, 255, 0.1); border: 2px solid rgba(255, 255, 255, 0.2); border-radius: 50%; touch-action: none;> div idjoystickKnob styleposition: absolute; width: 40px; height: 40px; background: rgba(255, 255, 255, 0.8); border-radius: 50%; top: 40px; left: 40px; margin: -20px 0 0 -20px; transition: transform 0.1s ease;>/div> /div> /div> div styletext-align: center; padding: 1rem;> button onclickwindow.returnToMenu() stylebackground: var(--primary-color); color: white; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer;>Back to Menu/button> /div> `; // Initialize game constants const gridSize 20; const gameSpeed 120; const gridWidth 20; // Number of cells horizontally const gridHeight 20; // Number of cells vertically // Initialize Snake Game with dynamic sizing const canvas document.getElementById(gameCanvas); const ctx canvas.getContext(2d); // Calculate canvas size based on viewport, ensuring its divisible by gridSize // Set canvas size to match our grid exactly const size gridSize * gridWidth; // 20px * 20 cells 400px canvas.width size; canvas.height size; // Game variables let snake {x: 10, y: 10}; let direction right; let nextDirection right; let food {x: 15, y: 10}; // Initial food position let score 0; let lives 3; // Make gameLoop globally accessible if (typeof window.gameLoop ! undefined) { clearInterval(window.gameLoop); } window.gameLoop null; // Audio context for sounds const audioContext new (window.AudioContext || window.webkitAudioContext)(); function playSound(type) { const oscillator audioContext.createOscillator(); const gainNode audioContext.createGain(); oscillator.connect(gainNode); gainNode.connect(audioContext.destination); if (type eat) { oscillator.type sine; oscillator.frequency.setValueAtTime(880, audioContext.currentTime); oscillator.frequency.setValueAtTime(1760, audioContext.currentTime + 0.1); gainNode.gain.setValueAtTime(0.3, audioContext.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.1); oscillator.start(); oscillator.stop(audioContext.currentTime + 0.1); } else if (type die) { oscillator.type sawtooth; oscillator.frequency.setValueAtTime(440, audioContext.currentTime); oscillator.frequency.exponentialRampToValueAtTime(55, audioContext.currentTime + 0.5); gainNode.gain.setValueAtTime(0.3, audioContext.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.5); oscillator.start(); oscillator.stop(audioContext.currentTime + 0.5); } } function spawnFood() { do { food { x: Math.floor(Math.random() * gridWidth), y: Math.floor(Math.random() * (gridHeight - 1)) // Subtract 1 to prevent spawning at bottom }; } while (snake.some(segment > segment.x food.x && segment.y food.y)); } function drawGame() { console.log(Drawing game...); console.log(Canvas size:, canvas.width, canvas.height); console.log(Grid size:, gridSize); console.log(Snake:, snake); console.log(Food:, food); // Clear canvas with dark red background for visibility ctx.fillStyle #300; ctx.fillRect(0, 0, canvas.width, canvas.height); // Draw grid for debugging ctx.strokeStyle #500; for(let i 0; i canvas.width; i + gridSize) { ctx.beginPath(); ctx.moveTo(i, 0); ctx.lineTo(i, canvas.height); ctx.stroke(); } for(let i 0; i canvas.height; i + gridSize) { ctx.beginPath(); ctx.moveTo(0, i); ctx.lineTo(canvas.width, i); ctx.stroke(); } // Draw snake snake.forEach((segment, index) > { console.log(Drawing snake segment:, segment); let snakeColor; if (lives 0) { snakeColor index 0 ? #f00 : #a00; // Red snake when dead } else if (lives 1) { snakeColor index 0 ? #f00 : #a00; // Red snake on last life } else if (lives 2) { snakeColor index 0 ? #ff0 : #aa0; // Yellow snake on second life } else { snakeColor index 0 ? #0f0 : #0a0; // Green snake on third life } ctx.fillStyle snakeColor; ctx.fillRect(segment.x * gridSize + 1, segment.y * gridSize + 1, gridSize - 2, gridSize - 2); }); // Draw food console.log(Drawing food:, food); ctx.fillStyle red; ctx.fillRect(food.x * gridSize + 1, food.y * gridSize + 1, gridSize - 2, gridSize - 2); } function updateGame() { direction nextDirection; const head {x: snake0.x, y: snake0.y}; const nextHead {x: head.x, y: head.y}; // Calculate next position switch(direction) { case up: nextHead.y--; break; case down: nextHead.y++; break; case left: nextHead.x--; break; case right: nextHead.x++; break; } // Check for collisions with boundaries and self if ( nextHead.x 0 || nextHead.x > gridWidth || nextHead.y 0 || nextHead.y > gridHeight || snake.some(segment > segment.x nextHead.x && segment.y nextHead.y) ) { lives--; document.getElementById(lives).textContent lives; playSound(die); if (lives 0) { gameOver(); return; } else { // Reset snake but keep score snake {x: 10, y: 10}; direction right; nextDirection right; return; } } // Move to next position if no collision snake.unshift(nextHead); // Check if snake ate food if (nextHead.x food.x && nextHead.y food.y) { score + 10; document.getElementById(score).textContent score; spawnFood(); playSound(eat); } else { snake.pop(); } drawGame(); } function gameOver() { clearInterval(window.gameLoop); ctx.fillStyle rgba(0, 0, 0, 0.75); ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle white; ctx.font bold 24px Arial; ctx.textAlign center; ctx.fillText(Game Over!, canvas.width/2, canvas.height/2 - 30); ctx.font 16px Arial; ctx.fillText(`Final Score: ${score}`, canvas.width/2, canvas.height/2); ctx.fillText(Press Space to Play Again, canvas.width/2, canvas.height/2 + 30); } function startGame() { console.log(Starting game...); snake {x: 10, y: 10}; direction right; nextDirection right; score 0; lives 3; document.getElementById(score).textContent 0; document.getElementById(lives).textContent 3; spawnFood(); console.log(Initial snake:, snake); console.log(Initial food:, food); if (window.gameLoop) clearInterval(window.gameLoop); drawGame(); // Draw initial state window.gameLoop setInterval(updateGame, gameSpeed); } // Keyboard controls document.addEventListener(keydown, function(e) { if (e.code ArrowUp && direction ! down) { nextDirection up; e.preventDefault(); } else if (e.code ArrowDown && direction ! up) { nextDirection down; e.preventDefault(); } else if (e.code ArrowLeft && direction ! right) { nextDirection left; e.preventDefault(); } else if (e.code ArrowRight && direction ! left) { nextDirection right; e.preventDefault(); } else if (e.code Space && lives 0) { startGame(); e.preventDefault(); } else if (e.code Escape) { window.returnToMenu(); e.preventDefault(); } }); // Initialize virtual joystick for mobile const joystick document.getElementById(virtualJoystick); const joystickKnob document.getElementById(joystickKnob); // Only show joystick on touch devices if (ontouchstart in window) { joystick.style.display block; } let isDragging false; let startX, startY; const centerX 60; // Center of joystick const centerY 60; const maxDistance 30; // Maximum distance joystick can move function handleJoystickMove(clientX, clientY) { const rect joystick.getBoundingClientRect(); const x clientX - rect.left - centerX; const y clientY - rect.top - centerY; // Calculate distance from center const distance Math.min(maxDistance, Math.sqrt(x * x + y * y)); const angle Math.atan2(y, x); // Calculate new position const moveX Math.cos(angle) * distance; const moveY Math.sin(angle) * distance; // Move joystick knob joystickKnob.style.transform `translate(${moveX}px, ${moveY}px)`; // Determine direction based on angle const degrees angle * 180 / Math.PI; if (distance > 10) { // Add a small deadzone if (degrees > -135 && degrees -45) { nextDirection up; } else if (degrees > -45 && degrees 45) { nextDirection right; } else if (degrees > 45 && degrees 135) { nextDirection down; } else { nextDirection left; } } } joystick.addEventListener(touchstart, function(e) { isDragging true; startX e.touches0.clientX; startY e.touches0.clientY; e.preventDefault(); }); joystick.addEventListener(touchmove, function(e) { if (isDragging) { handleJoystickMove(e.touches0.clientX, e.touches0.clientY); } e.preventDefault(); }); function resetJoystick() { isDragging false; joystickKnob.style.transform translate(0px, 0px); } joystick.addEventListener(touchend, resetJoystick); joystick.addEventListener(touchcancel, resetJoystick); startGame(); } else if (game invaders) { // Space Invaders Implementation gameContainer.innerHTML ` div styletext-align: center; padding: 1rem;> h2 stylecolor: var(--primary-color); margin-bottom: 1rem;>Space Invaders/h2> p stylecolor: white; margin-bottom: 1rem;>Use arrow keys or virtual joystick to move, SPACE or Fire button to shoot/p> p stylecolor: white;>Lives: span idlives>3/span> | Score: span idscore>0/span> | Level: span idlevel>1/span>/p> /div> div styleposition: relative; width: 400px; margin: auto;> canvas idgameCanvas stylebackground: #000; border: 2px solid white; display: block; width: 400px; height: 600px;>/canvas> div idvirtualJoystick styledisplay: none; position: absolute; bottom: 20px; left: 20px; width: 120px; height: 120px; background: rgba(255, 255, 255, 0.1); border: 2px solid rgba(255, 255, 255, 0.2); border-radius: 50%; touch-action: none;> div idjoystickKnob styleposition: absolute; width: 40px; height: 40px; background: rgba(255, 255, 255, 0.8); border-radius: 50%; top: 40px; left: 40px; margin: -20px 0 0 -20px; transition: transform 0.1s ease;>/div> /div> button idfireButton styledisplay: none; position: absolute; bottom: 20px; right: 20px; width: 80px; height: 80px; background: rgba(255, 0, 0, 0.3); border: 2px solid rgba(255, 0, 0, 0.5); border-radius: 50%; color: white; font-size: 16px; cursor: pointer;>FIRE/button> /div> div styletext-align: center; padding: 1rem;> button onclickwindow.returnToMenu() stylebackground: var(--primary-color); color: white; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer;>Back to Menu/button> /div> `; // Initialize game constants const canvas document.getElementById(gameCanvas); const ctx canvas.getContext(2d); // Set canvas size canvas.width 400; canvas.height 600; // Audio setup const createAudio (src) > { const audio new Audio(); audio.src `data:audio/wav;base64,${src}`; return audio; }; // Simple sound effects using AudioContext function playSound(type) { const audioCtx new (window.AudioContext || window.webkitAudioContext)(); const oscillator audioCtx.createOscillator(); const gainNode audioCtx.createGain(); oscillator.connect(gainNode); gainNode.connect(audioCtx.destination); switch(type) { case shoot: oscillator.type square; oscillator.frequency.setValueAtTime(440, audioCtx.currentTime); gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.1); oscillator.start(); oscillator.stop(audioCtx.currentTime + 0.1); break; case explosion: oscillator.type sawtooth; oscillator.frequency.setValueAtTime(100, audioCtx.currentTime); gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.3); oscillator.start(); oscillator.stop(audioCtx.currentTime + 0.3); break; case powerup: oscillator.type sine; oscillator.frequency.setValueAtTime(600, audioCtx.currentTime); oscillator.frequency.exponentialRampToValueAtTime(800, audioCtx.currentTime + 0.1); gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.1); oscillator.start(); oscillator.stop(audioCtx.currentTime + 0.1); break; } } // Game variables let player { x: canvas.width / 2, y: canvas.height - 40, width: 40, height: 30, speed: 0, // Current speed (will be affected by acceleration) maxSpeed: 15, // Maximum speed (reduced to 75%) acceleration: 1.1, // How quickly speed increases (reduced to 75%) deceleration: 2.5, // Increased deceleration for better stopping control velocityX: 0, // Current velocity bullets: , lastShot: 0, shootDelay: 250, // Minimum time between shots in ms moveDirection: 0 // -1 for left, 0 for none, 1 for right }; // Enemy types with different appearances and animations const enemyTypes { color: #0F0, points: 100, frames: (ctx, x, y, w, h) > { // Frame 1: Bug with wings up ctx.fillStyle #0F0; ctx.beginPath(); ctx.moveTo(x + w/2, y); // Top center ctx.lineTo(x + w, y + h/2); // Right wing ctx.lineTo(x + w/2, y + h); // Bottom ctx.lineTo(x, y + h/2); // Left wing ctx.closePath(); ctx.fill(); }, (ctx, x, y, w, h) > { // Frame 2: Bug with wings down ctx.fillStyle #0F0; ctx.beginPath(); ctx.moveTo(x + w/2, y); ctx.lineTo(x + w, y + h); ctx.lineTo(x, y + h); ctx.closePath(); ctx.fill(); } }, { color: #F0F, points: 150, frames: (ctx, x, y, w, h) > { // Frame 1: Spider-like with legs out ctx.fillStyle #F0F; ctx.beginPath(); ctx.arc(x + w/2, y + h/2, w/3, 0, Math.PI * 2); ctx.fill(); // Legs for(let i 0; i 4; i++) { const angle (i * Math.PI/2); ctx.beginPath(); ctx.moveTo(x + w/2, y + h/2); ctx.lineTo( x + w/2 + Math.cos(angle) * w/2, y + h/2 + Math.sin(angle) * h/2 ); ctx.stroke(); } }, (ctx, x, y, w, h) > { // Frame 2: Spider-like with legs in ctx.fillStyle #F0F; ctx.beginPath(); ctx.arc(x + w/2, y + h/2, w/3, 0, Math.PI * 2); ctx.fill(); // Legs at 45 degrees for(let i 0; i 4; i++) { const angle (i * Math.PI/2) + Math.PI/4; ctx.beginPath(); ctx.moveTo(x + w/2, y + h/2); ctx.lineTo( x + w/2 + Math.cos(angle) * w/3, y + h/2 + Math.sin(angle) * h/3 ); ctx.stroke(); } } } ; let enemies ; let explosions ; // Array to track active explosions let powerUps ; let score 0; let lives 3; let level 1; let baseSpeed 0.0000025; // Super ridiculously slow base speed let gameSpeed baseSpeed; let lastPowerUpTime 0; let powerUpChance 0.1; // 10% chance for power-up let animationFrame 0; // For enemy animation let lastAnimationTime 0; const ANIMATION_INTERVAL 500; // Time between animation frames in ms function createEnemies() { enemies ; const rows 5; const cols 8; const padding 50; for (let i 0; i rows; i++) { for (let j 0; j cols; j++) { enemies.push({ x: j * padding + 50, y: i * padding + 30, // Start enemies higher up width: 30, height: 30, direction: 1, type: i % enemyTypes.length // Alternate between enemy types }); } } } // Explosion animation function createExplosion(x, y) { explosions.push({ x: x, y: y, radius: 1, maxRadius: 20, alpha: 1 }); playSound(explosion); } function drawExplosions() { explosions explosions.filter(explosion > { explosion.radius + 2; explosion.alpha - 0.05; if (explosion.alpha > 0) { ctx.beginPath(); ctx.arc(explosion.x, explosion.y, explosion.radius, 0, Math.PI * 2); ctx.fillStyle `rgba(255, 200, 0, ${explosion.alpha})`; ctx.fill(); // Inner explosion ctx.beginPath(); ctx.arc(explosion.x, explosion.y, explosion.radius * 0.5, 0, Math.PI * 2); ctx.fillStyle `rgba(255, 100, 0, ${explosion.alpha})`; ctx.fill(); return true; } return false; }); } function drawLifeShip(x, y, scale 1) { // Draw a small ship icon for lives display ctx.fillStyle #0F0; ctx.strokeStyle #0F0; ctx.lineWidth 1; const width 20 * scale; const height 15 * scale; ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x - width/2, y + height); ctx.lineTo(x + width/2, y + height); ctx.closePath(); ctx.fill(); ctx.stroke(); } function drawLives() { const startX 70; // Start after the Lives: text const y 25; // Vertical position const spacing 30; // Space between ships const scale 0.8; // Slightly smaller than player ship // Draw Lives: text ctx.fillStyle white; ctx.font 20px Arial; ctx.textAlign left; ctx.fillText(Lives:, 10, y + 5); // Draw life ships for (let i 0; i lives; i++) { drawLifeShip(startX + (i * spacing), y, scale); } } function drawPlayer() { // Draw player ship ctx.fillStyle #0F0; ctx.strokeStyle #0F0; ctx.lineWidth 2; // Ship body ctx.beginPath(); ctx.moveTo(player.x, player.y); ctx.lineTo(player.x - player.width/2, player.y + player.height); ctx.lineTo(player.x + player.width/2, player.y + player.height); ctx.closePath(); ctx.fill(); ctx.stroke(); // Engine glow ctx.fillStyle rgba(0, 255, 0, 0.3); ctx.beginPath(); ctx.moveTo(player.x - player.width/4, player.y + player.height); ctx.lineTo(player.x + player.width/4, player.y + player.height); ctx.lineTo(player.x, player.y + player.height + 10); ctx.closePath(); ctx.fill(); } function drawEnemies() { const now Date.now(); if (now - lastAnimationTime > ANIMATION_INTERVAL) { animationFrame (animationFrame + 1) % 2; lastAnimationTime now; } enemies.forEach(enemy > { const type enemyTypesenemy.type; type.framesanimationFrame(ctx, enemy.x, enemy.y, enemy.width, enemy.height); }); } function drawBullets() { ctx.fillStyle #FFF; player.bullets.forEach(bullet > { ctx.fillRect(bullet.x, bullet.y, 2, 10); }); } function drawPowerUps() { ctx.fillStyle #FFD700; powerUps.forEach(powerUp > { ctx.beginPath(); ctx.arc(powerUp.x, powerUp.y, 8, 0, Math.PI * 2); ctx.fill(); }); } function moveEnemies() { let touchedWall false; enemies.forEach(enemy > { // Calculate movement in smaller increments const movement gameSpeed * enemy.direction * canvas.width; enemy.x + movement; if (enemy.x 0 || enemy.x + enemy.width > canvas.width) { touchedWall true; } }); if (touchedWall) { enemies.forEach(enemy > { enemy.y + canvas.height * 0.002; // Microscopic downward movement proportional to canvas height enemy.direction * -1; }); gameSpeed + 0.0000005; // Quantum-scale speed increase } } function checkCollisions() { // Check bullet collisions player.bullets.forEach((bullet, bulletIndex) > { enemies.forEach((enemy, enemyIndex) > { if (bullet.x > enemy.x && bullet.x enemy.x + enemy.width && bullet.y > enemy.y && bullet.y enemy.y + enemy.height) { // Remove bullet and enemy player.bullets.splice(bulletIndex, 1); const enemy enemiesenemyIndex; createExplosion(enemy.x + enemy.width/2, enemy.y + enemy.height/2); enemies.splice(enemyIndex, 1); // Update score score + enemyTypesenemy.type.points; document.getElementById(score).textContent score; // Check for extra life if (score > 0 && score % 10000 0) { lives++; document.getElementById(lives).textContent lives; } // Chance to spawn power-up if (Math.random() powerUpChance) { powerUps.push({ x: enemy.x + enemy.width/2, y: enemy.y, speed: 2 }); } } }); }); // Check power-up collisions powerUps.forEach((powerUp, index) > { if (powerUp.x > player.x - player.width/2 && powerUp.x player.x + player.width/2 && powerUp.y > player.y && powerUp.y player.y + player.height) { // Apply power-up effect (extra points) score + 500; document.getElementById(score).textContent score; powerUps.splice(index, 1); } }); // Check enemy-player collisions for (let i enemies.length - 1; i > 0; i--) { const enemy enemiesi; // Check if enemy hits players ship if (enemy.y + enemy.height > player.y && enemy.x player.x + player.width/2 && enemy.x + enemy.width > player.x - player.width/2) { // Create explosion at collision point createExplosion(player.x, player.y); // Remove the enemy enemies.splice(i, 1); // Lose a life lives--; document.getElementById(lives).textContent lives; // Update lives display and check game over if (lives 0) { lives 0; // Ensure lives dont go negative gameOver(); } else { // Reset player to center player.x canvas.width / 2; player.velocityX 0; player.moveDirection 0; // Short invulnerability period setTimeout(() > { createExplosion(player.x, player.y); }, 100); } break; } // Check if enemy reaches bottom else if (enemy.y + enemy.height > canvas.height) { lives 0; // Set lives to 0 when enemies reach bottom document.getElementById(lives).textContent lives; gameOver(); } } } function restartLevel() { // Reset game state lives 3; player.velocityX 0; player.moveDirection 0; player.x canvas.width / 2; player.bullets ; explosions ; powerUps ; gameSpeed baseSpeed * (1 + (level - 1) * 0.1); // Keep current levels speed // Update display document.getElementById(lives).textContent lives; // Create new enemies createEnemies(); // Restart game loop if (window.gameLoop) { clearInterval(window.gameLoop); } window.gameLoop setInterval(updateGame, 1000/60); } function gameOver() { if (window.gameLoop) { clearInterval(window.gameLoop); window.gameLoop null; } ctx.fillStyle rgba(0, 0, 0, 0.75); ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle white; ctx.font bold 24px Arial; ctx.textAlign center; ctx.fillText(Game Over!, canvas.width/2, canvas.height/2 - 30); ctx.font 16px Arial; ctx.fillText(`Final Score: ${score}`, canvas.width/2, canvas.height/2); ctx.fillText(Press Space or Fire to Retry Level + level, canvas.width/2, canvas.height/2 + 30); } function nextLevel() { level++; document.getElementById(level).textContent level; gameSpeed baseSpeed * (1 + (level - 1) * 0.1); // Very gentle speed increase per level createEnemies(); // Visual effect for level transition ctx.fillStyle rgba(255, 255, 255, 0.3); ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle white; ctx.font bold 36px Arial; ctx.textAlign center; ctx.fillText(`Level ${level}`, canvas.width/2, canvas.height/2 - 20); ctx.font bold 24px Arial; ctx.fillText(Get Ready!, canvas.width/2, canvas.height/2 + 20); setTimeout(() > { startGame(); }, 1500); } function updateGame() { ctx.clearRect(0, 0, canvas.width, canvas.height); // Update player movement with acceleration/deceleration if (player.moveDirection ! 0) { // Quick-stop when changing directions if ((player.velocityX > 0 && player.moveDirection 0) || (player.velocityX 0 && player.moveDirection > 0)) { player.velocityX * 0.5; // Cut speed by half when changing directions } // Accelerate in the movement direction player.velocityX + player.acceleration * player.moveDirection; player.velocityX Math.max(-player.maxSpeed, Math.min(player.maxSpeed, player.velocityX)); } else { // Decelerate when no movement key is pressed if (Math.abs(player.velocityX) player.deceleration) { // If very slow, just stop completely player.velocityX 0; } else { // Decelerate faster when letting go of controls if (player.velocityX > 0) { player.velocityX Math.max(0, player.velocityX - player.deceleration); } else if (player.velocityX 0) { player.velocityX Math.min(0, player.velocityX + player.deceleration); } } } // Apply velocity player.x + player.velocityX; // Keep player within bounds player.x Math.max(player.width/2, Math.min(canvas.width - player.width/2, player.x)); // Move bullets player.bullets.forEach((bullet, index) > { bullet.y - 10; if (bullet.y 0) { player.bullets.splice(index, 1); } }); // Move power-ups powerUps.forEach((powerUp, index) > { powerUp.y + powerUp.speed; if (powerUp.y > canvas.height) { powerUps.splice(index, 1); } }); moveEnemies(); checkCollisions(); drawPlayer(); drawEnemies(); drawBullets(); drawPowerUps(); drawExplosions(); drawLives(); // Check for level completion if (enemies.length 0) { nextLevel(); } } function startGame() { // Reset game state score 0; lives 3; level 1; gameSpeed baseSpeed; player.bullets ; powerUps ; document.getElementById(score).textContent score; document.getElementById(lives).textContent lives; document.getElementById(level).textContent level; createEnemies(); if (window.gameLoop) { clearInterval(window.gameLoop); } // Add Get Ready message ctx.fillStyle white; ctx.font bold 36px Arial; ctx.textAlign center; ctx.fillText(Get Ready!, canvas.width/2, canvas.height/2); // Start the game after a short delay setTimeout(() > { window.gameLoop setInterval(updateGame, 1000/60); }, 1500); } // Initialize controls const joystick document.getElementById(virtualJoystick); const joystickKnob document.getElementById(joystickKnob); const fireButton document.getElementById(fireButton); // Only show mobile controls on touch devices if (ontouchstart in window) { joystick.style.display block; fireButton.style.display block; } // Joystick control let isDragging false; const centerX 60; const maxDistance 30; function handleJoystickMove(clientX) { const rect joystick.getBoundingClientRect(); const x clientX - rect.left - centerX; const distance Math.min(maxDistance, Math.abs(x)); const moveX Math.sign(x) * distance; joystickKnob.style.transform `translate(${moveX}px, 0px)`; if (Math.abs(moveX) > 10) { player.moveDirection Math.sign(moveX); } else { player.moveDirection 0; } // Keep player within bounds player.x Math.max(player.width/2, Math.min(canvas.width - player.width/2, player.x)); } joystick.addEventListener(touchstart, function(e) { isDragging true; handleJoystickMove(e.touches0.clientX); e.preventDefault(); }); joystick.addEventListener(touchmove, function(e) { if (isDragging) { handleJoystickMove(e.touches0.clientX); } e.preventDefault(); }); function resetJoystick() { isDragging false; joystickKnob.style.transform translate(0px, 0px); } joystick.addEventListener(touchend, resetJoystick); joystick.addEventListener(touchcancel, resetJoystick); // Fire button control fireButton.addEventListener(touchstart, function(e) { if (lives 0) { restartLevel(); } else { const now Date.now(); if (now - player.lastShot > player.shootDelay) { player.bullets.push({x: player.x, y: player.y}); player.lastShot now; playSound(shoot); } } e.preventDefault(); }); // Keyboard controls document.addEventListener(keydown, function(e) { e.preventDefault(); if (e.code ArrowLeft) { player.moveDirection -1; } else if (e.code ArrowRight) { player.moveDirection 1; } else if (e.code Space) { if (lives 0) { restartLevel(); } else { const now Date.now(); if (now - player.lastShot > player.shootDelay) { player.bullets.push({x: player.x, y: player.y}); player.lastShot now; playSound(shoot); } } } else if (e.code Escape) { window.returnToMenu(); } // Keep player within bounds player.x Math.max(player.width/2, Math.min(canvas.width - player.width/2, player.x)); e.preventDefault(); }); // Handle key releases document.addEventListener(keyup, function(e) { if ((e.code ArrowLeft && player.moveDirection -1) || (e.code ArrowRight && player.moveDirection 1)) { player.moveDirection 0; } e.preventDefault(); }); startGame(); } }; // Back to menu function window.returnToMenu function() { // Stop the game loop if (window.gameLoop) { clearInterval(window.gameLoop); window.gameLoop null; } // Reset game state window.gameInitialized false; // Show the game selection menu const gameContainer document.getElementById(jsdos); window.initGame(); }; window.gameInitialized true; } catch (error) { console.error(Failed to initialize game:, error); } }; // Mobile-friendly triggers for the easter egg let tapCount 0; let tapTimer null; let pressTimer null; function resetTaps() { tapCount 0; } document.addEventListener(DOMContentLoaded, function() { // Get the logo element const logo document.querySelector(.logo); const footer document.querySelector(footer); // Add hidden button to footer const hiddenButton document.createElement(div); hiddenButton.innerHTML ` button stylebackground: none; border: none; color: rgba(255,255,255,0.1); padding: 10px; cursor: pointer; transition: color 0.3s ease; onmouseoverthis.style.colorrgba(255,255,255,0.3) onmouseoutthis.style.colorrgba(255,255,255,0.1) onclickwindow.launchGame()> i classfas fa-gamepad>/i> /button> `; footer.appendChild(hiddenButton); // Triple tap handler logo.addEventListener(touchend, function(e) { tapCount++; if (tapCount 1) { tapTimer setTimeout(resetTaps, 500); } if (tapCount 3) { clearTimeout(tapTimer); resetTaps(); window.launchGame(); e.preventDefault(); } }); // Long press handler logo.addEventListener(touchstart, function(e) { pressTimer setTimeout(function() { window.launchGame(); }, 2000); e.preventDefault(); }); logo.addEventListener(touchend, function(e) { clearTimeout(pressTimer); }); logo.addEventListener(touchmove, function(e) { clearTimeout(pressTimer); }); // Add click handler to logo link function initializeLogoHandler() { const logoLink document.querySelector(.logo a); if (logoLink) { logoLink.onclick function(e) { if (e.ctrlKey || e.metaKey) { e.preventDefault(); e.stopPropagation(); window.launchGame(); return false; } }; console.log(Easter egg handler initialized); } else { // If logo not found yet, try again in a moment setTimeout(initializeLogoHandler, 100); } } initializeLogoHandler(); }); // Gorillas Game Implementation function initGorillasGame() { const canvas document.getElementById(gorillasCanvas); const ctx canvas.getContext(2d); let currentPlayer 1; let p1score 0; let p2score 0; let buildings ; let projectile null; let gorillas { p1: {x: 0, y: 0, size: 40, dead: false}, p2: {x: 0, y: 0, size: 40, dead: false} }; let wind (Math.random() - 0.5) * 10; document.getElementById(wind).textContent wind.toFixed(1); let gameState waiting; // waiting, animating, gameOver // Generate cityscape function generateBuildings() { buildings ; const buildingCount 8; const width canvas.width / buildingCount; for(let i 0; i buildingCount; i++) { const minHeight 100; const maxHeight 400; const height minHeight + Math.random() * (maxHeight - minHeight); buildings.push({ x: i * width, y: canvas.height - height, width: width - 2, height: height, color: # + Math.floor(Math.random()*16777215).toString(16) }); } // Position gorillas gorillas.p1.x buildings1.x + buildings1.width/2; gorillas.p1.y buildings1.y - gorillas.p1.size; gorillas.p2.x buildingsbuildings.length-2.x + buildingsbuildings.length-2.width/2; gorillas.p2.y buildingsbuildings.length-2.y - gorillas.p2.size; } // Draw functions function drawBuilding(building) { ctx.fillStyle building.color; ctx.fillRect(building.x, building.y, building.width, building.height); // Draw windows ctx.fillStyle #FFF8; const windowSize 10; const windowSpacing 15; for(let x building.x + 10; x building.x + building.width - windowSize; x + windowSpacing) { for(let y building.y + 10; y building.y + building.height; y + windowSpacing) { if(Math.random() > 0.3) { // Some windows are dark ctx.fillRect(x, y, windowSize, windowSize); } } } } function drawGorilla(x, y, size) { // Body ctx.fillStyle #8B4513; ctx.fillRect(x - size/2, y, size, size); // Arms ctx.fillRect(x - size*0.8, y + size*0.3, size*0.3, size*0.4); ctx.fillRect(x + size*0.5, y + size*0.3, size*0.3, size*0.4); // Face ctx.fillStyle #FFE4B5; ctx.fillRect(x - size*0.3, y + size*0.2, size*0.6, size*0.3); // Eyes ctx.fillStyle #000; ctx.fillRect(x - size*0.2, y + size*0.3, size*0.1, size*0.1); ctx.fillRect(x + size*0.1, y + size*0.3, size*0.1, size*0.1); } function drawProjectile(x, y) { ctx.fillStyle #FF0; ctx.beginPath(); ctx.arc(x, y, 5, 0, Math.PI * 2); ctx.fill(); } function drawExplosion(x, y, radius) { ctx.fillStyle #F00; ctx.beginPath(); ctx.arc(x, y, radius, 0, Math.PI * 2); ctx.fill(); } function draw() { // Clear canvas ctx.fillStyle #000033; ctx.fillRect(0, 0, canvas.width, canvas.height); // Draw sun ctx.fillStyle #FFD700; ctx.beginPath(); ctx.arc(400, 50, 30, 0, Math.PI * 2); ctx.fill(); // Draw buildings buildings.forEach(drawBuilding); // Draw gorillas if theyre alive if (!gorillas.p1.dead) drawGorilla(gorillas.p1.x, gorillas.p1.y, gorillas.p1.size); if (!gorillas.p2.dead) drawGorilla(gorillas.p2.x, gorillas.p2.y, gorillas.p2.size); // Draw projectile if exists if(projectile) { drawProjectile(projectile.x, projectile.y); } } // Physics simulation function updateProjectile() { if(!projectile) return; // Update position projectile.x + projectile.dx + wind * 0.05; projectile.y + projectile.dy; projectile.dy + 0.3; // gravity // Check for collisions // With buildings for(let building of buildings) { if(projectile.x > building.x && projectile.x building.x + building.width && projectile.y > building.y && projectile.y building.y + building.height) { explode(projectile.x, projectile.y); return; } } // With gorillas const checkGorillaHit (gorilla) > { return projectile.x > gorilla.x - gorilla.size/2 && projectile.x gorilla.x + gorilla.size/2 && projectile.y > gorilla.y && projectile.y gorilla.y + gorilla.size; }; if(checkGorillaHit(gorillas.p1) && !gorillas.p1.dead) { p2score++; gorillas.p1.dead true; explode(gorillas.p1.x, gorillas.p1.y); document.getElementById(p2score).textContent p2score; setTimeout(resetRound, 2000); return; } if(checkGorillaHit(gorillas.p2) && !gorillas.p2.dead) { p1score++; gorillas.p2.dead true; explode(gorillas.p2.x, gorillas.p2.y); document.getElementById(p1score).textContent p1score; setTimeout(resetRound, 2000); return; } // Out of bounds if(projectile.y > canvas.height || projectile.x 0 || projectile.x > canvas.width) { projectile null; gameState waiting; currentPlayer currentPlayer 1 ? 2 : 1; } } function explode(x, y) { let radius 0; const maxRadius 30; const explosion setInterval(() > { radius + 2; draw(); drawExplosion(x, y, radius); if(radius > maxRadius) { clearInterval(explosion); setTimeout(() > { projectile null; gameState waiting; currentPlayer currentPlayer 1 ? 2 : 1; draw(); }, 500); } }, 20); } function shoot(player, angle, power) { if(gameState ! waiting) return; const radians angle * Math.PI / 180; const speed power * 0.2; const gorilla player 1 ? gorillas.p1 : gorillas.p2; projectile { x: gorilla.x, y: gorilla.y, dx: Math.cos(radians) * speed * (player 1 ? 1 : -1), dy: -Math.sin(radians) * speed }; gameState animating; } // Sound effects function playSound(type) { const audioContext new (window.AudioContext || window.webkitAudioContext)(); const oscillator audioContext.createOscillator(); const gainNode audioContext.createGain(); oscillator.connect(gainNode); gainNode.connect(audioContext.destination); switch(type) { case throw: oscillator.type square; oscillator.frequency.setValueAtTime(440, audioContext.currentTime); oscillator.frequency.exponentialRampToValueAtTime(880, audioContext.currentTime + 0.1); gainNode.gain.setValueAtTime(0.3, audioContext.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.1); oscillator.start(); oscillator.stop(audioContext.currentTime + 0.1); break; case explosion: oscillator.type sawtooth; oscillator.frequency.setValueAtTime(100, audioContext.currentTime); gainNode.gain.setValueAtTime(0.3, audioContext.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.3); oscillator.start(); oscillator.stop(audioContext.currentTime + 0.3); break; case hit: oscillator.type sine; oscillator.frequency.setValueAtTime(440, audioContext.currentTime); oscillator.frequency.exponentialRampToValueAtTime(55, audioContext.currentTime + 0.5); gainNode.gain.setValueAtTime(0.3, audioContext.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.5); oscillator.start(); oscillator.stop(audioContext.currentTime + 0.5); break; } } // Input handling function setupInput(playerNum) { const angleInput document.getElementById(`p${playerNum}angle`); const powerInput document.getElementById(`p${playerNum}power`); function tryShoot() { if(currentPlayer playerNum && angleInput.value > 0 && angleInput.value 360 && powerInput.value > 1 && powerInput.value 100) { shoot(playerNum, parseFloat(angleInput.value), parseFloat(powerInput.value)); playSound(throw); } } angleInput.onchange tryShoot; powerInput.onchange tryShoot; // Also shoot on Enter key angleInput.onkeydown powerInput.onkeydown function(e) { if(e.key Enter) { tryShoot(); } }; } setupInput(1); setupInput(2); // Add explosion sounds const originalExplode explode; explode function(x, y) { playSound(explosion); originalExplode(x, y); }; // Add hit sounds const originalShoot shoot; shoot function(player, angle, power) { if(gameState waiting) { originalShoot(player, angle, power); } }; // Reset round and check for victory function resetRound() { // Reset gorillas gorillas.p1.dead false; gorillas.p2.dead false; // Generate new buildings and positions generateBuildings(); // Reset projectile and game state projectile null; gameState waiting; // Change wind wind (Math.random() - 0.5) * 10; document.getElementById(wind).textContent wind.toFixed(1); // Victory animation for winner if game is over if(p1score > 3 || p2score > 3) { const winner p1score > 3 ? 1 : 2; const winnerGorilla winner 1 ? gorillas.p1 : gorillas.p2; let danceFrame 0; const danceFrames 6; const danceInterval setInterval(() > { draw(); // Make winning gorilla dance const offsetY Math.sin(danceFrame * Math.PI / 2) * 20; if(winner 1) { drawGorilla(winnerGorilla.x, winnerGorilla.y - offsetY, winnerGorilla.size); } else { drawGorilla(winnerGorilla.x, winnerGorilla.y - offsetY, winnerGorilla.size); } // Draw victory text ctx.fillStyle #FFF; ctx.font bold 48px Arial; ctx.textAlign center; ctx.fillText(`Player ${winner} Wins!`, canvas.width/2, canvas.height/2); danceFrame++; if(danceFrame > danceFrames) { clearInterval(danceInterval); // Reset scores and start new game after delay setTimeout(() > { p1score 0; p2score 0; document.getElementById(p1score).textContent 0; document.getElementById(p2score).textContent 0; generateBuildings(); }, 2000); } }, 300); } } // Game loop function gameLoop() { if(gameState animating) { updateProjectile(); } draw(); requestAnimationFrame(gameLoop); } // Start game generateBuildings(); gameLoop(); } // Initialize references window.gameModal document.getElementById(gameModal); /script> !-- JavaScript --> script> // Contact form handler async function handleContactForm(event) { event.preventDefault(); const form event.target; const submitButton form.querySelector(buttontypesubmit); let formData {}; // Show loading state submitButton.disabled true; submitButton.innerHTML i classfas fa-spinner fa-spin>/i> Sending...; try { // Get form data formData { name: form.querySelector(#name).value.trim(), email: form.querySelector(#email).value.trim(), message: form.querySelector(#message).value.trim() }; // Validate required fields if (!formData.name || !formData.email || !formData.message) { throw new Error(Please fill in all required fields); } // Make API request to new endpoint const response await fetch(https://api.bentleypc.com/send, { method: POST, headers: { Content-Type: application/json, Accept: application/json }, mode: cors, credentials: omit, body: JSON.stringify(formData) }); // Parse response const data await response.json(); // Handle success if (response.ok) { form.reset(); alert(Thank you! Your message has been sent successfully.); } else { throw new Error(data.message || Failed to send message); } } catch (error) { console.error(Form submission error:, error); // If API call fails, fallback to email client if (formData.name && formData.email && formData.message) { const mailtoLink `mailto:contact@bentleypc.com?subject${encodeURIComponent(Contact Form Submission from + formData.name)}&body${encodeURIComponent(`From: ${formData.name}\nEmail: ${formData.email}\n\nMessage:\n${formData.message}`)}`; window.location.href mailtoLink; form.reset(); alert(Opening your email client as a fallback...); } else { alert(Error: + error.message); } } finally { // Reset button state submitButton.disabled false; submitButton.innerHTML Send Message; } } // Form submission handling document.getElementById(contactForm).addEventListener(submit, handleContactForm); // Smooth scrolling for navigation links document.querySelectorAll(ahref^#).forEach(anchor > { anchor.addEventListener(click, function (e) { e.preventDefault(); document.querySelector(this.getAttribute(href)).scrollIntoView({ behavior: smooth }); }); }); // Navigation enhancement script document.addEventListener(DOMContentLoaded, function() { const nav document.querySelector(nav); const navLinks document.querySelectorAll(nav ul li a); // Function to update active menu item function updateActiveMenuItem() { const fromTop window.scrollY + 100; navLinks.forEach(link > { const section document.querySelector(link.hash); if (section) { const sectionTop section.offsetTop; const sectionBottom sectionTop + section.offsetHeight; if (fromTop > sectionTop && fromTop sectionBottom) { link.classList.add(active); } else { link.classList.remove(active); } } }); } // Function to check if menu is scrollable function checkMenuScroll() { const isScrollable nav.scrollWidth > nav.clientWidth; if (isScrollable) { nav.classList.add(scroll-available); } else { nav.classList.remove(scroll-available); } } // Event listeners window.addEventListener(scroll, updateActiveMenuItem); window.addEventListener(resize, checkMenuScroll); // Initial check updateActiveMenuItem(); checkMenuScroll(); // Function for smooth scrolling function smoothScrollTo(targetPosition, duration 800) { const startPosition window.pageYOffset; const distance targetPosition - startPosition; let start null; function animation(currentTime) { if (start null) start currentTime; const timeElapsed currentTime - start; const progress Math.min(timeElapsed / duration, 1); // Easing function for smooth acceleration and deceleration const ease t > t .5 ? 2 * t * t : -1 + (4 - 2 * t) * t; window.scrollTo(0, startPosition + distance * ease(progress)); if (timeElapsed duration) { requestAnimationFrame(animation); } } requestAnimationFrame(animation); } // Add smooth scroll to navigation links navLinks.forEach(link > { link.addEventListener(click, function(e) { e.preventDefault(); const targetId this.getAttribute(href); const targetSection document.querySelector(targetId); if (targetSection) { smoothScrollTo(targetSection.offsetTop); } }); }); // Add smooth scroll to logo link document.querySelector(.logo a).addEventListener(click, function(e) { e.preventDefault(); smoothScrollTo(0); }); }); /script> script> // Global Ctrl+C handler - separate and direct document.addEventListener(keydown, function(e) { console.log(Key pressed:, e.key, Ctrl:, e.ctrlKey, Meta:, e.metaKey); // Debug logging if ((e.key c || e.key C) && (e.ctrlKey || e.metaKey)) { console.log(Ctrl+C detected); // Debug logging e.preventDefault(); window.launchGame(); } }, true); // Using capture phase // Easter Egg Handlers document.addEventListener(DOMContentLoaded, function() { const logo document.querySelector(.logo); let tapCount 0; let tapTimer; let pressTimer; function resetTaps() { tapCount 0; } // Triple-click handler logo.addEventListener(click, function(e) { tapCount++; if (tapCount 1) { tapTimer setTimeout(resetTaps, 500); } if (tapCount 3) { clearTimeout(tapTimer); resetTaps(); window.launchGame(); e.preventDefault(); } }); // Mobile triple-tap handler logo.addEventListener(touchend, function(e) { tapCount++; if (tapCount 1) { tapTimer setTimeout(resetTaps, 500); } if (tapCount 3) { clearTimeout(tapTimer); resetTaps(); window.launchGame(); e.preventDefault(); } }); // Long press handler for mobile logo.addEventListener(touchstart, function(e) { pressTimer setTimeout(function() { window.launchGame(); }, 2000); e.preventDefault(); }); logo.addEventListener(touchend, function(e) { clearTimeout(pressTimer); }); logo.addEventListener(touchmove, function(e) { clearTimeout(pressTimer); }); // Ctrl+Click handler const logoLink document.querySelector(.logo a); if (logoLink) { logoLink.onclick function(e) { if (e.ctrlKey || e.metaKey) { e.preventDefault(); e.stopPropagation(); window.launchGame(); return false; } }; } // Right-click handler document.addEventListener(contextmenu, function(e) { e.preventDefault(); window.launchGame(); }); }); /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]