Shameless Self-Advertisement. :)

Jan 10, 2013 at 1:05 AM
Junior Member
"Fresh from the Bakery"
Join Date: Dec 13, 2011
Location:
Posts: 10
Hello there, Cave Story forum!

I've been tossing together a little site where I can put up some of my works. Among other unrelated things, I've dedicated http://diceroller.site40.net/hack_cs.html]a section to cave story[/url] where I've been reverse-engineering the entirety of the game. It's hardly done at the moment but there's more than enough info to keep the more dedicated hackers among you busy - I usually update the site weekly and end up adding a new class or two to the disassembly everytime. I've also put up one of my http://diceroller.site40.net/collapse.html]more recent hacks[/url]; might add the Original Sin there too eventually.

Well, whatever. Belated christmas present from one old friend to another, I 'spose.

Enjoy!
 
Jan 10, 2013 at 1:15 AM
In my body, in my head
Forum Moderator
"Life begins and ends with Nu."
Join Date: Aug 28, 2009
Location: The Purple Zone
Posts: 5998
Pronouns: he/him
Not to take away from your hard work, but you know a lot of this stuff is already done right?
Also i'm pretty sure nobody uses Sue's anymore, at least not if we can help it.
I also used to have an IDA debug with a lot of the structures and classes and funcs annotated but I accidentaly the file so that little bit of work is lost to the world.
Ah well. Welcome back though, I didn't expect to see you around here ever again.
 
Jan 10, 2013 at 1:21 AM
Junior Member
"Fresh from the Bakery"
Join Date: Dec 13, 2011
Location:
Posts: 10
Noxid said:
Not to take away from your hard work, but you know a lot of this stuff is already done right?
Can't seem to find any actualy disassembly of the functions in there. I'm talking more about how the game was coded than what's where. http://diceroller.site40.net/files/cs/fade.html]Example...[/URL]

Edit: Hrm... 'xcept for some stuff in regards to effects and one or two NPCs, although that's taken from my notes. :p Also, woah. The crab boss thing from Original Sin! I lost the (annotated) code to that a while ago, really happy to find it again!! :D Major thanks for that.)

Ah well. Welcome back though, I didn't expect to see you around here ever again.
I figured this might be of interest here. :) Thanks for the welcome! (though I'm really just dropping by for a visit than a return). I hope everyone and their work's been doing good. :)
 
