Outcore

Outcore

268 ratings
Idle Game solutions
By Zelnogrard
Solutions for Idle Game. Sub-optimal and over-engineered.
9
16
4
2
2
2
2
2
   
Award
Favorite
Favorited
Unfavorite
Intro
My solutions for Stages 1 through 8.

Each script listing is ready to be copied and pasted into the files that the game provides.
Stage #1
for (let i = 0; i < 4; i++) { MoveForward(); }
Stage #2
Required purchases:
• TurnRight - purchased as part of tutorial
/// internal funcs let commands = []; function AddStep(f, n) { commands.push({ f: f, n: n }); } /// adding commands to queue AddStep(MoveForward, 6); AddStep(TurnRight, 1); AddStep(MoveForward, 6); AddStep(TurnRight, 1); AddStep(MoveForward, 4); /// execute queue for (let m = 0; m < commands.length; m++) { let command = commands[m]; for (let i = 0; i < command.n; i++) { command.f(); } }
Stage #3
/// internal funcs let commands = []; function AddStep(f, n) { commands.push({ f: f, n: n }); } /// adding commands to queue AddStep(TurnRight, 3); AddStep(MoveForward, 2); AddStep(TurnRight, 3); AddStep(MoveForward, 4); AddStep(TurnRight, 3); AddStep(MoveForward, 4); AddStep(TurnRight, 1); AddStep(MoveForward, 2); AddStep(TurnRight, 1); AddStep(MoveForward, 9); /// execute queue for (let m = 0; m < commands.length; m++) { let command = commands[m]; for (let i = 0; i < command.n; i++) { command.f(); } }
Stage #4
Required purchases:
• TurnLeft (1 coin)

Coins goal: 41
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// wrappers function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } function N2() { // to avoid purchasing DoNothing, we just turn twice in place - it does take 2 turns instead though R(); L(); } /// adding commands to queue - getting into position let init = []; AddStep(init, R, 2); AddStep(init, F, 2); /// adding commands to loop - main loop for gathering and delivering let loop = []; /// version without "+1 capacity" upgrade AddStep(loop, F, 8); AddStep(loop, R, 1); AddStep(loop, F, 2); AddStep(loop, R, 2); AddStep(loop, F, 5); AddStep(loop, L, 1); AddStep(loop, F, 8); AddStep(loop, L, 1); //AddStep(loop, N, 4); //requires DoNothing() purchased AddStep(loop, N2, 2); AddStep(loop, F, 2); AddStep(loop, R, 2); AddStep(loop, F, 2); AddStep(loop, R, 2); AddStep(loop, F, 3); AddStep(loop, L, 1); /// version simplified for "+1 capacity" upgrade /* AddStep(loop, F, 8); AddStep(loop, R, 1); AddStep(loop, F, 2); AddStep(loop, R, 2); AddStep(loop, F, 5); AddStep(loop, L, 1); AddStep(loop, F, 8); AddStep(loop, L, 1); //AddStep(loop, N, 5); //requires DoNothing() purchased AddStep(loop, N2, 3); AddStep(loop, F, 3); AddStep(loop, L, 1); */ /// execute queue Exec(init); /// execute loop while (true) { Exec(loop); }
Stage #5
Required purchases:
• "+1" Maximum worker items - 5 coins
• DoNothing - 1 coin

