The Let's Play Archive

EXAPUNKS

by Carbon dioxide

Part 52: š Ñ| ö/ ~ öB è[ å‡ ÑE È‚ t 7Ò

Part 52 - š Ñ| ö/ ~ öB è[ å‡ ÑE È‚ t 7Ò


=== My Computer ===



After all of that, we have unlocked Moss's final assignment.

Wait, Morpork? That's... that's my computer name, like outside of the game.

Well, this is something.
I can see an open network that's... I can't even tell how big.
Imagine all the computers in the world were hooked up to each other, and you would start to get an idea of the size.
No way to know just how big until we explore, though.




Four votes for Uh oh.

Uh oh.

Uh oh?
Why, do you think it could be dangerous?




One vote for "We have no idea what's out there", two for "Dangerous for them".

Dangerous for them, maybe.

That's the spirit.



OST: Leave No Trace

The assignment:
- Packetize and transmit the target data (file 301) to the internet so that it is uploaded to a warez site (file 300).
- A packet is a file that consists of the source IP address (from the #ADDR register), the destination IP address (from the DNS cache, file 201), the checksum of the packet's data, and between 1 and 30 data values. The target data should be split into multiple packets so that no packet except for the last contains fewer than 30 data values.
- To calculate a packet's checksum, add the data values together considering each digit separately, wrapping back to 0 when a digit's sum reaches 10. Then flip the sign. For example, the checksum of 3097, 1047, and 2501 is -6535.


Wait. WAIT. That Desktop host at the bottom holds files that are on my actual desktop. Like, that firefox.desktop file I opened up? That's just a shortcut to open Firefox in my Linux distro. And those hosts connected to the Desktop are sub directories. Moss and Ember are in my computer!

Well, before I get started, I'll mess around with the hardware registers a bit. File 200 conveniently holds the link IDs to those hosts.



The clock holds the actual IRL time and date. At least Moss isn't allowed to reset it.

Let's mess with the #INVS register in the graphics host.


My eyes.





It turns out link 800 lets you go into the monitor, where you can change the contrast. At least everything resets once you stop the test simulation.

Let's get this show on the road.



Four files that actually matter. The reference to whereswarez.ru Ember prepared for us, file 301 with the actual data, then file 200 with the host addresses. It looks like the network host is 885 for the first five test cases so hopefully it stays that way and I can just hardcode that. Finally, there's file 201 with whereswarez.ru's IP address.

code:
GRAB 300
COPY F X
DROP
GRAB 301
LINK 800
LINK 885
REPL MAKER
HALT

MARK MAKER
GRAB 201

MARK FIND_DNS
TEST F = X
TJMP FOUNDIP
SEEK 1
JUMP FIND_DNS

MARK FOUNDIP
COPY F X
NOOP
First of all, this EXA loads the URL in X, and takes the data file to the network host. There, it creates a REPL which looks up whereswarez.ru's IP in the DNS cache file and stores that to X.

Next up, making packets of 30 data values. The checksum sounds complicated so I'll leave that out of scope for now. Let's go step by step.
code:
GRAB 300
COPY F X
DROP
GRAB 301
LINK 800
LINK 885
REPL MAKER

MARK NEXTROUND
MODE; LOCAL
COPY 5 X

MARK SEND
@REP 6
COPY F M
@END
TEST EOF
TJMP EOF
SUBI X 1 X
COPY X T
TJMP SEND
COPY 0 M
MODE; GLOBAL
COPY 1 M
JUMP NEXTROUND

MARK EOF
COPY 0 M
WIPE
MODE; GLOBAL
COPY 0 M
The purpose of this EXA is to copy data from the data file in batches of 30, sending a 0 after each batch. It also checks for EOF and also sends a 0 in that case. It uses LOCAL M for all that. After each round, it also sends a 1 on GLOBAL M if there is more data to come, 0 if there isn't. In the EOF case it also WIPEs its file before stopping entirely. The @REP6 works because the number of values in the data file is always a multiple of 6.

code:
MARK MAKER
GRAB 201

MARK FIND_DNS
TEST F = X
TJMP FOUNDIP
SEEK 1
JUMP FIND_DNS

MARK FOUNDIP
COPY F X

MARK WAITNEXT
REPL NEXT
COPY M T
TJMP WAITNEXT
HALT
The MAKER EXA always stays in GLOBAL mode. After getting the value from the DNS, it makes a NEXT REPL. Every time it gets 1 on GLOBAL M it makes another NEXT, otherwise it HALTs.

code:
MARK NEXT
MODE ; LOCAL
MAKE
COPY #ADDR F
COPY X F

COPY 0 F

MARK WRITENEXT6
COPY M T
FJMP DONECOPY
COPY T F
@REP 5
COPY M F
@END 
JUMP WRITENEXT6

MARK DONECOPY
LINK 800
The actual NEXT EXA makes the packet, starting with the local IP address, then the website's one, then a zero as placeholder for the checksum, and then it writes the copied data in batches of 6. At the start of each batch it checks for the 0, in which case it delivers the file to the internet.




Yes, that source IP address is my actual address, at least within my LAN.

As soon as an EXA makes it to the internet, it immediately drops its file and dies with an "unknown host type" error. I can't run code on the 'net. Other than that, the simulation just shows the files sitting there in that 'internet' host forever.


It looks like this code works except for the checksums.

To calculate checksums, I need to iterate over all values, do something like a SWIZ to get each digit and then add it to a running total. That requires 2 registers at the very least. The best way to do this would probably be to use M. Thing is, I'm already using both global and local M in the network host. So that's going to be confusing. I'll try to do it in place instead. I added some code to just below the MARK DONECOPY.
code:
SEEK -9999
SEEK 3

; 1
COPY 0 X

MARK DIGIT1
@REP 6
SWIZ F 1 T
ADDI T X X
@END

TEST EOF
FJMP DIGIT1

SEEK -9999
SEEK 2
SWIZ X 1 F
For the lowest significant digit, empty out X, then in batches of 6 get that digit with a SWIZ and add it to X. Finally, write the lowest digit to the placeholder position in F.

code:
; 10
COPY 0 X

MARK DIGIT10
@REP 6
SWIZ F 2 T
ADDI T X X
@END

TEST EOF
FJMP DIGIT10

SEEK -9999
SEEK 2
SWIZ X 10 X
ADDI X F X
SEEK -1
COPY X F
For the second digit do something similar, with a SWIZ for that digit. Note it's SWIZ F 2, NOT SWIZ F 20 so the digit goes into the ones place in the X result. This makes sure that the addition always works correctly. The SWIZ X 10 X moves the final result to the 10s position. The value from the 1's digits in F is added to it and the result is written back to F.

This same code is repeated twice more for the 100s digit and 1000s digit. The only difference is that the COPY X F at the bottom of the 1000s digit is replaced by SUBI 0 X F to flip the sign. The code duplication isn't very nice but I have no registers to spare to keep a counter in.

The file is brought to the internet by the LINK 800 I already had and that's it.


This code runs at 1453/150/11, but the max size is only 100. I got it to barely fit in 98 lines by rolling up all my @REPs.
code:
GRAB 300
COPY F X
DROP
GRAB 301
LINK 800
LINK 885
REPL MAKER

MARK NEXTROUND
MODE; LOCAL
COPY 30 X

MARK SEND
;@REP 6
COPY F M
;@END
TEST EOF
TJMP EOF
SUBI X 1 X
COPY X T
TJMP SEND
COPY 0 M
MODE; GLOBAL
COPY 1 M
JUMP NEXTROUND

MARK MAKER
GRAB 201

MARK FIND_DNS
TEST F = X
TJMP FOUNDIP
SEEK 1
JUMP FIND_DNS

MARK FOUNDIP
COPY F X

MARK WAITNEXT
REPL NEXT
COPY M T
TJMP WAITNEXT

MARK NEXT
MAKE
MODE ; LOCAL
COPY #ADDR F
COPY X F
COPY 0 F

COPY M T

MARK WRITENEXT6
COPY T F
COPY M T
TJMP WRITENEXT6

SEEK -9999
SEEK 3

; 1
COPY 0 X

MARK DIGIT1
SWIZ F 1 T
ADDI T X X

TEST EOF
FJMP DIGIT1

SEEK -9999
SEEK 2
SWIZ X 1 F

; 10
COPY 0 X

MARK DIGIT10
SWIZ F 2 T
ADDI T X X

TEST EOF
FJMP DIGIT10

SEEK -9999
SEEK 2
SWIZ X 10 X
ADDI X F X
SEEK -1
COPY X F

; 100
COPY 0 X

MARK DIGIT100
SWIZ F 3 T
ADDI T X X

TEST EOF
FJMP DIGIT100

SEEK -9999
SEEK 2
SWIZ X 100 X
ADDI X F X
SEEK -1
COPY X F

; 1000
COPY 0 X

MARK DIGIT1000
SWIZ F 4 T
ADDI T X X

TEST EOF
FJMP DIGIT1000

SEEK -9999
SEEK 2
SWIZ X 1000 X
ADDI X F X
SEEK -1
SUBI 0 X F

LINK 800


MARK EOF
COPY 0 M
WIPE
MODE; GLOBAL
COPY 0 M


My score is 2653/98/11. Top percentiles are at 640, 44 and 11. I know that especially the checksum code could be a whole lot more efficient, I just wrote myself into a bit of a corner by deciding to do everything in the network host (although that did give me top percentile activity score).

Finishing this task gives you the steam achievement š Ñ| ö/ ~ öB è[ å‡ ÑE È‚ t 7Ò for "Completing every task in the bonus campaign". That means I now have all achievements except for 100 wins in the solitaire game and getting crazy high scores in the tetris game. I'm content.


This is an interesting place. What are "warez"?



Since this is the last full update, I'll just give you the dialogue trees here.

I'm not sure.
Whatever they are, a lot of people want them.


---

What do you think they are?
Something a lot of people want, it looks like.


---

It means illegal downloads of software.
Oh, no wonder it's so popular.



And here the dialogue merges.

We'll be able to spread easily from here.
I still can't see the limits of this so-called Internet... but if they really hooked up all of their computers to each other the way it looks they have, I predict we'll have a very fun time.
Let's see how far we can go.





... and that's all, folks. Ember and Moss are out here on the real internet now. We unlocked everything we could.

I enjoyed how meta this last puzzle got, but ending the postgame with nothing more than a textbox feels a bit anticlimactic.




Thank you to everyone who submitted solutions, left any other sort of comments, or just lurked and read my LP. It was quite the trip and I wouldn't have had the determination to finish this without your support.

If anyone has any improvements for this last puzzle, or any others before it, this is the time to post them. I'll feature those in one final edition of Trash World Inbox next week, before closing the threads.