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

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

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

 

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

 

add_script將行為列表框中選中的行為添加到腳本列表框中:

//-----------------------------------------------------------------------------------
// Add script.
//-----------------------------------------------------------------------------------
void add_script()
{
    
long sel;

    
// make sure an action is selected
    if((sel = (long)get_listbox_selected(g_action_wnd)) == LB_ERR)
        
return;

    
// create a new script and add it
    
    SCRIPT_PTR script = g_action_template.create_script(sel);

    g_modify_script = script;

    
// call the modify script dialog

    g_show_cancel = TRUE;

    
if(DialogBox(NULL, MAKEINTRESOURCE(IDD_MODIFY), g_hwnd, modify_dialog_proc))
    {
        
// add script to link list

        script->next = g_root_script;

        
if(g_root_script != NULL)
            g_root_script->prev = script;
        
        g_root_script = script;

        
// display script text

        
char text[2048];

        ACTION_PTR act_ptr = g_action_template.get_action(sel);
        g_action_template.expand_action_text(text, script);

        add_string_to_listbox(g_script_wnd, text);

        
// add pointer to script address listbox
        sprintf(text, "%lu", script);
        add_string_to_listbox(g_script_addr_wnd, text);

        
// increase count
        g_num_script++;
    }
    
else
        delete script;
}
 

insert_script將行為列表框中選中的行為腳本添加到腳本列表框中選中腳本的上方:

//-----------------------------------------------------------------------------------
// Insert script.
//-----------------------------------------------------------------------------------
void insert_script()
{
    
int act_index, script_index;

    
// get location to insert action
    if((script_index = (int)get_listbox_selected(g_script_wnd)) == LB_ERR)
        
return;

    
// make sure an action is selected
    if((act_index = (int)get_listbox_selected(g_action_wnd)) == LB_ERR)
        
return;

    
// create a new script
    SCRIPT_PTR script = g_action_template.create_script(act_index);
    g_modify_script = script;

    
// call the modify script dialog
    g_show_cancel = TRUE;

    
if(DialogBox(NULL, MAKEINTRESOURCE(IDD_MODIFY), g_hwnd, modify_dialog_proc))
    {
        
// add the script to link list
        script->prev = NULL;
        script->next = g_root_script;
        g_root_script->prev = script;

        g_root_script = script;

        
char text[2048];

        
// display script action text
        ACTION_PTR act_ptr = g_action_template.get_action(act_index);
        g_action_template.expand_action_text(text, script);
        insert_string_to_listbox(g_script_wnd, script_index, text);

        
// add pointer to script address listbox
        sprintf(text, "%lu", script);
        insert_string_to_listbox(g_script_addr_wnd, script_index, text);

        g_num_script++;
    }
    
else
        delete script;
}

delete_script用于刪除腳本列表框中的一條腳本:

 
//-----------------------------------------------------------------------------------
// Delete script.
//-----------------------------------------------------------------------------------
void delete_script()
{
    
int sel;

    
// make sure there is a selection
    if((sel = (int)get_listbox_selected(g_script_wnd)) == LB_ERR)
        
return;

    
char text[2048];

    
// get pointer to script entry
    get_listbox_text(g_script_addr_wnd, sel, text);
    SCRIPT_PTR script = (SCRIPT_PTR) atol(text);

    
// remove script from linked list
    if(script->prev)
        script->prev->next = script->next;
    
else
        g_root_script = script->next;

    
if(script->next)
        script->next->prev = script->prev;

    script->next = NULL;    
// so whole list is not deleted
    delete script;

    
// clear from script and script list
    delete_listbox_string(g_script_wnd, sel);
    delete_listbox_string(g_script_addr_wnd, sel);

    g_num_script--;
}
 

move_up_script和move_down_script分別將腳本上移和下移一行:

//-----------------------------------------------------------------------------------
// Move up script.
//-----------------------------------------------------------------------------------
void move_up_script()
{
    
int sel;

    
// make sure there is a selection
    if((sel = (int)get_listbox_selected(g_script_wnd)) == LB_ERR)
        
return;

    
// make sure it is not topmost selection
    if(sel == 0)
        
return;

    
char text[2048];

    get_listbox_text(g_script_wnd, sel, text);
    delete_listbox_string(g_script_wnd, sel);
    insert_string_to_listbox(g_script_wnd, sel-1, text);

    get_listbox_text(g_script_addr_wnd, sel, text);
    delete_listbox_string(g_script_addr_wnd, sel);
    insert_string_to_listbox(g_script_addr_wnd, sel-1, text);

    set_listbox_selected(g_script_wnd, sel-1);
}