Coins goal: 500
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// wrappers/shortcuts function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } /// defining queues let getInPos = []; AddStep(getInPos, F, 4); AddStep(getInPos, L, 1); AddStep(getInPos, F, 1); AddStep(getInPos, L, 2); let loop = []; AddStep(loop, F, 4); AddStep(loop, R, 1); AddStep(loop, F, 1); AddStep(loop, L, 1); AddStep(loop, F, 1); AddStep(loop, R, 1); AddStep(loop, F, 9); AddStep(loop, L, 1); AddStep(loop, F, 2); AddStep(loop, L, 2); AddStep(loop, F, 7); AddStep(loop, R, 1); AddStep(loop, F, 2); AddStep(loop, L, 1); AddStep(loop, F, 5); AddStep(loop, R, 1); AddStep(loop, F, 7); //just above the 'mixer' AddStep(loop, R, 1); AddStep(loop, F, 1); AddStep(loop, L, 1); AddStep(loop, F, 1); AddStep(loop, N, 5); let loopEnd1 = []; //first loop - the cash in steps to not wait for the mixer AddStep(loopEnd1, R, 1); AddStep(loopEnd1, F, 4); let loopEnd2 = []; //cash in AddStep(loopEnd2, F, 1); AddStep(loopEnd2, L, 1); AddStep(loopEnd2, F, 3); AddStep(loopEnd2, L, 1); AddStep(loopEnd2, F, 5); AddStep(loopEnd2, L, 1); AddStep(loopEnd2, F, 7); AddStep(loopEnd2, R, 1); AddStep(loopEnd2, F, 2); AddStep(loopEnd2, R, 2); AddStep(loopEnd2, F, 6); AddStep(loopEnd2, R, 1); /// execute init Exec(getInPos); /// execute loop Exec(loop); Exec(loopEnd1); while (true) { Exec(loop); Exec(loopEnd2); }
Stage #6
Coins goal: 1025
Important note: To optimize time spent running the scripts, run Stage #6 until 3025 coins are gathered instead - this will allow to skip #7 and go straight to #8. For detailed explanation, see Performance section.

Worker1:
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// wrappers function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } /// defining queues let getInPos = []; AddStep(getInPos, R, 1); AddStep(getInPos, F, 3); AddStep(getInPos, R, 1); AddStep(getInPos, F, 5); //top left corner button AddStep(getInPos, R, 2); let loop = []; AddStep(loop, F, 7); AddStep(loop, R, 2); AddStep(loop, F, 2); AddStep(loop, R, 1); AddStep(loop, F, 5); AddStep(loop, R, 2); AddStep(loop, N, 6); AddStep(loop, F, 5); AddStep(loop, R, 1); AddStep(loop, F, 5); AddStep(loop, R, 2); /// execute init Exec(getInPos); /// execute loop while (true) { Exec(loop); }

Worker2:
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// wrappers function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } /// defining queues let getInPos = []; AddStep(getInPos, F, 2); AddStep(getInPos, R, 1); AddStep(getInPos, F, 3); AddStep(getInPos, L, 1); //before the right part path AddStep(getInPos, N, 3); let loop = []; AddStep(loop, F, 3); AddStep(loop, L, 1); AddStep(loop, F, 5); AddStep(loop, L, 1); AddStep(loop, F, 6); AddStep(loop, L, 1); AddStep(loop, F, 8); AddStep(loop, L, 1); AddStep(loop, F, 1); AddStep(loop, N, 4); //cash in AddStep(loop, F, 2); AddStep(loop, L, 1); AddStep(loop, F, 3); AddStep(loop, R, 1); /// execute init Exec(getInPos); /// execute loop while (true) { Exec(loop); }
Stage #7
Required purchases:
• GetWorkerInventoryItems (25 coins)

Coins goal: 2000

Worker1:
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// compound commands function ThrowAll() { let items = GetWorkerInventoryItems(); for (let i = 0; i < items.length; i++) { ThrowItem(0); } } function WaitSync() { while (!SyncWorkers()) { } } /// wrappers function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } function T() { ThrowItem(0); } function TA() { ThrowAll(); } function W() { WaitSync(); } /// defining queues let initToLB = []; AddStep(initToLB, F, 5); AddStep(initToLB, R, 1); AddStep(initToLB, F, 2); //left button AddStep(initToLB, R, 2); //looking right let LBToExchange = []; AddStep(LBToExchange, F, 8); AddStep(LBToExchange, R, 1); AddStep(LBToExchange, F, 2); AddStep(LBToExchange, L, 1); AddStep(LBToExchange, F, 1); AddStep(LBToExchange, R, 1); //below mixer, exchange point, looking down let Exchange = []; AddStep(Exchange, W, 1); AddStep(Exchange, TA, 1); AddStep(Exchange, W, 1); let loop = []; AddStep(loop, R, 1); AddStep(loop, F, 1); AddStep(loop, R, 1); AddStep(loop, F, 1); AddStep(loop, N, 5); //filling mixer AddStep(loop, F, 1); AddStep(loop, L, 1); AddStep(loop, F, 8); AddStep(loop, R, 2); AddStep(loop, F, 11); AddStep(loop, R, 1); AddStep(loop, F, 2); AddStep(loop, R, 1); AddStep(loop, F, 2); AddStep(loop, L, 1); //back to exchange point /// execute init Exec(initToLB); Exec(LBToExchange); Exec(Exchange); /// execute loop while (true) { Exec(loop); Exec(Exchange); }

