function foo() tree() .node("p1", Quaternion(), Vector3(0, 0, -200)) .entity("b1", "residental-house1.glb") .endnode() .node("p2", Quaternion(), Vector3(0, 0, -150)) .entity("residental-house1.glb") .endnode() .node("p3", Quaternion(), Vector3(0, 0, -100)) .entity("residental-house1.glb") .endnode() .node("p4", Quaternion(), Vector3(0, 0, -50)) .entity("residental-house1.glb") .endnode() .node("p5", Quaternion(), Vector3(0, 0, 50)) .entity("residental-house1.glb") .endnode() .node("p6", Quaternion(), Vector3(0, 0, 100)) .entity("residental-house1.glb") .endnode() .node("p7", Quaternion(), Vector3(0, 0, 150)) .entity("residental-house2.glb") .endnode() .node("p8", Quaternion(), Vector3(0, 0, 200)) .entity("residental-house3.glb") .endnode() for x = -1000, 1000, 50 do for z = -1000, 1000, 50 do if not ((x >-100 and x < 100) and (z > -100 and z < 100)) then tree() .node("p00" .. tostring(x * 1000 + z), Quaternion(), Vector3(x, 0, z)) .entity("residental-house2.glb") .endnode() end end end v = Vector3(0, 1, 2) end --[[ narration = { position = 1, narration_start = { "The party was hot, girls were sexy the wine, beer and whisky were in \ enormous numbers. It was anniversary since you set sail with your friends. \ The sea was calm and everything promised you another great night.", "The whole year with your friends on your ship over vast seas of the world in decay was almost over.\ It was so good year full of adventure, romance, indecency and luxury.", "Your trusted friends decided that you have too much, they have too much of you and you owe them a lot.", "They found you drunk in your room and moved to the deck and used ropes to \ restrain you and attach a bucket of stones or something else heavy to your body.", "After a few hours passed two strong people pulled you to the side and \ dropped you into the sea. Last thing you heard before you hit the water was happy laugher..." }, progress = function(this) if #this.narration_start < this.position then return "" end local ret = this.narration_start[this.position] this.position = this.position + 1 return ret end, } ]]-- local narrator = require('narrator.narrator') function dump(o) if type(o) == 'table' then local s = '{ ' for k,v in pairs(o) do if type(k) ~= 'number' then k = '"'..k..'"' end s = s .. '['..k..'] = ' .. dump(v) .. ',' end return s .. '} ' else return tostring(o) end end --[[ function _narration() local ret = "" local choices = {} if story:can_continue() then print("can continue") local paragraph = story:continue(1) print(dump(paragraph)) local text = paragraph.text if paragraph.tags then text = text .. ' #' .. table.concat(paragraph.tags, ' #') for i, tag in ipairs(paragraph.tags) do if tag == "mc_is_free" then ecs_character_set("player", "gravity", true) ecs_character_set("player", "buoyancy", true) end end end ret = text if story:can_choose() then local ch = story:get_choices() for i, choice in ipairs(ch) do table.insert(choices, choice.text) print(i, dump(choice)) end if #choices == 1 and choices[1] == "Ascend" then story:choose(1) choices = {} end if #choices == 1 and choices[1] == "Continue" then story:choose(1) choices = {} end end else print("can NOT continue") end print(ret) if (#choices > 0) then print("choices!!!") narrate(ret, choices) else narrate(ret) end end ]]-- function Quest(name, book) local quest = { name = name, active = false, activate = function(this) this.active = true this.story:begin() this:_narration() end, event = function(this, event) if not this.active then return end if event == "narration_progress" then print(" in progress...") this:_narration() elseif event == "narration_answered" then local answer = narration_get_answer() this.story:choose(answer) print("answered:", answer) this:_narration() end end, _handle_tag = function(this, tag) if tag == "mc_is_free" then ecs_character_set("player", "gravity", true) ecs_character_set("player", "buoyancy", true) end end, _narration = function(this) local ret = "" local choices = {} local have_choice = false local have_paragraph = false if not this.active then print("not active") return end if this.story:can_continue() then print("can continue") have_paragraph = true local paragraph = this.story:continue(1) print(dump(paragraph)) local text = paragraph.text if paragraph.tags then text = text .. ' #' .. table.concat(paragraph.tags, ' #') for i, tag in ipairs(paragraph.tags) do this:_handle_tag(tag) end end ret = text if this.story:can_choose() then have_choice = true local ch = this.story:get_choices() for i, choice in ipairs(ch) do table.insert(choices, choice.text) print(i, dump(choice)) end if #choices == 1 and choices[1] == "Ascend" then this.story:choose(1) choices = {} end if #choices == 1 and choices[1] == "Continue" then this.story:choose(1) choices = {} end end else print("can NOT continue") end print(ret) if (#choices > 0) then print("choices!!!") narrate(ret, choices) else narrate(ret) end if not have_choice and not have_paragraph then this:complete() this.active = false else print("can continue") end end, complete = function(this) print(this.name .. 'complete') end, story = narrator.init_story(book) } -- Begin the story return quest end function StartGameQuest() -- Parse a book from the Ink file. local book = narrator.parse_file('stories.initiation') local quest = Quest('start game', book) quest.base = {} quest.base.activate = quest.activate quest.base.complete = quest.complete quest.boat = false quest.activate = function(this) print('activate...') local mc_is_free = function() this.boat_id = ecs_vehicle_set("boat", 0, 0, -20, 1.75) this.boat2_id = ecs_vehicle_set("boat", -10, 0, -20, 1.55) this.npc_id = ecs_npc_set("normal-female.glb", 0, 2, -20, 1.75) this.boat = true -- ecs_set_slot(this.boat_id, this.npc_id, "captain_seat") -- ecs_character_physics_control(this.npc_id, false) ecs_character_params_set("player", "gravity", true) ecs_character_params_set("player", "buoyancy", true) end this.story:bind('mc_is_free', mc_is_free) this.base.activate(this) end quest.complete = function(this) this.base.complete(this) this.active = false if not this.boat then ecs_save_object_debug(boat, 'boat.scene') end end return quest end quests = {} -- ecs_set_debug_drawing(true) setup_handler(function(event) print(event) for k, v in pairs(quests) do if v.active then v:event(event) end end if event == "startup" then main_menu() elseif event == "narration_progress" then print("narration progress!") elseif event == "narration_answered" then local answer = narration_get_answer() story:choose(answer) print("answered:", answer) elseif event == "new_game" then ecs_character_params_set("player", "gravity", true) ecs_character_params_set("player", "buoyancy", false) local quest = StartGameQuest() quests[quest.name] = quest for k, v in pairs(quests) do print(k, v.active) end quest:activate() end end)