279 lines
7.3 KiB
Lua
279 lines
7.3 KiB
Lua
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("raft", 0, 0, -20, 1.75)
|
|
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, entity)
|
|
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)
|