{"id":315,"date":"2012-02-20T11:32:31","date_gmt":"2012-02-20T16:32:31","guid":{"rendered":"http:\/\/snarfblam.com\/words\/?p=315"},"modified":"2012-02-20T11:33:18","modified_gmt":"2012-02-20T16:33:18","slug":"metroid-wavy-ice","status":"publish","type":"post","link":"http:\/\/snarfblam.com\/words\/?p=315","title":{"rendered":"Metroid: Wavy-Ice"},"content":{"rendered":"<figure id=\"attachment_320\" aria-describedby=\"caption-attachment-320\" style=\"width: 256px\" class=\"wp-caption alignleft\"><a href=\"http:\/\/snarfblam.com\/words\/wp-content\/uploads\/2012\/02\/autodrop37.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-320\" title=\"Wavy-Ice\" src=\"http:\/\/snarfblam.com\/words\/wp-content\/uploads\/2012\/02\/autodrop37.png\" alt=\"Wavy-Ice screenshot\" width=\"256\" height=\"224\" \/><\/a><figcaption id=\"caption-attachment-320\" class=\"wp-caption-text\">Shootin&#39; through stuff. Freezing stuff. Wavy-Ice can do it all!<\/figcaption><\/figure>\n<p>I&#8217;ve decided to share my simple Wavy-Ice hack. It allows the player to combine the wave beam and ice beam in Metroid. <strong><em>Note<\/em><\/strong> that this only works on a ROM expanded by Editroid 2.1. It will not work on an unexpanded ROM or an Editroid 3.0 ROM (I&#8217;ll release an updated patch for Editroid 3.0).<\/p>\n<p>I&#8217;ve put together <a href=\"http:\/\/snarfblam.com\/files\/wavyice.zip\">a zip<\/a> containing the code, an assembler, and a ready-to-go IPS patch. The code should be assembled with snarfblASM to produce an IPS file:<\/p>\n<pre>&gt;snarfblasm wavyice.asm wavyice.ips -IPS:ON<\/pre>\n<p><!--more-->For your viewing pleasure:<\/p>\n<pre>;\u00a0\u00a0\u00a0\u00a0 .\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 . \u00b7 .\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 O\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00b7 . \u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00b7 . \u00b7\r\n;\r\n; Wavy-Ice hack for Metroid\r\n; -------- ---- --- -------\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 by snarfblam\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (at gmail.com)\r\n;\r\n; Allows combining of wave beam and ice beam.\r\n; Also increases strength of ice, wavy-ice, and\r\n; bombs.\r\n;\r\n; WARNING: THIS CODE IS NOT COMPATIBLE WITH\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AND UNEXPANDED ROM!\r\n; WARNING: THIS CODE IS NOT COMPATIBLE WITH\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 EDITROID 3.0. If you want to use\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wavy-ice with a super-expanded\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ROM, wait until Editroid 3.0 comes\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out. I'll provide a compatible\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wavy-ice hack.\r\n;\r\n; Things I Felt Like Saying\r\n; ------ - ---- ---- ------\r\n; - This code is designed to be assembled with\r\n;\u00a0\u00a0 snarfblASM. If you want to use another assembler,\r\n;\u00a0\u00a0 feel free to break the code up into several files,\r\n;\u00a0\u00a0 assemble them separately, and insert them\r\n;\u00a0\u00a0 individually.\r\n; - This code is designed to work with an expanded\r\n;\u00a0\u00a0 metroid ROM. If you want to use it with an un-\r\n;\u00a0\u00a0 expanded ROM you need to:\r\n;\u00a0\u00a0\u00a0\u00a0 - Move the NEW code to a different location where\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 there is free memory\r\n;\u00a0\u00a0\u00a0\u00a0 - Change all .PATCH directives to use bank 07\r\n;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 instead of 0F.\r\n\r\n;===========================================\r\n; Allow weapon combining\r\n; ----- ------ ---------\r\n; NOPs out the code that removes one beam\r\n; when the play aquires another.\r\n;===========================================\r\n.PATCH 0F:DBD2\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP ; LDA $6878\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP ; AND #$3F\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP ; STA $6878\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NOP\r\n\r\n;===========================================\r\n; New Behavior\r\n; --- --------\r\n; Calls the appropriate routine to update\r\n; beam projectiles.\r\n;===========================================\r\n\r\n; Hijack\r\n; ------\r\n.PATCH 0F:D5C5\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JMP $C6B9\r\n\r\n; New code\r\n; --- ----\r\n; Updates ice with wave behavior if the player has ice+wave, otherwise\r\n; updates with normal ice behavior\r\n\r\n.PATCH 0F:C6B9\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LDA $6878\u00a0\u00a0\u00a0 ; Check equipment\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AND #$40\u00a0\u00a0\u00a0\u00a0 ; Has wave?\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEQ NoWave\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JMP $D52C\u00a0\u00a0\u00a0 ; Yes: UpdateWaveBullet\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;(normally UpdateWaveBullet isn't called when you have ice, even if you do have wave)\r\n\r\n\u00a0\u00a0\u00a0 NoWave:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JMP $D4EB\u00a0\u00a0\u00a0 ; No: UpdateBullet\r\n\r\n;===========================================\r\n; New Damage\r\n; --- ------\r\n; Specifies damage amount for wave+ice. Also\r\n; increases damage dealt by bombs and\r\n; vanilla ice. Heh.\r\n;===========================================\r\n\r\n; Hijack\r\n; ------\r\n.PATCH 0F:F5EE\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JMP $C6C6\r\n\r\n; New Code\r\n; --- ----\r\n\r\n.PATCH 0F:C6C6\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Y: Weapon type\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0 1 = Normal\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0 2 = Wave\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0 3 = Ice or Wavy-ice\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0 A = Bomb\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0 B = Missile (I think)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; X: Enemy index\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; 40B,X: enemy health\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LDY $040E,X\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Get projectile that hit enemy\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LDA $6878\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Get current equipment\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CPY #$03\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; If Ice...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BNE NotIce\r\n\r\n\u00a0\u00a0\u00a0 Ice:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AND #$C0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0\u00a0\u00a0 Does the player have wave and ice beams?\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BNE Damage4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0\u00a0\u00a0 If so, 4 damage\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEQ Damage2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;\u00a0\u00a0\u00a0\u00a0 Else, 2 damage\r\n\r\n\u00a0\u00a0\u00a0 NotIce:\r\n\u00a0\u00a0\u00a0 ; Includes vanilla-beam, bomb, wave, and missile\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CPY #$0A\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Bomb = 4 Damage\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEQ Damage4\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CPY #$02\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Wave = 2 Damage\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEQ Damage2\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BIT $0A\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Not-a-boss = 1 Damage\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BVC Damage1\r\n\r\n\u00a0\u00a0\u00a0 IsABoss:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CPY #$0B\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Vanilla-beam = 1 damage\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BNE Damage1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; (missile will fall thru and do 4 damage)\r\n\r\n\u00a0\u00a0\u00a0 Damage4:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DEC $040B,X\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEQ exitRoutine\r\n\u00a0\u00a0\u00a0 Damage3:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DEC $040B,X\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEQ exitRoutine\r\n\u00a0\u00a0\u00a0 Damage2:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DEC $040B,X\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEQ exitRoutine\r\n\u00a0\u00a0\u00a0 Damage1:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DEC $040B,X\r\n\r\n\u00a0\u00a0\u00a0 exitRoutine:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Return to F60F (this is the code that checks if enemies has\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; 0 HP and if so, kills him)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JMP $F60F\r\n\r\n; Original code\r\n; -------- ----\r\n; Included for comparison\r\n;\u00a0\u00a0 \u00a0cpy #$02\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Was enemy hit by wave?\r\n;\u00a0\u00a0 \u00a0beq +\r\n;\u00a0\u00a0 \u00a0bit $0A\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; ?? (Might be a check for boss)\r\n;\u00a0\u00a0 \u00a0bvc ++\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; If not, do 1 damage\r\n;\u00a0\u00a0 \u00a0ldy $040E,x\r\n\r\n;\u00a0\u00a0 \u00a0cpy #$0B\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Was enemy hit by missile?\r\n;\u00a0\u00a0 \u00a0bne ++\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; If not, do 1 damage\r\n\r\n;\u00a0\u00a0 \u00a0dec EnHitPoints,x\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Do 4 damage\r\n;\u00a0\u00a0 \u00a0beq +++\r\n;\u00a0\u00a0 \u00a0dec EnHitPoints,x\r\n;\u00a0\u00a0 \u00a0beq +++\r\n;*\u00a0\u00a0\u00a0\u00a0\u00a0 dec EnHitPoints,x\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Do 2 damage\r\n;\u00a0\u00a0 \u00a0beq ++\r\n;*\u00a0\u00a0 \u00a0dec EnHitPoints,x\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; Do 1 damage<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve decided to share my simple Wavy-Ice hack. It allows the player to combine the wave beam and ice beam in Metroid. Note that this only works on a ROM expanded by Editroid 2.1.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,25,8,4,18,3],"tags":[26,27,17,10,16,12,46,9,28],"class_list":["post-315","post","type-post","status-publish","format-standard","hentry","category-asm-romhacking","category-editroid-romhacking","category-front-page","category-general","category-programming","category-romhacking","tag-26","tag-asm","tag-editroid","tag-hacking","tag-metroid","tag-nes","tag-programming","tag-rom","tag-snarfblasm"],"_links":{"self":[{"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=\/wp\/v2\/posts\/315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=315"}],"version-history":[{"count":8,"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=\/wp\/v2\/posts\/315\/revisions"}],"predecessor-version":[{"id":326,"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=\/wp\/v2\/posts\/315\/revisions\/326"}],"wp:attachment":[{"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/snarfblam.com\/words\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}