#include <PalmOS.h>
#include "b_globals.h"

static void PlayerV2_note_lengths() {
	UInt8 note_lengths[] = {
		0,  
		0,  0,  2,
		0,  3,  4,
		5,  6,  8,
		9, 12, 16,
		18, 24, 32,
		36, 48, 64,
		72, 96
	};

	writeRecord(note_lengths, sizeof(note_lengths), GBVARS_NOTELENGTHS_INDEX , GBVARS_SCUMM);
}

static void PlayerV2_hull_offsets() {
	UInt16 hull_offsets[] = {
		0, 12, 24, 36, 48, 60, 
		72, 88, 104, 120, 136, 256, 
		152, 164, 180
	};

	writeRecord(hull_offsets, sizeof(hull_offsets), GBVARS_HULLOFFSETS_INDEX , GBVARS_SCUMM);
}

typedef Int16 int16;

static void PlayerV2_hulls() {
	Int16 hulls[] = {
		// hull 0
		3, -1, 0, 0, 0, 0, 0, 0,
		0, -1, 0, 0,
		// hull 1 (staccato)
		3, -1, 0, 32, 0, -1, 0, 0,
		0, -1, 0, 0,
		// hull 2 (legato)
		3, -1, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0,
		// hull 3 (staccatissimo)
		3, -1, 0, 2, 0, -1, 0, 0,
		0, -1, 0, 0,
		// hull 4
		3, -1, 0, 6, 0, -1, 0, 0,
		0, -1, 0, 0,
		// hull 5
		3, -1, 0, 16, 0, -1, 0, 0,
		0, -1, 0, 0,
		// hull 6
		(int16) 60000, -1, -1000, 20, 0, 0, 0, 0,
		(int16) 40000, -1, -5000,  5, 0, -1, 0, 0,
		// hull 7
		(int16) 50000, -1, 0, 8, 30000, -1, 0, 0,
		28000, -1, -5000,  5, 0, -1, 0, 0,
		// hull 8
		(int16) 60000, -1, -2000, 16, 0, 0, 0, 0,
		28000, -1, -6000,  5, 0, -1, 0, 0,
		// hull 9
		(int16) 55000, -1,     0,  8, (int16) 35000, -1, 0, 0,
		(int16) 40000, -1, -2000, 10, 0, -1, 0, 0,
		// hull 10
		(int16) 60000, -1,     0,  4, -2000, 8, 0, 0,
		(int16) 40000, -1, -6000,  5, 0, -1, 0, 0,
		// hull 12
		0, -1,   150, 340, -150, 340, 0, -1,
		0, -1, 0, 0,
		// hull 13  == 164
		20000, -1,  4000,  7, 1000, 15, 0, 0,
		(int16) 35000, -1, -2000, 15, 0, -1, 0, 0,

		// hull 14  == 180
		(int16) 35000, -1,   500, 20, 0,  0, 0, 0,
		(int16) 45000, -1,  -500, 60, 0, -1, 0, 0,

		// hull misc = 196
		(int16) 44000, -1, -4400, 10, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 53000, -1, -5300, 10, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 63000, -1, -6300, 10, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 44000, -1, -1375, 32, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 53000, -1, -1656, 32, 0, -1, 0, 0,
		0, -1, 0, 0,

		// hull 11 == 256
		(int16) 63000, -1, -1968, 32, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 44000, -1, - 733, 60, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 53000, -1, - 883, 60, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 63000, -1, -1050, 60, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 44000, -1, - 488, 90, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 53000, -1, - 588, 90, 0, -1, 0, 0,
		0, -1, 0, 0,

		(int16) 63000, -1, - 700, 90, 0, -1, 0, 0,
		0, -1, 0, 0
	};
	
	writeRecord(hulls, sizeof(hulls), GBVARS_HULLS_INDEX , GBVARS_SCUMM);
}

static void PlayerV2_freqmod_lengths() {
	UInt16 freqmod_lengths[] = {
		0x1000, 0x1000, 0x20, 0x2000, 0x1000
	};
	
	writeRecord(freqmod_lengths, sizeof(freqmod_lengths), GBVARS_FREQMODLENGTHS_INDEX , GBVARS_SCUMM);
}

static void PlayerV2_freqmod_offsets() {
	UInt16 freqmod_offsets[] = {
	0, 0x100, 0x200, 0x302, 0x202
	};
	
	writeRecord(freqmod_offsets, sizeof(freqmod_offsets), GBVARS_FREQMODOFFSETS_INDEX , GBVARS_SCUMM);
}

