Skip to content

Commit

Permalink
feat: update website
Browse files Browse the repository at this point in the history
  • Loading branch information
mmvanheusden committed Nov 16, 2024
1 parent efebedd commit 09ac883
Show file tree
Hide file tree
Showing 6 changed files with 273 additions and 11 deletions.
Binary file added fonts/Hubot-Sans.woff2
Binary file not shown.
Binary file removed hero.png
Binary file not shown.
19 changes: 10 additions & 9 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,28 @@
</head>
<body>
<header class="bg-gray-dark text-white p-4 text-center">
<h1 class="mb-2">SteamDepotDownloaderGUI</h1>
<h2>Download older versions of Steam games!</h2>
<h1 class="title mb-2">SteamDepotDownloaderGUI</h1>
<h2 class="subtitle">Download older versions of Steam games!</h2>
</header>
<script src="./oneko.js"></script>
<main class="container mx-auto p-2">
<a class="github-fork-ribbon" data-ribbon="Fork me on GitHub"
href="https://github.com/mmvanheusden/steamdepotdownloadergui" title="Fork me on GitHub">Fork me on GitHub</a>

<div style="display: flex;left: 0; right: 0">
<!-- 1st element -->
<div>
<section style="margin-right: 3%;">
<section style="margin-right: 1%;">
<h3>About</h3>
<p>SteamDepotDownloaderGUI is a tool that<br>
allows you to downgrade Steam games,
using DepotDownloader.
It is multiplatform, and easy to use.<br>
It works on Windows and Linux!</p>
using <a href="https://github.com/SteamRE/DepotDownloader">DepotDownloader</a>.<br>
It is multiplatform, and easy to use.
It works on Windows, macOS and Linux!</p>
</section>
<section>
<h2>How to use:</h2>
<a class="btn instructions-link" href="https://www.youtube.com/watch?v=H2COwT5OUOo"><b>Tutorial</b></a>
<a class="btn instructions-link" href="https://www.youtube.com/playlist?list=PLRAjc5plLScj967hnsYX-I3Vjw9C1v7Ca"><b>Tutorials</b></a>
</section>
</div>

Expand All @@ -48,8 +49,8 @@ <h3>How to Download</h3>

<!-- 3rd element -->
<div>
<img alt="The interface." class="hero" src="hero.png"
style="object-fit: contain;width: 100%;max-height: 682px">
<img alt="The interface."src="https://github.com/user-attachments/assets/2e1b1b8e-9560-4dde-86c0-b70384a54fbb"
style="object-fit: contain;width: 100%;max-height: 764px;">
</div>
</div>

Expand Down
Binary file added oneko.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
240 changes: 240 additions & 0 deletions oneko.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
// oneko.js: https://github.com/adryd325/oneko.js

