青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

游戲腳本的實(shí)現(xiàn)(6)

 

本篇是游戲腳本的實(shí)現(xiàn)(5)的續(xù)篇。

 

事實(shí)上,創(chuàng)建可接受腳本的游戲引擎對(duì)于大多數(shù)的游戲而言,將產(chǎn)生出一個(gè)非常開(kāi)放的源代碼以及高效率的項(xiàng)目。


 

Mad Lib Scripts的執(zhí)行

窗口設(shè)計(jì):

resouce.h:

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by MlsDemo.rc
//
#define IDD_DEMO                        101
#define IDC_LOAD                        1000
#define IDC_EXECUTE                     1001
#define IDC_SCRIPT                      1002
#define IDC_TITLE                       1003

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

MlsDemo.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_DEMO DIALOGEX 0, 0, 356, 198
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "MLS Demo"
CLASS "MLSDEMO"
FONT 12, "Segoe UI", 400, 0, 0x0
BEGIN
    PUSHBUTTON      "Load Script",IDC_LOAD,254,173,43,14
    PUSHBUTTON      "Execute",IDC_EXECUTE,306,173,43,14
    LISTBOX         IDC_SCRIPT,7,5,342,162,NOT LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
    CONTROL         "",IDC_TITLE,"Static",SS_LEFTNOWORDWRAP,7,175,232,14
END


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

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO 
BEGIN
    IDD_DEMO, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 349
        TOPMARGIN, 7
        BOTTOMMARGIN, 191
    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

實(shí)現(xiàn):

 
/*************************************************************************
PURPOSE:
    Mad Lib Scripting demo.
*************************************************************************/


#include <windows.h>
#include <stdio.h>
#include <memory.h>
#include "resource.h"

#pragma warning(disable : 4996)

enum ENTRY_TYPE { ENTRY_NONE = 0, ENTRY_TEXT, ENTRY_BOOL, ENTRY_INT, ENTRY_FLOAT, ENTRY_CHOICE };

//============================================================================
// structure that store all entries fact information.
//============================================================================
typedef struct ENTRY
{
    
long    type;               // type of blank entry (ENTRY_TEXT, ENTRY_BOOL, )

    union
    {
        
long    io_value;       // used for saving/loading
        long    length;         // length of text (0 terminator)
        long    selection;      // selection in choice
        BOOL    bool_value;     // BOOL value
        long    long_value;     // long balue
        float   float_value;    // float value
    };

    
char*   text;               // entry text buffer

    ENTRY()
    {
        memset(
this, 0, sizeof(*this));
    }

    ~ENTRY()
    {
        delete[] text;
    }
} *ENTRY_PTR;

//============================================================================
// structure that store all 
//============================================================================
typedef struct SCRIPT
{
    
long        action_index;   // [0, number of actions - 1]

    
long        num_entries;    // number of entries in this action
    ENTRY_PTR   entries;        // array of entries

    SCRIPT*     prev;           
// previous in linked list
    SCRIPT*     next;           // next in linked list

    SCRIPT()
    {
        memset(
this, 0, sizeof(*this));
    }

    ~SCRIPT()
    {
        delete[] entries;
        delete next;
    }
} *SCRIPT_PTR;

///////////////////////////////////// function declaration /////////////////////////////////////

SCRIPT_PTR script_if_flag_then(SCRIPT_PTR script);
SCRIPT_PTR script_else(SCRIPT_PTR script);
SCRIPT_PTR script_endif(SCRIPT_PTR script);
SCRIPT_PTR script_set_flag(SCRIPT_PTR script);
SCRIPT_PTR script_print(SCRIPT_PTR script);
SCRIPT_PTR script_move(SCRIPT_PTR script);
SCRIPT_PTR script_gain_loss(SCRIPT_PTR script);
SCRIPT_PTR script_battle(SCRIPT_PTR script);
SCRIPT_PTR script_end(SCRIPT_PTR script);