//-----------------------------------------------------------------------------------
// Move down script.
//-----------------------------------------------------------------------------------
void move_down_script()
{
    
int sel;

    
// make sure there is a selection
    if((sel = (int)get_listbox_selected(g_script_wnd)) == LB_ERR)
        
return;

    
// make sure it is not bottommost selection
    if(sel >= count_listbox(g_script_wnd)-1)
        
return;

    
char text[2048];

    get_listbox_text(g_script_wnd, sel, text);
    delete_listbox_string(g_script_wnd, sel);
    insert_string_to_listbox(g_script_wnd, sel+1, text);

    get_listbox_text(g_script_addr_wnd, sel, text);
    delete_listbox_string(g_script_addr_wnd, sel);
    insert_string_to_listbox(g_script_addr_wnd, sel+1, text);

    set_listbox_selected(g_script_wnd, sel+1);
}

修改腳本對(duì)話框的窗口處理過(guò)程通過(guò)modify_dialog_proc來(lái)實(shí)現(xiàn):

 
//-----------------------------------------------------------------------------------
// The DialogProc function is an application-defined callback function used with the CreateDialog 
// and DialogBox families of functions. It processes messages sent to a modal or modeless dialog box. 
// The DLGPROC type defines a pointer to this callback function. DialogProc is a placeholder for 
// the application-defined function name. 
//
// INT_PTR CALLBACK DialogProc(HWND hwndDlg,
//    UINT uMsg,
//    WPARAM wParam,
//    LPARAM lParam
// );
//
// hwndDlg:
//      [in] Handle to the dialog box. 
// uMsg:
//      [in] Specifies the message. 
// wParam:
//      [in] Specifies additional message-specific information. 
// lParam:
//      [in] Specifies additional message-specific information. 
//
// Return Value:
//      Typically, the dialog box procedure should return TRUE if it processed the message, 
//      and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs 
//      the default dialog operation in response to the message.
//
//      If the dialog box procedure processes a message that requires a specific return value, 
//      the dialog box procedure should set the desired return value by calling 
//      SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning TRUE. 
//      Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may 
//      result in the DWL_MSGRESULT value being overwritten by a nested dialog box message.
//
//      The following messages are exceptions to the general rules stated above. Consult the documentation 
//      for the specific message for details on the semantics of the return value.
//
//      WM_CHARTOITEM
//      WM_COMPAREITEM
//      WM_CTLCOLORBTN
//      WM_CTLCOLORDLG
//      WM_CTLCOLOREDIT
//      WM_CTLCOLORLISTBOX
//      WM_CTLCOLORSCROLLBAR
//      WM_CTLCOLORSTATIC
//      WM_INITDIALOG
//      WM_QUERYDRAGICON
//      WM_VKEYTOITEM
//
// Remarks:
//      You should use the dialog box procedure only if you use the dialog box class for the dialog box. 
//      This is the default class and is used when no explicit class is specified in the dialog box template.
//      Although the dialog box procedure is similar to a window procedure, it must not call the DefWindowProc 
//      function to process unwanted messages. Unwanted messages are processed internally by the dialog box 
//      window procedure. 
//-----------------------------------------------------------------------------------
BOOL CALLBACK modify_dialog_proc(HWND dlg, UINT msg_id, WPARAM word_param, LPARAM long_param)
{
    
static long entry_index = 0;

    
switch(msg_id)
    {
    
case WM_INITDIALOG:
        
if(g_modify_script == NULL) // return an error if there is no script to modify
        {
            
// The EndDialog function destroys a modal dialog box, causing the system to end any processing 
            // for the dialog box. 
            //        
            // BOOL EndDialog(HWND hDlg,
            //    INT_PTR nResult
            // );
            //
            // hDlg:
            //      [in] Handle to the dialog box to be destroyed. 
            //
            // nResult:
            //      [in] Specifies the value to be returned to the application from the function that created 
            //      the dialog box. 
            //
            // Return Value:
            //      If the function succeeds, the return value is nonzero.
            //
            //      If the function fails, the return value is zero. To get extended error information, 
            //      call GetLastError.
            EndDialog(dlg, FALSE);

            
return FALSE;
        }

        
// edit first entry
        entry_index = 0;

        
// display entry text
        set_modify_dialog(dlg, g_modify_script, entry_index);

        
// show or hide cancel button
        ShowWindow(GetDlgItem(dlg, IDC_CANCEL), g_show_cancel);

        
if(g_show_cancel == FALSE)
        {
            ShowWindow(GetDlgItem(dlg, IDC_OK),  
false);
            ShowWindow(GetDlgItem(dlg, IDC_OK2), 
true);
        }
        
else
            ShowWindow(GetDlgItem(dlg, IDC_OK2), 
false);

        
return TRUE;

    
case WM_COMMAND:
        
switch(LOWORD(word_param))
        {
        
case IDC_OK:
        
case IDC_OK2:
            update_entry(dlg, g_modify_script, entry_index);
            EndDialog(dlg, TRUE);
            
return TRUE;

        
case IDC_CANCEL:
            EndDialog(dlg, FALSE);
            
return TRUE;

        
case IDC_PREV:
            
// only bother if not first entry
            if(entry_index > 0)
            {
                
// apply changes

                // go to previous entry
                update_entry(dlg, g_modify_script, entry_index);
                entry_index--;
                set_modify_dialog(dlg, g_modify_script, entry_index);
            }

            
break;

        
case IDC_NEXT:
            
// only bother if not last entry
            if(entry_index < g_modify_script->num_entries-1)
            {
                
// apply changes

                // go to next entry
                update_entry(dlg, g_modify_script, entry_index);
                entry_index++;
                set_modify_dialog(dlg, g_modify_script, entry_index);
            }

            
break;
        }
    }

    
return FALSE;
}

