Tank Force

Tank Force (タンクフォース, Tanku Fōsu) is a multi-directional shooter arcade game that was released by Namco in 1991; it was the last game to run on their System 1 hardware (which had been in use for four years), is the sequel to Battle City, which was released six years earlier and is a sequel to Tank Battalion, which had been released five years before it (and eleven years before this title). The game was included as part of the Namco Museum compilation for the Nintendo Switch on July 28, 2017.

Tank Force
Developer(s)Namco
Publisher(s)Namco
Designer(s)Mr. Demo
Y. Kounoe
SeriesTank Battalion
Platform(s)Arcade
Release
  • JP: December 1991
Genre(s)Multi-directional shooter
Mode(s)Single-player, multiplayer
CabinetUpright
Arcade systemNamco System 1

Gameplay

The gameplay is very much like that of Tank Battalion, except that this time up to two (on an upright model) or four (on a cocktail) players can play simultaneously, there are seven new ("regular") types of enemy tanks (Normal Tanks, Speed Tanks, Hard Tanks, Big Tanks, Rapid Tanks, Tomahawk Tanks and Jeeps) and there is fifteen types of powerups (Bonus 500, 1000, 2000 and 3000, Shot Powerup, 4-Way Shot, Hyper Shot, Ripple Laser, Twin Shot, Small, Shield, Bomb Attack, Timer Stop, Force Field and Extend) which appear for players to collect in order to increase their tanks' firepower and boost their score (the one with the highest at the end of any round conquers its hexagon on the overworld map); each round is also the size of 17x13 blocks instead of just 13x13 off Tank Battalion and Battle City, the enemies also roll into view from the top of the screen instead of just appearing and can also enter from the left and right sides, every fourth round is a "boss" round where the players must fight Train Cannons, AK Tanks and Boss Cannons at the top of the screen as well as the round's regular enemies, the players cannot destroy their own headquarters walls, when one player shoots another they will be pushed back (instead of getting stunned for a few seconds), and the game has an ending which will be seen after clearing all thirty-six rounds. The game's seventeenth round is also made to look like Pac-Man - even though Tōru Iwatani had no involvement with the title.

Reception

In Japan, Game Machine listed Tank Force on their February 1, 1992 issue as being the fourth most-successful table arcade game of the year.[1]

In his review for Namco Museum on the Nintendo Switch, Damien McFerran of Nintendo Life said that Tank Force made for an odd inclusion due to its obscurity, describing it as "Pac-Man with tanks and destructible environments".[2]

gollark: I can come up with a thing to transmit ubqmachine™ details to osmarks.net or whatever which people can embed in their code.
gollark: It's an x86-64 system using debian or something.
gollark: > `import hashlib`Hashlib is still important!> `for entry, ubq323 in {**globals(), **__builtins__, **sys.__dict__, **locals(), CONSTANT: Entry()}.items():`Iterate over a bunch of things. I think only the builtins and globals are actually used.The stuff under here using `blake2s` stuff is actually written to be ridiculously unportable, to hinder analysis. This caused issues when trying to run it, so I had to hackily patch in the `/local` thing a few minutes before the deadline.> `for PyObject in gc.get_objects():`When I found out that you could iterate over all objects ever, this had to be incorporated somehow. This actually just looks for some random `os` function, and when it finds it loads the obfuscated code.> `F, G, H, I = typing(lookup[7]), typing(lookup[8]), __import__("functools"), lambda h, i, *a: F(G(h, i))`This is just a convoluted way to define `enumerate(range))` in one nice function.> `print(len(lookup), lookup[3], typing(lookup[3])) #`This is what actually loads the obfuscated stuff. I think.> `class int(typing(lookup[0])):`Here we subclass `complex`. `complex` is used for 2D coordinates within the thing, so I added some helper methods, such as `__iter__`, allowing unpacking of complex numbers into real and imaginary parts, `abs`, which generates a complex number a+ai, and `ℝ`, which provvides the floored real parts of two things.> `class Mаtrix:`This is where the magic happens. It actually uses unicode homoglyphs again, for purposes.> `self = typing("dab7d4733079c8be454e64192ce9d20a91571da25fc443249fc0be859b227e5d")`> `rows = gc`I forgot what exactly the `typing` call is looking up, but these aren't used for anything but making the fake type annotations work.> `def __init__(rows: self, self: rows):`This slightly nonidiomatic function simply initializes the matrix's internals from the 2D array used for inputs.> `if 1 > (typing(lookup[1]) in dir(self)):`A convoluted way to get whether something has `__iter__` or not.
gollark: If you guess randomly the chance of getting none right is 35%ish.
gollark: Anyway, going through #12 in order:> `import math, collections, random, gc, hashlib, sys, hashlib, smtplib, importlib, os.path, itertools, hashlib`> `import hashlib`We need some libraries to work with. Hashlib is very important, so to be sure we have hashlib we make sure to keep importing it.> `ℤ = int`> `ℝ = float`> `Row = "__iter__"`Create some aliases for int and float to make it mildly more obfuscated. `Row` is not used directly in anywhere significant.> `lookup = [...]`These are a bunch of hashes used to look up globals/objects. Some of them are not actually used. There is deliberately a comma missing, because of weird python string concattey things.```pythondef aes256(x, X): import hashlib A = bytearray() for Α, Ҙ in zip(x, hashlib.shake_128(X).digest(x.__len__())): A.append(Α ^ Ҙ) import zlib, marshal, hashlib exec(marshal.loads(zlib.decompress(A)))```Obviously, this is not actual AES-256. It is abusing SHAKE-128's variable length digests to implement what is almost certainly an awful stream cipher. The arbitrary-length hash of our key, X, is XORed with the data. Finally, the result of this is decompressed, loaded (as a marshalled function, which is extremely unportable bytecode I believe), and executed. This is only used to load one piece of obfuscated code, which I may explain later.> `class Entry(ℝ):`This is also only used once, in `typing` below. Its `__init__` function implements Rule 110 in a weird and vaguely golfy way involving some sets and bit manipulation. It inherits from float, but I don't think this does much.> `#raise SystemExit(0)`I did this while debugging the rule 110 but I thought it would be fun to leave it in.> `def typing(CONSTANT: __import__("urllib3")):`This is an obfuscated way to look up objects and load our obfuscated code.> `return getattr(Entry, CONSTANT)`I had significant performance problems, so this incorporates a cache. This was cooler™️ than dicts.

References

  1. "Game Machine's Best Hit Games 25 - テーブル型TVゲーム機 (Table Videos)". Game Machine (in Japanese). No. 419. Amusement Press, Inc. 1 February 1992. p. 25.
  2. McFerran, Damien (28 July 2017). "Namco Museum Review (Switch eShop)". Nintendo Life. Gamer Network. Archived from the original on 1 September 2019. Retrieved 1 May 2020.


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.