mirror of
https://github.com/djhackersdev/legacy-tools.git
synced 2026-10-02 18:47:55 +03:00
Add legacy iidx tooling that I had lying around.
Credits also go to Grim for hooking me up with the "old 2dx tooling"
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,45 @@
|
||||
looks like i forget to post this here lol
|
||||
also dunno if anyone post something like this yet
|
||||
this thing can "render" gst file for iidx songs
|
||||
|
||||
DL: https://www.dropbox.com/s/l0nepgb50x0zz51/2dx_gst_ver0.5.zip?dl=0
|
||||
oof, i posted the old version(0.2), fixed
|
||||
|
||||
usage:
|
||||
1. place the exe into the same place of .1 and .2dx/.s3p file
|
||||
2. run this line in cmd
|
||||
|
||||
2dx_gst [music_id]
|
||||
|
||||
|
||||
3. you should see the output wave file in the same folder
|
||||
|
||||
QA:
|
||||
1. What's that "render" mean?
|
||||
Because I just simply add all the samples to the final track without processing them like this:
|
||||
|
||||
static int32_t mixing_function(int32_t buf, int16_t input)
|
||||
{
|
||||
return buf + input;
|
||||
}
|
||||
|
||||
|
||||
Maybe there's a better way to do the sample mixing, but this way is simple and also working so I just leave it like this.
|
||||
If anyone has better solution rather than just adding all tracks into the final one, please feel free to leave a comment here.
|
||||
|
||||
2. What's the "mixing level" mean?
|
||||
Since I use int32 rather than int16 for temp buffer(so it won't rape your ear if too much sample is added in the same time period), this will show how much the scale is when converting it back to int16 in the final step. It's kinda like normalizing the final track by the max volume of original track.
|
||||
|
||||
3. Why sometimes there will be more than one wave file?
|
||||
The chart files are different sometimes(like 1ms differ for only one sample sound, or totally completly different music), so the final track will also be different. I use hash for each output track to check this, so even if it's only some 1ms differs the program will still just treat them as different tracks. You can just ignore/delete other outputs if it sounds the same.
|
||||
|
||||
4. How to generate files for multi tracks like crew?
|
||||
|
||||
2dx_gst 24084 --snd-string 51253400
|
||||
|
||||
|
||||
The suffix string is in music_data.bin if needed.
|
||||
|
||||
There're still some things to fix such as temp file for s3p decoding and the same output checking, but i think it should be ready to post a build here.
|
||||
|
||||
Feel free to report any issue, I havn't tested it for all songs so there may be some bugs I can't find by now.
|
||||
Binary file not shown.
@@ -0,0 +1,40 @@
|
||||
============================
|
||||
BMSto1 v0.06
|
||||
Created 2007.04.04 and (Y)
|
||||
Updated 2007.04.07 by ('-')
|
||||
(")_(")
|
||||
----------------------------
|
||||
|
||||
BMSto1 is a Be-Music Source conversion utility. It opens a BMS file, then
|
||||
saves the converted data to .1 format. Sound data is converted and saved
|
||||
to un-encrypted .2dx format.
|
||||
|
||||
Written in Delphi 7. Source is included.
|
||||
|
||||
Although BMSto1 is a console application, File Drag and Drop is supported.
|
||||
Output files will be saved in the input file's folder.
|
||||
|
||||
|
||||
To use: BMSto1 [/RANDOM] [/MIRROR] [/VMIRROR] InputFile1 InputFile2 ...
|
||||
|
||||
InputFile - The BMS file(s) to convert. Wildcards ? and * can be used in
|
||||
any InputFile name parameter. All Output file(s) will have .1
|
||||
as their new file extension.
|
||||
/RANDOM - Applies the Random Modifier effect to the note-chart.
|
||||
/MIRROR - Applies the Mirror Modifier effect to the note-chart.
|
||||
/VMIRROR - Vertically flips the note-chart. Last note becomes first!
|
||||
|
||||
This version of BMSto1 currently isn't able to combine multiple BMS files of
|
||||
the same song. Instead, each BMS will be converted to its own .1 file.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
===============
|
||||
Version History
|
||||
---------------
|
||||
v0.06 released 2007.04.07 - Added in .2dx file creation.
|
||||
Removed the useless /RAW option.
|
||||
v0.05 released 2007.04.06 - Fixed the "Song-Stop appears in wrong location" bug.
|
||||
v0.04 released 2007.04.06 - Fixed the "No song-stop event" bug.
|
||||
v0.01 released 2007.04.04 - First release!
|
||||
@@ -0,0 +1,735 @@
|
||||
unit BMS;
|
||||
// ================================================
|
||||
// BMS.PAS
|
||||
// Created 2007.02.18
|
||||
//
|
||||
// Supports reading *.bms, *.bme and related files.
|
||||
//
|
||||
// Based on the 'BMS_Open' procedure from earlier
|
||||
// versions of Be-Pachi Music.
|
||||
//
|
||||
// Contains functions and procedures for dealing
|
||||
// with converting data inside a Be-Music Source
|
||||
// file into a useable format.
|
||||
//
|
||||
// Output data can be found in the DB.pas arrays.
|
||||
// ------------------------------------------------
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
SysUtils, Base36, DB_Main;
|
||||
|
||||
function CountEvents(Path_File: String): Integer;
|
||||
function CountTempoChanges(Path_File: String): Word;
|
||||
function FindFirstSpace(Data: String): Word;
|
||||
function FindHighestReference(Path_File, Reference_Type: String): Word;
|
||||
function OpenBMS(Path_File: String): Boolean;
|
||||
|
||||
procedure AddMeasuresToEventList;
|
||||
procedure AddTempoChangesToEventList;
|
||||
procedure AdjustMeasureTimes;
|
||||
procedure ApplyTempoChanges;
|
||||
procedure CollectCustomTempoChanges(Path_File: String);
|
||||
procedure CollectWavBmpAssigns(Path_File: String);
|
||||
procedure ConvertDataLine(BMS_Measure: Word; BMS_Function: Byte; BMS_DataLine: String);
|
||||
procedure ConvertPositionsIntoTime;
|
||||
procedure ConvertTempoChangesIntoTime;
|
||||
procedure ParseMainDataField(Path_File: String);
|
||||
procedure ReadHeader(Path_File: String);
|
||||
procedure SetMeasureStartTimes;
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function CountEvents(Path_File: String): Integer;
|
||||
// =========================================================
|
||||
// Returns the total number of objects (not just notes but
|
||||
// other events and also measure lines) in a BMS file.
|
||||
//
|
||||
// This also retrieves the total number of measures as well,
|
||||
// which is placed in Measure_Count for reference.
|
||||
// ---------------------------------------------------------
|
||||
var
|
||||
BMS_Measure: word;
|
||||
BMS_File: TextFile;
|
||||
Data: string;
|
||||
begin
|
||||
|
||||
Result := 0;
|
||||
Measure_Count := 0;
|
||||
|
||||
if not FileExists(Path_File) then
|
||||
begin
|
||||
Result := -1;
|
||||
exit;
|
||||
end;
|
||||
|
||||
AssignFile(BMS_File, Path_File);
|
||||
Reset(BMS_File);
|
||||
|
||||
while not EOF(BMS_File) do
|
||||
begin
|
||||
ReadLn(BMS_File, Data);
|
||||
Data := TrimRight(UpperCase(Data));
|
||||
|
||||
if Length(Data) > 1 then
|
||||
if Data[1] = '#' then
|
||||
if Data[2] in ['0'..'9'] then
|
||||
begin
|
||||
BMS_Measure := StrToInt(copy(Data, 2, 3));
|
||||
Data := copy(Data, 8, Length(Data) - 7);
|
||||
|
||||
if BMS_Measure > Measure_Count then
|
||||
Measure_Count := BMS_Measure;
|
||||
|
||||
if Length(Data) > 1 then
|
||||
repeat
|
||||
if (Data[1] <> '0') or (Data[2] <> '0') then inc(Result);
|
||||
Data := copy(Data, 3, Length(Data) - 2);
|
||||
until Data = '';
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
CloseFile(BMS_File);
|
||||
|
||||
inc(Result, Result); // Double the amount to allow for the sound change events
|
||||
|
||||
inc(Measure_Count); // Include the measure immediately after the song ends
|
||||
|
||||
inc(Result, Measure_Count); // Make room for the Measure lines, which will be
|
||||
// converted into events, and added to the note
|
||||
// arrays
|
||||
|
||||
inc(Result, 218); // Make room for the end-of-song line graph
|
||||
|
||||
inc(Result, 100); // And some over-flow space, just to be safe!
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function CountTempoChanges(Path_File: String): Word;
|
||||
// =================================
|
||||
// Returns the number of times a BMS
|
||||
// song changes tempo.
|
||||
// ---------------------------------
|
||||
var
|
||||
BMS_File: TextFile;
|
||||
Data: String;
|
||||
i, Data_Length: Word;
|
||||
begin
|
||||
Result := 0;
|
||||
|
||||
AssignFile(BMS_File, Path_File); // CountEvents function already checked
|
||||
Reset(BMS_File); // if the file existed, so no need to here.
|
||||
|
||||
while not EOF(BMS_File) do
|
||||
begin
|
||||
ReadLn(BMS_File, Data);
|
||||
|
||||
Data_Length := Length(Data);
|
||||
|
||||
if Data_Length > 8 then
|
||||
if Data[1] = '#' then
|
||||
if Data[2] in ['0'..'9'] then
|
||||
if (copy(Data, 5, 2) = '03') or
|
||||
(copy(Data, 5, 2) = '08') then
|
||||
begin
|
||||
i := 8;
|
||||
while i < Data_Length do
|
||||
begin
|
||||
if (Data[i] <> '0') or (Data[i + 1] <> '0') then
|
||||
inc(Result);
|
||||
inc(i, 2);
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
CloseFile(BMS_File);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function FindFirstSpace(Data: String): Word;
|
||||
// =======================================
|
||||
// Returns the location of the first space
|
||||
// (ASCII value 32) in a string.
|
||||
// ---------------------------------------
|
||||
var
|
||||
Len: word;
|
||||
begin
|
||||
Result := 0;
|
||||
Len := Length(Data);
|
||||
if Len = 0 then exit;
|
||||
while (Result < Len) and (Data[Result] <> ' ') do inc(Result);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function FindHighestReference(Path_File, Reference_Type: String): Word;
|
||||
// ==============================================
|
||||
// Returns the highest location used by the
|
||||
// reference type (#WAV, #BMP, #BPM, or other)
|
||||
//
|
||||
// For example: if a BMS contains the following
|
||||
// 5 #WAV reference lines:
|
||||
//
|
||||
// #WAV01 1.wav
|
||||
// #WAV02 2.wav
|
||||
// #WAV03 3.wav
|
||||
// #WAV04 4.wav
|
||||
// #WAV0F 5.wav
|
||||
//
|
||||
// ...the function would return 15 (0F in base36)
|
||||
// ----------------------------------------------
|
||||
var
|
||||
Current_Value, Reference_Length: Word;
|
||||
BMS_File: TextFile;
|
||||
Data: String;
|
||||
begin
|
||||
|
||||
Result := 0;
|
||||
AssignFile(BMS_File, Path_File); // CountEvents function already checked
|
||||
Reset(BMS_File); // if the file existed, so no need to here.
|
||||
|
||||
Reference_Length := Length(Reference_Type);
|
||||
|
||||
while not EOF(BMS_File) do
|
||||
begin
|
||||
ReadLn(BMS_File, Data);
|
||||
if Length(Data) > Reference_Length then
|
||||
if copy(Data, 1, Reference_Length) = Reference_Type then
|
||||
begin
|
||||
Current_Value := Base36.Base36ToInt(copy(Data, Reference_Length + 1, 2));
|
||||
if Current_Value > Result then Result := Current_Value;
|
||||
end;
|
||||
end;
|
||||
|
||||
CloseFile(BMS_File);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function OpenBMS(Path_File: String): Boolean;
|
||||
// ===================================================
|
||||
// Opens a BMS file through the use of sub-procedures,
|
||||
// which convert and load the data into the various
|
||||
// arrays and variables.
|
||||
// ---------------------------------------------------
|
||||
begin
|
||||
Result := False;
|
||||
BGA_OK := False;
|
||||
Event_Count := CountEvents(Path_File);
|
||||
if Event_Count < 0 then exit;
|
||||
|
||||
ReadHeader(Path_File);
|
||||
|
||||
WAV_Count := FindHighestReference(Path_File, '#WAV');
|
||||
BMP_Count := FindHighestReference(Path_File, '#BMP');
|
||||
CustomTempoChange_Count := FindHighestReference(Path_File, '#BPM');
|
||||
TempoChange_Count := CountTempoChanges(Path_File);
|
||||
|
||||
InitializeArrays;
|
||||
|
||||
CollectCustomTempoChanges(Path_File);
|
||||
CollectWavBmpAssigns(Path_File);
|
||||
|
||||
ParseMainDataField(Path_File);
|
||||
|
||||
SetMeasureStartTimes;
|
||||
ConvertPositionsIntoTime;
|
||||
ConvertTempoChangesIntoTime;
|
||||
AdjustMeasureTimes;
|
||||
SortTempoChangeArrays;
|
||||
AddMeasuresToEventList;
|
||||
AddTempoChangesToEventList;
|
||||
AssignNotesToMeasure;
|
||||
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure AddMeasuresToEventList;
|
||||
// ============================================
|
||||
// This converts the measure lines into events,
|
||||
// which are then added into the note arrays.
|
||||
// --------------------------------------------
|
||||
var
|
||||
i, ff: Integer;
|
||||
begin
|
||||
|
||||
ff := GetFirstFreeEvent;
|
||||
if ff < 0 then exit; // Error
|
||||
|
||||
for i := 0 to Measure_Count - 1 do
|
||||
begin
|
||||
Note_Column[ff] := 10;
|
||||
Note_Time[ff] := Measure_Time[i];
|
||||
inc(ff);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure AddTempoChangesToEventList;
|
||||
// ===========================================
|
||||
// This converts tempo changes into events and
|
||||
// adds those to the note arrays.
|
||||
// -------------------------------------------
|
||||
var
|
||||
i, ff: Integer;
|
||||
begin
|
||||
|
||||
ff := GetFirstFreeEvent;
|
||||
if ff < 0 then exit; // Error
|
||||
|
||||
for i := 0 to TempoChange_Count - 1 do
|
||||
begin
|
||||
Note_Column[ff] := 8;
|
||||
Note_Time[ff] := TempoChange_Position[i];
|
||||
Note_Sound[ff] := Trunc(TempoChange_Amount[i]);
|
||||
Note_Position[ff] := TempoChange_Amount[i]; // Provides better accuracy when
|
||||
// using the Be-Music tempo
|
||||
// change effect!
|
||||
inc(ff);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure AdjustMeasureTimes;
|
||||
// =========================================
|
||||
// This procedure applies the song's tempo
|
||||
// to the current values in the Measure_Time
|
||||
// array.
|
||||
// -----------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to Measure_Count - 1 do
|
||||
Measure_Time[i] := Measure_Time[i] / Tempo * 240;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ApplyTempoChanges;
|
||||
// ========================================================
|
||||
// This modifies the trigger time of all objects that exist
|
||||
// after each tempo change, including later tempo changes.
|
||||
//
|
||||
// Only used for "BPM Classic Style" tempo change effect
|
||||
// or Constant Speed is selected.
|
||||
//
|
||||
// Not needed for normal "Be-Music" tempo change effect.
|
||||
// --------------------------------------------------------
|
||||
var
|
||||
i, i2: Integer;
|
||||
Current_Tempo: Single;
|
||||
begin
|
||||
Current_Tempo := Tempo;
|
||||
for i := 0 to TempoChange_Count - 1 do
|
||||
begin
|
||||
if TempoChange_Amount[i] <> 0 then
|
||||
begin
|
||||
|
||||
for i2 := 0 to Event_Count - 1 do
|
||||
if Note_Time[i2] > TempoChange_Position[i] then
|
||||
Note_Time[i2] := (Note_Time[i2] - TempoChange_Position[i]) / TempoChange_Amount[i] * Current_Tempo + TempoChange_Position[i];
|
||||
|
||||
for i2 := 0 to Measure_Count - 1 do
|
||||
if Measure_Time[i2] > TempoChange_Position[i] then
|
||||
Measure_Time[i2] := (Measure_Time[i2] - TempoChange_Position[i]) / TempoChange_Amount[i] * Current_Tempo + TempoChange_Position[i];
|
||||
|
||||
for i2 := 0 to TempoChange_Count - 1 do
|
||||
if TempoChange_Position[i2] > TempoChange_Position[i] then
|
||||
TempoChange_Position[i2] := (TempoChange_Position[i2] - TempoChange_Position[i]) / TempoChange_Amount[i] * Current_Tempo + TempoChange_Position[i];
|
||||
|
||||
end;
|
||||
Current_Tempo := TempoChange_Amount[i];
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure CollectCustomTempoChanges(Path_File: String);
|
||||
// ===============================
|
||||
// Looks for and retrieves all of
|
||||
// the customized tempo changes,
|
||||
// which are prefixed with #BPMxx.
|
||||
// -------------------------------
|
||||
var
|
||||
BMS_File: TextFile;
|
||||
Data: String;
|
||||
Data_Length: Word;
|
||||
begin
|
||||
AssignFile(BMS_File, Path_File); // CountEvents function already checked
|
||||
Reset(BMS_File); // if the file existed, so no need to here.
|
||||
|
||||
while not EOF(BMS_File) do
|
||||
begin
|
||||
ReadLn(BMS_File, Data);
|
||||
Data_Length := Length(Data);
|
||||
|
||||
if Data_Length >= 8 then
|
||||
if copy(Data, 1, 4) = '#BPM' then
|
||||
if Data[5] <> ' ' then
|
||||
CustomTempoChange_Amount[Base36.Base36ToInt(copy(Data, 5, 2))] := StrToFloat(copy(Data, 8, Data_Length - 7));
|
||||
end;
|
||||
|
||||
CloseFile(BMS_File);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure CollectWavBmpAssigns(Path_File: String);
|
||||
// ========================================
|
||||
// This looks for #WAV and #BMP file assign
|
||||
// lines and stores the file name in the
|
||||
// WAV_Name / BMP_Name arrays.
|
||||
//
|
||||
// Even though the file assign lines expect
|
||||
// WAV or BMP files, the actual file types
|
||||
// can be any format supported by the BMS
|
||||
// player.
|
||||
// ----------------------------------------
|
||||
var
|
||||
BMS_File: TextFile;
|
||||
Data: String;
|
||||
Data_Length: Word;
|
||||
begin
|
||||
|
||||
AssignFile(BMS_File, Path_File); // CountEvents function already checked
|
||||
Reset(BMS_File); // if the file existed, so no need to here.
|
||||
|
||||
while not EOF(BMS_File) do
|
||||
begin
|
||||
ReadLn(BMS_File, Data);
|
||||
Data_Length := Length(Data);
|
||||
if Data_Length >= 8 then
|
||||
begin
|
||||
if copy(Data, 1, 4) = '#BMP' then
|
||||
BMP_Name[Base36.Base36ToInt(copy(Data, 5, 2))] := copy(Data, 8, Data_Length - 7);
|
||||
if copy(Data, 1, 4) = '#WAV' then
|
||||
WAV_Name[Base36.Base36ToInt(copy(Data, 5, 2))] := copy(Data, 8, Data_Length - 7);
|
||||
end;
|
||||
end;
|
||||
CloseFile(BMS_File);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ConvertDataLine(BMS_Measure: Word; BMS_Function: Byte; BMS_DataLine: String);
|
||||
// ==============================================
|
||||
// Converts a series of numerical data from a BMS
|
||||
// into events (including type, column, position)
|
||||
//
|
||||
// Output data will be stored in all the defined
|
||||
// variable arrays.
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i, Note, Data_Length, Denominator: Word;
|
||||
begin
|
||||
Data_Length := Length(BMS_DataLine);
|
||||
if Data_Length and 1 = 1 then exit; // Odd data length? Bad! Skip the line!
|
||||
|
||||
Denominator := Data_Length shr 1;
|
||||
i := 1;
|
||||
|
||||
while i < Data_Length do
|
||||
begin
|
||||
Note := Base36.Base36ToInt(copy(BMS_DataLine, i, 2));
|
||||
if Note > 0 then
|
||||
begin
|
||||
|
||||
case BMS_Function of
|
||||
3: begin // ----------------------------- Tempo Change
|
||||
TempoChange_Measure[TempoChange_Pointer] := BMS_Measure;
|
||||
TempoChange_Position[TempoChange_Pointer] := (i shr 1) / Denominator;
|
||||
TempoChange_Amount[TempoChange_Pointer] := StrToInt('$' + copy(BMS_DataLine, i, 2)); // Base16-to-Decimal
|
||||
inc(TempoChange_Pointer);
|
||||
end;
|
||||
8: begin // ----------------------------- Custom Tempo Change
|
||||
TempoChange_Measure[TempoChange_Pointer] := BMS_Measure;
|
||||
TempoChange_Position[TempoChange_Pointer] := (i shr 1) / Denominator;
|
||||
TempoChange_Amount[TempoChange_Pointer] := CustomTempoChange_Amount[Note];
|
||||
inc(TempoChange_Pointer);
|
||||
end;
|
||||
4, 6, 7: begin // ----------------------- BG Animations
|
||||
BGA_OK := True;
|
||||
Note_Sound[NoteArray_Pointer] := Note;
|
||||
Note_Measure[NoteArray_Pointer] := BMS_Measure;
|
||||
Note_Position[NoteArray_Pointer] := (i shr 1) / Denominator;
|
||||
Note_Column[NoteArray_Pointer] := BMS_Function;
|
||||
inc(NoteArray_Pointer);
|
||||
if BMP_Name[Note] = '' then
|
||||
BMP_Name[Note] := ' '; // Prepare blank BGA image
|
||||
end;
|
||||
1, 11..49: begin // -------------------- Key Sound
|
||||
Note_Sound[NoteArray_Pointer] := Note;
|
||||
Note_Measure[NoteArray_Pointer] := BMS_Measure;
|
||||
Note_Position[NoteArray_Pointer] := (i shr 1) / Denominator;
|
||||
Note_Column[NoteArray_Pointer] := BMS_Function;
|
||||
if BMS_Function in [11..29] then
|
||||
inc(Measure_NoteAmount[Note_Measure[NoteArray_Pointer]]);
|
||||
if BMS_Function = 1 then
|
||||
Note_Flag[NoteArray_Pointer] := Note_Flag[NoteArray_Pointer] or Flag_AutoPlay;
|
||||
inc(NoteArray_Pointer);
|
||||
if WAV_Name[Note] = '' then
|
||||
WAV_Name[Note] := ' '; // Prepare blank WAV sound
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
inc(i, 2);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ConvertPositionsIntoTime;
|
||||
// ==============================================
|
||||
// This converts Event Position values
|
||||
// into the time the event will be
|
||||
// triggered.
|
||||
//
|
||||
// Formula:
|
||||
// Time in Seconds = 240 * (Measure_Size / Tempo)
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to Event_Count - 1 do
|
||||
Note_Time[i] := (Measure_Time[Note_Measure[i]] / Tempo * 240) +
|
||||
(Measure_Size[Note_Measure[i]] / Tempo * 240) * Note_Position[i];
|
||||
|
||||
FillChar(Note_Position[0], Event_Count shl 2, 0); // Removing now un-needed
|
||||
end; // data
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ConvertTempoChangesIntoTime;
|
||||
// =======================================
|
||||
// Similar to the above procedure, this
|
||||
// converts Tempo Change positions into
|
||||
// the time the tempo change takes effect.
|
||||
//
|
||||
// Same formula used as the above.
|
||||
// ---------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to TempoChange_Count - 1 do
|
||||
TempoChange_Position[i] := (Measure_Time[TempoChange_Measure[i]] / Tempo * 240)
|
||||
+ (Measure_Size[TempoChange_Measure[i]] / Tempo * 240)
|
||||
* TempoChange_Position[i];
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ParseMainDataField(Path_File: String);
|
||||
// ===============================================
|
||||
// Reads the numerical prefixed BMS command lines
|
||||
// and prepares the data for conversion into notes
|
||||
// and other events.
|
||||
// -----------------------------------------------
|
||||
var
|
||||
BMS_File: TextFile;
|
||||
Data, BMS_DataLine: String;
|
||||
BMS_Measure: Word;
|
||||
BMS_Function: Byte;
|
||||
begin
|
||||
|
||||
AssignFile(BMS_File, Path_File); // CountEvents function already checked
|
||||
Reset(BMS_File); // if the file existed, so no need to here.
|
||||
|
||||
NoteArray_Pointer := 0; // Start from the beginning!
|
||||
TempoChange_Pointer := 0;
|
||||
|
||||
while not EOF(BMS_File) do
|
||||
begin
|
||||
ReadLn(BMS_File, Data);
|
||||
|
||||
if Length(Data) >= 8 then
|
||||
if Data[1] = '#' then
|
||||
if Data[2] in ['0'..'9'] then
|
||||
begin
|
||||
|
||||
BMS_Measure := StrToInt(copy(Data, 2, 3));
|
||||
BMS_Function := StrToInt(copy(Data, 5, 2));
|
||||
BMS_DataLine := copy(Data, 8, Length(Data) - 7);
|
||||
|
||||
case BMS_Function of
|
||||
1, 3, 4, 6, 7, 8,
|
||||
11..19,
|
||||
21..49: ConvertDataLine(BMS_Measure, BMS_Function, BMS_DataLine);
|
||||
2: Measure_Size[BMS_Measure] := StrToFloat(BMS_DataLine);
|
||||
end;
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
CloseFile(BMS_File);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ReadHeader(Path_File: String);
|
||||
// =========================================
|
||||
// Obtains info about the song, ignoring the
|
||||
// actual note data, as well as the WAV and
|
||||
// BMP file name references.
|
||||
// -----------------------------------------
|
||||
var
|
||||
BMS_File: TextFile;
|
||||
SpacePosition, Len: Word;
|
||||
Data1, Data2: String;
|
||||
begin
|
||||
|
||||
Tempo := 120;
|
||||
Title := '';
|
||||
Genre := '';
|
||||
Artist := '';
|
||||
Players := 0;
|
||||
Judgement := 0;
|
||||
PlayLevel := 0;
|
||||
|
||||
AssignFile(BMS_File, Path_File); // CountEvents function already checked
|
||||
Reset(BMS_File); // if the file existed, so no need to here.
|
||||
|
||||
while not EOF(BMS_File) do
|
||||
begin
|
||||
ReadLn(BMS_File, Data1);
|
||||
|
||||
Len := Length(Data1);
|
||||
SpacePosition := FindFirstSpace(Data1);
|
||||
|
||||
if Len > SpacePosition then
|
||||
if Data1[SpacePosition] = ' ' then
|
||||
begin
|
||||
Data2 := copy(Data1, SpacePosition + 1, (Len - SpacePosition) + 1);
|
||||
Data1 := copy(Data1, 1, SpacePosition - 1);
|
||||
end;
|
||||
|
||||
if Data1 = '#GENRE' then Genre := Data2;
|
||||
if Data1 = '#ARTIST' then Artist := Data2;
|
||||
if Data1 = '#TITLE' then Title := Data2;
|
||||
|
||||
if Data2 <> '' then
|
||||
if (Data2[1] < '0') or // Some songs have non-numerical values for the
|
||||
(Data2[1] > '9') then // below lines (such as #PLAYLEVEL ?).
|
||||
Data2 := '0'; // This works around those weird lines.
|
||||
|
||||
if Data1 = '#PLAYER' then Players := StrToInt(Data2);
|
||||
if Data1 = '#BPM' then Tempo := StrToFloat(Data2);
|
||||
if Data1 = '#RANK' then Judgement := StrToInt(Data2);
|
||||
if Data1 = '#PLAYLEVEL' then PlayLevel := StrToInt(Data2);
|
||||
|
||||
end;
|
||||
|
||||
CloseFile(BMS_File);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SetMeasureStartTimes;
|
||||
// =====================================
|
||||
// This adds up the total sizes of all
|
||||
// in-use measures.
|
||||
//
|
||||
// Un-used measures with negative values
|
||||
// will be ignored.
|
||||
// -------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Total_Size: Single;
|
||||
begin
|
||||
Total_Size := 0;
|
||||
for i := 0 to Measure_Count - 1 do
|
||||
begin
|
||||
Measure_Time[i] := Total_Size;
|
||||
Total_Size := Total_Size + Measure_Size[i]; // No need to abs(Measure_Size),
|
||||
end; // was done in MarkUsedMeasures!
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,144 @@
|
||||
program BMSto1;
|
||||
// ==============================================
|
||||
// BMSto1 v0.06
|
||||
// Created 2007.04.03
|
||||
// Updated 2007.04.07
|
||||
//
|
||||
// Converts a Be-Music Source file to .1 format.
|
||||
// Also combines WAV files to a .2dx format file.
|
||||
// ----------------------------------------------
|
||||
|
||||
|
||||
{$APPTYPE CONSOLE}
|
||||
|
||||
uses
|
||||
SysUtils,
|
||||
Convert in 'Convert.pas',
|
||||
Utils in 'Utils.pas',
|
||||
DXAC2DX in 'DXAC2DX.pas';
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function CheckForParam(Param: String): Boolean;
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
Result := False;
|
||||
Param := UpperCase(Param);
|
||||
|
||||
for i := 1 to ParamCount do
|
||||
if UpperCase(ParamStr(i)) = Param then
|
||||
Result := True;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ScanForFiles;
|
||||
const
|
||||
SlashRANDOM: array[1..7] of Char = '/RANDOM';
|
||||
SlashMIRROR: array[1..7] of Char = '/MIRROR';
|
||||
SlashVMIRROR: array[1..8] of Char = '/VMIRROR';
|
||||
var
|
||||
Rec: TSearchRec;
|
||||
Path: String;
|
||||
DoRandom: Boolean;
|
||||
DoMirror: Boolean;
|
||||
DoVMirror: Boolean;
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
DoRandom := False;
|
||||
DoMirror := False;
|
||||
DoVMirror := False;
|
||||
|
||||
if CheckForParam(SlashRANDOM) then DoRandom := True;
|
||||
if CheckForParam(SlashMIRROR) then DoMirror := True;
|
||||
if CheckForParam(SlashVMIRROR) then DoVMirror := True;
|
||||
|
||||
for i := 1 to ParamCount do
|
||||
begin
|
||||
|
||||
Path := NoFile(ParamStr(i));
|
||||
if Path = '' then Path := '.\';
|
||||
if FindFirst(ParamStr(i),
|
||||
faAnyFile - faDirectory,
|
||||
Rec) = 0 then
|
||||
try
|
||||
repeat
|
||||
write(Rec.Name + ' > ' + NoExt(Rec.Name) + '.1 + .2dx ...');
|
||||
case Do_Stuff(Path + Rec.Name, DoRandom, DoMirror, DoVMirror) of
|
||||
True: writeln('OK!');
|
||||
False: writeln('Error!');
|
||||
end;
|
||||
until FindNext(Rec) <> 0;
|
||||
finally
|
||||
FindClose(Rec);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
writeln('All tasks complete.');
|
||||
writeln;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure DisplayInfo;
|
||||
// ==============================================
|
||||
// Displays information on how to use the program
|
||||
// when no command line parameters exist.
|
||||
// ----------------------------------------------
|
||||
begin
|
||||
writeln;
|
||||
write ('================================================================================');
|
||||
write ('BMSto1 -- v0.06! - Be-Music Source conversion utility - created 2007.04.07');
|
||||
write ('--------------------------------------------------------------------------------');
|
||||
writeln;
|
||||
writeln(' To use: BMSto1 [/RANDOM] [/MIRROR] [/VMIRROR] InputFile1 InputFile2 ...');
|
||||
writeln;
|
||||
writeln(' InputFile - The BMS file(s) to convert. Wildcards ? and * can be used in');
|
||||
writeln(' any InputFile name parameter. All Output file(s) will have .1');
|
||||
writeln(' as their new file extension. BMS WAV sounds will be combined');
|
||||
writeln(' into .2dx files.');
|
||||
writeln(' /RANDOM - Applies the Random Modifier effect to the note-chart.');
|
||||
writeln(' /MIRROR - Applies the Mirror Modifier effect to the note-chart.');
|
||||
writeln(' /VMIRROR - Vertically flips the note-chart. Last note becomes first!');
|
||||
writeln;
|
||||
writeln(' This version of BMSto1 currently isn''t able to combine multiple BMS files of');
|
||||
writeln(' the same song. Instead, each BMS will be converted to its own .1 file.');
|
||||
writeln;
|
||||
writeln;
|
||||
writeln(' Use of BMSto1 is AT YOUR OWN RISK. It has been tested, however I will not');
|
||||
writeln(' take responsibility for damaged or corrupted files.');
|
||||
writeln;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
begin
|
||||
{ TODO -oUser -cConsole Main : Insert code here }
|
||||
|
||||
if ParamStr(1) = '' then
|
||||
begin
|
||||
DisplayInfo;
|
||||
exit;
|
||||
end;
|
||||
ScanForFiles;
|
||||
end.
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
unit Base36;
|
||||
// ====================================================
|
||||
// Base36.pas v0.11
|
||||
// Created 2005.06.02
|
||||
// Modified 2007.02.20
|
||||
//
|
||||
// This unit converts a Base-36 number to decimal.
|
||||
// Base-36 alpha: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
//
|
||||
// A function to convert from Decimal will most likely
|
||||
// be added soon. Maybe.
|
||||
//
|
||||
// This could be easily modified to support a different
|
||||
// number base, just modify the 2 constants below.
|
||||
// ----------------------------------------------------
|
||||
|
||||
interface
|
||||
|
||||
uses SysUtils;
|
||||
|
||||
const
|
||||
B36: byte = 36;
|
||||
Base36String: String = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
|
||||
Function Base36ToInt(B36Num: string): Integer;
|
||||
Function Exp(Base: Integer; Power: Byte): Integer;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
function Base36ToInt(B36Num: string): Integer;
|
||||
// =========================================
|
||||
// Converts a Base-36 number of any length
|
||||
// to a decimal number.
|
||||
// -----------------------------------------
|
||||
var
|
||||
Number_Length, Number_Position: word;
|
||||
i: Byte;
|
||||
begin
|
||||
B36Num := UpperCase(B36Num);
|
||||
Number_Length := Length(B36Num);
|
||||
Number_Position := Number_Length;
|
||||
Result := 0;
|
||||
while Number_Position >= 1 do
|
||||
begin
|
||||
i := 1;
|
||||
while B36Num[Number_Position] <> Base36String[i] do
|
||||
begin
|
||||
inc(i);
|
||||
if i > B36 then
|
||||
begin
|
||||
Result := 0;
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
Result := Result + (i - 1) * Exp(B36, Number_Length - Number_Position);
|
||||
dec(Number_Position);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function Exp(Base:Integer; Power:Byte): Integer;
|
||||
// ==============================================
|
||||
// A quickie exponential function where the power
|
||||
// is exclusively a rounded non-negative number
|
||||
// between (and including) 0 and 255!
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i: byte;
|
||||
begin
|
||||
Result := 1;
|
||||
for i := 1 to Power do Result := Result * Base;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,56 @@
|
||||
unit Convert;
|
||||
// =============================
|
||||
// Convert.pas
|
||||
// Created 2007.04.04
|
||||
// Updated 2007.04.07
|
||||
//
|
||||
// Holds the code that calls the
|
||||
// various conversion routines.
|
||||
// -----------------------------
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
BMS, DB_Main, DB_XForm, DXAC1, DXAC2DX, Utils;
|
||||
|
||||
|
||||
function Do_Stuff(Path_Name: String; DoRandom, DoMirror, DoVMirror: Boolean): Boolean;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function Do_Stuff(Path_Name: String; DoRandom, DoMirror, DoVMirror: Boolean): Boolean;
|
||||
begin
|
||||
|
||||
OpenBMS(Path_Name);
|
||||
SortEvents; // Database always needs sorting after opening.
|
||||
KeyAmount := GetKeyAmount;
|
||||
TotalNotes := ReCalculatePlayableNotes;
|
||||
ApplyTempoChanges;
|
||||
if DoRandom then ApplyRandom;
|
||||
if DoMirror then ApplyMirror;
|
||||
if DoVMirror then ApplyMirrorPlus;
|
||||
SortEvents;
|
||||
SortWAVNames; // Compress the WAV list!
|
||||
AddSoundChanges;
|
||||
SortEvents; // All that modifying! Let's re-sort!
|
||||
|
||||
Save1(NoExt(Path_Name) + '.1'); // Generate and save the .1 file
|
||||
Save2dx(NoExt(Path_Name) + '.2dx'); // Generate and save the .2dx file
|
||||
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,639 @@
|
||||
unit DB_Main;
|
||||
// ===================================================
|
||||
// DB_Main.pas
|
||||
// Created 2007.02.24
|
||||
//
|
||||
// This file contains the various arrays and variables
|
||||
// for storing converted note/event data.
|
||||
// ---------------------------------------------------
|
||||
|
||||
interface
|
||||
|
||||
const
|
||||
Flag_Hidden: byte = 1; // Constants used for Note_Flag[]
|
||||
Flag_Judged: byte = 2; //
|
||||
Flag_Autoplay: byte = 4; //
|
||||
Flag_Player1: byte = 8; //
|
||||
|
||||
var
|
||||
Note_Time: array of Single; // How long before the note is played.
|
||||
Note_Sound: array of Word; // # of sound file to play.
|
||||
Note_Column: array of Byte; // The column the note appears in.
|
||||
Note_Measure: array of Word; // The measure the note appears in.
|
||||
Note_Position: array of Single; // Where in the measure it is.
|
||||
// 0 meaning measure start, and
|
||||
// 0.999~ meaning real close to
|
||||
// the next measure line.
|
||||
Note_Flag: array of Byte; // What options are set on the note.
|
||||
//
|
||||
// Byte and 1: Hidden. Don't Display!
|
||||
// Byte and 2: Judged. Don't re-judge!
|
||||
// Byte and 4: Autoplay.
|
||||
//
|
||||
// For use later:
|
||||
// Byte and 8: Player number?
|
||||
|
||||
TempoChange_Measure: array of Word; // Where the tempo change is.
|
||||
TempoChange_Position: array of Single; // How far above the divider.
|
||||
TempoChange_Amount: array of Single; // Amount to change tempo to.
|
||||
|
||||
CustomTempoChange_Amount: array of Single; // For the #BPMxx lines.
|
||||
|
||||
Measure_Time: array of Single; // Divider line's placing.
|
||||
Measure_Size: array of Single; // Distance between 2 lines.
|
||||
Measure_NoteAmount: array of Byte; //
|
||||
Measure_HitNotes: array of Byte; //
|
||||
// These 4 arrays are only
|
||||
// used when loading BMS
|
||||
// format songs.
|
||||
|
||||
WAV_Name: array of string; // Name of sounds used in the song.
|
||||
BMP_Name: array of string; // Name of images used in the song.
|
||||
|
||||
KeyAmount: Byte; // (5, 7, 9, 10, 14?)
|
||||
|
||||
Tempo: Single;
|
||||
Event_Count: Integer;
|
||||
Title, Artist, Genre, FileName: String;
|
||||
Measure_Count, WAV_Count, BMP_Count,
|
||||
TempoChange_Count, CustomTempoChange_Count,
|
||||
NoteArray_Pointer, TempoChange_Pointer,
|
||||
TotalPlayableNotes, TotalNotes: Word;
|
||||
Players, PlayLevel, Judgement: Byte;
|
||||
BGA_OK: Boolean;
|
||||
|
||||
|
||||
function GetFirstFreeBMP: Integer;
|
||||
function GetFirstFreeEvent: Integer;
|
||||
function GetFirstFreeWAV: Integer;
|
||||
function GetKeyAmount: Byte;
|
||||
function GetLastWavNumber: Word;
|
||||
function ReCalculatePlayableNotes: Word;
|
||||
|
||||
procedure AssignNotesToMeasure;
|
||||
procedure FreeArrays;
|
||||
procedure InitializeArrays;
|
||||
procedure SortBmpNames;
|
||||
procedure SortEvents;
|
||||
procedure SortTempoChangeArrays;
|
||||
procedure SortWavNames;
|
||||
procedure SwapBmpNames(X1, X2: Word);
|
||||
procedure SwapEvents(X1, X2: Word);
|
||||
procedure SwapTempoChanges(X1, X2: Word);
|
||||
procedure SwapWavNames(X1, X2: Word);
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function GetFirstFreeBMP: Integer;
|
||||
// ==============================================
|
||||
// Returns the first un-used location in the BMP
|
||||
// name array.
|
||||
//
|
||||
// If all locations are in use, this will return
|
||||
// a value of -1.
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result := -1;
|
||||
|
||||
for i := BMP_Count downto 1 do
|
||||
if BMP_Name[i] = '' then
|
||||
Result := i;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function GetFirstFreeEvent: Integer;
|
||||
// ==============================================
|
||||
// Returns the first un-used location in the note
|
||||
// variable arrays.
|
||||
//
|
||||
// If all locations are in use, this will return
|
||||
// a value of -1.
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result := -1;
|
||||
|
||||
for i := Event_Count - 1 downto 0 do
|
||||
if Note_Column[i] = 0 then
|
||||
Result := i;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function GetFirstFreeWAV: Integer;
|
||||
// ==============================================
|
||||
// Returns the first un-used location in the WAV
|
||||
// name array.
|
||||
//
|
||||
// If all locations are in use, this will return
|
||||
// a value of -1.
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result := -1;
|
||||
|
||||
for i := WAV_Count downto 1 do
|
||||
if WAV_Name[i] = '' then
|
||||
Result := i;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function GetKeyAmount: Byte;
|
||||
// =========================================
|
||||
// Returns the play mode of the loaded song.
|
||||
// (5 or 7 keys)
|
||||
// -----------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Key: Array[11..29] of Boolean;
|
||||
begin
|
||||
|
||||
Result := 5; // Default return value
|
||||
|
||||
for i := 11 to 29 do
|
||||
Key[i] := False;
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Column[i] in [11..29] then
|
||||
Key[Note_Column[i]] := True;
|
||||
|
||||
if Key[18] or Key[19] or Key[28] or Key[29] then
|
||||
Result := 7;
|
||||
|
||||
if Players in [2..3] then
|
||||
inc(Result, Result); // from 5-7 to 10-14
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function GetLastWavNumber: Word;
|
||||
// ===================================
|
||||
// Looks for and returns the highest
|
||||
// WAV assign number currently in use.
|
||||
// -----------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
Result := 0;
|
||||
|
||||
for i := Wav_Count downto 1 do
|
||||
if Wav_Name[i] <> '' then
|
||||
if Result = 0 then
|
||||
Result := i;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function ReCalculatePlayableNotes: Word;
|
||||
// ===================================================
|
||||
// Does what it says.
|
||||
//
|
||||
// This is useful after using the DB_XForm procedures.
|
||||
// ---------------------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
Result := 0;
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Column[i] in [11..29] then
|
||||
inc(Result);
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure AssignNotesToMeasure;
|
||||
// ==============================================
|
||||
// This procedure sets the notes' "measure" value
|
||||
// to the number of the measure the note exists
|
||||
// in.
|
||||
//
|
||||
// This is used so Be-Pachi mode can detect when
|
||||
// all notes in a measure have been played.
|
||||
//
|
||||
// This works best if the event/note arrays have
|
||||
// been sorted with SortEvents procedure first.
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Current_Measure: Word;
|
||||
begin
|
||||
|
||||
Current_Measure := 0;
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
begin
|
||||
|
||||
case Note_Column[i] of
|
||||
10: begin
|
||||
Measure_NoteAmount[Current_Measure] := 0;
|
||||
inc(Current_Measure);
|
||||
end;
|
||||
else begin
|
||||
Note_Measure[i] := Current_Measure;
|
||||
if Note_Column[i] in [11..29] then inc(Measure_NoteAmount[Current_Measure]);
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure FreeArrays;
|
||||
// ===================================================
|
||||
// Sets all arrays to nil, freeing up any memory used,
|
||||
// and erases all stored array data as well.
|
||||
// ---------------------------------------------------
|
||||
begin
|
||||
|
||||
Note_Time := nil;
|
||||
Note_Sound := nil;
|
||||
Note_Column := nil;
|
||||
Note_Measure := nil;
|
||||
Note_Position := nil;
|
||||
Note_Flag := nil;
|
||||
Measure_Time := nil;
|
||||
Measure_Size := nil;
|
||||
Measure_NoteAmount := nil;
|
||||
Measure_HitNotes := nil;
|
||||
WAV_Name := nil;
|
||||
BMP_Name := nil;
|
||||
TempoChange_Measure := nil;
|
||||
TempoChange_Position := nil;
|
||||
TempoChange_Amount := nil;
|
||||
CustomTempoChange_Amount := nil;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure InitializeArrays;
|
||||
// ==============================================
|
||||
// Prepares the variable arrays for receiving the
|
||||
// proper amounts of data.
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
FreeArrays; // To completely get rid of any data that might still exist
|
||||
// in the arrays
|
||||
|
||||
SetLength(Note_Time, Event_Count);
|
||||
SetLength(Note_Sound, Event_Count);
|
||||
SetLength(Note_Column, Event_Count);
|
||||
SetLength(Note_Measure, Event_Count);
|
||||
SetLength(Note_Position, Event_Count);
|
||||
SetLength(Note_Flag, Event_Count);
|
||||
|
||||
SetLength(Measure_Time, Measure_Count);
|
||||
SetLength(Measure_Size, Measure_Count);
|
||||
SetLength(Measure_NoteAmount, Measure_Count);
|
||||
SetLength(Measure_HitNotes, Measure_Count);
|
||||
|
||||
SetLength(WAV_Name, WAV_Count + 2); // An extra value for blank sounds
|
||||
SetLength(BMP_Name, BMP_Count + 2); // and images
|
||||
|
||||
SetLength(TempoChange_Measure, TempoChange_Count);
|
||||
SetLength(TempoChange_Position, TempoChange_Count);
|
||||
SetLength(TempoChange_Amount, TempoChange_Count);
|
||||
|
||||
SetLength(CustomTempoChange_Amount, CustomTempoChange_Count + 1);
|
||||
|
||||
for i := 0 to Measure_Count - 1 do
|
||||
Measure_Size[i] := 1;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SortBmpNames;
|
||||
// ===============================================
|
||||
// Sorts the BMP names so that in-use names appear
|
||||
// at the start of the array.
|
||||
//
|
||||
// The Note_Sound[] Array will also be modified to
|
||||
// reflect the changes in the BMP_Name[] array,
|
||||
// despite the name.
|
||||
// -----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Swapped: Boolean;
|
||||
begin
|
||||
|
||||
repeat
|
||||
Swapped := False;
|
||||
|
||||
for i := 1 to BMP_Count - 1 do // Start counter at 1.
|
||||
if BMP_Name[i] = '' then // 0 references the 'Miss' BMP image.
|
||||
if BMP_Name[i + 1] <> '' then
|
||||
begin
|
||||
SwapBmpNames(i, i + 1);
|
||||
Swapped := True;
|
||||
end;
|
||||
|
||||
until not Swapped;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SortEvents;
|
||||
// ===============================================
|
||||
// This sorts the events in the various Note_...[]
|
||||
// arrays from earliest to latest.
|
||||
// -----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Swapped: Boolean;
|
||||
begin
|
||||
|
||||
repeat
|
||||
Swapped := False;
|
||||
for i := 0 to Event_Count - 2 do
|
||||
if Note_Time[i] > Note_Time[i + 1] then
|
||||
if Note_Column[i + 1] <> 0 then
|
||||
begin
|
||||
SwapEvents(i, i + 1);
|
||||
Swapped := True;
|
||||
end;
|
||||
until not Swapped;
|
||||
|
||||
repeat // This places 'Measure Line'
|
||||
Swapped := False; // events earlier in the note
|
||||
for i := 0 to Event_Count - 2 do // array if they appear at the
|
||||
if Note_Time[i] = Note_Time[i + 1] then // same time as other events or
|
||||
if Note_Column[i + 1] = 10 then // notes.
|
||||
if Note_Column[i + 1] <> 0 then //
|
||||
if Note_Column[i] <> 10 then //
|
||||
begin //
|
||||
SwapEvents(i, i + 1); //
|
||||
Swapped := True; //
|
||||
end; //
|
||||
until not Swapped; //
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SortTempoChangeArrays;
|
||||
// ============================================
|
||||
// Sort the BPM changes from first-appearing to
|
||||
// last-appearing.
|
||||
// --------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Swapped: Boolean;
|
||||
begin
|
||||
|
||||
repeat
|
||||
Swapped := False;
|
||||
|
||||
for i := 0 to TempoChange_Count - 2 do
|
||||
if TempoChange_Position[i] > TempoChange_Position[i + 1] then
|
||||
begin
|
||||
SwapTempoChanges(i, i + 1);
|
||||
Swapped := True;
|
||||
end;
|
||||
|
||||
until not Swapped;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SortWavNames;
|
||||
// ===============================================
|
||||
// Sorts the WAV names so that in-use names appear
|
||||
// at the start of the array.
|
||||
//
|
||||
// The Note_Sound[] Array will also be modified to
|
||||
// reflect the changes in the WAV_Name[] array.
|
||||
// -----------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Swapped: Boolean;
|
||||
begin
|
||||
|
||||
repeat
|
||||
Swapped := False;
|
||||
|
||||
for i := 1 to WAV_Count - 1 do
|
||||
if WAV_Name[i] = '' then
|
||||
if WAV_Name[i + 1] <> '' then
|
||||
begin
|
||||
SwapWavNames(i, i + 1);
|
||||
Swapped := True;
|
||||
end;
|
||||
|
||||
until not Swapped;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SwapBmpNames(X1, X2: Word);
|
||||
// ======================================
|
||||
// Swaps the 2 file names in the BMP_Name
|
||||
// array, and also all respective values
|
||||
// in Note_Sound array (Also used for
|
||||
// image numbers, despite the name)
|
||||
// --------------------------------------
|
||||
var
|
||||
Temp_BMP: String;
|
||||
i: Word;
|
||||
begin
|
||||
Temp_BMP := BMP_Name[X1];
|
||||
BMP_Name[X1] := BMP_Name[X2];
|
||||
BMP_Name[X2] := Temp_BMP;
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Column[i] in [4..7] then
|
||||
begin
|
||||
if Note_Sound[i] = X1 then
|
||||
Note_Sound[i] := X2
|
||||
else
|
||||
if Note_Sound[i] = X2 then
|
||||
Note_Sound[i] := X1;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SwapEvents(X1, X2: Word);
|
||||
// ==================================
|
||||
// Swaps the positions of 2 events in
|
||||
// all related variable arrays.
|
||||
// ----------------------------------
|
||||
var
|
||||
Temp_NT, Temp_NP: Single;
|
||||
Temp_NM, Temp_NS: Word;
|
||||
Temp_NC, Temp_NF: Byte;
|
||||
begin
|
||||
Temp_NT := Note_Time[X1];
|
||||
Temp_NP := Note_Position[X1];
|
||||
Temp_NM := Note_Measure[X1];
|
||||
Temp_NS := Note_Sound[X1];
|
||||
Temp_NC := Note_Column[X1];
|
||||
Temp_NF := Note_Flag[X1];
|
||||
|
||||
Note_Time[X1] := Note_Time[X2];
|
||||
Note_Position[X1] := Note_Position[X2];
|
||||
Note_Measure[X1] := Note_Measure[X2];
|
||||
Note_Sound[X1] := Note_Sound[X2];
|
||||
Note_Column[X1] := Note_Column[X2];
|
||||
Note_Flag[X1] := Note_Flag[X2];
|
||||
|
||||
Note_Time[X2] := Temp_NT;
|
||||
Note_Position[X2] := Temp_NP;
|
||||
Note_Measure[X2] := Temp_NM;
|
||||
Note_Sound[X2] := Temp_NS;
|
||||
Note_Column[X2] := Temp_NC;
|
||||
Note_Flag[X2] := Temp_NF;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SwapTempoChanges(X1, X2: Word);
|
||||
// ====================================
|
||||
// Swaps 2 values in each of the arrays
|
||||
// related to Tempo Changes.
|
||||
// ------------------------------------
|
||||
var
|
||||
Temp_TCP, Temp_TCA: Single;
|
||||
Temp_TCM: Word;
|
||||
begin
|
||||
Temp_TCM := TempoChange_Measure[X1];
|
||||
Temp_TCP := TempoChange_Position[X1];
|
||||
Temp_TCA := TempoChange_Amount[X1];
|
||||
|
||||
TempoChange_Measure[X1] := TempoChange_Measure[X2];
|
||||
TempoChange_Amount[X1] := TempoChange_Amount[X2];
|
||||
TempoChange_Position[X1] := TempoChange_Position[X2];
|
||||
|
||||
TempoChange_Measure[X2] := Temp_TCM;
|
||||
TempoChange_Position[X2] := Temp_TCP;
|
||||
TempoChange_Amount[X2] := Temp_TCA;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure SwapWavNames(X1, X2: Word);
|
||||
// ======================================
|
||||
// Swaps the 2 file names in the WAV_Name
|
||||
// array, and also all respective values
|
||||
// in Note_Sound array.
|
||||
// --------------------------------------
|
||||
var
|
||||
Temp_WAV: String;
|
||||
i: Word;
|
||||
begin
|
||||
Temp_WAV := WAV_Name[X1];
|
||||
WAV_Name[X1] := WAV_Name[X2];
|
||||
WAV_Name[X2] := Temp_WAV;
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if (Note_Column[i] = 1) or
|
||||
(Note_Column[i] >= 11) then
|
||||
begin
|
||||
if Note_Sound[i] = X1 then
|
||||
Note_Sound[i] := X2
|
||||
else
|
||||
if Note_Sound[i] = X2 then
|
||||
Note_Sound[i] := X1;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,459 @@
|
||||
unit DB_XForm;
|
||||
// ===============================================
|
||||
// DB_XForm.pas
|
||||
// Created 2007.02.24
|
||||
//
|
||||
// Contains procedures to transform and manipulate
|
||||
// the data stored in the DB_Main.pas arrays.
|
||||
// -----------------------------------------------
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
DB_Main;
|
||||
|
||||
procedure AddBackgroundStars;
|
||||
procedure AddSoundChanges;
|
||||
procedure ApplyAutoPlay;
|
||||
procedure ApplyAutoScratch;
|
||||
procedure ApplyEasy;
|
||||
procedure ApplyMirror;
|
||||
procedure ApplyRandom;
|
||||
procedure ApplyMirrorPlus;
|
||||
procedure CheckNoteSounds;
|
||||
procedure DelayEvents(Seconds: Single);
|
||||
procedure MakeKeyAmount(Amount: Byte);
|
||||
procedure MakePlayerAmount(Amount: Byte);
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure AddBackgroundStars;
|
||||
// ===========================================================
|
||||
// Adds the Background star-field into the note pattern array,
|
||||
// so they can be properly Z-plane sorted too!
|
||||
//
|
||||
// Only needed for the 3D mode.
|
||||
//
|
||||
// It's a good idea to call SortEvents after using this!
|
||||
// -----------------------------------------------------------
|
||||
var
|
||||
Latest_Note: Single;
|
||||
i, ff: Integer;
|
||||
Star_Type: Byte;
|
||||
begin
|
||||
|
||||
ff := GetFirstFreeEvent;
|
||||
if ff < 0 then exit;
|
||||
|
||||
Latest_Note := 0;
|
||||
Star_Type := 0;
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Time[i] > Latest_Note then
|
||||
Latest_Note := Note_Time[i];
|
||||
|
||||
repeat
|
||||
Note_Column[ff] := 5;
|
||||
Note_Time[ff] := Latest_Note;
|
||||
Note_Sound[ff] := (Star_Type and 1) + 2;
|
||||
Latest_Note := Latest_Note - 0.3;
|
||||
inc(ff);
|
||||
inc(Star_Type);
|
||||
until Latest_Note < 0;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure AddSoundChanges;
|
||||
// ==============================================
|
||||
// Creates a list of 'current sound to play when
|
||||
// a button is pressed' events, and adds them to
|
||||
// the note arrays.
|
||||
//
|
||||
// The sound change events will be placed halfway
|
||||
// between 2 notes in a column.
|
||||
// ----------------------------------------------
|
||||
var
|
||||
i, ff: Integer;
|
||||
Current_Time: Single;
|
||||
Current_Sound: Word;
|
||||
Current_Column: Byte;
|
||||
begin
|
||||
|
||||
ff := GetFirstFreeEvent;
|
||||
if ff < 0 then exit; // Error! To handle later
|
||||
|
||||
for Current_Column := 11 to 29 do
|
||||
begin
|
||||
Current_Sound := 0;
|
||||
Current_Time := 0;
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if (Note_Column[i] = Current_Column) or
|
||||
(Note_Column[i] = Current_Column + 20) then
|
||||
begin
|
||||
if Note_Sound[i] <> Current_Sound then
|
||||
begin
|
||||
if Current_Time = 0 then Note_Time[ff] := 0
|
||||
else Note_Time[ff] := ((Note_Time[i] - Current_Time) / 2) + Current_Time;
|
||||
Note_Column[ff] := Note_Column[i] + 20;
|
||||
Current_Sound := Note_Sound[i];
|
||||
Note_Sound[ff] := Current_Sound;
|
||||
inc(ff);
|
||||
end;
|
||||
Current_Time := Note_Time[i];
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ApplyAutoPlay;
|
||||
// ==================================
|
||||
// This procedure sets the 'AutoPlay'
|
||||
// flag of all notes.
|
||||
// ----------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Column[i] in [11..29] then
|
||||
Note_Flag[i] := Note_Flag[i] or Flag_AutoPlay;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ApplyAutoScratch;
|
||||
// =================================
|
||||
// Converts all scratch-column notes
|
||||
// into auto-play notes.
|
||||
// ---------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if (Note_Column[i] = 16) or
|
||||
(Note_Column[i] = 26) then
|
||||
Note_Flag[i] := Note_Flag[i] or Flag_AutoPlay;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ApplyEasy;
|
||||
// ==================================
|
||||
// This Auto-plays and hides all blue
|
||||
// and scratch notes!
|
||||
// ----------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Time[i] > 0 then
|
||||
case Note_Column[i] of
|
||||
12, 14, 16, 18, 22, 24: Note_Flag[i] := Note_Flag[i] or Flag_AutoPlay;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ApplyMirror;
|
||||
// =====================================
|
||||
// Horizontally flips the note patterns.
|
||||
// For now, only works on 5 and 7 key
|
||||
// note charts.
|
||||
// -------------------------------------
|
||||
var
|
||||
i: word;
|
||||
Column_From, Column_Base: byte;
|
||||
const
|
||||
M_5: array[1..6] of byte = (5, 4, 3, 2, 1, 6);
|
||||
M_7: array[1..9] of byte = (9, 8, 5, 4, 3, 6, 0, 2, 1);
|
||||
begin
|
||||
for i := 0 to Event_Count - 1 do
|
||||
begin
|
||||
|
||||
if Note_Column[i] > 10 then
|
||||
begin
|
||||
Column_From := Note_Column[i];
|
||||
while Column_From > 10 do dec(Column_From, 10);
|
||||
Column_Base := Note_Column[i] - Column_From;
|
||||
case KeyAmount of
|
||||
5: Note_Column[i] := Column_Base + M_5[Column_From];
|
||||
7: Note_Column[i] := Column_Base + M_7[Column_From];
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ApplyMirrorPlus;
|
||||
// ===========================================
|
||||
// This flips the note patterns upside down...
|
||||
// Last note first, and first note last!
|
||||
//
|
||||
// Only transforms the visible keys. BG sounds
|
||||
// and other things aren't modified.
|
||||
//
|
||||
// A call to DB.SortEvents will definitely be
|
||||
// needed after calling this.
|
||||
// -------------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
MaxNoteTime: Single;
|
||||
begin
|
||||
MaxNoteTime := 0;
|
||||
|
||||
for i := 0 to Event_Count - 1 do // Find the note with the
|
||||
if Note_Time[i] > MaxNoteTime then // latest play-time.
|
||||
if Note_Column[i] in [11..29] then //
|
||||
MaxNoteTime := Note_Time[i]; //
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Column[i] >= 11 then
|
||||
begin
|
||||
Note_Time[i] := MaxNoteTime - Note_Time[i];
|
||||
Note_Measure[i] := Measure_Count - Note_Measure[i];
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure ApplyRandom;
|
||||
// =============================================
|
||||
// Randomizes the columns of notes, not the note
|
||||
// positions themselves.
|
||||
// ---------------------------------------------
|
||||
var
|
||||
i: word;
|
||||
i2, r_i, pl_num, column: byte;
|
||||
R_9, R2_9: array[1..10] of byte;
|
||||
ok: boolean;
|
||||
begin
|
||||
|
||||
for i2 := 1 to 10 do
|
||||
R_9[i2] := i2;
|
||||
|
||||
R2_9 := R_9;
|
||||
|
||||
if KeyAmount <> 9 then
|
||||
R2_9[6] := 10;
|
||||
|
||||
if KeyAmount = 5 then
|
||||
for i2 := 7 to 9 do R2_9[i2] := 10;
|
||||
|
||||
if KeyAmount = 7 then
|
||||
R2_9[7] := 10;
|
||||
|
||||
Randomize;
|
||||
|
||||
for i2 := 1 to 9 do
|
||||
begin
|
||||
ok := True;
|
||||
if R2_9[i2] = 10 then ok := False;
|
||||
if ok then
|
||||
begin
|
||||
r_i := Random(9);
|
||||
while (R2_9[r_i] = 0) or
|
||||
(R2_9[r_i] = 10) do
|
||||
begin
|
||||
inc(r_i);
|
||||
if r_i = 10 then r_i := 1
|
||||
end;
|
||||
R_9[i2] := r_i;
|
||||
R2_9[r_i] := 0;
|
||||
end;
|
||||
end;
|
||||
|
||||
for i := 0 to Event_Count - 1 do // New column places generated,
|
||||
begin // now look through the arrays
|
||||
Column := Note_Column[i]; // and change the needed notes.
|
||||
while Column > 10 do dec(Column, 10);
|
||||
pl_num := Note_Column[i] - Column;
|
||||
if pl_num > 0 then
|
||||
if Column > 0 then
|
||||
Note_Column[i] := pl_num + R_9[Column];
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure CheckNoteSounds;
|
||||
// ======================================
|
||||
// This checks to make sure the values in
|
||||
// the Note_Sound array don't exceed the
|
||||
// total amount of WAV files.
|
||||
//
|
||||
// If a note does, then it is set to 0,
|
||||
// a blank WAV.
|
||||
// --------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Note_Sound[i] > WAV_Count then
|
||||
if (Note_Column[i] = 1) or
|
||||
(Note_Column[i] >= 11) then
|
||||
Note_Sound[i] := 0;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure DelayEvents(Seconds: Single);
|
||||
// ========================================================
|
||||
// Re-positions the events so that the first playable note
|
||||
// is no less than the specified time in seconds from the
|
||||
// song's beginning.
|
||||
//
|
||||
// If the note array is already sorted before calling this,
|
||||
// another sort after won't be necessary. The notes will
|
||||
// still be in the same time order as before this procedure
|
||||
// is called.
|
||||
// --------------------------------------------------------
|
||||
var
|
||||
i: Integer;
|
||||
Delay_Time: single;
|
||||
begin
|
||||
|
||||
Delay_Time := Seconds;
|
||||
|
||||
for i := 0 to Event_Count - 1 do // Find the first playable note
|
||||
if Note_Column[i] in [11..29] then // closest to the song's start,
|
||||
if Note_Time[i] < Seconds then // but which also appears before
|
||||
if Note_Time[i] >= 0 then // the song's 3-second mark.
|
||||
if Note_Time[i] < Delay_Time then //
|
||||
Delay_Time := Note_Time[i]; //
|
||||
|
||||
Delay_Time := Seconds - Delay_Time; // Change the note's time into the
|
||||
// desired amount to add to all notes.
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
Note_Time[i] := Note_Time[i] + Delay_Time;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure MakeKeyAmount(Amount: byte);
|
||||
// =========================================
|
||||
// This optimizes a note layout to match the
|
||||
// specified key amount.
|
||||
//
|
||||
// 7-key note layouts don't seem to need any
|
||||
// modification.
|
||||
// -----------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
case Amount of
|
||||
5: if (Note_Column[i] in [18..19]) or
|
||||
(Note_Column[i] in [28..29]) then
|
||||
begin
|
||||
Note_Column[i] := 1;
|
||||
Note_Flag[i] := Note_Flag[i] or Flag_AutoPlay;
|
||||
end;
|
||||
9: if (Note_Column[i] in [16..21]) or
|
||||
(Note_Column[i] in [26..29]) then
|
||||
begin
|
||||
Note_Column[i] := 1;
|
||||
Note_Flag[i] := Note_Flag[i] or Flag_AutoPlay;
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
procedure MakePlayerAmount(Amount: Byte);
|
||||
// ================================================
|
||||
// This will optimize a note-chart for the intended
|
||||
// amount of players.
|
||||
// ------------------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
|
||||
for i := 0 to Event_Count - 1 do
|
||||
if Amount = 1 then
|
||||
if Note_Column[i] in [21..29] then
|
||||
begin
|
||||
Note_Column[i] := 1;
|
||||
Note_Flag[i] := Note_Flag[i] or Flag_AutoPlay;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,297 @@
|
||||
unit DXAC1;
|
||||
// =========================================================
|
||||
// DXAC1.pas
|
||||
// Created 2007.04.03
|
||||
// Updated 2007.04.05 - Fixed 'no end-of-song' event bug.
|
||||
// Updated 2007.04.06 - Corrected time of 'song stop' event.
|
||||
//
|
||||
// Converts data currently loaded in DB_Main arrays
|
||||
// to the .1 format.
|
||||
// ---------------------------------------------------------
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
SysUtils, Classes, DB_Main;
|
||||
|
||||
type T1Event = packed record
|
||||
Event_Time: Cardinal; // Time of the event, in (Seconds*FrameRate)
|
||||
Event_Type: Byte; // What kind of event.
|
||||
Data1: Byte; // Use depends on the event's type.
|
||||
Data2: Word; // Use depends on the event's type.
|
||||
end;
|
||||
|
||||
type T1HeaderEntry = packed record
|
||||
NoteChart_Offset: Cardinal; // Byte location of note chart.
|
||||
NoteChart_Size: Cardinal; // Byte size of note chart.
|
||||
end;
|
||||
|
||||
type T1Header = packed record
|
||||
Entry: array[1..12] of T1HeaderEntry;
|
||||
end;
|
||||
|
||||
const
|
||||
EndSequenceTime: Cardinal = 2130706432; // This value (0, 0, 0, 127) marks the
|
||||
// end of the note data sequence
|
||||
|
||||
FrameRate: Single = 59.941; // Try 60 if this value gives undesired results.
|
||||
|
||||
JudgementEvents: array[1..48] of byte = (0, 0, 0, 0, 8, 0, 240, 0, // These
|
||||
0, 0, 0, 0, 8, 1, 248, 0, // are
|
||||
0, 0, 0, 0, 8, 2, 255, 0, // from
|
||||
0, 0, 0, 0, 8, 3, 3, 0, // 5.1.1
|
||||
0, 0, 0, 0, 8, 4, 10, 0, //
|
||||
0, 0, 0, 0, 8, 5, 18, 0); //
|
||||
|
||||
var
|
||||
DX1Stream: TMemoryStream;
|
||||
|
||||
|
||||
function Save1(Path_File: String): Boolean;
|
||||
function Create1Chart: Boolean;
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function Save1(Path_File: String): Boolean;
|
||||
begin
|
||||
Create1Chart;
|
||||
DX1Stream.SaveToFile(Path_File);
|
||||
DX1Stream.Free;
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function Create1Chart: Boolean;
|
||||
// ==================================
|
||||
// Generates a .1 note chart from the
|
||||
// currently loaded song, and keeps
|
||||
// the data stream in memory.
|
||||
// ----------------------------------
|
||||
var
|
||||
i, LastEventTime: Integer;
|
||||
Event: T1Event;
|
||||
Header: T1Header;
|
||||
TempStream: TMemoryStream;
|
||||
|
||||
begin
|
||||
|
||||
// =================================
|
||||
// Create a temporary data stream to
|
||||
// hold the converted note info.
|
||||
//
|
||||
// Also prepare the note chart's
|
||||
// "header".
|
||||
// ---------------------------------
|
||||
TempStream := TMemoryStream.Create;
|
||||
TempStream.SetSize(Event_Count shl 5); // Allow for 2x space
|
||||
// just to be safe.
|
||||
|
||||
Event.Event_Time := 0; // Add 'Total Notes'
|
||||
Event.Event_Type := 16; // event marker
|
||||
Event.Data1 := 0; //
|
||||
Event.Data2 := TotalNotes; //
|
||||
TempStream.WriteBuffer(Event, 8); //
|
||||
|
||||
Event.Data1 := 1; // The 'Bad' event?
|
||||
Event.Data2 := 0; //
|
||||
TempStream.WriteBuffer(Event, 8); //
|
||||
//
|
||||
|
||||
Event.Event_Type := 4; // Prepare and write the
|
||||
Event.Data1 := 100; // song's starting tempo
|
||||
Event.Data2 := Trunc(Tempo * 100); // event.
|
||||
TempStream.WriteBuffer(Event, 8); //
|
||||
|
||||
Event.Event_Type := 5; // The 'Measure Size'
|
||||
Event.Data1 := 4; // event. Not sure if
|
||||
Event.Data2 := 4; // this is even used
|
||||
TempStream.WriteBuffer(Event, 8); // by anything.
|
||||
|
||||
TempStream.WriteBuffer(JudgementEvents, 48); // Default timing
|
||||
// settings.
|
||||
|
||||
// =================================
|
||||
// Now go through the Event database
|
||||
// and convert to .1 events
|
||||
// ---------------------------------
|
||||
LastEventTime := 0;
|
||||
for i := 0 to Event_Count - 1 do
|
||||
begin
|
||||
FillChar(Event, 8, 0); // Reset event variable
|
||||
Event.Event_Time := Trunc(Note_Time[i] * FrameRate);
|
||||
|
||||
case Note_Column[i] of
|
||||
1: begin // --------------------------------------------------------------
|
||||
Event.Event_Type := 7; // BG Autoplay
|
||||
Event.Data2 := Note_Sound[i]; //
|
||||
end;
|
||||
8: begin
|
||||
Event.Event_Type := 4; // Tempo Change
|
||||
if Note_Position[i] <= 655.35 then //
|
||||
begin // Tempo values
|
||||
Event.Data1 := 100; // 655.35 BPM and
|
||||
Event.Data2 := Trunc(Note_Position[i] * 100); // smaller will
|
||||
end // use the special
|
||||
else // '100' divisor.
|
||||
begin //
|
||||
Event.Data1 := 1; // Higher values
|
||||
Event.Data2 := Trunc(Note_Position[i]); // will be divided
|
||||
end; // by 1.
|
||||
end;
|
||||
10: Event.Event_Type := 12; // Measure Line
|
||||
11..15: begin // ---------------------------------------------------------
|
||||
Event.Event_Type := 0; // Player 1
|
||||
Event.Data1 := Note_Column[i] - 11; // Keys 1-5
|
||||
end;
|
||||
16: begin
|
||||
Event.Event_Type := 0; // Player 1
|
||||
Event.Data1 := 7; // Scratch Note
|
||||
end;
|
||||
18..19: begin
|
||||
Event.Event_Type := 0; // Player 1
|
||||
Event.Data1 := Note_Column[i] - 13; // Keys 6-7
|
||||
end;
|
||||
21..25: begin // ---------------------------------------------------------
|
||||
Event.Event_Type := 1; // Player 2
|
||||
Event.Data1 := Note_Column[i] - 21; // Keys 1-5
|
||||
end;
|
||||
26: begin
|
||||
Event.Event_Type := 1; // Player 2
|
||||
Event.Data1 := 7; // Scratch Note
|
||||
end;
|
||||
28..29: begin
|
||||
Event.Event_Type := 1; // Player 2
|
||||
Event.Data1 := Note_Column[i] - 23; // Keys 6-7
|
||||
end;
|
||||
31..35: begin // ---------------------------------------------------------
|
||||
Event.Event_Type := 2; // Player 1 Sound
|
||||
Event.Data1 := Note_Column[i] - 31; // Change,Keys 1-5
|
||||
Event.Data2 := Note_Sound[i]; //
|
||||
end;
|
||||
36: begin
|
||||
Event.Event_Type := 2; // Player 1 Sound
|
||||
Event.Data1 := 7; // Change,Scratch
|
||||
Event.Data2 := Note_Sound[i]; //
|
||||
end;
|
||||
38..39: begin
|
||||
Event.Event_Type := 2; // Player 1 Sound
|
||||
Event.Data1 := Note_Column[i] - 33; // Change,Keys 6-7
|
||||
Event.Data2 := Note_Sound[i]; //
|
||||
end;
|
||||
41..45: begin // ---------------------------------------------------------
|
||||
Event.Event_Type := 3; // Player 2 Sound
|
||||
Event.Data1 := Note_Column[i] - 41; // Change,Keys 1-5
|
||||
Event.Data2 := Note_Sound[i]; //
|
||||
end;
|
||||
46: begin
|
||||
Event.Event_Type := 3; // Player 2 Sound
|
||||
Event.Data1 := 7; // Change,Scratch
|
||||
Event.Data2 := Note_Sound[i]; //
|
||||
end;
|
||||
48..49: begin
|
||||
Event.Event_Type := 3; // Player 2 Sound
|
||||
Event.Data1 := Note_Column[i] - 43; // Change,Keys 6-7
|
||||
Event.Data2 := Note_Sound[i]; //
|
||||
end; // ----------------------------------------------------------
|
||||
else Event.Event_Type := 255; // BGA? Skip it!
|
||||
end;
|
||||
|
||||
if Event.Event_Type <> 255 then
|
||||
begin
|
||||
LastEventTime := Event.Event_Time;
|
||||
TempStream.WriteBuffer(Event, 8);
|
||||
|
||||
if (Event.Event_Type = 12) and // Note chart data streams in 2-player
|
||||
(Players > 1) then // .1 files require a seperate measure
|
||||
begin // divider line event for each player.
|
||||
Event.Data1 := 1; // Absolutely no idea why that is, but
|
||||
TempStream.WriteBuffer(Event, 8); // this code portion will add it in.
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
// ============================
|
||||
// Done with all of that? Yes!
|
||||
// Finalize the note chart now.
|
||||
// ----------------------------
|
||||
Event.Event_Time := LastEventTime + 60; // Create the "End Song" event.
|
||||
Event.Event_Type := 6; // For now, this event will
|
||||
Event.Data1 := 0; // always be placed 1 second
|
||||
Event.Data2 := 0; // after the last event.
|
||||
TempStream.WriteBuffer(Event, 8); //
|
||||
|
||||
if Players > 1 then
|
||||
begin
|
||||
Event.Data1 := 1; // Write a second end-of-song event
|
||||
TempStream.WriteBuffer(Event, 8); // for player 2 if needed.
|
||||
end;
|
||||
|
||||
|
||||
FillChar(Event, 8, 0); // Create the "0 0 0 127 0 0 0 0"
|
||||
Event.Event_Time := EndSequenceTime; // "End of Sequence" event marker.
|
||||
TempStream.WriteBuffer(Event, 8); //
|
||||
|
||||
// =============================
|
||||
// Create the actual data stream
|
||||
// and the .1 header.
|
||||
// -----------------------------
|
||||
TempStream.SetSize(TempStream.Position);
|
||||
TempStream.Seek(0, soFromBeginning);
|
||||
FillChar(Header, 96, 0); // Erase any existing old info in this
|
||||
|
||||
Header.Entry[1].NoteChart_Offset := 96; // Create the entry
|
||||
Header.Entry[1].NoteChart_Size := TempStream.Size; // to the chart's data.
|
||||
|
||||
for i := 2 to 4 do // Copy entry #1 to all other in-use
|
||||
Header.Entry[i] := Header.Entry[1]; // entry positions for player 1.
|
||||
// (7,L7,A7,Beg)
|
||||
|
||||
for i := 7 to 9 do // And again for all of player 2's
|
||||
Header.Entry[i] := Header.Entry[1]; // note charts. (14,L14,A14)
|
||||
|
||||
|
||||
// =====================================================================
|
||||
// A little information about why the above is doing that...
|
||||
//
|
||||
// .1 headers are always 96 bytes long, so the first existing note chart
|
||||
// can have an offset value of 96.
|
||||
//
|
||||
// And since this early version of Save1 supports only 1 BMS at a time,
|
||||
// this will use that BMS note chart for all supported difficulties.
|
||||
//
|
||||
// Also, since all difficulties share the same chart, each offset in the
|
||||
// .1 header can point to the same byte location. No idea if that will
|
||||
// actually work on the official implementation, but let's try it!
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
|
||||
// ======================================
|
||||
// Finally, create the actual data stream
|
||||
// to use for saving the .1 file.
|
||||
// --------------------------------------
|
||||
DX1Stream := TMemoryStream.Create;
|
||||
DX1Stream.WriteBuffer(Header, 96);
|
||||
DX1Stream.CopyFrom(TempStream, TempStream.Size);
|
||||
TempStream.Free;
|
||||
|
||||
Result := True;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,148 @@
|
||||
unit DXAC2DX;
|
||||
// ==========================================
|
||||
// DXAC2DX.pas
|
||||
// Created 2007.04.07
|
||||
//
|
||||
// Compiles all the WAV sounds of a BMS song
|
||||
// and combines them into 1 .2dx file.
|
||||
//
|
||||
// Thanks to Kitaru and L for 2dx info.
|
||||
// ------------------------------------------
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
SysUtils, Classes, DB_Main, Utils;
|
||||
|
||||
var
|
||||
DX2DXStream: TMemoryStream;
|
||||
|
||||
|
||||
function Save2DX(Path_File: String): Boolean;
|
||||
function Create2DX(Path_File: String): Boolean;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function Save2DX(Path_File: String): Boolean;
|
||||
// =====================================
|
||||
// Creates a 2DX file through the use of
|
||||
// other functions and procedures, then
|
||||
// saves it.
|
||||
// -------------------------------------
|
||||
begin
|
||||
Create2DX(Path_File);
|
||||
DX2DXStream.SaveToFile(Path_File);
|
||||
DX2DXStream.Free;
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function Create2DX(Path_File: String): Boolean;
|
||||
// ====================================
|
||||
// Generates a .2dx combined audio file
|
||||
// from the currently loaded BMS, and
|
||||
// keeps the data stream in memory.
|
||||
// ------------------------------------
|
||||
const
|
||||
TwoDX9: Array[1..4] of Char = '2DX9';
|
||||
HeaderSize: Integer = 24;
|
||||
Unknown1: Array[1..4] of Char = '02'#255#255; // Maybe L/R Volume?
|
||||
Unknown2: Array[1..4] of Char = #64#0#1#0; // WAV format info?
|
||||
Unknown3: Array[1..4] of Char = #0#0#0#0; // No idea...
|
||||
|
||||
var
|
||||
i, TotalWavs,
|
||||
CurrentOffset,
|
||||
WavSize: Integer;
|
||||
Wav: TFileStream;
|
||||
L: Word;
|
||||
Text: String;
|
||||
begin
|
||||
|
||||
DX2DXStream := TMemoryStream.Create;
|
||||
|
||||
Result := False; // At least 1 WAV is
|
||||
TotalWavs := GetLastWavNumber; // needed for 2dx file
|
||||
if TotalWavs = 0 then exit; // creation.
|
||||
|
||||
|
||||
// ======================================
|
||||
// Create and write the .2dx header here.
|
||||
// --------------------------------------
|
||||
|
||||
Text := copy(Artist, 1, 16); // First 16 bytes of a 2dx
|
||||
L := Length(Text); // file are ignored.
|
||||
if L < 16 then Text := Text + DupChar(16 - L, 0); // BMSto1 will use the BMS
|
||||
DX2DXStream.WriteBuffer(Text[1], 16); // Artist's name here.
|
||||
|
||||
TotalWavs := GetLastWavNumber; // Location of the first
|
||||
CurrentOffset := 72 + TotalWavs * 4; // keysound is next.
|
||||
DX2DXStream.WriteBuffer(CurrentOffset, 4); // Its location is usually
|
||||
// Header Size + number of
|
||||
// 4-byte WAV entries.
|
||||
|
||||
DX2DXStream.WriteBuffer(TotalWavs, 4); // Write the total number
|
||||
// of WAV sounds.
|
||||
|
||||
Text := copy(TitleOnly(Title), 1, 48); // Next 48 bytes are also
|
||||
L := Length(Text); // ignored.
|
||||
if L < 48 then Text := Text + DupChar(48 - L, 0); // The BMS Title will be
|
||||
DX2DXStream.WriteBuffer(Text[1], 48); // entered here.
|
||||
|
||||
|
||||
// ================================
|
||||
// Now for the .2dx WAV entry list.
|
||||
// --------------------------------
|
||||
for i := 1 to TotalWavs do
|
||||
begin
|
||||
DX2DXStream.WriteBuffer(CurrentOffset, 4); // In a 2dx file,
|
||||
WavSize := FileSize2(NoFile(Path_File) + Wav_Name[i]); // WAV files have 24
|
||||
inc(CurrentOffset, WavSize + 24); // extra bytes added.
|
||||
end;
|
||||
|
||||
|
||||
// ================================
|
||||
// Now for the WAV files + headers.
|
||||
// --------------------------------
|
||||
for i := 1 to TotalWavs do
|
||||
begin
|
||||
|
||||
DX2DXStream.WriteBuffer(TwoDX9[1], 4); // Header begins with
|
||||
DX2DXStream.WriteBuffer(HeaderSize, 4); // '2DX9'. Size of
|
||||
// header is 24 bytes
|
||||
|
||||
WavSize := FileSize2(NoFile(Path_File) + Wav_Name[i]); // Actual WAV file
|
||||
DX2DXStream.WriteBuffer(WavSize, 4); // size (no header)
|
||||
|
||||
DX2DXStream.WriteBuffer(Unknown1, 4); // Volume/pan?
|
||||
DX2DXStream.WriteBuffer(Unknown2, 4); // WAV Format info?
|
||||
DX2DXStream.WriteBuffer(Unknown3, 4); // Null?
|
||||
|
||||
Wav := TFileStream.Create(NoFile(Path_File) + Wav_Name[i], fmOpenRead);
|
||||
DX2DXStream.CopyFrom(Wav, WavSize);
|
||||
Wav.Free;
|
||||
|
||||
end;
|
||||
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
end.
|
||||
@@ -0,0 +1,271 @@
|
||||
unit Utils;
|
||||
// =================================================
|
||||
// Utils.pas
|
||||
// Created 2007.02.27
|
||||
// Updated 2007.04.05 - Fixed a NoFile bug.
|
||||
// Updated 2007.04.07 - Added DupChar and FileSize2.
|
||||
// Re-wrote IsIn function.
|
||||
//
|
||||
// A set of various often-used routines.
|
||||
// -------------------------------------------------
|
||||
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
SysUtils;
|
||||
|
||||
function DupChar(Amount: Word; Value: Byte): String;
|
||||
function FileSize2(Path_File: String): Integer;
|
||||
function HexToInt(HexNum: String): Integer;
|
||||
function IntToBool(i: Integer): Boolean;
|
||||
function IsIn(Text1, Text2: String): Boolean;
|
||||
function NoExt(Text: String): String;
|
||||
function NoFile(Text: String): String;
|
||||
function NoPath(Text: String): String;
|
||||
function TitleOnly(Title: String): String;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function DupChar(Amount: Word; Value: Byte): String;
|
||||
// ===========================================
|
||||
// Creates a text string consisting of a given
|
||||
// ASCII value repeated a specified number of
|
||||
// times.
|
||||
// -------------------------------------------
|
||||
var
|
||||
i: Byte;
|
||||
begin
|
||||
Result := '';
|
||||
for i := 1 to Amount do
|
||||
Result := Result + Char(Value);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function FileSize2(Path_File: String): Integer;
|
||||
// ===============================
|
||||
// An easier way to call FileSize.
|
||||
// -------------------------------
|
||||
var
|
||||
F: File;
|
||||
begin
|
||||
AssignFile(F, Path_File);
|
||||
Reset(F, 1);
|
||||
Result := FileSize(F);
|
||||
CloseFile(f);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function HexToInt(HexNum: string): Integer;
|
||||
// ==============================================
|
||||
// Converts a Hexadecimal number to decimal form.
|
||||
// ----------------------------------------------
|
||||
begin
|
||||
Result := StrToInt('$' + HexNum);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function IntToBool(i: Integer): Boolean;
|
||||
// ============================================
|
||||
// Converts a number into a boolean expression.
|
||||
// --------------------------------------------
|
||||
begin
|
||||
if i <> 0 then Result := True
|
||||
else Result := False;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function IsIn(Text1, Text2: String): Boolean;
|
||||
// =============================================
|
||||
// Checks to see if the letter/word/phrase Text2
|
||||
// exists somewhere in Text1.
|
||||
// ---------------------------------------------
|
||||
var
|
||||
Amount_Similar, i1, i2, L1, L2: Word;
|
||||
begin
|
||||
|
||||
Result := False;
|
||||
L1 := Length(Text1);
|
||||
L2 := Length(Text2);
|
||||
|
||||
if (L1 = 0) or // Search fails with Zero-length strings.
|
||||
(L2 = 0) or //
|
||||
(L2 > L1) then exit; // Also fails if the text to look for
|
||||
// is larger than the text to look in.
|
||||
|
||||
for i1 := 0 to L1 - L2 do
|
||||
begin
|
||||
Amount_Similar := 0;
|
||||
|
||||
for i2 := 1 to L2 do
|
||||
if Text1[i1 + i2] = Text2[i2] then
|
||||
inc(Amount_Similar);
|
||||
|
||||
if Amount_Similar = L2 then
|
||||
Result := True;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function NoExt(Text: String): String;
|
||||
// ============================================
|
||||
// Removes a file extension from a text string.
|
||||
//
|
||||
// For example, NoExt('C:\PATH\FILE.TXT')
|
||||
// would return C:\PATH\FILE
|
||||
// --------------------------------------------
|
||||
var
|
||||
i: Byte;
|
||||
begin
|
||||
i := Length(Text);
|
||||
while (i > 1) and (Text[i] <> '.') and (Text[i] <> '\') do dec(i);
|
||||
if (i > 1) and (Text[i] <> '\') then Result := copy(Text, 1, i - 1)
|
||||
else Result := Text; // No extension found!
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function NoFile(Text: String): String;
|
||||
// =========================================
|
||||
// Removes the file name from a text string.
|
||||
//
|
||||
// For example, NoFile('C:\PATH\FILE.TXT')
|
||||
// would return C:\PATH\
|
||||
// -----------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
i := Length(Text);
|
||||
while (i >= 1) and (Text[i] <> '\') do dec(i);
|
||||
if i >= 1 then Result := copy(Text, 1, i)
|
||||
else Result := ''; // No path found. Erase it!
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function NoPath(Text: String): String;
|
||||
// =======================================
|
||||
// Removes the path from a text string.
|
||||
// For example, NoPath('C:\PATH\FILE.TXT')
|
||||
// would return FILE.TXT
|
||||
// ----------------------------------------
|
||||
var
|
||||
i: Word;
|
||||
begin
|
||||
i := Length(Text);
|
||||
while (i > 1) and (Text[i] <> '\') do dec(i);
|
||||
if i > 1 then Result := copy(Text, i + 1, Length(Text) - i)
|
||||
else Result := Text; // Already file-only!
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function TitleOnly(Title: String): String;
|
||||
// =====================================================
|
||||
// Almost every BMS song contains multiple difficulties.
|
||||
//
|
||||
// As a way to mark the different difficulties, authors
|
||||
// usually add in some text to the title of the song.
|
||||
//
|
||||
// This function attempts to find and remove such text,
|
||||
// to make the song names match a little better.
|
||||
//
|
||||
// This isn't a catch-all, but it's successful on over
|
||||
// 99% of existing BMS songs.
|
||||
//
|
||||
// First it looks for text surrounded by () [] or --.
|
||||
//
|
||||
// Then it checks if the text contains a certain phrase.
|
||||
// If it does, the text starting with and following the
|
||||
// first bracket will be removed from the song title.
|
||||
// -----------------------------------------------------
|
||||
var
|
||||
i, i2: Byte;
|
||||
chr1, chr2: Char;
|
||||
txt: String;
|
||||
RemoveOK: Boolean;
|
||||
begin
|
||||
Result := Title;
|
||||
i2 := Length(Title);
|
||||
i := i2;
|
||||
if i <= 1 then exit;
|
||||
chr2 := Title[i];
|
||||
chr1 := ' ';
|
||||
if chr2 = '-' then chr1 := chr2;
|
||||
if chr2 = ')' then chr1 := '(';
|
||||
if chr2 = ']' then chr1 := '[';
|
||||
if chr1 = ' ' then exit;
|
||||
dec(i);
|
||||
while (i > 1) and (Title[i] <> chr1) do dec(i);
|
||||
if i = 1 then exit;
|
||||
|
||||
txt := UpperCase(copy(Title, i + 1, i2 - (i + 1))); // Get and check the text
|
||||
RemoveOK := False; // between the 2 symbols
|
||||
if IsIn(txt, 'BEGINNER') then RemoveOK := True;
|
||||
if IsIn(txt, 'NORMAL') then RemoveOK := True;
|
||||
if IsIn(txt, 'LIGHT') then RemoveOK := True;
|
||||
if IsIn(txt, 'HYPER') then RemoveOK := True;
|
||||
if IsIn(txt, 'ANOTHER') then RemoveOK := True;
|
||||
if IsIn(txt, '5K') then RemoveOK := True;
|
||||
if IsIn(txt, '7K') then RemoveOK := True;
|
||||
if IsIn(txt, '9K') then RemoveOK := True;
|
||||
if IsIn(txt, 'HARD') then RemoveOK := True;
|
||||
if IsIn(txt, 'EASY') then RemoveOK := True;
|
||||
|
||||
if RemoveOK then Result := TrimRight(copy(Title, 1, i - 1));
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
end.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,286 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
|
||||
{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 00000000000000000000}Cambria Math;}
|
||||
{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||
{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}
|
||||
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||
{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
|
||||
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}
|
||||
{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}
|
||||
{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f153\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
|
||||
{\f151\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f152\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
|
||||
{\f154\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f155\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
|
||||
{\f158\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
|
||||
{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f443\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}
|
||||
{\f441\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;}{\f442\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f444\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f445\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}
|
||||
{\f448\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||
{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
|
||||
{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}
|
||||
{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}
|
||||
{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||
{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
|
||||
{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
|
||||
{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
|
||||
{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
|
||||
{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
|
||||
{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
|
||||
{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;
|
||||
\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;
|
||||
\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{
|
||||
\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033
|
||||
\snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
|
||||
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
|
||||
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033
|
||||
\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\s15\ql \li0\ri0\widctlpar
|
||||
\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0
|
||||
\f2\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext15 \slink16 \ssemihidden \sunhideused \styrsid1316374 HTML Preformatted;}{\*\cs16 \additive \rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20
|
||||
\sbasedon10 \slink15 \slocked \ssemihidden \styrsid1316374 HTML Preformatted Char;}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid1316374}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1
|
||||
\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Anthony}{\operator Anthony}{\creatim\yr2007\mo8\dy5\hr14\min15}{\revtim\yr2007\mo8\dy5\hr14\min15}{\version2}{\edmins0}{\nofpages2}{\nofwords162}{\nofchars928}{\nofcharsws1088}{\vern32889}}
|
||||
{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect
|
||||
\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
|
||||
\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1
|
||||
\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
|
||||
\asianbrkrule\rsidroot1316374\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0
|
||||
{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang
|
||||
{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang
|
||||
{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
|
||||
\pard\plain \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1316374 \rtlch\fcs1
|
||||
\af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
\par ::
|
||||
\par :: EditOut Ver. 2.10
|
||||
\par ::
|
||||
\par :: Software for editing music information in eout
|
||||
\par ::
|
||||
\par :::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
\par
|
||||
\par Included files:
|
||||
\par EditOut.jar
|
||||
\par swt.jar
|
||||
\par swt-win32-3236.dll
|
||||
\par split/1.SPLIT
|
||||
\par eout.csv
|
||||
\par
|
||||
\par To use:
|
||||
\par Double click on EditOut.jar if you have JRE5 or above installed on Windows.
|
||||
\par (* Confirmed to work in JDK6u2 + Windows XP sp2)
|
||||
\par
|
||||
\par Operation:
|
||||
\par CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u19968\'88\'ea\u25324\'8a\'87\u12452\'83\'43\u12531\'83\'93\u12509\'83\'7c\u12540\'81\'5b\u12488\'83\'67\u12399
|
||||
\'82\'cd\u20184\'95\'74\u23646\'91\'ae\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 eout.csv}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374
|
||||
\loch\af11\hich\af11\dbch\f11 \uc2\u12434\'82\'f0\u-30325\'8c\'a9\u12394\'82\'c8\u12364\'82\'aa\u12425\'82\'e7\u-26619\'8d\'80\u30446\'96\'da\u22475\'96\'84\u12417\'82\'df\u12390\'82\'c4\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290
|
||||
\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12452\'83\'43\u12531\'83\'93\u12509\'83\'7c\u12540\'81\'5b\u12488\'83\'67\u21069\'91\'4f\u12395\'82\'c9}{
|
||||
\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-30163\'90\'dd\u23450\'92\'e8\u12424
|
||||
\'82\'e6\u12426\'82\'e8\u20986\'8f\'6f\u21147\'97\'cd\u12375\'82\'b5\u12383\'82\'bd\u12356\'82\'a2}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 eout}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12398\'82\'cc\u12496\'83\'6f\u12540\'81\'5b\u12472\'83\'57\u12519\'83\'87\u12531\'83\'93\u12434\'82\'f0\u-28552\'91\'49\u25246\'91\'f0\u12375\'82\'b5
|
||||
\u12390\'82\'c4\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12501\'83\'74\u12457\'83\'48\u12523\'83\'8b
|
||||
\loch\af11\hich\af11\dbch\f11 \u12480\'83\'5f\u12398\'82\'cc\u-27056\'8c\'c0\u30028\'8a\'45\u12434\'82\'f0\u-27036\'8f\'9c\u21435\'8b\'8e\u12375\'82\'b5\u12383\'82\'bd\u12398\'82\'cc\u12391\'82\'c5\u22909\'8d\'44\u12365\'82\'ab\u12394\'82\'c8\u30058
|
||||
\'94\'d4\u21495\'8d\'86\u12395\'82\'c9\u-28675\'92\'c7\u21152\'89\'c1\u21487\'89\'c2\u-32515\'94\'5c\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12524\'83\'8c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u-30163\'90\'dd\u23450\'92\'e8\u12363\'82\'a9\u12425
|
||||
\'82\'e7\u25313\'8a\'67\u24373\'92\'a3\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12391\'82\'c5\u26032\'90\'56\u12383\'82\'bd\u12394\'82\'c8\u27005\'8a\'79\u26354\'8b\'c8\u12398\'82\'cc\u23450\'92\'e8\u32681\'8b\'60\u12418\'82\'e0\u21487
|
||||
\'89\'c2\u-32515\'94\'5c\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-28666\'8b\'74\u-30335\'97\'76\u26395\'96\'5d\u-230\'81\'46}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par HS}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12398\'82\'cc\u12514\'83\'82\u12540\'81\'5b\u12489\'83\'68\u12479\'83\'5e\u12452\'83\'43\u12503\'83\'76\u-225
|
||||
\'81\'48}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 (104-105)}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12289\'81\'41\u12512
|
||||
\'83\'80\u12540\'81\'5b\u12499\'83\'72\u12540\'81\'5b\u12514\'83\'82\u12540\'81\'5b\u12489\'83\'68\u-225\'81\'48}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 (152-153)}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12399\'82\'cd\u20206\'89\'bc\u21517\'96\'bc\u12391\'82\'c5\u12377\'82\'b7\u12289\'81\'41\u29992\'97\'70\u-28652\'93\'72\u12364\'82\'aa\u20998\'95\'aa
|
||||
\u12363\'82\'a9\u12425\'82\'e7\u12394\'82\'c8\u12356\'82\'a2\u12398\'82\'cc\u12391\'82\'c5\u24773\'8f\'ee\u22577\'95\'f1\u19979\'89\'ba\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u21508\'8a\'65\u-26619\'8d\'80\u30446\'96\'da\u21517\'96\'bc\u12398\'82\'cc\u12418\'82\'e0\u12387\'82\'c1\u12392
|
||||
\'82\'c6\u-32145\'97\'c7\u12356\'82\'a2\u-26619\'8d\'80\u30446\'96\'da\u21517\'96\'bc\u26696\'88\'c4\u12434\'82\'f0\u21215\'95\'e5\u-26938\'8f\'57\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par Bugs, etc:
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-26618\'8f\'87\u27425\'8e\'9f\u23550\'91\'ce\u24540\'89\'9e\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12398
|
||||
\'82\'cc\u12391\'82\'c5\u12473\'83\'58\u12524\'83\'8c\u12395\'82\'c9\u-30335\'97\'76\u26395\'96\'5d}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 age}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12390\'82\'c4\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par Misc. Notes:
|
||||
\par GOLD}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12461\'83\'4c\u12508\'83\'7b\u12531\'83\'93\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par I want to analyze data from 8th Style and below.
|
||||
\par
|
||||
\par History:
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 >>748}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12373\'82\'b3\u12435\'82\'f1\u12398\'82\'cc\u24076\'8a\'f3\u26395\'96\'5d\u27231\'8b\'40\u-32515\'94\'5c\u-28675\'92\'c7\u21152
|
||||
\'89\'c1\u-248\'81\'69}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 HS}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12394\'82\'c8
|
||||
\u12425\'82\'e7}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 1300}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-162\'81\'60
|
||||
\u12418\'82\'e0\u20351\'8e\'67\u29992\'97\'70\u21487\'89\'c2\u-32515\'94\'5c\u12395\'82\'c9\u12289\'81\'41}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 9999}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12414\'82\'dc\u12391\'82\'c5\u30906\'8a\'6d\u-30067\'94\'46\u28168\'8d\'cf\u12415\'82\'dd\u-247\'81\'6a}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u12524\'83\'8c\u12452\'83\'43\u12516\'83\'84\u12540\'81\'5b\u-30163\'90\'dd\u23450\'92\'e8\u12398
|
||||
\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 7}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12392\'82\'c6}{\rtlch\fcs1
|
||||
\af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 8}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12364\'82\'aa\u20837\'93\'fc\u12428\'82\'ea\u22793
|
||||
\'95\'cf\u12431\'82\'ed\u12387\'82\'c1\u12390\'82\'c4\u12383\'82\'bd\u12398\'82\'cc\u12434\'82\'f0\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u-29860\'95\'88\u-26782\'96\'ca\u23450\'92\'e8\u32681\'8b\'60\u12364\'82\'aa\u12468\'83\'53\u12511
|
||||
\'83\'7e\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u27531\'8e\'63\u12427\'82\'e9\u12398\'82\'cc\u12434\'82\'f0\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45\u26354\'8b\'c8\u-30163\'90\'dd\u23450\'92\'e8\u-237\'82\'52\u12398\'82\'cc\u-29860\'95\'88\u-26782
|
||||
\'96\'ca\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12398\'82\'cc\u21517\'96\'bc\u31216\'8f\'cc\u22793\'95\'cf\u26356\'8d\'58\u-248\'81\'69}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 ->2dx}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u-247\'81\'6a}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u20445\'95\'db\u23384\'91\'b6\u26178\'8e\'9e\u12395\'82\'c9\u22833\'8e\'b8\u25943\'94\'73\u12377
|
||||
\'82\'b7\u12427\'82\'e9\u21839\'96\'e2\u-26548\'91\'e8\u12398\'82\'cc\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 HS}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 DD}{\rtlch\fcs1 \af11\afs20
|
||||
\ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 GD}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12398\'82\'cc\u20027\'8e\'e5\u-30335\'97\'76\u-237\'82\'52\u31278\'8e\'ed\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374 eout}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12395\'82\'c9\u23550\'91\'ce\u24540\'89\'9e}{\rtlch\fcs1 \af2\afs20
|
||||
\ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 AC6th}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12473\'83\'58\u12524\'83\'8c\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 >>592}{
|
||||
\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12373\'82\'b3\u12435\'82\'f1\u-32765\'8d\'6c\u26696\'88\'c4\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374 CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u19968\'88\'ea\u25324\'8a\'87\u12452\'83\'43\u12531\'83\'93\u12509
|
||||
\'83\'7c\u12540\'81\'5b\u12488\'83\'67\u12395\'82\'c9\u23550\'91\'ce\u24540\'89\'9e}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u20104\'97\'5c\u32004\'96\'f1\u-26600\'97\'cc\u22495\'88\'e6\u12395\'82\'c9\u12388\'82\'c2\u12356
|
||||
\'82\'a2\u12390\'82\'c4\u25805\'91\'80\u20316\'8d\'ec\u19981\'95\'73\u-30335\'97\'76\u12398\'82\'cc\u12383\'82\'bd\u12417\'82\'df\u20840\'91\'53\u25764\'93\'50\u24259\'94\'70}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u12354\'82\'a0\u12427\'82\'e9\u31243\'92\'f6\u24230\'93\'78\u12398\'82\'cc\u-27245\'8a\'d4\u-28587
|
||||
\'88\'e1\u12356\'82\'a2\u12364\'82\'aa\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12383\'82\'bd\u25163\'8e\'e8\u21205\'93\'ae\u32232\'95\'d2\u-26938\'8f\'57\u28168\'8d\'cf\u12415\'82\'dd\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374 eout}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12395\'82\'c9\u23550\'91\'ce\u24540\'89\'9e}{\rtlch\fcs1 \af2\afs20
|
||||
\ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u21517\'96\'bc\u21069\'91\'4f\u12434\'82\'f0\u20184\'95\'74\u12369\'82\'af\u12390\'82\'c4\u20445
|
||||
\'95\'db\u23384\'91\'b6\u12434\'82\'f0\u-28675\'92\'c7\u21152\'89\'c1}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u21508\'8a\'65\u31278\'8e\'ed\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u20869\'93\'e0\loch\af11\hich\af11\dbch\f11 \u-28440\'95\'94\u12467\'83\'52\u12540\'81\'5b\u12489
|
||||
\'83\'68\u26368\'8d\'c5\u-28567\'93\'4b\u21270\'89\'bb}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45\u21508\'8a\'65\u31278\'8e\'ed\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u19981\'95\'73\u-30335\'97\'76\u12394\'82\'c8\u-26619\'8d\'80\u30446\'96\'da\u12398\'82\'cc\u21066
|
||||
\'8d\'ed\u-27036\'8f\'9c}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45\u21508\'8a\'65\u31278\'8e\'ed\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u26032\'90\'56\u-30321\'8b\'4b\u-28675\'92\'c7\u21152\'89\'c1\u12364\'82\'aa\u12391\'82\'c5\u12365
|
||||
\'82\'ab\u12394\'82\'c8\u12363\'82\'a9\u12387\'82\'c1\u12383\'82\'bd\u20214\'8c\'8f}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u26354\'8b\'c8\u-28675\'92\'c7\u21152\'89\'c1\u24460\'8c\'e3\u12484\'83\'63\u12522\'83\'8a\u12540
|
||||
\'81\'5b\u12395\'82\'c9\u21517\'96\'bc\u21069\'91\'4f\u12364\'82\'aa\u20986\'8f\'6f\u12394\'82\'c8\u12363\'82\'a9\u12387\'82\'c1\u12383\'82\'bd\u20214\'8c\'8f}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u-30616\'95\'5c\u31034\'8e\'a6\u12364\'82\'aa\u12362\'82\'a8\u12363\'82\'a9\u12375\'82\'b5\u12363
|
||||
\'82\'a9\u12387\'82\'c1\u12383\'82\'bd\u20214\'8c\'8f}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid1316374
|
||||
\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8
|
||||
72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7
|
||||
2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b
|
||||
44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7
|
||||
065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000
|
||||
00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08
|
||||
84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc
|
||||
52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353
|
||||
bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468
|
||||
656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c
|
||||
070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7
|
||||
29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65
|
||||
312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8
|
||||
a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04
|
||||
98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c
|
||||
94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471
|
||||
7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671
|
||||
9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1
|
||||
e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5
|
||||
193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1
|
||||
17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2
|
||||
8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6
|
||||
6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a
|
||||
668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847
|
||||
bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e
|
||||
16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b
|
||||
5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0
|
||||
8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2
|
||||
c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966
|
||||
0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b
|
||||
7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb
|
||||
9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0
|
||||
088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf
|
||||
8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26
|
||||
ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0
|
||||
28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6
|
||||
345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93
|
||||
b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30
|
||||
254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74
|
||||
68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24
|
||||
51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198
|
||||
720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528
|
||||
a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000
|
||||
000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000
|
||||
002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468
|
||||
656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000
|
||||
00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000
|
||||
00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000}
|
||||
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
|
||||
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
|
||||
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
|
||||
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
|
||||
{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
|
||||
\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;
|
||||
\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;
|
||||
\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000
|
||||
4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000
|
||||
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f00000000000000000000000020cc
|
||||
61a28cd7c701feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000105000000000000}}
|
||||
@@ -0,0 +1,44 @@
|
||||
EditOut -2chan Sucks Edition- BETA
|
||||
v1.0 for bemaniso
|
||||
--------------------------------------
|
||||
Files found on 2ch by musicboy
|
||||
Translations done by Soveryshiny
|
||||
Translations Added to code by Anthony
|
||||
Program Recompiled by infamouspat
|
||||
Eout Encrypter/Decrypter by Tau
|
||||
--------------------------------------
|
||||
Included in this package:
|
||||
|
||||
decrypt.exe - eout.bin decrypter
|
||||
encrypt.exe - eout.bin encrypter
|
||||
eout.csv - Matser Song List (missing currently)
|
||||
eoutEdit.exe - eout Editor execulatable
|
||||
eoutEdit.jar - eout Editor jar file
|
||||
readme.txt - readme
|
||||
readme-2ch.rtf - original 2chan readme
|
||||
swt-win32-3236.dll - dll file required for eout Editor
|
||||
--------------------------------------
|
||||
|
||||
Basic uses:
|
||||
|
||||
This program has not undergone much testing as we are still unaware
|
||||
of it's full potential. We have currently got it to change some
|
||||
difficulties on HS songs, but we don't really know what else it can
|
||||
do. It potentially has the ability to Add songs to IIDX AC mixes.
|
||||
From what we can tell it can currently only save proper eouts in
|
||||
HS format. We have not been able to get it to work properly with DD
|
||||
or GOLD. We have also not been able to try to add older songs as the
|
||||
Master Songlist CSV file (eout.csv) was missing from the 2ch rar we
|
||||
found. If anyone finds the eout.csv please send it to us. If anyone
|
||||
has any luck with this program please post it in this thread:
|
||||
|
||||
http://bemaniso.ws/forums.php?action=viewtopic&topicid=9206
|
||||
|
||||
To use the program, you must first decrypt the eout.bin from the game:
|
||||
decrypt eout.bin eout.dec
|
||||
|
||||
You then run that dec file into eoutEdit.exe(.jar) and edit as needed.
|
||||
Afterwards you must re-encrypt the eout.dec file:
|
||||
encrypt eout.dec eout.bin
|
||||
|
||||
-Anthony
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,111 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define ONE_BILLION 1000000000
|
||||
#define IDX_CURRENT_KEY 55
|
||||
#define IDX_COUNTER 56
|
||||
#define IDX_LAST 57
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
static void mix(int *state)
|
||||
{
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
for (i = 1 ; i < 25 ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i + 31];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
|
||||
for (i = 25 ; i <= IDX_CURRENT_KEY ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i - 24];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_state(int *state, byte src_byte)
|
||||
{
|
||||
int src;
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
src = src_byte;
|
||||
tmp = 1;
|
||||
|
||||
state[IDX_CURRENT_KEY] = src;
|
||||
|
||||
for (i = 0x15 ; i <= 0x46E ; i += 0x15) {
|
||||
src -= tmp;
|
||||
state[i % 0x37] = tmp;
|
||||
tmp = src;
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
src = state[i % 0x37];
|
||||
}
|
||||
|
||||
mix(state);
|
||||
mix(state);
|
||||
mix(state);
|
||||
|
||||
state[IDX_COUNTER] = 0x37;
|
||||
}
|
||||
|
||||
static byte produce_key(int *state)
|
||||
{
|
||||
int counter;
|
||||
|
||||
counter = state[IDX_COUNTER] + 1;
|
||||
state[IDX_COUNTER] = counter;
|
||||
|
||||
if (counter > 0x37) {
|
||||
mix(state);
|
||||
counter = 1;
|
||||
}
|
||||
|
||||
state[IDX_COUNTER] = counter;
|
||||
return state[counter];
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const byte key[] = {
|
||||
0x55, 0x37, 0x9F, 0xCC, 0xE3, 0xA7, 0x7D, 0x99,
|
||||
0xDD, 0xAA, 0xBB, 0xCF, 0xFC, 0x67, 0x43, 0x17
|
||||
};
|
||||
|
||||
int state[IDX_LAST];
|
||||
int quo;
|
||||
int rem;
|
||||
int i;
|
||||
byte b;
|
||||
|
||||
/* Setup */
|
||||
i = 0;
|
||||
memset(state, 0, sizeof(state));
|
||||
|
||||
/* Descramble */
|
||||
while (!feof(stdin)) {
|
||||
quo = i / 0x10;
|
||||
rem = i % 0x10;
|
||||
i++;
|
||||
|
||||
if (rem == 0) update_state(state, key[quo % 0x10]);
|
||||
|
||||
b = getc(stdin);
|
||||
b -= produce_key(state);
|
||||
/* To rescramble an eout.bin, change -= above to += */
|
||||
|
||||
putc(b, stdout);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,111 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define ONE_BILLION 1000000000
|
||||
#define IDX_CURRENT_KEY 55
|
||||
#define IDX_COUNTER 56
|
||||
#define IDX_LAST 57
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
static void mix(int *state)
|
||||
{
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
for (i = 1 ; i < 25 ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i + 31];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
|
||||
for (i = 25 ; i <= IDX_CURRENT_KEY ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i - 24];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_state(int *state, byte src_byte)
|
||||
{
|
||||
int src;
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
src = src_byte;
|
||||
tmp = 1;
|
||||
|
||||
state[IDX_CURRENT_KEY] = src;
|
||||
|
||||
for (i = 0x15 ; i <= 0x46E ; i += 0x15) {
|
||||
src -= tmp;
|
||||
state[i % 0x37] = tmp;
|
||||
tmp = src;
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
src = state[i % 0x37];
|
||||
}
|
||||
|
||||
mix(state);
|
||||
mix(state);
|
||||
mix(state);
|
||||
|
||||
state[IDX_COUNTER] = 0x37;
|
||||
}
|
||||
|
||||
static byte produce_key(int *state)
|
||||
{
|
||||
int counter;
|
||||
|
||||
counter = state[IDX_COUNTER] + 1;
|
||||
state[IDX_COUNTER] = counter;
|
||||
|
||||
if (counter > 0x37) {
|
||||
mix(state);
|
||||
counter = 1;
|
||||
}
|
||||
|
||||
state[IDX_COUNTER] = counter;
|
||||
return state[counter];
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const byte key[] = {
|
||||
0x55, 0x37, 0x9F, 0xCC, 0xE3, 0xA7, 0x7D, 0x99,
|
||||
0xDD, 0xAA, 0xBB, 0xCF, 0xFC, 0x67, 0x43, 0x17
|
||||
};
|
||||
|
||||
int state[IDX_LAST];
|
||||
int quo;
|
||||
int rem;
|
||||
int i;
|
||||
byte b;
|
||||
|
||||
/* Setup */
|
||||
i = 0;
|
||||
memset(state, 0, sizeof(state));
|
||||
|
||||
/* Descramble */
|
||||
while (!feof(stdin)) {
|
||||
quo = i / 0x10;
|
||||
rem = i % 0x10;
|
||||
i++;
|
||||
|
||||
if (rem == 0) update_state(state, key[quo % 0x10]);
|
||||
|
||||
b = getc(stdin);
|
||||
b -= produce_key(state);
|
||||
/* To rescramble an eout.bin, change -= above to += */
|
||||
|
||||
putc(b, stdout);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,111 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define ONE_BILLION 1000000000
|
||||
#define IDX_CURRENT_KEY 55
|
||||
#define IDX_COUNTER 56
|
||||
#define IDX_LAST 57
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
static void mix(int *state)
|
||||
{
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
for (i = 1 ; i < 25 ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i + 31];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
|
||||
for (i = 25 ; i <= IDX_CURRENT_KEY ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i - 24];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_state(int *state, byte src_byte)
|
||||
{
|
||||
int src;
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
src = src_byte;
|
||||
tmp = 1;
|
||||
|
||||
state[IDX_CURRENT_KEY] = src;
|
||||
|
||||
for (i = 0x15 ; i <= 0x46E ; i += 0x15) {
|
||||
src -= tmp;
|
||||
state[i % 0x37] = tmp;
|
||||
tmp = src;
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
src = state[i % 0x37];
|
||||
}
|
||||
|
||||
mix(state);
|
||||
mix(state);
|
||||
mix(state);
|
||||
|
||||
state[IDX_COUNTER] = 0x37;
|
||||
}
|
||||
|
||||
static byte produce_key(int *state)
|
||||
{
|
||||
int counter;
|
||||
|
||||
counter = state[IDX_COUNTER] + 1;
|
||||
state[IDX_COUNTER] = counter;
|
||||
|
||||
if (counter > 0x37) {
|
||||
mix(state);
|
||||
counter = 1;
|
||||
}
|
||||
|
||||
state[IDX_COUNTER] = counter;
|
||||
return state[counter];
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const byte key[] = {
|
||||
0x55, 0x37, 0x9F, 0xCC, 0xE3, 0xA7, 0x7D, 0x99,
|
||||
0xDD, 0xAA, 0xBB, 0xCF, 0xFC, 0x67, 0x43, 0x17
|
||||
};
|
||||
|
||||
int state[IDX_LAST];
|
||||
int quo;
|
||||
int rem;
|
||||
int i;
|
||||
byte b;
|
||||
|
||||
/* Setup */
|
||||
i = 0;
|
||||
memset(state, 0, sizeof(state));
|
||||
|
||||
/* Descramble */
|
||||
while (!feof(stdin)) {
|
||||
quo = i / 0x10;
|
||||
rem = i % 0x10;
|
||||
i++;
|
||||
|
||||
if (rem == 0) update_state(state, key[quo % 0x10]);
|
||||
|
||||
b = getc(stdin);
|
||||
b -= produce_key(state);
|
||||
/* To rescramble an eout.bin, change -= above to += */
|
||||
|
||||
putc(b, stdout);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,446 @@
|
||||
1200 0
|
||||
1201 1
|
||||
1202 2
|
||||
1203 3
|
||||
1204 4
|
||||
1205 5
|
||||
1206 6
|
||||
1207 7
|
||||
1208 8
|
||||
1209 9
|
||||
1210 10
|
||||
1211 11
|
||||
1212 12
|
||||
1213 13
|
||||
1214 14
|
||||
1215 15
|
||||
1216 16
|
||||
1217 17
|
||||
1218 18
|
||||
1219 19
|
||||
1220 20
|
||||
1221 21
|
||||
1222 22
|
||||
1223 23
|
||||
1224 24
|
||||
1225 25
|
||||
1226 26
|
||||
1227 27
|
||||
1228 28
|
||||
1229 29
|
||||
1230 30
|
||||
1231 31
|
||||
1232 32
|
||||
1233 33
|
||||
1234 34
|
||||
1235 35
|
||||
1236 36
|
||||
1237 37
|
||||
1238 38
|
||||
1239 39
|
||||
1240 40
|
||||
1241 41
|
||||
1242 42
|
||||
1243 43
|
||||
1244 44
|
||||
1245 45
|
||||
1246 46
|
||||
1247 47
|
||||
1248 48
|
||||
1249 49
|
||||
1250 50
|
||||
1251 51
|
||||
1101 52
|
||||
1102 53
|
||||
1103 54
|
||||
1104 55
|
||||
1105 56
|
||||
1106 57
|
||||
1107 58
|
||||
1108 59
|
||||
1109 60
|
||||
1110 61
|
||||
1111 62
|
||||
1112 63
|
||||
1113 64
|
||||
1114 65
|
||||
1115 66
|
||||
1116 67
|
||||
1117 68
|
||||
1118 69
|
||||
1119 70
|
||||
1120 71
|
||||
1121 72
|
||||
1122 73
|
||||
1123 74
|
||||
1124 75
|
||||
1125 76
|
||||
1126 77
|
||||
1127 78
|
||||
1128 79
|
||||
1129 80
|
||||
1130 81
|
||||
1131 82
|
||||
1132 83
|
||||
1133 84
|
||||
1134 85
|
||||
1135 86
|
||||
1136 87
|
||||
1137 88
|
||||
1138 89
|
||||
1139 90
|
||||
1140 91
|
||||
1141 92
|
||||
1142 93
|
||||
1143 94
|
||||
1144 95
|
||||
1145 96
|
||||
1146 97
|
||||
1147 98
|
||||
1148 99
|
||||
1149 100
|
||||
1150 101
|
||||
1151 102
|
||||
1152 103
|
||||
1001 104
|
||||
1002 105
|
||||
1003 106
|
||||
1004 107
|
||||
1005 108
|
||||
1006 109
|
||||
1007 110
|
||||
1008 111
|
||||
1009 112
|
||||
1010 113
|
||||
1011 114
|
||||
1012 115
|
||||
1013 116
|
||||
1014 117
|
||||
1015 118
|
||||
1016 119
|
||||
1017 120
|
||||
1018 121
|
||||
1019 122
|
||||
1020 123
|
||||
1021 124
|
||||
1022 125
|
||||
1023 126
|
||||
1024 127
|
||||
1025 128
|
||||
1026 129
|
||||
1027 130
|
||||
1028 131
|
||||
1029 132
|
||||
1030 133
|
||||
1031 134
|
||||
1032 135
|
||||
1033 136
|
||||
1034 137
|
||||
1035 138
|
||||
1036 139
|
||||
1037 140
|
||||
1038 141
|
||||
1039 142
|
||||
1040 143
|
||||
1041 144
|
||||
1042 145
|
||||
1043 146
|
||||
1044 147
|
||||
1045 148
|
||||
1046 149
|
||||
1047 150
|
||||
1048 151
|
||||
1049 152
|
||||
1050 153
|
||||
1051 154
|
||||
1052 155
|
||||
1053 156
|
||||
1054 157
|
||||
0900 158
|
||||
0901 159
|
||||
0902 160
|
||||
0903 161
|
||||
0904 162
|
||||
0905 163
|
||||
0906 164
|
||||
0907 165
|
||||
0908 166
|
||||
0909 167
|
||||
0910 168
|
||||
0911 169
|
||||
0912 170
|
||||
0913 171
|
||||
0914 172
|
||||
0915 173
|
||||
0916 174
|
||||
0917 175
|
||||
0918 176
|
||||
0919 177
|
||||
0920 178
|
||||
0921 179
|
||||
0922 180
|
||||
0923 181
|
||||
0924 182
|
||||
0925 183
|
||||
0926 184
|
||||
0927 185
|
||||
0928 186
|
||||
0929 187
|
||||
0930 188
|
||||
0931 189
|
||||
0932 190
|
||||
0933 191
|
||||
0934 192
|
||||
0935 193
|
||||
0936 194
|
||||
0937 195
|
||||
0938 196
|
||||
0939 197
|
||||
0940 198
|
||||
0941 199
|
||||
0942 200
|
||||
0943 201
|
||||
0944 202
|
||||
0945 203
|
||||
0946 204
|
||||
0947 205
|
||||
0948 206
|
||||
0949 207
|
||||
0950 208
|
||||
0951 209
|
||||
0952 210
|
||||
0953 211
|
||||
0954 212
|
||||
0955 213
|
||||
0956 214
|
||||
0957 215
|
||||
0958 216
|
||||
0959 217
|
||||
0800 218
|
||||
0801 219
|
||||
0802 220
|
||||
0803 221
|
||||
0804 222
|
||||
0805 223
|
||||
0806 224
|
||||
0807 225
|
||||
0808 226
|
||||
0809 227
|
||||
0810 228
|
||||
0811 229
|
||||
0812 230
|
||||
0813 231
|
||||
0814 232
|
||||
0815 233
|
||||
0816 234
|
||||
0817 235
|
||||
0818 236
|
||||
0819 237
|
||||
0820 238
|
||||
0821 239
|
||||
0822 240
|
||||
0823 241
|
||||
0824 242
|
||||
0825 243
|
||||
0826 244
|
||||
0827 245
|
||||
0828 246
|
||||
0829 247
|
||||
0830 248
|
||||
0831 249
|
||||
0832 250
|
||||
0833 251
|
||||
0834 252
|
||||
0835 253
|
||||
0836 254
|
||||
0837 255
|
||||
0838 256
|
||||
0839 257
|
||||
0840 258
|
||||
0841 259
|
||||
0842 260
|
||||
0843 261
|
||||
0844 262
|
||||
0845 263
|
||||
0846 264
|
||||
0847 265
|
||||
0848 266
|
||||
0849 267
|
||||
0700 268
|
||||
0701 269
|
||||
0702 270
|
||||
0703 271
|
||||
0704 272
|
||||
0705 273
|
||||
0706 274
|
||||
0707 275
|
||||
0708 276
|
||||
0709 277
|
||||
0710 278
|
||||
0711 279
|
||||
0712 280
|
||||
0713 281
|
||||
0714 282
|
||||
0715 283
|
||||
0716 284
|
||||
0717 285
|
||||
0718 286
|
||||
0719 287
|
||||
0720 288
|
||||
0721 289
|
||||
0722 290
|
||||
0723 291
|
||||
0724 292
|
||||
0725 293
|
||||
0726 294
|
||||
0727 295
|
||||
0728 296
|
||||
0729 297
|
||||
0730 298
|
||||
0731 299
|
||||
0732 300
|
||||
0733 301
|
||||
0734 302
|
||||
0735 303
|
||||
0736 304
|
||||
0737 305
|
||||
0738 306
|
||||
0739 307
|
||||
0600 308
|
||||
0601 309
|
||||
0602 310
|
||||
0603 311
|
||||
0604 312
|
||||
0605 313
|
||||
0606 314
|
||||
0607 315
|
||||
0608 316
|
||||
0609 317
|
||||
0610 318
|
||||
0611 319
|
||||
0612 320
|
||||
0613 321
|
||||
0614 322
|
||||
0615 323
|
||||
0616 324
|
||||
0617 325
|
||||
0618 326
|
||||
0619 327
|
||||
0620 328
|
||||
0621 329
|
||||
0622 330
|
||||
0623 331
|
||||
0624 332
|
||||
0625 333
|
||||
0626 334
|
||||
0627 335
|
||||
0628 336
|
||||
0629 337
|
||||
0630 338
|
||||
0500 339
|
||||
0501 340
|
||||
0502 341
|
||||
0503 342
|
||||
0504 343
|
||||
0505 344
|
||||
0506 345
|
||||
0507 346
|
||||
0508 347
|
||||
0509 348
|
||||
0510 349
|
||||
0511 350
|
||||
0512 351
|
||||
0513 352
|
||||
0514 353
|
||||
0515 354
|
||||
0516 355
|
||||
0517 356
|
||||
0518 357
|
||||
0519 358
|
||||
0520 359
|
||||
0521 360
|
||||
0522 361
|
||||
0523 362
|
||||
0524 363
|
||||
0525 364
|
||||
0539 365
|
||||
0400 366
|
||||
0401 367
|
||||
0402 368
|
||||
0403 369
|
||||
0404 370
|
||||
0405 371
|
||||
0406 372
|
||||
0407 373
|
||||
0408 374
|
||||
0409 375
|
||||
0410 376
|
||||
0411 377
|
||||
0412 378
|
||||
0413 379
|
||||
0414 380
|
||||
0415 381
|
||||
0416 382
|
||||
0417 383
|
||||
0418 384
|
||||
0419 385
|
||||
0420 386
|
||||
0421 387
|
||||
0422 388
|
||||
0423 389
|
||||
0424 390
|
||||
0425 391
|
||||
0426 392
|
||||
0427 393
|
||||
0428 394
|
||||
0494 395
|
||||
0300 396
|
||||
0301 397
|
||||
0302 398
|
||||
0303 399
|
||||
0304 400
|
||||
0305 401
|
||||
0306 402
|
||||
0307 403
|
||||
0308 404
|
||||
0309 405
|
||||
0310 406
|
||||
0311 407
|
||||
0312 408
|
||||
0313 409
|
||||
0314 410
|
||||
0315 411
|
||||
0316 412
|
||||
0200 413
|
||||
0201 414
|
||||
0202 415
|
||||
0203 416
|
||||
0204 417
|
||||
0205 418
|
||||
0206 419
|
||||
0207 420
|
||||
0208 421
|
||||
0209 422
|
||||
0210 423
|
||||
0211 424
|
||||
0212 425
|
||||
0213 426
|
||||
0214 427
|
||||
0100 428
|
||||
0101 429
|
||||
0102 430
|
||||
0103 431
|
||||
0104 432
|
||||
0105 433
|
||||
0106 434
|
||||
0107 435
|
||||
0108 436
|
||||
0109 437
|
||||
0110 438
|
||||
0111 439
|
||||
0112 440
|
||||
0113 441
|
||||
0114 442
|
||||
0115 443
|
||||
0116 444
|
||||
0117 445
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 326 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 351 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 346 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 419 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 568 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 563 KiB |
@@ -0,0 +1,286 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
|
||||
{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 00000000000000000000}Cambria Math;}
|
||||
{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||
{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}
|
||||
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||
{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
|
||||
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}
|
||||
{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}
|
||||
{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f153\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
|
||||
{\f151\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f152\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
|
||||
{\f154\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f155\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
|
||||
{\f158\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
|
||||
{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f443\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}
|
||||
{\f441\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;}{\f442\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f444\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f445\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}
|
||||
{\f448\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||
{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
|
||||
{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}
|
||||
{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}
|
||||
{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||
{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
|
||||
{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
|
||||
{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
|
||||
{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
|
||||
{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
|
||||
{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
|
||||
{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;
|
||||
\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;
|
||||
\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{
|
||||
\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033
|
||||
\snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
|
||||
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
|
||||
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033
|
||||
\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\s15\ql \li0\ri0\widctlpar
|
||||
\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0
|
||||
\f2\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext15 \slink16 \ssemihidden \sunhideused \styrsid1316374 HTML Preformatted;}{\*\cs16 \additive \rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20
|
||||
\sbasedon10 \slink15 \slocked \ssemihidden \styrsid1316374 HTML Preformatted Char;}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid1316374}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1
|
||||
\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Anthony}{\operator Anthony}{\creatim\yr2007\mo8\dy5\hr14\min15}{\revtim\yr2007\mo8\dy5\hr14\min15}{\version2}{\edmins0}{\nofpages2}{\nofwords162}{\nofchars928}{\nofcharsws1088}{\vern32889}}
|
||||
{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect
|
||||
\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
|
||||
\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1
|
||||
\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
|
||||
\asianbrkrule\rsidroot1316374\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0
|
||||
{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang
|
||||
{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang
|
||||
{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
|
||||
\pard\plain \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1316374 \rtlch\fcs1
|
||||
\af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
\par ::
|
||||
\par :: EditOut Ver. 2.10
|
||||
\par ::
|
||||
\par :: Software for editing music information in eout
|
||||
\par ::
|
||||
\par :::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
\par
|
||||
\par Included files:
|
||||
\par EditOut.jar
|
||||
\par swt.jar
|
||||
\par swt-win32-3236.dll
|
||||
\par split/1.SPLIT
|
||||
\par eout.csv
|
||||
\par
|
||||
\par To use:
|
||||
\par Double click on EditOut.jar if you have JRE5 or above installed on Windows.
|
||||
\par (* Confirmed to work in JDK6u2 + Windows XP sp2)
|
||||
\par
|
||||
\par Operation:
|
||||
\par CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u19968\'88\'ea\u25324\'8a\'87\u12452\'83\'43\u12531\'83\'93\u12509\'83\'7c\u12540\'81\'5b\u12488\'83\'67\u12399
|
||||
\'82\'cd\u20184\'95\'74\u23646\'91\'ae\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 eout.csv}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374
|
||||
\loch\af11\hich\af11\dbch\f11 \uc2\u12434\'82\'f0\u-30325\'8c\'a9\u12394\'82\'c8\u12364\'82\'aa\u12425\'82\'e7\u-26619\'8d\'80\u30446\'96\'da\u22475\'96\'84\u12417\'82\'df\u12390\'82\'c4\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290
|
||||
\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12452\'83\'43\u12531\'83\'93\u12509\'83\'7c\u12540\'81\'5b\u12488\'83\'67\u21069\'91\'4f\u12395\'82\'c9}{
|
||||
\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-30163\'90\'dd\u23450\'92\'e8\u12424
|
||||
\'82\'e6\u12426\'82\'e8\u20986\'8f\'6f\u21147\'97\'cd\u12375\'82\'b5\u12383\'82\'bd\u12356\'82\'a2}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 eout}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12398\'82\'cc\u12496\'83\'6f\u12540\'81\'5b\u12472\'83\'57\u12519\'83\'87\u12531\'83\'93\u12434\'82\'f0\u-28552\'91\'49\u25246\'91\'f0\u12375\'82\'b5
|
||||
\u12390\'82\'c4\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12501\'83\'74\u12457\'83\'48\u12523\'83\'8b
|
||||
\loch\af11\hich\af11\dbch\f11 \u12480\'83\'5f\u12398\'82\'cc\u-27056\'8c\'c0\u30028\'8a\'45\u12434\'82\'f0\u-27036\'8f\'9c\u21435\'8b\'8e\u12375\'82\'b5\u12383\'82\'bd\u12398\'82\'cc\u12391\'82\'c5\u22909\'8d\'44\u12365\'82\'ab\u12394\'82\'c8\u30058
|
||||
\'94\'d4\u21495\'8d\'86\u12395\'82\'c9\u-28675\'92\'c7\u21152\'89\'c1\u21487\'89\'c2\u-32515\'94\'5c\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12524\'83\'8c\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u-30163\'90\'dd\u23450\'92\'e8\u12363\'82\'a9\u12425
|
||||
\'82\'e7\u25313\'8a\'67\u24373\'92\'a3\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12391\'82\'c5\u26032\'90\'56\u12383\'82\'bd\u12394\'82\'c8\u27005\'8a\'79\u26354\'8b\'c8\u12398\'82\'cc\u23450\'92\'e8\u32681\'8b\'60\u12418\'82\'e0\u21487
|
||||
\'89\'c2\u-32515\'94\'5c\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-28666\'8b\'74\u-30335\'97\'76\u26395\'96\'5d\u-230\'81\'46}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par HS}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12398\'82\'cc\u12514\'83\'82\u12540\'81\'5b\u12489\'83\'68\u12479\'83\'5e\u12452\'83\'43\u12503\'83\'76\u-225
|
||||
\'81\'48}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 (104-105)}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12289\'81\'41\u12512
|
||||
\'83\'80\u12540\'81\'5b\u12499\'83\'72\u12540\'81\'5b\u12514\'83\'82\u12540\'81\'5b\u12489\'83\'68\u-225\'81\'48}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 (152-153)}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12399\'82\'cd\u20206\'89\'bc\u21517\'96\'bc\u12391\'82\'c5\u12377\'82\'b7\u12289\'81\'41\u29992\'97\'70\u-28652\'93\'72\u12364\'82\'aa\u20998\'95\'aa
|
||||
\u12363\'82\'a9\u12425\'82\'e7\u12394\'82\'c8\u12356\'82\'a2\u12398\'82\'cc\u12391\'82\'c5\u24773\'8f\'ee\u22577\'95\'f1\u19979\'89\'ba\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u21508\'8a\'65\u-26619\'8d\'80\u30446\'96\'da\u21517\'96\'bc\u12398\'82\'cc\u12418\'82\'e0\u12387\'82\'c1\u12392
|
||||
\'82\'c6\u-32145\'97\'c7\u12356\'82\'a2\u-26619\'8d\'80\u30446\'96\'da\u21517\'96\'bc\u26696\'88\'c4\u12434\'82\'f0\u21215\'95\'e5\u-26938\'8f\'57\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par Bugs, etc:
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-26618\'8f\'87\u27425\'8e\'9f\u23550\'91\'ce\u24540\'89\'9e\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12398
|
||||
\'82\'cc\u12391\'82\'c5\u12473\'83\'58\u12524\'83\'8c\u12395\'82\'c9\u-30335\'97\'76\u26395\'96\'5d}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 age}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12390\'82\'c4\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par Misc. Notes:
|
||||
\par GOLD}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12461\'83\'4c\u12508\'83\'7b\u12531\'83\'93\u12290\'81\'42}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par I want to analyze data from 8th Style and below.
|
||||
\par
|
||||
\par History:
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 >>748}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12373\'82\'b3\u12435\'82\'f1\u12398\'82\'cc\u24076\'8a\'f3\u26395\'96\'5d\u27231\'8b\'40\u-32515\'94\'5c\u-28675\'92\'c7\u21152
|
||||
\'89\'c1\u-248\'81\'69}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 HS}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12394\'82\'c8
|
||||
\u12425\'82\'e7}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 1300}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u-162\'81\'60
|
||||
\u12418\'82\'e0\u20351\'8e\'67\u29992\'97\'70\u21487\'89\'c2\u-32515\'94\'5c\u12395\'82\'c9\u12289\'81\'41}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 9999}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12414\'82\'dc\u12391\'82\'c5\u30906\'8a\'6d\u-30067\'94\'46\u28168\'8d\'cf\u12415\'82\'dd\u-247\'81\'6a}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u12524\'83\'8c\u12452\'83\'43\u12516\'83\'84\u12540\'81\'5b\u-30163\'90\'dd\u23450\'92\'e8\u12398
|
||||
\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 7}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12392\'82\'c6}{\rtlch\fcs1
|
||||
\af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 8}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12364\'82\'aa\u20837\'93\'fc\u12428\'82\'ea\u22793
|
||||
\'95\'cf\u12431\'82\'ed\u12387\'82\'c1\u12390\'82\'c4\u12383\'82\'bd\u12398\'82\'cc\u12434\'82\'f0\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u-29860\'95\'88\u-26782\'96\'ca\u23450\'92\'e8\u32681\'8b\'60\u12364\'82\'aa\u12468\'83\'53\u12511
|
||||
\'83\'7e\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u27531\'8e\'63\u12427\'82\'e9\u12398\'82\'cc\u12434\'82\'f0\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45\u26354\'8b\'c8\u-30163\'90\'dd\u23450\'92\'e8\u-237\'82\'52\u12398\'82\'cc\u-29860\'95\'88\u-26782
|
||||
\'96\'ca\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12398\'82\'cc\u21517\'96\'bc\u31216\'8f\'cc\u22793\'95\'cf\u26356\'8d\'58\u-248\'81\'69}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 ->2dx}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u-247\'81\'6a}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u20445\'95\'db\u23384\'91\'b6\u26178\'8e\'9e\u12395\'82\'c9\u22833\'8e\'b8\u25943\'94\'73\u12377
|
||||
\'82\'b7\u12427\'82\'e9\u21839\'96\'e2\u-26548\'91\'e8\u12398\'82\'cc\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 HS}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 DD}{\rtlch\fcs1 \af11\afs20
|
||||
\ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 GD}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0
|
||||
\fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12398\'82\'cc\u20027\'8e\'e5\u-30335\'97\'76\u-237\'82\'52\u31278\'8e\'ed\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374 eout}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12395\'82\'c9\u23550\'91\'ce\u24540\'89\'9e}{\rtlch\fcs1 \af2\afs20
|
||||
\ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 AC6th}{\rtlch\fcs1
|
||||
\af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12473\'83\'58\u12524\'83\'8c\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374 >>592}{
|
||||
\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12373\'82\'b3\u12435\'82\'f1\u-32765\'8d\'6c\u26696\'88\'c4\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374 CSV}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u19968\'88\'ea\u25324\'8a\'87\u12452\'83\'43\u12531\'83\'93\u12509
|
||||
\'83\'7c\u12540\'81\'5b\u12488\'83\'67\u12395\'82\'c9\u23550\'91\'ce\u24540\'89\'9e}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u20104\'97\'5c\u32004\'96\'f1\u-26600\'97\'cc\u22495\'88\'e6\u12395\'82\'c9\u12388\'82\'c2\u12356
|
||||
\'82\'a2\u12390\'82\'c4\u25805\'91\'80\u20316\'8d\'ec\u19981\'95\'73\u-30335\'97\'76\u12398\'82\'cc\u12383\'82\'bd\u12417\'82\'df\u20840\'91\'53\u25764\'93\'50\u24259\'94\'70}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u12354\'82\'a0\u12427\'82\'e9\u31243\'92\'f6\u24230\'93\'78\u12398\'82\'cc\u-27245\'8a\'d4\u-28587
|
||||
\'88\'e1\u12356\'82\'a2\u12364\'82\'aa\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12383\'82\'bd\u25163\'8e\'e8\u21205\'93\'ae\u32232\'95\'d2\u-26938\'8f\'57\u28168\'8d\'cf\u12415\'82\'dd\u12398\'82\'cc}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374 eout}{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12395\'82\'c9\u23550\'91\'ce\u24540\'89\'9e}{\rtlch\fcs1 \af2\afs20
|
||||
\ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u21517\'96\'bc\u21069\'91\'4f\u12434\'82\'f0\u20184\'95\'74\u12369\'82\'af\u12390\'82\'c4\u20445
|
||||
\'95\'db\u23384\'91\'b6\u12434\'82\'f0\u-28675\'92\'c7\u21152\'89\'c1}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u21508\'8a\'65\u31278\'8e\'ed\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u20869\'93\'e0\loch\af11\hich\af11\dbch\f11 \u-28440\'95\'94\u12467\'83\'52\u12540\'81\'5b\u12489
|
||||
\'83\'68\u26368\'8d\'c5\u-28567\'93\'4b\u21270\'89\'bb}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45\u21508\'8a\'65\u31278\'8e\'ed\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u19981\'95\'73\u-30335\'97\'76\u12394\'82\'c8\u-26619\'8d\'80\u30446\'96\'da\u12398\'82\'cc\u21066
|
||||
\'8d\'ed\u-27036\'8f\'9c}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12539\'81\'45\u21508\'8a\'65\u31278\'8e\'ed\u20462\'8f\'43\u27491\'90\'b3}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0
|
||||
\f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u26032\'90\'56\u-30321\'8b\'4b\u-28675\'92\'c7\u21152\'89\'c1\u12364\'82\'aa\u12391\'82\'c5\u12365
|
||||
\'82\'ab\u12394\'82\'c8\u12363\'82\'a9\u12387\'82\'c1\u12383\'82\'bd\u20214\'8c\'8f}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u26354\'8b\'c8\u-28675\'92\'c7\u21152\'89\'c1\u24460\'8c\'e3\u12484\'83\'63\u12522\'83\'8a\u12540
|
||||
\'81\'5b\u12395\'82\'c9\u21517\'96\'bc\u21069\'91\'4f\u12364\'82\'aa\u20986\'8f\'6f\u12394\'82\'c8\u12363\'82\'a9\u12387\'82\'c1\u12383\'82\'bd\u20214\'8c\'8f}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }{\rtlch\fcs1 \af11\afs20 \ltrch\fcs0 \fs20\loch\af11\hich\af11\dbch\af11\insrsid1316374\charrsid1316374 \loch\af11\hich\af11\dbch\f11 \uc2\u12288\'81\'40\u-30616\'95\'5c\u31034\'8e\'a6\u12364\'82\'aa\u12362\'82\'a8\u12363\'82\'a9\u12375\'82\'b5\u12363
|
||||
\'82\'a9\u12387\'82\'c1\u12383\'82\'bd\u20214\'8c\'8f}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid1316374\charrsid1316374
|
||||
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid1316374
|
||||
\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8
|
||||
72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7
|
||||
2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b
|
||||
44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7
|
||||
065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000
|
||||
00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08
|
||||
84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc
|
||||
52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353
|
||||
bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468
|
||||
656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c
|
||||
070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7
|
||||
29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65
|
||||
312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8
|
||||
a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04
|
||||
98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c
|
||||
94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471
|
||||
7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671
|
||||
9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1
|
||||
e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5
|
||||
193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1
|
||||
17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2
|
||||
8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6
|
||||
6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a
|
||||
668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847
|
||||
bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e
|
||||
16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b
|
||||
5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0
|
||||
8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2
|
||||
c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966
|
||||
0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b
|
||||
7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb
|
||||
9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0
|
||||
088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf
|
||||
8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26
|
||||
ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0
|
||||
28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6
|
||||
345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93
|
||||
b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30
|
||||
254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74
|
||||
68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24
|
||||
51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198
|
||||
720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528
|
||||
a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000
|
||||
000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000
|
||||
002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468
|
||||
656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000
|
||||
00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000
|
||||
00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000}
|
||||
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
|
||||
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
|
||||
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
|
||||
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
|
||||
{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
|
||||
\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;
|
||||
\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;
|
||||
\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;
|
||||
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000
|
||||
4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000
|
||||
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f00000000000000000000000020cc
|
||||
61a28cd7c701feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000105000000000000}}
|
||||
@@ -0,0 +1,113 @@
|
||||
EditOut -2chan Sucks Edition-
|
||||
v1.1 for bemaniso
|
||||
--------------------------------------
|
||||
Files found on 2ch by musicboy
|
||||
Translations done by Soveryshiny
|
||||
Translations Added to code by Anthony
|
||||
Program Recompiled by infamouspat
|
||||
Eout Encrypter/Decrypter by Tau
|
||||
Testing and mdata provided by Raoh
|
||||
--------------------------------------
|
||||
Included in this package:
|
||||
|
||||
mdata (DIR) - GOLD mdata JPGs
|
||||
split (DIR) - Required Files.
|
||||
10-12eout.dec - 10th - HS eout merged
|
||||
13eout.dec - DistorteD eout
|
||||
14eout - GOLD eout
|
||||
decrypt.exe - eout.bin decrypter
|
||||
encrypt.exe - eout.bin encrypter
|
||||
eoutEdit.exe - eout Editor execulatable
|
||||
eoutEdit.jar - eout Editor jar file
|
||||
readme.txt - readme
|
||||
readme-2ch.rtf - original 2chan readme
|
||||
swt-win32-3236.dll - dll file required for eout Editor
|
||||
--------------------------------------
|
||||
|
||||
Instructions:
|
||||
|
||||
--------------------------------------
|
||||
Decompressing the eout.bin file
|
||||
--------------------------------------
|
||||
1) Place the eout.bin from the game you wish to use
|
||||
(found in data/info) into the eoutEnglish folder.
|
||||
|
||||
2) In your command line navigate to your eoutEnglish
|
||||
folder and run "decrypt eout.bin eout.dec". You will
|
||||
now have a decrypted eout file.
|
||||
|
||||
--------------------------------------
|
||||
Opening the eout file
|
||||
--------------------------------------
|
||||
1) In eoutEdit change your CSV Settings to the game you
|
||||
will be editing. THIS MUST BE DONE BEFORE STEP 2 OR
|
||||
YOUR SAVED EOUT WILL BE CORRUPT.
|
||||
|
||||
2) Open your eout.dec in eoutEdit.
|
||||
|
||||
--------------------------------------
|
||||
Adding Data to your eout
|
||||
--------------------------------------
|
||||
Adding data to your eout file is rather easy. Find the number
|
||||
of the song you wish to add to your name and click the number.
|
||||
It will ask you if you wish to add it. Click yes and begin
|
||||
entering the data. The best way to find the data you need is
|
||||
to run a second instance of eoutEdit and load in one of the
|
||||
included eout.dec files and get the data from that file.
|
||||
Remember you must click save to every individual page of data
|
||||
to properly add the song.
|
||||
|
||||
**NOTE** If you try to add a song that does NOT have graphics in
|
||||
the current game's mdata then you will get HDD errors on game
|
||||
boot. I have included a folder of GOLD's mdata in JPG format
|
||||
for those of you working with GOLD.
|
||||
|
||||
After adding a song into your list, copy it's sd_data, movie (if
|
||||
available) and overlays (if available) to the new game directory.
|
||||
|
||||
Examples!
|
||||
|
||||
To add Car of Your Dreams (movie) to GOLD you must copy:
|
||||
1)
|
||||
1106 (DIR) from the previous game's 'data\sd_data' to your
|
||||
GOLD's 'data\sd_data'
|
||||
2)
|
||||
1106.4 (DIR) from the previous game's 'data\movie' to your
|
||||
GOLD's 'data\movie'
|
||||
|
||||
To add Samba de Janeiro (overlay) to GOLD you must copy:
|
||||
1)
|
||||
1304 (DIR) from the previous game's 'data\sd_data' to your
|
||||
GOLD's 'data\sd_data'
|
||||
2)
|
||||
1304 (DIR) from the previous game's 'data\graph\sys' to your
|
||||
GOLD's 'data\graph\sys'
|
||||
|
||||
When in doubt of what you need to move, check both data\movie and
|
||||
data\graph\sys for files with the same number as the song.
|
||||
|
||||
Once you are done saving songs just click 'File->Save' to resave the
|
||||
eout.dec file.
|
||||
|
||||
--------------------------------------
|
||||
Recompressing the eout.bin file
|
||||
--------------------------------------
|
||||
1) In your command line navigate to your eoutEnglish
|
||||
folder and run "encrypt eout.dec eout.bin". You will
|
||||
now have an encrypted eout file.
|
||||
|
||||
2) Place the eout.bin from your eoutEnglish folder
|
||||
back into the 'data/info' folder of the game.
|
||||
|
||||
REMEMBER TO MAKE BACKUPS!!! This program does not have a delete
|
||||
song option. So if a song you add does not work you will need to
|
||||
go to your backups. If you don't make backups, the most you can
|
||||
do is blank song info out and end up with songwheel cluster.
|
||||
|
||||
Thats all you need to do.
|
||||
|
||||
For discussion on this please refer to:
|
||||
http://bemaniso.ws/forums.php?action=viewtopic&topicid=9206
|
||||
|
||||
|
||||
-Anthony
|
||||
Binary file not shown.
Binary file not shown.
Executable
+1020
File diff suppressed because it is too large
Load Diff
Executable
+94
@@ -0,0 +1,94 @@
|
||||
//2dx.h
|
||||
//deals with compiling the .2dx file
|
||||
|
||||
#define TWODXHSIZE 72 //size of the .2dx header
|
||||
#define WAVHSIZE 24 //size of the wav header
|
||||
|
||||
int twodxsize;
|
||||
|
||||
byte *tdx; //this will hold the decrypted .2dx file
|
||||
byte *tdx_enc; //this will hold the encrypted .2dx file
|
||||
|
||||
const byte wavheader[24] = {
|
||||
'2', 'D', 'X', '9', //const string
|
||||
0x18, 0x00, 0x00, 0x00, //headersize (== 24)
|
||||
0x00, 0x00, 0x00, 0x00, //size of wave file (written at runtime)
|
||||
0x30, 0x32, 0xFF, 0xFF, //panning/initial volume?
|
||||
0x40, 0x00, 0x01, 0x00, //??? (64, 0, sample format, 0)
|
||||
0x00, 0x00, 0x00, 0x00 //??? (0, 0, 0, 0)
|
||||
};
|
||||
//sample format notes:
|
||||
//1: 44.1khz, 16bit MS ADPCM stereo
|
||||
//0: 44.1khz, 16bit MS ADPCM mono
|
||||
//8: almost but not the same as 1?
|
||||
//7: ???
|
||||
|
||||
//construct the .2dx file
|
||||
//specs were taken from Kitaru's create2dx.c (QQQ)
|
||||
void create_2dx()
|
||||
{
|
||||
int i, j, firstwav;
|
||||
|
||||
printf("authoring .2dx file\n");
|
||||
//calculate the size of the final .2dx file
|
||||
twodxsize = TWODXHSIZE + wavcount * WAVHSIZE + wavcount*4; //header + ToC + headers for wav files
|
||||
for(i = 0; i < wavcount; i++)
|
||||
twodxsize+=waves[i].length;
|
||||
|
||||
twodxsize = CIELMOD8(twodxsize); //just make sure we don't run into unallocated memory while encrypting
|
||||
|
||||
tdx = malloc(twodxsize);
|
||||
memset(tdx, 0, twodxsize);
|
||||
|
||||
//twodxsize = oldsize;
|
||||
firstwav = TWODXHSIZE + wavcount*4;
|
||||
|
||||
memcpy(tdx + 16, &firstwav, 4); //first wave position = 2dx header + size of TOC (= 72 + wavcount * sizeof(int))
|
||||
memcpy(tdx + 20, &wavcount, 4); //the total numbers of waves
|
||||
|
||||
//write the ToC
|
||||
printf("writing sample TOC...", firstwav);
|
||||
j = firstwav;
|
||||
for(i = 0; i < wavcount; i++)
|
||||
{
|
||||
//printf("%d...", j);
|
||||
memcpy(tdx+TWODXHSIZE+i*4, &j, 4);
|
||||
j += waves[i].length + WAVHSIZE;
|
||||
}
|
||||
|
||||
//write the waves
|
||||
printf("writing keysounds (%d in all)...\n", wavcount);
|
||||
j = firstwav;
|
||||
for(i = 0; i < wavcount; i++)
|
||||
{
|
||||
//printf("%d...", waves[i].length);
|
||||
memcpy(tdx+j, wavheader, 24); //write the header
|
||||
memcpy(tdx+j+8, &waves[i].length, 4); //write the length
|
||||
memcpy(tdx+j+24, waves[i].data, waves[i].length);
|
||||
j += WAVHSIZE + waves[i].length;
|
||||
}
|
||||
//printf("twodxsize: %d\n", twodxsize);
|
||||
//PNEWLINE;
|
||||
}
|
||||
|
||||
|
||||
//actually write the stuff to disk
|
||||
void writeout_2dx()
|
||||
{
|
||||
FILE *out;
|
||||
|
||||
printf("writing output.2dx to disk\n");
|
||||
|
||||
/*out = fopen("decrypted.2dx", "wb");
|
||||
|
||||
//fflush(out);
|
||||
|
||||
fwrite(tdx, twodxsize, 1, out);
|
||||
|
||||
fclose(out);*/
|
||||
|
||||
out = fopen("output.2dx", "wb");
|
||||
fwrite(tdx_enc, twodxsize+8, 1, out);
|
||||
fclose(out);
|
||||
|
||||
}
|
||||
Executable
+127
@@ -0,0 +1,127 @@
|
||||
//bme2ac by ryuuou
|
||||
//takes a bunch of bms/bme files and produces .2dx and .1 files (hopefully) usable with beatmania iidx ac
|
||||
//!!!WARNING!!! THIS WILL PROBABLY FAIL HORRIBLY ON 64BIT PLATFORMS!!! Then again it might just work
|
||||
|
||||
//still unsupported:
|
||||
// - songs with missing wav files?
|
||||
|
||||
|
||||
//Changelog:
|
||||
// v0.7
|
||||
// - chargenote support for Sirius
|
||||
// - speedups
|
||||
// v0.6
|
||||
// - greater accuracy in case of many bpm changes
|
||||
// - proper longnote handling support (both channel and lnobj)
|
||||
// v0.5
|
||||
// - partial support for freezenotes
|
||||
// v0.4
|
||||
// - speedups
|
||||
// - implemented #STOP events (_NOT_ #STP events!)
|
||||
// - fixed a potential problem with fractional bpm
|
||||
// - fixed a bug with file names that have '#' in them
|
||||
// - the measure line of the last measure wasn't written out correctly
|
||||
// - nixed decrypted.2dx; encrypted.2dx -> output.2dx
|
||||
// - songs now end 3 seconds after the end of the last measure
|
||||
// - added several tools:
|
||||
// create2dx_new, crack2dx_new, timebase_single, encrypt2dx, merge1, parse1; with sources
|
||||
// v0.3
|
||||
// - killed debug output
|
||||
// - standard events are now written after bpm corrections to avoid screwing with the end-song event
|
||||
// - keysound preload events are now dynamic and always placed between keys; this should fix wrong keysounds on fast repeats once and for all
|
||||
// v0.2
|
||||
// - implemented bpm changes
|
||||
// - implemented changing measure sizes, this should fix a lot of offsync songs
|
||||
// v0.1
|
||||
// - initial release
|
||||
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include "bms.h"
|
||||
#include "wav.h"
|
||||
#include "2dx.h"
|
||||
#include "crypt.h"
|
||||
#include "1.h"
|
||||
#include <math.h>
|
||||
|
||||
//initialize stuff, set things to zero etc.
|
||||
void init()
|
||||
{
|
||||
memset(bms, 0, sizeof(bmsfile)*CHARTCOUNT);
|
||||
memset(waves, 0, sizeof(WAVE)*MAXWAVS*CHARTCOUNT);
|
||||
|
||||
memset(onecharts, 0, sizeof(event*)*CHARTCOUNT);
|
||||
|
||||
wavcount = 0;
|
||||
wavlen = 0;
|
||||
onesize = 0;
|
||||
onefile = NULL;
|
||||
|
||||
twodxsize = 0;
|
||||
|
||||
style = 0; //standard = troopers
|
||||
return;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
|
||||
printf("bme2ac v0.7 by ryuuou\n \
|
||||
Converts BME/BMS style files and WAVs into .1 and .2dx files\n\
|
||||
Suitable for use with beatmania IIDX TROOPERS AC and up _only_\n\n\n");
|
||||
|
||||
if(!readbmsfiles())
|
||||
{
|
||||
printf("found no charts, aborting\n");
|
||||
getchar();
|
||||
return 1;
|
||||
}
|
||||
|
||||
parsebms();
|
||||
|
||||
/*parsebms_bpm();
|
||||
parsebms_measures();
|
||||
parsebms_stops();*/
|
||||
create_wavtable();
|
||||
if(load_waves())
|
||||
{
|
||||
printf("!!!Several wave files failed to load, IIDX might crash!!!\npress enter to continue\n");
|
||||
getchar();
|
||||
//return 1;
|
||||
}
|
||||
|
||||
convert_to_1_events();
|
||||
|
||||
stretch_times(100.); //for greater accuracy in case of many bpm changes
|
||||
adjust_bpm();
|
||||
stretch_times(1./100.);
|
||||
//note: we still have inaccuracy of 1ms while converting from bms, but there's nothing we can do about that
|
||||
|
||||
add_standard_events();
|
||||
|
||||
add_stop_events(); //we need at least one bpm event for calculations
|
||||
handle_longnotes();
|
||||
add_keysounds();
|
||||
cleanup_1();
|
||||
|
||||
//stretch_times(FPS_DD/1000.); //for DistorteD to Happy Sky
|
||||
//stretch_times(FPS_GOLD/1000.); //for GOLD
|
||||
|
||||
create_1();
|
||||
|
||||
create_2dx();
|
||||
encrypt_2dx(tdx, twodxsize, &tdx_enc);
|
||||
|
||||
writeout_1();
|
||||
writeout_2dx();
|
||||
|
||||
if(twodxsize > 25000000)
|
||||
printf("!!!.2dx file is larger than 25,000,000 bytes, IIDX will crash trying to load it!!!\n");
|
||||
|
||||
printf("\nDone. Press enter to exit.\n");
|
||||
getchar();
|
||||
return 0;
|
||||
}
|
||||
|
||||
Executable
+146
@@ -0,0 +1,146 @@
|
||||
//bms.h
|
||||
//stuff for .bms/.bme processing
|
||||
|
||||
//searches *bms for stuff
|
||||
//WARNING: this is very intolerant concerning capitalization and trailing whitespaces!
|
||||
|
||||
#define BMS_MSIZE 2
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int length; //length of the data
|
||||
byte* data;
|
||||
unsigned char wavnames[MAXWAVS][64]; //names of the wavfiles
|
||||
int ref[MAXWAVS]; //used for crossreferencing samples across different bms files
|
||||
float bpmchange[MAXWAVS]; //bms change array
|
||||
int bpmchangecount;
|
||||
float msize[999]; //measure sizes
|
||||
int mcount; //highest measure count
|
||||
float bpm; //initial bpm
|
||||
float stops[MAXWAVS]; //stop event array
|
||||
int stopcount;
|
||||
int lnobj; //lnobj index
|
||||
int numwaves; //number of samples
|
||||
int numkeys[2]; //keypresscount for player 1 and 2
|
||||
} bmsfile;
|
||||
|
||||
bmsfile bms[CHARTCOUNT]; //one bme for each chart
|
||||
|
||||
//attempt to read in the charts; returns the number of loaded charts
|
||||
int readbmsfiles()
|
||||
{
|
||||
int ret = 0;
|
||||
int i;
|
||||
FILE *f;
|
||||
|
||||
printf("trying to open charts\n");
|
||||
for(i = 0; i < CHARTCOUNT; i++)
|
||||
{
|
||||
printf("%s...", BMENAMES[i]);
|
||||
f = fopen(BMENAMES[i], "rb");
|
||||
|
||||
if(f == NULL)
|
||||
{
|
||||
printf("not found\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
ret++; //we got a chart, yay
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
bms[i].length = (int)ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
bms[i].data = malloc(bms[i].length + 32); //safety bytes
|
||||
memset(bms[i].data, 0, bms[i].length + 32);
|
||||
|
||||
fread(bms[i].data, bms[i].length, 1, f);
|
||||
fclose(f);
|
||||
|
||||
printf("OK\n");
|
||||
}
|
||||
PNEWLINE;
|
||||
}
|
||||
|
||||
//parses the bms files for data needed to build the timeline, sample index and other stuff
|
||||
void parsebms()
|
||||
{
|
||||
int i,j,k,l;
|
||||
char *data;
|
||||
int measure, channel;
|
||||
byte measure_c[4];
|
||||
|
||||
printf("parsing bms...");
|
||||
for(i = 0; i < CHARTCOUNT; i++)
|
||||
{
|
||||
if(bms[i].length == 0)
|
||||
continue;
|
||||
|
||||
data = bms[i].data;
|
||||
|
||||
for(k = 0; k < bms[i].length; k++)
|
||||
{
|
||||
l = 0;
|
||||
|
||||
//wavefile names
|
||||
if(data[k] == '#' && data[k+1] == 'W' && data[k+2] == 'A' && data[k+3] == 'V')
|
||||
{
|
||||
j = strtoi(data+k+4) - 1;
|
||||
k += 7; //skip to the filename (after "#WAVxy ")
|
||||
while((data[k+l] != '\n') && (data[k+l] != '\r') && k+l < bms[i].length) //CR or LF
|
||||
l++; //count the length of the filename
|
||||
memcpy(bms[i].wavnames[j], data+k, l); //copy the wavename
|
||||
bms[i].numwaves++;
|
||||
}
|
||||
//bpm data "#BPM xx"
|
||||
else if(data[k] == '#' && data[k+1] == 'B' && data[k+2] == 'P' && data[k+3] == 'M' && data[k+4] == ' ')
|
||||
{
|
||||
k += 5;
|
||||
sscanf((const char*)(data+k), "%f", &bms[i].bpm);
|
||||
}
|
||||
//bpm data "BPMyy xx"
|
||||
else if(data[k] == '#' && data[k+1] == 'B' && data[k+2] == 'P' && data[k+3] == 'M' && data[k+4] != ' ')
|
||||
{
|
||||
j = strtoi(data+k+4) - 1;
|
||||
k += 7;
|
||||
sscanf((const char*)(data+k), "%f", &bms[i].bpmchange[j]);
|
||||
bms[i].bpmchangecount++;
|
||||
}
|
||||
//measure data
|
||||
else if(data[k] == '#' && data[k+6] == ':')
|
||||
{
|
||||
measure_c[0] = data[k+1];
|
||||
measure_c[1] = data[k+2];
|
||||
measure_c[2] = data[k+3];
|
||||
sscanf(measure_c, "%d", &measure);
|
||||
bms[i].msize[measure] = 1.; //default measure size
|
||||
|
||||
//keep track of the highest measure count for later
|
||||
if(measure > bms[i].mcount) bms[i].mcount = measure;
|
||||
|
||||
//measure length
|
||||
sscanf(data+k+4, "%d", &channel);
|
||||
if(channel == BMS_MSIZE)
|
||||
{
|
||||
sscanf((const char*)(data+k+7), "%f", &bms[i].msize[measure]); //read in the new measure size
|
||||
}
|
||||
}
|
||||
//stop data
|
||||
else if(data[k] == '#' && data[k+1] == 'S' && data[k+2] == 'T' && data[k+3] == 'O' && data[k+4] == 'P')
|
||||
{
|
||||
j = strtoi(data+k+5) - 1;
|
||||
k += 7;
|
||||
sscanf((const char*)(data+k), "%f", &bms[i].stops[j]);
|
||||
bms[i].stopcount++;
|
||||
}
|
||||
//lnobj data
|
||||
else if(data[k] == '#' && data[k+1] == 'L' && data[k+2] == 'N' && data[k+3] == 'O' && data[k+4] == 'B' && data[k+5] == 'J')
|
||||
{
|
||||
k += 7;
|
||||
bms[i].lnobj = strtoi(data+k);
|
||||
}
|
||||
}
|
||||
printf("%s...", CHARTNAMES[i]);
|
||||
}
|
||||
PNEWLINE;
|
||||
}
|
||||
Executable
+65
@@ -0,0 +1,65 @@
|
||||
//common.h
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
|
||||
#define MAXWAVS (36*36-1) //wav files from 01-0A-0Z-10-ZZ (you get it) = 36*36 - 1
|
||||
#define CHARTCOUNT 7 //beginner + (normal,hyper,another times two), what about kaiden in gold cs?
|
||||
|
||||
#define PNEWLINE printf("\n") //used too often
|
||||
|
||||
#define CIELMOD8(a) (!(a%8)?(a):((a)+(8-(a)%8))) //rounds (a) up to the next mod 8 int
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
//chartorder inside .1 file: h7, n7, a7, b, h14, n14, a14
|
||||
const char *BMENAMES[] = { "h7.bme", "n7.bme", "a7.bme", "b.bme", "h14.bme", "n14.bme", "a14.bme" }; //we use constant filenames here for ease of coding/use
|
||||
const char *CHARTNAMES[] = { "h7", "n7", "a7", "b", "h14", "n14", "a14" };
|
||||
int style; //produce files for this iidx version; 0 == Troopers, 1 == GOLD, 2 == DistorteD and Happy Sky
|
||||
float factor; //us this factor to strech .1 event time indices (based on version); 1 for Troopers, FPS/1000 for everything else
|
||||
|
||||
|
||||
//helper functions for BME numbering weirdness;
|
||||
//converts a number to a 01-ZZ style string and places that in the first two bytes of str
|
||||
inline void itostr(char *str, int i)
|
||||
{
|
||||
str[0] = i / 36; //works because this floors
|
||||
if(str[0] > 9)
|
||||
str[0] += 7; //there's a gap of 8 characters between '9' and 'A'
|
||||
str[0] += 48; //fancy charactermap magic
|
||||
|
||||
str[1] = i % 36; //mod operator = <3
|
||||
if(str[1] > 9)
|
||||
str[1] += 7;
|
||||
str[1] += 48;
|
||||
}
|
||||
|
||||
//the above in inverse; convert a BME-style numbering to int.
|
||||
//stupidly tries to convert the first two bytes of *str
|
||||
inline int strtoi(char *str)
|
||||
{
|
||||
char conv[3];
|
||||
int ret;
|
||||
conv[0] = str[0];
|
||||
conv[1] = str[1];
|
||||
conv[2] = '\0';
|
||||
ret = strtol(conv, 0, 36);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
//does the same as the above but converts from hex instead
|
||||
inline int strtoi_h(char *str)
|
||||
{
|
||||
char conv[3];
|
||||
int ret;
|
||||
conv[0] = str[0];
|
||||
conv[1] = str[1];
|
||||
conv[2] = '\0';
|
||||
ret = strtol(conv, 0, 16);
|
||||
return ret;
|
||||
}
|
||||
Executable
+207
@@ -0,0 +1,207 @@
|
||||
|
||||
//crypt.h
|
||||
//code for encrypting .2dx files with DistorteD's algorithm/key
|
||||
|
||||
//apparently konami's internal implementation of this doesn't do proper boundchecking and also doesn't zero its buffers, so there is some garbage left behind in the original files
|
||||
|
||||
//format of encrypted .2dx file:
|
||||
//header:
|
||||
//4 bytes: identifier ("%e12" in case of distorted)
|
||||
//4 bytes: length of the decrypted .2dx file
|
||||
//after this follows the encrypted data
|
||||
|
||||
|
||||
#define byte unsigned char
|
||||
|
||||
byte keys_09[] = { //9th style
|
||||
0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B,
|
||||
0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF,
|
||||
0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B };
|
||||
|
||||
byte keys_10[] = { //10th style
|
||||
0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4,
|
||||
0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2,
|
||||
0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21 };
|
||||
|
||||
byte keys_11[] = { //Happy Sky+
|
||||
0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03,
|
||||
0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7,
|
||||
0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F };
|
||||
|
||||
byte keys_16[] = { //empress
|
||||
0x28, 0x22, 0x28, 0x54, 0x63, 0x3F, 0x0E, 0x42,
|
||||
0x6F, 0x45, 0x4E, 0x50, 0x67, 0x53, 0x61, 0x7C,
|
||||
0x04, 0x46, 0x00, 0x3B, 0x13, 0x2B, 0x45, 0x6A };
|
||||
|
||||
byte cryptkey[8] = { 0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03 }; //DistorteD'S encryption key
|
||||
|
||||
//XORs two 8 byte blocks
|
||||
inline void block_xor(byte *data, byte *parm)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
data[i] ^= parm[i];
|
||||
return;
|
||||
}
|
||||
|
||||
//Swaps the lower 4 bytes with the upper 4 bytes
|
||||
inline void block_swap(byte *data)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 4 ; i++)
|
||||
{
|
||||
data[i] ^= data[i+4]; //let's do this without temp variables ;D
|
||||
data[i+4] ^= data[i];
|
||||
data[i] ^= data[i+4];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//I bow to whoever figured this one out
|
||||
inline void block_obfus(byte *data)
|
||||
{
|
||||
byte a,b,c,d,e,f,g,h,i;
|
||||
|
||||
a = data[0] * 63;
|
||||
b = a + data[3];
|
||||
c = data[1] * 17;
|
||||
d = c + data[2];
|
||||
e = d + b;
|
||||
f = e * data[3];
|
||||
g = f + b + 51;
|
||||
h = b ^ d;
|
||||
i = g ^ e;
|
||||
|
||||
data[4] ^= h;
|
||||
data[5] ^= d;
|
||||
data[6] ^= i;
|
||||
data[7] ^= g;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//encrypts the .2dx file; this simply takes the reverse way from crack2dx.c by an unknown author (QQQ again, but HOLY SHIT that code is a mess (and buggy))
|
||||
int encrypt_2dx(byte *dec, int len, byte **enc)
|
||||
{
|
||||
byte *cur; //current block of 8 bytes
|
||||
int enclen;
|
||||
|
||||
int i;
|
||||
|
||||
//ciel to mod 8;
|
||||
|
||||
enclen = len + 8; //length of the encoded 2dx = length of unencoded 2dx + headersize (8 bytes)
|
||||
|
||||
if(enclen%8)
|
||||
enclen += 8-enclen%8;
|
||||
|
||||
*enc = malloc(enclen);
|
||||
memset(*enc, 0, enclen);
|
||||
memcpy(*enc+8, dec, len); //fill up the encoded array with unencoded stuff
|
||||
|
||||
printf("encrypting .2dx file...\n");
|
||||
for(i = 8; i <= enclen - 8; i+=8) //encode in blocks of 8 bytes, start at byte 8 of data
|
||||
{
|
||||
cur = *enc+i;
|
||||
|
||||
//Step 1: XOR the current block with the encrypted previous block
|
||||
block_xor(cur, cur-8);
|
||||
|
||||
//Step 2: Swap the lower and upper 4 bytes of the block
|
||||
block_swap(cur);
|
||||
|
||||
//Step 3: Further obfuscation with XOR; the lower 4 bytes are untouched, so encrypting works the same as decrypting
|
||||
block_obfus(cur);
|
||||
|
||||
//Step 4: XOR the block (yet again) with DistorteD's key
|
||||
block_xor(cur, keys_11);
|
||||
}
|
||||
|
||||
memcpy(*enc, "%hid", 4); //encryption identifier (Troopers)
|
||||
|
||||
memcpy(*enc+4, &len, 4); //write the length of the decoded 2dx file
|
||||
|
||||
return enclen;
|
||||
}
|
||||
|
||||
int decrypt_2dx(byte *enc, byte **dec)
|
||||
{
|
||||
int i;
|
||||
int mult;
|
||||
int len;
|
||||
byte *buf;
|
||||
byte *cur, *prev;
|
||||
byte *cryptkey;
|
||||
|
||||
buf = enc;
|
||||
|
||||
//identify iidx version
|
||||
|
||||
mult = 1;
|
||||
if(!strncmp(buf, "%eNc", 4))
|
||||
{
|
||||
cryptkey = keys_09; //9th style
|
||||
}
|
||||
else if(!strncmp(buf, "%e10", 4))
|
||||
{
|
||||
cryptkey = keys_10; //10th style
|
||||
}
|
||||
else if(!strncmp(buf, "%e11", 4))
|
||||
{
|
||||
cryptkey = keys_11; //RED
|
||||
}
|
||||
else if(!strncmp(buf, "%e12", 4))
|
||||
{
|
||||
cryptkey = keys_11; //HS+
|
||||
mult = 0;
|
||||
}
|
||||
else if(!strncmp(buf, "%hid", 4))
|
||||
{
|
||||
cryptkey = keys_11; //Troopers
|
||||
mult = 0;
|
||||
}
|
||||
else if(!strncmp(buf, "%iO0", 4))
|
||||
{
|
||||
cryptkey = keys_16; //Empress
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
len = *((int*)(enc + 4));
|
||||
|
||||
if(len%8)
|
||||
len += 8-len%8;
|
||||
|
||||
|
||||
*dec = malloc(len);
|
||||
//decrypt
|
||||
|
||||
if(!(mult == 2)) //skip for unencrypted
|
||||
{
|
||||
memcpy(*dec, buf+8, len-8); //copy the encrypted part
|
||||
memset(buf, 0, 8); //zero the first block to make the loop easier
|
||||
|
||||
for(i = 0; i <= len-16; i+= 8)
|
||||
{
|
||||
cur = *dec + i; //cur points to the current encrypted block to decrypt
|
||||
prev = buf + i; //prev points to the cur-8 in encrypted form
|
||||
|
||||
block_xor(cur, cryptkey);
|
||||
block_obfus(cur);
|
||||
block_swap(cur);
|
||||
|
||||
if(mult) // for versions prior to DistorteD and Empress
|
||||
{
|
||||
block_xor(cur, cryptkey+8);
|
||||
block_obfus(cur);
|
||||
block_xor(cur, cryptkey+16);
|
||||
}
|
||||
|
||||
block_xor(cur, prev);
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
Executable
+103
@@ -0,0 +1,103 @@
|
||||
//wav.h
|
||||
//deals with stuff like reading wavfiles and stuff and such stuff
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int length;
|
||||
char *data;
|
||||
char *name;
|
||||
} WAVE;
|
||||
|
||||
WAVE waves[MAXWAVS*CHARTCOUNT]; //wasteful but safe, whatever...
|
||||
int wavcount; //stores the number of wavefiles to be used in the 2dx file
|
||||
int wavlen; //stores the sum of length all wavefiles we have loaded
|
||||
|
||||
//this fills up "waves" while eliminating duplicates across bme files. while doing so it fills up the bms's structs reference array like this:
|
||||
//for any bms[i].ref[j], j+1 is the index inside the bme file while ref[j] contains the index which will be used in the .2dx and .1 files
|
||||
//TODO: What do we do when files are (intentionally?) missing? needs investigation on what 2dx does with 0-byte waves...
|
||||
void create_wavtable()
|
||||
{
|
||||
int i,j,k;
|
||||
int dup = 0;
|
||||
|
||||
printf("building wave index..");
|
||||
for(i = 0; i < CHARTCOUNT; i++)
|
||||
{
|
||||
if(!bms[i].numwaves) continue; //no waves, no fun
|
||||
|
||||
printf("%s...", CHARTNAMES[i]);
|
||||
|
||||
for(j = 0; j < MAXWAVS; j++)
|
||||
{
|
||||
if(bms[i].wavnames[j][0] != 0) //a wave to load
|
||||
{
|
||||
//now check if we've found a wavefile with the same name before to avoid duplicates
|
||||
for(k = 0; k < wavcount; k++)
|
||||
{
|
||||
if(!strcmp(waves[k].name, bms[i].wavnames[j]))
|
||||
{
|
||||
dup = 1; //this is a duplicate
|
||||
//printf("dup(%d,%d %s == %s)\n", j, k, waves[k].name, bms[i].wavnames[j]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(dup)
|
||||
{
|
||||
bms[i].ref[j] = k+1; //save the reference for later use
|
||||
//printf("%s (%d)\n", bms[i].wavnames[j], k);
|
||||
dup = 0;
|
||||
}
|
||||
else //this is a new wavefile
|
||||
{
|
||||
wavcount++; //iidx starts counting samples at _1_, not 0
|
||||
bms[i].ref[j] = wavcount; //save the reference
|
||||
waves[wavcount-1].name = bms[i].wavnames[j]; //remember decem^H^H^H^H^H the name of the ga..(ry
|
||||
//printf("load(%d,%d %s)\n", j, wavcount, waves[wavcount-1].name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("added %d wave files to table\n", wavcount);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//actually load the wave files
|
||||
int load_waves()
|
||||
{
|
||||
int i, fail=0;
|
||||
FILE *f;
|
||||
|
||||
printf("loading wave files...");
|
||||
for(i = 0; i < wavcount; i++)
|
||||
{
|
||||
f = fopen(waves[i].name, "rb");
|
||||
if(f == NULL)
|
||||
{
|
||||
if(!fail)
|
||||
printf("failed to load waves:\n");
|
||||
//printf("wav referenced but not found: %s\n", waves[i].name);
|
||||
fail++;
|
||||
printf("%s ", waves[i].name);
|
||||
continue;
|
||||
}
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
waves[i].length = (int)ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
waves[i].data = malloc(waves[i].length);
|
||||
|
||||
fread(waves[i].data, waves[i].length, 1, f);
|
||||
|
||||
fclose(f);
|
||||
//printf("loaded wave %s of length %d\n", waves[i].name, waves[i].length);
|
||||
}
|
||||
if(fail)
|
||||
printf("\nout of %d wave files, %d were not found\n", wavcount, fail);
|
||||
else
|
||||
printf("all waves loaded successfully\n");
|
||||
PNEWLINE;
|
||||
return fail;
|
||||
}
|
||||
@@ -0,0 +1,279 @@
|
||||
#define byte unsigned char
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "crypt.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte iidx[4];
|
||||
int version;
|
||||
short int songcount;
|
||||
short int indexcount;
|
||||
int zero;
|
||||
} eoutheader;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte songname[64];
|
||||
byte labelname[32]; //filename
|
||||
byte titlename[64]; //filename
|
||||
byte genrename[32]; //filename
|
||||
byte artistname[32]; //filename
|
||||
|
||||
short int style;
|
||||
short int sort_others;
|
||||
short int sort_bemani;
|
||||
short int sort_bemani2;
|
||||
|
||||
byte diff_n7;
|
||||
byte diff_h7;
|
||||
byte diff_a7;
|
||||
byte diff_n14;
|
||||
byte diff_h14;
|
||||
byte diff_a14;
|
||||
byte diff_beg;
|
||||
byte diff_ex;
|
||||
|
||||
byte zeros[128];
|
||||
byte FF[20];
|
||||
|
||||
int index;
|
||||
int volume;
|
||||
|
||||
char suffix[8];
|
||||
|
||||
int movieoffset; //used as temp var here
|
||||
byte moviefile[32];
|
||||
|
||||
byte bgname[32];
|
||||
byte graphicsfolder[32];
|
||||
|
||||
int layerinfo;
|
||||
byte layerdata[9*32];
|
||||
} songinfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int offh7;
|
||||
int lenh7;
|
||||
int offn7;
|
||||
int lenn7;
|
||||
int offa7;
|
||||
int lena7;
|
||||
int offb;
|
||||
int lenb;
|
||||
int offex1;
|
||||
int lenex1;
|
||||
int offex2;
|
||||
int lenex2;
|
||||
int offh14;
|
||||
int lenh14;
|
||||
int offn14;
|
||||
int lenn14;
|
||||
int offa14;
|
||||
int lena14;
|
||||
} oneheader;
|
||||
|
||||
eoutheader ehead;
|
||||
songinfo cursong;
|
||||
unsigned short int judgements[6] = {0xF0, 0xFA, 0xFF, 0x3, 0x8, 0x12};
|
||||
|
||||
#define PRINTW(a,b) if(warn) {printf("__: %d (%s) - ", cursong.index, cursong.songname);printf(a,b);}
|
||||
#define PRINTA(a,b) if(warn) {printf("**: %d (%s) - ", cursong.index, cursong.songname);printf(a,b);}
|
||||
#define PRINTE(a,b) if(err) {printf("!!: %d (%s) - ", cursong.index, cursong.songname);printf(a,b);}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
FILE *eout, *one, *tdx, *movie;
|
||||
char file[60];
|
||||
char onepart[2], prev, *diff;
|
||||
oneheader onehead;
|
||||
int warn, err;
|
||||
int k, i, l, songcount;
|
||||
int tdxlen;
|
||||
byte *enc, *dec;
|
||||
short int fmt;
|
||||
int pos, wavcount, wavlen;
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
printf("checkeout <decrypted eout> <level>\n\tlevel: v = errors only\n\tvv = warnings only\n\t(default) = errors and warnings");
|
||||
return 0;
|
||||
}
|
||||
|
||||
warn = err = 1;
|
||||
|
||||
if(argc > 2)
|
||||
{
|
||||
if(!strcmp(argv[2], "vv"))
|
||||
err = 0;
|
||||
else if(!strcmp(argv[2], "v"))
|
||||
warn = 0;
|
||||
}
|
||||
|
||||
//warn=err=0;
|
||||
eout = fopen(argv[1], "rb");
|
||||
|
||||
if(!eout)
|
||||
{
|
||||
printf("could not find %s, aborting\n", argv[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
fread(&ehead, sizeof(eoutheader), 1, eout);
|
||||
|
||||
if(strncmp(ehead.iidx, "IIDX", 4))
|
||||
{
|
||||
printf("%s is not a decrypted eout.bin file, aborting\n", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fseek(eout, sizeof(eoutheader) + ehead.indexcount*2, SEEK_SET);
|
||||
|
||||
songcount = 0;
|
||||
|
||||
//while(!feof(eout))
|
||||
for(k = 0; k < ehead.songcount; k++)
|
||||
{
|
||||
fread(&cursong, sizeof(songinfo), 1, eout);
|
||||
songcount++;
|
||||
//printf("ID: %d\tNAME: %s || %d\n", cursong.index, cursong.songname, cursong.style);
|
||||
|
||||
//check for movie file
|
||||
sprintf(file, "movie/%s.4", cursong.moviefile);
|
||||
if(!(movie = fopen(file, "rb")))
|
||||
{PRINTW("moviefile not found: %s\n", file)}
|
||||
else
|
||||
fclose(movie);
|
||||
|
||||
//check mendatory difficulties
|
||||
if(!cursong.diff_h7)
|
||||
{PRINTE("song has no hyper7 chart\n", NULL)}
|
||||
|
||||
if(!cursong.diff_h14)
|
||||
{PRINTE("song has no hyper14 chart\n", NULL)}
|
||||
|
||||
//check .1 files
|
||||
sprintf(file, "sd_data/%04d/%04d.1", cursong.index, cursong.index);
|
||||
printf("checking %s (%d)...\n", file, k);
|
||||
if(!(one = fopen(file, "rb")))
|
||||
{PRINTE(".1 file not found: %s\n", file)}
|
||||
else
|
||||
{
|
||||
//check if difficulties are availible
|
||||
fread(&onehead, sizeof(onehead), 1, one);
|
||||
fclose(one);
|
||||
|
||||
if(cursong.diff_n7 && !onehead.offn7)
|
||||
PRINTE("referenced n7 (%d) chart not found in .1 file\n", cursong.diff_n7)
|
||||
if(cursong.diff_h7 && !onehead.offh7)
|
||||
PRINTE("referenced h7 (%d) chart not found in .1 file\n", cursong.diff_h7)
|
||||
if(cursong.diff_a7 && !onehead.offa7)
|
||||
PRINTE("referenced a7 (%d) chart not found in .1 file\n", cursong.diff_a7)
|
||||
if(cursong.diff_n14 && !onehead.offn14)
|
||||
PRINTE("referenced n14 (%d) chart not found in .1 file\n", cursong.diff_n14)
|
||||
if(cursong.diff_h14 && !onehead.offh14)
|
||||
PRINTE("referenced h14 (%d) chart not found in .1 file\n", cursong.diff_h14)
|
||||
if(cursong.diff_a14 && !onehead.offa14)
|
||||
PRINTE("referenced a14 (%d) chart not found in .1 file\n", cursong.diff_a14)
|
||||
if(cursong.diff_beg && !onehead.offb)
|
||||
PRINTE("referenced beg (%d) chart not found in .1 file\n", cursong.diff_beg)
|
||||
if(cursong.diff_ex && !onehead.offex1)
|
||||
PRINTE("referenced ex (%d) chart not found in .1 file\n", cursong.diff_ex)
|
||||
|
||||
if(!cursong.diff_n7 && onehead.offn7)
|
||||
PRINTW("unreferenced n7 chart in .1 file\n", NULL)
|
||||
if(!cursong.diff_h7 && onehead.offh7)
|
||||
PRINTW("unreferenced h7 chart in .1 file\n", NULL)
|
||||
if(!cursong.diff_a7 && onehead.offa7)
|
||||
PRINTW("unreferenced a7 chart in .1 file\n", NULL)
|
||||
if(!cursong.diff_n14 && onehead.offn14)
|
||||
PRINTW("unreferenced n14 chart in .1 file\n", NULL)
|
||||
if(!cursong.diff_h14 && onehead.offh14)
|
||||
PRINTW("unreferenced h14 chart in .1 file\n", NULL)
|
||||
if(!cursong.diff_a14 && onehead.offa14)
|
||||
PRINTW("unreferenced a14 chart in .1 file\n", NULL)
|
||||
if(!cursong.diff_beg && onehead.offb)
|
||||
PRINTW("unreferenced beg chart in .1 file\n", NULL)
|
||||
if(!cursong.diff_ex && onehead.offex1)
|
||||
PRINTA("unreferenced ex chart in .1 file\n", NULL)
|
||||
|
||||
if(cursong.diff_ex)
|
||||
PRINTA("ex chart (%d) in eout\n", cursong.diff_ex)
|
||||
if(onehead.offex1)
|
||||
PRINTA("ex1 chart in .1 file\n", NULL)
|
||||
if(onehead.offex2)
|
||||
PRINTA("ex2 chart in .1 file\n", NULL)
|
||||
|
||||
//todo: .1 file sanity check?
|
||||
}
|
||||
|
||||
|
||||
//check .2dx files
|
||||
onepart[0] = prev = 0xFF;
|
||||
onepart[1] = '\0';
|
||||
diff = &cursong.diff_n7;
|
||||
|
||||
for(i = 0; i <= 7; i++)
|
||||
{
|
||||
if(!diff[i])
|
||||
continue;
|
||||
if(prev == cursong.suffix[i])
|
||||
continue;
|
||||
else
|
||||
onepart[0] = prev = cursong.suffix[i];
|
||||
|
||||
if(onepart[0] == '0')
|
||||
onepart[0] = '\0';
|
||||
|
||||
sprintf(file, "sd_data/%04d/%04d%s.2dx", cursong.index, cursong.index, onepart);
|
||||
//printf("checking %s (%d)...\n", file, k);
|
||||
if(!(tdx = fopen(file, "rb")))
|
||||
{PRINTE(".2dx file not found: %s\n", file)}
|
||||
else
|
||||
{
|
||||
//printf("decoding: %s...", file);
|
||||
fseek(tdx, 0, SEEK_END);
|
||||
tdxlen = (int)ftell(tdx);
|
||||
if(tdxlen > 25000000)
|
||||
{PRINTE("%s larger than 25,000,000 bytes\n", file)}
|
||||
rewind(tdx);
|
||||
enc = malloc(tdxlen);
|
||||
fread(enc, 1, tdxlen, tdx);
|
||||
fclose(tdx);
|
||||
decrypt_2dx(enc, &dec);
|
||||
//printf("done\n");
|
||||
memcpy(&wavcount, dec + 20, 4);
|
||||
pos = 72;
|
||||
|
||||
for(l=0; l < wavcount-1; l++)
|
||||
{
|
||||
memcpy(&fmt, dec + *((int*)(dec+pos)) + 24 + 20, 2);
|
||||
memcpy(&wavlen, dec + *((int*)(dec+pos)) + 8, 4);
|
||||
pos += 4;
|
||||
//printf("(%d %d %d)\n", wavcount, pos, *((int*)(dec+pos)));
|
||||
/*if(wavlen == 0)
|
||||
{
|
||||
{PRINTE("%s has 0-length wav files\n", file)}
|
||||
break;
|
||||
}
|
||||
if(fmt != 2)
|
||||
{
|
||||
{PRINTE("%s has unconverted wav files\n", file)}
|
||||
break;
|
||||
}*/
|
||||
}
|
||||
free(enc);
|
||||
free(dec);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("songcount: %d", songcount);
|
||||
|
||||
getchar();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
//create2dx_dumb.c by ryuuou
|
||||
//Authoring the 2dx file is based on create2dx.c by Kitaru
|
||||
//Encrypting is taking the reverse way from crack2dx.c by some unknown author (at least to me)
|
||||
//Packs BME-style sequenced .wav (01.wav to ZZ.wav, but should work with BMS-style 01 - FF as well) in the current folder
|
||||
//into an unencrypted unencrypted.2dx and an DistorteD-style encrypted encrypted.2dx
|
||||
//Takes no arguments and always outputs to the same files; only works with uppercase on unix but should work with lowercase on windows;
|
||||
//We also assume that the ascending order or the wavefiles equals their order in the corresponding bme/bms file
|
||||
//...hence "_dumb"
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
//wav files from 01-0A-0Z-10-ZZ (you get it) = 36*36 - 1
|
||||
#define MAXWAVS (36*36-1)
|
||||
|
||||
#define CIELMOD8(a) (!(a%8)?(a):((a)+(8-(a)%8)))
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
typedef struct{
|
||||
int length;
|
||||
byte *data;
|
||||
int offset;
|
||||
} wavefile;
|
||||
|
||||
const byte aftertoc[24] = {
|
||||
'2', 'D', 'X', '9', //const string
|
||||
0x18, 0x00, 0x00, 0x00, //headersize (== 24)
|
||||
0x00, 0x00, 0x00, 0x00, //size of wave file (written at runtime)
|
||||
0x30, 0x32, 0xFF, 0xFF, //panning/initial volume?
|
||||
0x40, 0x00, 0x08, 0x00, //??? (64, 0, 8, 0)
|
||||
0x00, 0x00, 0x00, 0x00 //??? (0, 0, 0, 0)
|
||||
};
|
||||
|
||||
|
||||
//helper function for BME numbering weirdness;
|
||||
//converts a number to a 01-ZZ style string
|
||||
char *itostr(int i)
|
||||
{
|
||||
char *str;
|
||||
|
||||
str = malloc(3);
|
||||
|
||||
str[0] = i / 36; //works because this floors
|
||||
if(str[0] > 9)
|
||||
str[0] += 7; //there's a gap of 8 characters between '9' and 'A'
|
||||
str[0] += 48; //fancy charactermap magic
|
||||
|
||||
str[1] = i % 36; //mod operator = <3
|
||||
if(str[1] > 9)
|
||||
str[1] += 7;
|
||||
str[1] += 48;
|
||||
|
||||
str[2] = '\0';
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
///
|
||||
/// encryption related
|
||||
///
|
||||
|
||||
byte cryptkey[] = { //empress
|
||||
0x28, 0x22, 0x28, 0x54, 0x63, 0x3F, 0x0E, 0x42,
|
||||
0x6F, 0x45, 0x4E, 0x50, 0x67, 0x53, 0x61, 0x7C,
|
||||
0x04, 0x46, 0x00, 0x3B, 0x13, 0x2B, 0x45, 0x6A };
|
||||
|
||||
//XORs two 8 byte blocks
|
||||
void block_xor(byte *data, byte *parm)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
data[i] ^= parm[i];
|
||||
return;
|
||||
}
|
||||
|
||||
//Swaps the lower 4 bytes with the upper 4 bytes
|
||||
void block_swap(byte *data)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 4 ; i++)
|
||||
{
|
||||
data[i] ^= data[i+4]; //let's do this without temp variables ;D
|
||||
data[i+4] ^= data[i];
|
||||
data[i] ^= data[i+4];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//I bow to whoever figured this one out
|
||||
void block_obfus(byte *data)
|
||||
{
|
||||
byte a,b,c,d,e,f,g,h,i;
|
||||
|
||||
a = data[0] * 63;
|
||||
b = a + data[3];
|
||||
c = data[1] * 17;
|
||||
d = c + data[2];
|
||||
e = d + b;
|
||||
f = e * data[3];
|
||||
g = f + b + 51;
|
||||
h = b ^ d;
|
||||
i = g ^ e;
|
||||
|
||||
data[4] ^= h;
|
||||
data[5] ^= d;
|
||||
data[6] ^= i;
|
||||
data[7] ^= g;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//Encrypts length bytes of inc and returns a pointer to the encoded array
|
||||
byte *encrypt(byte *inc, int length)
|
||||
{
|
||||
byte *data;
|
||||
byte *cur; //current block of 8 bytes
|
||||
|
||||
int i, enclen;
|
||||
|
||||
enclen = 8 + CIELMOD8(length); //let's just make sure we're not running into uninitialized memory while encrypting
|
||||
data = malloc(enclen);
|
||||
|
||||
memset(data, 0, enclen);
|
||||
memcpy(data+8, inc, length); //fill up the encoded array with unencoded stuff
|
||||
|
||||
|
||||
for(i = 8; i <= enclen-8; i+=8) //encode in blocks of 8 bytes, start at byte 8 of data
|
||||
{
|
||||
cur = data+i;
|
||||
|
||||
block_xor(cur, cur-8);
|
||||
block_xor(cur, cryptkey+16);
|
||||
block_obfus(cur);
|
||||
block_xor(cur, cryptkey+8);
|
||||
block_swap(cur);
|
||||
block_obfus(cur);
|
||||
block_xor(cur, cryptkey);
|
||||
}
|
||||
|
||||
memcpy(data, "%iO0", 4); //encryption identifier
|
||||
enclen -= 8;
|
||||
memcpy(data+4, &enclen, 4); //write the length of the decoded 2dx file
|
||||
return data;
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
wavefile waves[MAXWAVS];
|
||||
|
||||
FILE *wavfile;
|
||||
FILE *out;
|
||||
FILE *bmsfile;
|
||||
|
||||
byte *decrypted, *encrypted, *bms;
|
||||
|
||||
int wav = 0; //wavefile count
|
||||
int pos = 0, i = 0, ii = 0, j, firstwav = 0, bmslength = 0, len = 0;
|
||||
int length = 72; //use this to compute the final file length along the way (72 = 2dx headersize)
|
||||
int prev, maxwav;
|
||||
|
||||
char wavepath[32]; //helperstring; ugly but works
|
||||
|
||||
int bmestyle = 0;
|
||||
memset(waves, 0, MAXWAVS*sizeof(wavefile));
|
||||
|
||||
printf("reading samples...");
|
||||
for(i = 1; i <= MAXWAVS; i++) //this is really inefficient but works, meh
|
||||
{
|
||||
if(bmestyle == 0)
|
||||
{
|
||||
sprintf(wavepath, "%s.wav", itostr(i));
|
||||
}
|
||||
else if(bmestyle == 1)
|
||||
{
|
||||
sprintf(wavepath, "%d.wav", i);
|
||||
}
|
||||
|
||||
wavfile = fopen(wavepath, "rb");
|
||||
|
||||
if (wavfile != NULL)
|
||||
{
|
||||
//open the wave file and save its length and contents to the array
|
||||
printf("%s...",wavepath);
|
||||
fseek(wavfile, 0, SEEK_END);
|
||||
waves[i-1].length = (int)ftell(wavfile);
|
||||
fseek(wavfile, 0, SEEK_SET);
|
||||
|
||||
waves[i-1].data = malloc(waves[i-1].length);
|
||||
|
||||
fread(waves[i-1].data, waves[i-1].length, 1, wavfile);
|
||||
|
||||
fclose(wavfile);
|
||||
wav++;
|
||||
length += 4 + 24 + waves[i-1].length; //toc index + header + actual length
|
||||
maxwav = i;
|
||||
}
|
||||
}
|
||||
|
||||
if(wav == 0) //learn2placefilesindirectories
|
||||
{
|
||||
printf("no wave files found, go die in a fire\n");
|
||||
return 0;
|
||||
}
|
||||
printf("OK\n");
|
||||
printf("\ntotal samplecount: %d, actual wavcount in .2dx: %d\n\n",wav, maxwav);
|
||||
|
||||
wav = maxwav;
|
||||
|
||||
for(i = maxwav-2; i >= 0; i--)
|
||||
{
|
||||
if(waves[i].length == 0)
|
||||
{
|
||||
waves[i].data = waves[i+1].data;
|
||||
waves[i].length = waves[i+1].length;
|
||||
printf("added wav: %i, len %i\n", i, waves[i].length);
|
||||
length += waves[i].length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//start constructing the 2dx file
|
||||
decrypted = malloc(length);
|
||||
memset(decrypted, 0, length);
|
||||
|
||||
firstwav = 72+wav*4; //ugly...
|
||||
memcpy(decrypted + 16, &firstwav, 4); //first wave position = 2dx header + size of TOC (= 72 + wavecount * sizeof(int))
|
||||
memcpy(decrypted + 20, &wav, 4); //the total numbers of waves
|
||||
|
||||
printf("writing samples...");
|
||||
pos = firstwav;
|
||||
for(i = 0; i < maxwav; i++)
|
||||
{
|
||||
memcpy(decrypted+pos, aftertoc, 8); //"2DX9" + headersize (== 24)
|
||||
memcpy(decrypted+pos+8, &waves[i].length, 4); //size of the wave
|
||||
memcpy(decrypted+pos+12, aftertoc+12, 12); //rest of the header
|
||||
memcpy(decrypted+pos+24, waves[i].data, waves[i].length); //write the actual wav
|
||||
memcpy(decrypted+0x48+(i*4), &pos, 4); //write toc entry
|
||||
pos += 24 + waves[i].length;
|
||||
}
|
||||
printf("OK\n");
|
||||
|
||||
printf("encrypting...");
|
||||
encrypted = encrypt(decrypted, length);
|
||||
printf("OK\n");
|
||||
|
||||
out = fopen("output.2dx", "wb"); //open the 2dx file and write out the array
|
||||
fwrite(encrypted, 8+CIELMOD8(length), 1, out);
|
||||
fclose(out);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,207 @@
|
||||
|
||||
//crypt.h
|
||||
//code for encrypting .2dx files with DistorteD's algorithm/key
|
||||
|
||||
//apparently konami's internal implementation of this doesn't do proper boundchecking and also doesn't zero its buffers, so there is some garbage left behind in the original files
|
||||
|
||||
//format of encrypted .2dx file:
|
||||
//header:
|
||||
//4 bytes: identifier ("%e12" in case of distorted)
|
||||
//4 bytes: length of the decrypted .2dx file
|
||||
//after this follows the encrypted data
|
||||
|
||||
|
||||
#define byte unsigned char
|
||||
|
||||
byte keys_09[] = { //9th style
|
||||
0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B,
|
||||
0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF,
|
||||
0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B };
|
||||
|
||||
byte keys_10[] = { //10th style
|
||||
0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4,
|
||||
0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2,
|
||||
0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21 };
|
||||
|
||||
byte keys_11[] = { //Happy Sky+
|
||||
0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03,
|
||||
0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7,
|
||||
0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F };
|
||||
|
||||
byte keys_16[] = { //empress
|
||||
0x28, 0x22, 0x28, 0x54, 0x63, 0x3F, 0x0E, 0x42,
|
||||
0x6F, 0x45, 0x4E, 0x50, 0x67, 0x53, 0x61, 0x7C,
|
||||
0x04, 0x46, 0x00, 0x3B, 0x13, 0x2B, 0x45, 0x6A };
|
||||
|
||||
byte cryptkey[8] = { 0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03 }; //DistorteD'S encryption key
|
||||
|
||||
//XORs two 8 byte blocks
|
||||
void block_xor(byte *data, byte *parm)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
data[i] ^= parm[i];
|
||||
return;
|
||||
}
|
||||
|
||||
//Swaps the lower 4 bytes with the upper 4 bytes
|
||||
void block_swap(byte *data)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 4 ; i++)
|
||||
{
|
||||
data[i] ^= data[i+4]; //let's do this without temp variables ;D
|
||||
data[i+4] ^= data[i];
|
||||
data[i] ^= data[i+4];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//I bow to whoever figured this one out
|
||||
void block_obfus(byte *data)
|
||||
{
|
||||
byte a,b,c,d,e,f,g,h,i;
|
||||
|
||||
a = data[0] * 63;
|
||||
b = a + data[3];
|
||||
c = data[1] * 17;
|
||||
d = c + data[2];
|
||||
e = d + b;
|
||||
f = e * data[3];
|
||||
g = f + b + 51;
|
||||
h = b ^ d;
|
||||
i = g ^ e;
|
||||
|
||||
data[4] ^= h;
|
||||
data[5] ^= d;
|
||||
data[6] ^= i;
|
||||
data[7] ^= g;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//encrypts the .2dx file; this simply takes the reverse way from crack2dx.c by an unknown author (QQQ again, but HOLY SHIT that code is a mess (and buggy))
|
||||
int encrypt_2dx(byte *dec, int len, byte **enc)
|
||||
{
|
||||
byte *cur; //current block of 8 bytes
|
||||
int enclen;
|
||||
|
||||
int i;
|
||||
|
||||
//ciel to mod 8;
|
||||
|
||||
enclen = len + 8; //length of the encoded 2dx = length of unencoded 2dx + headersize (8 bytes)
|
||||
|
||||
if(enclen%8)
|
||||
enclen += 8-enclen%8;
|
||||
|
||||
*enc = malloc(enclen);
|
||||
memset(*enc, 0, enclen);
|
||||
memcpy(*enc+8, dec, len); //fill up the encoded array with unencoded stuff
|
||||
|
||||
printf("encrypting .2dx file...\n");
|
||||
for(i = 8; i <= enclen - 8; i+=8) //encode in blocks of 8 bytes, start at byte 8 of data
|
||||
{
|
||||
cur = *enc+i;
|
||||
|
||||
//Step 1: XOR the current block with the encrypted previous block
|
||||
block_xor(cur, cur-8);
|
||||
|
||||
//Step 2: Swap the lower and upper 4 bytes of the block
|
||||
block_swap(cur);
|
||||
|
||||
//Step 3: Further obfuscation with XOR; the lower 4 bytes are untouched, so encrypting works the same as decrypting
|
||||
block_obfus(cur);
|
||||
|
||||
//Step 4: XOR the block (yet again) with DistorteD's key
|
||||
block_xor(cur, keys_11);
|
||||
}
|
||||
|
||||
memcpy(*enc, "%hid", 4); //encryption identifier (Troopers)
|
||||
|
||||
memcpy(*enc+4, &len, 4); //write the length of the decoded 2dx file
|
||||
|
||||
return enclen;
|
||||
}
|
||||
|
||||
int decrypt_2dx(byte *enc, byte **dec)
|
||||
{
|
||||
int i;
|
||||
int mult;
|
||||
int len;
|
||||
byte *buf;
|
||||
byte *cur, *prev;
|
||||
byte *cryptkey;
|
||||
|
||||
buf = enc;
|
||||
|
||||
//identify iidx version
|
||||
|
||||
mult = 1;
|
||||
if(!strncmp(buf, "%eNc", 4))
|
||||
{
|
||||
cryptkey = keys_09; //9th style
|
||||
}
|
||||
else if(!strncmp(buf, "%e10", 4))
|
||||
{
|
||||
cryptkey = keys_10; //10th style
|
||||
}
|
||||
else if(!strncmp(buf, "%e11", 4))
|
||||
{
|
||||
cryptkey = keys_11; //RED
|
||||
}
|
||||
else if(!strncmp(buf, "%e12", 4))
|
||||
{
|
||||
cryptkey = keys_11; //HS+
|
||||
mult = 0;
|
||||
}
|
||||
else if(!strncmp(buf, "%hid", 4))
|
||||
{
|
||||
cryptkey = keys_11; //Troopers
|
||||
mult = 0;
|
||||
}
|
||||
else if(!strncmp(buf, "%iO0", 4))
|
||||
{
|
||||
cryptkey = keys_16; //Empress
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
len = *((int*)(enc + 4));
|
||||
|
||||
if(len%8)
|
||||
len += 8-len%8;
|
||||
|
||||
|
||||
*dec = malloc(len);
|
||||
//decrypt
|
||||
|
||||
if(!(mult == 2)) //skip for unencrypted
|
||||
{
|
||||
memcpy(*dec, buf+8, len-8); //copy the encrypted part
|
||||
memset(buf, 0, 8); //zero the first block to make the loop easier
|
||||
|
||||
for(i = 0; i <= len-16; i+= 8)
|
||||
{
|
||||
cur = *dec + i; //cur points to the current encrypted block to decrypt
|
||||
prev = buf + i; //prev points to the cur-8 in encrypted form
|
||||
|
||||
block_xor(cur, cryptkey);
|
||||
block_obfus(cur);
|
||||
block_swap(cur);
|
||||
|
||||
if(mult) // for versions prior to DistorteD and Empress
|
||||
{
|
||||
block_xor(cur, cryptkey+8);
|
||||
block_obfus(cur);
|
||||
block_xor(cur, cryptkey+16);
|
||||
}
|
||||
|
||||
block_xor(cur, prev);
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
@@ -0,0 +1,479 @@
|
||||
/* cs2ac by 697@14 */
|
||||
/*
|
||||
09/05/22 v1.0 CS GOLD専用版
|
||||
09/05/24 v1.1 CS DJTに仮対応
|
||||
09/05/28 v1.2 リファクタリング
|
||||
09/05/30 v1.3 CS DistorteD以前に仮対応
|
||||
*/
|
||||
|
||||
|
||||
/* 作業ながらのあれこれ
|
||||
/*
|
||||
0x07: 3rd style CS BGM autoplay
|
||||
0x0A: ??? style CS BGM autoplay
|
||||
0x82, 0x82: 3rd style CS キー音変更?
|
||||
旧CSバージョンDP譜面終了宣言イベントバグ対応
|
||||
BGM自動演奏(index==1)が複数発動させない
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAGNIA 16.71309 // 3rd style - 8th style
|
||||
#define MAGNIB 16.68335 // 9th style - DJ TROOPERS
|
||||
|
||||
#define NAMEMAX 32
|
||||
|
||||
double version = 1.3;
|
||||
|
||||
FILE *in, *out;
|
||||
int i_timeA;
|
||||
double i_timeB;
|
||||
int d_type;
|
||||
int b_data[3];
|
||||
int t_notes[7]; // 0:SPN 1:SPH 2:SPA 3:SPB 4:DPN 5:DPN 6:DPA
|
||||
int f_size[7]; // 0:SPN 1:SPH 2:SPA 3:SPB 4:DPN 5:DPN 6:DPA
|
||||
int head_adrs;
|
||||
int f_exist[7]; // 0:SPN 1:SPH 2:SPA 3:SPB 4:DPN 5:DPN 6:DPA
|
||||
int filetype;
|
||||
int t_base_type;
|
||||
int maxwav;
|
||||
char inName[NAMEMAX],
|
||||
outName[NAMEMAX];
|
||||
|
||||
/* ヘッダ書き換え */
|
||||
int headWritingUnit(int dif){
|
||||
int adrsA, adrsB;
|
||||
|
||||
switch(dif) {
|
||||
case 0: adrsA = 0x08; adrsB = 0x0c; break; // SPN
|
||||
case 1: adrsA = 0x00; adrsB = 0x04; break; // SPH
|
||||
case 2: adrsA = 0x10; adrsB = 0x14; break; // SPA
|
||||
case 3: adrsA = 0x18; adrsB = 0x1c; break; // SPB
|
||||
case 4: adrsA = 0x38; adrsB = 0x3c; break; // DPN
|
||||
case 5: adrsA = 0x30; adrsB = 0x34; break; // DPH
|
||||
case 6: adrsA = 0x40; adrsB = 0x44; break; // DPA
|
||||
}
|
||||
|
||||
fseek(out, adrsA, SEEK_SET);
|
||||
fwrite(&head_adrs, 1, 4, out);
|
||||
fseek(out, adrsB, SEEK_SET);
|
||||
fwrite(&f_size[dif], 1, 4, out);
|
||||
head_adrs += f_size[dif];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* データ書き込み */
|
||||
int dataWritingUnit(int dif){
|
||||
i_timeB = i_timeA;
|
||||
switch(t_base_type){
|
||||
case 0:
|
||||
i_timeB *= MAGNIA;
|
||||
break;
|
||||
case 1:
|
||||
i_timeB *= MAGNIB;
|
||||
break;
|
||||
}
|
||||
i_timeA = i_timeB;
|
||||
fwrite(&i_timeA, 1, 4, out);
|
||||
fwrite(&d_type, 1, 1, out);
|
||||
fwrite(&b_data[0], 1, 1, out);
|
||||
fwrite(&b_data[1], 1, 1, out);
|
||||
fwrite(&b_data[2], 1, 1, out);
|
||||
f_size[dif] += 8;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cs2ac(int dif){
|
||||
/* 変数設定 */
|
||||
int i;
|
||||
int temp;
|
||||
int dp_flag;
|
||||
int rtm_flag = 0;
|
||||
int start_flag = 0;
|
||||
int wav01_auto = 0;
|
||||
|
||||
/* 処理部分 */
|
||||
/* 変数初期化 */
|
||||
t_base_type = 0;
|
||||
f_size[dif] = 0;
|
||||
t_notes[dif] = 0;
|
||||
|
||||
if(dif >= 4){
|
||||
dp_flag = 1;
|
||||
}
|
||||
else {
|
||||
dp_flag = 0;
|
||||
}
|
||||
|
||||
fseek(out, head_adrs, SEEK_SET);
|
||||
|
||||
/* サブヘッダ書き込み */
|
||||
/* [00 00 00 00 10 00 00 00][00 00 00 00 10 01 00 00] */
|
||||
temp = 0x00;
|
||||
for(i=0;i<0x04;i++){
|
||||
fwrite(&temp, 1, 1, out);
|
||||
}
|
||||
temp = 0x10;
|
||||
fwrite(&temp, 1, 1, out);
|
||||
temp = 0x00;
|
||||
for(i=0;i<0x07;i++){
|
||||
fwrite(&temp, 1, 1, out);
|
||||
}
|
||||
temp = 0x0110;
|
||||
fwrite(&temp, 1, 2, out);
|
||||
temp = 0x00;
|
||||
for(i=0;i<0x02;i++){
|
||||
fwrite(&temp, 1, 1, out);
|
||||
}
|
||||
f_size[dif] += 16;
|
||||
|
||||
/* 譜面終端まで繰り返し */
|
||||
while((d_type != 0x06)||((dp_flag != 2)&&(dp_flag != 5))) {
|
||||
/* データ初期化 */
|
||||
i_timeA = 0x00;
|
||||
d_type = 0x00;
|
||||
b_data[0] = 0x00;
|
||||
b_data[1] = 0x00;
|
||||
b_data[2] = 0x00;
|
||||
|
||||
/* データ読み込み */
|
||||
switch(filetype){
|
||||
case 1: case 2: // CS3(DJT,GOLD),CS(DistorteD - 7th style)
|
||||
fread(&i_timeA, 1, 4, in);
|
||||
fread(&d_type, 1, 1, in);
|
||||
fread(&b_data[0], 1, 1, in);
|
||||
fread(&b_data[1], 1, 1, in);
|
||||
fread(&b_data[2], 1, 1, in);
|
||||
break;
|
||||
|
||||
case 3: // CS2 (6th style - 3rd style)
|
||||
fread(&i_timeA, 1, 2, in);
|
||||
fread(&d_type, 1, 1, in);
|
||||
fread(&b_data[0], 1, 1, in);
|
||||
b_data[1] = 0x00;
|
||||
b_data[2] = 0x00;
|
||||
break;
|
||||
}
|
||||
|
||||
//一部の旧CSバージョン譜面バグ対応(DPなのに2Pの譜面終了宣言イベントがない)
|
||||
if((short int)i_timeA == 0x7FFF && dp_flag == 3)
|
||||
d_type = 0x06;
|
||||
|
||||
/* データタイプで振り分け */
|
||||
switch(d_type) {
|
||||
/* ノートイベント */
|
||||
case 0x00: case 0x10: case 0x20: case 0x30: case 0x40: case 0x50: case 0x60: case 0x70:
|
||||
case 0x01: case 0x11: case 0x21: case 0x31: case 0x41: case 0x51: case 0x61: case 0x71:
|
||||
if (start_flag == 0){ break; }
|
||||
t_notes[dif]++;
|
||||
|
||||
b_data[0] = d_type / 0x10;
|
||||
d_type %= 0x10;
|
||||
|
||||
dataWritingUnit(dif);
|
||||
break;
|
||||
|
||||
/* キー音変更 */
|
||||
case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52: case 0x62: case 0x72:
|
||||
case 0x03: case 0x13: case 0x23: case 0x33: case 0x43: case 0x53: case 0x63: case 0x73:
|
||||
switch(filetype){
|
||||
case 3: b_data[1] = b_data[0]; break;
|
||||
}
|
||||
if (maxwav < (b_data[2]*0x100 + b_data[1])){
|
||||
maxwav = b_data[2]*0x100 + b_data[1];
|
||||
}
|
||||
if ((b_data[2]*0x100 + b_data[1]) == 0){
|
||||
printf("\nFile \"00\" assigned ! : %08x : %02x\n",i_timeA ,d_type);
|
||||
}
|
||||
|
||||
/* 小節線 */
|
||||
case 0x0C: case 0x1C:
|
||||
b_data[0] = d_type / 0x10;
|
||||
d_type %= 0x10;
|
||||
|
||||
dataWritingUnit(dif);
|
||||
break;
|
||||
|
||||
/* 判定幅設定 */
|
||||
case 0x08: case 0x18: case 0x28: case 0x38: case 0x48: case 0x58:
|
||||
switch(filetype){
|
||||
case 3: // 6th style 解析バグ対策
|
||||
if(d_type == 0x48){
|
||||
b_data[1] = 0x08;
|
||||
b_data[0] = 0x04;
|
||||
}
|
||||
else {
|
||||
b_data[1] = b_data[0];
|
||||
b_data[0] = d_type / 0x10;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
b_data[1] = b_data[0];
|
||||
b_data[0] = d_type / 0x10;
|
||||
break;
|
||||
}
|
||||
d_type %= 0x10;
|
||||
|
||||
dataWritingUnit(dif);
|
||||
break;
|
||||
|
||||
/* 自動演奏 */
|
||||
case 0xF7:
|
||||
break;
|
||||
case 0x87: case 0x17: case 0x07: case 0xA7:
|
||||
switch(filetype){
|
||||
case 3:
|
||||
b_data[1] = b_data[0];
|
||||
b_data[0] = 0x00;
|
||||
}
|
||||
d_type %= 0x10;
|
||||
|
||||
if (maxwav < (b_data[2]*0x100 + b_data[1])){
|
||||
maxwav = b_data[2]*0x100 + b_data[1];
|
||||
}
|
||||
|
||||
if((b_data[2]*0x100 + b_data[1]) == 1)
|
||||
{
|
||||
if(wav01_auto)
|
||||
break;
|
||||
else
|
||||
wav01_auto++;
|
||||
}
|
||||
|
||||
dataWritingUnit(dif);
|
||||
break;
|
||||
|
||||
|
||||
/* BPM変更 */
|
||||
case 0x04: case 0x14: case 0x24: case 0x34:
|
||||
b_data[2] = d_type / 0x10;
|
||||
b_data[1] = b_data[0];
|
||||
b_data[0] = 0x01;
|
||||
d_type %= 0x10;
|
||||
dataWritingUnit(dif);
|
||||
|
||||
start_flag++;
|
||||
|
||||
switch(filetype){
|
||||
case 3:
|
||||
if(rtm_flag == 0){
|
||||
d_type = 0x05;
|
||||
b_data[0] = 0x04;
|
||||
b_data[1] = 0x04;
|
||||
b_data[2] = 0x00;
|
||||
dataWritingUnit(dif);
|
||||
rtm_flag++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
/* 拍子変更 */
|
||||
case 0x05:
|
||||
switch(filetype){
|
||||
case 3:
|
||||
break;
|
||||
default:
|
||||
dataWritingUnit(dif);
|
||||
}
|
||||
break;
|
||||
|
||||
/* 譜面終了宣言 */
|
||||
case 0x06:
|
||||
if(dp_flag == 3){
|
||||
b_data[0] = 0x01;
|
||||
}
|
||||
dataWritingUnit(dif);
|
||||
|
||||
if((dp_flag == 0)||(dp_flag == 3)){
|
||||
temp = 0x7FFFFFFF;
|
||||
fwrite(&temp, 1, 4, out);
|
||||
temp = 0x00;
|
||||
for(i=0;i<0x04;i++){
|
||||
fwrite(&temp, 1, 1, out);
|
||||
}
|
||||
f_size[dif] += 8;
|
||||
}
|
||||
dp_flag += 2;
|
||||
break;
|
||||
|
||||
/* 単位時間判定 */
|
||||
case 0x2B:
|
||||
t_base_type = 1;
|
||||
break;
|
||||
|
||||
case 0x4C:
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Unknown data type! : %06x : %02x (%02x %02x %02x)\n",i_timeA ,d_type, b_data[0], b_data[1], b_data[2]);
|
||||
break;
|
||||
}
|
||||
//printf("DEBUG: %06x : %02x (%02x %02x %02x); %d\n",i_timeA ,d_type, b_data[0], b_data[1], b_data[2], dp_flag);
|
||||
}
|
||||
|
||||
/* サブヘッダのTotalNotes書き換え */
|
||||
fseek(out, head_adrs + 0x06, SEEK_SET);
|
||||
fwrite(&t_notes[dif], 1, 2, out);
|
||||
|
||||
/* ヘッダ書き換え */
|
||||
headWritingUnit(dif);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* .1ヘッダ生成 */
|
||||
int makeHeader(void){
|
||||
int i;
|
||||
int temp;
|
||||
/* ヘッダ仮置き */
|
||||
temp = 0x00;
|
||||
for(i=0;i<0x60;i++){
|
||||
fwrite(&temp, 1, 1, out);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* CS譜面ファイル確認 */
|
||||
int checkScoreFile(void){
|
||||
int i,j;
|
||||
int existflag;
|
||||
int headerflag;
|
||||
char f_type[NAMEMAX];
|
||||
|
||||
filetype = 0;
|
||||
headerflag = 0;
|
||||
|
||||
/* CS3ファイル */
|
||||
if((in = fopen("cs3.raw", "rb")) == NULL) {
|
||||
printf("cs3.raw : Not Found.\n\n");
|
||||
}
|
||||
else {
|
||||
printf("cs3.raw : Read success / ");
|
||||
filetype = 1;
|
||||
|
||||
/* DJT,GOLD判別 */
|
||||
fseek(in, 0, SEEK_END);
|
||||
if (ftell(in) / 0x10000 == 6){
|
||||
f_exist[3] = -1;
|
||||
printf("CS3 type : GOLD\n\n");
|
||||
}
|
||||
else {
|
||||
printf("CS3 type : DJ TROOPERS\n\n");
|
||||
}
|
||||
|
||||
/* 譜面存在フラグ検出 */
|
||||
printf("Prosessing ");
|
||||
for(j=0;j<7;j++){
|
||||
/* フラグ読み込み */
|
||||
existflag = 0;
|
||||
fseek(in, 0x10000 * j, SEEK_SET);
|
||||
fread(&existflag, 1, 1, in);
|
||||
fseek(in, 0x10000 * j, SEEK_SET);
|
||||
|
||||
/* GOLDの場合SPB分を飛ばす */
|
||||
if((j >= 3)&&(f_exist[3] == -1)){
|
||||
j++;
|
||||
}
|
||||
|
||||
/* フラグ判定 */
|
||||
if(existflag == 0x00){ // 存在しない
|
||||
f_exist[j] = 0;
|
||||
}
|
||||
else { // 存在する
|
||||
/* ヘッダ生成 */
|
||||
if(headerflag == 0){
|
||||
makeHeader();
|
||||
headerflag++;
|
||||
}
|
||||
/* 変換処理 */
|
||||
printf("-");
|
||||
cs2ac(j);
|
||||
printf("> ");
|
||||
f_exist[j] = 1;
|
||||
}
|
||||
|
||||
/* GOLDの場合ループカウンタを戻す */
|
||||
if((j >= 3)&&(j != 6)&&(f_exist[3] == -1)){ j--; }
|
||||
}
|
||||
printf("OK\n");
|
||||
}
|
||||
|
||||
/* CS,CS2,CS5ファイル */
|
||||
for(i=2;i<=3;i++){
|
||||
if(filetype != 0){
|
||||
break;
|
||||
}
|
||||
|
||||
switch(i){
|
||||
case 2: sprintf(f_type, "cs"); break; // 7th style - DistorteD
|
||||
case 3: sprintf(f_type, "cs2"); break; // 3rd style - 6th style
|
||||
// case 4: sprintf(f_type, "cs5"); break; // ??
|
||||
}
|
||||
for(j=0;j<7;j++){
|
||||
switch(j){
|
||||
case 0: sprintf(inName, "n7.%s",f_type); break;
|
||||
case 1: sprintf(inName, "h7.%s",f_type); break;
|
||||
case 2: sprintf(inName, "a7.%s",f_type); break;
|
||||
case 3: sprintf(inName, "b.%s",f_type); break;
|
||||
case 4: sprintf(inName, "n14.%s",f_type); break;
|
||||
case 5: sprintf(inName, "h14.%s",f_type); break;
|
||||
case 6: sprintf(inName, "a14.%s",f_type); break;
|
||||
}
|
||||
if((in = fopen(inName, "rb")) == NULL) {
|
||||
printf("%7s : Not Found.\n",inName);
|
||||
}
|
||||
else {
|
||||
printf("%7s : Prosessing ",inName);
|
||||
filetype = i;
|
||||
/* ヘッダ生成 */
|
||||
if(headerflag == 0){
|
||||
makeHeader();
|
||||
headerflag++;
|
||||
}
|
||||
/* 変換処理 */
|
||||
printf("-");
|
||||
cs2ac(j);
|
||||
f_exist[j] = 1;
|
||||
fclose(in);
|
||||
printf("> OK\n");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return filetype;
|
||||
}
|
||||
|
||||
int main(){
|
||||
char wait[0xff];
|
||||
head_adrs = 0x60;
|
||||
maxwav = 0;
|
||||
|
||||
printf(" -* beatmaniaIIDX CS to AC Chart Converter v%.2f by 697@14 *-\n\n",version);
|
||||
|
||||
if((out = fopen("output.1", "wb")) == NULL) {
|
||||
printf("Failed to open \"output.1\".\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(checkScoreFile() == 0) {
|
||||
printf("Chart File not found...\n");
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
printf("Number of wav : %d\n\n",maxwav);
|
||||
printf("Writing \"output.1\"\n\nDone.\n");
|
||||
}
|
||||
fclose(out);
|
||||
|
||||
//gets(wait);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
//timebase_single.c by ryuuou
|
||||
//changes the base fps value of .1 files like timebase.exe, but works on a bunch of single .1 files instead of folders
|
||||
//this is mainly to assist with custom songs so that you don't have to timebase your whole folder again for single songs and deal with file versions
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#define byte unsigned char
|
||||
|
||||
#define CHARTCOUNT 7
|
||||
#define EVENTSIZE 8
|
||||
#define FPS_STANDARD_GOLD 60.05
|
||||
#define FPS_STANDARD_DD 59.95
|
||||
|
||||
int offsets[CHARTCOUNT] = {0, 8, 16, 24, 48, 56, 64};
|
||||
const char *CHARTNAMES[] = { "h7", "n7", "a7", "b", "h14", "n14", "a14" };
|
||||
unsigned short int judgements[6] = {0xF0, 0xFA, 0xFF, 0x3, 0x8, 0x12};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int time;
|
||||
byte type;
|
||||
byte data1;
|
||||
unsigned short int data2;
|
||||
} event;
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
int i,j,k;
|
||||
FILE *in, *out;
|
||||
byte *buf;
|
||||
int *p;
|
||||
int flength;
|
||||
int pos, len;
|
||||
short int np1, np2;
|
||||
|
||||
event *ev;
|
||||
|
||||
printf("fixtimingwindows by ryuuou\n\tfixes timing windows to be consistent\n\n");
|
||||
if(argc < 2)
|
||||
{
|
||||
printf("usage: fixtimingwindows <file1> <file2> ...\n\talternatively drop a bunch of .1 files on the executable\n");
|
||||
getchar();
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(i = 2; i <= argc; i++)
|
||||
{
|
||||
printf("processing %s...", argv[i-1]);
|
||||
in = fopen(argv[i-1], "rb");
|
||||
if(!in)
|
||||
{
|
||||
printf("file not found\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
flength = (int)ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
buf = malloc(flength);
|
||||
|
||||
fread(buf, flength, 1, in);
|
||||
fclose(in);
|
||||
|
||||
for(j = 0; j < CHARTCOUNT; j++)
|
||||
{
|
||||
p = (int*)(buf+offsets[j]);
|
||||
if(!*p) continue; //no chart here
|
||||
|
||||
//printf("%s...\n", CHARTNAMES[j]);
|
||||
|
||||
pos = p[0];
|
||||
len = p[1];
|
||||
|
||||
np1 = 0;
|
||||
np2 = 0;
|
||||
|
||||
for(k = pos; k < pos+len - EVENTSIZE; k += EVENTSIZE)
|
||||
{
|
||||
ev = (event*)(buf+k);
|
||||
|
||||
if(ev->type == 8) //adjust timing
|
||||
{
|
||||
//printf("%d (%d->%d)...", ev->data1, ev->data2, judgements[ev->data1]);
|
||||
ev->data2 = judgements[ev->data1];
|
||||
}
|
||||
if(ev->type == 0)//player 1 keypress
|
||||
{
|
||||
np1++;
|
||||
}
|
||||
else if(ev->type == 1) //player 2 keypress
|
||||
{
|
||||
np2++;
|
||||
}
|
||||
}
|
||||
|
||||
for(k = pos; k < pos+len; k += EVENTSIZE)
|
||||
{
|
||||
ev = (event*)(buf+k);
|
||||
|
||||
if(ev->type == 0x10)//notecount
|
||||
{
|
||||
if(ev->data1 == 0) //player1
|
||||
{
|
||||
printf("%d -> %d | ", ev->data2, np1);
|
||||
ev->data2 = np1;
|
||||
}
|
||||
else if(ev->data1 == 1) //player2
|
||||
{
|
||||
printf("%d -> %d\n", ev->data2, np2);
|
||||
ev->data2 = np2;
|
||||
}
|
||||
}
|
||||
}
|
||||
//printf("%s: p1: %d, p2: %d\n", CHARTNAMES[j], np1, np2);
|
||||
}
|
||||
|
||||
out = fopen(argv[i-1], "wb");
|
||||
fwrite(buf, flength, 1, out);
|
||||
fclose(out);
|
||||
|
||||
free(buf);
|
||||
|
||||
printf("done\n");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,306 @@
|
||||
/* gcz2tga.c: Slice up a directory full of GCZ (texture) files into TGA files.
|
||||
*
|
||||
* Credit goes to afwefwe for reverse-engineering the texture format
|
||||
* and LZSS compression */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* Assuming x86, usual endian crap is not accounted for */
|
||||
typedef unsigned char u8_t;
|
||||
typedef unsigned short u16_t;
|
||||
typedef unsigned int u32_t;
|
||||
|
||||
struct image
|
||||
{
|
||||
unsigned int width, height;
|
||||
u8_t *planes;
|
||||
};
|
||||
|
||||
struct clip
|
||||
{
|
||||
short x, y, w, h;
|
||||
};
|
||||
|
||||
static u16_t swab16(u16_t in)
|
||||
{
|
||||
/* GC headers are big-endian */
|
||||
return ((in & 0xFF) << 8) | (in >> 8);
|
||||
}
|
||||
|
||||
static void unpack_gc(struct image *out, u8_t *in, size_t out_sz)
|
||||
{
|
||||
unsigned int npixels;
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
u16_t *pixels;
|
||||
u16_t *pheight;
|
||||
u16_t *pwidth;
|
||||
u16_t *pmagic;
|
||||
u16_t pixel;
|
||||
|
||||
pmagic = (u16_t *) in;
|
||||
pheight = (u16_t *) (in + 14);
|
||||
pwidth = (u16_t *) (in + 12);
|
||||
|
||||
if (*pmagic != 0x4347) {
|
||||
fprintf(stderr, "(FAIL: Invalid header)\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Set up output image struct */
|
||||
in += 24;
|
||||
out->width = swab16(*pwidth);
|
||||
out->height = swab16(*pheight);
|
||||
out->planes = malloc(out->width * out->height * 4);
|
||||
|
||||
/* Clamp W/H (don't know why this is necessary but it is) */
|
||||
out->width = out->width > 1024 ? 1024 : out->width;
|
||||
out->height = out->height > 1024 ? 1024 : out->height;
|
||||
|
||||
fprintf(stderr, "(%dx%d)", out->width, out->height);
|
||||
|
||||
/* Unpack pixels */
|
||||
pixels = (u16_t *) in;
|
||||
npixels = out->width * out->height;
|
||||
|
||||
if (out_sz > npixels * 4) {
|
||||
/* Deep image (i.e. 32-bit) */
|
||||
memcpy(out->planes, pixels, npixels * 4);
|
||||
} else {
|
||||
/* Shallow image (i.e. 16-bit) */
|
||||
for (i = 0, j = 0 ; i < npixels ; i++) {
|
||||
pixel = pixels[i];
|
||||
out->planes[j++] = ((pixel ) & 0x1F) << 3; /* B */
|
||||
out->planes[j++] = ((pixel >> 5) & 0x1F) << 3; /* G */
|
||||
out->planes[j++] = ((pixel >> 10) ) << 3; /* R */
|
||||
out->planes[j++] = pixel & 0x8000 ? 0xFF : 0x00; /* A */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u8_t *expand_lzss(u8_t *lzss, size_t *pout_sz)
|
||||
{
|
||||
static u8_t ring[0x1000];
|
||||
unsigned int ring_pos = 0x0FEE;
|
||||
unsigned int chunk_offset;
|
||||
unsigned int chunk_length;
|
||||
u32_t control_word = 1;
|
||||
size_t length;
|
||||
u8_t cmd1;
|
||||
u8_t cmd2;
|
||||
u8_t *out;
|
||||
u8_t *pos;
|
||||
u8_t *in;
|
||||
|
||||
/* Header = 32 bit unpacked file length */
|
||||
length = *((u32_t *) lzss);
|
||||
*pout_sz = length;
|
||||
|
||||
if (length > 8000000) {
|
||||
fprintf(stderr, "(FAIL: Unreasonably large expanded size %d)\n",
|
||||
length);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
out = malloc(length * 2); /* Seems to overrun */
|
||||
pos = out;
|
||||
in = lzss + 4;
|
||||
|
||||
while (length > 0) {
|
||||
if (control_word == 1) {
|
||||
/* Read a control byte */
|
||||
control_word = 0x100 | *in++;
|
||||
}
|
||||
|
||||
/* Decode a byte according to the current control byte bit */
|
||||
if (control_word & 1) {
|
||||
/* Straight copy */
|
||||
*pos++ = *in;
|
||||
ring[ring_pos] = *in++;
|
||||
|
||||
ring_pos = (ring_pos + 1) % 0x1000;
|
||||
length--;
|
||||
} else {
|
||||
/* Reference to data in ring buffer */
|
||||
cmd1 = *in++;
|
||||
cmd2 = *in++;
|
||||
|
||||
chunk_length = (cmd2 & 0x0F) + 3;
|
||||
chunk_offset = ((cmd2 & 0xF0) << 4) | cmd1;
|
||||
|
||||
for ( ; chunk_length > 0 ; chunk_length--) {
|
||||
/* Copy historical data to output AND current ring pos */
|
||||
*pos++ = ring[chunk_offset];
|
||||
ring[ring_pos] = ring[chunk_offset];
|
||||
|
||||
/* Update counters */
|
||||
chunk_offset = (chunk_offset + 1) % 0x1000;
|
||||
ring_pos = (ring_pos + 1) % 0x1000;
|
||||
length--;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get next control bit */
|
||||
control_word >>= 1;
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
static void readfile(const char *filename, u8_t **data, long *nbytes)
|
||||
{
|
||||
FILE *f;
|
||||
|
||||
f = fopen(filename, "rb");
|
||||
if (f == NULL) abort();
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
*nbytes = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
*data = malloc(*nbytes);
|
||||
fread(*data, *nbytes, 1, f);
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
void put8(FILE *f, unsigned char val)
|
||||
{
|
||||
fwrite(&val, 1, 1, f);
|
||||
}
|
||||
|
||||
void put16(FILE *f, unsigned short val)
|
||||
{
|
||||
fwrite(&val, 2, 1, f);
|
||||
}
|
||||
|
||||
void split_images(const char *in_dir, const char *out_dir,
|
||||
struct image *images, int nimages)
|
||||
{
|
||||
struct clip *clips;
|
||||
char filename[512];
|
||||
long nbytes;
|
||||
u8_t *data;
|
||||
char *name;
|
||||
FILE *f;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
|
||||
/* Read file and get TOC */
|
||||
sprintf(filename, "%s/system.idx", in_dir);
|
||||
readfile(filename, &data, &nbytes);
|
||||
clips = (struct clip *) (data + 0x01BC);
|
||||
name = (char *) (data + 8 + *((long *) data));
|
||||
|
||||
/* Guess how many clips there are with a heuristic */
|
||||
for (i = 0 ; clips[i].w != 0 && clips[i].h != 0 ; i++) {
|
||||
sprintf(filename, "%s/%s.tga", out_dir, name);
|
||||
name += strlen(name) + 3;
|
||||
|
||||
f = fopen(filename, "wb");
|
||||
if (f == NULL) abort();
|
||||
|
||||
/* Locate the correct source image */
|
||||
j = 0;
|
||||
while (clips[i].y > images[j].height) {
|
||||
clips[i].y -= images[j].height;
|
||||
j++;
|
||||
}
|
||||
|
||||
/* Write header */
|
||||
put8(f, 0); put8(f, 0); put8(f, 2);
|
||||
put16(f, 0); put16(f, 0); put8(f, 0);
|
||||
put16(f, 0); put16(f, 0); put16(f, clips[i].w); put16(f, clips[i].h);
|
||||
put8(f, 32); put8(f, 32);
|
||||
|
||||
/* Write scanlines */
|
||||
for (k = 0 ; k < clips[i].h ; k++) {
|
||||
if (clips[i].y == images[j].height) {
|
||||
clips[i].y = 0;
|
||||
j++;
|
||||
}
|
||||
|
||||
fwrite(images[j].planes + ((images[j].width * clips[i].y) +
|
||||
clips[i].x) * 4, clips[i].w, 4, f);
|
||||
clips[i].y++;
|
||||
}
|
||||
|
||||
/* Close output file */
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
free(data);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *in_dir;
|
||||
char *out_dir;
|
||||
|
||||
struct image images[32];
|
||||
char filename[256];
|
||||
unsigned int i;
|
||||
long filesize;
|
||||
u8_t *lzss, *gc;
|
||||
size_t out_sz;
|
||||
FILE *f;
|
||||
|
||||
/* Usage */
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s [indir] [outdir]\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Setup */
|
||||
memset(images, 0, sizeof(images));
|
||||
in_dir = argv[1];
|
||||
out_dir = argv[2];
|
||||
|
||||
for (i = 0 ; i < 32 ; i++) {
|
||||
/* Open 0.gcz, 1.gcz etc ... */
|
||||
sprintf(filename, "%s/%d.gcz", in_dir, i);
|
||||
f = fopen(filename, "rb");
|
||||
if (f == NULL) break;
|
||||
|
||||
/* Read entire file */
|
||||
fseek(f, 0, SEEK_END);
|
||||
filesize = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
fprintf(stderr, "%s: fread", filename);
|
||||
lzss = malloc(filesize);
|
||||
fread(lzss, filesize, 1, f);
|
||||
fclose(f);
|
||||
|
||||
/* Decompress */
|
||||
fprintf(stderr, "(OK) expand_lzss");
|
||||
gc = expand_lzss(lzss, &out_sz);
|
||||
free(lzss);
|
||||
|
||||
/* Unpack GC to 32-bit RGBA */
|
||||
fprintf(stderr, "(OK) unpack_gc");
|
||||
unpack_gc(&images[i], gc, out_sz);
|
||||
free(gc);
|
||||
|
||||
fprintf(stderr, "(OK)\n");
|
||||
}
|
||||
|
||||
/* Sanity check */
|
||||
if (i == 0) {
|
||||
fprintf(stderr, "No GCZ files found\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Emit pile of TGAs */
|
||||
fprintf(stderr, "split_images");
|
||||
split_images(in_dir, out_dir, images, i);
|
||||
fprintf(stderr, "(OK)\n\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
//merge1.c by ryuuou
|
||||
//merges several .1 files into a single one to help with songs that have too many wav references
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define CHARTCOUNT 7
|
||||
#define byte unsigned char
|
||||
|
||||
const char *ONAMES[] = { "h7.1", "n7.1", "a7.1", "b.1", "h14.1", "n14.1", "a14.1" };
|
||||
const char *NAMES[] = { "h7", "n7", "a7", "b", "h14", "n14", "a14" };
|
||||
int offsets[CHARTCOUNT] = {0, 8, 16, 24, 48, 56, 64};
|
||||
int worder[CHARTCOUNT] = {0, 4, 1, 5, 2, 6, 3};
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
int i, len;
|
||||
int *plen, *poff;
|
||||
byte *onechart[CHARTCOUNT];
|
||||
int olen[CHARTCOUNT];
|
||||
FILE *in, *out;
|
||||
int ccount = 0;
|
||||
|
||||
byte *buf;
|
||||
int blen;
|
||||
|
||||
printf("merge1 by ryuuou\n\tmultiplexes several .1 files into a single one\n\n\n");
|
||||
|
||||
in = fopen("base.1", "rb");
|
||||
|
||||
memset(onechart, 0, sizeof(int*)*CHARTCOUNT);
|
||||
memset(olen, 0, sizeof(int)*CHARTCOUNT);
|
||||
|
||||
printf("trying to open files...\n");
|
||||
printf("base.1...");
|
||||
if(!in) printf("not found, authoring new .1 file\n");
|
||||
else printf("OK\n");
|
||||
|
||||
if(in) //load base.1 as reference
|
||||
{
|
||||
fseek(in, 0, SEEK_END);
|
||||
blen = (int)ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
buf = malloc(blen);
|
||||
fread(buf, blen, 1, in);
|
||||
fclose(in);
|
||||
|
||||
printf("loading charts from base.1...");
|
||||
//load the charts contained in the base file
|
||||
for(i = 0; i < CHARTCOUNT; i++)
|
||||
{
|
||||
poff = (int*)(buf+offsets[i]);
|
||||
plen = (int*)(buf+offsets[i]+4);
|
||||
if(!*plen) continue; //no chart
|
||||
|
||||
olen[i] = *plen;
|
||||
|
||||
printf("%s...", NAMES[i]);
|
||||
|
||||
onechart[i] = malloc(olen[i]);
|
||||
|
||||
memcpy(onechart[i], buf+*poff, olen[i]); //copy the chart
|
||||
}
|
||||
|
||||
free(buf);
|
||||
printf("done\n\n");
|
||||
}
|
||||
|
||||
printf("loading and inserting/overwriting charts...\n");
|
||||
|
||||
for(i = 0; i < CHARTCOUNT; i++)
|
||||
{
|
||||
printf("%s...", ONAMES[i]);
|
||||
in = fopen(ONAMES[i], "rb");
|
||||
if(!in)
|
||||
{
|
||||
printf("not found\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
ccount++;
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
blen = (int)ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
buf = malloc(blen);
|
||||
fread(buf, blen, 1, in);
|
||||
fclose(in);
|
||||
|
||||
poff = (int*)(buf+offsets[i]);
|
||||
plen = (int*)(buf+offsets[i]+4);
|
||||
|
||||
if(!*plen)
|
||||
{
|
||||
printf("no %s chart\n", NAMES[i]);
|
||||
continue; //this file contains no appropriate chart, l2namefiles
|
||||
}
|
||||
|
||||
if(olen[i]) //we previously loaded a chart from base.1 and we don't want to leak memory
|
||||
free(onechart[i]);
|
||||
|
||||
olen[i] = *plen;
|
||||
|
||||
onechart[i] = malloc(*plen);
|
||||
|
||||
memcpy(onechart[i], buf+*poff, *plen);
|
||||
free(buf);
|
||||
printf("OK\n");
|
||||
}
|
||||
|
||||
if(!ccount)
|
||||
{
|
||||
printf("no charts found, aborting\npress any key to exit\n");
|
||||
getchar();
|
||||
return 0;
|
||||
}
|
||||
|
||||
//create the aggregated .1 file
|
||||
|
||||
len = 96; //.1 headersize
|
||||
|
||||
for(i = 0; i < CHARTCOUNT; i++)
|
||||
len += olen[i];
|
||||
|
||||
buf = malloc(len);
|
||||
|
||||
memset(buf, 0, len);
|
||||
|
||||
len = 96; //abuse len as position counter
|
||||
|
||||
printf("\nauthoring .1 file...");
|
||||
for(i = 0; i < CHARTCOUNT; i++)
|
||||
{
|
||||
memcpy(buf+offsets[worder[i]], &len, 4);
|
||||
memcpy(buf+offsets[worder[i]]+4, &olen[worder[i]], 4);
|
||||
|
||||
memcpy(buf+len, onechart[worder[i]], olen[worder[i]]);
|
||||
len += olen[worder[i]];
|
||||
}
|
||||
printf("done\n");
|
||||
|
||||
printf("writing merged.1...");
|
||||
out = fopen("merged.1", "wb");
|
||||
|
||||
fwrite(buf, len, 1, out);
|
||||
|
||||
fclose(out);
|
||||
free(buf);
|
||||
printf("done\npress any key to exit\n");
|
||||
|
||||
getchar();
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,228 @@
|
||||
//crack2dx_new.c
|
||||
//decrypts .2dx files from every style from 9th to Troopers
|
||||
//decryption method and keys taken from crack2dx.c, rewritten with added support for Troopers, Empress and usablility
|
||||
//...and for bugfixing -_-
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define byte unsigned char
|
||||
|
||||
byte keys_09[] = { //9th style
|
||||
0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B,
|
||||
0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF,
|
||||
0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B };
|
||||
|
||||
byte keys_10[] = { //10th style
|
||||
0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4,
|
||||
0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2,
|
||||
0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21 };
|
||||
|
||||
byte keys_11[] = { //Happy Sky+
|
||||
0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03,
|
||||
0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7,
|
||||
0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F };
|
||||
|
||||
byte keys_16[] = { //empress
|
||||
0x28, 0x22, 0x28, 0x54, 0x63, 0x3F, 0x0E, 0x42,
|
||||
0x6F, 0x45, 0x4E, 0x50, 0x67, 0x53, 0x61, 0x7C,
|
||||
0x04, 0x46, 0x00, 0x3B, 0x13, 0x2B, 0x45, 0x6A };
|
||||
|
||||
//XORs two 8 byte blocks
|
||||
void block_xor(byte *data, byte *parm)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 8 ; i++)
|
||||
data[i] ^= parm[i];
|
||||
return;
|
||||
}
|
||||
|
||||
//Swaps the lower 4 bytes with the upper 4 bytes
|
||||
void block_swap(byte *data)
|
||||
{
|
||||
int i;
|
||||
for (i = 0 ; i < 4 ; i++)
|
||||
{
|
||||
data[i] ^= data[i+4]; //let's do this without temp variables ;D
|
||||
data[i+4] ^= data[i];
|
||||
data[i] ^= data[i+4];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//I bow to whoever figured this one out
|
||||
void block_obfus(byte *data)
|
||||
{
|
||||
byte a,b,c,d,e,f,g,h,i;
|
||||
|
||||
a = data[0] * 63;
|
||||
b = a + data[3];
|
||||
c = data[1] * 17;
|
||||
d = c + data[2];
|
||||
e = d + b;
|
||||
f = e * data[3];
|
||||
g = f + b + 51;
|
||||
h = b ^ d;
|
||||
i = g ^ e;
|
||||
|
||||
data[4] ^= h;
|
||||
data[5] ^= d;
|
||||
data[6] ^= i;
|
||||
data[7] ^= g;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, byte **argv)
|
||||
{
|
||||
int i;
|
||||
int style=2;
|
||||
int mult;
|
||||
byte *buf, *buf_dec, *enc;
|
||||
byte *cur, *prev;
|
||||
byte *cryptkey;
|
||||
int *wavcount;
|
||||
int *wavpos, *wavlen;
|
||||
int len;
|
||||
FILE *in, *out;
|
||||
unsigned char n_out[10]; //wav name
|
||||
|
||||
printf("oldac2newac_2dx by v0.1 ryuuou\n\treencrypts .2dx files from Troopers AC and before \n\tto .2dx compatible with Empress AC\n\n");
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
printf("USAGE: oldac2newac_2dx <file>\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("\nprocessing %s...\n", argv[1]);
|
||||
|
||||
in = fopen(argv[1], "rb");
|
||||
|
||||
if(!in)
|
||||
{
|
||||
printf("not found: %s\n", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
len = (int)ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
buf = malloc(len);
|
||||
|
||||
fread(buf, len, 1, in);
|
||||
fclose(in);
|
||||
|
||||
//identify iidx version
|
||||
|
||||
printf("identifying encryption...");
|
||||
mult = 1;
|
||||
if(!strncmp(buf, "%eNc", 4))
|
||||
{
|
||||
printf("9th style\n");
|
||||
cryptkey = keys_09; //9th style
|
||||
}
|
||||
else if(!strncmp(buf, "%e10", 4))
|
||||
{
|
||||
printf("10th style\n");
|
||||
cryptkey = keys_10; //10th style
|
||||
}
|
||||
else if(!strncmp(buf, "%e11", 4))
|
||||
{
|
||||
printf("RED\n");
|
||||
cryptkey = keys_11; //RED
|
||||
}
|
||||
else if(!strncmp(buf, "%e12", 4))
|
||||
{
|
||||
printf("Happy Sky/DistorteD/GOLD\n");
|
||||
cryptkey = keys_11; //HS+
|
||||
mult = 0;
|
||||
}
|
||||
else if(!strncmp(buf, "%hid", 4))
|
||||
{
|
||||
printf("Troopers\n");
|
||||
cryptkey = keys_11; //Troopers
|
||||
mult = 0;
|
||||
}
|
||||
else if(!strncmp(buf, "%iO0", 4))
|
||||
{
|
||||
printf("Empress, nothing to do\n");
|
||||
cryptkey = keys_16; //Empress
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("unknown encryption, trying unencrypted...\n");
|
||||
mult = 2;
|
||||
}
|
||||
|
||||
|
||||
//decrypt
|
||||
|
||||
|
||||
|
||||
if(!(mult == 2)) //skip for unencrypted
|
||||
{
|
||||
buf_dec = malloc(len);
|
||||
memcpy(buf_dec, buf, len); //copy the encrypted part
|
||||
memset(buf, 0, 8); //zero the first block to make the loop easier
|
||||
|
||||
for(i = 0; i <= len-16; i+= 8)
|
||||
{
|
||||
cur = buf_dec + 8 + i; //cur points to the current encrypted block to decrypt
|
||||
prev = buf + i; //prev points to the cur-8 in encrypted form
|
||||
|
||||
block_xor(cur, cryptkey);
|
||||
block_obfus(cur);
|
||||
block_swap(cur);
|
||||
|
||||
if(mult) // for versions prior to DistorteD and Empress
|
||||
{
|
||||
block_xor(cur, cryptkey+8);
|
||||
block_obfus(cur);
|
||||
block_xor(cur, cryptkey+16);
|
||||
}
|
||||
|
||||
block_xor(cur, prev);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
buf_dec = malloc(len);
|
||||
memcpy(buf_dec, buf, len); //copy for splitting
|
||||
}
|
||||
|
||||
|
||||
//reencrypt to empress
|
||||
|
||||
cryptkey = keys_16;
|
||||
|
||||
for(i = 0; i <= len-16; i+= 8)
|
||||
{
|
||||
cur = buf_dec + i + 8; //cur points to the current decrypted block to encrypt
|
||||
|
||||
block_xor(cur, cur-8);
|
||||
block_xor(cur, cryptkey+16);
|
||||
block_obfus(cur);
|
||||
block_xor(cur, cryptkey+8);
|
||||
block_swap(cur);
|
||||
block_obfus(cur);
|
||||
block_xor(cur, cryptkey);
|
||||
}
|
||||
|
||||
memcpy(buf_dec, "%iO0", 4);
|
||||
|
||||
//*((int*)buf_dec+4) = len-8;
|
||||
|
||||
out = fopen(argv[1], "wb");
|
||||
fwrite(buf_dec, len, 1, out);
|
||||
fclose(out);
|
||||
|
||||
printf("done\n");
|
||||
free(buf);
|
||||
free(buf_dec);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/* split2dx.c: Extract all WAVs from a .2DX file (sound archive) */
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
static const char base36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
char outname[64];
|
||||
FILE *out;
|
||||
FILE *in;
|
||||
void *bytes;
|
||||
int nfiles;
|
||||
int nbytes;
|
||||
int *toc;
|
||||
int i;
|
||||
|
||||
/* Usage */
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s [infile] [outdir]\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Open input */
|
||||
in = fopen(argv[1], "rb");
|
||||
if (!in) {
|
||||
fprintf(stderr, "%s: Could not open file for reading\n", argv[1]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Read TOC length */
|
||||
fseek(in, 0x14, SEEK_SET);
|
||||
fread(&nfiles, 4, 1, in);
|
||||
|
||||
/* Read TOC */
|
||||
toc = malloc(4 * nfiles);
|
||||
fseek(in, 0x48, SEEK_SET);
|
||||
fread(toc, 4, nfiles, in);
|
||||
|
||||
/* Extract files */
|
||||
for (i = 0 ; i < nfiles ; i++) {
|
||||
/* Name output file */
|
||||
sprintf(outname, "%s/%c%c.wav", argv[2],
|
||||
base36[(i + 1) / 36], base36[(i + 1) % 36]);
|
||||
|
||||
/* Open output file */
|
||||
out = fopen(outname, "wb");
|
||||
if (!out) {
|
||||
fprintf(stderr, "%s: Could not open file for writing\n", outname);
|
||||
free(toc);
|
||||
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Put RIFF fourcc which we skipped */
|
||||
fwrite("RIFF", 4, 1, out);
|
||||
|
||||
/* Get file length */
|
||||
fseek(in, toc[i] + 0x1C, SEEK_SET);
|
||||
fread(&nbytes, 4, 1, in);
|
||||
fwrite(&nbytes, 4, 1, out);
|
||||
|
||||
/* Copy */
|
||||
bytes = malloc(nbytes);
|
||||
fread(bytes, 1, nbytes, in);
|
||||
fwrite(bytes, 1, nbytes, out);
|
||||
|
||||
/* Clean up */
|
||||
fclose(out);
|
||||
free(bytes);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
free(toc);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
//timebase_single.c by ryuuou
|
||||
//changes the base fps value of .1 files like timebase.exe, but works on a bunch of single .1 files instead of folders
|
||||
//this is mainly to assist with custom songs so that you don't have to timebase your whole folder again for single songs and deal with file versions
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#define byte unsigned char
|
||||
|
||||
#define CHARTCOUNT 7
|
||||
#define EVENTSIZE 8
|
||||
#define FPS_STANDARD_GOLD 60.05
|
||||
#define FPS_STANDARD_DD 59.95
|
||||
|
||||
int offsets[CHARTCOUNT] = {0, 8, 16, 24, 48, 56, 64};
|
||||
const char *CHARTNAMES[] = { "h7", "n7", "a7", "b", "h14", "n14", "a14" };
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
int i,j,k;
|
||||
float basefps, targetfps;
|
||||
FILE *in, *out;
|
||||
byte *buf;
|
||||
int *p;
|
||||
int flength;
|
||||
int pos, len;
|
||||
|
||||
printf("timebase_single by ryuuou\n\tchanges the base fps of .1 files like timebase.exe,\n\tbut works on a batch of files instead of folders\n\n");
|
||||
if(argc < 2)
|
||||
{
|
||||
printf("usage: timebase_single <file1> <file2> ...\n\talternatively drop a bunch of .1 files on the executable\n");
|
||||
getchar();
|
||||
return 0;
|
||||
}
|
||||
|
||||
basefps = targetfps = 0;
|
||||
|
||||
/*printf("please input the current fps (or 0 for 60.05 or 1 for 59.95): ");
|
||||
scanf("%f", &basefps);
|
||||
if(basefps == 0)
|
||||
basefps = FPS_STANDARD_GOLD;
|
||||
if(basefps == 1)
|
||||
basefps = FPS_STANDARD_DD;
|
||||
printf("please input the target fps: (or 0 for 60.05 or 1 for 59.95)");
|
||||
scanf("%f", &targetfps);
|
||||
if(targetfps == 0)
|
||||
targetfps = FPS_STANDARD_GOLD;
|
||||
if(targetfps == 1)
|
||||
targetfps = FPS_STANDARD_DD;
|
||||
|
||||
|
||||
printf("converting from %.3f fps to %.3f fps\npress enter to continue or ctrl-c to cancel\nMAKE SURE YOU HAVE BACKUPS OF YOUR FILES!!\n", basefps, targetfps);
|
||||
getchar();getchar();*/
|
||||
|
||||
for(i = 2; i <= argc; i++)
|
||||
{
|
||||
printf("processing %s...", argv[i-1]);
|
||||
in = fopen(argv[i-1], "rb");
|
||||
if(!in)
|
||||
{
|
||||
printf("file not found\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
flength = (int)ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
buf = malloc(flength);
|
||||
|
||||
fread(buf, flength, 1, in);
|
||||
fclose(in);
|
||||
|
||||
for(j = 0; j < CHARTCOUNT; j++)
|
||||
{
|
||||
p = (int*)(buf+offsets[j]);
|
||||
if(!*p) continue; //no chart here
|
||||
|
||||
printf("%s...", CHARTNAMES[j]);
|
||||
|
||||
pos = p[0];
|
||||
len = p[1];
|
||||
|
||||
for(k = pos; k < pos+len; k += EVENTSIZE)
|
||||
{
|
||||
p = (int*)(buf+k);
|
||||
if(*p == 0x7FFFFFFF || *p == 0x7F000000) //end sequence event, we skip these
|
||||
continue;
|
||||
*p = (int)roundf((float)*p *1000. / FPS_STANDARD_DD);
|
||||
}
|
||||
}
|
||||
|
||||
out = fopen(argv[i-1], "wb");
|
||||
fwrite(buf, flength, 1, out);
|
||||
fclose(out);
|
||||
|
||||
free(buf);
|
||||
|
||||
printf("done\n");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
|
||||
#define byte unsigned char
|
||||
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte iidx[4];
|
||||
int version;
|
||||
short int songcount;
|
||||
short int indexcount;
|
||||
int zero;
|
||||
} eoutheader;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte songname[64];
|
||||
byte labelname[32]; //filename
|
||||
byte titlename[64]; //filename
|
||||
byte genrename[32]; //filename
|
||||
byte artistname[32]; //filename
|
||||
|
||||
short int style;
|
||||
short int sort_others;
|
||||
short int sort_bemani;
|
||||
short int sort_bemani2;
|
||||
|
||||
byte diff_n7;
|
||||
byte diff_h7;
|
||||
byte diff_a7;
|
||||
byte diff_n14;
|
||||
byte diff_h14;
|
||||
byte diff_a14;
|
||||
byte diff_beg;
|
||||
byte diff_zero;
|
||||
|
||||
byte zeros[128];
|
||||
byte FF[20];
|
||||
|
||||
int index;
|
||||
int volume;
|
||||
|
||||
byte suffix[8];
|
||||
|
||||
int movieoffset;
|
||||
byte moviefile[32];
|
||||
|
||||
byte bgname[32];
|
||||
byte graphicsfolder[32];
|
||||
|
||||
int layerinfo;
|
||||
byte layerdata[9*32];
|
||||
} songinfo;
|
||||
|
||||
int main(int *argc, char* argv[])
|
||||
{
|
||||
eoutheader header;
|
||||
songinfo info;
|
||||
FILE *in, *out;
|
||||
int i;
|
||||
int pc, id;
|
||||
int myn;
|
||||
byte asuffix[9];
|
||||
|
||||
in = fopen(argv[1], "rb");
|
||||
if(!in)
|
||||
{
|
||||
printf("file not found: %s", argv[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
out = fopen("txt_eout.dec", "wb");
|
||||
|
||||
memset(&header, 0, 16);
|
||||
sprintf(header.iidx, "IIDX");
|
||||
header.version = 15;
|
||||
|
||||
fwrite(&header, sizeof(eoutheader), 1, out);
|
||||
|
||||
while(!feof(in))
|
||||
{
|
||||
memset(&info, 0, sizeof(songinfo));
|
||||
memset(info.FF, 0xFF, 20);
|
||||
memset(info.suffix, 0x30, 8);
|
||||
|
||||
pc = fscanf(in, "%d\t%[a-zA-Z0-9*+<>/\()!? -]\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%[a-z.]\n",\
|
||||
&info.index, info.songname, \
|
||||
&info.diff_beg, &info.diff_n7, &info.diff_h7, &info.diff_a7, &info.diff_n14, &info.diff_h14, &info.diff_a14,\
|
||||
&info.style, &info.sort_others, &info.sort_bemani, &myn, &info.movieoffset, asuffix);
|
||||
|
||||
if(pc != 15)
|
||||
{
|
||||
printf("parse error in line %d after token %d\n", header.songcount+1, pc);
|
||||
break;
|
||||
}
|
||||
|
||||
id = info.index;
|
||||
|
||||
sprintf(info.labelname, "L_%d", id);
|
||||
sprintf(info.titlename, "T_%d", id);
|
||||
sprintf(info.genrename, "G_%d", id);
|
||||
sprintf(info.artistname, "A_%d", id);
|
||||
sprintf(info.bgname, "B_%d", id);
|
||||
|
||||
sprintf(info.graphicsfolder, "in_%02d", id/100);
|
||||
|
||||
if(myn == 1)
|
||||
sprintf(info.moviefile, "%d", id);
|
||||
else if(!myn)
|
||||
sprintf(info.moviefile, "0000");
|
||||
else
|
||||
sprintf(info.moviefile, "%d", myn);
|
||||
|
||||
for(i = 0; i < 8; i++)
|
||||
if(asuffix[i] == '.')
|
||||
asuffix[i] = '0';
|
||||
|
||||
memcpy(info.suffix, asuffix, 8);
|
||||
|
||||
if(info.diff_h7 == 0)
|
||||
info.diff_h7 = 1;
|
||||
if(info.diff_h14 == 0)
|
||||
info.diff_h14 = 1;
|
||||
|
||||
info.sort_bemani2 = info.sort_bemani; //???
|
||||
|
||||
info.volume = 90;
|
||||
|
||||
header.songcount++;
|
||||
|
||||
fwrite(&info, sizeof(songinfo), 1, out);
|
||||
}
|
||||
|
||||
rewind(out);
|
||||
fwrite(&header, sizeof(eoutheader), 1, out);
|
||||
|
||||
fclose(in);
|
||||
fclose(out);
|
||||
|
||||
printf("%d songs in all\n", header.songcount);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
/** unz.c: Decompress miscellaneous stuff like .INZ and .XZ files */
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned char u8_t;
|
||||
typedef unsigned int u32_t;
|
||||
|
||||
static void expand_lzss(FILE *in, FILE *out)
|
||||
{
|
||||
static u8_t ring[0x1000];
|
||||
unsigned int ring_pos = 0x0FEE;
|
||||
unsigned int chunk_offset;
|
||||
unsigned int chunk_length;
|
||||
unsigned int length;
|
||||
u32_t control_word = 1;
|
||||
u8_t cmd1;
|
||||
u8_t cmd2;
|
||||
u8_t byte;
|
||||
|
||||
/* Read header (i.e. file length, ignore it) */
|
||||
fread(&length, 4, 1, in);
|
||||
|
||||
while (!feof(in) && length > 0) {
|
||||
if (control_word == 1) {
|
||||
/* Read a control byte */
|
||||
control_word = 0x100 | getc(in);
|
||||
}
|
||||
|
||||
/* Decode a byte according to the current control byte bit */
|
||||
if (control_word & 1) {
|
||||
/* Straight copy, store into history ring */
|
||||
byte = getc(in);
|
||||
|
||||
putc(byte, out);
|
||||
ring[ring_pos] = byte;
|
||||
|
||||
ring_pos = (ring_pos + 1) % 0x1000;
|
||||
length--;
|
||||
} else {
|
||||
/* Reference to data in ring buffer */
|
||||
cmd1 = getc(in);
|
||||
cmd2 = getc(in);
|
||||
|
||||
chunk_length = (cmd2 & 0x0F) + 3;
|
||||
chunk_offset = ((cmd2 & 0xF0) << 4) | cmd1;
|
||||
|
||||
for ( ; chunk_length > 0 && length > 0 ; chunk_length--) {
|
||||
/* Copy historical data to output AND current ring pos */
|
||||
putc(ring[chunk_offset], out);
|
||||
ring[ring_pos] = ring[chunk_offset];
|
||||
|
||||
/* Update counters */
|
||||
chunk_offset = (chunk_offset + 1) % 0x1000;
|
||||
ring_pos = (ring_pos + 1) % 0x1000;
|
||||
length--;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get next control bit */
|
||||
control_word >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *in;
|
||||
FILE *out;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s [infile] [outfile]\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
in = fopen(argv[1], "rb");
|
||||
out = fopen(argv[2], "wb");
|
||||
|
||||
expand_lzss(in, out);
|
||||
|
||||
fclose(in);
|
||||
fclose(out);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,228 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
const byte keys_09[3][8] = {
|
||||
{ 0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B },
|
||||
{ 0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF },
|
||||
{ 0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B }
|
||||
};
|
||||
|
||||
const byte keys_10[3][8] = {
|
||||
{ 0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4 },
|
||||
{ 0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2 },
|
||||
{ 0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21 }
|
||||
};
|
||||
|
||||
const byte keys_11[3][8] = {
|
||||
{ 0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03 },
|
||||
{ 0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7 },
|
||||
{ 0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F }
|
||||
};
|
||||
|
||||
byte block[8];
|
||||
byte *decrypted, *decpos;
|
||||
|
||||
void die(const byte *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void decrypt_common()
|
||||
{
|
||||
byte a = block[0] * 63;
|
||||
byte b = a + block[3];
|
||||
byte c = block[1] * 17;
|
||||
byte d = c + block[2];
|
||||
byte e = d + b;
|
||||
byte f = e * block[3];
|
||||
byte g = f + b + 51;
|
||||
byte h = b ^ d;
|
||||
byte i = g ^ e;
|
||||
|
||||
block[4] ^= h;
|
||||
block[5] ^= d;
|
||||
block[6] ^= i;
|
||||
block[7] ^= g;
|
||||
}
|
||||
|
||||
void decrypt_normal(const byte *key1, const byte *key2, const byte *key3)
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key1[i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key2[i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key3[i];
|
||||
}
|
||||
|
||||
void decrypt_09()
|
||||
{
|
||||
decrypt_normal(keys_09[0], keys_09[1], keys_09[2]);
|
||||
}
|
||||
|
||||
void decrypt_10()
|
||||
{
|
||||
decrypt_normal(keys_10[0], keys_10[1], keys_10[2]);
|
||||
}
|
||||
|
||||
void decrypt_11()
|
||||
{
|
||||
decrypt_normal(keys_11[0], keys_11[1], keys_11[2]);
|
||||
}
|
||||
|
||||
void decrypt_12()
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= keys_11[0][i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
void decrypt(FILE *in, const char *filename)
|
||||
{
|
||||
void (*decrypt_block)();
|
||||
byte curBlock[8], prevBlock[8];
|
||||
int i;
|
||||
|
||||
memset(curBlock, 0, 8);
|
||||
memset(prevBlock, 0, 8);
|
||||
|
||||
switch (block[2])
|
||||
{
|
||||
case 'N':
|
||||
if (block[3] != 'c') die("%s: Unknown encryption type", filename);
|
||||
decrypt_block = decrypt_09;
|
||||
|
||||
break;
|
||||
|
||||
case '1':
|
||||
switch (block[3])
|
||||
{
|
||||
case '0':
|
||||
decrypt_block = decrypt_10;
|
||||
break;
|
||||
|
||||
case '1':
|
||||
decrypt_block = decrypt_11;
|
||||
break;
|
||||
|
||||
case '2':
|
||||
decrypt_block = decrypt_12;
|
||||
break;
|
||||
|
||||
default:
|
||||
die("%s: Unknown encryption type", filename);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
die("%s: Unknown encryption type", filename);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Decrypt loop */
|
||||
while (!feof(in)) {
|
||||
fread(block, 8, 1, in);
|
||||
memcpy(curBlock, block, 8);
|
||||
|
||||
decrypt_block();
|
||||
for (i = 0 ; i < 8 ; i++) {
|
||||
block[i] ^= prevBlock[i];
|
||||
}
|
||||
|
||||
memcpy(decpos, block, 8);
|
||||
memcpy(prevBlock, curBlock, 8);
|
||||
|
||||
decpos += 8;
|
||||
}
|
||||
}
|
||||
|
||||
void extract(int file_num, byte *data)
|
||||
{
|
||||
char filename[16];
|
||||
int *length = (int *) (data + 4);
|
||||
FILE *out;
|
||||
|
||||
sprintf(filename, "%d.wav", file_num);
|
||||
printf("Dumping %s ...\n", filename);
|
||||
|
||||
out = fopen(filename, "wb");
|
||||
fwrite(data, *length + 8, 1, out);
|
||||
fclose(out);
|
||||
}
|
||||
|
||||
void split_files()
|
||||
{
|
||||
int *nfiles = (int *) (decrypted + 0x14);
|
||||
int *toc = (int *) (decrypted + 0x48);
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < *nfiles ; i++) {
|
||||
extract(i + 1, decrypted + toc[i] + 0x18);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, byte **argv)
|
||||
{
|
||||
const char *filename = argv[1];
|
||||
long length;
|
||||
FILE *in;
|
||||
|
||||
if (argc != 2) die("Usage: %0 [.2dx input file]", argv[0]);
|
||||
|
||||
in = fopen(filename, "rb");
|
||||
if (in == NULL) die("Error opening %s", filename);
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
length = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
decrypted = malloc(length);
|
||||
|
||||
fread(block, 8, 1, in);
|
||||
if (block[0] == '%' && block[1] == 'e') {
|
||||
printf("Decrypting ...\n");
|
||||
|
||||
decpos = decrypted;
|
||||
decrypt(in, filename);
|
||||
} else {
|
||||
fseek(in, 0, SEEK_SET);
|
||||
fread(decrypted, length, 1, in);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
split_files();
|
||||
|
||||
free(decrypted);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,228 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
const byte keys_09[3][8] = {
|
||||
{ 0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B },
|
||||
{ 0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF },
|
||||
{ 0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B }
|
||||
};
|
||||
|
||||
const byte keys_10[3][8] = {
|
||||
{ 0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4 },
|
||||
{ 0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2 },
|
||||
{ 0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21 }
|
||||
};
|
||||
|
||||
const byte keys_11[3][8] = {
|
||||
{ 0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03 },
|
||||
{ 0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7 },
|
||||
{ 0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F }
|
||||
};
|
||||
|
||||
byte block[8];
|
||||
byte *decrypted, *decpos;
|
||||
|
||||
void die(const byte *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void decrypt_common()
|
||||
{
|
||||
byte a = block[0] * 63;
|
||||
byte b = a + block[3];
|
||||
byte c = block[1] * 17;
|
||||
byte d = c + block[2];
|
||||
byte e = d + b;
|
||||
byte f = e * block[3];
|
||||
byte g = f + b + 51;
|
||||
byte h = b ^ d;
|
||||
byte i = g ^ e;
|
||||
|
||||
block[4] ^= h;
|
||||
block[5] ^= d;
|
||||
block[6] ^= i;
|
||||
block[7] ^= g;
|
||||
}
|
||||
|
||||
void decrypt_normal(const byte *key1, const byte *key2, const byte *key3)
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key1[i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key2[i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key3[i];
|
||||
}
|
||||
|
||||
void decrypt_09()
|
||||
{
|
||||
decrypt_normal(keys_09[0], keys_09[1], keys_09[2]);
|
||||
}
|
||||
|
||||
void decrypt_10()
|
||||
{
|
||||
decrypt_normal(keys_10[0], keys_10[1], keys_10[2]);
|
||||
}
|
||||
|
||||
void decrypt_11()
|
||||
{
|
||||
decrypt_normal(keys_11[0], keys_11[1], keys_11[2]);
|
||||
}
|
||||
|
||||
void decrypt_12()
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= keys_11[0][i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
void decrypt(FILE *in, const char *filename)
|
||||
{
|
||||
void (*decrypt_block)();
|
||||
byte curBlock[8], prevBlock[8];
|
||||
int i;
|
||||
|
||||
memset(curBlock, 0, 8);
|
||||
memset(prevBlock, 0, 8);
|
||||
|
||||
switch (block[2])
|
||||
{
|
||||
case 'N':
|
||||
if (block[3] != 'c') die("%s: Unknown encryption type", filename);
|
||||
decrypt_block = decrypt_09;
|
||||
|
||||
break;
|
||||
|
||||
case '1':
|
||||
switch (block[3])
|
||||
{
|
||||
case '0':
|
||||
decrypt_block = decrypt_10;
|
||||
break;
|
||||
|
||||
case '1':
|
||||
decrypt_block = decrypt_11;
|
||||
break;
|
||||
|
||||
case '2':
|
||||
decrypt_block = decrypt_12;
|
||||
break;
|
||||
|
||||
default:
|
||||
die("%s: Unknown encryption type", filename);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
die("%s: Unknown encryption type", filename);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Decrypt loop */
|
||||
while (!feof(in)) {
|
||||
fread(block, 8, 1, in);
|
||||
memcpy(curBlock, block, 8);
|
||||
|
||||
decrypt_block();
|
||||
for (i = 0 ; i < 8 ; i++) {
|
||||
block[i] ^= prevBlock[i];
|
||||
}
|
||||
|
||||
memcpy(decpos, block, 8);
|
||||
memcpy(prevBlock, curBlock, 8);
|
||||
|
||||
decpos += 8;
|
||||
}
|
||||
}
|
||||
|
||||
void extract(int file_num, byte *data)
|
||||
{
|
||||
char filename[16];
|
||||
int *length = (int *) (data + 4);
|
||||
FILE *out;
|
||||
|
||||
sprintf(filename, "%d.wav", file_num);
|
||||
printf("Dumping %s ...\n", filename);
|
||||
|
||||
out = fopen(filename, "wb");
|
||||
fwrite(data, *length + 8, 1, out);
|
||||
fclose(out);
|
||||
}
|
||||
|
||||
void split_files()
|
||||
{
|
||||
int *nfiles = (int *) (decrypted + 0x14);
|
||||
int *toc = (int *) (decrypted + 0x48);
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < *nfiles ; i++) {
|
||||
extract(i + 1, decrypted + toc[i] + 0x18);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, byte **argv)
|
||||
{
|
||||
const char *filename = argv[1];
|
||||
long length;
|
||||
FILE *in;
|
||||
|
||||
if (argc != 2) die("Usage: %0 [.2dx input file]", argv[0]);
|
||||
|
||||
in = fopen(filename, "rb");
|
||||
if (in == NULL) die("Error opening %s", filename);
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
length = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
decrypted = malloc(length);
|
||||
|
||||
fread(block, 8, 1, in);
|
||||
if (block[0] == '%' && block[1] == 'e') {
|
||||
printf("Decrypting ...\n");
|
||||
|
||||
decpos = decrypted;
|
||||
decrypt(in, filename);
|
||||
} else {
|
||||
fseek(in, 0, SEEK_SET);
|
||||
fread(decrypted, length, 1, in);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
split_files();
|
||||
|
||||
free(decrypted);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,228 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
const byte keys_09[3][8] = {
|
||||
{ 0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B },
|
||||
{ 0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF },
|
||||
{ 0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B }
|
||||
};
|
||||
|
||||
const byte keys_10[3][8] = {
|
||||
{ 0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4 },
|
||||
{ 0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2 },
|
||||
{ 0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21 }
|
||||
};
|
||||
|
||||
const byte keys_11[3][8] = {
|
||||
{ 0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03 },
|
||||
{ 0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7 },
|
||||
{ 0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F }
|
||||
};
|
||||
|
||||
byte block[8];
|
||||
byte *decrypted, *decpos;
|
||||
|
||||
void die(const byte *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
void decrypt_common()
|
||||
{
|
||||
byte a = block[0] * 63;
|
||||
byte b = a + block[3];
|
||||
byte c = block[1] * 17;
|
||||
byte d = c + block[2];
|
||||
byte e = d + b;
|
||||
byte f = e * block[3];
|
||||
byte g = f + b + 51;
|
||||
byte h = b ^ d;
|
||||
byte i = g ^ e;
|
||||
|
||||
block[4] ^= h;
|
||||
block[5] ^= d;
|
||||
block[6] ^= i;
|
||||
block[7] ^= g;
|
||||
}
|
||||
|
||||
void decrypt_normal(const byte *key1, const byte *key2, const byte *key3)
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key1[i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key2[i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key3[i];
|
||||
}
|
||||
|
||||
void decrypt_09()
|
||||
{
|
||||
decrypt_normal(keys_09[0], keys_09[1], keys_09[2]);
|
||||
}
|
||||
|
||||
void decrypt_10()
|
||||
{
|
||||
decrypt_normal(keys_10[0], keys_10[1], keys_10[2]);
|
||||
}
|
||||
|
||||
void decrypt_11()
|
||||
{
|
||||
decrypt_normal(keys_11[0], keys_11[1], keys_11[2]);
|
||||
}
|
||||
|
||||
void decrypt_12()
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= keys_11[0][i];
|
||||
decrypt_common();
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
void decrypt(FILE *in, const char *filename)
|
||||
{
|
||||
void (*decrypt_block)();
|
||||
byte curBlock[8], prevBlock[8];
|
||||
int i;
|
||||
|
||||
memset(curBlock, 0, 8);
|
||||
memset(prevBlock, 0, 8);
|
||||
|
||||
switch (block[2])
|
||||
{
|
||||
case 'N':
|
||||
if (block[3] != 'c') die("%s: Unknown encryption type", filename);
|
||||
decrypt_block = decrypt_09;
|
||||
|
||||
break;
|
||||
|
||||
case '1':
|
||||
switch (block[3])
|
||||
{
|
||||
case '0':
|
||||
decrypt_block = decrypt_10;
|
||||
break;
|
||||
|
||||
case '1':
|
||||
decrypt_block = decrypt_11;
|
||||
break;
|
||||
|
||||
case '2':
|
||||
decrypt_block = decrypt_12;
|
||||
break;
|
||||
|
||||
default:
|
||||
die("%s: Unknown encryption type", filename);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
die("%s: Unknown encryption type", filename);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Decrypt loop */
|
||||
while (!feof(in)) {
|
||||
fread(block, 8, 1, in);
|
||||
memcpy(curBlock, block, 8);
|
||||
|
||||
decrypt_block();
|
||||
for (i = 0 ; i < 8 ; i++) {
|
||||
block[i] ^= prevBlock[i];
|
||||
}
|
||||
|
||||
memcpy(decpos, block, 8);
|
||||
memcpy(prevBlock, curBlock, 8);
|
||||
|
||||
decpos += 8;
|
||||
}
|
||||
}
|
||||
|
||||
void extract(int file_num, byte *data)
|
||||
{
|
||||
char filename[16];
|
||||
int *length = (int *) (data + 4);
|
||||
FILE *out;
|
||||
|
||||
sprintf(filename, "%d.wav", file_num);
|
||||
printf("Dumping %s ...\n", filename);
|
||||
|
||||
out = fopen(filename, "wb");
|
||||
fwrite(data, *length + 8, 1, out);
|
||||
fclose(out);
|
||||
}
|
||||
|
||||
void split_files()
|
||||
{
|
||||
int *nfiles = (int *) (decrypted + 0x14);
|
||||
int *toc = (int *) (decrypted + 0x48);
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < *nfiles ; i++) {
|
||||
extract(i + 1, decrypted + toc[i] + 0x18);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, byte **argv)
|
||||
{
|
||||
const char *filename = argv[1];
|
||||
long length;
|
||||
FILE *in;
|
||||
|
||||
if (argc != 2) die("Usage: %0 [.2dx input file]", argv[0]);
|
||||
|
||||
in = fopen(filename, "rb");
|
||||
if (in == NULL) die("Error opening %s", filename);
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
length = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
decrypted = malloc(length);
|
||||
|
||||
fread(block, 8, 1, in);
|
||||
if (block[0] == '%' && block[1] == 'e') {
|
||||
printf("Decrypting ...\n");
|
||||
|
||||
decpos = decrypted;
|
||||
decrypt(in, filename);
|
||||
} else {
|
||||
fseek(in, 0, SEEK_SET);
|
||||
fread(decrypted, length, 1, in);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
split_files();
|
||||
|
||||
free(decrypted);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,274 @@
|
||||
//create2dx.c by Kitaru
|
||||
//Packs numerically sequenced .wav in folder ./input into an unencrypted .2dx.
|
||||
//Based on crack2dx.c by Tau and a few chunks from create2dx.c by icex2.
|
||||
//TODO: add different numbering specifications (BMS, BME, etc.)
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
const byte keys_09[3][8] = {
|
||||
{ 0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B },
|
||||
{ 0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF },
|
||||
{ 0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B }
|
||||
};
|
||||
|
||||
const byte keys_10[3][8] = {
|
||||
{ 0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4 },
|
||||
{ 0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2 },
|
||||
{ 0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21 }
|
||||
};
|
||||
|
||||
const byte keys_11[3][8] = {
|
||||
{ 0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03 },
|
||||
{ 0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7 },
|
||||
{ 0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F }
|
||||
};
|
||||
|
||||
const unsigned char aftertoc[24] = {
|
||||
'2', 'D', 'X', '9', 0x18, 0x00, 0x00, 0x00, 0x5A, 0x07, 0x01, 0x00, 0x30, 0x32, 0xFF, 0xFF,
|
||||
0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
byte block[8];
|
||||
byte *encrypted, *encpos;
|
||||
|
||||
void die(const byte *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
//I guess we could encrypt it eventually, but I found DistorteD doesn't bother to reject non-encrypted .2dx, so I just commented everything out.
|
||||
/*void encrypt_common() //I guess I need to reverse the operands?
|
||||
{
|
||||
byte a = block[0] * 63;
|
||||
byte b = a + block[3];
|
||||
byte c = block[1] * 17;
|
||||
byte d = c + block[2];
|
||||
byte e = d + b;
|
||||
byte f = e * block[3];
|
||||
byte g = f + b + 51;
|
||||
byte h = b ^ d;
|
||||
byte i = g ^ e;
|
||||
|
||||
block[4] ^= h;
|
||||
block[5] ^= d;
|
||||
block[6] ^= i;
|
||||
block[7] ^= g;
|
||||
}
|
||||
|
||||
void encrypt_normal(const byte *key1, const byte *key2, const byte *key3)
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key3[i];
|
||||
encrypt_common();
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key2[i];
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
|
||||
encrypt_common();
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key1[i];
|
||||
}
|
||||
|
||||
void encrypt_09()
|
||||
{
|
||||
encrypt_normal(keys_09[0], keys_09[1], keys_09[2]);
|
||||
}
|
||||
|
||||
void encrypt_10()
|
||||
{
|
||||
encrypt_normal(keys_10[0], keys_10[1], keys_10[2]);
|
||||
}
|
||||
|
||||
void encrypt_11()
|
||||
{
|
||||
encrypt_normal(keys_11[0], keys_11[1], keys_11[2]);
|
||||
}
|
||||
|
||||
void encrypt_12()
|
||||
{
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
encrypt_common();
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= keys_11[0][i];
|
||||
}
|
||||
|
||||
void encrypt(FILE *in, const char *filename)
|
||||
{
|
||||
void (*encrypt_block)();
|
||||
byte curBlock[8], prevBlock[8];
|
||||
int i;
|
||||
|
||||
memset(curBlock, 0, 8);
|
||||
memset(prevBlock, 0, 8);
|
||||
|
||||
encrypt_block = encrypt_12; //eventually you'll be presented with a choice somehow
|
||||
|
||||
while (!feof(in)) {
|
||||
fread(block, 8, 1, in);
|
||||
memcpy(curBlock, block, 8);
|
||||
|
||||
encrypt_block();
|
||||
for (i = 0 ; i < 8 ; i++) {
|
||||
block[i] ^= prevBlock[i];
|
||||
}
|
||||
|
||||
memcpy(encpos, block, 8);
|
||||
memcpy(prevBlock, curBlock, 8);
|
||||
|
||||
encpos += 8;
|
||||
}
|
||||
}*/
|
||||
|
||||
int main(int argc, byte **argv)
|
||||
{
|
||||
const char *filename = argv[1];
|
||||
long length, length2;
|
||||
FILE *in;
|
||||
FILE *out;
|
||||
byte *buffer;
|
||||
char path1[511], path2[511];
|
||||
int *toc;
|
||||
|
||||
if (argc != 2) die("Usage: %0 [.2dx input file]", argv[0]);
|
||||
|
||||
int i = 0, ii = 0, wav = 0;
|
||||
char wavc[16];
|
||||
|
||||
strcpy(path1, argv[0]);
|
||||
_strrev(path1);
|
||||
while(path1[i] != '\\')
|
||||
i++;
|
||||
while(path1[ii] != '\0')
|
||||
ii++;
|
||||
_strrev(path1);
|
||||
path1[ii - i] = '\0';
|
||||
strcat(path1,"input\\");
|
||||
|
||||
while(1){
|
||||
wav++;
|
||||
printf("%d\n",wav);
|
||||
//getch();
|
||||
strcpy(path2,path1);
|
||||
sprintf(wavc,"%d.wav",wav);
|
||||
strcat(path2,wavc);
|
||||
|
||||
in = fopen(path2, "rb");
|
||||
if (in == NULL){
|
||||
printf("Error opening %s\n", path2);
|
||||
wav--;
|
||||
break;}
|
||||
else{fclose(in);
|
||||
printf(" OK! %d\n",wav);}}
|
||||
|
||||
in = NULL;
|
||||
|
||||
toc = malloc(wav*sizeof(int));
|
||||
length = 0x48 + ((wav) * 4);
|
||||
|
||||
for(i = 0; i < wav; i++){
|
||||
strcpy(path2,path1);
|
||||
sprintf(wavc,"%d.wav",i+1);
|
||||
strcat(path2,wavc);
|
||||
|
||||
in = fopen(path2, "rb");
|
||||
|
||||
if (in == NULL){
|
||||
printf("Error opening %s\n", path2);
|
||||
break;}
|
||||
else{
|
||||
printf(" OK! %d\n",i+1);
|
||||
fseek(in, 0, SEEK_END);
|
||||
toc[i] = length;
|
||||
printf("%d\n",toc[i]);
|
||||
length += ftell(in) + 0x18;
|
||||
fclose(in);}}
|
||||
|
||||
in = NULL;
|
||||
|
||||
out = fopen(filename, "wb");
|
||||
|
||||
fseek(out, 0x14, SEEK_SET);
|
||||
for(i = 0; i < 4; i++)
|
||||
fprintf(out,"%c",((wav>>(i*8))&255));
|
||||
|
||||
|
||||
fseek(out, 0x48, SEEK_SET);
|
||||
printf("%d",&toc[0]);
|
||||
for(i = 1; i < wav+1; i++)
|
||||
for(ii = 0; ii < 4; ii++){
|
||||
fprintf(out,"%c",(((toc[i-1])>>(ii*8))&255));}
|
||||
|
||||
for (i = 0; i < wav; i++)
|
||||
{
|
||||
strcpy(path2,path1);
|
||||
sprintf(wavc,"%d.wav",i+1);
|
||||
strcat(path2,wavc);
|
||||
|
||||
printf("File %s...", path2);
|
||||
|
||||
in = fopen(path2, "rb");
|
||||
fseek(in, 0, SEEK_END);
|
||||
length2 = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
printf("reading %li...", length2);
|
||||
buffer = malloc(length2);
|
||||
fread(buffer, length2, 1, in);
|
||||
fclose(in);
|
||||
|
||||
fseek(out, 0, SEEK_END);
|
||||
printf("writing...");
|
||||
out = fopen(filename, "ab");
|
||||
fwrite(aftertoc, 0x18, 1, out);
|
||||
fwrite(buffer, length2, 1, out);
|
||||
fclose(out);
|
||||
printf("done\n");
|
||||
}
|
||||
|
||||
encrypted = malloc(length);
|
||||
|
||||
printf("Encrypting ...\n");
|
||||
out = fopen(filename, "rb");
|
||||
|
||||
fread(block, 8, 1, in);
|
||||
//encpos = encrypted;
|
||||
//encrypt(out, filename);
|
||||
|
||||
//out = fopen(filename, "wb");
|
||||
//fprintf(out,"%%e12");
|
||||
//fseek(out, 0x04, SEEK_SET);
|
||||
//for(i = 0; i < 4; i++)
|
||||
//fprintf(out,"%c",((length>>(i*8))&255));
|
||||
|
||||
//fseek(out, 0x08, SEEK_SET);
|
||||
//fwrite(encrypted, length, 1, out);
|
||||
|
||||
fclose(out);
|
||||
//split_files();
|
||||
|
||||
free(encrypted);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,135 @@
|
||||
//create2dx_dumb.c by kinryuu based on create2dx.c by Kitaru, but aside from some variables not much is left ;D
|
||||
//Packs BME-style sequenced .wav (01.wav to ZZ.wav, but should work with BMS style 01 - FF as well) in the current folder into an unencrypted output.2dx
|
||||
//Takes no arguments and always outputs to the same file; only works with uppercase on unix but should work with lowercase on windows (if at all);
|
||||
//We also assume that the ascending order or the wavefiles equals their order in the corresponding bme/bms file
|
||||
//...hence "_dumb"
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
//wav files from 01-0A-0Z-10-ZZ (you get it) = 36*36 - 1
|
||||
#define MAXWAVS (36*36-1)
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
const byte aftertoc[24] = {
|
||||
'2', 'D', 'X', '9', //const string
|
||||
0x18, 0x00, 0x00, 0x00, //headersize (== 24)
|
||||
0x00, 0x00, 0x00, 0x00, //size of wave file (written at runtime)
|
||||
0x30, 0x32, 0xFF, 0xFF, //panning/initial volume?
|
||||
0x40, 0x00, 0x08, 0x00, //??? (64, 0, 8, 0)
|
||||
0x00, 0x00, 0x00, 0x00 //??? (0, 0, 0, 0)
|
||||
};
|
||||
|
||||
typedef struct{
|
||||
int length;
|
||||
byte *data;
|
||||
} wavefile;
|
||||
|
||||
int main()
|
||||
{
|
||||
//coding while listening to kachoufuusetsu long, hell yeah!
|
||||
|
||||
wavefile waves[MAXWAVS]; //use this to hold the wavefiles; MAYBE I SHOULD NAME THIS SMALL_WAVES ZOMG GET IT?
|
||||
|
||||
FILE *wavfile;
|
||||
FILE *out;
|
||||
|
||||
char digit1, digit2; //use this to hold the XY of [XY].wav
|
||||
int wav = 0; //wavefile count
|
||||
int firstwav = 0; //position of the first wave in the .2dx file (needed in .2dx header)
|
||||
int pos = 0, i = 0;
|
||||
|
||||
char wavepath[7]; //helperstring; ugly but works
|
||||
|
||||
memset(waves, 0, MAXWAVS*sizeof(wavefile));
|
||||
|
||||
i = 1; //BME starts counting at 01.wav, how stupid -_-
|
||||
|
||||
while(i <= MAXWAVS)
|
||||
{
|
||||
digit1 = i / 36; //works because this floors
|
||||
if(digit1 > 9)
|
||||
digit1 += 7; //there's a gap of 8 characters between '9' and 'A'
|
||||
digit1 += 48; //fancy charactermap magic
|
||||
|
||||
digit2 = i % 36; //mod operator = <3
|
||||
if(digit2 > 9)
|
||||
digit2 += 7;
|
||||
digit2 += 48; ␍
|
||||
sprintf(wavepath,"%c%c.wav",digit1,digit2);
|
||||
|
||||
wavfile = fopen(wavepath, "rb");
|
||||
if (wavfile != NULL)
|
||||
{
|
||||
//open the wave file and save its length and contents to the array
|
||||
printf("reading %c%c.wav...",digit1,digit2);
|
||||
fseek(wavfile, 0, SEEK_END);
|
||||
waves[i-1].length = (int)ftell(wavfile);
|
||||
fseek(wavfile, 0, SEEK_SET);
|
||||
printf("length %d...", waves[i-1].length);
|
||||
|
||||
waves[i-1].data = malloc(waves[i-1].length);
|
||||
|
||||
fread(waves[i-1].data, waves[i-1].length, 1, wavfile);
|
||||
|
||||
fclose(wavfile);
|
||||
wav++;
|
||||
printf("OK\n");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if(wav == 0) //learn2placefilesindirectories
|
||||
{
|
||||
printf("no wave files found, go die in a fire\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("\ntotal samplecount: %d\n\n",wav);
|
||||
|
||||
out = fopen("output.2dx", "wb"); //open the 2dx file
|
||||
|
||||
fseek(out, 0x10, SEEK_SET); //ignore the first 16 bytes (TODO: zero them to be sure?)
|
||||
|
||||
firstwav = 72 + wav*4; //first wave position = 2dx header + size of TOC (= wavecount * sizeof(int))
|
||||
fwrite(&firstwav, 4, 1, out); //write the position of the first wave file
|
||||
fwrite(&wav, 4, 1, out); //write the total numbers of waves
|
||||
|
||||
fseek(out, 0x48, SEEK_SET);
|
||||
|
||||
printf("writing TOC...");
|
||||
|
||||
pos = 0x48 + ((wav) * 4); //start of the wavefiles
|
||||
//write the table of contents (absolute position of the waves in the .2dx file)
|
||||
for(i = 0; i < MAXWAVS; i++)
|
||||
{
|
||||
if(waves[i].length > 0) //we only want waves with content
|
||||
{
|
||||
printf("%d...",pos);
|
||||
fwrite(&pos, 4, 1, out);
|
||||
pos += waves[i].length + 0x18; //don't forget about the 24 byte header
|
||||
}
|
||||
}
|
||||
printf("OK!\n\n");
|
||||
|
||||
//write the actual waves
|
||||
printf("writing samples...");
|
||||
for(i = 0; i < MAXWAVS; i++)
|
||||
{
|
||||
if(waves[i].length > 0)
|
||||
{
|
||||
printf("%d ", i);
|
||||
fwrite(aftertoc, 8, 1, out); //"2DX9" + headersize (== 24)
|
||||
fwrite(&waves[i].length, 4, 1, out); //size of the wave
|
||||
printf("(%d)...", waves[i].length);
|
||||
fwrite(aftertoc+12, 12, 1, out); //rest of the header
|
||||
fwrite(waves[i].data, waves[i].length, 1, out);
|
||||
}
|
||||
}
|
||||
printf("OK!\n");
|
||||
fclose(out);
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,20 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generator", "generator\generator.vcproj", "{55B5ABC8-C84C-43AE-B135-E21D7B6B79BE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{55B5ABC8-C84C-43AE-B135-E21D7B6B79BE}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{55B5ABC8-C84C-43AE-B135-E21D7B6B79BE}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{55B5ABC8-C84C-43AE-B135-E21D7B6B79BE}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{55B5ABC8-C84C-43AE-B135-E21D7B6B79BE}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,119 @@
|
||||
#include <windows.h>
|
||||
#include <gdiplus.h>
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace Gdiplus;
|
||||
|
||||
static Bitmap *renderString(const wchar_t *str)
|
||||
{
|
||||
Pen black(Color::Black);
|
||||
FontFamily font(L"Impact");
|
||||
RectF rect(0, 0, 512, 44);
|
||||
LinearGradientBrush brush(rect, Color(0xFFFFFFFF), Color(0xFF707070),
|
||||
LinearGradientModeVertical);
|
||||
GraphicsPath path;
|
||||
StringFormat fmt;
|
||||
Rect bounds;
|
||||
Matrix trans(1, 0, 0, 1, 0, 0);
|
||||
|
||||
// Create path
|
||||
path.AddString(str, -1, &font, 0, 42, PointF(-8, -8), &fmt);
|
||||
path.GetBounds(&bounds);
|
||||
|
||||
// Squeeze
|
||||
if (bounds.Width > 260) {
|
||||
trans.SetElements(260.0f / bounds.Width, 0, 0, 1, 0, 0);
|
||||
bounds.Width = 260;
|
||||
}
|
||||
|
||||
// Allocate
|
||||
Bitmap *bmp = new Bitmap(bounds.Width, bounds.Height);
|
||||
Graphics g(bmp);
|
||||
|
||||
// Render path
|
||||
g.SetSmoothingMode(SmoothingModeAntiAlias);
|
||||
g.SetTransform(&trans);
|
||||
g.FillPath(&brush, &path);
|
||||
g.DrawPath(&black, &path);
|
||||
|
||||
return bmp;
|
||||
}
|
||||
|
||||
#define put8(f, v) putc(v, f)
|
||||
|
||||
static void put16(FILE *f, SHORT value)
|
||||
{
|
||||
fwrite(&value, 2, 1, f);
|
||||
}
|
||||
|
||||
static void emitTGA(const char *filename, Bitmap *bmp)
|
||||
{
|
||||
Rect rect(0, 0, bmp->GetWidth(), bmp->GetHeight());
|
||||
BitmapData data;
|
||||
FILE *f;
|
||||
|
||||
f = fopen(filename, "wb");
|
||||
if (!f) {
|
||||
fprintf(stderr, "Could not open %s for writing\n", filename);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// Put TGA header
|
||||
put8(f, 0); put8(f, 0); put8(f, 2);
|
||||
put16(f, 0); put16(f, 0); put8(f, 0);
|
||||
put16(f, 0); put16(f, 0); put16(f, bmp->GetWidth()); put16(f, bmp->GetHeight());
|
||||
put8(f, 32); put8(f, 0x28);
|
||||
|
||||
// Put pixels
|
||||
bmp->LockBits(&rect, ImageLockModeRead, PixelFormat32bppARGB, &data);
|
||||
fwrite(data.Scan0, 4, rect.Width * rect.Height, f);
|
||||
|
||||
// Clean up
|
||||
bmp->UnlockBits(&data);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GdiplusStartupInput start;
|
||||
ULONG_PTR token;
|
||||
Bitmap *bmp;
|
||||
wchar_t wbuf[512];
|
||||
char filename[512];
|
||||
char buf[512];
|
||||
char *text;
|
||||
char *id;
|
||||
FILE *f;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s [infile] [outdir]\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
GdiplusStartup(&token, &start, NULL);
|
||||
f = fopen(argv[1], "r");
|
||||
|
||||
while (true) {
|
||||
// Get line
|
||||
fgets(buf, 512, f);
|
||||
if (feof(f)) break;
|
||||
|
||||
// Toke
|
||||
id = strtok(buf, "|\r\n");
|
||||
text = strtok(NULL, "|\r\n");
|
||||
|
||||
// Render string
|
||||
printf("Generating %s ...\n", id);
|
||||
mbstowcs(wbuf, text, 512);
|
||||
bmp = renderString(wbuf);
|
||||
|
||||
// Emit TGA
|
||||
sprintf(filename, "%s/%s.tga", argv[2], id);
|
||||
emitTGA(filename, bmp);
|
||||
|
||||
// Clean up
|
||||
delete bmp;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="generator"
|
||||
ProjectGUID="{55B5ABC8-C84C-43AE-B135-E21D7B6B79BE}"
|
||||
RootNamespace="generator"
|
||||
Keyword="Win32Proj"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="4"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="gdiplus.lib"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="gdiplus.lib"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<File
|
||||
RelativePath=".\generator.cpp"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -0,0 +1,64 @@
|
||||
T_2DX|IIDX
|
||||
T_9CLOCK|9 O'Clocks
|
||||
T_ADVANC|ADVANCE
|
||||
T_ALLRIG|ALL RIGHT
|
||||
T_AY_CARUMBA|ay carumba!!
|
||||
T_BDOWN|BRING HER DOWN
|
||||
T_BEDAYS|Beautiful Days
|
||||
T_BFOYOU|BALLAD FOR YOU
|
||||
T_BIGGES|The Biggest Roaster
|
||||
T_BUFYOU|BURNING UP FOR YOU
|
||||
T_CMUSIC|CLOUDY MUSIC
|
||||
T_COMEW|Come With Me
|
||||
T_DEADLI|Deadline
|
||||
T_DISSOL|dissolve
|
||||
T_DROWIN|LOVE IS DROWING
|
||||
T_DTEPO1|dong-tepo no. 1
|
||||
T_ENTRAN|entrance
|
||||
T_EVCAFE|E.V CAFE
|
||||
T_FANTAS|FANTASY
|
||||
T_FAWAY|Fly Away (Instrumental)
|
||||
T_FBP|FUNKY BINGO PARADISE
|
||||
T_FLUTEM|FLUTE MAN
|
||||
T_FUN|fun
|
||||
T_GENERA|General Relativity
|
||||
T_GMIYS|Get me in your sight
|
||||
T_HBEAT|HEARTBEAT
|
||||
T_HBGATE|HYPER BOUNDARY GATE
|
||||
T_HEADAC|Headache
|
||||
T_HHIKER|Hitch Hiker
|
||||
T_HONEY|Honey
|
||||
T_HORMIG|Hormiga obrera
|
||||
T_ICF58|I.C.F.5800
|
||||
T_JAM|JAM
|
||||
T_JELLYK|jelly kiss
|
||||
T_LETSRU|Let's run
|
||||
T_LGENER|LOVE GENERATION
|
||||
T_LUV2|Luv 2 Feel Your Body
|
||||
T_NWYORK|New York
|
||||
T_OLIMIT|OUTER LIMITS
|
||||
T_OTCMIX|OVER THE CLOUDS Rmx
|
||||
T_PDREAM|POWER DREAM
|
||||
T_R80S|route 80s
|
||||
T_REMEMB|REMEMBER ME
|
||||
T_ROMEO|ROMEO&JULIET
|
||||
T_RTRB|Ready To Rockit Blues
|
||||
T_SAVAGE|SWEETEST SAVAGE
|
||||
T_SCLONE|Small clone
|
||||
T_SCORE|SCORE
|
||||
T_SGOLD|SOLID GOLD
|
||||
T_SHAKIN|Shakin' 31
|
||||
T_SILHOE|Silhoette of My Mind
|
||||
T_SMOKE|Smoke
|
||||
T_SNOW|SNOW
|
||||
T_SOFTL|SOFT LANDING ON THE BODY
|
||||
T_SOMEBO|Somebody Like You
|
||||
T_STARDR|STAR DREAM
|
||||
T_STICKA|Stick Around
|
||||
T_STM3|SPEED TRANCE MACH 3
|
||||
T_SWITCH|SWITCH
|
||||
T_TBEOFS|The Beauty Of Silence
|
||||
T_TRIBAL|TRIBAL MASTER
|
||||
T_WOW70S|Wow Wow 70's
|
||||
T_WTTW|WANNA TELL THAT WORD
|
||||
T_YESTER|YESTERDAY
|
||||
Binary file not shown.
@@ -0,0 +1,47 @@
|
||||
名前 idxEdit
|
||||
バージョン 0.2
|
||||
|
||||
|
||||
★なにこれ
|
||||
DD以外のidxを編集したり、png - bmp - gc - gcz の相互変換するツール。
|
||||
|
||||
|
||||
★具体的に何ができるの
|
||||
・読み込み
|
||||
png : 多分ほとんど読み込める。各色下位3bitは切り捨て
|
||||
bmp : 24bit と 32bit のビットマップなら読み込める。各色下位3bitは切り捨て
|
||||
gc : 可
|
||||
gcz : 可
|
||||
|
||||
・書き出し
|
||||
png : 32bit深度の透過png
|
||||
bmp : 24bit深度のビットマップ
|
||||
gc : 可
|
||||
gcz : 時間かかる。Sigたんでも眺めながらお待ち下さい。
|
||||
|
||||
・idxファイル
|
||||
扱えるのは読み込むgczファイル名と、切り抜きの情報のみ。
|
||||
でも扱えない情報もちゃんと保持するので、扱えない情報を含むidxの編集も可能。
|
||||
|
||||
あと、切り抜きの一括保存も出来ます。
|
||||
|
||||
|
||||
★どうやって使うの
|
||||
だいたいステータスバー見て理解してほしいんですが、一応いくつか説明。
|
||||
|
||||
idxを開いた時に出てくる左側のツールについて。
|
||||
「クリッピング」タブで、切り抜き座標の編集をします。しかしこれアンドゥが無いので
|
||||
うかつに画像の方クリックしないで下さい。選択範囲が変更されてしまいます。
|
||||
|
||||
「gczファイル」タブで、読み込むgczファイルの編集をします。
|
||||
通常は参照ボタンでgraphフォルダを指定しておけば、gczファイルのパスから
|
||||
自動的にgczファイルを検索して画面に表示します。
|
||||
このフォルダのパスは保存されません。gczファイルを探すのに使うだけです。
|
||||
|
||||
「不明な項目」タブにある、「解析できない情報を削除」のボタンを押して
|
||||
確認画面でOKを押すと、「クリッピング」タブと「gczファイル」タブの情報以外の
|
||||
項目を削除します。あんま使うこと無いと思います。
|
||||
|
||||
|
||||
★ご意見ご要望
|
||||
スレにて。気まぐれで更新
|
||||
@@ -0,0 +1,130 @@
|
||||
/* crack2dx.c: Descramble a .2DX (sound archive) file */
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
const byte keys_09[] = {
|
||||
0x97, 0x1E, 0x24, 0xA0, 0x9A, 0x00, 0x10, 0x2B,
|
||||
0x91, 0xEF, 0xD7, 0x7A, 0xCD, 0x11, 0xAF, 0xAF,
|
||||
0x8D, 0x26, 0x5D, 0xBB, 0xE0, 0xC6, 0x1B, 0x2B
|
||||
};
|
||||
|
||||
const byte keys_10[] = {
|
||||
0x2D, 0x86, 0x56, 0x62, 0xD7, 0xFD, 0xCA, 0xA4,
|
||||
0xB3, 0x24, 0x60, 0x26, 0x24, 0x81, 0xDB, 0xC2,
|
||||
0x57, 0xB1, 0x74, 0x6F, 0xA7, 0x52, 0x99, 0x21
|
||||
};
|
||||
|
||||
const byte keys_11[] = {
|
||||
0xED, 0xF0, 0x9C, 0x90, 0x44, 0x1A, 0x5A, 0x03,
|
||||
0xAB, 0x07, 0xC1, 0x99, 0x23, 0x24, 0x32, 0xC7,
|
||||
0x5F, 0x32, 0xA5, 0x97, 0xAD, 0x98, 0x0F, 0x8F
|
||||
};
|
||||
|
||||
/** :gonk: */
|
||||
static void mix(byte block[8])
|
||||
{
|
||||
byte a = block[0] * 63;
|
||||
byte b = a + block[3];
|
||||
byte c = block[1] * 17;
|
||||
byte d = c + block[2];
|
||||
byte e = d + b;
|
||||
byte f = e * block[3];
|
||||
byte g = f + b + 51;
|
||||
byte h = b ^ d;
|
||||
byte i = g ^ e;
|
||||
|
||||
block[4] ^= h;
|
||||
block[5] ^= d;
|
||||
block[6] ^= i;
|
||||
block[7] ^= g;
|
||||
}
|
||||
|
||||
/** Descrambling loop */
|
||||
static void descramble(FILE *in, FILE *out, const byte key[24], int full)
|
||||
{
|
||||
byte prev_sblock[8];
|
||||
byte cur_sblock[8];
|
||||
byte block[8];
|
||||
byte tmp;
|
||||
int i;
|
||||
|
||||
while (!feof(in)) {
|
||||
fread(block, 8, 1, in);
|
||||
memcpy(cur_sblock, block, 8);
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key[i];
|
||||
mix(block);
|
||||
|
||||
for (i = 0 ; i < 4 ; i++) {
|
||||
tmp = block[i];
|
||||
block[i] = block[i + 4];
|
||||
block[i + 4] = tmp;
|
||||
}
|
||||
|
||||
if (full) {
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key[8 + i];
|
||||
mix(block);
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) block[i] ^= key[16 + i];
|
||||
}
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) {
|
||||
block[i] ^= prev_sblock[i];
|
||||
}
|
||||
|
||||
memcpy(prev_sblock, cur_sblock, 8);
|
||||
fwrite(block, 8, 1, out);
|
||||
}
|
||||
}
|
||||
|
||||
/** Entry point */
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
byte hdr[8];
|
||||
FILE *out;
|
||||
FILE *in;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s <infile> <outfile>\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
in = fopen(argv[1], "rb");
|
||||
if (!in) {
|
||||
fprintf(stderr, "%s: Could not open file for input\n", argv[1]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
out = fopen(argv[2], "wb");
|
||||
if (!out) {
|
||||
fprintf(stderr, "%s: Could not open file for output\n", argv[2]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
fread(hdr, 8, 1, in);
|
||||
if (memcmp(hdr, "%eNc", 4) == 0) {
|
||||
descramble(in, out, keys_09, 1);
|
||||
|
||||
} else if (memcmp(hdr, "%e10", 4) == 0) {
|
||||
descramble(in, out, keys_10, 1);
|
||||
|
||||
} else if (memcmp(hdr, "%e11", 4) == 0) {
|
||||
descramble(in, out, keys_11, 1);
|
||||
|
||||
} else if (memcmp(hdr, "%e12", 4) == 0 || memcmp(hdr, "%hid", 4) == 0) {
|
||||
descramble(in, out, keys_11, 0);
|
||||
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"Unknown scrambling type, probably not a scrambled file.\n");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
fclose(out);
|
||||
fclose(in);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
/* crackeout.c: Descramble DATA\INFO\EOUT.BIN. This is a song list file of
|
||||
* sorts. Alter the indicated line in main() to turn it into a rescrambler. */
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define ONE_BILLION 1000000000
|
||||
#define IDX_CURRENT_KEY 55
|
||||
#define IDX_COUNTER 56
|
||||
#define IDX_LAST 57
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
static void mix(int *state)
|
||||
{
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
for (i = 1 ; i < 25 ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i + 31];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
|
||||
for (i = 25 ; i <= IDX_CURRENT_KEY ; i++) {
|
||||
tmp = state[i];
|
||||
tmp -= state[i - 24];
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
state[i] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_state(int *state, byte src_byte)
|
||||
{
|
||||
int src;
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
src = src_byte;
|
||||
tmp = 1;
|
||||
|
||||
state[IDX_CURRENT_KEY] = src;
|
||||
|
||||
for (i = 0x15 ; i <= 0x46E ; i += 0x15) {
|
||||
src -= tmp;
|
||||
state[i % 0x37] = tmp;
|
||||
tmp = src;
|
||||
|
||||
if (tmp < 0) tmp += ONE_BILLION;
|
||||
src = state[i % 0x37];
|
||||
}
|
||||
|
||||
mix(state);
|
||||
mix(state);
|
||||
mix(state);
|
||||
|
||||
state[IDX_COUNTER] = 0x37;
|
||||
}
|
||||
|
||||
static byte produce_key(int *state)
|
||||
{
|
||||
int counter;
|
||||
|
||||
counter = state[IDX_COUNTER] + 1;
|
||||
state[IDX_COUNTER] = counter;
|
||||
|
||||
if (counter > 0x37) {
|
||||
mix(state);
|
||||
counter = 1;
|
||||
}
|
||||
|
||||
state[IDX_COUNTER] = counter;
|
||||
return state[counter];
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
static const byte key[] = {
|
||||
0x55, 0x37, 0x9F, 0xCC, 0xE3, 0xA7, 0x7D, 0x99,
|
||||
0xDD, 0xAA, 0xBB, 0xCF, 0xFC, 0x67, 0x43, 0x17
|
||||
};
|
||||
|
||||
FILE *in;
|
||||
FILE *out;
|
||||
int state[IDX_LAST];
|
||||
int quo;
|
||||
int rem;
|
||||
int i;
|
||||
byte b;
|
||||
|
||||
/* Usage */
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s [infile] [outfile]\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Setup */
|
||||
i = 0;
|
||||
memset(state, 0, sizeof(state));
|
||||
in = fopen(argv[1], "rb");
|
||||
out = fopen(argv[2], "wb");
|
||||
|
||||
/* Descramble */
|
||||
while (!feof(in)) {
|
||||
quo = i / 0x10;
|
||||
rem = i % 0x10;
|
||||
i++;
|
||||
|
||||
if (rem == 0) update_state(state, key[quo % 0x10]);
|
||||
|
||||
b = getc(in);
|
||||
b -= produce_key(state);
|
||||
/* To rescramble an eout.bin, change -= above to += */
|
||||
|
||||
putc(b, out);
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
fclose(in);
|
||||
fclose(out);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,792 @@
|
||||
/* crackgcz.c: Decrypt a IIDX 13 DistorteD AC GCZ file into the pre-DistorteD
|
||||
* format.
|
||||
*
|
||||
* Don't expect any meaningful function or variable names, because none of this
|
||||
* makes much sense. "Seeds" are the starting constants given below, "Keys" are
|
||||
* produced by combining seeds with the filename via a rather convoluted
|
||||
* process, and "States" are any values in between.
|
||||
*
|
||||
* The base name of the input file (i.e. the path of the input file stripped
|
||||
* of directories and its extension) forms part of the encryption key, so make
|
||||
* sure this is preserved, or decryption will fail. For example, the basename
|
||||
* of the path "data/graph/sys/mdata/4.gcz" is the string "4". */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned int u32_t;
|
||||
typedef unsigned char u8_t;
|
||||
|
||||
/* Key data. May change in GOLD etc */
|
||||
static const u8_t seed1[] = "tukupypy";
|
||||
static const u8_t seed2[] = "omE872M2akmRkERh4177S";
|
||||
static const u8_t seed3[] = {
|
||||
0x88, 0x6A, 0x3F, 0x24, 0xD3, 0x08, 0xA3, 0x85, 0x2E, 0x8A,
|
||||
0x19, 0x13, 0x44, 0x73, 0x70, 0x03, 0x22, 0x38, 0x09, 0xA4,
|
||||
0xD0, 0x31, 0x9F, 0x29, 0x98, 0xFA, 0x2E, 0x08, 0x89, 0x6C,
|
||||
0x4E, 0xEC, 0xE6, 0x21, 0x28, 0x45, 0x77, 0x13, 0xD0, 0x38,
|
||||
0xCF, 0x66, 0x54, 0xBE, 0x6C, 0x0C, 0xE9, 0x34, 0xB7, 0x29,
|
||||
0xAC, 0xC0, 0xDD, 0x50, 0x7C, 0xC9, 0xB5, 0xD5, 0x84, 0x3F,
|
||||
0x17, 0x09, 0x47, 0xB5, 0xD9, 0xD5, 0x16, 0x92, 0x1B, 0xFB,
|
||||
0x79, 0x89, 0xA6, 0x0B, 0x31, 0xD1, 0xAC, 0xB5, 0xDF, 0x98,
|
||||
0xDB, 0x72, 0xFD, 0x2F, 0xB7, 0xDF, 0x1A, 0xD0, 0xED, 0xAF,
|
||||
0xE1, 0xB8, 0x96, 0x7E, 0x26, 0x6A, 0x45, 0x90, 0x7C, 0xBA,
|
||||
0x99, 0x7F, 0x2C, 0xF1, 0x47, 0x99, 0xA1, 0x24, 0xF7, 0x6C,
|
||||
0x91, 0xB3, 0xE2, 0xF2, 0x01, 0x08, 0x16, 0xFC, 0x8E, 0x85,
|
||||
0xD8, 0x20, 0x69, 0x63, 0x69, 0x4E, 0x57, 0x71, 0xA3, 0xFE,
|
||||
0x58, 0xA4, 0x7E, 0x3D, 0x93, 0xF4, 0x8F, 0x74, 0x95, 0x0D,
|
||||
0x58, 0xB6, 0x8E, 0x72, 0x58, 0xCD, 0x8B, 0x71, 0xEE, 0x4A,
|
||||
0x15, 0x82, 0x1D, 0xA4, 0x54, 0x7B, 0xB5, 0x59, 0x5A, 0xC2,
|
||||
0x39, 0xD5, 0x30, 0x9C, 0x13, 0x60, 0xF2, 0x2A, 0x23, 0xB0,
|
||||
0xD1, 0xC5, 0xF0, 0x85, 0x60, 0x28, 0x18, 0x79, 0x41, 0xCA,
|
||||
0xEF, 0x38, 0xDB, 0xB8, 0xB0, 0xDC, 0x79, 0x8E, 0x0E, 0x18,
|
||||
0x3A, 0x60, 0x8B, 0x0E, 0x9E, 0x6C, 0x3E, 0x8A, 0x1E, 0xB0,
|
||||
0xC1, 0x77, 0x15, 0xD7, 0x27, 0x4B, 0x31, 0xBD, 0xDA, 0x2F,
|
||||
0xAF, 0x78, 0x60, 0x5C, 0x60, 0x55, 0xF3, 0x25, 0x55, 0xE6,
|
||||
0x94, 0xAB, 0x55, 0xAA, 0x62, 0x98, 0x48, 0x57, 0x40, 0x14,
|
||||
0xE8, 0x63, 0x6A, 0x39, 0xCA, 0x55, 0xB6, 0x10, 0xAB, 0x2A,
|
||||
0x34, 0x5C, 0xCC, 0xB4, 0xCE, 0xE8, 0x41, 0x11, 0xAF, 0x86,
|
||||
0x54, 0xA1, 0x93, 0xE9, 0x72, 0x7C, 0x11, 0x14, 0xEE, 0xB3,
|
||||
0x2A, 0xBC, 0x6F, 0x63, 0x5D, 0xC5, 0xA9, 0x2B, 0xF6, 0x31,
|
||||
0x18, 0x74, 0x16, 0x3E, 0x5C, 0xCE, 0x1E, 0x93, 0x87, 0x9B,
|
||||
0x33, 0xBA, 0xD6, 0xAF, 0x5C, 0xCF, 0x24, 0x6C, 0x81, 0x53,
|
||||
0x32, 0x7A, 0x77, 0x86, 0x95, 0x28, 0x98, 0x48, 0x8F, 0x3B,
|
||||
0xAF, 0xB9, 0x4B, 0x6B, 0x1B, 0xE8, 0xBF, 0xC4, 0x93, 0x21,
|
||||
0x28, 0x66, 0xCC, 0x09, 0xD8, 0x61, 0x91, 0xA9, 0x21, 0xFB,
|
||||
0x60, 0xAC, 0x7C, 0x48, 0x32, 0x80, 0xEC, 0x5D, 0x5D, 0x5D,
|
||||
0x84, 0xEF, 0xB1, 0x75, 0x85, 0xE9, 0x02, 0x23, 0x26, 0xDC,
|
||||
0x88, 0x1B, 0x65, 0xEB, 0x81, 0x3E, 0x89, 0x23, 0xC5, 0xAC,
|
||||
0x96, 0xD3, 0xF3, 0x6F, 0x6D, 0x0F, 0x39, 0x42, 0xF4, 0x83,
|
||||
0x82, 0x44, 0x0B, 0x2E, 0x04, 0x20, 0x84, 0xA4, 0x4A, 0xF0,
|
||||
0xC8, 0x69, 0x5E, 0x9B, 0x1F, 0x9E, 0x42, 0x68, 0xC6, 0x21,
|
||||
0x9A, 0x6C, 0xE9, 0xF6, 0x61, 0x9C, 0x0C, 0x67, 0xF0, 0x88,
|
||||
0xD3, 0xAB, 0xD2, 0xA0, 0x51, 0x6A, 0x68, 0x2F, 0x54, 0xD8,
|
||||
0x28, 0xA7, 0x0F, 0x96, 0xA3, 0x33, 0x51, 0xAB, 0x6C, 0x0B,
|
||||
0xEF, 0x6E, 0xE4, 0x3B, 0x7A, 0x13, 0x50, 0xF0, 0x3B, 0xBA,
|
||||
0x98, 0x2A, 0xFB, 0x7E, 0x1D, 0x65, 0xF1, 0xA1, 0x76, 0x01,
|
||||
0xAF, 0x39, 0x3E, 0x59, 0xCA, 0x66, 0x88, 0x0E, 0x43, 0x82,
|
||||
0x19, 0x86, 0xEE, 0x8C, 0xB4, 0x9F, 0x6F, 0x45, 0xC3, 0xA5,
|
||||
0x84, 0x7D, 0xBE, 0x5E, 0x8B, 0x3B, 0xD8, 0x75, 0x6F, 0xE0,
|
||||
0x73, 0x20, 0xC1, 0x85, 0x9F, 0x44, 0x1A, 0x40, 0xA6, 0x6A,
|
||||
0xC1, 0x56, 0x62, 0xAA, 0xD3, 0x4E, 0x06, 0x77, 0x3F, 0x36,
|
||||
0x72, 0xDF, 0xFE, 0x1B, 0x3D, 0x02, 0x9B, 0x42, 0x24, 0xD7,
|
||||
0xD0, 0x37, 0x48, 0x12, 0x0A, 0xD0, 0xD3, 0xEA, 0x0F, 0xDB,
|
||||
0x9B, 0xC0, 0xF1, 0x49, 0xC9, 0x72, 0x53, 0x07, 0x7B, 0x1B,
|
||||
0x99, 0x80, 0xD8, 0x79, 0xD4, 0x25, 0xF7, 0xDE, 0xE8, 0xF6,
|
||||
0x1A, 0x50, 0xFE, 0xE3, 0x3B, 0x4C, 0x79, 0xB6, 0xBD, 0xE0,
|
||||
0x6C, 0x97, 0xBA, 0x06, 0xC0, 0x04, 0xB6, 0x4F, 0xA9, 0xC1,
|
||||
0xC4, 0x60, 0x9F, 0x40, 0xC2, 0x9E, 0x5C, 0x5E, 0x63, 0x24,
|
||||
0x6A, 0x19, 0xAF, 0x6F, 0xFB, 0x68, 0xB5, 0x53, 0x6C, 0x3E,
|
||||
0xEB, 0xB2, 0x39, 0x13, 0x6F, 0xEC, 0x52, 0x3B, 0x1F, 0x51,
|
||||
0xFC, 0x6D, 0x2C, 0x95, 0x30, 0x9B, 0x44, 0x45, 0x81, 0xCC,
|
||||
0x09, 0xBD, 0x5E, 0xAF, 0x04, 0xD0, 0xE3, 0xBE, 0xFD, 0x4A,
|
||||
0x33, 0xDE, 0x07, 0x28, 0x0F, 0x66, 0xB3, 0x4B, 0x2E, 0x19,
|
||||
0x57, 0xA8, 0xCB, 0xC0, 0x0F, 0x74, 0xC8, 0x45, 0x39, 0x5F,
|
||||
0x0B, 0xD2, 0xDB, 0xFB, 0xD3, 0xB9, 0xBD, 0xC0, 0x79, 0x55,
|
||||
0x0A, 0x32, 0x60, 0x1A, 0xC6, 0x00, 0xA1, 0xD6, 0x79, 0x72,
|
||||
0x2C, 0x40, 0xFE, 0x25, 0x9F, 0x67, 0xCC, 0xA3, 0x1F, 0xFB,
|
||||
0xF8, 0xE9, 0xA5, 0x8E, 0xF8, 0x22, 0x32, 0xDB, 0xDF, 0x16,
|
||||
0x75, 0x3C, 0x15, 0x6B, 0x61, 0xFD, 0xC8, 0x1E, 0x50, 0x2F,
|
||||
0xAB, 0x52, 0x05, 0xAD, 0xFA, 0xB5, 0x3D, 0x32, 0x60, 0x87,
|
||||
0x23, 0xFD, 0x48, 0x7B, 0x31, 0x53, 0x82, 0xDF, 0x00, 0x3E,
|
||||
0xBB, 0x57, 0x5C, 0x9E, 0xA0, 0x8C, 0x6F, 0xCA, 0x2E, 0x56,
|
||||
0x87, 0x1A, 0xDB, 0x69, 0x17, 0xDF, 0xF6, 0xA8, 0x42, 0xD5,
|
||||
0xC3, 0xFF, 0x7E, 0x28, 0xC6, 0x32, 0x67, 0xAC, 0x73, 0x55,
|
||||
0x4F, 0x8C, 0xB0, 0x27, 0x5B, 0x69, 0xC8, 0x58, 0xCA, 0xBB,
|
||||
0x5D, 0xA3, 0xFF, 0xE1, 0xA0, 0x11, 0xF0, 0xB8, 0x98, 0x3D,
|
||||
0xFA, 0x10, 0xB8, 0x83, 0x21, 0xFD, 0x6C, 0xB5, 0xFC, 0x4A,
|
||||
0x5B, 0xD3, 0xD1, 0x2D, 0x79, 0xE4, 0x53, 0x9A, 0x65, 0x45,
|
||||
0xF8, 0xB6, 0xBC, 0x49, 0x8E, 0xD2, 0x90, 0x97, 0xFB, 0x4B,
|
||||
0xDA, 0xF2, 0xDD, 0xE1, 0x33, 0x7E, 0xCB, 0xA4, 0x41, 0x13,
|
||||
0xFB, 0x62, 0xE8, 0xC6, 0xE4, 0xCE, 0xDA, 0xCA, 0x20, 0xEF,
|
||||
0x01, 0x4C, 0x77, 0x36, 0xFE, 0x9E, 0x7E, 0xD0, 0xB4, 0x1F,
|
||||
0xF1, 0x2B, 0x4D, 0xDA, 0xDB, 0x95, 0x98, 0x91, 0x90, 0xAE,
|
||||
0x71, 0x8E, 0xAD, 0xEA, 0xA0, 0xD5, 0x93, 0x6B, 0xD0, 0xD1,
|
||||
0x8E, 0xD0, 0xE0, 0x25, 0xC7, 0xAF, 0x2F, 0x5B, 0x3C, 0x8E,
|
||||
0xB7, 0x94, 0x75, 0x8E, 0xFB, 0xE2, 0xF6, 0x8F, 0x64, 0x2B,
|
||||
0x12, 0xF2, 0x12, 0xB8, 0x88, 0x88, 0x1C, 0xF0, 0x0D, 0x90,
|
||||
0xA0, 0x5E, 0xAD, 0x4F, 0x1C, 0xC3, 0x8F, 0x68, 0x91, 0xF1,
|
||||
0xCF, 0xD1, 0xAD, 0xC1, 0xA8, 0xB3, 0x18, 0x22, 0x2F, 0x2F,
|
||||
0x77, 0x17, 0x0E, 0xBE, 0xFE, 0x2D, 0x75, 0xEA, 0xA1, 0x1F,
|
||||
0x02, 0x8B, 0x0F, 0xCC, 0xA0, 0xE5, 0xE8, 0x74, 0x6F, 0xB5,
|
||||
0xD6, 0xF3, 0xAC, 0x18, 0x99, 0xE2, 0x89, 0xCE, 0xE0, 0x4F,
|
||||
0xA8, 0xB4, 0xB7, 0xE0, 0x13, 0xFD, 0x81, 0x3B, 0xC4, 0x7C,
|
||||
0xD9, 0xA8, 0xAD, 0xD2, 0x66, 0xA2, 0x5F, 0x16, 0x05, 0x77,
|
||||
0x95, 0x80, 0x14, 0x73, 0xCC, 0x93, 0x77, 0x14, 0x1A, 0x21,
|
||||
0x65, 0x20, 0xAD, 0xE6, 0x86, 0xFA, 0xB5, 0x77, 0xF5, 0x42,
|
||||
0x54, 0xC7, 0xCF, 0x35, 0x9D, 0xFB, 0x0C, 0xAF, 0xCD, 0xEB,
|
||||
0xA0, 0x89, 0x3E, 0x7B, 0xD3, 0x1B, 0x41, 0xD6, 0x49, 0x7E,
|
||||
0x1E, 0xAE, 0x2D, 0x0E, 0x25, 0x00, 0x5E, 0xB3, 0x71, 0x20,
|
||||
0xBB, 0x00, 0x68, 0x22, 0xAF, 0xE0, 0xB8, 0x57, 0x9B, 0x36,
|
||||
0x64, 0x24, 0x1E, 0xB9, 0x09, 0xF0, 0x1D, 0x91, 0x63, 0x55,
|
||||
0xAA, 0xA6, 0xDF, 0x59, 0x89, 0x43, 0xC1, 0x78, 0x7F, 0x53,
|
||||
0x5A, 0xD9, 0xA2, 0x5B, 0x7D, 0x20, 0xC5, 0xB9, 0xE5, 0x02,
|
||||
0x76, 0x03, 0x26, 0x83, 0xA9, 0xCF, 0x95, 0x62, 0x68, 0x19,
|
||||
0xC8, 0x11, 0x41, 0x4A, 0x73, 0x4E, 0xCA, 0x2D, 0x47, 0xB3,
|
||||
0x4A, 0xA9, 0x14, 0x7B, 0x52, 0x00, 0x51, 0x1B, 0x15, 0x29,
|
||||
0x53, 0x9A, 0x3F, 0x57, 0x0F, 0xD6, 0xE4, 0xC6, 0x9B, 0xBC,
|
||||
0x76, 0xA4, 0x60, 0x2B, 0x00, 0x74, 0xE6, 0x81, 0xB5, 0x6F,
|
||||
0xBA, 0x08, 0x1F, 0xE9, 0x1B, 0x57, 0x6B, 0xEC, 0x96, 0xF2,
|
||||
0x15, 0xD9, 0x0D, 0x2A, 0x21, 0x65, 0x63, 0xB6, 0xB6, 0xF9,
|
||||
0xB9, 0xE7, 0x2E, 0x05, 0x34, 0xFF, 0x64, 0x56, 0x85, 0xC5,
|
||||
0x5D, 0x2D, 0xB0, 0x53, 0xA1, 0x8F, 0x9F, 0xA9, 0x99, 0x47,
|
||||
0xBA, 0x08, 0x6A, 0x07, 0x85, 0x6E, 0xE9, 0x70, 0x7A, 0x4B,
|
||||
0x44, 0x29, 0xB3, 0xB5, 0x2E, 0x09, 0x75, 0xDB, 0x23, 0x26,
|
||||
0x19, 0xC4, 0xB0, 0xA6, 0x6E, 0xAD, 0x7D, 0xDF, 0xA7, 0x49,
|
||||
0xB8, 0x60, 0xEE, 0x9C, 0x66, 0xB2, 0xED, 0x8F, 0x71, 0x8C,
|
||||
0xAA, 0xEC, 0xFF, 0x17, 0x9A, 0x69, 0x6C, 0x52, 0x64, 0x56,
|
||||
0xE1, 0x9E, 0xB1, 0xC2, 0xA5, 0x02, 0x36, 0x19, 0x29, 0x4C,
|
||||
0x09, 0x75, 0x40, 0x13, 0x59, 0xA0, 0x3E, 0x3A, 0x18, 0xE4,
|
||||
0x9A, 0x98, 0x54, 0x3F, 0x65, 0x9D, 0x42, 0x5B, 0xD6, 0xE4,
|
||||
0x8F, 0x6B, 0xD6, 0x3F, 0xF7, 0x99, 0x07, 0x9C, 0xD2, 0xA1,
|
||||
0xF5, 0x30, 0xE8, 0xEF, 0xE6, 0x38, 0x2D, 0x4D, 0xC1, 0x5D,
|
||||
0x25, 0xF0, 0x86, 0x20, 0xDD, 0x4C, 0x26, 0xEB, 0x70, 0x84,
|
||||
0xC6, 0xE9, 0x82, 0x63, 0x5E, 0xCC, 0x1E, 0x02, 0x3F, 0x6B,
|
||||
0x68, 0x09, 0xC9, 0xEF, 0xBA, 0x3E, 0x14, 0x18, 0x97, 0x3C,
|
||||
0xA1, 0x70, 0x6A, 0x6B, 0x84, 0x35, 0x7F, 0x68, 0x86, 0xE2,
|
||||
0xA0, 0x52, 0x05, 0x53, 0x9C, 0xB7, 0x37, 0x07, 0x50, 0xAA,
|
||||
0x1C, 0x84, 0x07, 0x3E, 0x5C, 0xAE, 0xDE, 0x7F, 0xEC, 0x44,
|
||||
0x7D, 0x8E, 0xB8, 0xF2, 0x16, 0x57, 0x37, 0xDA, 0x3A, 0xB0,
|
||||
0x0D, 0x0C, 0x50, 0xF0, 0x04, 0x1F, 0x1C, 0xF0, 0xFF, 0xB3,
|
||||
0x00, 0x02, 0x1A, 0xF5, 0x0C, 0xAE, 0xB2, 0x74, 0xB5, 0x3C,
|
||||
0x58, 0x7A, 0x83, 0x25, 0xBD, 0x21, 0x09, 0xDC, 0xF9, 0x13,
|
||||
0x91, 0xD1, 0xF6, 0x2F, 0xA9, 0x7C, 0x73, 0x47, 0x32, 0x94,
|
||||
0x01, 0x47, 0xF5, 0x22, 0x81, 0xE5, 0xE5, 0x3A, 0xDC, 0xDA,
|
||||
0xC2, 0x37, 0x34, 0x76, 0xB5, 0xC8, 0xA7, 0xDD, 0xF3, 0x9A,
|
||||
0x46, 0x61, 0x44, 0xA9, 0x0E, 0x03, 0xD0, 0x0F, 0x3E, 0xC7,
|
||||
0xC8, 0xEC, 0x41, 0x1E, 0x75, 0xA4, 0x99, 0xCD, 0x38, 0xE2,
|
||||
0x2F, 0x0E, 0xEA, 0x3B, 0xA1, 0xBB, 0x80, 0x32, 0x31, 0xB3,
|
||||
0x3E, 0x18, 0x38, 0x8B, 0x54, 0x4E, 0x08, 0xB9, 0x6D, 0x4F,
|
||||
0x03, 0x0D, 0x42, 0x6F, 0xBF, 0x04, 0x0A, 0xF6, 0x90, 0x12,
|
||||
0xB8, 0x2C, 0x79, 0x7C, 0x97, 0x24, 0x72, 0xB0, 0x79, 0x56,
|
||||
0xAF, 0x89, 0xAF, 0xBC, 0x1F, 0x77, 0x9A, 0xDE, 0x10, 0x08,
|
||||
0x93, 0xD9, 0x12, 0xAE, 0x8B, 0xB3, 0x2E, 0x3F, 0xCF, 0xDC,
|
||||
0x1F, 0x72, 0x12, 0x55, 0x24, 0x71, 0x6B, 0x2E, 0xE6, 0xDD,
|
||||
0x1A, 0x50, 0x87, 0xCD, 0x84, 0x9F, 0x18, 0x47, 0x58, 0x7A,
|
||||
0x17, 0xDA, 0x08, 0x74, 0xBC, 0x9A, 0x9F, 0xBC, 0x8C, 0x7D,
|
||||
0x4B, 0xE9, 0x3A, 0xEC, 0x7A, 0xEC, 0xFA, 0x1D, 0x85, 0xDB,
|
||||
0x66, 0x43, 0x09, 0x63, 0xD2, 0xC3, 0x64, 0xC4, 0x47, 0x18,
|
||||
0x1C, 0xEF, 0x08, 0xD9, 0x15, 0x32, 0x37, 0x3B, 0x43, 0xDD,
|
||||
0x16, 0xBA, 0xC2, 0x24, 0x43, 0x4D, 0xA1, 0x12, 0x51, 0xC4,
|
||||
0x65, 0x2A, 0x02, 0x00, 0x94, 0x50, 0xDD, 0xE4, 0x3A, 0x13,
|
||||
0x9E, 0xF8, 0xDF, 0x71, 0x55, 0x4E, 0x31, 0x10, 0xD6, 0x77,
|
||||
0xAC, 0x81, 0x9B, 0x19, 0x11, 0x5F, 0xF1, 0x56, 0x35, 0x04,
|
||||
0x6B, 0xC7, 0xA3, 0xD7, 0x3B, 0x18, 0x11, 0x3C, 0x09, 0xA5,
|
||||
0x24, 0x59, 0xED, 0xE6, 0x8F, 0xF2, 0xFA, 0xFB, 0xF1, 0x97,
|
||||
0x2C, 0xBF, 0xBA, 0x9E, 0x6E, 0x3C, 0x15, 0x1E, 0x70, 0x45,
|
||||
0xE3, 0x86, 0xB1, 0x6F, 0xE9, 0xEA, 0x0A, 0x5E, 0x0E, 0x86,
|
||||
0xB3, 0x2A, 0x3E, 0x5A, 0x1C, 0xE7, 0x1F, 0x77, 0xFA, 0x06,
|
||||
0x3D, 0x4E, 0xB9, 0xDC, 0x65, 0x29, 0x0F, 0x1D, 0xE7, 0x99,
|
||||
0xD6, 0x89, 0x3E, 0x80, 0x25, 0xC8, 0x66, 0x52, 0x78, 0xC9,
|
||||
0x4C, 0x2E, 0x6A, 0xB3, 0x10, 0x9C, 0xBA, 0x0E, 0x15, 0xC6,
|
||||
0x78, 0xEA, 0xE2, 0x94, 0x53, 0x3C, 0xFC, 0xA5, 0xF4, 0x2D,
|
||||
0x0A, 0x1E, 0xA7, 0x4E, 0xF7, 0xF2, 0x3D, 0x2B, 0x1D, 0x36,
|
||||
0x0F, 0x26, 0x39, 0x19, 0x60, 0x79, 0xC2, 0x19, 0x08, 0xA7,
|
||||
0x23, 0x52, 0xB6, 0x12, 0x13, 0xF7, 0x6E, 0xFE, 0xAD, 0xEB,
|
||||
0x66, 0x1F, 0xC3, 0xEA, 0x95, 0x45, 0xBC, 0xE3, 0x83, 0xC8,
|
||||
0x7B, 0xA6, 0xD1, 0x37, 0x7F, 0xB1, 0x28, 0xFF, 0x8C, 0x01,
|
||||
0xEF, 0xDD, 0x32, 0xC3, 0xA5, 0x5A, 0x6C, 0xBE, 0x85, 0x21,
|
||||
0x58, 0x65, 0x02, 0x98, 0xAB, 0x68, 0x0F, 0xA5, 0xCE, 0xEE,
|
||||
0x3B, 0x95, 0x2F, 0xDB, 0xAD, 0x7D, 0xEF, 0x2A, 0x84, 0x2F,
|
||||
0x6E, 0x5B, 0x28, 0xB6, 0x21, 0x15, 0x70, 0x61, 0x07, 0x29,
|
||||
0x75, 0x47, 0xDD, 0xEC, 0x10, 0x15, 0x9F, 0x61, 0x30, 0xA8,
|
||||
0xCC, 0x13, 0x96, 0xBD, 0x61, 0xEB, 0x1E, 0xFE, 0x34, 0x03,
|
||||
0xCF, 0x63, 0x03, 0xAA, 0x90, 0x5C, 0x73, 0xB5, 0x39, 0xA2,
|
||||
0x70, 0x4C, 0x0B, 0x9E, 0x9E, 0xD5, 0x14, 0xDE, 0xAA, 0xCB,
|
||||
0xBC, 0x86, 0xCC, 0xEE, 0xA7, 0x2C, 0x62, 0x60, 0xAB, 0x5C,
|
||||
0xAB, 0x9C, 0x6E, 0x84, 0xF3, 0xB2, 0xAF, 0x1E, 0x8B, 0x64,
|
||||
0xCA, 0xF0, 0xBD, 0x19, 0xB9, 0x69, 0x23, 0xA0, 0x50, 0xBB,
|
||||
0x5A, 0x65, 0x32, 0x5A, 0x68, 0x40, 0xB3, 0xB4, 0x2A, 0x3C,
|
||||
0xD5, 0xE9, 0x9E, 0x31, 0xF7, 0xB8, 0x21, 0xC0, 0x19, 0x0B,
|
||||
0x54, 0x9B, 0x99, 0xA0, 0x5F, 0x87, 0x7E, 0x99, 0xF7, 0x95,
|
||||
0xA8, 0x7D, 0x3D, 0x62, 0x9A, 0x88, 0x37, 0xF8, 0x77, 0x2D,
|
||||
0xE3, 0x97, 0x5F, 0x93, 0xED, 0x11, 0x81, 0x12, 0x68, 0x16,
|
||||
0x29, 0x88, 0x35, 0x0E, 0xD6, 0x1F, 0xE6, 0xC7, 0xA1, 0xDF,
|
||||
0xDE, 0x96, 0x99, 0xBA, 0x58, 0x78, 0xA5, 0x84, 0xF5, 0x57,
|
||||
0x63, 0x72, 0x22, 0x1B, 0xFF, 0xC3, 0x83, 0x9B, 0x96, 0x46,
|
||||
0xC2, 0x1A, 0xEB, 0x0A, 0xB3, 0xCD, 0x54, 0x30, 0x2E, 0x53,
|
||||
0xE4, 0x48, 0xD9, 0x8F, 0x28, 0x31, 0xBC, 0x6D, 0xEF, 0xF2,
|
||||
0xEB, 0x58, 0xEA, 0xFF, 0xC6, 0x34, 0x61, 0xED, 0x28, 0xFE,
|
||||
0x73, 0x3C, 0x7C, 0xEE, 0xD9, 0x14, 0x4A, 0x5D, 0xE3, 0xB7,
|
||||
0x64, 0xE8, 0x14, 0x5D, 0x10, 0x42, 0xE0, 0x13, 0x3E, 0x20,
|
||||
0xB6, 0xE2, 0xEE, 0x45, 0xEA, 0xAB, 0xAA, 0xA3, 0x15, 0x4F,
|
||||
0x6C, 0xDB, 0xD0, 0x4F, 0xCB, 0xFA, 0x42, 0xF4, 0x42, 0xC7,
|
||||
0xB5, 0xBB, 0x6A, 0xEF, 0x1D, 0x3B, 0x4F, 0x65, 0x05, 0x21,
|
||||
0xCD, 0x41, 0x9E, 0x79, 0x1E, 0xD8, 0xC7, 0x4D, 0x85, 0x86,
|
||||
0x6A, 0x47, 0x4B, 0xE4, 0x50, 0x62, 0x81, 0x3D, 0xF2, 0xA1,
|
||||
0x62, 0xCF, 0x46, 0x26, 0x8D, 0x5B, 0xA0, 0x83, 0x88, 0xFC,
|
||||
0xA3, 0xB6, 0xC7, 0xC1, 0xC3, 0x24, 0x15, 0x7F, 0x92, 0x74,
|
||||
0xCB, 0x69, 0x0B, 0x8A, 0x84, 0x47, 0x85, 0xB2, 0x92, 0x56,
|
||||
0x00, 0xBF, 0x5B, 0x09, 0x9D, 0x48, 0x19, 0xAD, 0x74, 0xB1,
|
||||
0x62, 0x14, 0x00, 0x0E, 0x82, 0x23, 0x2A, 0x8D, 0x42, 0x58,
|
||||
0xEA, 0xF5, 0x55, 0x0C, 0x3E, 0xF4, 0xAD, 0x1D, 0x61, 0x70,
|
||||
0x3F, 0x23, 0x92, 0xF0, 0x72, 0x33, 0x41, 0x7E, 0x93, 0x8D,
|
||||
0xF1, 0xEC, 0x5F, 0xD6, 0xDB, 0x3B, 0x22, 0x6C, 0x59, 0x37,
|
||||
0xDE, 0x7C, 0x60, 0x74, 0xEE, 0xCB, 0xA7, 0xF2, 0x85, 0x40,
|
||||
0x6E, 0x32, 0x77, 0xCE, 0x84, 0x80, 0x07, 0xA6, 0x9E, 0x50,
|
||||
0xF8, 0x19, 0x55, 0xD8, 0xEF, 0xE8, 0x35, 0x97, 0xD9, 0x61,
|
||||
0xAA, 0xA7, 0x69, 0xA9, 0xC2, 0x06, 0x0C, 0xC5, 0xFC, 0xAB,
|
||||
0x04, 0x5A, 0xDC, 0xCA, 0x0B, 0x80, 0x2E, 0x7A, 0x44, 0x9E,
|
||||
0x84, 0x34, 0x45, 0xC3, 0x05, 0x67, 0xD5, 0xFD, 0xC9, 0x9E,
|
||||
0x1E, 0x0E, 0xD3, 0xDB, 0x73, 0xDB, 0xCD, 0x88, 0x55, 0x10,
|
||||
0x79, 0xDA, 0x5F, 0x67, 0x40, 0x43, 0x67, 0xE3, 0x65, 0x34,
|
||||
0xC4, 0xC5, 0xD8, 0x38, 0x3E, 0x71, 0x9E, 0xF8, 0x28, 0x3D,
|
||||
0x20, 0xFF, 0x6D, 0xF1, 0xE7, 0x21, 0x3E, 0x15, 0x4A, 0x3D,
|
||||
0xB0, 0x8F, 0x2B, 0x9F, 0xE3, 0xE6, 0xF7, 0xAD, 0x83, 0xDB,
|
||||
0x68, 0x5A, 0x3D, 0xE9, 0xF7, 0x40, 0x81, 0x94, 0x1C, 0x26,
|
||||
0x4C, 0xF6, 0x34, 0x29, 0x69, 0x94, 0xF7, 0x20, 0x15, 0x41,
|
||||
0xF7, 0xD4, 0x02, 0x76, 0x2E, 0x6B, 0xF4, 0xBC, 0x68, 0x00,
|
||||
0xA2, 0xD4, 0x71, 0x24, 0x08, 0xD4, 0x6A, 0xF4, 0x20, 0x33,
|
||||
0xB7, 0xD4, 0xB7, 0x43, 0xAF, 0x61, 0x00, 0x50, 0x2E, 0xF6,
|
||||
0x39, 0x1E, 0x46, 0x45, 0x24, 0x97, 0x74, 0x4F, 0x21, 0x14,
|
||||
0x40, 0x88, 0x8B, 0xBF, 0x1D, 0xFC, 0x95, 0x4D, 0xAF, 0x91,
|
||||
0xB5, 0x96, 0xD3, 0xDD, 0xF4, 0x70, 0x45, 0x2F, 0xA0, 0x66,
|
||||
0xEC, 0x09, 0xBC, 0xBF, 0x85, 0x97, 0xBD, 0x03, 0xD0, 0x6D,
|
||||
0xAC, 0x7F, 0x04, 0x85, 0xCB, 0x31, 0xB3, 0x27, 0xEB, 0x96,
|
||||
0x41, 0x39, 0xFD, 0x55, 0xE6, 0x47, 0x25, 0xDA, 0x9A, 0x0A,
|
||||
0xCA, 0xAB, 0x25, 0x78, 0x50, 0x28, 0xF4, 0x29, 0x04, 0x53,
|
||||
0xDA, 0x86, 0x2C, 0x0A, 0xFB, 0x6D, 0xB6, 0xE9, 0x62, 0x14,
|
||||
0xDC, 0x68, 0x00, 0x69, 0x48, 0xD7, 0xA4, 0xC0, 0x0E, 0x68,
|
||||
0xEE, 0x8D, 0xA1, 0x27, 0xA2, 0xFE, 0x3F, 0x4F, 0x8C, 0xAD,
|
||||
0x87, 0xE8, 0x06, 0xE0, 0x8C, 0xB5, 0xB6, 0xD6, 0xF4, 0x7A,
|
||||
0x7C, 0x1E, 0xCE, 0xAA, 0xEC, 0x5F, 0x37, 0xD3, 0x99, 0xA3,
|
||||
0x78, 0xCE, 0x42, 0x2A, 0x6B, 0x40, 0x35, 0x9E, 0xFE, 0x20,
|
||||
0xB9, 0x85, 0xF3, 0xD9, 0xAB, 0xD7, 0x39, 0xEE, 0x8B, 0x4E,
|
||||
0x12, 0x3B, 0xF7, 0xFA, 0xC9, 0x1D, 0x56, 0x18, 0x6D, 0x4B,
|
||||
0x31, 0x66, 0xA3, 0x26, 0xB2, 0x97, 0xE3, 0xEA, 0x74, 0xFA,
|
||||
0x6E, 0x3A, 0x32, 0x43, 0x5B, 0xDD, 0xF7, 0xE7, 0x41, 0x68,
|
||||
0xFB, 0x20, 0x78, 0xCA, 0x4E, 0xF5, 0x0A, 0xFB, 0x97, 0xB3,
|
||||
0xFE, 0xD8, 0xAC, 0x56, 0x40, 0x45, 0x27, 0x95, 0x48, 0xBA,
|
||||
0x3A, 0x3A, 0x53, 0x55, 0x87, 0x8D, 0x83, 0x20, 0xB7, 0xA9,
|
||||
0x6B, 0xFE, 0x4B, 0x95, 0x96, 0xD0, 0xBC, 0x67, 0xA8, 0x55,
|
||||
0x58, 0x9A, 0x15, 0xA1, 0x63, 0x29, 0xA9, 0xCC, 0x33, 0xDB,
|
||||
0xE1, 0x99, 0x56, 0x4A, 0x2A, 0xA6, 0xF9, 0x25, 0x31, 0x3F,
|
||||
0x1C, 0x7E, 0xF4, 0x5E, 0x7C, 0x31, 0x29, 0x90, 0x02, 0xE8,
|
||||
0xF8, 0xFD, 0x70, 0x2F, 0x27, 0x04, 0x5C, 0x15, 0xBB, 0x80,
|
||||
0xE3, 0x2C, 0x28, 0x05, 0x48, 0x15, 0xC1, 0x95, 0x22, 0x6D,
|
||||
0xC6, 0xE4, 0x3F, 0x13, 0xC1, 0x48, 0xDC, 0x86, 0x0F, 0xC7,
|
||||
0xEE, 0xC9, 0xF9, 0x07, 0x0F, 0x1F, 0x04, 0x41, 0xA4, 0x79,
|
||||
0x47, 0x40, 0x17, 0x6E, 0x88, 0x5D, 0xEB, 0x51, 0x5F, 0x32,
|
||||
0xD1, 0xC0, 0x9B, 0xD5, 0x8F, 0xC1, 0xBC, 0xF2, 0x64, 0x35,
|
||||
0x11, 0x41, 0x34, 0x78, 0x7B, 0x25, 0x60, 0x9C, 0x2A, 0x60,
|
||||
0xA3, 0xE8, 0xF8, 0xDF, 0x1B, 0x6C, 0x63, 0x1F, 0xC2, 0xB4,
|
||||
0x12, 0x0E, 0x9E, 0x32, 0xE1, 0x02, 0xD1, 0x4F, 0x66, 0xAF,
|
||||
0x15, 0x81, 0xD1, 0xCA, 0xE0, 0x95, 0x23, 0x6B, 0xE1, 0x92,
|
||||
0x3E, 0x33, 0x62, 0x0B, 0x24, 0x3B, 0x22, 0xB9, 0xBE, 0xEE,
|
||||
0x0E, 0xA2, 0xB2, 0x85, 0x99, 0x0D, 0xBA, 0xE6, 0x8C, 0x0C,
|
||||
0x72, 0xDE, 0x28, 0xF7, 0xA2, 0x2D, 0x45, 0x78, 0x12, 0xD0,
|
||||
0xFD, 0x94, 0xB7, 0x95, 0x62, 0x08, 0x7D, 0x64, 0xF0, 0xF5,
|
||||
0xCC, 0xE7, 0x6F, 0xA3, 0x49, 0x54, 0xFA, 0x48, 0x7D, 0x87,
|
||||
0x27, 0xFD, 0x9D, 0xC3, 0x1E, 0x8D, 0x3E, 0xF3, 0x41, 0x63,
|
||||
0x47, 0x0A, 0x74, 0xFF, 0x2E, 0x99, 0xAB, 0x6E, 0x6F, 0x3A,
|
||||
0x37, 0xFD, 0xF8, 0xF4, 0x60, 0xDC, 0x12, 0xA8, 0xF8, 0xDD,
|
||||
0xEB, 0xA1, 0x4C, 0xE1, 0x1B, 0x99, 0x0D, 0x6B, 0x6E, 0xDB,
|
||||
0x10, 0x55, 0x7B, 0xC6, 0x37, 0x2C, 0x67, 0x6D, 0x3B, 0xD4,
|
||||
0x65, 0x27, 0x04, 0xE8, 0xD0, 0xDC, 0xC7, 0x0D, 0x29, 0xF1,
|
||||
0xA3, 0xFF, 0x00, 0xCC, 0x92, 0x0F, 0x39, 0xB5, 0x0B, 0xED,
|
||||
0x0F, 0x69, 0xFB, 0x9F, 0x7B, 0x66, 0x9C, 0x7D, 0xDB, 0xCE,
|
||||
0x0B, 0xCF, 0x91, 0xA0, 0xA3, 0x5E, 0x15, 0xD9, 0x88, 0x2F,
|
||||
0x13, 0xBB, 0x24, 0xAD, 0x5B, 0x51, 0xBF, 0x79, 0x94, 0x7B,
|
||||
0xEB, 0xD6, 0x3B, 0x76, 0xB3, 0x2E, 0x39, 0x37, 0x79, 0x59,
|
||||
0x11, 0xCC, 0x97, 0xE2, 0x26, 0x80, 0x2D, 0x31, 0x2E, 0xF4,
|
||||
0xA7, 0xAD, 0x42, 0x68, 0x3B, 0x2B, 0x6A, 0xC6, 0xCC, 0x4C,
|
||||
0x75, 0x12, 0x1C, 0xF1, 0x2E, 0x78, 0x37, 0x42, 0x12, 0x6A,
|
||||
0xE7, 0x51, 0x92, 0xB7, 0xE6, 0xBB, 0xA1, 0x06, 0x50, 0x63,
|
||||
0xFB, 0x4B, 0x18, 0x10, 0x6B, 0x1A, 0xFA, 0xED, 0xCA, 0x11,
|
||||
0xD8, 0xBD, 0x25, 0x3D, 0xC9, 0xC3, 0xE1, 0xE2, 0x59, 0x16,
|
||||
0x42, 0x44, 0x86, 0x13, 0x12, 0x0A, 0x6E, 0xEC, 0x0C, 0xD9,
|
||||
0x2A, 0xEA, 0xAB, 0xD5, 0x4E, 0x67, 0xAF, 0x64, 0x5F, 0xA8,
|
||||
0x86, 0xDA, 0x88, 0xE9, 0xBF, 0xBE, 0xFE, 0xC3, 0xE4, 0x64,
|
||||
0x57, 0x80, 0xBC, 0x9D, 0x86, 0xC0, 0xF7, 0xF0, 0xF8, 0x7B,
|
||||
0x78, 0x60, 0x4D, 0x60, 0x03, 0x60, 0x46, 0x83, 0xFD, 0xD1,
|
||||
0xB0, 0x1F, 0x38, 0xF6, 0x04, 0xAE, 0x45, 0x77, 0xCC, 0xFC,
|
||||
0x36, 0xD7, 0x33, 0x6B, 0x42, 0x83, 0x71, 0xAB, 0x1E, 0xF0,
|
||||
0x87, 0x41, 0x80, 0xB0, 0x5F, 0x5E, 0x00, 0x3C, 0xBE, 0x57,
|
||||
0xA0, 0x77, 0x24, 0xAE, 0xE8, 0xBD, 0x99, 0x42, 0x46, 0x55,
|
||||
0x61, 0x2E, 0x58, 0xBF, 0x8F, 0xF4, 0x58, 0x4E, 0xA2, 0xFD,
|
||||
0xDD, 0xF2, 0x38, 0xEF, 0x74, 0xF4, 0xC2, 0xBD, 0x89, 0x87,
|
||||
0xC3, 0xF9, 0x66, 0x53, 0x74, 0x8E, 0xB3, 0xC8, 0x55, 0xF2,
|
||||
0x75, 0xB4, 0xB9, 0xD9, 0xFC, 0x46, 0x61, 0x26, 0xEB, 0x7A,
|
||||
0x84, 0xDF, 0x1D, 0x8B, 0x79, 0x0E, 0x6A, 0x84, 0xE2, 0x95,
|
||||
0x5F, 0x91, 0x8E, 0x59, 0x6E, 0x46, 0x70, 0x57, 0xB4, 0x20,
|
||||
0x91, 0x55, 0xD5, 0x8C, 0x4C, 0xDE, 0x02, 0xC9, 0xE1, 0xAC,
|
||||
0x0B, 0xB9, 0xD0, 0x05, 0x82, 0xBB, 0x48, 0x62, 0xA8, 0x11,
|
||||
0x9E, 0xA9, 0x74, 0x75, 0xB6, 0x19, 0x7F, 0xB7, 0x09, 0xDC,
|
||||
0xA9, 0xE0, 0xA1, 0x09, 0x2D, 0x66, 0x33, 0x46, 0x32, 0xC4,
|
||||
0x02, 0x1F, 0x5A, 0xE8, 0x8C, 0xBE, 0xF0, 0x09, 0x25, 0xA0,
|
||||
0x99, 0x4A, 0x10, 0xFE, 0x6E, 0x1D, 0x1D, 0x3D, 0xB9, 0x1A,
|
||||
0xDF, 0xA4, 0xA5, 0x0B, 0x0F, 0xF2, 0x86, 0xA1, 0x69, 0xF1,
|
||||
0x68, 0x28, 0x83, 0xDA, 0xB7, 0xDC, 0xFE, 0x06, 0x39, 0x57,
|
||||
0x9B, 0xCE, 0xE2, 0xA1, 0x52, 0x7F, 0xCD, 0x4F, 0x01, 0x5E,
|
||||
0x11, 0x50, 0xFA, 0x83, 0x06, 0xA7, 0xC4, 0xB5, 0x02, 0xA0,
|
||||
0x27, 0xD0, 0xE6, 0x0D, 0x27, 0x8C, 0xF8, 0x9A, 0x41, 0x86,
|
||||
0x3F, 0x77, 0x06, 0x4C, 0x60, 0xC3, 0xB5, 0x06, 0xA8, 0x61,
|
||||
0x28, 0x7A, 0x17, 0xF0, 0xE0, 0x86, 0xF5, 0xC0, 0xAA, 0x58,
|
||||
0x60, 0x00, 0x62, 0x7D, 0xDC, 0x30, 0xD7, 0x9E, 0xE6, 0x11,
|
||||
0x63, 0xEA, 0x38, 0x23, 0x94, 0xDD, 0xC2, 0x53, 0x34, 0x16,
|
||||
0xC2, 0xC2, 0x56, 0xEE, 0xCB, 0xBB, 0xDE, 0xB6, 0xBC, 0x90,
|
||||
0xA1, 0x7D, 0xFC, 0xEB, 0x76, 0x1D, 0x59, 0xCE, 0x09, 0xE4,
|
||||
0x05, 0x6F, 0x88, 0x01, 0x7C, 0x4B, 0x3D, 0x0A, 0x72, 0x39,
|
||||
0x24, 0x7C, 0x92, 0x7C, 0x5F, 0x72, 0xE3, 0x86, 0xB9, 0x9D,
|
||||
0x4D, 0x72, 0xB4, 0x5B, 0xC1, 0x1A, 0xFC, 0xB8, 0x9E, 0xD3,
|
||||
0x78, 0x55, 0x54, 0xED, 0xB5, 0xA5, 0xFC, 0x08, 0xD3, 0x7C,
|
||||
0x3D, 0xD8, 0xC4, 0x0F, 0xAD, 0x4D, 0x5E, 0xEF, 0x50, 0x1E,
|
||||
0xF8, 0xE6, 0x61, 0xB1, 0xD9, 0x14, 0x85, 0xA2, 0x3C, 0x13,
|
||||
0x51, 0x6C, 0xE7, 0xC7, 0xD5, 0x6F, 0xC4, 0x4E, 0xE1, 0x56,
|
||||
0xCE, 0xBF, 0x2A, 0x36, 0x37, 0xC8, 0xC6, 0xDD, 0x34, 0x32,
|
||||
0x9A, 0xD7, 0x12, 0x82, 0x63, 0x92, 0x8E, 0xFA, 0x0E, 0x67,
|
||||
0xE0, 0x00, 0x60, 0x40, 0x37, 0xCE, 0x39, 0x3A, 0xCF, 0xF5,
|
||||
0xFA, 0xD3, 0x37, 0x77, 0xC2, 0xAB, 0x1B, 0x2D, 0xC5, 0x5A,
|
||||
0x9E, 0x67, 0xB0, 0x5C, 0x42, 0x37, 0xA3, 0x4F, 0x40, 0x27,
|
||||
0x82, 0xD3, 0xBE, 0x9B, 0xBC, 0x99, 0x9D, 0x8E, 0x11, 0xD5,
|
||||
0x15, 0x73, 0x0F, 0xBF, 0x7E, 0x1C, 0x2D, 0xD6, 0x7B, 0xC4,
|
||||
0x00, 0xC7, 0x6B, 0x1B, 0x8C, 0xB7, 0x45, 0x90, 0xA1, 0x21,
|
||||
0xBE, 0xB1, 0x6E, 0xB2, 0xB4, 0x6E, 0x36, 0x6A, 0x2F, 0xAB,
|
||||
0x48, 0x57, 0x79, 0x6E, 0x94, 0xBC, 0xD2, 0x76, 0xA3, 0xC6,
|
||||
0xC8, 0xC2, 0x49, 0x65, 0xEE, 0xF8, 0x0F, 0x53, 0x7D, 0xDE,
|
||||
0x8D, 0x46, 0x1D, 0x0A, 0x73, 0xD5, 0xC6, 0x4D, 0xD0, 0x4C,
|
||||
0xDB, 0xBB, 0x39, 0x29, 0x50, 0x46, 0xBA, 0xA9, 0xE8, 0x26,
|
||||
0x95, 0xAC, 0x04, 0xE3, 0x5E, 0xBE, 0xF0, 0xD5, 0xFA, 0xA1,
|
||||
0x9A, 0x51, 0x2D, 0x6A, 0xE2, 0x8C, 0xEF, 0x63, 0x22, 0xEE,
|
||||
0x86, 0x9A, 0xB8, 0xC2, 0x89, 0xC0, 0xF6, 0x2E, 0x24, 0x43,
|
||||
0xAA, 0x03, 0x1E, 0xA5, 0xA4, 0xD0, 0xF2, 0x9C, 0xBA, 0x61,
|
||||
0xC0, 0x83, 0x4D, 0x6A, 0xE9, 0x9B, 0x50, 0x15, 0xE5, 0x8F,
|
||||
0xD6, 0x5B, 0x64, 0xBA, 0xF9, 0xA2, 0x26, 0x28, 0xE1, 0x3A,
|
||||
0x3A, 0xA7, 0x86, 0x95, 0xA9, 0x4B, 0xE9, 0x62, 0x55, 0xEF,
|
||||
0xD3, 0xEF, 0x2F, 0xC7, 0xDA, 0xF7, 0x52, 0xF7, 0x69, 0x6F,
|
||||
0x04, 0x3F, 0x59, 0x0A, 0xFA, 0x77, 0x15, 0xA9, 0xE4, 0x80,
|
||||
0x01, 0x86, 0xB0, 0x87, 0xAD, 0xE6, 0x09, 0x9B, 0x93, 0xE5,
|
||||
0x3E, 0x3B, 0x5A, 0xFD, 0x90, 0xE9, 0x97, 0xD7, 0x34, 0x9E,
|
||||
0xD9, 0xB7, 0xF0, 0x2C, 0x51, 0x8B, 0x2B, 0x02, 0x3A, 0xAC,
|
||||
0xD5, 0x96, 0x7D, 0xA6, 0x7D, 0x01, 0xD6, 0x3E, 0xCF, 0xD1,
|
||||
0x28, 0x2D, 0x7D, 0x7C, 0xCF, 0x25, 0x9F, 0x1F, 0x9B, 0xB8,
|
||||
0xF2, 0xAD, 0x72, 0xB4, 0xD6, 0x5A, 0x4C, 0xF5, 0x88, 0x5A,
|
||||
0x71, 0xAC, 0x29, 0xE0, 0xE6, 0xA5, 0x19, 0xE0, 0xFD, 0xAC,
|
||||
0xB0, 0x47, 0x9B, 0xFA, 0x93, 0xED, 0x8D, 0xC4, 0xD3, 0xE8,
|
||||
0xCC, 0x57, 0x3B, 0x28, 0x29, 0x66, 0xD5, 0xF8, 0x28, 0x2E,
|
||||
0x13, 0x79, 0x91, 0x01, 0x5F, 0x78, 0x55, 0x60, 0x75, 0xED,
|
||||
0x44, 0x0E, 0x96, 0xF7, 0x8C, 0x5E, 0xD3, 0xE3, 0xD4, 0x6D,
|
||||
0x05, 0x15, 0xBA, 0x6D, 0xF4, 0x88, 0x25, 0x61, 0xA1, 0x03,
|
||||
0xBD, 0xF0, 0x64, 0x05, 0x15, 0x9E, 0xEB, 0xC3, 0xA2, 0x57,
|
||||
0x90, 0x3C, 0xEC, 0x1A, 0x27, 0x97, 0x2A, 0x07, 0x3A, 0xA9,
|
||||
0x9B, 0x6D, 0x3F, 0x1B, 0xF5, 0x21, 0x63, 0x1E, 0xFB, 0x66,
|
||||
0x9C, 0xF5, 0x19, 0xF3, 0xDC, 0x26, 0x28, 0xD9, 0x33, 0x75,
|
||||
0xF5, 0xFD, 0x55, 0xB1, 0x82, 0x34, 0x56, 0x03, 0xBB, 0x3C,
|
||||
0xBA, 0x8A, 0x11, 0x77, 0x51, 0x28, 0xF8, 0xD9, 0x0A, 0xC2,
|
||||
0x67, 0x51, 0xCC, 0xAB, 0x5F, 0x92, 0xAD, 0xCC, 0x51, 0x17,
|
||||
0xE8, 0x4D, 0x8E, 0xDC, 0x30, 0x38, 0x62, 0x58, 0x9D, 0x37,
|
||||
0x91, 0xF9, 0x20, 0x93, 0xC2, 0x90, 0x7A, 0xEA, 0xCE, 0x7B,
|
||||
0x3E, 0xFB, 0x64, 0xCE, 0x21, 0x51, 0x32, 0xBE, 0x4F, 0x77,
|
||||
0x7E, 0xE3, 0xB6, 0xA8, 0x46, 0x3D, 0x29, 0xC3, 0x69, 0x53,
|
||||
0xDE, 0x48, 0x80, 0xE6, 0x13, 0x64, 0x10, 0x08, 0xAE, 0xA2,
|
||||
0x24, 0xB2, 0x6D, 0xDD, 0xFD, 0x2D, 0x85, 0x69, 0x66, 0x21,
|
||||
0x07, 0x09, 0x0A, 0x46, 0x9A, 0xB3, 0xDD, 0xC0, 0x45, 0x64,
|
||||
0xCF, 0xDE, 0x6C, 0x58, 0xAE, 0xC8, 0x20, 0x1C, 0xDD, 0xF7,
|
||||
0xBE, 0x5B, 0x40, 0x8D, 0x58, 0x1B, 0x7F, 0x01, 0xD2, 0xCC,
|
||||
0xBB, 0xE3, 0xB4, 0x6B, 0x7E, 0x6A, 0xA2, 0xDD, 0x45, 0xFF,
|
||||
0x59, 0x3A, 0x44, 0x0A, 0x35, 0x3E, 0xD5, 0xCD, 0xB4, 0xBC,
|
||||
0xA8, 0xCE, 0xEA, 0x72, 0xBB, 0x84, 0x64, 0xFA, 0xAE, 0x12,
|
||||
0x66, 0x8D, 0x47, 0x6F, 0x3C, 0xBF, 0x63, 0xE4, 0x9B, 0xD2,
|
||||
0x9E, 0x5D, 0x2F, 0x54, 0x1B, 0x77, 0xC2, 0xAE, 0x70, 0x63,
|
||||
0x4E, 0xF6, 0x8D, 0x0D, 0x0E, 0x74, 0x57, 0x13, 0x5B, 0xE7,
|
||||
0x71, 0x16, 0x72, 0xF8, 0x5D, 0x7D, 0x53, 0xAF, 0x08, 0xCB,
|
||||
0x40, 0x40, 0xCC, 0xE2, 0xB4, 0x4E, 0x6A, 0x46, 0xD2, 0x34,
|
||||
0x84, 0xAF, 0x15, 0x01, 0x28, 0x04, 0xB0, 0xE1, 0x1D, 0x3A,
|
||||
0x98, 0x95, 0xB4, 0x9F, 0xB8, 0x06, 0x48, 0xA0, 0x6E, 0xCE,
|
||||
0x82, 0x3B, 0x3F, 0x6F, 0x82, 0xAB, 0x20, 0x35, 0x4B, 0x1D,
|
||||
0x1A, 0x01, 0xF8, 0x27, 0x72, 0x27, 0xB1, 0x60, 0x15, 0x61,
|
||||
0xDC, 0x3F, 0x93, 0xE7, 0x2B, 0x79, 0x3A, 0xBB, 0xBD, 0x25,
|
||||
0x45, 0x34, 0xE1, 0x39, 0x88, 0xA0, 0x4B, 0x79, 0xCE, 0x51,
|
||||
0xB7, 0xC9, 0x32, 0x2F, 0xC9, 0xBA, 0x1F, 0xA0, 0x7E, 0xC8,
|
||||
0x1C, 0xE0, 0xF6, 0xD1, 0xC7, 0xBC, 0xC3, 0x11, 0x01, 0xCF,
|
||||
0xC7, 0xAA, 0xE8, 0xA1, 0x49, 0x87, 0x90, 0x1A, 0x9A, 0xBD,
|
||||
0x4F, 0xD4, 0xCB, 0xDE, 0xDA, 0xD0, 0x38, 0xDA, 0x0A, 0xD5,
|
||||
0x2A, 0xC3, 0x39, 0x03, 0x67, 0x36, 0x91, 0xC6, 0x7C, 0x31,
|
||||
0xF9, 0x8D, 0x4F, 0x2B, 0xB1, 0xE0, 0xB7, 0x59, 0x9E, 0xF7,
|
||||
0x3A, 0xBB, 0xF5, 0x43, 0xFF, 0x19, 0xD5, 0xF2, 0x9C, 0x45,
|
||||
0xD9, 0x27, 0x2C, 0x22, 0x97, 0xBF, 0x2A, 0xFC, 0xE6, 0x15,
|
||||
0x71, 0xFC, 0x91, 0x0F, 0x25, 0x15, 0x94, 0x9B, 0x61, 0x93,
|
||||
0xE5, 0xFA, 0xEB, 0x9C, 0xB6, 0xCE, 0x59, 0x64, 0xA8, 0xC2,
|
||||
0xD1, 0xA8, 0xBA, 0x12, 0x5E, 0x07, 0xC1, 0xB6, 0x0C, 0x6A,
|
||||
0x05, 0xE3, 0x65, 0x50, 0xD2, 0x10, 0x42, 0xA4, 0x03, 0xCB,
|
||||
0x0E, 0x6E, 0xEC, 0xE0, 0x3B, 0xDB, 0x98, 0x16, 0xBE, 0xA0,
|
||||
0x98, 0x4C, 0x64, 0xE9, 0x78, 0x32, 0x32, 0x95, 0x1F, 0x9F,
|
||||
0xDF, 0x92, 0xD3, 0xE0, 0x2B, 0x34, 0xA0, 0xD3, 0x1E, 0xF2,
|
||||
0x71, 0x89, 0x41, 0x74, 0x0A, 0x1B, 0x8C, 0x34, 0xA3, 0x4B,
|
||||
0x20, 0x71, 0xBE, 0xC5, 0xD8, 0x32, 0x76, 0xC3, 0x8D, 0x9F,
|
||||
0x35, 0xDF, 0x2E, 0x2F, 0x99, 0x9B, 0x47, 0x6F, 0x0B, 0xE6,
|
||||
0x1D, 0xF1, 0xE3, 0x0F, 0x54, 0xDA, 0x4C, 0xE5, 0x91, 0xD8,
|
||||
0xDA, 0x1E, 0xCF, 0x79, 0x62, 0xCE, 0x6F, 0x7E, 0x3E, 0xCD,
|
||||
0x66, 0xB1, 0x18, 0x16, 0x05, 0x1D, 0x2C, 0xFD, 0xC5, 0xD2,
|
||||
0x8F, 0x84, 0x99, 0x22, 0xFB, 0xF6, 0x57, 0xF3, 0x23, 0xF5,
|
||||
0x23, 0x76, 0x32, 0xA6, 0x31, 0x35, 0xA8, 0x93, 0x02, 0xCD,
|
||||
0xCC, 0x56, 0x62, 0x81, 0xF0, 0xAC, 0xB5, 0xEB, 0x75, 0x5A,
|
||||
0x97, 0x36, 0x16, 0x6E, 0xCC, 0x73, 0xD2, 0x88, 0x92, 0x62,
|
||||
0x96, 0xDE, 0xD0, 0x49, 0xB9, 0x81, 0x1B, 0x90, 0x50, 0x4C,
|
||||
0x14, 0x56, 0xC6, 0x71, 0xBD, 0xC7, 0xC6, 0xE6, 0x0A, 0x14,
|
||||
0x7A, 0x32, 0x06, 0xD0, 0xE1, 0x45, 0x9A, 0x7B, 0xF2, 0xC3,
|
||||
0xFD, 0x53, 0xAA, 0xC9, 0x00, 0x0F, 0xA8, 0x62, 0xE2, 0xBF,
|
||||
0x25, 0xBB, 0xF6, 0xD2, 0xBD, 0x35, 0x05, 0x69, 0x12, 0x71,
|
||||
0x22, 0x02, 0x04, 0xB2, 0x7C, 0xCF, 0xCB, 0xB6, 0x2B, 0x9C,
|
||||
0x76, 0xCD, 0xC0, 0x3E, 0x11, 0x53, 0xD3, 0xE3, 0x40, 0x16,
|
||||
0x60, 0xBD, 0xAB, 0x38, 0xF0, 0xAD, 0x47, 0x25, 0x9C, 0x20,
|
||||
0x38, 0xBA, 0x76, 0xCE, 0x46, 0xF7, 0xC5, 0xA1, 0xAF, 0x77,
|
||||
0x60, 0x60, 0x75, 0x20, 0x4E, 0xFE, 0xCB, 0x85, 0xD8, 0x8D,
|
||||
0xE8, 0x8A, 0xB0, 0xF9, 0xAA, 0x7A, 0x7E, 0xAA, 0xF9, 0x4C,
|
||||
0x5C, 0xC2, 0x48, 0x19, 0x8C, 0x8A, 0xFB, 0x02, 0xE4, 0x6A,
|
||||
0xC3, 0x01, 0xF9, 0xE1, 0xEB, 0xD6, 0x69, 0xF8, 0xD4, 0x90,
|
||||
0xA0, 0xDE, 0x5C, 0xA6, 0x2D, 0x25, 0x09, 0x3F, 0x9F, 0xE6,
|
||||
0x08, 0xC2, 0x32, 0x61, 0x4E, 0xB7, 0x5B, 0xE2, 0x77, 0xCE,
|
||||
0xE3, 0xDF, 0x8F, 0x57, 0xE6, 0x72, 0xC3, 0x3A
|
||||
};
|
||||
|
||||
/* Key lengths, and lengths of various bits of seed3 */
|
||||
#define PART1_WORDS 18
|
||||
#define PART2_WORDS 1024
|
||||
#define KEY1_WORDS 1042
|
||||
#define KEY2_WORDS 6
|
||||
|
||||
#define PART1_BYTES 72
|
||||
#define PART2_BYTES 4096
|
||||
#define KEY1_BYTES 4168
|
||||
#define KEY2_BYTES 24
|
||||
|
||||
#define BASENAME_BYTES 256
|
||||
|
||||
/* Hash a single state variable based on the current state of key1 */
|
||||
static u32_t hash_common(u32_t state, const u32_t *key1)
|
||||
{
|
||||
u8_t bytes[4];
|
||||
u32_t retval;
|
||||
|
||||
memcpy(bytes, &state, 4);
|
||||
|
||||
retval = key1[bytes[3] + 0x012];
|
||||
retval += key1[bytes[2] + 0x112];
|
||||
retval ^= key1[bytes[1] + 0x212];
|
||||
retval += key1[bytes[0] + 0x312];
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* Fold key1 into *state1 and *state2, forwards */
|
||||
static void hash_fwd(u32_t *pstate1, u32_t *pstate2, const u32_t *key1)
|
||||
{
|
||||
u32_t state1;
|
||||
u32_t state2;
|
||||
u32_t tmp;
|
||||
int i;
|
||||
|
||||
state1 = *pstate1;
|
||||
state2 = *pstate2;
|
||||
|
||||
for (i = 0 ; i < 0x10 ; i++) {
|
||||
state1 ^= key1[i];
|
||||
state2 ^= hash_common(state1, key1);
|
||||
|
||||
tmp = state2;
|
||||
state2 = state1;
|
||||
state1 = tmp;
|
||||
}
|
||||
|
||||
tmp = state1;
|
||||
state1 = state2;
|
||||
state2 = tmp;
|
||||
|
||||
state2 ^= key1[0x10];
|
||||
state1 ^= key1[0x11];
|
||||
|
||||
*pstate1 = state1;
|
||||
*pstate2 = state2;
|
||||
}
|
||||
|
||||
/* Same but backwards */
|
||||
static void hash_rev(u32_t *pstate1, u32_t *pstate2, const u32_t *key3)
|
||||
{
|
||||
u32_t state1;
|
||||
u32_t state2;
|
||||
u32_t tmp;
|
||||
int i;
|
||||
|
||||
state1 = *pstate1;
|
||||
state2 = *pstate2;
|
||||
|
||||
for (i = 0x11 ; i > 1 ; i--) {
|
||||
state1 ^= key3[i];
|
||||
state2 ^= hash_common(state1, key3);
|
||||
|
||||
tmp = state2;
|
||||
state2 = state1;
|
||||
state1 = tmp;
|
||||
}
|
||||
|
||||
tmp = state1;
|
||||
state1 = state2;
|
||||
state2 = tmp;
|
||||
|
||||
state2 ^= key3[1];
|
||||
state1 ^= key3[0];
|
||||
|
||||
*pstate1 = state1;
|
||||
*pstate2 = state2;
|
||||
}
|
||||
|
||||
/* Prepare a key from seed3[] and a seed string, given as a parameter */
|
||||
static void generate_key1(u32_t *key1_words, const u8_t *seed)
|
||||
{
|
||||
u32_t *seed3_words;
|
||||
u32_t cur_word;
|
||||
u32_t state1;
|
||||
u32_t state2;
|
||||
int seed_len;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
|
||||
seed_len = strlen(seed);
|
||||
seed3_words = (u32_t *) seed3;
|
||||
|
||||
/* Prepare PART1: Cyclic XOR of the given seed with seed3, reversing end.*/
|
||||
for (i = 0, j = 0 ; i < PART1_WORDS ; i++) {
|
||||
cur_word = 0;
|
||||
|
||||
for (k = 0 ; k < 4 ; k++) {
|
||||
cur_word <<= 8;
|
||||
cur_word |= seed[j];
|
||||
|
||||
j = (j + 1) % seed_len;
|
||||
}
|
||||
|
||||
key1_words[i] = cur_word ^ seed3_words[i];
|
||||
}
|
||||
|
||||
/* Prepare PART2: Straight memcpy() */
|
||||
memcpy(key1_words + PART1_WORDS, seed3 + PART1_BYTES, PART2_BYTES);
|
||||
|
||||
/* Initialise some state */
|
||||
state1 = 0;
|
||||
state2 = 0;
|
||||
|
||||
/* Progressive hashing of the key */
|
||||
for (i = 0 ; i < KEY1_WORDS ; i += 2) {
|
||||
hash_fwd(&state1, &state2, key1_words);
|
||||
|
||||
key1_words[i + 0] = state1;
|
||||
key1_words[i + 1] = state2;
|
||||
}
|
||||
}
|
||||
|
||||
/* Form key2 from key1 and the filename */
|
||||
static void generate_key2(const u8_t *key1_bytes, const u8_t *basename,
|
||||
u8_t *key2)
|
||||
{
|
||||
u32_t *key1_words;
|
||||
u32_t state1a;
|
||||
u32_t state2a;
|
||||
u32_t state1;
|
||||
u32_t state2;
|
||||
int i1;
|
||||
int i2;
|
||||
int j;
|
||||
|
||||
key1_words = (u32_t *) key1_bytes;
|
||||
memcpy(&state1a, seed1 + 0, 4);
|
||||
memcpy(&state2a, seed1 + 4, 4);
|
||||
|
||||
for (i1 = 0, i2 = 0 ; i1 < KEY2_BYTES ; ) {
|
||||
state1 = 0;
|
||||
state2 = 0;
|
||||
|
||||
/* Copy 8 bytes to state1 and state2, reversing endian */
|
||||
for (j = 0 ; j < 4 ; j++) {
|
||||
state1 <<= 8;
|
||||
if (i1 < KEY2_BYTES) state1 += basename[i1++];
|
||||
}
|
||||
|
||||
for (j = 0 ; j < 4 ; j++) {
|
||||
state2 <<= 8;
|
||||
if (i1 < KEY2_BYTES) state2 += basename[i1++];
|
||||
}
|
||||
|
||||
state1 ^= state1a;
|
||||
state2 ^= state2a;
|
||||
hash_fwd(&state1, &state2, key1_words);
|
||||
|
||||
state1a = state1;
|
||||
state2a = state2;
|
||||
|
||||
/* Store state1 and state2, reverse endian again */
|
||||
key2[i2++] = (state1 >> 24) & 0xFF;
|
||||
key2[i2++] = (state1 >> 16) & 0xFF;
|
||||
key2[i2++] = (state1 >> 8) & 0xFF;
|
||||
key2[i2++] = (state1 >> 0) & 0xFF;
|
||||
key2[i2++] = (state2 >> 24) & 0xFF;
|
||||
key2[i2++] = (state2 >> 16) & 0xFF;
|
||||
key2[i2++] = (state2 >> 8) & 0xFF;
|
||||
key2[i2++] = (state2 >> 0) & 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate key1, fold in basename for key2, then feed back into key1 */
|
||||
static void generate_key(const u8_t *basename, u8_t *key)
|
||||
{
|
||||
u8_t key2[KEY2_BYTES];
|
||||
|
||||
memset(key2, 0, KEY2_BYTES);
|
||||
generate_key1((u32_t *) key, seed2);
|
||||
generate_key2(key, basename, key2);
|
||||
key2[KEY2_BYTES - 1] = '\0';
|
||||
|
||||
generate_key1((u32_t *) key, key2);
|
||||
}
|
||||
|
||||
static void do_decrypt(const u8_t *key, u8_t *input, int nbytes, u8_t *output)
|
||||
{
|
||||
u32_t state1a;
|
||||
u32_t state2a;
|
||||
u32_t state1b;
|
||||
u32_t state2b;
|
||||
u32_t in_word1;
|
||||
u32_t in_word2;
|
||||
int i1;
|
||||
int i2;
|
||||
int j;
|
||||
|
||||
memcpy(&state1b, seed1 + 0, 4);
|
||||
memcpy(&state2b, seed1 + 4, 4);
|
||||
|
||||
for (i1 = 0, i2 = 0 ; i2 < nbytes ; ) {
|
||||
in_word1 = 0;
|
||||
in_word2 = 0;
|
||||
|
||||
/* Read in_word1 and in_word2, reversing endian */
|
||||
for (j = 0 ; j < 4 ; j++) {
|
||||
in_word1 <<= 8;
|
||||
in_word1 += input[i1];
|
||||
|
||||
if (i1 < nbytes) i1++;
|
||||
}
|
||||
|
||||
for (j = 0 ; j < 4 ; j++) {
|
||||
in_word2 <<= 8;
|
||||
in_word2 += input[i1];
|
||||
|
||||
if (i1 < nbytes) i1++;
|
||||
}
|
||||
|
||||
/* Decrypt */
|
||||
state1a = in_word1;
|
||||
state2a = in_word2;
|
||||
hash_rev(&in_word1, &in_word2, (const u32_t *) key);
|
||||
|
||||
in_word1 ^= state1b;
|
||||
in_word2 ^= state2b;
|
||||
|
||||
state1b = state1a;
|
||||
state2b = state2a;
|
||||
|
||||
/* Reverse the byte order again on output */
|
||||
output[i2++] = (in_word1 >> 24) & 0xFF;
|
||||
output[i2++] = (in_word1 >> 16) & 0xFF;
|
||||
output[i2++] = (in_word1 >> 8) & 0xFF;
|
||||
output[i2++] = (in_word1 >> 0) & 0xFF;
|
||||
output[i2++] = (in_word2 >> 24) & 0xFF;
|
||||
output[i2++] = (in_word2 >> 16) & 0xFF;
|
||||
output[i2++] = (in_word2 >> 8) & 0xFF;
|
||||
output[i2++] = (in_word2 >> 0) & 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
static void *decrypt(const char *basename_param, u8_t *input, int nbytes)
|
||||
{
|
||||
u8_t basename[BASENAME_BYTES];
|
||||
u8_t key[KEY1_BYTES];
|
||||
u8_t *output;
|
||||
|
||||
/* Extend basename into a buffer of the correct length, padded with zeros */
|
||||
memset(basename, 0, BASENAME_BYTES);
|
||||
strncpy(basename, basename_param, BASENAME_BYTES);
|
||||
|
||||
/* Prepare result buffer */
|
||||
output = malloc(nbytes);
|
||||
|
||||
/* Generate the key */
|
||||
generate_key(basename, key);
|
||||
|
||||
/* Decrypt the data and return */
|
||||
do_decrypt(key, input, nbytes, output);
|
||||
return output;
|
||||
}
|
||||
|
||||
static char *basename(const char *src)
|
||||
{
|
||||
const char *pslash;
|
||||
const char *pdot;
|
||||
char *result;
|
||||
|
||||
pslash = strrchr(src, '/');
|
||||
pdot = strrchr(src, '.');
|
||||
|
||||
if (pslash == NULL) pslash = strrchr(src, '\\');
|
||||
if (pdot == NULL) pdot = src + strlen(src);
|
||||
|
||||
if (pslash == NULL) {
|
||||
pslash = src;
|
||||
} else {
|
||||
pslash++;
|
||||
}
|
||||
|
||||
result = calloc(pdot - pslash + 1, 1);
|
||||
strncpy(result, pslash, pdot - pslash);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *in_filename = argv[1];
|
||||
const char *out_filename = argv[2];
|
||||
u8_t *input;
|
||||
u8_t *output;
|
||||
long length;
|
||||
char *base;
|
||||
FILE *out;
|
||||
FILE *in;
|
||||
|
||||
/* Usage */
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s [infile] [outfile]\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Open input */
|
||||
in = fopen(in_filename, "rb");
|
||||
|
||||
/* Determine input file length */
|
||||
fseek(in, 0, SEEK_END);
|
||||
length = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
/* Allocate memory and read input */
|
||||
input = malloc(length);
|
||||
fread(input, 1, length, in);
|
||||
fclose(in);
|
||||
|
||||
/* Get basename (i.e. file name sans directories and extension) and dec. */
|
||||
base = basename(in_filename);
|
||||
output = decrypt(base, input, length);
|
||||
|
||||
/* Write out */
|
||||
out = fopen(out_filename, "wb");
|
||||
fwrite(output, 1, length, out);
|
||||
fclose(out);
|
||||
|
||||
/* Clean up */
|
||||
free(base);
|
||||
free(input);
|
||||
free(output);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,306 @@
|
||||
/* gcz2tga.c: Slice up a directory full of GCZ (texture) files into TGA files.
|
||||
*
|
||||
* Credit goes to afwefwe for reverse-engineering the texture format
|
||||
* and LZSS compression */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* Assuming x86, usual endian crap is not accounted for */
|
||||
typedef unsigned char u8_t;
|
||||
typedef unsigned short u16_t;
|
||||
typedef unsigned int u32_t;
|
||||
|
||||
struct image
|
||||
{
|
||||
unsigned int width, height;
|
||||
u8_t *planes;
|
||||
};
|
||||
|
||||
struct clip
|
||||
{
|
||||
short x, y, w, h;
|
||||
};
|
||||
|
||||
static u16_t swab16(u16_t in)
|
||||
{
|
||||
/* GC headers are big-endian */
|
||||
return ((in & 0xFF) << 8) | (in >> 8);
|
||||
}
|
||||
|
||||
static void unpack_gc(struct image *out, u8_t *in, size_t out_sz)
|
||||
{
|
||||
unsigned int npixels;
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
u16_t *pixels;
|
||||
u16_t *pheight;
|
||||
u16_t *pwidth;
|
||||
u16_t *pmagic;
|
||||
u16_t pixel;
|
||||
|
||||
pmagic = (u16_t *) in;
|
||||
pheight = (u16_t *) (in + 14);
|
||||
pwidth = (u16_t *) (in + 12);
|
||||
|
||||
if (*pmagic != 0x4347) {
|
||||
fprintf(stderr, "(FAIL: Invalid header)\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Set up output image struct */
|
||||
in += 24;
|
||||
out->width = swab16(*pwidth);
|
||||
out->height = swab16(*pheight);
|
||||
out->planes = malloc(out->width * out->height * 4);
|
||||
|
||||
/* Clamp W/H (don't know why this is necessary but it is) */
|
||||
out->width = out->width > 1024 ? 1024 : out->width;
|
||||
out->height = out->height > 1024 ? 1024 : out->height;
|
||||
|
||||
fprintf(stderr, "(%dx%d)", out->width, out->height);
|
||||
|
||||
/* Unpack pixels */
|
||||
pixels = (u16_t *) in;
|
||||
npixels = out->width * out->height;
|
||||
|
||||
if (out_sz > npixels * 4) {
|
||||
/* Deep image (i.e. 32-bit) */
|
||||
memcpy(out->planes, pixels, npixels * 4);
|
||||
} else {
|
||||
/* Shallow image (i.e. 16-bit) */
|
||||
for (i = 0, j = 0 ; i < npixels ; i++) {
|
||||
pixel = pixels[i];
|
||||
out->planes[j++] = ((pixel ) & 0x1F) << 3; /* B */
|
||||
out->planes[j++] = ((pixel >> 5) & 0x1F) << 3; /* G */
|
||||
out->planes[j++] = ((pixel >> 10) ) << 3; /* R */
|
||||
out->planes[j++] = pixel & 0x8000 ? 0xFF : 0x00; /* A */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u8_t *expand_lzss(u8_t *lzss, size_t *pout_sz)
|
||||
{
|
||||
static u8_t ring[0x1000];
|
||||
unsigned int ring_pos = 0x0FEE;
|
||||
unsigned int chunk_offset;
|
||||
unsigned int chunk_length;
|
||||
u32_t control_word = 1;
|
||||
size_t length;
|
||||
u8_t cmd1;
|
||||
u8_t cmd2;
|
||||
u8_t *out;
|
||||
u8_t *pos;
|
||||
u8_t *in;
|
||||
|
||||
/* Header = 32 bit unpacked file length */
|
||||
length = *((u32_t *) lzss);
|
||||
*pout_sz = length;
|
||||
|
||||
if (length > 8000000) {
|
||||
fprintf(stderr, "(FAIL: Unreasonably large expanded size %d)\n",
|
||||
length);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
out = malloc(length * 2); /* Seems to overrun */
|
||||
pos = out;
|
||||
in = lzss + 4;
|
||||
|
||||
while (length > 0) {
|
||||
if (control_word == 1) {
|
||||
/* Read a control byte */
|
||||
control_word = 0x100 | *in++;
|
||||
}
|
||||
|
||||
/* Decode a byte according to the current control byte bit */
|
||||
if (control_word & 1) {
|
||||
/* Straight copy */
|
||||
*pos++ = *in;
|
||||
ring[ring_pos] = *in++;
|
||||
|
||||
ring_pos = (ring_pos + 1) % 0x1000;
|
||||
length--;
|
||||
} else {
|
||||
/* Reference to data in ring buffer */
|
||||
cmd1 = *in++;
|
||||
cmd2 = *in++;
|
||||
|
||||
chunk_length = (cmd2 & 0x0F) + 3;
|
||||
chunk_offset = ((cmd2 & 0xF0) << 4) | cmd1;
|
||||
|
||||
for ( ; chunk_length > 0 ; chunk_length--) {
|
||||
/* Copy historical data to output AND current ring pos */
|
||||
*pos++ = ring[chunk_offset];
|
||||
ring[ring_pos] = ring[chunk_offset];
|
||||
|
||||
/* Update counters */
|
||||
chunk_offset = (chunk_offset + 1) % 0x1000;
|
||||
ring_pos = (ring_pos + 1) % 0x1000;
|
||||
length--;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get next control bit */
|
||||
control_word >>= 1;
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
static void readfile(const char *filename, u8_t **data, long *nbytes)
|
||||
{
|
||||
FILE *f;
|
||||
|
||||
f = fopen(filename, "rb");
|
||||
if (f == NULL) abort();
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
*nbytes = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
*data = malloc(*nbytes);
|
||||
fread(*data, *nbytes, 1, f);
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
void put8(FILE *f, unsigned char val)
|
||||
{
|
||||
fwrite(&val, 1, 1, f);
|
||||
}
|
||||
|
||||
void put16(FILE *f, unsigned short val)
|
||||
{
|
||||
fwrite(&val, 2, 1, f);
|
||||
}
|
||||
|
||||
void split_images(const char *in_dir, const char *out_dir,
|
||||
struct image *images, int nimages)
|
||||
{
|
||||
struct clip *clips;
|
||||
char filename[512];
|
||||
long nbytes;
|
||||
u8_t *data;
|
||||
char *name;
|
||||
FILE *f;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
|
||||
/* Read file and get TOC */
|
||||
sprintf(filename, "%s/system.idx", in_dir);
|
||||
readfile(filename, &data, &nbytes);
|
||||
clips = (struct clip *) (data + 0x01BC);
|
||||
name = (char *) (data + 8 + *((long *) data));
|
||||
|
||||
/* Guess how many clips there are with a heuristic */
|
||||
for (i = 0 ; clips[i].w != 0 && clips[i].h != 0 ; i++) {
|
||||
sprintf(filename, "%s/%s.tga", out_dir, name);
|
||||
name += strlen(name) + 3;
|
||||
|
||||
f = fopen(filename, "wb");
|
||||
if (f == NULL) abort();
|
||||
|
||||
/* Locate the correct source image */
|
||||
j = 0;
|
||||
while (clips[i].y > images[j].height) {
|
||||
clips[i].y -= images[j].height;
|
||||
j++;
|
||||
}
|
||||
|
||||
/* Write header */
|
||||
put8(f, 0); put8(f, 0); put8(f, 2);
|
||||
put16(f, 0); put16(f, 0); put8(f, 0);
|
||||
put16(f, 0); put16(f, 0); put16(f, clips[i].w); put16(f, clips[i].h);
|
||||
put8(f, 32); put8(f, 32);
|
||||
|
||||
/* Write scanlines */
|
||||
for (k = 0 ; k < clips[i].h ; k++) {
|
||||
if (clips[i].y == images[j].height) {
|
||||
clips[i].y = 0;
|
||||
j++;
|
||||
}
|
||||
|
||||
fwrite(images[j].planes + ((images[j].width * clips[i].y) +
|
||||
clips[i].x) * 4, clips[i].w, 4, f);
|
||||
clips[i].y++;
|
||||
}
|
||||
|
||||
/* Close output file */
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
free(data);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *in_dir;
|
||||
char *out_dir;
|
||||
|
||||
struct image images[32];
|
||||
char filename[256];
|
||||
unsigned int i;
|
||||
long filesize;
|
||||
u8_t *lzss, *gc;
|
||||
size_t out_sz;
|
||||
FILE *f;
|
||||
|
||||
/* Usage */
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s [indir] [outdir]\n", argv[0]);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Setup */
|
||||
memset(images, 0, sizeof(images));
|
||||
in_dir = argv[1];
|
||||
out_dir = argv[2];
|
||||
|
||||
for (i = 0 ; i < 32 ; i++) {
|
||||
/* Open 0.gcz, 1.gcz etc ... */
|
||||
sprintf(filename, "%s/%d.gcz", in_dir, i);
|
||||
f = fopen(filename, "rb");
|
||||
if (f == NULL) break;
|
||||
|
||||
/* Read entire file */
|
||||
fseek(f, 0, SEEK_END);
|
||||
filesize = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
fprintf(stderr, "%s: fread", filename);
|
||||
lzss = malloc(filesize);
|
||||
fread(lzss, filesize, 1, f);
|
||||
fclose(f);
|
||||
|
||||
/* Decompress */
|
||||
fprintf(stderr, "(OK) expand_lzss");
|
||||
gc = expand_lzss(lzss, &out_sz);
|
||||
free(lzss);
|
||||
|
||||
/* Unpack GC to 32-bit RGBA */
|
||||
fprintf(stderr, "(OK) unpack_gc");
|
||||
unpack_gc(&images[i], gc, out_sz);
|
||||
free(gc);
|
||||
|
||||
fprintf(stderr, "(OK)\n");
|
||||
}
|
||||
|
||||
/* Sanity check */
|
||||
if (i == 0) {
|
||||
fprintf(stderr, "No GCZ files found\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Emit pile of TGAs */
|
||||
fprintf(stderr, "split_images");
|
||||
split_images(in_dir, out_dir, images, i);
|
||||
fprintf(stderr, "(OK)\n\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user