From 898b52edcb47bcb3e9d6106e74ca73e74ea01e70 Mon Sep 17 00:00:00 2001 From: sillylaird Date: Thu, 3 Sep 2026 00:33:59 +0000 Subject: import live www.sillylaird.ca webroot --- gaming/collection/_lib.php | 366 +++++++++++++++++++++++ gaming/collection/admin.php | 1 + gaming/collection/consoles.php | 36 +++ gaming/collection/consoles_jp.php | 1 + gaming/collection/consoles_zh.php | 1 + gaming/collection/games.json | 145 +++++++++ gaming/collection/hardware.php | 36 +++ gaming/collection/hardware_jp.php | 1 + gaming/collection/hardware_zh.php | 1 + gaming/collection/images/.gitkeep | 0 gaming/collection/index.php | 36 +++ gaming/collection/index_jp.php | 1 + gaming/collection/index_zh.php | 1 + gaming/collection/packs.php | 36 +++ gaming/collection/packs_jp.php | 1 + gaming/collection/packs_zh.php | 1 + gaming/collection/tech.php | 4 + gaming/collection/tech_jp.php | 1 + gaming/collection/tech_zh.php | 1 + gaming/collection/wishlist.php | 45 +++ gaming/collection/wishlist_jp.php | 1 + gaming/collection/wishlist_zh.php | 1 + gaming/index.php | 78 +++++ gaming/index_jp.php | 65 ++++ gaming/index_zh.php | 65 ++++ gaming/multibox/global_styles.css | 53 ++++ gaming/multibox/index.php | 101 +++++++ gaming/multibox/index_jp.php | 100 +++++++ gaming/multibox/index_zh.php | 100 +++++++ gaming/multibox/styles.css | 54 ++++ gaming/multibox/what-is-multiboxing/index.php | 77 +++++ gaming/multibox/what-is-multiboxing/index_jp.php | 77 +++++ gaming/multibox/what-is-multiboxing/index_zh.php | 77 +++++ gaming/multibox/what-is-multiboxing/styles.css | 54 ++++ gaming/runescape/_lib.php | 182 +++++++++++ gaming/runescape/data.json | 95 ++++++ gaming/runescape/index.php | 139 +++++++++ gaming/runescape/index_jp.php | 66 ++++ gaming/runescape/index_zh.php | 66 ++++ gaming/runescape/runescape.png | Bin 0 -> 206939 bytes gaming/specialforce/SpecialForce_Launcher.exe | Bin 0 -> 2378840 bytes gaming/specialforce/index.php | 57 ++++ gaming/specialforce/index_jp.php | 57 ++++ gaming/specialforce/index_zh.php | 57 ++++ gaming/specialforce/style.css | 174 +++++++++++ gaming/stepmania/index.php | 100 +++++++ gaming/stepmania/index_jp.php | 100 +++++++ gaming/stepmania/index_zh.php | 100 +++++++ gaming/stepmania/script.js | 46 +++ gaming/stepmania/style.css | 139 +++++++++ 50 files changed, 2996 insertions(+) create mode 100644 gaming/collection/_lib.php create mode 100644 gaming/collection/admin.php create mode 100644 gaming/collection/consoles.php create mode 100644 gaming/collection/consoles_jp.php create mode 100644 gaming/collection/consoles_zh.php create mode 100644 gaming/collection/games.json create mode 100644 gaming/collection/hardware.php create mode 100644 gaming/collection/hardware_jp.php create mode 100644 gaming/collection/hardware_zh.php create mode 100644 gaming/collection/images/.gitkeep create mode 100644 gaming/collection/index.php create mode 100644 gaming/collection/index_jp.php create mode 100644 gaming/collection/index_zh.php create mode 100644 gaming/collection/packs.php create mode 100644 gaming/collection/packs_jp.php create mode 100644 gaming/collection/packs_zh.php create mode 100644 gaming/collection/tech.php create mode 100644 gaming/collection/tech_jp.php create mode 100644 gaming/collection/tech_zh.php create mode 100644 gaming/collection/wishlist.php create mode 100644 gaming/collection/wishlist_jp.php create mode 100644 gaming/collection/wishlist_zh.php create mode 100644 gaming/index.php create mode 100644 gaming/index_jp.php create mode 100644 gaming/index_zh.php create mode 100644 gaming/multibox/global_styles.css create mode 100644 gaming/multibox/index.php create mode 100644 gaming/multibox/index_jp.php create mode 100644 gaming/multibox/index_zh.php create mode 100644 gaming/multibox/styles.css create mode 100644 gaming/multibox/what-is-multiboxing/index.php create mode 100644 gaming/multibox/what-is-multiboxing/index_jp.php create mode 100644 gaming/multibox/what-is-multiboxing/index_zh.php create mode 100644 gaming/multibox/what-is-multiboxing/styles.css create mode 100644 gaming/runescape/_lib.php create mode 100644 gaming/runescape/data.json create mode 100644 gaming/runescape/index.php create mode 100644 gaming/runescape/index_jp.php create mode 100644 gaming/runescape/index_zh.php create mode 100644 gaming/runescape/runescape.png create mode 100644 gaming/specialforce/SpecialForce_Launcher.exe create mode 100644 gaming/specialforce/index.php create mode 100644 gaming/specialforce/index_jp.php create mode 100644 gaming/specialforce/index_zh.php create mode 100644 gaming/specialforce/style.css create mode 100644 gaming/stepmania/index.php create mode 100644 gaming/stepmania/index_jp.php create mode 100644 gaming/stepmania/index_zh.php create mode 100644 gaming/stepmania/script.js create mode 100644 gaming/stepmania/style.css (limited to 'gaming') diff --git a/gaming/collection/_lib.php b/gaming/collection/_lib.php new file mode 100644 index 0000000..6208465 --- /dev/null +++ b/gaming/collection/_lib.php @@ -0,0 +1,366 @@ + [], 'hardware' => [], 'systems' => [], 'online' => []]; + if (!is_file($path)) { + return $empty; + } + $raw = file_get_contents($path); + if ($raw === false || trim($raw) === '') { + return $empty; + } + $data = json_decode($raw, true); + if (!is_array($data)) { + return $empty; + } + // Prefer consoles; fall back to legacy videogames key. + $consoles = $data['consoles'] ?? $data['videogames'] ?? []; + return [ + 'consoles' => is_array($consoles) ? $consoles : [], + 'hardware' => is_array($data['hardware'] ?? null) ? $data['hardware'] : [], + 'systems' => is_array($data['systems'] ?? null) ? $data['systems'] : [], + 'online' => is_array($data['online'] ?? null) ? $data['online'] : [], + ]; +} + +function collection_image_src(string $image): string { + $image = trim($image); + if ($image === '') { + return ''; + } + if (str_starts_with($image, 'http://') || str_starts_with($image, 'https://') || str_starts_with($image, '/')) { + return $image; + } + if (str_contains($image, '..') || str_contains($image, "\0")) { + return ''; + } + return '/gaming/collection/images/' . rawurlencode(basename($image)); +} + +function collection_status_class(string $status): string { + $slug = strtolower(preg_replace('/[^a-z0-9]+/i', '-', $status) ?? ''); + $slug = trim($slug, '-'); + return $slug !== '' ? 'status-' . $slug : 'status-other'; +} + +function collection_safe_href(string $url): string { + $url = trim($url); + if ($url === '') { + return ''; + } + if (str_starts_with($url, '/')) { + return str_starts_with($url, '//') ? '' : $url; + } + $scheme = strtolower((string)(parse_url($url, PHP_URL_SCHEME) ?? '')); + if (in_array($scheme, ['http', 'https', 'gemini', 'gopher'], true)) { + return $url; + } + return ''; +} + +/** + * Inventory rows (name :: model) from a flat list (consoles or hardware). + * @param list> $items + * @return list}> + */ +function collection_inventory_rows(array $items): array { + $rows = []; + foreach ($items as $item) { + if (!is_array($item)) continue; + $name = trim((string)($item['name'] ?? '')); + $model = trim((string)($item['model'] ?? '')); + if ($name === '') continue; + if ($model === '') $model = $name; + $status = (string)($item['status'] ?? 'Owned'); + $rows[] = [ + 'left' => $name, + 'right' => $model, + 'status' => $status, + 'notes' => (string)($item['notes'] ?? ''), + 'image' => (string)($item['image'] ?? ''), + 'url' => '', + 'specs' => [ + ['label' => t('collection.spec_system'), 'value' => $name], + ['label' => t('collection.spec_status'), 'value' => $status], + ], + ]; + } + return $rows; +} + +/** Consoles inventory. */ +function collection_console_rows(array $data): array { + return collection_inventory_rows($data['consoles'] ?? []); +} + +/** Hardware inventory. */ +function collection_hardware_inventory_rows(array $data): array { + return collection_inventory_rows($data['hardware'] ?? []); +} + +/** @deprecated use collection_console_rows */ +function collection_videogame_rows(array $data): array { + return collection_console_rows($data); +} + +/** + * Video games library: titles under systems (system :: title). + * @return list}> + */ +function collection_games_library_rows(array $data): array { + $rows = []; + foreach (($data['systems'] ?? []) as $sys) { + if (!is_array($sys)) continue; + $left = (string)($sys['name'] ?? ''); + foreach (($sys['games'] ?? []) as $game) { + if (!is_array($game)) continue; + $title = trim((string)($game['title'] ?? '')); + if ($title === '') continue; + $status = (string)($game['status'] ?? 'Owned'); + $rows[] = [ + 'left' => $left, + 'right' => $title, + 'status' => $status, + 'notes' => (string)($game['notes'] ?? ''), + 'image' => (string)($game['image'] ?? ''), + 'url' => '', + 'specs' => [ + ['label' => t('collection.spec_system'), 'value' => $left], + ['label' => t('collection.spec_status'), 'value' => $status], + ], + ]; + } + } + return $rows; +} + +/** @deprecated */ +function collection_tech_rows(array $data): array { + return collection_games_library_rows($data); +} + +/** @deprecated */ +function collection_hardware_rows(array $data): array { + return collection_games_library_rows($data); +} + +/** + * Flatten online song packs into catalog rows. + * @return list}> + */ +function collection_pack_rows(array $data): array { + $rows = []; + foreach ($data['online'] as $cat) { + if (!is_array($cat)) continue; + $left = (string)($cat['name'] ?? ''); + foreach (($cat['entries'] ?? []) as $entry) { + if (!is_array($entry)) continue; + $title = trim((string)($entry['title'] ?? '')); + if ($title === '') continue; + $status = (string)($entry['status'] ?? 'Owned'); + $url = (string)($entry['url'] ?? ''); + $specs = [ + ['label' => t('collection.spec_game'), 'value' => $left], + ['label' => t('collection.spec_status'), 'value' => $status], + ]; + if ($url !== '') { + $specs[] = ['label' => t('collection.spec_link'), 'value' => t('collection.spec_link_yes')]; + } + $rows[] = [ + 'left' => $left, + 'right' => $title, + 'status' => $status, + 'notes' => (string)($entry['notes'] ?? ''), + 'image' => (string)($entry['image'] ?? ''), + 'url' => $url, + 'specs' => $specs, + ]; + } + } + return $rows; +} + +/** + * @param list $rows + * @return list + */ +function collection_filter_wishlist(array $rows): array { + return array_values(array_filter( + $rows, + static fn(array $r) => strcasecmp((string)($r['status'] ?? ''), 'Wishlist') === 0 + )); +} + +/** + * Render one catalog row (photo + name + icon-style specs). + * @param array{left:string,right:string,status:string,notes:string,image:string,url:string,specs?:array} $row + */ +function collection_render_row(array $row): void { + $left = (string)($row['left'] ?? ''); + $right = (string)($row['right'] ?? ''); + $status = (string)($row['status'] ?? 'Owned'); + $notes = (string)($row['notes'] ?? ''); + $img = collection_image_src((string)($row['image'] ?? '')); + $href = collection_safe_href((string)($row['url'] ?? '')); + $specs = is_array($row['specs'] ?? null) ? $row['specs'] : []; + $he = 'collection_he'; + $h = 'collection_h'; + ?> +
+
+ + + + + + + +
+
+