LRESULT CALLBACK window_proc(HWND hwnd, UINT msg_id, WPARAM word_param, LPARAM long_param);
SCRIPT_PTR load_script_from_file(
const char* filename);
BOOL run_script();

void reset_listbox(HWND listbox);
LRESULT add_string_to_listbox(HWND listbox, 
const charstring);

///////////////////////////////////// global variables /////////////////////////////////////

HWND g_hwnd;

SCRIPT_PTR      g_root_script;

BOOL            g_flags[256];

OPENFILENAME    g_ofn;
char            g_script_file[MAX_PATH];

typedef SCRIPT_PTR (*SCRIPT_FUNC)(SCRIPT_PTR script);

SCRIPT_FUNC g_script_list[] =
{
     script_if_flag_then,
     script_else,
     script_endif,
     script_set_flag,
     script_print,
     script_move,
     script_gain_loss,
     script_battle,
     script_end,
};

//-----------------------------------------------------------------------------------
// Routine entry.
//-----------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
    
const char* class_name = "MLSDEMO";

    WNDCLASS win_class;

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

    
if(! RegisterClass(&win_class))
        
return FALSE;
   
    
// The CreateDialog macro creates a modeless dialog box from a dialog box template resource. 
    // The CreateDialog macro uses the CreateDialogParam function.
    //
    // HWND CreateDialog(          
    //    HINSTANCE hInstance,
    //    LPCTSTR lpTemplate,
    //    HWND hWndParent,
    //    DLGPROC lpDialogFunc);
    //
    // hInstance:
    //        [in] Handle to the module whose executable file contains the dialog box template. 
    //
    // lpTemplate
    //        [in] Specifies the dialog box template. This parameter is either the pointer to a null-terminated 
    //        character string that specifies the name of the dialog box template or an integer value that 
    //        specifies the resource identifier of the dialog box template. If the parameter specifies a resource 
    //        identifier, its high-order word must be zero and its low-order word must contain the identifier. 
    //        You can use the MAKEINTRESOURCE macro to create this value. 
    //
    // hWndParent:
    //        [in] Handle to the window that owns the dialog box. 
    //
    // lpDialogFunc:
    //        [in] Pointer to the dialog box procedure. For more information about the dialog box procedure, 
    //        see DialogProc. 
    //
    // Return Value:
    //    If the function succeeds, the return value is the handle to the dialog box.
    //    If the function fails, the return value is NULL. To get extended error information, call GetLastError.

    // Create the dialog box window and show it

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

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

    MSG msg;

    
// message loop
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    delete g_root_script;

    UnregisterClass(class_name, inst);

    
return 0;
}

//------------------------------------------------------------------------------------------------
// Main window procedure.
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK window_proc(HWND hwnd, UINT msg_id, WPARAM word_param, LPARAM long_param)
{
    
switch(msg_id)
    {
    
case WM_COMMAND:
        
switch(LOWORD(word_param))
        {
        
case IDC_LOAD:  // load a script file
            if(! GetOpenFileName(&g_ofn))
                
break;

            
// delete the current script
            delete g_root_script;

            
if((g_root_script = load_script_from_file(g_script_file)) == NULL)
                MessageBox(hwnd, g_script_file, "Unalbe to open file.", MB_OK);

            
// display script filename
            SetWindowText(GetDlgItem(g_hwnd, IDC_TITLE), g_script_file);

            
break;

        
case IDC_EXECUTE:   // run a script file
            run_script();
            
break;
        }

        
break;

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

        g_ofn.lStructSize   = 
sizeof(OPENFILENAME);
        g_ofn.nMaxFile      = MAX_PATH;        
        g_ofn.Flags         = OFN_HIDEREADONLY;
        g_ofn.lpstrFile     = g_script_file;
        g_ofn.lpstrTitle    = "Load Script File";
        g_ofn.lpstrFilter   = "MLS Script Files (*.mls)\0*.mls\0All Files (*.*)\0*.*\0\0";
        g_ofn.lpstrDefExt   = "mls";
        g_ofn.nMaxFileTitle = MAX_PATH;

        
// set default open path
        strcpy(g_script_file, "..\\data\\test.mls");

        reset_listbox(GetDlgItem(g_hwnd, IDC_SCRIPT));

        
break;

    
case WM_DESTROY:
        PostQuitMessage(0);
        
break;

    
default:
        
return DefWindowProc(hwnd, msg_id, word_param, long_param);
    }

    
return 0;
}

