Merge pull request #1265 from DavidKopal/main

logicgates.js integration and a few fixes.
This commit is contained in:
slweeb 2025-10-01 13:20:21 -04:00 committed by GitHub
commit e100213486
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 = ""
}
async run(px) {
while (this.ci < this.code.length) {
const token = this.code[this.ci]
async run(px, code = this.code) {
this.ci = 0
while (this.ci < code.length) {
const token = code[this.ci]
switch (token) {
case ">":
@ -66,8 +67,8 @@ class Interpreter {
let open = 1
while (open > 0) {
this.ci++
if (this.code[this.ci] === "[") open++
else if (this.code[this.ci] === "]") open--
if (code[this.ci] === "[") open++
else if (code[this.ci] === "]") open--
}
} else {
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 = {
bf_base: "#00ff00",
bf_remote_base: "#008600",
@ -104,6 +121,7 @@ const bftokens = {
"!": "#ff69b4",
"split": "#565656",
"act": "#ffc400",
"bf_gate": "#ffc400",
}
const bftokenslist = Object.keys(bftokens)
@ -146,14 +164,21 @@ elements.bf_remote_base = {
tick: (px) => {
if (pixelTicks == px.start) {
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) {
pixelMap[remotebase1[0]][remotebase1[1]].remotes = []
}
pixelMap[remotebase1[0]][remotebase1[1]].remotes.push([px.x, px.y])
px.parent = remotebase1
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 = {
@ -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) {
if (token == "bf_base" || token == "bf_remote_base") { continue }
if (token == "bf_base" || token == "bf_remote_base" || token == "bf_gate") { continue }
elements[token] = {
category: "bf",
color: bftokens[token],
@ -217,7 +319,6 @@ for (let token of bftokenslist) {
behavior: behaviors.WALL,
tick: (px) => {
if (!px.base) {
px.way = "l"
px.act = false
const ns = getNeighbors(px)
if (ns.length > 0) {
@ -235,36 +336,46 @@ for (let token of bftokenslist) {
px.color = bftokens[token]
}
const ns = getNeighbors(px)
if (ns.length > 0) {
const left = ns[0]
if (ns.length > 0 && !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) {
left.act = false
px.act = true
pixelMap[px.base[0]][px.base[1]].interpreter.code += token
if (isEmpty(px.x + 1, px.y)) {
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]])
}
px.act = false
if (px.remotes) {
px.remotes.forEach(remote => {
pixelMap[remote[0]][remote[1]].act = true
console.log(pixelMap[remote[0]][remote[1]].act)
})
} else {
pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
}
}
}
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) {
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
}
}
}
}