+ + + :: + + + + :: + + +

+ +

+ +

+ + + + + + + + + + + + +

+
+
+ 'en', 'ja' => 'ja', 'zh' => 'zh'][$lang] ?? 'en'; + $suffix = ['en' => '', 'ja' => '_jp', 'zh' => '_zh'][$lang] ?? ''; + $selfName = $baseFile . $suffix . '.php'; + if ($baseFile === 'index' && $lang === 'en') { + $selfUrl = 'https://www.sillylaird.ca/gaming/collection/'; + $enUrl = 'https://www.sillylaird.ca/gaming/collection/'; + } else { + $selfUrl = 'https://www.sillylaird.ca/gaming/collection/' . $selfName; + $enUrl = 'https://www.sillylaird.ca/gaming/collection/' . ($baseFile === 'index' ? '' : $baseFile . '.php'); + if ($baseFile === 'index') { + $enUrl = 'https://www.sillylaird.ca/gaming/collection/'; + } + } + $jaUrl = 'https://www.sillylaird.ca/gaming/collection/' . $baseFile . '_jp.php'; + $zhUrl = 'https://www.sillylaird.ca/gaming/collection/' . $baseFile . '_zh.php'; + if ($baseFile === 'index') { + $jaUrl = 'https://www.sillylaird.ca/gaming/collection/index_jp.php'; + $zhUrl = 'https://www.sillylaird.ca/gaming/collection/index_zh.php'; + } + $h = 'collection_h'; + // Video Games / Consoles / Hardware / Song Packs / Wishlist + if ($lang === 'ja') { + $hrefGames = '/gaming/collection/index_jp.php'; + $hrefCons = '/gaming/collection/consoles_jp.php'; + $hrefHw = '/gaming/collection/hardware_jp.php'; + $hrefPk = '/gaming/collection/packs_jp.php'; + $hrefWl = '/gaming/collection/wishlist_jp.php'; + } elseif ($lang === 'zh') { + $hrefGames = '/gaming/collection/index_zh.php'; + $hrefCons = '/gaming/collection/consoles_zh.php'; + $hrefHw = '/gaming/collection/hardware_zh.php'; + $hrefPk = '/gaming/collection/packs_zh.php'; + $hrefWl = '/gaming/collection/wishlist_zh.php'; + } else { + $hrefGames = '/gaming/collection/'; + $hrefCons = '/gaming/collection/consoles.php'; + $hrefHw = '/gaming/collection/hardware.php'; + $hrefPk = '/gaming/collection/packs.php'; + $hrefWl = '/gaming/collection/wishlist.php'; + } + $act = static fn(string $key) => $active === $key ? ' class="gc-menu-active" id="gc-main"' : ''; + ?> + + + + + + <?= collection_he($pageTitle) ?> + $lang, + 'title' => $pageTitle, + 'desc' => $pageDesc, + 'base' => 'gaming/collection/' . $baseFile, + 'self_url' => $selfUrl, + 'en_url' => $enUrl, + 'x_default' => $enUrl, + 'ja_url' => $jaUrl, + 'zh_url' => $zhUrl, + ]; + include __DIR__ . '/../../partials/head_meta.php'; + ?> + + + + + + + + + +
+