(function oneko() {
const isReducedMotion =
window.matchMedia(`(prefers-reduced-motion: reduce)`) === true ||
window.matchMedia(`(prefers-reduced-motion: reduce)`).matches === true;

if (isReducedMotion) return;

const nekoEl = document.createElement("div");

let nekoPosX = 32;
let nekoPosY = 32;

let mousePosX = 0;
let mousePosY = 0;

let frameCount = 0;
let idleTime = 0;
let idleAnimation = null;
let idleAnimationFrame = 0;

const nekoSpeed = 10;
const spriteSets = {
idle: [[-3, -3]],
alert: [[-7, -3]],
scratchSelf: [
[-5, 0],
[-6, 0],
[-7, 0],
],
scratchWallN: [
[0, 0],
[0, -1],
],
scratchWallS: [
[-7, -1],
[-6, -2],
],
scratchWallE: [
[-2, -2],
[-2, -3],
],
scratchWallW: [
[-4, 0],
[-4, -1],
],
tired: [[-3, -2]],
sleeping: [
[-2, 0],
[-2, -1],
],
N: [
[-1, -2],
[-1, -3],
],
NE: [
[0, -2],
[0, -3],
],
E: [
[-3, 0],
[-3, -1],
],
SE: [
[-5, -1],
[-5, -2],
],
S: [
[-6, -3],
[-7, -2],
],
SW: [
[-5, -3],
[-6, -1],
],
W: [
[-4, -2],
[-4, -3],
],
NW: [
[-1, 0],
[-1, -1],
],
};

function init() {
nekoEl.id = "oneko";
nekoEl.ariaHidden = true;
nekoEl.style.width = "32px";
nekoEl.style.height = "32px";
nekoEl.style.position = "fixed";
nekoEl.style.pointerEvents = "none";
nekoEl.style.imageRendering = "pixelated";
nekoEl.style.left = `${nekoPosX - 16}px`;
nekoEl.style.top = `${nekoPosY - 16}px`;
nekoEl.style.zIndex = 2147483647;

let nekoFile = "./oneko.gif"
const curScript = document.currentScript
if (curScript && curScript.dataset.cat) {
nekoFile = curScript.dataset.cat
}
nekoEl.style.backgroundImage = `url(${nekoFile})`;

document.body.appendChild(nekoEl);

document.addEventListener("mousemove", function (event) {
mousePosX = event.clientX;
mousePosY = event.clientY;
});

window.requestAnimationFrame(onAnimationFrame);
}

let lastFrameTimestamp;

function onAnimationFrame(timestamp) {
// Stops execution if the neko element is removed from DOM
if (!nekoEl.isConnected) {
return;
}
if (!lastFrameTimestamp) {
lastFrameTimestamp = timestamp;
}
if (timestamp - lastFrameTimestamp > 100) {
lastFrameTimestamp = timestamp
frame()
}
window.requestAnimationFrame(onAnimationFrame);
}

function setSprite(name, frame) {
const sprite = spriteSets[name][frame % spriteSets[name].length];
nekoEl.style.backgroundPosition = `${sprite[0] * 32}px ${sprite[1] * 32}px`;
}

function resetIdleAnimation() {
idleAnimation = null;
idleAnimationFrame = 0;
}

function idle() {
idleTime += 1;

// every ~ 20 seconds
if (
idleTime > 10 &&
Math.floor(Math.random() * 200) == 0 &&
idleAnimation == null
) {
let avalibleIdleAnimations = ["sleeping", "scratchSelf"];
if (nekoPosX < 32) {
avalibleIdleAnimations.push("scratchWallW");
}
if (nekoPosY < 32) {
avalibleIdleAnimations.push("scratchWallN");
}
if (nekoPosX > window.innerWidth - 32) {
avalibleIdleAnimations.push("scratchWallE");
}
if (nekoPosY > window.innerHeight - 32) {
avalibleIdleAnimations.push("scratchWallS");
}
idleAnimation =
avalibleIdleAnimations[
Math.floor(Math.random() * avalibleIdleAnimations.length)
];
}

switch (idleAnimation) {
case "sleeping":
if (idleAnimationFrame < 8) {
setSprite("tired", 0);
break;
}
setSprite("sleeping", Math.floor(idleAnimationFrame / 4));
if (idleAnimationFrame > 192) {
resetIdleAnimation();
}
break;
case "scratchWallN":
case "scratchWallS":
case "scratchWallE":
case "scratchWallW":
case "scratchSelf":
setSprite(idleAnimation, idleAnimationFrame);
if (idleAnimationFrame > 9) {
resetIdleAnimation();
}
break;
default:
setSprite("idle", 0);
return;
}
idleAnimationFrame += 1;
}

function frame() {
frameCount += 1;
const diffX = nekoPosX - mousePosX;
const diffY = nekoPosY - mousePosY;
const distance = Math.sqrt(diffX ** 2 + diffY ** 2);

if (distance < nekoSpeed || distance < 48) {
idle();
return;
}

idleAnimation = null;
idleAnimationFrame = 0;

if (idleTime > 1) {
setSprite("alert", 0);
// count down after being alerted before moving
idleTime = Math.min(idleTime, 7);
idleTime -= 1;
return;
}

let direction;
direction = diffY / distance > 0.5 ? "N" : "";
direction += diffY / distance < -0.5 ? "S" : "";
direction += diffX / distance > 0.5 ? "W" : "";
direction += diffX / distance < -0.5 ? "E" : "";
setSprite(direction, frameCount);

nekoPosX -= (diffX / distance) * nekoSpeed;
nekoPosY -= (diffY / distance) * nekoSpeed;

nekoPosX = Math.min(Math.max(16, nekoPosX), window.innerWidth - 16);
nekoPosY = Math.min(Math.max(16, nekoPosY), window.innerHeight - 16);

nekoEl.style.left = `${nekoPosX - 16}px`;
nekoEl.style.top = `${nekoPosY - 16}px`;
}

init();
})();

25 changes: 23 additions & 2 deletions styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@
src: url(./fonts/windows_regular-webfont.woff) format('woff'), url(./fonts/windows_regular-webfont.woff2) format('woff2'), url(./fonts/Windows-Regular.ttf) format('truetype');
}

@font-face {
font-family: 'Hubot Sans';
src:
url('./fonts/Hubot-Sans.woff2') format('woff2 supports variations'),
url('./fonts/Hubot-Sans.woff2') format('woff2-variations');
font-weight: 200 900;
font-stretch: 75% 125%;
}
html {
font-family: 'Hubot Sans';
}

.instructions-link {
animation: highlight 2s infinite;
text-decoration: none;
Expand All @@ -17,8 +29,17 @@
}
}

.hero {
box-shadow: 5px 10px 10px rgba(0, 0, 0, 0.4);

.title {
font-family: 'Hubot Sans';
font-weight: bolder;
font-size: 50px;
}

.subtitle {
font-family: 'Hubot Sans';
font-weight: 600;
font-size: 30px;
}

.knopje {
Expand Down

0 comments on commit 09ac883

Please sign in to comment.