Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BP-167-Extra-Blocks-in-Editor #109

Merged
merged 14 commits into from
Apr 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Generated files
.docusaurus
flask/built_pages/*

# Misc
.DS_Store
Expand Down Expand Up @@ -84,7 +85,6 @@ web_modules/
.yarn-integrity

# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
Expand Down Expand Up @@ -262,7 +262,6 @@ celerybeat.pid
*.sage.py

# Environments
.env
.venv
env/
venv/
Expand Down Expand Up @@ -299,4 +298,4 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
#.idea/
167 changes: 113 additions & 54 deletions blockly/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ const ndarray = require("ndarray");
// const FieldBitmap = require("./src/field-bitmap.js");
// console.log(FieldBitmap);


const onlyBitmaps = (process.argv.indexOf('--bitmaps') > -1);

const onlyIcon = (process.argv.indexOf('--icon') > -1);

class dummyField extends Blockly.Field {}
dummyField.fromJson = () => {};
Expand All @@ -26,15 +25,13 @@ const secondaryColor = [13, 167, 63, 255]
const tertiaryColor = [255, 63, 63, 255]
const backgroundColor = [0, 0, 0, 0]


const pixel_colors = {
0: backgroundColor,
1: primaryColor,
2: secondaryColor,
3: tertiaryColor,
}


function scaleBitmap(bitmap, scaleFactor) {
let scaledBitmap = [];
for (let i = 0; i < bitmap.length; i++) {
Expand All @@ -52,7 +49,7 @@ function scaleBitmap(bitmap, scaleFactor) {
}


var saveBitmap = (bitmap, size, name) => {
var saveBitmap = (bitmap, size, name, icon=false) => {

// old squish approach

Expand Down Expand Up @@ -89,7 +86,11 @@ var saveBitmap = (bitmap, size, name) => {
}
}

var out = fs.createWriteStream(`./blockly/compiled_games/images/${name.toLowerCase().replace(/[^a-zA-Z ]/g, "") || "UNKNOWN"}.png`);
var writeLocation = `${__dirname}/compiled_games/images/${name.toLowerCase().replace(/[^a-zA-Z ]/g, "").replace(" ", "-") || "UNKNOWN"}.png`
if(icon) {
writeLocation = `${__dirname}/../flask/saved/icons/${name.toLowerCase().replace(/[^a-zA-Z ]/g, "").replace(" ", "-") || "UNKNOWN"}.png`
}
var out = fs.createWriteStream(writeLocation);
savePixels(d, "png").pipe(out)
}

Expand All @@ -109,7 +110,7 @@ var unrollWorkspaceBlocks = (workspace) => {
saveBlock(block.next.block)
}
if(block.inputs && block.inputs.DO) {
saveBlock(block.inputs.DO);
saveBlock(block.inputs.DO.block);
}
}

Expand All @@ -120,6 +121,42 @@ var unrollWorkspaceBlocks = (workspace) => {
return workspaceBlocks;
}

var findPathToExit = (workspace) => {

var topLevelBlocks = workspace.blocks.blocks;
var eFound = false;

var traverse = (block) => {
if(eFound == true) { return; }

console.log(block);
if(block.type == "exit") {
eFound = true;
};

if(block.type.split("_").includes("procedures") && block.extraState != undefined) {
traverse(topLevelBlocks.filter(b => {
return b.fields != undefined && b.fields.NAME != undefined && b.fields.NAME == block.extraState.name
})[0])
}

if(block.inputs) {
for(var input of Object.keys(block.inputs)) {
traverse(block.inputs[input].block);
}
}

if(block.next) {
traverse(block.next.block)
}
}

// start from metadata block...
traverse(topLevelBlocks.find((b)=>b.type=="metadata"));

return eFound;
}

var getVariableName = (block_id, workspace) => {
// console.log("looking",block_id);
var variable_match = workspace.variables.filter((variable)=>variable.id == block_id)
Expand All @@ -137,75 +174,97 @@ var getBitmapSize = (bitmap_type, definitions) => {
try {
const file = jsonfile.readFileSync(process.argv[2]);
var filename = process.argv[2].replace(/^.*[\\/]/, '')
var output = process.argv[3] || "./blockly/compiled_games/"+filename.split('.')[0]+".py"
var output = process.argv[3] || `${__dirname}/compiled_games/`+filename.split('.')[0]+".py"

// SAVE BITMAPS
// PROBABLY SHOULD BE IN THEIR OWN GAME FOLDER
var allWorkspaceBlocks = unrollWorkspaceBlocks(file)

// THIS IS HOW WE GET BLOCK DEFINITIONS
var definitionsArray = jsonfile.readFileSync('./blockly/src/blocks/game.json')
var definitionsArray = jsonfile.readFileSync(`${__dirname}/src/blocks/game.json`)
var definitions = Blockly.common.createBlockDefinitionsFromJsonArray(definitionsArray.blocks);
Blockly.common.defineBlocks(definitions);


// Save all those BitMaps.
for(var block of allWorkspaceBlocks) {
// save orphaned bitmaps
if(["small_bitmap", "large_bitmap"].includes(block.type)) {
var size = getBitmapSize(block.type, definitionsArray)
saveBitmap(block.fields.field, size, block.id);
if(onlyIcon) {
for(var block of allWorkspaceBlocks) {
if(block.type == "metadata") {
var bitmapBlock = block.inputs.game_icon.block
var size = getBitmapSize(bitmapBlock.type, definitionsArray)
saveBitmap(bitmapBlock.fields.field, size, block.inputs["game name"].block.fields.TEXT, true);
break;
}
}
if(block.type == "variables_set") {
for(var key in block.inputs) {
var variable_id = block.fields.VAR.id;
var bitmapBlock = block.inputs[key].block;
if(["small_bitmap", "large_bitmap"].includes(bitmapBlock.type)) {
// console.log("variable set...");
var size = getBitmapSize(bitmapBlock.type, definitionsArray)
var name = getVariableName(variable_id, file)
saveBitmap(bitmapBlock.fields.field, size, name);

setTimeout(() => [
process.exit(0)
], 1200);
} else {
var hasExit = findPathToExit(file);
if(!hasExit) {
process.exit(-1);
}

// Save all those BitMaps.
for(var block of allWorkspaceBlocks) {
// save orphaned bitmaps
if(["small_bitmap", "large_bitmap"].includes(block.type)) {
var size = getBitmapSize(block.type, definitionsArray)
saveBitmap(block.fields.field, size, block.id);
}
if(block.type == "variables_set") {
for(var key in block.inputs) {
var variable_id = block.fields.VAR.id;
var bitmapBlock = block.inputs[key].block;
if(["small_bitmap", "large_bitmap"].includes(bitmapBlock.type)) {
// console.log("variable set...");
var size = getBitmapSize(bitmapBlock.type, definitionsArray)
var name = getVariableName(variable_id, file)
saveBitmap(bitmapBlock.fields.field, size, name);
}
}
}
}


if(block.type == "actor") {
var bitmapBlock = block.inputs.ImageName.block;
if(block.type == "actor") {
var bitmapBlock = block.inputs.ImageName.block;

if(["small_bitmap", "large_bitmap"].includes(bitmapBlock.type)) {
var size = getBitmapSize(bitmapBlock.type, definitionsArray)
var name = getVariableName(bitmapBlock.id, file)
saveBitmap(bitmapBlock.fields.field, size, name);
if(["small_bitmap", "large_bitmap"].includes(bitmapBlock.type)) {
var size = getBitmapSize(bitmapBlock.type, definitionsArray)
var name = getVariableName(bitmapBlock.id, file)
saveBitmap(bitmapBlock.fields.field, size, name);
}

// return;
}
}

// return;
if(onlyBitmaps) {
console.log("Saved Bitmaps.");
return 0;
}
}

if(onlyBitmaps) {
console.log("Saved Bitmaps.");
return 0;
}
// THIS IS HOW WE GET BLOCK GENERATION
const forBlock = require(`${__dirname}/src/generators/python.js`)
Object.assign(pythonGenerator.forBlock, forBlock);

try {
var workspace = new Blockly.Workspace();
Blockly.serialization.workspaces.load(file, workspace);
var code = pythonGenerator.workspaceToCode(workspace);

fs.writeFile(output, code, err => {
if (err) {
console.error(err);
}
});
} catch (e) {
console.log(e);
process.exit(-1)
}

// THIS IS HOW WE GET BLOCK GENERATION
const forBlock = require('../blockly/src/generators/python.js')
Object.assign(pythonGenerator.forBlock, forBlock);

try {
var workspace = new Blockly.Workspace();
Blockly.serialization.workspaces.load(file, workspace);
var code = pythonGenerator.workspaceToCode(workspace);

fs.writeFile(output, code, err => {
if (err) {
console.error(err);
}
});
} catch (e) {
console.log(e);
}

} catch (e) {
console.error(e);
process.exit(-1)
}
Loading
Loading