Worker2:
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// compound commands function ThrowAll() { let items = GetWorkerInventoryItems(); for (let i = 0; i < items.length; i++) { ThrowItem(0); } } function WaitSync() { while (!SyncWorkers()) { } } /// wrappers function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } function T() { ThrowItem(0); } function TA() { ThrowAll(); } function W() { WaitSync(); } /// defining queues let initToEntrance = []; AddStep(initToEntrance, R, 1); AddStep(initToEntrance, F, 2); AddStep(initToEntrance, N, 5); //before entrance let Exchange = []; AddStep(Exchange, W, 1); AddStep(Exchange, TA, 1); AddStep(Exchange, W, 1); let entranceToExchange = []; AddStep(entranceToExchange, F, 2); AddStep(entranceToExchange, L, 1); AddStep(entranceToExchange, F, 2); AddStep(entranceToExchange, R, 1); AddStep(entranceToExchange, F, 3); AddStep(entranceToExchange, R, 1); AddStep(entranceToExchange, F, 6); AddStep(entranceToExchange, R, 1); AddStep(entranceToExchange, F, 2); AddStep(entranceToExchange, L, 1); AddStep(entranceToExchange, F, 1); //exchange point let ExchangeToEntrance = []; AddStep(ExchangeToEntrance, R, 1); AddStep(ExchangeToEntrance, F, 7); AddStep(ExchangeToEntrance, R, 1); AddStep(ExchangeToEntrance, F, 5); //receiver AddStep(ExchangeToEntrance, R, 1); AddStep(ExchangeToEntrance, F, 4); //entrance /// execute init Exec(initToEntrance); Exec(entranceToExchange); Exec(Exchange); /// execute loop while (true) { Exec(ExchangeToEntrance); Exec(entranceToExchange); Exec(Exchange); }
Stage #8
Coins goal: 5000

Worker1:
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// compound commands function ThrowAll() { let items = GetWorkerInventoryItems(); for (let i = 0; i < items.length; i++) { ThrowItem(0); } } function WaitSync() { while (!SyncWorkers()) { } } /// wrappers/shortcuts function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } function T() { ThrowItem(0); } function TA() { ThrowAll(); } function W() { WaitSync(); } /// defining queues let init = []; AddStep(init, F, 1); AddStep(init, R, 1); AddStep(init, F, 5); //UR button let loop = []; //loop without mixer output AddStep(loop, F, 2); AddStep(loop, L, 1); AddStep(loop, F, 4); //exchange corner AddStep(loop, W, 1); AddStep(loop, W, 1); AddStep(loop, TA, 1); //throw plat chip, if any AddStep(loop, W, 1); AddStep(loop, W, 1); //take red chips AddStep(loop, L, 1); AddStep(loop, F, 2); AddStep(loop, L, 1); AddStep(loop, F, 2); //plat mixer intake AddStep(loop, N, 3); AddStep(loop, F, 2); //back to button AddStep(loop, L, 1); let loop2 = []; //loop with mixer output visit AddStep(loop2, F, 2); AddStep(loop2, L, 1); AddStep(loop2, F, 4); //exchange corner AddStep(loop2, W, 1); AddStep(loop2, W, 1); AddStep(loop2, TA, 1); //throw plat chip, if any AddStep(loop2, W, 1); AddStep(loop2, W, 1); //take red chips AddStep(loop2, L, 1); AddStep(loop2, F, 2); AddStep(loop2, L, 1); AddStep(loop2, F, 2); //plat mixer intake AddStep(loop2, N, 3); AddStep(loop2, F, 1); AddStep(loop2, R, 1); AddStep(loop2, F, 3); AddStep(loop2, R, 1); AddStep(loop2, F, 1); //plat output AddStep(loop2, N, 7); AddStep(loop2, F, 1); AddStep(loop2, R, 1); AddStep(loop2, F, 3); AddStep(loop2, R, 1); AddStep(loop2, F, 1); AddStep(loop2, N, 1); AddStep(loop2, F, 2); AddStep(loop2, L, 1); /// execute one-off Exec(init); /// execute in loop while (true) { Exec(loop); //2 chips in mixer Exec(loop); //4 Exec(loop2); //1 Exec(loop); //3 Exec(loop2); //0 }