+ + +
+ + + + +

+

+ + +

+ +
+ +
+ + + + +

+

+ + +

+ +
+ +
+ + + + +

+

+ + +

+ +
+ +
+ + + + +

+

+ + +

+ +
+ +
+ + + + +

+

+ + +

+ +
+ +
+ + + + + + + + + + Gaming — SillyLaird + + 'en', + 'title' => 'Gaming — SillyLaird', + 'desc' => 'Games I play and projects I mess with — RuneScape, StepMania, SoldierFront, and more.', + 'base' => 'gaming/index', + 'self_url' => 'https://www.sillylaird.ca/gaming/', + 'en_url' => 'https://www.sillylaird.ca/gaming/', + 'x_default' => 'https://www.sillylaird.ca/gaming/', + 'ja_url' => 'https://www.sillylaird.ca/gaming/index_jp.php', + 'zh_url' => 'https://www.sillylaird.ca/gaming/index_zh.php', + ]; + include __DIR__ . '/../partials/head_meta.php'; +?> + + + + + + + + + + + + + + +
+
+

Gaming

+

Pages for games and projects.

+ +
+
+ + Video Games / Consoles / Hardware / Song Packs / Wishlist.
+ Video Games + / Consoles + / Hardware + / Song Packs + / Wishlist +
+
+ +
+
+
Rhythm-game bench
+ Current setup notes live alongside the collection: DTXMania / GITADORA configurations, pop'n music links, StepMania, and the occasional Super Scope session. +
Browse song packs · Open StepMania +
+
+ +
    +
  • RuneScape +
  • +
  • SpecialForce / SoldierFront
  • +
  • StepMania +
  • +
  • MMO Multibox +
  • +
+
+
+ + + + + diff --git a/gaming/index_jp.php b/gaming/index_jp.php new file mode 100644 index 0000000..553a981 --- /dev/null +++ b/gaming/index_jp.php @@ -0,0 +1,65 @@ + + + + + + ゲーム — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

ゲーム

+

Pages for games and projects.

+ +
+
+ + ビデオゲーム / 本体 / ハードウェア / 楽曲パック / ウィッシュリスト。
+ ビデオゲーム + / 本体 + / ハードウェア + / 楽曲パック + / ウィッシュリスト +
+
+ +
    +
  • RuneScape
  • +
  • SpecialForce / SoldierFront
  • +
  • StepMania
  • +
  • MMO Multibox
  • +
+
+
+ + + + diff --git a/gaming/index_zh.php b/gaming/index_zh.php new file mode 100644 index 0000000..214e0ae --- /dev/null +++ b/gaming/index_zh.php @@ -0,0 +1,65 @@ + + + + + + 游戏 — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

游戏

+

Pages for games and projects.

+ +
+
+ + 电子游戏 / 主机 / 硬件 / 曲包 / 愿望单。
+ 电子游戏 + / 主机 + / 硬件 + / 曲包 + / 愿望单 +
+
+ +
    +
  • RuneScape
  • +
  • SpecialForce / SoldierFront
  • +
  • StepMania
  • +
  • MMO Multibox
  • +
+
+
+ + + + diff --git a/gaming/multibox/global_styles.css b/gaming/multibox/global_styles.css new file mode 100644 index 0000000..fe453ea --- /dev/null +++ b/gaming/multibox/global_styles.css @@ -0,0 +1,53 @@ +/* styles.css */ + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + margin: 0; + padding: 0; + background-color: #f4f4f4; + display: flex; + flex-direction: column; + min-height: 100vh; +} + +header { + background: #333; + color: #fff; + padding: 10px 0; + text-align: center; +} + +nav ul { + list-style: none; + padding: 0; +} + +nav ul li { + display: inline; + margin: 0 15px; +} + +nav ul li a { + color: #fff; + text-decoration: none; +} + +main { + padding: 20px; + flex: 1; +} + +h2 { + color: #333; +} + +footer { + background: #333; + color: #fff; + text-align: center; + padding: 10px 0; + position: fixed; + width: 100%; + bottom: 0; +} \ No newline at end of file diff --git a/gaming/multibox/index.php b/gaming/multibox/index.php new file mode 100644 index 0000000..11c5670 --- /dev/null +++ b/gaming/multibox/index.php @@ -0,0 +1,101 @@ + + + + + + Multiboxing — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Multiboxing in MMORPGs

