Streemerz NES port
Moderator: Moderators
Streemerz NES port
EDIT (2012-10-10): Project has been completed, download the ROM from www.fauxgame.com.
---
Continuing from here...
To recap, this project is about making a NES port of the "NES-lookalike" Flash game called Streemerz, which itself is based on one of the games in the Action 52 multicart. See the thread linked above for more details.
This project was started about a year ago but was put on hiatus not long after that because of difficulty obtaining the level assets, and not being interested in doing a ton of manual work. Lately it has been picking up steam again thanks to help from other members of this forum.
I'll be using this thread as a sort of project blog from now on. Next item on the TODO list is to convert the binary level dumps from the Flash game to XML format for Tiled.
Here's a screenshot of an old prototype written in C:
---
Continuing from here...
To recap, this project is about making a NES port of the "NES-lookalike" Flash game called Streemerz, which itself is based on one of the games in the Action 52 multicart. See the thread linked above for more details.
This project was started about a year ago but was put on hiatus not long after that because of difficulty obtaining the level assets, and not being interested in doing a ton of manual work. Lately it has been picking up steam again thanks to help from other members of this forum.
I'll be using this thread as a sort of project blog from now on. Next item on the TODO list is to convert the binary level dumps from the Flash game to XML format for Tiled.
Here's a screenshot of an old prototype written in C:
Last edited by thefox on Wed Oct 10, 2012 3:14 pm, edited 3 times in total.
The NES picture is 256x240, with a few scanlines cut off the top (up to 16) and bottom (up to 11) by the TV. StreEmerZ (Flash version) uses maps of 320x240 pixels with no overscan. There are two ways to handle this: A. draw the map onto 320 pixels of a 512x240 pixel vertical mirrored plane and scroll back and forth, or B. redraw all the maps to be 256 pixels wide. Lode Runner does a mix of both: it scrolls horizontally, and the maps are slightly cut down vertically. I'd prefer B, but if one can make a strong case that A improves the port, so be it.
Currently they scroll horizontally. If they can be shrinked down without changing the level designs too much, I'm all for that, but it's not top priority right now. The nice thing is it should be pretty easy to switch between the two (if/when the levels have been re-designed) without having to touch any of the engine code.Grumskiz wrote:Looks great!
Will the maps scroll? As far as I remember there was an issue with the map size, am I correct?
So were you able to shrink them without altering them completely or will they scroll even though they're originally intended to be "single screen"?
Like tepples said, there's also the problem with vertical resolution and overscan on some TVs, which might affect some levels. Again this isn't something I'm going to be worrying about too much right now.
Got the binary maps converted to Tiled XML format:
Not all of the binary files are maps, some of them contain objects for the maps and some contain dialogue. Now the problem is finding out which object list belongs to which map... After I figure that out, I'm going to write some more code to get the objects to show up in Tiled as well.
Not all of the binary files are maps, some of them contain objects for the maps and some contain dialogue. Now the problem is finding out which object list belongs to which map... After I figure that out, I'm going to write some more code to get the objects to show up in Tiled as well.
I think I found a way to assign the original names to the dumped assets.
Dwedit, what software did you use to dump the images and the audios? If you can dump them with the Flash tag header still in them, I can get the tag ID from the beginning of the file and use it to assign them a name that's used to reference the asset in the source. There's a symbol table (consisting of tag IDs and their names) at offset 0x5E3E46 in the unpacked SWF file.
EDIT: Or if you can dump them so that the filename contains the tag ID, that would be fine as well...
EDIT: Here are the tag IDs and the symbols which reference them:
Dwedit, what software did you use to dump the images and the audios? If you can dump them with the Flash tag header still in them, I can get the tag ID from the beginning of the file and use it to assign them a name that's used to reference the asset in the source. There's a symbol table (consisting of tag IDs and their names) at offset 0x5E3E46 in the unpacked SWF file.
EDIT: Or if you can dump them so that the filename contains the tag ID, that would be fine as well...
EDIT: Here are the tag IDs and the symbols which reference them:
Code: Select all
{2: ['MainGame_embedded_font_string'],
3: ['GamePreTitle_START_SOUND'],
4: ['SoundManager_MUSIC_TITLE'],
5: ['SoundManager_MUSIC_ORIGINAL'],
6: ['SoundManager_MUSIC_CHEETAH'],
7: ['SoundManager_MUSIC_MUSIC2'],
8: ['SoundManager_MUSIC_MUSIC'],
9: ['GameTitle_STEP2'],
10: ['GameTitle_STEP1'],
11: ['GameTitle_MONEY_JINGLE'],
12: ['GameTitle_METAL_SOUND'],
13: ['HowToPlay_START_SOUND'],
14: ['GamePlay_PAUSE'],
15: ['GamePlay_THUNDER'],
16: ['Player_GRAPPLE'],
17: ['Player_REEL'],
18: ['Player_FLIP'],
19: ['Player_STEP1'],
20: ['Player_RESPAWN'],
21: ['Player_JUMP'],
22: ['Player_STEP2'],
23: ['Player_TRACT'],
24: ['Player_DIE'],
25: ['Player_METAL_SOUND'],
26: ['Player_CAST'],
27: ['Player_LAND'],
28: ['Trap_TRAP'],
29: ['Candle_FLAME'],
30: ['Candle_FLAME_DIE'],
31: ['Door_DOOR'],
32: ['Breakable_BREAK'],
33: ['HUD_Textbox_TEXT'],
34: ['HUD_Textbox_M_EXPLODE'],
35: ['CheckPoint_CHECK'],
36: ['FlyClown_EXPLODE'],
37: ['PieThrower_THROW'],
38: ['MasterY_TRACT'],
39: ['MasterY_JUMP'],
40: ['MasterY_RESPAWN'],
41: ['MasterY_LAND'],
42: ['MasterY_METAL_SOUND'],
43: ['MasterY_REEL'],
44: ['MasterY_CAST'],
45: ['MasterY_DIE'],
46: ['MasterY_GRAPPLE'],
47: ['MasterY_FLIP'],
48: ['Thunder_THUNDER'],
49: ['Money_MONEY_JINGLE'],
50: ['Clown_EXPLODE'],
51: ['GameVEnding_TEXT'],
52: ['GameEnding_TEXT'],
53: ['Explosion_EXPLODE'],
54: ['EscapePodGFX_POD'],
55: ['Metal_METAL'],
56: ['VLevelList_LEVEL1_EFile'],
57: ['LevelList_COMMS6_EFile',
'JLevelList_COMMS6_EFile',
'EasyLevelList_COMMS6_EFile'],
58: ['JLevelList_LEVEL4_EFile', 'LevelList_LEVEL4_EFile'],
59: ['ScriptList_COMMS4_File'],
60: ['JLevelList_LEVEL4_MFile', 'LevelList_LEVEL4_MFile'],
61: ['ScriptList_ESCAPE_File'],
62: ['ScriptList_Y_ENDING_File'],
63: ['GameTitle_SELECT'],
64: ['ScriptList_V_002_File'],
65: ['Player_PLAYER', 'MasterY_PLAYER'],
66: ['ScriptList_Y_FUU_File'],
67: ['EasyLevelList_COMMS5_MFile',
'JLevelList_COMMS7_MFile',
'JLevelList_COMMS5_MFile',
'EasyLevelList_COMMS6_MFile',
'LevelList_COMMS7_MFile',
'VLevelList_COMMS5_MFile',
'VLevelList_COMMS6_MFile',
'LevelList_COMMS6_MFile',
'JLevelList_COMMS6_MFile',
'LevelList_COMMS5_MFile',
'EasyLevelList_COMMS7_MFile',
'VLevelList_COMMS7_MFile'],
68: ['ScriptList_Y_VENI_File'],
69: ['ScriptList_V_007_File'],
70: ['LevelList_COMMS3_MFile',
'EasyLevelList_COMMS3_MFile',
'JLevelList_COMMS3_MFile',
'VLevelList_COMMS3_MFile'],
71: ['GameTitle_TITLE_GRAPHIC', 'GamePreTitle_TITLE_GRAPHIC'],
72: ['EasyLevelList_LEVEL4_EFile'],
73: ['VLevelList_COMMS2_EFile'],
74: ['ScriptList_Y_B16_File'],
75: ['JLevelList_LEVEL3_EFile', 'LevelList_LEVEL3_EFile'],
76: ['JLevelList_LEVEL7_EFile', 'LevelList_LEVEL7_EFile'],
77: ['VLevelList_COMMS7_EFile'],
78: ['ScriptList_DEPRESSURE_File'],
79: ['EasyLevelList_COMMS2_MFile',
'LevelList_COMMS2_MFile',
'VLevelList_COMMS2_MFile',
'JLevelList_COMMS2_MFile'],
80: ['MasterY_LINE', 'Player_LINE'],
81: ['HowToPlay_HELP_1'],
82: ['HowToPlay_HELP_2'],
83: ['PieThrower_CLOWN'],
84: ['EasyLevelList_LEVEL3_MFile',
'JLevelList_LEVEL3_MFile',
'LevelList_LEVEL3_MFile'],
85: ['ScriptList_POISON_LOCATION_File'],
86: ['LevelList_LEVEL5_MFile',
'EasyLevelList_LEVEL5_MFile',
'JLevelList_LEVEL5_MFile'],
87: ['JLevelList_COMMS4_EFile',
'EasyLevelList_COMMS4_EFile',
'LevelList_COMMS4_EFile'],
88: ['ScriptList_VINTRO_File'],
89: ['ScriptList_Y_MONEY_File'],
90: ['ScriptList_VENI_INTRO_File'],
91: ['ScriptList_Y_POISON_DEATH_File'],
92: ['ScriptList_V_DEFLECT_File'],
93: ['HUD_Textbox_TEXTBOX'],
94: ['ScriptList_V_PIE_File'],
95: ['ScriptList_ENDRACE_File'],
96: ['JLevelList_LEVEL6_MFile', 'LevelList_LEVEL6_MFile'],
97: ['JLevelList_COMMS5_EFile',
'LevelList_COMMS5_EFile',
'EasyLevelList_COMMS5_EFile'],
98: ['ScriptList_POISON_DEATH_File'],
99: ['SuperPlayer_SUPER_PLAYER'],
100: ['ScriptList_V_006_File'],
101: ['ScriptList_VENI_File'],
102: ['Pie_SPRITEMAP'],
103: ['Explosion_EXPLOSION'],
104: ['ScriptList_Y_B9_File'],
105: ['LevelList_LEVEL6_EFile', 'JLevelList_LEVEL6_EFile'],
106: ['ScriptList_BALL_File'],
107: ['ScriptList_B16_File'],
108: ['VLevelList_LEVEL5_MFile'],
109: ['ScriptList_Y_POISON_LOCATION_File'],
110: ['SuperLevelList_LEVEL1_MFile'],
111: ['LevelList_COMMS1_EFile',
'JLevelList_COMMS1_EFile',
'EasyLevelList_COMMS1_EFile'],
112: ['ScriptList_Y_WEAK_File'],
113: ['JLevelList_LEVEL5_EFile', 'LevelList_LEVEL5_EFile'],
114: ['ScriptList_COMMS3_File'],
115: ['ScriptList_Y_ESCAPE_WAY_File'],
116: ['VLevelList_COMMS4_EFile'],
117: ['MasterY_MASTERY', 'JPlayer_J_PLAYER'],
118: ['ScriptList_Y_GETHIM_File'],
119: ['GrappleHook_GRAPPLEHOOK'],
120: ['EasyLevelList_COMMS7_EFile',
'LevelList_COMMS7_EFile',
'JLevelList_COMMS7_EFile'],
121: ['ScriptList_Y_COMMS2_File'],
122: ['ScriptList_PIE_File'],
123: ['VLevelList_COMMS4_MFile',
'JLevelList_COMMS4_MFile',
'LevelList_COMMS4_MFile',
'EasyLevelList_COMMS4_MFile'],
124: ['ScriptList_Y_PIE_File'],
125: ['LevelList_LEVEL1_MFile', 'JLevelList_LEVEL1_MFile'],
126: ['SuperLevelList_LEVEL1_EFile'],
127: ['VLevelList_LEVEL6_MFile'],
128: ['JLevelList_COMMS3_EFile',
'EasyLevelList_COMMS3_EFile',
'LevelList_COMMS3_EFile'],
129: ['GrappleHook_GRAPPLEHOOK_MASK', 'Ball_GRAPPLEHOOK_MASK'],
130: ['ScriptList_GETHIM_File'],
131: ['VLevelList_COMMS5_EFile'],
132: ['LevelList_LEVEL2_EFile', 'JLevelList_LEVEL2_EFile'],
133: ['FlyClown_CLOWN'],
134: ['ScriptList_METAL_File'],
135: ['Money_MONEY'],
136: ['JLevelList_COMMS2_EFile',
'LevelList_COMMS2_EFile',
'EasyLevelList_COMMS2_EFile'],
137: ['ScriptList_ENDING_File'],
138: ['net.flashpunk.graphics.Text__FONT_DEFAULT'],
139: ['EasyLevelList_LEVEL6_EFile'],
140: ['Smoke_SMOKE'],
141: ['ScriptList_Y_INTRO_File'],
142: ['VLevelList_LEVEL7_EFile'],
143: ['ScriptList_V_END_File'],
144: ['LevelList_LEVEL7_MFile', 'JLevelList_LEVEL7_MFile'],
145: ['ScriptList_MEASURE_File'],
146: ['ScriptList_Y_BALL_File'],
147: ['BlueBall_BLUE_BALL'],
148: ['LevelList_LEVEL1_EFile', 'JLevelList_LEVEL1_EFile'],
149: ['VLevelList_LEVEL7_MFile'],
150: ['ScriptList_FUU_File'],
151: ['ScriptList_V_009_File'],
152: ['ScriptList_Y_COMMS3_File'],
153: ['Candle_CANDLE'],
154: ['VLevelList_LEVEL2_MFile'],
155: ['EasyLevelList_LEVEL6_MFile'],
156: ['VLevelList_COMMS3_EFile'],
157: ['GameTitle_TITLE_LOGO', 'GamePreTitle_TITLE_LOGO'],
158: ['ScriptList_Y_COMMS6_File'],
159: ['VLevelList_LEVEL3_EFile'],
160: ['HUD_DEATHFACE'],
161: ['VLevelList_COMMS1_MFile',
'EasyLevelList_COMMS1_MFile',
'JLevelList_COMMS1_MFile',
'LevelList_COMMS1_MFile'],
162: ['VPlayer_V_PLAYER'],
163: ['VLevelList_LEVEL4_MFile'],
164: ['ScriptList_V_010_File'],
165: ['ScriptList_V_001_File'],
166: ['EasyLevelList_LEVEL1_MFile'],
167: ['ScriptList_V_004_File'],
168: ['VLevelList_COMMS6_EFile'],
169: ['ScriptList_V_008_File'],
170: ['Main_MG_Logo'],
171: ['ScriptList_ESCAPE_WAY_File'],
172: ['EasyLevelList_LEVEL2_EFile'],
173: ['Trap_TRAP_SPRITE'],
174: ['VLevelList_LEVEL4_EFile'],
175: ['ScriptList_MONEY_File'],
176: ['ScriptList_Y_COMMS4_File'],
177: ['ScriptList_Y_BOMBOFF_File'],
178: ['ScriptList_V_011_File'],
179: ['ScriptList_EXIT_File'],
180: ['EasyLevelList_LEVEL2_MFile'],
181: ['EasyLevelList_LEVEL5_EFile'],
182: ['EasyLevelList_LEVEL4_MFile'],
183: ['Hook_HOOK'],
184: ['EasyLevelList_LEVEL3_EFile'],
185: ['ScriptList_CLOWN_File'],
186: ['ScriptList_BOMBOFF_File'],
187: ['HUD_Textbox_FACES'],
188: ['EndingBG_BG'],
189: ['ScriptList_COMMS6_File'],
190: ['ScriptList_COMMS2_File'],
191: ['GhostPlayer_PLAYER'],
192: ['Clown_CLOWN'],
193: ['VLevelList_LEVEL6_EFile'],
194: ['EasyLevelList_LEVEL7_MFile'],
195: ['Breakable_BREAKABLE'],
196: ['VLevelList_LEVEL1_MFile'],
197: ['ScriptList_END_File'],
198: ['VLevelList_LEVEL5_EFile'],
199: ['CheckPoint_POINT'],
200: ['ScriptList_INTRO_File'],
201: ['VLevelList_LEVEL2_EFile'],
202: ['ScriptList_WEAK_File'],
203: ['LevelList_LEVEL2_MFile', 'JLevelList_LEVEL2_MFile'],
204: ['ScriptList_Y_ESCAPE_File'],
205: ['EasyLevelList_LEVEL1_EFile'],
206: ['Deflector_SPRITE'],
207: ['ScriptList_Y_DEPRESSURE_File'],
208: ['EasyLevelList_LEVEL7_EFile'],
209: ['Level_TILES'],
210: ['VLevelList_COMMS1_EFile'],
211: ['VLevelList_LEVEL3_MFile'],
212: ['Main_MG_Logo_dataClass'],
213: ['Ball_BALL'],
214: ['ScriptList_B9_File'],
215: ['ScriptList_V_003_File'],
216: ['ScriptList_V_005_File'],
217: ['ScriptList_Y_VENI_INTRO_File'],
218: ['ScriptList_Y_CLOWN_File']}
Have you already tried to contact the original author of Streemerz? I'm sure Arthur Lee would be honored to help port Streemerz back to the NES.
http://www.superfundungeonrun.com
http://www.superfundungeonrun.com
The port got hung up on this for a year until we finally figured out two ways to extract the maps. What finally got us off our collective asses may have been a multicart project that I had started working on early in the year.In [url=http://nesdev.com/bbs/viewtopic.php?p=77297#77297]this post[/url], thefox wrote:I actually started working on this after okaying it with the original author first. He sent me the player sprites but hasn't responded to my latest message where I asked for more assets (levels...).
Yes I contacted him the very first thing when I started the project, he never replied to my query about the level assets. I don't blame him though, if a random guy came to me asking for similar stuff, I probably wouldn't give the project a high chance of getting finished, and consequently wouldn't want to waste my time explaining all the inner workings of the engine. At this point it doesn't even matter, most of the stuff has been RE'd (and it has been kind of fun, actually).slobu wrote:Have you already tried to contact the original author of Streemerz? I'm sure Arthur Lee would be honored to help port Streemerz back to the NES.
http://www.superfundungeonrun.com
I'm really glad we found a way to extract the original binary maps, figuring out all the small details about object placement, events, differences in map per difficulty levels etc would have been a ton of work. Also since I now have all the original dialogue files etc it's much easier to make sure that nothing gets missed...
This is great. I also vote for horizontal scrolling to keep the levels as close to the "original" as possible. (unless it becomes too much of a distraction)
I died 69 times on easy in the flash game
Really hope you finish taking this cool Streamers remake to the NES. Imagine if all of the Action 52 games were as good as this, man what a bargain it would have been.
I died 69 times on easy in the flash game
Really hope you finish taking this cool Streamers remake to the NES. Imagine if all of the Action 52 games were as good as this, man what a bargain it would have been.
Done:thefox wrote:After I figure that out, I'm going to write some more code to get the objects to show up in Tiled as well.
There's going to be some redundancy in the map files when converted like this because the original game has separate map and entity (aka object) files. This doesn't really matter however, because the maps and entities can be globally optimized when exporting them back to NES.
Next I'm going to start thinking about converting some of the entities (like the purple metal blocks and the immobile balls) to tiles.