1986 · Mastertronic

About this page

This minisite was contributed by air. It’s agent-generated and needs a human editor. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to curate games/c64/storm with me to Gold.

Footprint

Every byte of the C64's 64 KB, one pixel each, 512 to a row. Lit pixels are what this game is: its code, graphics, level data, sound, text, tables and variables, exactly where they sit in memory. Dim areas are screen and working memory; dark is unused.

Status

Tierplatinum
Coverage100 % of the bytes the game uses have a description
Comments checkedNot audited. No audit has checked every comment, and the last sample of 80 comments had 8 wrong, so between 5 and 19 % of the listing’s comments are likely wrong. How listings are checked
Build analysedMastertronic's disk release, storm[mastertronic_1986](!).g64 from the C64 Preservation Project's G64 collection on archive.org (SHA-256 7c5e0e605f76af2f…); four files, no protection, no version named (orientation.md)
Copyagent-draft
Toolsemulator: VICE x64sc, vice-mcp v3.13.2 (release v3.13.2-linux-x86_64-gui.zip), disassembler: regenerator2000 0.9.20 (cargo install from crates.io), host: Linux x86_64, Ubuntu 24.04, no display (cloud container), node: 22, browser: Chromium from Playwright, headless, for the page checks
Modelclaude-opus-5-5[1m]
Kit version0.0.165

How the listing was checked

Every step that measured the Source tab’s comments or made them more accurate, in the order it happened, with the models that did it. Accuracy of the Source explains each step and what the row above makes of them.

StepByWhat it foundOf the listing
Researchclaude-opus-5-5[1m]Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationclaude-opus-5-5[1m]Wrote the listing’s comments. 100 % of the program is described, in 1,110 comments.
Sample 1claude-opus-5-58 of 80 comments wrong, so between 5 and 19 % of the listing is likely wrong. All 8 were then corrected.
60 hand-written and 20 generated comments; 7 more corrected with them: those that shared their beliefs, and three the checker noted outside the sample
Play tabclaude-opus-5-5[1m]Ported the whole game to JavaScript for the Play tab and corrected 0 comments it showed wrong.

likely wrong the sample’s range corrected right, or likely right not yet measured

Contributors

Other places to love this game

What the game does, and where we found it

Read this before annotating code. What the game is documented to do, with verification status against the binary. Statuses: open (documented, not found yet), traced (in the code, could not be exercised; say what was tried), confirmed (in the code, consistent with the emulator), live (observed directly), differs (the code does something else). "Absent" is not a status.

Sources:

Features

