mirror of
https://github.com/thepaperpilot/Advent-Incremental.git
synced 2024-11-24 09:21:48 +00:00
most of multi-size code implemented
This commit is contained in:
parent
c2e3b8eab5
commit
dcec8aacca
1 changed files with 123 additions and 49 deletions
|
@ -394,6 +394,10 @@ const factory = createLayer(id, () => {
|
||||||
type: "command" | "conveyor" | "processor";
|
type: "command" | "conveyor" | "processor";
|
||||||
description: string;
|
description: string;
|
||||||
energyCost?: number;
|
energyCost?: number;
|
||||||
|
size?: {
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
};
|
||||||
|
|
||||||
/** amount it consumes */
|
/** amount it consumes */
|
||||||
inputs?: Record<
|
inputs?: Record<
|
||||||
|
@ -433,7 +437,20 @@ const factory = createLayer(id, () => {
|
||||||
interface FactoryInternalProcessor extends FactoryInternalBase {
|
interface FactoryInternalProcessor extends FactoryInternalBase {
|
||||||
type: Exclude<BuildableCompName, "conveyor">;
|
type: Exclude<BuildableCompName, "conveyor">;
|
||||||
}
|
}
|
||||||
type FactoryInternal = FactoryInternalConveyor | FactoryInternalProcessor;
|
|
||||||
|
/**
|
||||||
|
* Fragment is just a hint that this spot is occupied by another component
|
||||||
|
* Does not actually do anything, but stores the string that the actual
|
||||||
|
* component is stored under
|
||||||
|
*/
|
||||||
|
interface FactoryInternalFragment {
|
||||||
|
type: "fragment";
|
||||||
|
initalLocation: string;
|
||||||
|
}
|
||||||
|
type FactoryInternal =
|
||||||
|
| FactoryInternalConveyor
|
||||||
|
| FactoryInternalProcessor
|
||||||
|
| FactoryInternalFragment;
|
||||||
|
|
||||||
interface Block {
|
interface Block {
|
||||||
sprite: Sprite;
|
sprite: Sprite;
|
||||||
|
@ -538,6 +555,7 @@ const factory = createLayer(id, () => {
|
||||||
const _data = components.value[id];
|
const _data = components.value[id];
|
||||||
const _compData = compInternalData[id];
|
const _compData = compInternalData[id];
|
||||||
if (_data === undefined || _compData === undefined) continue;
|
if (_data === undefined || _compData === undefined) continue;
|
||||||
|
if (_compData.type === "fragment") continue;
|
||||||
const factoryData = FACTORY_COMPONENTS[_data.type];
|
const factoryData = FACTORY_COMPONENTS[_data.type];
|
||||||
// debugger;
|
// debugger;
|
||||||
if (_data.type === "conveyor") {
|
if (_data.type === "conveyor") {
|
||||||
|
@ -555,7 +573,7 @@ const factory = createLayer(id, () => {
|
||||||
const dirAmt = directionToNum(inputDirection);
|
const dirAmt = directionToNum(inputDirection);
|
||||||
if (dirType === "h") {
|
if (dirType === "h") {
|
||||||
if ((block.x - x) * dirAmt >= 1 + block.turbulance) {
|
if ((block.x - x) * dirAmt >= 1 + block.turbulance) {
|
||||||
const compBehind = compInternalData[x + dirAmt + "x" + y];
|
let compBehind = compInternalData[x + dirAmt + "x" + y];
|
||||||
const storedComp = components.value[x + dirAmt + "x" + y];
|
const storedComp = components.value[x + dirAmt + "x" + y];
|
||||||
|
|
||||||
// empty spot
|
// empty spot
|
||||||
|
@ -568,6 +586,12 @@ const factory = createLayer(id, () => {
|
||||||
block.turbulance = Math.random() * 0.4 - 0.2;
|
block.turbulance = Math.random() * 0.4 - 0.2;
|
||||||
(compBehind as FactoryInternalConveyor).nextPackages.push(block);
|
(compBehind as FactoryInternalConveyor).nextPackages.push(block);
|
||||||
} else {
|
} else {
|
||||||
|
if (compBehind.type === "fragment") {
|
||||||
|
// this should be a factory processor, if it isn't something went wrong
|
||||||
|
compBehind = compInternalData[
|
||||||
|
compBehind.initalLocation
|
||||||
|
] as FactoryInternalProcessor;
|
||||||
|
}
|
||||||
// send it to the factory
|
// send it to the factory
|
||||||
// destory its sprite and data
|
// destory its sprite and data
|
||||||
const factoryData = storedComp as FactoryComponentProcessor;
|
const factoryData = storedComp as FactoryComponentProcessor;
|
||||||
|
@ -591,7 +615,7 @@ const factory = createLayer(id, () => {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((block.y - y) * dirAmt >= 1 + block.turbulance) {
|
if ((block.y - y) * dirAmt >= 1 + block.turbulance) {
|
||||||
const compBehind = compInternalData[x + "x" + (y + dirAmt)];
|
let compBehind = compInternalData[x + "x" + (y + dirAmt)];
|
||||||
const storedComp = components.value[x + "x" + (y + dirAmt)];
|
const storedComp = components.value[x + "x" + (y + dirAmt)];
|
||||||
|
|
||||||
// empty spot
|
// empty spot
|
||||||
|
@ -606,6 +630,12 @@ const factory = createLayer(id, () => {
|
||||||
} else {
|
} else {
|
||||||
// send it to the factory
|
// send it to the factory
|
||||||
// destory its sprite and data
|
// destory its sprite and data
|
||||||
|
if (compBehind.type === "fragment") {
|
||||||
|
// this should be a factory processor, if it isn't something went wrong
|
||||||
|
compBehind = compInternalData[
|
||||||
|
compBehind.initalLocation
|
||||||
|
] as FactoryInternalProcessor;
|
||||||
|
}
|
||||||
const data = storedComp as FactoryComponentProcessor;
|
const data = storedComp as FactoryComponentProcessor;
|
||||||
if (factoryData.inputs?.[block.type] !== undefined) {
|
if (factoryData.inputs?.[block.type] !== undefined) {
|
||||||
if (data.inputStock === undefined) data.inputStock = {};
|
if (data.inputStock === undefined) data.inputStock = {};
|
||||||
|
@ -747,6 +777,10 @@ const factory = createLayer(id, () => {
|
||||||
|
|
||||||
const factoryBaseData = FACTORY_COMPONENTS[data.type];
|
const factoryBaseData = FACTORY_COMPONENTS[data.type];
|
||||||
if (factoryBaseData == undefined) return;
|
if (factoryBaseData == undefined) return;
|
||||||
|
const size = factoryBaseData.size ?? { width: 1, height: 1 };
|
||||||
|
|
||||||
|
// this is too big
|
||||||
|
if (x + size.width >= factorySize.width || y + size.height >= factorySize.height) return;
|
||||||
const sheet = Assets.get(factoryBaseData.imageSrc);
|
const sheet = Assets.get(factoryBaseData.imageSrc);
|
||||||
const sprite = new Sprite(sheet);
|
const sprite = new Sprite(sheet);
|
||||||
|
|
||||||
|
@ -805,18 +839,43 @@ const factory = createLayer(id, () => {
|
||||||
}),
|
}),
|
||||||
sprite
|
sprite
|
||||||
} as FactoryInternalProcessor;
|
} as FactoryInternalProcessor;
|
||||||
|
for (let _x = 0; _x < size.width; _x++) {
|
||||||
|
for (let _y = 0; _y < size.height; _y++) {
|
||||||
|
compInternalData[_x + "x" + _y] = {
|
||||||
|
type: "fragment",
|
||||||
|
initalLocation: x + "x" + y
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
spriteContainer.addChild(sprite);
|
spriteContainer.addChild(sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeFactoryComp(x: number, y: number) {
|
function removeFactoryComp(x: number, y: number) {
|
||||||
const data = compInternalData[x + "x" + y];
|
const data = compInternalData[x + "x" + y];
|
||||||
if (data === undefined) return;
|
if (data === undefined) return;
|
||||||
|
|
||||||
|
if (data.type === "fragment") {
|
||||||
|
const [x, y] = data.initalLocation.split("x").map(i => +i);
|
||||||
|
removeFactoryComp(x, y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (data.type === "conveyor") {
|
if (data.type === "conveyor") {
|
||||||
const cData = data as FactoryInternalConveyor;
|
const cData = data as FactoryInternalConveyor;
|
||||||
for (const p of cData.packages) {
|
for (const p of cData.packages) {
|
||||||
p.sprite.destroy();
|
p.sprite.destroy();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
const size = FACTORY_COMPONENTS[data.type].size ?? { width: 1, height: 1 };
|
||||||
|
|
||||||
|
// delete all components
|
||||||
|
for (let x = 0; x < size.width; x++) {
|
||||||
|
for (let y = 0; y < size.height; y++) {
|
||||||
|
// this will be handled below
|
||||||
|
if (x === 0 && y === 0) continue;
|
||||||
|
delete compInternalData[x + "x" + y];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete components.value[x + "x" + y];
|
delete components.value[x + "x" + y];
|
||||||
|
@ -917,7 +976,8 @@ const factory = createLayer(id, () => {
|
||||||
if (compSelected.value === "rotateLeft") {
|
if (compSelected.value === "rotateLeft") {
|
||||||
if (
|
if (
|
||||||
components.value[x + "x" + y] != null &&
|
components.value[x + "x" + y] != null &&
|
||||||
components.value[x + "x" + y].direction != null
|
components.value[x + "x" + y].direction != null &&
|
||||||
|
compInternalData[x + "x" + y].type !== "fragment"
|
||||||
) {
|
) {
|
||||||
components.value[x + "x" + y] = {
|
components.value[x + "x" + y] = {
|
||||||
...components.value[x + "x" + y],
|
...components.value[x + "x" + y],
|
||||||
|
@ -927,12 +987,15 @@ const factory = createLayer(id, () => {
|
||||||
Direction.Left
|
Direction.Left
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
compInternalData[x + "x" + y].sprite.rotation -= Math.PI / 2;
|
(
|
||||||
|
compInternalData[x + "x" + y] as FactoryInternalProcessor
|
||||||
|
).sprite.rotation -= Math.PI / 2;
|
||||||
}
|
}
|
||||||
} else if (compSelected.value === "rotateRight") {
|
} else if (compSelected.value === "rotateRight") {
|
||||||
if (
|
if (
|
||||||
components.value[x + "x" + y] != null &&
|
components.value[x + "x" + y] != null &&
|
||||||
components.value[x + "x" + y].direction != null
|
components.value[x + "x" + y].direction != null &&
|
||||||
|
compInternalData[x + "x" + y]?.type !== "fragment"
|
||||||
) {
|
) {
|
||||||
components.value[x + "x" + y] = {
|
components.value[x + "x" + y] = {
|
||||||
...components.value[x + "x" + y],
|
...components.value[x + "x" + y],
|
||||||
|
@ -942,9 +1005,18 @@ const factory = createLayer(id, () => {
|
||||||
Direction.Right
|
Direction.Right
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
compInternalData[x + "x" + y].sprite.rotation += Math.PI / 2;
|
(
|
||||||
|
compInternalData[x + "x" + y] as FactoryInternalProcessor
|
||||||
|
).sprite.rotation += Math.PI / 2;
|
||||||
}
|
}
|
||||||
} else if (compSelected.value === "delete") {
|
} else if (compSelected.value === "delete") {
|
||||||
|
if (compInternalData[x + "x" + y]?.type === "fragment") {
|
||||||
|
[x, y] = (
|
||||||
|
compInternalData[x + "x" + y] as FactoryInternalFragment
|
||||||
|
).initalLocation
|
||||||
|
.split("x")
|
||||||
|
.map(i => +i);
|
||||||
|
}
|
||||||
removeFactoryComp(x, y);
|
removeFactoryComp(x, y);
|
||||||
} else if (compSelected.value !== "cursor") {
|
} else if (compSelected.value !== "cursor") {
|
||||||
if (components.value[x + "x" + y] == null) {
|
if (components.value[x + "x" + y] == null) {
|
||||||
|
@ -976,10 +1048,11 @@ const factory = createLayer(id, () => {
|
||||||
function onCompClick(name: FactoryCompNames) {
|
function onCompClick(name: FactoryCompNames) {
|
||||||
compSelected.value = name;
|
compSelected.value = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setTracks() {
|
function setTracks() {
|
||||||
for (const [key, comp] of Object.entries(compInternalData)) {
|
for (const [key, comp] of Object.entries(compInternalData)) {
|
||||||
if (comp == null) continue;
|
if (comp == null) continue;
|
||||||
|
if (comp.type === "fragment") continue;
|
||||||
if (comp.type === "conveyor") {
|
if (comp.type === "conveyor") {
|
||||||
for (const pkg of [...comp.nextPackages, ...comp.packages]) {
|
for (const pkg of [...comp.nextPackages, ...comp.packages]) {
|
||||||
pkg.sprite.destroy();
|
pkg.sprite.destroy();
|
||||||
|
@ -988,7 +1061,7 @@ const factory = createLayer(id, () => {
|
||||||
comp.nextPackages = [];
|
comp.nextPackages = [];
|
||||||
comp.packages = [];
|
comp.packages = [];
|
||||||
} else {
|
} else {
|
||||||
const producerComp = components.value[key] as FactoryComponentProducer;
|
const producerComp = components.value[key] as FactoryComponentProcessor;
|
||||||
if (producerComp.outputStock !== undefined) {
|
if (producerComp.outputStock !== undefined) {
|
||||||
for (const key in producerComp.outputStock) {
|
for (const key in producerComp.outputStock) {
|
||||||
delete producerComp.outputStock[key];
|
delete producerComp.outputStock[key];
|
||||||
|
@ -1003,9 +1076,10 @@ const factory = createLayer(id, () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearFactory() {
|
function clearFactory() {
|
||||||
for (const key of Object.keys(compInternalData)) {
|
for (const key of Object.keys(compInternalData)) {
|
||||||
|
if (compInternalData[key].type === "fragment") continue;
|
||||||
const [x, y] = key.split("x").map(i => +i);
|
const [x, y] = key.split("x").map(i => +i);
|
||||||
removeFactoryComp(x, y);
|
removeFactoryComp(x, y);
|
||||||
}
|
}
|
||||||
|
@ -1059,44 +1133,44 @@ const factory = createLayer(id, () => {
|
||||||
onContextmenu={(e: MouseEvent) => e.preventDefault()}
|
onContextmenu={(e: MouseEvent) => e.preventDefault()}
|
||||||
/>
|
/>
|
||||||
<div class="controls-container">
|
<div class="controls-container">
|
||||||
<button
|
<button
|
||||||
class="control-btn"
|
class="control-btn"
|
||||||
style={{
|
style={{
|
||||||
"border-color": "purple"
|
"border-color": "purple"
|
||||||
}}
|
}}
|
||||||
onClick={setTracks}
|
onClick={setTracks}
|
||||||
>
|
>
|
||||||
Clear Tracks
|
Clear Tracks
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="control-btn"
|
class="control-btn"
|
||||||
style={{
|
style={{
|
||||||
"border-color": "red"
|
"border-color": "red"
|
||||||
}}
|
}}
|
||||||
onClick={clearFactory}
|
onClick={clearFactory}
|
||||||
>
|
>
|
||||||
Clear Factory
|
Clear Factory
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="control-btn"
|
class="control-btn"
|
||||||
style={{
|
style={{
|
||||||
"border-color": "green"
|
"border-color": "green"
|
||||||
}}
|
}}
|
||||||
onClick={moveToCenter}
|
onClick={moveToCenter}
|
||||||
>
|
>
|
||||||
Go to Center
|
Go to Center
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="control-btn"
|
class="control-btn"
|
||||||
style={{
|
style={{
|
||||||
"border-color": paused.value ? "green" : "red"
|
"border-color": paused.value ? "green" : "red"
|
||||||
}}
|
}}
|
||||||
onClick={togglePaused}
|
onClick={togglePaused}
|
||||||
>
|
>
|
||||||
{paused.value ? "Unpause" : "Pause"} the Factory
|
{paused.value ? "Unpause" : "Pause"} the Factory
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="comp-container">
|
<div class="comp-container">
|
||||||
<div
|
<div
|
||||||
class={{
|
class={{
|
||||||
|
|
Loading…
Reference in a new issue