#[ MyGame.Example.Monster
  Automatically generated by the FlatBuffers compiler, do not modify.
  Or modify. I'm a message, not a cop.

  flatc version: 22.11.22

  Declared by  : 
  Rooting type : MyGame.Example.Monster ()
]#

import ../InParentNamespace as MyGame_InParentNamespace
import Ability as MyGame_Example_Ability
import Any as MyGame_Example_Any
import AnyAmbiguousAliases as MyGame_Example_AnyAmbiguousAliases
import AnyUniqueAliases as MyGame_Example_AnyUniqueAliases
import Color as MyGame_Example_Color
import LongEnum as MyGame_Example_LongEnum
import Race as MyGame_Example_Race
import Referrable as MyGame_Example_Referrable
import Stat as MyGame_Example_Stat
import Test as MyGame_Example_Test
import Vec3 as MyGame_Example_Vec3
import flatbuffers
import std/options

#  an example documentation comment: "monster object"
type Monster* = object of FlatObj
func pos*(self: Monster): Option[MyGame_Example_Vec3.Vec3] =
  let o = self.tab.Offset(4)
  if o != 0:
    return some(MyGame_Example_Vec3.Vec3(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))
func mana*(self: Monster): int16 =
  let o = self.tab.Offset(6)
  if o != 0:
    return Get[int16](self.tab, self.tab.Pos + o)
  return 150
func `mana=`*(self: var Monster, n: int16): bool =
  return self.tab.MutateSlot(6, n)
func hp*(self: Monster): int16 =
  let o = self.tab.Offset(8)
  if o != 0:
    return Get[int16](self.tab, self.tab.Pos + o)
  return 100
func `hp=`*(self: var Monster, n: int16): bool =
  return self.tab.MutateSlot(8, n)
func name*(self: Monster): string =
  let o = self.tab.Offset(10)
  if o != 0:
    return self.tab.String(self.tab.Pos + o)
  return ""
func inventoryLength*(self: Monster): int = 
  let o = self.tab.Offset(14)
  if o != 0:
    return self.tab.VectorLen(o)
func inventory*(self: Monster, j: int): uint8 = 
  let o = self.tab.Offset(14)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 1.uoffset
    return Get[uint8](self.tab, x)
func inventory*(self: Monster): seq[uint8] = 
  let len = self.inventoryLength
  for i in countup(0, len - 1):
    result.add(self.inventory(i))
func color*(self: Monster): MyGame_Example_Color.Color =
  let o = self.tab.Offset(16)
  if o != 0:
    return MyGame_Example_Color.Color(Get[uint8](self.tab, self.tab.Pos + o))
  return type(result)(8)
func `color=`*(self: var Monster, n: MyGame_Example_Color.Color): bool =
  return self.tab.MutateSlot(16, n)
func testType*(self: Monster): MyGame_Example_Any.Any =
  let o = self.tab.Offset(18)
  if o != 0:
    return MyGame_Example_Any.Any(Get[uint8](self.tab, self.tab.Pos + o))
  return type(result)(0)
func `testType=`*(self: var Monster, n: MyGame_Example_Any.Any): bool =
  return self.tab.MutateSlot(18, n)
func test*(self: Monster): Option[Vtable] =
  let o = self.tab.Offset(20)
  if o != 0:
    return some(self.tab.Union(o))
func test4Length*(self: Monster): int = 
  let o = self.tab.Offset(22)
  if o != 0:
    return self.tab.VectorLen(o)
func test4*(self: Monster, j: int): MyGame_Example_Test.Test = 
  let o = self.tab.Offset(22)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))
func test4*(self: Monster): seq[MyGame_Example_Test.Test] = 
  let len = self.test4Length
  for i in countup(0, len - 1):
    result.add(self.test4(i))
func testarrayofstringLength*(self: Monster): int = 
  let o = self.tab.Offset(24)
  if o != 0:
    return self.tab.VectorLen(o)
func testarrayofstring*(self: Monster, j: int): string = 
  let o = self.tab.Offset(24)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return self.tab.String(x)
func testarrayofstring*(self: Monster): seq[string] = 
  let len = self.testarrayofstringLength
  for i in countup(0, len - 1):
    result.add(self.testarrayofstring(i))
