@@ -2,6 +2,7 @@ os.setlocale("C", "numeric")
2
2
3
3
local scriptpath = engine .get_scriptdir ()
4
4
5
+ dofile (scriptpath .. DIR_DELIM .. " mainmenu_worldlist.lua" )
5
6
dofile (scriptpath .. DIR_DELIM .. " modmgr.lua" )
6
7
dofile (scriptpath .. DIR_DELIM .. " modstore.lua" )
7
8
dofile (scriptpath .. DIR_DELIM .. " gamemgr.lua" )
@@ -151,12 +152,16 @@ end
151
152
152
153
---- ----------------------------------------------------------------------------
153
154
function menu .update_gametype ()
155
+
156
+
157
+
154
158
if (menu .game_last_check == nil or
155
159
menu .game_last_check ~= menu .last_game ) and
156
160
tabbuilder .current_tab == " singleplayer" then
157
161
158
162
local gamedetails = menu .lastgame ()
159
163
engine .set_topleft_text (gamedetails .name )
164
+ worldlist .set_gamefilter (gamedetails .id )
160
165
161
166
-- background
162
167
local background_set = false
198
203
199
204
---- ----------------------------------------------------------------------------
200
205
function menu .reset_gametype ()
206
+ worldlist .set_gamefilter (nil )
201
207
menu .game_last_check = nil
202
208
203
209
local path_background_texture = menu .basetexturedir .. " menu_background.png"
@@ -295,77 +301,30 @@ function update_menu()
295
301
end
296
302
297
303
---- ----------------------------------------------------------------------------
298
- function menu .filtered_game_list ()
304
+ function menu .render_world_list ()
299
305
local retval = " "
300
-
301
- local current_game = menu .lastgame ()
302
306
303
- for i = 1 ,# menu .worldlist ,1 do
304
- if menu .worldlist [i ].gameid == current_game .id then
305
- if retval ~= " " then
306
- retval = retval .. " ,"
307
- end
308
-
309
- retval = retval .. menu .worldlist [i ].name ..
310
- " \\ [" .. menu .worldlist [i ].gameid .. " \\ ]"
311
- end
312
- end
307
+ local current_worldlist = worldlist .get_list ()
313
308
314
- return retval
315
- end
316
-
317
- ---- ----------------------------------------------------------------------------
318
- function menu .filtered_game_list_raw ()
319
- local retval = {}
320
-
321
- local current_game = menu .lastgame ()
322
-
323
- for i = 1 ,# menu .worldlist ,1 do
324
- if menu .worldlist [i ].gameid == current_game .id then
325
- table.insert (retval ,menu .worldlist [i ])
326
- end
327
- end
328
-
329
- return retval
330
- end
331
-
332
- ---- ----------------------------------------------------------------------------
333
- function menu .filtered_index_to_plain (filtered_index )
334
-
335
- local current_game = menu .lastgame ()
336
-
337
- local temp_idx = 0
338
-
339
- if menu .worldlist == nil then
340
- return - 1
341
- end
342
-
343
- for i = 1 ,# menu .worldlist ,1 do
344
- if menu .worldlist [i ].gameid == current_game .id then
345
- temp_idx = temp_idx + 1
309
+ for i ,v in ipairs (current_worldlist ) do
310
+ if retval ~= " " then
311
+ retval = retval .. " ,"
346
312
end
347
313
348
- if temp_idx == filtered_index then
349
- return i
350
- end
314
+ retval = retval .. v .name ..
315
+ " \\ [" .. v .gameid .. " \\ ]"
351
316
end
352
- return - 1
317
+
318
+ return retval
353
319
end
354
320
355
321
---- ----------------------------------------------------------------------------
356
322
function menu .init ()
357
323
-- init menu data
358
324
gamemgr .update_gamelist ()
359
-
360
- menu .worldlist = engine .get_worlds ()
361
325
362
- menu .last_world = tonumber (engine .setting_get (" main_menu_last_world_idx" ))
363
326
menu .last_game = tonumber (engine .setting_get (" main_menu_last_game_idx" ))
364
327
365
- if type (menu .last_world ) ~= " number" then
366
- menu .last_world = 1
367
- end
368
-
369
328
if type (menu .last_game ) ~= " number" then
370
329
menu .last_game = 1
371
330
end
@@ -405,41 +364,50 @@ function menu.lastgame()
405
364
end
406
365
407
366
---- ----------------------------------------------------------------------------
408
- function menu .lastworld ()
409
- if menu .last_world ~= nil and
410
- menu .last_world > 0 and
411
- menu .last_world <= # menu .worldlist then
412
- return menu .worldlist [menu .last_world ]
367
+ function menu .update_last_game ()
368
+
369
+ local current_world = worldlist .get_raw_world (
370
+ engine .setting_get (" mainmenu_last_selected_world" )
371
+ )
372
+
373
+ if current_world == nil then
374
+ return
413
375
end
414
-
415
- if # menu .worldlist >= 1 then
416
- menu .last_world = 1
417
- return menu .worldlist [menu .last_world ]
376
+
377
+ for i = 1 ,# gamemgr .games ,1 do
378
+ if gamemgr .games [i ].id == current_world .gameid then
379
+ menu .last_game = i
380
+ engine .setting_set (" main_menu_last_game_idx" ,menu .last_game )
381
+ break
382
+ end
418
383
end
419
-
420
- -- error case!!
421
- return nil
422
384
end
423
385
424
386
---- ----------------------------------------------------------------------------
425
- function menu .update_last_game (world_idx )
426
- if gamedata .selected_world <= # menu .worldlist then
427
- local world = menu .worldlist [gamedata .selected_world ]
387
+ function menu .handle_key_up_down (fields ,textlist ,settingname )
388
+
389
+ if fields [" key_up" ] then
390
+ local oldidx = engine .get_textlist_index (textlist )
428
391
429
- if world == nil then
430
- return
392
+ if oldidx > 1 then
393
+ local newidx = oldidx - 1
394
+ engine .setting_set (settingname ,
395
+ worldlist .get_engine_index (newidx ))
431
396
end
397
+ end
398
+
399
+ if fields [" key_down" ] then
400
+ local oldidx = engine .get_textlist_index (textlist )
432
401
433
- for i = 1 ,# gamemgr .games ,1 do
434
- if gamemgr .games [i ].id == world .gameid then
435
- menu .last_game = i
436
- engine .setting_set (" main_menu_last_game_idx" ,menu .last_game )
437
- break
438
- end
402
+ if oldidx < worldlist .size () then
403
+ local newidx = oldidx + 1
404
+ engine .setting_set (settingname ,
405
+ worldlist .get_engine_index (newidx ))
439
406
end
440
407
end
441
408
end
442
409
410
+
443
411
---- ----------------------------------------------------------------------------
444
412
function menubar .handle_buttons (fields )
445
413
for i = 1 ,# menubar .buttons ,1 do
535
503
536
504
---- ----------------------------------------------------------------------------
537
505
function tabbuilder .dialog_delete_world ()
538
- return " label[2,2;Delete World \" " .. menu . lastworld () .name .. " \" ?]" ..
506
+ return " label[2,2;Delete World \" " .. worldlist . get_raw_list ()[ menu . world_to_del ] .name .. " \" ?]" ..
539
507
" button[3.5,4.2;2.6,0.5;world_delete_confirm;Yes]" ..
540
508
" button[6,4.2;2.8,0.5;world_delete_cancel;No]"
541
509
end
@@ -594,19 +562,10 @@ function tabbuilder.handle_create_world_buttons(fields)
594
562
595
563
if gameindex > 0 and
596
564
worldname ~= " " then
597
- menu .worldlist = engine .get_worlds ()
598
-
599
- local found = false
600
- for i = 1 ,# menu .worldlist ,1 do
601
- if menu .worldlist [i ].name == worldname then
602
- found = true
603
- break
604
- end
605
- end
606
565
607
566
local message = nil
608
567
609
- if not found then
568
+ if not worldlist . exists ( worldname ) then
610
569
engine .setting_set (" mg_name" ,fields [" dd_mapgen" ])
611
570
message = engine .create_world (worldname ,gameindex )
612
571
else
@@ -618,25 +577,10 @@ function tabbuilder.handle_create_world_buttons(fields)
618
577
else
619
578
menu .last_game = gameindex
620
579
engine .setting_set (" main_menu_last_game_idx" ,gameindex )
621
- menu .worldlist = engine .get_worlds ()
622
-
623
- local worldlist = menu .worldlist
624
-
625
- if tabbuilder .current_tab == " singleplayer" then
626
- worldlist = menu .filtered_game_list_raw ()
627
- end
628
-
629
- local index = 0
630
580
631
- for i = 1 ,# worldlist ,1 do
632
- if worldlist [i ].name == worldname then
633
- index = i
634
- break
635
- end
636
- end
637
-
638
- engine .setting_set (" main_menu_singleplayer_world_idx" , index )
639
- menu .last_world = index
581
+ worldlist .refresh ()
582
+ engine .setting_set (" mainmenu_last_selected_world" ,
583
+ worldlist .engine_index_by_name (worldname ))
640
584
end
641
585
else
642
586
gamedata .errormessage = " No worldname given or no game selected"
@@ -648,6 +592,7 @@ function tabbuilder.handle_create_world_buttons(fields)
648
592
return
649
593
end
650
594
595
+ -- close dialog
651
596
tabbuilder .is_dialog = false
652
597
tabbuilder .show_buttons = true
653
598
tabbuilder .current_tab = engine .setting_get (" main_menu_tab" )
@@ -657,11 +602,11 @@ end
657
602
function tabbuilder .handle_delete_world_buttons (fields )
658
603
659
604
if fields [" world_delete_confirm" ] then
660
- if menu .last_world > 0 and
661
- menu .last_world <= # menu . worldlist then
662
- engine .delete_world (menu .last_world )
663
- menu .worldlist = engine . get_worlds ()
664
- menu . last_world = 1
605
+ if menu .world_to_del > 0 and
606
+ menu .world_to_del <= # worldlist . get_raw_list () then
607
+ engine .delete_world (menu .world_to_del )
608
+ menu .world_to_del = 0
609
+ worldlist . refresh ()
665
610
end
666
611
end
667
612
@@ -811,27 +756,12 @@ function tabbuilder.handle_server_buttons(fields)
811
756
world_doubleclick = true
812
757
end
813
758
if event .typ == " CHG" then
814
- engine .setting_set (" main_menu_last_world_idx" ,engine .get_textlist_index (" srv_worlds" ))
759
+ engine .setting_set (" mainmenu_last_selected_world" ,
760
+ worldlist .get_engine_index (engine .get_textlist_index (" srv_worlds" )))
815
761
end
816
762
end
817
763
818
- if fields [" key_up" ] then
819
- local oldidx = engine .get_textlist_index (" srv_worlds" )
820
-
821
- if oldidx > 1 then
822
- local newidx = oldidx - 1
823
- engine .setting_set (" main_menu_last_world_idx" ,newidx )
824
- end
825
- end
826
-
827
- if fields [" key_down" ] then
828
- local oldidx = engine .get_textlist_index (" srv_worlds" )
829
-
830
- if oldidx < # menu .worldlist then
831
- local newidx = oldidx + 1
832
- engine .setting_set (" main_menu_last_world_idx" ,newidx )
833
- end
834
- end
764
+ menu .handle_key_up_down (fields ," srv_worlds" ," mainmenu_last_selected_world" )
835
765
836
766
if fields [" cb_creative_mode" ] then
837
767
engine .setting_setbool (" creative_mode" ,tabbuilder .tobool (fields [" cb_creative_mode" ]))
@@ -845,21 +775,16 @@ function tabbuilder.handle_server_buttons(fields)
845
775
engine .setting_setbool (" server_announce" ,tabbuilder .tobool (fields [" cb_server_announce" ]))
846
776
end
847
777
848
-
849
778
if fields [" start_server" ] ~= nil or
850
779
world_doubleclick or
851
780
fields [" key_enter" ] then
852
781
local selected = engine .get_textlist_index (" srv_worlds" )
853
782
if selected > 0 then
854
-
855
783
gamedata .playername = fields [" te_playername" ]
856
784
gamedata .password = fields [" te_passwd" ]
857
785
gamedata .port = fields [" te_serverport" ]
858
786
gamedata .address = " "
859
- gamedata .selected_world = selected
860
-
861
- engine .setting_set (" main_menu_tab" ,tabbuilder .current_tab )
862
- engine .setting_set (" main_menu_last_world_idx" ,gamedata .selected_world )
787
+ gamedata .selected_world = worldlist .get_engine_index (selected )
863
788
864
789
menu .update_last_game (gamedata .selected_world )
865
790
engine .start ()
@@ -874,24 +799,26 @@ function tabbuilder.handle_server_buttons(fields)
874
799
875
800
if fields [" world_delete" ] ~= nil then
876
801
local selected = engine .get_textlist_index (" srv_worlds" )
877
- if selected > 0 then
878
- menu .last_world = engine .get_textlist_index (" srv_worlds" )
879
- if menu .lastworld () ~= nil and
880
- menu .lastworld ().name ~= nil and
881
- menu .lastworld ().name ~= " " then
802
+ if selected > 0 and
803
+ selected <= worldlist .size () then
804
+ local world = worldlist .get_list ()[selected ]
805
+ if world ~= nil and
806
+ world .name ~= nil and
807
+ world .name ~= " " then
808
+ menu .world_to_del = worldlist .get_engine_index (selected )
882
809
tabbuilder .current_tab = " dialog_delete_world"
883
810
tabbuilder .is_dialog = true
884
811
tabbuilder .show_buttons = false
885
812
else
886
- menu .last_world = 0
813
+ menu .world_to_del = 0
887
814
end
888
815
end
889
816
end
890
817
891
818
if fields [" world_configure" ] ~= nil then
892
819
selected = engine .get_textlist_index (" srv_worlds" )
893
820
if selected > 0 then
894
- modmgr .world_config_selected_world = selected
821
+ modmgr .world_config_selected_world = worldlist . get_engine_index ( selected )
895
822
if modmgr .init_worldconfig () then
896
823
tabbuilder .current_tab = " dialog_configure_world"
897
824
tabbuilder .is_dialog = true
@@ -970,27 +897,12 @@ function tabbuilder.handle_singleplayer_buttons(fields)
970
897
end
971
898
972
899
if event .typ == " CHG" then
973
- engine .setting_set (" main_menu_singleplayer_world_idx" ,engine .get_textlist_index (" sp_worlds" ))
900
+ engine .setting_set (" mainmenu_last_selected_world" ,
901
+ worldlist .get_engine_index (engine .get_textlist_index (" sp_worlds" )))
974
902
end
975
903
end
976
904
977
- if fields [" key_up" ] then
978
- local oldidx = engine .get_textlist_index (" sp_worlds" )
979
-
980
- if oldidx > 1 then
981
- local newidx = oldidx - 1
982
- engine .setting_set (" main_menu_singleplayer_world_idx" ,newidx )
983
- end
984
- end
985
-
986
- if fields [" key_down" ] then
987
- local oldidx = engine .get_textlist_index (" sp_worlds" )
988
-
989
- if oldidx < # menu .filtered_game_list_raw () then
990
- local newidx = oldidx + 1
991
- engine .setting_set (" main_menu_singleplayer_world_idx" ,newidx )
992
- end
993
- end
905
+ menu .handle_key_up_down (fields ," sp_worlds" ," mainmenu_last_selected_world" )
994
906
995
907
if fields [" cb_creative_mode" ] then
996
908
engine .setting_setbool (" creative_mode" ,tabbuilder .tobool (fields [" cb_creative_mode" ]))
@@ -1005,11 +917,8 @@ function tabbuilder.handle_singleplayer_buttons(fields)
1005
917
fields [" key_enter" ] then
1006
918
local selected = engine .get_textlist_index (" sp_worlds" )
1007
919
if selected > 0 then
1008
- gamedata .selected_world = menu . filtered_index_to_plain (selected )
920
+ gamedata .selected_world = worldlist . get_engine_index (selected )
1009
921
gamedata .singleplayer = true
1010
-
1011
- engine .setting_set (" main_menu_tab" ,tabbuilder .current_tab )
1012
- engine .setting_set (" main_menu_singleplayer_world_idx" ,selected )
1013
922
1014
923
menu .update_last_game (gamedata .selected_world )
1015
924
@@ -1025,24 +934,26 @@ function tabbuilder.handle_singleplayer_buttons(fields)
1025
934
1026
935
if fields [" world_delete" ] ~= nil then
1027
936
local selected = engine .get_textlist_index (" sp_worlds" )
1028
- if selected > 0 then
1029
- menu .last_world = menu .filtered_index_to_plain (selected )
1030
- if menu .lastworld () ~= nil and
1031
- menu .lastworld ().name ~= nil and
1032
- menu .lastworld ().name ~= " " then
937
+ if selected > 0 and
938
+ selected <= worldlist .size () then
939
+ local world = worldlist .get_list ()[selected ]
940
+ if world ~= nil and
941
+ world .name ~= nil and
942
+ world .name ~= " " then
943
+ menu .world_to_del = worldlist .get_engine_index (selected )
1033
944
tabbuilder .current_tab = " dialog_delete_world"
1034
945
tabbuilder .is_dialog = true
1035
946
tabbuilder .show_buttons = false
1036
947
else
1037
- menu .last_world = 0
948
+ menu .world_to_del = 0
1038
949
end
1039
950
end
1040
951
end
1041
952
1042
953
if fields [" world_configure" ] ~= nil then
1043
954
selected = engine .get_textlist_index (" sp_worlds" )
1044
955
if selected > 0 then
1045
- modmgr .world_config_selected_world = menu . filtered_index_to_plain (selected )
956
+ modmgr .world_config_selected_world = worldlist . get_engine_index (selected )
1046
957
if modmgr .init_worldconfig () then
1047
958
tabbuilder .current_tab = " dialog_configure_world"
1048
959
tabbuilder .is_dialog = true
@@ -1180,11 +1091,10 @@ end
1180
1091
1181
1092
---- ----------------------------------------------------------------------------
1182
1093
function tabbuilder .tab_server ()
1183
- local index = engine .setting_get (" main_menu_last_world_idx" )
1184
-
1185
- if index == nil then
1186
- index = 0
1187
- end
1094
+
1095
+ local index = worldlist .get_current_index (
1096
+ tonumber (engine .setting_get (" mainmenu_last_selected_world" ))
1097
+ )
1188
1098
1189
1099
local retval =
1190
1100
" button[4,4.15;2.6,0.5;world_delete;Delete]" ..
@@ -1203,20 +1113,9 @@ function tabbuilder.tab_server()
1203
1113
engine .setting_get (" name" ) .. " ]" ..
1204
1114
" pwdfield[0.8,4.2;3,0.5;te_passwd;Password]" ..
1205
1115
" field[0.8,5.2;3,0.5;te_serverport;Server Port;30000]" ..
1206
- " textlist[4,0.25;7.5,3.7;srv_worlds;"
1207
-
1208
- if # menu .worldlist > 0 then
1209
- retval = retval .. menu .worldlist [1 ].name ..
1210
- " \\ [" .. menu .worldlist [1 ].gameid .. " \\ ]"
1211
-
1212
- for i = 2 ,# menu .worldlist ,1 do
1213
- retval = retval .. " ," .. menu .worldlist [i ].name ..
1214
- " \\ [" .. menu .worldlist [i ].gameid .. " \\ ]"
1215
- end
1216
- retval = retval .. " ;" .. index .. " ]"
1217
- else
1218
- retval = retval .. " ;0]"
1219
- end
1116
+ " textlist[4,0.25;7.5,3.7;srv_worlds;" ..
1117
+ menu .render_world_list () ..
1118
+ " ;" .. index .. " ]"
1220
1119
1221
1120
return retval
1222
1121
end
@@ -1244,12 +1143,10 @@ end
1244
1143
1245
1144
---- ----------------------------------------------------------------------------
1246
1145
function tabbuilder .tab_singleplayer ()
1247
- local index = engine .setting_get (" main_menu_singleplayer_world_idx" )
1248
-
1249
- if index == nil or
1250
- # menu .filtered_game_list_raw () == 0 then
1251
- index = 0
1252
- end
1146
+
1147
+ local index = worldlist .get_current_index (
1148
+ tonumber (engine .setting_get (" mainmenu_last_selected_world" ))
1149
+ )
1253
1150
1254
1151
return " button[4,4.15;2.6,0.5;world_delete;Delete]" ..
1255
1152
" button[6.5,4.15;2.8,0.5;world_create;New]" ..
@@ -1262,7 +1159,7 @@ function tabbuilder.tab_singleplayer()
1262
1159
" checkbox[0.5,0.7;cb_enable_damage;Enable Damage;" ..
1263
1160
dump (engine .setting_getbool (" enable_damage" )) .. " ]" ..
1264
1161
" textlist[4,0.25;7.5,3.7;sp_worlds;" ..
1265
- menu .filtered_game_list () ..
1162
+ menu .render_world_list () ..
1266
1163
" ;" .. index .. " ]" ..
1267
1164
menubar .formspec
1268
1165
end
@@ -1406,8 +1303,10 @@ end
1406
1303
---- ----------------------------------------------------------------------------
1407
1304
---- ----------------------------------------------------------------------------
1408
1305
init_globals ()
1306
+ worldlist .init ()
1409
1307
menu .init ()
1410
1308
tabbuilder .init ()
1411
1309
menubar .refresh ()
1412
1310
modstore .init ()
1311
+
1413
1312
update_menu ()
0 commit comments