· 8 years ago · Dec 06, 2017, 07:18 PM
1
2-------------------------------------------------------------------------------
3-- Dialog manager --------------------------------------------------------------
4-- Made by Peacemaker ----------------------------------------------------------
5-- 11.01.08 --------------------------------------------------------------------
6--------------------------------------------------------------------------------
7-- modified by Alundaio
8
9RandomVal = 0
10disabled_phrases = {} -- temporary table of phrases which have been disabled during a conversation
11local quest_disabled_phrases = {} -- temporary table of phrases which have been disabled during a conversation
12local id_counter = 6 -- start from 5 because of adding root phrases
13
14phrase_table = {
15 hello = {},
16 job = {},
17 anomalies = {},
18 place = {},
19 information = {},
20 tips = {}
21 }
22priority_table = {
23 hello = {},
24 job = {},
25 anomalies = {},
26 place = {},
27 information = {},
28 tips = {}
29 }
30
31
32----------------------- Alundaio easy scripted_dialog
33local saved_dialog
34--local cond_list = {}
35function add_dialog(p_id,id,phrase_id,cond,act)
36 if not ( saved_dialog ) then
37 return
38 end
39
40 local phrase = saved_dialog:AddPhrase(phrase_id,tostring(id),tostring(p_id),-10000)
41 if not ( phrase ) then
42 return
43 end
44
45 --printf("phrase_id = %s",phrase_id)
46
47 local phrase_script = phrase:GetPhraseScript()
48 if ( cond ) then
49 if ( type(cond) == "table" ) then
50 for key, value in pairs(cond) do
51 if (alun_utils.findfunction(value,_G)) then
52 phrase_script:AddPrecondition(value)
53 --table.insert(cond_list,value)
54 else
55 printf("dialog_manager:Error: No such function exists '%s'",value)
56 end
57 end
58 else
59 if (alun_utils.findfunction(cond,_G)) then
60 phrase_script:AddPrecondition(cond)
61 --table.insert(cond_list,value)
62 else
63 printf("dialog_manager:Error: No such function exists '%s'",cond)
64 end
65 end
66 end
67
68 if ( act ) then
69 if ( type(act) == "table" ) then
70 for key, value in pairs(act) do
71 if (alun_utils.findfunction(value,_G)) then
72 phrase_script:AddAction(value)
73 else
74 printf("dialog_manager:Error: No such function exists '%s'",value)
75 end
76 end
77 else
78 if (alun_utils.findfunction(act,_G)) then
79 phrase_script:AddAction(act)
80 else
81 printf("dialog_manager:Error: No such function exists '%s'",act)
82 end
83 end
84 end
85 return phrase_script
86end
87
88function add_script_dialog(p_id,id,phrase_id,cond,act)
89 local d = add_dialog(p_id,id,phrase_id,cond,act)
90 if (d) then
91 d:SetScriptText(phrase_id)
92 end
93end
94--[[
95-----------------------------------------------------
96-- Dynamic special ammo Dialog
97-----------------------------------------------------
98function dm_init_dynamic_spec_loads_prep_dialog(dialog)
99 saved_dialog = dialog
100
101 add_dialog("",0,"st_dm_spec_ammo_start") -- NPC Ammo offer dialog
102 add_dialog(0,1,"st_dm_spec_initial_ammo_query") -- ACTOR
103 add_dialog(1,2,"st_dm_spec_ammo_prep_detail") -- NPC
104 add_script_dialog(2,3,"dialogs_spec_ammo.slot_check_2_text","dialog_spec_ammo.slot_check_2","dialog_spec_ammo.lend_wpn_2_for_test") -- ACTOR
105 add_dialog(3,4,"st_dm_spec_ammo_prep_weapon_reply") -- NPC
106 add_dialog(4,5,"st_dm_spec_ammo_prep_weapon_goodbye",nil,"dialogs.break_dialog") -- ACTOR
107 add_script_dialog(2,6,"dialogs_spec_ammo.slot_check_3_text","dialog_spec_ammo.slot_check_3","dialog_spec_ammo.lend_wpn_3_for_test") -- ACTOR
108 add_dialog(6,7,"st_dm_spec_ammo_prep_weapon_reply") -- NPC
109 add_dialog(7,8,"st_dm_spec_ammo_prep_weapon_goodbye",nil,"dialogs.break_dialog") -- ACTOR
110 add_dialog(2,9999,"st_dm_spec_ammo_none",nil,"dialogs.break_dialog") -- ACTOR
111
112end
113
114function dm_init_dynamic_spec_loads_dialog(dialog)
115 saved_dialog = dialog
116end
117--]]
118-----------------------------------------------------
119-- Dynamic order Dialog random
120-----------------------------------------------------
121function dm_init_dynamic_orders_random_dialog(dialog)
122 saved_dialog = dialog
123 local base_id = 1
124
125 add_dialog("",0,"st_dm_orders_query") -- ACTOR start order dialog
126 -- place order
127 add_script_dialog(0,1,"dialogs_orders_random.text_orders_query") -- NPC introduce list
128 for i=1,10 do
129 add_script_dialog(1,base_id+1,"dialogs_orders_random.text_category_title_"..i,"dialogs_orders_random.has_category_"..i,"dialogs_orders_random.set_category_"..i) -- ACTOR show list
130 add_script_dialog(base_id+1,base_id+2,"dialogs_orders_random.text_offer_item") -- NPC
131 add_script_dialog(base_id+2,base_id+3,"dialogs_orders_random.text_accept_offer_item", "dialogs_orders_random.has_prepay", "dialogs_orders_random.give_prepay") -- ACTOR
132 add_script_dialog(base_id+3,base_id+4,"dialogs_orders_random.text_confirm_offer_item") -- NPC
133 add_dialog(base_id+4,base_id+5,"st_dm_orders_place_finish",nil,"dialogs.break_dialog") -- ACTOR
134 add_dialog(base_id+2,base_id+6,"st_dm_orders_no_money", "dialogs_orders_random.hasnt_prepay", "dialogs.break_dialog") -- ACTOR
135 add_dialog(base_id+2,base_id+7,"st_dm_orders_none",nil,"dialogs.break_dialog") -- ACTOR
136 base_id = base_id + 10
137 end
138 add_dialog(1,9999,"st_dm_orders_none",nil,"dialogs.break_dialog") -- ACTOR
139end
140function dm_init_dynamic_orders_processing_random_dialog(dialog)
141 saved_dialog = dialog
142 local base_id = 1
143
144 add_dialog("",0,"st_dm_orders_query_pickup") -- ACTOR start processing order dialog
145 -- complete purchase existing
146 add_script_dialog(0,3000,"dialogs_orders_random.orders_item_pickup_existing","dialogs_orders_random.has_done_item") -- NPC existing Order Pickup
147 add_dialog(3000,3001,"st_dm_orders_pickup_existing_yes","dialogs_orders_random.has_item_cost") -- ACTOR
148 add_dialog(3001,3002,"st_dm_orders_pickup_finish",nil,"dialogs_orders_random.buy_item") -- NPC
149 add_dialog(3002,3003,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
150 add_dialog(3000,3010,"st_dm_orders_pickup_existing_no") -- ACTOR
151 add_dialog(3010,3011,"st_dm_orders_pickup_refuse_warning") -- NPC
152 add_dialog(3011,3012,"st_dm_orders_pickup_refuse_penalty") -- ACTOR
153 add_dialog(3012,3013,"st_dm_orders_pickup_refuse_penalty_reply",nil,"dialogs_orders_random.purchase_cancel") -- NPC
154 add_dialog(3013,3014,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
155 add_dialog(3011,3015,"st_dm_orders_pickup_refuse_wait") -- ACTOR
156 add_dialog(3015,3016,"st_dm_orders_pickup_refuse_wait_rely") -- NPC
157 add_dialog(3016,3017,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
158 add_dialog(3000,3020,"st_dm_orders_no_money","dialogs_orders_random.hasnt_item_cost") -- ACTOR
159 add_dialog(3020,3021,"st_dm_orders_pickup_hold") -- NPC
160 add_dialog(3021,3022,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
161 -- complete purchase
162 add_script_dialog(0,2000,"dialogs_orders_random.orders_item_pickup","dialogs_orders_random.has_pickup_cond","dialogs_orders_random.randomize_item") -- NPC Order Pickup
163 add_dialog(2000,2001,"st_dm_orders_pickup_price_accept","dialogs_orders_random.has_item_cost") -- ACTOR
164 add_dialog(2001,2003,"st_dm_orders_pickup_finish",nil,"dialogs_orders_random.buy_item") -- NPC
165 add_dialog(2003,2004,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
166 add_dialog(2000,2020,"st_dm_orders_no_money","dialogs_orders_random.hasnt_item_cost") -- ACTOR
167 add_dialog(2020,2021,"st_dm_orders_pickup_hold") -- NPC
168 add_dialog(2021,2022,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
169 add_dialog(2000,2030,"st_dm_orders_pickup_ponder","dialogs_orders_random.has_item_cost") -- ACTOR
170 add_dialog(2030,2031,"st_dm_orders_pickup_ponder_reply") -- NPC
171 add_dialog(2031,2032,"st_dm_orders_time_query_goodbye",nil,"dialogs.break_dialog") -- ACTOR
172 -- check and cancel ongoing order--
173 add_script_dialog(0,1000,"dialogs_orders_random.processing_item","dialogs_orders_random.has_processing_cond") -- NPC Order processing
174 add_dialog(1000,1001,"st_dm_orders_time_query") -- ACTOR
175 add_dialog(1001,1002,"st_dm_orders_time_query_reply") -- NPC
176 add_dialog(1002,1003,"st_dm_orders_time_query_goodbye") -- ACTOR
177 add_dialog(1000,1010,"st_dm_orders_cancel") -- ACTOR
178 add_dialog(1010,1011,"st_dm_orders_cancel_reply") -- NPC
179 add_dialog(1011,1012,"st_dm_orders_cancel_reply_yes") -- ACTOR
180 add_dialog(1012,1013,"st_dm_orders_cancel_reply_yes_done",nil,"dialogs_orders_random.purchase_cancel") -- NPC
181 add_dialog(1013,1014,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
182 add_dialog(1011,1015,"st_dm_orders_cancel_reply_no") -- ACTOR
183 add_dialog(1015,1016,"st_dm_orders_cancel_reply_no_done") -- NPC
184 add_dialog(1016,1017,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
185end
186-----------------------------------------------------
187-- Dynamic order Dialog
188-----------------------------------------------------
189function dm_init_dynamic_orders_dialog(dialog)
190 saved_dialog = dialog
191 local base_id = 1
192 local base_id2 = 0
193 add_dialog("",0,"st_dm_orders_query") -- ACTOR start order dialog
194 -- place order
195 add_script_dialog(0,1,"dialogs_orders.text_orders_query") -- NPC introduce categories
196 for i=1,10 do
197 add_script_dialog(1,base_id+1,"dialogs_orders.text_category_title_"..i,"dialogs_orders.has_category_"..i,"dialogs_orders.set_category_"..i) -- ACTOR show categories
198 base_id2 = base_id*1000
199 add_script_dialog(base_id+1,base_id2,"dialogs_orders.text_item_offer_"..i) -- NPC introduce list
200 for j=1,10 do
201 add_script_dialog(base_id*1000,base_id2+1,"dialogs_orders.text_item_title_"..i..j,"dialogs_orders.has_item_"..i..j,"dialogs_orders.set_item_"..i..j)-- ACTOR show list
202 add_script_dialog(base_id2+1,base_id2+2,"dialogs_orders.text_offer_item") -- NPC
203 add_script_dialog(base_id2+2,base_id2+3,"dialogs_orders.text_accept_offer_item","dialogs_orders.has_prepay","dialogs_orders.give_prepay") -- ACTOR
204 add_script_dialog(base_id2+3,base_id2+4,"dialogs_orders.text_confirm_offer_item") -- NPC
205 add_dialog(base_id2+4,base_id2+5,"st_dm_orders_place_finish",nil,"dialogs.break_dialog") -- ACTOR
206 add_dialog(base_id2+2,base_id2+6,"st_dm_orders_no_money","dialogs_orders.hasnt_prepay") -- ACTOR
207 add_dialog(base_id2+2,base_id2+7,"st_dm_orders_none") -- ACTOR
208 base_id2 = base_id2 + 10
209 end
210 add_dialog(base_id*1000,base_id*1000 + 99999,"st_dm_orders_none",nil,"dialogs.break_dialog") -- ACTOR
211 base_id = base_id + 10
212 end
213 add_dialog(1,99999,"st_dm_orders_none",nil,"dialogs.break_dialog") -- ACTOR
214end
215function dm_init_dynamic_orders_processing_dialog(dialog)
216 saved_dialog = dialog
217
218 add_dialog("",0,"st_dm_orders_query_pickup") -- ACTOR start processing order dialog
219 -- complete purchase existing
220 add_script_dialog(0,2000,"dialogs_orders.text_orders_item_pickup","dialogs_orders.has_ready_item") -- NPC existing Order Pickup
221 add_dialog(2000,2001,"st_dm_orders_pickup_existing_yes","dialogs_orders.has_item_cost") -- ACTOR
222 add_dialog(2001,2002,"st_dm_orders_pickup_finish",nil,"dialogs_orders.buy_item") -- NPC
223 add_dialog(2002,2003,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
224 add_dialog(2000,2010,"st_dm_orders_pickup_existing_no") -- ACTOR
225 add_dialog(2010,2011,"st_dm_orders_pickup_refuse_warning") -- NPC
226 add_dialog(2011,2012,"st_dm_orders_pickup_refuse_penalty") -- ACTOR
227 add_dialog(2012,2013,"st_dm_orders_pickup_refuse_penalty_reply",nil,"dialogs_orders.purchase_cancel") -- NPC
228 add_dialog(2013,2014,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
229 add_dialog(2011,2015,"st_dm_orders_pickup_refuse_wait") -- ACTOR
230 add_dialog(2015,2016,"st_dm_orders_pickup_refuse_wait_rely") -- NPC
231 add_dialog(2016,2017,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
232 add_dialog(2000,2020,"st_dm_orders_no_money","dialogs_orders.hasnt_item_cost") -- ACTOR
233 add_dialog(2020,2021,"st_dm_orders_pickup_hold") -- NPC
234 add_dialog(2021,2022,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
235 add_dialog(2000,2030,"st_dm_orders_pickup_ponder","dialogs_orders.has_item_cost") -- ACTOR
236 add_dialog(2030,2031,"st_dm_orders_pickup_ponder_reply") -- NPC
237 add_dialog(2031,2032,"st_dm_orders_time_query_goodbye",nil,"dialogs.break_dialog") -- ACTOR
238 -- check and cancel ongoing order--
239 add_script_dialog(0,1000,"dialogs_orders.text_processing_item","dialogs_orders.has_processing_cond") -- NPC Order processing
240 add_dialog(1000,1001,"st_dm_orders_time_query") -- ACTOR
241 add_dialog(1001,1002,"st_dm_orders_time_query_reply") -- NPC
242 add_dialog(1002,1003,"st_dm_orders_time_query_goodbye") -- ACTOR
243 add_dialog(1000,1010,"st_dm_orders_cancel") -- ACTOR
244 add_dialog(1010,1011,"st_dm_orders_cancel_reply") -- NPC
245 add_dialog(1011,1012,"st_dm_orders_cancel_reply_yes") -- ACTOR
246 add_dialog(1012,1013,"st_dm_orders_cancel_reply_yes_done",nil,"dialogs_orders.purchase_cancel") -- NPC
247 add_dialog(1013,1014,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
248 add_dialog(1011,1015,"st_dm_orders_cancel_reply_no") -- ACTOR
249 add_dialog(1015,1016,"st_dm_orders_cancel_reply_no_done") -- NPC
250 add_dialog(1016,1017,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
251end
252-----------------------------------------------------
253-- Dynamic Ashot and Yar Dialog
254-----------------------------------------------------
255function dm_ashot_and_yar(a,b)
256 local npc = dialogs.who_is_npc(a,b)
257
258end
259-----------------------------------------------------
260-- Dynamic task Dialog
261-----------------------------------------------------
262function dm_init_dynamic_task_dialog(dialog)
263 saved_dialog = dialog
264
265 -- loop is necessary to allow skipping of unwanted tasks
266 local base_id = 0
267
268 -- ASK FOR AVAILABLE TASKS
269 add_dialog("",base_id,"st_ordered_task_query",nil,"dialogs.generate_available_tasks") -- ACTOR
270
271 for i=1,10 do
272 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_has_task") -- NPC <---|
273 add_dialog(base_id+1,base_id+2,"st_ordered_task_accept","dialogs.npc_has_task","dialogs.npc_give_task") -- ACTOR |
274 add_dialog(base_id+2,base_id+3,"st_accepted_task_"..math.random(1,3)) -- NPC |
275 add_dialog(base_id+3,base_id+4,"dm_universal_actor_exit_thanks") -- ACTOR |
276 -- |
277 add_dialog(base_id+1,base_id+10,"st_ordered_task_next","dialogs.npc_has_task","dialogs.npc_skip_task") -- ACTOR --->|
278 add_dialog(base_id+1,base_id+8,"dm_universal_actor_exit") -- ACTOR
279 base_id = base_id + 10
280 end
281end
282
283function dm_init_sim_dynamic_task_dialog(dialog)
284 saved_dialog = dialog
285
286 -- loop is necessary to allow skipping of unwanted tasks
287 local base_id = 0
288
289 -- ASK FOR AVAILABLE TASKS
290 add_dialog("",base_id,"st_ordered_task_query",nil,"dialogs.sim_generate_available_tasks") -- ACTOR
291
292 for i=1,10 do
293 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_has_task") -- NPC <---|
294 add_dialog(base_id+1,base_id+2,"st_ordered_task_accept","dialogs.npc_has_task","dialogs.npc_give_task") -- ACTOR |
295 add_dialog(base_id+2,base_id+3,"st_accepted_task_"..math.random(1,3)) -- NPC |
296 add_dialog(base_id+3,base_id+4,"dm_universal_actor_exit_thanks") -- ACTOR |
297 -- |
298 add_dialog(base_id+1,base_id+10,"st_ordered_task_next","dialogs.npc_has_task","dialogs.npc_skip_task") -- ACTOR --->|
299 add_dialog(base_id+1,base_id+8,"dm_universal_actor_exit") -- ACTOR
300 base_id = base_id + 10
301 end
302end
303
304function dm_init_dynamic_task_completed_dialog(dialog)
305 saved_dialog = dialog
306 local base_id = 0
307
308 -- TASK FINISHED TURN-IN
309 add_dialog("",base_id,"st_ordered_task_query_finished","dialogs.actor_has_finished_task") -- ACTOR
310 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_task_finish",nil,"dialogs.npc_set_finished_task_complete") -- NPC
311 add_dialog(base_id+1,base_id+2,"dm_universal_actor_exit_thanks") -- ACTOR
312end
313
314function dm_init_sim_dynamic_task_completed_dialog(dialog)
315 saved_dialog = dialog
316 local base_id = 0
317
318 -- TASK FINISHED TURN-IN
319 add_dialog("",base_id,"st_ordered_task_query_finished","dialogs.sim_actor_has_finished_task") -- ACTOR
320 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_task_finish",nil,"dialogs.npc_set_finished_task_complete") -- NPC
321 add_dialog(base_id+1,base_id+2,"dm_universal_actor_exit_thanks") -- ACTOR
322end
323
324function dm_init_dynamic_task_cancel_dialog(dialog)
325 saved_dialog = dialog
326 local base_id = 0
327
328 -- CANCEL TASKS
329 add_dialog("",base_id,"st_ordered_task_query_cancel","dialogs.actor_has_ongoing_task") -- ACTOR
330
331 for i=1,10 do
332 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_has_cancel_task") -- NPC <---|
333 add_script_dialog(base_id+1,base_id+2,"dialogs.text_actor_cancel_task","dialogs.npc_has_cancel_task","dialogs.npc_cancel_task") -- ACTOR |
334 add_script_dialog(base_id+2,base_id+3,"dialogs.text_task_cancel") -- NPC |
335 add_dialog(base_id+3,base_id+4,"dm_universal_actor_exit_sorry") -- ACTOR |
336 -- |
337 add_dialog(base_id+1,base_id+10,"st_ordered_task_query_cancel_next_job","dialogs.npc_has_cancel_task","dialogs.npc_skip_cancel_task") -- ACTOR --->|
338 add_dialog(base_id+1,base_id+8,"dm_universal_actor_exit") -- ACTOR
339 base_id = base_id + 10
340 end
341end
342
343function dm_init_sim_dynamic_task_cancel_dialog(dialog)
344 saved_dialog = dialog
345 local base_id = 0
346
347 -- CANCEL TASKS
348 add_dialog("",base_id,"st_ordered_task_query_cancel","dialogs.sim_actor_has_ongoing_task") -- ACTOR
349
350 for i=1,10 do
351 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_has_cancel_task") -- NPC <---|
352 add_script_dialog(base_id+1,base_id+2,"dialogs.text_actor_cancel_task","dialogs.npc_has_cancel_task","dialogs.npc_cancel_task") -- ACTOR |
353 add_script_dialog(base_id+2,base_id+3,"dialogs.text_task_cancel") -- NPC |
354 add_dialog(base_id+3,base_id+4,"dm_universal_actor_exit_sorry") -- ACTOR |
355 -- |
356 add_dialog(base_id+1,base_id+10,"st_ordered_task_query_cancel_next_job","dialogs.npc_has_cancel_task","dialogs.npc_skip_cancel_task") -- ACTOR --->|
357 add_dialog(base_id+1,base_id+8,"dm_universal_actor_exit") -- ACTOR
358 base_id = base_id + 10
359 end
360end
361
362-----------------------------------------------------
363-- Dynamic Broker Dialog
364-----------------------------------------------------
365function dm_init_dynamic_broker_dialog(dialog)
366 saved_dialog = dialog
367
368 add_dialog("",0,"st_broker_query") -- Actor
369 add_dialog(0,1,"st_broker_npc_start_"..math.random(1,3)) -- NPC
370 add_script_dialog(1,2,"dialogs.text_actor_has_valuable_item","dialogs.condition_actor_has_valuable_item") -- Actor
371 add_dialog(2,3,"st_broker_npc_answer_pda_query") -- NPC
372 add_dialog(3,4,"st_broker_give_pda") -- Actor
373 add_script_dialog(4,5,"dialogs.text_trade_npc_pda") -- NPC
374 add_dialog(5,0,"st_broker_query_more") -- Actor
375 add_dialog(5,1111,"dm_universal_actor_exit_thanks") -- Actor
376 add_dialog(1,1111,"dm_universal_actor_exit") -- Actor
377end
378
379-----------------------------------------------------
380-- Dynamic Yar and Ashot Dialog
381-----------------------------------------------------
382function dm_init_dynamic_ashot_and_yar_dialog(dialog)
383 saved_dialog = dialog
384
385 add_dialog("",0,"jup_b19_freedom_yar_task_1_dm_query")
386
387 local script = add_dialog(0,1,"should not see this")
388 script:SetScriptText("dialogs_jupiter.dm_ashot_and_yar_generate_dialog")
389end
390
391-----------------------------------------------------
392-- Dynamic Repair Dialog
393-----------------------------------------------------
394function dm_init_dynamic_repair_dialog(dialog)
395 saved_dialog = dialog
396
397 add_dialog("",0,"st_mechanic_query_items")
398
399 local script = add_dialog(0,1,"st_mechanic_repair_not_done","inventory_upgrades.dont_has_repaired_items")
400 script:SetScriptText("inventory_upgrades.dm_repair_not_done")
401 add_dialog(0,2,"st_mechanic_repair_done","inventory_upgrades.has_repaired_items","inventory_upgrades.give_repaired_items")
402end
403
404
405-----------------------------------------------------
406-- Dynamic Surrender Dialog
407-----------------------------------------------------
408function dm_init_surrender_dialog(dialog)
409 saved_dialog = dialog
410
411 add_dialog("",0,"st_surrender_victim")
412
413 add_dialog(0,1,"st_surrender_query_victim_4","dialogs.victim_is_bounty")
414 add_script_dialog(1,9,"dialogs.surrender_victim_answers_bounty")
415 add_dialog(9,20,"st_surrender_actor_2",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
416 add_dialog(9,21,"st_surrender_actor_3",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
417
418 add_dialog(0,2,"st_surrender_query_victim_1")
419 add_script_dialog(2,10,"dialogs.surrender_victim_answers_1")
420 add_dialog(10,20,"st_surrender_actor_2",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
421 add_dialog(10,21,"st_surrender_actor_3",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
422
423 add_dialog(0,3,"st_surrender_query_victim_2")
424 add_script_dialog(3,11,"dialogs.surrender_victim_answers_1")
425 add_dialog(11,20,"st_surrender_actor_2",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
426 add_dialog(11,21,"st_surrender_actor_3",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
427
428 add_dialog(0,4,"st_surrender_query_victim_3")
429 add_script_dialog(4,12,"dialogs.surrender_victim_answers_2")
430 add_dialog(12,20,"st_surrender_actor_1",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
431end
432
433
434-- End Alundaio
435-----------------------------------------------------------------------------
436
437-- Generate id for phrase
438function get_id()
439 id_counter = id_counter + 1
440 return id_counter
441end
442
443-- Parse ini file and store all phrases and their parameters into phrase table
444function fill_phrase_table()
445 local cfg = ini_file_ex("misc\\dialog_manager.ltx")
446 local function itr(section)
447 local val = cfg:r_value(section,"category") or "default"
448 local category = (val == "hello" or val == "anomalies" or val == "place" or val == "job" or val == "information" or val == "tips") and val or "default"
449 if (category ~= "default") then
450 local temp_table = {}
451 temp_table.info = {}
452 temp_table.id = tostring(get_id())
453 temp_table.name = section
454
455 local temp = cfg:r_value(section,"npc_community")
456 temp_table.npc_community = temp and parse_names(temp) or "not_set"
457
458 temp = cfg:r_value(section,"actor_community")
459 temp_table.actor_community = temp and parse_names(temp) or "not_set"
460
461 temp = cfg:r_value(section,"level")
462 temp_table.level = temp and parse_names(temp) or "not_set"
463
464 temp_table.once = tostring(cfg:r_value(section,"once",1)) or "always"
465 temp_table.wounded = tostring(cfg:r_value(section,"wounded",1)) or "false"
466
467 temp = cfg:r_value(section,"info")
468 if (temp and temp ~= "") then
469 xr_logic.parse_infop1(temp_table.info, temp)
470 end
471
472 temp_table.smart = cfg:r_value(section,"smart") or ""
473
474 phrase_table[category][temp_table.id] = temp_table
475 end
476 end
477
478 cfg.ini:section_for_each(itr)
479end
480
481-- Initialize npc start dialog
482function init_start_dialogs(dialog, str)
483 saved_dialog = dialog
484 --cond_list = empty_table(cond_list)
485
486 add_dialog("",0,"")
487 add_dialog(0,1,"",nil,"dialog_manager.fill_priority_"..str.."_table")
488
489 local ph
490 local p,d
491 local script
492 for k,v in pairs(phrase_table[str]) do
493 if (v.wounded == "true") then
494 script = add_dialog(1,v.id,v.name,{"dialogs.is_wounded","dialog_manager.precondition_"..str.."_dialogs"},"dialog_manager.action_"..str.."_dialogs")
495 if (script) then
496 ph = true
497 add_dialog(v.id,get_id(),"dm_wounded_medkit",{"dialogs.actor_have_medkit"},{"dialogs.transfer_medkit","dialogs.break_dialog"})
498 add_dialog(v.id,get_id(),"dm_wounded_sorry",nil,"dialogs.break_dialog")
499 end
500 else
501 add_dialog(1,v.id,v.name,{"dialogs.is_not_wounded","dialog_manager.precondition_"..str.."_dialogs"},"dialog_manager.action_"..str.."_dialogs")
502 ph = true
503 end
504 end
505
506 if not(ph) then
507 add_dialog(1,2,"dm_"..str.."_general")
508 end
509end
510
511-- Initialize new actor dialog
512function init_new_dialog(dialog)
513 local actor_table = { "job", "anomalies", "information", "tips" }
514
515 saved_dialog = dialog
516 add_dialog("",0,"dm_universal_actor_start")
517 add_dialog(0,1,"dm_universal_npc_start_"..math.random(1,4))
518
519 local ph,id,str
520
521 for i = 1,4 do
522 local id = get_id()
523 str = actor_table[i]
524
525 add_dialog(1,id,"dm_"..str.."_general_"..math.random(1,3),nil,"dialog_manager.fill_priority_"..str.."_table")
526 local id2 = get_id()
527 add_dialog(id,id2,"dm_no_more_"..math.random(1,10),"dialog_manager.precondition_"..str.."_dialogs_no_more")
528 add_dialog(id,id2,"dm_do_not_know_"..math.random(1,10),"dialog_manager.precondition_"..str.."_dialogs_do_not_know")
529
530 for k,v in pairs(phrase_table[str]) do
531 ph = true
532 add_dialog(id,v.id,v.name,"dialog_manager.precondition_"..str.."_dialogs","dialog_manager.action_"..str.."_dialogs")
533 end
534
535 if not (ph) then
536 add_dialog(id,id2,"dm_"..str.."_do_not_know_"..math.random(1,3))
537 end
538 end
539 add_dialog(1,get_id(),"dm_universal_actor_exit")
540end
541
542-- Fill selected priority table
543function fill_priority_table(npc, PT_subtable, PRT_subtable)
544 local npc_id = npc:id()
545 if(PRT_subtable[npc_id]==nil) then
546 PRT_subtable[npc_id] = {}
547 end
548
549 for num, phrase in pairs(PT_subtable) do
550 if (phrase) then
551 calculate_priority(PRT_subtable, phrase, npc, phrase.id)
552 end
553 end
554end
555
556function is_told(npc, str)
557 local id = npc:id()
558 if (priority_table[str] == nil or priority_table[str][id] == nil) then
559 return true
560 end
561 if priority_table[str][id].told == true then
562 return true
563 end
564 return false
565end
566-- Calculate precondition for default phrase in information dialog
567function precondition_no_more(npc, str, phrase_id)
568 local id = npc:id()
569 if (priority_table[str] == nil or priority_table[str][id] == nil) then
570 return true
571 end
572
573 local pr, id = get_highest_priority_phrase(phrase_table[str], priority_table[str], npc, phrase_id)
574 if(pr<0) or (id==0) then
575 printf("there is no avaliable "..str.." dialogs")
576 return true
577 end
578
579 if (PRT_subtable[id][phrase_id] == nil or PRT_subtable[id][phrase_id] == -1) then
580 return true
581 end
582
583 return false
584end
585
586-- Calculate phrase's preconditions
587function precondition(npc, PT_subtable, PRT_subtable, phrase_id,dialog_name)
588 if not (phrase_id) then
589 printf("dialog_manager: no pharse_id for dialog %s",dialog_name)
590 end
591
592 if not (PRT_subtable[npc:id()]) then
593 --printf("dialog_manager:Error:No PRT_subtable for %s with phrase_id=%s and dialog_name=%s",npc:name(),phrase_id,dialog_name)
594 reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
595 return false
596 end
597
598 if PRT_subtable[npc:id()] and PRT_subtable[npc:id()].told and PRT_subtable[npc:id()].told == true then
599 return false
600 end
601-- recalculate current phrase priority
602 local priority = calculate_priority(PRT_subtable, PT_subtable[phrase_id], npc, phrase_id)
603-- if current phrase is with highest priority - show it
604 return is_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
605end
606
607-- Calculate phrase priority
608function calculate_priority(PRT_subtable, PTID_subtable, npc, phrase_id)
609 if not (PTID_subtable) then
610 return
611 end
612
613 local f_level = false
614 local f_comm = false
615 local priority = -1
616 local npc_id = npc:id()
617
618 if(PTID_subtable.npc_community=="not_set") then
619 f_comm = true
620 elseif(PTID_subtable.npc_community[1]=="all") then
621 priority = priority + 1
622 f_comm = true
623 else
624 for i=1,#PTID_subtable.npc_community do
625 if(PTID_subtable.npc_community[i]==character_community(npc)) then
626 priority = priority + 2
627 f_comm = true
628 break
629 end
630 end
631 priority = priority - 1
632 end
633
634 if(PTID_subtable.level=="not_set") then
635 f_level = true
636 elseif(PTID_subtable.level[1]=="all") then
637 priority = priority + 1
638 f_level = true
639 else
640 for i=1,#PTID_subtable.level do
641 if(PTID_subtable.level[i]==level.name()) then
642 priority = priority + 2
643 f_level = true
644 break
645 end
646 end
647 end
648
649 if(PTID_subtable.actor_community=="not_set") then
650 priority = priority + 0
651 elseif(PTID_subtable.actor_community=="all") then
652 priority = priority + 1
653 else
654 for i=1,#PTID_subtable.actor_community do
655 if(PTID_subtable.actor_community[i]==character_community(db.actor)) then
656 priority = priority + 2
657 break
658 end
659 end
660 end
661
662 if(PTID_subtable.wounded=="true") then
663 if not(xr_wounded.is_wounded(npc)) then
664 priority = -1
665 else
666 priority = priority + 1
667 end
668 else
669 if(xr_wounded.is_wounded(npc)) then
670 priority = -1
671 else
672 priority = priority + 1
673 end
674 end
675
676 if f_comm == false or f_level == false then
677 priority = -1
678 end
679
680 if(PRT_subtable[npc_id].ignore_once) then
681 if(PTID_subtable.once=="true") then
682 priority = -1
683 end
684 end
685
686 if(PRT_subtable[npc_id][phrase_id]~=nil) and (PRT_subtable[npc_id][phrase_id]==255) then
687-- if there was set the highest priority for phrase
688 priority = 255
689 end
690
691 for k,v in pairs(PTID_subtable.info) do
692 if v.name then
693 if v.required == true then
694 if not has_alife_info(v.name) then
695 priority = -1
696 break
697 end
698 else
699 if has_alife_info(v.name) then
700 priority = -1
701 break
702 end
703 end
704 end
705 end
706
707
708 PRT_subtable[npc_id][phrase_id] = priority
709 return priority
710end
711
712-- Set phrase end action
713function told(PRT_subtable, npc)
714 PRT_subtable[npc:id()].told = true
715end
716
717function action(PT_subtable, PRT_subtable, cur_phrase_id, npc)
718 if not(PRT_subtable[npc:id()].ignore_once) then
719 if(PT_subtable[cur_phrase_id].once=="true") then
720 set_phrase_highest_priority(PT_subtable,PRT_subtable, npc, cur_phrase_id)
721 end
722 PRT_subtable[npc:id()].ignore_once = true
723 end
724end
725
726-- Set the highest priority to selected phrase
727function set_phrase_highest_priority(PT_subtable, PRT_subtable, npc, phrase_id)
728 local npc_id = npc:id()
729 if(PRT_subtable[npc_id]~=nil) then
730 PRT_subtable[npc_id][phrase_id] = 255
731 else
732 PRT_subtable[npc_id] = {}
733 PRT_subtable[npc_id][phrase_id] = 255
734 end
735end
736
737-- Reset phrase priority
738function reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
739 if not (phrase_id) then
740 return
741 end
742
743 local npc_id = npc:id()
744 if(PRT_subtable[npc_id]) then
745 PRT_subtable[npc_id][phrase_id] = -1
746 else
747 PRT_subtable[npc_id] = {}
748 PRT_subtable[npc_id][phrase_id] = calculate_priority(PRT_subtable, PT_subtable[phrase_id], npc, phrase_id)
749 end
750end
751
752-- Is the phrase priority the highest?
753function is_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
754 local npc_id = npc:id()
755 if(PRT_subtable[npc_id]~=nil) then
756-- if there is a subtable for this npc
757 local id = phrase_id
758 local pr = PRT_subtable[npc_id][phrase_id]
759 if pr == nil or pr < 0 then
760 return false
761 end
762 for phr_id, priority in pairs(PRT_subtable[npc_id]) do
763-- iterate through array to get if selected phrase is with the highest priority
764 if(phr_id~="ignore_once" and phr_id~="told") then
765 if(priority>pr) then
766 return false
767 end
768 end
769 end
770 return true
771 else
772 -- if there is no subtable for this npc - create it
773 reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
774 return false
775 end
776end
777
778-- Get the phrase with the highest priority
779function get_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
780 local npc_id = npc:id()
781 if(PRT_subtable[npc_id]) then
782 -- if there is a subtable for this npc
783 local id = 0
784 local pr = -1
785 for phr_id, priority in pairs(PRT_subtable[npc_id]) do
786 -- iterate through array for the highest priority phrase
787 if(phr_id~="ignore_once" and phr_id~="told") then
788 if(priority>pr) then
789 pr = priority
790 id = phr_id
791 end
792 end
793 end
794 return pr, id
795 else
796 -- if there is no subtable for this npc - create it
797 reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
798 return -1, 0
799 end
800end
801--------------------------------------------------------------------------------
802-- Initializing, filling priority tables, setting preconditions and actions
803--------------------------------------------------------------------------------
804-- Initialize npc hello start dialog
805function init_hello_dialogs(dialog)
806 init_start_dialogs(dialog, "hello")
807end
808
809-- Fill phrase priority table for hello start dialog
810function fill_priority_hello_table(actor, npc, dialog_name, phrase_id)
811 fill_priority_table(npc, phrase_table.hello, priority_table.hello)
812end
813
814-- Fill phrase priority table for new dialog
815function fill_priority_job_table(actor, npc, dialog_name, phrase_id)
816 fill_priority_table(npc, phrase_table.job, priority_table.job)
817end
818function fill_priority_anomalies_table(actor, npc, dialog_name, phrase_id)
819 fill_priority_table(npc, phrase_table.anomalies, priority_table.anomalies)
820end
821--function fill_priority_place_table(actor, npc, dialog_name, phrase_id)
822-- fill_priority_table(npc, phrase_table.place, priority_table.place)
823--end
824function fill_priority_information_table(actor, npc, dialog_name, phrase_id)
825 fill_priority_table(npc, phrase_table.information, priority_table.information)
826end
827
828function fill_priority_tips_table(actor, npc, dialog_name, phrase_id)
829 fill_priority_table(npc, phrase_table.tips, priority_table.tips)
830end
831
832-- Calculate precondition for phrases in hello start dialog
833function precondition_hello_dialogs(npc, actor, dialog_name, parent_id, id)
834 --printf("hello")
835 return precondition(npc, phrase_table.hello, priority_table.hello, id,dialog_name)
836end
837-- Set phrase end action for hello start dialog
838function action_hello_dialogs(npc, actor, dialog_name, id)
839 action(phrase_table.hello, priority_table.hello, id, npc)
840end
841
842-- Calculate precondition for default phrase in occupation dialog
843function precondition_job_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
844 if is_told(npc, "job") == true then
845 return true
846 end
847 return false
848end
849
850function precondition_job_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
851 return precondition_no_more(npc, "job", id)
852end
853
854-- Calculate preconditions for phrases in occupation dialog
855function precondition_job_dialogs(npc, actor, dialog_name, parent_id, id)
856 --printf("job")
857 return precondition(npc, phrase_table.job, priority_table.job, id,dialog_name)
858end
859-- Set phrase end action for occupation dialog
860function action_job_dialogs(npc, actor, dialog_name, id)
861 action(phrase_table.job, priority_table.job, id, npc)
862 told(priority_table.job, npc)
863end
864
865-- Calculate precondition for default phrase in anomalies dialog
866function precondition_anomalies_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
867 if is_told(npc, "anomalies") == true then
868 return true
869 end
870 return false
871end
872
873function precondition_anomalies_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
874 return precondition_no_more(npc, "anomalies", id)
875end
876-- Calculate preconditions for phrases in anomalies dialog
877function precondition_anomalies_dialogs(npc, actor, dialog_name, parent_id, id)
878 local smart = xr_gulag.get_npc_smart(npc)
879 if priority_table.anomalies and priority_table.anomalies[npc:id()] and smart ~= nil and tostring(smart:name()) == phrase_table.anomalies[id].smart then
880 priority_table.anomalies[npc:id()][id] = -1
881 return false
882 end
883 --printf("anomalies")
884 return precondition(npc, phrase_table.anomalies, priority_table.anomalies, id,dialog_name)
885end
886-- Set phrase end action for information dialog
887function action_anomalies_dialogs(npc, actor, dialog_name, id)
888 action(phrase_table.anomalies, priority_table.anomalies, id, npc)
889 told(priority_table.anomalies, npc)
890end
891
892-- Calculate precondition for default phrase in information dialog
893function precondition_information_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
894 if is_told(npc, "information") == true then
895 return true
896 end
897 return false
898end
899
900function precondition_information_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
901 return precondition_no_more(npc, "information", id)
902end
903-- Calculate preconditions for phrases in information dialog
904function precondition_information_dialogs(npc, actor, dialog_name, parent_id, id)
905 --printf("info")
906 return precondition(npc, phrase_table.information, priority_table.information, id,dialog_name)
907end
908-- Set phrase end action for information dialog
909function action_information_dialogs(npc, actor, dialog_name, id)
910 action(phrase_table.information, priority_table.information, id, npc)
911 told(priority_table.information, npc)
912end
913
914-- Tips
915-- Calculate precondition for default phrase in information dialog
916function precondition_tips_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
917 if is_told(npc, "tips") == true then
918 return true
919 end
920 return false
921end
922
923function precondition_tips_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
924 return precondition_no_more(npc, "tips", id)
925end
926-- Calculate preconditions for phrases in tips dialog
927function precondition_tips_dialogs(npc, actor, dialog_name, parent_id, id)
928 --printf("tips")
929 return precondition(npc, phrase_table.tips, priority_table.tips, id,dialog_name)
930end
931-- Set phrase end action for tips dialog
932function action_tips_dialogs(npc, actor, dialog_name, id)
933 action(phrase_table.tips, priority_table.tips, id, npc)
934 told(priority_table.tips, npc)
935end
936
937local rnd = 0
938
939function precondition_is_phrase_disabled(fs,ss,dn,ppi,pi)
940 local npc = dialogs.who_is_npc(fs, ss)
941 if(pi=="") then
942 pi = dn
943 end
944 if (disabled_phrases[npc:id()] and disabled_phrases[npc:id()][pi]) or
945 (quest_disabled_phrases[npc:id()] and quest_disabled_phrases[npc:id()][pi]) then
946 return false
947 else
948 return true
949 end
950end
951
952function action_disable_phrase(fs,ss,dn,pi)
953 local npc = dialogs.who_is_npc(fs, ss)
954 if(pi=="0") then
955 pi = dn
956 end
957 if(disabled_phrases[npc:id()]==nil) then
958 disabled_phrases[npc:id()] = {}
959 end
960 disabled_phrases[npc:id()][pi] = true
961end
962
963function action_disable_quest_phrase(fs,ss,dn,pi)
964 local npc = dialogs.who_is_npc(fs, ss)
965 if(pi=="0") then
966 pi = dn
967 end
968 if(quest_disabled_phrases[npc:id()]==nil) then
969 quest_disabled_phrases[npc:id()] = {}
970 end
971 quest_disabled_phrases[npc:id()][pi] = true
972end
973
974function create_bye_phrase()
975 return game.translate_string("actor_break_dialog_"..RandomVal)
976end
977
978function uni_dialog_precond(first_speaker, second_speaker)
979 local npc = dialogs.who_is_npc(first_speaker, second_speaker)
980 return character_community(npc) ~= "zombied" and character_community(npc) ~= "monolith"
981end