Mar 24, 2023
The patch is below and downloadable above, but a better explanation than the patch is that I modified the speed of levels 19-28 so that they were the same as level 18. This makes it possible to score dramatically higher scores if one can just play 18 speed well for 230 lines. As you can see, fairly early in my test of this ROM, I was able to get a PB (personal best) of over 100k points over my normal non-cheat PB. A maxout on this ROM is difficult, but not out of the question. As I play more, we may see some interesting things.
If we think about cheating, the effort required to convince people that I actually got that score would be to drop every third frame in 19-28, use a sharpener to avoid detection from inconsistent video capture artifacts, play 19-28 like one would naturally with DAS at 19 speed (no superhuman play to tip off keen observers), turn off my camera (since unnatural human movement would immediately give away that it’s sped up), and present a sensible progression of PBs from current PB to destination PB. This of course would need to be followed up with an explanation of how 19 is getting easier and the main barrier to higher level play is over. If you consider the difficulty to pull off such a deception, it might make sense to play a different game. If you want a legitimate maxout, AnyDAS is a pretty sensible solution and no one will question the legitimacy since AnyDAS is a playstyle that is accepted in at least one classic Tetris tournament.
In comparison to other cheats this one is not even in the ballpark. A well-known Tetris player successfully pulled off a maxout deception and confessed their wrongdoing to tournament organizers. How did it work? The player already had many maxout-pace games with and without camera, which provided an air of legitimacy to a maxout without camera. They used emulator, so no video capture artifacts, and used an unmodified copy of Tetris to avoid detection of superhuman play. The cheat? Slowing down the emulator to 50% speed. This player was suspended from the tournament for 1 month and still plays to this day – maxing out with camera in competition regularly.
This blog post is not about cheating, it’s about Long 18. Long 18 is easy to play if you have an emulator, but if you want to play on original hardware or replica hardware like the RetroN, you’ll need an Everdrive (or something like it). I decided not to get an Everdrive. If you would like to follow my path into creating your own NES cartridges, here is a brief explanation of how it went.
- I found flash chips for sale and bought 10 for $63.05 (see the flash programmer blog post for more info).
- I bought the other parts necessary for the flash programmer and 5 CNROM carts from Digikey for $41.67 ($53.65 after shipping and tax) including some extra things I wanted as well (info on those as I work on them but they cost $13.16 + tax).
- I made and debugged a breadboard-based flash programmer.
- I bought 5 CNROM boards with HASL instead of ENIG with gold plating from JLCPCB for $6.94 shipped (quite a deal).
- I soldered the cartridge. I let solder accumulate on my iron’s chisel tip and a blob of solder dropped onto the edge connector. I removed it, but did not pay enough attention to detail. This resulted in a bridge between two leads that I was not able to see for days. I left the AVRCICZZ off the board since it was unnecessary for use with the RetroN.
- I debugged the cart. After the cart showed up with a black screen on the RetroN and a flashing grey screen on the original NES, I asked #hardware in the NESDEV discord for help. A kind soul checked everything and said that it should work. I checked connectivity between each contact on the edge connector and the board.
- I added the AVRCICZZ to the board. After days of wondering I finally looked closely at the edge connector and found the bridge. Removing the bridge with a hobby knife, the cart immediately worked in the RetroN. To get the cart to work in the unmodified NES, I just had to press reset 8 times. This is a known issue and is expected with the avrciczz.
So the total cost of this endeavor and parts for 5 carts (minus the shells which I still have not bought) is 63.05 + (53.65 - 13.16) + 6.94 = $110.48. If I want to make 10 more and get the same price on all the components (except ENIG with gold leads for longevity and quality), it should come to around (21.40*2 + 41.65) + (6.40 + 2.16 + 2.58 + 12.20 + 11.98) + (22.70 + 3.84) = $146.31
This results in a per-cart cost of $14.63 in quantity 10 not counting time or shell (which are especially expensive for just being a piece of plastic and a problem for people who want to program their carts). Choosing HASL over ENIG with gold-plating would save significant amount per cart at the cost of longevity and quality. While that was an acceptable tradeoff for my first 5 boards, long term, I will go with ENIG with gold-plating.
Can I afford to sell these? If I wanted to do a batch of say 100 cartridges, I could reduce the price further and possibly get a good deal on shells (which I have not been able to find). Assuming that I chose to replace the flash programmer with a circuit-board-based flash programmer or more sensibly a off-the-shelf flash programmer, I could speed up the process to about 5 minutes per cartridge. That would mean 8-10 hours to produce 100 cartridges. At minimum wage, I would add on $124.95. Assuming inefficiencies and loss from fraud, catastrophe, and mail theft, the price of the cart would end up around $17.60. TetrisGYM retails for $27.50. If I sold all 100 carts at $27.50, that would result in $9.90 * 100 = $990 profit. $990 profit from 8-10 hours of work + countless hours getting my own setup working seems like a pretty mediocre small business project, right?
I have no reason to release TetrisGYM, but if I say.. had an NES game in the works, I could definitely be convinced to do a small batch. If said game became wildly popular and I had the opportunity, I might release thousands of cartridges using automation to reduce the per-cart labor.
diff --git a/src/constants.asm b/src/constants.asm index cbb9500..7f2b4bf 100644--- a/src/constants.asm +++ b/src/constants.asm @@ -1,5 +1,5 @@ .ifndef INES_MAPPER ; is set via ca65 flags-INES_MAPPER := 1 ; supports 1, 3 and 4 (MMC1 / CNROM / MMC3) +INES_MAPPER := 3 ; supports 1, 3 and 4 (MMC1 / CNROM / MMC3) .endif HAS_MMC = INES_MAPPER = 1 || INES_MAPPER = 4diff --git a/src/playstate/active.asm b/src/playstate/active.asm index 9caec48..4eadec6 100644--- a/src/playstate/active.asm +++ b/src/playstate/active.asm @@ -382,8 +382,8 @@ lookupDropSpeed: framesPerDropTableNTSC: .byte $30,$2B,$26,$21,$1C,$17,$12,$0D .byte $08,$06,$05,$05,$05,$04,$04,$04- .byte $03,$03,$03,$02,$02,$02,$02,$02 - .byte $02,$02,$02,$02,$02,$01 + .byte $03,$03,$03,$03,$03,$03,$03,$03 + .byte $03,$03,$03,$03,$03,$01 framesPerDropTablePAL: .byte $24,$20,$1d,$19,$16,$12,$0f,$0b .byte $07,$05,$04,$04,$04,$03,$03,$03