// automatically generated by the FlatBuffers compiler, do not modify

module MyGame.Sample.Monster;

import std.typecons;
import flatbuffers;

import MyGame.Sample.Vec3;
import MyGame.Sample.Color;
import MyGame.Sample.Weapon;
import MyGame.Sample.Equipment;
struct Monster {
	mixin Table!Monster;

  static Monster getRootAsMonster(ByteBuffer _bb) {  return Monster.init_(_bb.get!int(_bb.position()) + _bb.position(), _bb); }
	@property Nullable!Vec3 pos() { uint o = __offset(4); return o != 0 ? Nullable!Vec3(Vec3.init_(o + _pos, _buffer)) : Nullable!Vec3.init; }
	@property short mana() { uint o = __offset(6); return o != 0 ? _buffer.get!short(o + _pos) : 150; }
	@property short hp() { uint o = __offset(8); return o != 0 ? _buffer.get!short(o + _pos) : 100; }
	@property Nullable!string name() { uint o = __offset(10); return o != 0 ? Nullable!string(__string(o + _pos)) : Nullable!string.init; }
	auto inventory() { return Iterator!(Monster, ubyte, "inventory")(this); }
	ubyte inventory(uint j) { uint o = __offset(14); return o != 0 ? _buffer.get!ubyte(__dvector(o) + j * 1)  : 0; }
	@property uint inventoryLength() { uint o = __offset(14); return o != 0 ? __vector_len(o) : 0; }
	@property byte color() { uint o = __offset(16); return o != 0 ? _buffer.get!byte(o + _pos) : 2; }
	auto weapons() { return Iterator!(Monster, Weapon, "weapons")(this); }
	Nullable!Weapon weapons(uint j) { uint o = __offset(18); return o != 0 ? Nullable!Weapon(Weapon.init_(__indirect(__dvector(o) + j * 4), _buffer)) : Nullable!Weapon.init; }
	@property uint weaponsLength() { uint o = __offset(18); return o != 0 ? __vector_len(o) : 0; }
	@property ubyte equippedType() { uint o = __offset(20); return o != 0 ? _buffer.get!ubyte(o + _pos) : 0; }
	Nullable!T equipped(T)() { uint o = __offset(22); return o != 0 ? Nullable!T(__union!(T)(o)) : Nullable!T.init; }

	static void startMonster(FlatBufferBuilder builder) { builder.startObject(10); }
	static void addPos(FlatBufferBuilder builder, uint posOffset) { builder.addStruct(0, posOffset, 0); }
	static void addMana(FlatBufferBuilder builder, short mana) { builder.add!short(1, mana, 150); }
	static void addHp(FlatBufferBuilder builder, short hp) { builder.add!short(2, hp, 100); }
	static void addName(FlatBufferBuilder builder, uint nameOffset) { builder.addOffset(3, nameOffset, 0); }
	static void addInventory(FlatBufferBuilder builder, uint inventoryOffset) { builder.addOffset(5, inventoryOffset, 0); }
	static uint createInventoryVector(FlatBufferBuilder builder, ubyte[] data) { builder.startVector(1, cast(uint)data.length, 1); for (size_t i = data.length; i > 0; i--) builder.add!ubyte(data[i - 1]); return builder.endVector(); }
	static void startInventoryVector(FlatBufferBuilder builder, uint numElems) { builder.startVector(1, numElems, 1); }
	static void addColor(FlatBufferBuilder builder, byte color) { builder.add!byte(6, color, 2); }
	static void addWeapons(FlatBufferBuilder builder, uint weaponsOffset) { builder.addOffset(7, weaponsOffset, 0); }
	static uint createWeaponsVector(FlatBufferBuilder builder, uint[] data) { builder.startVector(4, cast(uint)data.length, 4); for (size_t i = data.length; i > 0; i--) builder.addOffset(data[i - 1]); return builder.endVector(); }
	static void startWeaponsVector(FlatBufferBuilder builder, uint numElems) { builder.startVector(4, numElems, 4); }
	static void addEquippedType(FlatBufferBuilder builder, ubyte equippedType) { builder.add!ubyte(8, equippedType, 0); }
	static void addEquipped(FlatBufferBuilder builder, uint equippedOffset) { builder.addOffset(9, equippedOffset, 0); }
	static uint endMonster(FlatBufferBuilder builder) {
		uint o = builder.endObject();
		return o;
	}
	static void finishMonsterBuffer(FlatBufferBuilder builder, uint offset) { builder.finish(offset);	}
}