Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Adding scaling to GHZ, EHZ, S2CNZ.
  • Loading branch information
MainMemory committed Jun 10, 2015
1 parent ce3e0e7 commit 16f94e6
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 51 deletions.
Binary file modified Dependencies/SonLVLAPI.dll
Binary file not shown.
77 changes: 54 additions & 23 deletions EHZ/EHZ.cs
Expand Up @@ -17,6 +17,8 @@ public class EHZ : SonicBGScrollSaver.Level
Color[] CyclingPal_EHZ_ARZ_Water;
short PalCycle_Timer, PalCycle_Frame;
int Width, Height;
LevelInfo levelinfo;
int scale;
byte framecounter;

byte[] SwScrl_RippleData = {
Expand All @@ -31,10 +33,16 @@ public override void Init(int width, int height)
{
Width = width;
Height = height;
levelinfo = IniSerializer.Deserialize<LevelInfo>("setup.ini");
LevelData.LoadGame("./setup.ini");
LevelData.LoadLevel("Level", true);
LevelData.BmpPal.Entries[0] = LevelData.Palette[0][2, 0].RGBColor;
levelimg = LevelData.DrawBackground(null, true, true, false, false);
if (levelinfo.Scale < 1)
scale = height / levelimg.Height;
else
scale = levelinfo.Scale;
levelimg = levelimg.Scale(scale);
tmpimg = new BitmapBits(Math.Min(levelimg.Width, width), height);
tmpimg.Bits.FastFill(0x22);
CyclingPal_EHZ_ARZ_Water = SonLVLColor.Load("EHZ ARZ Water.bin", EngineVersion.S2).Select(a => a.RGBColor).ToArray();
Expand All @@ -57,52 +65,52 @@ public override void UpdateScrolling(short Camera_X_pos_diff, short Camera_Y_pos
{
Camera_X_pos = (ushort)(Camera_X_pos + Camera_X_pos_diff);
//Array.Clear(Horiz_Scroll_Buf, 0, 22);
int bgpos = Camera_X_pos >> 6;
Horiz_Scroll_Buf.FastFill(bgpos, 22, 58);
int bgpos = (Camera_X_pos * scale) >> 6;
Horiz_Scroll_Buf.FastFill(bgpos, 22 * scale, 58 * scale);
framecounter--;
int a2 = (framecounter >> 3) & 0x1F;
for (int i = 80; i < 101; i++)
Horiz_Scroll_Buf[i] = bgpos + SwScrl_RippleData[a2++];
Horiz_Scroll_Buf.FastFill(bgpos + SwScrl_RippleData[a2++] * scale, i * scale, scale);
//Array.Clear(Horiz_Scroll_Buf, 101, 11);
bgpos = Camera_X_pos >> 4;
Horiz_Scroll_Buf.FastFill(bgpos, 112, 16);
bgpos = (Camera_X_pos * scale) >> 4;
Horiz_Scroll_Buf.FastFill(bgpos, 112 * scale, 16 * scale);
bgpos += bgpos >> 1;
Horiz_Scroll_Buf.FastFill(bgpos, 128, 16);
BWL bgpos2 = new BWL(0, (short)(-Camera_X_pos >> 3));
int scrlamt = -Camera_X_pos >> 1;
Horiz_Scroll_Buf.FastFill(bgpos, 128 * scale, 16 * scale);
BWL bgpos2 = new BWL(0, (short)(-(Camera_X_pos * scale) >> 3));
int scrlamt = -(Camera_X_pos * scale) >> 1;
scrlamt -= bgpos2.hsw;
scrlamt <<= 8;
scrlamt /= 0x30;
scrlamt = (short)scrlamt;
scrlamt <<= 8;
for (int i = 144; i < 159; i++)
{
Horiz_Scroll_Buf[i] = -bgpos2.hsw;
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, i * scale, scale);
bgpos2.sl += scrlamt;
}
for (int i = 159; i < 177; i += 2)
{
Horiz_Scroll_Buf[i] = -bgpos2.hsw;
Horiz_Scroll_Buf[i + 1] = -bgpos2.hsw;
bgpos2.sl += scrlamt * 2;
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, i * scale, scale);
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, (i + 1) * scale, scale);
bgpos2.sl += scrlamt * scale;
}
for (int i = 177; i < 225; i += 3)
{
Horiz_Scroll_Buf[i] = -bgpos2.hsw;
Horiz_Scroll_Buf[i + 1] = -bgpos2.hsw;
Horiz_Scroll_Buf[i + 2] = -bgpos2.hsw;
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, i * scale, scale);
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, (i + 1) * scale, scale);
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, (i + 2) * scale, scale);
bgpos2.sl += scrlamt * 3;
}
for (int i = 225; i < 252; i += 4)
{
Horiz_Scroll_Buf[i] = -bgpos2.hsw;
Horiz_Scroll_Buf[i + 1] = -bgpos2.hsw;
Horiz_Scroll_Buf[i + 2] = -bgpos2.hsw;
Horiz_Scroll_Buf[i + 3] = -bgpos2.hsw;
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, i * scale, scale);
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, (i + 1) * scale, scale);
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, (i + 2) * scale, scale);
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, (i + 3) * scale, scale);
bgpos2.sl += scrlamt * 4;
}
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, 252, 3);
levelimg.ScrollHV(tmpimg, tmpimg.Height - levelimg.Height, 0, Horiz_Scroll_Buf);
Horiz_Scroll_Buf.FastFill(-bgpos2.hsw, 252 * scale, 3 * scale);
levelimg.ScrollHV(tmpimg, Math.Max(tmpimg.Height - levelimg.Height, 0), 0, Horiz_Scroll_Buf);
bgimg = tmpimg.ToBitmap(LevelData.BmpPal);
}
}
Expand All @@ -120,7 +128,7 @@ public override void UpdatePalette()

