/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.data.prototype;


import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.db.*;
import net.sourceforge.pain.util.*;


/**
 Used to create LifeForms with a varying LifePoints stats.
 */
public final class LifeFormPrototype extends Prototype {

	public static final int LIFE_POINTS_DICE = LAST_BASE_FIELD_INDEX + 1;
	public static final int RACE = LAST_BASE_FIELD_INDEX + 2;
	public static final int SEX = LAST_BASE_FIELD_INDEX + 3;
	public static final int NFIELDS = LAST_BASE_FIELD_INDEX + 4;

	public final static Class[] superroles = new Class[]{InteractivePrototype.class};

	public static final int SEX_UNDEFINED = 0;
	public static final int SEX_MALE = 1;
	public static final int SEX_FEMALE = 2;
	public static final int SEX_EITHER = 3;

	public static final String[] SEX_NAMES = new String[]{"UNDEFINED", "MALE", "FEMALE", "EITHER"};


	public LifeFormPrototype(PainDB db) {
		super(db);
	}

	public LifeFormPrototype() {
	}

	public Class[] getSuperroles() {
		return superroles;
	}

	public DbClassSchema provideSchema() {
		byte types[] = new byte[NFIELDS];
		String names[] = new String[NFIELDS];

		fillSuperSchema(types, names);

		types[LIFE_POINTS_DICE] = DbType.ARRAY_OF_INT;
		names[LIFE_POINTS_DICE] = "life_points_dice";

		types[RACE] = DbType.REFERENCE;
		names[RACE] = "race";

		types[SEX] = DbType.INT;
		names[SEX] = "sex";

		return new DbClassSchema(types, names);
	}

	public Dice getLifePointsDice() {
		return new Dice(getIntArray(LIFE_POINTS_DICE));
	}

	public void setLifePointsDice(Dice dice) {
		setIntArray(LIFE_POINTS_DICE, dice.data());
	}

	public Class getPrototypedRoleClass() {
		return LifeForm.class;
	}

	public Race getRace() {
		return (Race) getReference(RACE);
	}

	public void setRace(Race race) {
		setReference(RACE, race);
	}

	public int getSex() {
		return getInt(SEX);
	}

	public void setSex(int sex) {
		if (sex < SEX_UNDEFINED || sex > SEX_EITHER) {
			throw new IllegalArgumentException("Invalid field valud:" + sex);
		}
		setInt(SEX, sex);
	}

	public String toString() {
		int[] dice = getIntArray(LIFE_POINTS_DICE);
		Race race = getRace();
		int sex = getSex();

		return "life_points_dice=" + (dice == null ? "null" : Dice.format(dice))
		        + " race=" + (race == null ? "null" : race.getName())
		        + " sex=" + SEX_NAMES[sex];
	}
}