mirror of
https://github.com/mm201/pkmn-classic-framework.git
synced 2026-03-22 01:44:20 -05:00
188 lines
4.5 KiB
C#
188 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace PkmnFoundations.Structures
|
|
{
|
|
public class MusicalRecord5 : BinarySerializableBase
|
|
{
|
|
public MusicalRecord5()
|
|
{
|
|
}
|
|
|
|
public MusicalRecord5(int pid, ulong serial_number, BinaryReader data)
|
|
: base(data)
|
|
{
|
|
PID = pid;
|
|
SerialNumber = serial_number;
|
|
}
|
|
|
|
public MusicalRecord5(int pid, ulong serial_number, byte[] data)
|
|
: base(data)
|
|
{
|
|
PID = pid;
|
|
SerialNumber = serial_number;
|
|
}
|
|
|
|
public MusicalRecord5(int pid, ulong serial_number, byte[] data, int offset)
|
|
: base(data, offset)
|
|
{
|
|
PID = pid;
|
|
SerialNumber = serial_number;
|
|
}
|
|
|
|
// todo: encapsulate these so calculated fields are always correct
|
|
public int PID { get; set; }
|
|
public ulong SerialNumber { get; set; }
|
|
|
|
private byte[] m_data;
|
|
public byte[] Data
|
|
{
|
|
get
|
|
{
|
|
// fixme: Participants don't update if the consumer modifies this array directly.
|
|
return m_data;
|
|
}
|
|
set
|
|
{
|
|
if (m_data == value) return;
|
|
if (value == null)
|
|
{
|
|
m_data = null;
|
|
return;
|
|
}
|
|
|
|
if (value.Length != 560) throw new ArgumentException("Musical data must be 560 bytes.");
|
|
m_data = value.ToArray();
|
|
UpdateParticipants();
|
|
}
|
|
}
|
|
|
|
private MusicalParticipant5[] m_participants;
|
|
public MusicalParticipant5[] Participants
|
|
{
|
|
get
|
|
{
|
|
// fixme: Data doesn't update if the consumer modifies this array.
|
|
// todo: Split out participants from main data.
|
|
return m_participants;
|
|
}
|
|
}
|
|
|
|
public void UpdateParticipants()
|
|
{
|
|
if (m_data == null)
|
|
{
|
|
m_participants = null;
|
|
return;
|
|
}
|
|
|
|
m_participants = new MusicalParticipant5[4];
|
|
for (int x = 0; x < 4; x++)
|
|
{
|
|
Participants[x] = new MusicalParticipant5(m_data, x * 0x58 + 0x84);
|
|
}
|
|
}
|
|
|
|
public override int Size
|
|
{
|
|
get
|
|
{
|
|
return 560;
|
|
}
|
|
}
|
|
|
|
protected override void Load(System.IO.BinaryReader reader)
|
|
{
|
|
m_data = reader.ReadBytes(560);
|
|
UpdateParticipants();
|
|
}
|
|
|
|
protected override void Save(System.IO.BinaryWriter writer)
|
|
{
|
|
writer.Write(m_data);
|
|
}
|
|
|
|
public MusicalRecord5 Clone()
|
|
{
|
|
return new MusicalRecord5(PID, SerialNumber, Data);
|
|
}
|
|
}
|
|
|
|
public class MusicalParticipant5 : BinarySerializableBase
|
|
{
|
|
public MusicalParticipant5()
|
|
{
|
|
}
|
|
|
|
public MusicalParticipant5(BinaryReader data)
|
|
: base(data)
|
|
{
|
|
}
|
|
|
|
public MusicalParticipant5(byte[] data)
|
|
: base(data)
|
|
{
|
|
}
|
|
|
|
public MusicalParticipant5(byte[] data, int offset)
|
|
: base(data, offset)
|
|
{
|
|
}
|
|
|
|
private byte[] m_data;
|
|
public byte[] Data
|
|
{
|
|
get
|
|
{
|
|
return m_data;
|
|
}
|
|
set
|
|
{
|
|
if (m_data == value) return;
|
|
if (value == null)
|
|
{
|
|
m_data = null;
|
|
return;
|
|
}
|
|
|
|
if (value.Length != 88) throw new ArgumentException("Musical Participant data must be 88 bytes.");
|
|
m_data = value.ToArray();
|
|
}
|
|
}
|
|
|
|
public ushort Species
|
|
{
|
|
get
|
|
{
|
|
return BitConverter.ToUInt16(Data, 0);
|
|
}
|
|
}
|
|
|
|
public override int Size
|
|
{
|
|
get
|
|
{
|
|
return 88;
|
|
}
|
|
}
|
|
|
|
protected override void Load(System.IO.BinaryReader reader)
|
|
{
|
|
m_data = reader.ReadBytes(88);
|
|
}
|
|
|
|
protected override void Save(System.IO.BinaryWriter writer)
|
|
{
|
|
writer.Write(m_data);
|
|
}
|
|
|
|
public MusicalParticipant5 Clone()
|
|
{
|
|
return new MusicalParticipant5(Data);
|
|
}
|
|
}
|
|
}
|