不同的條目類型修改腳本的對(duì)話框外觀也不相同,這是通過(guò)set_modify_dialog函數(shù)來(lái)實(shí)現(xiàn):

 
//-----------------------------------------------------------------------------------
// Set information for dialog to be modified.
//-----------------------------------------------------------------------------------
void set_modify_dialog(HWND dlg, SCRIPT_PTR script, long entry_index)
{
    
char text[2048];

    
// display full action text
    g_action_template.expand_action_text(text, script);
    SetWindowText(GetDlgItem(dlg, IDC_ACTIONTEXT), text);

    
// get control handle
    HWND pre_wnd          = GetDlgItem(dlg, IDC_PREV);
    HWND next_wnd         = GetDlgItem(dlg, IDC_NEXT);
    HWND text_wnd         = GetDlgItem(dlg, IDC_TEXT);
    HWND choice_wnd       = GetDlgItem(dlg, IDC_CHOICE);
    HWND true_wnd         = GetDlgItem(dlg, IDC_TRUE);
    HWND false_wnd        = GetDlgItem(dlg, IDC_FALSE);
    HWND min_wnd          = GetDlgItem(dlg, IDC_MIN);
    HWND max_wnd          = GetDlgItem(dlg, IDC_MAX);
    HWND value_wnd        = GetDlgItem(dlg, IDC_VALUE);
    HWND static_min_wnd   = GetDlgItem(dlg, IDC_STATIC_MIN);
    HWND static_max_wnd   = GetDlgItem(dlg, IDC_STATIC_MAX);
    HWND static_value_wnd = GetDlgItem(dlg, IDC_STATIC_VALUE);
    HWND num_wnd          = GetDlgItem(dlg, IDC_NUM);
    HWND frame_wnd        = GetDlgItem(dlg, IDC_FRAME);

    
// hide all controls
    ShowWindow(pre_wnd,           FALSE);
    ShowWindow(next_wnd,          FALSE);
    ShowWindow(text_wnd,          FALSE);
    ShowWindow(choice_wnd,        FALSE);
    ShowWindow(true_wnd,          FALSE);
    ShowWindow(false_wnd,         FALSE);
    ShowWindow(min_wnd,           FALSE);
    ShowWindow(max_wnd,           FALSE);
    ShowWindow(value_wnd,         FALSE);
    ShowWindow(static_min_wnd,    FALSE);
    ShowWindow(static_max_wnd,    FALSE);
    ShowWindow(static_value_wnd,  FALSE);

    
// clear information
    SetWindowText(num_wnd, "");
    SetWindowText(frame_wnd, " No Entries ");

    
// get pointer to action
    ACTION_PTR act_ptr = g_action_template.get_action(script->action_index);
    
    
// return if no entries to edit
    if(act_ptr->num_entries_rule == 0)
        
return;
    
    
if(act_ptr->num_entries_rule > 1)
    {
        ShowWindow(pre_wnd, TRUE);
        ShowWindow(next_wnd, TRUE);
    }

    sprintf(text, "%lu of %lu", entry_index+1, act_ptr->num_entries_rule);
    SetWindowText(num_wnd, text);
    EnableWindow(num_wnd, TRUE);

    
// enable and set specific fields based on entry type
    switch(script->entries[entry_index].type)
    {
    
case ENTRY_TEXT:
        SetWindowText(frame_wnd, " Text entry ");

        
if(script->entries[entry_index].text)
            SetWindowText(text_wnd, script->entries[entry_index].text);

        ShowWindow(text_wnd, TRUE);
        EnableWindow(text_wnd, TRUE);
        
break;

    
case ENTRY_BOOL:
        SetWindowText(frame_wnd, " Boolean entry ");

        
if(script->entries[entry_index].bool_value)
        {
            set_button_state(true_wnd,  BST_CHECKED);
            set_button_state(false_wnd, BST_UNCHECKED);
        }
        
else
        {
            set_button_state(true_wnd,  BST_UNCHECKED);
            set_button_state(false_wnd, BST_CHECKED);
        }

        ShowWindow(true_wnd,  TRUE);
        ShowWindow(false_wnd, TRUE);
        
break;

    
case ENTRY_INT:
        SetWindowText(frame_wnd, " Integer entry ");

        sprintf(text, "%lu", act_ptr->entries_rule[entry_index].long_min);
        SetWindowText(min_wnd, text);

        sprintf(text, "%lu", act_ptr->entries_rule[entry_index].long_max);
        SetWindowText(max_wnd, text);

        sprintf(text, "%lu", script->entries[entry_index].long_value);
        SetWindowText(value_wnd, text);

        ShowWindow(min_wnd,          TRUE);
        ShowWindow(max_wnd,          TRUE);
        ShowWindow(value_wnd,        TRUE);
        ShowWindow(static_min_wnd,   TRUE);
        ShowWindow(static_max_wnd,   TRUE);
        ShowWindow(static_value_wnd, TRUE);

        
break;
    
    
case ENTRY_FLOAT:
        SetWindowText(frame_wnd, " Float entry ");

        sprintf(text, "%lu", act_ptr->entries_rule[entry_index].float_min);
        SetWindowText(min_wnd, text);

        sprintf(text, "%lu", act_ptr->entries_rule[entry_index].float_max);
        SetWindowText(max_wnd, text);

        sprintf(text, "%lu", script->entries[entry_index].float_value);
        SetWindowText(value_wnd, text);

        ShowWindow(min_wnd,          TRUE);
        ShowWindow(max_wnd,          TRUE);
        ShowWindow(value_wnd,        TRUE);
        ShowWindow(static_min_wnd,   TRUE);
        ShowWindow(static_max_wnd,   TRUE);
        ShowWindow(static_value_wnd, TRUE);

        
break;
    
    
case ENTRY_CHOICE:
        SetWindowText(frame_wnd, " Choice entry ");
        reset_combo_content(choice_wnd);

        
if(act_ptr->entries_rule[entry_index].num_choices)
        {
            
for(long i = 0; i < act_ptr->entries_rule[entry_index].num_choices; i++)
                add_string_to_combo(choice_wnd, act_ptr->entries_rule[entry_index].choices[i]);

            set_combo_cur_sel(choice_wnd, script->entries[entry_index].selection);
            ShowWindow(choice_wnd, TRUE);
        }

        
break;
    }
}

