: Add block-droppin [2024-05-21]

This commit is contained in:
2024-05-21 13:50:37 +02:00
parent 348abe0c88
commit 2615fc1f42
8 changed files with 169 additions and 22 deletions

View File

@@ -96,4 +96,4 @@ exclude: [
]
# Theme
version: "Beta"
version: ""

View File

@@ -0,0 +1,88 @@
---
layout: "post"
title: "Block Droppin'"
subtitle: "A fast-paced puzzle challenge for your Game Boy Color!"
description: "Block Droppin is a thrilling Game Boy Color puzzle game where players swap blocks to match three or more, utilizing special blocks like bombs to clear rows and columns, with Arcade and Puzzle modes offering unique challenges and rewards."
image: "/assets/media/games/block-droppin/bFhYqD.png"
image_source: "internal"
category: "games"
tags:
- "puzzle"
- "retro"
- "match"
author: "octobot"
mobygames_id: ""
software_data:
platform: "gbc"
core: "gambatte"
rom_index: "Block Droppin Game Boy Color.gbc"
release:
region: "global"
source: "homebrew"
type: "release"
year: "2024"
---
## About the game
<blockquote class="formatted_description user_formatted"><h1>GAME OVERVIEW</h1>
<p><strong></strong><strong><em>Block Droppin </em></strong>is a fast-paced puzzle game to train your brain and test your reflexes: swap blocks to match three or more blocks of the same type, and use special blocks like bombs to your advantage. <strong><em>Block Droppin </em></strong>takes quick wits and concentration, so make sure your block-swapping skills are up to the task!</p>
<p>The game comprises two playing modes, Arcade and Puzzle, each with its own unique challenges and rewards.</p>
<p>That's it. Go play.</p>
<h1>GAMEPLAY</h1>
<p>The gameplay in <strong><em>Block Droppin </em></strong>is incredibly straightforward: scan the grid and look for opportunities to swap blocks in order to match three (or more!) blocks of the same type.</p>
<p>Race against the clock to score as many points as possible in Arcade Mode, or battle your way through multiple stages in Puzzle Mode as you attempt to clear a specific quota of blocks with limited moves!</p>
<h1>BLOCKS</h1>
<p><strong><em></em></strong><strong><em>Block Droppin</em></strong> features a variety of different blocks, which are unlocked as you beat levels in Puzzle Mode. Look out for special blocks like bombs, which are capable of clearing entire rows and columns of blocks!
</p>
<h1>BLOCK SELECT</h1>
<p>The Block Select screen appears in Arcade Mode, and allows you to choose the set of blocks with which you want to play (provided the blocks have been unlocked in Puzzle Mode!).
</p>
<h1>STAGE SELECT</h1>
<p>The Stage Select screen appears in Puzzle Mode and allows you to choose between the various levels in the game (providing they have been unlocked previously).
</p>
<h1>RESULTS</h1>
<p>The Results screen appears in both Arcade and Puzzle Modes:</p>
<p>In Arcade Mode, the screen displays the number of Matches, Combos, and your final Score. Pressing the A Button allows you to <strong>PLAY AGAIN</strong> or return to the <strong>MAIN MENU.</strong></p>
<p>In Puzzle Mode, the screen displays the number of Matches, Combos, and a "Stage Clear!" message should you manage to beat the stage. Pressing the A Button allows you to <strong>PLAY AGAIN </strong>(or play the <strong>NEXT STAGE</strong>, if you cleared the previous), or return to the <strong>MAIN MENU</strong>.</p>
<h1>CONTROLS</h1>
<ul><li><strong>MENUS:</strong>&nbsp;The Dpad and A button are used for selecting menu items.
</li></ul>
<ul><li><strong>IN-GAME:</strong>&nbsp;The Dpad is used exclusively for moving your cursor, with the Dpad + A Button used for swapping blocks. The START Button brings up the <strong>PAUSE MENU</strong>.<strong></strong></li></ul>
<h1>PAUSE MENU</h1>
<p>Pressing the START button during the game will pause the action. From here, you can push UP or DOWN on the Dpad to choose <strong>RESUME</strong>, <strong>NEW BOARD</strong>, or <strong>QUIT</strong>. Press the A button to choose an option, or press the B button to exit the menu.
</p>
<h1>CREDITS &amp; ACKNOWLEDGEMENTS</h1>
<p>Design, Code, Art and SFX:&nbsp;<strong>SHANE MCCAFFERTY</strong>&nbsp;(@egvroom)
</p>
<p>Production:&nbsp;<strong>ANDY ROBERTS</strong><br></p>
<p>Special Thanks:&nbsp;<strong>JIM&nbsp;</strong><strong>SQUIRES</strong></p>
<p>A&nbsp;<strong>ROCKETSHIP PARK</strong>&nbsp;production for Thalamus Digital.
</p>
<h1>RUNNING THE GAME</h1>
<p><strong><em>Block Droppin </em></strong>comes in three flavours: a <strong>GB </strong>file (for the original Game Boy), <strong>GBC </strong>(for the Game Boy Color), and <strong>POCKET </strong>(for the Analogue Pocket).&nbsp;The Game Boy ROMs are&nbsp;designed for use with Game Boy emulators such as&nbsp;<a href="https://mgba.io/" target="_blank" referrerpolicy="origin" rel="nofollow noopener">mGBA</a>&nbsp;(compatible with Windows, Mac, Linux, and Ubuntu) or a flash cartridge such as the&nbsp;<a href="https://stoneagegamer.com/flash/game-boy/" target="_blank" referrerpolicy="origin" rel="nofollow noopener">EverDrive</a>.</p>
<p><em>© 2024 Rocketship Park, Inc. Game Boy™ Color is a trademark of Nintendo Inc. This product is not sponsored, endorsed, or approved by Nintendo.</em>
</p></blockquote>
Block Droppin is a captivating puzzle game designed exclusively for the Game Boy Color, blending the thrill of arcade action with the strategic depth of puzzle-solving. Developed by Shane McCafferty (@egvroom) and produced by Andy Roberts, this game offers an immersive experience that challenges players to test their reflexes and quick wits.
The core gameplay revolves around manipulating blocks on a grid, aiming to match three or more blocks of the same type. Players must scan the grid with precision, identifying opportunities for strategic block swaps to create matches and trigger chain reactions. The pace is frenetic, demanding split-second decision-making and precise execution.
Featuring two distinct playing modes, Block Droppin offers a diverse range of challenges to engage players of all skill levels. In Arcade Mode, players must race against the clock, striving to score as many points as possible within the time limit. Every move counts as they aim for high scores and bragging rights among friends.
On the other hand, Puzzle Mode presents a structured challenge, with players navigating through multiple stages, each with its own unique objectives. From clearing a specific quota of blocks to overcoming obstacles with limited moves, Puzzle Mode tests players strategic acumen and problem-solving skills. As players progress, they unlock new blocks, adding depth and complexity to their gameplay options.
One of the key features of Block Droppin is its diverse array of blocks, each with its own distinct properties and strategic implications. Alongside standard blocks, players encounter special blocks like bombs, capable of clearing entire rows and columns with explosive efficiency. Mastering the use of these special blocks is essential for achieving high scores and overcoming the toughest challenges.
The games intuitive controls ensure smooth and responsive gameplay. In menus, players navigate using the D-pad and A button, while in-game, the D-pad allows precise cursor movement, with block swapping executed using D-pad + A Button combinations. The START button provides access to the pause menu, allowing players to take a breather or adjust settings mid-game.
Visually, Block Droppin boasts charming pixel art that harks back to the golden age of retro gaming. Each block is distinctively designed, ensuring clarity amidst the frenetic action. Accompanied by catchy sound effects and a dynamic soundtrack, the game creates an immersive experience that keeps players engaged for hours on end.
In the Results screen, players receive feedback on their performance, including the number of Matches, Combos, and their final Score. Whether celebrating a successful stage clear in Puzzle Mode or aiming for a new high score in Arcade Mode, players can choose to replay or advance to the next challenge with the press of a button.
Block Droppin stands as a testament to the enduring appeal of classic puzzle games, offering a blend of addictive gameplay, vibrant visuals, and nostalgic charm. With its accessible yet challenging mechanics, this Game Boy Color gem is sure to delight retro gaming enthusiasts and puzzle aficionados alike.
## Resources
* Official page of the game; Quoted description and cover image credits: <https://thalamusdigital.itch.io/block-droppin-game-boy>