+

Playing multiple characters at the same time.

+
+ +
+

What is Multiboxing?

+

Multiboxing is the practice of playing multiple characters at the same time in a Massively Multiplayer Online Role-Playing Game (MMORPG). This technique generally requires the use of multiple game accounts and can be achieved using different methods such as employing multiple computers, using specialized software, or even running multiple instances of the same game on a single computer.

+

Players who multibox often do so to gain advantages such as increased efficiency in resource gathering, leveling up multiple characters simultaneously, or taking on game content that would typically require a group of players.

+
+ +
+

Pros and Cons

+ +

Pros

+
    +
  • More control over your gameplay experience.
  • +
  • Ability to accomplish multi-character tasks solo.
  • +
  • Increased resource gathering and in-game efficiency.
  • +
+ +

Cons

+
    +
  • Requires significant hardware capabilities.
  • +
  • Can be costly due to multiple subscriptions.
  • +
  • Potential for breaches of game terms of service.
  • +
+
+ +
+

Getting Started

+

To begin multiboxing, you will need:

+
    +
  • Multiple game accounts.
  • +
  • A computer that can handle running multiple instances of the game.
  • +
  • Knowledge of key broadcasting software.
  • +
+
+ +
+

Tools and Software

+
    +
  • ISBoxer
  • +
  • HotkeyNet
  • +
  • AutoHotkey
  • +
+
+ +
+

Examples on YouTube

+ +

+

OSRS/RuneScape MultiBoxing

+ +

+

WOW MultiBoxing

+ +

+

TF2 Cheating "MultiBoxing"

+
+
+ + + + diff --git a/gaming/multibox/index_jp.php b/gaming/multibox/index_jp.php new file mode 100644 index 0000000..ee09b1e --- /dev/null +++ b/gaming/multibox/index_jp.php @@ -0,0 +1,100 @@ + + + + + + Multiboxing — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Multiboxing in MMORPGs

+

Playing multiple characters at the same time.

+
+ +
+

What is Multiboxing?

+

Multiboxing is a term used in MMORPGs that refers to playing multiple characters simultaneously. This is usually done using multiple accounts, computers, or software.

+
+ +
+

Pros and Cons

+ +

Pros

+
    +
  • More control over your gameplay experience.
  • +
  • Ability to accomplish multi-character tasks solo.
  • +
  • Increased resource gathering and in-game efficiency.
  • +
+ +

Cons

+
    +
  • Requires significant hardware capabilities.
  • +
  • Can be costly due to multiple subscriptions.
  • +
  • Potential for breaches of game terms of service.
  • +
+
+ +
+

Getting Started

+

To begin multiboxing, you will need:

+
    +
  • Multiple game accounts.
  • +
  • A computer that can handle running multiple instances of the game.
  • +
  • Knowledge of key broadcasting software.
  • +
+
+ +
+

Tools and Software

+
    +
  • ISBoxer
  • +
  • HotkeyNet
  • +
  • AutoHotkey
  • +
+
+ +
+

Examples on YouTube

+ +

+

OSRS/RuneScape MultiBoxing

+ +

+

WOW MultiBoxing

+ +

+

TF2 Cheating "MultiBoxing"

+
+
+ + + + diff --git a/gaming/multibox/index_zh.php b/gaming/multibox/index_zh.php new file mode 100644 index 0000000..b8214ad --- /dev/null +++ b/gaming/multibox/index_zh.php @@ -0,0 +1,100 @@ + + + + + + Multiboxing — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Multiboxing in MMORPGs

+

Playing multiple characters at the same time.

+
+ +
+

What is Multiboxing?

+

Multiboxing is a term used in MMORPGs that refers to playing multiple characters simultaneously. This is usually done using multiple accounts, computers, or software.

+
+ +
+

Pros and Cons

+ +

Pros

+
    +
  • More control over your gameplay experience.
  • +
  • Ability to accomplish multi-character tasks solo.
  • +
  • Increased resource gathering and in-game efficiency.
  • +
+ +

Cons

+
    +
  • Requires significant hardware capabilities.
  • +
  • Can be costly due to multiple subscriptions.
  • +
  • Potential for breaches of game terms of service.
  • +
+
+ +
+

Getting Started

+

To begin multiboxing, you will need:

+
    +
  • Multiple game accounts.
  • +
  • A computer that can handle running multiple instances of the game.
  • +
  • Knowledge of key broadcasting software.
  • +
+
+ +
+

Tools and Software

+
    +
  • ISBoxer
  • +
  • HotkeyNet
  • +
  • AutoHotkey
  • +
+
+ +
+

Examples on YouTube

+ +

+

OSRS/RuneScape MultiBoxing

+ +

+

WOW MultiBoxing

+ +

+

TF2 Cheating "MultiBoxing"

+
+
+ + + + diff --git a/gaming/multibox/styles.css b/gaming/multibox/styles.css new file mode 100644 index 0000000..95dea86 --- /dev/null +++ b/gaming/multibox/styles.css @@ -0,0 +1,54 @@ +/* styles.css */ + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + margin: 0; + padding: 0; + background-color: #f4f4f4; + display: flex; + flex-direction: column; + min-height: 100vh; +} + +header { + background: #333; + color: #fff; + padding: 10px 0; + text-align: center; +} + +nav ul { + list-style: none; + padding: 0; +} + +nav ul li { + display: inline; + margin: 0 15px; +} + +nav ul li a { + color: #fff; + text-decoration: none; +} + +main { + padding: 20px; + flex: 1; + padding-bottom: 60px; /* Add bottom padding to ensure space for footer */ +} + +h2 { + color: #333; +} + +footer { + background: #333; + color: #fff; + text-align: center; + padding: 10px 0; + position: fixed; + width: 100%; + bottom: 0; +} \ No newline at end of file diff --git a/gaming/multibox/what-is-multiboxing/index.php b/gaming/multibox/what-is-multiboxing/index.php new file mode 100644 index 0000000..bc785b6 --- /dev/null +++ b/gaming/multibox/what-is-multiboxing/index.php @@ -0,0 +1,77 @@ + + + + + + What Is Multiboxing? — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

What is Multiboxing?

+

A longer explanation (methods, uses, examples).

+
+ +
+

Overview

+

Multiboxing is the practice of playing multiple characters at the same time in a Massively Multiplayer Online Role-Playing Game (MMORPG). This technique generally requires the use of multiple game accounts and can be achieved using different methods such as employing multiple computers, using specialized software, or even running multiple instances of the same game on a single computer.

