▄██▀
▄█▀
▄████▄▄▄▄▄▄▄▄▄ █▀▄▄▄▄▄▄▄▄▄▄▄
▄█████▄▄▄▄ ▀▀▀
▄ ▄████████████████▄
██ ▀████████████████████▄
▀███ ▄██████████████████████
████▄▄███████████████████████▀
████████▀▀▀▀▀▀▀▀████▀█▀▀▀▀█▀
██▀ ██▘▘ ██▘▘
A R M O R A L L E Y :: R E M A S T E R E
A browser-based interpretation of the Macintosh + MS-DOS releases of Armor Alley.
Copyright (c) 2013, Scott Schiller
Code provided under the Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) License
Original game Copyright (C) 1989 - 1991, Information Access Technologies.
https://en.wikipedia.org/wiki/Armor_alley
- 10th Anniversary summary video (3m 45s): https://youtu.be/oYUCUvg02rY
- History, review, tutorial, demos, "Midnight Oasis" walk-through: (1h 12m 55s): https://youtu.be/6wEMcssFJ-E
-
Original article about building "V1.0" (from 2013)
-
2022 Demo, features and walk-through of "extreme" mode (55 minutes): https://youtu.be/9BQ62c7u2JM
For running the game locally and JS + CSS build instructions, see src/README.md.
Previous release: V2.0.20230501.
-
10th Anniversary summary video (3m 45s): https://youtu.be/oYUCUvg02rY
-
History, review, tutorial, demos, "Midnight Oasis" walk-through: (1h 12m 55s): https://youtu.be/6wEMcssFJ-E
-
Don't let helicopter reach absolute edge of screen; buffer 5% on each side.
-
Mobile / touchscreen: Bananas weren't firing sometimes, due to incorrect keyboard mappings.
-
Sound: Always wait for sound load before firing
onplay()
. -
Sound: Relative, in terms of distance to the helicopter.
-
Video: Ensure video is active when initial request / preload completes before playing.
-
Editor: Engineers were being output as infantry.
-
Update positioning of helicopter trailers for both sides, and when rotated.
-
BnB: Show existing "Cornholio" turrets at start of game.
-
"Midnight Oasis" network level: Added terrain decor - gravestones, trees etc.
-
Project now has its own site: https://armor-alley.net/
-
Nice progressive web app-style icon set.
-
Updated "Armor Alley" wordmark to resemble the original boxed software one, based on the "Stencil Compress D" font.
-
Added developer notes,
gulp-cli
-based build vianpm
: src/README.md. -
Concatenated + minified / bundled JS + CSS files, see gulpfile.js for build script.
-
SM2 + Snowstorm are now ES6 modules, included vs. concatenated into bundle.
Previous release: V1.6.20220201. Original release: V1.0.20131031.
-
Mobile / touch screen support. Updated UX / UI, better playability and feature parity vs. desktop. Portrait is playable, but landscape is preferable on smaller screens.
-
Network multiplayer, like the original game. PvP, or co-op. Can be played with or against CPU players, as well.
-
22 game levels. 10 original game "campaign" battles, plus 12 levels designed for network games.
-
Level editor. Create or modify existing levels. Data stored in URL at present - terrible, I know. Also compatible with network games.
-
Optional "Virtual Stupidity" theme pack. 🎸🤘
• Reduced CPU load, in general, across the board between JavaScript execution, layout, and paint / compositing.
• Game Loop: Adjustments to target 30FPS on 120 Hz monitors. 01f9f43
• Collision "zones", greatly reducing object comparison work and function calls. 20,000 collision checks per second, down to 500 or less. https://twitter.com/schill/status/1627725917345955840
• DOM node pool / recycling: poolBoy.js
- for things like gunfire and smoke. Less paint / repaint, more GPU compositing. https://twitter.com/schill/status/1628833430988554240
• Reduced variable / object creation in game loop.
• Battlefield DOM node no longer being transformed for scroll; now, only on-screen sprites.
• Even more sound effects.
• Some sounds can use ±5% playback speed for a little variety.
• Sounds can now be heard "in the distance," to the left and right.
• "Virtual Stupidity": 500+ meticulously-picked samples. 21f7726
• "Live Graveyard" feature: decorate the battlefield over time. 032f845
• "Remastered" 8-bit sprite assets from Armor Alley V1.1 for Macintosh. The original 1.0 and PC-DOS version had up to 4-bit colour.
• Nice home page logo, "scanned" from the combat handbook that came with the original boxed game.
• Network games use Windows 95's LIGHTS.EXE
taskbar UI showing tx/rx traffic, very important. ;) https://twitter.com/schill/status/1636449071140605958 17c0a9b
• Four types of stormy weather: rain, hail, snow, and one other that's a surprise.
• Radar jamming: New visual noise overlay.
• "Extra-fancy" bunker explosions, particles, burning, and smoke effects.
• Nicer bomb explosion on ground. Hat tip: "Dirt Explosion" by SrGrafo on DeviantArt - https://www.deviantart.com/srgrafo/art/Dirt-Explosion-774442026
• "DOMFetti" confetti explosions, colours based on the target being hit.
• Notifications: Verbiage for different actions, e.g., "your tank steamrolled an infantry", or gunfire "popped a balloon" etc.
• Refactor of Traffic Control, so vehicles are less likely to get "stuck" waiting for one another.
• Helicopter bombs could be delayed after key press. They should now be consistent and fire on the next frame.
• Super Bunkers would sometimes stay yellow, even when friendly.
• Additional "arrow signs" on battlefield were missing from bases since 2013. Oops. ;)
• Parachute infantry (dropped from helicopter) no longer get a recycle (reaching end of battlefield) reward.
• Balloon respawning at top of screen: fixed.
• Allow balloons to be moving up or down at init, previously always downward.
• Fixed bomb spark / hidden / bottom-align logic.
• Tighten up inventory ordering / queueing, consistent spacing + avoiding overlapping between sprites.
Helicopters
• Only the local player's helicopter blinks on the radar; all others are solid, as in the original game.
• Desktop: double-click no longer toggles helicopter auto-rotate feature.
Smart Missiles
• Notify user when trying to fire a smart missile, but no eligible targets nearby.
• Smart missiles can now take damage, and plow through up to four infantry (ground units only) before dying.
• Smart Missile targeting refactor. Removed former "missile facing target" requirement. Prefer shortest distance, unless just above ground. Hat tip: Pythagoras. 😉 📐
• Smart Missiles now target your vertical offset, plus half your height.
• Smart Missiles now blink on launch, and take a moment (0.5 seconds) to arm themselves, and are not as dangerous (1 damage point) until then. This is implemented as the "Ramius frame count" (delay) 1d71faf - as inspired by "The Hunt For Red October." https://www.youtube.com/watch?v=CgTc3cYaLdo&t=112s
• New feature: Smart Missile "decoy" ability, - about 1/3 of a second to see and retarget a newly-deployed parachute infantry when the initial target was the helicopter. 926b16f
Gunfire
• Gunfire can now collide with gunfire.
• Turret gun firing rates have been reduced significantly for easy + hard levels.
• Gunfire can now ricochet off the roof of a Super Bunker.
• Desktop: Helicopter gunfire now stops when landing on, and cannot start while on a landing pad.
Bombs
• Bombs now "pass-thru" infantry, as opposed to dying 1:1.
• Bomb explosions on the ground can now take out larger groups of infantry.
• Bombs can be hit by gunfire in extreme mode.
Tanks
• Tanks have finally been given flamethrowsers (as in the original game,) which they use on infantry, engineers, super bunkers and end bunkers. e3de57e
• Game preferences refactor. Volume control, UX/UI, and optional gameplay features.
• Enemy tanks fire every 11 frames in "hard" mode, 12 in "easy" (and tutorial), and 10 in "extreme." Previously, all were 10.
• Tanks now repair more incrementally, larger gains every 1 second.
Other
• Engineers start repairing bunkers (if enabled) at the doorway, "shielded" by bunker vs. previously standing outside.
• Landing pads can be "The Danger Zone" if enabled in prefs. This was inspired by the 2022 Top Gun movie release. See also: "The Girl From Ipanema, "I Got You Babe," "Mucha Muchacha," and more.
• Base explosions can now also damage units passing by.
• Bases can fire rubber chickens + bananas if "match missile type" enabled in prefs.
• "GOURANGA!" - inspired by the original Grand Theft Auto.
• When the battle is over, the losing team's units all contribute to the explosion party.
• Codebase migration to ES6 modules, patterns and syntax.
• SoundManager 2: hacked-together version of Web Audio API for playback, vs. HTML5. a44bc81
• Refactoring of game type and objects system; e.g., tank
-> TYPES.tank
, and game.objects.tanks[]
-> game.objects.tank[]
so look-ups and interating by type are logical.
• game.objects.players
now has local, remote, cpu etc., which point to helicopters. Previously, many assumptions were made about game.objects.helicopters[0]
and [1]
.
• Network feature uses PeerJS (MIT license) for peer-to-peer communication via WebRTC.
• It turns out there are three types of cloud sprites in the original game, not two. 4a561c4
• 12 smoke frames in the original game too, vs. my 9. 53f08aa
• Nicer ASCII block-character logo.
• Updated favicon + related app / tile images.
V1.6.20220101: Massive update for 2022, based on work from 2020 + 2021
Video overview
- Demo, features and walk-through of "extreme" mode (55 minutes): https://youtu.be/9BQ62c7u2JM
Performance improvements
• The game should be smoother, targeting 30FPS. It is OK full-screen @ 1080p and windowed @ 4K in Chrome on a 2018 Mac Mini, 3.2 GHz 6-core i7 w/Intel UHD Graphics 630 1536 MB.
• More GPU-accelerated rendering, reduced DOM nodes by removing when off-screen (e.g., static terrain items)
• All sprites should be on the GPU and moved using transforms, reducing paint operations
• All transforms (CSS + JS) for positioning + animation are 3d, with the goal of GPU acceleration - e.g., translate3d(), rotate3d(), scale3d()
• DOM nodes are not appended at object create time - now deferred until the object is on-screen for the first time.
• All "sub-sprites" should now be GPU-accelerated via CSS animations, transforms and transitions
• Sound: Only create Audio()
when actively playing sounds, and destroy when they finish playing. Browsers are starting to limit the number of Audio()
instances.
• Sound: Queue and play sounds all at once with each animation frame callback, vs. prior ad-hoc behaviour.
• Refactored game tip scroller to only show two nodes at a time, 1024px width vs. 102,400px. Front-end tech / Chrome Dev Tools demo: https://youtu.be/eVW0WgTdK3A
• Performance: Don't update known static radar items: turret, base, bunkers (bunker, end bunker, super bunker) unless marked as "stale" during resize / world scaling
• Performance: CSS / contentVisibility
to reduce / optimize rendering costs
• Animation loop: improved timing, target 30 fps. Request next frame right away. Exit early if next frame arrives too quickly.
• Turret "scan" is now a CSS animation; previously, animated via JS.
• Smart missiles and helicopter trailers are now GPU-accelerated.
• Performance: Battlefield and radar units are now positioned via transform: translate3d() - no more legacy CSS shenanigans using bottom: 0px
.
• Memory leak fixes: DOM nodes, audio events, and a few others.
Sound
• Over 100 sound assets now in use
• New and updated sound effects: Infantry and engineer gunfire, injury and death, credit +/-, helicopter and turret guns, shell casings on turrets, bullets hitting the ground, turret being disabled and enabled (restored.)
UX / UI
• Proper "game options" modal with radio buttons and checkboxes for various UX/UI and gameplay features
• "It was a dark and stormy night" - option for snow on the battlefield. (May be slow on some computers.)
• Bunkers, balloons and super-bunkers now use graphics from the Macintosh (68K) version of Armor Alley; a bit more orange, and less garish yellow.
• Dune ][-style credit / debit UI and sounds
• Toast-style game notifications
• Health status bars when units are being hit or repaired
• New and improved smoke / particle effects, more explosions and shrapnel, more fun!
• Order queue: Refactored UI to show letters (e.g., MTVIE), with superscript numbers as appropriate.
• Missiles smoke more, and in extreme mode, have a burst of thrust (as in the original game) as they near expiry
• Pseudo-3D effect on shrapnel: Increase size slightly with vertical position on screen
• Ground units are "behind" most terrain elements like trees, bushes etc.
Bug fixes
• Bombing floating balloons no longer causes an explosion on the ground
• Improved bomb and shrapnel alignment / collision positioning with balloons, tanks, bunkers, and super-bunkers
• Fixed bug with quickly-respawning balloons (shooting balloon while infantry are passing under bunker, for example.)
• Fixed UI bug where the "incoming missile" white line would not always disappear.
• Game end: Improve alignment of view and base
• Adjusted initial position of game, centering view on the helicopter + base
• Helicopter / super-bunker: Improve vertical alignment if helicopter crashes on superbunker "roof."
• Fixed radar item for Super Bunkers, now shows correct friendly / enemy status.
• Cloud "wind" accelerates / decelerates more smoothly
• Clouds no longer "bounce" when they drift off the end of the world, but get a nice bit of wind to bring them back into view.
• Slight vertical alignment tweaks on gunfire and balloons in radar view.
• Improved orientation of heat-seeking smart missiles (and rubber chickens and bananas) as they track their target
• Tweaked movement and velocity of smart missiles, making them potentially faster / more random
• Enemy helicopter will now turn to face targets. Sometimes it would fire the other way. ;)
• Improved helicopter motion when approaching landing pad - "bounce" has largely been eliminated.
• Improved off-screen / on-screen DOM pruning, restoration of 3D transforms when re-appending DOM elements
• Fixed end-game bug, sometimes ground units (e.g. van) did not appear at base when blowing up.
• Adjusted collision detection: if helicopter is hiding "in" a friendly super-bunker, bombs should hit the roof of the super bunker and not the helicopter.
Gameplay
• New weapon: Heat-seeking bananas
• Ground unit "Traffic Control" option: Vehicles try to leave space between, and avoid overlapping each other. Tanks will now "park" behind friendly tanks, avoiding a pile-up. Tanks normally only stop to fire. Vans and missile launchers will now wait for each other, too. Tanks will not stop for vans or missile launchers, giving tanks a greater chance of ending up at the front of a convoy - a preferable offensive position.
• Units can now be "recycled" if they cross the battlefield, you are rewarded 2x cost in credits
• Engineers can now steal all funds from enemy bunker
• Engineers can now repair (but not rebuid) friendly bunkers
• Bullets now ricochet off non-friendly super-bunkers
• Shrapnel will ricochet off certain units (tank, super-bunker)
• "Incoming missile" doesn't show in extreme mode when the radar is jammed.
• End base, extreme mode: if a defense missile is destroyed, respawn another within 0.5 seconds.
• Missile launchers trigger when closer to the helicopter, more likely now to be on-screen
• Helicopter respawn: Delay if certain ground units are obstructing the landing pad.
• Enemy helicopter AI: Default 10% of dropping bombs when targeting a tank, subject to game difficulty (hard: 15%, extreme: 25%.)
• Bombs can now collide with smart missiles and take them out
• Tank gunfire only hits bunkers if tanks are shooting at a helicopter, or another tank (bug fix: previously, tanks could destroy a bunker trying to hit an infantry on the other side.)
• Super bunkers that are un-manned are "neutral" and dangerous to both sides, and will be shown as hostile on the radar. (This includes when tanks disarm a bunker by firing at it.)
• Bomb trajectory now includes the helicopter's Y-axis velocity, and they now rotate along with their trajectory.
• Helicopters now rise up from the landing pad on game start and respawn, like the original game.
• Helicopter gunfire takes tilt / angle into account.
• Helicopter "shake" starts when health is under 70%, gets worse with damage. This affects gunfire trajectory.
• Your missile launchers only fire at the enemy helicopter when the convoy is "unassisted", e.g., there is no friendly helicopter or turret nearby.
• Extreme mode: If you shoot down the enemy base's smart missiles while near the base, it will launch new ones that are faster and more difficult to dodge.
• While on a landing pad, your gunfire may go over infantry's heads most of the time.
• Don't assume the top of the battlefield is always safe; watch out for balloons!
• Parachute infantry now fall at slightly different rates, and may be affected more by wind
• A few additional, inspirational [ game paused in background ] messages
Technical notes: development / code
• Migrated core JavaScript to ES6 syntax, retaining functional + prototypal inheritance style. Slightly less verbose.
• As part of ES6 migration, dropped legacy IE 8 + 9 code and checks: ancient event handlers, lack of transform, requestAnimationFrame()
polyfill etc.
• Lots of cleanup: Exit early, reduced if/else
nesting. Dropped all setTimeout()
calls, moved to a frame-based approach: setFrameTimeout()
.
• aa.js
(core game code) is massive at ~450 KB, and seems like a good candidate to be broken up into ES6 modules. TBD.
Prior release notes
For history back to V1.0, see CHANGELOG.txt.
(ISC license applies to original game images and related assets, used with permission)
Armor Alley (original MS-DOS version) https://en.wikipedia.org/wiki/Armor_alley
Copyright (c) 1990, Information Access Technologies
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Many thanks are due to the original game author for granting permission to use the Armor Alley images and related assets under an ISC license. https://opensource.org/licenses/ISC
As the original sound effects could not be re-licensed, modern (and higher-fidelity) sound effects were found on https://freesound.org
Thanks go to numerous individuals for making their work available. The majority of these sounds have been published under a Creative Commons Attribution license, or other as specified. Details at each link.
PeerJS (MIT license): peer-to-peer communication via WebRTC.
Macintosh System 7-style scrollbars (images and CSS) - System.css (MIT)
01587 helicopter.wav by Robinhood76
Click by lebcraftlp
Cloth Flaps by Sauron974
DarkDetonation01.wav by M-RED
Debris Sifting Dry.aif by kantouth
explosion.mp3 by sarge4267
Explosion2.wav by steveygos93
explosion3.wav by sarge4267
explosion 4.aif by harpoyume
Gunshot 1.wav by Adam_N
GunShot.03.wav by stintx
Warfare_gunshots_machine_gun_burst_001.wav by soundscalpel.com
oddworld_bomb.wav by Oddworld
D6.wav by RealRhodesSounds
snapping-chain by CosmicEmbers
Stapler_Hands_05.wav by Simon Lacelle
static.wav by g_lowing
vhs hum by jocobzeier
Metal Click Sound by mkoenig
impact_water_splash_bomb_throw_flesh_01.wav by m_O_m
Faulty Flourescent Light Start & Hum.wav by EverydaySounds
Wilhem Scream Sample (1951) - archive.org
imppact wrench bounce.wav by andrewgnau2
Socket Wrench by TheGertz
Socket Wrench by xxqmanxx
alligator wrench 01.wav by klankbeeld
Violin C-5 Pizzicato Non-Vibrato by Carlos Vaquero
Violin G-4 Pizzicato Non-Vibrato by Carlos Vaquero
Pop_9.aif by SunnySideSound
Pop SFX by runirasmussen
Crash & Glass.wav by Rock Savage
splats.wav by FreqMan
Door Closing.wav by ceberation
Metal-Clanging.mp3 by Tiger_v15
Metal_Hit_02.wav by dheming
bolo-hit-tank-self.wav from "Bolo", Copyright (C) Steuart Cheshire 1993. A subtle tribute to my favourite Mac game of all-time, hands down. <3
(See also: Orona Coffeescript partial port, WinBolo source code on Google Code via archive.org and on GitHub)
Tank fire Mixed.wav by Cyberkineticfilms (CC0 License, “No Rights Reserved”)
Medals Clanking by Gareth_H (BY-NC 3.0)
Gun/Canon » Auto Assault Rifle/Gun Burst (Outdoor/Close) (Mixed) by EFlexTheSoundDesigner (BY-NC 3.0)
Tank fire Mixed.wav by Cyberkineticfilms (CC0 License, “No Rights Reserved”)
Metal Heavy Mechanics by jorickhoofd (CC-BY 3.0)
Gun/Canon » Auto Assault Rifle/Gun Burst (Outdoor/Close) (Mixed) by EFlexTheSoundDesigner (BY-NC 3.0)
Gun_AR15_Machine_Gun_3_Single_Shot
and Gun_Machine_Gun_M60E_Burst_1
by The Recordist
Body Hits_Concrete.wav by mlsulli (CC0)
Gun Shells Hitting Ground (2,3,12,16,36,37) by FilmmakersManual (CC0)
Heavy machine gun.wav by CGEffex (CC BY 3.0)
Chairs Break, Crash, pieces move.wav by issalcake (CC0)
Bullet - Metal Hit (2-4) by FilmmakersManual (CC0)
Bullet - Concrete Hit (2-4) by FilmmakersManual (CC0)
Incoming Ricochets 2.wav by rakurka (CC BY 3.0)
Rick O'Shay » selected ricochets (no bang) from craigsmith's freesound 486071.wav by Timbre (CC BY-NC 3.0)
aparicion .wav by citeyo1 (CC0)
HQ Explosion by Quaker540 (CC0)
Explosion Near.wav by Bykgames (CC BY-NC 3.0)
musical saw ascending UFO by JohnsonBrandEditing (CC0)
Metal-Clanging.mp3 by Tiger_v15 (CC BY 4.0)
Huge Explosion Part 3 - Long Crash by bevibeldesign (CC0)
Cash Register by kiddpark (CC BY 4.0 Deed)
Dirt Explosion by SrGrafo on DeviantArt
"Cornholio" and BnB sprites, Genesis 32X SCD. Hat tip: "aperson98" on The Spriters Resource
BnB "VS" banner image - https://www.steamgriddb.com/game/5248723
FA Sysfont C by Alina Sava (SIL Open Font License 1.1)
JetBrains Mono webfont, JetBrains. SIL Open Font License 1.1