布爾型:

整型或浮點(diǎn)型:

多重選項(xiàng)型:

文本型:

 

腳本信息的更新通過(guò)update_entry來(lái)實(shí)現(xiàn):

//-----------------------------------------------------------------------------------
// Update script entries.
//-----------------------------------------------------------------------------------
void update_entry(HWND dlg, SCRIPT_PTR script, long entry_index)
{
    
// get pointer to action
    ACTION_PTR act_ptr = g_action_template.get_action(script->action_index);

    
// return if no entries to update or incorrect entry index
    if(act_ptr->num_entries_rule == 0 || entry_index >= script->num_entries)
        
return;

    
const int size = 2048;
    
char text[size];

    ENTRY& r_entry = script->entries[entry_index];
    ENTRY_RULE& r_entry_rule = act_ptr->entries_rule[entry_index];

    
// update fields based on type
    switch(r_entry_rule.type)
    {
    
case ENTRY_TEXT:
        
// delete old text
        delete[] r_entry.text;
        r_entry.text = NULL;
        r_entry.length = 0;

        GetWindowText(GetDlgItem(dlg, IDC_TEXT), text, size);

        
if(text)
        {
            r_entry.length = (
long)strlen(text) + 1;
            r_entry.text   = 
new char[r_entry.length];

            strcpy(r_entry.text, text);
        }

        
break;

    
case ENTRY_BOOL:
        
// choose TRUE or FALSE from radio button
        if(get_button_state(GetDlgItem(dlg, IDC_TRUE)) == BST_CHECKED)
            r_entry.bool_value = TRUE;
        
else
            r_entry.bool_value = FALSE;

        
break;

    
case ENTRY_INT:
        
// get int value and bounds check with min/max
        GetWindowText(GetDlgItem(dlg, IDC_VALUE), text, size);

        r_entry.long_value = atol(text);

        
if(r_entry.long_value < r_entry_rule.long_min)
            r_entry.long_value = r_entry_rule.long_min;

        
if(r_entry.long_value > r_entry_rule.long_max)
            r_entry.long_value = r_entry_rule.long_max;

        
break;

    
case ENTRY_FLOAT:
        
// get int value and bounds check with min/max
        GetWindowText(GetDlgItem(dlg, IDC_VALUE), text, size);

        r_entry.float_value = (
float)atof(text);

        
if(r_entry.float_value < r_entry_rule.float_min)
            r_entry.float_value = r_entry_rule.float_min;

        
if(r_entry.float_value > r_entry_rule.float_max)
            r_entry.float_value = r_entry_rule.float_max;

        
break;

    
case ENTRY_CHOICE:
        
// store choice selection
        r_entry.selection = (long)get_combo_cur_sel(GetDlgItem(dlg, IDC_CHOICE));
        
break;
    }
}