+

Players who multibox often do so to gain advantages such as increased efficiency in resource gathering, leveling up multiple characters simultaneously, or taking on game content that would typically require a group of players.

+
+ +
+

Methods

+
    +
  • Multiple Computers: Several physical PCs, each running one account.
  • +
  • Virtual Machines: Multiple OS instances on one machine.
  • +
  • Software Solutions: Keystroke broadcasting / window management tools (game ToS varies).
  • +
+
+ +
+

Common Uses

+
    +
  • Solo Group Content: Do group content without other players.
  • +
  • Economy Control: Resource gathering / crafting on multiple chars.
  • +
  • Power Leveling: Level alts quickly with a main.
  • +
+
+ +
+

Examples

+

Old School RuneScape (OSRS)

+ +

World of Warcraft (WoW)

+ +
+
+ + + + diff --git a/gaming/multibox/what-is-multiboxing/index_jp.php b/gaming/multibox/what-is-multiboxing/index_jp.php new file mode 100644 index 0000000..a40037f --- /dev/null +++ b/gaming/multibox/what-is-multiboxing/index_jp.php @@ -0,0 +1,77 @@ + + + + + + What Is Multiboxing? — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

What is Multiboxing?

+

A longer explanation (methods, uses, examples).

+
+ +
+

Overview

+

Multiboxing is the practice of playing multiple characters at the same time in a Massively Multiplayer Online Role-Playing Game (MMORPG). This technique generally requires the use of multiple game accounts and can be achieved using different methods such as employing multiple computers, using specialized software, or even running multiple instances of the same game on a single computer.

+

Players who multibox often do so to gain advantages such as increased efficiency in resource gathering, leveling up multiple characters simultaneously, or taking on game content that would typically require a group of players.

+
+ +
+

Methods

+
    +
  • Multiple コンピューター: Several physical PCs, each running one account.
  • +
  • Virtual Machines: Multiple OS instances on one machine.
  • +
  • Software Solutions: Keystroke broadcasting / window management tools (game ToS varies).
  • +
+
+ +
+

Common Uses

+
    +
  • Solo Group Content: Do group content without other players.
  • +
  • Economy Control: Resource gathering / crafting on multiple chars.
  • +
  • Power Leveling: Level alts quickly with a main.
  • +
+
+ +
+

Examples

+

Old School RuneScape (OSRS)

+ +

World of Warcraft (WoW)

+ +
+
+ + + + diff --git a/gaming/multibox/what-is-multiboxing/index_zh.php b/gaming/multibox/what-is-multiboxing/index_zh.php new file mode 100644 index 0000000..4d9d18a --- /dev/null +++ b/gaming/multibox/what-is-multiboxing/index_zh.php @@ -0,0 +1,77 @@ + + + + + + What Is Multiboxing? — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

What is Multiboxing?

+

A longer explanation (methods, uses, examples).

+
+ +
+

Overview

+

Multiboxing is the practice of playing multiple characters at the same time in a Massively Multiplayer Online Role-Playing Game (MMORPG). This technique generally requires the use of multiple game accounts and can be achieved using different methods such as employing multiple computers, using specialized software, or even running multiple instances of the same game on a single computer.

+

Players who multibox often do so to gain advantages such as increased efficiency in resource gathering, leveling up multiple characters simultaneously, or taking on game content that would typically require a group of players.

+
+ +
+

Methods

+
    +
  • Multiple 电脑设备: Several physical PCs, each running one account.
  • +
  • Virtual Machines: Multiple OS instances on one machine.
  • +
  • Software Solutions: Keystroke broadcasting / window management tools (game ToS varies).
  • +
+
+ +
+

Common Uses

+
    +
  • Solo Group Content: Do group content without other players.
  • +
  • Economy Control: Resource gathering / crafting on multiple chars.
  • +
  • Power Leveling: Level alts quickly with a main.
  • +
+
+ +
+

Examples

+

Old School RuneScape (OSRS)

+ +

World of Warcraft (WoW)