Worker2:
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// compound commands function ThrowAll() { let items = GetWorkerInventoryItems(); for (let i = 0; i < items.length; i++) { ThrowItem(0); } } function WaitSync() { while (!SyncWorkers()) { } } /// wrappers/shortcuts function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } function T() { ThrowItem(0); } function TA() { ThrowAll(); } function W() { WaitSync(); } /// defining queues let init = []; AddStep(init, R, 2); AddStep(init, F, 1); AddStep(init, L, 1); AddStep(init, F, 1); let loop = []; AddStep(loop, F, 1); AddStep(loop, L, 1); AddStep(loop, F, 2); AddStep(loop, R, 1); AddStep(loop, F, 4); AddStep(loop, R, 1); AddStep(loop, F, 4); AddStep(loop, L, 1); AddStep(loop, W, 1); AddStep(loop, F, 9); AddStep(loop, R, 1); AddStep(loop, F, 2); //lower mixer AddStep(loop, R, 2); AddStep(loop, N, 3); AddStep(loop, F, 1); AddStep(loop, L, 1); AddStep(loop, F, 6); AddStep(loop, L, 1); AddStep(loop, F, 2); //exchange corner AddStep(loop, W, 1); AddStep(loop, R, 1); AddStep(loop, W, 1); AddStep(loop, W, 1); AddStep(loop, F, 5); AddStep(loop, R, 1); AddStep(loop, F, 5); AddStep(loop, L, 1); AddStep(loop, F, 8); AddStep(loop, R, 1); AddStep(loop, F, 1); AddStep(loop, R, 2); //cash in AddStep(loop, F, 1); AddStep(loop, L, 1); AddStep(loop, F, 5); /// execute one-off Exec(init); /// execute in loop while (true) { Exec(loop); }

Worker3:
/// internal funcs function AddStep(tgtArr, f, n) { tgtArr.push({ f: f, n: n }); } function Exec(queue) { for (let m = 0; m < queue.length; m++) { let command = queue[m]; for (let i = 0; i < command.n; i++) { command.f(); } } } /// compound commands function ThrowAll() { let items = GetWorkerInventoryItems(); for (let i = 0; i < items.length; i++) { ThrowItem(0); } } function WaitSync() { while (!SyncWorkers()) { } } /// wrappers/shortcuts function F() { MoveForward(); } function R() { TurnRight(); } function L() { TurnLeft(); } function N() { DoNothing(); } function T() { ThrowItem(0); } function TA() { ThrowAll(); } function W() { WaitSync(); } /// defining queues let init = []; AddStep(init, F, 2); let loop = []; AddStep(loop, F, 11); AddStep(loop, L, 1); AddStep(loop, F, 5); AddStep(loop, L, 1); //before collecting chips row AddStep(loop, W, 1); AddStep(loop, F, 4); AddStep(loop, L, 1); AddStep(loop, F, 1); AddStep(loop, R, 1); AddStep(loop, F, 3); AddStep(loop, R, 1); AddStep(loop, F, 1); AddStep(loop, R, 1); AddStep(loop, F, 2); AddStep(loop, L, 1); AddStep(loop, F, 1); AddStep(loop, L, 1); AddStep(loop, N, 4); //upper mixer AddStep(loop, F, 1); AddStep(loop, R, 1); AddStep(loop, F, 3); AddStep(loop, R, 1); //above red chip row AddStep(loop, F, 3); AddStep(loop, R, 2); AddStep(loop, N, 3); AddStep(loop, F, 2); AddStep(loop, R, 1); AddStep(loop, F, 2); //exchange corner AddStep(loop, W, 1); AddStep(loop, W, 1); AddStep(loop, TA, 1); AddStep(loop, W, 1); AddStep(loop, L, 1); //back to UL button AddStep(loop, F, 6); AddStep(loop, L, 1); AddStep(loop, F, 11); AddStep(loop, L, 1); /// execute one-off Exec(init); /// execute in loop while (true) { Exec(loop); }
Performance
While testing, I timed how long it takes to complete each stage without any speed upgrades, and got the following:

