• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            Controlling Players and Characters(22)

             

            download source and project

             

            Creating MSL edit

             

            main window design:

             

            modify spell window design:

             

            resouce.h

            //{{NO_DEPENDENCIES}}
            // Microsoft Developer Studio generated include file.
            // Used by MSLEdit.rc
            //

            #define IDD_EDIT                        101
            #define IDD_MODIFY                      102
            #define IDC_LOAD                        1000
            #define IDC_SAVE                        1001
            #define IDC_CHARACTERS                  1002
            #define IDC_NEW                         1003
            #define IDC_OK                          1004
            #define IDC_NUM                         1005
            #define IDC_WEAPON                      1006
            #define IDC_ARMOR                       1007
            #define IDC_SHIELD                      1008
            #define IDC_HEALING                     1009
            #define IDC_CONTAINER                   1010
            #define IDC_MONEY                       1011
            #define IDC_ACCESSORY                   1012
            #define IDC_EDIBLE                      1013
            #define IDC_COLLECTION                  1014
            #define IDC_TRANSPORTATION              1015
            #define IDC_SELLABLE                    1016
            #define IDC_CANDROP                     1017
            #define IDC_USEONCE                     1018
            #define IDC_UNKNOWN                     1019
            #define IDC_SPELLS                      1020
            #define IDC_NAME                        1021
            #define IDC_DESCRIPTION                 1022
            #define IDC_NAME2                       1023
            #define IDC_MESH1                       1023
            #define IDC_WEIGHT                      1024
            #define IDC_NAME3                       1024
            #define IDC_SCRIPT                      1024
            #define IDC_NAME4                       1025
            #define IDC_SPEED1                      1025
            #define IDC_VALUE                       1026
            #define IDC_HEALTH                      1026
            #define IDC_PRICE                       1027
            #define IDC_MANA                        1027
            #define IDC_CURE                        1028
            #define IDC_CAUSE                       1029
            #define IDC_ITEM                        1030
            #define IDC_MESH                        1031
            #define IDC_KILL                        1031
            #define IDC_CANCEL                      1032
            #define IDC_ATTACK                      1033
            #define IDC_NOTHING                     1033
            #define IDC_DEFENSE                     1034
            #define IDC_SINGLE                      1034
            #define IDC_AGILITY                     1035
            #define IDC_AREA                        1035
            #define IDC_ABILITY                     1036
            #define IDC_SELF                        1037
            #define IDC_GROUP                       1038
            #define IDC_CASTER1                     1039
            #define IDC_RADIO13                     1040
            #define IDC_DISPEL                      1040
            #define IDC_TELEPORT                    1041
            #define IDC_TOTARGET1                   1042
            #define IDC_TOCASTER1                   1043
            #define IDC_TARGET1                     1044
            #define IDC_NAME5                       1045
            #define IDC_SOUND                       1045
            #define IDC_SOUND1                      1045
            #define IDC_NAME6                       1046
            #define IDC_MESH2                       1046
            #define IDC_DROPITEM                    1047
            #define IDC_CASTER2                     1047
            #define IDC_TODROP                      1048
            #define IDC_TOTARGET2                   1048
            #define IDC_CHARGE                      1049
            #define IDC_DMGCLASS                    1049
            #define IDC_CHARGE2                     1050
            #define IDC_CHANCE                      1050
            #define IDC_SPEED                       1051
            #define IDC_CHARGE3                     1051
            #define IDC_VALUE1                      1051
            #define IDC_TOATTACK                    1052
            #define IDC_CHARGE4                     1052
            #define IDC_COST                        1052
            #define IDC_TOMAGIC                     1053
            #define IDC_CHARGE5                     1053
            #define IDC_RANGE                       1053
            #define IDC_CHARGE6                     1054
            #define IDC_VALUE2                      1054
            #define IDC_EFFECT                      1055
            #define IDC_TOCASTER2                   1055
            #define IDC_EDIT                        1056
            #define IDC_TARGET2                     1056
            #define IDC_CLEAR                       1057
            #define IDC_NAME7                       1057
            #define IDC_SPEED2                      1057
            #define IDC_NAME8                       1058
            #define IDC_MESH3                       1058
            #define IDC_CASTER3                     1059
            #define IDC_TOTARGET3                   1060
            #define IDC_TOCASTER3                   1061
            #define IDC_TARGET3                     1062
            #define IDC_NAME9                       1063
            #define IDC_SPEED3                      1063
            #define IDC_VALUE3                      1064
            #define IDC_CURECLASS                   1065
            #define IDC_SOUND2                      1066
            #define IDC_SOUND3                      1067
            #define IDC_RAISE                       1068
            #define IDC_NONE1                       1069
            #define IDC_NONE2                       1070
            #define IDC_NONE3                       1071
            #define IDC_VALUE4                      1072
            #define IDC_DISTANCE                    1073
            #define IDC_SCALE1                      1074
            #define IDC_SCALE2                      1075
            #define IDC_SCALE3                      1076
            #define IDC_LOOP1                       1077
            #define IDC_LOOP2                       1078
            #define IDC_LOOP3                       1079

            // Next default values for new objects
            // 
            #ifdef APSTUDIO_INVOKED
            #ifndef APSTUDIO_READONLY_SYMBOLS
            #define _APS_NEXT_RESOURCE_VALUE        103
            #define _APS_NEXT_COMMAND_VALUE         40001
            #define _APS_NEXT_CONTROL_VALUE         1078
            #define _APS_NEXT_SYMED_VALUE           101
            #endif
            #endif

             

            msl_edit.rc:

            // Microsoft Visual C++ generated resource script.
            //
            #include "resource.h"

            #define APSTUDIO_READONLY_SYMBOLS
            /////////////////////////////////////////////////////////////////////////////
            //
            // Generated from the TEXTINCLUDE 2 resource.
            //
            #include "afxres.h"

            /////////////////////////////////////////////////////////////////////////////
            #undef APSTUDIO_READONLY_SYMBOLS

            /////////////////////////////////////////////////////////////////////////////
            // English (U.S.) resources

            #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
            #ifdef _WIN32
            LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
            #pragma code_page(1252)
            #endif //_WIN32

            /////////////////////////////////////////////////////////////////////////////
            //
            // Dialog
            //

            IDD_EDIT DIALOGEX 0, 0, 267, 130
            STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
            CAPTION "Master Spell List Editor"
            CLASS "MSLEdit"
            FONT 11, "Segoe UI", 400, 0, 0x0
            BEGIN
                PUSHBUTTON      "Load",IDC_LOAD,210,90,50,14
                PUSHBUTTON      "Save",IDC_SAVE,210,110,50,14
                LISTBOX         IDC_SPELLS,5,15,195,109,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
                LTEXT           "Spell List",IDC_STATIC,5,5,50,8
                PUSHBUTTON      "New",IDC_NEW,210,70,50,14
                DEFPUSHBUTTON   "Edit",IDC_EDIT,210,15,50,14
                PUSHBUTTON      "Clear",IDC_CLEAR,210,35,50,14
            END

            IDD_MODIFY DIALOGEX 0, 0, 321, 286
            STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
            CAPTION "Modify Spell"
            FONT 11, "Segoe UI", 400, 0, 0x0
            BEGIN
                EDITTEXT        IDC_NAME,49,20,80,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_DESCRIPTION,49,35,80,35,ES_MULTILINE | WS_VSCROLL
                EDITTEXT        IDC_DMGCLASS,49,74,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_CURECLASS,49,89,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_COST,49,105,45,12,ES_AUTOHSCROLL
                CONTROL         "Alter Health",IDC_HEALTH,"Button",BS_AUTORADIOBUTTON,140,5,65,10
                CONTROL         "Alter Mana",IDC_MANA,"Button",BS_AUTORADIOBUTTON,140,15,65,10
                CONTROL         "Cure Effect",IDC_CURE,"Button",BS_AUTORADIOBUTTON,140,24,65,10
                CONTROL         "Cause Effect",IDC_CAUSE,"Button",BS_AUTORADIOBUTTON,140,34,65,10
                CONTROL         "Raise Dead",IDC_RAISE,"Button",BS_AUTORADIOBUTTON,140,43,70,10
                CONTROL         "Instant Kill",IDC_KILL,"Button",BS_AUTORADIOBUTTON,140,53,65,10
                CONTROL         "Dispel Magic",IDC_DISPEL,"Button",BS_AUTORADIOBUTTON,140,63,65,10
                CONTROL         "Teleport",IDC_TELEPORT,"Button",BS_AUTORADIOBUTTON,140,73,65,10
                EDITTEXT        IDC_CHANCE,266,5,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_VALUE1,266,20,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_VALUE2,266,35,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_VALUE3,266,50,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_VALUE4,266,65,45,12,ES_AUTOHSCROLL
                CONTROL         "Targets Single",IDC_SINGLE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,235,90,65,8
                CONTROL         "Targets Self",IDC_SELF,"Button",BS_AUTORADIOBUTTON,235,99,55,8
                CONTROL         "Targets Area",IDC_AREA,"Button",BS_AUTORADIOBUTTON,235,109,55,8
                EDITTEXT        IDC_RANGE,151,90,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_DISTANCE,151,105,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_MESH1,49,130,45,12,ES_AUTOHSCROLL
                CONTROL         "Loop Animation",IDC_LOOP1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,145,75,10
                CONTROL         "N/A",IDC_NONE1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,25,159,75,8
                CONTROL         "Caster",IDC_CASTER1,"Button",BS_AUTORADIOBUTTON,25,168,75,8
                CONTROL         "Caster to Target",IDC_TOTARGET1,"Button",BS_AUTORADIOBUTTON,25,178,75,8
                CONTROL         "Target to Caster",IDC_TOCASTER1,"Button",BS_AUTORADIOBUTTON,25,188,75,8
                CONTROL         "Target",IDC_TARGET1,"Button",BS_AUTORADIOBUTTON,25,199,75,8
                CONTROL         "Scale Distance",IDC_SCALE1,"Button",BS_AUTORADIOBUTTON,25,209,75,8
                EDITTEXT        IDC_SPEED1,61,225,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_SOUND1,61,239,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_MESH2,151,130,45,12,ES_AUTOHSCROLL
                CONTROL         "Loop Animation",IDC_LOOP2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,115,145,75,10
                CONTROL         "N/A",IDC_NONE2,"Button",BS_AUTORADIOBUTTON | WS_GROUP,115,159,75,8
                CONTROL         "Caster",IDC_CASTER2,"Button",BS_AUTORADIOBUTTON,115,168,75,8
                CONTROL         "Caster to Target",IDC_TOTARGET2,"Button",BS_AUTORADIOBUTTON,115,178,75,8
                CONTROL         "Target to Caster",IDC_TOCASTER2,"Button",BS_AUTORADIOBUTTON,115,188,75,8
                CONTROL         "Target",IDC_TARGET2,"Button",BS_AUTORADIOBUTTON,115,199,75,8
                CONTROL         "Scale Distance",IDC_SCALE2,"Button",BS_AUTORADIOBUTTON,115,209,75,8
                EDITTEXT        IDC_SPEED2,161,225,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_SOUND2,161,239,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_MESH3,245,130,45,12,ES_AUTOHSCROLL
                CONTROL         "Loop Animation",IDC_LOOP3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,210,145,75,10
                CONTROL         "N/A",IDC_NONE3,"Button",BS_AUTORADIOBUTTON | WS_GROUP,211,159,75,8
                CONTROL         "Caster",IDC_CASTER3,"Button",BS_AUTORADIOBUTTON,211,168,75,8
                CONTROL         "Caster to Target",IDC_TOTARGET3,"Button",BS_AUTORADIOBUTTON,211,178,75,8
                CONTROL         "Target to Caster",IDC_TOCASTER3,"Button",BS_AUTORADIOBUTTON,211,188,75,8
                CONTROL         "Target",IDC_TARGET3,"Button",BS_AUTORADIOBUTTON,211,199,75,8
                CONTROL         "Scale Distance",IDC_SCALE3,"Button",BS_AUTORADIOBUTTON,211,209,75,8
                EDITTEXT        IDC_SPEED3,262,225,45,12,ES_AUTOHSCROLL
                EDITTEXT        IDC_SOUND3,262,239,45,12,ES_AUTOHSCROLL
                DEFPUSHBUTTON   "OK",IDC_OK,89,265,50,14
                PUSHBUTTON      "Cancel",IDC_CANCEL,185,266,50,14
                LTEXT           "Spell #",IDC_STATIC,5,5,25,10
                LTEXT           "#",IDC_NUM,35,5,50,10
                RTEXT           "Name",IDC_STATIC,21,20,25,10
                RTEXT           "Description",IDC_STATIC,5,35,40,10
                RTEXT           "2x Dmg Class",IDC_STATIC,0,75,45,10
                RTEXT           "Effect Chance",IDC_STATIC,210,5,50,10
                RTEXT           "Spell Value 1",IDC_STATIC,216,20,45,10
                RTEXT           "Cost (MP)",IDC_STATIC,10,106,35,10
                RTEXT           "Range",IDC_STATIC,110,90,35,10
                RTEXT           "Spell Value 2",IDC_STATIC,216,35,45,10
                RTEXT           "Speed/Time",IDC_STATIC,10,225,46,10
                RTEXT           "Sound #",IDC_STATIC,20,241,36,10
                RTEXT           "Speed/Time",IDC_STATIC,116,226,41,10
                RTEXT           "Spell Value 3",IDC_STATIC,216,50,45,10
                RTEXT           "Cure Class",IDC_STATIC,5,90,40,10
                RTEXT           "Speed/Time",IDC_STATIC,217,225,41,10
                RTEXT           "Mesh #1",IDC_STATIC,12,130,35,10
                RTEXT           "Mesh #2",IDC_STATIC,110,130,35,10
                RTEXT           "Mesh #3",IDC_STATIC,209,130,31,10
                RTEXT           "Sound #",IDC_STATIC,121,241,36,10
                RTEXT           "Sound #",IDC_STATIC,222,241,36,10
                LTEXT           "Max Distance",IDC_STATIC,102,106,46,10
                RTEXT           "Spell Value 4",IDC_STATIC,215,65,45,10
            END


            /////////////////////////////////////////////////////////////////////////////
            //
            // DESIGNINFO
            //

            #ifdef APSTUDIO_INVOKED
            GUIDELINES DESIGNINFO 
            BEGIN
                IDD_EDIT, DIALOG
                BEGIN
                    LEFTMARGIN, 7
                    RIGHTMARGIN, 260
                    TOPMARGIN, 7
                    BOTTOMMARGIN, 123
                END

                IDD_MODIFY, DIALOG
                BEGIN
                    LEFTMARGIN, 7
                    RIGHTMARGIN, 314
                    TOPMARGIN, 7
                    BOTTOMMARGIN, 279
                END
            END
            #endif    // APSTUDIO_INVOKED


            #ifdef APSTUDIO_INVOKED
            /////////////////////////////////////////////////////////////////////////////
            //
            // TEXTINCLUDE
            //

            1 TEXTINCLUDE 
            BEGIN
                "resource.h\0"
            END

            2 TEXTINCLUDE 
            BEGIN
                "#include ""afxres.h""\r\n"
                "\0"
            END

            3 TEXTINCLUDE 
            BEGIN
                "\r\n"
                "\0"
            END

            #endif    // APSTUDIO_INVOKED

            #endif    // English (U.S.) resources
            /////////////////////////////////////////////////////////////////////////////



            #ifndef APSTUDIO_INVOKED
            /////////////////////////////////////////////////////////////////////////////
            //
            // Generated from the TEXTINCLUDE 3 resource.
            //


            /////////////////////////////////////////////////////////////////////////////
            #endif    // not APSTUDIO_INVOKED

             

            main routine:

            #include <windows.h>
            #include <stdio.h>
            #include "resource.h"
            #include "msl.h"
            #include "tool.h"

            #pragma warning(disable : 4996)

            #define MAX_SPELLS  64

            HWND g_hwnd;                   
            // Window handle

            OPENFILENAME g_ofn;            
            // Open/Save dialog data
            char g_mls_file[MAX_PATH];     // Filename for spell file

            sSpell g_spells[MAX_SPELLS];   
            // Spell list
            long   g_edit_spell;           // Spell to modify

            const WORD g_effects[8] = 
            {
                IDC_HEALTH, IDC_MANA, IDC_CURE, IDC_CAUSE, IDC_RAISE, IDC_KILL, IDC_DISPEL, IDC_TELEPORT 
            };

            const WORD g_targets[3] = { IDC_SINGLE, IDC_SELF, IDC_AREA };

            const WORD g_positions[18] = 
            {
                IDC_NONE1, IDC_CASTER1, IDC_TOTARGET1, IDC_TOCASTER1, IDC_TARGET1, IDC_SCALE1,
                IDC_NONE2, IDC_CASTER2, IDC_TOTARGET2, IDC_TOCASTER2, IDC_TARGET2, IDC_SCALE2,
                IDC_NONE3, IDC_CASTER3, IDC_TOTARGET3, IDC_TOCASTER3, IDC_TARGET3, IDC_SCALE3,
            };

            const WORD g_loops[3] = { IDC_LOOP1, IDC_LOOP2, IDC_LOOP3 };

            //////////////////////////////////////////////////////////////////////////////////////////////

            void reset_spell(sSpell& spell)
            {
                
            // Reset spell damage and cure classes
                spell.damage_class  = -1;
                spell.cure_class    = -1;

                
            // Reset sounds
                spell.mesh_sound[0] = -1;
                spell.mesh_sound[1] = -1;
                spell.mesh_sound[2] = -1;
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            bool load_spells(const char* filename)
            {
                
            // load all spells from file and insert into listbox.

                // Clear item structures
                for(long i = 0; i < MAX_SPELLS; i++) 
                {
                    ZeroMemory(&g_spells[i], 
            sizeof(sSpell));
                    reset_spell(g_spells[i]);
                }

                FILE* fp;

                
            if((fp  = fopen(filename, "rb")) == NULL)
                    
            return false;

                fread(g_spells, 1, 
            sizeof(g_spells), fp);
                fclose(fp);

                
            // update spell's listbox

                HWND listbox = GetDlgItem(g_hwnd, IDC_SPELLS);
                reset_listbox(listbox);

                
            for(long i = 0; i < MAX_SPELLS; i++)
                {
                    
            char text[256];
                    sprintf(text, "%5lu: %s", i, g_spells[i].name);
                    add_string_to_listbox(listbox, text);
                }

                
            return true;
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            bool new_msl()
            {
                
            if(MessageBox(g_hwnd, "Are you sure? (Looses any unsaved MSL information)", "New MSL", MB_YESNO) != IDYES)
                    
            return false;

                HWND listbox = GetDlgItem(g_hwnd, IDC_SPELLS);
                reset_listbox(listbox);

                
            for(long i = 0; i < MAX_SPELLS; i++)
                {
                    ZeroMemory(&g_spells[i], 
            sizeof(sSpell));
                    reset_spell(g_spells[i]);

                    
            char buf[16];
                    sprintf(buf, "%5lu:", i);
                    add_string_to_listbox(listbox, buf);
                }

                
            return true;
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            bool load_msl()
            {
                
            // Setup the open dialog info
                g_ofn.hwndOwner   = g_hwnd;
                g_ofn.lpstrFile   = g_mls_file;
                g_ofn.lpstrTitle  = "Load MSL File";
                g_ofn.lpstrFilter = "MSL Spell Files (*.MSL)\0*.MSL\0All Files (*.*)\0*.*\0\0";
                g_ofn.lpstrDefExt = "MSL";
              
                
            if(! GetOpenFileName(&g_ofn))
                    
            return false;

                
            if(! load_spells(g_mls_file))
                {
                    MessageBox(g_hwnd, g_mls_file, "Unable to open file.", MB_OK);
                    
            return false;
                }

                
            return true;
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            bool save_msl()
            {
                
            // Setup the open dialog info
                g_ofn.hwndOwner   = g_hwnd;
                g_ofn.lpstrFile   = g_mls_file;
                g_ofn.lpstrTitle  = "Load MSL File";
                g_ofn.lpstrFilter = "MSL Spell Files (*.MSL)\0*.MSL\0All Files (*.*)\0*.*\0\0";
                g_ofn.lpstrDefExt = "MSL";

                
            if(! GetSaveFileName(&g_ofn))
                    
            return false;

                FILE* fp;

                
            if((fp = fopen(g_mls_file, "wb")) == NULL)
                    
            return false;

                fwrite(g_spells, 1, 
            sizeof(g_spells), fp);
                fclose(fp);
              
                
            return true;
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            void update_entry(HWND hwnd, long spell_index)
            {
                sSpell& spell = g_spells[spell_index];

                
            // Get text entries
                GetWindowText(GetDlgItem(hwnd, IDC_NAME), spell.name, sizeof(spell.name));
                GetWindowText(GetDlgItem(hwnd, IDC_DESCRIPTION), spell.desc, 
            sizeof(spell.desc));

                
            char text[32];

                
            // Get numerical entries
                GetWindowText(GetDlgItem(hwnd, IDC_DMGCLASS), text, sizeof(text));
                spell.damage_class = atol(text);
                GetWindowText(GetDlgItem(hwnd, IDC_CURECLASS), text, 
            sizeof(text));
                spell.cure_class = atol(text);

                GetWindowText(GetDlgItem(hwnd, IDC_COST), text, 
            sizeof(text));
                spell.cost = atol(text);

                GetWindowText(GetDlgItem(hwnd, IDC_DISTANCE), text, 
            sizeof(text));
                g_spells[g_edit_spell].max_dist = (
            float)atof(text);

                GetWindowText(GetDlgItem(hwnd, IDC_CHANCE), text, 
            sizeof(text));
                spell.chance = atol(text);
                GetWindowText(GetDlgItem(hwnd, IDC_VALUE1), text, 
            sizeof(text));
                spell.value[0] = (
            float)atof(text);
                GetWindowText(GetDlgItem(hwnd, IDC_VALUE2), text, 
            sizeof(text));
                spell.value[1] = (
            float)atof(text);
                GetWindowText(GetDlgItem(hwnd, IDC_VALUE3), text, 
            sizeof(text));
                spell.value[2] = (
            float)atof(text);
                GetWindowText(GetDlgItem(hwnd, IDC_VALUE4), text, 
            sizeof(text));
                spell.value[3] = (
            float)atof(text);
                GetWindowText(GetDlgItem(hwnd, IDC_RANGE), text, 
            sizeof(text));
                spell.range = (
            float)atof(text);

                GetWindowText(GetDlgItem(hwnd, IDC_MESH1), text, 
            sizeof(text));
                spell.mesh_index[0] = atol(text);
                GetWindowText(GetDlgItem(hwnd, IDC_SPEED1), text, 
            sizeof(text));
                spell.mesh_speed[0] = (
            float)atof(text);
                GetWindowText(GetDlgItem(hwnd, IDC_SOUND1), text, 
            sizeof(text));
                spell.mesh_sound[0] = atol(text);

                GetWindowText(GetDlgItem(hwnd, IDC_MESH2), text, 
            sizeof(text));
                spell.mesh_index[1] = atol(text);
                GetWindowText(GetDlgItem(hwnd, IDC_SPEED2), text, 
            sizeof(text));
                spell.mesh_speed[1] = (
            float)atof(text);
                GetWindowText(GetDlgItem(hwnd, IDC_SOUND2), text, 
            sizeof(text));
                spell.mesh_sound[1] = atol(text);

                GetWindowText(GetDlgItem(hwnd, IDC_MESH3), text, 
            sizeof(text));
                spell.mesh_index[2] = atol(text);
                GetWindowText(GetDlgItem(hwnd, IDC_SPEED3), text, 
            sizeof(text));
                spell.mesh_speed[2] = (
            float)atof(text);
                GetWindowText(GetDlgItem(hwnd, IDC_SOUND3), text, 
            sizeof(text));
                spell.mesh_sound[2] = atol(text);

                
            // Get selection entries

                
            for(long i = 0; i < 8; i++) 
                {
                  
            if(SendMessage(GetDlgItem(hwnd, g_effects[i]), BM_GETCHECK, 0, 0)) 
                  {
                    spell.effect = i;
                    
            break;
                  }
                }

                
            for(long i = 0; i < 3; i++) 
                {
                  
            if(SendMessage(GetDlgItem(hwnd, g_targets[i]), BM_GETCHECK, 0, 0)) 
                  {
                    spell.target = i;
                    
            break;
                  }
                }

                
            for(long i = 0; i < 6; i++) 
                {
                  
            if(SendMessage(GetDlgItem(hwnd, g_positions[i]), BM_GETCHECK, 0, 0))
                    spell.mesh_pos[0] = i;

                  
            if(SendMessage(GetDlgItem(hwnd, g_positions[i+6]), BM_GETCHECK, 0, 0))
                    spell.mesh_pos[1] = i;

                  
            if(SendMessage(GetDlgItem(hwnd, g_positions[i+12]), BM_GETCHECK, 0, 0))
                    spell.mesh_pos[2] = i;
                }

                
            // Get loops
                spell.mesh_loop[0] = (BOOL) get_button_state(GetDlgItem(hwnd, g_loops[0]));        
                spell.mesh_loop[1] = (BOOL) get_button_state(GetDlgItem(hwnd, g_loops[1]));
                spell.mesh_loop[2] = (BOOL) get_button_state(GetDlgItem(hwnd, g_loops[2]));
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            BOOL CALLBACK modify_dialog_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
            {
                
            switch(msg)
                {
                
            case WM_INITDIALOG:
                  {
                    
            // return an error if there is no spell to modify
                    if(g_edit_spell >= MAX_SPELLS)
                    {
                        EndDialog(hwnd, FALSE);
                        
            return FALSE;
                    }

                    
            char text[32];

                    
            // display spell number
                    sprintf(text, "%lu", g_edit_spell);
                    SetWindowText(GetDlgItem(hwnd, IDC_NUM), text);

                    sSpell& spell = g_spells[g_edit_spell];

                    
            // Display text entries
                    SetWindowText(GetDlgItem(hwnd, IDC_NAME), spell.name);
                    SetWindowText(GetDlgItem(hwnd, IDC_DESCRIPTION), spell.desc);

                    
            // Display numerical entries
                    sprintf(text, "%ld", spell.damage_class);
                    SetWindowText(GetDlgItem(hwnd, IDC_DMGCLASS), text);
                    sprintf(text, "%ld", spell.cure_class);
                    SetWindowText(GetDlgItem(hwnd, IDC_CURECLASS), text);

                    sprintf(text, "%lu", spell.cost);
                    SetWindowText(GetDlgItem(hwnd, IDC_COST), text);

                    sprintf(text, "%lf", spell.max_dist);
                    SetWindowText(GetDlgItem(hwnd, IDC_DISTANCE), text);
                    sprintf(text, "%lf", spell.range);
                    SetWindowText(GetDlgItem(hwnd, IDC_RANGE), text);

                    sprintf(text, "%lu", spell.chance);
                    SetWindowText(GetDlgItem(hwnd, IDC_CHANCE), text);
                    sprintf(text, "%lf", spell.value[0]);
                    SetWindowText(GetDlgItem(hwnd, IDC_VALUE1), text);
                    sprintf(text, "%lf", spell.value[1]);
                    SetWindowText(GetDlgItem(hwnd, IDC_VALUE2), text);
                    sprintf(text, "%lf", spell.value[2]);
                    SetWindowText(GetDlgItem(hwnd, IDC_VALUE3), text);
                    sprintf(text, "%lf", spell.value[3]);
                    SetWindowText(GetDlgItem(hwnd, IDC_VALUE4), text);      

                    sprintf(text, "%lu", spell.mesh_index[0]);
                    SetWindowText(GetDlgItem(hwnd, IDC_MESH1), text);
                    sprintf(text, "%lf", spell.mesh_speed[0]);
                    SetWindowText(GetDlgItem(hwnd, IDC_SPEED1), text);
                    sprintf(text, "%ld", spell.mesh_sound[0]);
                    SetWindowText(GetDlgItem(hwnd, IDC_SOUND1), text);

                    sprintf(text, "%lu", spell.mesh_index[1]);
                    SetWindowText(GetDlgItem(hwnd, IDC_MESH2), text);
                    sprintf(text, "%lf", spell.mesh_speed[1]);
                    SetWindowText(GetDlgItem(hwnd, IDC_SPEED2), text);
                    sprintf(text, "%ld", spell.mesh_sound[1]);
                    SetWindowText(GetDlgItem(hwnd, IDC_SOUND2), text);

                    sprintf(text, "%lu", spell.mesh_index[2]);
                    SetWindowText(GetDlgItem(hwnd, IDC_MESH3), text);
                    sprintf(text, "%lf", spell.mesh_speed[2]);
                    SetWindowText(GetDlgItem(hwnd, IDC_SPEED3), text);
                    sprintf(text, "%ld", spell.mesh_sound[2]);
                    SetWindowText(GetDlgItem(hwnd, IDC_SOUND3), text);

                    
            // Display selection entries
                    set_button_state(GetDlgItem(hwnd, g_effects[spell.effect]), TRUE);
                    set_button_state(GetDlgItem(hwnd, g_targets[spell.target]), TRUE);
                    set_button_state(GetDlgItem(hwnd, g_positions[spell.mesh_pos[0]]), TRUE);
                    set_button_state(GetDlgItem(hwnd, g_positions[spell.mesh_pos[1]+6]), TRUE);
                    set_button_state(GetDlgItem(hwnd, g_positions[spell.mesh_pos[2]+12]), TRUE);
                            
                    
            // Display loops
                    set_button_state(GetDlgItem(hwnd, g_loops[0]), spell.mesh_loop[0]);
                    set_button_state(GetDlgItem(hwnd, g_loops[1]), spell.mesh_loop[1]);
                    set_button_state(GetDlgItem(hwnd, g_loops[2]), spell.mesh_loop[2]);
                
                    
            return TRUE;
                  }

                
            case WM_COMMAND:
                    
            switch(LOWORD(word_param))
                    {
                    
            case IDC_OK:
                        update_entry(hwnd, g_edit_spell);
                        EndDialog(hwnd, TRUE);
                        
            return TRUE;

                    
            case IDC_CANCEL:
                        EndDialog(hwnd, FALSE);
                        
            return TRUE;
                    }

                    
            break;
                }

                
            return FALSE;
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            LRESULT CALLBACK window_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
            {
                
            int sel;
                
            char text[256];
                HWND listbox;

                
            switch(msg)
                {
                
            case WM_COMMAND:
                    
            switch(LOWORD(word_param))
                    {
                    
            case IDC_NEW:   // new msl file
                        new_msl();
                        
            break;

                    
            case IDC_LOAD:  // load a msl file
                        load_msl();
                        
            break;

                    
            case IDC_SAVE:  // save a msl file
                        save_msl();
                        
            break;

                    
            case IDC_CLEAR: // clear an entry          
                        listbox = GetDlgItem(g_hwnd, IDC_SPELLS);

                        
            // see if a spell was selected
                        if((sel = (int)get_listbox_cur_sel(listbox)) == LB_ERR)
                            
            break;
                        
                        ZeroMemory(&g_spells[sel], 
            sizeof(sSpell));
                        reset_spell(g_spells[sel]);

                        delete_listbox_string(listbox, sel);
                        sprintf(text, "%5lu:", sel);
                        insert_string_to_listbox(listbox, sel, text);
                        
            break;

                    
            case IDC_SPELLS:    // edit an entry
                        if(HIWORD(word_param) != LBN_DBLCLK)
                            
            break;
                    
            case IDC_EDIT:
                        listbox = GetDlgItem(hwnd, IDC_SPELLS);

                        
            // see if a spell was selected
                        if((sel = (int)get_listbox_cur_sel(listbox)) == LB_ERR)
                            
            break;

                        g_edit_spell = sel;

                        DialogBox(NULL, MAKEINTRESOURCE(IDD_MODIFY), hwnd, modify_dialog_proc);

                        
            // update spell
                        delete_listbox_string(listbox, sel);
                        sprintf(text, "%5lu: %s", sel, g_spells[sel].name);
                        insert_string_to_listbox(listbox, sel, text);
                        
            break;
                    }

                    
            break;

                
            case WM_CREATE:
                    
            // Initialize the save/load dialog box info
                    ZeroMemory(&g_ofn, sizeof(OPENFILENAME));

                    g_ofn.lStructSize   = 
            sizeof(OPENFILENAME);
                    g_ofn.nMaxFile      = MAX_PATH;
                    g_ofn.nMaxFileTitle = MAX_PATH;
                    g_ofn.Flags         = OFN_HIDEREADONLY;

                    
            // Set default MSL filename
                    strcpy(g_mls_file, "..\\Data\\Default.MSL");

                    
            break;

                
            case WM_DESTROY:
                    PostQuitMessage(0);
                    
            break;

                
            default
                    
            return DefWindowProc(hwnd, msg, word_param, long_param);
                }

                
            return 0;
            }

            //////////////////////////////////////////////////////////////////////////////////////////////

            int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
            {
                
            const char* class_name = "MSLEDIT";

                WNDCLASS wc;  

                
            // Register window class
                wc.style         = CS_HREDRAW | CS_VREDRAW;
                wc.lpfnWndProc   = window_proc;
                wc.cbClsExtra    = 0;
                wc.cbWndExtra    = DLGWINDOWEXTRA;
                wc.hInstance     = inst;
                wc.hIcon         = LoadIcon(inst, IDI_APPLICATION);
                wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
                wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
                wc.lpszMenuName  = NULL;
                wc.lpszClassName = class_name;

                RegisterClass(&wc);

                g_hwnd = CreateDialog(inst, MAKEINTRESOURCE(IDD_EDIT), 0, NULL);

                ShowWindow(g_hwnd, cmd_show);
                UpdateWindow(g_hwnd);  

                
            // Force a load of spells from default.MSL
                load_spells("..\\Data\\Default.MSL");

                MSG Msg;

                
            while(GetMessage(&Msg, NULL, 0, 0)) 
                {
                  TranslateMessage(&Msg);
                  DispatchMessage(&Msg);
                }

                UnregisterClass(class_name, inst);

                
            return 0;
            }
             

            posted on 2007-11-16 17:57 lovedday 閱讀(435) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            51久久夜色精品国产| 伊人伊成久久人综合网777| 人妻中文久久久久| 三级三级久久三级久久| 久久久久久久波多野结衣高潮| 国产69精品久久久久久人妻精品| 久久人人爽人人爽人人AV| 久久99国产精品二区不卡| 国产精品欧美久久久久无广告| 日本亚洲色大成网站WWW久久| 中文字幕久久精品 | 久久这里的只有是精品23| 国产精品无码久久久久久| 亚洲国产成人久久综合区| 亚洲va久久久噜噜噜久久狠狠| 久久精品二区| 久久综合狠狠综合久久激情 | 亚洲精品美女久久久久99小说| 很黄很污的网站久久mimi色| 亚洲av伊人久久综合密臀性色| 2021久久国自产拍精品| 国产精品禁18久久久夂久 | 久久精品a亚洲国产v高清不卡| 国产高清美女一级a毛片久久w| 亚洲午夜久久久久久噜噜噜| 久久久WWW免费人成精品| 亚洲精品乱码久久久久久按摩| 久久人人爽人人爽人人片AV东京热| 91精品国产综合久久四虎久久无码一级 | 久久人妻少妇嫩草AV蜜桃| 国产欧美久久一区二区| 香蕉久久夜色精品升级完成| 色综合久久久久综合99| 99久久国产热无码精品免费久久久久| 久久午夜伦鲁片免费无码| 人妻无码αv中文字幕久久 | 久久九九精品99国产精品| 日韩精品无码久久久久久| 国内精品伊人久久久影院| 久久人妻AV中文字幕| 99久久国产宗和精品1上映 |