截圖:

 

下載源碼與工程


 

posted on 2007-11-03 18:48 lovedday 閱讀(484) 評(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>
            亚洲欧洲在线播放| 欧美一区二区三区四区在线观看地址| 国产精品久久久久天堂| 亚洲激情专区| 一区二区三区不卡视频在线观看| 亚洲女女女同性video| 亚洲国产精品美女| 欧美亚洲免费在线| 一本色道婷婷久久欧美| 韩国一区电影| 欧美在线一二三| 狠狠干成人综合网| 亚洲精品视频二区| 国产在线高清精品| 亚洲理论在线观看| 精品成人乱色一区二区| 国产精品视频一区二区三区| 亚洲大胆av| 亚洲国产精品久久久| 欧美日韩成人一区| 欧美高清在线一区| 免费日韩精品中文字幕视频在线| 久久精品一区二区三区不卡牛牛| 欧美专区亚洲专区| 亚洲一区二区在线播放| 亚洲欧美日韩电影| 亚洲欧美国产三级| 国内精品免费在线观看| 欧美本精品男人aⅴ天堂| 欧美一区二区精品在线| 久久久福利视频| 久久成年人视频| 麻豆精品精华液| 欧美高潮视频| 国产在线视频不卡二| 亚洲区一区二| 亚洲免费中文字幕| 欧美中文字幕在线| av不卡在线观看| 久久精品国产一区二区电影| 欧美精品粉嫩高潮一区二区| 国产精品久久久久久影视| 狠狠色香婷婷久久亚洲精品| 亚洲美女毛片| 欧美国产精品中文字幕| 欧美成人午夜激情视频| 午夜精品999| 欧美日韩免费在线| 亚洲国产一区二区三区青草影视| 亚洲自拍偷拍福利| 亚洲精品韩国| 欧美日韩免费一区| 在线日韩视频| 欧美成年人在线观看| 久久精品99久久香蕉国产色戒| 国产精品二区三区四区| 一区二区动漫| 一区二区三区四区蜜桃| 欧美日韩国产一级片| 日韩天堂av| 亚洲精品一区中文| 麻豆精品在线观看| 日韩午夜精品视频| 亚洲美女视频在线观看| 免费一级欧美在线大片| 99精品国产在热久久下载| 亚洲久久一区| 国产精品国产三级国产普通话蜜臀 | 夜夜狂射影院欧美极品| 欧美精品一区二区久久婷婷| 91久久精品日日躁夜夜躁国产| 韩国福利一区| 久久精品99国产精品酒店日本| 久久在线免费观看| 亚洲免费伊人电影在线观看av| 亚洲在线视频免费观看| 悠悠资源网亚洲青| 中文日韩电影网站| 一区在线电影| 欧美一区二区在线播放| 日韩亚洲欧美精品| 欧美伊人久久| 久久久7777| 国产精品超碰97尤物18| 免费在线观看日韩欧美| 国产精品v欧美精品v日韩| 亚洲激情女人| 亚洲成色777777女色窝| 午夜精品成人在线| 一本久久a久久精品亚洲| 久久久999精品| 久久久久网站| 午夜精品久久久99热福利| 亚洲欧美国产精品专区久久| 欧美日韩高清免费| 日韩性生活视频| 亚洲欧洲日本在线| 免费在线一区二区| 久久精品视频在线看| 国产精品一区二区在线观看| 亚洲欧美日韩精品久久久久| 亚洲欧美国产精品va在线观看 | 久久aⅴ国产紧身牛仔裤| aa级大片欧美| 欧美视频一区二区三区在线观看| 亚洲欧洲美洲综合色网| 一区二区福利| 欧美人与禽性xxxxx杂性| 亚洲精品一二三| 久久福利一区| 亚洲精品一品区二品区三品区| 亚洲自拍偷拍麻豆| 激情综合色综合久久| 欧美经典一区二区三区| 中文在线一区| 欧美成人免费小视频| 精品福利电影| 国产九色精品成人porny| 麻豆成人小视频| 午夜一级久久| 亚洲综合999| 亚洲久久在线| 欧美激情影院| 久久在线视频在线| 亚洲欧美国产另类| 日韩视频免费看| 欧美一区二区三区播放老司机 | 国产有码一区二区| 亚洲高清免费视频| 国产精品久久久久一区二区三区共| 久久免费偷拍视频| 欧美性生交xxxxx久久久| 免费在线看成人av| 国产日本亚洲高清| 久久精品一区二区三区四区| 久久精品国产精品亚洲综合| 久久精品人人做人人综合| 精品动漫av| 欧美亚洲第一页| 国产精品久久国产愉拍| 国产亚洲一区在线| 国内精品一区二区三区| 亚洲黄色天堂| 久久久www成人免费毛片麻豆| 久久久www成人免费精品| 91久久精品国产91性色tv| 亚洲午夜高清视频| 久久国产精彩视频| 国产精品一区二区在线观看不卡| 欧美激情一区二区在线| 欧美日韩网址| 国产一区二区三区无遮挡| 一区二区在线看| 久久精品国产一区二区三区免费看 | 亚洲欧美日韩国产另类专区| 亚洲综合色网站| 一区二区三区久久| 免费一级欧美片在线播放| 亚洲欧美精品在线观看| 欧美日韩在线三区| 99re热精品| aa级大片欧美三级| 国产精品成人观看视频国产奇米| 亚洲国产精品久久久久婷婷884| 久久精品中文字幕免费mv| 午夜精品国产更新| 亚洲高清久久久| 欧美中文在线观看| 欧美高清视频一区二区| 久久xxxx| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美激情亚洲国产| 久久久国产精品一区二区三区| 国产精品夜夜嗨| 欧美成人在线免费观看| 欧美高清在线一区| 亚洲午夜一区二区三区| 国产模特精品视频久久久久| 久久国产精品一区二区三区| 欧美在线观看一区| 亚洲欧洲精品一区二区三区 | 亚洲欧美日韩一区在线观看| 性欧美xxxx大乳国产app| 在线观看亚洲视频啊啊啊啊| 亚洲欧洲日本一区二区三区| 国产精品久久久久aaaa| 欧美黑人国产人伦爽爽爽| 国产精品草草| 一本大道久久a久久精二百| 欧美在线亚洲在线| 亚洲一区二区影院| 麻豆精品视频在线观看| 久久黄色小说| 国产精品久久国产三级国电话系列 | 影音先锋亚洲视频| 午夜精品久久久久久久久| 亚洲欧美激情视频| 亚洲免费视频成人| 欧美一区二区三区视频| 欧美日韩国产美|