Category: hacking

  • Hacker Spotlight: Billy Time! Games

    Recommended Works of the Retro Gaming Mad Scientist

    With a release count of 250 (and counting!), Billy Time! Games is committed to creating hacks of games from obscure to well-known and providing users with a new and refreshing gaming experience.

    You can follow Billy Time! Games on YouTube, Twitter, RHP, or RHDN.

    The self-professed mad scientist of retro gaming sits down with FFV Central to give an exclusive overview of the highlights of the scientist’s numerous hacking projects.

    Subheadings, screenshots, and trailers added during the editorial process.

    1. Ghostbusters – Special Edition

    2023 – BillyTimes Games, Master Linkuei, Danillo Dais

    • 4 new playable characters
    • 26 new cheats
    • Save function
    • Two new difficulties
    • Director’s cut mode
    • Nerfed coffee cups

    Why did I make this?

    I am a huge ghostbusters fan and really want to do a hack which added new characters with awesome abilities. I also really wanted to test how big I could make a hack.

    Also available: 2023 interview with SEGAbits [link].

    2. Sega Channel Revival

    2021 – BillyTime! Games

    • Offline version of Sega Channel with all features included
    • Playable on certain custom cores and hardware

    Why did I make this?

    I never got to enjoy Sega Channel during its lifetime, this hack was my attempt to have the service reborn so I and many others could see and enjoy what Sega Channel was.

    3. Super Star Wars Redux Trilogy

    2025 – BillyTime! Games

    • Nerfed difficulty across all games
    • Extra perks for easy mode
    • Streamlined patches to cut out bad or annoying levels

    Why did I make this?

    I loved Super Star Wars even though it was hard, the others? Not so much. This was a project I wanted to do for years and I am glad to have done so.

    4. Streets of Rage Plus

    2024 – BillyTime! Games

    • Six Button Support
    • Alternate Colors in 1p
    • Access bad ending in 1p
    • Difficulty Randomizer
    • Hi-Score SRAM saves

    Why did I make this?

    I LOVE Streets of Rage, over the years I kept making small hacks and I figured, why not just build a super hack and go all out. Probably my preferred way of playing SOR1 now.

    5. Zombies ate My Roguelike

    2022 – BillyTime! Games

    • Randomized levels across five tiers
    • Mania mode for endless fun
    • High Score SRAM
    • Score based reward system

    Why did I make this?

    I always enjoyed games like Binding of Isaac and I wanted a randomizer type game but without the extra software needed. It also built on the idea that Genesis can have ZAMN hacks too.

    6. Ultimate X-Men

    2021 – BillyTime! Games

    • Rebalanced Mutant Powers, Especially Wolverine!
    • SRAM Save Support
    • Infinite X-Man Switching
    • CPU Reset done automatically

    Why did I make this?

    I am a huge marvel fan and always wanted the older games to be awesome. This was one of my first forays along with Spider-Man/X-Men to revamp the entire Marvel library. Except Spider-Man Animated, that game is cooked.

    FFV Central: Spectacular! Thank you for this overview.

    So, what do you think? Have you tried Billy Time! Games’s hacks, and if so, which is your favorite? Comment below, or come check us out on Discord.

    This post has been viewed 12 time(s).

  • Mega Man Romhacking Discord Deleted

    New Discord Created by Different Owner

    The new invite link is here.

    Please support the community-rebuilding efforts, especially if you’re a Mega Man fan.

    Announcement from the new owner:

    This post has been viewed 24 time(s).

  • Mod Showcase: Spazer Plasma Mix for Super Metroid

    Presented by JAM of Metroid Construction

    To see JAM’s developed sets on RA, click here. You can also follow him on YouTube.

    An Epic Mechanics Hack

    JAM’s Spazer Plasma Mix hack of Super Metroid has been featured in comprehensive mods such as Hyper Metroid and Super Metroid Redux. So what does this hack do? Read on.

    1. Demo Reel

    December 17, 2025

    Writes clymax:

    Spazer-Plasma combo can be combined with any combination of the other beams.

    2. Full Showcase

    October 9, 2016

    Writes LabyrinthHunterSKB:

    Great patch. A definite must pick up for every Super Metroid fan that always want a Spazer and Plasma combined that Nintendo couldn’t do for this game. I decided to showcase this because this was really cool. There is a reason for this and its not because they were lazy at all.

    3. Dev Commentary

    Original Post: https://forum.metroidconstruction.com/index.php?msg=46573

    July 14, 2015

    5 years ago…

    I started this project without any chance to success. In next few days I understood a lot of information, where the needed pointers are, how the tilemap structure works etc. It allows me to understand what to do and how to do it.

    I started planning my work finally realized that I’ll have no space to make what I want to. Then I got rid of unused tilemaps (like Plasma Beam 3 tiles long. In game used only states of 1, 2 and 4 tiles). I tried to optimize the data, but still got failed. Not enough space.

    I have idea to avoid it, by using the same tilemaps for different beams and it works fine, so I started repointed, worked a lot and then… suddenly understood that all optimized tilemaps are looking corrupted in the rooms with acid. So Many Time WASTED.

    I was working on this project and stoped from it from time to time and then I finally found a decision. How to fit all this data into bank $93. It works perfectly when I tried it, but then, still have got problems in some rooms, like small graphical glitch reported by many users. There is no way to avoid it, so I’ve continued my works.

    While optimizing the data I’ve also noticed that how bad the Spazer tilemaps made. And that vertical and horizontal beams have different size. Besides of that, all sprites for Wave + Plasma beam is asymmetric that makes it impossible to insert beam between them without looking that “not right”, so I got rid of that asymmetry.

    I’ve noticed that wide of Spazer and Waved Spazer Beams are changed differently. So I made separate behaviour just for shooting the Spazer + Plasma Beam without Wave. I had enough space for that, luckily.

    Then… more unused data was found. Optimization, repointing, repeat, repeat. There were truly over 9000 minutes of working in pure hex in total. I haven’t worked with timer on, but I guess, it close to 15000. Finally I wrote all the tilemaps. Of course, there were some bugs in my tilemaps, so I tested every beam flying in any direction until…

    I released version 0.99 with all tilemap done that works more or less stable and without tiling errors. Of course, there were things I wanted to fix, but I have no idea, how to make it.

    Few mounths later I SUDDENLY realized what was wrong and released v0.992 with Phantoon fixed. Blame devs, not me, who set wrong Frozen AI pointer. But still, all the enemies still sharing its Spazer + Plasma vulnerabilities with ammo vulnerabilities. I wanted to fix it, but have no idea, what to do.

    Few mountts later I SUDDENLY (again) have found where the pointers were stored. Setting to pointer to RAM $12 and accessing it later. Not surpising it took So Many Time… Understanding this eventually allows me to split ammo vulnerabities to finally make every eneme have its own unique vulnerabilities for Spazer + Plasma, not shared for something else. So, I wrote the code for it and make SMILE JX support for it, because vulnerabilities are now stored in a bit different order.

    Thus, v0.995 was born. All vulnerabilities are separated, but not repointed. Now could I repoint them if someone could use the same space in Bank $B4. I was so tired and take a break. Poor RealRed did this manully for his awesome hack and succeed with it. Still this patch had minor bugs and one major: Ninja Pirates don’t won’t to reflect the shots and crashing the game. The bug discovered long time ago, but with no solution. And… it was pretty simple. There is 1 reference for uncharged beam arrays and 2 references for charged. And I forgot to change one pointer. That is it. v0.996 is ready. No more fatal errors.

    Present time…

    After a long break I’ve resumed my work on SMILE JX and with help of it finally repointed and expanded all the vulnerabilities array which can be freely edited in JX or RF (hi, Sadi. We both started a major projectes 5 years ago). Too bad, I can do it only for vanilla ROM, as if you’ve repointed something in Bank $B4, this patch may (or, most likely will) corrupt your data. Special tool in JX v2.84 will expand it manually, no matter if there was repointed data or if there isn’t. So, v0.997 of this patch is ready and released at the right moment. Check the first post.

    FREE SPACE USED:
    1A74B8..1A75EF

    If this space is unused in your hack, it’s OK to apply it. Check for previous posts to know usage in another banks.

    This version have a bonus. Since default power of Charge+Ice+Wave+Spazer+Plasma is 1500 (dec) and default power of Hyper Beam is 1000 (dec), I decided to make Hyper more powerful. Its power increased to 2000 (dec). And since you can mix all the beams, why the Hyper should looks like you’ve only collected Charge and Plasma? So, here you go, a new Plasma Beam. Wider and more powerful:

    Full Combo item will be included tomorrow.

    4. Exclusive Interview with JAM

    November 14, 2025

    FFV Central:

    “Spazer Plasma Mix (v0.998).ips”: Be able to combine both the Spazer Beam alongside the Plasma Beam (by JAM). The original v0.997 patch by JAM had a bug in which Phantoon couldn’t be damaged with Missiles nor Super Missiles, this has been fixed by me and made a new v0.998 version of the patch with the fix to Phantoon’s vulnerabiliy table with SMILE RF. NOTE: There are graphical issues when using this patch.

    Are the graphical issues specific to [Super Metroid] Redux…?

    JAM: Nope, this is how this patch was made from the start. Almost the whole data bank was recoded and that’s why it’s not v1.something. I made the new tiletable that way, so for every frame of beam my tiletable starts from using my code, then a single fake tile that causes graphical issues and then the original game code for Wave+Plasma that was relocated. That fake tile is needed to determine the size of array for the already used in game combination. So, it was made like this, if simple, for each frame:

    [array size of mixed beam shot][center beam data][fake tile data[array size of side beams]][side beam data]

    Fake tile data is what causing the graphical glitches as for each tile the format is:

    [XX XX YY TT TT]

    where XX is the X position of the tile; YY is the Y position; TT is the graphical data to display, including flip data (is the graphic mirrored horizontally, vertically or both). So I just placed that tile as much outside of screen as I could and TT here is used as array size of the beam that is already in the game, which is 2 bytes. This is the source of that glitch. I don’t remember for sure but I guess I even made it more complex to use the data of usual Plasma Beam shots, followed by the data of Wave+Plasma shot (that dual bars waving), separated by fake tiles. All that needed to save space because the data of all beams, including the new ones would not fit the data bank and I know why developers haven’t did that. They could repoint some data that is already there but not beam related to another bank and they still could make the game size under 3 Mbs but that would need the other banks to be organized better.

    As for enemy vulnerabilities, bank $B4 is overused. I guess, it’s $B4 if I remember it correctly. That patch modifies the vulnerability array for each enemy to include 4 extra bytes for the new beam combination without actually writing the new data. It supposed to be done by my own version of SMILE. It was coded but not released. My patch could contain this data without using any other software to repoint and extend the actual data but that means, if you have new enemies or modified vulnerabilities data of the existing ones and somewhere at 90% of hack making progress you decide to use my patch, all your custom data would be overwritten and you need to change the vulnerabilities again. That’s why the actual enemy vulnerabilities data was not included.

    FFV Central: Can’t you just use the Plasma entry of the vulnerability data? Then you could add a hack routine to check for Spazer and then boost the vulnerability by another multiplier, such as +30%, on the fly. Assuming there is space for that hack routine for this admittedly inelegant solution. [Editor’s note: clymax would later in a new mod implement this suggestion but as applied to beam damage.]

    JAM: It’s not the actual beam damage data, I mean the modifiers for every enemy. It’s just an array of $14 bytes for each enemy, one byte per beam/missile to determine who is vulnerable and immune to what. You can set immunity, 0.5x damage, 1x, 1.5x, 2x, 2.5x and so on. With patch applied it’s $18 bytes per enemy now, so these arrays needs to be relocated.

    FFV Central: Noted. Thank you.

    Related Posts

    So, what do you think? Comment below, or come check us out on Discord.

    This post has been viewed 34 time(s).

  • Super Metroid Beam Editing Guide

    Presented by JAM of Metroid Construction

    To see JAM’s developed sets on RA, click here. You can also follow him on YouTube.

    Original Link (now down): https://old.metroidconstruction.com/docs/JAMbeameditingguide.txt

    July 2010

    This guide explians of how to edit beams. Keep in mind that this guide will helps to find pointer and edit data, but not contain the pointers for every exiting beam/missile.

    Our target is bank $93. Imagine a tree structure. It has common roots, 3 trees, big branches, small branches and leafes. Every leaf is a sprite. Some leafes and branches are completly identical.

    Level 0 (roots) is level of projectile type related
    Level 1 (tree) is certain beam/missile related (for each type)
    Level 2 (big branch) is shooting position related (for each beam, many related to a few beams)
    Level 3 (small branch) is size and position related (for each shooting position)
    Level 4 (leaf) is sprite related (for every frame projectile is flying)

    Level 0

    We start from common roots (level 0) and we can select 3 trees.

    For normal shots array starts at 983C1;
    for charged — at 983D9;
    for misc (missiles/super/bombs/etc.) — at 983F1.

    In my Spazer + Plasma mix patch these arrays are relocated and extended:
    normal shots array — to 9C3A1;
    charged shots array — to 9C3C1;
    missiles/super/bombs/etc. — to 9EFEA.

    Every entry is a word. Every word is a pointer to the level 1.

    Level 1

    So, for Power Beam (value 0000) pointer will be located at 83C1 and bytes there are 31 84. It means, it’s value of pointer is 8431 and it leads to $93:8431.
    For Wave Beam (value 0001) pointer will be located at 83C3 (83C3+00012) and bytes there are B5 84. It means, it’s value of pointer is 84B5 and it leads to $93:84B5. For Ice Beam (value 0002) pointer will be located at 83C7 (83C3+00022) and bytes there are 9F 84. It means, it’s value of pointer is 849F and it leads to $93:849F.

    … etc up to value 000B (included)
    In Spazer + Plasma mixing patch this goes up to value 000F (included)

    For charged shots, for charged Power Beam the pointer will be located at 83D9 there are 39 85. It means, it’s value of pointer is 8539 and it leads to $93:8539.
    … etc up to value 100B (included)
    In Spazer + Plasma mixing patch this goes up to value 100F (included)

    Same for misc, but the values of shots are starts from 0100 (Missile) and incremented by 0100 every word.
    I mean, pointer for shot with value 0100 (Missile) is located at 983F1.
    Pointer for shot with value 0200 (Super Missile) is located at 983F3 (983F1+0002).

    Let’s suppose, we fire with non-charged Spazer (value 0004).
    Level 0 : 83C1
    Level 1 : 83C1+0004*2=83C9
    Level 2 : 8447 (pointer at 83C9)

    Level 2

    When jumping to 8447, we see a lot of bytes. Let’s group them by 2:
    28 00
    77 89
    93 89
    AF 89
    CB 89
    E7 89
    E7 89
    03 8A
    1F 8A
    3B 8A
    77 89

    First word is a damage value for current beam (0028). This value is stored in the moment of shooting. Another 10 words are pointers to the level 3.

    We have shot type (non-charged), we have beam type (Spazer). Now we need to select a firing direction. Direction is based on aiming value at the moment of shooting.
    0: facing right, shooting up
    1: facing right, shooting up-right
    2: facing right, shooting right
    3: facing right, shooting down-right
    4: facing right, shooting down
    5: facing left, shooting down
    6: facing left, shooting down-left
    7: facing left, shooting left
    8: facing left, shooting up-left
    9: facing left, shooting up

    Why there are 2 values for aiming up and down? Well, the game loads the damage value first and then just loads aiming value from memory, increments it (to skip damage value), multiplies it by 2 and get pointer to level 3.

    Level 2 pointer is leading to damage value directly.
    Level 3 pointer is level 2 pointer + (aiming + 1) * 2

    If we are facing right and shooting right, aiming value will be 2. And pointer to the level 3 will be located at 8447 + (2 + 1) * 2 = 8447 + 3 * 2 = 8447 + 6 = 844D
    Word at 9844D is 89AF and this is a pointer to level 3.

    Level 3

    Here we can set actual radius of projectile, delay in frames to display current graphic before loads next graphic and pointer to sprite code. Data is grouped by 8 bytes except last entry. Let’s see what we have at 989AF:
    989AF: 02 00 42 D8 08 0C 00 00
    989B7: 02 00 6E D8 08 0C 01 00
    989BF: 02 00 CE D8 08 14 02 00
    989C7: 39 82 BF 89

    In general, we have:
    DD DD SS SS XX YY EE EE
    DD DD SS SS XX YY EE EE

    39 82 LL LL

    Where DD — delay in frames,
    SS — sprite code pointer
    XX — X radius in pixels
    YY — Y radius in pixels
    EE — entry number
    LL — pointer to loop

    39 82 is a pointer to instruction 8239, which loads 2 bytes after pointer as argument and jumps to this address. In this case, first 2 entries are used to display the sprite when it coming out of cannon and 3rd entry is used to display full-sized sprite until the beam will go offscreen or collide with something.

    As for actual X and Y radiuses, they are used to calculate collisions with objects. Visible beam sprite can be bigger or smaller.

    Note, that for the first 2 entries when the beam is coming out, it have X radius — 8 pixels and Y radius — C pixels. When the beam is came out, it have X radius 8 pixels and Y radius — 14 pixels. Just remember how Spazer shot fired to the right is acting and you’ll understand.

    And also note, that these are collision radiuses, not actual width and height. To get width and height, multiply values by 2.

    Since we have pointer to sprite code, let’s go to level 4.

    Level 4

    There is a sprite code and nothing more. It contains of amount of entries (2 bytes) and of entries itself (5 bytes each). Let’s see what we have at 9D842 (shooting part):
    02 00
    F8 01 FC 30 6C
    00 00 FC 30 6C

    In general, we have:
    AA AA
    XX PX YY TT FT
    XX PX YY TT FT

    AA — Amount of entries. 2 bytes are used for this. Each entry uses 5 bytes. So, tilemap size: AA5+2. If AA = 2, the total size of tilemap is 25+2=10+2=12 bytes.
    XX — X position of block/tile
    PX — Complex
    YY — Y position of block/tile
    TT — Tile number to display
    FT — Complex

    PX is better write in binary form
    Bits: 76543210

    If bits 7, 6 and 1 are set, then print block (selected tile and 3 more tiles to fit square made of 16*16 pixels. For example, if selected tile is $C0 and bits 7, 6 and 1 are set, then the result will be printing tile $C0, printing tile $C1 to the right of it, printing tile $D0 below tile $C0 and printing tile $D1 to the right of tile $D0).

    Else (if bits are clear) print single tile.

    Bit 0 is used as high bit for X position. Thus, you can set X from 0000 to 01FF.

    FT should also be written in binary form
    Bits: 76543210

    Bits 7 and 6 are used for flipping. 7 — for vertical flip, 6 — for horizontal flip.

    Bits 5 and 4 are used for layering. 5 — for draw the block/tile in front of layers 1 and 2, 4 — ??????

    Bits 3, 2 and 1 are used to determine used pallette row (uncormimed)?

    Bit 0 is used as high bit for tile number. Thus, you can select 512 tiles but it’s better to use this bit for direct addressing only as Missiles and Super Missiles do. I tried to use direct addressing for the beams and it looks fine in some emulators until any FX3 is appearing. When it happens, graphics from Layer 3 will overwrite your beam graphics and you’ll shoot garbled mess for all beams using this beam until reloading your game.

    Note that X ranges from 0000 to 01FF while Y ranges from 00 to FF. As for title screen (and possibly other graphic things such as asteroid belt, Ceres station in space etc.), and center of coordinates is the center of screen. NOT upper-left corner.

    TT is tile number value staring from offset $D5200. It can be from 30 to 37 (if beam was shot) or any value from 00 to FF for missiles/super/etc. That’s because Missiles, Super Missiles, Bombs etc. are using direct pointers to tiles and beams are using indirect pointers, determined by array at $843B1, depending on beam type. Every entry is a word. Every word is a pointer for graphics in bank $9A for this beam.

    For the Power Beam pointer is 00 F2 (leads to $D7200), for the Wave Beam pointer is 00 F6 (leads to $D7600), for the Ive Beam pointer is 00 F4 and so on up to beam value 000B (included).

    Tilemap for some beams can be the same. So, if you change value at $843B2 from F2 to F4 you’ll use Ice Beam graphic for Power Beam. When you fire Power Beam, the Ice Beam shot will come out but still using the palette of Power Beam. Palettes you can change by projectiler.

    You can also change pointers to free space (black squared in TLP in bank $9A) and use unique graphics for each beam combination, like D7300 or D7500.

    Note that you can use only 8 tiles for each beam combination (including changed and uncharged form).

    Return to our example.

    02 00
    F8 01 FC 30 6C
    00 00 FC 30 6C

    For Spazer graphic pointer is located at $843B1 + 0004 * 2 = 843B9. It leads to D7A00. So, tile 30 will be the first tile located at D7A00, 31 the second tile and so on.

    Let’s also see the final phase of shooting.

    Return to level 3.

    989AF: 02 00 42 D8 08 0C 00 00
    989B7: 02 00 6E D8 08 0C 01 00
    989BF: 02 00 CE D8 08 14 02 00
    989C7: 39 82 BF 89

    Let’s view CE D8 as a level 4 pointer.

    9D8CE:
    06 00
    F8 01 EC 30 6C
    F8 01 FC 30 6C
    F8 01 0C 30 6C
    00 00 0C 30 6C
    00 00 EC 30 6C
    00 00 FC 30 6C

    Change all 30s to 34 and regular Spazer shot fire to the right will be displayed as changed one (only displayed, damage value is still from uncharged Spazer).

    Change all 30s to 33 and regular Spazer shot fire to the right will looks strange. All tiles will looks like “|” instead of “-” and whe whole shot will be:
    ||

    ||

    ||

    instead of:

    Array locations

    In general, these arrays are consists of pointers or values. Each word (or byte in some arrays) is related to certain beam. Words are ordered by currently eqipped beam values:
    0000 (Power Beam)
    0001 (Wave Beam)
    0002 (Ice Beam)
    0003 (Ice + Wave Beams)
    0004 (Spazer Beam)
    0005 (Spazer + Wave Beams)
    etc.
    So, first word (or byte) in each array related to Power Beam, next word (or byte) for Wave Beam and so on…

    Sound

    Sound array is located at 8428F.
    In Spazer + Plasma mixing patch it’s relocated to 87FC0 and extended.
    Each word is a number of sound from Library 1 to play when beam is shot. Check Kej’s RandomRoutines guide to see full list.

    Behaviour

    Behaviour array is located at 8396E.
    In Spazer + Plasma mixing patch it’s relocated to 87F80 and extended.
    Each word is a pointer to code in bank $90 for execute.

    Effect is based on pointer:
    AEF3: strike solid surfances.
    B0E4: go through walls (for uncharged wave). Trails keeps for a 3 frames.
    B0C3: go through walls (for uncharged wave). Trails keeps for a 4 frames.

    This array is the root of all evil. Extending it was enough to make Spazer + Plasma combo works. And selecting Ice + Spazer + Plasma in original game make use value at 8398A as a pointer, which is not a pointer, jumping to 82D16 and executing code there, starting from wrong operator in the middle of subroutine.

    Graphic

    Graphic array is located at 843B1.
    In Spazer + Plasma mixing patch it’s relocated to 87F40 and extended.
    Each word is a pointer in bank $9A to load graphics.

    Note that you can use separate graphics for each beam combination, as there is a free space in bank $9A. Go to $D0000 in TLP and check it out.

    Palette

    Graphic array is located at 843C9.
    In Spazer + Plasma mixing patch it’s relocated to 87F20 and extended.
    Each word is a pointer in bank $90 to load palette.

    Note that you can use separate palette for each beam combination, as there is a free space in bank $90. Each beam uses $20 bytes for a palette (single palette row, 16 colors).

    Special Beam Attack values

    Arrays related to Special Beam Attack values is located at 84C21.
    In Spazer + Plasma mixing patch it’s relocated to 87F00 and extended.
    Each word is a Power Bomb value to decrement when executing Special Beam Attack.

    You can play with values and, for example make Plasma Special Attack use 5 Power Bombs. Although, code wasn’t written to use more than 1 power bombs, so if you have 1 or 2 power bombs, Plasma Special Attack still will be executed.

    If you know ASM code a bit, you can try to mess with code at 84CC0 to improve it, like display message “Not Enough Ammo” and prevent you from using Special Beam Attack if you haven’t got enough Power Bombs. Or use Missiles, Super Missiles or even Energy instead of Power Bombs.

    Special Beam Attack

    Special Beam Attack is located at 84CF0.
    In Spazer + Plasma mixing patch it’s relocated to 87EA0 and extended.
    Each word is a pointer to code in bank $90 to execute.

    Effect is based on pointer:
    CD18: do nothing.
    CD9B: execute Ice Special Attack aka Ice Ring (4 charged shots will make protective ring).
    CD1A: execute Wave Special Attack aka Wave Cross (4 charged shots will fly from screen corners to opposite corners).
    CE14: execute Spazer Special Attack aka Spazer Rain (2 shots will fly around you and then 6 shot will make a rain).
    CE98: execute Plasma Special Attack aka Plasma Sphere (4 sphears will fly around you).

    If you skilled enough you can write your own special attack for each beam combination.

    Starting speed

    Starting speed array is located at 842D0.
    In Spazer + Plasma mixing patch it’s relocated to 87EC0 and extended.
    This array is a bit different. For each beam, 2 words are used: one for vertical/horizontal speed and one for diagonal speed.

    Cooldown array 1

    Cooldown array for holding fire button is located at 84283.
    In Spazer + Plasma mixing patch it’s extended, overwriting the next array (which is also repointed, of course).
    Each byte is delay in frames between shots when you’re holding fire button.

    Cooldown array 2

    Cooldown array for tapping fire button is located at 84254.
    In Spazer + Plasma mixing patch it’s extended. Maybe, something was overwrited.
    Each byte is delay in frames between shots when you’re tapping fire button.

    Cooldown array 3

    Cooldown array for charged shots is located at 84264.
    In Spazer + Plasma mixing patch it’s extended.
    Each byte is delay in frames of how long your gun will be cooling down after firing the charged shot.

    If you have any questions, feel free to PM me.

    Credits

    Please give me a credit if you found this guide useful.

    Thanks

    DSO for finding beam color priority. It helps me understood of how beam arrays are stored.
    Kejardon for the RAM Map and other docs that helps a lot.

    Related Post

    This post has been viewed 8 time(s).