1*890232f2SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved. 2*890232f2SAndroid Build Coastguard Worker// 3*890232f2SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*890232f2SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*890232f2SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*890232f2SAndroid Build Coastguard Worker// 7*890232f2SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*890232f2SAndroid Build Coastguard Worker// 9*890232f2SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*890232f2SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*890232f2SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*890232f2SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*890232f2SAndroid Build Coastguard Worker// limitations under the License. 14*890232f2SAndroid Build Coastguard Worker 15*890232f2SAndroid Build Coastguard Workerimport from "../lobster/" 16*890232f2SAndroid Build Coastguard Workerimport monster_generated 17*890232f2SAndroid Build Coastguard Worker 18*890232f2SAndroid Build Coastguard Worker// Example of how to use FlatBuffers to create and read binary buffers. 19*890232f2SAndroid Build Coastguard Worker 20*890232f2SAndroid Build Coastguard Worker// Create a builder. 21*890232f2SAndroid Build Coastguard Workerlet b = flatbuffers_builder {} 22*890232f2SAndroid Build Coastguard Worker 23*890232f2SAndroid Build Coastguard Worker// Create some weapons for our monster. 24*890232f2SAndroid Build Coastguard Workerlet weapon_names = [ "Sword", "Axe" ] 25*890232f2SAndroid Build Coastguard Workerlet weapon_damages = [ 3, 5 ] 26*890232f2SAndroid Build Coastguard Worker 27*890232f2SAndroid Build Coastguard Workerlet weapon_offsets = map(weapon_names) name, i: 28*890232f2SAndroid Build Coastguard Worker let ns = b.CreateString(name) 29*890232f2SAndroid Build Coastguard Worker MyGame_Sample_WeaponBuilder { b } 30*890232f2SAndroid Build Coastguard Worker .start() 31*890232f2SAndroid Build Coastguard Worker .add_name(ns) 32*890232f2SAndroid Build Coastguard Worker .add_damage(weapon_damages[i]) 33*890232f2SAndroid Build Coastguard Worker .end() 34*890232f2SAndroid Build Coastguard Worker 35*890232f2SAndroid Build Coastguard Workerlet weapons = b.MyGame_Sample_MonsterCreateWeaponsVector(weapon_offsets) 36*890232f2SAndroid Build Coastguard Worker 37*890232f2SAndroid Build Coastguard Worker// Name of the monster. 38*890232f2SAndroid Build Coastguard Workerlet name = b.CreateString("Orc") 39*890232f2SAndroid Build Coastguard Worker 40*890232f2SAndroid Build Coastguard Worker// Inventory. 41*890232f2SAndroid Build Coastguard Workerlet inv = b.MyGame_Sample_MonsterCreateInventoryVector(map(10): _) 42*890232f2SAndroid Build Coastguard Worker 43*890232f2SAndroid Build Coastguard Worker// Now pack it all together in our root monster object. 44*890232f2SAndroid Build Coastguard Workerlet orc = MyGame_Sample_MonsterBuilder { b } 45*890232f2SAndroid Build Coastguard Worker .start() 46*890232f2SAndroid Build Coastguard Worker .add_pos(b.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0)) 47*890232f2SAndroid Build Coastguard Worker .add_hp(300) 48*890232f2SAndroid Build Coastguard Worker .add_name(name) 49*890232f2SAndroid Build Coastguard Worker .add_inventory(inv) 50*890232f2SAndroid Build Coastguard Worker .add_color(MyGame_Sample_Color_Red) 51*890232f2SAndroid Build Coastguard Worker .add_weapons(weapons) 52*890232f2SAndroid Build Coastguard Worker .add_equipped_type(MyGame_Sample_Equipment_Weapon) 53*890232f2SAndroid Build Coastguard Worker .add_equipped(weapon_offsets[1]) 54*890232f2SAndroid Build Coastguard Worker .end() 55*890232f2SAndroid Build Coastguard Worker 56*890232f2SAndroid Build Coastguard Worker// Finish the buffer! 57*890232f2SAndroid Build Coastguard Workerb.Finish(orc, "MONS") 58*890232f2SAndroid Build Coastguard Worker 59*890232f2SAndroid Build Coastguard Worker// We now have a FlatBuffer that we could store on disk or send over a network. 60*890232f2SAndroid Build Coastguard Worker 61*890232f2SAndroid Build Coastguard Workerlet buf = b.SizedCopy() 62*890232f2SAndroid Build Coastguard Worker 63*890232f2SAndroid Build Coastguard Worker// ...Saving to file or sending over a network code goes here... 64*890232f2SAndroid Build Coastguard Worker 65*890232f2SAndroid Build Coastguard Worker// Instead, we are going to access this buffer right away (as if we just 66*890232f2SAndroid Build Coastguard Worker// received it). 67*890232f2SAndroid Build Coastguard Worker 68*890232f2SAndroid Build Coastguard Worker// Get the root object accessor. 69*890232f2SAndroid Build Coastguard Workerlet monster = MyGame_Sample_GetRootAsMonster(buf) 70*890232f2SAndroid Build Coastguard Worker 71*890232f2SAndroid Build Coastguard Worker// Note: We did not set the `mana` field explicitly, so we get a default value. 72*890232f2SAndroid Build Coastguard Workerassert monster.mana == 150 73*890232f2SAndroid Build Coastguard Workerassert monster.hp == 300 74*890232f2SAndroid Build Coastguard Workerassert monster.name == "Orc" 75*890232f2SAndroid Build Coastguard Workerassert monster.color == MyGame_Sample_Color_Red 76*890232f2SAndroid Build Coastguard Workerlet pos = monster.pos 77*890232f2SAndroid Build Coastguard Workerassert pos 78*890232f2SAndroid Build Coastguard Workerassert pos.x == 1.0 79*890232f2SAndroid Build Coastguard Workerassert pos.y == 2.0 80*890232f2SAndroid Build Coastguard Workerassert pos.z == 3.0 81*890232f2SAndroid Build Coastguard Worker 82*890232f2SAndroid Build Coastguard Worker// Get and test the `inventory` FlatBuffer vector. 83*890232f2SAndroid Build Coastguard Workerfor(monster.inventory_length) e, i: 84*890232f2SAndroid Build Coastguard Worker assert monster.inventory(i) == e 85*890232f2SAndroid Build Coastguard Worker 86*890232f2SAndroid Build Coastguard Worker// Get and test the `weapons` FlatBuffer vector of tables. 87*890232f2SAndroid Build Coastguard Workerfor(monster.weapons_length) i: 88*890232f2SAndroid Build Coastguard Worker assert monster.weapons(i).name == weapon_names[i] 89*890232f2SAndroid Build Coastguard Worker assert monster.weapons(i).damage == weapon_damages[i] 90*890232f2SAndroid Build Coastguard Worker 91*890232f2SAndroid Build Coastguard Worker// Get and test the `equipped` FlatBuffer union. 92*890232f2SAndroid Build Coastguard Workerassert monster.equipped_type() == MyGame_Sample_Equipment_Weapon 93*890232f2SAndroid Build Coastguard Worker 94*890232f2SAndroid Build Coastguard Worker// Now that we know the union value is a weapon, we can safely call as_Weapon: 95*890232f2SAndroid Build Coastguard Workerlet union_weapon = monster.equipped_as_Weapon 96*890232f2SAndroid Build Coastguard Worker 97*890232f2SAndroid Build Coastguard Workerassert union_weapon.name == "Axe" 98*890232f2SAndroid Build Coastguard Workerassert union_weapon.damage == 5 99*890232f2SAndroid Build Coastguard Worker 100*890232f2SAndroid Build Coastguard Workerprint "The FlatBuffer was successfully created and verified!" 101