+ +
+
+ + + + diff --git a/gaming/multibox/what-is-multiboxing/styles.css b/gaming/multibox/what-is-multiboxing/styles.css new file mode 100644 index 0000000..95dea86 --- /dev/null +++ b/gaming/multibox/what-is-multiboxing/styles.css @@ -0,0 +1,54 @@ +/* styles.css */ + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + margin: 0; + padding: 0; + background-color: #f4f4f4; + display: flex; + flex-direction: column; + min-height: 100vh; +} + +header { + background: #333; + color: #fff; + padding: 10px 0; + text-align: center; +} + +nav ul { + list-style: none; + padding: 0; +} + +nav ul li { + display: inline; + margin: 0 15px; +} + +nav ul li a { + color: #fff; + text-decoration: none; +} + +main { + padding: 20px; + flex: 1; + padding-bottom: 60px; /* Add bottom padding to ensure space for footer */ +} + +h2 { + color: #333; +} + +footer { + background: #333; + color: #fff; + text-align: center; + padding: 10px 0; + position: fixed; + width: 100%; + bottom: 0; +} \ No newline at end of file diff --git a/gaming/runescape/_lib.php b/gaming/runescape/_lib.php new file mode 100644 index 0000000..c8fbbab --- /dev/null +++ b/gaming/runescape/_lib.php @@ -0,0 +1,182 @@ + [], + 'screenshots' => [], + 'eras' => [], + 'links_section' => ['title' => 'Server Lists', 'disclaimer' => '', 'items' => []], + ]; + if (!is_file($path)) { + return $empty; + } + $raw = file_get_contents($path); + if ($raw === false || trim($raw) === '') { + return $empty; + } + $data = json_decode($raw, true); + if (!is_array($data)) { + return $empty; + } + $welcome = []; + foreach (($data['welcome'] ?? []) as $line) { + $line = trim((string)$line); + if ($line !== '') $welcome[] = $line; + } + $screenshots = []; + foreach (($data['screenshots'] ?? []) as $shot) { + if (!is_array($shot)) continue; + $filename = trim((string)($shot['filename'] ?? '')); + if ($filename === '' || str_contains($filename, '..') || str_contains($filename, '/')) continue; + $screenshots[] = [ + 'filename' => $filename, + 'caption' => (string)($shot['caption'] ?? ''), + ]; + } + $eras = []; + foreach (($data['eras'] ?? []) as $era) { + if (!is_array($era)) continue; + $title = trim((string)($era['title'] ?? '')); + if ($title === '') continue; + $servers = []; + foreach (($era['servers'] ?? []) as $srv) { + if (!is_array($srv)) continue; + $name = trim((string)($srv['name'] ?? '')); + if ($name === '') continue; + $url = trim((string)($srv['url'] ?? '')); + if ($url !== '' && !runescape_valid_url_or_path($url)) $url = ''; + $highlights = []; + foreach (($srv['highlights'] ?? []) as $hl) { + $hl = trim((string)$hl); + if ($hl !== '') $highlights[] = $hl; + } + $links = []; + foreach (($srv['links'] ?? []) as $lk) { + if (!is_array($lk)) continue; + $label = trim((string)($lk['label'] ?? '')); + $lurl = trim((string)($lk['url'] ?? '')); + if ($label === '' || $lurl === '' || !runescape_valid_url_or_path($lurl)) continue; + $links[] = ['label' => $label, 'url' => $lurl]; + } + $srvImage = trim((string)($srv['image'] ?? '')); + if ($srvImage !== '' && str_contains($srvImage, '..')) $srvImage = ''; + $servers[] = [ + 'id' => (string)($srv['id'] ?? ''), + 'name' => $name, + 'url' => $url, + 'featured' => !empty($srv['featured']), + 'desc' => (string)($srv['desc'] ?? ''), + 'highlights' => $highlights, + 'links' => $links, + 'image' => $srvImage, + ]; + } + $eraImage = trim((string)($era['image'] ?? '')); + if ($eraImage !== '' && str_contains($eraImage, '..')) $eraImage = ''; + $eras[] = [ + 'id' => (string)($era['id'] ?? ''), + 'title' => $title, + 'subtitle' => (string)($era['subtitle'] ?? ''), + 'image' => $eraImage, + 'servers' => $servers, + ]; + } + $linksSection = ['title' => 'Server Lists', 'disclaimer' => '', 'items' => []]; + if (is_array($data['links_section'] ?? null)) { + $ls = $data['links_section']; + $linksSection['title'] = trim((string)($ls['title'] ?? '')) ?: 'Server Lists'; + $linksSection['disclaimer'] = (string)($ls['disclaimer'] ?? ''); + foreach (($ls['items'] ?? []) as $item) { + if (!is_array($item)) continue; + $label = trim((string)($item['label'] ?? '')); + $lurl = trim((string)($item['url'] ?? '')); + if ($label === '' || $lurl === '' || !runescape_valid_url_or_path($lurl)) continue; + $linksSection['items'][] = ['label' => $label, 'url' => $lurl, 'desc' => (string)($item['desc'] ?? '')]; + } + } + return ['welcome' => $welcome, 'screenshots' => $screenshots, 'eras' => $eras, 'links_section' => $linksSection]; +} + +function runescape_screenshot_src(string $filename): string { + $filename = trim($filename); + if ($filename === '' || str_contains($filename, '..') || str_contains($filename, '/')) return ''; + return '/gaming/runescape/images/' . rawurlencode($filename); +} + +/** Public URL for an era/server image (uploaded filename, site path, or absolute URL). */ +function runescape_image_src(string $image): string { + $image = trim($image); + if ($image === '') return ''; + if (str_starts_with($image, 'http://') || str_starts_with($image, 'https://') || str_starts_with($image, '/')) { + return $image; + } + if (str_contains($image, '..') || str_contains($image, "\0")) return ''; + return '/gaming/runescape/images/' . rawurlencode(basename($image)); +} + +/** Render the Welcome list — lines like "::Label::" become bold headings, everything else is a bullet. */ +function runescape_render_welcome(array $lines): void { + $he = fn($s) => htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); + $inList = false; + foreach ($lines as $line) { + if (preg_match('/^::(.+)::$/', trim($line), $m)) { + if ($inList) { echo ''; $inList = false; } + echo '

' . $he(trim($m[1])) . '

'; + continue; + } + if (!$inList) { echo '
    '; $inList = true; } + echo '
  • ' . $he($line) . '
  • '; + } + if ($inList) echo '
'; +} + +/** Render one server card (used inside an era section). */ +function runescape_render_server(array $srv): void { + $he = fn($s) => htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); + $cardClass = $srv['featured'] ? 'machine machine--notes' : 'machine'; + $img = runescape_image_src((string)($srv['image'] ?? '')); + ?> +
+
+ + <?= $he($srv['name']) ?> + +
+
+ + + + + +
+ + + + +
    +
  • +
+ + +

+ $lk): ?> + 0 ? ' · ' : '' ?> + +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + RuneScape — SillyLaird + + + + + + + + + + + + +
+
+

RuneScape (OSRS)

+ + + +
+
+ RuneScape +
+
+ Page added: 2026-07-25
+ Last revised: 2026-07-25 +
+ + + +
Welcome
+
    +
  • A small fan page / launch pad — official OSRS plus private servers, grouped by era.
  • +
  • Servers listed below are unofficial preservation projects, not affiliated with Jagex Ltd.
  • +
  • Bookmark /gaming/runescape/ directly — server hosts change over time.
  • +
+ +
+
+
+
+ + +
+

+

+ + + <?= htmlspecialchars($era['title'], ENT_QUOTES, 'UTF-8') ?> + + + + + +
+ + + +
+

My Bank / Screenshots

+ +
+ +
+ <?= htmlspecialchars($shot['caption'] !== '' ? $shot['caption'] : 'RuneScape screenshot', ENT_QUOTES, 'UTF-8') ?> + +
+ +
+ +
+ +

Placeholder — swap these for real bank/inventory screenshots later.

+
+
Add screenshot 1
+
Add screenshot 2
+
Add screenshot 3
+
+ +
+ +
+ + +
    + +
  • + +
+ + +

+ +
+
+ + + + diff --git a/gaming/runescape/index_jp.php b/gaming/runescape/index_jp.php new file mode 100644 index 0000000..629dca9 --- /dev/null +++ b/gaming/runescape/index_jp.php @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RuneScape — SillyLaird + + + + + + + + + + + +
+
+

RuneScape (OSRS)

+

A small fan page / launch pad.

+ + Old School RuneScape Logo + +

+ Visit OSRS Wiki +

+
+ +
+

Essential Guides

+ +
+
+ + + + diff --git a/gaming/runescape/index_zh.php b/gaming/runescape/index_zh.php new file mode 100644 index 0000000..a2cf16f --- /dev/null +++ b/gaming/runescape/index_zh.php @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + RuneScape — SillyLaird + + + + + + + + + + + +
+
+

RuneScape (OSRS)

+

A small fan page / launch pad.

+ + Old School RuneScape Logo + +

