Dialogues: Finish implementation of registered dialogues.

Ported all trade dialogues to use new dialogue system.
This commit is contained in:
Hector Franqui 2017-07-19 14:00:29 -04:00
parent b5dc9926cd
commit 3edc959d3a
6 changed files with 346 additions and 185 deletions

View File

@ -29,6 +29,7 @@ npc.dialogue.tags = {
FEMALE = "female", FEMALE = "female",
-- Relationship based tags - these are one-to-one with the -- Relationship based tags - these are one-to-one with the
-- phase names. -- phase names.
DEFAULT_MARRIED_DIALOGUE = "default_married_dialogue",
PHASE_1 = "phase1", PHASE_1 = "phase1",
PHASE_2 = "phase2", PHASE_2 = "phase2",
PHASE_3 = "phase3", PHASE_3 = "phase3",
@ -38,6 +39,11 @@ npc.dialogue.tags = {
GIFT_ITEM_RESPONSE = "gift_item_response", GIFT_ITEM_RESPONSE = "gift_item_response",
GIFT_ITEM_LIKED = "gift_item_liked", GIFT_ITEM_LIKED = "gift_item_liked",
GIFT_ITEM_UNLIKED = "gift_item_unliked", GIFT_ITEM_UNLIKED = "gift_item_unliked",
-- Trade-related tags
DEFAULT_CASUAL_TRADE = "default_casual_trade_dialogue",
DEFAULT_DEDICATED_TRADE = "default_dedicated_trade_dialogue",
DEFAULT_BUY_OFFER = "buy_offer",
DEFAULT_SELL_OFFER = "sell_offer",
-- Occupation-based tags - these are one-to-one with the -- Occupation-based tags - these are one-to-one with the
-- default occupation names -- default occupation names
BASIC = "basic", -- Dialogues related to the basic occupation should BASIC = "basic", -- Dialogues related to the basic occupation should
@ -50,6 +56,15 @@ npc.dialogue.tags = {
-- This table will contain all the registered dialogues for NPCs -- This table will contain all the registered dialogues for NPCs
npc.dialogue.registered_dialogues = {} npc.dialogue.registered_dialogues = {}
npc.dialogue.cache_keys = {
CASUAL_BUY_DIALOGUE = {key="CASUAL_BUY_DIALOGUE", tags={npc.dialogue.tags.DEFAULT_CASUAL_TRADE, npc.dialogue.tags.DEFAULT_BUY_OFFER}},
CASUAL_SELL_DIALOGUE = {key="CASUAL_SELL_DIALOGUE", tags={npc.dialogue.tags.DEFAULT_CASUAL_TRADE, npc.dialogue.tags.DEFAULT_SELL_OFFER}},
DEDICATED_TRADER_DIALOGUE = {key="DEDICATED_TRADER_DIALOGUE", tags={npc.dialogue.tags.DEFAULT_DEDICATED_TRADE}},
MARRIED_DIALOGUE = {key="MARRIED_DIALOGUE", tags={npc.dialogue.tags.DEFAULT_MARRIED_DIALOGUE}},
}
npc.dialogue.cache = {}
-------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------
-- Dialogue registration functions -- Dialogue registration functions
-- All dialogues will be registered by providing a definition. -- All dialogues will be registered by providing a definition.
@ -106,6 +121,31 @@ npc.dialogue.registered_dialogues = {}
-- } -- }
-- } -- }
-------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------
-- This function sets a unique response ID (made of <depth>:<response index>) to
-- each response that features a function. This is to be able to locate the
-- function easily later
local function set_response_ids_recursively(dialogue, depth, dialogue_id)
-- Base case: dialogue object with no responses and no responses below it
if dialogue.responses == nil
and (dialogue.action_type == "dialogue" and dialogue.action.responses == nil) then
return
elseif dialogue.responses ~= nil then
-- Assign a response ID to each response
local response_id_prefix = tostring(depth)..":"
for key,value in ipairs(dialogue.responses) do
if value.action_type == "function" then
value.response_id = response_id_prefix..key
value.dialogue_id = dialogue_id
else
-- We have a dialogue action type. Need to check if dialogue has further responses
if value.action.responses ~= nil then
set_response_ids_recursively(value.action, depth + 1, dialogue_id)
end
end
end
end
end
-- The register dialogue function will just receive the definition as -- The register dialogue function will just receive the definition as
-- explained above. The unique key will be the index it gets into the -- explained above. The unique key will be the index it gets into the
-- array when inserted. -- array when inserted.
@ -114,9 +154,17 @@ function npc.dialogue.register_dialogue(def)
if not def.tags then if not def.tags then
def.tags = {npc.dialogue.tags.UNISEX, npc.dialogue.tags.PHASE_1} def.tags = {npc.dialogue.tags.UNISEX, npc.dialogue.tags.PHASE_1}
end end
local dialogue_id = table.getn(npc.dialogue.registered_dialogues) + 1
-- Set the response IDs - required for dialogue objects that
-- form trees of dialogues
set_response_ids_recursively(def, 0, dialogue_id)
def.key = dialogue_id
-- Insert dialogue into table -- Insert dialogue into table
table.insert(npc.dialogue.registered_dialogues, def) table.insert(npc.dialogue.registered_dialogues, def)
--minetest.log("Dialogues: "..dump(npc.dialogue.registered_dialogues)) return dialogue_id
end end
-- This function returns a table of dialogues that meet the given -- This function returns a table of dialogues that meet the given
@ -148,14 +196,33 @@ function npc.dialogue.search_dialogue_by_tags(tags, find_all)
result[key] = def result[key] = def
end end
end end
-- if (find_all == true and tags_found == #tags)
-- or (not find_all and tags_found == #def.tags) then
-- end
end end
return result return result
end end
function npc.dialogue.get_cached_dialogue_key(_cache_key, tags)
local cache_key = _cache_key
if type(_cache_key) == "table" then
cache_key = _cache_key.key
tags = _cache_key.tags
end
local key = npc.dialogue.cache[cache_key]
-- Check if key isn't cached
if not key then
-- Search for the dialogue
local dialogues = npc.dialogue.search_dialogue_by_tags(tags, true)
key = npc.utils.get_map_keys(dialogues)[1]
-- Populate cache
npc.dialogue.cache[cache_key] = key
-- Return key
return key
else
-- Return the cached key
return key
end
end
-------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------
-- Dialogue box definitions -- Dialogue box definitions
-- The dialogue boxes are used for the player to interact with the -- The dialogue boxes are used for the player to interact with the
@ -164,6 +231,7 @@ end
-- Creates and shows a multi-option dialogue based on the number of responses -- Creates and shows a multi-option dialogue based on the number of responses
-- that the dialogue object contains -- that the dialogue object contains
function npc.dialogue.show_options_dialogue(self, function npc.dialogue.show_options_dialogue(self,
dialogue_key,
dialogue, dialogue,
dismiss_option_label, dismiss_option_label,
player_name) player_name)
@ -186,12 +254,10 @@ function npc.dialogue.show_options_dialogue(self,
-- Create entry on options_dialogue table -- Create entry on options_dialogue table
npc.dialogue.dialogue_results.options_dialogue[player_name] = { npc.dialogue.dialogue_results.options_dialogue[player_name] = {
npc = self, npc = self,
dialogue = dialogue,
dialogue_key = dialogue_key,
is_married_dialogue = is_married_dialogue =
(dialogue.dialogue_type == npc.dialogue.dialogue_type.married), (dialogue.dialogue_type == npc.dialogue.dialogue_type.married),
is_casual_trade_dialogue =
(dialogue.dialogue_type == npc.dialogue.dialogue_type.casual_trade),
is_dedicated_trade_dialogue =
(dialogue.dialogue_type == npc.dialogue.dialogue_type.dedicated_trade),
is_custom_trade_dialogue = is_custom_trade_dialogue =
(dialogue.dialogue_type == npc.dialogue.dialogue_type.custom_trade), (dialogue.dialogue_type == npc.dialogue.dialogue_type.custom_trade),
casual_trade_type = dialogue.casual_trade_type, casual_trade_type = dialogue.casual_trade_type,
@ -230,32 +296,6 @@ end
-------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------
-- Dialogue methods -- Dialogue methods
-------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------
-- This function sets a unique response ID (made of <depth>:<response index>) to
-- each response that features a function. This is to be able to locate the
-- function easily later
local function set_response_ids_recursively(dialogue, depth, dialogue_id)
-- Base case: dialogue object with no responses and no r,esponses below it
if dialogue.responses == nil
and (dialogue.action_type == "dialogue" and dialogue.action.responses == nil) then
return
elseif dialogue.responses ~= nil then
-- Assign a response ID to each response
local response_id_prefix = tostring(depth)..":"
for key,value in ipairs(dialogue.responses) do
if value.action_type == "function" then
value.response_id = response_id_prefix..key
value.dialogue_id = dialogue_id
else
-- We have a dialogue action type. Need to check if dialogue has further responses
if value.action.responses ~= nil then
set_response_ids_recursively(value.action, depth + 1, dialogue_id)
end
end
end
end
end
-- Select random dialogue objects for an NPC based on sex -- Select random dialogue objects for an NPC based on sex
-- and the relationship phase with player -- and the relationship phase with player
function npc.dialogue.select_random_dialogues_for_npc(self, phase) function npc.dialogue.select_random_dialogues_for_npc(self, phase)
@ -277,16 +317,15 @@ function npc.dialogue.select_random_dialogues_for_npc(self, phase)
} }
local dialogues = npc.dialogue.search_dialogue_by_tags(search_tags) local dialogues = npc.dialogue.search_dialogue_by_tags(search_tags)
minetest.log("dialogues found by tag search: "..dump(dialogues)) local keys = npc.utils.get_map_keys(dialogues)
-- Determine how many dialogue lines the NPC will have -- Determine how many dialogue lines the NPC will have
local number_of_dialogues = math.random(npc.dialogue.MIN_DIALOGUES, npc.dialogue.MAX_DIALOGUES) local number_of_dialogues = math.random(npc.dialogue.MIN_DIALOGUES, npc.dialogue.MAX_DIALOGUES)
for i = 1,number_of_dialogues do for i = 1, number_of_dialogues do
local dialogue_id = math.random(1, #dialogues) local key_id = math.random(1, #keys)
result.normal[i] = dialogue_id result.normal[i] = keys[key_id]
minetest.log("Adding dialogue: "..dump(dialogues[keys[key_id]]))
--set_response_ids_recursively(result.normal[i], 0, dialogue_id)
end end
-- Add item hints. -- Add item hints.
@ -313,24 +352,7 @@ function npc.dialogue.select_random_dialogues_for_npc(self, phase)
end end
end end
npc.log("DEBUG", "Dialogue results:"..dump(result))
-- Favorite items
-- for i = 1, 2 do
-- result.hints[i] = {}
-- result.hints[i].text =
-- npc.relationships.get_hint_for_favorite_item(
-- self.gift_data.favorite_items["fav"..tostring(i)], self.sex, phase_tag)
-- end
-- -- Disliked items
-- for i = 3, 4 do
-- result.hints[i] = {}
-- result.hints[i].text =
-- npc.relationships.get_hint_for_disliked_item(
-- self.gift_data.disliked_items["dis"..tostring(i-2)], self.sex, phase_tag)
-- end
minetest.log("Dialogue results:"..dump(result))
return result return result
end end
@ -380,12 +402,13 @@ function npc.dialogue.start_dialogue(self, player, show_married_dialogue)
-- Show options dialogue for dedicated trader -- Show options dialogue for dedicated trader
if self.trader_data.trader_status == npc.trade.TRADER then if self.trader_data.trader_status == npc.trade.TRADER then
dialogue = npc.trade.DEDICATED_TRADER_PROMPT dialogue = npc.dialogue.get_cached_dialogue_key(npc.dialogue.cache_keys.DEDICATED_TRADER_DIALOGUE)
npc.dialogue.process_dialogue(self, dialogue, player:get_player_name()) npc.dialogue.process_dialogue(self, dialogue, player:get_player_name())
return return
end end
local chance = math.random(1, 100) local chance = math.random(1, 100)
--minetest.log("Chance: "..dump(chance))
if chance < 30 then if chance < 30 then
-- Show trading options for casual traders -- Show trading options for casual traders
-- If NPC has custom trading options, these will be -- If NPC has custom trading options, these will be
@ -406,10 +429,10 @@ function npc.dialogue.start_dialogue(self, player, show_married_dialogue)
local trade_chance = math.random(1, max_trade_chance) local trade_chance = math.random(1, max_trade_chance)
if trade_chance == 1 then if trade_chance == 1 then
-- Show casual buy dialogue -- Show casual buy dialogue
dialogue = npc.trade.CASUAL_TRADE_BUY_DIALOGUE dialogue = npc.dialogue.get_cached_dialogue_key(npc.dialogue.cache_keys.CASUAL_BUY_DIALOGUE)
elseif trade_chance == 2 then elseif trade_chance == 2 then
-- Show casual sell dialogue -- Show casual sell dialogue
dialogue = npc.trade.CASUAL_TRADE_SELL_DIALOGUE dialogue = npc.dialogue.get_cached_dialogue_key(npc.dialogue.cache_keys.CASUAL_SELL_DIALOGUE)
elseif trade_chance == 3 then elseif trade_chance == 3 then
-- Show custom trade options -- Show custom trade options
dialogue = npc.dialogue.create_custom_trade_options(self, player) dialogue = npc.dialogue.create_custom_trade_options(self, player)
@ -433,58 +456,61 @@ end
-- This function processes a dialogue object and performs -- This function processes a dialogue object and performs
-- actions depending on what is defined in the object -- actions depending on what is defined in the object
function npc.dialogue.process_dialogue(self, dialogue, player_name) function npc.dialogue.process_dialogue(self, dialogue, player_name)
-- Freeze NPC actions
npc.lock_actions(self)
-- Freeze NPC actions local dialogue_key = -1
npc.lock_actions(self)
if type(dialogue) ~= "table" then if type(dialogue) ~= "table" then
dialogue = npc.dialogue.registered_dialogues[dialogue] dialogue_key = dialogue
minetest.log("Found dialogue: "..dump(dialogue)) dialogue = npc.dialogue.registered_dialogues[dialogue]
end --minetest.log("Found dialogue: "..dump(dialogue))
end
-- Check if this dialogue has a flag definition -- Check if this dialogue has a flag definition
if dialogue.flag then if dialogue.flag then
-- Check if the NPC has this flag -- Check if the NPC has this flag
local flag_value = npc.get_flag(self, dialogue.flag.name) local flag_value = npc.get_flag(self, dialogue.flag.name)
if flag_value ~= nil then if flag_value ~= nil then
-- Check if value of the flag is equal to the expected value -- Check if value of the flag is equal to the expected value
if flag_value ~= dialogue.flag.value then if flag_value ~= dialogue.flag.value then
-- Do not process this dialogue -- Do not process this dialogue
return false return false
end end
else else
if (type(dialogue.flag.value) == "boolean" and dialogue.flag.value ~= false) if (type(dialogue.flag.value) == "boolean" and dialogue.flag.value ~= false)
or (type(dialogue.flag.value) == "number" and dialogue.flag.value > 0) then or (type(dialogue.flag.value) == "number" and dialogue.flag.value > 0) then
-- Do not process this dialogue -- Do not process this dialogue
return false return false
end end
end end
end end
-- Send dialogue line -- Send dialogue line
if dialogue.text then if dialogue.text then
npc.chat(self.npc_name, player_name, dialogue.text) npc.chat(self.npc_name, player_name, dialogue.text)
end end
-- Check if dialogue has responses. If it doesn't, unlock the actions -- Check if dialogue has responses. If it doesn't, unlock the actions
-- queue and reset actions timer.' -- queue and reset actions timer.'
if not dialogue.responses then if not dialogue.responses then
npc.unlock_actions(self) npc.unlock_actions(self)
end end
-- Check if there are responses, then show multi-option dialogue if there are -- Check if there are responses, then show multi-option dialogue if there are
if dialogue.responses then if dialogue.responses then
npc.dialogue.show_options_dialogue( npc.dialogue.show_options_dialogue(
self, self,
dialogue_key,
dialogue, dialogue,
npc.dialogue.NEGATIVE_ANSWER_LABEL, npc.dialogue.NEGATIVE_ANSWER_LABEL,
player_name player_name
) )
end end
-- Dialogue object processed successfully -- Dialogue object processed successfully
return true return true
end end
function npc.dialogue.create_option_dialogue(prompt, options, actions) function npc.dialogue.create_option_dialogue(prompt, options, actions)
@ -630,51 +656,21 @@ minetest.register_on_player_receive_fields(function (player, formname, fields)
npc.relationships.MARRIED_NPC_DIALOGUE npc.relationships.MARRIED_NPC_DIALOGUE
.responses[player_response.options[i].response_id] .responses[player_response.options[i].response_id]
.action(player_response.npc, player) .action(player_response.npc, player)
elseif player_response.is_casual_trade_dialogue == true then
-- Check if trade is casual buy or sell
if player_response.casual_trade_type == npc.trade.OFFER_BUY then
-- Get functions from casual buy dialogue
npc.trade.CASUAL_TRADE_BUY_DIALOGUE
.responses[player_response.options[i].response_id]
.action(player_response.npc, player)
elseif player_response.casual_trade_type == npc.trade.OFFER_SELL == true then
-- Get functions from casual sell dialogue
npc.trade.CASUAL_TRADE_SELL_DIALOGUE
.responses[player_response.options[i].response_id]
.action(player_response.npc, player)
end
return
elseif player_response.is_dedicated_trade_dialogue == true then
-- Get the functions for a dedicated trader prompt
npc.trade.DEDICATED_TRADER_PROMPT
.responses[player_response.options[i].response_id]
.action(player_response.npc, player)
return
elseif player_response.is_custom_trade_dialogue == true then elseif player_response.is_custom_trade_dialogue == true then
-- Functions for a custom trade should be available from the same dialogue -- Functions for a custom trade should be available from the same dialogue
-- object as it is created in memory -- object as they are created on demand
minetest.log("Player response: "..dump(player_response.options[i])) minetest.log("Player response: "..dump(player_response.options[i]))
player_response.options[i].action(player_response.npc, player) player_response.options[i].action(player_response.npc, player)
else else
-- Get dialogues for sex and phase -- Get dialogue from registered dialogues
local dialogues = npc.data.DIALOGUES[player_response.npc.sex][phase] local dialogue = npc.dialogue.registered_dialogues[player_response.options[i].dialogue_id]
local response = get_response_object_by_id_recursive(dialogue, 0, player_response.options[i].response_id)
minetest.log("Object: "..dump(dialogues[player_response.options[i].dialogue_id]))
local response = get_response_object_by_id_recursive(dialogues[player_response.options[i].dialogue_id], 0, player_response.options[i].response_id)
minetest.log("Found: "..dump(response))
-- Execute function -- Execute function
response.action(player_response.npc, player) response.action(player_response.npc, player)
-- Execute function
-- dialogues[player_response.options[i].dialogue_id]
-- .responses[player_response.options[i].response_id]
-- .action(player_response.npc, player)
-- Unlock queue, reset action timer and unfreeze NPC.
npc.unlock_actions(player_response.npc)
-- Unlock queue, reset action timer and unfreeze NPC.
npc.unlock_actions(player_response.npc)
end end
end end
return return

View File

@ -482,8 +482,8 @@ function npc.initialize(entity, pos, is_lua_entity, npc_stats)
-- Add a custom trade offer -- Add a custom trade offer
local offer1 = npc.trade.create_custom_sell_trade_offer("Do you want me to fix your steel sword?", "Fix steel sword", "Fix steel sword", "default:sword_steel", {"default:sword_steel", "default:iron_lump 5"}) local offer1 = npc.trade.create_custom_sell_trade_offer("Do you want me to fix your steel sword?", "Fix steel sword", "Fix steel sword", "default:sword_steel", {"default:sword_steel", "default:iron_lump 5"})
table.insert(ent.trader_data.custom_trades, offer1) table.insert(ent.trader_data.custom_trades, offer1)
local offer2 = npc.trade.create_custom_sell_trade_offer("Do you want me to fix your mese sword?", "Fix mese sword", "Fix mese sword", "default:sword_mese", {"default:sword_mese", "default:copper_lump 10"}) --local offer2 = npc.trade.create_custom_sell_trade_offer("Do you want me to fix your mese sword?", "Fix mese sword", "Fix mese sword", "default:sword_mese", {"default:sword_mese", "default:copper_lump 10"})
table.insert(ent.trader_data.custom_trades, offer2) --table.insert(ent.trader_data.custom_trades, offer2)
ent.initialized = true ent.initialized = true
--minetest.log(dump(ent)) --minetest.log(dump(ent))

View File

@ -8,37 +8,6 @@ npc.data.DIALOGUES = {
male = {} male = {}
} }
npc.dialogue.register_dialogue({
text = "Hello there!",
tags = {"unisex", "phase1"}
})
npc.dialogue.register_dialogue({
text = "How are you doing?",
tags = {"unisex", "phase1"}
})
npc.dialogue.register_dialogue({
text = "Just living another day...",
tags = {"unisex", "phase1"}
})
npc.dialogue.register_dialogue({
text = "Is there any woman in this area more beautiful than I am?",
tags = {"female", "phase1"}
})
npc.dialogue.register_dialogue({
text = "Hunting is the best pasttime!",
tags = {"male", "phase1"}
})
npc.dialogue.register_dialogue({
text = "I hope my wheat grows well this harvest.",
tags = {"male", "default_farmer"}
})
-- Female dialogue options defined by phase -- Female dialogue options defined by phase
-- Phase 1 -- Phase 1
npc.data.DIALOGUES.female["phase1"] = { npc.data.DIALOGUES.female["phase1"] = {

View File

@ -0,0 +1,127 @@
-- Phase 1 dialogues, unisex
npc.dialogue.register_dialogue({
text = "Hello there!",
tags = {"unisex", "phase1"}
})
npc.dialogue.register_dialogue({
text = "How are you doing?",
tags = {"unisex", "phase1"}
})
npc.dialogue.register_dialogue({
text = "Just living another day...",
tags = {"unisex", "phase1"}
})
-- Phase 1 dialogues, female
npc.dialogue.register_dialogue({
text = "Is there any woman in this area more beautiful than I am?",
tags = {"female", "phase1"}
})
npc.dialogue.register_dialogue({
text = "Hello! Have you been to the sea?",
tags = {"female", "phase1"},
responses = {
[1] = {
text = "No, never before",
action_type = "function",
action = function(self, player)
minetest.chat_send_player(player:get_player_name(), "Oh, never? How come! You should."..
"\nHere, take this. It will guide you to the sea...")
end
},
[2] = {
text = "Yes, sure",
action_type = "dialogue",
action = {
text = "It's so beautiful, and big, and large, and infinite, and..."
}
},
[3] = {
text = "Of course! And to all the seas in the world!",
action_type = "dialogue",
action = {
text = "Awww you are no fun then! Go on then know-it-all!"
}
}
}
})
npc.dialogue.register_dialogue({
text = "Hello there, could you help me?",
tags = {"phase1", "female"},
flag = {name="received_money_help", value=false},
responses = {
[1] = {
text = "Yes, how can I help?",
action_type = "dialogue",
action = {
text = "Could you please give me 3 "..npc.trade.prices.currency.tier3.name.."?",
responses = {
[1] = {
text = "Yes, ok, here",
action_type = "function",
action = function(self, player)
-- Take item
if npc.actions.execute(self, npc.actions.cmd.TAKE_ITEM, {
player=player:get_player_name(),
pos=nil,
inv_list="main",
item_name=npc.trade.prices.currency.tier3.string,
count=3
}) then
-- Send message
npc.chat(self.npc_name, player:get_player_name(), "Thank you, thank you so much!")
-- Set flag
npc.add_flag(self, "received_money_help", true)
-- Add chat line
--table.insert(self.dialogues.normal, npc.data.DIALOGUES.female["phase1"][8])
else
npc.chat(self.npc_name, player:get_player_name(), "Looks like you don't have that amount of money...")
end
end
},
[2] = {
text = "No, I'm sorry",
action_type = "dialogue",
action = {
text = "Oh..."
}
}
}
}
},
[2] = {
text = "No, I'm sorry, can't now",
action_type = "function",
action = function(self, player)
npc.chat(self.npc_name, player:get_player_name(), "Oh, ok...")
end
}
}
})
npc.dialogue.register_dialogue({
text = "Thank you so much for your help, thank you!",
flag = {name="received_money_help", value=true},
tags = {"phase1", "female"}
})
-- Phase 1 dialogues, male
npc.dialogue.register_dialogue({
text = "Hunting is the best pasttime!",
tags = {"male", "phase1"}
})
npc.dialogue.register_dialogue({
text = "I hope my wheat grows well this harvest.",
tags = {"male", "default_farmer"}
})

View File

@ -96,7 +96,7 @@ npc.relationships.MARRIED_NPC_DIALOGUE = {
end end
}, },
[3] = { [3] = {
text = "Come with me, please!", text = "Please, come with me!",
action_type = "function", action_type = "function",
response_id = 3, response_id = 3,
action = function(self, player) action = function(self, player)

View File

@ -26,10 +26,11 @@ npc.trade.CUSTOM_TRADES_PROMPT_TEXT = "Hi there, how can I help you today?"
-- Casual trader NPC dialogues definition -- Casual trader NPC dialogues definition
-- Casual buyer -- Casual buyer
npc.trade.CASUAL_TRADE_BUY_DIALOGUE = { npc.dialogue.register_dialogue({
text = "I'm looking to buy some items, are you interested?", text = "I'm looking to buy some items, are you interested?",
casual_trade_type = npc.trade.OFFER_BUY, --casual_trade_type = npc.trade.OFFER_BUY,
dialogue_type = npc.dialogue.dialogue_type.casual_trade, tags = {"default_casual_trade_dialogue", "buy_offer"},
--dialogue_type = npc.dialogue.dialogue_type.casual_trade,
responses = { responses = {
[1] = { [1] = {
text = "Sell", text = "Sell",
@ -40,13 +41,30 @@ npc.trade.CASUAL_TRADE_BUY_DIALOGUE = {
end end
} }
} }
} })
-- npc.trade.CASUAL_TRADE_BUY_DIALOGUE = {
-- text = "I'm looking to buy some items, are you interested?",
-- casual_trade_type = npc.trade.OFFER_BUY,
-- dialogue_type = npc.dialogue.dialogue_type.casual_trade,
-- responses = {
-- [1] = {
-- text = "Sell",
-- action_type = "function",
-- response_id = 1,
-- action = function(self, player)
-- npc.trade.show_trade_offer_formspec(self, player, npc.trade.OFFER_BUY)
-- end
-- }
-- }
-- }
-- Casual seller -- Casual seller
npc.trade.CASUAL_TRADE_SELL_DIALOGUE = { npc.dialogue.register_dialogue({
text = "I have some items to sell, are you interested?", text = "I have some items to sell, are you interested?",
dialogue_type = npc.dialogue.dialogue_type.casual_trade, --dialogue_type = npc.dialogue.dialogue_type.casual_trade,
casual_trade_type = npc.trade.OFFER_SELL, tags = {"default_casual_trade_dialogue", "sell_offer"},
--casual_trade_type = npc.trade.OFFER_SELL,
responses = { responses = {
[1] = { [1] = {
text = "Buy", text = "Buy",
@ -57,11 +75,28 @@ npc.trade.CASUAL_TRADE_SELL_DIALOGUE = {
end end
} }
} }
} })
-- npc.trade.CASUAL_TRADE_SELL_DIALOGUE = {
-- text = "I have some items to sell, are you interested?",
-- dialogue_type = npc.dialogue.dialogue_type.casual_trade,
-- casual_trade_type = npc.trade.OFFER_SELL,
-- responses = {
-- [1] = {
-- text = "Buy",
-- action_type = "function",
-- response_id = 1,
-- action = function(self, player)
-- npc.trade.show_trade_offer_formspec(self, player, npc.trade.OFFER_SELL)
-- end
-- }
-- }
-- }
-- Dedicated trade dialogue prompt -- Dedicated trade dialogue prompt
npc.trade.DEDICATED_TRADER_PROMPT = { npc.dialogue.register_dialogue({
text = "Hello there, would you like to trade?", text = "Hello there, would you like to trade?",
tags = {npc.dialogue.tags.DEFAULT_DEDICATED_TRADE},
dialogue_type = npc.dialogue.dialogue_type.dedicated_trade, dialogue_type = npc.dialogue.dialogue_type.dedicated_trade,
responses = { responses = {
[1] = { [1] = {
@ -90,7 +125,38 @@ npc.trade.DEDICATED_TRADER_PROMPT = {
end end
} }
} }
} })
-- npc.trade.DEDICATED_TRADER_PROMPT = {
-- text = "Hello there, would you like to trade?",
-- dialogue_type = npc.dialogue.dialogue_type.dedicated_trade,
-- responses = {
-- [1] = {
-- text = "Buy",
-- action_type = "function",
-- response_id = 1,
-- action = function(self, player)
-- npc.trade.show_dedicated_trade_formspec(self, player, npc.trade.OFFER_SELL)
-- end
-- },
-- [2] = {
-- text = "Sell",
-- action_type = "function",
-- response_id = 2,
-- action = function(self, player)
-- npc.trade.show_dedicated_trade_formspec(self, player, npc.trade.OFFER_BUY)
-- end
-- },
-- [3] = {
-- text = "Other",
-- action_type = "function",
-- response_id = 3,
-- action = function(self, player)
-- local dialogue = npc.dialogue.create_custom_trade_options(self, player)
-- npc.dialogue.process_dialogue(self, dialogue, player:get_player_name())
-- end
-- }
-- }
-- }
function npc.trade.show_trade_offer_formspec(self, player, offer_type) function npc.trade.show_trade_offer_formspec(self, player, offer_type)
@ -348,12 +414,15 @@ function npc.trade.get_casual_trade_offer(self, offer_type)
end end
end end
end end
-- Choose a random item from the sellable items -- Check if there are no sellable items to avoid crash
local item = sellable_items[math.random(#sellable_items)] if #sellable_items > 0 then
-- Choose how many of this item will be sold to player -- Choose a random item from the sellable items
local count = math.random(npc.get_item_count(item)) local item = sellable_items[math.random(#sellable_items)]
-- Create trade offer -- Choose how many of this item will be sold to player
result = npc.trade.create_offer(npc.trade.OFFER_SELL, npc.get_item_name(item), nil, nil, count) local count = math.random(npc.get_item_count(item))
-- Create trade offer
result = npc.trade.create_offer(npc.trade.OFFER_SELL, npc.get_item_name(item), nil, nil, count)
end
end end
return result return result