//----------------------------------------------------------------------------------------
// Load scripts from file and return root script.
//----------------------------------------------------------------------------------------
SCRIPT_PTR load_script_from_file(const char* filename)
{
    FILE* fp;

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

    
long num_script;
    fread(&num_script, 1, 
sizeof(long), fp);

    SCRIPT_PTR root_script;
    SCRIPT_PTR script_ptr = NULL;

    
// loop through each script
    for(long i = 0; i < num_script; i++)
    {
        
// allocate a script structure and link in

        SCRIPT_PTR script = 
new SCRIPT;
        script->next = NULL;

        
if(script_ptr == NULL)
            root_script = script;
        
else
            script_ptr->next = script;

        script_ptr = script;

        fread(&script->action_index, 1, 
sizeof(long), fp);
        fread(&script->num_entries, 1, 
sizeof(long), fp);

        
// get entry data (if any)
        if(script->num_entries)
        {
            script->entries = 
new ENTRY[script->num_entries];

            
// load in each entry
            for(long j = 0; j < script->num_entries; j++)
            {
                fread(&script->entries[j].type, 1, 
sizeof(long), fp);
                fread(&script->entries[j].io_value, 1, 
sizeof(long), fp);

                
// get text if any
                if(script->entries[j].type == ENTRY_TEXT && script->entries[j].length)
                {
                    script->entries[j].text = 
new char[script->entries[j].length];
                    fread(script->entries[j].text, 1, script->entries[j].length, fp);
                }
            }
        }
    }

    fclose(fp);

    
return root_script;
}

//----------------------------------------------------------------------------------------
// Execute all scripts.
//----------------------------------------------------------------------------------------
BOOL run_script()
{
    
// clear flags
    for(short i = 0; i < 256; i++)
        g_flags[i] = FALSE;

    SCRIPT_PTR script_ptr;

    
// start at beginning of script
    if((script_ptr = g_root_script) == NULL)
        
return FALSE;

    reset_listbox(GetDlgItem(g_hwnd, IDC_SCRIPT));

    
// loop until no more scripts
    while(script_ptr)
    {
        
// Call script function and break on NULL return value,
        // any other return type is the pointer to the next function.
        script_ptr = g_script_list[script_ptr->action_index](script_ptr);
    }

    
return TRUE;
}

//----------------------------------------------------------------------------------------
// Handle 'if then' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_if_flag_then(SCRIPT_PTR script)
{
    BOOL skipping;

    
long flag_index = script->entries[0].long_value % 256;

    
// see if a flag matches second entry
    if(g_flags[flag_index] == script->entries[1].bool_value)
        skipping = FALSE;
    
else
        skipping = TRUE;

    script = script->next;

    
while(script)
    {
        
// if 'else', flip skip mode
        if(script->action_index == 1)
            skipping = !skipping;

        
// break on 'end if'
        if(script->action_index == 2)
            
return script->next;

        
// Process script function in conditional block, 
        // making sure to skip actions when condition not met.
        if(skipping)
            script = script->next;
        
else
        {
            
if((script = g_script_list[script->action_index](script)) == NULL)
                
break;
        }
    }

    
return NULL;
}

//----------------------------------------------------------------------------------------
// Handle 'else' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_else(SCRIPT_PTR script)
{
    
return script->next;
}

//----------------------------------------------------------------------------------------
// Handle 'endif' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_endif(SCRIPT_PTR script)
{
    
return script->next;
}