public override void PlayMusic()
{
SonicBGScrollSaver.Music.PlaySong(IniSerializer.Deserialize<MusicInfo>("setup.ini").Music);
SonicBGScrollSaver.Music.PlaySong(levelinfo.Music);
}
}

Expand Down Expand Up @@ -272,10 +280,33 @@ public void ExtendL()
}
}

internal class MusicInfo
internal class LevelInfo
{
[System.ComponentModel.DefaultValue("EmeraldHill")]
[IniName("music")]
public string Music { get; set; }
[IniIgnore]
public int Scale { get; set; }
[System.ComponentModel.DefaultValue("Auto")]
[IniName("scale")]
public string ScaleString
{
get
{
if (Scale < 1)
return "Auto";
return Scale.ToString();
}
set
{
int i;
if (value.Equals("Auto", StringComparison.OrdinalIgnoreCase))
Scale = 0;
else if (int.TryParse(value, out i))
Scale = i;
else
Scale = 1;
}
}
}
}
1 change: 1 addition & 0 deletions EHZ/setup.ini
Expand Up @@ -2,6 +2,7 @@ file=EHZ.dll
type=EHZ.EHZ
name=Emerald Hill Zone
music=EmeraldHill
scale=Auto
version=S2
[Level]
tiles=art.bin
Expand Down
76 changes: 54 additions & 22 deletions GHZ/GHZ.cs
Expand Up @@ -19,15 +19,23 @@ public class GHZ : SonicBGScrollSaver.Level
Color[] Pal_GHZCyc;
short PalCycle_Timer, PalCycle_Frame;
int Width, Height;
LevelInfo levelinfo;
int scale;

