· 8 years ago · Dec 01, 2017, 10:34 PM
1-- ============================================================
2--
3-- Dialog Manager (dialog_manager.script)
4-- CoC 1.4.14 - DoctorX Questlines 1.9
5--
6-- Modified by: DoctorX
7-- Last revised: October 30, 2016
8--
9-- ============================================================
10
11
12--------------------------------------------------------------------------------
13-- Dialog manager --------------------------------------------------------------
14-- Made by Peacemaker ----------------------------------------------------------
15-- 11.01.08 --------------------------------------------------------------------
16--------------------------------------------------------------------------------
17-- modified by Alundaio
18
19RandomVal = 0
20disabled_phrases = {} -- temporary table of phrases which have been disabled during a conversation
21local quest_disabled_phrases = {} -- temporary table of phrases which have been disabled during a conversation
22local id_counter = 6 -- start from 5 because of adding root phrases
23
24phrase_table = {
25 hello = {},
26 job = {},
27 anomalies = {},
28 place = {},
29 information = {},
30 tips = {}
31 }
32priority_table = {
33 hello = {},
34 job = {},
35 anomalies = {},
36 place = {},
37 information = {},
38 tips = {}
39 }
40
41
42----------------------- Alundaio easy scripted_dialog
43local saved_dialog
44--local cond_list = {}
45function add_dialog(p_id,id,phrase_id,cond,act)
46 if not ( saved_dialog ) then
47 return
48 end
49
50 local phrase = saved_dialog:AddPhrase(phrase_id,tostring(id),tostring(p_id),-10000)
51 if not ( phrase ) then
52 return
53 end
54
55 --printf("phrase_id = %s",phrase_id)
56
57 local phrase_script = phrase:GetPhraseScript()
58 if ( cond ) then
59 if ( type(cond) == "table" ) then
60 for key, value in pairs(cond) do
61 if (alun_utils.findfunction(value,_G)) then
62 phrase_script:AddPrecondition(value)
63 --table.insert(cond_list,value)
64 else
65 printf("dialog_manager:Error: No such function exists '%s'",value)
66 end
67 end
68 else
69 if (alun_utils.findfunction(cond,_G)) then
70 phrase_script:AddPrecondition(cond)
71 --table.insert(cond_list,value)
72 else
73 printf("dialog_manager:Error: No such function exists '%s'",cond)
74 end
75 end
76 end
77
78 if ( act ) then
79 if ( type(act) == "table" ) then
80 for key, value in pairs(act) do
81 if (alun_utils.findfunction(value,_G)) then
82 phrase_script:AddAction(value)
83 else
84 printf("dialog_manager:Error: No such function exists '%s'",value)
85 end
86 end
87 else
88 if (alun_utils.findfunction(act,_G)) then
89 phrase_script:AddAction(act)
90 else
91 printf("dialog_manager:Error: No such function exists '%s'",act)
92 end
93 end
94 end
95 return phrase_script
96end
97
98function add_script_dialog(p_id,id,phrase_id,cond,act)
99 local d = add_dialog(p_id,id,phrase_id,cond,act)
100 if (d) then
101 d:SetScriptText(phrase_id)
102 end
103end
104
105
106-- ////////////////////////////////////////////////////////////////////////////////////////////////
107--
108-- drx_sl_init_honcho_meet_dialog function
109--
110-- ------------------------------------------------------------------------------------------------
111--
112-- Description:
113-- - Dialog on meeting honcho to receive random storyline quest
114--
115-- Usage:
116-- drx_sl_init_honcho_meet_dialog( )
117--
118-- Parameters:
119-- none
120--
121-- Return value (type: none):
122-- none, gives the player the specified task
123--
124-- ------------------------------------------------------------------------------------------------
125-- Created by DoctorX
126-- for DoctorX Questlines 1.6
127-- Last modified October 10, 2016
128-- ------------------------------------------------------------------------------------------------
129
130-- Dialog structure for Meet Honcho and random storyline quest:
131function drx_sl_init_honcho_meet_dialog( dialog )
132
133 saved_dialog = dialog
134 local base_id = 0
135
136 -- Actor greets honcho:
137 add_dialog( "", (base_id + 0), "st_drx_sl_meet_honcho" ) -- Actor
138
139 -- Honcho explains current storyline task:
140 add_script_dialog( (base_id + 0), (base_id + 1), "dialogs.drx_sl_text_honcho_has_storyline_task_to_give" ) -- NPC
141
142 -- Actor accepts non-fetch storyline task:
143 add_dialog( (base_id + 1), (base_id + 2), "st_drx_sl_accept_task", {"dialogs.not_task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"}, "dialogs.drx_sl_give_sl_task" ) -- Actor
144
145 -- Honcho affirms acceptance:
146 add_dialog( (base_id + 2), (base_id + 3), "st_drx_sl_task_accepted" ) -- NPC
147
148 -- Actor leaves honcho:
149 add_dialog( (base_id + 3), (base_id + 4), "st_drx_sl_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
150
151 -- Actor accepts fetch storyline task:
152 add_dialog( (base_id + 1), (base_id + 5), "st_drx_sl_accept_task", {"dialogs.task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"} ) -- Actor
153
154 -- Honcho explains fetch task
155 add_script_dialog( (base_id + 5), (base_id + 6), "dialogs.drx_sl_text_fetch_task", nil, "dialogs.drx_sl_give_sl_task" ) -- NPC
156
157 -- Actor leaves honcho:
158 add_dialog( (base_id + 6), (base_id + 7), "st_drx_sl_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
159
160end
161
162-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
163
164
165-- ////////////////////////////////////////////////////////////////////////////////////////////////
166--
167-- drx_sl_init_change_faction_dialog function
168--
169-- ------------------------------------------------------------------------------------------------
170--
171-- Description:
172-- - Dialog on requesting to change faction
173--
174-- Usage:
175-- drx_sl_init_change_faction_dialog( )
176--
177-- Parameters:
178-- none
179--
180-- Return value (type: none):
181-- none
182--
183-- ------------------------------------------------------------------------------------------------
184-- Created by DoctorX
185-- for DoctorX Questlines 1.6
186-- Last modified October 10, 2016
187-- ------------------------------------------------------------------------------------------------
188
189-- Dialog structure for changing factions:
190function drx_sl_init_change_faction_dialog( dialog )
191
192 saved_dialog = dialog
193 local base_id = 0
194
195 -- Actor requests to change factions:
196 add_dialog( "", (base_id + 0), "st_drx_sl_change_factions_request" ) -- Actor
197
198 -- NPC explains change factions task:
199 add_script_dialog( (base_id + 0), (base_id + 1), "dialogs.drx_sl_text_npc_has_change_factions_task_to_give" ) -- NPC
200
201 -- Actor accepts non-fetch change factions task:
202 add_dialog( (base_id + 1), (base_id + 2), "st_drx_sl_accept_change_factions_task", {"dialogs.not_task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"}, "dialogs.drx_sl_give_cf_task" ) -- Actor
203
204 -- NPC affirms acceptance:
205 add_dialog( (base_id + 2), (base_id + 3), "st_drx_sl_change_factions_task_accepted" ) -- NPC
206
207 -- Actor leaves NPC:
208 add_dialog( (base_id + 3), (base_id + 4), "st_drx_sl_change_factions_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
209
210 -- Actor accepts fetch change factions task:
211 add_dialog( (base_id + 1), (base_id + 5), "st_drx_sl_accept_change_factions_task", {"dialogs.task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"} ) -- Actor
212
213 -- NPC explains fetch task
214 add_script_dialog( (base_id + 5), (base_id + 6), "dialogs.drx_sl_text_fetch_task", nil, "dialogs.drx_sl_give_cf_task" ) -- NPC
215
216 -- Actor leaves honcho:
217 add_dialog( (base_id + 6), (base_id + 7), "st_drx_sl_change_factions_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
218
219 -- Actor refuses task and leaves NPC:
220 add_dialog( (base_id + 1), (base_id + 8), "dm_universal_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
221
222end
223
224-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
225
226
227-- ////////////////////////////////////////////////////////////////////////////////////////////////
228--
229-- drx_sl_init_mechanic_task_dialog function
230--
231-- ------------------------------------------------------------------------------------------------
232--
233-- Description:
234-- - Dialog for requesting mechanic task dialog
235--
236-- Usage:
237-- drx_sl_init_mechanic_task_dialog( )
238--
239-- Parameters:
240-- none
241--
242-- Return value (type: none):
243-- none
244--
245-- ------------------------------------------------------------------------------------------------
246-- Modified by DoctorX
247-- for DoctorX Questlines 1.6
248-- October 10, 2016
249-- ------------------------------------------------------------------------------------------------
250
251-- Dialog structure for requesting mechanic task:
252function drx_sl_init_mechanic_task_dialog( dialog )
253
254 saved_dialog = dialog
255 local base_id = 0
256
257 -- Actor requests task:
258 add_dialog( "", (base_id + 0), "st_ordered_task_query" ) -- Actor
259
260 -- Honcho offers task:
261 add_script_dialog( (base_id + 0), (base_id + 1), "dialogs.drx_sl_text_mechanic_has_ordered_task_to_give" ) -- Honcho
262
263 -- Actor accepts non-fetch task:
264 add_dialog( (base_id + 1), (base_id + 2), "st_ordered_task_accept", {"dialogs.not_task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"}, "dialogs.drx_sl_give_mechanic_task" ) -- Actor
265
266 -- Honcho affirms acceptance:
267 add_dialog( (base_id + 2), (base_id + 3), ("st_accepted_task_" .. math.random( 1,3 )) ) -- Honcho
268
269 -- Actor thanks honcho:
270 add_dialog( (base_id + 3), (base_id + 4), "dm_universal_actor_exit_thanks", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
271
272 -- Actor accepts fetch task:
273 add_dialog( (base_id + 1), (base_id + 5), "st_ordered_task_accept", {"dialogs.task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"} ) -- Actor
274
275 -- Honcho explains fetch task:
276 add_script_dialog( (base_id + 5), (base_id + 6), "dialogs.drx_sl_text_fetch_task", nil, "dialogs.drx_sl_give_mechanic_task" ) -- Honcho
277
278 -- Actor thanks honcho:
279 add_dialog( (base_id + 6), (base_id + 7), "dm_universal_actor_exit_thanks", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
280
281 -- Actor leaves honcho:
282 add_dialog( (base_id + 1), (base_id + 8), "dm_universal_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
283
284end
285
286-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
287
288
289-- ////////////////////////////////////////////////////////////////////////////////////////////////
290--
291-- drx_sl_task_completed_dialog function
292--
293-- ------------------------------------------------------------------------------------------------
294--
295-- Description:
296-- - Dialog after storyline task is completed
297--
298-- Usage:
299-- drx_sl_task_completed_dialog( )
300--
301-- Parameters:
302-- none
303--
304-- Return value (type: none):
305-- none
306--
307-- ------------------------------------------------------------------------------------------------
308-- Created by DoctorX
309-- for DoctorX Questlines 1.6
310-- Last modified October 10, 2016
311-- ------------------------------------------------------------------------------------------------
312
313-- Dialog structure for storyline task completed dialog:
314function drx_sl_task_completed_dialog( dialog )
315
316 saved_dialog = dialog
317
318 -- Actor returns to honcho and states job is done:
319 add_dialog( "", 0, "st_ordered_task_query_finished" ) -- Actor
320
321 -- Honcho replies and sends to next honcho:
322 add_script_dialog( 0, 1, "dialogs.drx_sl_text_task_finish", {"dialogs.drx_sl_actor_has_finished_task","dialogs.drx_sl_is_not_endgame"}, "dialogs.drx_sl_set_finished_task_complete" ) -- NPC
323
324 -- Honcho replies and sends on End Game task:
325 add_script_dialog( 0, 2, "dialogs.drx_sl_text_end_game", {"dialogs.drx_sl_actor_has_finished_task","dialogs.drx_sl_is_endgame"}, "dialogs.drx_sl_set_finished_task_complete_endgame" ) -- NPC
326
327 -- Actor thanks honcho and leaves:
328 add_dialog( 1, 3, "dm_universal_actor_exit_thanks" ) -- Actor
329
330end
331
332-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
333
334
335-- ////////////////////////////////////////////////////////////////////////////////////////////////
336--
337-- drx_sl_cf_task_completed_dialog function
338--
339-- ------------------------------------------------------------------------------------------------
340--
341-- Description:
342-- - Dialog after storyline task is completed
343--
344-- Usage:
345-- drx_sl_cf_task_completed_dialog( )
346--
347-- Parameters:
348-- none
349--
350-- Return value (type: none):
351-- none
352--
353-- ------------------------------------------------------------------------------------------------
354-- Created by DoctorX
355-- for DoctorX Questlines 1.6
356-- Last modified October 10, 2016
357-- ------------------------------------------------------------------------------------------------
358
359-- Dialog structure for storyline task completed dialog:
360function drx_sl_cf_task_completed_dialog( dialog )
361
362 saved_dialog = dialog
363
364 -- Actor returns to npc and states job is done:
365 add_dialog( "", 0, "st_ordered_task_query_finished" ) -- Actor
366
367 -- NPC replies:
368 add_script_dialog( 0, 1, "dialogs.drx_sl_text_cf_task_finish", {"dialogs.drx_sl_actor_has_finished_cf_task"}, "dialogs.drx_sl_set_finished_cf_task_complete" ) -- NPC
369
370 -- Actor thanks npc and leaves:
371 add_dialog( 1, 3, "dm_universal_actor_exit_thanks" ) -- Actor
372
373end
374
375-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
376
377-----------------------------------------------------
378-- Dynamic order Dialog
379-----------------------------------------------------
380function dm_init_dynamic_orders_dialog(dialog)
381 saved_dialog = dialog
382 local base_id = 1
383
384 add_dialog("",0,"st_dm_orders_query") -- ACTOR start order dialog
385 -- place order
386 add_script_dialog(0,1,"dialogs_orders.text_orders_query") -- NPC introduce list
387 for i=1,10 do
388 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 list
389 add_script_dialog(base_id+1,base_id+2,"dialogs_orders.text_offer_item") -- NPC
390 add_script_dialog(base_id+2,base_id+3,"dialogs_orders.text_accept_offer_item", "dialogs_orders.has_prepay", "dialogs_orders.give_prepay") -- ACTOR
391 add_script_dialog(base_id+3,base_id+4,"dialogs_orders.text_confirm_offer_item") -- NPC
392 add_dialog(base_id+4,base_id+5,"st_dm_orders_place_finish",nil,"dialogs.break_dialog") -- ACTOR
393 add_dialog(base_id+2,base_id+6,"st_dm_orders_no_money", "dialogs_orders.hasnt_prepay", "dialogs.break_dialog") -- ACTOR
394 add_dialog(base_id+2,base_id+7,"st_dm_orders_none",nil,"dialogs.break_dialog") -- ACTOR
395 base_id = base_id + 10
396 end
397 add_dialog(1,9999,"st_dm_orders_none",nil,"dialogs.break_dialog")
398end
399function dm_init_dynamic_orders_processing_dialog(dialog)
400 saved_dialog = dialog
401 local base_id = 1
402
403 add_dialog("",0,"st_dm_orders_query_pickup") -- ACTOR start processing order dialog
404 -- complete purchase existing
405 add_script_dialog(0,3000,"dialogs_orders.orders_item_pickup_existing","dialogs_orders.has_done_item") -- NPC existing Order Pickup
406 add_dialog(3000,3001,"st_dm_orders_pickup_existing_yes","dialogs_orders.has_item_cost") -- ACTOR
407 add_dialog(3001,3002,"st_dm_orders_pickup_finish",nil,"dialogs_orders.buy_item") -- NPC
408 add_dialog(3002,3003,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
409 add_dialog(3000,3010,"st_dm_orders_pickup_existing_no") -- ACTOR
410 add_dialog(3010,3011,"st_dm_orders_pickup_refuse_warning") -- NPC
411 add_dialog(3011,3012,"st_dm_orders_pickup_refuse_penalty") -- ACTOR
412 add_dialog(3012,3013,"st_dm_orders_pickup_refuse_penalty_reply",nil,"dialogs_orders.purchase_cancel") -- NPC
413 add_dialog(3013,3014,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
414 add_dialog(3011,3015,"st_dm_orders_pickup_refuse_wait") -- ACTOR
415 add_dialog(3015,3016,"st_dm_orders_pickup_refuse_wait_rely") -- NPC
416 add_dialog(3016,3017,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
417 add_dialog(3000,3020,"st_dm_orders_no_money","dialogs_orders.hasnt_item_cost") -- ACTOR
418 add_dialog(3020,3021,"st_dm_orders_pickup_hold") -- NPC
419 add_dialog(3021,3022,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
420 -- complete purchase
421 add_script_dialog(0,2000,"dialogs_orders.orders_item_pickup","dialogs_orders.has_pickup_cond","dialogs_orders.randomize_item") -- NPC Order Pickup
422 add_dialog(2000,2001,"st_dm_orders_pickup_price_accept","dialogs_orders.has_item_cost") -- ACTOR
423 add_dialog(2001,2003,"st_dm_orders_pickup_finish",nil,"dialogs_orders.buy_item") -- NPC
424 add_dialog(2003,2004,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
425 add_dialog(2000,2020,"st_dm_orders_no_money","dialogs_orders.hasnt_item_cost") -- ACTOR
426 add_dialog(2020,2021,"st_dm_orders_pickup_hold") -- NPC
427 add_dialog(2021,2022,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
428 add_dialog(2000,2030,"st_dm_orders_pickup_ponder","dialogs_orders.has_item_cost") -- ACTOR
429 add_dialog(2030,2031,"st_dm_orders_pickup_ponder_reply") -- NPC
430 add_dialog(2031,2032,"st_dm_orders_time_query_goodbye",nil,"dialogs.break_dialog") -- ACTOR
431 -- check and cancel ongoing order--
432 add_script_dialog(0,1000,"dialogs_orders.processing_item","dialogs_orders.has_processing_cond") -- NPC order processing
433 add_dialog(1000,1001,"st_dm_orders_time_query") -- ACTOR
434 add_dialog(1001,1002,"st_dm_orders_time_query_reply") -- NPC
435 add_dialog(1002,1003,"st_dm_orders_time_query_goodbye") -- ACTOR
436 add_dialog(1000,1010,"st_dm_orders_cancel") -- ACTOR
437 add_dialog(1010,1011,"st_dm_orders_cancel_reply") -- NPC
438 add_dialog(1011,1012,"st_dm_orders_cancel_reply_yes") -- ACTOR
439 add_dialog(1012,1013,"st_dm_orders_cancel_reply_yes_done",nil,"dialogs_orders.purchase_cancel") -- NPC
440 add_dialog(1013,1014,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
441 add_dialog(1011,1015,"st_dm_orders_cancel_reply_no") -- ACTOR
442 add_dialog(1015,1016,"st_dm_orders_cancel_reply_no_done") -- NPC
443 add_dialog(1016,1017,"st_dm_orders_goodbye",nil,"dialogs.break_dialog") -- ACTOR
444end
445-----------------------------------------------------
446-- Dynamic Ashot and Yar Dialog
447-----------------------------------------------------
448function dm_ashot_and_yar(a,b)
449 local npc = dialogs.who_is_npc(a,b)
450
451end
452-----------------------------------------------------
453-- Dynamic task Dialog
454-----------------------------------------------------
455
456
457-- ////////////////////////////////////////////////////////////////////////////////////////////////
458--
459-- dm_init_dynamic_task_dialog function
460--
461-- ------------------------------------------------------------------------------------------------
462--
463-- Description:
464-- - Dialog for requesting dynamic task from honcho
465--
466-- Usage:
467-- dm_init_dynamic_task_dialog( )
468--
469-- Parameters:
470-- none
471--
472-- Return value (type: none):
473-- none
474--
475-- ------------------------------------------------------------------------------------------------
476-- Modified by DoctorX
477-- for DoctorX Questlines 1.6
478-- Last modified October 10, 2016
479-- ------------------------------------------------------------------------------------------------
480
481-- Dialog structure for requesting dynamic task from honcho:
482function dm_init_dynamic_task_dialog(dialog)
483 saved_dialog = dialog
484
485 -- loop is necessary to allow skipping of unwanted tasks
486 local base_id = 0
487
488-- -- Loop is necessary to allow skipping of unwanted tasks:
489-- for i = 1,10 do
490
491 -- Actor requests task:
492 add_dialog( "", (base_id + 0), "st_ordered_task_query" ) -- Actor
493
494 -- Honcho offers task:
495 add_script_dialog( (base_id + 0), (base_id + 1), "dialogs.text_npc_has_ordered_task_to_give" ) -- Honcho
496
497 -- Actor accepts non-fetch task:
498 add_dialog( (base_id + 1), (base_id + 2), "st_ordered_task_accept", {"dialogs.not_task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"}, "dialogs.npc_give_last_task_id" ) -- Actor
499
500 -- Honcho affirms acceptance:
501 add_dialog( (base_id + 2), (base_id + 3), ("st_accepted_task_" .. math.random( 1,3 )) ) -- Honcho
502
503 -- Actor thanks honcho:
504 add_dialog( (base_id + 3), (base_id + 4), "dm_universal_actor_exit_thanks", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
505
506 -- Actor accepts fetch task:
507 add_dialog( (base_id + 1), (base_id + 5), "st_ordered_task_accept", {"dialogs.task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"} ) -- Actor
508
509 -- Honcho explains fetch task:
510 add_script_dialog( (base_id + 5), (base_id + 6), "dialogs.drx_sl_text_fetch_task", nil, "dialogs.npc_give_last_task_id" ) -- Honcho
511
512 -- Actor thanks honcho:
513 add_dialog( (base_id + 6), (base_id + 7), "dm_universal_actor_exit_thanks", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
514
515-- -- Actor refuses offered task and requests another:
516-- add_dialog( (base_id + 1), (base_id + 10), "st_ordered_task_next", "dialogs.npc_has_ordered_task_to_give", "dialogs.npc_skip_first_ordered_task" ) -- Actor
517
518 -- Actor leaves honcho:
519 add_dialog( (base_id + 1), (base_id + 8), "dm_universal_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
520
521-- base_id = (base_id + 10)
522
523-- end
524
525end
526
527-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
528
529
530-- ////////////////////////////////////////////////////////////////////////////////////////////////
531--
532-- dm_init_sim_dynamic_task_dialog function
533--
534-- ------------------------------------------------------------------------------------------------
535--
536-- Description:
537-- - Dialog for requesting dynamic task from NPC
538--
539-- Usage:
540-- dm_init_sim_dynamic_task_dialog( )
541--
542-- Parameters:
543-- none
544--
545-- Return value (type: none):
546-- none
547--
548-- ------------------------------------------------------------------------------------------------
549-- Modified by DoctorX
550-- for DoctorX Questlines 1.6
551-- Last modified October 10, 2016
552-- ------------------------------------------------------------------------------------------------
553
554-- Dialog structure for requesting dynamic task from NPC:
555function dm_init_sim_dynamic_task_dialog( dialog )
556
557 saved_dialog = dialog
558
559 local base_id = 0
560
561-- -- Loop is necessary to allow skipping of unwanted tasks:
562-- for i = 1, 10 do
563
564 -- Actor requests dynamic task:
565 add_dialog( "", (base_id + 0), "st_ordered_task_query" ) -- Actor
566
567 -- NPC offers task:
568 add_script_dialog( (base_id + 0), (base_id + 1), "dialogs.text_sim_npc_has_ordered_task_to_give" ) -- NPC
569
570 -- Actor accepts non-fetch task:
571 add_dialog( (base_id + 1), (base_id + 2), "st_ordered_task_accept", {"dialogs.not_task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"}, "dialogs.npc_sim_give_last_task_id" ) -- Actor
572
573 -- NPC affirms acceptance:
574 add_dialog( (base_id + 2), (base_id + 3), ("st_accepted_task_" .. math.random( 1,3 )) ) -- NPC
575
576 -- Actor thanks NPC:
577 add_dialog( (base_id + 3), (base_id + 4), "dm_universal_actor_exit_thanks", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
578
579 -- Actor accepts fetch task:
580 add_dialog( (base_id + 1), (base_id + 5), "st_ordered_task_accept", {"dialogs.task_is_fetch_task", "dialogs.npc_has_ordered_task_to_give"} ) -- Actor
581
582 -- NPC explains fetch task:
583 add_script_dialog( (base_id + 5), (base_id + 6), "dialogs.drx_sl_text_fetch_task", nil, "dialogs.npc_sim_give_last_task_id" ) -- NPC
584
585 -- Actor thanks NPC:
586 add_dialog( (base_id + 6), (base_id + 7), "dm_universal_actor_exit_thanks", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
587
588-- -- Actor refuses task and requests another:
589-- add_dialog( (base_id + 1), (base_id + 10), "st_ordered_task_next", "dialogs.npc_has_ordered_task_to_give", "dialogs.npc_sim_skip_first_ordered_task" ) -- Actor
590
591 -- Actor leaves NPC:
592 add_dialog( (base_id + 1), (base_id + 8), "dm_universal_actor_exit", nil, "dialogs.npc_clear_skipped_tasks" ) -- Actor
593
594-- base_id = (base_id + 10)
595
596-- end
597end
598
599-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
600
601
602-- ////////////////////////////////////////////////////////////////////////////////////////////////
603--
604-- dm_init_dynamic_task_completed_dialog function
605--
606-- ------------------------------------------------------------------------------------------------
607--
608-- Description:
609-- - Dialog for ending a task
610--
611-- Usage:
612-- dm_init_dynamic_task_completed_dialog( )
613--
614-- Parameters:
615-- none
616--
617-- Return value (type: none):
618-- none
619--
620-- ------------------------------------------------------------------------------------------------
621-- Modified by DoctorX
622-- for DoctorX Questlines 1.6
623-- Last modified October 15, 2016
624-- ------------------------------------------------------------------------------------------------
625
626-- Dialog structure for ending a task:
627function dm_init_dynamic_task_completed_dialog(dialog)
628
629 saved_dialog = dialog
630
631 add_dialog( "", 0, "st_ordered_task_query_finished" ) -- Actor
632
633 add_script_dialog( 0, 1, "dialogs.text_task_finish", "dialogs.actor_has_finished_ordered_task", "dialogs.npc_set_finished_task_complete" ) -- NPC
634
635 add_dialog( 1, 2, "dm_universal_actor_exit_thanks" ) -- Actor
636
637end
638
639-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
640
641
642-- ////////////////////////////////////////////////////////////////////////////////////////////////
643--
644-- dm_init_sim_dynamic_task_completed_dialog function
645--
646-- ------------------------------------------------------------------------------------------------
647--
648-- Description:
649-- - Dialog for ending a simulation task
650--
651-- Usage:
652-- dm_init_sim_dynamic_task_completed_dialog( )
653--
654-- Parameters:
655-- none
656--
657-- Return value (type: none):
658-- none
659--
660-- ------------------------------------------------------------------------------------------------
661-- Modified by DoctorX
662-- for DoctorX Questlines 1.6
663-- Last modified October 15, 2016
664-- ------------------------------------------------------------------------------------------------
665
666-- Dialog structure for ending a simulation task:
667function dm_init_sim_dynamic_task_completed_dialog(dialog)
668
669 saved_dialog = dialog
670
671 add_dialog( "", 0, "st_ordered_task_query_finished" ) -- Actor
672
673 add_script_dialog( 0, 1, "dialogs.text_sim_task_finish", "dialogs.actor_sim_has_finished_ordered_task", "dialogs.npc_sim_set_finished_task_complete" ) -- NPC
674
675 add_dialog( 1, 2, "dm_universal_actor_exit_thanks" ) -- Actor
676
677end
678
679-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
680function dm_init_dynamic_task_cancel_dialog(dialog)
681 saved_dialog = dialog
682 local base_id = 0
683
684 -- CANCEL TASKS
685 add_dialog("",base_id,"st_ordered_task_query_cancel","dialogs.actor_has_ongoing_task") -- ACTOR
686
687 for i=1,10 do
688 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_has_cancel_task") -- NPC <---|
689 add_script_dialog(base_id+1,base_id+2,"dialogs.text_actor_cancel_task","dialogs.npc_has_cancel_task","dialogs.npc_cancel_task") -- ACTOR |
690 add_script_dialog(base_id+2,base_id+3,"dialogs.text_task_cancel") -- NPC |
691 add_dialog(base_id+3,base_id+4,"dm_universal_actor_exit_sorry") -- ACTOR |
692 -- |
693 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 --->|
694 add_dialog(base_id+1,base_id+8,"dm_universal_actor_exit") -- ACTOR
695 base_id = base_id + 10
696 end
697end
698
699function dm_init_sim_dynamic_task_cancel_dialog(dialog)
700 saved_dialog = dialog
701 local base_id = 0
702
703 -- CANCEL TASKS
704 add_dialog("",base_id,"st_ordered_task_query_cancel","dialogs.sim_actor_has_ongoing_task") -- ACTOR
705
706 for i=1,10 do
707 add_script_dialog(base_id,base_id+1,"dialogs.text_npc_has_cancel_task") -- NPC <---|
708 add_script_dialog(base_id+1,base_id+2,"dialogs.text_actor_cancel_task","dialogs.npc_has_cancel_task","dialogs.npc_cancel_task") -- ACTOR |
709 add_script_dialog(base_id+2,base_id+3,"dialogs.text_task_cancel") -- NPC |
710 add_dialog(base_id+3,base_id+4,"dm_universal_actor_exit_sorry") -- ACTOR |
711 -- |
712 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 --->|
713 add_dialog(base_id+1,base_id+8,"dm_universal_actor_exit") -- ACTOR
714 base_id = base_id + 10
715 end
716end
717
718
719-- ////////////////////////////////////////////////////////////////////////////////////////////////
720--
721-- dm_init_dynamic_broker_dialog function
722--
723-- ------------------------------------------------------------------------------------------------
724--
725-- Description:
726-- - Dialog for PDA broker
727--
728-- Usage:
729-- dm_init_dynamic_broker_dialog( )
730--
731-- Parameters:
732-- none
733--
734-- Return value (type: none):
735-- none
736--
737-- ------------------------------------------------------------------------------------------------
738-- Modified by DoctorX
739-- for DoctorX Questlines 1.9
740-- Last modified October 30, 2016
741-- ------------------------------------------------------------------------------------------------
742
743-- Dialog structure for PDA broker:
744function dm_init_dynamic_broker_dialog(dialog)
745
746 saved_dialog = dialog
747
748 add_dialog("",0,"st_broker_query") -- Actor
749 add_dialog(0,1,"st_broker_npc_start_"..math.random(1,3)) -- NPC
750 add_script_dialog(1,2,"dialogs.text_actor_has_valuable_item","dialogs.condition_actor_has_valuable_item") -- Actor
751 add_dialog(2,3,"st_broker_npc_answer_pda_query") -- NPC
752 add_dialog(3,4,"st_broker_give_pda") -- Actor
753 add_script_dialog(4,5,"dialogs.text_trade_npc_pda") -- NPC
754-- add_dialog(5,0,"st_broker_query_more") -- Actor
755-- add_dialog(5,1111,"dm_universal_actor_exit_thanks") -- Actor
756 add_dialog(1,1111,"dm_universal_actor_exit") -- Actor
757
758end
759
760-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
761
762-----------------------------------------------------
763-- Dynamic Yar and Ashot Dialog
764-----------------------------------------------------
765function dm_init_dynamic_ashot_and_yar_dialog(dialog)
766 saved_dialog = dialog
767
768 add_dialog("",0,"jup_b19_freedom_yar_task_1_dm_query")
769
770 local script = add_dialog(0,1,"should not see this")
771 script:SetScriptText("dialogs_jupiter.dm_ashot_and_yar_generate_dialog")
772end
773
774-----------------------------------------------------
775-- Dynamic Repair Dialog
776-----------------------------------------------------
777function dm_init_dynamic_repair_dialog(dialog)
778 saved_dialog = dialog
779
780 add_dialog("",0,"st_mechanic_query_items")
781
782 local script = add_dialog(0,1,"st_mechanic_repair_not_done","inventory_upgrades.dont_has_repaired_items")
783 script:SetScriptText("inventory_upgrades.dm_repair_not_done")
784 add_dialog(0,2,"st_mechanic_repair_done","inventory_upgrades.has_repaired_items","inventory_upgrades.give_repaired_items")
785end
786
787
788-----------------------------------------------------
789-- Dynamic Surrender Dialog
790-----------------------------------------------------
791function dm_init_surrender_dialog(dialog)
792 saved_dialog = dialog
793
794 add_dialog("",0,"st_surrender_victim")
795
796 add_dialog(0,1,"st_surrender_query_victim_4","dialogs.victim_is_bounty")
797 add_script_dialog(1,9,"dialogs.surrender_victim_answers_bounty")
798 add_dialog(9,20,"st_surrender_actor_2",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
799 add_dialog(9,21,"st_surrender_actor_3",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
800
801 add_dialog(0,2,"st_surrender_query_victim_1")
802 add_script_dialog(2,10,"dialogs.surrender_victim_answers_1")
803 add_dialog(10,20,"st_surrender_actor_2",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
804 add_dialog(10,21,"st_surrender_actor_3",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
805
806 add_dialog(0,3,"st_surrender_query_victim_2")
807 add_script_dialog(3,11,"dialogs.surrender_victim_answers_1")
808 add_dialog(11,20,"st_surrender_actor_2",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
809 add_dialog(11,21,"st_surrender_actor_3",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
810
811 add_dialog(0,4,"st_surrender_query_victim_3")
812 add_script_dialog(4,12,"dialogs.surrender_victim_answers_2")
813 add_dialog(12,20,"st_surrender_actor_1",nil,{"dialogs.set_victim_surrendered","dialogs.break_dialog"})
814end
815
816
817-- End Alundaio
818-----------------------------------------------------------------------------
819
820-- Generate id for phrase
821function get_id()
822 id_counter = id_counter + 1
823 return id_counter
824end
825
826-- Parse ini file and store all phrases and their parameters into phrase table
827function fill_phrase_table()
828 local cfg = ini_file_ex("misc\\dialog_manager.ltx")
829 local function itr(section)
830 local val = cfg:r_value(section,"category") or "default"
831 local category = (val == "hello" or val == "anomalies" or val == "place" or val == "job" or val == "information" or val == "tips") and val or "default"
832 if (category ~= "default") then
833 local temp_table = {}
834 temp_table.info = {}
835 temp_table.id = tostring(get_id())
836 temp_table.name = section
837
838 local temp = cfg:r_value(section,"npc_community")
839 temp_table.npc_community = temp and parse_names(temp) or "not_set"
840
841 temp = cfg:r_value(section,"actor_community")
842 temp_table.actor_community = temp and parse_names(temp) or "not_set"
843
844 temp = cfg:r_value(section,"level")
845 temp_table.level = temp and parse_names(temp) or "not_set"
846
847 temp_table.once = tostring(cfg:r_value(section,"once",1)) or "always"
848 temp_table.wounded = tostring(cfg:r_value(section,"wounded",1)) or "false"
849
850 temp = cfg:r_value(section,"info")
851 if (temp and temp ~= "") then
852 xr_logic.parse_infop1(temp_table.info, temp)
853 end
854
855 temp_table.smart = cfg:r_value(section,"smart") or ""
856
857 phrase_table[category][temp_table.id] = temp_table
858 end
859 end
860
861 cfg.ini:section_for_each(itr)
862end
863
864-- Initialize npc start dialog
865function init_start_dialogs(dialog, str)
866 saved_dialog = dialog
867 --cond_list = empty_table(cond_list)
868
869 add_dialog("",0,"")
870 add_dialog(0,1,"",nil,"dialog_manager.fill_priority_"..str.."_table")
871
872 local ph
873 local p,d
874 local script
875 for k,v in pairs(phrase_table[str]) do
876 if (v.wounded == "true") then
877 script = add_dialog(1,v.id,v.name,{"dialogs.is_wounded","dialog_manager.precondition_"..str.."_dialogs"},"dialog_manager.action_"..str.."_dialogs")
878 if (script) then
879 ph = true
880 add_dialog(v.id,get_id(),"dm_wounded_medkit",{"dialogs.actor_have_medkit"},{"dialogs.transfer_medkit","dialogs.break_dialog"})
881 add_dialog(v.id,get_id(),"dm_wounded_sorry",nil,"dialogs.break_dialog")
882 end
883 else
884 add_dialog(1,v.id,v.name,{"dialogs.is_not_wounded","dialog_manager.precondition_"..str.."_dialogs"},"dialog_manager.action_"..str.."_dialogs")
885 ph = true
886 end
887 end
888
889 if not(ph) then
890 add_dialog(1,2,"dm_"..str.."_general")
891 end
892end
893
894-- Initialize new actor dialog
895function init_new_dialog(dialog)
896 local actor_table = { "job", "anomalies", "information", "tips" }
897
898 saved_dialog = dialog
899 add_dialog("",0,"dm_universal_actor_start")
900 add_dialog(0,1,"dm_universal_npc_start_"..math.random(1,4))
901
902 local ph,id,str
903
904 for i = 1,4 do
905 local id = get_id()
906 str = actor_table[i]
907
908 add_dialog(1,id,"dm_"..str.."_general_"..math.random(1,3),nil,"dialog_manager.fill_priority_"..str.."_table")
909 local id2 = get_id()
910 add_dialog(id,id2,"dm_no_more_"..math.random(1,10),"dialog_manager.precondition_"..str.."_dialogs_no_more")
911 add_dialog(id,id2,"dm_do_not_know_"..math.random(1,10),"dialog_manager.precondition_"..str.."_dialogs_do_not_know")
912
913 for k,v in pairs(phrase_table[str]) do
914 ph = true
915 add_dialog(id,v.id,v.name,"dialog_manager.precondition_"..str.."_dialogs","dialog_manager.action_"..str.."_dialogs")
916 end
917
918 if not (ph) then
919 add_dialog(id,id2,"dm_"..str.."_do_not_know_"..math.random(1,3))
920 end
921 end
922 add_dialog(1,get_id(),"dm_universal_actor_exit")
923end
924
925-- Fill selected priority table
926function fill_priority_table(npc, PT_subtable, PRT_subtable)
927 local npc_id = npc:id()
928 if(PRT_subtable[npc_id]==nil) then
929 PRT_subtable[npc_id] = {}
930 end
931
932 for num, phrase in pairs(PT_subtable) do
933 if (phrase) then
934 calculate_priority(PRT_subtable, phrase, npc, phrase.id)
935 end
936 end
937end
938
939function is_told(npc, str)
940 local id = npc:id()
941 if (priority_table[str] == nil or priority_table[str][id] == nil) then
942 return true
943 end
944 if priority_table[str][id].told == true then
945 return true
946 end
947 return false
948end
949-- Calculate precondition for default phrase in information dialog
950function precondition_no_more(npc, str, phrase_id)
951 local id = npc:id()
952 if (priority_table[str] == nil or priority_table[str][id] == nil) then
953 return true
954 end
955
956 local pr, id = get_highest_priority_phrase(phrase_table[str], priority_table[str], npc, phrase_id)
957 if(pr<0) or (id==0) then
958 printf("there is no avaliable "..str.." dialogs")
959 return true
960 end
961
962 if (PRT_subtable[id][phrase_id] == nil or PRT_subtable[id][phrase_id] == -1) then
963 return true
964 end
965
966 return false
967end
968
969-- Calculate phrase's preconditions
970function precondition(npc, PT_subtable, PRT_subtable, phrase_id,dialog_name)
971 if not (phrase_id) then
972 printf("dialog_manager: no pharse_id for dialog %s",dialog_name)
973 end
974
975 if not (PRT_subtable[npc:id()]) then
976 --printf("dialog_manager:Error:No PRT_subtable for %s with phrase_id=%s and dialog_name=%s",npc:name(),phrase_id,dialog_name)
977 reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
978 return false
979 end
980
981 if PRT_subtable[npc:id()] and PRT_subtable[npc:id()].told and PRT_subtable[npc:id()].told == true then
982 return false
983 end
984-- recalculate current phrase priority
985 local priority = calculate_priority(PRT_subtable, PT_subtable[phrase_id], npc, phrase_id)
986-- if current phrase is with highest priority - show it
987 return is_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
988end
989
990-- Calculate phrase priority
991function calculate_priority(PRT_subtable, PTID_subtable, npc, phrase_id)
992 if not (PTID_subtable) then
993 return
994 end
995
996 local f_level = false
997 local f_comm = false
998 local priority = -1
999 local npc_id = npc:id()
1000
1001 if(PTID_subtable.npc_community=="not_set") then
1002 f_comm = true
1003 elseif(PTID_subtable.npc_community[1]=="all") then
1004 priority = priority + 1
1005 f_comm = true
1006 else
1007 for i=1,#PTID_subtable.npc_community do
1008 if(PTID_subtable.npc_community[i]==character_community(npc)) then
1009 priority = priority + 2
1010 f_comm = true
1011 break
1012 end
1013 end
1014 priority = priority - 1
1015 end
1016
1017 if(PTID_subtable.level=="not_set") then
1018 f_level = true
1019 elseif(PTID_subtable.level[1]=="all") then
1020 priority = priority + 1
1021 f_level = true
1022 else
1023 for i=1,#PTID_subtable.level do
1024 if(PTID_subtable.level[i]==level.name()) then
1025 priority = priority + 2
1026 f_level = true
1027 break
1028 end
1029 end
1030 end
1031
1032 if(PTID_subtable.actor_community=="not_set") then
1033 priority = priority + 0
1034 elseif(PTID_subtable.actor_community=="all") then
1035 priority = priority + 1
1036 else
1037 for i=1,#PTID_subtable.actor_community do
1038 if(PTID_subtable.actor_community[i]==character_community(db.actor)) then
1039 priority = priority + 2
1040 break
1041 end
1042 end
1043 end
1044
1045 if(PTID_subtable.wounded=="true") then
1046 if not(xr_wounded.is_wounded(npc)) then
1047 priority = -1
1048 else
1049 priority = priority + 1
1050 end
1051 else
1052 if(xr_wounded.is_wounded(npc)) then
1053 priority = -1
1054 else
1055 priority = priority + 1
1056 end
1057 end
1058
1059 if f_comm == false or f_level == false then
1060 priority = -1
1061 end
1062
1063 if(PRT_subtable[npc_id].ignore_once) then
1064 if(PTID_subtable.once=="true") then
1065 priority = -1
1066 end
1067 end
1068
1069 if(PRT_subtable[npc_id][phrase_id]~=nil) and (PRT_subtable[npc_id][phrase_id]==255) then
1070-- if there was set the highest priority for phrase
1071 priority = 255
1072 end
1073
1074 for k,v in pairs(PTID_subtable.info) do
1075 if v.name then
1076 if v.required == true then
1077 if not has_alife_info(v.name) then
1078 priority = -1
1079 break
1080 end
1081 else
1082 if has_alife_info(v.name) then
1083 priority = -1
1084 break
1085 end
1086 end
1087 end
1088 end
1089
1090
1091 PRT_subtable[npc_id][phrase_id] = priority
1092 return priority
1093end
1094
1095-- Set phrase end action
1096function told(PRT_subtable, npc)
1097 PRT_subtable[npc:id()].told = true
1098end
1099
1100function action(PT_subtable, PRT_subtable, cur_phrase_id, npc)
1101 if not(PRT_subtable[npc:id()].ignore_once) then
1102 if(PT_subtable[cur_phrase_id].once=="true") then
1103 set_phrase_highest_priority(PT_subtable,PRT_subtable, npc, cur_phrase_id)
1104 end
1105 PRT_subtable[npc:id()].ignore_once = true
1106 end
1107end
1108
1109-- Set the highest priority to selected phrase
1110function set_phrase_highest_priority(PT_subtable, PRT_subtable, npc, phrase_id)
1111 local npc_id = npc:id()
1112 if(PRT_subtable[npc_id]~=nil) then
1113 PRT_subtable[npc_id][phrase_id] = 255
1114 else
1115 PRT_subtable[npc_id] = {}
1116 PRT_subtable[npc_id][phrase_id] = 255
1117 end
1118end
1119
1120-- Reset phrase priority
1121function reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
1122 if not (phrase_id) then
1123 return
1124 end
1125
1126 local npc_id = npc:id()
1127 if(PRT_subtable[npc_id]) then
1128 PRT_subtable[npc_id][phrase_id] = -1
1129 else
1130 PRT_subtable[npc_id] = {}
1131 PRT_subtable[npc_id][phrase_id] = calculate_priority(PRT_subtable, PT_subtable[phrase_id], npc, phrase_id)
1132 end
1133end
1134
1135-- Is the phrase priority the highest?
1136function is_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
1137 local npc_id = npc:id()
1138 if(PRT_subtable[npc_id]~=nil) then
1139-- if there is a subtable for this npc
1140 local id = phrase_id
1141 local pr = PRT_subtable[npc_id][phrase_id]
1142 if pr == nil or pr < 0 then
1143 return false
1144 end
1145 for phr_id, priority in pairs(PRT_subtable[npc_id]) do
1146-- iterate through array to get if selected phrase is with the highest priority
1147 if(phr_id~="ignore_once" and phr_id~="told") then
1148 if(priority>pr) then
1149 return false
1150 end
1151 end
1152 end
1153 return true
1154 else
1155 -- if there is no subtable for this npc - create it
1156 reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
1157 return false
1158 end
1159end
1160
1161-- Get the phrase with the highest priority
1162function get_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
1163 local npc_id = npc:id()
1164 if(PRT_subtable[npc_id]) then
1165 -- if there is a subtable for this npc
1166 local id = 0
1167 local pr = -1
1168 for phr_id, priority in pairs(PRT_subtable[npc_id]) do
1169 -- iterate through array for the highest priority phrase
1170 if(phr_id~="ignore_once" and phr_id~="told") then
1171 if(priority>pr) then
1172 pr = priority
1173 id = phr_id
1174 end
1175 end
1176 end
1177 return pr, id
1178 else
1179 -- if there is no subtable for this npc - create it
1180 reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
1181 return -1, 0
1182 end
1183end
1184--------------------------------------------------------------------------------
1185-- Initializing, filling priority tables, setting preconditions and actions
1186--------------------------------------------------------------------------------
1187-- Initialize npc hello start dialog
1188function init_hello_dialogs(dialog)
1189 init_start_dialogs(dialog, "hello")
1190end
1191
1192-- Fill phrase priority table for hello start dialog
1193function fill_priority_hello_table(actor, npc, dialog_name, phrase_id)
1194 fill_priority_table(npc, phrase_table.hello, priority_table.hello)
1195end
1196
1197-- Fill phrase priority table for new dialog
1198function fill_priority_job_table(actor, npc, dialog_name, phrase_id)
1199 fill_priority_table(npc, phrase_table.job, priority_table.job)
1200end
1201function fill_priority_anomalies_table(actor, npc, dialog_name, phrase_id)
1202 fill_priority_table(npc, phrase_table.anomalies, priority_table.anomalies)
1203end
1204--function fill_priority_place_table(actor, npc, dialog_name, phrase_id)
1205-- fill_priority_table(npc, phrase_table.place, priority_table.place)
1206--end
1207function fill_priority_information_table(actor, npc, dialog_name, phrase_id)
1208 fill_priority_table(npc, phrase_table.information, priority_table.information)
1209end
1210
1211function fill_priority_tips_table(actor, npc, dialog_name, phrase_id)
1212 fill_priority_table(npc, phrase_table.tips, priority_table.tips)
1213end
1214
1215-- Calculate precondition for phrases in hello start dialog
1216function precondition_hello_dialogs(npc, actor, dialog_name, parent_id, id)
1217 --printf("hello")
1218 return precondition(npc, phrase_table.hello, priority_table.hello, id,dialog_name)
1219end
1220-- Set phrase end action for hello start dialog
1221function action_hello_dialogs(npc, actor, dialog_name, id)
1222 action(phrase_table.hello, priority_table.hello, id, npc)
1223end
1224
1225-- Calculate precondition for default phrase in occupation dialog
1226function precondition_job_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
1227 if is_told(npc, "job") == true then
1228 return true
1229 end
1230 return false
1231end
1232
1233function precondition_job_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
1234 return precondition_no_more(npc, "job", id)
1235end
1236
1237-- Calculate preconditions for phrases in occupation dialog
1238function precondition_job_dialogs(npc, actor, dialog_name, parent_id, id)
1239 --printf("job")
1240 return precondition(npc, phrase_table.job, priority_table.job, id,dialog_name)
1241end
1242-- Set phrase end action for occupation dialog
1243function action_job_dialogs(npc, actor, dialog_name, id)
1244 action(phrase_table.job, priority_table.job, id, npc)
1245 told(priority_table.job, npc)
1246end
1247
1248-- Calculate precondition for default phrase in anomalies dialog
1249function precondition_anomalies_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
1250 if is_told(npc, "anomalies") == true then
1251 return true
1252 end
1253 return false
1254end
1255
1256function precondition_anomalies_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
1257 return precondition_no_more(npc, "anomalies", id)
1258end
1259-- Calculate preconditions for phrases in anomalies dialog
1260function precondition_anomalies_dialogs(npc, actor, dialog_name, parent_id, id)
1261 local smart = xr_gulag.get_npc_smart(npc)
1262 if priority_table.anomalies and priority_table.anomalies[npc:id()] and smart ~= nil and tostring(smart:name()) == phrase_table.anomalies[id].smart then
1263 priority_table.anomalies[npc:id()][id] = -1
1264 return false
1265 end
1266 --printf("anomalies")
1267 return precondition(npc, phrase_table.anomalies, priority_table.anomalies, id,dialog_name)
1268end
1269-- Set phrase end action for information dialog
1270function action_anomalies_dialogs(npc, actor, dialog_name, id)
1271 action(phrase_table.anomalies, priority_table.anomalies, id, npc)
1272 told(priority_table.anomalies, npc)
1273end
1274
1275-- Calculate precondition for default phrase in information dialog
1276function precondition_information_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
1277 if is_told(npc, "information") == true then
1278 return true
1279 end
1280 return false
1281end
1282
1283function precondition_information_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
1284 return precondition_no_more(npc, "information", id)
1285end
1286-- Calculate preconditions for phrases in information dialog
1287function precondition_information_dialogs(npc, actor, dialog_name, parent_id, id)
1288 --printf("info")
1289 return precondition(npc, phrase_table.information, priority_table.information, id,dialog_name)
1290end
1291-- Set phrase end action for information dialog
1292function action_information_dialogs(npc, actor, dialog_name, id)
1293 action(phrase_table.information, priority_table.information, id, npc)
1294 told(priority_table.information, npc)
1295end
1296
1297-- Tips
1298-- Calculate precondition for default phrase in information dialog
1299function precondition_tips_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
1300 if is_told(npc, "tips") == true then
1301 return true
1302 end
1303 return false
1304end
1305
1306function precondition_tips_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
1307 return precondition_no_more(npc, "tips", id)
1308end
1309-- Calculate preconditions for phrases in tips dialog
1310function precondition_tips_dialogs(npc, actor, dialog_name, parent_id, id)
1311 --printf("tips")
1312 return precondition(npc, phrase_table.tips, priority_table.tips, id,dialog_name)
1313end
1314-- Set phrase end action for tips dialog
1315function action_tips_dialogs(npc, actor, dialog_name, id)
1316 action(phrase_table.tips, priority_table.tips, id, npc)
1317 told(priority_table.tips, npc)
1318end
1319
1320local rnd = 0
1321
1322function precondition_is_phrase_disabled(fs,ss,dn,ppi,pi)
1323 local npc = dialogs.who_is_npc(fs, ss)
1324 if(pi=="") then
1325 pi = dn
1326 end
1327 if (disabled_phrases[npc:id()] and disabled_phrases[npc:id()][pi]) or
1328 (quest_disabled_phrases[npc:id()] and quest_disabled_phrases[npc:id()][pi]) then
1329 return false
1330 else
1331 return true
1332 end
1333end
1334
1335function action_disable_phrase(fs,ss,dn,pi)
1336 local npc = dialogs.who_is_npc(fs, ss)
1337 if(pi=="0") then
1338 pi = dn
1339 end
1340 if(disabled_phrases[npc:id()]==nil) then
1341 disabled_phrases[npc:id()] = {}
1342 end
1343 disabled_phrases[npc:id()][pi] = true
1344end
1345
1346function action_disable_quest_phrase(fs,ss,dn,pi)
1347 local npc = dialogs.who_is_npc(fs, ss)
1348 if(pi=="0") then
1349 pi = dn
1350 end
1351 if(quest_disabled_phrases[npc:id()]==nil) then
1352 quest_disabled_phrases[npc:id()] = {}
1353 end
1354 quest_disabled_phrases[npc:id()][pi] = true
1355end
1356
1357function create_bye_phrase()
1358 return game.translate_string("actor_break_dialog_"..RandomVal)
1359end
1360
1361function uni_dialog_precond(first_speaker, second_speaker)
1362 local npc = dialogs.who_is_npc(first_speaker, second_speaker)
1363 return character_community(npc) ~= "zombied" and character_community(npc) ~= "monolith"
1364end