+ Visit OSRS Wiki +

+
+ +
+

Essential Guides

+ +
+
+ + + + diff --git a/gaming/runescape/runescape.png b/gaming/runescape/runescape.png new file mode 100644 index 0000000..2eb0c44 Binary files /dev/null and b/gaming/runescape/runescape.png differ diff --git a/gaming/specialforce/SpecialForce_Launcher.exe b/gaming/specialforce/SpecialForce_Launcher.exe new file mode 100644 index 0000000..befd61f Binary files /dev/null and b/gaming/specialforce/SpecialForce_Launcher.exe differ diff --git a/gaming/specialforce/index.php b/gaming/specialforce/index.php new file mode 100644 index 0000000..804b54d --- /dev/null +++ b/gaming/specialforce/index.php @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SpecialForce — SillyLaird + + + + + + + + + + + +
+
+

SoldierFront / SpecialForce

+

Small page/wiki and file drop.

+ +

+ Wikipedia +

+
+ +
+

SpecialForce Launcher Files

+ +
+
+ + + + diff --git a/gaming/specialforce/index_jp.php b/gaming/specialforce/index_jp.php new file mode 100644 index 0000000..4a021fc --- /dev/null +++ b/gaming/specialforce/index_jp.php @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SpecialForce — SillyLaird + + + + + + + + + + + +
+
+

SoldierFront / SpecialForce

+

Small page/wiki and file drop.

+ +

+ Wikipedia +

+
+ +
+

SpecialForce Launcher Files

+ +
+
+ + + + diff --git a/gaming/specialforce/index_zh.php b/gaming/specialforce/index_zh.php new file mode 100644 index 0000000..bf28068 --- /dev/null +++ b/gaming/specialforce/index_zh.php @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SpecialForce — SillyLaird + + + + + + + + + + + +
+
+

SoldierFront / SpecialForce

+

Small page/wiki and file drop.

+ +

+ Wikipedia +

+
+ +
+

SpecialForce Launcher Files