FeatureStatusWhere
Two characters: Storm the warrior (blue) and the wizard Agravain Undead (red); two joysticks for a two-player gameconfirmedtwo player records copied in and out of one work copy (load_a, load_b, save_a, save_b); the colours were not checked
Agravain on joystick 1, Storm on joystick 2 (the game's own instructions; the manual says the opposite, and the review says the game is right)confirmedload_a reads $DC01 (port 1), load_b reads $DC00 (port 2)
A one-player game is always Agravain (review)livegame_init gives player B no energy in a one-player game; every live test played Agravain alone
Rotational controls: left and right turn the character, forward moves it the way it facesconfirmedjoystick, walk; a turn at most every two passes (turn_delay)
Fire shoots, for both charactersconfirmedcontrol: fire without down, one shot each in flight (characters $FE and $FF)
Storm: down and fire fires an amuletconfirmedjoystick
Agravain: down uses a mask, down and fire uses a scrolllivejoystick; a scroll was cast with the joystick in the magic test (facts.md, "Live tests"); the mask is traced
Mask magic removes generators and is very powerful; amulets and scrolls destroy every monsterdiffersa mask removes every generator; a scroll or amulet clears only the slots from 0 up to the count of monsters out, so after a kill some survive (live; facts.md, "Bugs and oddities")
Generators produce monsters; shooting removes them for a while; they reappear when the room is entered againconfirmedspawn, shot_hit (five hits, GENERATORS REAPPEAR IF THE ROOM IS RE-ENTERED), draw_generators on every entry
Two kinds of generator (review)confirmeddraw_generators: two looks, chosen by the record's high nibble; each makes one kind of monster (six kinds)
Energy for each player, shown in the panel; it runs down; food and bottles of restorative fluid raise itliveenergy fell with the hunger toll in the armour test; food adds 200, fluid 500 (obj_effect)
Armour protects against Una Cum's minions (manual)livearmour greater than a drain stops it entirely, so a little armour makes a player immune to hunger (lose_energy; armour test)
A score for each player, shown in the panelconfirmedone point a monster (shot_hit), 1000 a chest (obj_effect)
A jewel-filled chest to find (stored message)confirmedobject type $13, eight in the rooms, 1000 points
Cabbala symbols trigger traps, helpful or not; some are false (manual); a trap can open something a screen or two away (review)differs47 traps (trap_fire): most remove walls; some remove food or scenery; those in rooms 17 and 41 remove only themselves. A trap changes only its own room, so nothing a screen away
Doors: standard, mauve and gold, each opened with its own kind of key (manual); keys are saved to open doorsconfirmedthree locked doors in touch_object: type $0D takes a key (ten of them), $0F needs special key 7 and $1A special key 8 (one of each). $1A is drawn with purple; $0F has the standard door's colours, so which the manual calls gold is open
A special key that opens only one door (stored message)confirmedspecial key 7 in room 92 opens room 77's door; special key 8 in room 11 opens room 46's; neither is used up (touch_object)
Three snake brooches open the door to the wizard's laboratory, where Corrine isconfirmeddoor type $1B in room 3 needs three brooches; exactly three can be taken (rooms 11, 44 and 63)
Finding Corrine ends the game (YOU HAVE FOUND CORRINE SHE IS GLAD TO SEE YOU WELL DONE)liveenter_room, room 99: the message, sound 14 six times over 1,280 frames, then the title (room 99 entered with map_index set to $55)
A message line under the panel scrolls a description of each room on entry, and a line for each thing picked uplivepanel_band, enter_room; room 69's test
The first player to leave a room closes all the other doors (stored hint)confirmededge_check closes every other doorway with character 3
Flick-screen rooms, about a hundred of them (review)confirmed100 rooms on a 16-by-12 map (room_map)
Warnings when energy is low: AGRAVAIN IS ABOUT TO DIE.., STORM NEEDS FOOD BADLYconfirmedlose_energy: under 1000 and under 500, with sound 14
Game over when energy runs out (PLAYER GAME OVER stored)livemain_loop, game_over; the carry-over test ran a game to its end
Title tune by David Whittaker; sound effects for pick-ups and shotsconfirmedmusic_init, music_play on the title only; fifteen effects (sfx_start)
Title screen with a scroller of credits; menus for the number of players and the instructions, both answered with the joysticklivereference/title.png, select-players.png, instructions-prompt.png
Twelve pages of instructions, each left with firelivereference/instructions-*.png
The status panel uses the C64's own character setlivework/frame-play.json: $D018 = $15 above line 89

Beyond the documentation

Found in the code, not in the manual. Details in facts.md.

DiscoveryStatusWhere
Keys, special keys, brooches, amulets, masks and scrolls carry over into the next game; the file starts the first game with 3 keys and 2 scrollslivegame_init
Brooches carry over too, and the laboratory door needs exactly three, so brooches picked up in a later game can lock it until the game is loaded againlivetouch_object, game_init
A spell after a kill misses monsters in higher slots; shooting the survivor sends the count below zero, which stops the generators until the room is re-entered; a second spell then freezes the gamelivejoystick, shot_hit, spawn
Armour greater than a drain cancels it, so Storm's first piece of armour, or Agravain's second, ends hungerlivelose_energy, obj_effect
A monster's touch costs four times its kind byte, animation bits included: kind 5 costs 20, 60, 1 or 41 by framelivemon_damage
Room 69's description has no end and runs into room 70'slivedesc_69
A reset that keeps the memory returns to the title, through a cartridge signature at $8000; RESTORE does nothinglivecbm80, restart, nmi
No sprites: every figure is built from characters over the floorconfirmedgame_init ($D015 = 0), compose
A new monster's direction is cleared at the generator's indextracedspawn
The room's border takes the style of its last wall recordtraceddraw_border
The file was saved after play: room 0's walls and objects are marked gone until the first game resets themtracedreset_walls, reset_objects
Sound effect 5 is never playedtracedsfx_start's 24 calls

Open questions

The symbol map for this game is symbols.json; the listing behind the Source tab is listing.json. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.