vtable/
#include "vtable.h"

// Automatically initialize everything.  Same as VTABLE_STEADY.
VTABLE::VTABLE ()
{
	base_value = 10.0;

	for (int i = 0; i < 10; i++)
	{
		incr_levels[i] = (i + 1) * 10;
		incr_sizes[i] = ((i + 1) * 0.075) + 0.5;
	}
}

// Use a preset curve.
VTABLE::VTABLE (int type)
{
	int i;

	switch (type)
	{
	default:
	case VTABLE_STEADY:
		base_value = 10.0;

		for (i = 0; i < 10; i++)
		{
			incr_levels[i] = (i + 1) * 10;
			incr_sizes[i] = ((i + 1) * 0.075) + 0.5;
		}
		break;
	case VTABLE_EARLY:
		base_value = 10.0;

		for (i = 0; i < 10; i++)
		{
			incr_levels[i] = (i + 1) * 10;
			incr_sizes[i] = 1.5 - (i * 0.136);
		}
		break;
	case VTABLE_LATE:
		base_value = 10.0;

		for (i = 0; i < 10; i++)
		{
			incr_levels[i] = (i + 1) * 10;
			incr_sizes[i] = (i * 0.15) + 0.24;
		}
		break;
	}
}

// Manually initialize just the base value.
VTABLE::VTABLE (float base)
{
	base_value = base;

	for (int i = 0; i < 10; i++)
	{
		incr_levels[i] = (i + 1) * 10;
		incr_sizes[i] = ((i + 1) * 0.11) + 0.4;
	}
}

// Manually initialize just the increment data.
VTABLE::VTABLE (int levels[10], float sizes[10])
{
	base_value = 1.0;

	for (int i = 0; i < 10; i++)
	{
		incr_levels[i] = levels[i];
		incr_sizes[i]  = sizes[i];
	}
}

// Manually initialize all 3 settings.
VTABLE::VTABLE (float base, int levels[10], float sizes[10])
{
	base_value = base;

	for (int i = 0; i < 10; i++)
	{
		incr_levels[i] = levels[i];
		incr_sizes[i]  = sizes[i];
	}
}

// Get a value off the 'table'.
float VTABLE::operator[] (int level) 
{
	float val = base_value;
	int i, n = 0;

	// For each level...
	for (i = 0; i < level; i++)
	{
		// Make sure we're using the right set of increments.
		if (n < 9 && i > incr_levels[n])
			n++;

		// Increment the value.
		val += incr_sizes[n];
	}

	// Typecast it to int yourself if needed.
	return val;
}