static void PlayerV2_freqmod_table() {
	Int8 freqmod_table[0x502] = {
     0,   3,   6,   9,  12,  15,  18,  21,
    24,  27,  30,  33,  36,  39,  42,  45,
    48,  51,  54,  57,  59,  62,  65,  67,
    70,  73,  75,  78,  80,  82,  85,  87,
    89,  91,  94,  96,  98, 100, 102, 103,
   105, 107, 108, 110, 112, 113, 114, 116,
   117, 118, 119, 120, 121, 122, 123, 123,
   124, 125, 125, 126, 126, 126, 126, 126,
   126, 126, 126, 126, 126, 126, 125, 125,
   124, 123, 123, 122, 121, 120, 119, 118,
   117, 116, 114, 113, 112, 110, 108, 107,
   105, 103, 102, 100,  98,  96,  94,  91,
    89,  87,  85,  82,  80,  78,  75,  73,
    70,  67,  65,  62,  59,  57,  54,  51,
    48,  45,  42,  39,  36,  33,  30,  27,
    24,  21,  18,  15,  12,   9,   6,   3,
     0,  -3,  -6,  -9, -12, -15, -18, -21,
   -24, -27, -30, -33, -36, -39, -42, -45,
   -48, -51, -54, -57, -59, -62, -65, -67,
   -70, -73, -75, -78, -80, -82, -85, -87,
   -89, -91, -94, -96, -98,-100,-102,-103,
  -105,-107,-108,-110,-112,-113,-114,-116,
  -117,-118,-119,-120,-121,-122,-123,-123,
  -124,-125,-125,-126,-126,-126,-126,-126,
  -126,-126,-126,-126,-126,-126,-125,-125,
  -124,-123,-123,-122,-121,-120,-119,-118,
  -117,-116,-114,-113,-112,-110,-108,-107,
  -105,-103,-102,-100, -98, -96, -94, -91,
   -89, -87, -85, -82, -80, -78, -75, -73,
   -70, -67, -65, -62, -59, -57, -54, -51,
   -48, -45, -42, -39, -36, -33, -30, -27,
   -24, -21, -18, -15, -12,  -9,  -6,  -3,
  
     0,   1,   2,   3,   4,   5,   6,   7,
     8,   9,  10,  11,  12,  13,  14,  15,
    16,  17,  18,  19,  20,  21,  22,  23,
    24,  25,  26,  27,  28,  29,  30,  31,
    32,  33,  34,  35,  36,  37,  38,  39,
    40,  41,  42,  43,  44,  45,  46,  47,
    48,  49,  50,  51,  52,  53,  54,  55,
    56,  57,  58,  59,  60,  61,  62,  63,
    64,  65,  66,  67,  68,  69,  70,  71,
    72,  73,  74,  75,  76,  77,  78,  79,
    80,  81,  82,  83,  84,  85,  86,  87,
    88,  89,  90,  91,  92,  93,  94,  95,
    96,  97,  98,  99, 100, 101, 102, 103,
   104, 105, 106, 107, 108, 109, 110, 111,
   112, 113, 114, 115, 116, 117, 118, 119,
   120, 121, 122, 123, 124, 125, 126, 127,
  -128,-127,-126,-125,-124,-123,-122,-121,
  -120,-119,-118,-117,-116,-115,-114,-113,
  -112,-111,-110,-109,-108,-107,-106,-105,
  -104,-103,-102,-101,-100, -99, -98, -97,
   -96, -95, -94, -93, -92, -91, -90, -89,
   -88, -87, -86, -85, -84, -83, -82, -81,
   -80, -79, -78, -77, -76, -75, -74, -73,
   -72, -71, -70, -69, -68, -67, -66, -65,
   -64, -63, -62, -61, -60, -59, -58, -57,
   -56, -55, -54, -53, -52, -51, -50, -49,
   -48, -47, -46, -45, -44, -43, -42, -41,
   -40, -39, -38, -37, -36, -35, -34, -33,
   -32, -31, -30, -29, -28, -27, -26, -25,
   -24, -23, -22, -21, -20, -19, -18, -17,
   -16, -15, -14, -13, -12, -11, -10,  -9,
    -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,
  
  -120, 120,
  
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
  -120,-120,-120,-120,-120,-120,-120,-120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,
   120, 120, 120, 120, 120, 120, 120, 120,

    41,  35, -66,-124, -31, 108, -42, -82,
    82,-112,  73, -15, -15, -69, -23, -21,
   -77, -90, -37,  60,-121,  12,  62,-103,
    36,  94,  13,  28,   6, -73,  71, -34,
   -77,  18,  77, -56,  67, -69,-117, -90,
    31,   3,  90, 125,   9,  56,  37,  31,
    93, -44, -53,  -4,-106, -11,  69,  59,
    19,  13,-119,  10,  28, -37, -82,  50,
    32,-102,  80, -18,  64, 120,  54,  -3,
    18,  73,  50, -10, -98, 125,  73, -36,
   -83,  79,  20, -14,  68,  64, 102, -48,
   107, -60,  48, -73,  50,  59, -95,  34,
   -10,  34,-111, -99, -31,-117,  31, -38,
   -80, -54,-103,   2, -71, 114, -99,  73,
    44,-128, 126, -59,-103, -43, -23,-128,
   -78, -22, -55, -52,  83, -65, 103, -42,
   -65,  20, -42, 126,  45, -36,-114, 102,
  -125, -17,  87,  73,  97,  -1, 105,-113,
    97, -51, -47,  30, -99,-100,  22, 114,
   114, -26,  29, -16,-124,  79,  74, 119,
     2, -41, -24,  57,  44,  83, -53, -55,
    18,  30,  51, 116, -98,  12, -12, -43,
   -44, -97, -44, -92,  89, 126,  53, -49,
    50,  34, -12, -52, -49, -45,-112,  45,
    72, -45,-113, 117, -26, -39,  29,  42,
   -27, -64,  -9,  43, 120,-127,-121,  68,
    14,  95,  80,   0, -44,  97,-115, -66,
   123,   5,  21,   7,  59,  51,-126,  31,
    24, 112,-110, -38, 100,  84, -50, -79,
  -123,  62, 105,  21,  -8,  70, 106,   4,
  -106, 115,  14, -39,  22,  47, 103, 104,
   -44,  -9,  74,  74, -48,  87, 104, 118,
    -6,  22, -69,  17, -83, -82,  36,-120,
   121,  -2,  82, -37,  37,  67, -27,  60,
   -12,  69, -45, -40,  40, -50,  11, -11,
   -59,  96,  89,  61,-105,  39,-118,  89,
   118,  45, -48, -62, -55, -51, 104, -44,
    73, 106, 121,  37,   8,  97,  64,  20,
   -79,  59, 106, -91,  17,  40, -63,-116,
   -42, -87,  11,-121,-105,-116,  47, -15,
    21,  29,-102,-107, -63,-101, -31, -64,
   126, -23, -88,-102, -89,-122, -62, -75,
    84, -65,-102, -25, -39,  35, -47,  85,
  -112,  56,  40, -47, -39, 108, -95, 102,
    94,  78, -31,  48,-100,  -2, -39, 113,
   -97, -30, -91, -30,  12,-101, -76,  71,
   101,  56,  42,  70,-119, -87,-126, 121,
   122, 118, 120, -62,  99, -79,  38, -33,
   -38,  41, 109,  62,  98, -32,-106,  18,
    52, -65,  57, -90,  63,-119,  94, -15,
   109,  14, -29, 108,  40, -95,  30,  32,
    29, -53, -62,   3,  63,  65,   7,-124,
    15,  20,   5, 101,  27,  40,  97, -55,
   -59, -25,  44,-114,  70,  54,   8, -36,
   -13, -88,-115,  -2, -66, -14, -21, 113,
    -1, -96, -48,  59, 117,   6,-116, 126,
  -121, 120, 115,  77, -48, -66,-126, -66,
   -37, -62,  70,  65,  43,-116,  -6,  48,
   127, 112, -16, -89,  84,-122,  50,-107,
   -86,  91, 104,  19,  11, -26,  -4, -11,
   -54, -66, 125, -97,-119,-118,  65,  27,
    -3, -72,  79, 104, -10, 114, 123,  20,
  -103, -51, -45,  13, -16,  68,  58, -76,
   -90, 102,  83,  51,  11, -53, -95,  16
};
	
	writeRecord(freqmod_table, sizeof(freqmod_table), GBVARS_FREQMODTABLE_INDEX , GBVARS_SCUMM);
}

static void PlayerV2_spk_freq_table() {
	UInt16  spk_freq_table[12] = {
	36484, 34436, 32503, 30679, 28957, 27332, 
	25798, 24350, 22983, 21693, 20476, 19326
};
	
	writeRecord(spk_freq_table, sizeof(spk_freq_table), GBVARS_SPKFREQTABLE_INDEX , GBVARS_SCUMM);
}

static void PlayerV2_pcjr_freq_table() {
	UInt16 pcjr_freq_table[12] = {
	65472, 61760, 58304, 55040, 52032, 49024, 
	46272, 43648, 41216, 38912, 36736, 34624
};
	
	writeRecord(pcjr_freq_table, sizeof(pcjr_freq_table), GBVARS_PCJRFREQTABLE_INDEX , GBVARS_SCUMM);
}

void addPlayerV2() {
	PlayerV2_note_lengths();
	PlayerV2_hull_offsets();
	PlayerV2_hulls();
	PlayerV2_freqmod_lengths();
	PlayerV2_freqmod_offsets();
	PlayerV2_freqmod_table();
	PlayerV2_spk_freq_table();
	PlayerV2_pcjr_freq_table();
}