//----------------------------------------------------------------------------------------
// Handle 'set flag' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_set_flag(SCRIPT_PTR script)
{
    g_flags[script->entries[0].long_value % 256] = script->entries[1].bool_value;

    
return script->next;
}

//----------------------------------------------------------------------------------------
// Handle 'print' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_print(SCRIPT_PTR script)
{
    HWND listbox = GetDlgItem(g_hwnd, IDC_SCRIPT);

    add_string_to_listbox(listbox, "Print string:");
    add_string_to_listbox(listbox, script->entries[0].text);
    add_string_to_listbox(listbox, "");

    
return script->next;
}

//----------------------------------------------------------------------------------------
// Handle 'Move character' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_move(SCRIPT_PTR script)
{
    
char text[256];

    HWND listbox = GetDlgItem(g_hwnd, IDC_SCRIPT);

    add_string_to_listbox(listbox, "Moving character to:");

    sprintf(text, "%lf, %lf, %lf", 
            script->entries[0].float_value, 
            script->entries[1].float_value, 
            script->entries[2].float_value);

    add_string_to_listbox(listbox, text);
    add_string_to_listbox(listbox, "");

    
return script->next;
}

//----------------------------------------------------------------------------------------
// Handle 'gain loss' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_gain_loss(SCRIPT_PTR script)
{
    
char options[7][64] = 
    {
        { "Main character" }, 
        { "Caster"         },
        { "Target"         },
        { "Gains"          },
        { "Looses"         },
        { "Hit"            },
        { "Magic"          }
    };

    
char text[1024];

    sprintf(text, "%s %s %lu %s points",
            options[script->entries[0].selection],
            options[script->entries[1].selection + 3],
            script->entries[2].long_value,
            options[script->entries[3].selection + 5]);

    HWND listbox = GetDlgItem(g_hwnd, IDC_SCRIPT);

    add_string_to_listbox(listbox, text);
    add_string_to_listbox(listbox, "");

    
return script->next;
}

//----------------------------------------------------------------------------------------
// Handle 'engaging in battle' script statement.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_battle(SCRIPT_PTR script)
{
    
char text[256];

    sprintf(text, "Engaging in battle #%lu", script->entries[0].long_value);

    HWND listbox = GetDlgItem(g_hwnd, IDC_SCRIPT);

    add_string_to_listbox(listbox, text);
    add_string_to_listbox(listbox, "");

    
return script->next;
}

//----------------------------------------------------------------------------------------
// Handle for script end.
//----------------------------------------------------------------------------------------
SCRIPT_PTR script_end(SCRIPT_PTR script)
{  
    HWND listbox = GetDlgItem(g_hwnd, IDC_SCRIPT);

    add_string_to_listbox(listbox, "End of Script");
    add_string_to_listbox(listbox, "");

    
return NULL;
}

//-----------------------------------------------------------------------------------
// Remove all items from list box.
//-----------------------------------------------------------------------------------
void reset_listbox(HWND listbox)
{
    
// An application sends an LB_RESETCONTENT message to remove all items from a list box. 
    //
    // To send this message, call the SendMessage function as follows. 
    //
    // lResult = SendMessage(       // returns LRESULT in lResult     
    //      (HWND) hWndControl,     // handle to destination control     
    //      (UINT) LB_RESETCONTENT, // message ID     
    //      (WPARAM) wParam,        // = (WPARAM) () wParam;    
    //      (LPARAM) lParam         // = (LPARAM) () lParam; );   
    //
    // wParam:
    //      Not used; must be zero. 
    //
    // lParam:
    //      Not used; must be zero. 
    //
    // This message does not return a value. 

    SendMessage(listbox, LB_RESETCONTENT, 0, 0);
}