func testarrayoftablesLength*(self: Monster): int = 
  let o = self.tab.Offset(26)
  if o != 0:
    return self.tab.VectorLen(o)
func testarrayoftables*(self: Monster, j: int): Monster = 
  let o = self.tab.Offset(26)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return Monster(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))
func testarrayoftables*(self: Monster): seq[Monster] = 
  let len = self.testarrayoftablesLength
  for i in countup(0, len - 1):
    result.add(self.testarrayoftables(i))
func enemy*(self: Monster): Option[Monster] =
  let o = self.tab.Offset(28)
  if o != 0:
    return some(Monster(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))
func testnestedflatbufferLength*(self: Monster): int = 
  let o = self.tab.Offset(30)
  if o != 0:
    return self.tab.VectorLen(o)
func testnestedflatbuffer*(self: Monster, j: int): uint8 = 
  let o = self.tab.Offset(30)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 1.uoffset
    return Get[uint8](self.tab, x)
func testnestedflatbuffer*(self: Monster): seq[uint8] = 
  let len = self.testnestedflatbufferLength
  for i in countup(0, len - 1):
    result.add(self.testnestedflatbuffer(i))
func testempty*(self: Monster): Option[MyGame_Example_Stat.Stat] =
  let o = self.tab.Offset(32)
  if o != 0:
    return some(MyGame_Example_Stat.Stat(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))
func testbool*(self: Monster): bool =
  let o = self.tab.Offset(34)
  if o != 0:
    return Get[bool](self.tab, self.tab.Pos + o)
  return false
func `testbool=`*(self: var Monster, n: bool): bool =
  return self.tab.MutateSlot(34, n)
func testhashs32Fnv1*(self: Monster): int32 =
  let o = self.tab.Offset(36)
  if o != 0:
    return Get[int32](self.tab, self.tab.Pos + o)
  return 0
func `testhashs32Fnv1=`*(self: var Monster, n: int32): bool =
  return self.tab.MutateSlot(36, n)
func testhashu32Fnv1*(self: Monster): uint32 =
  let o = self.tab.Offset(38)
  if o != 0:
    return Get[uint32](self.tab, self.tab.Pos + o)
  return 0
func `testhashu32Fnv1=`*(self: var Monster, n: uint32): bool =
  return self.tab.MutateSlot(38, n)
func testhashs64Fnv1*(self: Monster): int64 =
  let o = self.tab.Offset(40)
  if o != 0:
    return Get[int64](self.tab, self.tab.Pos + o)
  return 0
func `testhashs64Fnv1=`*(self: var Monster, n: int64): bool =
  return self.tab.MutateSlot(40, n)
func testhashu64Fnv1*(self: Monster): uint64 =
  let o = self.tab.Offset(42)
  if o != 0:
    return Get[uint64](self.tab, self.tab.Pos + o)
  return 0
func `testhashu64Fnv1=`*(self: var Monster, n: uint64): bool =
  return self.tab.MutateSlot(42, n)
func testhashs32Fnv1a*(self: Monster): int32 =
  let o = self.tab.Offset(44)
  if o != 0:
    return Get[int32](self.tab, self.tab.Pos + o)
  return 0
func `testhashs32Fnv1a=`*(self: var Monster, n: int32): bool =
  return self.tab.MutateSlot(44, n)
func testhashu32Fnv1a*(self: Monster): uint32 =
  let o = self.tab.Offset(46)
  if o != 0:
    return Get[uint32](self.tab, self.tab.Pos + o)
  return 0
func `testhashu32Fnv1a=`*(self: var Monster, n: uint32): bool =
  return self.tab.MutateSlot(46, n)
func testhashs64Fnv1a*(self: Monster): int64 =
  let o = self.tab.Offset(48)
  if o != 0:
    return Get[int64](self.tab, self.tab.Pos + o)
  return 0
func `testhashs64Fnv1a=`*(self: var Monster, n: int64): bool =
  return self.tab.MutateSlot(48, n)
func testhashu64Fnv1a*(self: Monster): uint64 =
  let o = self.tab.Offset(50)
  if o != 0:
    return Get[uint64](self.tab, self.tab.Pos + o)
  return 0
func `testhashu64Fnv1a=`*(self: var Monster, n: uint64): bool =
  return self.tab.MutateSlot(50, n)
