logicgates.js integration and a few fixes.

This commit is contained in:
David Kopal 2025-09-30 06:12:27 +02:00 committed by GitHub
parent a2279aad86
commit eae096f0f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 134 additions and 23 deletions

View File

@ -16,9 +16,10 @@ class Interpreter {
this.tsay = "" this.tsay = ""
} }
async run(px) { async run(px, code = this.code) {
while (this.ci < this.code.length) { this.ci = 0
const token = this.code[this.ci] while (this.ci < code.length) {
const token = code[this.ci]
switch (token) { switch (token) {
case ">": case ">":
@ -66,8 +67,8 @@ class Interpreter {
let open = 1 let open = 1
while (open > 0) { while (open > 0) {
this.ci++ this.ci++
if (this.code[this.ci] === "[") open++ if (code[this.ci] === "[") open++
else if (this.code[this.ci] === "]") open-- else if (code[this.ci] === "]") open--
} }
} else { } else {
this.loops.push(this.ci) this.loops.push(this.ci)
@ -90,6 +91,22 @@ class Interpreter {
} }
} }
class RemoteBase {
constructor(base) {
this.base = base
this.code = ""
}
run() {
pixelMap[this.base[0]][this.base[1]].interpreter.run(pixelMap[this.base[0]][this.base[1]], this.code)
this.code = ""
}
getMap() {
return pixelMap[this.base[0]][this.base[1]].interpreter.map
}
}
const bftokens = { const bftokens = {
bf_base: "#00ff00", bf_base: "#00ff00",
bf_remote_base: "#008600", bf_remote_base: "#008600",
@ -104,6 +121,7 @@ const bftokens = {
"!": "#ff69b4", "!": "#ff69b4",
"split": "#565656", "split": "#565656",
"act": "#ffc400", "act": "#ffc400",
"bf_gate": "#ffc400",
} }
const bftokenslist = Object.keys(bftokens) const bftokenslist = Object.keys(bftokens)
@ -146,14 +164,21 @@ elements.bf_remote_base = {
tick: (px) => { tick: (px) => {
if (pixelTicks == px.start) { if (pixelTicks == px.start) {
px.act = false px.act = false
px.base = pixelMap[remotebase1[0]][remotebase1[1]].base px.interpreter = new RemoteBase(pixelMap[remotebase1[0]][remotebase1[1]].base)
px.base = [px.x, px.y]
if (!pixelMap[remotebase1[0]][remotebase1[1]].remotes) { if (!pixelMap[remotebase1[0]][remotebase1[1]].remotes) {
pixelMap[remotebase1[0]][remotebase1[1]].remotes = [] pixelMap[remotebase1[0]][remotebase1[1]].remotes = []
} }
pixelMap[remotebase1[0]][remotebase1[1]].remotes.push([px.x, px.y]) pixelMap[remotebase1[0]][remotebase1[1]].remotes.push([px.x, px.y])
px.parent = remotebase1
px.cd = false px.cd = false
} }
}, },
onDelete: (px) => {
if (!isEmpty(px.parent[0], px.parent[1]) && pixelMap[px.parent[0]][px.parent[1]].remotes) {
pixelMap[px.parent[0]][px.parent[1]].remotes.filter(a => !(a[0] === px.x && a[1] === px.y))
}
}
} }
elements.reader = { elements.reader = {
@ -208,8 +233,85 @@ elements.bf_runner = {
} }
} }
dependOn("logicgates.js", () => {
elements.bf_gate = {
category: "bf",
color: "#ffc400",
state: "solid",
behavior: behaviors.WALL,
tick: (px) => {
if (!px.base) {
px.act = false
const ns = getNeighbors(px)
if (ns.length > 0) {
if (!isEmpty(px.x - 1, px.y)) {
const left = ns[0]
if (bftokenslist.includes(left.element) && left.base) {
px.base = left.base
}
}
}
} else {
if (px.act) {
px.color = "#00ff00"
} else {
px.color = "#ffc400"
}
var countNeighborsResult = countNeighbors(pixel)
if (countNeighborsResult.charged > 0) {
px.can = true
} else {
px.can = false
}
if (!isEmpty(px.x - 1, px.y)) {
const left = pixelMap[px.x - 1][px.y]
if (bftokenslist.includes(left.element) && left.base) {
if (left.act && !px.act && px.can) {
left.act = false
px.act = true
pixelMap[px.base[0]][px.base[1]].interpreter.code += "g"
if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x][px.y].base || (pixelMap[px.x][px.y].element == "bf_gate" && !pixelMap[px.x][px.y].can)) {
px.act = false
}
if (px.remotes) {
px.remotes.forEach(remote => {
pixelMap[remote[0]][remote[1]].act = true
})
} else {
pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
}
}
}
}
const ns = getNeighbors(px)
ns.forEach(n => {
if (pixelMap[px.base[0]][px.base[1]].interpreter instanceof Interpreter) {
if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
n.charge = 1
} else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[n.tread[0]] == n.tread[1]) {
n.charge = 1
}
} else {
if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
n.charge = 1
} else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[n.tread[0]] == n.tread[1]) {
n.charge = 1
}
}
})
}
if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x + 1][px.y].base || (pixelMap[px.x + 1][px.y].element == "bf_gate" && !pixelMap[px.x + 1][px.y].can)) {
px.act = false
}
}
}
}, true)
for (let token of bftokenslist) { for (let token of bftokenslist) {
if (token == "bf_base" || token == "bf_remote_base") { continue } if (token == "bf_base" || token == "bf_remote_base" || token == "bf_gate") { continue }
elements[token] = { elements[token] = {
category: "bf", category: "bf",
color: bftokens[token], color: bftokens[token],
@ -217,7 +319,6 @@ for (let token of bftokenslist) {
behavior: behaviors.WALL, behavior: behaviors.WALL,
tick: (px) => { tick: (px) => {
if (!px.base) { if (!px.base) {
px.way = "l"
px.act = false px.act = false
const ns = getNeighbors(px) const ns = getNeighbors(px)
if (ns.length > 0) { if (ns.length > 0) {
@ -235,36 +336,46 @@ for (let token of bftokenslist) {
px.color = bftokens[token] px.color = bftokens[token]
} }
const ns = getNeighbors(px) const ns = getNeighbors(px)
if (ns.length > 0) { if (ns.length > 0 && !isEmpty(px.x - 1, px.y)) {
const left = ns[0] const left = pixelMap[px.x - 1][px.y]
if (bftokenslist.includes(left.element) && left.base) { if (bftokenslist.includes(left.element) && left.base) {
if (left.act && !px.act) { if (left.act && !px.act) {
left.act = false left.act = false
px.act = true px.act = true
pixelMap[px.base[0]][px.base[1]].interpreter.code += token pixelMap[px.base[0]][px.base[1]].interpreter.code += token
if (isEmpty(px.x + 1, px.y)) { if (px.remotes) {
if (px.remotes) { px.remotes.forEach(remote => {
px.remotes.forEach(remote => { pixelMap[remote[0]][remote[1]].act = true
pixelMap[remote[0]][remote[1]].act = true console.log(pixelMap[remote[0]][remote[1]].act)
}) })
} else { } else {
pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]]) pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
}
px.act = false
} }
} }
} }
if (ns.length >= 2) { }
ns.forEach(n => { if (ns.length >= 2) {
ns.forEach(n => {
if (pixelMap[px.base[0]][px.base[1]].interpreter instanceof Interpreter) {
if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) { if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
n.charge = 1 n.charge = 1
} else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[n.tread[0]] == n.tread[1]) { } else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[n.tread[0]] == n.tread[1]) {
n.charge = 1 n.charge = 1
} }
}) } else {
} if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
n.charge = 1
} else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[n.tread[0]] == n.tread[1]) {
n.charge = 1
}
}
})
} }
} }
if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x + 1][px.y].base || (pixelMap[px.x + 1][px.y].element == "bf_gate" && !pixelMap[px.x + 1][px.y].can)) {
px.act = false
}
} }
} }
} }