//-----------------------------------------------------------------------------------
// Add string to listbox.
//-----------------------------------------------------------------------------------
LRESULT add_string_to_listbox(HWND listbox, const charstring)
{
    
// An application sends an LB_ADDSTRING message to add a string to a list box. If the list box does not have 
    // the LBS_SORT style, the string is added to the end of the list. Otherwise, the string is inserted into 
    // the list and the list is sorted. 
    //
    // To send this message, call the SendMessage function as follows. 
    //
    // lResult = SendMessage(       // returns LRESULT in lResult     
    //      (HWND) hWndControl,     // handle to destination control     
    //      (UINT) LB_ADDSTRING,    // message ID     
    //      (WPARAM) wParam,        // = (WPARAM) () wParam;    
    //      (LPARAM) lParam         // = (LPARAM) () lParam; 
    //  );       
    //
    // wParam:
    //      This parameter is not used. 
    //
    // lParam:
    //      Pointer to the null-terminated string that is to be added. 
    //
    //      If you create the list box with an owner-drawn style but without the LBS_HASSTRINGS style, 
    //      this parameter is stored as item data instead of the string to which it would otherwise point. 
    //      You can send the LB_GETITEMDATA and LB_SETITEMDATA messages to retrieve or modify the item data.
    //
    // Return Value:    
    //      The return value is the zero-based index of the string in the list box. If an error occurs, 
    //      the return value is LB_ERR. If there is insufficient space to store the new string, the return value 
    //      is LB_ERRSPACE. 

    
return SendMessage(listbox, LB_ADDSTRING, 0, (LPARAM)string);
}

截圖:

 

下載源碼和工程

 