func testarrayofboolsLength*(self: Monster): int = 
  let o = self.tab.Offset(52)
  if o != 0:
    return self.tab.VectorLen(o)
func testarrayofbools*(self: Monster, j: int): bool = 
  let o = self.tab.Offset(52)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 1.uoffset
    return Get[bool](self.tab, x)
func testarrayofbools*(self: Monster): seq[bool] = 
  let len = self.testarrayofboolsLength
  for i in countup(0, len - 1):
    result.add(self.testarrayofbools(i))
func testf*(self: Monster): float32 =
  let o = self.tab.Offset(54)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return 3.14159
func `testf=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(54, n)
func testf2*(self: Monster): float32 =
  let o = self.tab.Offset(56)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return 3.0
func `testf2=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(56, n)
func testf3*(self: Monster): float32 =
  let o = self.tab.Offset(58)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return 0.0
func `testf3=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(58, n)
func testarrayofstring2Length*(self: Monster): int = 
  let o = self.tab.Offset(60)
  if o != 0:
    return self.tab.VectorLen(o)
func testarrayofstring2*(self: Monster, j: int): string = 
  let o = self.tab.Offset(60)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return self.tab.String(x)
func testarrayofstring2*(self: Monster): seq[string] = 
  let len = self.testarrayofstring2Length
  for i in countup(0, len - 1):
    result.add(self.testarrayofstring2(i))
func testarrayofsortedstructLength*(self: Monster): int = 
  let o = self.tab.Offset(62)
  if o != 0:
    return self.tab.VectorLen(o)
func testarrayofsortedstruct*(self: Monster, j: int): MyGame_Example_Ability.Ability = 
  let o = self.tab.Offset(62)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 8.uoffset
    return MyGame_Example_Ability.Ability(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))
func testarrayofsortedstruct*(self: Monster): seq[MyGame_Example_Ability.Ability] = 
  let len = self.testarrayofsortedstructLength
  for i in countup(0, len - 1):
    result.add(self.testarrayofsortedstruct(i))
func flexLength*(self: Monster): int = 
  let o = self.tab.Offset(64)
  if o != 0:
    return self.tab.VectorLen(o)
func flex*(self: Monster, j: int): uint8 = 
  let o = self.tab.Offset(64)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 1.uoffset
    return Get[uint8](self.tab, x)
func flex*(self: Monster): seq[uint8] = 
  let len = self.flexLength
  for i in countup(0, len - 1):
    result.add(self.flex(i))
func test5Length*(self: Monster): int = 
  let o = self.tab.Offset(66)
  if o != 0:
    return self.tab.VectorLen(o)
func test5*(self: Monster, j: int): MyGame_Example_Test.Test = 
  let o = self.tab.Offset(66)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))
func test5*(self: Monster): seq[MyGame_Example_Test.Test] = 
  let len = self.test5Length
  for i in countup(0, len - 1):
    result.add(self.test5(i))
func vectorOfLongsLength*(self: Monster): int = 
  let o = self.tab.Offset(68)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfLongs*(self: Monster, j: int): int64 = 
  let o = self.tab.Offset(68)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 8.uoffset
    return Get[int64](self.tab, x)
func vectorOfLongs*(self: Monster): seq[int64] = 
  let len = self.vectorOfLongsLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfLongs(i))
func vectorOfDoublesLength*(self: Monster): int = 
  let o = self.tab.Offset(70)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfDoubles*(self: Monster, j: int): float64 = 
  let o = self.tab.Offset(70)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 8.uoffset
    return Get[float64](self.tab, x)
func vectorOfDoubles*(self: Monster): seq[float64] = 
  let len = self.vectorOfDoublesLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfDoubles(i))
func parentNamespaceTest*(self: Monster): Option[MyGame_InParentNamespace.InParentNamespace] =
  let o = self.tab.Offset(72)
  if o != 0:
    return some(MyGame_InParentNamespace.InParentNamespace(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))
func vectorOfReferrablesLength*(self: Monster): int = 
  let o = self.tab.Offset(74)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfReferrables*(self: Monster, j: int): MyGame_Example_Referrable.Referrable = 
  let o = self.tab.Offset(74)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return MyGame_Example_Referrable.Referrable(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))
func vectorOfReferrables*(self: Monster): seq[MyGame_Example_Referrable.Referrable] = 
  let len = self.vectorOfReferrablesLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfReferrables(i))
func singleWeakReference*(self: Monster): uint64 =
  let o = self.tab.Offset(76)
  if o != 0:
    return Get[uint64](self.tab, self.tab.Pos + o)
  return 0
func `singleWeakReference=`*(self: var Monster, n: uint64): bool =
  return self.tab.MutateSlot(76, n)
func vectorOfWeakReferencesLength*(self: Monster): int = 
  let o = self.tab.Offset(78)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfWeakReferences*(self: Monster, j: int): uint64 = 
  let o = self.tab.Offset(78)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 8.uoffset
    return Get[uint64](self.tab, x)
func vectorOfWeakReferences*(self: Monster): seq[uint64] = 
  let len = self.vectorOfWeakReferencesLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfWeakReferences(i))
func vectorOfStrongReferrablesLength*(self: Monster): int = 
  let o = self.tab.Offset(80)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfStrongReferrables*(self: Monster, j: int): MyGame_Example_Referrable.Referrable = 
  let o = self.tab.Offset(80)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return MyGame_Example_Referrable.Referrable(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))
func vectorOfStrongReferrables*(self: Monster): seq[MyGame_Example_Referrable.Referrable] = 
  let len = self.vectorOfStrongReferrablesLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfStrongReferrables(i))
func coOwningReference*(self: Monster): uint64 =
  let o = self.tab.Offset(82)
  if o != 0:
    return Get[uint64](self.tab, self.tab.Pos + o)
  return 0
func `coOwningReference=`*(self: var Monster, n: uint64): bool =
  return self.tab.MutateSlot(82, n)
func vectorOfCoOwningReferencesLength*(self: Monster): int = 
  let o = self.tab.Offset(84)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfCoOwningReferences*(self: Monster, j: int): uint64 = 
  let o = self.tab.Offset(84)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 8.uoffset
    return Get[uint64](self.tab, x)
func vectorOfCoOwningReferences*(self: Monster): seq[uint64] = 
  let len = self.vectorOfCoOwningReferencesLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfCoOwningReferences(i))
func nonOwningReference*(self: Monster): uint64 =
  let o = self.tab.Offset(86)
  if o != 0:
    return Get[uint64](self.tab, self.tab.Pos + o)
  return 0
func `nonOwningReference=`*(self: var Monster, n: uint64): bool =
  return self.tab.MutateSlot(86, n)
func vectorOfNonOwningReferencesLength*(self: Monster): int = 
  let o = self.tab.Offset(88)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfNonOwningReferences*(self: Monster, j: int): uint64 = 
  let o = self.tab.Offset(88)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 8.uoffset
    return Get[uint64](self.tab, x)
func vectorOfNonOwningReferences*(self: Monster): seq[uint64] = 
  let len = self.vectorOfNonOwningReferencesLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfNonOwningReferences(i))
func anyUniqueType*(self: Monster): MyGame_Example_AnyUniqueAliases.AnyUniqueAliases =
  let o = self.tab.Offset(90)
  if o != 0:
    return MyGame_Example_AnyUniqueAliases.AnyUniqueAliases(Get[uint8](self.tab, self.tab.Pos + o))
  return type(result)(0)
func `anyUniqueType=`*(self: var Monster, n: MyGame_Example_AnyUniqueAliases.AnyUniqueAliases): bool =
  return self.tab.MutateSlot(90, n)
func anyUnique*(self: Monster): Option[Vtable] =
  let o = self.tab.Offset(92)
  if o != 0:
    return some(self.tab.Union(o))
func anyAmbiguousType*(self: Monster): MyGame_Example_AnyAmbiguousAliases.AnyAmbiguousAliases =
  let o = self.tab.Offset(94)
  if o != 0:
    return MyGame_Example_AnyAmbiguousAliases.AnyAmbiguousAliases(Get[uint8](self.tab, self.tab.Pos + o))
  return type(result)(0)
func `anyAmbiguousType=`*(self: var Monster, n: MyGame_Example_AnyAmbiguousAliases.AnyAmbiguousAliases): bool =
  return self.tab.MutateSlot(94, n)
func anyAmbiguous*(self: Monster): Option[Vtable] =
  let o = self.tab.Offset(96)
  if o != 0:
    return some(self.tab.Union(o))
func vectorOfEnumsLength*(self: Monster): int = 
  let o = self.tab.Offset(98)
  if o != 0:
    return self.tab.VectorLen(o)
func vectorOfEnums*(self: Monster, j: int): MyGame_Example_Color.Color = 
  let o = self.tab.Offset(98)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 1.uoffset
    return MyGame_Example_Color.Color(Get[uint8](self.tab, x))
func vectorOfEnums*(self: Monster): seq[MyGame_Example_Color.Color] = 
  let len = self.vectorOfEnumsLength
  for i in countup(0, len - 1):
    result.add(self.vectorOfEnums(i))
func signedEnum*(self: Monster): MyGame_Example_Race.Race =
  let o = self.tab.Offset(100)
  if o != 0:
    return MyGame_Example_Race.Race(Get[int8](self.tab, self.tab.Pos + o))
  return type(result)(-1)
func `signedEnum=`*(self: var Monster, n: MyGame_Example_Race.Race): bool =
  return self.tab.MutateSlot(100, n)
func testrequirednestedflatbufferLength*(self: Monster): int = 
  let o = self.tab.Offset(102)
  if o != 0:
    return self.tab.VectorLen(o)
func testrequirednestedflatbuffer*(self: Monster, j: int): uint8 = 
  let o = self.tab.Offset(102)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 1.uoffset
    return Get[uint8](self.tab, x)
func testrequirednestedflatbuffer*(self: Monster): seq[uint8] = 
  let len = self.testrequirednestedflatbufferLength
  for i in countup(0, len - 1):
    result.add(self.testrequirednestedflatbuffer(i))
func scalarKeySortedTablesLength*(self: Monster): int = 
  let o = self.tab.Offset(104)
  if o != 0:
    return self.tab.VectorLen(o)
func scalarKeySortedTables*(self: Monster, j: int): MyGame_Example_Stat.Stat = 
  let o = self.tab.Offset(104)
  if o != 0:
    var x = self.tab.Vector(o)
    x += j.uoffset * 4.uoffset
    return MyGame_Example_Stat.Stat(tab: Vtable(Bytes: self.tab.Bytes, Pos: x))
func scalarKeySortedTables*(self: Monster): seq[MyGame_Example_Stat.Stat] = 
  let len = self.scalarKeySortedTablesLength
  for i in countup(0, len - 1):
    result.add(self.scalarKeySortedTables(i))
func nativeInline*(self: Monster): Option[MyGame_Example_Test.Test] =
  let o = self.tab.Offset(106)
  if o != 0:
    return some(MyGame_Example_Test.Test(tab: Vtable(Bytes: self.tab.Bytes, Pos: self.tab.Pos + o)))
func longEnumNonEnumDefault*(self: Monster): MyGame_Example_LongEnum.LongEnum =
  let o = self.tab.Offset(108)
  if o != 0:
    return MyGame_Example_LongEnum.LongEnum(Get[uint64](self.tab, self.tab.Pos + o))
  return type(result)(0)
func `longEnumNonEnumDefault=`*(self: var Monster, n: MyGame_Example_LongEnum.LongEnum): bool =
  return self.tab.MutateSlot(108, n)
func longEnumNormalDefault*(self: Monster): MyGame_Example_LongEnum.LongEnum =
  let o = self.tab.Offset(110)
  if o != 0:
    return MyGame_Example_LongEnum.LongEnum(Get[uint64](self.tab, self.tab.Pos + o))
  return type(result)(2)
func `longEnumNormalDefault=`*(self: var Monster, n: MyGame_Example_LongEnum.LongEnum): bool =
  return self.tab.MutateSlot(110, n)
func nanDefault*(self: Monster): float32 =
  let o = self.tab.Offset(112)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return NaN
func `nanDefault=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(112, n)
func infDefault*(self: Monster): float32 =
  let o = self.tab.Offset(114)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return Inf