View File

@@ -79,7 +79,7 @@ body.cinema-view > section.post > article {
}
body.cinema-view > section.post > article > p.software-embed-wrapper,
body.cinema-view > section.post > article > p.software-embed-wrapper > iframe {
body.cinema-view > section.post > article > p.software-embed-wrapper > #software-embed-frame {
margin-left: 0;
margin-right: 0;
min-width: 100%;

View File

@@ -12,15 +12,13 @@ exportToJson: function (idbDatabase) {
return new Promise((resolve, reject) => {
const exportObject = {}
if (idbDatabase.objectStoreNames.length === 0) {
resolve(JSON.stringify(exportObject))
resolve(/*JSON.stringify(*/exportObject/*)*/)
} else {
const transaction = idbDatabase.transaction(
idbDatabase.objectStoreNames,
'readonly'
)
transaction.addEventListener('error', reject)
for (const storeName of idbDatabase.objectStoreNames) {
const allObjects = []
transaction
@@ -30,12 +28,11 @@ exportToJson: function (idbDatabase) {
const cursor = event.target.result
if (cursor) {
// Cursor holds value, put it into store data
allObjects.push(cursor.value)
allObjects.push([cursor.key, cursor.value])
cursor.continue()
} else {
// No more values, store is done
exportObject[storeName] = allObjects
// Last store was handled
if (
idbDatabase.objectStoreNames.length ===
@@ -65,12 +62,23 @@ importFromJson: function (idbDatabase, json) {
'readwrite'
)
transaction.addEventListener('error', reject)
var importObject = /*JSON.parse(*/json/*)*/
if (idbDatabase.objectStoreNames.length === 0) {
resolve()
}
for (const storeName of idbDatabase.objectStoreNames) {
// ignore empty stores (we have to do this explicitly or the keys will never be deleted, and the promise will not resolve)
if (importObject[storeName].length === 0) {
delete importObject[storeName];
if (Object.keys(importObject).length === 0) {
resolve()
}
continue;
}
let count = 0
for (const toAdd of importObject[storeName]) {
const request = transaction.objectStore(storeName).add(toAdd)
let [k,value] = toAdd;
const request = transaction.objectStore(storeName).add(value,k)
request.addEventListener('success', () => {
count++
if (count === importObject[storeName].length) {
@@ -100,7 +108,6 @@ clearDatabase: function (idbDatabase) {
'readwrite'
)
transaction.addEventListener('error', reject)
let count = 0
for (const storeName of idbDatabase.objectStoreNames) {
transaction

View File

@@ -5,28 +5,70 @@ var prefsIndex = 'SalaMuseoGames/Prefs/v1';
var Prefs = window.SalaMuseoGames.Prefs = {
softwarePwaManifests: { default: true, /* dependsOn: "pwaManifests", */ name: "Allow installing individual games as PWAs" },
pwaManifests: { default: false, name: "Allow installing the site home itself as a PWA" },
offlineCache: { default: true, name: "Cache site pages and game files offline", summary: "Allow faster site navigation, and gameplay without an Internet connection, by caching unlimited data offline. Disable if you want to save storage. (Note that data for some emulators and games is always cached regardless of this setting; you can only manage their data when they show an option in their interface.)" },
dataExport: { onclick: (function(){
offlineCache: { default: true, name: "Cache site pages and game files offline", summary: "Allow faster site navigation, and gameplay while offline, by caching unlimited data. Disable to save device storage. (Note: data for some emulators and games is always cached regardless of this setting; you can only manage their data in their interface if they show an option.)" },
dataExport: { section: "data", name: "Export site configuration and game saves", onclick: (function(){
async function makeDownloadObj (data) {
var name = 'SalaMuseoGames-Export.json';
var blob = new Blob([JSON.stringify(data)], { type: 'application/json' });
if ('CompressionStream' in window) {
name += '.gz';
blob = new Blob([await new Response(
blob.stream().pipeThrough(new CompressionStream('gzip')),
).blob()], { type: 'application/gzip' });
}
return { download: name, href: URL.createObjectURL(blob) };
}
var data = { localStorage, indexedDB: {} };
var dbs = ["EmulatorJS-core", "/data/saves", "/home/web_user/.renpy"];
dbs.forEach(function(db){
indexedDB.open(db).onsuccess = (function(event){
idbBackupAndRestore.exportToJson(event.target.result).then(function(json){
idbBackupAndRestore.exportToJson(event.target.result).then(async function(json){
data.indexedDB[db] = json;
if (Object.keys(data.indexedDB).length === dbs.length) {
var anchorElem = SMG.Util.makeElement('a', {
hidden: true, download: 'SalaMuseoGames-Export.json',
href: URL.createObjectURL(new Blob([JSON.stringify(data)], { type: 'application/json' })),
});
document.body.appendChild(anchorElem);
anchorElem.click();
document.body.removeChild(anchorElem);
SMG.Util.useTempElement(SMG.Util.makeElement('a', ...(await makeDownloadObj(data))), function(elem){ elem.click() });
}
});
});
});
}), section: "data", name: "Export site configuration and game saves", summary: "(Currently a beta, not all saves might be exported! Import feature coming soon.)" },
// dataImport: { onclick: (function(){}), section: "data", name: "Import site configuration and game saves" },
}), summary: "This will download a file. (Currently a beta, not all saves may be exported!)" },
dataImport: { section: "data", name: "Import site configuration and game saves", onclick: (function(){
SMG.Util.useTempElement(SMG.Util.makeElement('input', { type: 'file', onchange: function(event){
function alertFinish () { alert('Importing data completed!') }
var file = event.target.files[0];
var type = file.type.split('/')[1];
var stream = file.stream();
if (type === 'json');
else if (type === 'gzip') {
if ('CompressionStream' in window) {
stream = stream.pipeThrough(new DecompressionStream('gzip'));
} else {
return alert('Compressed archives are not supported in this browser. Please decompress externally and then upload a JSON file.');
}
} else {
return alert('File type not recognized.');
}
new Response(stream).json().then(function(data){
localStorage.clear();
Object.assign(localStorage, data.localStorage);
var dbsCount = Object.keys(data.indexedDB).length;
var importedDbsCount = 0;
if (dbsCount === 0) {
return alertFinish();
}
Object.keys(data.indexedDB).forEach(function(db){
indexedDB.open(db).onsuccess = (function(event){
idbBackupAndRestore.clearDatabase(event.target.result).then(function(){
idbBackupAndRestore.importFromJson(event.target.result, data.indexedDB[db]).then(function(){
if (++importedDbsCount === dbsCount) {
alertFinish();
}
});
});
});
});
});
}, accept: 'text/json,application/json,application/gzip' }), function(elem){ elem.click() });
}), summary: "(Currently a beta, not all saves may be imported!)" },
// featurePreview: { default: false, name: "Use experimental features before their release", summary: "If some new site features or adjustments are scheduled to release soon, you might be chosen to preview them before they are officially available" },
developerMode: { default: false, name: "Developer Mode", summary: "Show options and enable features dedicated to developers" },
allowDownloads: { default: false, section: "developer", name: "Allow downloads where available", summary: "Only for developers." },

View File

@@ -10,4 +10,11 @@ Util.elementFromHtml = (function(html){
return Util.makeElement('div', { innerHTML: html.trim() }).children[0];
});
Util.useTempElement = (function(elem, callback){
Object.assign(elem, { hidden: true });
document.body.appendChild(elem);
callback(elem);
document.body.removeChild(elem);
});
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -24,12 +24,15 @@ author: "octobot"
mobygames_id: "$4"
software_data:
platform: ""
core: ""
rom_index: ""
frame_url: ""
frame_index: ""
release:
region: ""
source: ""
type: ""
year: ""
screen:
orientation: ""
display: ""