@@ -37,7 +37,7 @@ fn assemble_script<B: ByteOrder>(
3737 let mut previous_jump_entries = std:: collections:: HashSet :: new ( ) ;
3838
3939 let mut jump_entry_counts = HashMap :: < u32 , u32 > :: new ( ) ;
40- let mut jump_table_buffer : Vec < u8 > = Vec :: new ( ) ;
40+ let mut jump_table_buffers : HashMap < u32 , Vec < u8 > > = HashMap :: new ( ) ;
4141
4242 for instruction in program {
4343 log:: debug!( "finding info for {}" , instruction. name) ;
@@ -89,8 +89,16 @@ fn assemble_script<B: ByteOrder>(
8989 // this check deduplicates jump table entries
9090 // TODO: make game-specific config option, seems to be needed
9191 if previous_jump_entries. insert ( name. 0 . clone ( ) ) {
92- jump_table_buffer. write_all ( & name. to_vec ( ) ) . unwrap ( ) ;
93- jump_table_buffer. write_u32 :: < B > ( offset) . unwrap ( ) ;
92+ jump_table_buffers
93+ . entry ( instruction_info. id ( ) )
94+ . or_insert ( Vec :: new ( ) )
95+ . write_all ( & name. to_vec ( ) )
96+ . unwrap ( ) ;
97+ jump_table_buffers
98+ . entry ( instruction_info. id ( ) )
99+ . or_insert ( Vec :: new ( ) )
100+ . write_u32 :: < B > ( offset)
101+ . unwrap ( ) ;
94102 jump_entry_counts
95103 . entry ( instruction_info. id ( ) )
96104 . or_insert ( 0 )
@@ -169,7 +177,11 @@ fn assemble_script<B: ByteOrder>(
169177 result. write_u32 :: < B > ( * count) . unwrap ( ) ;
170178 }
171179
172- result. append ( & mut jump_table_buffer) ;
180+ for id in & db. jump_table_ids {
181+ if let Some ( buffer) = jump_table_buffers. get_mut ( id) {
182+ result. append ( buffer) ;
183+ }
184+ }
173185 result. append ( & mut script_buffer) ;
174186
175187 let result = result;
0 commit comments