+ +
+
+ + + + diff --git a/gaming/specialforce/style.css b/gaming/specialforce/style.css new file mode 100644 index 0000000..27758e1 --- /dev/null +++ b/gaming/specialforce/style.css @@ -0,0 +1,174 @@ +/* --- RESET & BASICS --------------------------------------------------- */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body { + margin: 0; + padding: 0; + font-family: system-ui, Helvetica, Arial, sans-serif; + line-height: 1.4; + background: #000; + color: var(--ink, #8b0000); +} + +body { + text-align: left; +} + +/* --- LAYOUT ----------------------------------------------------------- */ +header { + padding: 1rem 1.5rem; + background: #000; + display: flex; + flex-direction: column; + align-items: flex-start; + border-bottom: 1px solid #2a1010; +} + +main { + padding: 1.5rem; + margin: 0 1.5rem; + max-width: none; +} + +/* --- LINKS ------------------------------------------------------------ */ +a { + text-decoration: none; + border-radius: 4px; + padding: 2px 4px; + transition: background .2s, color .2s; + color: var(--ink, #8b0000); +} + +a:hover { + background: red; + color: #000; +} + +a.no-hover-box:hover { + background: transparent; + color: red; +} + +/* --- SIDEBAR ---------------------------------------------------------- */ +#mobile-sidebar { + position: fixed; + top: 0; + right: 0; + width: 250px; + max-height: 100vh; + overflow-y: auto; + background: #000; + transform: translateX(100%); + transition: transform .3s ease-in-out; + padding: 1rem; + box-shadow: -4px 0 8px rgba(0, 0, 0, .5); + z-index: 9000; + scrollbar-width: none; + -ms-overflow-style: none; + border-left: 1px solid #2a1010; +} + +#mobile-sidebar.visible { + transform: translateX(0); +} + +#mobile-sidebar::-webkit-scrollbar { + display: none; +} + +#menu-toggle { + position: fixed; + top: 1rem; + right: 1rem; + z-index: 9100; + padding: .5rem 1rem; + border: 1px solid #2a1010; + background: #000; + color: var(--ink, #8b0000); + border-radius: 4px; + cursor: pointer; +} + +#menu-toggle:hover { + background: #2a1010; + color: red; +} + +/* --- LOGO ------------------------------------------------------------- */ +.logo { + width: 100px; + display: block; + margin-bottom: 1rem; +} + +/* --- BUTTON ----------------------------------------------------------- */ +.button { + background-color: black; + color: white; + padding: 10px 20px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 1em; + margin: 20px 0; + cursor: pointer; + border-radius: 8px; + transition: background 0.3s, transform 0.3s; + border: 1px solid #2a1010; +} + +.button:hover { + background-color: red; + transform: translateY(-2px); +} + +/* --- FOOTER ----------------------------------------------------------- */ +.footer { + background-color: #111; + color: #8b0000; + padding: 30px 20px; + text-align: center; + font-size: 0.9em; + border-top: 1px solid #2a1010; + margin-top: 20px; +} + +.footer a { + color: var(--ink, #8b0000); + text-decoration: none; +} + +.footer a:hover { + text-decoration: underline; +} + +/* --- MEDIA QUERIES --------------------------------------------------- */ +@media (max-width: 768px) { + body { + flex-direction: column; + font-size: 14px; + } + + .sidebar { + width: 100%; + min-height: auto; + box-shadow: none; + } + + main { + width: 100%; + } + + h1 { + font-size: 2em; + } + + .button { + font-size: 0.9em; + } +} \ No newline at end of file diff --git a/gaming/stepmania/index.php b/gaming/stepmania/index.php new file mode 100644 index 0000000..1910b45 --- /dev/null +++ b/gaming/stepmania/index.php @@ -0,0 +1,100 @@ + + + + + + StepMania — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

StepMania

+

Clean, fast, and to the point.

+
+ +
+

Song Packs

+
    +
  • Dance Revolution Mix 2024
  • +
  • Retro Arcade Hits
  • +
  • Anime Beats Edition
  • +
+
+ +
+

High Scores

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankPlayerSongScore
1NeoStepPARANOiA Rebirth997,450
2LainDanceMAX 300995,210
3PadWizardvanity angel992,880
+
+
+ +
+

Downloads

+

StepMania 3.9 / 3.95 / misc files

+
+ +
+

Contact

+

m@sillylaird.ca

+
+
+ + + + diff --git a/gaming/stepmania/index_jp.php b/gaming/stepmania/index_jp.php new file mode 100644 index 0000000..1090c0e --- /dev/null +++ b/gaming/stepmania/index_jp.php @@ -0,0 +1,100 @@ + + + + + + StepMania — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

StepMania

+

Clean, fast, and to the point.

+
+ +
+

Song Packs

+
    +
  • Dance Revolution Mix 2024
  • +
  • Retro Arcade Hits
  • +
  • Anime Beats Edition
  • +
+
+ +
+

High Scores

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankPlayerSongScore
1NeoStepPARANOiA Rebirth997,450
2LainDanceMAX 300995,210
3PadWizardvanity angel992,880
+
+
+ +
+

Downloads

+

StepMania 3.9 / 3.95 / misc files

+
+ +
+

連絡先

+

m@sillylaird.ca

+
+
+ + + + diff --git a/gaming/stepmania/index_zh.php b/gaming/stepmania/index_zh.php new file mode 100644 index 0000000..916396d --- /dev/null +++ b/gaming/stepmania/index_zh.php @@ -0,0 +1,100 @@ + + + + + + StepMania — SillyLaird + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

StepMania

+

Clean, fast, and to the point.

+
+ +
+

Song Packs

+
    +
  • Dance Revolution Mix 2024
  • +
  • Retro Arcade Hits
  • +
  • Anime Beats Edition
  • +
+
+ +
+

High Scores

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RankPlayerSongScore
1NeoStepPARANOiA Rebirth997,450
2LainDanceMAX 300995,210
3PadWizardvanity angel992,880
+
+
+ +
+

Downloads

+

StepMania 3.9 / 3.95 / misc files

+
+ +
+

联系

+

m@sillylaird.ca

+
+
+ + + + diff --git a/gaming/stepmania/script.js b/gaming/stepmania/script.js new file mode 100644 index 0000000..1deb43c --- /dev/null +++ b/gaming/stepmania/script.js @@ -0,0 +1,46 @@ +document.addEventListener('DOMContentLoaded', () => { + // Simple active link when clicking nav + const links = Array.from(document.querySelectorAll('nav a[href^="#"]')); + links.forEach(a => { + a.addEventListener('click', e => { + const id = a.getAttribute('href'); + const target = document.querySelector(id); + if (!target) return; + e.preventDefault(); + links.forEach(x => x.classList.remove('is-active')); + a.classList.add('is-active'); + target.scrollIntoView({ behavior: 'smooth', block: 'start' }); + history.replaceState(null, '', id); + }); + }); + + // Minimal demo scoreboard + const data = [ + { rank: 1, player: 'NeoStep', song: 'PARANOiA Rebirth', score: '997,450' }, + { rank: 2, player: 'LainDance', song: 'MAX 300', score: '995,210' }, + { rank: 3, player: 'PadWizard', song: 'vanity angel', score: '992,880' }, + ]; + const board = document.getElementById('score-board'); + if (board) { + const table = document.createElement('table'); + table.innerHTML = ` + + RankPlayerSongScore + + + ${data.map(r => ` + ${r.rank}${r.player}${r.song}${r.score} + `).join('')} + `; + board.replaceChildren(table); + } + + // Join button feedback + const btn = document.getElementById('join-event'); + if (btn) { + btn.addEventListener('click', () => { + btn.disabled = true; + btn.textContent = 'You’re in! Check your inbox.'; + }); + } +}); diff --git a/gaming/stepmania/style.css b/gaming/stepmania/style.css new file mode 100644 index 0000000..20bca04 --- /dev/null +++ b/gaming/stepmania/style.css @@ -0,0 +1,139 @@ +/* Base */ +*, *::before, *::after { box-sizing: border-box; } + +html, body { + margin: 0; + padding: 0; + background: #ffd; /* light yellow */ + color: #111; + font-family: system-ui, Helvetica, Arial, sans-serif; + line-height: 1.5; +} + +/* Header */ +header { + padding: 16px; + background: #fff6c7; + border-bottom: 2px solid #e6d27a; + text-align: center; +} +h1 { + margin: 0 0 8px; + font-family: "Comic Sans MS","Chalkboard SE","Comic Neue",sans-serif; + font-size: 1.6rem; +} + +/* Nav */ +nav ul { + list-style: none; + padding: 0; + margin: 0; + display: grid; + grid-auto-flow: column; + gap: 8px; + justify-content: center; +} +nav a { + display: inline-block; + padding: 6px 8px; + text-decoration: none; + color: #002; + border-radius: 4px; + transition: background .15s, color .15s; +} +nav a:hover, nav a.is-active { + background: red; + color: #000; +} + +/* Layout */ +main { + max-width: 900px; + margin: 20px auto; + padding: 0 16px; +} +section { margin: 24px 0; } +h2 { margin: 0 0 8px; } + +/* Hero image */ +.hero-image { + display: block; + max-width: 100%; + height: auto; + border-radius: 8px; + border: 2px solid #e6d27a; + background: #fffbe3; +} + +/* Lists */ +#song-list { padding-left: 18px; } + +/* Scoreboard (minimal) */ +#score-board { + margin-top: 8px; + border: 2px solid #e6d27a; + border-radius: 8px; + background: #fffbe3; + overflow: hidden; +} +#score-board table { width: 100%; border-collapse: collapse; } +#score-board th, #score-board td { padding: 8px; text-align: left; } +#score-board thead th { background: #ffe06d; } +#score-board tbody tr:nth-child(odd) { background: #fff6c7; } + +/* Button */ +button { + padding: 10px 14px; + border: 2px solid #e6d27a; + border-radius: 8px; + background: #ffd; + color: #111; + cursor: pointer; + transition: background .15s, color .15s; +} +button:hover { background: red; color: #fff; } + +/* Gallery (simple responsive) */ +.gallery { + display: flex; + flex-wrap: wrap; + gap: 10px; +} +.gallery img { + width: calc(33.333% - 7px); + min-width: 160px; + flex: 1 1 auto; + border: 2px solid #e6d27a; + border-radius: 8px; + background: #fffbe3; +} + +/* Form */ +form { + display: grid; + gap: 8px; + max-width: 600px; +} +input[type="text"], input[type="email"], textarea { + width: 100%; + padding: 10px; + border: 2px solid #e6d27a; + border-radius: 8px; + background: #fffef0; + font: inherit; + color: #111; +} +textarea { min-height: 120px; resize: vertical; } + +/* Footer */ +footer { + text-align: center; + color: #444; + margin: 32px 0 24px; +} + +/* Small screens */ +@media (max-width: 640px) { + nav ul { grid-auto-flow: row; grid-template-columns: repeat(2, minmax(0, 1fr)); } + .gallery img { width: calc(50% - 5px); } +} -- cgit v1.2.3