Jan 10, 2013 at 4:38 AM
In my body, in my head
Forum Moderator
"Life begins and ends with Nu."
Join Date: Aug 28, 2009
Location: The Purple Zone
Posts: 5998
Pronouns: he/him
Oh, I didn't notice that you had actual sources there. Sorry.
I never bothered to put together disassemblies for more than a few functions. When I wanted to change something I just looked for the function and went to town.
Code:
void __cdecl PlayerAgil(int CanControlPC)
{
  int v1; // ecx@162
  int v2; // eax@166
  int v3; // edx@170
  int v4; // eax@171
  int WaterX2; // ST48_4@201
  int WaterVelY2; // ST10_4@201
  int WaterVelX2; // eax@201
  int WaterX; // ST48_4@207
  int WaterVelY; // ST10_4@207
  int WaterVelX; // eax@207
  signed int WaterDir; // [sp+0h] [bp-2Ch]@195
  unsigned int JumpSpeed; // [sp+4h] [bp-28h]@4
  unsigned int WalkSpeed; // [sp+8h] [bp-24h]@4
  unsigned int Friction; // [sp+Ch] [bp-20h]@4
  unsigned int Grav; // [sp+10h] [bp-1Ch]@4
  unsigned int AirControl; // [sp+14h] [bp-18h]@4
  unsigned int MaxRunSpeed; // [sp+18h] [bp-14h]@4
  unsigned int GravLow; // [sp+1Ch] [bp-10h]@4
  signed int j; // [sp+24h] [bp-8h]@199
  signed int i; // [sp+24h] [bp-8h]@205

  if ( !(PlayerFlags & 2) )
  {
    if ( PlayerTileCollis & 0x100 )
    {
      MaxRunSpeed = 0x196u;
      Grav = 0x28u;
      GravLow = 0x10u;
      JumpSpeed = 0x280u;
      WalkSpeed = 0x2Au;
      AirControl = 0x10u;
      Friction = 0x19u;
    }
    else
    {
      MaxRunSpeed = 0x32Cu;
      Grav = 0x50u;
      GravLow = 0x20u;
      JumpSpeed = 0x500u;
      WalkSpeed = 0x55u;
      AirControl = 0x20u;
      Friction = 0x33u;
    }
    GenerateQmark = 0;
    if ( !CanControlPC )
      BoostState = 0;
    if ( PlayerTileCollis & 8 || PlayerTileCollis & 0x10 || PlayerTileCollis & 0x20 )
    {
      BoostState = 0;
      if ( EquippedItems & 1 )
      {
        JetPackEnergy = 0x32u;
      }
      else
      {
        if ( EquippedItems & 0x20 )
          JetPackEnergy = 0x32u;
        else
          JetPackEnergy = 0;
      }
      if ( CanControlPC )
      {
        if ( Key_Pressed != Key_Down || Key_Held != Key_Down || PlayerFlags & 1 || GameState & 4 )
        {
          if ( Key_Held != Key_Down )
          {
            if ( KeyLeft & Key_Held )
            {
              if ( PlayerXVel > -MaxRunSpeed )
                PlayerXVel -= WalkSpeed;
            }
            if ( KeyRight & Key_Held )
            {
              if ( PlayerXVel < (signed int)MaxRunSpeed )
                PlayerXVel += WalkSpeed;
            }
            if ( KeyLeft & Key_Held )
              DirectionFaced = 0;
            if ( KeyRight & Key_Held )
              DirectionFaced = 2;
          }
        } else {
          PlayerFlags |= 1u;
          GenerateQmark = 1;
        }
      }
      if ( !(PlayerFlags & 0x20) )
      {
        if ( PlayerXVel < 0 )
        {
          if ( PlayerXVel <= -Friction )
            PlayerXVel += Friction;
          else
            PlayerXVel = 0;
        }
        if ( PlayerXVel > 0 )
        {
          if ( PlayerXVel >= (signed int)Friction )
            PlayerXVel -= Friction;
          else
            PlayerXVel = 0;
        }
      }
    }
    else
    {
      if ( CanControlPC )
      {
        if ( EquippedItems & 0x21 )
        {
          if ( Key_Jump & Key_Pressed )
          {
            if ( JetPackEnergy )
            {
              if ( EquippedItems & 1 )
              {
                BoostState = 1;
                if ( PlayerYVel > 256 )
                  PlayerYVel /= 2;
              }
              if ( EquippedItems & 0x20 )
              {
                if ( Key_Up & Key_Held )
                {
                  BoostState = 2;
                  PlayerXVel = 0;
                  PlayerYVel = -1535;
                }
                else
                {
                  if ( KeyLeft & Key_Held )
                  {
                    BoostState = 1;
                    PlayerYVel = 0;
                    PlayerXVel = -1535;
                  }
                  else
                  {
                    if ( KeyRight & Key_Held )
                    {
                      BoostState = 1;
                      PlayerYVel = 0;
                      PlayerXVel = 1535;
                    }
                    else
                    {
                      if ( Key_Down & Key_Held )
                      {
                        BoostState = 3;
                        PlayerXVel = 0;
                        PlayerYVel = 1535;
                      }
                      else
                      {
                        BoostState = 2;
                        PlayerXVel = 0;
                        PlayerYVel = -1535;
                      }
                    }
                  }
                }
              }
            }
          }
        }
        if ( KeyLeft & Key_Held )
        {
          if ( PlayerXVel > -MaxRunSpeed )
            PlayerXVel -= AirControl;
        }
        if ( KeyRight & Key_Held )
        {
          if ( PlayerXVel < (signed int)MaxRunSpeed )
            PlayerXVel += AirControl;
        }
        if ( KeyLeft & Key_Held )
          DirectionFaced = 0;
        if ( KeyRight & Key_Held )
          DirectionFaced = 2;
      }
      if ( EquippedItems & 0x20 )
      {
        if ( BoostState )
        {
          if ( !(Key_Jump & Key_Held) || !JetPackEnergy )
          {
            if ( BoostState == 1 )
            {
              PlayerXVel /= 2;
            }
            else
            {
              if ( BoostState == 2 )
                PlayerYVel /= 2;
            }
          }
        }
      }
      if ( !JetPackEnergy || !(Key_Jump & Key_Held) )
        BoostState = 0;
    }
    if ( CanControlPC )
    {
      if ( Key_Up & Key_Held )
        IsFacingUp = 1;
      else
        IsFacingUp = 0;
      IsFacingDown = Key_Down & Key_Held && !(PlayerTileCollis & 8);
      if ( Key_Jump & Key_Pressed )
      {
        if ( PlayerTileCollis & 8 || PlayerTileCollis & 0x10 || PlayerTileCollis & 0x20 )
        {
          if ( !(PlayerTileCollis & 0x2000) )
          {
            PlayerYVel = -JumpSpeed;
            PlaySound(15, 1);
          }
        }
      }
    }
    if ( CanControlPC )
    {
      if ( Key_Held & (Key_Shoot | Key_Jump | Key_Up | KeyRight | KeyLeft) )
        PlayerFlags &= 0xFEu;
    }
    if ( BoostState )
    {
      if ( JetPackEnergy )
        --JetPackEnergy;
    }
    if ( PlayerTileCollis & 0x1000 )
      PlayerXVel -= 136;
    if ( PlayerTileCollis & 0x2000 )
      PlayerYVel -= 128;
    if ( PlayerTileCollis & 0x4000 )
      PlayerXVel += 136;
    if ( PlayerTileCollis & 0x8000 )
      PlayerYVel += 85;
    if ( EquippedItems & 0x20 && BoostState )
    {
      switch ( BoostState )
      {
        case 1:
          if ( PlayerTileCollis & 5 )
            PlayerYVel = -256;
          if ( !DirectionFaced )
            PlayerXVel -= 32;
          if ( DirectionFaced == 2 )
            PlayerXVel += 32;
          if ( Key_Jump & Key_Pressed || JetPackEnergy % 3 == 1 )
          {
            if ( !DirectionFaced )
              CreateEffect(PlayerX + 0x400, PlayerY + 0x400, 7, 2);
            if ( DirectionFaced == 2 )
              CreateEffect(PlayerX - 0x400, PlayerY + 0x400, 7, 0);
            PlaySound(113, 1);
          }
          break;
        case 2:
          PlayerYVel -= 32;
          if ( Key_Jump & Key_Pressed || JetPackEnergy % 3 == 1 )
          {
            CreateEffect(PlayerX, PlayerY + 0xC00, 7, 3);
            PlaySound(113, 1);
          }
          break;
        case 3:
          if ( Key_Jump & Key_Pressed || JetPackEnergy % 3 == 1 )
          {
            CreateEffect(PlayerX, PlayerY - 0xC00, 7, 1);
            PlaySound(113, 1);
          }
          break;
      }
    }
    else
    {
      if ( PlayerTileCollis & 0x2000 )
      {
        PlayerYVel += Grav;
      }
      else
      {
        if ( EquippedItems & 1 && BoostState && PlayerYVel > -1024 )
        {
          PlayerYVel -= 32;
          if ( !(JetPackEnergy % 3) )
          {
            CreateEffect(PlayerX, PlayerY + PCHitrectDown / 2, 7, 3);
            PlaySound(113, 1);
          }
          if ( PlayerTileCollis & 2 )
            PlayerYVel = 512;
        }
        else
        {
          if ( PlayerYVel < 0 && CanControlPC && Key_Jump & Key_Held )
            PlayerYVel += GravLow;
          else
            PlayerYVel += Grav;
        }
      }
    }
    if ( !CanControlPC || !(Key_Jump & Key_Pressed) )
    {
      if ( PlayerTileCollis & 0x10 )
      {
        if ( PlayerXVel < 0 )
          PlayerYVel = -PlayerXVel;
      }
      if ( PlayerTileCollis & 0x20 )
      {
        if ( PlayerXVel > 0 )
          PlayerYVel = PlayerXVel;
      }
      if ( PlayerTileCollis & 8 )
      {
        v1 = PlayerTileCollis;
        if ( v1 & 0x80000 )
        {
          if ( PlayerXVel < 0 )
            PlayerYVel = 1024;
        }
      }
      if ( PlayerTileCollis & 8 )
      {
        v2 = PlayerTileCollis;
        if ( v2 & 0x10000 )
        {
          if ( PlayerXVel > 0 )
            PlayerYVel = 1024;
        }
      }
      if ( PlayerTileCollis & 8 )
      {
        v3 = PlayerTileCollis;
        if ( v3 & 0x20000 )
        {
          v4 = PlayerTileCollis;
          if ( v4 & 0x40000 )
            PlayerYVel = 1024;
        }
      }
    }
    if ( !(PlayerTileCollis & 0x100) || PlayerTileCollis & 0xF000 )
    {
      if ( PlayerXVel < -1535 )
        PlayerXVel = -1535;
      if ( PlayerXVel > 1535 )
        PlayerXVel = 1535;
      if ( PlayerYVel < -1535 )
        PlayerYVel = -1535;
      if ( PlayerYVel > 1535 )
        PlayerYVel = 1535;
    }
    else
    {
      if ( PlayerXVel < -767 )
        PlayerXVel = -767;
      if ( PlayerXVel > 767 )
        PlayerXVel = 767;
      if ( PlayerYVel < -767 )
        PlayerYVel = -767;
      if ( PlayerYVel > 767 )
        PlayerYVel = 767;
    }
    if ( !IsInWater )
    {
      if ( PlayerTileCollis & 0x100 )
      {
        if ( PlayerTileCollis & 0x800 )
          WaterDir = 2;
        else
          WaterDir = 0;
        if ( PlayerTileCollis & 8 || PlayerYVel <= 512 )
        {
          if ( PlayerXVel > 512 || PlayerXVel < -512 )
          {
            for ( i = 0; i < 8; ++i )
            {
              WaterX = PlayerX + (Random(-8, 8) << 9);
              WaterVelY = Random(-512, 128);
              WaterVelX = Random(-512, 512);
              CreateNPC(73, WaterX, PlayerY, PlayerXVel + WaterVelX, WaterVelY, WaterDir, 0, 0);
            }
            PlaySound(0x38u, 1);
          }
        }
        else
        {
          for ( j = 0; j < 8; ++j )
          {
            WaterX2 = PlayerX + (Random(-8, 8) << 9);
            WaterVelY2 = Random(-512, 128) - PlayerYVel / 2;
            WaterVelX2 = Random(-512, 512);
            CreateNPC(73, WaterX2, PlayerY, PlayerXVel + WaterVelX2, WaterVelY2, WaterDir, 0, 0);
          }
          PlaySound(0x38u, 1);
        }
        IsInWater = 1;
      }
    }
    if ( !(PlayerTileCollis & 0x100) )
      IsInWater = 0;
    if ( PlayerTileCollis & 0x400 )
      TakeDamage(10);
    if ( DirectionFaced )
    {
      QuoteCameraOffsetX += 512;
      if ( QuoteCameraOffsetX > 32768 )
        QuoteCameraOffsetX = 32768;
    }
    else
    {
      QuoteCameraOffsetX -= 512;
      if ( QuoteCameraOffsetX < -32768 )
        QuoteCameraOffsetX = -32768;
    }
    if ( Key_Up & Key_Held && CanControlPC )
    {
      QuoteCameraOffsetY -= 512;
      if ( QuoteCameraOffsetY < -32768 )
        QuoteCameraOffsetY = -32768;
    }
    else
    {
      if ( Key_Down & Key_Held && CanControlPC )
      {
        QuoteCameraOffsetY += 512;
        if ( QuoteCameraOffsetY > 32768 )
          QuoteCameraOffsetY = 32768;
      }
      else
      {
        if ( QuoteCameraOffsetY > 512 )
          QuoteCameraOffsetY -= 512;
        if ( QuoteCameraOffsetY < -512 )
          QuoteCameraOffsetY += 512;
      }
    }
    QuoteCamPosX = QuoteCameraOffsetX + PlayerX;
    QuoteCamPosY = QuoteCameraOffsetY + PlayerY;
    if ( PlayerXVel > (signed int)Friction || PlayerXVel < -Friction )
      PlayerX += PlayerXVel;
    PlayerY += PlayerYVel;
  }
Code:
int __cdecl AgilUni1(int GameStateAnd2True)
{
  int result; // eax@73

  IsFacingUp = 0;
  IsFacingDown = 0;
  if ( GameStateAnd2True )
  {
    if ( Key_Held & (KeyRight | KeyLeft) )
    {
      if ( KeyLeft & Key_Held )
        PlayerXVel -= 256;
      if ( KeyRight & Key_Held )
        PlayerXVel += 256;
    }
    else
    {
      if ( PlayerXVel >= 128 || PlayerXVel <= -128 )
      {
        if ( PlayerXVel <= 0 )
          PlayerXVel += PlayerXVel < 0 ? 0x80 : 0;
        else
          PlayerXVel -= 128;
      }
      else
      {
        PlayerXVel = 0;
      }
    }
    if ( Key_Held & (Key_Down | Key_Up) )
    {
      if ( Key_Up & Key_Held )
        PlayerYVel -= 256;
      if ( Key_Down & Key_Held )
        PlayerYVel += 256;
    }
    else
    {
      if ( PlayerYVel >= 128 || PlayerYVel <= -128 )
      {
        if ( PlayerYVel <= 0 )
          PlayerYVel += PlayerYVel < 0 ? 0x80 : 0;
        else
          PlayerYVel -= 128;
      }
      else
      {
        PlayerYVel = 0;
      }
    }
  }
  else
  {
    if ( PlayerXVel >= 128 || PlayerXVel <= -64 )
    {
      if ( PlayerXVel <= 0 )
        PlayerXVel += PlayerXVel < 0 ? 0x80 : 0;
      else
        PlayerXVel -= 128;
    }
    else
    {
      PlayerXVel = 0;
    }
    if ( PlayerYVel >= 128 || PlayerYVel <= -64 )
    {
      if ( PlayerYVel <= 0 )
        PlayerYVel += PlayerYVel < 0 ? 0x80 : 0;
      else
        PlayerYVel -= 128;
    }
    else
    {
      PlayerYVel = 0;
    }
  }
  if ( PlayerYVel < -512 )
  {
    if ( PlayerTileCollis & 2 )
      CreateEffect(PlayerX, PlayerY - PCHitRectUp, 13, 5);
  }
  if ( PlayerYVel > 512 )
  {
    if ( PlayerTileCollis & 8 )
      CreateEffect(PlayerX, PCHitrectDown + PlayerY, 13, 5);
  }
  if ( PlayerXVel > 1024 )
    PlayerXVel = 1024;
  if ( PlayerXVel < -1024 )
    PlayerXVel = -1024;
  if ( PlayerYVel > 1024 )
    PlayerYVel = 1024;
  if ( PlayerYVel < -1024 )
    PlayerYVel = -1024;
  if ( (Key_Held & (Key_Up | KeyLeft)) == (Key_Up | KeyLeft) )
  {
    if ( PlayerXVel < -780 )
      PlayerXVel = -780;
    if ( PlayerYVel < -780 )
      PlayerYVel = -780;
  }
  if ( (Key_Held & (Key_Up | KeyRight)) == (Key_Up | KeyRight) )
  {
    if ( PlayerXVel > 780 )
      PlayerXVel = 780;
    if ( PlayerYVel < -780 )
      PlayerYVel = -780;
  }
  if ( (Key_Held & (Key_Down | KeyLeft)) == (Key_Down | KeyLeft) )
  {
    if ( PlayerXVel < -780 )
      PlayerXVel = -780;
    if ( PlayerYVel > 780 )
      PlayerYVel = 780;
  }
  if ( (Key_Held & (Key_Down | KeyRight)) == (Key_Down | KeyRight) )
  {
    if ( PlayerXVel > 780 )
      PlayerXVel = 780;
    if ( PlayerYVel > 780 )
      PlayerYVel = 780;
  }
  PlayerX += PlayerXVel;
  result = PlayerYVel + PlayerY;
  PlayerY += PlayerYVel;
  return result;
}
Code:
//CS Tile Collision

#define LEFT 1
#define UP 2
#define RIGHT 4
#define DOWN 8

int Player::TileSolid(int X, int Y)
{
	int LocalCollisionFlags = 0;

	if (((PosY - HitRect.Up) <= ((Y * 0x10 + 4) * 0x200)) 
		&& ((PosY + HitRect.Down) >= ((Y * 0x10 - 4) * 0x200)) 
		&& ((PosX - HitRect.Right) <= ((X * 0x10 + 8) * 0x200)) 
		&& ((PosX - HitRect.Right) >= ((X * 0x10) * 0x200)))
	{
		PosX = ((X * 0x10 + 8) *0x200) + HitRect.Right;
		if (VelX <= -0x180)
		{
			VelX = -0x180;
		}
		if (Key_Held & Key_Left)
		{
			if (VelX <= 0)
			{
				VelX = 0;
			}
		}
		LocalCollisionFlags = (LocalCollisionFlags|LEFT)
	}

	if (((PosY - HitRect.Up) <= ((Y * 0x10 + 4) * 0x200))
		&& ((PosY + HitRect.Down) >= ((Y * 0x10 - 4) * 0x200))
		&& ((PosX + HitRect.Right) >= ((X * 0x10 - 8) * 0x200))
		&& ((PosX + HitRect.Right) <= ((X * 0x10) * 0x200)))
	{
		PosX = ((TileX * 0x20 - 8) * 0x200) - HitRect.Right;
		if (VelX >= 180)
		{
			VelX = 0x180;
		}
		if (Key_Held & Key_Right)
		{
			if (VelX >= 0)
			{
				VelX = 0;
			}
		}
		LocalCollisionFlags = (LocalCollisionFlags|RIGHT);
	}

	if (((PosX - HitRect.Right) <= ((X * 0x10 + 5) * 0x200))
		&& ((PosX + HitRect.Right) >= ((X * 0x10 - 5) * 0x200))
		&& ((PosY - HitRect.Up) <= ((Y * 0x10 + 8) * 0x200))
		&& ((PosY - HitRect.Up) >= ((Y * 0x10) * 0x200)))
	{
		PosY = ((Y * 0x10 + 8) * 0x200) + HitRect.Up;
		if ((PlayerFlags & 2) == 0)
		{
			if (VelY <= -0x200)
			{
				HeadBump();
			}
		}
		if (VelY <= 0)
		{
			VelY = 0;
		}
		LocalCollisionFlags = (LocalCollisionFlags|UP);
	}

	if (((PosX - HitRect.Right) <= ((X * 0x10 + 5) * 0x200))
		&& ((PosX + HitRect.Right) >= ((X * 0x10 - 5) * 0x200))
		&& ((PosY + HitRect.Down) >= ((Y * 0x10 - 8) * 0x200))
		&& ((PosY + HitRect.Down) <= ((Y * 0x10) * 0x200))
	{
		PosY = ((Y * 0x10 - 8) * 0x200) - HitRect.Down;
		if (VelY >= 0x400)
		{
			PlaySound(17, 1);
		}
		if (VelY >= 0)
		{
			VelY = 0;
		}
		LocalCollisionFlags = (LocalCollisionFlags|DOWN);
	}

	return LocalCollisionFlags;
}	


Order of Testing: 
LEFT
RIGHT
UP
DOWN

PosX = [49E654]
PosY = [49E658]
VelX = [49E66C]
VelY = [49E670]
HitRect.Left = [49E67C]
HitRect.Up = [49E680]
HitRect.Right = [49E684]
HitRect.Down = [49E688]
HeadBump() = CALL 00417160
PlaySound(int SoundNum, int Channel) = CALL 00420640
would have more to post if I still had the IDA but hey, them's the breaks 8V

oh look i found an old version of the machine-decompiled source
https://dl.dropbox.com/u/42853625/Temp/Doukutsu.c

dont' expect that to be useful at all.
 
Jan 10, 2013 at 6:47 AM
Not anymore
"Run, rabbit run. Dig that hole, forget the sun."
Join Date: Jan 28, 2010
Location: Internet
Posts: 1369
Age: 34
Pronouns: he/him
Wait, you like... are working on a Touhou hack...

and it's a real mod with assembly hacks?
And it looks really good???

And YOU'RE NOT RYOOUTAN!?!

I have just arrived at heaven's doorstep. :pignon:

I used to use Sue's. Best editor ever. Sue's is like Python. Booster's Lab is like C++. Sure, you can do so much more with C++ and it's way more efficient at everything. But Python is easy to use, except it's horrible for music, graphics, and all the important things in life.

I would also call CaveEditor a Java. Not as powerful as Booster's Lab, but it has a closer feel to Sue's than BL does.

I don't really bother to disassemble anything when I can just reassemble and patch my own code using that crappily made Java program I wrote a couple of years ago. However, it's still way better than Discrete, which could only handle a limited number of labels per program. RuneLancer's Discrete was made to frustrate you so that you had to learn real assembly, with real addressing and such. However, the Doukutsu Assembler was made (with the intention) that you never had to write OllyDbg-style x86-32 again and often didn't even need to worry about how many bytes the integer you were dereferencing might take up. However, it may not fulfill that contract in the way the specs specify.
 
Jan 10, 2013 at 7:07 AM
In my body, in my head
Forum Moderator
"Life begins and ends with Nu."
Join Date: Aug 28, 2009
Location: The Purple Zone
Posts: 5998
Pronouns: he/him
Carrotlord said:
Wait, you like... are working on a Touhou hack...

and it's a real mod with assembly hacks?
And it looks really good???

And YOU'RE NOT RYOOUTAN!?!

-nonsense-
that's runelancer, cucumber-chan.
 
Jan 10, 2013 at 8:04 AM
Junior Member
"Fresh from the Bakery"
Join Date: Dec 13, 2011
Location:
Posts: 10
Carrotlord said:
RuneLancer's Discrete was made to frustrate you so that you had to learn real assembly, with real addressing and such.
I'm not sure, but I think RuneLancer wrote Discrete when he himself was learning assembly, so it wasn't exactly user-friendly. :)

Not that I know him or anything. Or am him. >_> The "Patchy" tool on my website will eventually be a far superior alternative to Discrete for anyone still interesting in that sort of stuff, though it's still in early development and not specifically intended for assembly. Still, there's a few things for Cave Story already so it's getting somewhere...

Anyhow. I haven't done any actual Cave Story hacking in quite a while; that Touhou hack is pretty old. I suppose I could always take it up again and complete it, but I have a few other projects to get out of the way before that can even be a consideration. Meh, who knows, maybe I'll be poking my head in here once in a while if anything interesting comes up regarding that.
 
Jan 10, 2013 at 8:09 AM
Not anymore
"Run, rabbit run. Dig that hole, forget the sun."
Join Date: Jan 28, 2010
Location: Internet
Posts: 1369
Age: 34
Pronouns: he/him
Runelancer never needed to learn assembly. Runelancer is assembly. I thought you were an Original Sin fan... but... err... uh oh. I think some part of my logic center does not exist anymore for some reason...

He (you) knew general assembly language from hacking other things and other games, especially particular types of ROMs. I think. I could be wrong. (Actually I am wrong! WTF man?)
He (you...) was really was the genius of his time. Some people might disagree.

Also Noxid, did your brain stop functioning temporarily when I mentioned Sue's Workshop? :orangebell:

EDIT: This is what I get for studying Esperanto and not plain English. Amazingly, I did not think of Runelancer as the touhous.
EDIT2: This also explains the instantaneous learning of assembly language.
 
Jan 10, 2013 at 11:50 AM
Bonds that separate us
Forum Administrator
"Life begins and ends with Nu."
Join Date: Aug 20, 2006
Location:
Posts: 2857
Age: 34
Pronouns: he/him
Very nice :mahin: I hadn't forgotten about that mod and was going to get it now, but the download kept failing. Then just as I was going to post this, there was a powercut. Twice >_>

Warms my heart to know you still have some interest in ol' CS :D
 
Jan 10, 2013 at 6:06 PM
Hyperbolic
"What're YOU lookin' at?"
Join Date: Jul 10, 2009
Location:
Posts: 1004
Age: 39
Pronouns: he/him
Welcome back
 
Jan 10, 2013 at 11:05 PM
Indie game enthusiast
"What is a man!? A miserable pile of secrets! But enough talk, have at you!"
Join Date: Apr 18, 2006
Location: Forever wandering the tower...!
Posts: 1790
Pronouns: he/him
You should post CoF in the showcase!

Also, good to know you're still around Runelancer :D
Or do you prefer to be called OriginalSinner now?
 
Jan 11, 2013 at 12:39 AM
Not anymore
"Run, rabbit run. Dig that hole, forget the sun."
Join Date: Jan 28, 2010
Location: Internet
Posts: 1369
Age: 34
Pronouns: he/him
If you want to be a hacker
yes an assembly hacking master
then you've gotta see Runelancer!
He's on the forums too!
-- Miraigamer Forums Song

Yes a Collapse of Fantasy demo would be so awesome to play.
 
Jan 11, 2013 at 11:02 AM
Junior Member
"Fresh from the Bakery"
Join Date: Dec 13, 2011
Location:
Posts: 10
You should post CoF in the showcase!
Also, good to know you're still around Runelancer [:D]
Or do you prefer to be called OriginalSinner now?
I go by a few things these days. Let's just stick with "RuneLancer" for 'ol times' sake. :)

Carrotlord said:
Yes a Collapse of Fantasy demo would be so awesome to play.
There's a http://diceroller.site40.net/files/CoF.zip]download link[/url] available on the game's page. I wouldn't call it a demo so much as the complete thing, as it isn't currently in development, but I wouldn't say that's all there ever will be to the hack either. Still, assuming you play both scenarios, what's there is at least a good 2+ hours of gameplay. :)
 
Jan 22, 2013 at 7:10 PM
Not anymore
"Run, rabbit run. Dig that hole, forget the sun."
Join Date: Jan 28, 2010
Location: Internet
Posts: 1369
Age: 34
Pronouns: he/him
It is time for ...

Let's Play Collapse of Fantasy
and
Let's Make a Psuedo-Virtual Reality Massively Multiplayer Online First Person Shooter
(LPCoF & LMPVR-MMOFPS)







BIG EDIT:

Runelancer! You son of a submariner!

How dare you! I needed to show off something cool to the Assembly Languages Class (CS61C) at my university.
I decided to hack Cave Story using x86 and OllyDbg. But I forgot to download Vanilla Cave Story onto this laptop.

However, I did have two copies of your good mod Collapse of Fantasy.

Nothing worked! I attempted to hack your game and every time it crashed because you happened to erase all the functions you didn't use and you also shuffled the offsets of every important feature of the game! The Assembly Compendium was 100% useless! You made me look like a complete retard! Oh man... nice job btw. Trolling so hard even Booster's Lab can't open your mod correctly.
 
Feb 4, 2013 at 1:48 AM
Junior Member
"Fresh from the Bakery"
Join Date: Dec 13, 2011
Location:
Posts: 10
How dare you! I needed to show off something cool to the Assembly Languages Class (CS61C) at my university.
I decided to hack Cave Story using x86 and OllyDbg. But I forgot to download Vanilla Cave Story onto this laptop.

However, I did have two copies of your good mod Collapse of Fantasy.

Nothing worked! I attempted to hack your game and every time it crashed because you happened to erase all the functions you didn't use and you also shuffled the offsets of every important feature of the game! The Assembly Compendium was 100% useless! You made me look like a complete retard! Oh man... nice job btw. Trolling so hard even Booster's Lab can't open your mod correctly.Edit
(Edit: Read "Collapse of Fantasy" as "Original Sin"...)

Nothing has been changed around or removed in CoF. All changes are listed in "changes.txt", aside from map- and event-related changes - you can verify this by comparing the original 1.0.0.6 exe (available on my site) with Collapse of Fantasy's exe - much of the exe is the same excluding the stuff mentioned in changes.txt. Likewise, no offset has been changed. This would be far more trouble than it's worth anyway. :)

I have no idea what the assembly compendium or Booster's Lab are, but I can tell you that Sue's Workshop will require a small assembly hack to edit CoF properly - you're likely to destroy a lot of custom code if you save it otherwise as Sue's does a poor job of handling expansions (it just assumes any expansion to the exe belongs to it no matter what the label for its block may say). I can't guarantee other editors are "smart" enough to deal with the expanded exe on their own but any 'ol hex editor should be able to open it just fine...

Are you sure you're not using notes/editors intended for a different version than the one CoF is built on (1.0.0.6)?
 
Back
Top