Commit 004bfb4

Nick committed on
Account for off-by-one error in order tables during codegen
commit 004bfb41e65ebb0479caf6b077eac29e99dc4c03 parent b6e52d6
3 changed files +9−6
Modifiedcodegen.pas +7−4
@@ -70,7 +70,7 @@ var
70 SL.StrictDelimiter := True; 70 SL.StrictDelimiter := True;
71 SL.Delimiter := ','; 71 SL.Delimiter := ',';
72 72
73 for I := Low(Order) to High(Order) do 73 for I := Low(Order) to High(Order)-1 do // HACK: account for off-by-one error
74 SL.Add('P' + IntToStr(Order[I])); 74 SL.Add('P' + IntToStr(Order[I]));
75 75
76 Result := 'static const unsigned char* const order' + IntToStr(Number) + '[] = {'; 76 Result := 'static const unsigned char* const order' + IntToStr(Number) + '[] = {';
@@ -143,6 +143,8 @@ var
143 end; 143 end;
144 144
145 begin 145 begin
146 Song := OptimizeSong(Song);
147
146 OutSL := TStringList.Create; 148 OutSL := TStringList.Create;
147 OutSL.Add('#include "hUGEDriver.h"'); 149 OutSL.Add('#include "hUGEDriver.h"');
148 OutSL.Add('#include <stddef.h>'); 150 OutSL.Add('#include <stddef.h>');
@@ -158,8 +160,9 @@ begin
158 // TODO: Are keys and data defined to be aligned? Seems like they are but 160 // TODO: Are keys and data defined to be aligned? Seems like they are but
159 // should probably find out if that's just an implementation detail... 161 // should probably find out if that's just an implementation detail...
160 for I := 0 to Song.Patterns.Count - 1 do 162 for I := 0 to Song.Patterns.Count - 1 do
161 OutSL.Add(RenderGBDKPattern('P' + IntToStr(Song.Patterns.Keys[I]), 163 if PatternIsUsed(Song.Patterns.Keys[I], Song) then
162 Song.Patterns.Data[I]^)); 164 OutSL.Add(RenderGBDKPattern('P' + IntToStr(Song.Patterns.Keys[I]),
165 Song.Patterns.Data[I]^));
163 OutSL.Add(''); 166 OutSL.Add('');
164 167
165 OutSL.Add(RenderGBDKOrder(1, Song.OrderMatrix[0])); 168 OutSL.Add(RenderGBDKOrder(1, Song.OrderMatrix[0]));
@@ -199,7 +202,7 @@ function RenderOrderTable(OrderMatrix: TOrderMatrix): string;
199 SL := TStringList.Create; 202 SL := TStringList.Create;
200 SL.StrictDelimiter := True; 203 SL.StrictDelimiter := True;
201 SL.Delimiter := ','; 204 SL.Delimiter := ',';
202 for I := Low(Ints) to High(Ints) do 205 for I := Low(Ints) to High(Ints)-1 do // HACK: account for the off-by-one error
203 SL.Add('P' + IntToStr(Ints[I])); 206 SL.Add('P' + IntToStr(Ints[I]));
204 Result := SL.DelimitedText; 207 Result := SL.DelimitedText;
205 SL.Free; 208 SL.Free;
ModifiedhUGEDriver +1−1
@@ -1 +1 @@
1 Subproject commit 00a523e809bf2bf92d3ebc9ad674c2ab879ce96d 1 Subproject commit 46acb7e8d0a1b5027dca0cb782011dd52e6b804e
Modifiedsong.pas +1−1
@@ -615,7 +615,7 @@ var
615 begin 615 begin
616 for K := 0 to S.Patterns.Count-1 do 616 for K := 0 to S.Patterns.Count-1 do
617 if CompareByte(S.Patterns.KeyData[S.Patterns.Keys[K]]^, P, SizeOf(TPattern)) = 0 then 617 if CompareByte(S.Patterns.KeyData[S.Patterns.Keys[K]]^, P, SizeOf(TPattern)) = 0 then
618 Result := S.Patterns.Keys[K]; 618 Exit(S.Patterns.Keys[K]);
619 end; 619 end;
620 begin 620 begin
621 Result := S; 621 Result := S;