func `infDefault=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(114, n)
func positiveInfDefault*(self: Monster): float32 =
  let o = self.tab.Offset(116)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return Inf
func `positiveInfDefault=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(116, n)
func infinityDefault*(self: Monster): float32 =
  let o = self.tab.Offset(118)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return Inf
func `infinityDefault=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(118, n)
func positiveInfinityDefault*(self: Monster): float32 =
  let o = self.tab.Offset(120)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return Inf
func `positiveInfinityDefault=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(120, n)
func negativeInfDefault*(self: Monster): float32 =
  let o = self.tab.Offset(122)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return -Inf
func `negativeInfDefault=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(122, n)
func negativeInfinityDefault*(self: Monster): float32 =
  let o = self.tab.Offset(124)
  if o != 0:
    return Get[float32](self.tab, self.tab.Pos + o)
  return -Inf
func `negativeInfinityDefault=`*(self: var Monster, n: float32): bool =
  return self.tab.MutateSlot(124, n)
func doubleInfDefault*(self: Monster): float64 =
  let o = self.tab.Offset(126)
  if o != 0:
    return Get[float64](self.tab, self.tab.Pos + o)
  return Inf
func `doubleInfDefault=`*(self: var Monster, n: float64): bool =
  return self.tab.MutateSlot(126, n)
proc MonsterStart*(builder: var Builder) =
  builder.StartObject(62)
proc MonsterAddpos*(builder: var Builder, pos: uoffset) =
  builder.PrependStructSlot(0, pos, default(uoffset))
proc MonsterAddmana*(builder: var Builder, mana: int16) =
  builder.PrependSlot(1, mana, default(int16))
proc MonsterAddhp*(builder: var Builder, hp: int16) =
  builder.PrependSlot(2, hp, default(int16))
proc MonsterAddname*(builder: var Builder, name: uoffset) =
  builder.PrependSlot(3, name, default(uoffset))
proc MonsterAddinventory*(builder: var Builder, inventory: uoffset) =
  builder.PrependSlot(5, inventory, default(uoffset))
proc MonsterStartinventoryVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(1, numElems, 1)
proc MonsterAddcolor*(builder: var Builder, color: uint8) =
  builder.PrependSlot(6, color, default(uint8))
proc MonsterAddtestType*(builder: var Builder, testType: uint8) =
  builder.PrependSlot(7, testType, default(uint8))
proc MonsterAddtest*(builder: var Builder, test: uoffset) =
  builder.PrependSlot(8, test, default(uoffset))
proc MonsterAddtest4*(builder: var Builder, test4: uoffset) =
  builder.PrependSlot(9, test4, default(uoffset))
proc MonsterStarttest4Vector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 2)
proc MonsterAddtestarrayofstring*(builder: var Builder, testarrayofstring: uoffset) =
  builder.PrependSlot(10, testarrayofstring, default(uoffset))
proc MonsterStarttestarrayofstringVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MonsterAddtestarrayoftables*(builder: var Builder, testarrayoftables: uoffset) =
  builder.PrependSlot(11, testarrayoftables, default(uoffset))
proc MonsterStarttestarrayoftablesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MonsterAddenemy*(builder: var Builder, enemy: uoffset) =
  builder.PrependStructSlot(12, enemy, default(uoffset))
proc MonsterAddtestnestedflatbuffer*(builder: var Builder, testnestedflatbuffer: uoffset) =
  builder.PrependSlot(13, testnestedflatbuffer, default(uoffset))
proc MonsterStarttestnestedflatbufferVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(1, numElems, 1)
proc MonsterAddtestempty*(builder: var Builder, testempty: uoffset) =
  builder.PrependStructSlot(14, testempty, default(uoffset))
proc MonsterAddtestbool*(builder: var Builder, testbool: bool) =
  builder.PrependSlot(15, testbool, default(bool))
proc MonsterAddtesthashs32Fnv1*(builder: var Builder, testhashs32Fnv1: int32) =
  builder.PrependSlot(16, testhashs32Fnv1, default(int32))
proc MonsterAddtesthashu32Fnv1*(builder: var Builder, testhashu32Fnv1: uint32) =
  builder.PrependSlot(17, testhashu32Fnv1, default(uint32))
proc MonsterAddtesthashs64Fnv1*(builder: var Builder, testhashs64Fnv1: int64) =
  builder.PrependSlot(18, testhashs64Fnv1, default(int64))
proc MonsterAddtesthashu64Fnv1*(builder: var Builder, testhashu64Fnv1: uint64) =
  builder.PrependSlot(19, testhashu64Fnv1, default(uint64))
proc MonsterAddtesthashs32Fnv1a*(builder: var Builder, testhashs32Fnv1a: int32) =
  builder.PrependSlot(20, testhashs32Fnv1a, default(int32))
proc MonsterAddtesthashu32Fnv1a*(builder: var Builder, testhashu32Fnv1a: uint32) =
  builder.PrependSlot(21, testhashu32Fnv1a, default(uint32))
proc MonsterAddtesthashs64Fnv1a*(builder: var Builder, testhashs64Fnv1a: int64) =
  builder.PrependSlot(22, testhashs64Fnv1a, default(int64))
proc MonsterAddtesthashu64Fnv1a*(builder: var Builder, testhashu64Fnv1a: uint64) =
  builder.PrependSlot(23, testhashu64Fnv1a, default(uint64))
proc MonsterAddtestarrayofbools*(builder: var Builder, testarrayofbools: uoffset) =
  builder.PrependSlot(24, testarrayofbools, default(uoffset))
proc MonsterStarttestarrayofboolsVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(1, numElems, 1)
proc MonsterAddtestf*(builder: var Builder, testf: float32) =
  builder.PrependSlot(25, testf, default(float32))
proc MonsterAddtestf2*(builder: var Builder, testf2: float32) =
  builder.PrependSlot(26, testf2, default(float32))
proc MonsterAddtestf3*(builder: var Builder, testf3: float32) =
  builder.PrependSlot(27, testf3, default(float32))
proc MonsterAddtestarrayofstring2*(builder: var Builder, testarrayofstring2: uoffset) =
  builder.PrependSlot(28, testarrayofstring2, default(uoffset))
proc MonsterStarttestarrayofstring2Vector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MonsterAddtestarrayofsortedstruct*(builder: var Builder, testarrayofsortedstruct: uoffset) =
  builder.PrependSlot(29, testarrayofsortedstruct, default(uoffset))
proc MonsterStarttestarrayofsortedstructVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(8, numElems, 4)
proc MonsterAddflex*(builder: var Builder, flex: uoffset) =
  builder.PrependSlot(30, flex, default(uoffset))
proc MonsterStartflexVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(1, numElems, 1)
proc MonsterAddtest5*(builder: var Builder, test5: uoffset) =
  builder.PrependSlot(31, test5, default(uoffset))
proc MonsterStarttest5Vector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 2)
proc MonsterAddvectorOfLongs*(builder: var Builder, vectorOfLongs: uoffset) =
  builder.PrependSlot(32, vectorOfLongs, default(uoffset))
proc MonsterStartvectorOfLongsVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(8, numElems, 8)
proc MonsterAddvectorOfDoubles*(builder: var Builder, vectorOfDoubles: uoffset) =
  builder.PrependSlot(33, vectorOfDoubles, default(uoffset))
proc MonsterStartvectorOfDoublesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(8, numElems, 8)
proc MonsterAddparentNamespaceTest*(builder: var Builder, parentNamespaceTest: uoffset) =
  builder.PrependStructSlot(34, parentNamespaceTest, default(uoffset))
proc MonsterAddvectorOfReferrables*(builder: var Builder, vectorOfReferrables: uoffset) =
  builder.PrependSlot(35, vectorOfReferrables, default(uoffset))
proc MonsterStartvectorOfReferrablesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MonsterAddsingleWeakReference*(builder: var Builder, singleWeakReference: uint64) =
  builder.PrependSlot(36, singleWeakReference, default(uint64))
proc MonsterAddvectorOfWeakReferences*(builder: var Builder, vectorOfWeakReferences: uoffset) =
  builder.PrependSlot(37, vectorOfWeakReferences, default(uoffset))
proc MonsterStartvectorOfWeakReferencesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(8, numElems, 8)
proc MonsterAddvectorOfStrongReferrables*(builder: var Builder, vectorOfStrongReferrables: uoffset) =
  builder.PrependSlot(38, vectorOfStrongReferrables, default(uoffset))
proc MonsterStartvectorOfStrongReferrablesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MonsterAddcoOwningReference*(builder: var Builder, coOwningReference: uint64) =
  builder.PrependSlot(39, coOwningReference, default(uint64))
proc MonsterAddvectorOfCoOwningReferences*(builder: var Builder, vectorOfCoOwningReferences: uoffset) =
  builder.PrependSlot(40, vectorOfCoOwningReferences, default(uoffset))
proc MonsterStartvectorOfCoOwningReferencesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(8, numElems, 8)
proc MonsterAddnonOwningReference*(builder: var Builder, nonOwningReference: uint64) =
  builder.PrependSlot(41, nonOwningReference, default(uint64))
proc MonsterAddvectorOfNonOwningReferences*(builder: var Builder, vectorOfNonOwningReferences: uoffset) =
  builder.PrependSlot(42, vectorOfNonOwningReferences, default(uoffset))
proc MonsterStartvectorOfNonOwningReferencesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(8, numElems, 8)
proc MonsterAddanyUniqueType*(builder: var Builder, anyUniqueType: uint8) =
  builder.PrependSlot(43, anyUniqueType, default(uint8))
proc MonsterAddanyUnique*(builder: var Builder, anyUnique: uoffset) =
  builder.PrependSlot(44, anyUnique, default(uoffset))
proc MonsterAddanyAmbiguousType*(builder: var Builder, anyAmbiguousType: uint8) =
  builder.PrependSlot(45, anyAmbiguousType, default(uint8))
proc MonsterAddanyAmbiguous*(builder: var Builder, anyAmbiguous: uoffset) =
  builder.PrependSlot(46, anyAmbiguous, default(uoffset))
proc MonsterAddvectorOfEnums*(builder: var Builder, vectorOfEnums: uoffset) =
  builder.PrependSlot(47, vectorOfEnums, default(uoffset))
proc MonsterStartvectorOfEnumsVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(1, numElems, 1)
proc MonsterAddsignedEnum*(builder: var Builder, signedEnum: int8) =
  builder.PrependSlot(48, signedEnum, default(int8))
proc MonsterAddtestrequirednestedflatbuffer*(builder: var Builder, testrequirednestedflatbuffer: uoffset) =
  builder.PrependSlot(49, testrequirednestedflatbuffer, default(uoffset))
proc MonsterStarttestrequirednestedflatbufferVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(1, numElems, 1)
proc MonsterAddscalarKeySortedTables*(builder: var Builder, scalarKeySortedTables: uoffset) =
  builder.PrependSlot(50, scalarKeySortedTables, default(uoffset))
proc MonsterStartscalarKeySortedTablesVector*(builder: var Builder, numElems: uoffset) =
  builder.StartVector(4, numElems, 4)
proc MonsterAddnativeInline*(builder: var Builder, nativeInline: uoffset) =
  builder.PrependStructSlot(51, nativeInline, default(uoffset))
proc MonsterAddlongEnumNonEnumDefault*(builder: var Builder, longEnumNonEnumDefault: uint64) =
  builder.PrependSlot(52, longEnumNonEnumDefault, default(uint64))
proc MonsterAddlongEnumNormalDefault*(builder: var Builder, longEnumNormalDefault: uint64) =
  builder.PrependSlot(53, longEnumNormalDefault, default(uint64))
proc MonsterAddnanDefault*(builder: var Builder, nanDefault: float32) =
  builder.PrependSlot(54, nanDefault, default(float32))
proc MonsterAddinfDefault*(builder: var Builder, infDefault: float32) =
  builder.PrependSlot(55, infDefault, default(float32))
proc MonsterAddpositiveInfDefault*(builder: var Builder, positiveInfDefault: float32) =
  builder.PrependSlot(56, positiveInfDefault, default(float32))
proc MonsterAddinfinityDefault*(builder: var Builder, infinityDefault: float32) =
  builder.PrependSlot(57, infinityDefault, default(float32))
proc MonsterAddpositiveInfinityDefault*(builder: var Builder, positiveInfinityDefault: float32) =
  builder.PrependSlot(58, positiveInfinityDefault, default(float32))
proc MonsterAddnegativeInfDefault*(builder: var Builder, negativeInfDefault: float32) =
  builder.PrependSlot(59, negativeInfDefault, default(float32))
proc MonsterAddnegativeInfinityDefault*(builder: var Builder, negativeInfinityDefault: float32) =
  builder.PrependSlot(60, negativeInfinityDefault, default(float32))
proc MonsterAdddoubleInfDefault*(builder: var Builder, doubleInfDefault: float64) =
  builder.PrependSlot(61, doubleInfDefault, default(float64))
proc MonsterEnd*(builder: var Builder): uoffset =
  return builder.EndObject()
