1// ================== 2// CAMPAIGN MENU 3// ================== 4 5// TODO 6// - Add alert if user tries to begin without selecting a load game 7// - Add info about a save when it becomes available 8// - Once we can get the data about a campaign in not just one chunk, display them better 9// - Several campaign windows not yet changed (end game, save game, etc.) 10// - Saving doesn't use fixed slots anymore 11// - cgame webapi support 12 13window campaign 14{ 15 { 16 background "ui/main_bg" 17 } 18 19 // Toolbar across the top of the screen 20 MainMenuToolbar mmtoolbar { } 21 22 // ================== 23 // buttons 24 // ================== 25 26 panel cmp_sel { 27 { 28 size "1024 435" 29 pos "0 90" 30 bgcolor "0.4 0.52 0.5 0.2" 31 } 32 33 MainMenuTab btn_new 34 { 35 pos "0 0" 36 string "_NEW" 37 bgcolor "0.4 0.515 0.5 1" 38 color "0 0 0 0.9" 39 onClick { cmd "toggle_cmp_new;" } 40 } 41 42 MainMenuTab btn_load 43 { 44 pos "135 0" 45 string "_LOAD" 46 onClick { cmd "toggle_cmp_load;" } 47 } 48 49 MainMenu3Btn btn_begin 50 { 51 size "250 30" 52 pos "774 405" 53 string "_BEGIN" 54 bgcolor "0.38 0.48 0.36 1" 55 onMouseEnter { *node:this@bgcolor = "0.59 0.78 0.56 1" } 56 onMouseLeave { *node:this@bgcolor = "0.38 0.48 0.36 1" } 57 onClick { cmd "cmp_sel_begin;" } 58 } 59 60 MainMenuExitBtn btn_back 61 { 62 size "250 30" 63 pos "514 405" 64 string "_BACK" 65 onClick { cmd "ui_pop;" } 66 } 67 68 // Campaigns and descriptions panel 69 panel cmp_cmps { 70 { 71 pos "10 50" 72 size "1014 355" 73 } 74 75 // List of campaigns 76 optionlist cmp_list 77 { 78 pos "10 0" 79 size "250 355" 80 lineheight "25" 81 dataid OPTION_CAMPAIGN_LIST 82 cvar *cvar:cp_campaign 83 onClick { cmd "campaignlist_click <lineselected>;" } 84 color "0.4 0.515 0.5 1" 85 selectcolor "1 1 1 1" 86 onChange { 87 cmd "cp_getdescription <cvar:cp_campaign>;" 88 } 89 } 90 91 // Description of selected campaign 92 text cmp_desc 93 { 94 dataid TEXT_STANDARD 95 pos "280 0" 96 size "720 355" 97 lineheight 20 98 rows 18 99 } 100 } 101 102 // List of saved games to load 103 panel cmp_saves 104 { 105 { 106 pos "10 50" 107 size "250 355" 108 layout LAYOUT_TOP_DOWN_FLOW 109 layoutMargin 5 110 invis true 111 } 112 113 TextBtn save0 { 114 string *cvar:mn_slot0 115 onClick { cmd "set_sel_load_slot 0;" } 116 } 117 118 TextBtn save1 { 119 string *cvar:mn_slot1 120 onClick { cmd "set_sel_load_slot 1;" } 121 } 122 123 TextBtn save2 { 124 string *cvar:mn_slot2 125 onClick { cmd "set_sel_load_slot 2;" } 126 } 127 128 TextBtn save3 { 129 string *cvar:mn_slot3 130 onClick { cmd "set_sel_load_slot 3;" } 131 } 132 133 TextBtn save4 { 134 string *cvar:mn_slot4 135 onClick { cmd "set_sel_load_slot 4;" } 136 } 137 138 TextBtn save5 { 139 string *cvar:mn_slot5 140 onClick { cmd "set_sel_load_slot 5;" } 141 } 142 143 TextBtn save6 { 144 string *cvar:mn_slot6 145 onClick { cmd "set_sel_load_slot 6;" } 146 } 147 148 TextBtn save7 { 149 string *cvar:mn_slot7 150 onClick { cmd "set_sel_load_slot 7;" } 151 } 152 } 153 } 154 155 // Save the proper load slot into a cvar to use later 156 confunc set_sel_load_slot { 157 // <1> = Number of the load slot 158 *cvar:sel_load_slot = <1> 159 *node:root.cmp_sel.btn_begin@ghost = false 160 *node:root.cmp_sel.btn_begin@bgcolor = "0.38 0.48 0.36 1" 161 *node:root.cmp_sel.btn_begin@color = "1 1 1 0.9" 162 163 // Remove white color from any button that might be saved 164 // Then add it back to the selected button 165 *cvar:i = 0; 166 while ( *cvar:i < 8 ) { 167 *node:root.cmp_sel.cmp_saves.save<cvar:i>@color = "1 1 1 0.5" 168 *cvar:i = ( *cvar:i + 1 ) 169 } 170 delete *cvar:i 171 *node:root.cmp_sel.cmp_saves.save<cvar:sel_load_slot>@color = "1 1 1 0.9" 172 } 173 174 // Tell the begin button what to do depending on the 175 // current selection (start campaign, load campaign) 176 confunc cmp_sel_begin { 177 if (*node:root.cmp_sel.cmp_saves@invis == true) { 178 cmd "cp_start <cvar:cp_campaign>;" 179 } 180 else { 181 if (*cvar:sel_load_slot == 0) { 182 cmd "game_load slot<cvar:sel_load_slot>;" 183 } 184 if (*cvar:sel_load_slot == 1) { 185 cmd "game_load slot<cvar:sel_load_slot>;" 186 } 187 if (*cvar:sel_load_slot == 2) { 188 cmd "game_load slot<cvar:sel_load_slot>;" 189 } 190 if (*cvar:sel_load_slot == 3) { 191 cmd "game_load slot<cvar:sel_load_slot>;" 192 } 193 if (*cvar:sel_load_slot == 4) { 194 cmd "game_load slot<cvar:sel_load_slot>;" 195 } 196 if (*cvar:sel_load_slot == 5) { 197 cmd "game_load slot<cvar:sel_load_slot>;" 198 } 199 if (*cvar:sel_load_slot == 6) { 200 cmd "game_load slot<cvar:sel_load_slot>;" 201 } 202 if (*cvar:sel_load_slot == 7) { 203 cmd "game_load slot<cvar:sel_load_slot>;" 204 } 205 /* 206 * It should be possible to check whether a save 207 * has been selected from the cvar and so avoid 208 * setting out all the if's, but I can't seem to 209 * figure out how to test if the cvar is false. 210 if (*cvar:sel_load_slot != false) { 211 cmd "game_load slot<cvar:sel_load_slot>;" 212 } 213 */ 214 else { 215 // Popup message that says SELECT A LOAD 216 } 217 218 // Remove unnecessary cvar 219 delete *cvar:sel_load_slot; 220 } 221 } 222 223 // Switch display when user chooses New Campaign/Load Campaign 224 confunc toggle_cmp_new { 225 *node:root.cmp_sel.btn_new@bgcolor = "0.4 0.515 0.5 1" 226 *node:root.cmp_sel.btn_new@color = "0 0 0 0.9" 227 *node:root.cmp_sel.btn_load@bgcolor = "0.4 0.515 0.5 0.25" 228 *node:root.cmp_sel.btn_load@color = "1 1 1 0.5" 229 *node:root.cmp_sel.cmp_cmps@invis = false 230 *node:root.cmp_sel.cmp_saves@invis = true 231 *node:root.cmp_sel.btn_begin@ghost = false 232 *node:root.cmp_sel.btn_begin@bgcolor = "0.38 0.48 0.36 1" 233 *node:root.cmp_sel.btn_begin@color = "1 1 1 0.9" 234 *node:root.cmp_sel.cmp_saves.save<cvar:sel_load_slot>@color = "0.4 0.515 0.5 1" 235 *cvar:sel_load_slot = false 236 } 237 confunc toggle_cmp_load { 238 *node:root.cmp_sel.btn_load@bgcolor = "0.4 0.515 0.5 1" 239 *node:root.cmp_sel.btn_load@color = "0 0 0 0.9" 240 *node:root.cmp_sel.btn_new@bgcolor = "0.4 0.515 0.5 0.25" 241 *node:root.cmp_sel.btn_new@color = "1 1 1 0.5" 242 *node:root.cmp_sel.cmp_cmps@invis = true 243 *node:root.cmp_sel.cmp_saves@invis = false 244 *node:root.cmp_sel.btn_begin@ghost = true 245 *node:root.cmp_sel.btn_begin@bgcolor = "1 1 1 0.1" 246 *node:root.cmp_sel.btn_begin@color = "1 1 1 0.3" 247 } 248 249 func onWindowOpened 250 { 251 cmd "set sel_load_slot 0;game_setmode;cp_getcampaigns;cp_getdescription <cvar:cp_campaign>;game_comments;toggle_cmp_new;" 252 } 253 254 // Fuzzy screen effect (see assets.ufo) 255 screen overlay { } 256} 257 258window campaign_main 259{ 260 /** @todo Remove me */ 261 { } // empty properties to fix parsing problem with "image" token (behaviour or property?) 262 263 // ================== 264 // background 265 // ================== 266 267 image background 268 { 269 src "background/main_bg" 270 } 271 272 string version 273 { 274 string *cvar:version 275 pos "10 744" 276 size "550 20" 277 } 278 279 // ================== 280 // buttons 281 // ================== 282 283 cmpMenuButton button_continue 284 { 285 string "_Continue" 286 tooltip "_Leave this menu and continue playing." 287 pos "640 170" 288 onClick { cmd "game_continue;" } 289 } 290 291 cmpMenuButton button_load 292 { 293 string "_Load" 294 pos "640 240" 295 onClick { cmd "ui_push load;" } 296 } 297 298 cmpMenuButton button_save 299 { 300 string "_Save" 301 pos "640 310" 302 onClick { cmd "ui_push save;" } 303 } 304 305 cmpMenuButton button_options 306 { 307 string "_Options" 308 pos "640 380" 309 onClick { cmd "ui_push options;" } 310 } 311 312 cmpMenuButton button_back 313 { 314 string "_Exit" 315 pos "640 520" 316 onClick { 317 if ( *cvar:mn_fastexit == 1 ) { 318 cmd "game_exit;" 319 } else { 320 cmd "ui_push popup_exit_confirmation;" 321 } 322 } 323 } 324} 325 326// ================== 327// QUICK LOAD MENU 328// ================== 329 330window quickload 331{ 332 { 333 string "_Reload campaign" 334 pos "264 262" 335 size "496 247" 336 background "ui/popup_alpha_tile" 337 dragbutton true 338 closebutton true 339 } 340 341 string name_label 342 { 343 string "_Are you sure that you really want to reload the last automatically saved campaign state?" 344 pos "26 58" 345 size "440 104" 346 longlines LONGLINES_WRAP 347 } 348 349 cmpPopupButton button_go 350 { 351 string "_Load" 352 pos "266 188" 353 onClick { cmd "ui_pop;game_quickload;" *cvar:mn_fastexit = 1; } 354 } 355} 356 357// ================== 358// LOAD MENU 359// ================== 360 361window load 362{ 363 /** @todo Remove me */ 364 { } // empty properties to fix parsing problem with "image" token (behaviour or property?) 365 366 // ================== 367 // background 368 // ================== 369 370 image background 371 { 372 src "background/main_bg" 373 } 374 375 string version 376 { 377 string *cvar:version 378 pos "10 744" 379 size "550 20" 380 } 381 382 string headline 383 { 384 string "_Load" 385 pos "610 170" 386 size "310 30" 387 contentalign ALIGN_UC 388 font "f_big" 389 } 390 391 // ================== 392 // slots 393 // ================== 394 395 button slot0 396 { 397 string "" 398 background "ui/button_green_verysmall" 399 pos "640 200" 400 size "256 32" 401 font "f_verysmall" 402 color "0 .78 0 1" 403 selectcolor "1 1 1 1" 404 contentalign ALIGN_CL 405 padding 8 406 onClick { cmd "game_load slot0; game_timestop;" *cvar:mn_fastexit = 1; } 407 } 408 button slot1 409 { 410 string "" 411 background "ui/button_green_verysmall" 412 pos "640 235" 413 size "256 34" 414 font "f_verysmall" 415 color "0 .78 0 1" 416 selectcolor "1 1 1 1" 417 contentalign ALIGN_CL 418 padding 8 419 onClick { cmd "game_load slot1; game_timestop;" *cvar:mn_fastexit = 1; } 420 } 421 button slot2 422 { 423 string "" 424 background "ui/button_green_verysmall" 425 pos "640 270" 426 size "256 34" 427 font "f_verysmall" 428 color "0 .78 0 1" 429 selectcolor "1 1 1 1" 430 contentalign ALIGN_CL 431 padding 8 432 onClick { cmd "game_load slot2; game_timestop;" *cvar:mn_fastexit = 1; } 433 } 434 button slot3 435 { 436 string "" 437 background "ui/button_green_verysmall" 438 pos "640 305" 439 size "256 34" 440 font "f_verysmall" 441 color "0 .78 0 1" 442 selectcolor "1 1 1 1" 443 contentalign ALIGN_CL 444 padding 8 445 onClick { cmd "game_load slot3; game_timestop;" *cvar:mn_fastexit = 1; } 446 } 447 button slot4 448 { 449 string "" 450 background "ui/button_green_verysmall" 451 pos "640 340" 452 size "256 34" 453 font "f_verysmall" 454 color "0 .78 0 1" 455 selectcolor "1 1 1 1" 456 contentalign ALIGN_CL 457 padding 8 458 onClick { cmd "game_load slot4; game_timestop;" *cvar:mn_fastexit = 1; } 459 } 460 button slot5 461 { 462 string "" 463 background "ui/button_green_verysmall" 464 pos "640 375" 465 size "256 34" 466 font "f_verysmall" 467 color "0 .78 0 1" 468 selectcolor "1 1 1 1" 469 contentalign ALIGN_CL 470 padding 8 471 onClick { cmd "game_load slot5; game_timestop;" *cvar:mn_fastexit = 1; } 472 } 473 button slot6 474 { 475 string "" 476 background "ui/button_green_verysmall" 477 pos "640 410" 478 size "256 34" 479 font "f_verysmall" 480 color "0 .78 0 1" 481 selectcolor "1 1 1 1" 482 contentalign ALIGN_CL 483 padding 8 484 onClick { cmd "game_load slot6; game_timestop;" *cvar:mn_fastexit = 1; } 485 } 486 button slot7 487 { 488 string "" 489 background "ui/button_green_verysmall" 490 pos "640 445" 491 size "256 34" 492 font "f_verysmall" 493 color "0 .78 0 1" 494 selectcolor "1 1 1 1" 495 contentalign ALIGN_CL 496 padding 8 497 onClick { cmd "game_load slot7; game_timestop;" *cvar:mn_fastexit = 1; } 498 } 499 500 // ================== 501 // buttons 502 // ================== 503 504 /** 505 * @param[in] <1> id of the savegame slot 506 * @param[in] <2> name of the savegame slot 507 * @param[in] <3> game date of the savegame slot 508 * @param[in] <4> real date of the savegame slot 509 */ 510 confunc update_save_game_info { 511 *cvar:mn_slot<1> = "<2> - <3>" 512 *node:root.slot<1>@string = *cvar:mn_slot<1> 513 *node:load.slot<1>@tooltip = "<4>" 514 *node:save.slot<1>@tooltip = "<4>" 515 } 516 517 cmpMenuButton button_back 518 { 519 string "_Back" 520 pos "640 520" 521 onClick { cmd "ui_pop;" } 522 } 523 524 func onWindowOpened 525 { 526 cmd "game_comments;" 527 } 528} 529 530// ================== 531// SAVE MENU 532// ================== 533 534window save 535{ 536 /** @todo Remove me */ 537 { } // empty properties to fix parsing problem with "image" token (behaviour or property?) 538 539 // ================== 540 // background 541 // ================== 542 543 image background 544 { 545 src "background/main_bg" 546 } 547 548 string version 549 { 550 string *cvar:version 551 pos "10 744" 552 size "550 20" 553 } 554 555 string headline 556 { 557 string "_Save" 558 pos "610 170" 559 size "310 30" 560 contentalign ALIGN_UC 561 font "f_big" 562 } 563 564 // ================== 565 // slots 566 // ================== 567 568 textentry slot0 569 { 570 string *cvar:mn_slot0 571 pos "640 200" 572 size "256 34" 573 background "ui/button_green_verysmall" 574 color "0 .78 0 1" 575 selectcolor "1 1 1 1" 576 contentalign ALIGN_CL 577 padding 8 578 font "f_verysmall" 579 onClick { cmd "game_savenamecleanup 0;" } 580 onChange { cmd "game_save slot0 *mn_slot0; game_comments 0;" *cvar:mn_fastexit = 1; } 581 onAbort { cmd "game_comments 0;" } 582 clickoutabort true 583 } 584 textentry slot1 585 { 586 string *cvar:mn_slot1 587 pos "640 235" 588 size "256 34" 589 background "ui/button_green_verysmall" 590 color "0 .78 0 1" 591 selectcolor "1 1 1 1" 592 contentalign ALIGN_CL 593 padding 8 594 font "f_verysmall" 595 onClick { cmd "game_savenamecleanup 1;" } 596 onChange { cmd "game_save slot1 *mn_slot1; game_comments 1;" *cvar:mn_fastexit = 1; } 597 onAbort { cmd "game_comments 1;" } 598 clickoutabort true 599 } 600 textentry slot2 601 { 602 string *cvar:mn_slot2 603 pos "640 270" 604 size "256 34" 605 background "ui/button_green_verysmall" 606 color "0 .78 0 1" 607 selectcolor "1 1 1 1" 608 contentalign ALIGN_CL 609 padding 8 610 font "f_verysmall" 611 onClick { cmd "game_savenamecleanup 2;" } 612 onChange { cmd "game_save slot2 *mn_slot2; game_comments 2;" *cvar:mn_fastexit = 1; } 613 onAbort { cmd "game_comments 2;" } 614 clickoutabort true 615 } 616 textentry slot3 617 { 618 string *cvar:mn_slot3 619 pos "640 305" 620 size "256 34" 621 background "ui/button_green_verysmall" 622 color "0 .78 0 1" 623 selectcolor "1 1 1 1" 624 contentalign ALIGN_CL 625 padding 8 626 font "f_verysmall" 627 onClick { cmd "game_savenamecleanup 3;" } 628 onChange { cmd "game_save slot3 *mn_slot3; game_comments 3;" *cvar:mn_fastexit = 1; } 629 onAbort { cmd "game_comments 3;" } 630 clickoutabort true 631 } 632 textentry slot4 633 { 634 string *cvar:mn_slot4 635 pos "640 340" 636 size "256 34" 637 background "ui/button_green_verysmall" 638 color "0 .78 0 1" 639 selectcolor "1 1 1 1" 640 contentalign ALIGN_CL 641 padding 8 642 font "f_verysmall" 643 onClick { cmd "game_savenamecleanup 4;" } 644 onChange { cmd "game_save slot4 *mn_slot4; game_comments 4;" *cvar:mn_fastexit = 1; } 645 onAbort { cmd "game_comments 4;" } 646 clickoutabort true 647 } 648 textentry slot5 649 { 650 string *cvar:mn_slot5 651 pos "640 375" 652 size "256 34" 653 background "ui/button_green_verysmall" 654 color "0 .78 0 1" 655 selectcolor "1 1 1 1" 656 contentalign ALIGN_CL 657 padding 8 658 font "f_verysmall" 659 onClick { cmd "game_savenamecleanup 5;" } 660 onChange { cmd "game_save slot5 *mn_slot5; game_comments 5;" *cvar:mn_fastexit = 1; } 661 onAbort { cmd "game_comments 5;" } 662 clickoutabort true 663 } 664 textentry slot6 665 { 666 string *cvar:mn_slot6 667 pos "640 410" 668 size "256 34" 669 background "ui/button_green_verysmall" 670 color "0 .78 0 1" 671 selectcolor "1 1 1 1" 672 contentalign ALIGN_CL 673 padding 8 674 font "f_verysmall" 675 onClick { cmd "game_savenamecleanup 6;" } 676 onChange { cmd "game_save slot6 *mn_slot6; game_comments 6;" *cvar:mn_fastexit = 1; } 677 onAbort { cmd "game_comments 6;" } 678 clickoutabort true 679 } 680 textentry slot7 681 { 682 string *cvar:mn_slot7 683 pos "640 445" 684 size "256 34" 685 background "ui/button_green_verysmall" 686 color "0 .78 0 1" 687 selectcolor "1 1 1 1" 688 contentalign ALIGN_CL 689 padding 8 690 font "f_verysmall" 691 onClick { cmd "game_savenamecleanup 7;" } 692 onChange { cmd "game_save slot7 *mn_slot7; game_comments 7;" *cvar:mn_fastexit = 1; } 693 onAbort { cmd "game_comments 7;" } 694 clickoutabort true 695 } 696 697 // ================== 698 // buttons 699 // ================== 700 701 cmpMenuButton button_back 702 { 703 string "_Back" 704 pos "640 520" 705 onClick { cmd "ui_pop;" } 706 } 707 708 func onWindowOpened 709 { 710 cmd "game_comments;" 711 } 712} 713 714// ================== 715// LOST GAME MENU 716// ================== 717 718window lostgame 719{ 720 /** @todo Remove me */ 721 { } // empty properties to fix parsing problem with "image" token (behaviour or property?) 722 723 image background 724 { 725 src "background/losegame_bg" 726 } 727 728 func onWindowOpened 729 { 730 cmd "music_stop;snd_music Crystan-LooseGame;" 731 } 732 733 string title 734 { 735 string "_You've lost the game" 736 pos "12 20" 737 size "1000 35" 738 font "f_menubig" 739 contentalign ALIGN_UC 740 color "0 0.8 0 1" 741 } 742 743 string lostgame_click 744 { 745 string "_Click to continue" 746 pos "814 750" 747 size "200 20" 748 font "f_verysmall" 749 contentalign ALIGN_UR 750 color "0 0.8 0 0.9" 751 ghost true 752 } 753 754 zone leave 755 { 756 pos "0 0" 757 size "1024 768" 758 onClick { 759 cmd "initmainui;" 760 } 761 } 762 763 // reason why you've lost 764 text reason 765 { 766 dataid TEXT_STANDARD 767 color "0 0.8 0 0.9" 768 bgcolor "0.2 0.2 0.2 0.4" 769 contentalign ALIGN_UC 770 pos "30 600" 771 size "960 140" 772 lineheight "20" 773 font "f_normal" 774 onClick { call *node:parent.leave@click } 775 onViewChange { 776 *node:root.reason_scroll@fullsize = <fullsize> 777 *node:root.reason_scroll@current = <viewpos> 778 *node:root.reason_scroll@viewsize = <viewsize> 779 } 780 } 781 782 vscrollbar reason_scroll { 783 image "ui/scrollbar_v_green" 784 pos "992 600" 785 height "140" 786 current 0 787 viewsize 12 788 fullsize 12 789 hidewhenunused true 790 onClick { call *node:parent.leave@click } 791 onChange { *node:root.reason@viewpos = <current> } 792 } 793} 794 795// ================== 796// END GAME MENU 797// ================== 798 799window endgame 800{ 801 /** @todo Remove me */ 802 { } // empty properties to fix parsing problem with "image" token (behaviour or property?) 803 804 image background 805 { 806 src "background/wingame_bg" 807 } 808 809 string title 810 { 811 string "_Thank you for playing UFO:Alien Invasion" 812 pos "12 20" 813 size "1000 35" 814 font "f_menubig" 815 contentalign ALIGN_UC 816 color "0 0.8 0 1" 817 } 818 819 string endgame_click 820 { 821 string "_Click to continue" 822 pos "814 750" 823 size "200 20" 824 font "f_verysmall" 825 contentalign ALIGN_UR 826 color "0 0.8 0 0.9" 827 ghost true 828 onClick { 829 cmd "initmainui; seq_start developers;" 830 } 831 } 832 833 zone leave 834 { 835 pos "0 0" 836 size "1024 768" 837 onClick { 838 cmd "initmainui; seq_start developers;" 839 } 840 } 841 842 text reason 843 { 844 dataid TEXT_STANDARD 845 color "0 0.8 0 0.9" 846 bgcolor "0.2 0.2 0.2 0.4" 847 contentalign ALIGN_UC 848 pos "30 500" 849 size "960 240" 850 lineheight "20" 851 font "f_normal" 852 onClick { call *node:parent.leave@click } 853 onViewChange { 854 *node:root.reason_scroll@fullsize = <fullsize> 855 *node:root.reason_scroll@current = <viewpos> 856 *node:root.reason_scroll@viewsize = <viewsize> 857 } 858 } 859 860 vscrollbar reason_scroll { 861 image "ui/scrollbar_v_green" 862 pos "992 500" 863 height "240" 864 current 0 865 viewsize 12 866 fullsize 12 867 hidewhenunused true 868 onClick { call *node:parent.leave@click } 869 onChange { *node:root.reason@viewpos = <current> } 870 } 871 872 func onWindowOpened { 873 cmd "music_stop;snd_music Crystan-WinGame;" 874 } 875} 876 877// ======================== 878// POPUP EXIT CONFIRMATION 879// ======================== 880window popup_exit_confirmation 881{ 882 { 883 string "_Exit Campaign Confirmation" 884 background "ui/popup_alpha_tile" 885 pos "264 262" 886 size "486 247" 887 dragbutton true 888 closebutton true 889 } 890 string exit_confirmation_label 891 { 892 string "_You will lose all your campaign progress." 893 pos "26 58" 894 size "450 60" 895 } 896 cmpPopupButton bt_quit 897 { 898 tooltip "_Exit current campaign and return to main menu." 899 string "_Quit anyway" 900 pos "28 188" 901 onClick { 902 cmd "ui_pop;" 903 cmd "game_exit;" 904 } 905 } 906 cmpCancelButton bt_dontquit 907 { 908 tooltip "_Do not quit." 909 pos "285 188" 910 onClick { cmd "ui_pop;" } 911 } 912} 913