#
Coins
Time
Profit speed
#1
2
5 seconds
24 coin/min
#2
4
12 seconds
20 coin/min
#3
5
18 seconds
16.6 coin/min
#4
41
2:31
16.29 coin/min
#5
500
23:52
20.94 coin/min
#6
1025
18:30
55.4 coin/min
#7
2000
53:57
37.0 coin/min
#8
5000
44:47
111.6 coin/min

Indicating that, with current scripts, Stage #7 underperforms severely; and that it would be more efficient to just continue running #6 until you gather enough coins to skip ahead straight to #8 – i.e. 3025 coins.

I think that the current algorithm for #7 can be reworked to work much more efficiently; and maybe #8 can be improved a bit as well.
About
After realizing that the game's interpreter supports most of the JS syntax, I got interested to see how far it can be pushed, so I started building a command queue processing framework-of-sorts from the second level – which is both not really that amazing, and a massive overkill, at least for stages up to 6. (If someone is interested in this 'framework' specifically, they should look at the last stage scripts, as it evolved quite a bit over the stages).

Solutions themselves are far from optimal, especially in later stages – they are just a quick and dirty way to complete the levels. But they should perform well enough to pass the stages in a reasonable time.

Change history
04/08/2023
• Applied (more) consistent formating to code; minor updates to all scripts to standartize internal "framework" code.
• Fixed error in code for stage #4.
• Added coin amount goals and required upgrade purchases.
• Added performance section.

09/28/2022
First version.
59 Comments
SandioSan 28 Jun @ 8:31pm 
:'| im traumatizing for program commands ty.:lunar2019deadpanpig:
sevastot 22 Feb @ 4:22am 
thanks
La Papita Frita 12 Jan @ 12:36pm 
Thanks
chootracks 16 Dec, 2024 @ 9:44pm 
Thanks this saved me a lot of time :)
我是穷逼只买优惠游戏 4 Dec, 2024 @ 12:33am 
Thank you
Zelnogrard  [author] 3 Dec, 2024 @ 3:34am 
我是穷逼只买优惠游戏 - sure, go ahead! :steamthumbsup:
You have my permission to quote or use parts of this guide, with or without linking the source as you see fit - it's nothing special, really.
我是穷逼只买优惠游戏 3 Dec, 2024 @ 1:48am 
Hello, I am writing a Chinese guide. May I quote your guide? I will indicate the source and hope you can agree
DyachkoV 20 Sep, 2024 @ 1:09pm 
D8
GamingDummy 10 Aug, 2024 @ 6:58pm 
Thanks big thanks just 2 years ago for some reason it's didn't worked when i just copied and paste time to finally clear this awesome game at 100% achivements
Zelnogrard  [author] 10 Aug, 2024 @ 6:52pm 
Yes, exactly, it should be enough to just copy the entire section to the .txt file(s) that game gives you, and run them.