public override void Init(int width, int height)
{
Width = width;
Height = height;
levelinfo = IniSerializer.Deserialize<LevelInfo>("setup.ini");
LevelData.LoadGame("./setup.ini");
LevelData.LoadLevel("Level", true);
LevelData.BmpPal.Entries[0] = LevelData.Palette[0][2, 0].RGBColor;
levelimg = LevelData.DrawBackground(null, true, true, false, false);
if (levelinfo.Scale < 1)
scale = height / levelimg.Height;
else
scale = levelinfo.Scale;
levelimg = levelimg.Scale(scale);
tmpimg = new BitmapBits(Math.Min(levelimg.Width, width), height);
tmpimg.Bits.FastFill(0x31);
Pal_GHZCyc = SonLVLColor.Load("palcycle.bin", EngineVersion.S1).Select(a => a.RGBColor).ToArray();
Expand Down Expand Up @@ -62,27 +70,27 @@ public override void UpdateScrolling(short Camera_X_pos_diff, short Camera_Y_pos
Camera_BG2_X_pos.l += d4.l;
int a1 = 0;
int a2 = 0;
CloudScroll[a2++].l += 0x10000;
CloudScroll[a2++].l += 0xC000;
CloudScroll[a2++].l += 0x8000;
CloudScroll[a2++].l += (uint)(0x10000 * scale);
CloudScroll[a2++].l += (uint)(0xC000 * scale);
CloudScroll[a2++].l += (uint)(0x8000 * scale);
BWL d0 = CloudScroll[0].hw;
d0.w += Camera_BG3_X_pos.hw;
Horiz_Scroll_Buf.FastFill(d0.sw, 0, 0x20);
a1 += 0x20;
d0.w += (ushort)(Camera_BG3_X_pos.hw * scale);
Horiz_Scroll_Buf.FastFill(d0.sw, 0, 0x20 * scale);
a1 += 0x20 * scale;
d0.w = CloudScroll[1].hw;
d0.w += Camera_BG3_X_pos.hw;
Horiz_Scroll_Buf.FastFill(d0.sw, a1, 0x10);
a1 += 0x10;
d0.w += (ushort)(Camera_BG3_X_pos.hw * scale);
Horiz_Scroll_Buf.FastFill(d0.sw, a1, 0x10 * scale);
a1 += 0x10 * scale;
d0.w = CloudScroll[2].hw;
d0.w += Camera_BG3_X_pos.hw;
Horiz_Scroll_Buf.FastFill(d0.sw, a1, 0x10);
a1 += 0x10;
Horiz_Scroll_Buf.FastFill(Camera_BG3_X_pos.hsw, a1, 0x30);
a1 += 0x30;
Horiz_Scroll_Buf.FastFill(Camera_BG2_X_pos.hsw, a1, 0x28);
a1 += 0x28;
d0.w = Camera_BG2_X_pos.hw;
BWL d2 = Camera_X_pos;
d0.w += (ushort)(Camera_BG3_X_pos.hw * scale);
Horiz_Scroll_Buf.FastFill(d0.sw, a1, 0x10 * scale);
a1 += 0x10 * scale;
Horiz_Scroll_Buf.FastFill(Camera_BG3_X_pos.hsw * scale, a1, 0x30 * scale);
a1 += 0x30 * scale;
Horiz_Scroll_Buf.FastFill(Camera_BG2_X_pos.hsw * scale, a1, 0x28 * scale);
a1 += 0x28 * scale;
d0.w = (ushort)(Camera_BG2_X_pos.hw * scale);
BWL d2 = Camera_X_pos * scale;
d2.w -= d0.w;
d2.ExtendL();
d2.sl <<= 8;
Expand All @@ -92,12 +100,13 @@ public override void UpdateScrolling(short Camera_X_pos_diff, short Camera_Y_pos
BWL d3 = d0.w;
while (a1 < levelimg.Height)
{
Horiz_Scroll_Buf[a1++] = d3.sw;
Horiz_Scroll_Buf.FastFill(d3.sw, a1, scale);
a1 += scale;
d3.Swap();
d3.l += d2.l;
d3.Swap();
}
levelimg.ScrollHV(tmpimg, tmpimg.Height - levelimg.Height, 0, Horiz_Scroll_Buf);
levelimg.ScrollHV(tmpimg, Math.Max(tmpimg.Height - levelimg.Height, 0), 0, Horiz_Scroll_Buf);
bgimg = tmpimg.ToBitmap(LevelData.BmpPal);
}
}
Expand All @@ -114,7 +123,7 @@ public override void UpdatePalette()

public override void PlayMusic()
{
SonicBGScrollSaver.Music.PlaySong(IniSerializer.Deserialize<MusicInfo>("setup.ini").Music);
SonicBGScrollSaver.Music.PlaySong(levelinfo.Music);
}
}

Expand Down Expand Up @@ -266,10 +275,33 @@ public void ExtendL()
}
}

internal class MusicInfo
internal class LevelInfo
{
[System.ComponentModel.DefaultValue("GreenHill")]
[IniName("music")]
public string Music { get; set; }
[IniIgnore]
public int Scale { get; set; }
[System.ComponentModel.DefaultValue("Auto")]
[IniName("scale")]
public string ScaleString
{
get
{
if (Scale < 1)
return "Auto";
return Scale.ToString();
}
set
{
int i;
if (value.Equals("Auto", StringComparison.OrdinalIgnoreCase))
Scale = 0;
else if (int.TryParse(value, out i))
Scale = i;
else
Scale = 1;
}
}
}
}
1 change: 1 addition & 0 deletions GHZ/GHZ/setup.ini
Expand Up @@ -2,6 +2,7 @@
type=GHZ.GHZ
name=Green Hill Zone
music=GreenHill
scale=Auto
version=S1
[Level]
tiles=../art.bin
Expand Down
1 change: 1 addition & 0 deletions GHZ/Title/setup.ini
Expand Up @@ -2,6 +2,7 @@
type=GHZ.GHZ
name=Title Screen (Sonic 1)
music=GreenHill
scale=Auto
version=S1
[Level]
tiles=../art.bin
Expand Down

0 comments on commit 16f94e6

Please sign in to comment.