posted on 2007-11-04 01:29 lovedday 閱讀(635) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品xnxxcom| 伊人夜夜躁av伊人久久| 国产欧美一区二区精品忘忧草| 老鸭窝毛片一区二区三区 | 亚洲作爱视频| 99成人免费视频| 亚洲尤物在线| 久久久久久精| 亚洲人成在线观看| 99精品国产高清一区二区| 亚洲欧美日本国产专区一区| 久久精品国产亚洲精品| 久久免费视频在线| 久久婷婷国产综合国色天香| 欧美成人午夜免费视在线看片| 欧美电影免费网站| 亚洲精品偷拍| 午夜久久黄色| 欧美韩日精品| 国一区二区在线观看| 亚洲精品孕妇| 久久久久久亚洲精品不卡4k岛国| 欧美激情一区二区三区在线视频观看 | 亚洲国产日韩美| 亚洲一区二区三区777| 久久国产视频网| 欧美日韩一二区| 亚洲电影天堂av| 亚洲欧美精品一区| 亚洲一区二区三区中文字幕| 亚洲一区二区三区中文字幕在线| 欧美国产一区二区三区激情无套| 亚洲一区二区在线播放| 美女任你摸久久| 国产亚洲女人久久久久毛片| 欧美主播一区二区三区| 亚洲婷婷综合久久一本伊一区| 欧美福利一区| 一区二区三区精品国产| 一道本一区二区| 国产欧美韩日| 久久精品视频va| 久久久人成影片一区二区三区观看 | 久久噜噜亚洲综合| 亚洲毛片在线观看.| 久久夜色精品| 国产日韩av在线播放| 在线性视频日韩欧美| 亚洲国产精品www| 老司机亚洲精品| 欧美在线观看视频| 91久久精品美女| 美国十次成人| 在线欧美小视频| 两个人的视频www国产精品| 亚洲一区二区高清| 国产精品久久久久久久久久ktv | 精品1区2区| 久久嫩草精品久久久精品一| 亚洲欧美日韩一区| 国产亚洲激情视频在线| 欧美在线亚洲在线| 欧美一区二区高清| 国内成人精品视频| 狂野欧美一区| 欧美18av| 在线亚洲电影| 亚洲女女女同性video| 国产精品免费网站| 欧美一区二视频| 久久精品亚洲精品| 亚洲高清视频在线| 91久久久亚洲精品| 欧美日韩免费观看一区二区三区| 亚洲视频在线观看三级| 中文在线资源观看视频网站免费不卡| 国产精品xxxxx| 久久免费的精品国产v∧| 久久综合九色综合欧美狠狠| 亚洲精品在线免费| 亚洲一区免费| 一区二区三区在线不卡| 亚洲国产精品视频一区| 国产精品大全| 久久五月激情| 欧美精品九九| 久久国产主播精品| 欧美激情亚洲另类| 欧美在线短视频| 欧美77777| 欧美在线免费视频| 免费成人美女女| 亚洲欧美国产高清va在线播| 久久精品国产99精品国产亚洲性色| 亚洲高清毛片| 亚洲女女做受ⅹxx高潮| 亚洲经典自拍| 午夜亚洲伦理| 99日韩精品| 久久久亚洲综合| 亚洲欧美日韩在线不卡| 久久综合九色综合久99| 亚洲视频网站在线观看| 久久女同互慰一区二区三区| 亚洲欧美自拍偷拍| 久久成人资源| 99视频超级精品| 久久免费99精品久久久久久| 91久久精品国产91久久性色tv| 久久久免费精品| 亚洲免费av电影| 欧美伊人久久久久久午夜久久久久 | 欧美国产先锋| 久久综合成人精品亚洲另类欧美| 欧美日韩亚洲国产一区| 欧美大学生性色视频| 国产日韩欧美一区二区三区在线观看 | 亚洲一区二区av电影| 美日韩精品视频免费看| 久久久久五月天| 国产精品自拍在线| 一本高清dvd不卡在线观看| 亚洲日本一区二区三区| 久久青青草原一区二区| 久久久久久网| 激情小说另类小说亚洲欧美 | 亚洲系列中文字幕| 亚洲视频一二区| 欧美日韩成人在线| 亚洲精品乱码久久久久久黑人| 亚洲福利视频网| 老司机aⅴ在线精品导航| 老司机精品视频一区二区三区| 国产一区二区三区不卡在线观看| 亚洲免费在线电影| 欧美亚洲一区二区在线| 国产精品一级久久久| 亚洲在线观看| 久久精品国产综合精品| 国产欧美日韩视频| 久久国产精品久久久久久电车| 久久午夜精品一区二区| 亚洲国产三级在线| 欧美精品免费观看二区| 一区二区三欧美| 久久电影一区| 欧美精品啪啪| 欧美日韩国产a| 欧美3dxxxxhd| 亚洲高清在线观看一区| 久久久999| 欧美在线免费播放| 国产亚洲电影| 久久久久99| 久久嫩草精品久久久精品| 一区二区亚洲| 牛人盗摄一区二区三区视频| 先锋影音久久| 在线免费高清一区二区三区| 久久人人爽爽爽人久久久| 性视频1819p久久| 亚洲欧洲精品一区二区精品久久久| 久久aⅴ国产欧美74aaa| 亚洲精品国产无天堂网2021| 夜夜嗨av一区二区三区中文字幕 | 久久超碰97中文字幕| 国产日韩精品一区| 久久免费午夜影院| 日韩午夜在线电影| 久久久久国产精品一区三寸| 最新日韩在线视频| 国产精品美女主播| 老色鬼久久亚洲一区二区| 亚洲人午夜精品| 久久久成人网| 亚洲午夜羞羞片| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美精品一区在线播放| 亚欧美中日韩视频| 夜夜嗨av一区二区三区四区 | 久久久久一本一区二区青青蜜月| 欧美日韩国产美女| 亚洲少妇诱惑| 久久se精品一区二区| 亚洲国产精品嫩草影院| 欧美色图首页| 免费不卡中文字幕视频| 亚洲一区三区视频在线观看| 欧美成人69av| 欧美自拍丝袜亚洲| 亚洲视频第一页| 亚洲高清自拍| 韩国女主播一区| 国产精品亚洲一区| 欧美婷婷久久| 欧美另类变人与禽xxxxx| 久久综合网色—综合色88| 欧美一区二区三区电影在线观看| 日韩亚洲成人av在线| 亚洲国产高清一区二区三区|